為了比較友善統計微服務伺服器基礎名額和相關運作狀态,目前比較流行和成熟的方案是采用Prometheus+Grafana。本文主要基于docker的方式,快速搭建一套監控體系。
- 應用改造
為了整合Prometheus,需要在微服務應用中增加micrometer-registry-prometheus依賴:
<!-- Micrometer Prometheus registry -->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
配置中打開端點/actuator/prometheus
management:
endpoints:
web:
exposure:
include: "*"
endpoint:
health:
show-details: ALWAYS
metrics:
tags:
application: ${spring.application.name}
- 啟動prometheus
運作prometheus容器:
$ docker run -d --name=prometheus -p 9090:9090 -v /docker/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus:v2.16.0 --config.file=/etc/prometheus/prometheus.yml
其中映射到主機的配置檔案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: 'nacos-prometheus'
metrics_path: '/actuator/prometheus'
scrape_interval: 15s
consul_sd_configs:
- server: '192.168.0.102:7000'
services: []
- 啟動Grafana
使用以下指令可以使Docker下載下傳和運作Grafana:
$ docker run -d --name=grafana -p 3000:3000 grafana/grafana
為了能讓Grafana的面闆嵌入到應用中,需要更改配置
以root使用者進入容器中
$ docker exec -u root -it grafana sh
# vi conf/defaults.ini
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SOzImM2EzY0U2M5ATOxAjY1QWY0Q2N4UjYlBDZ1UTOz8CX5d2bs92Yl1iclB3bsVmdlR2LcNWaw9CXt92Yu4GZjlGbh5yYjV3Lc9CX6MHc0RHaiojIsJye.png)
- 導入模版
使用dashboard模版,可以減少定制的時間。官網的dashboard廣場,有很多現成的:
https://grafana.com/grafana/dashboards在Grafana的面闆中點選菜單Import:
從官網dashboard廣場擷取面闆ID:
此處粘貼入模版ID:
微服務應用,推薦使用4701
- 将Grafana嵌入自己的應用頁面
dashboard 和 panel都可以分享,如圖點選share:
彈出的對話框中,可以自定義一些參數
分享出來的連結加入kiosk=tv參數還可以隐藏面闆的左邊菜單和上面标題欄。然後就可以用iframe标簽嵌入到前端頁面裡去了。
- 告警配置
如需告警,則需要把配置檔案中的這個位址改下,否則docker裡的會是錯誤的
在Grafana的Alert面闆中,可以根據需要配置告警的一些參數,如監測頻率等
- 生成圖文告警
首先在Grafana的Notification channels面闆中配置告警通道:
有2個參數必須注意,Url填入告警分發的釘釘機器人的webhook。如何添加群機器人并獲得webkook,請參考釘釘官網
https://ding-doc.dingtalk.com/doc#/serverapi2/krgddi。此外,要注意勾選 Include image 選項。
配置好後,Grafana的告警圖表還需要一個外部的圖像渲染服務。我們依然使用docker來建立并啟動此服務,
建立容器并對外開放8081端口:
$ docker run -d --name=grafana-image-renderer -p 8081:8081 --env GF_RENDERER_PLUGIN_TZ=Asia/Shanghai --env GF_RENDERER_PLUGIN_IGNORE_HTTPS_ERRORS=true grafana/grafana-image-renderer
進入容器中修改配置檔案 /conf/defaults.ini
[rendering]
# 這裡指定使用外部圖像渲染,指向剛建立的容器 /render 路徑不可少
server_url = http://192.168.0.102:8081/render
# If the remote HTTP image renderer service runs on a different server than the
callback_url = http://192.168.0.102:3000
還有:
[external_image_storage]
# 使用s3協定
provider = s3
[external_image_storage.s3]
# 這個連結必須要能連通網際網路,否則圖像能生成,但會無法通路
endpoint = http://www.xxx.com
# 這個參數必須設定成true,否則下面的bucket參數會加在上面endpoint最前面,導緻通路不了,會變成 http://mybucket.www.xxx.com
path_style_access = true
# 不要配置
bucket_url =
bucket = mybucket
# minIO預設的region是us-east-1
region = us-east-1
path = images
access_key = AKIAIOSFODNN7EXAMPLE
secret_key = wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY中的
我們用的是本地的minIO作為圖像生成的存儲服務。當然用阿裡雲的OSS應該也是沒有問題的。
通過以上的配置,當Grafana監測到系統名額超過告警閥值,則就會向釘釘發送圖文消息