In-Memory Exporter无法采集Activity问题求助
问题分析与解决方案
你的测试用例失败主要有两个关键原因,对应的修正方案如下:
1. 未结束Activity
OpenTelemetry的In-Memory Exporter只会在Activity结束时将数据写入集合。你的代码里仅调用了StartActivity,但未终止Activity,导致数据无法被导出。
2. 默认采样策略可能过滤了Activity
默认情况下,OpenTelemetry的采样器可能不会采集所有Activity,需要显式设置采样率为100%,确保测试中的Activity被采集。
修正后的完整代码
[Fact] public void Can_collect_Activities_in_memory() { var serviceName = "ServiceName"; var activities = new List<Activity>(); var tracerProvider = Sdk.CreateTracerProviderBuilder() .AddSource(serviceName) .SetResourceBuilder(ResourceBuilder.CreateDefault().AddService("in-memory")) .AddInMemoryExporter(activities) // 设置采样率为100%,确保所有Activity都被采集 .SetSampler(new AlwaysOnSampler()) .Build(); var source = new ActivitySource(serviceName); // 使用using语句自动结束Activity,替代手动调用activity.Stop() using var activity = source.StartActivity("TestActivity"); // 强制立即导出所有待处理的Activity,确保断言前数据已写入集合 tracerProvider.ForceFlush(); Assert.Single(activities); }
额外说明
using语句可以自动管理Activity的生命周期,避免因忘记调用Stop()导致的数据无法导出问题。tracerProvider.ForceFlush()会强制导出所有未处理的Activity,无需依赖延迟等待就能确保集合中已有数据。
内容的提问来源于stack exchange,提问作者honey_ramgarhia
相关产品推荐
相关产品推荐

