SpringBoot Actuator的指标监控

发布于 2021-12-04  2.72k 次阅读


一,SpringBoot Actuator的简介和基本使用

一,SpringBoot Actuator的基本概述

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

SpringBoot Actuator的场景启动器依赖:

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

SpringBoot Actuator的版本跟随着SpringBoot的版本变化而变化,如果是1版本的springboot就导入1版本的Actuator,目前有1.x和2.x版本的Actuator

二,SpringBoot Actuator的简单使用

① 导入SpringBoot Actuator场景启动器

② 访问localhost:8080/actuator/**

注:actuator默认只暴露了actuatot和health端口模块的http监控访问,需要访问其他就需要在配置文件中配置

③ 访问localhost:8080/actuator监控

二,Endpoints监控端点

一,Endpoints监控端口信息

SpringBoot Actuator 提供了很多的监控端点,每一个监控端点都监控不同的模块,它还支持自定义端口

注:虽然内置了很多监控端点但默认很多都是不启用的,需要开启才能访问

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

二,Endpoints端点的启用和关闭

开启端口只需要在配置文件中配置即可

对Endpoints的配置以management.endpoint为前缀来进行配置,开启和关闭只需要将对于的enabled设置为true(开启)或false(关闭)

① 开启全部端点:把enabled-by-default设置为true

management:
  endpoints:
    enabled-by-default: true
② 开启部分端点:把对于端口的id的enabled设置为true即可
management:
  endpoint:
    #开启beans监控端口
    beans:
      enabled: true
    #开启info监控端点
    info:
      enabled: true
    #开启mappings监控端点
    mappings:
      enabled: true
#………………

三,Endpoints端点的暴露

Endpoint端点的暴露有两种方式:

  • JMS:提供JMS协议进行暴露,这个协议暴露要查看的话可以通过JDK通过的Jconsole工具进行查看
  • HTTP:可以通过URL进行访问

端口对默认开启支持的协议:

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

Actuator提供配置可以暴露协议的开放:

配置
作用
默认值
management.endpoints.jmx.exposure.exclude
不暴露对应端点的jms的
management.endpoints.jmx.exposure.include
暴露对应端点的jms
*(*为所有端点)
management.endpoints.web.exposure.exclude
不暴露端点的http
management.endpoints.web.exposure.include
暴露端点的http
info, health

例:暴露所有端点的http协议(这样所有的端点监控都可以通过web的url访问)

management:
  endpoints:
    enabled-by-default: true
    web:
      exposure:
        include: '*'

注:*号需要用单引号包括起来不然读取会失败

四,开发中经常使用的几个Endpoints端点

常用的Endpoint主要有三个:

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

一,Health Endpoint

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

  • health返回的结果,结果是一系列健康检查后的一个汇总报告
  • 很多的健康检查默认是已经配置好了,比如:数据库,gcc,redis等
  • 可以很容易的添加健康检查机制

设置health返回的信息为详细信息:

management:
  endpoint:
    health:
      show-details: always #显示详细的health信息

状态:

  • UP:正常
  • DOWN:异常

一个组件的健康与否取决于这个下面的子组件是否全部健康,当子组件全部为up时才叫会是up

二,Metrics Endpoint

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

  • 通过Metrics对接多种监控端点
  • 简化了核心Metrics开发
  • 添加自定义Metrics或者拓展已有Metrics

① Metrics对接多个具体监控的组件

② 通过在当前路径的后面加上具体组件的名称就可以查看改组件的信息

三,Loggers Endpoint

这个端点用于监控系统的各个模块的日志,开启后直接访问即可

二,自定义Endpoint端点

一,自定义Health端点信息

自定义Health依赖与AbstractHealthIndicator父类,通过继承这个父类实现doHealthCheck方法来实现

自定义Health的步骤:

  • 新建一个类并标注@Compent,类名的后缀必须以HealthIndicator结尾,如:myHealthIndicator(系统默认就会把my作为健康检查的名称,但前提是后缀必须为HealthIndicator)
  • 这个类继承AbstractHealthIndicator父类并实现doHealthCheck方法
  • 通过doHealthCheck方法中的Health.Builder对象自定义健康检测信息

注:自定义health健康检测,类名必须以HealthIndicator结尾,前面的则是这个health检测的名称

Health.Builder对象的方法:

  • getStart():获取当前的状态,如:UP,DOWN
  • getDetails():获取当前的详细状态详细
  • withDetail(String key, Object value):设置状态详细信息,K-V类型一次只能设置一个
  • withDetails(Map<String, ?> details:设置状态详细信息,Map一次传多个
  • up():设置状态为UP,正常
  • down():设置状态为DOWM,异常,和up一样底层都是使用了Status.*常量
  • ……

例:自定义做到endoint端点的health信息

① 自定义health

@Component
public class MyHealthIndicator extends AbstractHealthIndicator { 
    
    @Override//实现doHealthCheck方法
    protected void doHealthCheck(Health.Builder builder) throws Exception {
         //通过map保存自定义的信息
        Map<String,Object> map = new HashMap<>();

        if(1==1){
            //设置状态为正常状态
            builder.up();
            map.put("message",1);
        }else {
            //设置状态为异常状态
            builder.down();
            map.put("message",0);
        }

        //将map传入
        builder.withDetails(map);
    }
}

② 查看

二,自定义info端点信息

自定义info端点信息和health不太一个它有两种方式:

  • 通过配置文件自定义
  • 新建配置类实现InfoContributor接口,并重写contribute方法

一,配置文件自定义info

在SpringBoot的配置文件中定义info并给出K-V即可,运行时actuator会进行读取

注:info下的值是可以自定义的,想写什么都可以,没有固定的属性赋值,所以是没有任何提示的

在SpringBoot的项目中的配置文件,通过通过@@调用maven的pom文件中的信息,如:调用maven的版本好@project.version@

如:自定义info信息这个信息有mavanprojectname,mavanprojectversion,appname,appversion等

① 定义配置文件信息

info:
  appName: WQL_SpringBoot
  appVersion: 1.1.1
  mavenProjectName: @project.artifactId@
  mavenProjectVersion: @project.version@
  authorName: WQL
  lllllll:自定义

② 查看

二,通过配置类的方式自定义info

通过配置类的方式指定义info的步骤:

  • 新建一个配置类实现InfoContributor接口(和Health不一样这个对类名没有要求)
  • 通过contribute方法的Info.Builder对象进行配置

Info.Builder对象的方法:

  • withDetail(String key, Object value):自定义详细日志信息
  • withDetails(Map<String, Object> details):自定义详细日志详细
  • getDetails():获取详细日志信息
  • get(String id, Class<T> type):通过K获取日志中的指定信息
  • ……

例:

① 配置类

//假定这是一个业务类
@Service
public class metricswql {

    Counter counter;
    //在构造中传入一个MeterRegistry
    public metricswql(MeterRegistry meterRegistry) {
        //传入一个指标项,name为指标项的名称
        counter = meterRegistry.counter("url调用计数");
    }
    //业务方法
    public void wlq(){
        //调用计算
        counter.increment();
    }
}

② 访问

三,自定义Metrics指标监控

Metrics代表着监控指标,默认spring和java提供很多监控指标如gcc,jvm,cpu,tomcat等,但不同的项目监控的指标是不仅仅局限于此的,通过情况下需要进行自定义监控指标

在类的构造方法中传入一个MeterRegistry的指标注册中心对象,通过在具体的业务方法向这个对象中注入指标即可

MeterRegistry指标注册中心方法,通过这个对象注册指标性,里面的每一个方法的name都是指标项的名称

例:

① 类

//假定这是一个业务类
@Service
public class metricswql {

    Counter counter;
    //在构造中传入一个MeterRegistry
    public metricswql(MeterRegistry meterRegistry) {
        //传入一个指标项,name为指标项的名称
        counter = meterRegistry.counter("url调用计数");
    }
    //业务方法
    public void wlq(){
        //调用计算
        counter.increment();
    }
}

② 访问

四,自定义Endpoint端点

默认SpringBoot Actuator提供很多的默认Dedpoint端点,如info,health,metrics,cache等,在生产环境中也远远不够,Actuator也支持指定义Endpoint端点

指定义Endpoint端点依赖三注解:

  • @Endpoint():标识当前类被端点类,并指定端点的名称
  • @ReadOperation:读信息,但访问端点时就提供这个方法返回数据
  • @WriteOperation:写信息,这个方法可以操作端点,提供Jconsole工具可以直接操作

@Endpoint的参数:

  • id:标注当前端点的名称

例:

① 类

@Component
@Endpoint
public class endpoint_wql {

@ReadOperation
public Map get(){

Map map =new HashMap();
map.put("class","com.wql.llllread");
return map;
}

@WriteOperation
public void set(){
System.out.println("操作端点");
}
}

② 访问

③ Jconsole提供JMS访问


路漫漫其修远兮,吾将上下而求索