author:JevonWei
版權宣告:原創作品
一 背景
Prometheus的特點
多維度資料模型。
靈活的查詢語言。
不依賴分散式儲存,單個伺服器節點是自主的。
通過基於HTTP的pull方式採集時序資料。
可以通過中間閘道器進行時序列資料推送。
通過服務發現或者靜態配置來發現目標服務物件。
支援多種多樣的圖表和介面展示,比如Grafana等。
當前環境中業務都是基於docker部署的,為了完善環境中的監控系統,對比了其他監控系統的優缺點之後,最終決定採用Prometheus作為容器化應用的監控系統,
監控環境
四個區域網路相互獨立,sz與sh通過proxy實現網路互通,hk,sz,us各部署一臺prometheus server,實現同區域的主機資料採集,sz同時作為grafana server,統一展示四個區域的監控資訊。各區域部分主機與該區域的Prometheus Server網路是獨立的,需要通過Proxy代理通訊。各區域的Prometheus Server與Grafana通過Proxy通訊。
整體架構圖如下
監控系統架構
Prometheus:資料採集與儲存
Grafana:資料展示
Alertmanager:告警
PrometheusAlert:告警方式
node_exporter:採集主機資訊
cadvisor:採集容器資訊
二 部署Prometheus Server
Prometheus 的資料對映路徑:/data/prometheus
日誌對映路徑:/data/logs
Prometheus 主配置檔案:/data/prometheus/prometheus.yml
Prometheus Rules檔案:/data/prometheus/rules
Prometheus Targets: /data/prometheus/targets/
Prometheus 主配置檔案
由於我們這邊網路環境中所有主機不是全部相通的,再次無法使用targets自動發現的規則,故在此使用targets靜態檔案配置主機資訊
# 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).
scrape_timeout: 5s
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
- ${prometheus_server_ip}:9093
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
- "rules/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: ['localhost:9090']
file_sd_configs:
- files:
- targets/prometheus.yaml
refresh_interval: 1ms
- job_name: 'nodes_server'
file_sd_configs:
- files:
- targets/nodes*.yaml
refresh_interval: 30s
relabel_configs:
- source_labels:
- "__hostname__"
regex: "(.*)"
target_label: "nodename"
action: replace
replacement: "$1"
- job_name: 'docker'
file_sd_configs:
- files:
- targets/docker*.yaml
refresh_interval: 30s
relabel_configs:
- source_labels:
- "__hostname__"
regex: "(.*)"
target_label: "nodename"
action: replace
replacement: "$1"
targets 節點配置檔案
# cat targets/nodes.yaml
- targets:
- 1.1.1.1:8888 # support-xxxxx
labels:
cluster: "support"
area: "sz"
job: "docker"
__hostname__: support-xxxxxx
host_ip: 1.1.1.1
rules 告警規則
rules.yaml 告警規則檔案
groups:
- name: Node Alert
rules:
- alert: 主機CPU告警
expr: 100 - ((avg by (nodename,instance,area,cluster,host_ip)(irate(node_cpu_seconds_total{mode="idle"}[30m]))) *100) > 70
for: 30m
labels:
name: Host CPU Warning
hostname: "{{ $labels.nodename }}"
level: 2 #告警級別,告警級別定義 0 資訊,1 警告,2 一般嚴重,3 嚴重,4 災難
generatorURL: "https://grafana.danran.com/d/_Zg4oiwMz/xiang-gang-zhu-ji-xiang-xi-xin-xi?orgId=1&var-area={{ $labels.area }}&var-hostname={{ $labels.nodename }}&var-cluster={{ $labels.cluster }}"
annotations:
description: "{{ $labels.host_ip }} 主機在30m內CPU使用率持續在70%以上,當前值為 {{ $value }}%" #告警資訊
fsurl: "https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxx-4877-4b14-bda7-xxxxxxx" #支援新增多個飛書機器人告警,用,號分割即可,如果留空或者未填寫,則預設傳送到配置檔案中填寫的飛書器人地址
執行Prometheus容器
docker run -p 9090:9090 -d -v /data/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml -v /data/prometheus/targets/:/etc/prometheus/targets/ -v /data/prometheus/data:/prometheus -v ${LOGS_DIR}/prometheus:/data/logs/ -v /etc/timezone:/etc/timezone:ro -v /etc/localtime:/etc/localtime:ro -v /data/prometheus/rules:/etc/prometheus/rules --restart=always --name prometheus prom/prometheus:v2.25.0 --web.enable-lifecycle --config.file=/etc/prometheus/prometheus.yml --web.external-url=https://https://prometheus-sz.danran.com/ --storage.tsdb.retention=30d
部署Grafana
https://grafana.com/docs/ #官方安裝文件
執行Grafana
grafana 資料儲存目錄:/data/grafana
docker run -d -p 3000:3000 --name=grafana --restart=always -v /data/grafana/grafana/:/var/lib/grafana:rw -v /data/grafana/grafana.ini:/etc/grafana/grafana.ini:rw -v /etc/timezone:/etc/timezone:ro -v /etc/localtime:/etc/localtime:ro grafana/grafana:7.4.3
grafana web介面
登入介面
新增prometheus資料來源
import模板
模板下載地址
https://grafana.com/grafana/dashboards
點選目標模板
下載模板
通過模板ID匯入
確認模板資訊
驗證圖形資訊
餅圖外掛未安裝,需要提前安裝
https://grafana.com/grafana/plugins/grafana-piechart-panel
線上安裝:
# grafana-cli plugins install grafana-piechart-panel
離線安裝:
root@master3:/var/lib/grafana/plugins# pwd
/var/lib/grafana/plugins
root@master3:/var/lib/grafana/plugins# ls
grafana-piechart-panel-v1.5.0-0-g3234d63.zip
root@master3:/var/lib/grafana/plugins# unzip grafana-piechart-panel-v1.5.0-0-g3234d63.zip
root@master3:/var/lib/grafana/plugins# mv grafana-piechart-panel-3234d63/ grafana-piechart-panel
root@master3:/var/lib/grafana/plugins# systemctl restart grafana-server
部署node_exporter和cadvisor
node_exporter部署
docker run -d -p 9100:9100 --name=node-exporter --restart=always -v "/proc:/host/proc:ro" -v "/sys:/host/sys:ro" -v "/:/rootfs:ro" prom/node-exporter:v1.1.2
cadvisor部署
cadvisor由谷歌開源,cadvisor不僅可以蒐集一臺機器上所有執行的容器資訊,還提供基礎查詢介面和http介面,方便其他元件如Prometheus進行資料抓取,cAdvisor可以對節點機器上的資源及容器進行實時監控和效能資料採集,包括CPU使用情況、記憶體使用情況、網路吞吐量及檔案系統使用情況。
docker run --volume=/:/rootfs:ro --volume=/var/run:/var/run:ro --volume=/sys:/sys:ro --volume=/var/lib/docker:/var/lib/docker:ro --volume=/dev/disk:/dev/disk:ro --publish=8888:8080 --detach=true --name=cadvisor --restart=always google/cadvisor:v0.32.0
部署alertmanager
prometheus觸發一條告警的過程:
prometheus--->觸發閾值--->超出持續時間--->alertmanager--->分組|抑制|靜默--->媒體型別--->郵件|釘釘|微信等。
分組(group): 將類似性質的警報合併為單個通知。
靜默(silences): 是一種簡單的特定時間靜音的機制,例如:伺服器要升級維護可以先設定這個時間段告警靜默。
抑制(inhibition): 當警報發出後,停止重複傳送由此警報引發的其他警報即合併一個故障引起的多個報警事件,可以消除冗餘告警
alertmanager.yml配置檔案
# cat alertmanager.yml
global:
resolve_timeout: 5m
route:
group_by: ['instance']
group_wait: 30s
group_interval: 1m
repeat_interval: 1h
receiver: 'web.hook.prometheusalert'
routes:
- receiver: 'prometheusalert-feishu'
group_wait: 10s
match:
level: '2'
receivers:
- name: 'web.hook.prometheusalert'
webhook_configs:
- url: "http://${prometheus_server_ip}:8080/prometheusalert"
- name: 'prometheusalert-feishu'
webhook_configs:
- url: "http://${prometheus_server_ip}:8080/prometheusalert?type=fs&tpl=prometheus-fsv2&fsurl=https://open.feishu.cn/open-apis/bot/v2/hook/xxxxx"
inhibit_rules:
- source_match:
level: '3'
target_match:
level: '2'
equal: ['alertname', 'instance']
- source_match:
alertname: '容器CPU告警'
target_match:
alertname: '主機CPU告警'
equal: ['nodename']
- source_match:
alertname: '容器Memory告警'
target_match:
alertname: '主機Memory告警'
equal: ['nodename']
啟動alertmanager
alertmanager 資料目錄:/data/alert
docker run -d -p 9093:9093 --restart=always -v /data/alert:/etc/alertmanager -v /etc/timezone:/etc/timezone:ro -v /etc/localtime:/etc/localtime:ro --name alertmanager prom/alertmanager:v0.21.0
部署prometheusalert
conf/app.conf配置檔案
本環境使用飛書作為告警通道,故配置檔案只修改了飛書的相關配置
#---------------------↓全域性配置-----------------------
appname = PrometheusAlert
#監聽埠
httpport = 8080
runmode = dev
#設定代理 proxy = http://123.123.123.123:8080
proxy =
#開啟JSON請求
copyrequestbody = true
#告警訊息標題
title=PrometheusAlert
#連結到告警平臺地址
#GraylogAlerturl=http://graylog.org
#釘釘告警 告警logo圖示地址
#logourl=https://raw.githubusercontent.com/feiyu563/PrometheusAlert/master/doc/alert-center.png
#釘釘告警 恢復logo圖示地址
#logourl=https://raw.githubusercontent.com/feiyu563/PrometheusAlert/master/doc/alert-center.png
#簡訊告警級別(等於3就進行簡訊告警) 告警級別定義 0 資訊,1 警告,2 一般嚴重,3 嚴重,4 災難
messagelevel=2
#電話告警級別(等於4就進行語音告警) 告警級別定義 0 資訊,1 警告,2 一般嚴重,3 嚴重,4 災難
phonecalllevel=4
#預設撥打號碼(頁面測試簡訊和電話功能需要配置此項)
defaultphone=
#故障恢復是否啟用電話通知0為關閉,1為開啟
phonecallresolved=0
#自動告警抑制(自動告警抑制是默認同一個告警源的告警資訊只發送告警級別最高的第一條告警資訊,其他訊息預設遮蔽,這麼做的目的是為了減少相同告警來源的訊息數量,防止告警炸彈,0為關閉,1為開啟)
silent=1
#是否前臺輸出file or console
logtype=file
#日誌檔案路徑
logpath=/data/logs/prometheusalert/prometheusalertcenter.log
#轉換Prometheus,graylog告警訊息的時區為CST時區(如預設已經是CST時區,請勿開啟)
prometheus_cst_time=0
#---------------------↓webhook-----------------------
#是否開啟釘釘告警通道,可同時開始多個通道0為關閉,1為開啟
open-dingding=0
#預設釘釘機器人地址
ddurl=https://oapi.dingtalk.com/robot/send?access_token=xxxxx
#是否開啟 @所有人(0為關閉,1為開啟)
dd_isatall=1
#是否開啟微信告警通道,可同時開始多個通道0為關閉,1為開啟
open-weixin=0
#預設企業微信機器人地址
wxurl=https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxx
#是否開啟飛書v1告警通道,可同時開始多個通道0為關閉,1為開啟
open-feishu=1
#預設飛書機器人地址
fsurl=
#是否開啟飛書v2告警通道,可同時開始多個通道0為關閉,1為開啟
open-feishuv2=1
#預設飛書機器人地址
#fsv2url=https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxxxxxxxxxxxxx
fsv2url=https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxxxx-4877-4b14-bda7-xxxxxxxxxx
#---------------------↓騰訊雲介面-----------------------
#是否開啟騰訊雲簡訊告警通道,可同時開始多個通道0為關閉,1為開啟
open-txdx=0
#騰訊雲簡訊介面key
TXY_DX_appkey=xxxxx
#騰訊雲簡訊模版ID 騰訊雲簡訊模版配置可參考 prometheus告警:{1}
TXY_DX_tpl_id=xxxxx
#騰訊雲簡訊sdk app id
TXY_DX_sdkappid=xxxxx
#騰訊雲簡訊簽名 根據自己稽核通過的簽名來填寫
TXY_DX_sign=騰訊雲
#是否開啟騰訊雲電話告警通道,可同時開始多個通道0為關閉,1為開啟
open-txdh=0
#騰訊雲電話介面key
TXY_DH_phonecallappkey=xxxxx
#騰訊雲電話模版ID
#TXY_DH_phonecalltpl_id=xxxxx
#騰訊雲電話sdk app id
TXY_DH_phonecallsdkappid=xxxxx
#---------------------↓華為雲介面-----------------------
#是否開啟華為雲簡訊告警通道,可同時開始多個通道0為關閉,1為開啟
open-hwdx=0
#華為雲簡訊介面key
HWY_DX_APP_Key=xxxxxxxxxxxxxxxxxxxxxx
#華為雲簡訊介面Secret
HWY_DX_APP_Secret=xxxxxxxxxxxxxxxxxxxxxx
#華為雲APP接入地址(埠介面地址)
HWY_DX_APP_Url=https://rtcsms.cn-north-1.myhuaweicloud.com:10743
#華為雲簡訊模板ID
HWY_DX_Templateid=xxxxxxxxxxxxxxxxxxxxxx
#華為雲簽名名稱,必須是已稽核通過的,與模板型別一致的簽名名稱,按照自己的實際簽名填寫
HWY_DX_Signature=華為雲
#華為雲簽名通道號
HWY_DX_Sender=xxxxxxxxxx
#---------------------↓阿里雲介面-----------------------
#是否開啟阿里雲簡訊告警通道,可同時開始多個通道0為關閉,1為開啟
open-alydx=0
#阿里雲簡訊主賬號AccessKey的ID
ALY_DX_AccessKeyId=xxxxxxxxxxxxxxxxxxxxxx
#阿里雲簡訊介面金鑰
ALY_DX_AccessSecret=xxxxxxxxxxxxxxxxxxxxxx
#阿里雲簡訊簽名名稱
ALY_DX_SignName=阿里雲
#阿里雲簡訊模板ID
ALY_DX_Template=xxxxxxxxxxxxxxxxxxxxxx
#是否開啟阿里雲電話告警通道,可同時開始多個通道0為關閉,1為開啟
open-alydh=0
#阿里雲電話主賬號AccessKey的ID
ALY_DH_AccessKeyId=xxxxxxxxxxxxxxxxxxxxxx
#阿里雲電話介面金鑰
ALY_DH_AccessSecret=xxxxxxxxxxxxxxxxxxxxxx
#阿里雲電話被叫顯號,必須是已購買的號碼
ALY_DX_CalledShowNumber=xxxxxxxxx
#阿里雲電話文字轉語音(TTS)模板ID
ALY_DH_TtsCode=xxxxxxxx
#---------------------↓容聯雲介面-----------------------
#是否開啟容聯雲電話告警通道,可同時開始多個通道0為關閉,1為開啟
RLY_DH_open-rlydh=0
#容聯雲基礎介面地址
RLY_URL=https://app.cloopen.com:8883/2013-12-26/Accounts/
#容聯雲後臺SID
RLY_ACCOUNT_SID=xxxxxxxxxxx
#容聯雲api-token
RLY_ACCOUNT_TOKEN=xxxxxxxxxx
#容聯雲app_id
RLY_APP_ID=xxxxxxxxxxxxx
#---------------------↓郵件配置-----------------------
#是否開啟郵件
open-email=0
#郵件發件伺服器地址
Email_host=smtp.qq.com
#郵件發件伺服器埠
Email_port=465
#郵件帳號
[email protected]
#郵件密碼
Email_password=xxxxxx
#郵件標題
Email_title=運維告警
#預設傳送郵箱
[email protected],[email protected]
#---------------------↓七陌雲介面-----------------------
#是否開啟七陌簡訊告警通道,可同時開始多個通道0為關閉,1為開啟
open-7moordx=0
#七陌賬戶ID
7MOOR_ACCOUNT_ID=Nxxx
#七陌賬戶APISecret
7MOOR_ACCOUNT_APISECRET=xxx
#七陌賬戶簡訊模板編號
7MOOR_DX_TEMPLATENUM=n
#注意:七陌簡訊變數這裡只用一個var1,在程式碼裡寫死了。
#-----------
#是否開啟七陌webcall語音通知告警通道,可同時開始多個通道0為關閉,1為開啟
open-7moordh=0
#請在七陌平臺新增虛擬服務號、文字節點
#七陌賬戶webcall的虛擬服務號
7MOOR_WEBCALL_SERVICENO=xxx
# 文字節點裡被替換的變數,我配置的是text。如果被替換的變數不是text,請修改此配置
7MOOR_WEBCALL_VOICE_VAR=xxx
飛書告警模版
通過訪問prometheusalert的8080埠,對告警渠道的通知模版進行更改
{{ $var := .externalURL}}{{ range $k,$v:=.alerts }}
{{if eq $v.status "resolved"}}
{{if $v.labels.container_name }}
**[Prometheus恢復資訊]({{$v.generatorURL}})**
*[{{$v.labels.alertname}}]({{$var}})*
告警級別:{{$v.labels.level}}
開始時間:{{$v.startsAt}}
結束時間:{{$v.endsAt}}
故障主機名: {{$v.labels.nodename}}
故障主機IP:{{$v.labels.host_ip}}
**容器名: {{$v.labels.container_name}}**
叢集: {{$v.labels.cluster}}
處理結果: resolved
**{{$v.annotations.description}}**
{{else}}
**[Prometheus恢復資訊]({{$v.generatorURL}})**
*[{{$v.labels.alertname}}]({{$var}})*
告警級別:{{$v.labels.level}}
開始時間:{{$v.startsAt}}
結束時間:{{$v.endsAt}}
故障主機名: {{$v.labels.nodename}}
故障主機IP:{{$v.labels.host_ip}}
叢集: {{$v.labels.cluster}}
處理結果: resolved
**{{$v.annotations.description}}**
{{end}}
{{else}}
{{if $v.labels.container_name }}
**[Prometheus告警資訊]({{$v.labels.generatorURL}})**
*[{{$v.labels.alertname}}]({{$var}})*
告警級別:{{$v.labels.level}}
開始時間:{{$v.startsAt}}
故障主機名: {{$v.labels.nodename}}
故障主機IP:{{$v.labels.host_ip}}
容器名: **{{$v.labels.container_name}}**
叢集: {{$v.labels.cluster}}
**{{$v.annotations.description}}**
{{else}}
**[Prometheus告警資訊]({{$v.labels.generatorURL}})**
*[{{$v.labels.alertname}}]({{$var}})*
告警級別:{{$v.labels.level}}
開始時間:{{$v.startsAt}}
故障主機名: {{$v.labels.nodename}}
故障主機IP:{{$v.labels.host_ip}}
叢集: {{$v.labels.cluster}}
**{{$v.annotations.description}}**
{{end}}
{{end}}
{{ end }}
啟動prometheusalert
prometheusalert 資料目錄:/data/prometheusAlert
docker run -d -p 8080:8080 --restart=always -v /data/prometheusAlert/conf:/app/conf -v ${LOGS_DIR}/prometheusAlert:/data/logs/prometheusalert -v /etc/timezone:/etc/timezone:ro -v /etc/localtime:/etc/localtime:ro --name prometheusalert feiyu563/prometheus-alert:4.2
參考
https://www.cnblogs.com/JevonWei/p/13188038.html