SpringBoot 从入门到光头 第八章 指标监控


SpringBoot 从入门到光头 —— 第八章 指标监控


1. SpringBoot Actuator

1.1. 简介

未来每一个微服务在云上部署以后,我们都需要对其进行监控、追踪、审计、控制等。SpringBoot 就抽取了 Actuator 场景,使得我们每个微服务快速引用即可获得生产级别的应用监控、审计等功能。

Maven 依赖坐标如下:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

SpringBootActuatorDependency

1.2. 1.x与 2.x的不同

SpringBootActuatorVersion

1.3. 如何使用

  • 引入场景

  • 访问 http://ip:port/actuator/**

  • 暴露所有监控信息为 HTTP

    application.yaml

    # management is the configuration of all actuators
    management:
      endpoints:
        enabled-by-default: true  # All monitoring endpoints are enabled by default
        web:
          exposure:
            include: '*'  # Expose all endpoints as web
    
  • 测试

    测试路径:http://localhost:8080/actuator/endpointName/detailPath

    例如:

    http://localhost:8080/actuator/beans
    http://localhost:8080/actuator/configprops
    http://localhost:8080/actuator/metrics
    http://localhost:8080/actuator/metrics/jvm.gc.pause

    ……

1.4. 可视化

项目地址:https://github.com/codecentric/spring-boot-admin

2. Actuator Endpoint

2.1. 最常使用端点

ID 描述
auditevents 暴露当前应用程序的审核事件信息。需要一个 AuditEventRepository 组件
beans 显示应用程序中所有 SpringBean 的完整列表
caches 暴露可用的缓存
conditions 显示自动配置的所有条件信息,包括匹配或不匹配的原因
configprops 显示所有 @ConfigurationProperties
env 暴露 Spring 的属性 ConfigurableEnvironment
flyway 显示已应用的所有 Flyway 数据库迁移。 需要一个或多个 Flyway 组件
health 显示应用程序运行状况信息
httptrace 显示 HTTP 跟踪信息(默认情况下,最近 100 个 HTTP 请求—响应),需要一个 HttpTraceRepository 组件
info 显示应用程序信息
integrationgraph 显示 Spring integrationgraph ,需要依赖 spring-integration-core
loggers 显示和修改应用程序中日志的配置
liquibase 显示已应用的所有 Liquibase 数据库迁移。需要一个或多个 Liquibase 组件
metrics 显示当前应用程序的“指标”信息
mappings 显示所有 @RequestMapping 路径列表
scheduledtasks 显示应用程序中的计划任务
sessions 允许从 Spring Session 支持的会话存储中检索和删除用户会话,需要使用 Spring Session 的基于 Servlet 的 Web 应用程序
shutdown 使应用程序正常关闭,默认禁用
startup 显示由 ApplicationStartup 收集的启动步骤数据。需要使用 SpringApplication 进行配置 BufferingApplicationStartup
threaddump 执行线程转储

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

ID 描述
heapdump 返回 hprof 堆转储文件
jolokia 通过 HTTP 暴露 JMX bean(需要引入 Jolokia,不适用于 WebFlux),需要引入依赖 jolokia-core
logfile 返回日志文件的内容(如果已设置 logging.file.namelogging.file.path 属性)。支持使用 HTTP Range 标头来检索部分日志文件的内容
prometheus 以 Prometheus 服务器可以抓取的格式公开指标。需要依赖 micrometer-registry-prometheus

最常用的 Endpoint:

  • Health监控状况
  • Metrics运行时指标
  • Loggers日志记录

2.2. Health Endpoint

健康检查端点,我们一般用于在云平台,平台会定时的检查应用的健康状况,我们就需要 Health Endpoint 可以为平台返回当前应用的一系列组件健康状况的集合

重点:

  • Health Endpoint 返回的结果,应该是一系列健康检查后的一个汇总报告
  • 很多的健康检查默认已经自动配置好了,比如:数据库、Redis 等
  • 可以很容易的添加自定义的健康检查机制

HelpEndpoint

2.3. Metrics Endpoint

提供详细的、层级的、空间指标信息,这些信息可以被 Pull(主动推送)或者 Push(被动获取)方式得到

  • 通过 Metrics 对接多种监控系统
  • 简化核心 Metrics 开发
  • 添加自定义 Metrics 或者扩展已有 Metrics

MetricsEndpoint

2.4. 管理 Endpoints

2.4.1. 开启与禁用 Endpoints

  • 默认所有的 Endpoint 除了 shutdown 都是开启的。

  • 需要开启或者禁用某个 Endpoint,配置模式为 management.endpoint.<endpointName>enabled = true

    management:
      endpoint:
        beans:
          enabled: true
    
  • 或者禁用所有的 Endpoint 然后手动开启指定的 Endpoint

    management:
      endpoints:
        enabled-by-default: false
      endpoint:
        beans:
          enabled: true
        health:
          enabled: true
    

2.4.2. 暴露 Endpoints

支持的暴露方式:

  • HTTP: 默认只暴露 healthinfo Endpoint
  • JMX: 默认暴露所有 Endpoint
  • 除了 healthinfo,剩下的 Endpoint 都应该进行保护访问,如果引入SpringSecurity,则会默认配置安全访问规则
ID JMX Web
auditevents Yes No
beans Yes No
caches Yes No
conditions Yes No
configprops Yes No
env Yes No
flyway Yes No
health Yes Yes
heapdump N/A No
httptrace Yes No
info Yes Yes
integrationgraph Yes No
jolokia N/A No
logfile N/A No
loggers Yes No
liquibase Yes No
metrics Yes No
mappings Yes No
prometheus N/A No
scheduledtasks Yes No
sessions Yes No
shutdown Yes No
startup Yes No
threaddump Yes No

3. 定制 Endpoint

3.1. 定制 Health 信息

使用示例:

import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.stereotype.Component;

@Component
public class MyHealthIndicator implements HealthIndicator &#123;
    @Override
    public Health health() &#123;
        int errorCode = check(); // perform some specific health check
        if (errorCode != 0) &#123;
            return Health.down().withDetail("Error Code", errorCode).build();
        &#125;
        return Health.up().build();
    &#125;
&#125;

// 构建Health
Health build = Health.down()
                .withDetail("msg", "error service")
                .withDetail("code", "500")
                .withException(new RuntimeException())
                .build();

示例代码:

com.gregperlinli.adminserver.actuator.health.MyComHealthIndicator

/**
 * @author gregPerlinLi
 * @since 2021-11-22
 */
@Component
public class MyComHealthIndicator extends AbstractHealthIndicator &#123;
    /**
     * Real inspection method
     *
     * @param builder
     * @throws Exception
     */
    @Override
    protected void doHealthCheck(Health.Builder builder) throws Exception &#123;
        Map<String, Object> map = new HashMap<>(1000);
        // Check completed
        if ( 1 == 1 ) &#123;
            // Health
            builder.status(Status.UP);
            map.put("count", 1);
            map.put("ms", 100);
        &#125; else &#123;
            // Unhealthy
            builder.status(Status.DOWN);
            map.put("error", "Connection time out!");
            map.put("ms", 3000);
        &#125;
        builder.withDetail("code", 100)
                .withDetails(map);
    &#125;
&#125;

application.yaml

management:
  # Specific configuration to an endpoint: endpoint.endpointName
  endpoint:
    health:
      show-details: always  # Details are always displayed, and the status information of each module can be displayed

3.2. 定制info信息

常用两种方式编写

3.2.1. 编写配置文件

application.yaml

info:
  appName: boot-admin
  appVersion: 1.0.0
  mavenProjectName: @project.artifactId@  # Use @@ to get Maven's POM file value
  mavenProjectVersion: @project.version@

3.2.2. 编写 InfoContributor

com.gregperlinli.adminserver.acutuator.info.AppInfo

/**
 * @author gregPerlinLi
 * @since 2021-11-22
 */
@Component
public class AppInfo implements InfoContributor &#123;

    @Override
    public void contribute(Info.Builder builder) &#123;
        builder.withDetail("msg", "Hello!")
                .withDetail("hello", "world")
                .withDetails(Collections.singletonMap("123", "456"));
    &#125;
&#125;

http://localhost:8080/actuator/info 会输出以上方式返回的所有 Info 信息

3.3. 定制 Metrics 信息

3.3.1. SpringBoot 支持自动适配的 Metrics

  • JVM metrics, report utilization of:
    • Various memory and buffer pools
    • Statistics related to garbage collection
    • Threads utilization
    • Number of classes loaded/unloaded
  • CPU metrics
  • File descriptor metrics
  • Kafka consumer and producer metrics
  • Log4j2 metrics: record the number of events logged to Log4j2 at each level
  • Logback metrics: record the number of events logged to Logback at each level
  • Uptime metrics: report a gauge for uptime and a fixed gauge representing the application’s absolute start time
  • Tomcat metrics (server.tomcat.mbeanregistry.enabled must be set to true for all Tomcat metrics to be registered)
  • Spring Integration metrics

3.3.2. 添加定制 Metrics

使用示例:

class MyService&#123;
    Counter counter;
    public MyService(MeterRegistry meterRegistry)&#123;
         counter = meterRegistry.counter("myservice.method.running.counter");
    &#125;
    public void hello() &#123;
        counter.increment();
    &#125;
&#125;

//也可以使用下面的方式
@Bean
MeterBinder queueSize(Queue queue) &#123;
    return (registry) -> Gauge.builder("queueSize", queue::size).register(registry);
&#125;

3.4. 定制 Endpoint

示例代码:

com.gregperlinli.adminserver.acutuator.endpoint.MyServiceEndpoint

/**
 * @author gregPerlinLi
 * @since 2021-11-22
 */
@Component
@Endpoint(id = "myService")
public class MyServiceEndpoint &#123;
    @ReadOperation
    public Map getDockerInfo() &#123;
        return Collections.singletonMap("dockerInfo", "docker started...");
    &#125;
    @WriteOperation
    public void stopDocker() &#123;
        System.out.println("Docker stopped...");
    &#125;
&#125;

场景:开发 ReadinessEndpoint 来管理程序是否就绪,或者 LivenessEndpoint 来管理程序是否存活;

当然,这个也可以直接参照以下链接

https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-features.html#production-ready-kubernetes-probes



文章作者: gregPerlinLi
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 gregPerlinLi !
  目录