【SpringBoot系列】- 四大核心之actuator(程序监控器)

【SpringBoot系列】- 四大核心之actuator(程序监控器)

文章目录

  • 【SpringBoot系列】- 四大核心之actuator(程序监控器)
    • 一、概述
    • 二、Spring Boot Actuator应用
      • 2.1 在项目POM文件中导入Actuator
      • 2.2 application配置
      • 2.3 配置详解
        • 2.3.1 Sensor 类 endpoints
        • 2.3.2 Actuator 类 endpoints
        • 2.3.3 自定义应用的健康状态检查
    • 三、Actuator监控项
    • 四、Spring Boot Actuator应用扩展
      • 3.1 CrshAutoConfiguration 与 spring-boot-starter-remote-shell
      • 3.2 CrshAutoConfiguration 与 spring-boot-starter-remote-shell
      • 3.3 Auditing 与 Trace
    • 五、总结

一、概述

应用系统在开发完成以后,就投入实际生产中运营。在软件运行时,整个软件一个黑盒,如何在整个生命周期中准确的知道应用程序运行的健康状况,服务使用状态?我们需要对应用程序进行监控,从而了解应用的运行状态,并根据情况决定是否需要对其运行状态进行调整。

Spring Boot提供了Spring-Boot-Start-Actuator 自动配置模块用于支持 SpringBoot 应用的监控。Spring Boot Actuator模块提供了生产级别的功能,比如健康检查、审计、指标收集、HTTP跟踪等,帮助我们监控和管理Spring Boot应用程序。

这个模块是一个采集应用内部信息暴露给外部的模块,上述的功能都可以通过HTTP和JMX访问。因为是暴露内部信息的特性,Actuator也可以和一些外部的应用监控程序结合(Graphite、Prometheus、Zabbix、cAdvisor、Riemann等)更友好的提供仪表板、图形图表、分析与预警。可帮助你通过一个统一友好的界面,监视和管理你的应用程序。

二、Spring Boot Actuator应用

2.1 在项目POM文件中导入Actuator

<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-actuatorartifactId>
dependency>
<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-webartifactId>
dependency>

2.2 application配置

需要在application配置文件中,配置具体的Actuator应用;

Spring boot 2.6以后的版本需要手动开启info配置,因为info默认值是false

server:
  port: 8080 #服务端口
info: 
  application:
     name: "@project.name@" #从pom.xml中获取
     description: "@project.description@" 
     version: "@project.version@"
 management:
     server:
       port: 8501 #指定监听端口,不能指定则与server端口一致。
     endpoints:   #启动所有监控
       web: 
         exposure: 
           include: '*'
      info: # spring-boot 2.6以后info默认值为false.需手动开启
         env:
           enabled: true

2.3 配置详解

spring-boot-starter-actuator 自动配置模块默认提供了很多 endpoint,虽然自动配置模块名为 spring-boot-starter-actuator,但实际上这些 endpoint 可以按照“监”和“控”划分为两类:

2.3.1 Sensor 类 endpoints

序号 名称 说明
1 autoconfig 这个 endpoint 会为我们提供一份 SpringBoot 的自动配置报告,告诉我们哪些自动配置模块生效了,以及哪些没有生效,原因是什么。
2 beans 给出当前应用的容器中所有 bean 的信息。
3 configprops 对现有容器中的 ConfigurationProperties 提供的信息进行“消毒”处理后给出汇总信息。
4 info 提供当前 SpringBoot 应用的任意信息,我们可以通过 Environment 或者 application.properties 等形式提供以 info. 为前缀的任何配置项,然后 info 这个 endpoint 就会将这些配置项的值作为信息的一部分展示出来。
5 health 针对当前 SpringBoot 应用的健康检查用的 endpoint。
6 env 关于当前 SpringBoot 应用对应的 Environment 信息。
7 metrics 当前 SprinBoot 应用的 metrics 信息。
8 trace 当前 SpringBoot 应用的 trace 信息。
9 mapping 如果是基于 SpringMVC 的 Web 应用,mapping 这个 endpoint 将给出 @RequestMapping 相关信息。

2.3.2 Actuator 类 endpoints

  • shutdown:用于关闭当前 SpringBoot 应用的 endpoint。
  • dump:用于执行线程的 dump 操作。

默认情况下,除了 shutdown 这个 endpoint(因为比较危险,如果没有安全防护,谁都可以访问它,然后关闭应用),其他 endpoints 都是默认启用的。

生产环境下,如果没有启用安全防护(比如没有依赖 spring-boot-starter-security),那么,建议遵循 Deny By Default 原则,将所有的 endpoints 都关掉,然后根据具体情况单独启用某些 endpoint:

endpoints:
   enabled: true
   falseendpoints:
      info:
         enabled: true
         endpoints: 
            health: 
              enabled: true

所有配置项以 endpoints. 为前缀,然后根据 endpoint 名称划分具体配置项。大部分 endpoints 都是开箱即用,但依然有些 endpoint 提供给我们进一步扩展的权利,比如健康状态检查相关的 endpoint(health endpoint)。

2.3.3 自定义应用的健康状态检查

应用的健康状态检查是很普遍的监控需求,SpringBoot 也预先通过 org.springframework.boot.actuate.autoconfigure.HealthIndicatorAutoConfiguration 为我们提供了一些常见服务的监控检查支持,比如:

  • DataSourceHealthIndicator
  • DiskSpaceHealthIndicator
  • RedisHealthIndicator
  • SolrHealthIndicator
  • MongoHealthIndicator

如果这些默认提供的健康检查支持依然无法满足我们的需要,SpringBoot 还允许我们提供更多的 HealthIndicator 实现,只要将这些 HealthIndicator 实现类注册到 IoC 容器,SpringBoot 会自动发现并使用它们。

三、Actuator监控项

HTTP方法 路径 描述 授权
GET /autoconfig 查看自动配置的使用情况 true
GET /configprops 查看配置属性,包括默认配置 true
GET /beans 查看bean及其关系列表 true
GET /dump 打印线程栈 true
GET /env/{name} 查看具体变量值 true
GET /health 查看应用健康指标 true
GET /info 查看应用信息(需要自己在application.properties)里头添加信息, false
GET /mappings 查看所有url映射 true
GET /metrics 报告各种应用程序度量信息,比如内存用量和HTTP请求计数 true
GET /metrics/{name} 报告指定名称的应用程序度量值 true
GET /shutdown 关闭应用程序,要求endpoints.shutdown.enabled设置为true true
GET /trace 提供基本的HTTP请求跟踪信息(时间戳、HTTP头等) true

四、Spring Boot Actuator应用扩展

endpoints 属于 spring-boot-starter-actuator 提供的主要功能之一,除此之外,spring-boot-starter-actuator 还提供了更多针对应用监控的支持和实现方案。

3.1 CrshAutoConfiguration 与 spring-boot-starter-remote-shell

spring-boot-starter-actuator 提供了基于 CRaSH 的远程 Shell(Remote Shell)支持,这是一把双刃剑,不建议在生产环境使用,因为提供给自己便利的同时,也为黑客朋友们提供了便利。如果实在要用,请加强安全认证和防护。

不过,这里我们还是会为大家分析一下 spring-boot-starter-actuator 是如何提供针对 CRaSH 的支持的。

spring-boot-starter-actuator 提供了 org.springframework.boot.actuate.autoconfigure.CrshAutoConfiguration 自动配置类,该类会在 org.crsh.plugin.PluginLifeCycle 出现在 classpath 中的时候生效。

所以,只要将 CRaSH 作为依赖加入应用的 classpath 依赖就可以了,最简单直接的做法是让需要启用 CRaSH 的 SpringBoot 应用依赖 spring-boot-starter-remote-shell 自动配置模块,spring-boot-starter-remote-shell 的主要功效就是提供了针对 CRaSH 的各项依赖。

3.2 CrshAutoConfiguration 与 spring-boot-starter-remote-shell

SpringBoot 提供了一套自己的针对系统指标的度量框架,基本上,我们只需关注 org.springframework.boot.actuate.endpoint.PublicMetrics 即可,它可以理解为提供一组 Metric 的集合,我们既可以通过 PublicMetrics 来汇总和管理 Metric,也可以通过 MetricRepository 来存储和管理 Metric。

一旦使用了 spring-boot-starter-actuator,只要当前 SpringBoot 应用的 ApplicationContext 中存在任何 PublicMetrics 实例,EndpointAutoConfiguration 就会将这些 PublicMetrics 采集汇总到一起,然后通过 MetricsEndpoint 将它们开放出去。

spring-boot-starter-actuator 提供的 org.springframework.boot.actuate.autoconfigure.PublicMetricsAutoConfiguration 默认会把一个 SystemPublicMetrics 开放出来,用于提供系统各项指标的度量和状态采集,另外一个就是会把当前 SpringBoot 应用的 ApplicationContext 的 org.springframework.boot.actuate.metrics.repository.MetricRepository 实例中的所有 Metric 汇总并开放出去。

默认如果用户没有给出任何自定义的 MetricRepository,spring-boot-starter-actuator 会提供一个 InMemoryMetricRepository 实现,如果我们将 Dropwizard 的 Metrics 类库作为依赖加入 classpath,那么,Dropwizard Metrics 的 MetricRegistry 中所有的度量指标项也会通过 PublicMetrics 的形式开发暴露出来。

虽然 SpringBoot 提供的 metrics 框架也能帮助我们完成系统和应用指标的度量,但笔者更倾向于使用 Dropwizard 这种特定场景下比较完善的方案,从 metrics 的类型,到外围系统的集成,Dropwizard metrics 都更加成熟和完备。

3.3 Auditing 与 Trace

SpringBoot 的 Auditing 和 Trace 支持都遵循数据/事件+Repository 的设计。从设计上来说是很简单清晰的,也有很好的统一性,但实际应用过程中,我们依然会更加倾向于特定场景的方案选型。

我们可能只是通过打印日志时候的 Logger 名称来区分并记录 Audit 事件,然后通过日志采集通道汇总分析就可以了,而不用非要实现一个 LogFileBasedAuditEventRepository 或者 ElasticSearchBasedAuditEventRepository 之类的实现,对于 Trace 来说也是同样道理,我们可能直接使用完备的 APM 方案而不是单一或者少量 Trace 事件的记录。

五、总结

Spring Boot Actuator 是 Spring Boot 的一个重要特性,它提供了丰富的端点,可以用于监控和管理应用程序。在本文中,我们介绍了 Actuator 的基本使用方法,包括端点的配置、使用、安全性和扩展。希望本文可以帮助读者更好地使用 Spring Boot Actuator 监控和管理应用程序。

你可能感兴趣的:(Spring,boot,spring,boot,后端,java)