写点什么

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

作者:程序员欣宸
  • 2022 年 8 月 26 日
    广东
  • 本文字数:5653 字

    阅读完需:约 19 分钟

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

欢迎访问我的 GitHub

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

本篇概览

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


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

源码下载

  • 接下来详细讲述应用的编码过程,如果您不想自己写代码,也可以在 GitHub 下载完整的应用源码,地址和链接信息如下表所示:



  • 这个 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: falsesecurity: 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;
@Configurationpublic 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;
@RestControllerclass 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;
@SpringBootApplicationpublic 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/prometheusdemoStep 1/3 : FROM java:8u111-jdk ---> d23bdf5b1b1bStep 2/3 : ADD /prometheusdemo-0.0.1-SNAPSHOT.jar // ---> 2c5819935f94Removing intermediate container 7d42332c1da5Step 3/3 : ENTRYPOINT java -jar /prometheusdemo-0.0.1-SNAPSHOT.jar ---> Running in 52407ee52ae4 ---> c2e2c7027455Removing intermediate container 52407ee52ae4Successfully 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 三部曲》系列和您说再见的时候了,在您搭建监控系统的时候,希望此系列文章能给您带来一些参考。

欢迎关注 InfoQ:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...


发布于: 刚刚阅读数: 4
用户头像

搜索"程序员欣宸",一起畅游Java宇宙 2018.04.19 加入

前腾讯、前阿里员工,从事Java后台工作,对Docker和Kubernetes充满热爱,所有文章均为作者原创,个人Github:https://github.com/zq2599/blog_demos

评论

发布
暂无评论
Docker下Prometheus和Grafana三部曲之三:自定义监控项开发和配置_Grafana_程序员欣宸_InfoQ写作社区