OTLP无法将多ActivitySource追踪数据发送至AppInsight问题排查
问题背景
正在做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

