Springboot actuator指标监控对接prometheus
一 背景
当前微服务大部分开发语言仍然是Java,在Springboot开发模式下,可以通过springboot actuator实现对微服务的指标监控(包括服务状态,接口调用信息甚至是JVM堆栈信息),并对接开源Prometheus进行指标的存储和可视化。
二 Spring Boot Actuator 简介
-
Spring Boot Actuator 包含许多附加功能特性,可在应用程序投入生产时通过使用HTTP端点来监控和管理应用程序 。审计信息、应用状态信息和指标采集信息可以自动被加载到应用程序中。
-
spring-boot-actuator 模块提供了可用于生产的功能特性。启用这些功能特性的推荐方法是在pom.xml中添加对 spring-boot-starter-actuator的依赖项。
-
Actuator 端点允许监视应用程序并与应用程序交互。 Spring Boot 包含许多内置端点,也可以添加自己的端点。例如,健康端点提供基本的应用程序健康信息。
-
spring-boot-actuator虽然可以采集相关指标信息,但是并未对接Prometheus。这时就需要对接 Micrometer将采集的指标以Promethues能识别的格式进行暴露
三 实践演示
以Springboot 2.7.7 + Maven项目为例。模拟一个简单的web应用
3.1 代码配置集成
-
在pom.xml中添加actuator依赖项
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
-
加载依赖后,启动项目,访问接口测试
访问业务接口返回信息正常
访问actuator接口,可以查看actuator默认开放的端口
访问health端点可以查看当前业务程序的健康状态,actuator默认开放了自身端点和health端点信息。
可以使用健康信息来检查运行中应用程序的状态。当生产系统宕机时,监控软件通常会使用它来发出警报。健康状况端点显示的信息取决于management.endpoint.health.show-details
和management.endpoint.health.show-components
属性,默认值是never
,可修改调整为always 或者 when-authorized
-
如何开放更多端点
默认情况下,只有应用健康状况端点通过 HTTP 或JMX进行 公开。可以通过在application.properties中添加配置management.endpoints.web.exposure.include=*
。星号代表所有的端点信息都会暴露{ "_links": { "self": { "href": "http://localhost:8080/actuator", "templated": false }, "beans": { "href": "http://localhost:8080/actuator/beans", "templated": false }, "caches-cache": { "href": "http://localhost:8080/actuator/caches/{cache}", "templated": true }, "caches": { "href": "http://localhost:8080/actuator/caches", "templated": false }, "health": { "href": "http://localhost:8080/actuator/health", "templated": false }, "health-path": { "href": "http://localhost:8080/actuator/health/{*path}", "templated": true }, "info": { "href": "http://localhost:8080/actuator/info", "templated": false }, "conditions": { "href": "http://localhost:8080/actuator/conditions", "templated": false }, "configprops-prefix": { "href": "http://localhost:8080/actuator/configprops/{prefix}", "templated": true }, "configprops": { "href": "http://localhost:8080/actuator/configprops", "templated": false }, "env": { "href": "http://localhost:8080/actuator/env", "templated": false }, "env-toMatch": { "href": "http://localhost:8080/actuator/env/{toMatch}", "templated": true }, "loggers": { "href": "http://localhost:8080/actuator/loggers", "templated": false }, "loggers-name": { "href": "http://localhost:8080/actuator/loggers/{name}", "templated": true }, "heapdump": { "href": "http://localhost:8080/actuator/heapdump", "templated": false }, "threaddump": { "href": "http://localhost:8080/actuator/threaddump", "templated": false }, "metrics-requiredMetricName": { "href": "http://localhost:8080/actuator/metrics/{requiredMetricName}", "templated": true }, "metrics": { "href": "http://localhost:8080/actuator/metrics", "templated": false }, "scheduledtasks": { "href": "http://localhost:8080/actuator/scheduledtasks", "templated": false }, "mappings": { "href": "http://localhost:8080/actuator/mappings", "templated": false } } }
由于其它端点可能包含敏感信息,例如审计事件相关的信息,可选择指定端点数据进行暴露,例如health、metrics、等非敏感信息
由于我们只是目的只是采集相关指标,可以选择暴露metrics:management.endpoints.web.exposure.include=health,metrics
,效果如下:
-
如何将指标对接Prometheus系统
虽然springboot actuator暴露了很多监控信息,看指标样式并未适配prometheus,这时候就需要集成Micrometer进行指标适配了。在pom.xml 中引入依赖:<dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-prometheus</artifactId> </dependency>
同时还需要在application.properties中添加prometheus暴露端点:
management.endpoints.web.exposure.include=health,metrics,prometheus
和management.metrics.tags.application=app2prom
重启项目,访问测试:
3.2 容器化部署
使用kubernetes进行容器编排,prometheus-operator进行指标监控
上述操作中已经完成Springboot监控指标的暴露以及prometheus的适配。接下来进行容器化部署
-
编写dockerfile 构建容器镜像
# 基于官方的 Maven 3.6.1-jdk-11-slim 这个镜像 FROM maven:3.8.7-openjdk-18-slim AS build # 将本地代码复制到 Docker 容器中的 /usr/src/app 目录下 COPY src /usr/src/app/src COPY pom.xml /usr/src/app # 在容器的 /usr/src/app 目录下,运行 mvn clean package 命令,构建项目 RUN mvn -f /usr/src/app/pom.xml clean package # 使用官方的 openjdk:11-jre-slim 镜像作为基础镜像 FROM openjdk:19-jdk-slim # 将打包生成的 jar 文件复制到容器中 COPY --from=build /usr/src/app/target/*.jar /usr/app/app.jar # 声明服务运行在 8080 端口 EXPOSE 8080 # 指定 docker 容器的启动命令 ENTRYPOINT ["java", "-jar", "/usr/app/app.jar"]
执行docker build 命令构建镜像:
docker build -t swr.cn-north-4.myhuaweicloud.com/k8s-solution/springboot-promethues-demo:v1 --platform=linux/amd64 .
随后推送至镜像仓库 -
准备配置清单并部署在kubernetes集群中
apiVersion: apps/v1 kind: Deployment metadata: name: app2prom labels: app: app2prom spec: replicas: 2 selector: matchLabels: app: app2prom template: metadata: labels: app: app2prom spec: containers: - name: app2prom image: swr.cn-north-4.myhuaweicloud.com/k8s-solution/springboot-promethues-demo:v1 ports: - containerPort: 8080 resources: requests: cpu: 100m memory: 100Mi limits: cpu: 500m memory: 500Mi --- apiVersion: v1 kind: Service metadata: name: app2prom labels: app: app2prom spec: selector: app: app2prom ports: - protocol: TCP port: 8080 targetPort: 8080 name: prom --- kind: ServiceMonitor metadata: name: app2prom namespace: monitoring labels: app: springboot-actuator spec: endpoints: - interval: 15s port: prom scheme: http path: /actuator/prometheus namespaceSelector: any: true selector: matchLabels: app: app2prom
3.3 监控效果
-
登录Prometheus UI查询相关指标
-
对接Grafana进行可视化配置
可选择id 为4701 的dashboard进行jvm相关指标展示: https://grafana.com/grafana/dashboards/4701-jvm-micrometer/ 效果如下:
四 延伸扩展
-
关于springboot-actuator采集指标可以参考开源项目:https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#actuator
-
关于Micrometer指标适配可以参考开源项目:https://docs.micrometer.io/micrometer/reference/implementations/prometheus.html
- 点赞
- 收藏
- 关注作者
评论(0)