跳转到内容
集成指南

Django 和 Celery 结构化事件监控

记录 Celery 任务每次尝试的状态,不将重试误记为最终失败,也不改变任务结果。

审阅者 Telemetry产品团队 上 . 我们检查了要发送的事件、要排除的数据和代码添加方法. 谁负责审核此页面

有用于
  • Celery 工作进程结果
  • Celery重试分析
  • 重试与任务关联
实施证据

使用 Django and Celery structured event monitoring 发送并验证事件

观察一次 Celery 任务尝试,保留其原始结果,并在创建图表前核对记录的状态。

  1. 1

    选择尝试

    Celery 工作进程结果

  2. 2

    定义合同

    job_name、job_id、queue_name、observed_state 和 status

  3. 3

    记录尝试状态

    此示例将 task_postrun 的 SUCCESS、FAILURE 和 RETRY 记录为尝试状态;重试不是最终失败。

  4. 4

    核实证据

    运行已知任务并查询 celery_task_attempt_finished,检查观察到的尝试状态;重试行不是最终结果。

开始之前

开始之前

  • 服务器端TELEMETRY_API_KEY
  • 工作进程中已安装 Celery
  • 在 Celery 工作进程启动时导入此模块

交货设置

安装并初始化服务器端

此 Celery 工作进程模块通过 Python 标准库 HTTP 发送事件,无需安装或初始化 Telemetry SDK。 将摄取凭据保留在浏览器包、客户端可见的环境变量、源代码控制、日志和异常消息之外。

  1. 1每个工作进程加载信号模块一次,导出错误不得改变任务结果。
  2. 2在成功、失败、重试或超时边界处添加结果事件。
  3. 3在启用警报之前发送受控装置并检查存储的行。

片段

从一个结构化事件开始

在工作流程完成、失败或重试的位置添加此形状。然后从真实的字段构建仪表板。

django-celery

Django and Celery structured event monitoring事件

python
import json
import logging
import os
from urllib.request import Request, urlopen
from celery.signals import task_postrun


def report_export_failure():
    try:
        logging.getLogger(__name__).warning("Telemetry export unavailable")
    except Exception:
        pass


@task_postrun.connect(weak=False)
def record_task(sender=None, task_id=None, state=None, **kwargs):
    try:
        status = {"SUCCESS": "success", "FAILURE": "failed",
                  "RETRY": "retry_scheduled"}.get(state)
        if status is None:
            return  # Other states need their own observed lifecycle handlers.
        key = os.getenv("TELEMETRY_API_KEY")
        if not key:
            report_export_failure()
            return
        delivery = sender.request.delivery_info or {}
        payload = {
            "table": "celery_task_attempt_finished",
            "data": {
                "job_name": sender.name,
                "job_id": task_id,
                "queue_name": delivery.get("routing_key"),
                "observed_state": state,
                "status": status,
                "attempt": sender.request.retries + 1,
            },
        }
        request = Request("https://api.telemetry.sh/log",
                          data=json.dumps(payload).encode("utf-8"),
                          headers={"Authorization": key,
                                   "Content-Type": "application/json",
                                   "User-Agent": "telemetry-agent/1.0"},
                          method="POST")
        # Socket timeout, not a hard end-to-end deadline. Export can be lost.
        with urlopen(request, timeout=1.0) as response:
            if not 200 <= response.status < 300:
                report_export_failure()
    except Exception:
        # Do not let export or metadata errors replace the task outcome.
        report_export_failure()

事件结构

job_name、job_id、queue_name、observed_state 和 status

所观察执行的 attempt 为 retries + 1

仅包含工作进程元数据;导出前请检查任务和队列标识符

检查配置

检查站 1

此示例将 task_postrun 的 SUCCESS、FAILURE 和 RETRY 记录为尝试状态;重试不是最终失败。

检查站 2

重试时保留逻辑任务 ID,并将 retries + 1 记录为尝试序号。

检查站 3

在每个工作进程中导入此模块一次。它不记录 Django 请求,也不测量任务耗时。

检查站 4

导出尽力而为,套接字超时为一秒;它会增加工作进程延迟,未实现严格的总耗时上限、持久化投递或导出重试。

检查站 5

不要将任务参数、结果、异常文本、URL 或凭据写入事件。工作进程丢失或终止可能阻止 task_postrun,因此缺失事件的状态未知。

验证

证明事件已到达

在演练已知的成功和失败案例后运行此命令。如果您的最终事件契约与代码片段不同,请替换后备表名称。

django-celery-验证

Django and Celery structured event monitoring 验证查询

sql
SELECT *
FROM celery_task_attempt_finished
ORDER BY timestamp_utc DESC
LIMIT 20;
确认每个逻辑结果的一个终端行,以及预期状态、标识符、单位和 UTC 时间。
检查推断的架构并验证重试不会更改字段类型或生成新的逻辑事件 ID。
在存储的字段中搜索凭据、原始有效负载、提示、私有内容和无限制的错误消息。
在将仪表板视为完整之前,请执行提供程序超时、摄取拒绝和进程关闭。

实施参考

在启用新的生产路径之前,请检查事件合同、数据安全指南和上游主要文档。

在哪里记录事件

保持结果事件小且可恢复

该模式提供了

  • 除了上游工作流程之外,还有一个有界的、SQL 就绪的结果。
  • 用于仪表板、警报和跨事件关联的稳定字段。
  • 用于验证成功、失败、重试和超时行为的夹具驱动路径。

该模式不提供

  • OTLP 导出器、自动收集管道或详细跟踪和诊断日志的替代品。
  • 仅因为有效负载包含事件 ID,所以仅传送一次。
  • 收集原始提供商有效负载、用户内容、凭证或受监管数据的权限。

事件模式示例

在将查询或代码片段适应生产之前,请检查行粒度、发出边界、所需类型、隐私类、示例有效负载和验证清单。

相关产品功能

继续此工作流程 告警

将经过审查的可靠性查询提升到拥有的阈值和响应工作流程中。

相关 SQL 查询示例

更多 SQL 示例

针对此工作流程中的结构化字段运行查询,检查示例结果,并将有用的答案转换为仪表板或警报。

浏览所有查询示例

按实施系列浏览

比较相关集成模式

与此集成配对的模板

更多集成