You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenTelemetry追踪Django应用疑问:为何无法捕获log_console函数的调用痕迹?

Django + OpenTelemetry:自定义函数追踪问题解析

核心结论

OpenTelemetry的DjangoInstrumentor默认不会自动追踪你自定义的普通函数,它只覆盖Django框架本身的关键链路(比如请求处理、数据库操作、模板渲染等核心环节)。你的log_console属于业务自定义函数,不在默认instrumentation的范围内,所以看不到追踪数据是正常的。

如何追踪自定义函数

要捕获这类函数的调用痕迹,需要手动给目标函数添加OpenTelemetry的span追踪代码,有两种常用方式:

1. 使用装饰器快速添加追踪

直接用OTel tracer的装饰器标记目标函数:

from opentelemetry import trace
from datetime import datetime
from django.http import HttpResponse

# 获取全局tracer
tracer = trace.get_tracer(__name__)

@tracer.start_as_current_span("log_console")
def log_console():
    print("Print in terminal")

def show_date():
    now = datetime.now()
    log_console()
    return HttpResponse(f"Current date: {now}")

2. 手动控制Span生命周期

如果需要更精细的控制(比如在函数内部添加事件、设置属性),可以手动创建和管理span:

from opentelemetry import trace
from datetime import datetime
from django.http import HttpResponse

tracer = trace.get_tracer(__name__)

def log_console():
    # 创建并启动span
    with tracer.start_as_current_span("log_console") as span:
        # 可选:给span添加自定义属性
        span.set_attribute("action", "console_log")
        print("Print in terminal")

def show_date():
    now = datetime.now()
    log_console()
    return HttpResponse(f"Current date: {now}")

验证效果

修改代码后重启Django服务,发起请求后,你就能在控制台的追踪数据中看到log_console对应的span,它会作为show_date视图span的子span存在。

补充说明

如果你的项目中有大量自定义函数需要追踪,也可以通过OpenTelemetry的auto-instrumentation扩展针对特定模块配置自动hook,但手动添加追踪的方式更灵活,能精准控制哪些函数需要被监控,避免产生冗余的追踪数据。

内容的提问来源于stack exchange,提问作者H D

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 22:12:13