ASP.NET Health Monitoring の概要
更新 : 2007 年 11 月
ASP.NET の状態監視 (ASP.NET Health Monitoring) 機能を使用すると、システム管理者は配置された Web アプリケーションの状態を監視できます。
メモ : |
---|
状態監視イベントを発生させるには、Medium 以上の信頼レベルが必要です。 |
このトピックの内容は次のとおりです。
シナリオ
ASP.NET の状態監視機能
背景
コード例
クラス リファレンス
シナリオ
ASP.NET の状態監視を使用すると、次のタスクを実行できます。
アプリケーションのパフォーマンスを監視してその正常な状態を確保します。
障害の発生しているアプリケーションまたはシステムを迅速に診断します。
アプリケーションのライフ サイクル中に発生する重大なイベントを評価します。
実行中の ASP.NET アプリケーションを、個別にまたは Web ファーム全体で監視します。
エラーに関係しない場合も含め、ASP.NET アプリケーションのイベントをログに記録します。
ページのトップへ
機能
ASP.NET の状態監視システムには、次の要素が含まれます。
アプリケーションの状態情報をパッケージ化するイベントの型。
イベント情報を処理するプロバイダの型。
状態イベントの管理に役立つその他の型。
ページのトップへ
背景
ASP.NET の状態監視によって、簡単に ASP.NET アプリケーションの状態を監視し、(アプリケーションをインストルメントするための) ASP.NET リソースに関する実行時の詳細情報を取得できます。状態監視機能には、すぐに使用できる Web 状態監視イベントのクラス (Web イベント) および状態監視プロバイダ (リスナ) が含まれます。Web イベントは、状態イベント情報をパッケージ化します。
プロバイダはイベントをリッスンし、イベント情報を処理してログ出力や管理者への通知を行います。Web イベントをプロバイダに接続する (イベントを有効にする) には、アプリケーションの構成ファイルで設定を行います。
ASP.NET の状態監視システムは、System.Web.Management 名前空間を使用して実装されます。
ASP.NET Health Monitoring の構成
組み込みの監視プロバイダまたはカスタマイズされた監視プロバイダを使用するよう、アプリケーションを構成できます。これらのプロバイダは、状態監視情報を処理し、インストルメント アプリケーションの状態とパフォーマンス特性について報告します。
アプリケーションに Web イベントおよびプロバイダを追加するには、構成ファイルの healthMonitoring セクションを構成します。これにより、組み込みクラスまたはカスタム クラスを使用してイベント データをリッスンし、処理できるようになります。
構成ファイルの詳細については、「ASP.NET 構成ファイル」を参照してください。
Web イベント クラスの階層構造
Web イベントが発生すると、関連するイベント クラスのインスタンスが作成されます。イベント データは、このオブジェクトのプロパティで収集されます。イベント プロバイダは、このデータを処理します。
Web イベントにはワーカー プロセス、アプリケーション ドメイン、要求データ、応答データ、アプリケーション エラー、構成エラー、および監査イベントに関する情報を含めることができます。親イベント クラスに格納される状態情報は、すべての子イベント クラスに継承されます。
Web イベント クラス間の関係を次の図に示します。
Web イベント クラスの階層構造
Web イベント クラスの階層構造を下方向へ移動するにつれて、ASP.NET アプリケーションにとってデータがより具体的になります。たとえば、派生クラスはスタック トレース、クライアント IP、スレッドとプロセス情報などの情報を公開します。
Web イベント情報
使用する必要のある、または継承する必要のある Web イベント クラスを決める際に役立つ情報を次の表に示します。行は、Web イベント クラスを示しています。列は、通常 Web イベント クラスにプロパティとして含まれる情報クラスを示しています。
完全な信頼の下でアプリケーションが実行されていない場合、継承できるのは WebBaseEvent クラスのみです。このような制限により、この表内の情報クラスの使用による機密情報の公開が防止されます。
Web イベント クラス |
|||||
---|---|---|---|---|---|
このクラスによって生成されたデータ |
使用できません。 |
使用できません。 |
使用できません。 |
使用できません。 |
|
親クラスによって生成されたデータ |
このクラスによって生成されたデータ |
使用できません。 |
使用できません。 |
使用できません。 |
|
親クラスによって生成されたデータ |
親クラスによって生成されたデータ |
このクラスによって生成されたデータ |
使用できません。 |
使用できません。 |
|
親クラスによって生成されたデータ |
親クラスによって生成されたデータ |
使用できません。 |
このクラスによって生成されたデータ |
使用できません。 |
|
親クラスによって生成されたデータ |
親クラスによって生成されたデータ |
使用できません。 |
使用できません。 |
使用できません。 |
|
親クラスによって生成されたデータ |
親クラスによって生成されたデータ |
使用できません。 |
使用できません。 |
使用できません。 |
|
親クラスによって生成されたデータ |
親クラスによって生成されたデータ |
使用できません。 |
このクラスによって生成されたデータ |
このクラスによって生成されたデータ |
|
親クラスによって生成されたデータ |
親クラスによって生成されたデータ |
使用できません。 |
親クラスによって生成されたデータ |
親クラスによって生成されたデータ |
|
親クラスによって生成されたデータ |
親クラスによって生成されたデータ |
使用できません。 |
このクラスによって生成されたデータ |
使用できません。 |
|
親クラスによって生成されたデータ |
親クラスによって生成されたデータ |
使用できません。 |
親クラスによって生成されたデータ |
使用できません。 |
|
親クラスによって生成されたデータ |
親クラスによって生成されたデータ |
使用できません。 |
親クラスによって生成されたデータ |
使用できません。 |
|
親クラスによって生成されたデータ |
親クラスによって生成されたデータ |
使用できません。 |
親クラスによって生成されたデータ |
使用できません。 |
|
親クラスによって生成されたデータ |
親クラスによって生成されたデータ |
使用できません。 |
親クラスによって生成されたデータ |
使用できません。 |
|
親クラスによって生成されたデータ |
親クラスによって生成されたデータ |
使用できません。 |
親クラスによって生成されたデータ |
使用できません。 |
プロバイダ クラスの階層構造
ASP.NET には、Web イベントの処理に使用できる組み込みプロバイダが用意されています。継承に関する次の制限に従って組み込みクラスを継承して、カスタム プロバイダを作成することもできます。
WebEventProvider クラスは、任意の信頼レベルの下で実行されるアプリケーションにより継承されます。
BufferedWebEventProvider クラスは、任意の信頼レベルの下で実行されるアプリケーションにより継承されます。
SqlWebEventProvider クラスは、完全な信頼の下で実行されるアプリケーションによってのみ継承されます。
その他のクラスは、信頼レベルにかかわらず、アプリケーションにより継承されません。詳細については、個々のプロバイダ クラスでクラスの概要を参照してください。
System.Web.Management 名前空間の Web プロバイダ クラス間の関係を、次の図に示します。
Web プロバイダ クラスの階層構造
ASP.NET の状態監視イベントの使用
ASP.NET の状態監視イベントは、次の方法で使用できます。
組み込みの Web イベントクラスとプロバイダ クラスを使用します。通常は、ASP.NET Web イベント クラスの実装をカスタマイズする必要はありません。アプリケーションではなく .NET Framework がこれらのイベントを発生させます。ただし、これらのイベントは後で説明するように構成する必要があります。詳細については、「方法 : 状態監視通知の電子メールを送信する」を参照してください。
Web イベントまたはプロバイダのカスタム クラスを作成します。カスタム Web イベントを作成するのは、通常、組み込み Web イベントで提供されていないカスタム情報が必要な場合です。カスタム プロバイダを作成するのは、通常、組み込みプロバイダで提供されていない機構を使用してイベント データを伝達する必要がある場合です。詳細については、「ASP.NET Health Monitoring イベントの拡張」を参照してください。
組み込み Web イベントと組み込みプロバイダの使用
状態監視用の組み込み Web イベントと組み込みプロバイダを使用するのは最も一般的な方法です。必要な作業は、目的のイベントとプロバイダを使用するようにアプリケーションを構成することだけです。以下の操作を実行してください。
必要な組み込み ASP.NET Web イベント クラスを、アプリケーションの構成ファイルの healthMonitoring セクションの eventMappings 要素に追加します。
イベントを処理するプロバイダを、healthMonitoring セクションの providers 要素に追加します。
イベントとプロバイダの関連付けを定義する rules 要素に項目を追加します。
既定では、組み込み ASP.NET Health Monitoring クラスは、ルートの Web.config ファイルの healthMonitoring セクションに構成されます。healthMonitoring セクションには、次の既定の構成が含まれます。
WebBaseEvent から派生するすべての Web イベント クラスは、eventMappings 要素に指定されます。このセクションは、イベント クラス グループに表示名を割り当てるのに使用されます。
WebBaseEvent から派生するすべてのイベント クラスは、eventMappings 要素で定義されているグループの少なくとも 1 つに含まれます。
EventLogWebEventProvider、WmiWebEventProvider、および SqlWebEventProvider の各イベント プロバイダは、providers 要素に指定されます。SimpleMailWebEventProvider クラス、TemplatedMailWebEventProvider クラス、TraceWebEventProvider クラスなどの他の組み込みプロバイダも、providers 要素で指定できます。
Web エラー イベントと監査エラー イベントを EventLogWebEventProvider クラスに関連付ける規則は、rules 要素に指定されます。rules 要素を追加することにより、他の Web イベントとプロバイダを有効にできます。rules 要素のイベント プロバイダにマップされたイベントは、有効であると見なされます。eventMappings 要素と providers 要素もイベントに対して構成する必要がありますが、この 2 つが rules 要素で関連付けられていない限り、イベントは有効になりません。
構成済みの項目のパラメータ値を指定できます。たとえば、発生するイベント数を制限したり、2 つのイベント間の間隔を指定したりできます。SQL プロバイダとメール プロバイダに対するイベント バッファリングのオプションを指定することもできます。
カスタム プロバイダの構成
Web イベント情報を独自に処理する必要がある場合は、カスタムの状態イベント プロバイダを作成できます。プロバイダは、WebEventProvider クラスまたは BufferedWebEventProvider クラスから継承するクラスです。カスタマイズ例については、「方法 : 状態監視のカスタム プロバイダの例を実装する」を参照してください。カスタム プロバイダの作成は、状態監視のカスタマイズにおいて最も一般的な作業です。この作業では、構成ファイルを次のように変更する必要があります。
イベントを処理するカスタム プロバイダを、構成ファイルの healthMonitoring セクションの providers 要素に追加します。
イベントとプロバイダの関連付けを定義する rules 要素に項目を追加します。
カスタム プロバイダを実装するアセンブリをアプリケーションの Bin サブディレクトリに格納します。プロバイダのソース コード ファイルは App_Code サブディレクトリに格納できません。これは、状態監視システムが、App_Code サブディレクトリ内のコード ファイルがコンパイルされる前に構成および作成されるためです。
providers 要素の type 属性には、少なくともクラス名が必要です。アセンブリがアプリケーションの Bin ディレクトリに格納されない場合、アセンブリは厳密な名前を付けて、グローバル アセンブリ キャッシュにインストールしておく必要があります。その場合、providers 要素の type 属性には厳密な名前が必要になります。次に例を示します。ここで、Version と PublicKeyToken には、アセンブリと一致する値が入ります。
type="Microsoft.Samples.Web.Management.SampleCustomEventProvider, Sample.SampleCustomEventProvider,Version=n.n.n.n,Culture=neutral, PublicKeyToken=xxxx"
SampleCustomEventProvider プロバイダを WebHeartbeatEvent イベントに関連付ける方法を次の例に示します。Heartbeats イベントは、ルートの Web.config ファイルで既に構成されています。
<healthMonitoring
heartBeatInterval="1"
enabled="true">
<rules>
<add
name="Heartbeat Events"
eventName="Heartbeats"
provider="Sample Custom Event Provider"
profile="Default"
minInstances="1"
maxLimit="Infinite"
minInterval="00:01:00"
custom=""
/>
</rules>
<providers>
<add
name="Sample Custom Event Provider"
type="Microsoft.Samples.Web.Management.SampleCustomEventProvider, Sample.SampleCustomEventProvider,Version=1.0.0.0,Culture=neutral, PublicKeyToken=xxxxxxxxxxxx"
/>
</providers>
</healthMonitoring>
カスタム イベントの構成
カスタム状態イベント情報が必要な場合、カスタム状態イベントを作成できます。カスタマイズ例については、「方法 : カスタムの ASP.NET Health Monitoring イベントの実装と発生」を参照してください。カスタム Web イベントの作成は、カスタム プロバイダの作成ほど一般的な作業ではありません。この作業では、構成ファイルを変更する必要があります。また、カスタム イベントを適切なタイミングで明示的に発生させる必要があります。
カスタム イベントを設定するには、次の作業を行う必要があります。
カスタム状態 イベント クラスを、healthMonitoring セクションの eventMappings 要素に追加します。
イベントとプロバイダの関連付けを定義する rules 要素を追加します。
カスタム Web イベントを実装するアセンブリを ASP.NET アプリケーションの Bin サブディレクトリに追加します。アプリケーションの App_Code サブディレクトリにイベントのソース コード ファイルを追加することもできます。
アセンブリを使用する場合、eventMappings 要素の type 属性には、少なくともクラス名とアセンブリのファイル名が必要です。次にコード例を示します。
type="System.Web.Management.SampleCustomWebEvent, Sample.SampleCustomWebEvent"
ソース コード ファイルを使用する場合は、クラス名のみを指定する必要があります。
EventLogWebEventProvider イベント プロバイダと SampleCustomWebEvent という名前のカスタム イベントを関連付ける方法を次の例に示します。EventLogProvider イベント プロバイダは、ルートの Web.config ファイルで既に構成されています。
<healthMonitoring
heartBeatInterval="0"
enabled="true">
<rules>
<add
name="Sample Custom Events"
eventName="SampleCustomWebEvent"
provider="EventLogProvider"
profile="Default"
minInstances="1"
maxLimit="Infinite"
minInterval="00:01:00"
custom=""
/>
</rules>
<eventMappings>
<add
name="SampleCustomWebEvent"
type="System.Web.Management.SampleCustomWebEvent, Sample.SampleCustomWebEvent,Version=1.0.0.0,Culture=neutral, PublicKeyToken=xxxxxxxxxxxx" "
startEventCode="0"
endEventCode="2147483647"
/>
</eventMappings>
</healthMonitoring>
ASP.NET Health Monitoring の保護
既定では、ASP.NET アプリケーションの状態監視機能は有効になっています。無効にする場合は、healthMonitoring 要素の enabled 属性を false に設定します。既定の構成設定は、使用できる値の中で最も安全な値に設定されます。状態監視の構成設定の詳細については、「healthMonitoring」を参照してください。location 要素を使用して、状態監視の構成設定をロックすることを検討してください。
メモ : |
---|
カスタム イベント コンシューマまたはカスタム イベント プロバイダを実装する場合、クロスサイト スクリプティングの問題を回避するために、イベントの内容をエンコードまたは確認する必要があります。 |
構成値の保護
アプリケーションの構成ファイル内に機密情報を格納する場合は、保護された構成を使用して機密情報を暗号化してください。特に慎重を要する情報としては、machineKey 構成要素に格納される暗号キーや、connectionStrings 構成要素に格納されるデータ ソース接続文字列などがあります。詳細については、「保護された構成を使用した構成情報の暗号化」を参照してください。
healthMonitoring 構成セクションにアクセスできるのは、"中" 以上の信頼レベルを使用するコードだけです。これにより、信頼性の低いアプリケーションはカスタム型を登録できません。
状態監視の拡張のセキュリティ
System.Web.Management 名前空間内の状態監視タイプは、次の特性を持っています。
基本クラスのコンストラクタは protectedinternal としてマークされます。このため、基本クラス イベント型のインスタンスはユーザー コードで直接作成できません。
Web イベントのインスタンスに対するアクセスは、構成が指定されたプロバイダ、フィルタ、およびテンプレート ページに限定されます。
継承リンクは、完全に信頼できるカスタム イベントだけが派生できることを保証するために、保護された内容を持つイベントを必要とします。
保護されたイベント プロパティから重要情報を公開する信頼できるカスタム イベントは、それ自体にコード アクセス セキュリティを適用し、おとり攻撃を回避する必要があります。コード アクセス セキュリティの詳細については、「ASP.NET コード アクセス セキュリティ」または「コード アクセス セキュリティの基礎」を参照してください。
Web イベントの表示に使用する WMI (Windows Management Instrumentation) 型をロックし、どのユーザーもイベント データにアクセスできないようにします。
メモ : カスタム イベント コンシューマまたはカスタム イベント プロバイダを実装する場合、クロスサイト スクリプティングの問題を回避するために、イベントの内容をエンコードまたは確認する必要があります。
データ ソースへの接続の保護
カスタムの状態監視イベント プロバイダを作成し、イベント データのログをデータベースに記録できます。ASP.NET には、SQL プロバイダがあります。イベント データのログを記録する方法の詳細については、「データ アクセスのセキュリティ保護」を参照してください。
データベース サーバーへの接続の安全を確保するには、保護された構成を使用して構成ファイルで接続文字列情報を暗号化することをお勧めします。詳細については、「保護された構成を使用した構成情報の暗号化」を参照してください。
SQL プロバイダを使用する場合は、認証によりデータベースを適切に保護する必要があります。Microsoft SQL Server Express Edition のファイルは、アクセス制御リスト (ACL: Access Control List) および SQL 認証で適切に保護する必要があります。
メモ : |
---|
イベントのログをデータベースに記録する場合、SQL Server Express Edition を非特権アカウントでは実行しないでください。 |
サービス拒否攻撃に対するセキュリティ
Web イベントは、例外またはイベントを生成する HTTP 要求やアプリケーション コードにより発生する場合があります。大量のイベントや大容量のイベントにより、イベント プロバイダの容量の制限を超える場合があります。その場合、ASP.NET のアプリケーションやサーバーが大きな打撃を受けて、メモリ使用量、ディスク容量、およびネットワーク トラフィックが影響を受ける可能性があります。
アプリケーションがサービス拒否攻撃にさらされる危険を減らすために、ASP.NET では既定で次のデザインを使用します。
1 分ごとに ASP.NET で任意のイベントの 1 つのインスタンスを測定します。このスロットリング頻度は profiles 要素に設定され、rules 要素のイベントとプロバイダに関連付けられます。
イベントのバッファリングは、バッファ領域の競合を回避するため、それぞれのプロバイダの種類ごとに分離して実行されます。バッファ設定は bufferModes 要素に設定します。プロバイダは、適切な設定が格納された bufferModes 要素を指定することにより、特定のバッファ設定のセットを使用するように設定できます。
カスタム イベントを発生させるには、"中" 以上の信頼レベルが必要です。
システム管理者としてスロットリング設定とバッファリング設定を適切に設定すると、特に HTTP 要求によって発生する可能性のあるイベントによるオーバーフローを回避できます。また、個別のバッファ モードを設定すると、重要なイベントと重要でないイベントを分けて処理できます。
エラー メッセージとイベントのセキュリティ
望ましくないソースに対して機密情報が公開されることを防ぐには、詳細なエラー メッセージを表示しないようにアプリケーションを構成します。また、クライアントが Web サーバーそのものであるときにだけ詳細なエラー メッセージを表示するように、アプリケーションを構成することもできます。詳細については、「customErrors」を参照してください。
既定では、ASP.NET は大量で例外的な要求ごとの Web イベントをパフォーマンス モニタ システムに記録します。既定の構成では、ログイン試行が失敗すると、ユーザー名とその他の診断情報がアプリケーション イベント ログに記録されます。このデータは Windows イベント ビューアに表示できます。サーバーが Microsoft Windows Server 製品のいずれかを実行している場合は、イベント ログを保護することによってアプリケーションのセキュリティを強化できます。また、イベント ログのサイズ、保持期間、およびその他の特性を指定するパラメータを設定し、ログに対する間接的なサービス拒否攻撃を防止することもできます。
ASP.NET Health Monitoring 構成のロック
アプリケーションのホスト シナリオでは、設定が変更されることを防ぐために、サイトの設定をロックする必要が生じる場合がよくあります。たとえば、Web アプリケーションの構成に対して偶発的な変更が発生しないように、ホスト アプリケーションの状態監視設定をロックすることが必要になる場合があります。
構成設定をロックするには、<location> タグに allowOverride="false" 属性を追加します。これにより、階層構造内でこの場所より下の階層にある構成ファイルが location 要素で定義されている構成セクションをオーバーライドしようとすると、構成システムがエラーをスローします。
application1 という名前の ASP.NET アプリケーションの healthMonitoring セクションをロックする構成ファイルの例を次に示します。この設定は、サーバー レベル (machine.config ファイル内) でもサイト レベルでも格納できます。
<configuration>
<location path="application1" allowOverride="false">
<system.web>
<healthMonitoring
enabled="true"
heartBeatInterval="60">
<bufferModes>
<add name="Logging"
maxBufferSize="1000"
maxFlushSize="200"
urgentFlushThreshold="800"
regularFlushInterval="00:30:00"
urgentFlushInterval="00:05:00"
maxBufferThreads="1"
/>
</bufferModes>
<providers>
<add name="EventLogProvider"
type="System.Web.Management.EventLogWebEventProvider, System.Web, Version=%ASSEMBLY_VERSION%, Culture=neutral, PublicKeyToken=%MICROSOFT_PUBLICKEY%"
buffer="true"
bufferMode="Logging"
/>
</providers>
<eventMappings>
<add name="All Errors"
type="System.Web.Management.WebBaseErrorEvent, System.Web, Version=%ASSEMBLY_VERSION%, Culture=neutral, PublicKeyToken=%MICROSOFT_PUBLICKEY%"
/>
</eventMappings>
<profiles>
<add name="Default"
minInstances="1"
maxLimit="Infinite"
minInterval="00:10:00"
/>
</profiles>
<rules>
<add name="All Errors Default"
eventName="All Errors"
provider="EventLogProvider"
profile="Default"
minInterval="00:01:00"
/>
</rules>
</healthMonitoring>
</system.web>
</location>
</configuration>
lockItem 属性、lockAttributes 属性、lockElements 属性などを使用して、より細かい設定で要素をロックできます。詳細については、「セクションの要素によって継承される全般属性」を参照してください。
ページのトップへ
コード例
方法 : カスタムの ASP.NET Health Monitoring イベントの実装と発生
チュートリアル : ASP.NET Health Monitoring における WMI イベントの待機
ページのトップへ
クラス リファレンス
System.Web.Management
Web アプリケーションの状態を管理および監視するための型が含まれた名前空間です。System.Management
WMI (Windows Management Instrumentation) インフラストラクチャに接続するための型が含まれた名前空間です。System.Management.Instrumentation
WMI の潜在的なコンシューマ用のアプリケーションをインストルメントするための型が含まれた名前空間です。HealthMonitoringSection
healthMonitoring 構成属性をプログラムで取得または設定する種別です。
ページのトップへ
参照
処理手順
概念
ASP.NET Health Monitoring イベントの拡張