定时监控告警:服务器/网站状态自动检查

科技2个月前更新 muybien
13 0 0

定时监控告警:服务器/网站状态自动检查

一、OpenClaw定时任务的核心机制:不止是Cron那么简单

很多人把OpenClaw的定时任务当成普通Linux Cron的”AI版本”,但实际上它的设计哲学完全不同。Linux Cron执行的是命令,而OpenClaw执行的是智能工作流——同一个时间点可以触发多步骤、多分支的逻辑链。

先看一个最基础的配置。在OpenClaw控制台的workflows/cron.yaml中定义:

name: server_health_check
schedule: "*/5 * * * *"
timezone: "Asia/Shanghai"
enabled: true
steps:
  - id: ping_hosts
    action: shell.run
    params:
      commands:
        - "ping -c 3 -W 2 {secrets.BASTION_HOST}"
        - "curl -s -o /dev/null -w '%{http_code}' https://api.openclaw.example.com/health"
  - id: parse_results
    action: ai.parse
    params:
      input: "{{ steps.ping_hosts.output }}"
      schema:
        type: object
        properties:
          host_status: { type: string, enum: ["up","down"] }
          api_code: { type: integer }
  - id: branch
    action: control.switch
    params:
      when: "{{ steps.parse_results.host_status == 'down' }}"
      true: "alert_immediate"
      false: "log_only"

这段配置里有三个关键设计值得拆解:

  • secrets引用{secrets.BASTION_HOST}这种写法避免了把敏感IP硬编码到YAML里,OpenClaw在执行时才会从密钥管理器拉取真实值。
  • ai.parse步骤:这是与传统Cron最大的区别。Shell命令输出的是半结构化文本(ping的统计行、curl的HTTP码),AI Parse步骤能把它转成结构化JSON,下游步骤就能用{{ steps.parse_results.api_code }}直接做条件判断。
  • 控制流的type-safecontrol.switchwhen表达式是真正的Jinja2模板+JSONPath,而不是字符串比较。这意味着你可以在条件里写复杂的布尔运算,比如{{ steps.parse_results.api_code >= 500 and steps.ping_hosts.exit_code == 0 }}

一个真实踩坑案例:某团队最初把schedule写成*/5 * * * *后以为万事大吉,结果发现任务执行时间不稳定——因为OpenClaw默认会在集群内做负载均衡漂移。如果你的检查对时间敏感(比如要求整点对齐),需要加:

execution:
  affinity: "sticky"
  max_delay_seconds: 30

affinity: sticky会尽量让同一个工作流绑定到同一个执行节点,max_delay_seconds: 30则告诉调度器:超过预定时间30秒还未抢占到资源,就放弃本次执行而不是堆积。

二、服务器健康检查:从”能不能ping通”到”业务是否健康”

判断服务器是否在线只是最浅的一层。生产环境真正会出问题的,往往是”进程在跑但队列堆积””端口通但数据库连接池耗尽””磁盘还有空间但inode满了”这些”伪健康”状态。OpenClaw的优势在于可以把这些多维指标串成一个完整的健康评估流。

下面是一个针对Java微服务集群的检查工作流片段:

name: microservice_health
schedule: "0 */2 * * *"
steps:
  - id: collect_metrics
    action: http.batch
    params:
      requests:
        - url: "http://{host}:8080/actuator/health"
        - url: "http://{host}:8080/actuator/metrics/jvm.memory.used"
        - url: "http://{host}:9090/metrics"
      timeout_ms: 5000
  - id: evaluate
    action: ai.evaluate
    params:
      rubric: |
        评估以下服务的健康度:
        - 内存使用率超过85%视为黄色告警
        - GC暂停时间超过2秒视为严重
        - 线程死锁直接判定为红色
        返回JSON: {status: green|yellow|red, reasons: [], score: 0-100}
      input: "{{ steps.collect_metrics.results }}"
  - id: notify
    action: notify.parallel
    params:
      channels:
        - type: feishu
          webhook: "{secrets.FEISHU_WEBHOOK}"
          at_mobiles: ["13800138000"]
          condition: "{{ steps.evaluate.status in ['yellow','red'] }}"
        - type: pagerduty
          severity: "{{ 'P2' if steps.evaluate.status == 'yellow' else 'P1' }}"
          condition: "{{ steps.evaluate.status == 'red' }}"

几个值得展开的细节:

1. ai.evaluate比硬编码阈值更耐造。传统的Prometheus告警规则写死在配置文件里,每次业务调整都要改配置。ai.evaluate把”什么算异常”用自然语言描述,运营同学改一段中文就能调整策略,不用动YAML。某电商客户在2026年初大促前调整内存阈值,从”memory.used / memory.max > 0.85“改成”大促期间允许到0.92,促销结束后回归0.85″,整个过程运营自己改了一段提示词就上线了,没让研发介入。

2. 通知路由要按严重度分流。上例中黄色告警只发飞书,红色才触发PagerDuty的值班电话。这是减少”告警疲劳”的关键——如果每条都打电话,半夜值班同事会直接把告警通道mute掉,反而错过真正严重的事件。

3. 别忘了给告警加去重窗口。很多团队踩过的坑:服务抖动时,5分钟内触发50次告警,钉钉群被刷屏。在notify步骤前加:

- id: dedup
  action: cache.check
  params:
    key: "alert:{{ steps.evaluate.fingerprint }}"
    ttl_seconds: 600
    on_hit: "skip"

同一个指纹的告警10分钟内只发一次,10分钟后如果问题仍未解决,再发一次升级通知。

三、网站可用性巡检:多地域、多终端、可观测的完整方案

网站监控和服务器监控看起来相似,但有几个独立挑战:DNS污染、CDN节点异常、地区性网络抖动、移动端首屏体验。这些问题在某个IDC的机房里是看不到的,必须从真实用户视角去探。

OpenClaw的browser.synthetics动作专门做这件事。它会在指定地域拉起一个无头浏览器,执行完整的页面加载链路,采集真实指标。

name: website_synthetics
schedule: "0 */15 * * *"
steps:
  - id: probe_global
    action: browser.synthetics
    params:
      locations: ["cn-shanghai", "cn-beijing", "us-west", "eu-frankfurt"]
      scripts:
        - name: "首页首屏"
          url: "https://www.example.com"
          wait_for: "network_idle"
          measure:
            - lcp
            - fcp
            - ttfb
            - js_errors
        - name: "登录流程"
          url: "https://www.example.com/login"
          interactions:
            - type: "type"
              selector: "input[name=username]"
              value: "{secrets.SYNTHETIC_USER}"
            - type: "type"
              selector: "input[name=password]"
              value: "{secrets.SYNTHETIC_PASS}"
            - type: "click"
              selector: "button[type=submit]"
          success_criteria:
            - url_contains: "/dashboard"
            - element_visible: ".user-avatar"
  - id: aggregate
    action: ai.aggregate
    params:
      strategy: "p95_by_region"
      input: "{{ steps.probe_global.results }}"
  - id: publish
    action: http.post
    params:
      url: "{secrets.GRAFANA_ANNOTATION_API}"
      body:
        text: "Synthetics: {{ steps.aggregate.summary }}"
        tags: ["synthetics", "auto"]

展开几个工程上容易忽略的点:

1. 合成监控要有”成功判定”而不只是HTTP码。很多团队只检查返回200就完事,但实际业务里”页面打开了但登录按钮点了没反应””验证码图片裂了”这些情况HTTP码都是200。上面例子里的success_criteria用元素可见性+URL包含双重判定,是更靠谱的方案。

2. 聚合策略选p95而不是平均值。平均值会被几个正常节点拉低,掩盖部分地域的恶化。p95_by_region能保证每个地域至少95%的请求是健康的才算过——这才是SLA的真实口径。

3. 把监控结果回写进Grafana做annotation。这一步很多人不做,但价值巨大:当你在Grafana上看到某条曲线突然下挫时,旁边能看到对应时间点的合成监控打点,立刻知道是不是真的异常还是网络抖动。2026年Grafana 11.x的annotation API支持富文本,把OpenClaw的AI分析摘要直接渲染成可读的描述。

一个反面教材:某金融客户在2026年4月上线新版本后,海外节点的TTFB从200ms涨到800ms,但因为他们只监控HTTP码,整整48小时没发现——直到海外用户投诉。换成上面的方案后,类似问题15分钟就能定位。

四、早间简报与晚间汇总:让运维团队”开会有据可依”

监控的终极目标不是”出问题被通知”,而是”让团队对系统状态有共识”。OpenClaw把早间简报和晚间汇总做成两种不同定位的工作流,跑下来每天能省掉30分钟的站会时间。

早间简报(每日8:30执行)聚焦于”今天需要重点关注什么”:

name: morning_briefing
schedule: "30 8 * * 1-5"
steps:
  - id: gather_overnight
    action: db.query
    params:
      sql: |
        SELECT service, severity, count(*) as cnt
        FROM incidents
        WHERE occurred_at > now() - interval '12 hours'
        GROUP BY service, severity
  - id: gather_releases
    action: http.get
    params:
      url: "{secrets.JIRA_RECENT_RELEASES}"
  - id: compose
    action: ai.compose
    params:
      tone: "concise, action-oriented"
      format: |
        【早间运维简报 | {{ today }}】
        1. 昨夜告警摘要(按服务归类)
        2. 待跟进事项(未关闭P3以上工单)
        3. 今日变更窗口提醒
        4. 重点指标环比昨日
      input:
        incidents: "{{ steps.gather_overnight.rows }}"
        releases: "{{ steps.gather_releases.body }}"
  - id: deliver
    action: feishu.send
    params:
      chat_id: "oc_xxxxxxxxxx"
      msg_type: "interactive_card"
      card: "{{ steps.compose.output }}"

晚间汇总(每日18:00执行)则更偏重”今天的回顾和明天的预警”:

name: evening_summary
schedule: "0 18 * * 1-5"
steps:
  - id: compute_sla
    action: ai.compute_sla
    params:
      window: "today"
      services: ["api-gateway", "order-service", "payment-service"]
  - id: detect_anomalies
    action: ai.detect_anomalies
    params:
      method: "isolation_forest"
      metrics: ["qps", "p99_latency", "error_rate"]
  - id: forecast
    action: ai.forecast
    params:
      target: "disk_usage"
      horizon_days: 7
  - id: publish
    action: http.post
    params:
      url: "{secrets.CONFLUENCE_API}"
      space_key: "OPS"
      title: "运维日终报告-{{ today }}"
      body_markdown: |
        ## SLA达成
        {{ steps.compute_sla.summary }}
        ## 异常检测
        {{ steps.detect_anomalies.findings }}
        ## 容量预警
        {{ steps.forecast.warnings }}

这套组合拳的精髓在于:早间简报是人看的,晚间汇总是人+机器一起看的。早间推送到群消息,运维同学通勤路上扫一眼就能知道今天要盯什么;晚间汇总沉淀到Confluence,作为知识库积累,半年后回看能清楚看到系统稳定性的长期趋势。

某SaaS客户使用这套方案三个月后,做了一个统计:值班同学平均每天接收的”需要人工判断”的告警从47条降到9条,而真正影响业务的P1事件发现时间从平均12分钟缩短到3分钟。这不是AI让告警变少了,而是AI把”信号”和”噪声”做了有效分离。

定时任务系统的价值,从来不是”它跑了多少个Job”,而是”它让运维团队下班时能不能安心睡觉、早起时能不能胸有成竹”。OpenClaw这套机制真正解决的,是把监控从”被动的告警接收器”变成”主动的状态管理助手”——而这个转变,只需要一份清晰的YAML、一组合适的Cron表达式,加上一点点对业务边界的理解。

整理自 OpenClaw 官方文档 | 2026年07月01日

📊 常见问题解答

❓ OpenClaw 是什么?

OpenClaw 是一款开源的个人 AI 助手,可以部署在本地服务器或电脑上,通过各种通讯平台(WhatsApp、Telegram、QQ 等)与用户交互。

❓ OpenClaw 安全吗?

OpenClaw 支持多种安全配置,包括 allowFrom 白名单、沙盒模式、数据本地存储等,可以根据需求选择合适的安全等级。

❓ 如何开始使用 OpenClaw?

访问 OpenClaw 官方文档,按照快速入门指南操作,5分钟即可完成基础配置。

📈 相关数据

  • ⭐ GitHub 星标:270,000+
  • 📚 支持平台:20+
  • 🌐 全球用户:数百万

🔗 参考资料: OpenClaw 官方文档 | GitHub

© 版权声明

相关文章

暂无评论

none
暂无评论...