SpringBoot actuator 應用監控。


 

 

前言 :

今天在閱讀 《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 微服務實戰》這本書,文章中很多內容是通過讀書來學習到的,這里只是做個總結。如有紕漏還請大家多多指教。





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM