需求:业务方需要看到每个服务实例的JVM资源使用情况

难点:

每个服务实例在k8s中都是一个pod且分布在不同的namespace中数量成百上千
prometheus监控需要服务提供metrics接口
prometheus需要在配置文件中添加每个实例的metrics地址,因为pod的ip一直在变,所以配置文件写死了无法完成,需要配置自动发现
解决方案:

搭建集成了Micrometer功能的Spring BootJVM监控,并配置Grafana监控大盘
配置prometheus自动发现

一、集成actuator与micrometer

image.png
通过micrometer桥接prometheus

1 pom文件中引入micrometer包

pom文件中引入如下的插件:

  1. <!--监控系统健康情况的工具-->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-actuator</artifactId>
  5. </dependency>
  6. <!--桥接Prometheus-->
  7. <dependency>
  8. <groupId>io.micrometer</groupId>
  9. <artifactId>micrometer-registry-prometheus</artifactId>
  10. <version>1.6.0</version>
  11. </dependency>
  12. <!--micrometer核心包, 按需引入, 使用Meter注解或手动埋点时需要-->
  13. <dependency>
  14. <groupId>io.micrometer</groupId>
  15. <artifactId>micrometer-core</artifactId>
  16. <version>1.6.0</version>
  17. </dependency>
  18. <!--micrometer获取JVM相关信息, 并展示在Grafana上-->
  19. <dependency>
  20. <groupId>io.github.mweirauch</groupId>
  21. <artifactId>micrometer-jvm-extras</artifactId>
  22. <version>0.2.0</version>
  23. </dependency>

2 开放prometheus接口

因为spring actuator因为安全原因默认只开启health和info接口,所以我们需要修改下application.yml,将prometheus接口放开

  1. # metircs
  2. management:
  3. endpoints:
  4. web:
  5. exposure:
  6. include: prometheus, health
  7. metrics:
  8. export:
  9. simple:
  10. enabled: false
  11. tags:
  12. application: ${spring.application.name}

3 编译启动对应服务

修改完毕后,编译启动对应服务。
访问http://服务地址:端口/actuator/prometheus可以看到如下metrics

image.png
二、配置prometheus自动发现

步骤一我们配置了单个实例的metrics接口,在实际生产环境中每个服务都有对应的service而且下面会有很多pod,我们这里通过prometheus的自动发现来将所有实例metrics信息收集起来

1 修改服务部署的yaml文件

修改服务部署的yaml,在deployment/service的metadata中加入如下的annotations为自动发现做准备

  1. annotations:
  2. prometheus.io/port: "8089" #端口配自己服务的端口
  3. prometheus.io/spring: "true"
  4. prometheus.io/path: "actuator/prometheus"

2 在prometheus配置文件中添加spring项目metrics

k8s中的prometheus可以使用k8s的机制进行自动发现,配置如下:

  1. - job_name: 'kubernetes-java-pod'
  2. kubernetes_sd_configs:
  3. - role: endpoints
  4. relabel_configs:
  5. - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_spring]
  6. action: keep
  7. regex: true
  8. - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path]
  9. action: replace
  10. target_label: __metrics_path__
  11. regex: (.+)
  12. - source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port]
  13. action: replace
  14. target_label: __address__
  15. regex: ([^:]+)(?::\d+)?;(\d+)
  16. replacement: $1:$2
  17. - action: labelmap
  18. regex: __meta_kubernetes_service_label_(.+)
  19. - source_labels: [__meta_kubernetes_namespace]
  20. action: replace
  21. target_label: spring_namespace
  22. - source_labels: [__meta_kubernetes_service_name]
  23. action: replace
  24. target_label: spring_name

这里面的label与我们步骤1中配置的annotation对应
配置完,重新加载配置文件后,在prometheus控制台可以看到加载进来的target
image.png

3 grafana配置展示大屏

对应的dashboard已经上传到grafana,import编号为13657的即可。
效果如下