1. 项目概述:当告警遇上智能体

最近在折腾运维监控体系,最头疼的就是告警风暴。半夜被一堆“狼来了”的告警吵醒,爬起来一看,CPU使用率80%,内存使用率85%,磁盘IO有点高……全是些需要人工二次判断的“噪音”。处理吧,价值不大;不处理吧,万一真有问题呢?这种重复、低效的告警确认工作,消耗了团队大量精力。直到我尝试将OpenClaw这个AI智能体框架引入到告警处理流程中,情况才开始发生根本性的变化。

简单来说,这个项目的核心就是: 用OpenClaw构建一个能理解告警内容、自动进行初步诊断、并执行预设响应动作的“虚拟值班员” 。它不再是简单的规则转发或关键词匹配,而是通过大语言模型(LLM)理解告警的语义,结合上下文(如历史数据、关联指标)进行智能研判,最终决定是静默、通知、还是自动修复。比如,一条“服务器A的Nginx进程退出”的告警,OpenClaw智能体可以自动尝试重启Nginx服务,并在成功后标记告警为“已自动处理”;如果重启失败,则升级告警级别,并附上详细的错误日志摘要,直接推送给对应负责人。这样一来,第一线的过滤和简单处置完全自动化,工程师只需要处理真正复杂、需要深度介入的问题。

这个方案特别适合中小型技术团队或DevOps工程师,你们可能已经用上了Prometheus、Zabbix、云监控等工具,告警渠道也接入了钉钉、飞书或企业微信,但缺乏一个“大脑”来串联这些环节,实现告警的闭环管理。通过OpenClaw,我们可以用相对低的成本,为现有的监控栈赋予“思考”和“动手”的能力。

2. 核心设计:构建一个会思考的告警处理流水线

实现自动化告警,绝不是简单地把告警消息扔给大模型然后转发回复。我们需要设计一个稳健的、可解释的、且具备安全边界的处理流水线。我的整体思路是“感知-理解-决策-执行”四步闭环,并将OpenClaw作为这个闭环的“中枢神经系统”。

2.1 流水线架构与组件选型

整个系统的架构可以看作一个事件驱动的工作流:

  1. 事件采集层 :各类监控系统(如Prometheus Alertmanager, Zabbix, 云监控)产生原始告警事件。
  2. 事件网关 :一个统一的接收入口(例如一个简单的Webhook服务),负责接收所有告警,进行初步格式化,并放入消息队列(如Redis Streams/RabbitMQ)。这一步是为了解耦和缓冲,避免告警洪峰冲垮后续处理服务。
  3. OpenClaw智能体层 :这是核心。部署一个或多个OpenClaw智能体,从消息队列消费告警事件。每个智能体被赋予特定的“技能”(Skill)和“知识”,例如“Linux系统诊断技能”、“网络连通性检查技能”、“数据库慢查询分析技能”。
  4. 动作执行层 :智能体决策后,通过调用预定义的“工具”(Tool)来执行动作。这些工具可以是:
    • 内部API调用 :通过HTTP请求调用内部运维平台接口,如重启服务、扩容节点、创建工单。
    • 命令行执行 :在受控的跳板机或Agent上执行安全的Shell命令(需极其谨慎,并有严格的权限和命令白名单控制)。
    • 外部通知 :调用钉钉、飞书、企业微信的机器人接口发送富文本通知。
  5. 状态与知识库 :需要一个存储来记录告警的处理状态、智能体的决策日志以及积累的处置经验(向量知识库),用于后续相似告警的快速匹配和决策优化。

为什么选择OpenClaw而不是直接调用大模型API? 直接调用API(如OpenAI GPT, 国内大模型)当然可以,但OpenClaw提供了更符合运维场景的抽象层。它将大模型、工具调用、记忆、技能规划封装成“智能体”的概念,内置了对话管理、工具执行编排、安全沙箱(针对代码执行技能)等能力。我们不需要从零开始设计智能体的思考循环(ReAct模式等),而是通过配置和编写具体的Skill来快速构建能力。此外,OpenClaw支持本地化部署(搭配Ollama等本地模型服务),对于处理敏感的运维数据(服务器信息、日志片段)而言,安全和隐私性更有保障。

2.2 智能体的“技能”设计与知识灌输

OpenClaw智能体的能力取决于我们为其装备的“技能”和“知识”。对于告警处理场景,我设计了以下几类核心技能:

  1. 告警解析与富化技能

    • 功能 :将原始的、可能很晦涩的告警信息(如Prometheus的 ALERT {alertname=“HighCPUUsage” …} )转换成自然语言描述,并自动关联、查询相关的上下文信息进行富化。
    • 实现 :编写一个Skill,其核心是提示词工程。例如,提示词模板会要求模型:“你是一个资深运维专家。请将以下JSON格式的告警翻译成一句清晰的中文问题描述。然后,根据告警中的 instance 标签,推测这可能是什么服务,并列出3条最可能的原因和1条建议的初步检查命令。”
    • 知识富化 :在这个Skill中,可以内置调用内部CMDB(配置管理数据库)的Tool,根据主机名(instance)自动获取该服务器的负责人、所属业务、重要等级等信息,一并提供给模型,使其决策更精准。
  2. 根因分析与决策技能

    • 功能 :基于富化后的告警信息,进行根因分析,并决定处置策略。
    • 实现 :这是最复杂的技能。我们需要为模型提供“决策框架”。例如,通过提示词定义决策树逻辑:“请按以下顺序分析:1. 是否为已知的批量问题或维护窗口期?2. 关联指标是否异常(如高CPU是否伴随高流量)?3. 是否有近期的变更记录?4. 根据以上分析,给出决策:A. 自动处理(需指定具体工具),B. 升级通知(指定通知人和级别),C. 仅记录观察。”
    • 工具调用 :此技能可以调用“执行命令”工具来运行一些诊断命令(如 top -bn1 , ss -tlnp , df -h ),将结果返回给模型进行进一步分析。
  3. 自动处置与通知技能

    • 功能 :执行决策技能输出的具体动作。
    • 实现 :为每一种可自动化的处置动作编写对应的Tool。例如:
      • restart_service_tool(host, service_name) : 通过Ansible或SSH到指定主机重启服务。
      • scale_up_pod_tool(deployment_name, namespace) : 调用Kubernetes API扩容Pod。
      • send_alert_to_feishu_tool(alert_info, decision, action_taken) : 发送结构化通知到飞书群,包含告警详情、智能体分析过程和采取的行动。

注意:安全是生命线 。所有执行类Tool必须有严格的权限控制和操作确认机制。初期建议所有“写操作”(重启、扩容)都需要在通知中明确提示,并设置一个手动确认环节,或者仅对预定义的、低风险的服务进行操作。可以设计一个“演练模式”,智能体正常分析并生成处置方案,但最终执行步骤替换为发送模拟执行报告。

3. 实战部署:从零搭建OpenClaw告警处理中心

理论讲完,我们来点实在的。下面是我在Ubuntu服务器上,使用Docker-Compose快速部署OpenClaw,并配置对接Prometheus Alertmanager的全过程。

3.1 基础环境与OpenClaw部署

首先,准备一台有Docker和Docker-Compose的Linux服务器(2核4G以上配置较稳妥)。

# docker-compose.yml
version: '3.8'

services:
  openclaw:
    image: openwebui/openclaw:latest # 使用官方镜像
    container_name: openclaw
    restart: unless-stopped
    ports:
      - "3000:8080" # OpenClaw Web界面
    environment:
      - OLLAMA_BASE_URL=http://ollama:11434 # 连接Ollama服务
      - DEFAULT_MODEL=llama3.2:1b # 默认使用的模型,可根据需要调整
      - OPENCLAW_API_KEY=your_secret_api_key_here # 用于API调用的密钥
    volumes:
      - ./openclaw_data:/app/data
    depends_on:
      - ollama
    networks:
      - ai-net

  ollama:
    image: ollama/ollama:latest
    container_name: ollama
    restart: unless-stopped
    ports:
      - "11434:11434"
    volumes:
      - ./ollama_data:/root/.ollama
    networks:
      - ai-net
    # 为了提升性能,可以部署更强大的模型,如qwen2.5:7b
    command: serve

  redis:
    image: redis:7-alpine
    container_name: openclaw-redis
    restart: unless-stopped
    ports:
      - "6379:6379"
    volumes:
      - ./redis_data:/data
    networks:
      - ai-net

networks:
  ai-net:
    driver: bridge

使用 docker-compose up -d 启动后,访问 http://你的服务器IP:3000 就能看到OpenClaw的Web界面。首次进入需要设置管理员账号。

关键配置点

  • OLLAMA_BASE_URL :必须正确指向Ollama服务的地址。在Docker Compose网络内,使用服务名 ollama
  • DEFAULT_MODEL :指定OpenClaw默认对话使用的模型。对于告警分析这种需要一定逻辑推理的场景,建议使用7B参数以上的模型,如 llama3.1:8b qwen2.5:7b 。需要在Ollama容器内提前拉取 ( docker exec ollama ollama pull qwen2.5:7b )。
  • 数据持久化 :通过volumes将 openclaw_data ollama_data redis_data 目录挂载到本地,防止容器重启后数据丢失。

3.2 构建告警处理智能体与技能

在OpenClaw的Web界面中,我们可以通过“技能工作室”来创建和编排技能。

  1. 创建“告警解析器”技能

    • 在技能工作室点击“新建技能”。
    • 技能名称 alert_parser_and_enricher
    • 描述 :解析原始告警JSON,并富化业务信息。
    • 提示词系统设定
      你是一个冷静的运维值班机器人。你的任务是将冰冷的告警数据转化为人类可读、包含上下文的分析简报。
      用户会给你一段JSON格式的告警数据。你需要:
      1. 提取关键字段:告警名称(alertname)、告警级别(severity)、故障主机(instance)、摘要(annotations.summary)、详情(annotations.description)。
      2. 生成一句核心问题描述,例如:“[严重] 生产环境Web服务器 (10.0.0.1) CPU使用率持续超过90%已达5分钟。”
      3. 根据主机IP(instance),调用工具 `query_cmdb_tool` 获取该主机的负责人、所属应用、重要等级。
      4. 结合告警名称和摘要,推测可能的影响范围(单点/集群)和最可能的三个原因。
      最终输出一个格式清晰的Markdown报告。
      
    • 绑定工具 :在这里关联一个我们预先编写好的 query_cmdb_tool (这是一个HTTP工具,调用内部CMDB的API)。如果暂无CMDB,可以跳过或模拟返回固定信息。
  2. 创建“诊断与决策”技能

    • 技能名称 alert_diagnosis_and_decision
    • 描述 :对富化后的告警进行分析,并给出处置决策。
    • 提示词系统设定 (这是一个更复杂的多步思考提示):
      你是一个经验丰富的SRE工程师。现在你收到一份告警分析简报。
      你的思考必须严格遵循以下步骤:
      【步骤1:信息确认】
      复述告警核心问题、影响主机和负责人。
      
      【步骤2:关联检查】
      思考是否需要查看关联指标来确认问题?例如:
      - 如果是CPU高,是否需要同时查看该主机的内存、磁盘IO和网络流量?
      - 如果是服务不可用,是否需要检查上下游依赖服务状态?
      (如果需要,请调用 `query_prometheus_tool` 工具查询相关指标,如 `rate(node_cpu_seconds_total{mode=\"idle\",instance=\"<主机>\"}[5m])`)
      
      【步骤3:变更回溯】
      检查该主机或应用近期是否有过变更(发布、配置修改)?可以调用 `query_change_tool`。
      
      【步骤4:决策制定】
      基于以上所有信息,从以下选项中选择最合适的行动方案:
      A. 自动修复:问题明确且处置动作安全(例如,重启已知的、无状态的非核心服务)。请指定要调用的具体修复工具(如 `restart_nginx_tool`)。
      B. 升级通知:问题可能较复杂或影响较大,立即通知应用负责人和值班工程师。请指定通知工具和通知内容要点。
      C. 观察记录:疑似偶发抖动或已恢复,记录到日志,无需立即行动。
      
      请用JSON格式输出你的最终决策,包含字段:`decision` (A/B/C), `confidence` (0-100), `reason` (详细推理过程), `action_tool` (如果选A), `notification_plan` (如果选B)。
      
    • 绑定工具 :这个技能需要绑定多个工具: query_prometheus_tool (查询监控数据), query_change_tool (查询变更记录), 以及一系列具体的修复工具(如 restart_nginx_tool )。
  3. 编排智能体

    • 在“智能体”页面,创建一个名为 OnCall_Bot 的新智能体。
    • 在它的技能链中,按顺序添加第一步创建的 alert_parser_and_enricher 和第二步创建的 alert_diagnosis_and_decision
    • 这样,当一个请求发给这个智能体时,它会先执行解析富化,再将结果交给诊断决策技能,形成处理链。

3.3 打通告警入口:配置Webhook网关

OpenClaw智能体准备好了,我们需要一个“触发器”来在告警发生时自动调用它。我选择用Python写一个轻量的Webhook网关,它扮演了前面架构图中“事件网关”和“消息队列生产者”的角色。

# alert_webhook_gateway.py
from flask import Flask, request, jsonify
import requests
import json
import logging
from redis import Redis

app = Flask(__name__)
logging.basicConfig(level=logging.INFO)
redis_client = Redis(host='localhost', port=6379, decode_responses=True)

# OpenClaw 配置
OPENCLAW_API_URL = "http://localhost:3000/api/v1/agents/OnCall_Bot/invoke"
OPENCLAW_API_KEY = "your_secret_api_key_here"

@app.route('/webhook/alert', methods=['POST'])
def handle_alert():
    try:
        # 1. 接收并验证告警
        data = request.json
        logging.info(f"Received alert: {json.dumps(data, indent=2)}")

        # 2. 格式化告警(这里以Prometheus Alertmanager为例)
        # Alertmanager的Webhook格式是特定的,我们需要将其转换为智能体易读的格式
        formatted_alert = {
            "source": "prometheus",
            "alerts": data.get('alerts', []),
            "groupLabels": data.get('groupLabels', {}),
            "commonLabels": data.get('commonLabels', {}),
            "externalURL": data.get('externalURL', '')
        }

        # 3. 将格式化后的告警放入Redis队列(异步处理,避免阻塞)
        alert_id = f"alert:{int(time.time())}"
        redis_client.rpush('alert_queue', json.dumps({
            'id': alert_id,
            'data': formatted_alert
        }))
        logging.info(f"Alert {alert_id} pushed to queue.")

        # 4. (可选)触发异步处理任务
        # 在实际部署中,这里可以触发一个Celery任务或直接起一个线程去消费队列
        process_alert_from_queue()

        return jsonify({"status": "success", "message": "Alert received and queued."}), 200

    except Exception as e:
        logging.error(f"Error processing webhook: {e}")
        return jsonify({"status": "error", "message": str(e)}), 500

def process_alert_from_queue():
    """从Redis队列中消费并处理告警"""
    while True:
        alert_msg = redis_client.blpop('alert_queue', timeout=30)
        if not alert_msg:
            continue
        _, msg = alert_msg
        alert_info = json.loads(msg)

        try:
            # 调用OpenClaw智能体
            headers = {
                "Authorization": f"Bearer {OPENCLAW_API_KEY}",
                "Content-Type": "application/json"
            }
            payload = {
                "input": f"请处理以下告警:{json.dumps(alert_info['data'], ensure_ascii=False)}",
                "stream": False  # 非流式响应,等待最终结果
            }
            response = requests.post(OPENCLAW_API_URL, json=payload, headers=headers, timeout=60)
            response.raise_for_status()
            result = response.json()

            # 解析智能体的决策结果
            decision_output = result.get('output', '')
            logging.info(f"OpenClaw decision: {decision_output}")

            # 5. 根据决策结果执行相应动作(这里需要解析decision_output中的JSON)
            # 例如,如果decision是A,则调用对应的action_tool
            # 这部分逻辑需要根据智能体输出的具体格式来编写
            execute_decision(decision_output)

        except requests.exceptions.RequestException as e:
            logging.error(f"Failed to call OpenClaw API: {e}")
            # 可以将失败的任务重新放回队列或放入死信队列
            redis_client.rpush('alert_failed_queue', msg)

if __name__ == '__main__':
    # 启动一个线程专门处理队列
    import threading
    processor_thread = threading.Thread(target=process_alert_from_queue, daemon=True)
    processor_thread.start()
    app.run(host='0.0.0.0', port=5000)

将这个网关服务部署在服务器上(例如使用Gunicorn),然后在Prometheus Alertmanager的配置中,将接收器(receiver)指向这个Webhook地址: http://你的网关IP:5000/webhook/alert 。这样,告警链路就初步打通了。

4. 核心环节:工具开发与安全执行

智能体的“思考”依赖于我们提供的工具(Tools)。工具的质量和安全性直接决定了整个系统的可靠性和可用性。

4.1 开发一个安全的命令执行工具

这是最强大也最危险的工具。我们必须给它戴上“镣铐”。

# safe_command_tool.py (OpenClaw Skill中的Tool实现示例)
import subprocess
import shlex
import logging
from typing import List, Dict

class SafeCommandExecutor:
    def __init__(self):
        # 命令白名单:只允许执行这些命令
        self.allowed_commands = {
            'diagnostic': ['top', '-bn', '1'],
            'disk_check': ['df', '-h'],
            'service_status': ['systemctl', 'status'],
            'restart_service': ['sudo', 'systemctl', 'restart'], # 使用sudo,但需配置免密且限制命令
        }
        # 允许操作的主机列表
        self.allowed_hosts = ['web-server-01', 'db-server-01']
        # 允许重启的服务列表
        self.allowed_services = ['nginx', 'redis-server', 'postgresql']

    def execute(self, host: str, command_key: str, service_name: str = None) -> Dict:
        """
        执行命令
        :param host: 目标主机
        :param command_key: 命令白名单中的key
        :param service_name: 服务名(针对重启等操作)
        :return: 执行结果字典
        """
        # 1. 安全检查
        if host not in self.allowed_hosts:
            return {"success": False, "error": f"Host {host} not in allowed list."}
        if command_key not in self.allowed_commands:
            return {"success": False, "error": f"Command {command_key} is not allowed."}

        # 2. 构建命令
        cmd_list = self.allowed_commands[command_key].copy()
        if command_key == 'restart_service':
            if service_name not in self.allowed_services:
                return {"success": False, "error": f"Service {service_name} cannot be restarted automatically."}
            cmd_list.append(service_name)
        elif service_name:
            # 对于其他命令,如果传了service_name,可以附加到命令后(如检查状态)
            cmd_list.append(service_name)

        # 3. 执行命令(通过SSH到目标主机,这里简化为例,实际使用paramiko)
        # 假设我们有一个配置了密钥认证的SSH连接
        try:
            # 示例:使用subprocess在本地执行(实际应为SSH到host)
            # real_cmd = f"ssh {host} {' '.join(shlex.quote(arg) for arg in cmd_list)}"
            # 为安全演示,我们只在本地模拟
            if command_key == 'restart_service':
                # 模拟重启操作,在实际中这里会真正执行
                logging.warning(f"SIMULATION: Would execute 'ssh {host} {' '.join(cmd_list)}'")
                result = {"success": True, "output": f"Simulated restart of {service_name} on {host}."}
            else:
                # 执行诊断命令
                process = subprocess.run(cmd_list, capture_output=True, text=True, timeout=10)
                result = {
                    "success": process.returncode == 0,
                    "returncode": process.returncode,
                    "stdout": process.stdout,
                    "stderr": process.stderr
                }
            return result
        except subprocess.TimeoutExpired:
            return {"success": False, "error": "Command execution timeout."}
        except Exception as e:
            return {"success": False, "error": str(e)}

# 在OpenClaw中注册为Tool
# 需要在OpenClaw的技能编辑器中,以HTTP API或Python函数的方式暴露这个execute方法。

安全要点

  • 白名单机制 :绝不允许智能体执行任意命令。所有可执行命令必须预先定义在白名单中。
  • 权限最小化 :执行命令的账户(如SSH账户)应具有完成该任务所需的最小权限。对于重启操作,可以通过配置 sudo 免密但仅针对特定命令。
  • 操作确认 :对于高风险操作(如重启数据库),即使在白名单内,也可以在工具逻辑中加入二次确认。例如,工具先返回一个“待确认”的结果和操作令牌,另一个低风险的通知工具将确认链接发给负责人,点击确认后才真正执行。
  • 审计日志 :所有工具调用,无论成功失败,都必须记录详细的审计日志,包括调用者、参数、时间、结果,便于事后追溯。

4.2 集成外部系统:飞书通知工具

自动化处置后,必须将结果清晰地通知给相关人员。飞书机器人的集成非常方便。

# feishu_notifier_tool.py
import requests
import json
import hashlib
import time
import hmac
import base64

class FeishuNotifier:
    def __init__(self, webhook_url: str, secret: str = None):
        self.webhook_url = webhook_url
        self.secret = secret

    def _gen_sign(self, timestamp: int) -> str:
        """生成飞书机器人签名(如果设置了Secret)"""
        if not self.secret:
            return ""
        string_to_sign = f'{timestamp}\n{self.secret}'
        hmac_code = hmac.new(self.secret.encode('utf-8'), string_to_sign.encode('utf-8'), digestmod=hashlib.sha256).digest()
        return base64.b64encode(hmac_code).decode('utf-8')

    def send_alert_card(self, alert_title: str, alert_content: str, decision: str, action_taken: str = None, buttons: list = None):
        """
        发送飞书富文本卡片消息
        :param alert_title: 告警标题
        :param alert_content: 告警详情(Markdown格式)
        :param decision: 智能体决策(A/B/C)
        :param action_taken: 已采取的行动
        :param buttons: 可选按钮,如[{"text": "确认处理", "url": "https://..."}, {"text": "查看详情", "url": "..."}]
        """
        timestamp = int(time.time())
        sign = self._gen_sign(timestamp)

        # 根据决策定义颜色和标签
        decision_map = {
            "A": {"tag": "🟢 已自动处理", "color": "green"},
            "B": {"tag": "🟡 需人工介入", "color": "yellow"},
            "C": {"tag": "⚪ 已观察记录", "color": "grey"}
        }
        decision_info = decision_map.get(decision, {"tag": "⚫ 未知", "color": "grey"})

        # 构建飞书卡片消息
        card = {
            "msg_type": "interactive",
            "card": {
                "header": {
                    "title": {
                        "tag": "plain_text",
                        "content": f"[智能告警] {alert_title}"
                    },
                    "template": decision_info["color"]
                },
                "elements": [
                    {
                        "tag": "div",
                        "text": {
                            "tag": "lark_md",
                            "content": alert_content
                        }
                    },
                    {
                        "tag": "div",
                        "fields": [
                            {
                                "is_short": True,
                                "text": {
                                    "tag": "lark_md",
                                    "content": f"**决策**\n{decision_info['tag']}"
                                }
                            }
                        ]
                    }
                ]
            }
        }

        # 添加已采取的行动
        if action_taken:
            card["card"]["elements"].append({
                "tag": "div",
                "text": {
                    "tag": "lark_md",
                    "content": f"**🤖 自动执行**\n{action_taken}"
                }
            })

        # 添加按钮
        if buttons:
            button_elements = []
            for btn in buttons:
                button_elements.append({
                    "tag": "button",
                    "text": {"tag": "plain_text", "content": btn["text"]},
                    "type": "primary",
                    "url": btn["url"]
                })
            card["card"]["elements"].append({
                "tag": "action",
                "actions": button_elements
            })

        # 发送请求
        url = self.webhook_url
        if sign:
            url += f"&timestamp={timestamp}&sign={sign}"

        try:
            resp = requests.post(url, json=card, timeout=5)
            resp.raise_for_status()
            return {"success": True, "message_id": resp.json().get('data', {}).get('message_id')}
        except Exception as e:
            return {"success": False, "error": str(e)}

# 使用示例
notifier = FeishuNotifier(webhook_url="https://open.feishu.cn/open-apis/bot/v2/hook/xxx", secret="your_secret")
result = notifier.send_alert_card(
    alert_title="生产Web服务器CPU使用率过高",
    alert_content="**主机**:10.0.0.1\n**告警**:CPU使用率 > 90% (持续5分钟)\n**可能原因**:1. 流量突增 2. 应用死循环 3. 外部攻击",
    decision="B",
    action_taken="已自动执行诊断命令 `top -bn1`,[查看结果](内部链接)",
    buttons=[{"text": "登录服务器", "url": "ssh://10.0.0.1"}, {"text": "静默此告警", "url": "http://内部运维平台/silence/alert123"}]
)

这个工具将智能体的分析结果转化为了一个结构化的飞书卡片,信息清晰,并且可以附带快捷操作按钮,大大提升了告警响应效率。

5. 避坑指南与效果优化

在实际部署和运行过程中,我遇到了不少坑,也总结了一些优化经验。

5.1 常见问题与排查

  1. OpenClaw调用大模型超时或失败

    • 现象 :智能体响应缓慢,或直接返回连接错误。
    • 排查
      • 首先检查Ollama服务状态: docker logs ollama
      • 确认模型是否已正确加载且未被占用。Ollama同时处理多个请求能力有限,考虑升级服务器配置或使用性能更好的模型(如 qwen2.5:7b llama3.2:1b 更稳定)。
      • 在OpenClaw的环境变量中,尝试调整 OLLAMA_BASE_URL ,如果部署在同一台机,用 http://host.docker.internal:11434 有时比用服务名更稳定。
      • 查看OpenClaw容器日志: docker logs openclaw ,寻找错误信息。
  2. 智能体决策逻辑混乱或不符合预期

    • 现象 :智能体对相似告警做出不一致的决策,或者决策理由荒谬。
    • 排查与优化
      • 提示词工程 :这是最主要的原因。你的提示词就是给智能体的“工作手册”。确保指令清晰、无歧义、分步骤。多使用“你必须”、“请按以下顺序”、“输出格式必须是JSON”等强约束性语句。将复杂的决策逻辑拆分成多个简单的技能链式调用。
      • 提供示例 :在提示词中提供1-2个高质量的输入输出示例(Few-Shot Learning),能极大提升模型在特定任务上的表现。
      • 温度(Temperature)参数 :在调用模型时,如果创造性太高(温度值高),可能导致输出不稳定。对于严谨的运维场景,建议将温度设置为0.1或更低,以获得更确定性的输出。
      • 知识库增强 :将历史告警处理记录、运维手册、常见故障库整理成文档,存入向量数据库(如Chroma)。在技能中增加一个“检索相关知识”的步骤,让模型在决策前先查询相似案例,可以显著提升决策准确性。
  3. 工具执行权限或网络问题

    • 现象 :工具调用返回“Permission Denied”或连接超时。
    • 排查
      • SSH免密登录 :确保执行命令的宿主机或容器内,已配置对目标机器的SSH密钥免密登录,且密钥权限正确( chmod 600 )。
      • sudo配置 :如果需要sudo权限,需在目标机器的 /etc/sudoers 文件中配置精确的免密命令,例如: opsuser ALL=(ALL) NOPASSWD: /bin/systemctl restart nginx, /bin/systemctl status nginx
      • 网络策略 :确保OpenClaw服务所在的网络能够访问需要调用的内部API地址、数据库、监控系统等。

5.2 效果评估与迭代优化

系统上线后,不能放任自流。需要建立评估机制,持续优化。

  1. 设立“演练模式”与“黄金指标”

    • 初期,将所有自动处置动作改为“演练模式”,即智能体正常分析并生成处置方案,但最终执行步骤替换为“发送演练报告”。观察一周,看它的分析是否合理。
    • 定义几个“黄金指标”告警(如“数据库主节点宕机”、“核心服务接口错误率飙升”),手动验证智能体对这些关键告警的处置流程是否正确。
  2. 建立反馈闭环

    • 在每条飞书通知卡片底部,增加“👍 处理正确”和“👎 处理有误”的反馈按钮(可以通过飞书交互组件实现)。
    • 收集反馈数据,定期分析智能体在哪些类型的告警上容易出错。这些反馈是优化提示词和技能链的宝贵材料。
  3. 成本与性能监控

    • 监控Ollama的GPU/CPU和内存使用情况。大模型推理是资源消耗大户。
    • 记录每个告警从产生到智能体完成处理的端到端延迟(P99延迟)。确保自动化流程没有引入不可接受的延迟。
    • 对于简单的、规则明确的告警(如“磁盘使用率>95%”),后期可以考虑用传统的规则引擎(如Prometheus的 alertmanager 的静默规则或简单的脚本)直接处理,绕过大模型,以节省资源和时间。让OpenClaw专注于处理需要“思考”的复杂告警。
  4. 技能库的持续建设

    • 自动化告警处理不是一个一蹴而就的项目,而是一个需要持续运营的“知识工程”。
    • 每遇到一个新的、可归类的故障,就思考能否为智能体编写一个新的“技能”或“工具”来处理它。例如,针对“Redis内存溢出”告警,可以开发一个 redis_memory_cleanup_tool ,智能体在诊断后可以自动执行 MEMORY PURGE 或触发Key淘汰策略。
    • 鼓励团队成员贡献技能代码,将优秀的处置经验固化到智能体中,让整个团队的经验得以传承和复用。

更多推荐