Отсутствует идентификатор ActivityId в событиях ETW, опубликованных из разных потоков

Итак, у меня есть служба WCF, которую я размещаю в консольном приложении на моей машине разработки. Я запускаю PerfView на том же компьютере для сбора событий ETW (отслеживание событий для Windows). Служба WCF использует TPL (параллельную библиотеку задач), и я пытаюсь сопоставить события ETW во всех потоках на протяжении всего времени существования запроса WCF. Я говорю строго о сервере, а не о клиенте и сервере. Однако, когда я просматриваю события в PerfView и фильтрую представление только для тех событий из моего пользовательского EventSource, только события в некоторых потоках имеют ActivityId. Для любого данного потока либо все события имеют ActivityId, либо ни одно из событий не имеет. Кроме того, ни одно из событий не имеет RelatedActivityId.

Эта ссылка относится к блоку приложения семантического ведения журнала (SLAB), но в нем упоминается, что:

При использовании задач TPL каждый поток получает свой собственный идентификатор действия, а код планирования TPL автоматически публикует события передачи, содержащие значения ActivityId и RelatedActivityId. Их можно использовать для корреляции связанных событий.

Мне кажется, это совсем не так. Я не только не вижу каких-либо событий передачи для сопоставления идентификаторов действий, но во многих случаях, как я упоминал ранее, идентификаторы действий вообще отсутствуют.

Согласно этому ответу SO: https://stackoverflow.com/a/27620321/1937249:

Если вы используете прослушиватели вне процесса, то возникает ошибка, что конфигурация TPL по имени не работает, и вместо нее должен использоваться GID: https://slab.codeplex.com/workitem/62

Поэтому я попытался добавить GUID источника события в «Дополнительные поставщики» PerfView вместо его имени, например:

введите здесь описание изображения

Однако это не имело значения. Мои события были опубликованы, но многим из них все еще не хватало ActivityId, а всем событиям не хватало RelatedActivityId.

И последнее, что может иметь значение: я использую пространство имен Microsoft.Diagnostics.Tracing в пакете Microsoft.Diagnostics.Tracing.EventSource NuGet, а не System.Diagnostics.Tracing, встроенное в фреймворк.

ИЗМЕНИТЬ

Вот изображение, показывающее все типы событий, которые были захвачены из TplEventSource. Я предполагаю, что это означает, что TplEventSource включен. Мне не ясно, должен ли я видеть в списке «событие перевода» или одно из событий должно иметь ключевое слово или другое поле, указывающее, что это был перевод. Если предполагается фактическое «событие передачи», я не вижу ничего подобного в списке.

введите здесь описание изображения

PerfView Вывод

Вот изображение списка событий из моего пользовательского EventSource для одного запроса WCF. Вы можете видеть, что запрос начинается с идентификатора потока 10 724. Каждое событие в этом потоке имеет ActivityId. «Asi-Geoservices/StartAuthenticateRequest/Start» выполняет асинхронный вызов базы данных, и приложение возобновляет работу в потоке 8268. Ни одно из событий в потоке 8268 не имеет ActivityId. 'Asi-Geoservices/StartServiceProviderRequest/Start' делает асинхронный HTTP-запрос, и приложение возобновляет работу в потоке 11 764, где, опять же, каждое событие в этом потоке имеет ActivityId. После «Asi-Geoservices/StartServiceProviderRequest/Stop» выполняется еще один асинхронный вызов базы данных, и приложение снова возобновляет работу в потоке 8268, где запрос в конечном итоге завершается, но на этот раз каждое событие в потоке теперь имеет ActivityId.

введите здесь описание изображения


person Jason Boyd    schedule 15.04.2016    source источник
comment
Вам нужно включить источник событий TPL, чтобы получать его события передачи?   -  person svick    schedule 15.04.2016
comment
@svick - насколько мне известно, он включен (я опубликую еще одну картинку). Даже если бы он не был включен, похоже, что ActivityId должен быть ненулевым, у меня просто не было бы RelatedActivityId для их сопоставления. Это мое понимание этого до сих пор, но я могу ошибаться.   -  person Jason Boyd    schedule 15.04.2016
comment
@JasonBoyd, у вас когда-нибудь это работало - мне удалось заставить это работать на .Net 4.6.2 и последней версии PerfView. Мне нужно было убедиться, что дополнительные поставщики также включают запись для «.NETTasks:0x80», но это почти все, что было нужно.   -  person cristobalito    schedule 21.05.2016
comment
@cristobalito - Итак, я вернулся к проекту через несколько месяцев, и... внезапно все заработало. Я абсолютно не понимаю, что произошло. Я подумал, что это может быть связано с тем, что я обновил свою рабочую станцию ​​до Windows 10, поэтому я перенес проект из репозитория git на компьютер с Windows 7 в офисе, чтобы протестировать его, и он также отлично работал на этой машине. Какой совершенно неудовлетворительный вывод по этому вопросу.   -  person Jason Boyd    schedule 21.07.2016
comment
Таким образом, Win10 поставляется с .net 4.6 из коробки, и если вы посмотрите примечания к выпуску, в нем упоминаются некоторые работы в этой области.   -  person cristobalito    schedule 23.07.2016