CDP釘釘告警支持
本章節(jié)將為您介紹設(shè)置CDP釘釘告警的操作流程。
CDP支持多種告警方式,默認(rèn)支持郵件和SNMP告警,這兩種告警模式的具體配置可以參考CDP官網(wǎng)。
除以上兩種告警模式外,CDP還支持自定義告警腳本,當(dāng)集群的健康狀況觸發(fā)告警閾值,就會調(diào)用用戶自定義的告警腳本進(jìn)行告警。?
例如:
您定義的告警腳本為:/opt/cloudera/alert/alert.py
那么在告警時,會調(diào)用:/opt/cloudera/alert/alert.py error.log
將告警信息所在文件的文件名作為第一個參數(shù)傳給告警腳本。
在告警腳本中,您可以對告警內(nèi)容進(jìn)行進(jìn)一步的處理、篩選出重要的信息,然后使用HTTP請求發(fā)送給您的釘釘機(jī)器人,釘釘機(jī)器人再將這些信息轉(zhuǎn)發(fā)到群組中,實現(xiàn)釘釘告警的功能。?
在以上例子簡單說明了釘釘報警的原理,具體操作可參考下述內(nèi)容。
1. 在運維群中創(chuàng)建一個告警機(jī)器人
群組右上角:設(shè)置 -> 智能群助手 -> 添加機(jī)器人 -> 自定義 -> 添加 -> 填寫機(jī)器人信息 -> 完成 -> 將機(jī)器人的Webhook保存下來
在填寫機(jī)器人信息時,需要注意安全設(shè)置 -> 自定義關(guān)鍵詞:只有包含定義的關(guān)鍵詞的消息才會被轉(zhuǎn)發(fā),我們這里定義為CDP alert,用戶可以根據(jù)自己的需要填寫。
Webhook地址中包含了釘釘?shù)腢RL以及非常重要的access token:https://oapi.dingtalk.com/robot/send?access_token=xxx
用戶應(yīng)該將access token保存下來,這將在之后的腳本中用到。
2. 編寫告警腳本
在前面的例子已經(jīng)解釋了告警的原理,告警腳本實質(zhì)上是一個中轉(zhuǎn)站,將CDP的告警信息轉(zhuǎn)發(fā)給釘釘機(jī)器人。
這里給了一個示例腳本,在這個腳本中,用戶需要根據(jù)您的釘釘機(jī)器人設(shè)置來修改兩個常量:
access_token:需要修改為您的機(jī)器人的Webhook的query參數(shù) access_token的參數(shù)值
robot_keyword:需要修改為您在創(chuàng)建機(jī)器人時設(shè)置的自定義關(guān)鍵詞
告警腳本測試好之后可以放到 /opt/cloudera/alert
目錄下:
創(chuàng)建 alert 目錄:
cd /opt/cloudera; mkdir alert; chown cloudera-scm:cloudera-scm alert
創(chuàng)建 alert 文件:
cd /opt/cloudera/alert; touch alert.py; chown cloudera-scm:cloudera-scm alert.py; chmod +x alert.py
將測試好的腳本copy到alert.py文件中
#!/usr/bin/python3
import sys
import urllib.request
import json
MAX_RETRIES = 3
# 需要根據(jù)釘釘群的機(jī)器人webhook進(jìn)行修改
access_token = "xxx"
# 關(guān)鍵詞:關(guān)鍵詞應(yīng)該和釘釘機(jī)器人的自定義關(guān)鍵詞相同,否則不會轉(zhuǎn)發(fā)消息,會返回300錯誤碼
robot_keyword = "CDP alert"
def sent_ding_talk(token: str, alert_content, retry_times: int = 1) -> bool:
if retry_times > MAX_RETRIES:
return False
webhook = "https://oapi.dingtalk.com/robot/send?access_token={}".format(token)
headers = {'Content-Type': 'application/json'}
msg = {
'msgtype': 'text',
'text': {
"content": alert_content
}
}
post_data = json.dumps(msg).encode('utf-8')
req = urllib.request.Request(url=webhook, data=post_data, headers=headers, method='POST')
response = json.load(urllib.request.urlopen(req))
if 'errmsg' in response and response['errmsg'] != 'ok':
sent_ding_talk(token, alert_content, retry_times + 1)
else:
return True
def test_send_ding_talk():
assert sent_ding_talk(access_token, robot_keyword)
if __name__ == '__main__':
with open(sys.argv[1], 'r') as f:
errors = json.load(f)
for error in errors:
# 告警內(nèi)容中一定要包含在機(jī)器人安全設(shè)置中的自定義關(guān)鍵詞,否則機(jī)器人不會轉(zhuǎn)發(fā)告警內(nèi)容
alert_content = robot_keyword + ", "
if error['header']['type'] == 'alert':
# 需要更多報警信息,可以參照告警的JSON格式:
# https://docs.cloudera.com/cloudera-manager/7.4.2/monitoring-and-diagnostics/topics/cm-alerts-script.html
# 選擇感興趣或者關(guān)鍵的字段
alert_content += "occur time: " + error['body']['alert']['timestamp']['iso8601']
alert_content += ", alert summary: " + error['body']['alert']['attributes']['ALERT_SUMMARY'][0]
alert_content += ", alert detail: " + error['body']['alert']['content']
sent_ding_talk(access_token, alert_content)
3. 在CM界面進(jìn)行配置
Administration -> Alerts -> Custom Alert Script
腳本路徑alert script path:
/opt/cloudera/alert/alert.py
,配置好之后點擊右下角的Save Changes點擊右上角的按鈕:
Restart this Alert Publisher
等重啟之后,點擊右上角的
Send Test Alert
如果一切順利,那么在釘釘群就能收到告警信息了