System.Diagnostics.ActivitySource.StartActivity 返回 null。

8

我还没有找到使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);
    }
2个回答

13

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

4
答案是您需要包括一个ActivitySamplingResult,而不是设置为None。默认值似乎是None。MaGu的答案有效,因为他们设置了:
Sample = (ref ActivityCreationOptions activityOptions) => ActivitySamplingResult.AllData
关于StartActivity方法周围的方法的文档说它需要一个侦听器,但这并不是完整的故事,您需要一个活动侦听器,它将处理活动。将样本设置为None意味着它实际上不在其中。

谢谢这个提示。SetSampler(new AlwaysOnSampler()) 对我有用。不过,我认为@MaGu的答案是更长期的解决方案。无论如何,我对这个答案点赞。 - Kimutai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接