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_user=xxxxxxx@qq.com
#郵件密碼
Email_password=xxxxxx
#郵件標題
Email_title=運維告警
#默認發送郵箱
Default_emails=xxxxx@qq.com,xxxxx@qq.com
#---------------------↓七陌雲接口-----------------------
#是否開啟七陌短信告警通道,可同時開始多個通道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