SpringBoot actuator 应用监控。

Java框架

浏览数:72

2019-9-4

AD:资源代下载服务

前言 :

今天在阅读 《SpringCloud微服务实战》一书时看到了SpringBoot actuator相关知识,并且自己也本地调试实践。觉得SpringBoot这一套监控还是挺有意思的,这里记录下学习过程。

注:本文基于 springBootVersion = ‘1.5.10.RELEASE’

一:初识actuator

actuator是SpringBoot的一个组件,组件名称为:spring-boot-starter-actuator, 引入方式如下:
application配置文件:

#actuator
management.security.enabled= false
endpoints.health.sensitive= false

maven引入:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

或者gradle:

compile('org.springframework.boot:spring-boot-starter-actuator')

配置完成之后,启动项目,可以看到:

启动的时候会加载actuator的所有原生端点,后面会对一些常用的节点做解释。

二,体验Actuator

spring-bbot-starter-actuator模块中已经实现了一些原生端点,根据端点的作用,可以将原生端点分为三大类:

  • 应用配置类:获取应用程序中加载的应用配置、环境变量、自动化配置报告等与Spring Boot应用密切相关的配置类信息。
  • 度量指标类:获取应用程序运行过程中用于监控的度量指标,比如内存信息、线程池信息、HTTP请求统计等。
  • 操作控制类:提供了对应用的关闭等操作类功能。

下面就来详细测试这几种原生端点,以及看下他们的有用信息和强大的功能。

2.1 应用配置类

 由于Spring Boot为了改善传统Spring引用繁杂的配置内容,采用了包扫描和自动化配置的机制来加载原本集中于XML文件中的各项内容。虽然这样的做法让我们的代码变得非常简洁,但是整个应用的实例创建和依赖关系等信息都离散到了各个配置类的注解上,这使我们分析整个应用中资源的实例的各种关系变得非常困难。而这类端点可以帮助我们轻松获取一系列关于Spring 应用配置内容的详细报告,比如自动化配置的报告、Bean创建的报告、环境属性的报告等。

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

    这里只是展示一部分内容,方便展示而省略了很多信息。

    {
        "positiveMatches": {
            "PageHelperAutoConfiguration": [
                {
                    "condition": "OnBeanCondition",
                    "message": "@ConditionalOnBean (types: org.apache.ibatis.session.SqlSessionFactory; SearchStrategy: all) found bean 'sqlSessionFactory'"
                }
            ]
        },
        "negativeMatches": {
            "EncryptionBootstrapConfiguration.RsaEncryptionConfiguration": {
                "notMatched": [
                    {
                        "condition": "EncryptionBootstrapConfiguration.KeyCondition",
                        "message": "Keystore nor key found in Environment"
                    }
                ],
                "matched": [
                    {
                        "condition": "OnClassCondition",
                        "message": "@ConditionalOnClass found required class 'org.springframework.security.rsa.crypto.RsaSecretEncryptor'; @ConditionalOnMissingClass did not find unwanted class"
                    }
                ]
            }
        }
    }

    当我们发现有一些期望的配置没有生效时,我们可以通过该端点来查看没有生效的具体原因。

  • /beans:该端点用来获取应用上下文中创建的所有Bean。

    如上图所示,我们可以看到每个Bean中都包含了下面的这些信息:
    bean:Bean的名称
    scope:Bean的作用域
    type:Bean的Java类型
    resource:class文件的具体路径
    dependencies:以来的Bean名称

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

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

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

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

    从上面的示例中,我们看到有如下这些重要的度量值:
    系统信息:包括处理器数量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接口中getNonHeamMemoryUsage方法获取的java.lang.management.MemoryUsage。
    thrads.*: 线程使用情况,包括线程数、首付线程数(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_markweep.time
    httpsessions.*: Tomecat容器的会话使用情况。包括最大会话数:httpsession.max和获取会话数:httpsessions.active。该度量指标信息仅在引用嵌入式Tomcat作为容器时才提供。
    gauge.*: HTTP请求的性能指标之一,它主要用来反映一个绝对数值。
    counter.*: HTTP请求的性能指标之一,它主要用来计数器来使用,记录了增加量和减少量。

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

  • /health:该端点用来获取应用的各类健康指标信息。在spring-boot-starter-actuator模块中自带实现了一些常用资源的健康指标检测器。这些检测器都通过HealthIndicator接口实现,并且会根据依赖关系的引入实现自动化配置,比如下面列出的这些:

    检测器 功能
     DiskSpaceHealthIndicatior  低磁盘空间检测
     DataSOurceHealthIndicator    检测DataSource的连接是否可用
     MongoHealthIndicator  检测Mongo数据库是否可用
     RabbitHealthIndicator    检测Rabbit服务器是否可用
     RedisHealthIndicator    检测Redis服务器是否可用
     SolrHealthIndicator  检测Solr服务器是否可用

 

 

  • /dump:该端点用来暴露程序运行过程中的线程信息。它使用java.lang.management.ThreadMXBean的dumpAllThreads方法来返回所有包含有同步信息的活动线程详情。
  • trace: 该端点用来返回基本的HTTP跟踪信息。默认情况下,跟踪信息的存储采用org.springframework.boot.actuate.trace.InMemoryTraceRepository实现的内存方式,始终保留最近的100条请求记录。

2.3 操作控制类

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

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

三:总结

刚好自己维护的项目在往spring cloud迁移,现在刚好可以利用业余时间来学习微服务相关的知识。
spring-boot-actuator确实可以带来很多我们想不到的收获,而且对于运维也是非常有好多。在这里感谢 《Spring Cloud 微服务实战》这本书,文章中很多内容是通过读书来学习到的,这里只是做个总结。如有纰漏还请大家多多指教。

作者:一枝花算不算浪漫