本文介绍如何通过OpenClaw配置数据库监控告警,在数据库指标异常时自动通过钉钉发送包含DAS Agent智能诊断结果的告警消息。同时介绍如何配置钉钉双向对话机器人,实现自然语言交互。
适用范围
已部署OpenClaw 2026.3.28及以上版本。
已获取阿里云主账号的AccessKey ID和AccessKey Secret。
已在DAS中接入对应的数据库实例,并且接入状态显示为连接正常。
功能说明
本方案通过OpenClaw和DAS Agent实现以下两个功能:
数据库监控告警:定时监控数据库指标(CPU、内存、磁盘、IOPS、连接数),异常时通过钉钉发送告警消息,告警消息中包含DAS Agent提供的智能诊断结果和处理建议。
钉钉双向对话机器人:配置企业内部机器人,通过自然语言与OpenClaw进行对话交互。
配置数据库监控告警
步骤一:创建钉钉群机器人
打开钉钉群,选择群设置 > 智能群助手 > 添加机器人 > 自定义。
设置机器人名称,例如
数据库告警助手。安全设置选择签名,复制SECRET。
复制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 | 需要监控的数据库实例列表。格式为 |
ENABLE_DAS_DIAGNOSIS | 是否启用DAS Agent智能诊断。设为 |
DAS_SCRIPT_PATH | DAS Agent诊断脚本路径。仅在ENABLE_DAS_DIAGNOSIS为true时生效。 |
步骤三:创建监控脚本
监控脚本负责定时查询数据库指标,当指标超过阈值时自动调用DAS Agent进行诊断,并将告警和诊断结果通过钉钉发送。
执行以下命令创建脚本目录和脚本文件。
mkdir -p /home/admin/.openclaw/workspace/scripts nano /home/admin/.openclaw/workspace/scripts/db-monitor.sh将以下脚本内容粘贴到文件中。
#!/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发送到群。
保存并赋予执行权限。
chmod +x /home/admin/.openclaw/workspace/scripts/db-monitor.sh
步骤四:创建守护进程脚本
执行以下命令创建守护进程脚本。
nano /home/admin/.openclaw/workspace/scripts/db-monitor-daemon.sh将以下内容粘贴到文件中。
#!/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保存并赋予执行权限。
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. 考虑升级实例规格配置钉钉双向对话机器人
步骤一:创建钉钉应用
访问钉钉开放平台并登录企业账号。
选择。
设置应用名称,例如
Claw助手。选择,勾选接收消息。
单击发布应用。
在凭证与基础信息页面,复制AppKey和AppSecret。
步骤二:配置OpenClaw
编辑OpenClaw配置文件。
nano ~/.openclaw/openclaw.json在
auth和models之间插入以下配置。"channels": { "dingtalk-connector": { "enabled": true, "clientId": "您的AppKey", "clientSecret": "您的AppSecret" } },保存配置并重启Gateway。
openclaw gateway restart
步骤三:验证配置
检查通道状态。
openclaw channels list # 应显示:DingTalk __default__: configured, enabled在钉钉中搜索对应的机器人名称,发起对话进行测试。
文件清单
文件 | 用途 | 创建方式 |
| 配置文件 | 步骤二创建 |
| 监控脚本(含DAS诊断) | 步骤三创建 |
| 守护进程 | 步骤四创建 |
| 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 restartQ:监控脚本执行失败
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文件中。定期轮换凭据:建议阿里云AccessKey每90天轮换一次。如果钉钉Webhook泄露,请立即在钉钉群中重置。