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保存下来,这将在之后的脚本中用到。

image.pngimage.png

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

  • 如果一切顺利,那么在钉钉群就能收到告警信息了