Activity.SpanId 在 .NET Framework 上为 0000000000000000

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

我有以下 csharp 程序:

using System.Diagnostics;
using System.Runtime.InteropServices;

var listener = new ActivityListener()
{
    // This is only for internal Sentry events
    ShouldListenTo = (source) => source.Name.StartsWith("ConsoleApp9"),
    Sample = (ref ActivityCreationOptions<ActivityContext> _) => ActivitySamplingResult.AllData,
    ActivityStarted = activity => Console.WriteLine($"Started activity {activity.SpanId}"),
    ActivityStopped = _ => { }
};
ActivitySource.AddActivityListener(listener);

var tracer = new ActivitySource("ConsoleApp9");

Console.WriteLine("Framework: {0}", RuntimeInformation.FrameworkDescription);
Console.WriteLine("Starting activity...");
var data = tracer.StartActivity("foo");
Console.WriteLine($"Stopping activity {data?.SpanId}");
data?.Stop();

为了使其在 .NET Framework 中运行,我添加了对 System.Diagnostics.DiagnosticSource 8.0.0 NuGet 包的显式引用。

当我运行这个编译并使用 .NET 8.0 运行它时,我看到了我所期望的:

Framework: .NET 8.0.2
Starting activity...
Started activity 07cf31b8b4e65543
Stopping activity 07cf31b8b4e65543

但是,当我将其编译为 .NET Framework 4.8 并使用 mono 运行它时,没有任何 ID 被初始化,导致以下输出:

Framework: Mono 6.12.0.199 (2020-02/f648ec1e0a6 Wed Jun 14 09:24:35 EDT 2023)
Starting activity...
Started activity 0000000000000000
Stopping activity 0000000000000000

有谁知道这是什么原因造成的吗?最终我希望在所有目标框架上自动生成 ID。

c# .net mono system.diagnostics
1个回答
0
投票

我从 dotnet 运行时的一位贡献者那里得到了答案

仅当活动 ID 格式为 W3C 时,Activity.SpanId 才会获取非零值。自 .NET 5 以来,默认值是 W3C,但即使在新版本的 System.Diagnostics.DiagnosticSource 包中,新的默认值也仅适用于您的应用程序在现代 .NET 上运行时,并且它在 .NET Framework 上继续使用旧的分层格式.

您可以通过编写 Activity.DefaultIdFormat = ActivityIdFormat.W3C; 切换到现代 .NET 默认设置;在程序开始时。

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