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

前言

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

一点知识

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

官方定义

Actuator实践

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

原生端点

原生端点是在应用程序里提供众多 Web 接口,经过它们了解应用程序运行时的内部情况。原生端点又能够分红三类:github

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

官网能够看出,原生的端点不少redis

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

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

如:json

# 这里的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.htmlspringboot

访问/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/

相关文章
相关标签/搜索