Использование эластично масштабируемых облачных сервисов делает более важным, чем когда-либо, надлежащий мониторинг сервисов, чтобы диагностическая информация была доступна при необходимости. Это видно по тому, как диагностика Windows Azure (WAD) является основной функцией Windows Azure, поскольку WAD предоставляет единый способ сбора и сохранения различных типов диагностической информации.
В течение многих лет Windows поддерживала отслеживание приложений через класс Trace в пространстве имен Systems.Diagnostics . Этот класс предоставляет такие методы, как Write () , TraceInformation () и TraceError (), которые могут использоваться для записи событий, которые затем могут быть захвачены и сохранены слушателем. Например, WAD предоставляет приемник, который сохраняет эти события в таблицах Windows Azure.
Класс Trace имеет ряд сбоев, в том числе отсутствие какой-либо структуры для захваченной информации и необходимость принятия решения в момент использования такой информации, как серьезность ( предупреждение , ошибка и т. Д.) События. Это означает, что одно и то же сообщение может использоваться в разных местах с разным уровнем серьезности, что увеличивает сложность принятия решений на основе события трассировки.
Класс EventSource в пространстве имен System.Diagnostics.Tracing был представлен в .NET 4.5 для поддержки структурированного ведения журнала. Вместо использования таких методов, как TraceInformation (), для отслеживания событий, набор строго типизированных методов используется для отслеживания событий. Эти методы находятся в специфичном для приложения классе, полученном из EventSource . Получающиеся события обрабатываются с использованием механизма отслеживания событий для Windows (ETW), высокопроизводительной системы ведения журнала трассировки, широко используемой инфраструктурой Windows. ETW поддерживает строгую типизацию событий, делая информацию о событиях гораздо более полезной для потребителей. PerfView утилита может быть использована для просмотра любого события ETW сгенерированного в системе.
В корпоративной библиотеке Microsoft Patterns and Practices v6 представлен прикладной блок семантической регистрации (SLAB), который предоставляет набор потребителей EventSource (слушателей), которые можно использовать для сохранения событий EventSource в различных приемниках, включая плоские файлы, таблицы SQL Server и Windows Azure. Последний может использоваться, например, с соответствующим инструментированным приложением, развернутым на виртуальных машинах Windows Azure, для сохранения информации трассировки в таблице, где она может затем обрабатываться без необходимости доступа к экземпляру вычислений.
У Доминика Беттса есть отличное видео на 9 канале, описывающее SLAB. У Григория Мельника есть пост об использовании семантического ведения журнала . У Вэнса Моррисона, который, похоже, есть блог о всех вещах ETW , есть небольшая вступительная статья о SLAB. Джулиан Домингес выступил с докладом на Build 2013 на тему « Создание структурированных и значимых журналов с семантической регистрацией» . У Марка Симмса есть видео о дизайне для управляемости в удивительной серии Failsafe: создание масштабируемых отказоустойчивых облачных сервисов , в котором он дает мотивацию для инструментов, использующих больше телеметрических журналов, чем вы, вероятно, мечтали. Кэтлин Доллард имеет курс PluralSightохватывает новые функции .NET 4.5, в том числе EventSource , который она также освещает в этом посте .
Версия CTP документации SLAB находится на CodePlex. Загрузки документации включают в себя очень удобочитаемое Руководство разработчика ( pdf ) и обширное Справочное руководство ( pdf ). Предварительную версию полной версии Руководства разработчика по документации Microsoft Enterprise Library можно загрузить здесь .
В Enterprise Library v6 страница на CodePlex содержит ссылки на загрузки и документации. В версии 6 различные блоки были разделены, чтобы их можно было устанавливать независимо друг от друга из NuGet . К ним относятся отдельные блоки, такие как блок обработки временных ошибок и прикладной блок семантической регистрации . Существует три загрузки SLAB для NuGet (поиск «блок приложения семантической регистрации»): базовая функциональность SLAB, приемник Windows Azure и приемник SQL Server. Два приемника позволяют сохранять события EventSource в таблицах Windows Azure и SQL Server соответственно.
EventSource
Event Tracing for Windows (ETW) — это механизм ведения журналов на уровне ядра для Windows, который существует уже несколько лет и, по-видимому, не привлекает большого внимания за пределами Microsoft. Многие службы Windows используют ETW для отслеживания. Действительно, Майк Келли описывает в статье MSDN, как ETW используется в диагностике Windows Azure.
Одной из причин неясности ETW была сложность создания источников событий. Класс .NET 4.5 EventSource позволяет действительно легко создавать источники событий. Это позволяет создавать источник событий, просто выводя новый класс из EventSource, создавая методы записи трассировки и выставляя их через одноэлементный EventSource .
Один EventSource может иметь много методов записи трассировки. Они определяются на основе разделения интересов. Список параметров, предоставленный пользователю EventSource , содержит только основную информацию для события. Свойства фильтрации (уровень, ключевые слова и т. Д.) Для события указываются во время разработки и не указываются пользователем EventSource .
Следующая таблица содержит простой пример класса EventSource :
using System; using System.Collections.Generic; [EventSource(Name = "MyDomain-MyEventSource")] public class MyEventSource : EventSource { public class Keywords { public const EventKeywords Database = (EventKeywords)1; public const EventKeywords ExternalApi = (EventKeywords)2; } public class Tasks { public const EventTask Timing = (EventTask)1; } [Event(1, Message = "Method entry: {0}", Level = EventLevel.Verbose)] internal void MethodEntry(String message) { if (IsEnabled()) WriteEvent(1, message); } [Event(2, Message = "External call to {0}/{1} - TimeSpan: {2}", Level = EventLevel.Informational, Keywords = Keywords.ExternalApi, Task=Tasks.Timing)] internal void ApiTiming(String apiName, String apiOperation, Int64 elapsedTimeMilliSeconds) { if (IsEnabled()) WriteEvent(2, apiName, apiOperation, elapsedTimeMilliSeconds); } [Event(3, Message = "Invalid configuration entry: {0}", Level = EventLevel.Warning)] internal void MissingConfigurationEntry(String entryName) { if (IsEnabled()) WriteEvent(3, entryName); } public static readonly MyEventSource Log = new MyEventSource(); }
EventSource атрибут используется , чтобы обеспечить альтернативное имя для событий от , в противном случае используется имя класса. Это имя должно быть уникальным во всех системах, поэтому оно должно включать корпоративное пространство имен, например, MyDomain-MyEventSource .
В Ключевых словах и Задачи классы обеспечивают перечисления первоначально использовались для украшения определения событий , а затем обеспечить структурированную фильтрацию возможности для ETW потребителей. Это позволяет различным слушателям фильтроваться различными слушателями, например, слушатель может прослушивать только события синхронизации для вызовов ExternalApi . EventKeywords и EventTask являются перечислениями, значения которых могут быть переопределены. Также можно использовать другой класс, OpCodes — вместе с сопровождающим EventOpCodeперечисление. Различные перечисления являются побитовыми, так что несколько ключевых слов, например, могут быть агрегированы для одного события. Обратите внимание , что, если они используются, имена классов должны быть ключевые слова , задачи и Opcodes .
Каждое событие украшено атрибутом Event, который предоставляет информацию о схеме для события. Событие идентифицируется EventId , уникальным (однозначным) последовательным целым числом. Свойство Message указывает строку, используемую для форматирования текста сообщения для события. Свойство Level указывает уровень (информационный, предупреждение, ошибка и т. Д.) Для события. В Ключевые слова , задачи и Opcodes указать значения из классов , определенных ранее.
Основой определения события является метод, используемый для его записи. Список параметров метода захватывает всю информацию для события. Он вызывает сильно перегруженный метод WriteEvent () для записи события. Первым параметром метода WriteEvent () является целое число, которое должно совпадать с EventId , в противном случае событие не будет записано без вывода сообщений . Метод IsEnabled () в классе EventSource можно использовать, чтобы избежать записи события, когда EventSource отключен.
Класс EventSource завершается созданием одноэлементного статического экземпляра, используемого для предоставления методов записи событий. Это может быть использовано для записи события следующим образом:
MyEventSource.Log.ApiTiming( “Twitter”, “GET statuses/home_timeline”, stopwatch.ElapsedMilliseconds);
Это записывает событие в журнал ETW, откуда оно может быть получено слушателем. Событие записывается в структурированной форме, позволяющей впоследствии его воссоздать согласованным с типом способом, что упрощает последующий анализ события. Событие может содержать удобочитаемое сообщение, а также фактические данные, использованные для составления сообщения.
PerfView утилита может быть использована для просмотра событий , созданных событий от . При запуске сбора данных с помощью PerfView , имя EventSource может быть снабжено префиксом * (в качестве дополнительного поставщика в расширенных параметрах), т. Е. * MyDomain-MyEventSource . PerfView — это мощная утилита ETW, которая поставляется с обширной документацией, показывающей, как использовать ее для анализа журналов событий ETW. Они содержат большое количество информации о работающей системе, поскольку многие подсистемы Windows содержат инструментарий ETW.
Этот раздел является стандартным ETW, который не использует SLAB.
Блок приложения семантической регистрации (SLAB)
SLAB основывается на стандартном ETW, предоставляя прослушиватели в процессе и вне процесса, которые сохраняют источник событий ETW одному или нескольким из:
- Приставка
- Плоский файл
- Роллинг файл
- SQL Server
- Общая база данных
- Оконные столы Azure
На момент написания этой статьи SLAB не поддерживает сохранение событий в журнале событий Windows. Обратите внимание, что для использования базы данных SQL Server / Generic или таблиц Windows Azure требуется соответствующая дополнительная загрузка NuGet SLAB.
SLAB предоставляет исходный код, который можно использовать в качестве основы для разработки дополнительных слушателей. Он также предоставляет точки расширения, поддерживающие настройку форматирования сообщений.
В процессе
Использование внутрипроцессного слушателя требует создания и включения EventListener . Например:
EventListener consoleEventListener = ConsoleLog.CreateListener(); consoleEventListener.EnableEvents( MyEventSource.Log, EventLevel.LogAlways, Keywords.ExternalApi);
В этом примере MyEventSource — это имя класса для источника события, а прослушиватель фильтруется для сохранения только тех событий, которые определены с помощью ключевого слова ExternalApi . Когда EventListener больше не нужен, его можно отключить и утилизировать следующим образом:
consoleEventListener.DisableEvents(MyEventSource.Log); consoleEventListener.Dispose();
И это все, что требуется для размещения обработчика событий SLAB в процессе. Различные прослушиватели, предоставляемые SLAB, используются, как указано выше, при условии, что требуется некоторая конфигурация, например, имя файла для прослушивателя файлов или строка подключения для учетной записи хранения Windows Azure.
Вне процесса
SLAB обеспечивает отдельную загрузку ( SemanticLogging-svc.exe ), которую можно запустить как консольное приложение или как служба Windows. Различные SLAB слушатели могут быть сконфигурированы в SemanticLogging-svc.xml , сохраняться в EventSource события к одному из поддерживаемых раковин — тот же список , как в процессе производства . Преимущество этого внепроцессного подхода состоит в том, что отслеживаемое приложение не имеет зависимости SLAB — поскольку EventSource является функцией чистого ETW — и не страдает от какого-либо снижения производительности в результате использования SLAB в процессе.
Для внепроцессной конфигурации требуется спецификация EventSource и один или несколько слушателей. В следующем примере показана конфигурация SemanticLogging-svc.xml приемника Windows Azure, в которой все события, подробного или более высокого уровня , сохраняются из источника событий с именем MyEventSource в эмулятор локального хранилища:
<eventSource name=”MyEventSource”> <eventListeners> <eventListener name=”azureTable” level=”Verbose” /> </eventListeners> </eventSource> <eventListeners> <azureTableEventListener name=”azureTable” instanceName=”myInstanceName” connectionString=”UseDevelopmentStorage=true”/> </eventListeners>
Windows Azure Table Listener
Слушатель таблицы Windows Azure сохраняет события в таблице Windows Azure. По умолчанию таблица называется SLABLogsTable, и данные сохраняются каждые 10 секунд. Слушатель хранит следующие свойства:
- PartitionKey
- RowKey
- Отметка
- EventId
- Дата события
- Ключевые слова
- EventSourceGuid
- EventSourceName
- InstanceName
- уровень
- Сообщение
- Опкод
- задача
Слушатель использует преимущества бессхемной природы таблиц Windows Azure для хранения фактических параметров, предоставленных при создании события. PartitionKey генерируется в виде ковша в минуту с использованием DateTime.Ticks . RowKey содержит имя экземпляра, то Клещей рассчитывать на событие, и добавляется соль , чтобы гарантировать уникальность. По умолчанию, PartitionKey и RowKey настроить Клещ рассчитывать таким образом , что данные хранятся в обратном хронологическом порядке.
Резюме
ETW предоставляет мощный способ отслеживания приложений в структурированном виде. Класс EventSource , новый в .NET 4.5, упрощает использование ETW. В прикладном блоке семантического ведения журнала имеется ряд прослушивателей, которые можно использовать для получения событий EventSource потребителя и сохранения их в разных местах, включая таблицы Windows Azure.