歡迎來到Spring Boot Actuator教程系列的第二部分。在第一部分中,你學習到了spring-boot-actuator
模塊做了什么,如何配置spring boot應用以及如何與各樣的actuator endpoints交互。
在這篇文章中,你將學習sprint boot如何整合外部監控系統Prometheus和圖表解決方案Grafana。
在這篇文章的末尾,你將在自己本地電腦上建立一個Prometheus和Grafana儀表盤,用來可視化監控Spring Boot應用產生的所有metrics。
Prometheus
Prometheus是一個開源的監控系統,起源於SoundCloud。它由以下幾個核心組件構成:
- 數據爬蟲:根據配置的時間定期的通過HTTP抓去metrics數據。
- time-series 數據庫:存儲所有的metrics數據。
- 簡單的用戶交互接口:可視化、查詢和監控所有的metrics。
Grafana
Grafana使你能夠把來自不同數據源比如Elasticsearch, Prometheus, Graphite, influxDB等多樣的數據以絢麗的圖標展示出來。
它也能基於你的metrics數據發出告警。當一個告警狀態改變時,它能通知你通過email,slack或者其他途徑。
值得注意的是,Prometheus儀表盤也有簡單的圖標。但是Grafana的圖表表現的更好。這也是為什么,在這篇文章中,我們將整合Grafana和Pormetheus來可視化metrics數據。
增加Micrometer Prometheus Registry到你的Spring Boot應用
Spring Boot使用Micrometer,一個應用metrics組件,將actuator metrics整合到外部監控系統中。
它支持很多種監控系統,比如Netflix Atalas, AWS Cloudwatch, Datadog, InfluxData, SignalFx, Graphite, Wavefront和Prometheus等。
為了整合Prometheus,你需要增加micrometer-registry-prometheus
依賴:
<!-- Micrometer Prometheus registry --> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-prometheus</artifactId> </dependency>
一旦你增加上述的依賴,Spring Boot會自動配置一個PrometheusMeterRegistry
和CollectorRegistry
來收集和輸出格式化的metrics數據,使得Prometheus服務器可以爬取。
所有應用的metrics數據是根據一個叫/prometheus
的endpoint來設置是否可用。Prometheus服務器可以周期性的爬取這個endpoint來獲取metrics數據。
解析Spring Boot Actuator的/prometheus Endpoint
首先,你可以通過actuator endpoint-discovery頁面(http://localhost:8080/actuator)來看一下prometheus
endpoint。
"prometheus": { "href": "http://127.0.0.1:8080/actuator/prometheus", "templated": false }
prometheus
endpoint暴露了格式化的metrics數據給Prometheus服務器。你可以通過prometheus
endpoint(http://localhost:8080/actuator/prometheus)看到被暴露的metrics數據:
# HELP jvm_memory_committed_bytes The amount of memory in bytes that is committed for the Java virtual machine to use # TYPE jvm_memory_committed_bytes gauge jvm_memory_committed_bytes{area="nonheap",id="Code Cache",} 9830400.0 jvm_memory_committed_bytes{area="nonheap",id="Metaspace",} 4.3032576E7 jvm_memory_committed_bytes{area="nonheap",id="Compressed Class Space",} 6070272.0 jvm_memory_committed_bytes{area="heap",id="PS Eden Space",} 2.63192576E8 jvm_memory_committed_bytes{area="heap",id="PS Survivor Space",} 1.2058624E7 jvm_memory_committed_bytes{area="heap",id="PS Old Gen",} 1.96608E8 # HELP logback_events_total Number of error level events that made it to the logs # TYPE logback_events_total counter logback_events_total{level="error",} 0.0 logback_events_total{level="warn",} 0.0 logback_events_total{level="info",} 42.0 logback_events_total{level="debug",} 0.0 logback_events_total{level="trace",} 0.0 ...
使用Docker下載和運行Prometheus
下載Prometheus
你可以使用docker pull
命令來下載Prometheus docker image。
$ docker pull prom/prometheus
一旦這個image被下載下來,你可以使用docker image ls
命令來查看本地的image列表:
$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE prom/prometheus latest b82ef1f3aa07 5 days ago 119MB
Prometheus配置(prometheus.yml)
接下來,我們需要配置Prometheus來抓取Spring Boot Actuator的/prometheus
endpoint中的metrics數據。
創建一個prometheus.yml
的文件,填入以下內容:
# my global config global: scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute. evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute. # scrape_timeout is set to the global default (10s). # Load rules once and periodically evaluate them according to the global 'evaluation_interval'. rule_files: # - "first_rules.yml" # - "second_rules.yml" # A scrape configuration containing exactly one endpoint to scrape: # Here it's Prometheus itself. scrape_configs: # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config. - job_name: 'prometheus' # metrics_path defaults to '/metrics' # scheme defaults to 'http'. static_configs: - targets: ['127.0.0.1:9090'] - job_name: 'spring-actuator' metrics_path: '/actuator/prometheus' scrape_interval: 5s static_configs: - targets: ['HOST_IP:8080']
在Prometheus文檔中,上面的配置文件是basic configuration file的擴展。
上面中比較重要的配置項是spring-actuator
job中的scrape_configs
選項。
metrics_path
是Actuator中prometheus
endpoint中的路徑。targes
包含了Spring Boot應用的HOST
和PORT
。
請確保替換HOST_IP
為你Spring Boot應用運行的電腦的IP地址。值得注意的是,localhost
將不起作用,因為我們將從docker container中連接HOST機器。你必須設置網絡IP地址。
使用Docker運行Prometheus
最后,讓我們在Docker中運行Prometheus。使用以下命令來啟動一個Prometheus服務器。
$ docker run -d --name=prometheus -p 9090:9090 -v <PATH_TO_prometheus.yml_FILE>:/etc/prometheus/prometheus.yml prom/prometheus --config.file=/etc/prometheus/prometheus.yml
請確保替換<PATH_TO_prometheus.yml_FILE>為你在上面創建的Prometheus配置文件的保存的路徑。
在運行上述命令之后,docker將在container中啟動一個Prometheus服務器。你可以通過以下命令看到所有的container:
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e036eb20b8ad prom/prometheus "/bin/prometheus --c…" 4 minutes ago Up 4 minutes 0.0.0.0:9090->9090/tcp prometheus
在Prometheus儀表盤中可視化Spring Boot Metrics
你可以通過訪問http://localhost:9090訪問Prometheus儀表盤。你可以通過Prometheus查詢表達式來查詢metrics。
下面是一些例子:
- 系統CPU使用

- API的延遲響應

你可以從Prometheus官方文檔中學習更多的 Prometheus Query Expressions
。
使用Docker下載和運行Grafana
使用以下命令可以使Docker下載和運行Grafana:
$ docker run -d --name=grafana -p 3000:3000 grafana/grafana
上述命令將在Docker Container中開啟一個Grafana,並且使用3000端口在主機上提供服務。
你可以使用docker container ls
來查看Docker container列表:
$ docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 939dd22a7179 quay.io/prometheus/prometheus "/bin/prometheus --c…" 14 minutes ago Up 14 minutes 0.0.0.0:9090->9090/tcp vigilant_neumann 1f94c46bcf5c grafana/grafana "/run.sh" 22 hours ago Up 22 hours 0.0.0.0:3000->3000/tcp grafana
你可以訪問http://localhost:3000,並且使用默認的賬戶名(admin)密碼(admin)來登錄Grafana。
配置Grafana導入Prometheus中的metrics數據
通過以下幾步導入Prometheus中的metrics數據並且在Grafana上可視化。
在Grafana上增加Prometheus數據源

建立一個儀表盤圖表

添加一個Prometheus查詢
默認的可視化

你可以在Github上看到完整的Actutator demo應用。
閱讀第一部分:Spring Boot Actuator:健康檢查、審計、統計和監控。
更多閱讀資源
翻譯源
作者:alvin_wang
鏈接:https://www.jianshu.com/p/afc3759e75b9
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並注明出處。