Как определить иерархию имен в ETW EventSource?

В моем проекте я использую System.Diagnostics.Tracing.EventSource следующим образом:

namespace kafka4net.Tracing
{
    [EventSource(Name = "kafka4net")]
    public class ConnectionTrace : EventSource
    {
        public static ConnectionTrace Log = new ConnectionTrace();

        public void Connecting(string host, int port)
        {
            Log.WriteEvent(1, host, port);
        }

        public void Connected(string host, int port)
        {
            Log.WriteEvent(2, host, port);
        }
    }
}

Я использую PerfView с функцией динамического провайдера, указав «*kafka4net» в поле «Дополнительные провайдеры». Это разрешает провайдера по его имени. Работает просто отлично. За одним исключением. События, которые я вижу, относятся к kafka4net/Connecting, тогда как я хотел бы видеть kafka4net/ConnectionTrace/Connecting.

Вообще говоря, я хочу, чтобы событие было продуктом/подсистемой/событием. Я вижу, что некоторые системные компоненты имеют такую ​​структуру, например «Microsoft-Windows-DotNETRuntime/GC/Start».

Я пытался поставить [EventSource(Name = "kafka4net-Connection")], но я не могу использовать его как динамическое событие в PerfView, потому что мне пришлось бы перечислять все мои подсистемы, такие как "kafka4net-Connection, kafka4net-Fetcher" и т. д. , И это не идет.

EventSource имеет свойство Name, которое может быть «продуктом» верхнего уровня, а имя функции используется как самый низкий уровень в иерархии имен событий. Как вставить средний элемент «подсистема» в иерархию имен событий?


person Vadym Chekan    schedule 26.12.2014    source источник


Ответы (1)


это невозможно сделать, потому что ProviderName/Event/OpCode — это соглашение для отображения событий в PerfView.

Microsoft-Windows-DotNETRuntime/GC/Start также следует этому. Microsoft-Windows-DotNETRuntime is — провайдер, GC — событие, а Start — код операции.

Вы можете использовать Задачи, чтобы получить лучший результат:

public class Tasks
{
    public const EventTask Connect = (EventTask)0x1;
}

[EventSource(Name = "kafka4net")]
public sealed class ConnectionTrace : EventSource
{
    public static ConnectionTrace Log = new ConnectionTrace();

    [Event(1, Task = Tasks.Connect, Opcode = EventOpcode.Start)]
    public void Connecting(string host, int port)
    {
        if (Log.IsEnabled())
        {
            Log.WriteEvent(1, host, port);
        }
    }

    [Event(2, Task = Tasks.Connect, Opcode = EventOpcode.Stop)]
    public void Connected(string host, int port)
    {
        if (Log.IsEnabled())
        {
            Log.WriteEvent(2, host, port);
        }
    }
}

Здесь у вас есть лучший вывод в PerfView:

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

person magicandre1981    schedule 27.12.2014
comment
Я не вижу связи между Tasks.Connect и выводом. - person Frank Hileman; 08.01.2015
comment
@FrankHileman Tasks.Connect просто объединяет два мероприятия. EventSource, похоже, берет имя первого объединенного метода, который он находит, и выводит его как task в манифесте. Поэтому для двух методов существует один task. В сочетании с Opcode это приводит к именам событий PerfView /Connecting/Start и /Connecting/Stop. Оба существуют как события в манифесте, но связаны с одной задачей. - person bentayloruk; 25.01.2016