System.Diagnostics.ActivitySource.StartActivity 返回 null

MaG*_*aGu 10 .net c# system.diagnostics .net-core

activitySource.StartActivity我还没有找到返回非空活动的方法,这与DiagnosticSource.StartActivity行为相比是不同的。是预期的吗?我错过了一些明显的东西吗?

我可以看到文档说:“创建的活动对象,如果它有活动侦听器,或者如果没有事件侦听器,则为 null。” 下面的测试仍然失败,正确的初始化方法是什么ActivityListener?我使用的包是"System.Diagnostics.DiagnosticSource" Version="5.0.0".

    [TestMethod]
    public void Start_Not_Null_When_ActivityListener_Added_And_ShouldListenTo_Explicitly_Defined_Activity()
    {
        var activitySource = new ActivitySource("ActivitySourceName");
        var activityListener = new ActivityListener
        {
            ShouldListenTo = s => true
        };
        ActivitySource.AddActivityListener(activityListener);
        
        using var activity = activitySource.StartActivity($"MethodType:/Path");
        
        Assert.IsNotNull(activity);
    }
Run Code Online (Sandbox Code Playgroud)

MaG*_*aGu 14

这个测试在github的帮助下通过了:

[TestMethod]
public void Start_Not_Null_When_ActivityListener_Added_And_ShouldListenTo_Explicitly_Defined_Activity()
{
    var activitySource = new ActivitySource("ActivitySourceName");
    var activityListener = new ActivityListener
    {
        ShouldListenTo = s => true,
        SampleUsingParentId = (ref ActivityCreationOptions<string> activityOptions) => ActivitySamplingResult.AllData,
        Sample = (ref ActivityCreationOptions<ActivityContext> activityOptions) => ActivitySamplingResult.AllData
    };
    ActivitySource.AddActivityListener(activityListener);

    using var activity = activitySource.StartActivity("MethodType:/Path");

    Assert.IsNotNull(activity);
}
Run Code Online (Sandbox Code Playgroud)


小智 5

答案是您需要包含一个未设置为 None 的 ActivitySamplingResult。默认值似乎是无。MaGu 的答案有效,因为他们设置了:

Sample = (ref ActivityCreationOptions<ActivityContext> activityOptions) => ActivitySamplingResult.AllData
Run Code Online (Sandbox Code Playgroud)

StartActivity 方法的文档说它需要一个侦听器,但这并不是完整的故事,您需要一个活动侦听器来对 Activity 执行某些操作。将样本设置为 None 意味着它实际上不在