写点什么

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

  • 2022 年 4 月 25 日
  • 本文字数:2831 字

    阅读完需:约 9 分钟

<plugin>


<groupId>com.spotify</groupId>


<artifactId>docker-maven-plugin</artifactId>


<configuration>


<imageName>bolingcavalry/${project.artifactId}</imageName>


<imageTags>


<imageTag>${project.version}</imageTag>


</imageTags>


<baseImage>java:8u111-jdk</baseImage>


<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>


  1. 修改系统配置文件 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


  1. 增加一个 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(稍后展示的实际数据可以看到);


4. 做一个响应 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();


}


}


  1. 应用的入口类没有什么特别的,如下:


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);


}


}


  1. 另外为了方便大家实战,我把前面几篇文章用到的脚本内容也放在这个工程中了,在名为 files 的文件夹下:



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

[](()构建应用的 Docker 镜像

  1. 请确认当前的电脑上 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 《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 -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] ------------------------------------------------------------------------


  1. 输入 docker images 命令检查本地镜像,可以看到新构建的内容,如下图红框:



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



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

[](()配置自定义监控项

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



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

  2. 在 Grafana 页面点击 manage,再点击"+Dashboard"按钮,如下图:



4. 对新增的 Dashboard 进行设置,如下图红框所示:



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



用户头像

还未添加个人签名 2022.04.13 加入

还未添加个人简介

评论

发布
暂无评论
Docker下Prometheus和Grafana三部曲之三:自定义监控项开发和配置_Java_爱好编程进阶_InfoQ写作社区