2014-10-14 4 views
4

ETW 및 Outl of Process Semantic Logging Block을 Entlib 6에서 사용하기 시작했습니다. async/await를 사용하면 CurrentThreadActivityId가 연속 스레드에 설정되지 않고 TPL 프레임 워크에서 설정됩니다. 전송 이벤트를 기록하지 않습니다. 따라서 종단 간 추적을 수행하는 것이 매우 어렵습니다.상관 관계가있는 활동 ID를 사용하는 EventSource 추적

Microsoft의 설명서에 따르면 TPL 프레임 워크는 전송 이벤트를 기록하고 새로운 activityid를 생성하기로되어 있지만 제대로 작동하지 않는 것으로 보입니다. 여기

Documentation from 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에서 아무 것도 기록되지 않습니다.

+0

발생합니다. 거기에서 ETW를 사용 하시겠습니까? 아니면 단순히 테스트 목적으로 사용 하시겠습니까? –

+1

@YuvalItzchakov - Windows 서비스이므로 예. STA 동기화 컨텍스트를 구현했지만 오버 헤드가 너무 많습니다. 요점은 기다리는 것이 전송 이벤트를 기록하고 새 스레드에서 새 활동 ID를 설정해야한다는 것입니다. 나는 그 일을 기다리는 중임을 알았지 만, out-of-process 시맨틱 로깅 블록은이를 픽업하지 않으므로 이것을 Microsoft에 버그로 제출했습니다. –

+0

당신이 말하는 것을 봅니다. 좋은 한 분 :) –

답변

0

이름 대신 이벤트 소스의 GUID를 사용하도록 구성을 변경하십시오.

605e615a-c849-4ee7-95b8-e6677f945c3f 
605e615a-c849-4ee7-95b8-e6677f945c3f 
00000001-0001-0000-0c22-0000ffdcd7b5 
00000002-0001-0000-0c22-0000ffdcd7b5 
Done 

사람이 ETW 및 비동기/await를 함께 추적 끝에 끝을 할 수있는 적절한 방법을 보여주는 간단한 예제가 있습니까 : 같은

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

출력이 보입니까? 콘솔 응용 프로그램이 인해 임의 스레드 스레드에서 연속 요청을 실행하는`ThreadPoolSynchronizationContext`을 사용하기 때문에

여전히 찾고

...

관련 문제