• Spring Boot 2.x系列【20】应用监控篇之Actuator入门案例及端点配置详解


    有道无术,术尚可求,有术无道,止于术。

    本系列Spring Boot版本2.7.0

    前言

    在生产环境很有必要对应用进行监控、追踪、审计、控制,假如数据库突然挂了,直到客户打电话骂娘时~ 我们才知道这回事,就很尴尬了。。。

    Spring Boot提供了spring-boot-actuator用于后台应用程序运行监控、指标收集、审计等功能。

    spring-boot-actuatorSpring Boot除了自动配置外另一个重要的核心功能。

    入门案例

    首先创建一个spring boot web项目,添加actuator starter依赖

            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-actuatorartifactId>
            dependency>
    
    • 1
    • 2
    • 3
    • 4

    然后添加端点配置,所谓端点endpoint就是spring-boot-actuator提供获取监控程序信息的入口,Spring Boot 包含了许多内置端点,也可以自定义端点。例如,health端点提供基本的应用程序健康信息。

    下面的配置表示将所有端点都暴露出来:

    management:
      endpoints:
        # Web端点的配置属性
        web:
          # 设置端点访问的URL前缀,默认为/actuator
          base-path: /actuator
          exposure:
            #  开放端点的ID集合(eg:['health','info','beans','env']),配置为“*”表示全部
            include: '*'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在项目启动后,日志会打印当前端点开启数量及访问前缀:
    在这里插入图片描述

    访问http://localhost:9056/actuator/health,也就是监控健康状态的端点,返回了一个状态为UP,表示当前程序正常运行中:
    在这里插入图片描述

    常用端点

    端点可以通过 HTTP JMX启用、禁用和公开(远程访问)。

    当端点被启用和公开时,它被认为是可用的。内置端点只有在可用时才会自动配置。

    大多数应用程序选择通过HTTP 公开,也是就通过URL地址访问,完整的路径为:

    http://ip:port/前缀/端点ID 
    
    • 1

    比如健康信息端点HTTP 访问URL 为:http://localhost:9056/actuator/health

    常用端点如下表说示:

    端点ID描述
    auditevents公开当前应用程序的审计事件信息。需要一个AuditEventRepository的Bean。
    beans显示应用程序中所有 Spring bean 的完整列表。
    caches公开可用的缓存。
    conditions显示在配置和自动配置类上评估的条件以及它们匹配或不匹配的原因。
    configprops显示所有 @ConfigurationProperties的整理列表。
    envSpring 的ConfigurableEnvironment.
    flyway显示已应用的任何 Flyway 数据库迁移。需要一颗或多Flyway Bean。
    health显示应用程序运行状况信息。
    httptrace显示 HTTP 跟踪信息(默认情况下,最后 100 个 HTTP 请求-响应交换)。需要一个HttpTraceRepository Bean。
    info显示任意应用程序信息。
    integrationgraph显示 Spring 集成图。需要依赖于spring-integration-core.
    loggers显示和修改应用程序中记录器的配置。
    liquibase显示已应用的任何 Liquibase 数据库迁移。需要一颗或多Liquibase Bean。
    metrics显示当前应用程序的“指标”信息。
    mappings显示所有@RequestMapping路径列表。
    quartz显示有关 Quartz 调度程序作业的信息。
    scheduledtasks显示应用程序中的计划任务。
    sessions允许从 Spring Session 支持的会话存储中检索和删除用户会话。需要使用 Spring Session 的基于 Servlet 的 Web 应用程序。
    shutdown让应用程序正常关闭。默认禁用。
    startup显示由收集的启动步骤ApplicationStartup 数据。需要SpringApplication使用BufferingApplicationStartup.
    threaddump执行线程转储。

    Web 应用程序(Spring MVC、Spring WebFlux 或 Jersey),可以使用以下附加端点:

    端点ID描述
    heapdump返回hprof堆转储文件。需要一个 HotSpot JVM。
    jolokia通过 HTTP 公开 JMX bean(当 Jolokia 在类路径上时,不适用于 WebFlux)。需要依赖于jolokia-core.
    logfile返回日志文件的内容(如果已设置logging.file.name或logging.file.path属性)。支持使用 HTTPRange头来检索日志文件的部分内容。
    prometheus以 Prometheus 服务器可以抓取的格式公开指标。需要依赖于micrometer-registry-prometheus.

    访问beans 端点,显示容器中所有的Bean:
    在这里插入图片描述
    访问loggers端点,显示程序日志记录器的级别:
    在这里插入图片描述
    访问metrics端点,显示容器中所有的指标:
    在这里插入图片描述再访问metrics/指标名称,可以看到当前指标详情,比如硬盘可用大小:
    在这里插入图片描述

    info端点显示当前应用程序信息。这些信息需要从特定位置配置:

    • 从编译文件,比如META-INF/build-info.properties
    • Git文件 ,比如git.properties
    • 环境的 property 中获取

    首先添加 POM 插件,构建 build-info.properties文件。

     <build>
            <plugins>
                
                <plugin>
                    <groupId>org.codehaus.mojogroupId>
                    <artifactId>build-helper-maven-pluginartifactId>
                    <version>3.2.0version>
                    <executions>
                        <execution>
                            <id>local-timestamp-propertyid>
                            <phase>validatephase>
                            <goals>
                                <goal>timestamp-propertygoal>
                            goals>
                            <configuration>
                                <name>local.build.timestampname>
                                <pattern>${maven.build.timestamp.format}pattern>
                                <timeZone>Asia/ShanghaitimeZone>
                                <timeSource>buildtimeSource>
                            configuration>
                        execution>
                    executions>
                plugin>
                
                <plugin>
                    <groupId>org.springframework.bootgroupId>
                    <artifactId>spring-boot-maven-pluginartifactId>
                    <executions>
                        
                        <execution>
                            <goals>
                                <goal>build-infogoal>
                            goals>
                            <configuration>
                                
                                <additionalProperties>
                                    <name>spring-boot-actuator-demo 后台监控服务name>
                                    <encoding.source>UTF-8encoding.source>
                                    <encoding.reporting>UTF-8encoding.reporting>
                                    <java.source>${maven.compiler.source}java.source>
                                    <java.target>${maven.compiler.target}java.target>
                                    <time>构建时间:${local.build.timestamp}time>
                                additionalProperties>
                            configuration>
                        execution>
                    executions>
                plugin>
            plugins>
        build>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49

    执行打包命令,查看生成的文件:

    在这里插入图片描述
    访问info端点:
    在这里插入图片描述

    启用端点

    默认情况下,启用除了shutdown之外的所有端点。要配置端点的启用,请使用management.endpoint..enabled属性。以下示例启用shutdown端点:

    management:
      endpoint:
        # 让应用程序正常关闭。默认禁用。
        shutdown:
          enabled: true
    
    • 1
    • 2
    • 3
    • 4
    • 5

    如果想要选择性的启用,可以将management.endpoints.enabled-by-default属性设置为false,表示禁止所有默认端点,然后使用单个端点的enabled属性开启你想要的端点。

    management:
      endpoint:
        # 启用info端点
        info:
          enabled: true
      endpoints:
        # 禁用所有其他端点
        enabled-by-default: false
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    暴露端点

    启用了端点之后,还需要暴露出来,让其他程序来获取监控信息。

    由于端点可能包含敏感信息,应该仔细考虑何时公开它们。下表显示了内置端点的暴露配置:

    IDJMXHTTP
    auditevents是的
    beans是的
    caches是的
    conditions是的
    configprops是的
    env是的
    flyway是的
    health是的是的
    heapdump不适用
    httptrace是的
    info是的
    integrationgraph是的
    jolokia不适用
    logfile不适用
    loggers是的
    liquibase是的
    metrics是的
    mappings是的
    prometheus不适用
    quartz是的
    scheduledtasks是的
    sessions是的
    shutdown是的
    startup是的
    threaddump是的

    更改公开的端点,使用includeexclude属性:

    management:
      endpoints:
        # Web端点的配置属性
        web:
          # 设置端点访问的URL前缀,默认为/actuator
          base-path: /actuator
          exposure:
            #  开放端点的ID集合(eg:['health','info','beans','env']),配置为“*”表示全部
            include: '*'
            #  不暴露的端点集合
            exclude: 'info'
        # JMX 端点配置
        jmx:
          exposure:
            exclude: 'info'
            include: '*'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    配置缓存

    端点会自动缓存对不带任何参数的读取操作的响应结果。要配置端点缓存响应的时间,使用其cache.time-to-live属性。以下示例将beans端点缓存的生存时间设置为 10 秒:

    management:
      endpoint:
        beans:
          cache:
            time-to-live: 10s
    
    • 1
    • 2
    • 3
    • 4
    • 5

    还可以配置CORS 跨域:

    management:
      endpoints:
        # Web端点的配置属性
        web:
          cors:
            allowed-origins: '*'
            allowed-methods: GET,POST
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
  • 相关阅读:
    趣聊粒子滤波器Particle Filter的概念问题
    Unity Meta Quest 开发:与 Unity 的 UI 系统进行交互
    WPF 控件专题 Expander控件详解
    Python项目开发实战:网络爬虫批量采集股票数据保存到Excel中
    5个顶级的Blender生成式AI插件
    【ubuntu noble】docker 容器无法使用 nvidia gpu
    通过此文让你全面了解Thread线程的基本操作
    记录:2022-9-17 数组中重复的数据 丑数 II 文件分配方式 位图及使用(打卡)
    专利转让的具体流程和步骤
    激光、超声波、霍尔、DS18B20 温度、模拟温度传感器 | 配合Arduino使用案例
  • 原文地址:https://blog.csdn.net/qq_43437874/article/details/119671958