Пошаговое руководство. Прослушивание WMI-событий в мониторинге работоспособности ASP.NET
Обновлен: Ноябрь 2007
В данном пошаговом руководстве показано, как отслеживать события инструментирования управления Windows (WMI), которые были сопоставлены с событиями мониторинга работоспособности ASP.NET. В этом пошаговом руководстве рассматриваются следующие задачи:
Построение консольного приложения, которое прослушивает события мониторинга работоспособности.
Настройка веб-приложения, за которым предлагается следить.
Тестирование консольного приложения.
Дополнительные сведения об использовании WMI для доставки событий мониторинга работоспособности содержатся в разделе Using WMI to Deliver ASP.NET Health Monitoring Events.
Обязательные компоненты
Для выполнения этого пошагового руководства потребуется:
Доступ к серверу с помощью служб IIS и установленную платформу .NET Framework версии 2.0.
Достаточные разрешения для создания веб-узла ASP.NET на сервере.
Разрешение на запуск приложения с правами администратора для доступа к данным веб-событий.
Процесс мониторинга работоспособности ASP.NET
Ниже перечислены основные этапы, возникающие в процессе мониторинга работоспособности ASP.NET, если доставка данных событий обрабатываться через WMI:
ASP.NET вызывает событие работоспособности согласно прарметрам конфигурации.
Мониторинг работоспособности ASP.NET на основе параметров конфигурации отправляет событие поставщику WmiWebEventProvider.
Поставщик WmiWebEventProvider, основываясь на информации, содержащейся в файле формата управляемых объектов WMI (Managed Object Format, MOF) для ASP.NET (Aspnet.mof), передает сведения о событии в систему WMI через неуправляемый вызов.
Наконец, WMI передает необходимые данные в пользовательское приложение. Это приложение использует типы System.Management для взаимодействия между управляемыми ASP.NET и неуправляемыми WMI API.
Этот процесс показан на следующей иллюстрации:
Процесс мониторинга работоспособности ASP.NET
Действия при использовании WMI для прослушивания событий мониторинга работоспособности ASP.NET
Ниже приведены стандартные действия при использовании WMI для прослушивания событий мониторинга работоспособности ASP.NET:
Создайте и постройте пользовательское приложение слушателя. В данном пошаговом руководстве приложение слушателя является консольным приложением.
Настройте веб-приложение для разрешения пользовательскому поставщику обрабатывать события работоспособности, включив мониторинг работоспособности и указав поставщика. В данном пошаговом руководстве поставщиком является поставщик WMI по умолчанию.
Активируйте слушателя на сервере, где выполняется веб-приложение. Поскольку слушатель является консольным приложением, это означает, что запуск выполняется из командной строки.
Обратитесь к любой странице наблюдаемого веб-узла в веб-обозревателе.
Убедитесь, что события работоспособности, выданные веб-узлом, фиксируются слушателем.
Создание слушателя событий WMI
Слушатель событий WMI обрабатывает события мониторинга работоспособности ASP.NET после их пересылки в WMI.
Пример кода следующей процедуры предназначен для слушателя события WMI консольного приложения, которое обращается к WMI-объектам, связанным с событиями работоспособности ASP.NET. Далее перечислены основные этапы выполнения этого приложения:
Получите имя компьютера, на котором запущен слушатель и веб-приложение.
Задайте путь WMI для сущностей ASP.NET.
Создайте управляемый объект наблюдателя как определенный в пространстве имен System.Management.
Задайте область событий для отслеживания, равную предыдущему пути к WMI.
Бесконечный цикл для перехвата событий WMI.
Чтобы создать слушателя WMI-событий для событий работоспособности ASP.NET:
Создайте файл источника для консольного приложения и вставьте следующий код. Этот код осуществляет прослушивание WMI событий, связанных с событиями мониторинга работоспособности ASP.NET на локальном компьютере, который является тем же компьютером, на котором выполняется наблюдаемое веб-приложение.
Imports System Imports System.Text Imports System.Management Namespace SamplesAspNet Class SampleWmiWebEventListener ' Displays event-related information. Public Shared Sub DisplayEventInformation(ByVal ev As ManagementBaseObject) ' This will hold the name of the ' event class as defined in the ' Aspnet.mof file. Dim eventTypeName As String ' Get the name of the WMI-raised event. eventTypeName = ev.ClassPath.ToString() ' Process the raised event. Select Case eventTypeName ' Process the heartbeat event. Case "HeartBeatEvent" Console.WriteLine("HeartBeat") Console.WriteLine(vbTab + _ "Process: {0}", ev("ProcessName")) Console.WriteLine(vbTab + "App: {0}", _ ev("ApplicationUrl")) Console.WriteLine(vbTab + "WorkingSet: {0}", _ ev("WorkingSet")) Console.WriteLine(vbTab + "Threads: {0}", _ ev("ThreadCount")) Console.WriteLine(vbTab + "ManagedHeap: {0}", _ ev("ManagedHeapSize")) Console.WriteLine(vbTab + "AppDomainCount: {0}", _ ev("AppDomainCount")) ' Process the request error event. Case "RequestErrorEvent" Console.WriteLine("Error") Console.WriteLine("Url: {0}", _ ev("RequestUrl")) Console.WriteLine("Path: {0}", _ ev("RequestPath")) Console.WriteLine("Message: {0}", _ ev("EventMessage")) Console.WriteLine("Stack: {0}", _ ev("StackTrace")) Console.WriteLine("UserName: {0}", _ ev("UserName")) Console.WriteLine("ThreadID: {0}", _ ev("ThreadAccountName")) ' Process the application lifetime event. Case "ApplicationLifetimeEvent" Console.WriteLine("App Lifetime Event {0}", _ ev("EventMessage")) ' Handle events for which processing is not ' provided. Case Else Console.WriteLine("ASP.NET Event {0}", _ ev("EventMessage")) End Select End Sub 'DisplayEventInformation . ' The main entry point for the application. Public Shared Sub Main(ByVal args() As String) ' Get the name of the computer on ' which this program runs. ' Note that the monitored application must also run ' on this computer. Dim machine As String = Environment.MachineName ' Define the Common Information Model (CIM) path ' for WMI monitoring. Dim path As String = _ String.Format("\\{0}\root\aspnet", machine) ' Create a managed object watcher as ' defined in System.Management. Dim query As String = "select * from BaseEvent" Dim watcher As New ManagementEventWatcher(query) ' Set the watcher options. Dim timeInterval As New TimeSpan(0, 1, 30) watcher.Options = _ New EventWatcherOptions(Nothing, timeInterval, 1) ' Set the scope of the WMI events to ' watch to be ASP.NET applications. watcher.Scope = _ New ManagementScope(New ManagementPath(path)) ' Set the console background. Console.BackgroundColor = ConsoleColor.Blue ' Set the foreground color. Console.ForegroundColor = ConsoleColor.Yellow ' Clear the console. Console.Clear() ' Loop indefinitely to catch the events. Console.WriteLine( _ "Listener started. Enter CntlC to terminate.") While True Try ' Capture the WMI event related to ' the Web event. Dim ev As ManagementBaseObject = _ watcher.WaitForNextEvent() ' Display the Web event information. DisplayEventInformation(ev) ' Prompt the user. Console.Beep() Catch e As Exception Console.WriteLine("Error: {0}", e) Exit While End Try End While End Sub 'Main End Class 'SampleWmiWebEventListener End Namespace
using System; using System.Text; using System.Management; namespace SamplesAspNet { // Capture WMI events associated with // ASP.NET health monitoring types. class SampleWmiWebEventListener { // Displays event-related information. static void DisplayEventInformation( ManagementBaseObject ev) { // This will hold the name of the // event class as defined in the // Aspnet.mof file. string eventTypeName; // Get the name of the WMI-raised event. eventTypeName = ev.ClassPath.ToString(); // Process the raised event. switch (eventTypeName) { // Process the heartbeat event. case "HeartBeatEvent": Console.WriteLine("HeartBeat"); Console.WriteLine("\tProcess: {0}", ev["ProcessName"]); Console.WriteLine("\tApp: {0}", ev["ApplicationUrl"]); Console.WriteLine("\tWorkingSet: {0}", ev["WorkingSet"]); Console.WriteLine("\tThreads: {0}", ev["ThreadCount"]); Console.WriteLine("\tManagedHeap: {0}", ev["ManagedHeapSize"]); Console.WriteLine("\tAppDomainCount: {0}", ev["AppDomainCount"]); break; // Process the request error event. case "RequestErrorEvent": Console.WriteLine("Error"); Console.WriteLine("Url: {0}", ev["RequestUrl"]); Console.WriteLine("Path: {0}", ev["RequestPath"]); Console.WriteLine("Message: {0}", ev["EventMessage"]); Console.WriteLine("Stack: {0}", ev["StackTrace"]); Console.WriteLine("UserName: {0}", ev["UserName"]); Console.WriteLine("ThreadID: {0}", ev["ThreadAccountName"]); break; // Process the application lifetime event. case "ApplicationLifetimeEvent": Console.WriteLine("App Lifetime Event {0}", ev["EventMessage"]); break; // Handle events for which processing is not // provided. default: Console.WriteLine("ASP.NET Event {0}", ev["EventMessage"]); break; } } // End DisplayEventInformation. // The main entry point for the application. static void Main(string[] args) { // Get the name of the computer on // which this program runs. // Note that the monitored application must also run // on this computer. string machine = Environment.MachineName; // Define the Common Information Model (CIM) path // for WMI monitoring. string path = String.Format("\\\\{0}\\root\\aspnet", machine); // Create a managed object watcher as // defined in System.Management. string query = "select * from BaseEvent"; ManagementEventWatcher watcher = new ManagementEventWatcher(query); // Set the watcher options. TimeSpan timeInterval = new TimeSpan(0, 1, 30); watcher.Options = new EventWatcherOptions(null, timeInterval, 1); // Set the scope of the WMI events to // watch to be ASP.NET applications. watcher.Scope = new ManagementScope(new ManagementPath(path)); // Set the console background. Console.BackgroundColor = ConsoleColor.Blue; // Set the foreground color. Console.ForegroundColor = ConsoleColor.Yellow; // Clear the console. Console.Clear(); // Loop indefinitely to catch the events. Console.WriteLine( "Listener started. Enter Cntl-C to terminate"); while (true) { try { // Capture the WMI event related to // the Web event. ManagementBaseObject ev = watcher.WaitForNextEvent(); // Display the Web event information. DisplayEventInformation(ev); // Prompt the user. Console.Beep(); } catch (Exception e) { Console.WriteLine("Error: {0}", e); break; } } } } }
Постройте консольное приложение. Может потребоваться включить ссылку для пространства имен System.Management.
Настройка приложения для событий WMI
Стандартный поставщик WmiWebEventProvider содержит логику для генерации событий WMI, связанных с событиями мониторинга работоспособности ASP.NET.
Чтобы настроить приложение ASP.NET для использования WMI для прослушивания событий мониторинга работоспособности ASP.NET:
Создайте или откройте файл web.config в корневом каталоге приложения.
Базовый файл Web.config выглядит как в следующем примере кода:
<?xml version="1.0"?> <configuration xmlns="https://schemas.microsoft.com/.NetConfiguration/v2.0"> <appSettings/> <connectionStrings/> <system.web> </system.web> </configuration>
Включите мониторинг работоспособности, добавив следующие строки кода внутрь раздела system.web:
<healthMonitoring enabled="true"> </healthMonitoring>
Настройте приложение для использования поставщика WmiWebEventProvider для доставки данных мониторинга работоспособности, добавив следующие строки кода внутрь раздела healthMonitoring. Обратите внимание, что поставщик WmiWebEventProvider уже настроен. Чтобы разрешить обработку веб-события, просто необходимо определить правило следующим образом:
<rules> <add name="Wmi Listener" eventName="All Events" provider="WmiWebEventProvider" profile="Critical"/> </rules>
Атрибут eventName добавленного правила позволяет отправить все веб-события поставщику WmiWebEventProvider.
Проверка приложения слушателя
После создания и построения приложения слушателя и настройки веб-узла для включения наблюдения за работоспособностью через события WMI можно проверить, что события работоспособности перехватываются запущенным приложением слушателя при запросе страницы с веб-узла.
Чтобы проверить консольное приложение слушателя:
Создайте страницу ASP.NET в том же веб-приложении, которое было настроено для включения наблюдения за работоспособностью.
Из командной строки запустите приложение слушателя.
Окно команд изменит цвет фона на синий со следующим отображаемым текстом желтого цвета:
Listener started. Enter CntlC to terminate
В веб-обозревателе запросите страницу из веб-приложения.
Перед тем как страница отрисуется, в окне команд, в котором запущено приложение слушателя, отобразится следующий текст:
ASP.NET Event URL authorization succeeded for the request. ASP.NET Event File authorization succeeded for the request.
Это служит проверкой того, что слушатель перехватил событие авторизации URL и файл события авторизации из ASP.NET.
Следующие действия
Слушатель WMI представляет собой простое консольное приложение, но иллюстрирует основные шаги для построения слушателя WMI и настройки приложения для отправки событий работоспособности. С этого момента можно начать изучать дополнительные способы наблюдения за веб-приложениями. Можно попробовать также выполнить следующие действия:
Изучите использование приложений Windows для сбора событий WMI.
Изучите использование более сложных возможностей обработки в зависимости от типа события.
Изучите дополнительные сведения о WMI и о том, как платформа .NET Framework интегрирует его функциональность. Дополнительные сведения см. в разделах System.Management, System.Management.Instrumentation.
См. Библиотеку MSDN по инструментарию управления Windows (WMI) и по формату управляемых объектов (MOF).
См. также
Ссылки
Элемент healthMonitoring (схема параметров ASP.NET)
System.Management.Instrumentation