События ETW в диагностике Azure (SDK 2.5) регистрируются с неправильной или отсутствующей схемой.

Я обновился до Azure SDK 2.5 и переключился на семантическое ведение журнала с помощью EventSources. Ведение журнала работает локально с пользовательским файлом EventListener.

При развертывании логи записываются в таблицу хранилища, но заполняются только EventId, Pid, Tid и т.д., действительно интересные поля (Message, Task, Keyword, Opcode) остаются пустыми.

Журнал диагностики инфраструктуры полон ошибок в отношении ETW, но я не знаю, что с ними делать:

Failed to load backup EventSource manifest file C:\Resources\{13b7ec61-6424-d4d3-9972-a83e58d8d6bb}\directory\f71b19461fcf494d89d3717b3a13cadf.    something.WorkerRole.DiagnosticStore\WAD0103\Configuration\EventSource_Manifest_fe06b63d-39aa-5419-0529-18c4dacf4f68_Ver_20.backup.xml;  

EventSource    events will be logged without a proper schema until provider sends the manifest packets

Load manifest file failed for C:\Resources\{13b7ec61-6424-d4d3-9972-a83e58d8d6bb}\directory\f71b19461fcf494d89d3717b3a13cadf.something. WorkerRole.   DiagnosticStore\WAD0103\Configuration\EventSource_Manifest_fe06b63d-39aa-5419-0529-18c4dacf4f68_Ver_20.xml

Failed to manage manifest version for file C:\Resources\{13b7ec61-6424-d4d3-9972-a83e58d8d6bb}\directory\f71b19461fcf494d89d3717b3a13cadf. something.   WorkerRole.DiagnosticStore\WAD0103\Configuration\EventSource_Manifest_fe06b63d-39aa-5419-0529-18c4dacf4f68_Pid_3436.xml

Failed to process EventSource manifest event GUID:fe06b63d-39aa-5419-0529-18c4dacf4f68, event id:0xFFFE

Change in the number of events lost since the last sample: EventsCaptured=2 EventsLogged=1 EventsLost=0 

Я не использую файл манифеста и указываю EventSource через имя класса/атрибута:

<EtwEventSourceProviderConfiguration scheduledTransferPeriod="PT3M" scheduledTransferLogLevelFilter="Information" provider="something.Core">
  <DefaultEvents eventDestination="CoreEvents" />
</EtwEventSourceProviderConfiguration>

Я должен что-то упустить, но я не знаю, что.

Остальные диагностические сервисы все работают (журналы инфраструктуры, счетчик производительности и т.д.). Регистрируемый EventId является правильным, но вся важная информация журнала отсутствует, я полагаю, из-за неполной конфигурации?


Изменить: вот мой код EventSource. Весь пост выкладывать не буду, так как он очень большой. Я использую другой тип, который вызывает методы EventSource и обрабатывает форматирование параметров (если источник включен на этом уровне). Большинство аргументов метода имеют тип string, объекты или другие сложные типы не передаются (которые обрабатывают другой тип).

[EventSource(Name = "something.Core")]
public sealed class CoreEventSource : EventSource {
    private static readonly CoreEventSource SoleInstance = new CoreEventSource();

    static CoreEventSource() {}
    private CoreEventSource() {}

    public static CoreEventSource Instance {
        get { return SoleInstance; }
    }

    public static EventKeywords AllKeywords = (EventKeywords)(-1);

    public class Keywords {
        public const EventKeywords None = (EventKeywords)(1 << 1);

        public const EventKeywords Infrastructure = (EventKeywords)(1 << 2);
        [...]
    }

    public class Tasks {
        public const EventTask None = EventTask.None;

        // generic operations
        public const EventTask Create = (EventTask)11;
        public const EventTask Update = (EventTask)12;
        public const EventTask Delete = (EventTask)13;
        public const EventTask Get = (EventTask)14;
        public const EventTask Put = (EventTask)15;
        public const EventTask Remove = (EventTask)16;
        public const EventTask Process = (EventTask)17;
    }

    [Event(1, Message = "Initialization of {0} failed: {1}.", Level = EventLevel.Critical, Keywords = Keywords.Infrastructure)]
    public void CriticalInitializationFailure(string component, string details, string exception) {
        this.WriteEvent(1, component, details, exception);
    }

    [Event(2, Message = "[Role '{0}'] Startup: {1}", Level = EventLevel.Informational, Keywords = Keywords.Infrastructure)]
    public void RoleStartup(string roleName, string message) {
        this.WriteEvent(2, roleName, message);
    }

    [Event(3, Message = "[Role '{0}'] Stop failed: {1}.", Level = EventLevel.Error, Keywords = Keywords.Infrastructure)]
    public void RoleStopFailed(string roleName, string details, string exception) {
        this.WriteEvent(3, roleName, details, exception);
    }

    [Event(4, Message = "An unhandled exception occurred.", Level = EventLevel.Critical, Keywords = Keywords.Infrastructure)]
    public void UnhandledException(string exception) {
        this.WriteEvent(4, exception);
    }

    [Event(5, Message = "An unobserved exception occurred in a faulted task.", Level = EventLevel.Critical, Keywords = Keywords.Infrastructure)]
    public void UnobservedTaskException(string exception) {
        this.WriteEvent(5, exception);
    }
    [...]
}

person enzi    schedule 10.12.2014    source источник
comment
Можете ли вы поделиться своим кодом реализации EventSource?   -  person schadr    schedule 11.12.2014
comment
@schadr Я обновил свой вопрос (частью) реализации. Я уже повеселился с неправильными значениями ключевых слов и т. п. — можно ли каким-то образом проверить, действительна ли реализация, особенно с учетом будущих разработок?   -  person enzi    schedule 11.12.2014


Ответы (2)


Оказывается, с моим EventSource было довольно много проблем. Первое, что я рекомендую всем, кто работает с ETW, — это использовать Microsoft TraceEvent. Библиотека от NuGet, даже если вы используете System.Diagnostics.Tracing, потому что она поставляется с инструментом, который проверит ваш EventSource код и уведомит вас о проблемах.

Пришлось исправить следующее:

  • EventSource имена не должны содержать точку .
  • Пары задача/код операции должны быть уникальными в пределах EventSource
  • Нельзя объявлять поле None в пользовательском перечислении ключевых слов или задач.

Надеюсь, что это будет полезно для тех, кто сталкивается с подобной проблемой.

person enzi    schedule 17.12.2014

Еще одна вещь, о которой следует позаботиться (которая исправила наш случай): EventSources должны иметь только имя или идентификатор, а не оба.

В нашем случае обе причины: - EtwEventSourceProvider ничего не регистрирует - EtwEventManifestProvider регистрируется так же, как вы описали, с пустыми точками данных.

person Saca    schedule 20.05.2015