← 返回列表

机器人采集任务的监控与报警:Prometheus + Grafana实践

分类:Telegram机器人发布于:2026-09-06

telegram搜

机器人采集任务一旦进入多站点、并发执行和定时调度阶段,最先暴露的通常不是代码错误,而是任务悄悄变慢、数据量异常下降、部分站点持续失败等问题。

仅依赖日志排查,很难及时回答“哪个任务失败了”“失败持续多久”“是否影响了业务数据”这些关键问题。本文以 Prometheus 和 Grafana 为核心,介绍一套可落地的机器人采集任务监控与报警方案,同时兼顾稳定性、可观测性和运维成本。

🧭 一、先明确监控目标:不要只盯着进程是否存活

采集机器人进程处于运行状态,并不代表任务真的健康。程序可能仍然在线,但目标站点返回了验证码、解析规则失效,或者队列已经积压数小时。

因此,监控应覆盖四个层次:任务是否执行、执行是否成功、执行质量是否正常、数据是否按预期产出。这四层指标能够把“机器活着”和“业务正常”区分开。

核心指标设计

任务执行次数适合使用 Counter,记录成功、失败和跳过等结果;执行耗时适合使用 Histogram,用于观察平均耗时和 P95、P99 延迟。

此外,还应记录抓取条数、队列延迟、最后一次成功时间、HTTP 状态分布以及当前活跃 Worker 数量。指标标签建议只使用任务名、站点和结果类型,避免把 URL、用户 ID 或关键词直接放入标签。

collector_task_runs_total{task, site, result}
collector_task_duration_seconds{task, site}
collector_items_total{task, site}
collector_queue_lag_seconds{queue}
collector_last_success_timestamp_seconds{task, site}
collector_http_responses_total{task, site, status}
collector_workers_active{service}

需要特别注意标签基数问题。将完整 URL、随机请求参数或错误堆栈作为标签,会快速制造大量时间序列,最终增加 Prometheus 内存压力并拖慢 Grafana 查询。

⚙️ 二、在采集程序中埋点

Prometheus 的基本模式是主动拉取指标。采集服务需要提供一个可访问的指标接口,Prometheus 按固定周期读取当前状态,应用程序则负责在任务执行过程中持续更新计数器、直方图和仪表盘指标

下面示例使用 Python 客户端展示埋点思路,实际项目也可以使用 Go、Java、Node.js 或其他 Prometheus 官方客户端。

from prometheus_client import Counter, Gauge, Histogram, start_http_server
import time

task_runs = Counter(
    "collector_task_runs_total",
    "Total collector task runs",
    ["task", "site", "result"]
)

task_duration = Histogram(
    "collector_task_duration_seconds",
    "Collector task duration",
    ["task", "site"],
    buckets=(1, 5, 10, 30, 60, 120, 300)
)

items_total = Counter(
    "collector_items_total",
    "Total collected items",
    ["task", "site"]
)

last_success = Gauge(
    "collector_last_success_timestamp_seconds",
    "Unix timestamp of last successful run",
    ["task", "site"]
)

def run_task(task, site):
    started = time.time()
    result = "success"

    try:
        items = collect_data(site)
        items_total.labels(task, site).inc(len(items))
        last_success.labels(task, site).set(time.time())
        save_data(items)
    except Exception:
        result = "error"
        raise
    finally:
        task_runs.labels(task, site, result).inc()
        task_duration.labels(task, site).observe(time.time() - started)

start_http_server(9108)

计数器不应在程序重启时手动清零,因为 Prometheus 的 rate 函数能够处理计数器重置。对于一次执行时间很短、执行完立即退出的批处理任务,可以考虑 Pushgateway,但必须设计唯一任务标识并定期清理过期数据。

采集程序还应区分网络错误、解析错误、限流、验证码和数据校验失败。错误原因可以写入日志或低基数标签,便于定位问题,但不要把完整异常文本直接作为 Prometheus 标签。

📡 三、配置 Prometheus 抓取指标

Prometheus 的抓取间隔需要根据任务频率和报警时效进行平衡。实时性要求较高的任务可以使用 15 秒到 30 秒的抓取周期,低频日报任务则可以适当放宽。

global:
  scrape_interval: 15s
  evaluation_interval: 15s

scrape_configs:
  - job_name: "collector"
    metrics_path: /metrics
    static_configs:
      - targets:
          - "collector-a:9108"
          - "collector-b:9108"

生产环境中建议通过服务发现、容器编排平台或 Consul 管理目标地址,避免服务器扩容后还要手工修改配置。指标接口不应直接暴露到公网,至少要使用网络隔离、访问控制或反向代理认证。

部署完成后,先在 Prometheus 的 Targets 页面确认目标状态为 UP,再检查指标是否持续增长。不要在 Grafana 尚未验证之前直接上线报警,否则很容易因为指标名称、标签或权限配置错误产生误报。

📊 四、使用 Grafana 构建可读的监控面板

Grafana 面板不应只是指标堆叠,而要围绕运维决策组织。第一行建议展示任务成功率、最近成功时间、当前积压和整体采集条数,第二行展示耗时分位数、错误类型和各站点状态。

成功率应使用时间窗口计算,避免某一次瞬时失败放大为严重事故。耗时则优先观察 P95 或 P99,因为平均值可能掩盖少量但持续存在的慢任务。

sum by (task) (rate(collector_items_total[5m]))

histogram_quantile(
  0.95,
  sum by (le, task) (
    rate(collector_task_duration_seconds_bucket[10m])
  )
)

sum by (task, result) (
  rate(collector_task_runs_total[10m])
)

time() - max by (task) (
  collector_last_success_timestamp_seconds
)

面板变量可以设置任务名和站点筛选器,让同一套 Dashboard 适用于不同采集项目。颜色建议统一:绿色表示正常,黄色表示风险,红色表示需要立即处理,避免同一状态在不同图表中使用不同含义。

电报精准找群黑科技提示:

由于 Telegram 官方搜索对中文支持极差,很多优质的推广、技术和资源群组隐藏极深。如果你正在寻找相关的活跃社群,强烈推荐使用本站首页的 【TTSO - Telegram 智能搜索 Bot】。作为目前最好用的电报综合搜索导航,只需输入关键词,即可秒级触达数十万个精选 TG 中文群组、资源频道。一键直达,帮你节省 90% 的找群时间!

🚨 五、设计真正有用的报警规则

报警阈值不能完全凭经验设置,应结合历史基线、任务周期和业务容忍度确定。对于每五分钟运行一次的任务,连续十分钟没有成功可能已经严重;对于每天运行一次的任务,则应围绕调度窗口设计规则。

groups:
  - name: collector.rules
    rules:
      - alert: CollectorSuccessRateLow
        expr: |
          (
            sum by (task) (
              rate(collector_task_runs_total{result="success"}[10m])
            )
            /
            clamp_min(
              sum by (task) (rate(collector_task_runs_total[10m])),
              1
            )
          ) < 0.95
        for: 10m
        labels:
          severity: warning
        annotations:
          summary: "采集任务成功率过低"

      - alert: CollectorTaskStale
        expr: |
          time() - max by (task) (
            collector_last_success_timestamp_seconds
          ) > 1800
        for: 5m
        labels:
          severity: critical
        annotations:
          summary: "采集任务超过 30 分钟没有成功"

      - alert: CollectorTargetDown
        expr: up{job="collector"} == 0
        for: 3m
        labels:
          severity: critical
        annotations:
          summary: "采集指标目标不可达"

报警内容必须包含任务名、站点、当前值、持续时间和处理建议。通知渠道可以接入企业微信、邮件、Telegram 或值班系统,但建议设置分组、静默和抑制规则,避免一个上游网络故障触发数百条重复消息。

每一条报警都应关联一份处理手册,例如先查看最近错误类型,再检查目标站点响应,最后确认代理、队列和数据库状态。没有处理路径的报警,往往只会增加噪声,而不会提升恢复速度。

🛡️ 六、生产环境中的稳定性与合规注意事项

采集任务应遵守目标站点的服务条款、robots 规则和访问频率限制。通过合理限速、退避重试、缓存和增量采集降低对目标服务的压力,也能减少自身被封禁后产生的大面积报警。

监控数据本身也可能包含敏感信息,因此不要把 Cookie、Token、完整请求头或个人数据写入日志和指标。Grafana 应按照团队角色分配只读、编辑和管理员权限,并对外部通知渠道进行脱敏。

上线前可进行一次故障演练:主动停止一个 Worker、模拟目标站点超时、制造解析失败并清空队列。确认报警能够触发、通知能够送达、面板能够定位问题,才算完成真正的监控闭环。

❓ 常见问题解答(FAQ)

Prometheus 能直接监控短时运行的采集脚本吗?

可以,但短脚本可能在 Prometheus 抓取前就已经退出。此类任务可使用 Pushgateway,或者由长期运行的调度器汇总执行结果后暴露指标,同时要设置过期清理机制。

为什么任务成功率很高,但采集数据仍然减少?

成功率只代表程序没有抛出错误,不能证明返回数据完整。应同时监控采集条数、字段校验通过率、去重比例和与历史基线的偏差。

报警太多,应该怎样降低噪声?

先增加持续时间条件,再使用告警分组、抑制和维护静默。更重要的是合并重复指标,并区分 warning 与 critical,让真正影响数据产出的故障优先通知值班人员。

Grafana 面板最应该优先展示哪些数据?

建议优先展示成功率、最后成功时间、采集条数、任务耗时 P95、队列延迟和错误类型。面板应服务于故障判断,而不是追求图表数量。

总体而言,Prometheus 负责持续采集和计算指标,Grafana 负责呈现趋势和辅助定位,报警系统则负责推动处理动作。只有把业务指标、可视化面板、通知策略和故障手册连接起来,机器人采集任务才真正具备可运营的监控能力。

telegram中文搜索群组
Telegram搜索入口客服ID@TTSO联系