本篇將分享Prometheus+Grafana的監控平臺搭建,並監控之前文章所搭建的主機&服務,分享日常使用的一些使用經驗本篇將配置常用服務的監控與面板配置:包括 MySQL,MongoDB,CLickHouse,Redis,RabbitMQ,Linux,Windows,Nginx,站點訪問監控,已... ...
前言
Prometheus 是一個開放性的監控解決方案,通過各種 Exporter 採集當前主機/服務的數據,和 Grafana 相結合可以實現強大的監控和可視化功能
本篇將分享使用 docker compose 構建 Prometheus+Grafana,並監控之前文章所搭建的主機&服務,分享日常使用的一些使用經驗
文章較長,已安裝可略過,推薦先看第三節 常用服務的 Prometheus+Grafana 配置
特點
- 成熟穩定且強大
- 豐富的插件,大部分情況都能滿足
- 輕量級部署,資源占用少
使用情況
- 主要用來作為監控面板使用
- 使用 Grafana 監控:linux ,windows,redis,clickhouse,mongodb,mysql, RabbitMQ,站點情況
- 使用 Grafana 設置告警當服務出現無法訪問時通知到企業微信群
- Grafana 版本問題,可能存在面板失效,需要做一些調整
使用 docker compose 安裝 Prometheus
配置文件說明
-
prometheus 版本:v2.47.2
-
指定運行參數:
- 啟動配置文件路徑:
'--config.file=/etc/prometheus/prometheus.yml'
- 數據存儲目錄:
'--storage.tsdb.path=/prometheus'
- 數據保留時間:
'--storage.tsdb.retention.time=30d'
- 允許使用
curl -X POST ``http://localhost:9090/-/reload
重載其配置:'--web.enable-lifecycle'
- 指定 web 控制台配置,添加了賬號密碼:
'--web.config.file=/etc/prometheus/web-config.yml'
- 啟動配置文件路徑:
-
開放埠:9090
-
指定網路:devopsnetwork (
docker network create devopsnetwork
) -
掛載配置文件及數據目錄,需要對數據目錄進行創建及賦予許可權:
mkdir prometheus_data && chown 65534 ./prometheus_data
關於持久化許可權的討論 -
用到了三個配置文件:compose.yml prometheus.yml web-config.yml
-
docker compose 文件:compose.yml
version: '3.1'
services:
prometheus:
restart: always
container_name: prometheus
image: prom/prometheus:v2.47.2
command:
# 配置文件
- '--config.file=/etc/prometheus/prometheus.yml'
# 指定web面板賬號密碼訪問
- '--web.config.file=/etc/prometheus/web-config.yml'
# 數據目錄
- '--storage.tsdb.path=/prometheus'
# 數據保留時間
- '--storage.tsdb.retention.time=30d'
# 運行使用 curl -X POST http://localhost:9090/-/reload 重載其配置
- '--web.enable-lifecycle'
volumes:
# 需要許可權 mkdir prometheus_data && chown 65534 ./prometheus_data
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- ./prometheus_data:/prometheus
- ./web-config.yml:/etc/prometheus/web-config.yml
ports:
- 9090:9090
networks:
- devopsnetwork
networks:
devopsnetwork:
external: true
-
prometheus 配置文件示例:prometheus.yml,
- 指定了 prometheus ,並設置了訪問密碼 root devops666
global:
scrape_interval: 15s # By default, scrape targets every 15 seconds.
# Attach these labels to any time series or alerts when communicating with
# external systems (federation, remote storage, Alertmanager).
external_labels:
monitor: 'codelab-monitor'
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
- job_name: 'prometheus'
scrape_interval: 5s
static_configs:
- targets: ['localhost:9090']
# 啟用了賬號密碼 web-config.yml basic_auth_users 需要配置
basic_auth:
username: root
password: devops666
-
web 控制台配置:web-config.yml
- 指定賬號密碼 root devops666
basic_auth_users:
root: $2a$10$c6OOt9f6LuhiabPyW0nkNOprb1ndQ/HHSfqjB/exe7yh5FaYUqvBy
- 啟動:
docker compose up -d
Prometheus 指定賬號密碼訪問
- 設置 https 或基礎密碼驗證文檔
- 要啟用 web 面板賬號密碼訪問,指定 web 訪問配置文件
'--web.config.file=/etc/prometheus/web-config.yml'
- 映射 web-config.yml 指定賬號密碼 root devops666 ,Prometheus 密碼需要使用 htpasswd 生成 bcrypt 密碼 線上生成工具
basic_auth_users:
root: $2a$10$kmkC.lHR3Kwl19DE9l1KRerMDinEejEbNmJigrJZYAGkgzbVBUpa2
- 如果需要使用 Prometheus 監聽 Prometheus ,並且 Prometheus 啟用了身份驗證,需要在配置出增加 basic_auth 配置節
scrape_configs:
- job_name: 'prometheus'
scrape_interval: 5s
static_configs:
- targets: ['localhost:9090']
# 啟用了賬號密碼 web-config.yml basic_auth_users 需要配置
basic_auth:
username: root
password: devops666
-
掉坑裡去了,如果一開始 basic_auth 沒有配置對,重載配置是無效的,需要重啟
重載配置
修改了配置文件後,可以使用 api 介面重載配置,如果啟用了賬號密碼可以使用 -u 參數指定(basic_auth 修改重載配置無效),沒有就不需要加 -u 參數
curl -X POST http://localhost:9090/-/reload
或
curl -X POST -u root:devops666 http://localhost:9090/-/reload
添加 nginx 配置
還不會在區域網申請 ssl 及配置的可以參考之前的文章 前後端都用得上的 Nginx 日常使用經驗
server {
listen 80;
listen 443 ssl;
server_name prometheus.devops.test.com; # 自行修改成你的功能變數名稱
ssl_certificate /certs/prometheus.devops.test.com/server.crt;
ssl_certificate_key /certs/prometheus.devops.test.com/server.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://prometheus:9090;
proxy_http_version 1.1;
proxy_buffering off;
proxy_request_buffering off;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
安裝成功
根據上面的配置,完成了 Prometheus 的搭建,監聽本身 Prometheus 的情況
通過https://prometheus.devops.test.com/
使用賬號密碼 root devops666 登陸後即可
使用 docker compose 安裝 Grafana
Grafana 是一個開源的數據可視化和監控平臺,它提供了豐富的圖表和麵板,用於展示各種指標和數據。提到 Prometheus,Grafana 自然是不不能落下,基於官方和社區,可以很快的製作出監控可視化面板,助力日常運維檢測
配置文件說明
- grafana 版本:v10.2.0
- 指定賬號密碼: root devops666
- 埠映射:3000
- 掛載數據目錄 ./grafana_data, 需要賦予許可權:
mkdir -p grafana_data && chown -R 472:472 ./grafana_data
- 指定網路為 devopsnetwork(
docker network create devopsnetwork
) - docker compose 文件:compose.yml ,安裝 v10.2.0 替換版本號即可
version: '3.1'
services:
grafana:
restart: always
container_name: grafana
image: grafana/grafana:10.2.0
ports:
- "3000:3000"
volumes:
- ./grafana_data:/var/lib/grafana
environment:
- GF_SECURITY_ADMIN_USER=root
- GF_SECURITY_ADMIN_PASSWORD=devops666
- GF_USERS_ALLOW_SIGN_UP=false
networks:
- devopsnetwork
networks:
devopsnetwork:
external: true
- 啟動:
docker compose up -d
添加 nginx 配置
server {
listen 80;
listen 443 ssl;
server_name grafana.devops.test.com; # 自行修改成你的功能變數名稱
ssl_certificate /certs/grafana.devops.test.com/server.crt;
ssl_certificate_key /certs/grafana.devops.test.com/server.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://grafana:3000;
proxy_http_version 1.1;
proxy_buffering off;
proxy_request_buffering off;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
安裝成功
通過https://grafana.devops.test.com/
使用賬號密碼 root devops666 登陸後即可
製作監控面板步驟:
- 指定一個數據源,數據源採集各組件的信息,提供給 Grafana 進行顯示
- 可以從官方/社區/自行製作面板
添加 Prometheus 數據源
! ! ! 數據源最好是用 IP+埠,避免容器內無法解析 test.com 功能變數名稱
從 Grafana 導入儀錶板
- 從官網 獲取一個監控 Prometheus 的面板 Prometheus 2.0 Overview Id:3662
- 選擇數據源確認導入
- 查看面板,可以看到面板中有許多數據已經無法正常顯示,這個在後續的一些面板中也經常會遇到,之前以為是 Grafana 不對,但我創建了一個依賴版本 4.5.0-beta1 測試發現依舊不行,應該還是是因為監控數據的問題
Grafana v10.2.0 常用操作
之前使用的 v6.7.2,當前已經是 v10.2.0 了,故還是選擇將 grafana 升級到 v10,升級需要重新創建數據目錄
設置中文
在寫完文章發現原來已經支持中文了,補上~
導入面板
- 新建面板的入口在右上方
添加數據源
- 測試了常用的幾個數據源: Prometheus ClickHouse Redis
- MongoDB 需要企業版,開源版可以使用 Prometheus 監控
- 添加了數據源後有推薦的儀錶盤可以直接啟用
添加插件
- 之前 v6.7.2 無法線上安裝(牆),v10 可以線上安裝了,方便許多
- 準備安裝插件時記得切換 State 到 All
常用服務的 Prometheus+Grafana 配置
常用的一些組件可以在官方下載頁中去尋找,使用 Docker 可以去 DockerHub 去找對應的鏡像即可
- Grafana 版本:已升級到 v10.2.0
- Prometheus 版本:v2.47.2
Linux 監控配置
-
Prometheus 組件:node_exporter v1.7.0
-
Grafana 面板推薦:
- Node Exporter Dashboard 220417 通用 Job 分組版 ID: 16098
- Linux Hosts Metrics | Base ID: 10180
-
指定映射埠:9100
-
docker 運行 node_exporter
docker run -d \
-p 9100:9100 \
-v "/:/host:ro,rslave" \
--name node_exporter \
--restart always \
quay.io/prometheus/node-exporter:v1.7.0 \
--path.rootfs=/host
- 運行成功並將其配置到 prometheus.yml
#global:
# xxx
#...
scrape_configs:
- job_name: 'linux'
# 每隔5秒從該作業中抓取目標
scrape_interval: 5s
static_configs:
- targets: ['192.168.123.214:9100','192.168.123.216:9100','192.168.123.219:9100','192.168.123.222:9100']
- 重載配置後配置生效(
curl -X POST -u root:devops666 ``http://localhost:9090/-/reload
)
- 可以使用前面安裝的 JumpServer 工作台-作業中心-快捷命令 直接遠程在四台 Linux 主機運行
- v6 導入 Grafana 面板 10180
- v10 導入面板 16098
Windows 監控配置
-
Prometheus 組件:windows_exporter v0.24
-
Grafana 面板推薦:
- Windows Exporter Dashboard 20230531-StarsL.cn ID: 10467
- Windows Exporter ID: 12566
-
從 Github Release 下載安裝程式即可:從 release 頁下載 v0.24
-
運行使用本機 IP+9182 埠訪問即可:http://192.168.123.201:9182/
- 運行成功並將其配置到 prometheus.yml
#global:
# xxx
#...
scrape_configs:
- job_name: 'win-node'
# 每隔5秒從該作業中抓取目標
scrape_interval: 5s
static_configs:
- targets: ['192.168.123.201:9182']
- 重載配置後配置生效(
curl -X POST -u root:devops666 ``http://localhost:9090/-/reload
)
- v10 導入 Grafana 面板 12566
可以修改時間範圍查看監控情況
- 導入 10467
Nginx 監控配置
-
Prometheus 組件:nginx-prometheus-exporter v0.11
-
Grafana 面板推薦:
- NGINX exporter ID: 12708
- Nginx 日誌支持擴展,需要插件 ID:12268
-
首先需要修改 nginx 配置啟用 stub_status ,預設是建議新開一個埠來,我這裡是區域網所以直接使用 80 埠配置:通過 192.168.123.214:80/basic_status 即可訪問到 nginx 狀態
server {
listen 80;
#...其他配置
location = /stub_status {
stub_status;
}
}
- 指定映射埠:9113
- docker 運行 nginx-prometheus-exporter
docker run -d -p 9113:9113 \
--name nginx_exporter \
--restart always \
nginx/nginx-prometheus-exporter:0.11 --nginx.scrape-uri=http://192.168.123.214:80/stub_status
- 運行使用 IP+9113 埠訪問即可:http://192.168.123.214:9113/
- 將其配置到 prometheus.yml
- job_name: 'nginx'
# 每隔5秒從該作業中抓取目標
scrape_interval: 5s
static_configs:
- targets: ['192.168.123.214:9113']
重載配置後生效: curl -X POST -u root:devops666 ``http://localhost:9090/-/reload
- 導入 Grafana 面板:12708
MySQL 監控配置
-
Prometheus 組件:mysqld_exporter v0.15.0
-
Grafana 面板推薦:
- MYSQL 監控指標 ID:11329
- MySQL Overview ID:7362
- MySQL Exporter Quickstart and Dashboard ID: 14057
-
mysql 監控賬號創建
- 監控賬號密碼: exporter devops666
- 限制最大連接數:MAX_USER_CONNECTIONS :3
- 並授權查詢許可權及外部訪問許可權,允許的 Host 不能用 localhost,容器內部訪問時會帶上容器 IP 無法連接
CREATE USER 'exporter'@'%' IDENTIFIED BY 'devops666' WITH MAX_USER_CONNECTIONS 3;
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'%';
可以使用之前搭建的 JumpServer 進行執行
-
指定映射埠:9104
-
docker 運行 mysqld_exporter
- 建議指定和 mysql 服務同一網路,使用 mysql 的服務名加埠訪問,不在同一網路的適合賬號授權訪問時需要將 localhost 修改為%,dockerhub 文檔沒有更新,以 GitHub 文檔為主
- 主機名和埠:--mysqld.address mysql:3306 (一個網路就用服務名,或者使用 ip:port)
- 賬號:--mysqld.username exporter
- 密碼:-e MYSQLD_EXPORTER_PASSWORD=devops666
- 指定網路:--network devopsnetwork(和 mysql 一個網路,可以不需要)
docker run -d \
-p 9104:9104 \
-e MYSQLD_EXPORTER_PASSWORD=devops666 \
--name mysql_exporter \
--restart always \
prom/mysqld-exporter:v0.15.0 \
--mysqld.address 192.168.123.214:3306 \
--mysqld.username exporter
- 運行使用 IP+9104 埠訪問即可:http://192.168.123.214:9104/
- 將其配置到 prometheus.yml
- job_name: mysql
static_configs:
- targets:
- 192.168.123.214:3306
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
# The mysqld_exporter host:port
replacement: 192.168.123.214:9104
重載配置後生效 curl -X POST -u root:devops666 ``http://localhost:9090/-/reload
- 導入 Grafana 面板 11329
MongoDB 監控配置
-
Prometheus 組件:mongodb_exporter v0.20
-
Grafana 面板推薦:
- MongoDB ID:14997 部分圖表無效
- MongoDB 數據源插件需要企業版才能使用
-
docker 運行 mongodb_exporter 監聽單機實例
#docker stop mongodb_exporter && docker rm mongodb_exporter
docker run -d -p 9216:9216 \
--name mongodb_exporter \
--restart always \
percona/mongodb_exporter:0.20 --compatible-mode --mongodb.uri=mongodb://root:[email protected]:27017
- prometheus.yml 配置
- job_name: mongodb
static_configs:
- targets: ['192.168.123.214:9216']
labels:
instance: mongodb
- 導入面板 14997 目前只測試了單實例的監控,一些數據可以根據需要進行修改
ClickHouse 監控配置
-
Prometheus 配置:clickhouse 9363 埠、9000 埠
-
9363:ClickHouse 的 Prometheus 預設指標埠
-
9000:Native Protocol 埠, ClickHouse TCP 協議,用於分散式查詢的伺服器間通信
-
Grafana 面板推薦:
- ClickHouse 儀錶盤 ID:14192
使用 Prometheus 數據源監控
- prometheus.yml 配置
- job_name: clickhouse
static_configs:
- targets: ['192.168.123.214:9363']
labels:
instance: clickhouse
- 參考之前安裝 clickhouse 教程,增加啟用 9000 埠,併在 grafana 中安裝 clickhouse 數據源插件
version: '3'
services:
clickhouse-server:
container_name: db_clickhouse_20_6
image: yandex/clickhouse-server:20.6.8.5
restart: always
ulimits:
nofile:
soft: 262144
hard: 262144
environment:
- TZ=Asia/Shanghai
- ports=8123,9363,9000
ports:
- 8123:8123
- 9363:9363
- 9000:9000
volumes:
- ./data:/var/lib/clickhouse
- ./logs:/var/log/clickhouse-server
# 指定配置文件
- ./config:/etc/clickhouse-server
使用數據源插件監控
- Grafana 啟用數據源 clickhouse 插件
- 配置數據源 需要開啟 9000 埠
- 啟用預設儀錶盤
- 預覽效果
Redis 監控配置
-
Prometheus 組件:redis_exporter v1.55.0
-
埠:單機 9121:9121,集群 9122:9121
-
Grafana 面板推薦:
- Redis Exporter Quickstart and Dashboard: ID 14091
- Redis Dashboard for Prometheus Redis Exporter: ID 11835
- Redis 數據源插件面板:ID 12776
redis_exporter 單機監控
- docker 運行 oliver006/redis_exporter 指定埠 9121
- 通過 --redis.addr --redis.password 來指定地址和密碼
#docker stop redis_exporter && docker rm redis_exporter &&
docker run -d -p 9121:9121 \
--name redis_exporter \
--restart always \
oliver006/redis_exporter:v1.55.0 \
--redis.addr redis://192.168.123.214:6379 \
--redis.password devops666
- prometheus.yml 配置
- job_name: redis_exporter
static_configs:
- targets: ['192.168.123.214:9121']
labels:
instance: redis-node
- 導入面板 11835 監控單機
- 導入面板 14091 監控單機
redis_exporter 集群監控
- docker 運行 oliver006/redis_exporter 指定埠 9122
docker run -d -p 9122:9121 \
--name redis_exporter_targets \
--restart always \
oliver006/redis_exporter:v1.55.0
- prometheus.yml 配置
- job_name: redis_exporter_targets
static_configs:
- targets:
- redis://192.168.123.216:6380
- redis://192.168.123.219:6380
- redis://192.168.123.222:6380
- redis://192.168.123.216:6381
- redis://192.168.123.219:6381
- redis://192.168.123.222:6381
metrics_path: /scrape
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: 192.168.123.214:9122
- 使用面板 11835 監控集群節點
- 使用面板 14091 監控集群節點
使用數據源插件監控 Redis 單機/集群
- 安裝 Redis 數據源插件
- 配置 Redis 單機數據源 Redis-Node
- 配置 Redis 集群數據源 Redis-Cluster
- 導入面板 12776 指定數據源
- 集群監控預覽
RabbitMQ 監控配置
-
Grafana 面板推薦:
- rabbitmq-overview ID:10991
-
RabbitMQ 內置 Prometheus 支持 文檔
-
需要使用時映射 15692:15692 埠
-
並確保插件已啟用:
docker exec -it rabbitmq_3_12 /bin/bash -c "rabbitmq-plugins enable rabbitmq_prometheus"
- Prometheus 配置
- job_name: rabbitmq
static_configs:
- targets: ['192.168.123.214:15692']
labels:
instance: rabbitmq
- 導入 Grafana 面板 10991
站點監控配置
-
Prometheus 組件:blackbox_exporter v0.24.0
-
Grafana 面板推薦:
- Blackbox Exporter ID: 13659
- Decentralized Blackbox ID: 9719
- Blackbox Exporter Dashboard ID: 9965
-
使用 docker compose up -d 運行 blackbox-exporter ,需要映射配置 blackbox.yml
-
掛載了模塊配置文件 blackbox.yml 和區域網的證書 myCA.pem
version: '3.1'
services:
blackbox_exporter:
restart: always
container_name: blackbox_exporter
image: prom/blackbox-exporter:v0.24.0
command:
# 配置文件
- '--config.file=/config/blackbox.yml'
volumes:
# blackbox.yml myCA.pem
- ./config:/config
ports:
- 9115:9115
networks:
- devopsnetwork
networks:
devopsnetwork:
external: true
- blackbox.yml 配置,添加了 http_custom_ca_devops 將區域網中的證書映射進去了
modules:
http_2xx:
prober: http
http:
preferred_ip_protocol: "ip4"
http_post_2xx:
prober: http
http:
method: POST
tcp_connect:
prober: tcp
pop3s_banner:
prober: tcp
tcp:
query_response:
- expect: "^+OK"
tls: true
tls_config:
insecure_skip_verify: false
ca_file:
grpc:
prober: grpc
grpc:
tls: true
preferred_ip_protocol: "ip4"
grpc_plain:
prober: grpc
grpc:
tls: false
service: "service1"
ssh_banner:
prober: tcp
tcp:
query_response:
- expect: "^SSH-2.0-"
- send: "SSH-2.0-blackbox-ssh-check"
irc_banner:
prober: tcp
tcp:
query_response:
- send: "NICK prober"
- send: "USER prober prober prober :prober"
- expect: "PING :([^ ]+)"
send: "PONG ${1}"
- expect: "^:[^ ]+ 001"
icmp:
prober: icmp
icmp_ttl5:
prober: icmp
timeout: 5s
icmp:
ttl: 5
http_custom_ca_devops:
prober: http
http:
method: GET
tls_config:
ca_file: /config/myCA.pem
- prometheus.yml 配置
- job_name: blackbox_devops
metrics_path: /probe
params:
module: [ http_custom_ca_devops ] # Look for a HTTP 200 response.
dns_sd_configs:
- names:
- nginx.devops.test.com
- apollo.devops.test.com
- rabbitmq.devops.test.com
- dns.devops.test.com
- nexus.devops.test.com
- jumpserver.devops.test.com
- grafana.devops.test.com
- prometheus.devops.test.com
type: A
port: 443
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
replacement: https://192.168.123.214:443/ # Make probe URL be like https://1.2.3.4:443/
- source_labels: [__meta_dns_name]
target_label: instance
- target_label: __address__
replacement: 192.168.123.214:9115 # The blackbox exporter's real hostname:port.
- source_labels: [__meta_dns_name]
target_label: __param_hostname # Make domain name become 'Host' header for probe requests
- source_labels: [__meta_dns_name]
target_label: vhost # and store it in 'vhost' label
#匹配apollo,需要訪問/health檢查狀態
- source_labels: [__param_hostname]
regex: 'apollo.*'
target_label: __param_target
replacement: https://192.168.123.214:443/health
#匹配prometheus 開啟了basic_auth 所以可以使用下麵這種方式進行驗證,問的gpt,還真行
- source_labels: [__param_hostname]
regex: 'prometheus.*'
target_label: __param_target
replacement: https://root:[email protected]:443
- 重載 prometheus 配置生效
- 導入面板 13659 監控效果
- 導入面板 9719 監控效果
- 導入面板 9965 監控效果
Grafana 監控告警設置
通過設置 Alert rules(預警規則) ,匹配到有指標符合規則時,就會根據 Notification policies(通知策略) 進行消息發送,發送的內容和模板在 Contact points(通知方式) 設置
下麵完成一個實際的使用場景:檢測 RabbitMQ 面板狀態,服務不可用時進行預警,通過企業微信機器人進行群通知
設置預警規則
- 添加規則名稱:RabbitMQ 監控
- 選擇數據源:Prometheus
- 設置指標條件:記憶體使用位元組 erlang_mnesia_memory_usage_bytes 並指定 job 是 rabbitmq
- 設置預警條件:記憶體值小於 1(無效)時進行通知
- 設置檢查規則,30s 檢查一次,30s 等待期,立刻通知
- Pending period 等待期:如果警報條件不再滿足,警報規則將會恢復到正常狀態,而不會觸發警報
- 這個和預設的通知策略還有關係,需要結合使用,預設是 30s,5 分鐘等待期,4 小時內不重覆發送可根據需要修改
- 設置提醒信息及服務地址
設置通知策略
可以通過修改重覆間隔,重新發送通知
設置告警模板
Grafana 使用 Go 模板語言來創建通知消息,可根據文檔自行編寫,另外一個 aws 的中文文檔可以參考
- 結合文檔寫的一個通知模板
{{ define "DevOpsTemplate" -}}
{{- range .Alerts -}}
{{- range .Annotations.SortedPairs -}}
{{if eq .Name "summary" }}
**{{ "預警消息" }}**:{{ .Value }}
{{- end -}}
{{ end }}
{{- range .Annotations.SortedPairs -}}
{{if eq .Name "runbook_url" }}
**{{ "服務地址" }}**:{{ .Value }}
{{- end -}}
{{ end }}
**{{"預警分組"}}**:{{ .Labels.grafana_folder }}
**{{"開始時間"}}**:{{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05"}}
**{{"預警參數"}}**:
{{ range .Labels.SortedPairs -}}
{{ .Name }}:{{ .Value }}
{{ end }}
{{- range .Annotations.SortedPairs -}}
{{- if and (ne .Name "summary") (ne .Name "runbook_url") -}}
{{ .Name }}:{{ .Value }}
{{ end }}
{{ end }}
{{- end -}}
{{- end -}}
設置通知方式
支持多種通知,根據需要配置,這裡以企業微信機器人為例
需要通過告警快速定位問題,實際應用中肯定是需要將告警實例及其信息一併通知,所以還需要結合告警模板和規則進行消息的發送。使用模板語法指定前面設置的模板
設置完成後,當預警規則設置頁面出現異常提示時,就會進行提示了
踩坑記錄
-
安裝官方文檔運行後,提示無許可權,需要賦予掛載目錄許可權:
chown 65534 ./prometheus_data
-
許可權在之前的使用中使用 777 許可權,能夠解決,但是很明顯不是最佳方案,然後好好找了下,最後發現這個問題很久就有人提出 pr,只是一直沒有被合併,大概下個版本就可以了, 關於持久化許可權的討論
-
basic_auth 修改後,重載配置是無效的,需要重新啟動後才生效
-
redis 使用 redis_exporter,監控多個如果有密碼,沒有密碼,密碼不一樣的實例需要分開運行配置
-
mongodb 的監控始終不是很完美
-
站點監控的證書驗證和密碼驗證反反覆復嘗試了很久,以下為主要踩坑的地方
- prometheus.yml 配置 blackbox job 的 params module 只能有一個,多個只會第一個生效
- blackbox 配置的證書可以是 pem,無效轉換成 crt 格式,配置:ca_file: /config/myCA.pem
- basic_auth 配置不需要再配置 job,可以直接使用特殊的 url 格式:
https://root:[email protected]:443
-
Grafana 服務重啟後,nginx 代理功能變數名稱訪問一直 502,IP 可以訪問,重啟 nginx 後就可以訪問了
-
Grafana 的通知模板語法,可參考文檔
# 1.定義模板
{{ define "模板名稱" -}}
/**/
{{ end }}
# 2.迴圈預警消息
{{ range .Alerts }}
/**/
{{ end }}
# 3.列印加粗文字
**{{ "預警消息" }}**
# 4.刪除空格和換行符
{{ range .Alerts -}}
{{ range .Labels.SortedPairs -}}
{{ .Name }} = {{ .Value }}
{{ end }}
{{ end }}
# 5. 迴圈附加信息
{{- range .Annotations.SortedPairs -}}
{{ end}}
# 5. if判斷
{{if eq .Name "runbook_url" }}
# 6. 時區問題,+8設置
**{{"開始時間"}}**:{{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05"}}
相關文檔
- Prometheus Github
- Prometheus 官方文檔
- Prometheus Bcrypt 密碼生成
- Prometheus 配置文件參考示例
- Prometheus 數據持久化許可權的討論
- Grafana Github
- Grafana 面板檢索
- Grafana 通知模板中文文檔
- Prometheus+Grafana+Alertmanager 實現告警推送教程
- Grafana 新手教程-實現儀錶盤創建和告警推送****
後語
研究了差不多大半個月,從常用中間件的監控到設置預警,花費了很大的功夫,也掉了不少的頭髮。
這篇文章寫完,個人感覺 Prometheus+Grafana 這套方案算是入門了,滿足日常使用肯定是沒問題的。
走過不要錯過,歡迎留言交流。
作者:易墨
Github:yimogit
純靜態工具站點:metools
說明:歡迎拍磚,不足之處還望園友們指出;
迷茫大概是因為想的太多做的太少。