2014-12-10 4 views
2

Я обновил до Azure SDK 2.5 и переключился на семантическую регистрацию с помощью EventSources. Лесозаготовительные работы локально с обычным EventListener.События ETW в Azure-диагностике (SDK 2.5) регистрируются с неправильной/отсутствующей схемой

При развертывании, журналы записываются в таблицу памяти, но только EventId, Pid, Tid и т.д. населены, по-настоящему интересные поля (Message, задачи, ключевое слово, Опкод) оставлены пустыми.

Журнал диагностики инфраструктуры полна ошибок в отношении 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, который регистрируется, является правильным, но вся важная информация журнала отсутствует, я полагаю, из-за неполной конфигурации?


Edit: вот мой 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); 
    } 
    [...] 
} 
+0

Можете ли вы поделиться своим кодом вашей реализации EventSource? – schadr

+0

@schadr Я обновил свой вопрос с (частью) реализации. Я уже немного повеселился с неправильными значениями ключевых слов и т. П. - есть ли способ проверить, действительно ли реализация, особенно учитывая будущие разработки? – enzi

ответ

3

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

Я должен был исправить следующее:

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

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

0

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

В нашем случае, имея и вызвали - The EtwEventSourceProvider нибудь не войти - The EtwEventManifestProvider войти так же, как вырисовать с пустыми точками.