文章首發於【陳樹義】公眾號,點擊跳轉到原文:https://mp.weixin.qq.com/s/YuR_FcYzvzO1rXbnoVYNfg
前面的例子中,我們學習的都是 Prometheus 自身的內容,即監控的都是機器或者系統層面的指標。那么如果我們需要對 Java 應用做監控,例如:監控 JVM 的信息,監控 Spring Bean 的信息。那我們應該怎么實現呢?
從這篇文章開始,我們就開始學習如何去監控 Java 應用的狀態信息,並且最終實現自定義業務監控指標的監控。
Spring 監控機制
在學習如何監控 Java 應用之前,我們需要先了解下 SpringBoot 的監控機制。在 Spring 2.x 之前,SpringBoot 使用 Actuator 模塊進行監控,而在 Spring 2.x 之后,SpringBoot 使用了 Micrometer 進行監控。
Spring Boot Actuator 模塊提供了生產級別的功能,比如健康檢查,審計,指標收集,HTTP 跟蹤等,幫助我們監控和管理 Spring Boot 應用。這個模塊是一個采集應用內部信息暴露給外部的模塊,上述的功能都可以通過 HTTP 和 JMX 訪問。
在 Spring 2.x 之后,Actuator 使用 Micrometer 與這些外部應用程序監視系統集成。這樣一來,只需很少的配置即可輕松集成外部的監控系統。
那什么是 Micrometer 呢?
Micrometer 為 Java 平台上的性能數據收集提供了一個通用的 API,應用程序只需要使用 Micrometer 的通用 API 來收集性能指標即可。Micrometer 會負責完成與不同監控系統的適配工作。這就使得切換監控系統變得很容易。
簡單地說,actuator 是真正去采集數據的模塊,而 Micrometer 更像是一個適配器,將 actuator 采集到的數據適合給各種監控工具。
Spring Actuator 快速入門
接下來我們快速創建一個簡單的項目,來讓你明白 Spring Boot Actuator 能做什么。
我們到 Spring Initializr 創建一個名為 spring-web-actuator-demo
的項目,依賴選擇:Spring Web、Spring Boot Actuator 即可。
將生成的項目下載下來后打開,查看 pom.xml 文件,可以看到對應的依賴為:
打開項目后,直接運行 SpringWebActuatorDemoApplication.java
文件,正常情況下會使用 8080 端口作為服務端口。
訪問 localhost:8080/actuator/health 查看應用的健康狀態,正常情況下會返回 UP 信息。
除了提供最基本的健康檢查外,actuator 還提供了許多其他的端點(Endpoints)信息。通過這些端點信息,我們可以掌握 99% 的應用狀態信息。
文章首發於【陳樹義】公眾號,點擊跳轉到原文:https://mp.weixin.qq.com/s/YuR_FcYzvzO1rXbnoVYNfg
端點暴露配置
不同於 Actuator 1.x,Actuator 2.x 的大多數端點默認被禁掉。所以在查看對應端點之前,我們需要做好配置,否則我們是無法訪問對應端點的。
我們可以通過以下配置,來配置通過 JMX 和 HTTP 暴露的端點。
屬性 | 默認值 |
---|---|
management.endpoints.jmx.exposure.exclude | |
management.endpoints.jmx.exposure.include | * |
management.endpoints.web.exposure.exclude | |
management.endpoints.web.exposure.include | info, health |
我們可以選擇打開所有的監控點,例如:
management.endpoints.web.exposure.include=*
也可以選擇打開部分端點,例如下面的配置打開 beans 和 trace 兩個端點。
management.endpoints.web.exposure.exclude=beans,trace
Actuator 默認所有的監控點路徑都在 /actuator/*
,當然如果有需要這個路徑也支持定制。例如下面的配置將前綴改成了 monitor,那么訪問路徑就變成了 /monitor/*
。
management.endpoints.web.base-path=/minitor
這里我們在 application.yml 中加入如下配置,默認打開所有端點。
management.endpoints.web.exposure.include=*
接着我們訪問地址:localhost:8080/actuator/metrics,可以看到所有的指標地址。
如果我們要查看 process.uptime
指標,那么我們只需要訪問 localhost:8080/actuator/metrics/process.uptime,就可以看到具體的信息。
常用端點介紹
Spring Boot Actuator 提供了 Endpoints(端點)給外部來與應用程序進行訪問和交互。
例如 /health
端點提供了關於應用健康情況的一些基礎信息。/metrics
端點提供了一些有用的應用程序指標(JVM 內存使用、系統 CPU 使用等)。
一般來說,端點可以分為幾類:
- 應用配置類:獲取應用程序中加載的應用配置、環境變量、自動化配置報告等與 Spring Boot 應用密切相關的配置類信息。
- 度量指標類:獲取應用程序運行過程中用於監控的度量指標,比如:內存信息、線程池信息、HTTP 請求統計等。
- 操作控制類:提供了對應用的關閉等操作類功能。
詳細的原生端點介紹,請以官網為准,這里就不贅述徒增篇幅。
health端點
/health
端點會聚合你程序的健康指標,來檢查程序的健康情況。端點公開的應用健康信息取決於參數 management.endpoint.health.show-details
,該屬性值可選項為:
屬性值 | 描述 |
---|---|
never | 不展示詳細信息,up 或者 down 的狀態,默認配置 |
when-authorized | 詳細信息將會展示給通過認證的用戶。授權的角色可以通過management.endpoint.health.roles 配置 |
always | 對所有用戶暴露詳細信息 |
配置成 always 之后,啟動應用,訪問 localhost:8080/actuator/health 查看應用的健康狀態,正常情況下會返回 UP 信息。
在這里我們看到除了 status 狀態之外,並沒有其他信息。
這是因為我們應用中並沒有其他依賴。當你的項目有依賴對應組件的時候,這些健康指示器就會被自動裝配,繼而采集對應的信息。
現在我們在 pom.xml 文件中增加 redis 依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
接着在 application.yml 中增加如下參數,允許對所有用戶暴露詳細信息:
management.endpoint.health.show-details=always
最終我們再次訪問地址:localhost:8080/actuator/health。從圖中我們可以看到 redis 的信息了。
我們也可以通過配置禁用某個組件的健康監測。例如下面的配置禁用了 mongodb 的組件健康監測。
management.health.mongo.enabled: false
文章首發於【陳樹義】公眾號,點擊跳轉到原文:https://mp.weixin.qq.com/s/YuR_FcYzvzO1rXbnoVYNfg
或者我們可以禁用所有自動配置的健康指示器:
management.health.defaults.enabled: false
常見的指示器有下面這些:
除了使用自動引入的健康指示器之外,我們也可以自定義一個 Health Indicator,只需要實現 HealthIndicator 接口或者繼承 AbstractHealthIndicator 類。
例如下面我們創建了一個 CustomHealthIndicator 類,繼承了 AbstractHealthIndicator 類,並返回了一些健康信息。
@Component
public class CustomHealthIndicator extends AbstractHealthIndicator {
@Override
protected void doHealthCheck(Health.Builder builder) throws Exception {
// 使用 builder 來創建健康狀態信息
// 如果你throw 了一個 exception,那么status 就會被置為DOWN,異常信息會被記錄下來
builder.up()
.withDetail("app", "陳樹義向你報告:項目很健康哦!")
.withDetail("error", "陳樹義向你報告:項目有點問題哦!");
}
}
我們重啟應用並訪問地址:localhost:8080/actuator/health,我們可以看到自定義的健康信息。
metrics端點
/metrics 端點用來返回當前應用的各類重要度量指標,比如:內存信息、線程信息、垃圾回收信息、tomcat、數據庫連接池等。當我們訪問:localhost:8080/actuator/metrics 時,會返回 SpringBoot Actuator 的所有可查看端點信息。
{
"names": [
"http.server.requests",
"jvm.buffer.count",
"jvm.buffer.memory.used",
"jvm.buffer.total.capacity",
"jvm.classes.loaded",
"jvm.classes.unloaded",
"jvm.gc.live.data.size",
"jvm.gc.max.data.size",
"jvm.gc.memory.allocated",
"jvm.gc.memory.promoted",
"jvm.gc.pause",
"jvm.memory.committed",
"jvm.memory.max",
"jvm.memory.used",
"jvm.threads.daemon",
"jvm.threads.live",
"jvm.threads.peak",
"jvm.threads.states",
"logback.events",
"process.cpu.usage",
"process.files.max",
"process.files.open",
"process.start.time",
"process.uptime",
"system.cpu.count",
"system.cpu.usage",
"system.load.average.1m",
"tomcat.sessions.active.current",
"tomcat.sessions.active.max",
"tomcat.sessions.alive.max",
"tomcat.sessions.created",
"tomcat.sessions.expired",
"tomcat.sessions.rejected"
]
}
我們可以進一步使用如下格式的 URL 訪問到對應的信息:
http://localhost:8080/actuator/metrics/{MetricName}
文章首發於【陳樹義】公眾號,點擊跳轉到原文:https://mp.weixin.qq.com/s/YuR_FcYzvzO1rXbnoVYNfg
例如我想訪問 system.cpu.count
這個指標,那么我訪問這個鏈接即可:localhost:8080/actuator/metrics/system.cpu.count,返回值為:
{
"name": "system.cpu.count",
"description": "The number of processors available to the Java virtual machine",
"baseUnit": null,
"measurements": [{
"statistic": "VALUE",
"value": 4.0
}],
"availableTags": []
}
loggers端點
/loggers 端點暴露了我們程序內部配置的所有 logger 的信息,我們訪問這個鏈接就可以看到:localhost:8080/actuator/loggers。
我們也可以通過下述方式訪問某一個 logger
http://localhost:8080/actuator/loggers/{name}
例如我想訪問 Root Logger,就可以訪問這個鏈接:localhost:8080/actuator/loggers/ROOT,返回信息如下:
{
"configuredLevel": "INFO",
"effectiveLevel": "INFO"
}
info端點
/info
端點可以用來查看配置文件 application.properties
中 info 節點下的配置信息,默認情況下 application.properties
中並沒有 info 節點配置,所以當我們訪問 localhost:8080/actuator/info 時會訪問空 JSON 串。
接下來我們在 application.properties
中增加了如下配置:
info.app.name=actuator-test-demo
info.app.encoding=UTF-8
info.app.java.source=1.8
info.app.java.target=1.8
再次訪問 localhost:8080/actuator/info 會返回 info 節點的信息:
要注意,info 端點只會返回 info 節點下的信息,而不會返回其他節點下的信息。例如我在配置文件中添加如下配置:
student.name=ronald
這時候通過 info 端點是訪問不到該配置信息的。
beans端點
/beans
端點會返回 Spring 容器中所有 bean 的別名、類型、是否單例、依賴等信息。
當我們訪問 localhost:8080/actuator/beans 時,會返回如下信息:
heapdump端點
文章首發於【陳樹義】公眾號,點擊跳轉到原文:https://mp.weixin.qq.com/s/YuR_FcYzvzO1rXbnoVYNfg
訪問 http://localhost:8080/actuator/heapdump 會自動生成一個 JVM 的堆文件 heapdump。
我們可以使用 JDK 自帶的 JVM 監控工具 VisualVM 打開此文件查看內存快照。
threaddump端點
訪問 localhost:8080/actuator/threaddump 會返回應用的線程信息,包括線程名、線程 ID、線程的狀態、是否等待鎖資源、線程堆棧等信息。
shutdown端點
這個端點屬於操作控制類端點,可以優雅關閉 Spring Boot 應用。要使用這個功能首先需要在配置文件中開啟:
management.endpoint.shutdown.enabled=true
由於 shutdown 接口默認只支持 POST 請求,我們啟動 Demo 項目,向 http://localhost:8080/actuator/shutdown 發起 POST 請求。
遠程操作相對來說比較危險,所以一般在線上都不會開啟這個端點。
使用 Prometheus + Grafana 實現監控
上面我們用 actuator 暴露應用本身的線程、bean 等信息,但是這些信息還是獨立於 Prometheus 之外的。下面我們將介紹如何將 SpringBoot Actuator 與 Prometheus 結合起來。
我們同樣從 Spring Initializr 創建一個名為 spring-web-prometheus-demo 的項目,選取的依賴包括:
- Spring Web
- Spring Boot Actuator
- Prometheus
其實和上面的項目的區別是多了一個 Prometheus 包。
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
<scope>runtime</scope>
</dependency>
項目打開后,在 application.properties
中加入如下配置,打開相關的端口。
management.endpoint.metrics.enabled=true
management.endpoints.web.exposure.include=*
management.endpoint.prometheus.enabled=true
management.metrics.export.prometheus.enabled=true
接着啟動項目,訪問 localhost:8080/actuator/prometheus 可以看到 SpringBoot 的應用信息都以 Prometheus 的標准形式輸出了。
下面我們使用 Grafana官網 - Dashboards 模塊 中的「JVM(Micrometer)」圖表模板來展示應用的各項指標。點擊 JVM (Micrometer) dashboard for Grafana | Grafana Labs 可以獲取到 dashboard 的 ID 為:4701。
接着我們在 Grafana 頁面點擊「Import」菜單進入導入設置頁面。
我們進入「Import」頁面,填入模板的 ID,並點擊「Load」按鈕。
系統會自動讀取模板 ID 對應的信息並顯示在頁面上。你需要選擇模板的數據源,這里我選擇了「Prometheus」數據源,也就是本文應用所在的數據源。
設置完畢后點擊「Import」按鈕,則進入到看板頁面。
從看板我們可以看到許多信息,例如:應用啟動持續時間、應用啟動時間、堆的使用率、CPU 使用率等信息。
文章首發於【陳樹義】公眾號,點擊跳轉到原文:https://mp.weixin.qq.com/s/YuR_FcYzvzO1rXbnoVYNfg
總結
通過這篇文章,我們了解到 Spring 是利用 Spring Boot Actuator 進行監控指標收集的。與此同時,我們用一個極簡單的例子講解了如何進行應用監控。接着,我們講解了 Spring Boot Actuator 的端點暴露配置以及常見的端點信息。最后,我們使用一個 Grafana 的模板將這些信息都展示在 Grafana 面板上。
看到這里,我們已經掌握了 Prometheus 監控的 80% 內容了。但是如果我們有一些業務指標需要監控,我們應該如何實現呢?這將是下一篇文章將要講解的內容,敬請期待!
參考資料
- Spring Boot Actuator: Production-ready Features
- Spring Boot Actuator 模塊 詳解:健康檢查,度量,指標收集和監控 | Richard Code Studio
- Spring Boot 微服務應用集成 Prometheus + Grafana 實現監控告警 - 掘金