转载

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

前言

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

一点知识

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

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

Actuator实践

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

原生端点

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

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

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

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

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

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请求)。 需要

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

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

如:

# 这里的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 端点(如何使用下文有说明):

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

上手实践

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 可查看相关文档,如

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

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了)

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

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

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

输入配置文件里面配置的用户名和密码,就可以正常访问了: 原 荐 SpringBoot | 第二十七章:监控管理之Actuator使用

自定义端点

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

自定义健康端点

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

自动配置的健康端点有:

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

简单说明下:

名称 描述
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 包下的自动加载类。

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

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

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

其他的都是类似的,具体可以看看源码。接下来,我们通过继承 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();
    }

}

最后效果:

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

{
    "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

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

自定义端点

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

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

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

所以,我们也通过继承此类来实现自定义端点。 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;
    }

}

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

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

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

参考资料

  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 系列教程,如有雷同,请多多包涵了。 原创不易,码字不易 ,还希望大家多多支持。若文中有所错误之处,还望提出,谢谢。

老生常谈

499452441
lqdevOps

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

个人博客: 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/

原文  https://my.oschina.net/xiedeshou/blog/2048636
正文到此结束
Loading...