CDP钉钉告警支持
本章节将为您介绍设置CDP钉钉告警的操作流程。
CDP支持多种告警方式,默认支持邮件和SNMP告警,这两种告警模式的具体配置可以参考CDP官网。
除以上两种告警模式外,CDP还支持自定义告警脚本,当集群的健康状况触发告警阈值,就会调用用户自定义的告警脚本进行告警。
例如:
您定义的告警脚本为:/opt/cloudera/alert/alert.py
那么在告警时,会调用:/opt/cloudera/alert/alert.py error.log
将告警信息所在文件的文件名作为第一个参数传给告警脚本。
在告警脚本中,您可以对告警内容进行进一步的处理、筛选出重要的信息,然后使用HTTP请求发送给您的钉钉机器人,钉钉机器人再将这些信息转发到群组中,实现钉钉告警的功能。
在以上例子简单说明了钉钉报警的原理,具体操作可参考下述内容。
1. 在运维群中创建一个告警机器人
群组右上角:设置 -> 智能群助手 -> 添加机器人 -> 自定义 -> 添加 -> 填写机器人信息 -> 完成 -> 将机器人的Webhook保存下来
在填写机器人信息时,需要注意安全设置 -> 自定义关键词:只有包含定义的关键词的消息才会被转发,我们这里定义为CDP alert,用户可以根据自己的需要填写。
Webhook地址中包含了钉钉的URL以及非常重要的access token:https://oapi.dingtalk.com/robot/send?access_token=xxx
用户应该将access token保存下来,这将在之后的脚本中用到。
2. 编写告警脚本
在前面的例子已经解释了告警的原理,告警脚本实质上是一个中转站,将CDP的告警信息转发给钉钉机器人。
这里给了一个示例脚本,在这个脚本中,用户需要根据您的钉钉机器人设置来修改两个常量:
access_token:需要修改为您的机器人的Webhook的query参数 access_token的参数值
robot_keyword:需要修改为您在创建机器人时设置的自定义关键词
告警脚本测试好之后可以放到 /opt/cloudera/alert
目录下:
创建 alert 目录:
cd /opt/cloudera; mkdir alert; chown cloudera-scm:cloudera-scm alert
创建 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
# 需要根据钉钉群的机器人webhook进行修改
access_token = "xxx"
# 关键词:关键词应该和钉钉机器人的自定义关键词相同,否则不会转发消息,会返回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:
# 告警内容中一定要包含在机器人安全设置中的自定义关键词,否则机器人不会转发告警内容
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
# 选择感兴趣或者关键的字段
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界面进行配置
Administration -> Alerts -> Custom Alert Script
脚本路径alert script path:
/opt/cloudera/alert/alert.py
,配置好之后点击右下角的Save Changes点击右上角的按钮:
Restart this Alert Publisher
等重启之后,点击右上角的
Send Test Alert
如果一切顺利,那么在钉钉群就能收到告警信息了