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

OTLP无法将多ActivitySource追踪数据发送至AppInsight问题排查

多ActivitySource追踪数据不显示问题排查与解决

问题背景

正在做POC以模拟多Instrumentation库场景,使用不同名称的ActivitySource,但第二个ActivitySource的追踪数据无法在AppInsight或控制台导出中显示,仅第一个ActivitySource的数据能正常输出。

初始OpenTelemetry配置

services.AddOpenTelemetry()
        .WithTracing(traceBuilder =>
        {
            traceBuilder
                .AddConsoleExporter()

                .AddSource(openTelemetryOptions.ApplicationName)
                .AddSource(nameof(ActivityTracedClass))

                .ConfigureResource(resourceBuilder => resourceBuilder.AddService(openTelemetryOptions.ApplicationName))
                .ConfigureResource(resourceBuilder => resourceBuilder.AddService(nameof(ActivityTracedClass)))

                .ConfigureInstrumentation(services, openTelemetryOptions)
                .ConfigureExporter(openTelemetryOptions);
        });

原有正常用法

此前仅使用单个ActivitySource,通过using声明,追踪数据输出正常:

using var source = new ActivitySource(ApplicationName!);
using var tracedActivity = source.StartActivity(name: activityName ?? memberName);

问题复现场景

模拟Instrumentation包时,采用以下方式创建ActivitySource和Activity,虽确认Activity已被创建,但追踪数据完全不输出:

ActivitySource activitySource = new(nameof(ActivityTracedClass), "1.0.0");
var activity = activitySource.StartActivity();

核心问题定位与解决

最初怀疑ConfigureResource配置有误,移除第二个ConfigureResource并添加SetSampler()后问题仍存在。对比执行代码后发现关键差异:

问题代码中,第一个Activity使用了using语句,第二个未使用:

using var activitySource = new ActivitySource(nameof(ActivityTracedClass));
using var activity = activitySource.StartActivity(nameof(ActivityTracedClass) + "-Activity");

await Task.Delay(150);
activity!.AddEvent(new ActivityEvent("waited fro 150ms"));

var source = new ActivitySource(ActivityTracker.ApplicationName!);
var tracedActivity = source.StartActivity(name: ActivityTracker.ApplicationName! + "-Activity");

Thread.Sleep(50);
tracedActivity!.AddEvent(new ActivityEvent("waited for 50 ms"));

测试确认:OpenTelemetry导出器仅处理已完成(即已释放)的Activity实例——未使用using的Activity未被释放,因此不会被导出。给第二个Activity添加using声明后,追踪数据正常输出。

关于ConfigureResource的补充说明

ConfigureResource用于设置追踪的元数据资源信息(如服务名称、版本等),这些信息会附加到所有导出的Span中,帮助在监控系统中区分不同服务或组件。多次调用会合并配置,通常建议通过链式调用一次性添加多个资源属性,示例:

.ConfigureResource(resourceBuilder => 
    resourceBuilder.AddService(openTelemetryOptions.ApplicationName)
                   .AddService(nameof(ActivityTracedClass))
)

并非所有Instrumentation库都需要显式配置,部分库会自动注入自身资源信息,但自定义ActivitySource时,配置它能让追踪数据的归属更清晰。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 19:10:33