文档章节

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

oKong
 oKong
发布于 09/11 09:17
字数 2361
阅读 565
收藏 17

前言

随着我们服务越来越多,部署的环境也越来越繁多时,由于各服务都部署在不同的机器上,每当出现问题或者异常时,想快速进行问题的定位就变的麻烦了。所以,本章节开始,开始讲解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显示所有配置信息。需要
dumpdump所有线程。需要
env陈列所有的环境变量。需要
flywayShows 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/

© 著作权归作者所有

共有 人打赏支持
oKong
粉丝 557
博文 60
码字总数 144281
作品 0
福州
高级程序员
私信 提问
恒宇少年/spring-boot-chapter

简书整套文档以及源码解析 专题 专题名称 专题描述 001 Spring Boot 核心技术 讲解SpringBoot一些企业级层面的核心组件 002 Spring Cloud 核心技术 对Spring Cloud核心技术全面讲解 003 Quer...

恒宇少年
04/19
0
0
学习 Spring Boot 知识看这一篇就够了

从2016年因为工作原因开始研究 Spring Boot ,先后写了很多关于 Spring Boot 的文章,发表在技术社区、我的博客和我的公号内。粗略的统计了一下总共的文章加起来大概有六十多篇了,其中一部分...

ityouknow
05/28
0
0
【SpringBoot专题】监控健康状况

前言 《【SpringBoot专题】快速体验》 《【SpringBoot专题】多环境配置及swagger》 《【SpringBoot专题】Java平台下日志的那些事》 《【SpringBoot专题】统一异常处理和统一数据返回》 想一想...

张丰哲
09/24
0
0
《Spring Boot 实战:从0到1》第2章 快速开始Hello World

第2章 快速开始Hello World 大约20年前,程序员们使用“企业级Java Bean”(EJB)开发企业应用,需要配置复杂的XML。在二十世纪初期,新兴Java技术——Spring,横空出世。使用极简XML和POJO(...

程序员诗人
2017/08/01
0
0
为springboot项目添加springboot-admin监控

我们知道spring-boot-actuator暴露了大量统计和监控信息的端点,spring-boot-admin 就是为此提供的监控项目。 先来看看大概会提供什么样的功能 从图中可以看出,主要内容都是由spring boot a...

ryan-miao
06/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

分布式锁的实现

redis实现分布式锁 方法1:普通实现方案 实现方式: 使用指令: set key 随机值 ex 5 nx.意思是当key不存在的时候设置key. 如果key存在返回OK,否则返回nil. 实现过程: 1.执行命令set key true ...

grace_233
19分钟前
0
0
解决CKEditor 4 富文本编辑器在图片组件无法显示[上传]选项卡的相关问题

关于解决CKEditor 4 富文本编辑器在图片组件无法显示[上传]选项卡的相关问题。 本文可能会对以下现象得以解决: 图片上传组件,没有 [上传] 选项卡。 资源无法加载 [imgupload] ( Uncaught E...

Eller
22分钟前
0
0
限制php解析、user_agent、php相关配置

11月20日任务 11.28 限定某个目录禁止解析php 11.29 限制user_agent 11.30/11.31 php相关配置 11.28、限定某个目录禁止解析php 核心配置文件内容 <Directory /data/wwwroot/www.123.com/upl...

zgxlinux
27分钟前
0
0
博客园首页新随笔联系订阅管理 随笔

注解Annotation实现原理与自定义注解例子 什么是注解? 对于很多初次接触的开发者来说应该都有这个疑问?Annontation是Java5开始引入的新特征,中文名称叫注解。它提供了一种安全的类似注释的...

onedotdot
45分钟前
3
1
Spring boot + redis 用RedisTemlate实现简单的String key value 操作

springboot集成redis, 简单的key, value缓存操作. 1. application-local.properties # redis on local#spring.redis.port=6379#spring.redis.host=localhost#spring.redis.password=......

园领T
57分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部