Docker下Prometheus和Grafana三部曲之三:自定义监控项开发和配置

本文涉及的产品
可观测监控 Prometheus 版,每月50GB免费额度
可观测可视化 Grafana 版,10个用户账号 1个月
简介: 本文详细讲述了业务系统如何将自定义的监控项上报到prometheus,并且在Grafana上配置监控项展示上报的自定义数据

欢迎访问我的GitHub

这里分类和汇总了欣宸的全部原创(含配套源码): https://github.com/zq2599/blog_demos

本篇概览

  • 本文是《Docker下Prometheus和Grafana三部曲》的终篇,前面的文章中,我们体验了快速搭建监控环境,也揭示了如何编排Docker容器来简化环境搭建过程,在监控系统中有个业务web服务,它上报的数据也能在监控系统中通过图形化界面展现出来,如下图所示:

在这里插入图片描述

  • 本文通过实战来介绍业务应用如何将业务数据上报到prometheus,再通过Grafana的图形化界面展现出来;

三部曲所有文章链接

  1. 《Docker下Prometheus和Grafana三部曲之一:极速体验》
  2. 《Docker下Prometheus和Grafana三部曲之二:细说Docker编排》
  3. 《Docker下Prometheus和Grafana三部曲之三:自定义监控项开发和配置》

源码下载

  • 接下来详细讲述应用的编码过程,如果您不想自己写代码,也可以在GitHub下载完整的应用源码,地址和链接信息如下表所示:
名称 链接 备注
项目主页 https://github.com/zq2599/blog_demos 该项目在GitHub上的主页
git仓库地址(https) https://github.com/zq2599/blog_demos.git 该项目源码的仓库地址,https协议
git仓库地址(ssh) git@github.com:zq2599/blog_demos.git 该项目源码的仓库地址,ssh协议
  • 这个git项目中有多个文件夹,本章源码在prometheusdemo这个文件夹下,如下图红框所示:

在这里插入图片描述

编码实战

  • 基于maven创建一个springboot web工程,pom.xml内容如下,增加了actuator的依赖,以及prometheus的SDK依赖项micrometer-spring-legacy和micrometer-registry-prometheus,另外要注意的是plugin节点,里面配置了制作docker镜像的插件:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.19.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.bolingcavalry</groupId>
    <artifactId>prometheusdemo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>prometheusdemo</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <prometheus.version>0.0.17</prometheus.version>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
        </dependency>

        <!-- Actuator (with security enabled) -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

        <!-- Monitoring endpoint - Micrometer + Prometheus -->
        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-spring-legacy</artifactId>
            <version>1.0.6</version>
        </dependency>
        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-registry-prometheus</artifactId>
            <version>1.0.6</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>

            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>0.4.12</version> <!--docker镜像相关的配置信息-->
                <configuration>
                    <!--镜像名,这里用工程名-->
                    <imageName>bolingcavalry/${project.artifactId}</imageName>
                    <!--TAG,这里用工程版本号-->
                    <imageTags>
                        <imageTag>${project.version}</imageTag>
                    </imageTags>
                    <!--镜像的FROM,使用java官方镜像-->
                    <baseImage>java:8u111-jdk</baseImage>
                    <!--该镜像的容器启动后,直接运行spring boot工程-->
                    <entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
                    <!--构建镜像的配置信息-->
                    <resources>
                        <resource>
                            <targetPath>/</targetPath>
                            <directory>${project.build.directory}</directory>
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>
  • 修改系统配置文件application.yml的内容,增加prometheus的SDK会用到的配置,以及关闭security验证:
management:
  endpoints:
    web:
      exposure:
        include: '*'
    jmx:
      exposure:
        include: '*'
    shutdown:
      enabled: true
  metrics:
    distribution:
      percentiles-histogram[http.server.requests]: true
  security:
    enabled: false

spring:
  metrics:
    servo:
      enabled: false
security:
  basic:
    enabled: false
  • 增加一个configuration类,作用是向spring容器注册一个Counter实例,该实例用户向prometheus上报数据:
package com.bolingcavalry.prometheusdemo;

import io.micrometer.core.instrument.Counter;
import io.micrometer.prometheus.PrometheusMeterRegistry;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class PromConfig {

    @Autowired
    PrometheusMeterRegistry registry;

    @Bean
    public Counter getCounter() {
        Counter counter = Counter.builder("my_sample_counter")
                .tags("status", "success")
                .description("A simple Counter to illustrate custom Counters in Spring Boot and Prometheus")
                .register(registry);
        return counter;
    }
}
  • 从上述代码可见,Counter.builder方法会实例化一个Counter类,这个类就代表了一个prometheus的监控项,可以用来上报名为"my_sample_counter"的监控数据,另外这个监控数据还会带上名为"status=success"的tag(稍后展示的实际数据可以看到);
  • 做一个响应web请求的controller,每收到一次web请求,都通过调用counter.increment()方法上报一次监控数据:
package com.bolingcavalry.prometheusdemo;

import io.micrometer.core.instrument.Counter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.time.LocalDateTime;

@RestController
class GreetingController {

    @Autowired
    Counter counter;

    @GetMapping("/greet")
    String greet(@RequestParam(defaultValue = "World") String name) {
        counter.increment();
        return "Hello: " + name + " " + LocalDateTime.now();
    }
}
  • 应用的入口类没有什么特别的,如下:
package com.bolingcavalry.prometheusdemo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class PrometheusdemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(PrometheusdemoApplication.class, args);
    }
}
  • 另外为了方便大家实战,我把前面几篇文章用到的脚本内容也放在这个工程中了,在名为files的文件夹下:

在这里插入图片描述

  • 以上就是整个web工程的全部内容了,接下来要将此工程编译并构建成Docker镜像;

构建应用的Docker镜像

  • 请确认当前的电脑上maven和Docker环境都已经配置好,我这里Maven版本是3.6.0,在pom.xml文件所在目录执行以下命令,即可将当前工程构建成Docker镜像:
mvn clean package -U -DskipTests docker:build
  • 如果控制台输出以下内容代表构建成功:
[INFO] --- spring-boot-maven-plugin:1.5.19.RELEASE:repackage (default) @ prometheusdemo ---
[INFO] 
[INFO] --- docker-maven-plugin:0.4.12:build (default-cli) @ prometheusdemo ---
[INFO] Copying /root/work/temp/201903/09/prometheusdemo/target/prometheusdemo-0.0.1-SNAPSHOT.jar -> /root/work/temp/201903/09/prometheusdemo/target/docker/prometheusdemo-0.0.1-SNAPSHOT.jar
[INFO] Building image bolingcavalry/prometheusdemo
Step 1/3 : FROM java:8u111-jdk
 ---> d23bdf5b1b1b
Step 2/3 : ADD /prometheusdemo-0.0.1-SNAPSHOT.jar //
 ---> 2c5819935f94
Removing intermediate container 7d42332c1da5
Step 3/3 : ENTRYPOINT java -jar /prometheusdemo-0.0.1-SNAPSHOT.jar
 ---> Running in 52407ee52ae4
 ---> c2e2c7027455
Removing intermediate container 52407ee52ae4
Successfully built c2e2c7027455
[INFO] Built bolingcavalry/prometheusdemo
[INFO] Tagging bolingcavalry/prometheusdemo with 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  25.294 s
[INFO] Finished at: 2019-03-10T11:42:25+08:00
[INFO] ------------------------------------------------------------------------
  • 输入docker images命令检查本地镜像,可以看到新构建的内容,如下图红框:

在这里插入图片描述

  • 由于基础镜像使用的是JDK官方版,整个镜像的体积较大,达到了660MB,您可以修改pom.xml中关于基础镜像的设置,将baseImage节点的内容从java:8u111-jdk改为openjdk:8u191-jdk-alpine3.9,重新构建后,新的镜像体积会缩小到122MB,如下图:

在这里插入图片描述

  • 以上就是web工程的开发以及Docker镜像的制作过程了,接下来看看如何进行配置,在Grafana上看到监控数据;

配置自定义监控项

  • 宿主机的IP地址是192.168.1.101,在浏览器上看看web工程给prometheus提供的数据,访问地址是:http://192.168.1.101:8081/prometheus ,如下图,代码中自定义的监控项在数据中可以看到,不过名称被加了个后缀,变成了my_sample_counter_total,另外tag的内容status="success"也出现了:

在这里插入图片描述

  • 有了上述内容,prometheus就能采集到业务上报的监控项了,接下来我们来试试在Grafana页面上如何配置这个监控项的展示页面,前面的实战中,我们是通过import_dashboard.sh脚本导入的,现在我们自己动手配置一个一模一样的;
  • 在Grafana页面点击manage,再点击"+Dashboard"按钮,如下图:

在这里插入图片描述4. 对新增的Dashboard进行设置,如下图红框所示:
在这里插入图片描述

  • 填写基本信息,除了名称、描述、还可以打上一些标签:

在这里插入图片描述

  • 创建一个变量,如下图:

在这里插入图片描述

  • 在设置变量的页面进行设置,如下图:

在这里插入图片描述

  • 基本配置完成了,现在可以配置一个监控,用来展示业务上报的my_sample_counter_total数据了,如下:

在这里插入图片描述

  • 如下图红框,选择Graph:

在这里插入图片描述

  • 如下图,在新页面点击Panel Title的下拉菜单,选择"Edit":

在这里插入图片描述

  • 先配置展示名称,如下:

在这里插入图片描述

  • 如下图,选择"Metrics"页,数据源选择"Prometheus",红框3位置输入内容"my_sample_counter_total{status="success", job="$job"}",页面会立即展示my_sample_counter_total这个监控项的曲线图:

在这里插入图片描述

  • 此时,一个自定义监控项就设置成功了,记得点击右上角的"保存"按钮,如下图:

在这里插入图片描述

  • 点击dashboard的manage菜单,可见新增的dashboard,如下图:

在这里插入图片描述

  • 点击上图的红框,就能像其他监控项一样查看监控数据了:

在这里插入图片描述

  • 如果您想将这个监控项的配置导出来,以便备份或者导入到另一个Grafana系统,可以在设置页面点击"JSON Model"菜单,得到JSON格式的配置信息,自行保存,如下图:

在这里插入图片描述

  • 至此,自定义监控项从开发到配置我们都完成了实战,也到了《Docker下Prometheus和Grafana三部曲》系列和您说再见的时候了,在您搭建监控系统的时候,希望此系列文章能给您带来一些参考。

欢迎关注阿里云开发者社区博客:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...
相关实践学习
通过可观测可视化Grafana版进行数据可视化展示与分析
使用可观测可视化Grafana版进行数据可视化展示与分析。
相关文章
|
17天前
|
Prometheus 运维 监控
智能运维实战:Prometheus与Grafana的监控与告警体系
【10月更文挑战第26天】Prometheus与Grafana是智能运维中的强大组合,前者是开源的系统监控和警报工具,后者是数据可视化平台。Prometheus具备时间序列数据库、多维数据模型、PromQL查询语言等特性,而Grafana支持多数据源、丰富的可视化选项和告警功能。两者结合可实现实时监控、灵活告警和高度定制化的仪表板,广泛应用于服务器、应用和数据库的监控。
94 3
|
7天前
|
Prometheus 监控 Cloud Native
在 HBase 集群中,Prometheus 通常监控哪些类型的性能指标?
在 HBase 集群中,Prometheus 监控关注的核心指标包括 Master 和 RegionServer 的进程存在性、RPC 请求数、JVM 内存使用率、磁盘和网络错误、延迟和吞吐量、资源利用率及 JVM 使用信息。通过 Grafana 可视化和告警规则,帮助管理员实时监控集群性能和健康状况。
|
12天前
|
Prometheus Kubernetes Cloud Native
Prometheus的告警配置
【10月更文挑战第31天】Prometheus的告警配置
19 1
|
18天前
|
Prometheus 监控 Cloud Native
基于Docker安装Grafana和Prometheus
Grafana 是一款用 Go 语言开发的开源数据可视化工具,支持数据监控和统计,并具备告警功能。通过 Docker 部署 Grafana 和 Prometheus,可实现系统数据的采集、展示和告警。默认登录用户名和密码均为 admin。配置 Prometheus 数据源后,可导入主机监控模板(ID 8919)进行数据展示。
53 2
|
1月前
|
Java jenkins 持续交付
Centos7下docker的jenkins下载并配置jdk与maven
通过上述步骤,您将成功在CentOS 7上的Docker容器中部署了Jenkins,并配置好了JDK与Maven,为持续集成和自动化构建打下了坚实基础。
99 1
|
2月前
|
应用服务中间件 Docker 容器
docker应用部署---Tomcat的部署配置
这篇文章介绍了如何使用Docker部署Tomcat服务器,包括搜索和拉取Tomcat镜像、创建容器并设置端口映射和目录映射,以及如何创建一个HTML页面并使用外部机器访问Tomcat服务器。
docker应用部署---Tomcat的部署配置
|
2月前
|
关系型数据库 MySQL 数据安全/隐私保护
docker应用部署---MySQL的部署配置
这篇文章介绍了如何使用Docker部署MySQL数据库,包括搜索和拉取MySQL镜像、创建容器并设置端口映射和目录映射、进入容器操作MySQL,以及如何使用外部机器连接容器中的MySQL。
docker应用部署---MySQL的部署配置
|
1月前
|
网络协议 Docker 容器
docker中的DNS配置
【10月更文挑战第5天】
270 1
|
16天前
|
Prometheus 运维 监控
智能运维实战:Prometheus与Grafana的监控与告警体系
【10月更文挑战第27天】在智能运维中,Prometheus和Grafana的组合已成为监控和告警体系的事实标准。Prometheus负责数据收集和存储,支持灵活的查询语言PromQL;Grafana提供数据的可视化展示和告警功能。本文介绍如何配置Prometheus监控目标、Grafana数据源及告警规则,帮助运维团队实时监控系统状态,确保稳定性和可靠性。
82 0
|
1月前
|
存储 Ubuntu JavaScript
如何使用Docker优化你的开发环境配置
如何使用Docker优化你的开发环境配置