Spring Boot Actuator 指标监控常用Endpoints的介绍

628 阅读7分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第24天,点击查看活动详情

一、简介

干嘛的:

主要运用在微服务架构,所以我建议你先学微服务,否则可能get不到它的用处,只有大型的分布式系统才会用到指标监控... Why? 对于一个大型的几十个、几百个微服务构成的微服务架构系统,在线上时通常会遇到下面一些问题,比如:

  1. 如何知道哪些服务除了问题,如何快速定位? (健康状况)

  2. 如何统一监控各个微服务的性能指标(内存、jvm、并发数、线程池、Http 请求统计)

  3. 如何统一管理各个微服务的日志?(切换线上日志等级,快速搜索日志...)

  4. 如何优雅管理服务下线(正在运行的线程不发生中断)

So: 在这种大型分布式应用的环境下,我们如何能够快速发现问题、快速解决问题, 必须要有监控平台、(链路追踪、日志)

二、SpringBoot Actuator

2-1、介绍:

SpringBoot自带监控功能Actuator,可以帮助实现对程序内部运行情况监控,比如监控状况、Bean加载情况、环境变量、日志信息、线程信息等

2-2、Actuator的搭建

2-2-1、项目的创建

首先还创建一个父项目,然后再父项目下创建一个Module,设置好相关项目名称和包名,最后需要引入spring web

image.png

以及Ops下的spring boot actuator

image.png

然后在module项目的pom.xml中的parent改为父项目的信息,如下

image.png

然后再修改父项目的打包方式改为pom,因为父项目不需要进行打包

image.png

在父项目中将模块添加进去

image.png

2-2-2、子模块的pom

image.png

image.png

2-3、官方的介绍

具体可以看下官网对于Actuator的介绍 docs.spring.io/spring-boot…

2-4、启动服务并访问

访问 http://localhost:8080/actuator/

image.png 可以看到页面列出了四个url,这就是Actuator的Endpoints,通过断点可以监控服务的一些相关情况。(其中health和info为端点)

比如访问health端点,就是查看服务的情况,Up代表上线正常状态,Down就是宕机了

image.png

三、Actuator的端点

常用的端点

image.png

也可以看下官网的所有Endpoints

docs.spring.io/spring-boot…

通过上图可以看到在http端只暴露了health和info两个端点,这就需要通过配置来进行处理,使http端可以暴露所有端点,

3-1、http端暴露所有端点

暴露所有监控信息为HTTP,需要注意的是 "*" 必须放入引号中

management:
  endpoints:
    web:
      exposure:
        include: "*" #设置http访问暴露所有端点

测试

image.png

3-2、设置enpoint是否开启

management:
  endpoints:
    web:
      exposure:
        include: "*" #设置http访问暴露所有端点
    enabled-by-default: false #设置是否启用端点

测试访问

image.png

3-3、设置Actuator访问路径

management:
  endpoints:
    web:
      exposure:
        include: "*" #设置http访问暴露所有端点
      base-path: /jony # 设置访问路径
    enabled-by-default: false #设置是否启用端点

访问测试:

image.png

3-4、Actuator的相关Endpoints

通过上面的配置,就可以暴露出关于http访问的所有端点,如下:

{
    "_links": {
        "self": {
            "href": "http://localhost:8080/jony", 
            "templated": false
        }, 
        "beans": {
            "href": "http://localhost:8080/jony/beans", 
            "templated": false
        }, 
        "caches-cache": {
            "href": "http://localhost:8080/jony/caches/{cache}", 
            "templated": true
        }, 
        "caches": {
            "href": "http://localhost:8080/jony/caches", 
            "templated": false
        }, 
        "health-path": {
            "href": "http://localhost:8080/jony/health/{*path}", 
            "templated": true
        }, 
        "health": {
            "href": "http://localhost:8080/jony/health", 
            "templated": false
        }, 
        "info": {
            "href": "http://localhost:8080/jony/info", 
            "templated": false
        }, 
        "conditions": {
            "href": "http://localhost:8080/jony/conditions", 
            "templated": false
        }, 
        "shutdown": {
            "href": "http://localhost:8080/jony/shutdown", 
            "templated": false
        }, 
        "configprops": {
            "href": "http://localhost:8080/jony/configprops", 
            "templated": false
        }, 
        "env": {
            "href": "http://localhost:8080/jony/env", 
            "templated": false
        }, 
        "env-toMatch": {
            "href": "http://localhost:8080/jony/env/{toMatch}", 
            "templated": true
        }, 
        "loggers": {
            "href": "http://localhost:8080/jony/loggers", 
            "templated": false
        }, 
        "loggers-name": {
            "href": "http://localhost:8080/jony/loggers/{name}", 
            "templated": true
        }, 
        "heapdump": {
            "href": "http://localhost:8080/jony/heapdump", 
            "templated": false
        }, 
        "threaddump": {
            "href": "http://localhost:8080/jony/threaddump", 
            "templated": false
        }, 
        "metrics-requiredMetricName": {
            "href": "http://localhost:8080/jony/metrics/{requiredMetricName}", 
            "templated": true
        }, 
        "metrics": {
            "href": "http://localhost:8080/jony/metrics", 
            "templated": false
        }, 
        "scheduledtasks": {
            "href": "http://localhost:8080/jony/scheduledtasks", 
            "templated": false
        }, 
        "mappings": {
            "href": "http://localhost:8080/jony/mappings", 
            "templated": false
        }
    }
}

那这些端点都是干嘛的呢?下面来看一下。

3-4-1、beans 加载的所有beans

beans是spring相关程序以及我们自己的写的bean都会在这个端点里面,可以看到包括springboot的启动类,也在其中(其中包含了bean的别名,作用域等信息)

image.png

3-4-2、caches 使用的缓存

caches可以看到程序中加载的相关缓存,因为目前程序没有使用任何缓存,所以看不到数据,可以看下官网说明。

image.png

3-4-3、health 服务的监控状态

这个可以看到服务的上下线状态,up或者down,如下:

image.png

那么UP或者DOWN仅仅是服务的启动和关闭才会导致状态变化么,实际上不是的,下面可以通过配置来看一下

management:
  endpoints:
    web:
      exposure:
        include: "*" #设置http访问暴露所有端点
      base-path: /jony # 设置访问路径
    enabled-by-default: true #设置是否启用端点
  endpoint:
    health:
      show-details: always #显示health详细信息

通过show-details: always来设置显示health的详细信息

image.png

通过上图可以看到,配置了show-details之后,health显示的信息就多了。
diskSapce:指硬盘空间,分别是总空间、空闲、线程数,这些事足够使用的,因此状态为true
ping:指服务的和客户端的连接状态,因为现在都在一起所以肯定能ping通,状态即为UP.

3-4-3-1、配置jdbc的health状态

health还可以定制其他一些相关健康信息,如果配置了jdbc,也会显示jdbc的监控状态,如下:

1、首先添加依赖,jdbc驱动和jdbc的场景启动器,只有配置了jdbc的场景启动器,才可以实现健康状态的指标。

<!--mysql驱动-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
<!--配置jdbc场景启动器-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

2、配置application.yml中的数据库连接

spring:
  #数据库连接
  datasource:
    username: root
    password: root
    url: jdbc:mysql://localhost:3306/mybatis
    driver-class-name: com.mysql.cj.jdbc.Driver

3、重启服务,就可以看到数据库的监控指标了

image.png

需要注意的一点,当health里面的所有指标都为UP,总指标才为UP。这样就可以看出UP/DOWN不仅仅是服务的状态,而是多个指标的维度

3-4-4、info

显示配置的相关信息,后面文章进行配置

3-4-5、conditions

显示配置了@Conditionalxxx注解的Bean

3-4-6、configprogs

显示配置了@ConfigurationProperties注解的bean

3-4-7、env

限制相关配置信息,如环境变量、java运行时的一些系统环境变量等,都会加载进去。

3-4-8、logs

查看每个类对应的级别,并且每个类的级别可以进行设置的(后面进行介绍),如果想远程查看日志,需要将日志存储到文件中,可以进行如下配置

image.png

重启之后就可以看到断点下有个logfile的断点,可以方便的查看日志了

3-4-9、heapdump

用于分析运行时jvm的相关信息数据,点击heapdump将文件下载到本地,然后打开jvisualvm,导入heapdump即可查看jvm的相关信息了

3-4-10、threaddump

可以查看线程相关信息

3-4-11、metrics

可以显示相关指标信息数据,比如数据库连接数、jvm相关参数指标、运行cpu相关使用率等。 process.cpu.usage

image.png 比如想看cpu数量,将指标key复制到地址栏metrics后面即可

image.png

访问地址,如下 image.png

3-4-12、mappings

所有相关映射,比如在Controller中设置的映射信息。

3-4-13、shutdown

优雅的关闭引用服务,当有正在请求的线程,可以正常运行。准备运行的线程阻止其运行。当正在运行的线程全部运行完成之后,应用系统进行关闭。

需要注意的是优雅关闭,不能通过get请求来进行关闭,需要使用post请求来进行关闭

image.png

同时需要设置服务的关闭方式(默认是立即关闭-immediate),需要改成优雅关闭方式 server.shutdown=graceful