标签:gem 多个 运行时间 pom point string loaded 简化 内容
在微服务架构中,我们将原本庞大的单体系统拆分为多个提供不同服务的应用,虽然,各个应用的内部逻辑因分解而简化,但由于部署的应用数量成倍增长,使得系统的维护复杂度大大提升,为了让运维系统能够获取各个为服务应用的相关指标以及实现一些常规操作控制,我们需要开发一套专门用于植入各个微服务的接口供监控系统采集信息,而这些接口往往有很大一部分指标都是类似的,Spring Boot 作为微服务框架时,除了强大的快速开发能力之外,还提供了一个特殊的模块 spring-boot-starter-actuator ,该模块能够自动为 Spring Boot 构建的应用提供一系列用于监控的端点。
引入Actuator
在现有的 Spring Boot 应用中引入该模块非常简单,只需要在 pom.xml 中增加 spring-boot-starter-actuator 依赖即可,代码如下:
????????<dependency>
????????????<groupId>org.springframework.boot</groupId>
????????????<artifactId>spring-boot-starter-actuator</artifactId>
????????</dependency>
增加该依赖之后,重新启动应用,此时,我们可以在控制台中看到如下图所示的输出:
上图显示了一批端点定义,这些端点是由 spring-boot-starter-actuator 模块根据应用依赖和配置自动创建出来的监控和管理端点,通过这些端点我们可以实时获取应用的各项监控指标
原生端点
根据端点的作用,可以将原生端点分为以下三大类:
应用配置类
由于Spring Boot 为了改善传统Spring应用繁杂的配置,采用了包扫描和自动化配置的机制来加载原本集中与XML文件中的各项内容,应用配置类可以帮助我们轻松获取一系列关于Spring应用配置内容的详细报告,比如自动化配置的报告、Bean 创建报告、环境属性报告等。
"environmentMvcEndpoint": {
????????????????"prefix": "endpoints.env",
????????????????"properties": {
????????????????????????"path": "/env"
????????????????}
????????}
可以看到 /env 端点的属性配置为 endpoints.env.path 可以设置端点访问路径等。
??"profiles": [ ],
????????"server.ports": {
????????????????"local.server.port": 8080
????????},
????????"servletContextInitParams": { },
????"{[/hello/get]}": {
????????????????"bean": "requestMappingHandlerMapping",
????????????????"method": "public java.lang.String com.example.actuator.HelloController.get()"
????????},
????????"{[/error]}": {
????????????????"bean": "requestMappingHandlerMapping",
????????????????"method": "public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)"
????????},
info.app.name=spring-boot-hello
info.app.version=1.0
{
????????"app": {
????????????????"name": "spring-boot-hello",
????????????????"version": "1.0"
????????}
}
度量指标类
度量指标类端点提供的报告内容是动态变化的,这些端点提供了一弄程序在运行过程中的一些快照信息,比如内存使用情况、HTTP请求统计、外部资源指标等。
????????????{
???????????? "mem": 230900,
????????"mem.free": 139265,
????????"processors": 4,
????????"instance.uptime": 88119,
????????"uptime": 102055,
????????"systemload.average": -1,
????????"heap.committed": 191488,
????????"heap.init": 129024,
????????"heap.used": 52222,
????????"heap": 1829888,
????????"nonheap.committed": 40192,
????????"nonheap.init": 2496,
????????"nonheap.used": 39414,
????????"nonheap": 0,
????????"threads.peak": 25,
????????"threads.daemon": 21,
????????"threads.totalStarted": 28,
????????"threads": 23,
????????"classes": 5728,
????????"classes.loaded": 5728,
????????"classes.unloaded": 0,
????????"gc.ps_scavenge.count": 9,
????????"gc.ps_scavenge.time": 145,
????????"gc.ps_marksweep.count": 1,
????????"gc.ps_marksweep.time": 81,
????????"httpsessions.max": -1,
????????"httpsessions.active": 0,
"gauge.response.hello.get": 17,
????????"gauge.response.star-star": 116,
"counter.status.200.hello.get": 1
????????"counter.status.404.star-star": 1
}
对于 gauge.* 和 counter.*的统计,这里有一个特殊的内容请求 star-star,他代表了对静态资源的访问,这两类度量指标非常有用,我们不仅可以使用默认的统计指标,还可以在程序中增加自定义统计值,只需要通过注入 org.springframework.boot.actuate.metrics.CounterService 和 org.springframework.boot.actuate.mertics.GaugeService 来实现自定义的统计指标信息,示例代码如下:
@RestController
@RequestMapping ("/hello")
public class HelloController {
? ?
????????@Autowired
????????private CounterService counterService;
? ?
????????@RequestMapping ("getCount")
????????public String getCount() {
????????????????counterService.increment("hello.get.count");
????????????????return "ok";
????????}
}
metrics 可以提供应用运行状态的完整度量指标报告,这项功能非常实用,但是对于监控系统中的各项监控功能,其监控内容、数据收集频率都有所不同,如果每次都通过全量获取报告的方式来收集,颗粒度有些粗,我们还可以通过 /metrics/{name} 的接口来更细粒度获取度量信息,其中 {name} 中可以使用 * 作为通配符来获取匹配的度量信息,示例如下:
请求:
http://localhost:8080/metrics/counter.*
返回:
{
????????"counter.hello.get.count": 3,
????????"counter.status.200.metrics": 2,
????????"counter.status.200.hello.getCount": 3
}
检测器 | 功能 |
DiskSpaceHealthIndicator | 低磁盘空间检测 |
DataSourceHealthIndicator | 检测 DataSource 的连接是否可用 |
MongoHealthIndicator | 检测 Mongo 数据库是否可用 |
RabbitHealthIndicator | 检测 Rabbit 服务器是否可用 |
RedisHealthIndicator | 检测 Redis 服务器是否可用 |
如果需要实现自定义的检测器,需要实现 org.springframework.boot.actuate.health.HealthIndicator接口,示例代码如下:
@Component
public class CustomHealthIndicator implements HealthIndicator {
????????@Override
????????public Health health() {
????????????????int errorCode = check();
????????????????if (errorCode != 0) {
????????????????????????return Health.down().withDetail("error code", errorCode).build();
????????????????}
? ?
????????????????return Health.up().build();
????????}
? ?
????????private int check() {
????????????????// 对监控对象的检测操作
????????????????return -9;
????????}
}
请求返回(HTTP 503):
{
????????"status": "DOWN",
????????"custom": {
????????????????"status": "DOWN",
????????????????"error code": -9
????????},
????????"diskSpace": {
????????????????"status": "UP",
????????????????"total": 570705309696,
????????????????"free": 533198258176,
????????????????"threshold": 10485760
????????}
}
操作控制类
操作控制类端点拥有更强大的控制能力,如果需要使用他们的话,需要通过属性来配置开启操作,在原生端点中,只提供了一个用来关闭应用的端点:
标签:gem 多个 运行时间 pom point string loaded 简化 内容
原文地址:http://www.cnblogs.com/li3807/p/7223969.html