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

发布于:2025-03-22 ⋅ 阅读:(78) ⋅ 点赞:(0)

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 地址,需要在观测云上进行配置,参考 【外部事件监控器】事件接受 - 观测云文档
  • 调整 message 的格式,message 的格式最终会在对应的渠道里面进行展示,这里只作为模板,可以进行调整 message 的内容输出

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

同时,该脚本依赖 jq 组件进行 json 格式的数据解析,jq 下载地址 Releases · jqlang/jq · GitHub

下载完成后,需要将 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 等,会触发告警,如下:

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