DAS Agent+OpenClaw:实现钉钉上自动接收异常告警及诊断结果

更新时间:
复制为 MD 格式

本文介绍如何通过OpenClaw配置数据库监控告警,在数据库指标异常时自动通过钉钉发送包含DAS Agent智能诊断结果的告警消息。同时介绍如何配置钉钉双向对话机器人,实现自然语言交互。

适用范围

  • 已部署OpenClaw 2026.3.28及以上版本。

  • 已获取阿里云主账号的AccessKey IDAccessKey Secret。

  • 已在DAS中接入对应的数据库实例,并且接入状态显示为连接正常

功能说明

本方案通过OpenClawDAS Agent实现以下两个功能:

  • 数据库监控告警:定时监控数据库指标(CPU、内存、磁盘、IOPS、连接数),异常时通过钉钉发送告警消息,告警消息中包含DAS Agent提供的智能诊断结果和处理建议。

  • 钉钉双向对话机器人:配置企业内部机器人,通过自然语言与OpenClaw进行对话交互。

配置数据库监控告警

步骤一:创建钉钉群机器人

  1. 打开钉钉群,选择群设置 > 智能群助手 > 添加机器人 > 自定义

  2. 设置机器人名称,例如数据库告警助手

  3. 安全设置选择签名,复制SECRET。

  4. 复制Webhook URL(完整URL,包含所有参数)。

Webhook格式示例:

https://oapi.dingtalk.com/robot/send?access_token=xxx

步骤二:创建配置文件(.env)

执行以下命令创建配置文件:

nano /home/admin/.openclaw/.env

在配置文件中填入以下内容(请替换为您的实际配置):

# ==================== 阿里云凭据 ====================
ALIBABA_CLOUD_ACCESS_KEY_ID=您的AccessKeyID
ALIBABA_CLOUD_ACCESS_KEY_SECRET=您的AccessKeySecret

# ==================== 钉钉配置 ====================
DING_WEBHOOK=您的钉钉Webhook URL

# ==================== 监控配置 ====================
# 告警阈值(百分比)
CPU_THRESHOLD=80
MEMORY_THRESHOLD=80
DISK_THRESHOLD=85
IOPS_THRESHOLD=80
CONNECTION_THRESHOLD=80

# 需要监控的实例列表
# 格式:实例ID:实例名称:区域:数据库类型
MONITOR_INSTANCES=(
  "实例ID1:订单数据库:cn-hangzhou:rds-mysql"
  "实例ID2:用户数据库:cn-shanghai:rds-mysql"
  "实例ID3:缓存集群:cn-hangzhou:redis"
)

# DAS Agent诊断配置(可选)
ENABLE_DAS_DIAGNOSIS=true
DAS_SCRIPT_PATH=/home/admin/.openclaw/workspace/skills/database-operations-das/scripts/call_das_agent.py

保存并设置权限:

chmod 600 /home/admin/.openclaw/.env

配置参数说明如下。

参数

说明

ALIBABA_CLOUD_ACCESS_KEY_ID

阿里云AccessKey ID。

ALIBABA_CLOUD_ACCESS_KEY_SECRET

阿里云AccessKey Secret。

DING_WEBHOOK

钉钉群机器人的Webhook URL。

CPU_THRESHOLD等阈值参数

各监控指标的告警阈值,单位为百分比。超过阈值时触发告警。

MONITOR_INSTANCES

需要监控的数据库实例列表。格式为实例ID:实例名称:区域:数据库类型。支持的数据库类型包括rds-mysql、rds-pg、rds-sqlserver、polarbox-mysql、polarbox-pg、redismongodb。

ENABLE_DAS_DIAGNOSIS

是否启用DAS Agent智能诊断。设为true时,告警消息中将包含DAS Agent的诊断结果和优化建议。

DAS_SCRIPT_PATH

DAS Agent诊断脚本路径。仅在ENABLE_DAS_DIAGNOSIStrue时生效。

步骤三:创建监控脚本

监控脚本负责定时查询数据库指标,当指标超过阈值时自动调用DAS Agent进行诊断,并将告警和诊断结果通过钉钉发送。

  1. 执行以下命令创建脚本目录和脚本文件。

    mkdir -p /home/admin/.openclaw/workspace/scripts
    nano /home/admin/.openclaw/workspace/scripts/db-monitor.sh
  2. 将以下脚本内容粘贴到文件中。

    #!/bin/bash
    # 数据库监控脚本 - 含 DAS 智能诊断
    # 配置从 .env 文件读取,告警包含 DAS 诊断结果
    # ==================== 加载配置文件 ====================
    ENV_FILE="/home/admin/.openclaw/.env"
    if [ ! -f "$ENV_FILE" ]; then
      echo "[$(date '+%Y-%m-%d %H:%M:%S')] 错误:配置文件不存在:$ENV_FILE"
      exit 1
    fi
    # 加载环境变量
    set -a
    source "$ENV_FILE"
    set +a
    # ==================== 默认配置 ====================
    CPU_THRESHOLD=${CPU_THRESHOLD:-80}
    MEMORY_THRESHOLD=${MEMORY_THRESHOLD:-80}
    DISK_THRESHOLD=${DISK_THRESHOLD:-85}
    IOPS_THRESHOLD=${IOPS_THRESHOLD:-80}
    CONNECTION_THRESHOLD=${CONNECTION_THRESHOLD:-80}
    ENABLE_DAS_DIAGNOSIS=${ENABLE_DAS_DIAGNOSIS:-true}
    DAS_SCRIPT_PATH=${DAS_SCRIPT_PATH:-/home/admin/.openclaw/workspace/skills/database-operations-das/scripts/call_das_agent.py}
    # 颜色定义
    RED='\033[0;31m'
    GREEN='\033[0;32m'
    YELLOW='\033[1;33m'
    NC='\033[0m'
    # 日志函数
    log() {
      echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"
    }
    # 调用 DAS Agent 进行诊断
    run_das_diagnosis() {
      local instance_id="$1"
      local metric_name="$2"
      
      # 检查 DAS script 是否存在
      if [ ! -f "$DAS_SCRIPT_PATH" ]; then
        log "${YELLOW}DAS 脚本不存在,跳过诊断${NC}"
        return 1
      fi
      
      # 构造诊断问题
      local question="实例 $instance_id 的${metric_name}使用率过高,请分析原因并给出优化建议"
      
      log "调用 DAS Agent 进行诊断:$instance_id - $metric_name"
      
      # 调用 DAS script(使用 pipe 模式,输出到 stderr)
      local diagnosis=$(cd "$(dirname "$DAS_SCRIPT_PATH")" && python3 "$DAS_SCRIPT_PATH" -q "$question" --pipe 2>&1 | grep -A 1000 "DAS_AGENT_ANSWER_START" | grep -B 1000 "DAS_AGENT_ANSWER_END" | sed '/DAS_AGENT_ANSWER_START/d' | sed '/DAS_AGENT_ANSWER_END/d')
      
      if [ -n "$diagnosis" ]; then
        echo "$diagnosis"
        return 0
      else
        log "${YELLOW}DAS 诊断失败${NC}"
        return 1
      fi
    }
    # 发送钉钉告警(含 DAS 诊断)
    send_alert() {
      local instance_id="$1"
      local instance_name="$2"
      local db_type="$3"
      local metric_name="$4"
      local metric_value="$5"
      local threshold="$6"
      local region="$7"
      
      # 获取 DAS 诊断结果(如果启用)
      local das_diagnosis=""
      if [ "$ENABLE_DAS_DIAGNOSIS" = "true" ]; then
        das_diagnosis=$(run_das_diagnosis "$instance_id" "$metric_name")
      fi
      
      # 构造告警消息
      local MESSAGE="## 【DB-Monitor】 数据库告警
    ### 实例信息
    - **实例 ID**: \`$instance_id\`
    - **实例名称**: $instance_name
    - **数据库类型**: $db_type
    - **区域**: $region
    ### 告警指标
    - **指标名称**: $metric_name
    - **当前值**: ${metric_value}%
    - **告警阈值**: ${threshold}%
    - **告警级别**: $(get_alert_level "$metric_value")
    $(if [ -n "$das_diagnosis" ]; then
    echo "### DAS 智能诊断
    $das_diagnosis"
    else
    echo "### 处理建议
    $(get_suggestion "$metric_name")"
    fi)
    ---
    - **告警时间**: $(date '+%Y-%m-%d %H:%M:%S')
    - **监控助手**: DB-Monitor + DAS Agent"
      # 发送钉钉消息
      local response=$(curl "$DING_WEBHOOK" \
        -H 'Content-Type: application/json' \
        --data-raw "{\"msgtype\": \"markdown\", \"markdown\": {\"title\": \"【DB-Monitor】数据库告警\", \"text\": \"$MESSAGE\"}}" \
        2>/dev/null)
      
      if echo "$response" | grep -q '"errcode":0'; then
        log "${GREEN}告警已发送${NC}: $instance_name - $metric_name: ${metric_value}%"
        if [ -n "$das_diagnosis" ]; then
          log "${GREEN}包含 DAS 诊断结果${NC}"
        fi
      else
        log "${RED}告警发送失败${NC}: $response"
      fi
    }
    # 获取告警级别
    get_alert_level() {
      local value="$1"
      if [ $(echo "$value > 95" | bc -l) -eq 1 ]; then
        echo "严重"
      elif [ $(echo "$value > 85" | bc -l) -eq 1 ]; then
        echo "紧急"
      elif [ $(echo "$value > 75" | bc -l) -eq 1 ]; then
        echo "警告"
      else
        echo "注意"
      fi
    }
    # 获取处理建议(备用,DAS 不可用时)
    get_suggestion() {
      local metric="$1"
      case "$metric" in
        "CPU")
          echo "1. 检查慢查询日志,优化 Top 10 慢 SQL
    2. 查看当前活跃连接数
    3. 考虑升级实例规格"
          ;;
        "内存")
          echo "1. 检查是否有内存泄漏
    2. 优化大查询和临时表"
          ;;
        "磁盘")
          echo "1. 清理过期数据和日志
    2. 考虑扩容磁盘"
          ;;
        "IOPS")
          echo "1. 优化索引减少 IO
    2. 考虑升级规格"
          ;;
        "连接数")
          echo "1. 检查应用连接池配置
    2. 终止空闲连接"
          ;;
        *)
          echo "1. 查看监控趋势
    2️⃣ 分析异常原因"
          ;;
      esac
    }
    # 查询指标值
    query_metric() {
      local instance_id="$1"
      local namespace="$2"
      local metric_name="$3"
      local region="$4"
      
      local response=$(aliyun cms DescribeMetricList \
        --Namespace "$namespace" \
        --MetricName "$metric_name" \
        --Dimensions "{\"instanceId\":\"$instance_id\"}" \
        --Period 60 \
        --Length 1 \
        --RegionId "$region" \
        2>/dev/null)
      
      echo "$response" | jq -r '.Datapoints' | jq -r '.[0].Average' 2>/dev/null
    }
    # 检查指标是否超过阈值
    check_threshold() {
      local metric="$1"
      local value="$2"
      
      case "$metric" in
        "CPU") [ $(echo "$value > $CPU_THRESHOLD" | bc -l) -eq 1 ] && return 0 ;;
        "内存"|"Redis 内存"|"MongoDB 内存") [ $(echo "$value > $MEMORY_THRESHOLD" | bc -l) -eq 1 ] && return 0 ;;
        "磁盘") [ $(echo "$value > $DISK_THRESHOLD" | bc -l) -eq 1 ] && return 0 ;;
        "IOPS") [ $(echo "$value > $IOPS_THRESHOLD" | bc -l) -eq 1 ] && return 0 ;;
        "连接数"|"Redis 连接数") [ $(echo "$value > $CONNECTION_THRESHOLD" | bc -l) -eq 1 ] && return 0 ;;
      esac
      return 1
    }
    # 主函数
    main() {
      log "开始数据库监控检查..."
      
      # 检查必要配置
      if [ -z "$DING_WEBHOOK" ]; then
        log "${RED}错误:DING_WEBHOOK 未配置${NC}"
        exit 1
      fi
      
      if [ -z "$ALIBABA_CLOUD_ACCESS_KEY_ID" ]; then
        log "${RED}错误:阿里云凭据未配置${NC}"
        exit 1
      fi
      
      if [ ${#MONITOR_INSTANCES[@]} -eq 0 ]; then
        log "${RED}错误:未配置监控实例列表${NC}"
        exit 1
      fi
      
      # 检查 DAS 配置
      if [ "$ENABLE_DAS_DIAGNOSIS" = "true" ]; then
        if [ -f "$DAS_SCRIPT_PATH" ]; then
          log "${GREEN}DAS 诊断已启用${NC}"
        else
          log "${YELLOW}DAS 脚本不存在,将使用基础建议${NC}"
          ENABLE_DAS_DIAGNOSIS=false
        fi
      fi
      
      local alert_count=0
      
      # 遍历所有实例
      for instance_config in "${MONITOR_INSTANCES[@]}"; do
        IFS=':' read -r instance_id instance_name region db_type <<< "$instance_config"
        
        log "检查实例:$instance_name ($instance_id)"
        
        # 根据数据库类型选择指标
        local metrics_to_check=()
        case "$db_type" in
          rds-mysql|rds-pg|rds-sqlserver|polarbox-mysql|polarbox-pg)
            metrics_to_check=("CPU:acs_rds_dashboard:CpuUsage" "内存:acs_rds_dashboard:MemoryUsage" "磁盘:acs_rds_dashboard:DiskUsage")
            ;;
          redis)
            metrics_to_check=("Redis 内存:acs_kvstore:UsedMemory" "Redis 连接数:acs_kvstore:ConnectionUsage")
            ;;
          mongodb)
            metrics_to_check=("MongoDB CPU:acs_mongodb:CpuUsage" "MongoDB 内存:acs_mongodb:MemoryUsage")
            ;;
          *)
            log "${YELLOW}未知的数据库类型:$db_type${NC}"
            continue
            ;;
        esac
        
        # 检查每个指标
        for metric_config in "${metrics_to_check[@]}"; do
          IFS=':' read -r metric_display namespace metric_name <<< "$metric_config"
          
          local value=$(query_metric "$instance_id" "$namespace" "$metric_name" "$region")
          
          if [ -z "$value" ]; then
            log "${YELLOW}无法获取指标:$instance_name - $metric_display${NC}"
            continue
          fi
          
          if check_threshold "$metric_display" "$value"; then
            log "${RED}告警${NC}: $instance_name - $metric_display: ${value}%"
            send_alert "$instance_id" "$instance_name" "$db_type" "$metric_display" "$value" "$threshold" "$region"
            ((alert_count++))
          else
            log "${GREEN}正常${NC}: $instance_name - $metric_display: ${value}%"
          fi
        done
      done
      
      log "监控检查完成,共发现 $alert_count 个告警"
    }
    main

    该脚本实现以下功能:

    • .env文件加载配置。

    • 遍历所有监控实例,通过阿里云CLI查询各项指标。

    • 当指标超过阈值时,调用DAS Agent进行智能诊断。

    • 将告警信息和DAS诊断结果通过钉钉Webhook发送到群。

  3. 保存并赋予执行权限。

    chmod +x /home/admin/.openclaw/workspace/scripts/db-monitor.sh

步骤四:创建守护进程脚本

  1. 执行以下命令创建守护进程脚本。

    nano /home/admin/.openclaw/workspace/scripts/db-monitor-daemon.sh
  2. 将以下内容粘贴到文件中。

    #!/bin/bash
    # 数据库监控守护进程 - 每分钟执行一次
    
    LOG_FILE="/tmp/db-monitor.log"
    SCRIPT="/home/admin/.openclaw/workspace/scripts/db-monitor.sh"
    
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] 数据库监控守护进程启动" >> "$LOG_FILE"
    
    while true; do
        bash "$SCRIPT" >> "$LOG_FILE" 2>&1
        sleep 60
    done
  3. 保存并赋予执行权限。

    chmod +x /home/admin/.openclaw/workspace/scripts/db-monitor-daemon.sh

步骤五(可选):安装DAS Agent Skill

DAS Agent Skill可提供更智能的数据库诊断能力。如果您已安装可跳过此步骤。

# Skill位置(如果已上传)
/home/admin/.openclaw/workspace/skills/database-operations-das/

# 测试DAS诊断
export ALIBABA_CLOUD_ACCESS_KEY_ID=您的AccessKeyID
export ALIBABA_CLOUD_ACCESS_KEY_SECRET=您的AccessKeySecret
cd /home/admin/.openclaw/workspace/skills/database-operations-das/scripts
python3 call_das_agent.py -q "实例rm-xxx的CPU过高,请分析原因" --pipe

步骤六:启动监控

执行以下命令在后台启动监控守护进程:

nohup /home/admin/.openclaw/workspace/scripts/db-monitor-daemon.sh > /tmp/db-monitor-daemon.log 2>&1 &
echo "守护进程PID: $!"
ps aux | grep db-monitor-daemon | grep -v grep

步骤七:验证监控

通过以下命令验证监控是否正常运行:

# 1. 查看进程
ps aux | grep db-monitor-daemon

# 2. 查看日志
tail -f /tmp/db-monitor.log

# 3. 手动测试
/home/admin/.openclaw/workspace/scripts/db-monitor.sh

告警消息示例如下:

【DB-Monitor】数据库告警

实例信息
- 实例ID:rm-xxx
- 实例名称:订单数据库
- 数据库类型:rds-mysql
- 区域:cn-hangzhou

告警指标
- 指标名称:CPU
- 当前值:85.3%
- 告警阈值:80%
- 告警级别:紧急

DAS智能诊断=
基于对您RDS MySQL实例的全面分析,CPU过高的原因如下:
1. 慢查询导致CPU持续高负载
2. 缺少合适的索引

优化建议:
1. 为orders表添加复合索引(product_id, status)
2. 优化慢查询SQL,避免全表扫描
3. 考虑升级实例规格

配置钉钉双向对话机器人

步骤一:创建钉钉应用

  1. 访问钉钉开放平台并登录企业账号。

  2. 选择应用开发 > 创建应用 > 企业内部应用

  3. 设置应用名称,例如Claw助手

  4. 选择添加能力 > 机器人,勾选接收消息

  5. 单击发布应用

  6. 凭证与基础信息页面,复制AppKeyAppSecret。

步骤二:配置OpenClaw

  1. 编辑OpenClaw配置文件。

    nano ~/.openclaw/openclaw.json
  2. authmodels之间插入以下配置。

    "channels": {
      "dingtalk-connector": {
        "enabled": true,
        "clientId": "您的AppKey",
        "clientSecret": "您的AppSecret"
      }
    },
  3. 保存配置并重启Gateway。

    openclaw gateway restart

步骤三:验证配置

  1. 检查通道状态。

    openclaw channels list
    # 应显示:DingTalk __default__: configured, enabled
  2. 在钉钉中搜索对应的机器人名称,发起对话进行测试。

文件清单

文件

用途

创建方式

/home/admin/.openclaw/.env

配置文件

步骤二创建

/home/admin/.openclaw/workspace/scripts/db-monitor.sh

监控脚本(含DAS诊断)

步骤三创建

/home/admin/.openclaw/workspace/scripts/db-monitor-daemon.sh

守护进程

步骤四创建

~/.openclaw/openclaw.json

OpenClaw配置

编辑现有文件

常见问题

Q:告警不包含DAS诊断结果

A:请检查以下配置:

  • 确认.env文件中ENABLE_DAS_DIAGNOSIS=true

  • 确认DAS Agent脚本路径正确且文件存在。

  • 查看日志中DAS相关信息:grep "DAS" /tmp/db-monitor.log

Q:钉钉机器人不回复

A:请执行以下命令检查并重启:

openclaw channels list
openclaw gateway restart

Q:监控脚本执行失败

A:请检查配置文件和阿里云CLI:

# 检查配置
cat /home/admin/.openclaw/.env

# 检查阿里云CLI
which aliyun
aliyun configure list

# 手动调试
bash -x /home/admin/.openclaw/workspace/scripts/db-monitor.sh

安全建议

  • 保护.env文件:确保文件权限为600(chmod 600 /home/admin/.openclaw/.env)。

  • 不要提交到Git:将.env添加到.gitignore文件中。

  • 定期轮换凭据:建议阿里云AccessKey90天轮换一次。如果钉钉Webhook泄露,请立即在钉钉群中重置。