Azure App Insights与OpenTelemetry追踪异常:示例显示为依赖而非追踪
解决Azure Monitor OpenTelemetry导出器Span显示为Dependency而非Trace的问题
你遇到的问题是因为OpenTelemetry导出器默认将无父级的独立Span标记为App Insights中的Dependency。要让它显示为Trace(请求类型),需要明确标记该Span为根请求Span,或者通过语义化属性告知导出器其类型。
解决方法
方法1:使用OpenTelemetry语义化Span Kind标记为服务器端请求
在创建Span时指定kind=SpanKind.SERVER,导出器会自动将这类根Span识别为App Insights的请求Trace。
修正后的完整代码:
""" 修改后的示例:将根Span标记为SERVER类型,使其在App Insights中显示为Trace """ import os from opentelemetry import trace from opentelemetry.sdk.trace import TracerProvider from opentelemetry.sdk.trace.export import BatchSpanProcessor from opentelemetry.trace import SpanKind # 新增导入Span类型枚举 from azure.monitor.opentelemetry.exporter import AzureMonitorTraceExporter tracer_provider = TracerProvider() trace.set_tracer_provider(tracer_provider) tracer = trace.get_tracer(__name__) exporter = AzureMonitorTraceExporter( connection_string=os.environ["APPLICATIONINSIGHTS_CONNECTION_STRING"] ) span_processor = BatchSpanProcessor(exporter) trace.get_tracer_provider().add_span_processor(span_processor) # 关键改动:指定SpanKind.SERVER,标记为根请求Span with tracer.start_as_current_span("hello", kind=SpanKind.SERVER): print("Hello, World!") tracer_provider.force_flush()
方法2:手动设置App Insights特定属性
如果不想依赖Span Kind,可以手动添加App Insights识别请求所需的属性:
ai.operation.type:设置为Requestai.operation.name:指定请求的显示名称
示例代码片段:
with tracer.start_as_current_span("hello") as span: # 手动标记为请求类型 span.set_attribute("ai.operation.type", "Request") span.set_attribute("ai.operation.name", "hello-request") print("Hello, World!")
补充说明
- 对于Web应用,推荐使用OpenTelemetry对应框架的Instrumentation包(如
opentelemetry-instrumentation-flask或opentelemetry-instrumentation-fastapi),它们会自动创建符合规范的根请求Span,无需手动标记。 - App Insights中,只有根Span且被标记为请求类型的条目才会出现在「Transactions(追踪)」视图中,其他无父级的Span默认被归类为Dependency。
内容的提问来源于stack exchange,提问作者James Steele
相关产品推荐
相关产品推荐

