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

    源碼來源

相關文章
相關標籤/搜索