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

Django应用OpenTelemetry接入Azure Application Insights无法记录Event

问题分析与解决方案

核心概念澄清

你混淆了两个完全不同的日志/事件类型:

  • 你用span.add_event()添加的是OpenTelemetry Span事件,这类事件属于链路追踪的附属数据,Azure Monitor的OpenTelemetry导出器默认会将其归类到「Traces(痕迹)」中,和普通日志混在一起展示。
  • 你试图查看的「Activity Log」是Azure订阅级别的资源操作日志(比如创建云服务器、修改资源配置这类平台级操作),和你的应用自定义事件没有关系。你实际需要的是Application Insights面板里的自定义事件(Custom Events)——这才是用来记录应用业务事件的模块。

解决方案

方案1:基于OpenTelemetry发送自定义事件

保持现有OpenTelemetry链路追踪配置的同时,添加专门的日志处理器来发送独立的自定义事件:

  1. 确保依赖包齐全:
pip install azure-monitor-opentelemetry opentelemetry-instrumentation-django
  1. 修改代码(Logger配置建议放到settings.py或manage.py的全局初始化部分,避免重复实例化):
import logging
from opentelemetry import trace
from opentelemetry.sdk._logs import LoggerProvider, LoggingHandler
from opentelemetry.sdk._logs.export import BatchLogRecordProcessor
from azure.monitor.opentelemetry.exporter import AzureMonitorLogExporter

# 初始化自定义事件Logger
logger_provider = LoggerProvider()
log_exporter = AzureMonitorLogExporter(
    connection_string="你的Azure连接字符串"
)
logger_provider.add_log_record_processor(BatchLogRecordProcessor(log_exporter))
event_handler = LoggingHandler(logger_provider=logger_provider)

# 创建专门用于发送事件的Logger实例
event_logger = logging.getLogger("app_custom_events")
event_logger.addHandler(event_handler)
event_logger.setLevel(logging.INFO)

class SomeView(LoginRequiredMixin, TemplateView):
    login_required = True
    template_name = "myapp/index.html"

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)

        tracer = trace.get_tracer(__name__)
        with tracer.start_as_current_span("SomeView") as span:
            if span.is_recording():
                span.set_attribute("user.id", self.request.user.id)
                span.set_attribute("user.email", self.request.user.email)

                # 发送自定义事件到Application Insights
                event_logger.info(
                    "用户访问首页",
                    extra={
                        "custom_dimensions": {
                            "user.id": self.request.user.id,
                            "user.email": self.request.user.email,
                            "page_path": self.request.path
                        }
                    }
                )

                span.add_event("Span内部追踪事件")  # 该事件仍会出现在Traces面板
                logging.getLogger().error("普通业务错误日志")

        context['something'] = SomeThing.objects.all()
        return context

方案2:用传统Azure SDK直接发送自定义事件

如果不需要强绑定OpenTelemetry链路,可以用更轻量化的旧版SDK直接发送事件:

  1. 安装依赖包:
pip install azure-applicationinsights
  1. 修改views.py代码:
import logging
from opentelemetry import trace
from applicationinsights import TelemetryClient

# 全局初始化Telemetry客户端(建议放到settings.py中)
tc = TelemetryClient("你的InstrumentationKey")

class SomeView(LoginRequiredMixin, TemplateView):
    login_required = True
    template_name = "myapp/index.html"

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)

        tracer = trace.get_tracer(__name__)
        with tracer.start_as_current_span("SomeView") as span:
            if span.is_recording():
                span.set_attribute("user.id", self.request.user.id)
                span.set_attribute("user.email", self.request.user.email)

                # 发送自定义事件
                tc.track_event(
                    "UserVisitedIndex",
                    properties={
                        "user.id": self.request.user.id,
                        "user.email": self.request.user.email
                    }
                )
                tc.flush()  # 立即发送事件(默认会批量缓存)

                span.add_event("Span内部追踪事件")
                logging.getLogger().error("普通业务错误日志")

        context['something'] = SomeThing.objects.all()
        return context

验证方式

配置完成后重启应用,触发目标视图后:

  • 打开Application Insights门户,进入「事件」面板(不是Azure门户的Activity Log),就能看到你发送的自定义事件,支持按事件名称、属性筛选。
  • 原有的Span事件和普通日志依然会正常出现在「Traces」面板,不影响链路追踪功能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 12:34:56