Docker系列——Grafana+Prometheus+Node-exporter釘釘推送(四)

近期搭建的服務器監控平臺,來進行一個總結。主要分爲監控平臺的搭建、告警中心的配置以及消息的推送。推送的話,支持多種終端。具體詳細可查看之前的博文,在這裏羅列下,方便查看。

Docker系列——Grafana+Prometheus+Node-exporter服務器監控平臺(一)

Docker系列——Grafana+Prometheus+Node-exporter服務器告警中心(二)

Docker系列——Grafana+Prometheus+Node-exporter微信推送(三)

釘釘推送

今天在之前的基礎上,再來寫一篇釘釘推送。其實,在此之前,也寫過了,只不過是結合jenkins推送消息,Jenkins環境搭建(7)-集成釘釘消息推送。操作配置也類似,具體我們來看。

添加機器人

添加機器人,具體步驟可參考jenkins那篇博文,裏面有詳細介紹。配置機器人也簡單,所以就不重複講的,直接去看就行。

添加webhook

結合Prometheus實現釘釘消息推送,需要使用到webhook,webhook直接使用docker部署即可,開源地址

拉取鏡像

使用命令docker pull timonwong/prometheus-webhook-dingtalk 即可。

配置文件

配置文件不知道怎麼配,可以先啓動服務,不指定配置文件,啓動後,到容器內查看默認的配置文件,然後對應修改即可。

進入目錄/prometheus/webhook-dingtalk,使用命令 vim config.yml,添加如下內容:

## Request timeout
# timeout: 5s

## Customizable templates path

## You can also override default template using `default_message`
## The following example to use the 'legacy' template from v0.3.0
# default_message:
#   title: '{{ template "legacy.title" . }}'
#   text: '{{ template "legacy.content" . }}'

## Targets, previously was known as "profiles"
targets:
  webhook1:
    url: https://oapi.dingtalk.com/robot/send?access_token=XXX
    message:                                                           
      # Use legacy template                                            
      title: {{ template "ding.link.title" . }}                 
   webhook_mention_all:
     url: https://oapi.dingtalk.com/robot/send?access_token=XXX
     mention:
       all: false

啓動服務

啓動服務,使用如下命令:

docker run -d --name webhook \
-p 8060:8060 \
-v /prometheus/webhook-dingtalk/config.yml:/prometheus/config.yml \
timonwong/prometheus-webhook-dingtalk:latest \
--ding.profile="webhook1=https://oapi.dingtalk.com/robot/send?access_token=XXX" \
--web.enable-ui

注意:博文中的access_token=XXX都是自己的釘釘機器人token。

告警配置

修改文件alertmanager.yml,添加webhook_configs配置,配置如下:

global:
  resolve_timeout: 5m
  smtp_from: '{{ template "email.from" . }}'
  smtp_smarthost: 'smtp.qq.com:465'
  smtp_auth_username: '{{ template "email.from" . }}'
  smtp_auth_password: ''
  smtp_hello: 'qq.com'
  smtp_require_tls: false
  wechat_api_url: 'https://qyapi.weixin.qq.com/cgi-bin/'
  wechat_api_secret: ''
  wechat_api_corp_id: ''
templates:
  - '/etc/alertmanager/*.tmpl'
route:
  group_by: ['alertname']
  group_wait: 5s
  group_interval: 5s
  repeat_interval: 5m
  receiver: 'email'
receivers:
- name: 'email'
  email_configs:
  - to: '{{ template "email.to" . }}'
    html: '{{ template "email.html" . }}'
    send_resolved: true
    headers: { Subject: "{{ .CommonAnnotations.summary }}" }
    #insecure_skip_verify: true
  webhook_configs:
  - url: 'http://ip:8060/dingtalk/webhook1/send' # webhook1啓動服務配置
    send_resolved: true # 發送已解決通知
  wechat_configs:
  - send_resolved: true
    to_party: '8'
    to_user: '@all'
    agent_id: ''
    corp_id: ''
    api_secret: ''
    api_url: 'https://qyapi.weixin.qq.com/cgi-bin/'
    message: '{{ template "wechat.html" . }}'
inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'dev', 'instance']

配置好後,需要重啓alertmanager服務,使配置生效。

消息推送

同樣的,將node服務停掉,查看觸發後的消息推送,檢測配置是否生效。推送如下

收到了如上消息,說明配置是成功了的,但內容也是過多,不簡潔。老套路,我們來優化一下。

消息模板

進入目錄/prometheus/webhook-dingtalk/templates,可以將原有的模板備份下,使用命令 vim default.tmpl,添加如下內容:

{{ define "__subject" }}[{{ .Status | toUpper }}{{ if eq .Status "firing" }}:{{ .Alerts.Firing | len }}{{ end }}] {{ .GroupLabels.SortedPairs.Values | join " " }} {{ if gt (len .CommonLabels) (len .GroupLabels
) }}({{ with .CommonLabels.Remove .GroupLabels.Names }}{{ .Values | join " " }}{{ end }}){{ end }}{{ end }}{{ define "__alertmanagerURL" }}{{ .ExternalURL }}/#/alerts?receiver={{ .Receiver }}{{ end }}

{{ define "__text_alert_list" }}{{ range . }}
**Labels**
{{ range .Labels.SortedPairs }}> - {{ .Name }}: {{ .Value | markdown | html }}
{{ end }}
**Annotations**
{{ range .Annotations.SortedPairs }}> - {{ .Name }}: {{ .Value | markdown | html }}
{{ end }}
**Source:** [{{ .GeneratorURL }}]({{ .GeneratorURL }})
{{ end }}{{ end }}

{{ define "default.__text_alert_list" }}{{ range . }}
---
**告警級別:** {{ .Labels.severity | upper }}

**運營團隊:** {{ .Labels.team | upper }}

**觸發時間:** {{ dateInZone "2006.01.02 15:04:05" (.StartsAt) "Asia/Shanghai" }}

**事件信息:** 
{{ range .Annotations.SortedPairs }}> - {{ .Name }}: {{ .Value | markdown | html }}


{{ end }}

**事件標籤:**
{{ range .Labels.SortedPairs }}{{ if and (ne (.Name) "severity") (ne (.Name) "summary") (ne (.Name) "team") }}> - {{ .Name }}: {{ .Value | markdown | html }}
{{ end }}{{ end }}
{{ end }}
{{ end }}
{{ define "default.__text_alertresovle_list" }}{{ range . }}
---
**告警級別:** {{ .Labels.severity | upper }}

**運營團隊:** {{ .Labels.team | upper }}

**觸發時間:** {{ dateInZone "2006.01.02 15:04:05" (.StartsAt) "Asia/Shanghai" }}

**結束時間:** {{ dateInZone "2006.01.02 15:04:05" (.EndsAt) "Asia/Shanghai" }}

**事件信息:**
{{ range .Annotations.SortedPairs }}> - {{ .Name }}: {{ .Value | markdown | html }}


{{ end }}

**事件標籤:**
{{ range .Labels.SortedPairs }}{{ if and (ne (.Name) "severity") (ne (.Name) "summary") (ne (.Name) "team") }}> - {{ .Name }}: {{ .Value | markdown | html }}
{{ end }}{{ end }}
{{ end }}
{{ end }}

{{/* Default */}}
{{ define "default.title" }}{{ template "__subject" . }}{{ end }}
{{ define "default.content" }}#### \[{{ .Status | toUpper }}{{ if eq .Status "firing" }}:{{ .Alerts.Firing | len }}{{ end }}\] **[{{ index .GroupLabels "alertname" }}]({{ template "__alertmanagerURL" . }})**
{{ if gt (len .Alerts.Firing) 0 -}}

![警報 圖標](https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=3626076420,1196179712&fm=15&gp=0.jpg)

**====偵測到故障====**
{{ template "default.__text_alert_list" .Alerts.Firing }}


{{- end }}

{{ if gt (len .Alerts.Resolved) 0 -}}
{{ template "default.__text_alertresovle_list" .Alerts.Resolved }}


{{- end }}
{{- end }}

{{/* Legacy */}}
{{ define "legacy.title" }}{{ template "__subject" . }}{{ end }}
{{ define "legacy.content" }}#### \[{{ .Status | toUpper }}{{ if eq .Status "firing" }}:{{ .Alerts.Firing | len }}{{ end }}\] **[{{ index .GroupLabels "alertname" }}]({{ template "__alertmanagerURL" . }})**
{{ template "__text_alert_list" .Alerts.Firing }}
{{- end }}

{{/* Following names for compatibility */}}
{{ define "ding.link.title" }}{{ template "default.title" . }}{{ end }}
{{ define "ding.link.content" }}{{ template "default.content" . }}{{ end }}

配置後,重新啓動webhook服務,需要將模板掛載到容器中,使用命令:

docker run -d --name webhook \
-p 8060:8060 \
-v /prometheus/webhook-dingtalk/templates/default.tmpl:/prometheus/templates/default.tmpl  \
-v /prometheus/webhook-dingtalk/config.yml:/prometheus/config.yml \
timonwong/prometheus-webhook-dingtalk:latest \
--ding.profile="webhook1=https://oapi.dingtalk.com/robot/send?access_token=XXX" \
--web.enable-ui

服務啓動成功後,我們可以訪問ui頁面,因爲我們啓動服務時,開啓了ui頁面,http://ip:8060/ui/ ,可以查看模板是否引用生效,如下所示:

我們可以看到,模板配置是生效了。

再次將對應服務停用,查看收到的推送,如下所示:

模板引用,優化到這,就成功了。

prometheus-alert

在使用webhook時,嘗試了艾特人員功能,沒能成功,無意中找到另一個項目prometheus-alert,部署下試試,項目使用說明地址

拉取鏡像

使用命令 docker pull feiyu563/prometheus-alert:latest

配置文件

配置文件不知道怎麼配,可以先啓動服務,不指定配置文件,啓動後,到容器內查看默認的配置文件,然後對應修改即可。

進入目錄 /prometheus/prometheusalert,使用命令 vim app.conf,添加如下內容:

#---------------------↓全局配置-----------------------
appname = PrometheusAlert
#登錄用戶名
login_user=XXX
#登錄密碼
login_password=XXX
#監聽地址
httpaddr = "0.0.0.0"
#監聽端口
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圖標地址
rlogourl=https://raw.githubusercontent.com/feiyu563/PrometheusAlert/master/doc/alert-center.png
#短信告警級別(等於3就進行短信告警) 告警級別定義 0 信息,1 警告,2 一般嚴重,3 嚴重,4 災難
messagelevel=3
#電話告警級別(等於4就進行語音告警) 告警級別定義 0 信息,1 警告,2 一般嚴重,3 嚴重,4 災難
phonecalllevel=4
#默認撥打號碼(頁面測試短信和電話功能需要配置此項)
defaultphone=xxxxxxxx
#故障恢復是否啓用電話通知0爲關閉,1爲開啓
phonecallresolved=0
#自動告警抑制(自動告警抑制是默認同一個告警源的告警信息只發送告警級別最高的第一條告警信息,其他消息默認屏蔽,這麼做的目的是爲了減少相同告警來源的消息數量,防止告警炸彈,0爲關閉,1爲開啓)
silent=0
#是否前臺輸出file or console
logtype=file
#日誌文件路徑
logpath=logs/prometheusalertcenter.log
#轉換Prometheus,graylog告警消息的時區爲CST時區(如默認已經是CST時區,請勿開啓)
prometheus_cst_time=0
#數據庫驅動,支持sqlite3,mysql,postgres如使用mysql或postgres,請開啓db_host,db_port,db_user,db_password,db_name的註釋
db_driver=sqlite3
#db_host=127.0.0.1
#db_port=3306
#db_user=root
#db_password=root
#db_name=prometheusalert

#---------------------↓webhook-----------------------
#是否開啓釘釘告警通道,可同時開始多個通道0爲關閉,1爲開啓
open-dingding=1
#默認釘釘機器人地址
ddurl=https://oapi.dingtalk.com/robot/send?access_token=XXX
#是否開啓 @所有人(0爲關閉,1爲開啓)
dd_isatall=1

#是否開啓微信告警通道,可同時開始多個通道0爲關閉,1爲開啓
open-weixin=1
#默認企業微信機器人地址
wxurl=https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxx

#是否開啓飛書告警通道,可同時開始多個通道0爲關閉,1爲開啓
open-feishu=0
#默認飛書機器人地址
fsurl=https://open.feishu.cn/open-apis/bot/hook/xxxxxxxxx

#---------------------↓騰訊雲接口-----------------------
#是否開啓騰訊雲短信告警通道,可同時開始多個通道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=text

#---------------------↓telegram接口-----------------------
#是否開啓telegram告警通道,可同時開始多個通道0爲關閉,1爲開啓
open-tg=0
#tg機器人token
TG_TOKEN=xxxxx
#tg消息模式 個人消息或者頻道消息 0爲關閉(推送給個人),1爲開啓(推送給頻道)
TG_MODE_CHAN=0
#tg用戶ID
TG_USERID=xxxxx
#tg頻道name
TG_CHANNAME=xxxxx
#tg api地址, 可以配置爲代理地址
#TG_API_PROXY="https://api.telegram.org/bot%s/%s"

#---------------------↓workwechat接口-----------------------
#是否開啓workwechat告警通道,可同時開始多個通道0爲關閉,1爲開啓
open-workwechat=0
# 企業ID
WorkWechat_CropID=xxxxx
# 應用ID
WorkWechat_AgentID=xxxx
# 應用secret
WorkWechat_AgentSecret=xxxx
# 接受用戶
WorkWechat_ToUser="zhangsan|lisi"
# 接受部門
WorkWechat_ToParty="ops|dev"
# 接受標籤
WorkWechat_ToTag=""
# 消息類型, 暫時只支持markdown
# WorkWechat_Msgtype = "markdown"

#---------------------↓百度雲接口-----------------------
#是否開啓百度雲短信告警通道,可同時開始多個通道0爲關閉,1爲開啓
open-baidudx=0
#百度雲短信接口AK(ACCESS_KEY_ID)
BDY_DX_AK=xxxxx
#百度雲短信接口SK(SECRET_ACCESS_KEY)
BDY_DX_SK=xxxxx
#百度雲短信ENDPOINT(ENDPOINT參數需要用指定區域的域名來進行定義,如服務所在區域爲北京,則爲)
BDY_DX_ENDPOINT=http://smsv3.bj.baidubce.com
#百度雲短信模版ID,根據自己審覈通過的模版來填寫(模版支持一個參數code:如prometheus告警:{code})
BDY_DX_TEMPLATE_ID=xxxxx
#百度雲短信簽名ID,根據自己審覈通過的簽名來填寫
TXY_DX_SIGNATURE_ID=xxxxx

#---------------------↓百度Hi(如流)-----------------------
#是否開啓百度Hi(如流)告警通道,可同時開始多個通道0爲關閉,1爲開啓
open-ruliu=0
#默認百度Hi(如流)機器人地址
BDRL_URL=https://api.im.baidu.com/api/msg/groupmsgsend?access_token=xxxxxxxxxxxxxx
#百度Hi(如流)羣ID
BDRL_ID=123456

上述這麼多配置項,但我們這裏是結合釘釘使用,所以只配置webhook即可。

啓動服務

使用如下命令:

docker run -d -p 10:8080 --name prometheusalert-center \
-v /prometheus/prometheusalert/:/app/conf \
feiyu563/prometheus-alert:latest

啓動後,就可以通過ip+端口的方式訪問了,界面如下:

CPU監控

在之前說過內存監控,今天再來說下CPU監控,CPU是重點關注指標,具體配置我們來看。我們在原先的告警規則中,添加CPU監控規則,如下所示:

groups:
 - name: hostStatsAlert
   rules:
   - alert: hostCpuUsageAlert
     expr: 100 * (1 - avg(irate(node_cpu_seconds_total{mode="idle"}[2m])) by(instance)) > 85
     for: 1m
     labels:
       severity: page
     annotations:
       summary: "Instance {{ $labels.instance }} CPU usgae high"
       description: "{{ $labels.instance }} CPU usage above 85% (current value: {{ $value }})"
   - alert: hostMemUsageAlert
     expr: (node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100 > 85
     for: 1m
     labels:
       severity: page
     annotations:
       summary: "Instance {{ $labels.instance }} MEM usgae high"
       description: "{{ $labels.instance }} MEM usage above 85% (current value: {{ $value }})"
   - alert: node-up
     expr: up{job="linux"} == 0
     for: 15s
     labels:
       severity: page
       team: node
     annotations:
       summary: "{{ $labels.instance }} 已停止運行超過 15s!"
       description: "{{ $labels.instance }} 檢測到異常停止!請重點關注!!!"

上述示例 hostCpuUsageAlert 規則,添加到/prometheus/rules目錄下的規則中,並重啓Prometheus服務,使配置生效。

重啓後,通過Prometheus服務查看規則,如下所示:

注意:規則配置CPU使用率超過85%則會出發警報,正常情況下,不會輕易觸發,但又想檢測下規則是否能正常觸發,將85降低即可;也可以使用命令 cat /dev/zero>/dev/null 手動拉高CPU。

消息推送

講到這,服務已經好了,規則也配置好了,但如何跟altermanager關聯起來呢,接着來看。

修改配置文件alertmanager.yml,將webhook的url修改成如下內容:

- url: 'http://ip:10/prometheusalert?type=dd&tpl=prometheus-dd&ddurl=https://oapi.dingtalk.com/robot/send?access_token=XXX'

重啓alertmanager服務,查看prometheusalert如下所示:

{{ $var := .externalURL}}{{ range $k,$v:=.alerts }}
{{if eq $v.status "resolved"}}
## [prometheus恢復信息]({{$v.generatorURL}})
#### [{{$v.labels.alertname}}]({{$var}})
###### 告警級別:{{$v.labels.level}}
###### 開始時間:{{GetCSTtime $v.startsAt}}
###### 結束時間:{{GetCSTtime $v.endsAt}}
###### 故障主機IP:{{$v.labels.instance}}
##### {{$v.annotations.description}}
![Prometheus](https://raw.githubusercontent.com/feiyu563/PrometheusAlert/master/doc/alert-center.png)
{{else}}
## [prometheus告警信息]({{$v.generatorURL}})
#### [{{$v.labels.alertname}}]({{$var}})
###### 告警級別:{{$v.labels.level}}
###### 開始時間:{{GetCSTtime $v.startsAt}}
###### 故障主機IP:{{$v.labels.instance}}
##### {{$v.annotations.description}}
![Prometheus](https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=3626076420,1196179712&fm=15&gp=0.jpg)
{{end}}
{{ end }}

一切就緒,我們來看最終效果,觸發CPU高於85%,在釘釘上查收消息推送,告警消息如下所示:

當CPU低於這個配置值時,釘釘同樣會收到恢復推送,如下所示:

服務器監控,就暫時告一段落了,自己實踐一次,也收穫頗多,再接再厲。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章