執行狀態監控使用 Actuator
springboot2.0 的配置
#actuator埠 management.server.port: 9001 #修改訪問路徑 2.0之前預設是/ 2.0預設是 /actuator 可以通過這個屬性值修改 management.endpoints.web.base-path: /actuator #開放所有頁面節點 預設只開啟了health、info兩個節點 management.endpoints.web.exposure.include: '*' #顯示健康具體資訊 預設不會顯示詳細資訊 management.endpoint.health.show-details: always
預設情況下,shutdown
啟用除以外的所有端點。要配置端點的啟用,請使用其management.endpoint.<id>.enabled
屬性。以下示例啟用shutdown
端點:
management.endpoint.shutdown.enabled = true
如果您希望端點啟用是選擇加入而不是選擇退出,請將該management.endpoints.enabled-by-default
屬性設定 為false
並使用各個端點 enabled
屬性重新加入。以下示例啟用info
端點並禁用所有其他端點:
management.endpoints.enabled-by-default = false management.endpoint.info.enabled = true
配置完成啟動專案後就可以通過postman或者直接在預覽器輸入路徑等方式來檢視應用的執行狀態了。
例如使用postman傳送 localhost:9001/actuator/health GET請求 (除了shutdown請求為post,其他的皆為GET請求)
當專案啟動時,訪問’/actuator’地址,如果看到類似下面的內容,說明actuator已經生效了
{ "_links": { "self": { "href": "http://localhost:8000/actuator", "templated": false }, "health": { "href": "http://localhost:8000/actuator/health", "templated": false }, "info": { "href": "http://localhost:8000/actuator/info", "templated": false } ... ... } }
可配置端點
可以使用以下與技術無關的端點:
ID | 描述 | 預設情況下啟用 |
---|---|---|
auditevents |
公開當前應用程式的稽核事件資訊。 | 是 |
beans |
顯示應用程式中所有Spring bean的完整列表。 | 是 |
caches |
暴露可用的快取。 | 是 |
conditions |
顯示在配置和自動配置類上評估的條件以及它們匹配或不匹配的原因。 | 是 |
configprops |
顯示所有的整理列表@ConfigurationProperties 。 |
是 |
env |
露出Spring的屬性ConfigurableEnvironment 。 |
是 |
flyway |
顯示已應用的任何Flyway資料庫遷移。 | 是 |
health |
顯示應用健康資訊。 | 是 |
httptrace |
顯示HTTP跟蹤資訊(預設情況下,最後100個HTTP請求 - 響應交換)。 | 是 |
info |
顯示任意應用資訊。 | 是 |
integrationgraph |
顯示Spring Integration圖。 | 是 |
loggers |
顯示和修改應用程式中記錄器的配置。 | 是 |
liquibase |
顯示已應用的任何Liquibase資料庫遷移。 | 是 |
metrics |
顯示當前應用程式的“指標”資訊。 | 是 |
mappings |
顯示所有@RequestMapping 路徑的整理列表。 |
是 |
scheduledtasks |
顯示應用程式中的計劃任務。 | 是 |
sessions |
允許從Spring Session支援的會話儲存中檢索和刪除使用者會話。使用Spring Session對響應式Web應用程式的支援時不可用。 | 是 |
shutdown |
允許應用程式正常關閉。 | 沒有 |
threaddump |
執行執行緒轉儲。 | 是 |
如果您的應用程式是Web應用程式(Spring MVC,Spring WebFlux或Jersey),則可以使用以下附加端點:
ID | 描述 | 預設情況下啟用 |
---|---|---|
heapdump |
返回hprof 堆轉儲檔案。 |
是 |
jolokia |
通過HTTP公開JMX bean(當Jolokia在類路徑上時,不適用於WebFlux)。 | 是 |
logfile |
返回日誌檔案的內容(如果已設定logging.file 或logging.path 屬性)。支援使用HTTP Range 標頭來檢索部分日誌檔案的內容。 |
是 |
prometheus |
以可以由Prometheus伺服器抓取的格式公開指標。 | 是 |
個別介面講解
health
訪問http://127.0.0.1:9001/actuator/health 可以看到
{ "status": "UP", "details": { "diskSpace": { "status": "UP", "details": { "total": 64756318208, "free": 62741700608, "threshold": 10485760 } } } }
自動配置的HealthIndicators
下面的HealthIndicators會被Spring Boot自動配置(在合適的時候):
名字 | 描述 |
---|---|
CassandraHealthIndicator | 檢查Cassandra database是否正常 |
DiskSpaceHealthIndicator | 低磁碟空間檢測 |
DataSourceHealthIndicator | 檢查資料庫連線是否正常 |
ElasticsearchHealthIndicator | 檢查Elasticsearch cluster是否正常 |
JmsHealthIndicator | 檢查JMS broker是否正常 |
MailHealthIndicator | 檢查mail server是否正常 |
MongoHealthIndicator | 檢查Mongo database是否正常 |
RabbitHealthIndicator | 檢查Rabbit server是否正常 |
RedisHealthIndicator | 檢查Redis server是否正常 |
SolrHealthIndicator | 檢查Solr server是否正常 |
編寫自定義HealthIndicators
想提供自定義健康資訊,你可以註冊實現了HealthIndicator介面的Spring beans。你需要提供一個health()方法的實現,並返回一個Health響應。Health響應需要包含一個status和可選的用於展示的詳情。比如上面/health
介面中的hello就是再下面定義的
@Component public class HelloHealthIndicator implements HealthIndicator { @Override public Health health() { int errorCode = check(); // perform some specific health check if (errorCode != 0) { return Health.down().withDetail("Error Code", errorCode) .build(); } return Health.up().build(); } int check(){ return 0; } }
metrics
訪問/actuator/metrics
介面中,會返回actuator提供的所有metric的name
"names": [ ... "jvm.classes.loaded", "jvm.classes.unloaded", "tomcat.global.error", "tomcat.sessions.active.current", "tomcat.sessions.alive.max", "jvm.gc.live.data.size", "tomcat.servlet.request.max", "http.server.requests", "tomcat.threads.current", ... ]
在/actuator/metrics介面後面直接加上metric的name,則可以訪問該metric的資訊。我比較關心的是http.server.requests這個metric,因為利用它可以完成對介面的監控
訪問/actuator/metrics/http.server.requests介面,可以看到類似下面的內容
{ "name": "http.server.requests", "description": null, "baseUnit": "seconds", "measurements": [ { "statistic": "COUNT", "value": 12 }, { "statistic": "TOTAL_TIME", "value": 0.045945588 }, { "statistic": "MAX", "value": 0.003358018 } ], "availableTags": [ { "tag": "exception", "values": [ "None" ] }, { "tag": "method", "values": [ "GET" ] }, { "tag": "uri", "values": [ "/clog" ] }, { "tag": "outcome", "values": [ "SUCCESS" ] }, { "tag": "status", "values": [ "200" ] } ] }
在measurements下面可以看到所有介面一共被訪問了多少次,返回所有結果一共耗時了多久,返回最慢的介面耗時了多久等。單單是這些資訊,並不覺得多麼重要。但後面還有一個屬性是availableTags,它給出了所有可用的tag key和tag value,根據這些可以進一步篩選你想要監控的內容,來看如何根據tag進一步獲取我們想要的監控資訊。
根據tag進行篩選
可以用下面的語法來對tag進行篩選
/actuator/metrics/http.server.requests?tag=uri:/actuator/metrics
上面的地址可以只關注uri=/actuator/metrics的指標,可以看到該介面一共被訪問了多少次,最慢的情況下耗時了多久等。
SpringBoot2.0 Actuator監控指標分析
序號 | 引數 | 引數說明 | 是否監控 | 監控手段 | 重要度 |
---|---|---|---|---|---|
--- | JVM | --- | |||
1 | jvm.memory.max | JVM最大記憶體 | |||
2 | jvm.memory.committed | JVM可用記憶體 | 是 | 展示並監控堆記憶體和Metaspace | 重要 |
3 | jvm.memory.used | JVM已用記憶體 | 是 | 展示並監控堆記憶體和Metaspace | 重要 |
4 | jvm.buffer.memory.used | JVM緩衝區已用記憶體 | |||
5 | jvm.buffer.count | 當前緩衝區數 | |||
6 | jvm.threads.daemon | JVM守護執行緒數 | 是 | 顯示在監控頁面 | |
7 | jvm.threads.live | JVM當前活躍執行緒數 | 是 | 顯示在監控頁面;監控達到閾值時報警 | 重要 |
8 | jvm.threads.peak | JVM峰值執行緒數 | 是 | 顯示在監控頁面 | |
9 | jvm.classes.loaded | 載入classes數 | |||
10 | jvm.classes.unloaded | 未載入的classes數 | |||
11 | jvm.gc.memory.allocated | GC時,年輕代分配的記憶體空間 | |||
12 | jvm.gc.memory.promoted | GC時,老年代分配的記憶體空間 | |||
13 | jvm.gc.max.data.size | GC時,老年代的最大記憶體空間 | |||
14 | jvm.gc.live.data.size | FullGC時,老年代的記憶體空間 | |||
15 | jvm.gc.pause | GC耗時 | 是 | 顯示在監控頁面 | |
--- | TOMCAT | --- | |||
16 | tomcat.sessions.created | tomcat已建立session數 | |||
17 | tomcat.sessions.expired | tomcat已過期session數 | |||
18 | tomcat.sessions.active.current | tomcat活躍session數 | |||
19 | tomcat.sessions.active.max | tomcat最多活躍session數 | 是 | 顯示在監控頁面,超過閾值可報警或者進行動態擴容 | 重要 |
20 | tomcat.sessions.alive.max.second | tomcat最多活躍session數持續時間 | |||
21 | tomcat.sessions.rejected | 超過session最大配置後,拒絕的session個數 | 是 | 顯示在監控頁面,方便分析問題 | |
22 | tomcat.global.error | 錯誤總數 | 是 | 顯示在監控頁面,方便分析問題 | |
23 | tomcat.global.sent | 傳送的位元組數 | |||
24 | tomcat.global.request.max | request最長時間 | |||
25 | tomcat.global.request | 全域性request次數和時間 | |||
26 | tomcat.global.received | 全域性received次數和時間 | |||
27 | tomcat.servlet.request | servlet的請求次數和時間 | |||
28 | tomcat.servlet.error | servlet發生錯誤總數 | |||
29 | tomcat.servlet.request.max | servlet請求最長時間 | |||
30 | tomcat.threads.busy | tomcat繁忙執行緒 | 是 | 顯示在監控頁面,據此檢查是否有執行緒夯住 | |
31 | tomcat.threads.current | tomcat當前執行緒數(包括守護執行緒) | 是 | 顯示在監控頁面 | 重要 |
32 | tomcat.threads.config.max | tomcat配置的執行緒最大數 | 是 | 顯示在監控頁面 | 重要 |
33 | tomcat.cache.access | tomcat讀取快取次數 | |||
34 | tomcat.cache.hit | tomcat快取命中次數 | |||
--- | CPU... | --- | |||
35 | system.cpu.count | CPU數量 | |||
36 | system.load.average.1m | load average | 是 | 超過閾值報警 | 重要 |
37 | system.cpu.usage | 系統CPU使用率 | |||
38 | process.cpu.usage | 當前程序CPU使用率 | 是 | 超過閾值報警 | |
39 | http.server.requests | http請求呼叫情況 | 是 | 顯示10個請求量最大,耗時最長的URL;統計非200的請求量 | 重要 |
40 | process.uptime | 應用已執行時間 | 是 | 顯示在監控頁面 | |
41 | process.files.max | 允許最大控制代碼數 | 是 | 配合當前開啟控制代碼數使用 | |
42 | process.start.time | 應用啟動時間點 | 是 | 顯示在監控頁面 | |
43 | process.files.open | 當前開啟控制代碼數 | 是 | 監控檔案控制代碼使用率,超過閾值後報警 | 重要 |