随着我们服务越来越多,部署的环境也越来越繁多时,由于各服务都部署在不同的机器上,每当出现问题或者异常时,想快速进行问题的定位就变的麻烦了。所以,本章节开始,开始讲解 SpringBoot
的监控相关知识点。本章节就先来说一说,其自带的 Actuator
功能。
Spring Boot Actuator
是 spring boot
项目一个监控模块,提供了很多原生的端点,包含了对应用系统的自省和监控的集成功能,可以查看应用配置的详细信息,比如 应用程序上下文里全部的Bean 、 健康指标 、 环境变量 及 各类重要度量指标 等等,这些都是使用可 HTTP
进行请求访问。通过这些监控信息,我们就能随时了解应用的运行情况了。
特别说明: 最近在编写 SpringCloud
的教程,使用的是 SpringBoot2.x
的版本,其和 1.x
版本是有区别的,需要额外开启端点,默认只开启了 info、health
两个端点,其他的需要额外去配置的。本教程还是沿用 Spring Boot 1.5.15
版本来示例。关于 2.x
的后续再来更新吧,不然会乱了。。
原生端点是在应用程序里提供众多 Web 接口,通过它们了解应用程序运行时的内部状况。原生端点又可以分成三类:
官网可以看出,原生的端点很多
以下列举内置的端点相关说明:
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请求)。 | 需要 |
从官网文档也可以看出,可通过配置文件,修改某端点是否开启,是否需要鉴权访问等
如:
# 这里的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
端点(如何使用下文有说明):
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
可查看相关文档,如
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/beans
,是需要授权的,可以看见需要输入用户名和密码了:
输入配置文件里面配置的用户名和密码,就可以正常访问了:
虽然本身 SpringBoot
已经自带了很多端点,大部分情况下是够用了。但对于某些特殊需要时,还是需要自定义端点来满足的。接下来就简单讲解下自定义端点的创建。
健康信息可以用来检查应用的运行状态。所以经常被监控软件用来提醒生产系统是否停止,数据库是否正常,或者redis是否启动等等,而且一般上健康端点的信息都是比较敏感的,应加入身份鉴权。
自动配置的健康端点有:
简单说明下:
名称 | 描述 |
---|---|
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
包下的自动加载类。
比如,上图中的,当我们加入 spring-boot-starter-data-redis
依赖后, RedisHealthIndicator
就会自动被装载了,这个时候我们访问下: http://127.0.0.1:1234/monitor/health ,可以看见 redis
节点有显示了,状态是关闭
其他的都是类似的,具体可以看看源码。接下来,我们通过继承 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
出来在原来内置的端点进行添加,访问的路径还是内置的路径,我们还能通过完全自定义一个端点来实现我们的业务需求的。
首先,我们来看看 健康端点
对应的类 org.springframework.boot.actuate.endpoint.HealthEndpoint
,其是继承了 AbstractEndpoint<T>
来实现的。通过IDE我们也能看到,大部分的端点都是继承此抽象类来完成的。
所以,我们也通过继承此类来实现自定义端点。 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; } }
加入了 @ConfigurationProperties
后可在配置文件中,设置是否开启等等。当然也可以加入自定义的参数了,这里就默认了,没有添加额外的参数。
https://docs.spring.io/spring-boot/docs/1.5.15.RELEASE/reference/htmlsingle/#production-ready
https://www.jianshu.com/p/af9738634a21
本注解主要介绍了一些原生端点和自定义端点的相关实践。对于一般的信息,使用使用这些原生的端点就能基本满足了,但由于返回的是json串,不够明了。下一章节就介绍下,利用 Spring Boot Admin
进行可视化的监控,比如有图表信息、查看日志输出等等,通过界面来进行展现。
目前互联网上很多大佬都有 SpringBoot
系列教程,如有雷同,请多多包涵了。 原创不易,码字不易 ,还希望大家多多支持。若文中有所错误之处,还望提出,谢谢。
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/