Поделиться через


Пошаговое руководство. Прослушивание 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:

  1. ASP.NET вызывает событие работоспособности согласно прарметрам конфигурации.

  2. Мониторинг работоспособности ASP.NET на основе параметров конфигурации отправляет событие поставщику WmiWebEventProvider.

  3. Поставщик WmiWebEventProvider, основываясь на информации, содержащейся в файле формата управляемых объектов WMI (Managed Object Format, MOF) для ASP.NET (Aspnet.mof), передает сведения о событии в систему WMI через неуправляемый вызов.

  4. Наконец, WMI передает необходимые данные в пользовательское приложение. Это приложение использует типы System.Management для взаимодействия между управляемыми ASP.NET и неуправляемыми WMI API.

Этот процесс показан на следующей иллюстрации:

Процесс мониторинга работоспособности ASP.NET
Слушатель WMI

Действия при использовании WMI для прослушивания событий мониторинга работоспособности ASP.NET

Ниже приведены стандартные действия при использовании WMI для прослушивания событий мониторинга работоспособности ASP.NET:

  1. Создайте и постройте пользовательское приложение слушателя. В данном пошаговом руководстве приложение слушателя является консольным приложением.

  2. Настройте веб-приложение для разрешения пользовательскому поставщику обрабатывать события работоспособности, включив мониторинг работоспособности и указав поставщика. В данном пошаговом руководстве поставщиком является поставщик WMI по умолчанию.

  3. Активируйте слушателя на сервере, где выполняется веб-приложение. Поскольку слушатель является консольным приложением, это означает, что запуск выполняется из командной строки.

  4. Обратитесь к любой странице наблюдаемого веб-узла в веб-обозревателе.

  5. Убедитесь, что события работоспособности, выданные веб-узлом, фиксируются слушателем.

Создание слушателя событий WMI

Слушатель событий WMI обрабатывает события мониторинга работоспособности ASP.NET после их пересылки в WMI.

Пример кода следующей процедуры предназначен для слушателя события WMI консольного приложения, которое обращается к WMI-объектам, связанным с событиями работоспособности ASP.NET. Далее перечислены основные этапы выполнения этого приложения:

  • Получите имя компьютера, на котором запущен слушатель и веб-приложение.

  • Задайте путь WMI для сущностей ASP.NET.

  • Создайте управляемый объект наблюдателя как определенный в пространстве имен System.Management.

  • Задайте область событий для отслеживания, равную предыдущему пути к WMI.

  • Бесконечный цикл для перехвата событий WMI.

Чтобы создать слушателя WMI-событий для событий работоспособности ASP.NET:

  1. Создайте файл источника для консольного приложения и вставьте следующий код. Этот код осуществляет прослушивание 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;
                    }
                }
            }
        }
    }
    
  2. Постройте консольное приложение. Может потребоваться включить ссылку для пространства имен System.Management.

Настройка приложения для событий WMI

Стандартный поставщик WmiWebEventProvider содержит логику для генерации событий WMI, связанных с событиями мониторинга работоспособности ASP.NET.

Чтобы настроить приложение ASP.NET для использования WMI для прослушивания событий мониторинга работоспособности ASP.NET:

  1. Создайте или откройте файл web.config в корневом каталоге приложения.

    Базовый файл Web.config выглядит как в следующем примере кода:

    <?xml version="1.0"?>
    <configuration xmlns="https://schemas.microsoft.com/.NetConfiguration/v2.0">
        <appSettings/>
        <connectionStrings/>
        <system.web>
        </system.web>
    </configuration>
    
  2. Включите мониторинг работоспособности, добавив следующие строки кода внутрь раздела system.web:

            <healthMonitoring enabled="true">
            </healthMonitoring>
    
  3. Настройте приложение для использования поставщика WmiWebEventProvider для доставки данных мониторинга работоспособности, добавив следующие строки кода внутрь раздела healthMonitoring. Обратите внимание, что поставщик WmiWebEventProvider уже настроен. Чтобы разрешить обработку веб-события, просто необходимо определить правило следующим образом:

               <rules>
                  <add 
                     name="Wmi Listener"
                     eventName="All Events" 
                     provider="WmiWebEventProvider" 
                     profile="Critical"/>
               </rules>
    

    Атрибут eventName добавленного правила позволяет отправить все веб-события поставщику WmiWebEventProvider.

Проверка приложения слушателя

После создания и построения приложения слушателя и настройки веб-узла для включения наблюдения за работоспособностью через события WMI можно проверить, что события работоспособности перехватываются запущенным приложением слушателя при запросе страницы с веб-узла.

Чтобы проверить консольное приложение слушателя:

  1. Создайте страницу ASP.NET в том же веб-приложении, которое было настроено для включения наблюдения за работоспособностью.

  2. Из командной строки запустите приложение слушателя.

    Окно команд изменит цвет фона на синий со следующим отображаемым текстом желтого цвета:

    Listener started. Enter CntlC to terminate
    
  3. В веб-обозревателе запросите страницу из веб-приложения.

    Перед тем как страница отрисуется, в окне команд, в котором запущено приложение слушателя, отобразится следующий текст:

    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)

WmiWebEventProvider

System.Management

System.Management.Instrumentation

Другие ресурсы

Using WMI to Deliver ASP.NET Health Monitoring Events