spring boot actuator专题

spring-boot-starter-actuator模块的实现对于实施微服务的中小团队来说,
可以有效地减少监控系统在采集应用指标时的开发量。
当然,它也并不是万能的,有时候我们也需要对其做一些简单的扩展来帮助我们实现自身系统个性化的监控需求。
下面,在本文中,我们将详解的介绍一些关于spring-boot-starter-actuator模块的内容,包括它的原生提供的端点以及一些常用的扩展和配置方式。

/autoconfig:该端点用来获取应用的自动化配置报告,其中包括所有自动化配置的候选项。
同时还列出了每个候选项自动化配置的各个先决条件是否满足。
所以,该端点可以帮助我们方便的找到一些自动化配置为什么没有生效的具体原因。
该报告内容将自动化配置内容分为两部分:

positiveMatches中返回的是条件匹配成功的自动化配置
negativeMatches中返回的是条件匹配不成功的自动化配置

{
    "positiveMatches": { // 条件匹配成功的
        "EndpointWebMvcAutoConfiguration": [
            {
                "condition": "OnClassCondition",
                "message": "@ConditionalOnClass classes found:                            javax.servlet.Servlet,org.springframework.web.servlet.DispatcherServlet"
            },
            {
                "condition": "OnWebApplicationCondition",
                "message": "found web application StandardServletEnvironment"
            }
        ],
        ...
    },
    "negativeMatches": {  // 条件不匹配成功的
        "HealthIndicatorAutoConfiguration.DataSourcesHealthIndicatorConfiguration": [
            {
                "condition": "OnClassCondition",
                "message": "required @ConditionalOnClass classes not found: org.springframework.jdbc.core.JdbcTemplate"
            }
        ],
        ...
    }
}

从如上示例中我们可以看到,每个自动化配置候选项中都有一系列的条件,
比如上面没有成功匹配的HealthIndicatorAutoConfiguration.DataSourcesHealthIndicatorConfiguration配置,
它的先决条件就是需要在工程中包含org.springframework.jdbc.core.JdbcTemplate类,
由于我们没有引入相关的依赖,它就不会执行自动化配置内容。
所以,当我们发现有一些期望的配置没有生效时,就可以通过该端点来查看没有生效的具体原因。

 

/configprops:该端点用来获取应用中配置的属性信息报告。
从下面该端点返回示例的片段中,
我们看到返回了关于该短信的配置信息,
prefix属性代表了属性的配置前缀,
properties代表了各个属性的名称和值。
所以,我们可以通过该报告来看到各个属性的配置路径,
比如我们要关闭该端点,就可以通过使用endpoints.configprops.enabled=false来完成设置。

{
    "configurationPropertiesReportEndpoint": {
        "prefix": "endpoints.configprops",
        "properties": {
            "id": "configprops",
            "sensitive": true,
            "enabled": true
        }
    },
    ...
}

/env:该端点与/configprops不同,它用来获取应用所有可用的环境属性报告。
包括:环境变量、JVM属性、应用的配置配置、命令行中的参数。
从下面该端点返回的示例片段中,
我们可以看到它不仅返回了应用的配置属性,还返回了系统属性、环境变量等丰富的配置信息,
其中也包括了应用还没有没有使用的配置。
所以它可以帮助我们方便地看到当前应用可以加载的配置信息,
并配合@ConfigurationProperties注解将它们引入到我们的应用程序中来进行使用。
另外,为了配置属性的安全,对于一些类似密码等敏感信息,该端点都会进行隐私保护,
但是我们需要让属性名中包含:password、secret、key这些关键词,
这样该端点在返回它们的时候会使用*来替代实际的属性值。

 

/mappings:该端点用来返回所有Spring MVC的控制器映射关系报告。
从下面的示例片段中,我们可以看该报告的信息与我们在启用Spring MVC的Web应用时输出的日志信息类似,
其中
bean属性标识了该映射关系的请求处理器,
method属性标识了该映射关系的具体处理类和处理函数。

{
    "/webjars/**": {
        "bean": "resourceHandlerMapping"
    },
    "/**": {
        "bean": "resourceHandlerMapping"
    },
    "/**/favicon.ico": {
        "bean": "faviconHandlerMapping"
    },
    "{[/hello]}": {
        "bean": "requestMappingHandlerMapping",
        "method": "public java.lang.String com.didispace.web.HelloController.index()"
    },
    "{[/mappings || /mappings.json],methods=[GET],produces=[application/json]}": {
        "bean": "endpointHandlerMapping",
        "method": "public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()"
    },
    ...
}

/info:该端点用来返回一些应用自定义的信息。
默认情况下,该端点只会返回一个空的json内容。
我们可以在application.properties配置文件中通过info前缀来设置一些属性,比如下面这样:
info.app.name=spring-boot-hello
info.app.version=v1.0.0
再访问/info端点,我们可以得到下面的返回报告,其中就包含了上面我们在应用自定义的两个参数。

{
    "app": {
        "name": "spring-boot-hello",
        "version": "v1.0.0"
    }
}

 

度量指标类
上面我们所介绍的应用配置类端点所提供的信息报告在应用启动的时候都已经基本确定了其返回内容,
可以说是一个静态报告。而度量指标类端点提供的报告内容则是动态变化的,
这些端点提供了应用程序在运行过程中的一些快照信息,
比如:内存使用情况、HTTP请求统计、外部资源指标等。
这些端点对于我们构建微服务架构中的监控系统非常有帮助,
由于Spring Boot应用自身实现了这些端点,所以我们可以很方便地利用它们来收集我们想要的信息,
以制定出各种自动化策略。下面,我们就来分别看看这些强大的端点功能。

/metrics:该端点用来返回当前应用的各类重要度量指标,比如:内存信息、线程信息、垃圾回收信息等。

{
  "mem": 541305,
  "mem.free": 317864,
  "processors": 8,
  "instance.uptime": 33376471,
  "uptime": 33385352,
  "systemload.average": -1,
  "heap.committed": 476672,
  "heap.init": 262144,
  "heap.used": 158807,
  "heap": 3701248,
  "nonheap.committed": 65856,
  "nonheap.init": 2496,
  "nonheap.used": 64633,
  "nonheap": 0,
  "threads.peak": 22,
  "threads.daemon": 20,
  "threads.totalStarted": 26,
  "threads": 22,
  "classes": 7669,
  "classes.loaded": 7669,
  "classes.unloaded": 0,
  "gc.ps_scavenge.count": 7,
  "gc.ps_scavenge.time": 118,
  "gc.ps_marksweep.count": 2,
  "gc.ps_marksweep.time": 234,
  "httpsessions.max": -1,
  "httpsessions.active": 0,
  "gauge.response.beans": 55,
  "gauge.response.env": 10,
  "gauge.response.hello": 5,
  "gauge.response.metrics": 4,
  "gauge.response.configprops": 153,
  "gauge.response.star-star": 5,
  "counter.status.200.beans": 1,
  "counter.status.200.metrics": 3,
  "counter.status.200.configprops": 1,
  "counter.status.404.star-star": 2,
  "counter.status.200.hello": 11,
  "counter.status.200.env": 1
}

从上面的示例中,我们看到有这些重要的度量值:

系统信息:包括处理器数量processors、运行时间uptime和instance.uptime、系统平均负载systemload.average。
mem.*:内存概要信息,包括分配给应用的总内存数量以及当前空闲的内存数量。这些信息来自java.lang.Runtime。
heap.*:堆内存使用情况。这些信息来自java.lang.management.MemoryMXBean接口中getHeapMemoryUsage方法获取的java.lang.management.MemoryUsage。
nonheap.*:非堆内存使用情况。这些信息来自java.lang.management.MemoryMXBean接口中getNonHeapMemoryUsage方法获取的java.lang.management.MemoryUsage。
threads.*:线程使用情况,包括线程数、守护线程数(daemon)、线程峰值(peak)等,这些数据均来自java.lang.management.ThreadMXBean。
classes.*:应用加载和卸载的类统计。这些数据均来自java.lang.management.ClassLoadingMXBean。
gc.*:垃圾收集器的详细信息,包括垃圾回收次数gc.ps_scavenge.count、垃圾回收消耗时间gc.ps_scavenge.time、标记-清除算法的次数gc.ps_marksweep.count、标记-清除算法的消耗时间gc.ps_marksweep.time。这些数据均来自java.lang.management.GarbageCollectorMXBean。
httpsessions.*:Tomcat容器的会话使用情况。包括最大会话数httpsessions.max和活跃会话数httpsessions.active。该度量指标信息仅在引入了嵌入式Tomcat作为应用容器的时候才会提供。
gauge.*:HTTP请求的性能指标之一,它主要用来反映一个绝对数值。比如上面示例中的gauge.response.hello: 5,它表示上一次hello请求的延迟时间为5毫秒。
counter.*:HTTP请求的性能指标之一,它主要作为计数器来使用,记录了增加量和减少量。
如上示例中counter.status.200.hello: 11,它代表了hello请求返回200状态的次数为11。

对于gauge.*和counter.*的统计,这里有一个特殊的内容请求star-star,它代表了对静态资源的访问。
这两类度量指标非常有用,我们不仅可以使用它默认的统计指标,还可以在程序中轻松的增加自定义统计值。
只需要通过注入org.springframework.boot.actuate.metrics.CounterService和org.springframework.boot.actuate.metrics.GaugeService来实现自定义的统计指标信息。
比如:我们可以像下面这样自定义实现对hello接口的访问次数统计。

@RestController
public class HelloController {

    @Autowired
    private CounterService counterService;

    @RequestMapping("/hello")
    public String greet() {
        counterService.increment("didispace.hello.count");
        return "";
    }

}

/metrics端点可以提供应用运行状态的完整度量指标报告,这项功能非常的实用,
但是对于监控系统中的各项监控功能,它们的监控内容、数据收集频率都有所不同,
如果我们每次都通过全量获取报告的方式来收集,略显粗暴。
所以,我们还可以通过/metrics/{name}接口来更细粒度的获取度量信息,
比如我们可以通过访问/metrics/mem.free来获取当前可用内存数量。

/health:该端点在一开始的示例中我们已经使用过了,它用来获取应用的各类健康指标信息。
在spring-boot-starter-actuator模块中自带实现了一些常用资源的健康指标检测器。
这些检测器都通过HealthIndicator接口实现,并且会根据依赖关系的引入实现自动化装配,
比如用于检测磁盘的DiskSpaceHealthIndicator、检测DataSource连接是否可用的DataSourceHealthIndicator等。
有时候,我们可能还会用到一些Spring Boot的Starter POMs中还没有封装的产品来进行开发,
比如:当使用RocketMQ作为消息代理时,由于没有自动化配置的检测器,
所以我们需要自己来实现一个用来采集健康信息的检测器。
比如,我们可以在Spring Boot的应用中,
为org.springframework.boot.actuate.health.HealthIndicator接口实现一个对RocketMQ的检测器类:

@Component
public class RocketMQHealthIndicator 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() {
         // 对监控对象的检测操作
      }
}

通过重写health()函数来实现健康检查,返回的Heath对象中,共有两项内容,一个是状态信息,
除了该示例中的UP与DOWN之外,还有UNKNOWN和OUT_OF_SERVICE,可以根据需要来实现返回;
还有一个详细信息,采用Map的方式存储,在这里通过withDetail函数,注入了一个Error Code信息,我们也可以填入一下其他信息,
比如,检测对象的IP地址、端口等。
重新启动应用,并访问/health接口,我们在返回的JSON字符串中,将会包含了如下信息:

"rocketMQ": {
  "status": "UP"
}

/dump:该端点用来暴露程序运行中的线程信息。
它使用java.lang.management.ThreadMXBean的dumpAllThreads方法来返回所有含有同步信息的活动线程详情。

/trace:该端点用来返回基本的HTTP跟踪信息。
默认情况下,跟踪信息的存储采用org.springframework.boot.actuate.trace.InMemoryTraceRepository实现的内存方式,始终保留最近的100条请求记录。
它记录的内容格式如下:

[
    {
        "timestamp": 1482570022463,
        "info": {
            "method": "GET",
            "path": "/metrics/mem",
            "headers": {
                "request": {
                    "host": "localhost:8881",
                    "connection": "keep-alive",
                    "cache-control": "no-cache",
                    "user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) 
                                    Chrome/53.0.2785.143 Safari/537.36",
                    "postman-token": "9817ea4d-ad9d-b2fc-7685-9dff1a1bc193",
                    "accept": "*/*",
                    "accept-encoding": "gzip, deflate, sdch",
                    "accept-language": "zh-CN,zh;q=0.8"
                },
                "response": {
                    "X-Application-Context": "hello:dev:8881",
                    "Content-Type": "application/json;charset=UTF-8",
                    "Transfer-Encoding": "chunked",
                    "Date": "Sat, 24 Dec 2016 09:00:22 GMT",
                    "status": "200"
                }
            }
        }
    },
    ...
]

操作控制类
仔细的读者可能会发现,我们在“初识Actuator”时运行示例的控制台中输出的所有监控端点,
已经在介绍应用配置类端点和度量指标类端点时都讲解完了。
那么还有哪些是操作控制类端点呢?
实际上,由于之前介绍的所有端点都是用来反映应用自身的属性或是运行中的状态,
相对于操作控制类端点没有那么敏感,所以他们默认都是启用的。
而操作控制类端点拥有更强大的控制能力,如果要使用它们的话,需要通过属性来配置开启。

在原生端点中,只提供了一个用来关闭应用的端点:/shutdown。我们可以通过如下配置开启它:

endpoints.shutdown.enabled=true
在配置了上述属性之后,只需要访问该应用的/shutdown端点就能实现关闭该应用的远程操作。
由于开放关闭应用的操作本身是一件非常危险的事,
所以真正在线上使用的时候,我们需要对其加入一定的保护机制,
比如:
定制Actuator的端点路径、整合Spring Security进行安全校验等。

http://www.open-open.com/lib/view/open1486282830132.html

时间: 2024-10-29 05:07:51

spring boot actuator专题的相关文章

Spring Boot中使用Actuator的/info端点输出Git版本信息

对于Spring Boot的Actuator模块相信大家已经不陌生了,尤其对于其中的/health./metrics等强大端点已经不陌生(如您还不了解Actuator模块,建议先阅读<Spring Boot Actuator监控端点小结>).但是,其中还有一个比较特殊的端点/info经常被大家所忽视,因为从最初的理解,它主要用来输出application.properties配置文件中通过info前缀来定义的一些属性,由于乍看之下可能想不到太多应用场景,只是被用来暴露一些应用的基本信息,而基本

通过JMX监控Spring Boot应用

在Spring Boot应用的健康监控一文中,我们通过Spring Boot Actuator对外暴露应用的监控信息,除了使用HTTP获取JSON格式 的数据之外,还可以通过JMX监控应用,Spring Boot也提供了对JMX监控的支持.JMX监控对外暴露的信息相同,不过是使用MBeans容器将应用数据封装管理. 接下来我们看下如何利用JMX获取应用状态信息,以及如何使用Jolokia JMX库对外暴露MBeans的HTTP访问URL. Get Ready 在BookPub应用的pom文件中添

《Spring Boot官方指南》翻译邀请

学技术并发网始终建议同学们阅读原版官方文档,所以并发网每月都会组织大家翻译各种官方技术文档.9月份并发网组织大家翻译<Spring Boot官方指南>,欢迎有兴趣的同学参与. 如何领取  通过评论领取想要翻译的文章,每次领取一章,如Spring Boot Documentation,翻译完后再领取其他章节.领取完成之后,建议在一个星期内翻译完成,如果不能完成翻译,也欢迎你邀请其他同学和你一起完成翻译. 如何提交? 翻译完成之后请登录到并发网提交成待审核状态,会有专门的编辑校对后进行发布.校对完

Spring Boot POM 详解

        正如这幅图所展示的那样,在Spring IO Framework体系中,Spring Boot处在Execution layer,来看看官方对这层的解释:     The Spring IO Execution layer provides domain-specific runtimes (DSRs) for applications built on the IO Foundation modules. A DSR may run standalone without req

Spring Boot Admin的使用

上一篇文章中了解了Spring Boot提供的监控接口,例如:/health./info等等,实际上除了之前提到的信息,还有其他信息业需要监控:当前处于活跃状态的会话数量.当前应用的并发数.延迟以及其他度量信息.这次我们了解如何利用Spring-boot-admin对应用信息进行可视化,如何添加度量信息. 准备 spring-boot-admin的Github地址在:https://github.com/codecentric/spring-boot-admin,它在Spring Boot Ac

使用 Spring Boot 快速构建 Spring 框架应用,PropertyPlaceholderConfigurer

Spring 框架对于很多 Java 开发人员来说都不陌生.自从 2002 年发布以来,Spring 框架已经成为企业应用开发领域非常流行的基础框架.有大量的企业应用基于 Spring 框架来开发.Spring 框架包含几十个不同的子项目,涵盖应用开发的不同方面.如此多的子项目和组件,一方面方便了开发人员的使用,另外一个方面也带来了使用方面的问题.每个子项目都有一定的学习曲线.开发人员需要了解这些子项目和组件的具体细节,才能知道如何把这些子项目整合起来形成一个完整的解决方案.在如何使用这些组件上

Spring Boot应用的健康监控

在之前的系列文章中我们学习了如何进行Spring Boot应用的功能开发,以及如何写单元测试.集成测试等,然而,在实际的软件开发中需要做的不仅如此:还包括对应用程序的监控和管理. 正如飞行员不喜欢盲目飞行,程序员也需要实时看到自己的应用目前的运行情况.如果给定一个具体的时间,我们希望知道此时CPU的利用率.内存的利用率.数据库连接是否正常以及在给定时间段内有多少客户请求等指标:不仅如此,我们希望通过图表.控制面板来展示上述信息.最重要的是:老板和业务人员希望看到的是图表,这些比较直观易懂. 首先

SOA专题---Dropwizard与Spring Boot比较

  在这篇文章中我们将讨论的Java轻量级框架Dropwizard和Spring Boot的相似性和差异. 首先,这是一个选择自由和速度需要,无论你在Dropwizard和Spring Boot选择哪个,这两个框架自身都显得有点固执己见,他们都坚信约定优于配置,那么是如何固执呢?你会发现,在我们进行比较以后,它们每个都混入了第三方库包,大部分并不是核心功能需要而是出于集成需要.这种牺牲的好处是获得好的性能.下面图中使用白色显示依赖包.   Spring的依赖 Spring Boot聚焦于Spri

Spring Boot中集成Spring Security 专题

if语句中条件判断就是检查当前的url请求是否是logout-url的配置值,接下来,获取用户的authentication,并循环调用处理器链中各个处理器的logout()函数,前面在parse阶段说过,处理器链中有两个实例,处理会话的SecurityContextLogoutHandler及remember-me服务,我们来一一看看它们的logout函数实现: 2.1.0 SecurityContextLogoutHandler public void logout(HttpServletR