Springboot actuator指标监控对接prometheus

举报
可以交个朋友 发表于 2024/01/04 16:47:27 2024/01/04
【摘要】 Spring Boot Actuator 包含许多附加功能特性,可在应用程序投入生产时通过使用HTTP端点来监控和管理应用程序 。审计信息、应用状态信息和指标采集信息可以自动被加载到应用程序中。

一 背景

当前微服务大部分开发语言仍然是Java,在Springboot开发模式下,可以通过springboot actuator实现对微服务的指标监控(包括服务状态,接口调用信息甚至是JVM堆栈信息),并对接开源Prometheus进行指标的存储和可视化。
image.png


二 Spring Boot Actuator 简介

  1. Spring Boot Actuator 包含许多附加功能特性,可在应用程序投入生产时通过使用HTTP端点来监控和管理应用程序 。审计信息、应用状态信息和指标采集信息可以自动被加载到应用程序中。

  2. spring-boot-actuator 模块提供了可用于生产的功能特性。启用这些功能特性的推荐方法是在pom.xml中添加对 spring-boot-starter-actuator的依赖项。

  3. Actuator 端点允许监视应用程序并与应用程序交互。 Spring Boot 包含许多内置端点,也可以添加自己的端点。例如,健康端点提供基本的应用程序健康信息。

  4. spring-boot-actuator虽然可以采集相关指标信息,但是并未对接Prometheus。这时就需要对接 Micrometer将采集的指标以Promethues能识别的格式进行暴露


三 实践演示

以Springboot 2.7.7 + Maven项目为例。模拟一个简单的web应用

3.1 代码配置集成

  1. 在pom.xml中添加actuator依赖项

      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-actuator</artifactId>
      </dependency>
    
  2. 加载依赖后,启动项目,访问接口测试
    访问业务接口返回信息正常
    image.png
    访问actuator接口,可以查看actuator默认开放的端口
    image.png
    访问health端点可以查看当前业务程序的健康状态,actuator默认开放了自身端点和health端点信息。
    image.png可以使用健康信息来检查运行中应用程序的状态。当生产系统宕机时,监控软件通常会使用它来发出警报。健康状况端点显示的信息取决于 management.endpoint.health.show-detailsmanagement.endpoint.health.show-components 属性,默认值是never,可修改调整为always 或者 when-authorized
    image.png

  3. 如何开放更多端点
    默认情况下,只有应用健康状况端点通过 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,效果如下:
    image.png
    image.png

  4. 如何将指标对接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,prometheusmanagement.metrics.tags.application=app2prom
    image.png
    重启项目,访问测试:
    image.png
    image.png


3.2 容器化部署

使用kubernetes进行容器编排,prometheus-operator进行指标监控
上述操作中已经完成Springboot监控指标的暴露以及prometheus的适配。接下来进行容器化部署

  1. 编写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 .
    image.png
    随后推送至镜像仓库

  2. 准备配置清单并部署在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
    

    image.png


3.3 监控效果

  1. 登录Prometheus UI查询相关指标
    image.png
    image.png

  2. 对接Grafana进行可视化配置
    可选择id 为4701 的dashboard进行jvm相关指标展示: https://grafana.com/grafana/dashboards/4701-jvm-micrometer/ 效果如下:
    image.png


四 延伸扩展

  1. 关于springboot-actuator采集指标可以参考开源项目:https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#actuator

  2. 关于Micrometer指标适配可以参考开源项目:https://docs.micrometer.io/micrometer/reference/implementations/prometheus.html

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。