服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|JavaScript|易语言|

服务器之家 - 编程语言 - Java教程 - Prometheus监控Springboot程序的实现方法

Prometheus监控Springboot程序的实现方法

2021-08-25 10:34csdn_freak_dd Java教程

这篇文章主要介绍了Prometheus监控Springboot程序的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

1. 添加依赖

我本次使用的Springboot版本为1.5.12.RELEASE,如果是Springboot2.0+,那么监控的配置以及吐出的监控指标会有所不同。
添加maven依赖,pom文件配置如下:

  1. <dependency>
  2. <groupId>io.prometheus</groupId>
  3. <artifactId>simpleclient_spring_boot</artifactId>
  4. <version>${prometheus.client.version}</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>io.prometheus</groupId>
  8. <artifactId>simpleclient</artifactId>
  9. <version>${prometheus.client.version}</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>io.prometheus</groupId>
  13. <artifactId>simpleclient_hotspot</artifactId>
  14. <version>${prometheus.client.version}</version>
  15. </dependency>

其中Prometheus的版本号为:

  1. <prometheus.client.version>0.5.0</prometheus.client.version>

2. 修改配置文件

修改application.properties配置文件,添加如下内容:

  1. server.port=8080
  2.  
  3. # 启用基础认证
  4. security.basic.enabled = false
  5.  
  6. # 安全路径列表,逗号分隔,此处只针对/admin路径进行认证
  7. security.basic.path = /admin
  8.  
  9. # 认证使用的用户名
  10. security.user.name = admin
  11.  
  12. # 认证使用的密码。 默认情况下,启动时会记录随机密码。
  13. security.user.password = 123456
  14.  
  15. # 可以访问管理端点的用户角色列表,逗号分隔
  16. management.security.roles = SUPERUSER
  17.  
  18. # actuator暴露接口使用的端口,为了和api接口使用的端口进行分离
  19. management.port = 8099
  20.  
  21. # actuator暴露接口的前缀
  22. management.context-path = /admin
  23.  
  24. # actuator是否需要安全保证
  25. management.security.enabled = false
  26.  
  27. # actuator的metrics接口是否需要安全保证
  28. endpoints.metrics.sensitive = false
  29.  
  30. # actuator的metrics接口是否开启
  31. endpoints.metrics.enabled=true
  32.  
  33. # actuator的health接口是否需要安全保证
  34. endpoints.health.sensitive=false
  35.  
  36. # actuator的health接口是否开启
  37. endpoints.health.enabled=true

application.yml 配置如下:

  1. # actuator是否需要安全保证
  2. management.security.enabled: false
  3. endpoints:
  4. metrics:
  5. # actuator的metrics接口是否需要安全保证
  6. sensitive: false
  7. # actuator的metrics接口是否开启
  8. enabled: true
  9. health:
  10. # actuator的health接口是否需要安全保证
  11. sensitive: false
  12. # actuator的health接口是否开启
  13. enabled: true

3. 启用Prometheus监控

在Springboot启动类上添加注解@EnablePrometheusEndpoint,同时使用simpleclient_hotspot中提供的DefaultExporter该Exporter会在metrics endpoint中放回当前应用JVM的相关信息

  1. @SpringBootApplication
  2. @EnablePrometheusEndpoint
  3. @EnableSpringBootMetricsCollector
  4. public class CaseApplication implements CommandLineRunner {
  5.  
  6. public static void main(String[] args) {
  7. SpringApplication.run(CaseApplication.class, args);
  8. }
  9.  
  10. @Override
  11. public void run(String... strings) throws Exception {
  12. DefaultExports.initialize();
  13. }
  14.  
  15. }

4. 监控埋点

4.1 新建拦截器

建立一个拦截器,用来拦截URL。

  1. public class PrometheusMetricsInterceptor implements HandlerInterceptor {
  2.  
  3. private Histogram.Timer histogramRequestTimer;
  4. private Histogram.Timer nacosTimer;
  5. private Histogram.Child nacosChild;
  6.  
  7. static final Histogram requestLatencyHistogram = Histogram.build().labelNames("path", "method", "code")
  8. .name("io_namespace_http_requests_latency_seconds_histogram").help("Request latency in seconds.")
  9. .register();
  10.  
  11. @Override
  12. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  13. System.out.println("-------Histogram--------");
  14. histogramRequestTimer = requestLatencyHistogram
  15. .labels(request.getRequestURI(), request.getMethod(), String.valueOf(response.getStatus()))
  16. .startTimer();
  17. nacosTimer = MetricsMonitor.getConfigRequestMonitor(request.getMethod(), request.getRequestURI(), String.valueOf(response.getStatus()));
  18. nacosChild = MetricsMonitor.getNamingRequestMonitor(request.getMethod(), request.getRequestURI(), String.valueOf(response.getStatus()));
  19. return true;
  20. }
  21.  
  22. @Override
  23. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
  24.  
  25. }
  26.  
  27. @Override
  28. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
  29. histogramRequestTimer.observeDuration();
  30. nacosTimer.observeDuration();
  31. nacosChild.startTimer();
  32. }
  33. }

4.2 注册拦截器

新建拦截器后需要注册到服务中才可以拦截URL。

  1. @Configuration
  2. public class WebServletContextConfiguration extends WebMvcConfigurationSupport {
  3.  
  4. @Override
  5. public void addInterceptors(InterceptorRegistry registry) {
  6.  
  7. registry.addInterceptor(getInterceptor()).addPathPatterns("/**");
  8. super.addInterceptors(registry);
  9. }
  10.  
  11. @Bean
  12. public HandlerInterceptor getInterceptor() {
  13. return new PrometheusMetricsInterceptor();
  14. }
  15.  
  16. }

5. 验证监控

启动应用程序,访问地址
http://localhost:8099/admin/prometheus,验证是否存在监控指标。

Prometheus监控Springboot程序的实现方法

6. 指标类型

普罗米修斯客户端库提供了四种核心度量类型。目前,它们只在客户端库(为了使api能够根据特定类型的使用而定制)和wire协议中有所区别。Prometheus服务器还没有利用类型信息,并将所有数据压缩成无类型的时间序列。这种情况在未来可能会改变。

6.1 Counter

计数器是一个累积度量,它表示一个单调递增的计数器,其值在重新启动时只能递增或重置为零。例如,您可以使用计数器来表示服务的请求、完成的任务或错误的数量。
不要使用计数器来暴露可能降低的值。例如,不要为当前正在运行的进程的数量使用计数器;而是使用量规。
示例代码:

  1. import io.prometheus.client.Counter;
  2. class YourClass {
  3. static final Counter requests = Counter.build()
  4. .name("requests_total").help("Total requests.").register();
  5.  
  6. void processRequest() {
  7. requests.inc();
  8. // Your code here.
  9. }
  10. }

6.2 Gauge

量规是一个度量单位,它表示一个可以任意上下移动的数值。
压力表通常用于测量温度或当前内存使用情况等测量值,但也用于“计数”,比如并发请求的数量。
示例代码:

  1. class YourClass {
  2. static final Gauge inprogressRequests = Gauge.build()
  3. .name("inprogress_requests").help("Inprogress requests.").register();
  4.  
  5. void processRequest() {
  6. inprogressRequests.inc();
  7. // Your code here.
  8. inprogressRequests.dec();
  9. }
  10. }

6.3 Histogram

直方图对观察结果(通常是请求持续时间或响应大小之类的东西)进行采样,并在可配置的桶中计数。它还提供所有观测值的和。
示例代码:

  1. class YourClass {
  2. static final Histogram requestLatency = Histogram.build()
  3. .name("requests_latency_seconds").help("Request latency in seconds.").register();
  4.  
  5. void processRequest(Request req) {
  6. Histogram.Timer requestTimer = requestLatency.startTimer();
  7. try {
  8. // Your code here.
  9. } finally {
  10. requestTimer.observeDuration();
  11. }
  12. }
  13. }

6.4 Summary

与柱状图类似,摘要对观察结果进行采样(通常是请求持续时间和响应大小之类的内容)。虽然它还提供了观察值的总数和所有观察值的总和,但它计算了一个滑动时间窗口上的可配置分位数。

  1. class YourClass {
  2. static final Summary receivedBytes = Summary.build()
  3. .name("requests_size_bytes").help("Request size in bytes.").register();
  4. static final Summary requestLatency = Summary.build()
  5. .name("requests_latency_seconds").help("Request latency in seconds.").register();
  6.  
  7. void processRequest(Request req) {
  8. Summary.Timer requestTimer = requestLatency.startTimer();
  9. try {
  10. // Your code here.
  11. } finally {
  12. receivedBytes.observe(req.size());
  13. requestTimer.observeDuration();
  14. }
  15. }
  16. }

6.5 自定义Collector

有时不可能直接测试代码,因为它不在您的控制范围内。这要求您代理来自其他系统的指标。
为此,您需要创建一个自定义收集器(需要将其注册为普通度量)。

  1. class YourCustomCollector extends Collector {
  2. List<MetricFamilySamples> collect() {
  3. List<MetricFamilySamples> mfs = new ArrayList<MetricFamilySamples>();
  4. // With no labels.
  5. mfs.add(new GaugeMetricFamily("my_gauge", "help", 42));
  6. // With labels
  7. GaugeMetricFamily labeledGauge = new GaugeMetricFamily("my_other_gauge", "help", Arrays.asList("labelname"));
  8. labeledGauge.addMetric(Arrays.asList("foo"), 4);
  9. labeledGauge.addMetric(Arrays.asList("bar"), 5);
  10. mfs.add(labeledGauge);
  11. return mfs;
  12. }
  13. }
  14.  
  15. // Registration
  16. static final YourCustomCollector requests = new YourCustomCollector().register()

7. 安装配置Prometheus

7.1 安装配置

下载安装包

  1. wget https://github.com/prometheus/prometheus/releases/download/v2.12.0/prometheus-2.12.0.linux-amd64.tar.gz

解压文件

  1. tar -zxvf prometheus-2.12.0.linux-amd64.tar.gz

修改配置文件prometheus.yml采集Nacos metrics数据。配置监控的job以及目标服务器,每一个目标服务器都是一个实例。

  1. cd prometheus-*

Prometheus监控Springboot程序的实现方法

后台启动Prometheus服务,并出到日志。

  1. ./prometheus --config.file=prometheus.yml > prometheus.log 2>&1 &

通过访问http://{ip}:9090/graph可以看到prometheus的采集数据,在搜索栏搜索监控指标,例如:nacos_monitor可以搜索到Nacos数据说明采集数据成功

Prometheus监控Springboot程序的实现方法

在查询条件框中输入表达式,进行统计。例如:

  1. sum(rate(nacos_client_request_seconds_count{url=~'/dialog/slu/nlp/parser', instance=~'39.97.161.102:30315|39.97.161.102:30316'}[1m])) by (method,url,instance)

结果如下图:

Prometheus监控Springboot程序的实现方法

8. 安装配置Grafana

8.1 安装配置

安装grafana,下载安装包

  1. wget https://dl.grafana.com/oss/release/grafana-6.5.2.linux-amd64.tar.gz
  2. tar -zxvf grafana-6.5.2.linux-amd64.tar.gz

修改端口配置,复制一个配置文件,后续修改基于该自定义配置文件修改,不需要修改原始文件。

  1. cd grafana-6.5.2/conf
  2. cp sample.ini custom.ini
  3. vi custom.ini

可以在该配置文件中修改端口号

Prometheus监控Springboot程序的实现方法

访问grafana: http://{ip}:3000,用户名密码默认为:admin/admin。

Prometheus监控Springboot程序的实现方法

登录时提示修改默认密码,如果不想修改可以跳过。

8.2 配置数据源

Prometheus监控Springboot程序的实现方法

Prometheus监控Springboot程序的实现方法

Prometheus监控Springboot程序的实现方法

Prometheus监控Springboot程序的实现方法

8.3 配置监控面板

监控面板可以自己配置,也可以通过导入json文件来进行修改,推荐使用配置好的json文件,修改起来会非常方便。

Prometheus监控Springboot程序的实现方法

Prometheus监控Springboot程序的实现方法

Prometheus监控Springboot程序的实现方法

修改后的展示效果如图所示:

Prometheus监控Springboot程序的实现方法

注:此处grafana的模板文件是从别处下载的,可以根据需要导入自己的模板文件。

9. 参考文献

SpringBoot 应用监控踩坑集锦

prometheus docs

到此这篇关于Prometheus监控Springboot程序的实现方法的文章就介绍到这了,更多相关Prometheus监控Springboot内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/mingyonghu/article/details/104040205

延伸 · 阅读

精彩推荐