SpringBoot | 第二十七章:监控管理之Actuator使用

前言

随着我们服务越来越多,部署的环境也越来越繁多时,由于各服务都部署在不同的机器上,每当出现问题或者异常时,想快速进行问题的定位就变的麻烦了。所以,本章节开始,开始讲解SpringBoot的监控相关知识点。本章节就先来说一说,其自带的Actuator功能。

一点知识

Spring Boot Actuatorspring boot项目一个监控模块,提供了很多原生的端点,包含了对应用系统的自省和监控的集成功能,可以查看应用配置的详细信息,比如应用程序上下文里全部的Bean健康指标环境变量各类重要度量指标等等,这些都是使用可HTTP进行请求访问。通过这些监控信息,我们就能随时了解应用的运行情况了。

官方定义

Actuator实践

特别说明:
最近在编写SpringCloud的教程,使用的是SpringBoot2.x的版本,其和1.x版本是有区别的,需要额外开启端点,默认只开启了info、health两个端点,其他的需要额外去配置的。本教程还是沿用Spring Boot 1.5.15版本来示例。关于2.x的后续再来更新吧,不然会乱了。。

原生端点

原生端点是在应用程序里提供众多 Web 接口,通过它们了解应用程序运行时的内部状况。原生端点又可以分成三类:

  • 应用配置类:可以查看应用在运行期的静态信息:例如自动配置信息、加载的springbean信息、yml文件配置信息、环境信息、请求映射信息;
  • 度量指标类:主要是运行期的动态信息,例如堆栈、请求连、一些健康指标、metrics信息等;
  • 操作控制类:主要是指shutdown,用户可以发送一个请求将应用的监控功能关闭。

官网可以看出,原生的端点很多

以下列举内置的端点相关说明:

ID 描述 是否需要鉴权
actuator 为其他端点提供“发现页面”。要求Spring HATEOAS在classpath路径上。 需要
auditevents 陈列当前应用程序的审计事件信息。 需要
autoconfig 展示自动配置信息并且显示所有自动配置候选人以及他们“被不被”应用的原因。 需要
beans 显示应用程序中所有Spring bean的完整列表。 需要
configprops 显示所有配置信息。 需要
dump dump所有线程。 需要
env 陈列所有的环境变量。 需要
flyway Shows any Flyway database migrations that have been applied. 需要
health 显示应用程序运行状况信息 不需要
info 显示应用信息。 不需要
loggers 显示和修改应用程序中的loggers配置。 需要
liquibase 显示已经应用的任何Liquibase数据库迁移。 需要
metrics 显示当前应用程序的“指标”信息。 需要
mappings 显示所有@RequestMapping的url整理列表。 需要
shutdown 关闭应用(默认情况下不启用)。 需要
trace 显示跟踪信息(默认最后100个HTTP请求)。 需要

从官网文档也可以看出,可通过配置文件,修改某端点是否开启,是否需要鉴权访问等

Customizing endpoints

如:

# 这里的id 是指访问的url路径
endpoints.beans.id=springbeans
# 关闭鉴权
endpoints.beans.sensitive=false
# 开启shutdown
endpoints.shutdown.enabled=true

至于以上每个端点实际输出的信息,大家可以看看大佬们的文章或者访问/docs端点里面也有的,常用的命令输出都有示例,这里就不贴了。不然文章看起来就冗长了,哈哈~

命令详解:http://www.ityouknow.com/springboot/2018/02/06/spring-boot-actuator.html

访问/docs端点(如何使用下文有说明):

docs端点访问

上手实践

0.加入POM依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!-- 加入doc文档 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-actuator-docs</artifactId>
        </dependency>
        <!-- 开启安全认证 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>        

加入spring-boot-actuator-docs可查看相关文档,如

docs

1.配置文件(可无),具体的可根据实际业务来配置。

# actuator的访问路径
management.context-path=/monitor
# 管理的端口调整成1234
management.port=1234

# 有些需要身份认证才能访问,可直接关闭鉴权 
#management.security.enabled=true

# 开启关闭应用端点
endpoints.shutdown.enabled=true

# 安全验证的账号密码
security.user.name=oKong
security.user.password=123456

2.编写启动类(普通的启动类),启动后,访问:http://127.0.0.1:1234/monitor/ (因为我们重新指定了访问端口的上下文为monitor了)

monitor首页

访问/monitor/beans,是需要授权的,可以看见需要输入用户名和密码了:

身份鉴权

输入配置文件里面配置的用户名和密码,就可以正常访问了:
beans

自定义端点

虽然本身SpringBoot已经自带了很多端点,大部分情况下是够用了。但对于某些特殊需要时,还是需要自定义端点来满足的。接下来就简单讲解下自定义端点的创建。

自定义健康端点

健康信息可以用来检查应用的运行状态。所以经常被监控软件用来提醒生产系统是否停止,数据库是否正常,或者redis是否启动等等,而且一般上健康端点的信息都是比较敏感的,应加入身份鉴权。

自动配置的健康端点有:

Auto-configured HealthIndicators

简单说明下:

名称 描述
CassandraHealthIndicator 检查 Cassandra 数据库是否启动。
DiskSpaceHealthIndicator 检查磁盘空间不足。
DataSourceHealthIndicator 检查是否可以获得连接 DataSource
ElasticsearchHealthIndicator 检查 Elasticsearch 集群是否启动。
InfluxDbHealthIndicator 检查 InfluxDB 服务器是否启动。
JmsHealthIndicator 检查 JMS 代理是否启动。
MailHealthIndicator 检查邮件服务器是否启动。
MongoHealthIndicator 检查 Mongo 数据库是否启动。
Neo4jHealthIndicator 检查 Neo4j 服务器是否启动。
RabbitHealthIndicator 检查 Rabbit 服务器是否启动。
RedisHealthIndicator 检查 Redis 服务器是否启动。
SolrHealthIndicator 检查 Solr 服务器是否已启动。

这些端点,在spring-boot-starter-xxx包被依赖导入后,利用@Conditional等注解进行自动加载的,具体可以看看org.springframework.boot.actuate.autoconfigure包下的自动加载类。

HealthIndicatorAutoConfiguration

比如,上图中的,当我们加入spring-boot-starter-data-redis依赖后,RedisHealthIndicator就会自动被装载了,这个时候我们访问下:http://127.0.0.1:1234/monitor/health ,可以看见redis节点有显示了,状态是关闭

health

其他的都是类似的,具体可以看看源码。接下来,我们通过继承AbstractHealthIndicator来自定义一个监控端点(当然也可以实现 HealthIndicator接口的)

CustomHealthIndicator.java

/**
 * 自定义健康端点 继承AbstractHealthIndicator类 也可以实现 HealthIndicator接口的
 * @author oKong
 *
 */
//这里也可以使用 类似@ConditionalOnMissingBean写法自动加载的
//这里的name 就是默认健康节点的名称了
@Component("oKong")
public class CustomHealthIndicator extends AbstractHealthIndicator{

    @Override
    protected void doHealthCheck(Builder builder) throws Exception {
        //设置健康信息
        builder.withDetail("code", "0123")
               .withDetail("version", "v0.1")
               //有其他信息可继续添加的
               .up().build();
    }

}

最后效果:

自定义健康端点

{
    "status": "DOWN",
    "oKong": {
        "status": "UP",
        "code": "0123",
        "version": "v0.1"
    },
    "diskSpace": {
        "status": "UP",
        "total": 120032587776,
        "free": 8374538240,
        "threshold": 10485760
    },
    "redis": {
        "status": "DOWN",
        "error": "org.springframework.data.redis.RedisConnectionFailureException: Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool"
    }
}

这方面用的不多,至于其他详细信息,可以查看官网:Security with HealthIndicators

Writing custom HealthIndicators

自定义端点

出来在原来内置的端点进行添加,访问的路径还是内置的路径,我们还能通过完全自定义一个端点来实现我们的业务需求的。

首先,我们来看看健康端点对应的类org.springframework.boot.actuate.endpoint.HealthEndpoint,其是继承了AbstractEndpoint<T>来实现的。通过IDE我们也能看到,大部分的端点都是继承此抽象类来完成的。

AbstractEndpoint继承类

所以,我们也通过继承此类来实现自定义端点。
CustomEndPoint.java

/**
 * 自定义端点
 * @author oKong
 *
 */
@Component
@ConfigurationProperties(prefix = "endpoints.oKong")
public class CustomEndPoint extends AbstractEndpoint<Map<String,Object>>{

    public CustomEndPoint() {
        //设置ID 即访问路径 :/oKong
        super("oKong");    
    }

    /**
     * 返回信息
     */
    @Override
    public Map<String, Object> invoke() {
         Map<String, Object> result = new HashMap<>();
         result.put("author", "oKong");
         result.put("chapter", "chapter27");
         result.put("mp", "lqdevOps");
         return result;
    }

}

访问oKong

加入了@ConfigurationProperties后可在配置文件中,设置是否开启等等。当然也可以加入自定义的参数了,这里就默认了,没有添加额外的参数。

参考资料

  1. https://docs.spring.io/spring-boot/docs/1.5.15.RELEASE/reference/htmlsingle/#production-ready

  2. https://www.jianshu.com/p/af9738634a21

总结

本注解主要介绍了一些原生端点和自定义端点的相关实践。对于一般的信息,使用使用这些原生的端点就能基本满足了,但由于返回的是json串,不够明了。下一章节就介绍下,利用Spring Boot Admin进行可视化的监控,比如有图表信息、查看日志输出等等,通过界面来进行展现。

最后

目前互联网上很多大佬都有SpringBoot系列教程,如有雷同,请多多包涵了。原创不易,码字不易,还希望大家多多支持。若文中有所错误之处,还望提出,谢谢。

老生常谈

  • 个人QQ:499452441
  • 微信公众号:lqdevOps

公众号

个人博客:http://blog.lqdev.cn

完整示例:https://github.com/xie19900123/spring-boot-learning/tree/master/chapter-27

原文地址:http://blog.lqdev.cn/2018/09/11/springboot/chapter-twenty-seven/