OTLP 不会将多个活动源跟踪到 AppInsight

问题描述 投票:0回答:1

我在使用多个 ActivitySource 使用专用源名称来模拟潜在的检测库来制作 POC 时遇到了困难。 我的设置如下

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 var source = new ActivitySource(ApplicationName!);
 using var tracedActivity = source.StartActivity(name: activityName ?? memberName);

每次我需要开始跟踪某些代码或函数时,效果都很好;我可以在 appInsight 中看到我的痕迹和跨度。

现在我正在尝试使用在某处声明的 ActivitySource 来模拟仪器包

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

每次我想使用另一个 ActvitySource 跟踪代码时都会调用。

我的问题是,我在 AppInsight 或控制台导出中完全看不到来自第二个 ActivitySource 的任何内容。 在我的示例跟踪测试代码中,我验证了两个 ActivitySource 都创建了一个活动,表明存在侦听器,但仅此而已。 我仍然看到来自名为 openTelemetryOptions.ApplicationName 的 ActivitySource 的活动,这没有损坏。

我使用了 OpenTelemetry GitHubNpgSql GitHub 中的文档来复制执行此操作的“正确方法”,但缺少一些内容,我无法找出什么。根据我的阅读,当您忽略检测类的 IOC 设置时,在 TraceProviderBuilder 中添加源并创建共享相同名称的 ActivitySource(静态或非静态)几乎就是它们所做的全部事情。

我确信我做得不对的一件事是 .ConfigureResource() 的使用。我不太明白这是做什么的,有些软件包似乎可以做到这一点,有些则不能。如果有人对此有见解,我想理解那部分。

编辑

我删除了第二个ConfigureResource并添加了SetSampler(),但这不是问题。 因此,我们采取并排复制粘贴所有执行的代码来查找可能出现的问题;我看到了这个问题。这就是我使用这两个活动的方式:

    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"));

区别在于第一个活动的“使用”,而不是第二个活动。 我测试了一下,这是我的问题。 回头看,从

Git readme

中的这一行应该是显而易见的:

导出器公开用于导出批量已完成的 Activity 实例的钩子(批量可能包含单个或多个记录)并由处理器调用。

关键词是
已完成

,我现在知道意味着已处置。 谢谢您的建议。

asp.net-core trace open-telemetry
1个回答
0
投票

© www.soinside.com 2019 - 2024. All rights reserved.