Spring Boot Actuator詳解與深入應用(三):Prometheus+Grafana應用監控
《Spring Boot Actuator詳解與深入應用》預計包括三篇,第一篇重點講Spring Boot Actuator 1.x的應用與定製端點;第二篇將會對比Spring Boot Actuator 2.x 與1.x的區別,以及應用和定製2.x的端點;第三篇將會介紹Actuator metric指標與Prometheus和Grafana的使用結合。這部分內容很常用,且較為入門,歡迎大家的關注。
前文回顧
本文系《Spring Boot Actuator詳解與深入應用》中的第三篇。在前兩篇文章,我們主要講了Spring Boot Actuator 1.x與 2.x 的應用與定製端點。相比於Actuator 1.x,基於Spring Boot 2.0的Actuator 2.x 在使用和定製方面有很大變化,對於Actuator的擴充套件也更加靈活。建議讀者重點關注一下Actuator 2.x,關於Spring Boot 2.x流行的趨勢是顯而易見的。
Actuator提供端點將資料暴露出來,我們獲取這些資料進行分析,但是僅僅這樣,對於我們的分析並不能顯得直觀和方便。微服務架構中,擁有的微服務例項數量往往很龐大。資料視覺化是我們一貫所期望的,開源專案:Spring Boot Admin提供了對Spring boot的Actuator Endpoint UI介面支援,同時也提供了對 Spring cloud的一些支援。本文將會對比首先介紹Spring Boot Admin的使用,然後重點介紹Spring Boot 2.x 中的應用監控:Actuator + Prometheus + Grafana。
應用Spring Boot Admin
Spring Boot Admin是一個Web應用程式,用於管理和監視Spring Boot應用程式。每個應用程式都被視為客戶端並註冊到管理伺服器。實現的原理則是基於Spring Boot Actuator提供的端點。
這一部分,我們將描述配置Spring Boot Admin伺服器以及應用程式如何成為客戶端的步驟。
Admin Server
引入依賴
首先,我們需要引入相關的依賴:
<dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-server</artifactId> <version>2.0.1</version> </dependency> <dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-server-ui</artifactId> <version>2.0.1</version> </dependency>
分別引入了admin-server和admin-server-ui。
配置Admin Server
應用程式的入口增加註解 @EnableAdminServer
將會開啟服務。
server: port: 8088 management: endpoints: web: exposure: include: "*" endpoint: health: show-details: always
Admin UI
開啟 ofollow,noindex">http://localhost:8088/,我們可以看到如下的介面:
下面我們註冊客戶端服務到Admin Server上。
Admin Client
引入依賴
<dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-starter-client</artifactId> <version>2.0.1</version> </dependency>
在各個服務中,增加admin client的依賴。
配置Admin Client
server: port: 8081 spring: application: name: admin-client --- spring.boot.admin.client.url: "http://localhost:8088" management.endpoints.web.exposure.include: "*" --- management: endpoint: health: show-details: always defaults: enabled: true eureka.client.serviceUrl.defaultZone: http://localhost:8761/eureka/
我們指定了Admin Server的地址 http://localhost:8088
。暴露出所有的Actuator的端點,並且顯示健康檢查的詳細資訊。
通過如上的配置,即完成了一個簡單的Admin Server和Client的搭建。
UI介面
當我們的客戶端註冊到Admin Server之後,開啟Admin的介面,可以看到如下的資訊截圖:
上圖為loggers介面的截圖,我們在上一篇介紹過,Actuator 2.x是CRUD模型,所以我們這裡也可以更改日誌的等級。
使用服務發現
如上的示例中,我們配置Admin Server是通過指定URL。在微服務叢集中,服務一般都會註冊到服務發現與註冊元件中,我們可以引入現有的元件,如Eureka、Consul等,輕鬆實現客戶端註冊。
實現此處略過,感興趣的讀者可以參見GitHub原始碼: https://github.com/keets2012/Spring-Boot-Samples/tree/master/spring-boot-admin-2
使用Prometheus與Grafana監控
通過Actuator收集的各種指標資訊,儲存到Prometheus統計,Grafana則提供了一個友好的介面展示。下面我們將介紹如何整合這三個元件,進行應用服務與系統的監控。
暴露Prometheus端點
我們在之前的基礎上,增加micrometer的依賴:
<dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-prometheus</artifactId> </dependency>
並將端點暴露,增加如下配置:
management: metrics: export: prometheus: enabled: true step: 1m descriptions: true web: server: auto-time-requests: true endpoints: prometheus: id: springmetrics web: exposure: include: health,info,env,prometheus,metrics,httptrace,threaddump,heapdump,springmetrics server: port: 8082
Prometheus介紹
Prometheus 是 Cloud Native Computing Foundation 專案之一,是一個系統和服務監控系統。它的工作方式是被監控的服務需要公開一個Prometheus端點,這端點是一個HTTP介面,該介面公開了度量的列表和當前的值,然後Prometheus應用從此介面定時拉取資料,一般可以存放在時序資料庫中,然後通過視覺化的Dashboard(如Grafana)進行資料展示。
Prometheus特性:
- 多維度資料模型(由度量名稱和鍵/值維度集定義的時間序列)
- 靈活的查詢語言 來利用這種維度
- 不依賴分散式儲存;單個伺服器節點是自治的
- 時間序列採集通過HTTP上的 pull model 發生
- 推送時間序列 通過中間閘道器得到支援
- 通過服務發現或靜態配置來發現目標
- 多種模式的圖形和儀表盤支援
- 支援分級和水平federation
支援的prometheus metrics,如Counter,Gauge,Histogram和Summary等。需要注意的是counter只能增不能減,適用於服務請求量,使用者訪問數等統計,但是如果需要統計有增有減的指標需要用Gauge。支援的exporter很多,可以方便的監控很多應用,同時也可以自定義開發非官方提供的exporter。
安裝Prometheus
可以通過壓縮直接安裝,筆者偷懶直接採用docker映象。
docker run -it-p 9090:9090 -v /Users/user/aoho/spring-boot-samples/spring-boot-actuator-prometheus/src/main/resources/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus
配置Prometheus檔案如下:
# Prometheus全域性配置項 global: scrape_interval:15s # 設定抓取資料的週期,預設為1min evaluation_interval: 15s # 設定更新rules檔案的週期,預設為1min scrape_timeout: 15s # 設定抓取資料的超時時間,預設為10s external_labels: # 額外的屬性,會新增到拉取得資料並存到資料庫中 monitor: 'codelab_monitor' # Alertmanager配置 alerting: alertmanagers: - static_configs: - targets: ["localhost:9093"] # 設定alertmanager和prometheus互動的介面,即alertmanager監聽的ip地址和埠 # rule配置,首次讀取預設載入,之後根據evaluation_interval設定的週期載入 rule_files: - "alertmanager_rules.yml" - "prometheus_rules.yml" # scape配置 scrape_configs: - job_name: 'prometheus' # job_name預設寫入timeseries的labels中,可以用於查詢使用 scrape_interval: 15s # 抓取週期,預設採用global配置 static_configs: # 靜態配置 - targets: ['localdns:9090'] # prometheus所要抓取資料的地址,即instance例項項 - job_name: 'example-random' static_configs: - targets: ['localhost:8082']
如上為prometheus的配置檔案,8082埠為上一小節啟動的應用的埠。prometheus的埠為9090。此外還配置了Alertmanager,用於email等型別的告警。
Grafana介紹
Grafana是一個開源的Dashboard展示工具,可以支援很多主流資料來源,包括時序性的和非時序性的。其提供的展示配置以及可擴充套件效能滿足絕大部分時間序列資料展示需求,是一個比較優秀的工具。支援的資料來源包括:prometheus、zabbix、elasticsearch、mysql和openTSDB等。
安裝
Grafana同樣是使用docker映象安裝,執行如下的啟動命令:
docker run -d -p 3000:3000 grafana/grafana
並增加prometheus的資料來源,如下:
上圖展示了筆者配置的一些外掛,如zabbix、k8s等,配置較為簡單,不在此處一一列出。
總結
本文主要講了結合Actuator的應用,首先講了Spring Boot Admin的應用並給出示例程式;然後講了使用prometheus+grafana進行整合監控,總的來說,後一種方式功能更為強大,更為專業,讀者可以自行嘗試。