Spring Boot Actuator監控應用


微服務的特點決定了功能模塊的部署是分布式的,大部分功能模塊都是運行在不同的機器上,彼此通過服務調用進行交互,前后台的業務流會經過很多個微服務的處理和傳遞,出現了異常如何快速定位是哪個環節出現了問題?

在這種框架下,微服務的監控顯得尤為重要。本文主要結合Spring Boot Actuator,跟大家一起分享微服務Spring Boot Actuator的常見用法,方便我們在日常中對我們的微服務進行監控治理。

spring-boot-actuator模塊提供了一個監控和管理生產環境的模塊,可以使用http、jmx、ssh、telnet等來管理和監控應用。審計(Auditing)、 健康(health)、數據采集(metrics gathering)會自動加入到應用里面。

1、添加依賴

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

為了保證actuator暴露的監控接口的安全性,需要添加安全控制的依賴spring-boot-start-security依賴,訪問應用監控端點時,都需要輸入驗證信息。Security依賴,可以選擇不加,不進行安全管理,但不建議這么做。

2、application.yml配置文件

server:
  port: 8080
management:
  security:
    enabled: false #關掉安全認證
  port: 8088 #管理端口調整成8088
  context-path: /monitor #actuator的訪問路徑
endpoints:
  shutdown:
    enabled: true

info:
   app:
      name: spring-boot-actuator
      version: 1.0.0

management.security.enabled=false默認有一部分信息需要安全驗證之后才可以查看,如果去掉這些安全認證,直接設置management.security.enabled=false
management.context-path=/monitor 代表啟用單獨的url地址來監控Spring Boot應用,為了安全一般都啟用獨立的端口來訪問后端的監控信息
endpoints.shutdown.enabled=true 啟用接口關閉Spring Boot
配置完成之后,啟動項目就可以繼續驗證各個監控功能了。

服務訪問URL:http://localhost:8080
監控訪問URL:http://localhost:8088/monitor/

3、命令詳解
3.1、autoconfig
Spring Boot的自動配置功能非常便利,但有時候也意味着出問題比較難找出具體的原因。使用 autoconfig 可以在應用運行時查看代碼某個配置在什么條件下生效,或者某個自動配置為什么沒有生效。

啟動示例項目,訪問:http://localhost:8088/monitor/autoconfig

3.2、configprops
查看配置文件中設置的屬性內容,以及一些配置屬性的默認值。

啟動示例項目,訪問:http://localhost:8088/monitor/configprops

3.3、beans
根據示例就可以看出,展示了bean的別名、類型、是否單例、類的地址、依賴等信息。

啟動示例項目,訪問:http://localhost:8088/monitor/beans

3.4、dump
/dump 接口會生成當前線程活動的快照。這個功能非常好,方便我們在日常定位問題的時候查看線程的情況。
主要展示了線程名、線程ID、線程的狀態、是否等待鎖資源等信息。

啟動示例項目,訪問:http://localhost:8088/monitor/dump

3.5、env
展示了系統環境變量的配置信息,包括使用的環境變量、JVM 屬性、命令行參數、項目使用的jar包等信息。和configprops不同的是,configprops關注於配置信息,env關注運行環境信息。

啟動示例項目,訪問:http://localhost:8088/monitor/env

為了避免敏感信息暴露到 /env 里,所有名為password、secret、key(或者名字中最后一段是這些)的屬性在 /env 里都會加上“*”。
舉個例子,如果有一個屬性名字是database.password,那么它在/env中的顯示效果是這樣的:"database.password":"******"

/env/{name}用法
就是env的擴展 可以獲取指定配置信息,比如:http://localhost:8088/monitor/env/java.vm.version,返回:{"java.vm.version":"25.101-b13"}

3.6、health
可以看到 HealthEndPoint 給我們提供默認的監控結果,包含磁盤檢測和數據庫檢測

啟動示例項目,訪問:http://localhost:8088/monitor/health返回部分信息,下面的JSON響應是由狀態、磁盤空間和db。描述了應用程序的整體健康狀態,UP 表明應用程序是健康的。磁盤空間描述總磁盤空間,剩余的磁盤空間和最小閾值。application.properties閾值是可配置的

{
  "status": "UP",
  "diskSpace": {
    "status": "UP",
    "total": 209715195904,
    "free": 183253909504,
    "threshold": 10485760
  }
  "db": {
        "status": "UP",
        "database": "MySQL",
        "hello": 1
    }
}

其實看 Spring Boot-actuator 源碼,你會發現 HealthEndPoint 提供的信息不僅限於此,org.springframework.boot.actuate.health 包下 你會發現 ElasticsearchHealthIndicator、RedisHealthIndicator、RabbitHealthIndicator 等

3.7、info
info就是我們自己配置在配置文件中以Info開頭的配置信息,比如我們在示例項目中的配置是:

info:
   app:
      name: spring-boot-actuator
      version: 1.0.0


啟動示例項目,訪問:http://localhost:8088/monitor/info返回部分信息如下:

{
  "app": {
    "name": "spring-boot-actuator",
    "version": "1.0.0"
  }
}

 

3.8、mappings
描述全部的URI路徑,以及它們和控制器的映射關系

啟動示例項目,訪問:http://localhost:8088/monitor/mappings

3.9、metrics
最重要的監控內容之一,主要監控了JVM內容使用、GC情況、類加載信息等。

啟動示例項目,訪問:http://localhost:8088/monitor/metrics

{
    "mem": 364438, #系統內存總量,單位:Kb
    "mem.free": 251876, #空閑內存數量,單位:Kb
    "processors": 8, #處理器數量
    "instance.uptime": 12758821, #應用上下文(就是一個應用實例)正常運行時間,單位:毫秒
    "uptime": 12761352, #系統正常運行時間,單位:毫秒
    "systemload.average": -1.0, #系統平均負載
    "heap.committed": 310272, #堆信息
    "heap.init": 131072, #堆信息
    "heap.used": 58395, #堆信息
    "heap": 1840640, #堆信息
    "nonheap.committed": 56704, #
    "nonheap.init": 2496, #
    "nonheap.used": 54167, #
    "nonheap": 0, #
    "threads.peak": 47, #線程信息
    "threads.daemon": 38, #線程信息
    "threads.totalStarted": 51, #線程信息
    "threads": 41, #線程信息
    "classes": 6635, #類加載信息
    "classes.loaded": 6677, #類加載信息
    "classes.unloaded": 42, #類加載信息
    "gc.ps_scavenge.count": 7, #垃圾收集信息
    "gc.ps_scavenge.time": 75, #垃圾收集信息
    "gc.ps_marksweep.count": 2, #垃圾收集信息
    "gc.ps_marksweep.time": 122, #垃圾收集信息
    "httpsessions.max": -1, #
    "httpsessions.active": 0, #
    "gauge.response.hello": 2.0, #
    "gauge.response.star-star.favicon.ico": 2.0, #
    "counter.status.200.star-star.favicon.ico": 5, #
    "counter.status.200.hello": 7 #
}

對 /metrics 接口提供的信息進行簡單分類如下表:

解釋說明:
請注意,這里的一些度量值,比如數據源和Tomcat會話,僅在應用程序中運行特定組件時才有數據。你還可以注冊自己的度量信息。

HTTP的計數器和度量值需要做一點說明。counter.status 后的值是HTTP狀態碼,隨后是所請求的路徑。舉個例子,counter.status.200.metrics 表明/metrics端點返回 200(OK) 狀態碼的次數。

HTTP的度量信息在結構上也差不多,卻在報告另一類信息。它們全部以gauge.response 開頭,,表明這是HTTP響應的度量信息。前綴后是對應的路徑。度量值是以毫秒為單位的時間,反映了最近處理該路徑請求的耗時。

這里還有幾個特殊的值需要注意。root路徑指向的是根路徑或/。star-star代表了那些Spring 認為是靜態資源的路徑,包括圖片、JavaScript和樣式表,其中還包含了那些找不到的資源。這就是為什么你經常會看到 counter.status.404.star-star,這是返回了HTTP 404 (NOT FOUND) 狀態的請求數。  

/metrics接口會返回所有的可用度量值,但你也可能只對某個值感興趣。要獲取單個值,請求時可以在URL后加上對應的鍵名。例如,要查看空閑內存大小,可以向/metrics/mem.free發一 個GET請求。例如訪問:http://localhost:8088/monitor/metrics/mem.free,返回:{"mem.free":178123}。


還會為應用中定義的支持的DataSource提供以下指標:
最大連接數(datasource.xxx.max)
最小連接數(datasource.xxx.min)
活動連接數(datasource.xxx.active)
連接池的使用情況(.xxx.usage)

所有的數據源指標共用 datasoure. 前綴。該前綴對每個數據源都非常合適:
1、如果是主數據源(唯一可用的數據源或存在的數據源中被@Primary標記的)前綴為datasource.primary。
2、如果數據源bean名稱以dataSource結尾,那前綴就是bean的名稱去掉dataSource的部分(例如,batchDataSource的前綴是datasource.batch)
3、其他情況使用bean的名稱作為前綴

 

4.0、shutdown
開啟接口優雅關閉Spring Boot應用,要使用這個功能首先需要在配置文件中開啟:

endpoints:
  shutdown:
    enabled: true

 

配置完成之后,啟動示例項目,訪問:http://localhost:8088/monitor/shutdown返回部分信息如下:

{
    "message": "Shutting down, bye..."
}

此時你會發現應用已經被關閉。

4.1、trace
/trace接口能報告所有Web請求的詳細信息,包括請求方法、路徑、時間戳以及請求和響應的頭信息,記錄每一次請求的詳細信息。

啟動示例項目,先訪問一次:http://localhost:8080/hello,再到瀏覽器執行:http://localhost:8088/monitor/trace查看返回信息:

[
  {
    "timestamp": 1516780334777,
    "info": {
      "method": "GET",
      "path": "/hello",
      "headers": {
        "request": {
          "host": "localhost:8080",
          "connection": "keep-alive",
          "cache-control": "max-age=0",
          "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36",
          "upgrade-insecure-requests": "1",
          "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
          "accept-encoding": "gzip, deflate, br",
          "accept-language": "zh-CN,zh;q=0.9",
          "cookie": "UM_distinctid=16053ba344f1cd-0dc220c44cc94-b7a103e-13c680-16053ba3450751; Hm_lvt_0fb30c642c5f6453f17d881f529a1141=1513076406,1514961720,1515649377; CNZZDATA1260945749=232252692-1513233181-%7C1516085149; Hm_lvt_6d8e8bb59814010152d98507a18ad229=1515247964,1515296008,1515672972,1516086283"
        },
        "response": {
          "X-Application-Context": "application:8080",
          "Content-Type": "text/html;charset=UTF-8",
          "Content-Length": "11",
          "Date": "Wed, 24 Jan 2018 07:52:14 GMT",
          "status": "200"
        }
      },
      "timeTaken": "4"
    }
  }
]

上述信息展示了,/hello請求的詳細信息。

4、其它配置
a、敏感信息訪問限制
根據上面表格,鑒權為false的,表示不敏感,可以隨意訪問,否則就是做了一些保護,不能隨意訪問。
endpoints.mappings.sensitive=false

這樣需要對每一個都設置,比較麻煩。敏感方法默認是需要用戶擁有ACTUATOR角色,因此,也可以設置關閉安全限制:
management.security.enabled=false

或者配合Spring Security做細粒度控制。

b、啟用和禁用接口
雖然Actuator的接口都很有用,但你不一定需要全部這些接口。默認情況下,所有接口(除了/shutdown)都啟用。比如要禁用 /metrics 接口,則可以設置如下:
endpoints.metrics.enabled = false

如果你只想打開一兩個接口,那就先禁用全部接口,然后啟用那幾個你要的,這樣更方便。
endpoints.enabled = false
endpoints.metrics.enabled = true

 


免責聲明!

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



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