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

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 脚本。

bash 复制代码
#!/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 地址,需要在观测云上进行配置,参考 docs.guance.com/open-api/ch...
  • 调整 message 的格式,message 的格式最终会在对应的渠道里面进行展示,这里只作为模板,可以进行调整 message 的内容输出

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

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

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

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

相关推荐
小黑_深呼吸2 小时前
Prometheus实战教程:k8s平台-Redis监控案例
运维·kubernetes·prometheus·监控
小马爱打代码7 天前
Spring Boot Actuator - 应用监控与管理
spring boot·监控
ak啊16 天前
基于 Prometheus 的后端服务性能故障监控方案
监控
刘大猫2617 天前
Arthas monitor(方法执行监控)
人工智能·后端·监控
可观测性用观测云17 天前
Neo4j 可观测性最佳实践
监控
ak啊18 天前
基于Python的自动化运维中服务器性能监控与告警
python·监控
ak啊22 天前
Sentry 私有化部署监控前端应用
监控
vivo互联网技术1 个月前
vivo Trace 监控追求极致的建设历程
监控
企鹅侠客1 个月前
Prometheus告警从触发到收到通知延迟在哪?
运维·prometheus·监控
cxy_61 个月前
centos7系统搭建nagios监控
监控·nagios