次の方法で共有


ASP.NET Health Monitoring イベントの拡張

更新 : 2007 年 11 月

次のタスクを実行すると、ASP.NET の状態監視機能を拡張できます。

  • 標準の Web イベント型を継承することにより、カスタム Web イベント クラスを作成します。WebBaseEvent または WebBaseErrorEvent を継承するアプリケーションの場合、部分信頼で実行する必要があります。その他すべてのイベントの場合は、完全信頼で実行する必要があります。カスタム データをカスタム イベントに追加するために、FormatCustomEventDetails メソッドをオーバーライドします。ToString メソッドをオーバーライドしないでください。システムの機密情報の上書きまたは改変を防ぐためです。カスタム イベントは、Raise メソッドを呼び出して明示的に発生させる必要があります (標準イベントを発生させることができるのは ASP.NET だけです)。コード例については、「方法 : カスタムの ASP.NET Health Monitoring イベントの実装と発生」を参照してください。

  • IWebEventCustomEvaluator インターフェイスを実装するクラスを作成して、標準イベントの種類をカスタマイズします。

  • WebEventProvider クラスまたは BufferedWebEventProvider クラスを継承するクラスを作成して、イベントを処理するカスタム プロバイダを作成します。プロバイダがログを記録する場合は、WebEventFormatter クラスも使用できます。カスタム イベント プロバイダは、カスタム ログ ファイルにイベントを記録するために使用し、イベント データをサードパーティ アプリケーションなどに送信します。コード例については、「方法 : 状態監視のカスタム プロバイダの例を実装する」を参照してください。

ASP.NET Health Monitoring イベントのバッファリング

SQL とメールの状態監視イベント プロバイダ (SqlWebEventProviderSimpleMailWebEventProvider、および TemplatedMailWebEventProvider) は、イベント バッファリングを使用するように構成できます。これにより、頻繁な電子メール メッセージの送信や SQL Server 挿入によるアプリケーションのパフォーマンスへの影響を軽減できます。状態監視イベントのバッファリングを使用すると、大量のイベントが原因で発生する可能性のある高負荷から SMTP サーバーと SQL Server を保護することにもなります。

SQL イベント プロバイダのバッファリング

SQL イベント プロバイダのバッファリングを有効にすると、イベント情報をまとめてデータベースに挿入する前に、指定されたバッファ モードに基づいてイベント情報がバッファリングされます。

既定では、SqlWebEventProvider プロバイダはバッファリングを使用するように構成されていません。イベントが発生するたびに、その情報は直ちにデータベースに挿入されます。この既定の設定は、SQL プロバイダが指定されている Web.config ファイルの providers 要素でバッファリングを有効にすることでオーバーライドできます。そのためには、add 要素の buffer 属性を true に設定します。SqlWebEventProvider を使用せずに独自の SQL プロバイダを構成し、buffer 属性の値を指定しない場合、既定値は true になります。

定義済みのバッファリング モードを選択すると、バッファリングの動作をカスタマイズできます。bufferModes コレクションにカスタム要素を追加することもできます。各要素には、バッファ サイズやバッファをフラッシュする頻度などのプロパティを定義します。次に、定義したバッファ モードの 1 つを使用するようにプロバイダを構成します。

バッファリングを有効にした SQL イベント プロバイダの構成設定の例を次に示します。

Bb907646.alert_note(ja-jp,VS.90).gifメモ :

AnalysisbufferModes 要素はルートの Web.config ファイルで既に構成されているので、アプリケーション レベルの Web.config ファイルで再び宣言する必要はありません。SqlWebEventProviderproviders 要素もルートの Web.config ファイルで構成されていますが、buffer 属性は false に設定され、bufferMode 属性は Notification に設定されています。したがって、この例に示す providers 要素は、アプリケーション レベルの Web.config ファイルで宣言する必要があります。さらに、clear 要素または remove 要素を使用して、SqlWebEventProvider プロバイダのより高いレベルの構成を削除する必要があります。

この例では、SQL イベント プロバイダは、バッファリングが有効になっている場合に Analysis バッファ モードを使用するように構成されます。これは、bufferModes 要素で定義されます。このモードでは、プロバイダは 5 分ごとにイベント情報をフラッシュします。このプロバイダは 1 通知あたり 100 イベントまでフラッシュし、イベントの頻度が急増した場合は 1,000 イベントまでバッファリングします。プロバイダは、毎分 1 回しかイベントを送信しないことを保証します。

<healthMonitoring>
  <providers>
    <clear/>
    <add 
      ConnectionStringName="LocalSqlServer" 
      maxEventDetailsLength="1073741823"
      buffer="true" 
      bufferMode="Analysis" 
      name="SqlWebEventProvider"
      type="System.Web.Management.SqlWebEventProvider,System.Web, Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" 
    />
  </providers>
  <bufferModes>
    <add 
      name="Analysis" 
      maxBufferSize="1000" 
      maxFlushSize="100"
      urgentFlushThreshold="100" 
      regularFlushInterval="00:05:00"
      urgentFlushInterval="00:01:00" 
      maxBufferThreads="1"
    />
  </bufferModes>
</healthMonitoring>

電子メール イベント プロバイダのバッファリング

電子メール イベント プロバイダのバッファリングを有効にすると、プロバイダは電子メール メッセージをイベント通知として送信する前にイベントをバッファリングします。電子メール イベント プロバイダを構成し、そのプロバイダの add 要素の buffer 属性に値を指定しない場合、既定値は true になります。バッファリングを無効にする場合は、buffer 属性を false に設定します。

定義済みのバッファリング モードを選択すると、バッファリングの動作をカスタマイズできます。bufferModes コレクションにカスタム要素を追加することもできます。各要素には、バッファ サイズやバッファをフラッシュする頻度などのプロパティを定義します。次に、定義したバッファ モードの 1 つを使用するようにプロバイダを構成します。CriticalNotification モードを使用することをお勧めします。

SimpleMailWebEventProvider クラスのバッファリングを無効にし、TemplatedMailWebEventProvider クラスのバッファリングを有効にした電子メール イベント プロバイダの構成設定の例を次に示します。TemplatedMailWebEventProvider プロバイダは、ルートの Web.config ファイルで既に構成されているように、CriticalNotification バッファ モードを使用します。CriticalNotification モードでは、プロバイダはイベントを受け取ると、すぐにすべてのイベント情報をフラッシュしようとします。ただし、電子メール サーバーに過度な負荷を与えないように、毎分 1 回までしかフラッシュの試みは成功しません。メッセージは処理可能なサイズになります。情報は、最大で 20 イベントです。

状態監視システムが許容量を超えるイベント情報を受信すると、新しいイベントが発生するたびに古いイベントが破棄されます。状態監視システムは、バッファがいっぱいになると、より頻繁にフラッシュしてイベントが破棄されるのを防ごうとします。ただし、イベントが破棄された場合、それらの情報は送信されません (イベントが破棄された後の次のフラッシュ時に通知が含まれます)。プロバイダの負荷が高く、バッファがいっぱいであってもイベントが破棄されない場合、新しいイベントは最大 5 分間待機します。

<healthMonitoring>
  <providers>
    <!-- mail provider with attributes that are always relevant -->
    <add 
      name="SimpleMailWebEventProvider" 
      type="System.Web.Management.SimpleMailWebEventProvider"
      to="SystemAdministrator@contoso.com"
      from="HealthMonitoring@contoso.com"
      buffer="false" 
    />
    <!-- mail provider with attributes that are relevant only 
         when buffering is enabled -->
    <add 
      name="SampleTemplatedMailWebEventProvider" 
      type="System.Web.Management.TemplatedMailWebEventProvider"
      to="SystemAdministrator@contoso.com" 
      from="HealthMonitoring@contoso.com" 
      buffer="true" 
      bufferMode="Critical Notification"
      template="Template.aspx" />
  </providers>
  <bufferModes>
    <add 
      name="Critical Notification" 
      maxBufferSize="100" maxFlushSize="20"
      urgentFlushThreshold="1" 
      regularFlushInterval="Infinite" 
      urgentFlushInterval="00:01:00"
      maxBufferThreads="1"
    />
  </bufferModes> 
</healthMonitoring>

この例を正常に動作させるには、次の例に示すような構成ファイルで SMTP サーバーを構成する必要があります。

<system.net>
  <mailSettings>
    <smtp deliveryMethod="Network">
      <network 
        defaultCredentials="true" 
        host="127.0.0.1" 
        port="25" 
        username="username" 
        password="password" />
    </smtp>
  </mailSettings>
</system.net>

詳細については、「<mailSettings> 要素 (ネットワーク設定)」を参照してください。

Bb907646.alert_note(ja-jp,VS.90).gifメモ :

構成ファイルにクリア テキストのパスワードを格納する場合は、セキュリティ リスクが伴います。構成ファイルに資格情報を格納する場合は、保護された構成を使用して <mailSettings> 構成要素の内容を暗号化する必要があります。詳細については、「保護された構成を使用した構成情報の暗号化」を参照してください。

バッファ モードの設定

バッファの動作を指定するには、bufferModes 要素で、add 要素の次の属性を設定します。

  • regularFlushInterval   通常のイベント情報のフラッシュ間隔。

  • urgentFlushThreshold   バッファをフラッシュするしきい値となるイベント数。

次の設定は、プロバイダがイベントの受信側に保証する内容を示します。

  • maxBufferSize   バッファが情報を保持するイベントの最大数。バッファ内のイベント数がこの値を超えると、古いイベントから破棄されます。

  • maxFlushSize   プロバイダが一度に情報をフラッシュするイベントの最大数。

  • urgentFlushInterval   緊急のフラッシュを実行するまでプロバイダが待機する時間。前回のフラッシュから urgentFlushInterval プロパティに指定されている時間が経過する前にバッファがいっぱいになると、古いイベントの情報から破棄されます。プロバイダは、破棄されたイベントの数を記録し、次回のイベント通知に警告を含めます。

WMI による ASP.NET Health Monitoring イベントの追跡

ASP.NET の状態イベントを監視する 1 つの方法は、WMI (Windows Management Instrumentation) イベント プロバイダである WmiWebEventProvider クラスを使用することです。このプロバイダは、Web 状態監視イベント (Web イベント) を WMI イベントに変換します。WMI は、監視対象のエンティティをオブジェクトとして表現するための標準のオブジェクト モデルを提供します。これらのエンティティは、コンピュータ、ネットワーク カード、プリンタ、ソフトウェア アプリケーションなどを表します。エンティティは、カスタム アプリケーションから監視できるように、WMI オブジェクト モデルに割り当てられます。次の図に、ASP.NET Web イベント、WMI、および WMI イベントを待機するコンシューマ アプリケーションの間の関係を示します。

ASP.NET と WMI の関係
WMI アーキテクチャ

状態イベントと WMI 間の接続

ASP.NET Health Monitoring により、状態イベントと WMI 間の接続のためのインフラストラクチャが築かれます。これらのイベントは、WMI オブジェクトとして処理できるように、WMI クラスに割り当てられます。また、状態イベントを処理し、それらを WMI システムにディスパッチするためのサポートも提供されます。ASP.NET イベントを WMI に割り当てる方法の詳細については、「チュートリアル : ASP.NET Health Monitoring における WMI イベントの待機」を参照してください。WMI の詳細については、MSDN Web サイトの「Windows Management Instrumentation」を参照してください。

以下に、WMI を使用した状態イベントの監視に必要な手順を説明します。

  1. Web イベント クラスと WMI オブジェクト間の割り当てを定義します。標準の各 Web イベント クラスに対しては、この手順は既に実施されています。これらの割り当ては、ASP.NET の MOF (Managed Object Format) ファイルである %SystemRoot%\Microsoft.NET\Framework\<version>\aspnet.mof ファイルに格納されます。

    Bb907646.alert_note(ja-jp,VS.90).gifメモ :

    すべてのカスタム イベントは、WMI の基本的なイベントの種類に割り当てられます。カスタムの ASP.NET の状態監視イベントを任意の WMI イベントに割り当てることはできません。

    たとえば、次のコードでは、WebHeartbeatEvent 型に割り当てられる WMI クラスの定義を示しています。

    class HeartbeatEvent : ManagementEvent {
        /*
         * ProcessStatistics    
         */
        DATETIME    ProcessStartTime;
        sint32      ThreadCount;
        sint64      WorkingSet;
        sint64      PeakWorkingSet;
        sint64      ManagedHeapSize;
        sint32      AppdomainCount;    
        sint32      RequestsExecuting;
        sint32      RequestsQueued;
        sint32      RequestsRejected;
    }; 
    

    MOF ファイルの詳細については、MSDN の WMI SDK で「Managed Object Format」を参照してください。

  2. イベントを処理する ASP.NET の状態監視プロバイダを定義します。

    標準のプロバイダは WmiWebEventProvider クラスです。既定では、これは、次の要素を使用してルートの Web.config ファイルの healthMonitoring セクションに既に構成されています。

    <providers>
      <add 
        name="WmiWebEventProvider" 
        type="System.Web.Management.WmiWebEventProvider,System.Web, Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" 
      />
    </providers>
    
  3. 構成ファイルの healthMonitoring セクションに適切な設定を入力して、Web イベント クラスと WMI イベント プロバイダである WmiWebEventProvider クラスとの間に関連付けを作成します。

    既定では、WMI イベント プロバイダはどの Web イベントにもサブスクライブしていません。アプリケーション レベルの Web.config ファイルで次の要素を指定すると、WMI イベント プロバイダをすべての Web イベントにサブスクライブできます。既定では、種類が All Events のイベントは、ルートの Web.config ファイルの eventMappings 要素で構成されます。これは、WebBaseEvent クラスに割り当てられます。

    <rules>
      <add 
        name="Testing Wmi"
        eventName="All Events" 
        provider="WmiWebEventProvider" 
        profile="Critical"
      />
    </rules>
    
  4. WMI イベントを待機するアプリケーションを作成するか、またはサードパーティ アプリケーションを使用します。

    チュートリアル : ASP.NET Health Monitoring における WMI イベントの待機」のコード例では、Web イベントが発生すると必ずイベント情報を表示するコンソール アプリケーションが作成されます。

WMI 状態イベントのインフラストラクチャのカスタマイズ

Web イベントが発生すると、ASP.NET の状態監視によって、そのイベントが WmiWebEventProvider オブジェクトにディスパッチされます。プロバイダ オブジェクトは、イベントを処理し、関連する MOF クラスの定義に従って適切なデータを設定します。次に、アンマネージ コードの呼び出しを使用して、このデータを WMI システムにディスパッチします。

Web イベントの WMI への送信をカスタマイズできるのは、ASP.NET の状態監視イベントが WMI イベントとして発行された後に状態監視イベントを使用するカスタム アプリケーションを作成する場合だけです。その場合、前に説明したように新しい rules 要素を設定するだけで、設定の変更は完了します。アプリケーションは、オペレーティング システムによって発行されたときに、ASP.NET 状態イベントを WMI イベントの形で待機します。詳細については、「チュートリアル : ASP.NET Health Monitoring における WMI イベントの待機」を参照してください。

Bb907646.alert_note(ja-jp,VS.90).gifメモ :

WmiWebEventProvider クラスは拡張できません。拡張できるイベント プロバイダ クラスは、WebEventProvider クラスと BufferedWebEventProvider クラスに限られます。

カスタムの ASP.NET Health Monitoring イベントとプロバイダの実装

一部のイベントは、既定でパフォーマンス カウンタやイベント ログにキャプチャされるか、または ASP.NET トレース システムに送られます。その他のイベントは、既存のプロバイダに割り当てることによって有効にできます。詳細については、「ASP.NET Health Monitoring の概要」の「イベント プロバイダによる Web イベントの使用」を参照してください。

既存の Web イベントまたはプロバイダのクラスで必要な処理ができない場合は、それらのクラスを拡張できます。ASP.NET Health Monitoring をカスタマイズする方法を次の表に示します。

タスク

実装

カスタムの Web イベント クラスを作成します。

WebBaseEvent から継承し、Raise 仮想メソッドを実装するクラスを作成します。カスタム データをカスタム イベントに追加するために、FormatCustomEventDetails メソッドをオーバーライドします。

方法 : カスタムの ASP.NET Health Monitoring イベントの実装と発生

組み込みまたはカスタムの Web イベントを処理するカスタム イベント プロバイダを作成します。

WebEventProvider クラスまたはその派生クラスから継承するクラスを作成します。プロバイダがログを出力する場合は、WebEventFormatter クラスからも継承します。

方法 : 状態監視のカスタム プロバイダの例を実装する

参照

処理手順

方法 : ASP.NET 構成設定をロックする

概念

ASP.NET Health Monitoring の概要

ASP.NET 構成の概要

参照

healthMonitoring の bufferModes 要素 (ASP.NET 設定スキーマ)

healthMonitoring の providers 要素 (ASP.NET 設定スキーマ)