使用外部事件检测接入 CDH 大数据管理平台告警

    banner.png

    CDH 大数据管理平台

    CDH(Cloudera Distribution Hadoop)是一个企业级的大数据平台,由 Cloudera 公司提供,它包含了 Apache Hadoop 生态系统中的多种开源组件,并对其进行了优化和集成,以支持大规模数据存储、处理和分析。CDH 通过提供易于管理的界面、高级安全功能、以及对 SQL 和 NoSQL 数据模型的支持,帮助企业实现数据湖的构建、数据仓库的现代化以及实时分析等大数据需求。

    Alert Publisher

    Alert Publisher 组件是 Cloudera Manager 提供的一个服务,它负责将集群的告警信息转发到不同的目标,比如邮件、SNMP 或自定义告警脚本。Alert Publisher 服务可以配置以发送测试警报,并支持通过自定义脚本来处理和转发告警信息,使得告警信息可以根据用户的需求被发送到不同的平台,如企业微信群、钉钉群或自定义的 Webhook 服务。此外,Alert Publisher 服务还允许用户通过 Cloudera Manager 的 Web 界面配置电子邮件警报信息,包括邮件服务器设置、发件人和收件人邮箱等。通过这种方式,运维人员可以在 CDH 集群出现问题时第一时间得到通知,从而及时处理。

    外部事件检测

    观测云是一款专为 IT 工程师打造的全链路可观测产品,它集成了基础设施监控、应用程序性能监控和日志管理,为整个技术栈提供实时可观察性。这款产品能够帮助工程师全面了解端到端的用户体验追踪,了解应用内函数的每一次调用,以及全面监控云时代的基础设施。此外,观测云还具备快速发现系统安全风险的能力,为数字化时代提供安全保障。

    外部事件检测用于接收第三方系统产生的异常记录并生成相关事件。通过配置检测规则中的 Webhook 地址,第三方系统可以将异常事件或记录以 POST 请求方式发送到观测云进行统一监控和告警管理。

    操作步骤

    配置外部事件检测 API

    登陆观测云,选择监控 -> 新建监控器 -> 外部事件检测 ,填写基础信息,复制 webhook 地址,点击保存。

    配置告警策略

    在上一步创建的外部事件检测,可以配置告警策略,当系统产生事件时,根据告警策略,告警会进一步发送到通知对象,如钉钉、企业微信等。

    编写 send_alert.sh 脚本

    send_alert.sh 脚本主要用于接收 Cloudera Manager 的告警事件,并格式化数据调用 外部事件检测API 上报数据到观测云平台。需要在 Alert Publisher 所在的主机上编写 send_alert.sh 脚本。

    #!/bin/bash
    # 设置日志文件路径
    LOG_FILE="/opt/alert_hook/alert_app.log"
    
    # 设置日志级别和格式
    LOG_FORMAT="%(asctime)s - %(name)s - %(levelname)s - %(message)s"
    TZ='Asia/Shanghai'
    # 创建日志文件并设置日志格式
    touch "$LOG_FILE"
    echo "$(date '+%Y-%m-%d %H:%M:%S') 开始日志记录" >> "$LOG_FILE"
    
    # 函数:发送HTTP POST请求
    ew_robot() {
        local data="$1"
        # local webhook="https://openapi.guance.com/api/v1/push-events/xxxx"
        local webhook="<替换webook地址>"
        local headers="Content-Type: application/json"
        local response
    
        # echo "$(curl -X POST -H $headers -d $data $webhook)"
        # 使用curl发送POST请求
        response=$(curl -X POST -H "$headers" -d "$data" "$webhook")
        echo "$(date '+%Y-%m-%d %H:%M:%S') 响应结果 $response" >> "$LOG_FILE"
    }
    
    # 读取JSON数据
    # 假设JSON数据通过管道传递给脚本,如echo '{"json":"data"}' | ./script.sh
    # 这里使用jq来解析JSON,需要先安装jq工具
    cat $1 >> /opt/alert_hook/alert.log
    alert_data=$(cat $1)
    #echo $alert_data
    # 遍历JSON数组
    #IFS=$'\n' read -d '' -r -a alert_data <<< "$alert_data"
    
    jq -c '.[]' $1 | while IFS= read -r data; do
      # 在这里执行你的命令
        # 解析JSON数据
        alert=$(echo "$data" | jq -r '.body.alert')
        attr=$(echo "$data" | jq -r '.body.alert.attributes')
    # 解析JSON数据
        alert=$(echo "$data" | jq -r '.body.alert')
        attr=$(echo "$data" | jq -r '.body.alert.attributes')
    
        timestamp=$(echo "$attr" | jq -r '.__persist_timestamp[0]')
        hosts=$(echo "$attr" | jq -r '.HOSTS[0]') || hosts="-"
        service=$(echo "$attr" | jq -r '.SERVICE[0]') || service="-"
        message=$(echo  "$alert" | jq '.content|tostring')
        message=$(echo "$message" | sed 's/"//g')
        category=$(echo "$attr" | jq -r '.CATEGORY[0]')
        status=$(echo "$attr" | jq -r '.SEVERITY[0]') // 新增
    
        case "$status" in
            "IMPORTANT")
                status="error"
                ;;
            "CRITICAL")
                status="critical"
                ;;
            *)
                status="ok"
                ;;
        esac
    
        # 构建数据结构 调整 message的格式,message的格式最终会在对应的渠道里面进行展示,这里只作为模板,可以进行调整message的内容输出
        data=$(echo "{
            \"event\": {
                \"dimension_tags\": {
                    \"severity\": \"$(echo "$attr" | jq -r '.SEVERITY[0]')\",
                    \"cluster\": \"$(echo "$attr" | jq -r '.CLUSTER[0]')\",
                    \"service\": \"$service\",
                    \"hosts\": \"$hosts\",
                    \"category\": \"$category\"
                },
                \"message\": \">系统:测试\n>等级: $status \n>内容:$message\n>来源:Cloudera Manager 管理平台上报\", 
                \"status\": \"$status\",
                \"title\": \"$(echo "$attr" | jq -r '.ALERT_SUMMARY[0]')\"
            },
            \"extraData\": {
                \"event_time\": \"$timestamp\",
                \"error_source\": \"$(echo "$alert" | jq -r '.source')\"
            }
        }")
    
        # 发送请求并记录结果
        echo "$(date '+%Y-%m-%d %H:%M:%S') 请求体 $data" >> "$LOG_FILE"
        result=$(ew_robot "$data")
        
    done
    
    • dimension_tags:可以添加额外的 tag,会上报到观测云,可以配置多个
    • webhook: 调用观测云的 api 地址,需要在观测云上进行配置,参考 https://docs.guance.com/open-api/checker/receive/
    • 调整 message 的格式,message 的格式最终会在对应的渠道里面进行展示,这里只作为模板,可以进行调整 message 的内容输出

    需要改变文件归属 chown cloudera-scm:cloudera-scm -R send_alert.sh ,同时配置可执行权限 chmod +x send_alert.sh

    同时,该脚本依赖 jq 组件进行 json 格式的数据解析,jq 下载地址 https://github.com/jqlang/jq/releases

    下载完成后,需要将 jq 放到 /usr/bin 下面,然后执行 jq 命令。

    Cloudera Manager 配置脚本

    在 Alert Publisher 所在的主机上编写 send_alert.sh 脚本后,需要在 Cloudera Management Service 配置告警脚本,可以理解为这是一个 webhook,但不支持 url 的那种。

    添加 send_alert.sh 脚本,用于接收 cm 的告警并转化后推送到观测云平台。

    • 邮件格式调整为 json
    • 自定义脚本为 /opt/alert_hook/send_alert.sh

    效果展示

    可以主动在主机上 kill 一个进程,比如 HBase、Zookeeper、DataNode、NameNode 等,会触发告警,如下:

    登陆观测云平台,点击事件菜单,可以看到新产生的事件信息,并通过详情可以看到具体的内容。

    联系我们

    加入社区

    微信扫码
    加入官方交流群

    立即体验

    在线开通,按量计费,真正的云服务!

    立即开始

    选择观测云版本

    代码托管平台