事件源追踪与关联活动 ID

6
我已开始使用ETW和Entlib 6的进程外语义日志块。 当我使用async/await时,继续线程上未设置CurrentThreadActivityId,并且TPL框架不记录传输事件。 这使得执行端到端跟踪非常困难。
根据Microsoft的文档,TPL框架应记录传输事件并生成新的activityid,但我似乎无法使其正常工作。 Entlib 6文档 以下是显示问题的简短示例:
为了记录TPL事件,我正在使用以下内容:
<eventSource name="System.Threading.Tasks.TplEventSource" level="Informational" matchAnyKeyword="1"/>

这是我的测试代码:

using System;
using System.Collections.Generic;
using System.Diagnostics.Tracing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AsyncContextTest
{
    class Program
    {
        static Guid _activityId = Guid.NewGuid();

        static void Main(string[] args)
        {
            EventSource.SetCurrentThreadActivityId(_activityId);
            Console.WriteLine(EventSource.CurrentThreadActivityId);
            Task t = Task.Run(async () => await DoStuffAsync());
            Console.WriteLine(EventSource.CurrentThreadActivityId);

            Console.Read();
        }

        public static async Task DoStuffAsync()
        {
            var x = "one,two,three".Split(',');
            Console.WriteLine(EventSource.CurrentThreadActivityId);
            await Task.Delay(1000);
            Console.WriteLine(EventSource.CurrentThreadActivityId);
            var y = String.Join(",", x);

            Console.WriteLine("Done");

        }
    }
}

结果

334540cc-ccb1-4196-8587-815abf237e4c
334540cc-ccb1-4196-8587-815abf237e4c
00000000-0000-0000-0000-000000000000
00000000-0000-0000-0000-000000000000
Done

有人有一个简单的例子展示如何正确地使用ETW和async/await进行端到端追踪吗?

编辑:

我能够通过进程内监听器正确地运行它,但是无法通过进程外监听器记录TPL中的任何内容。


这是因为控制台应用程序使用ThreadPoolSynchronizationContext,它在任意线程池线程上执行继续操作。您将从那里使用ETW还是仅用于测试目的? - Yuval Itzchakov
1
@YuvalItzchakov - 这将是一个Windows服务,所以是的。我已经实现了STA同步上下文,但开销太大了。关键是await应该记录传输事件并在新线程上设置新的活动ID。我发现await正在执行它的工作,但是进程外的语义日志块没有捕获到它,所以我已经将其提交给Microsoft作为错误报告。 - Chris Gessler
我明白你的意思。不错 :) - Yuval Itzchakov
你是怎么做到那个的?对我来说,在等待上述示例后,EventSource.CurrentThreadActivityId 总是为零。 - Mikl X
如果您正在使用 .NET 4.6+,您可以使用 AsyncLocal 实现自己的包装器。但是据我所知,仍然没有很好的解决方案。 - Alex Vallejo
1个回答

1

将配置更改为使用事件源的GUID而不是名称。

<eventSource id="2e5dba47-a3d2-4d16-8ee0-6671ffdcd7b5" level="Informational" />

输出将会是这样的:
605e615a-c849-4ee7-95b8-e6677f945c3f
605e615a-c849-4ee7-95b8-e6677f945c3f
00000001-0001-0000-0c22-0000ffdcd7b5
00000002-0001-0000-0c22-0000ffdcd7b5
Done

有没有简单的示例展示了如何在使用ETW和async/await进行端到端跟踪?

还在寻找中...


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