Spring Boot教程(十一)Spring Boot Actuator监控端点小结(1)

在Spring Boot的众多Starter POMs中有一个特殊的模块,它不一样于其余模块那样大多用于开发业务功能或是链接一些其余外部资源。它彻底是一个用于暴露自身信息的模块,因此很明显,它的主要做用是用于监控与管理,它就是:spring-boot-starter-actuatorhtml

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

初识Actuator

下面,咱们能够经过对快速入门中实现的Spring Boot应用增长spring-boot-starter-actuator模块功能,来对它有一个直观的认识。web

在现有的Spring Boot应用中引入该模块很是简单,只须要在pom.xmldependencies节点中,新增spring-boot-starter-actuator的依赖便可,具体以下:spring

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

经过增长该依赖以后,从新启动应用。此时,咱们能够在控制台中看到以下图所示的输出:json

上图显示了一批端点定义,这些端点并不是咱们本身在程序中建立,而是由spring-boot-starter-actuator模块根据应用依赖和配置自动建立出来的监控和管理端点。经过这些端点,咱们能够实时的获取应用的各项监控指标,好比:访问/health端点,咱们能够得到以下返回的应用健康信息:安全

{
    "status": "UP",
    "diskSpace": {
        "status": "UP",
        "total": 491270434816,
        "free": 383870214144,
        "threshold": 10485760
    }
}

原生端点

经过在快速入门示例中添加spring-boot-starter-actuator模块,咱们已经对它有了一个初步的认识。接下来,咱们详细介绍一下spring-boot-starter-actuator模块中已经实现的一些原生端点。若是根据端点的做用来讲,咱们能够原生端点分为三大类:mvc

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

下面咱们来详细了解一下这三类端点都分别能够为咱们提供怎么样的有用信息和强大功能,以及咱们如何去扩展和配置它们。app

应用配置类

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

  • /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类,因为咱们没有引入相关的依赖,它就不会执行自动化配置内容。因此,当咱们发现有一些指望的配置没有生效时,就能够经过该端点来查看没有生效的具体缘由。

  • /beans:该端点用来获取应用上下文中建立的全部Bean。

    [
        {
            "context": "hello:dev:8881",
            "parent": null,
            "beans": [
                {
                    "bean": "org.springframework.boot.autoconfigure.web.DispatcherServletAutoConfiguration$DispatcherServletConfiguration",
                    "scope": "singleton",
                    "type": "org.springframework.boot.autoconfigure.web.DispatcherServletAutoConfiguration$DispatcherServletConfiguration$$EnhancerBySpringCGLIB$$3440282b",
                    "resource": "null",
                    "dependencies": [
                        "serverProperties",
                        "spring.mvc.CONFIGURATION_PROPERTIES",
                        "multipartConfigElement"
                    ]
                },
                {
                    "bean": "dispatcherServlet",
                    "scope": "singleton",
                    "type": "org.springframework.web.servlet.DispatcherServlet",
                    "resource": "class path resource [org/springframework/boot/autoconfigure/web/DispatcherServletAutoConfiguration$DispatcherServletConfiguration.class]",
                    "dependencies": []
                }
            ]
        }
    ]

     

  • 如上示例中,咱们能够看到在每一个bean中都包含了下面这几个信息:

    • bean:Bean的名称
    • scope:Bean的做用域
    • type:Bean的Java类型
    • reource:class文件的具体路径
    • dependencies:依赖的Bean名称
  • /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这些关键词,这样该端点在返回它们的时候会使用*来替代实际的属性值。

    {
        "profiles": [
            "dev"
        ],
        "server.ports": {
            "local.server.port": 8881
        },
        "servletContextInitParams": {
            
        },
        "systemProperties": {
            "idea.version": "2016.1.3",
            "java.runtime.name": "Java(TM) SE Runtime Environment",
            "sun.boot.library.path": "C:\\Program Files\\Java\\jdk1.8.0_91\\jre\\bin",
            "java.vm.version": "25.91-b15",
            "java.vm.vendor": "Oracle Corporation",
            ...
        },
        "systemEnvironment": {
            "configsetroot": "C:\\WINDOWS\\ConfigSetRoot",
            "RABBITMQ_BASE": "E:\\tools\\rabbitmq",
            ...
        },
        "applicationConfig: [classpath:/application-dev.properties]": {
            "server.port": "8881"
        },
        "applicationConfig: [classpath:/application.properties]": {
            "server.port": "8885",
            "spring.profiles.active": "dev",
            "info.app.name": "spring-boot-hello",
            "info.app.version": "v1.0.0",
            "spring.application.name": "hello"
        }
    }

    /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"
        }
    }

    源码来源

相关文章
相关标签/搜索