Skip to content
April 27, 2012 / ahriman hpc mode

Заметки про диагностику в Windows Azure

Платформа Windows Azure предоставляет достаточно мощный набор для реализации диагностики и логирования различных событий, происходящих как с сервисом, так и непосредственно с операционной системой, на которой размещен сервис. В 2009 году, то есть уже достаточно давно, была анонсирована поддержка фреймворка логирования событий, знакомая многим по Windows – Event Tracing for Windows (ETW). Доступ к функциональности фреймворка обеспечивается через пространство имён System.Diagnostics, для платформы Windows Azure же есть собственный наследник этого пространства – Microsoft.WindowsAzure.Diagnostics, который и является точкой входа в ETW (рис. 1).

image

Рис. 1. Диагностика в Windows Azure в первом приближении.

С зеленой рамкой – код разработчика, красным выделен код из System.Diagnostics, всё остальное же принадлежит платформе Windows Azure.

Итак, сборка регистрируется на некоторый источник информации трейса, при этом можно задавать уровень детализации данных от каждого источника с помощью SourceSwitch. Далее источники связываются с некоторыми слушателями, которые могут быть как стандартными (и сохраняя данные в таблицу или блоб Windows Azure), либо разработанными собственноручно.

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

В таблице ниже сведены источники, которые доступны для диагностических целей в Windows Azure.

Источник Описание Какими ролями поддерживается
Логи Windows Azure Собираются по умолчанию, при этом данные трассировки отправляются слушателю, определенному в одном из файлов web.config или app.config. Web/Worker
Логи IIS 7.0 Собираются по умолчанию, информация касающаяся сайтов IIS. Web
Логи инфраструктуры платформы Собираются по умолчанию. Логируется информация об инфраструктуре, модулях RemoteAccess и RemoteForwarder. Web/Worker
События операционной системы События, пишущиеся в журнал событий  (Event Viewer) Windows Web/Worker
Счетчики производительности Используются счетчики производительности, доступные в операционной системе Web/Worker
Дампы памяти Сохраненное состояние системы в момент критической ошибки Web/Worker
Собственные провайдеры логов Реализованный разработчиком механизм сбора какой-либо информации и помещение ее в локальное хранилище экземпляра роли Web/Worker

 

Включение диагностического монитора в конфигурацию сервиса (обычно это уже сделано):

1) Откройте файл ServiceDefinition.csdef и добавьте следующий код, после чего сохраните изменения.

<?xml version="1.0" encoding="utf-8"?>
<ServiceDefinition name="MyService" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
<WebRole name="WebRole1">
<Imports>
<Import moduleName="Diagnostics" />
</Imports>
</WebRole>
</ServiceDefinition>

2) Откройте файл ServiceConfiguration.cscfg и добавьте элемент Setting, чтобы определить строку подключения к хранилищу, где будут храниться диагностические данные и конфигурация. Можно указать как хранение в локальном эмуляторе хранилища (UseDevelopmentStorage=true), так и облачное хранилище.

<?xml version="1.0" encoding="utf-9"?>
<ServiceConfiguration serviceName="MyService" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration" osFamily="1" osVersion="*">
<Role name="WebRole1">
<Instances count="2" />
<ConfigurationSettings>
<Setting name="Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString" value="(UseDevelopmentStorage=true) ЛИБО (DefaultEndpointsProtocol=https;AccountName=AccountName;AccountKey=AccountKey" />
</ConfigurationSettings>
</Role>
</ServiceConfiguration>

При включении диагностического монитора к коду привязывается стандартный слушатель Windows Azure, таким образом, вся осуществляемая разработчиком трассировка будет передана напрямую этому слушателю (DiagnosticMonitorTraceListener с диаграммы).

Динамическое удалённое изменение конфигурации монитора

Создайте (если еще не создали) файл исходников, который, собственно, и будет выполнять задачу изменения конфигурации монитора. Для этого:

1) Импортируйте соответствующие пространства имён:

using Microsoft.WindowsAzure.Diagnostics;
using Microsoft.WindowsAzure.Diagnostics.Management;

2) Воспользуйтесь методом Parse класса CloudStorageAccount для разбора строки подключения.

var storageAccount = CloudStorageAccount.Parse("DefaultEndpointsProtocol=https;AccountName=MyAccountName;AccountKey=MyAccountKey");

3) Создайте экземпляр класса DeploymentDiagnosticManager и создайте, непосредственно, экземпляр менеджера диагностики экземпляра.

var diagnosticManager = new DeploymentDiagnosticManager(storageAccount,"MyDeploymentID");
var roleInstancesManagers = diagnosticManager.GetRoleInstanceDiagnosticManagersForRole("MyRoleName");

4) Укажите настройки, которые требуется изменить.Например, задать счетчик производительности, считающий каждые 20 секунд, сколько в системе свободно мегабайт ОЗУ.

PerformanceCounterConfiguration availableMemory = new PerformanceCounterConfiguration();
availableMemory.CounterSpecifier = @"\Memory\Available Mbytes";
availableMemory.SampleRate = TimeSpan.FromSeconds(20);

5) Инициируйте изменения в конфигурации каждого экземпляра роли.

foreach (var instance in roleInstanceManagers)
{
DiagnosticMonitorConfiguration configuration = instance.GetCurrentConfiguration();
configuration.PerformanceCounters.DataSources.Add(availableMemory);

instance.SetCurrentConfiguration(configuration);
}

Помещение логов в свое хранилище

Под своим хранилищем в данном контексте подразумевается некоторое локальное для экземпляра роли хранилище, откуда потом можно получить эти данные. Для конфигурации локального хранилища и логов необходимо:

1) Открыть файл ServiceDefinition.csdef и добавить элемент LocalStorage.

<?xml version="1.0" encoding="utf-8"?>
<ServiceDefinition xmlbs="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition" name="MyService">
<WebRole name="WebRole1">
<LocalResources>
<LocalStorage name="LocalStorageForCustomLogs" sizeInMB="100" cleanOnRoleRecycle="false" />
</LocalResources>
</WebRole>
</ServiceDefinition>

2) В файле исходников (а обычно это делается в методе OnStart роли), в котором необходимо помещать логи в локальное хранилище, импортировать соответствующие пространства имён:

using Microsoft.WindowsAzure.Diagnostics;

3) Получите ссылку на локальный ресурс и создайте объект класса DirectoryConfiguration.

LocalResource localResource = RoleEnvironment.GetLocalResource("LocalStorageForCustomLogs";
DirectoryConfiguration config = new DirectoryConfiguration();
config.Container = "customlogs-container";
config.DirectoryQuotaInMB = localResource.MaximumSizeInMegabytes;
config.Path = localResource.RootPath;

4) Теперь необходимо добавить созданный объект класса DirectoryConfiguration в конфигурацию монитора диагностики и перезапустить монитор, чтобы новая конфигурация применилась.

DiagnosticMonitorConfiguration monitorConfig = DiagnosticMonitor.GetDefaultInitialConfiguration(); //настройка периода переноса логов в хранилище monitorConfig.Directories.ScheduledTransferPeriod = TimeSpan.FromMinutes(5.0); monitorConfig.Directories.DataSources.Add(config); CloudStorageAccount storageAccount = CloudStorageAccount.DevelopmentStorageAccount;

 

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

//StorageCredentialsAccountAndKey creds = new StorageCredentialsAccountAndKey(accountName, accountKey);

// CloudStorageAccount storageAccount = new CloudStorageAccount(creds, true);

DiagnosticMonitor monitor = DiagnosticMonitor.Start(storageAccount, monitorConfig);

Теперь, после запуска приложения, файл с логами будет создаваться в директории и автоматически переноситься в качестве блоба в контейнер с названием, определенным в свойстве Container.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: