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链路追踪配置的同时,添加专门的日志处理器来发送独立的自定义事件:
- 确保依赖包齐全:
pip install azure-monitor-opentelemetry opentelemetry-instrumentation-django
- 修改代码(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直接发送事件:
- 安装依赖包:
pip install azure-applicationinsights
- 修改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
相关产品推荐
相关产品推荐

