スマート検出 - 失敗の異常

Application Insights では、Web アプリで要求の失敗率が異常に増加すると、ほぼリアルタイムで自動的にユーザーにアラートを送信します。 具体的には、失敗として報告された HTTP 要求または依存関係の呼び出しの割合が異常に上昇すると、それが検出されます。 要求の場合、失敗した要求の応答コードは、通常、400 以上です。 アラートの詳細には、問題のトリアージと診断に役立つよう、失敗の特性および関連するアプリケーション データの分析が表示されます。 また、より詳しい診断を行うために、Application Insights ポータルへのリンクも含まれています。 この機能は、機械学習アルゴリズムを使用して通常の失敗率を予測するため、セットアップや構成は不要です。

この機能は、クラウドまたは独自サーバーでホストされ、アプリケーションの要求または依存データを生成するあらゆる Web アプリで利用できます。 たとえば、TrackRequest() または TrackDependency() を呼び出す worker ロールがある場合などです。

プロジェクト用に Application Insights を設定し、アプリで特定の最少限のデータを生成する場合、失敗の異常のスマート検出は 24 時間かけてアプリケーションの通常の動作を学習してから、オンに切り替わり、アラートを送信できるようになります。

アラートの例を次に示します。

失敗箇所周辺のクラスター分析を示すスマート検出のアラートのサンプル。

アラートの詳細には、次の内容が表示されます。

  • 通常のアプリケーションの動作と比較した失敗率。
  • 影響を受けるユーザーの数 - アラートの重要度がわかります。
  • 失敗に関連付けられている特徴的パターン。 この例では、特定の応答コード、要求名 (操作)、およびアプリケーションのバージョンがあります。 これにより、コードのどこから探すべきかすぐにわかります。 他には特定のブラウザーやクライアント オペレーティング システムなどが想定されます。
  • 特徴付けられた失敗に関連するように見える例外、ログ トレース、依存関係エラー (データベースやその他の外部コンポーネント)。
  • Application Insights のデータの関連検索に直接リンクします。

スマート検出の利点

通常の メトリック アラート から、問題がある可能性がわかります。 ただし、スマート検出では自動的に診断作業が開始され、ユーザーに代わってさまざまな分析が実行されます。 結果はわかりやすくまとめられるので、問題の原因をすぐに把握できます。

しくみ

スマート検出は、アプリから受け取ったデータ (特に失敗率) を監視します。 このルールは、Successful request プロパティが false である要求の数と、Successful call プロパティが false である依存関係の呼び出しの数をカウントします。 要求は、既定では Successful request == (resultCode < 400) (独自の TrackRequest 呼び出しをフィルター処理または生成するカスタム コードを記述しない限り) となります。

アプリのパフォーマンスには、一般的な動作パターンがあります。 他よりも失敗が発生しやすい要求または依存関係があります。負荷が増えると、全体的な失敗率が上がります。 スマート検出は機械学習を使用し、これらの異常を検出します。

Web アプリから Application Insights にデータが送られると、スマート検出は現在の動作と過去数日間に見られたパターンを比較します。 以前のパフォーマンスと比較して失敗率が異常に上昇していることを検出した場合、検出器はより詳細な分析をトリガーします。

分析がトリガーされると、サービスは失敗した要求のクラスター分析を実行して、失敗を特徴づける値のパターンの特定を試みます。

先に示した例では、分析により、ほとんどの失敗が特定の結果コード、要求名、サーバー URL ホスト、およびロール インスタンスに関係していることが検出されました。

これらの呼び出しを使用してサービスをインストルメント化すると、アナライザーは、識別されたクラスター内の要求に関連付けられている例外と依存関係エラーの検索を実行します。 また、アナライザーはこれらの要求に関連付けられているトレース ログの例も併せて検索します。 受信したアラートには、検出にコンテキストを提供し、検出された問題の根本原因に関するヒントになる、この追加情報が含まれています。

アラート ロジックの詳細

失敗の異常検出は、独自の機械学習アルゴリズムに依存するため、アラートが発生した場合や発生しない理由が必ずしも決定論的であるとは限りません。 それを踏まえたうえで、アルゴリズムが使用する主な要素は次のとおりです。

  • 20 分のローリング時間枠における要求/依存関係の失敗率の分析。
  • 過去 20 分間の失敗率と、過去 40 分および過去 7 日間の失敗率の比較。 このアルゴリズムは、標準偏差の X 倍を超える有意な偏差を検索します。
  • このアリゴリズムは、最小失敗率の適応限界を使用します。これは、アプリの要求/依存関係の量によって異なります。
  • このアルゴリズムには、問題が 8 から 24 時間検出されなくなった場合に、発生したアラートを自動的に解決できるロジックがあります。 注: 現在の設計では、 スマート検出アラートが解決されると、通知もアクションも送信されません。 スマート検出アラートが解決されたかどうかを Azure portal で確認できます。

失敗の異常のアラート ルールの管理

アラート ルールの作成

失敗の異常のアラート ルールは、Application Insights リソースの作成時に自動的に作成されます。 このルールは、そのリソースのテレメトリを分析するように自動的に構成されます。 Azure REST API または Resource Manager テンプレートを使用して、再度ルールを作成できます。 ルールの自動作成が何らかの理由で失敗した場合や、ルールを削除した場合に、ルールを作成すると便利です。

アラート ルールの構成

ポータルで失敗の異常のアラート ルールを構成するには、[アラート] ページを開き、[アラート ルール] を選択します。 失敗の異常のアラート ルールは、手動で設定したアラートと共に含まれます。

Application Insights リソース ページで、[アラート] タイル、[アラート ルールの管理] の順にクリックします。

アラート ルールをクリックして構成します。

ルールの構成画面。

スマート検出アラート ルールは、ポータルから、または Azure Resource Manager テンプレートを使用して、無効にできます。

このアラート ルールは、"Application Insights スマート検出" という名前の関連付けられたアクション グループで作成されます既定では、このアクション グループには Azure Resource Manager ロールへのメール アクションが含まれており、サブスクリプションで監視共同作成者または監視閲覧者サブスクリプションの Azure Resource Manager ロールを持つユーザーに通知を送信します。 他の Azure アラート ルールと同様に、ルールによってトリガーされるアクション グループを削除、変更、または追加できます。 このアラート ルールから送信される通知は、共通アラート スキーマに準拠します。

アラートを削除する

失敗の異常のアラート ルールを削除できます。

これは、アラート ルール ページで、または次の Azure CLI コマンドを使用して手動で行うことができます。

az resource delete --ids <Resource ID of Failure Anomalies alert rule>

Application Insights リソースを削除しても、関連付けられている失敗の異常のアラート ルールは自動的に削除されません。

失敗の異常アラート Webhook ペイロードの例

{
    "properties": {
        "essentials": {
            "severity": "Sev3",
            "signalType": "Log",
            "alertState": "New",
            "monitorCondition": "Resolved",
            "monitorService": "Smart Detector",
            "targetResource": "/subscriptions/4f9b81be-fa32-4f96-aeb3-fc5c3f678df9/resourcegroups/test-group/providers/microsoft.insights/components/test-rule",
            "targetResourceName": "test-rule",
            "targetResourceGroup": "test-group",
            "targetResourceType": "microsoft.insights/components",
            "sourceCreatedId": "1a0a5b6436a9b2a13377f5c89a3477855276f8208982e0f167697a2b45fcbb3e",
            "alertRule": "/subscriptions/4f9b81be-fa32-4f96-aeb3-fc5c3f678df9/resourcegroups/test-group/providers/microsoft.alertsmanagement/smartdetectoralertrules/failure anomalies - test-rule",
            "startDateTime": "2019-10-30T17:52:32.5802978Z",
            "lastModifiedDateTime": "2019-10-30T18:25:23.1072443Z",
            "monitorConditionResolvedDateTime": "2019-10-30T18:25:26.4440603Z",
            "lastModifiedUserName": "System",
            "actionStatus": {
                "isSuppressed": false
            },
            "description": "Failure Anomalies notifies you of an unusual rise in the rate of failed HTTP requests or dependency calls."
        },
        "context": {
            "DetectionSummary": "An abnormal rise in failed request rate",
            "FormattedOccurenceTime": "2019-10-30T17:50:00Z",
            "DetectedFailureRate": "50.0% (200/400 requests)",
            "NormalFailureRate": "0.0% (over the last 30 minutes)",
            "FailureRateChart": [
                [
                    "2019-10-30T05:20:00Z",
                    0
                ],
                [
                    "2019-10-30T05:40:00Z",
                    100
                ],
                [
                    "2019-10-30T06:00:00Z",
                    0
                ],
                [
                    "2019-10-30T06:20:00Z",
                    0
                ],
                [
                    "2019-10-30T06:40:00Z",
                    100
                ],
                [
                    "2019-10-30T07:00:00Z",
                    0
                ],
                [
                    "2019-10-30T07:20:00Z",
                    0
                ],
                [
                    "2019-10-30T07:40:00Z",
                    100
                ],
                [
                    "2019-10-30T08:00:00Z",
                    0
                ],
                [
                    "2019-10-30T08:20:00Z",
                    0
                ],
                [
                    "2019-10-30T08:40:00Z",
                    100
                ],
                [
                    "2019-10-30T17:00:00Z",
                    0
                ],
                [
                    "2019-10-30T17:20:00Z",
                    0
                ],
                [
                    "2019-10-30T09:00:00Z",
                    0
                ],
                [
                    "2019-10-30T09:20:00Z",
                    0
                ],
                [
                    "2019-10-30T09:40:00Z",
                    100
                ],
                [
                    "2019-10-30T10:00:00Z",
                    0
                ],
                [
                    "2019-10-30T10:20:00Z",
                    0
                ],
                [
                    "2019-10-30T10:40:00Z",
                    100
                ],
                [
                    "2019-10-30T11:00:00Z",
                    0
                ],
                [
                    "2019-10-30T11:20:00Z",
                    0
                ],
                [
                    "2019-10-30T11:40:00Z",
                    100
                ],
                [
                    "2019-10-30T12:00:00Z",
                    0
                ],
                [
                    "2019-10-30T12:20:00Z",
                    0
                ],
                [
                    "2019-10-30T12:40:00Z",
                    100
                ],
                [
                    "2019-10-30T13:00:00Z",
                    0
                ],
                [
                    "2019-10-30T13:20:00Z",
                    0
                ],
                [
                    "2019-10-30T13:40:00Z",
                    100
                ],
                [
                    "2019-10-30T14:00:00Z",
                    0
                ],
                [
                    "2019-10-30T14:20:00Z",
                    0
                ],
                [
                    "2019-10-30T14:40:00Z",
                    100
                ],
                [
                    "2019-10-30T15:00:00Z",
                    0
                ],
                [
                    "2019-10-30T15:20:00Z",
                    0
                ],
                [
                    "2019-10-30T15:40:00Z",
                    100
                ],
                [
                    "2019-10-30T16:00:00Z",
                    0
                ],
                [
                    "2019-10-30T16:20:00Z",
                    0
                ],
                [
                    "2019-10-30T16:40:00Z",
                    100
                ],
                [
                    "2019-10-30T17:30:00Z",
                    50
                ]
            ],
            "ArmSystemEventsRequest": "/subscriptions/4f9b81be-fa32-4f96-aeb3-fc5c3f678df9/resourceGroups/test-group/providers/microsoft.insights/components/test-rule/query?query=%0d%0a++++++++++++++++systemEvents%0d%0a++++++++++++++++%7c+where+timestamp+%3e%3d+datetime(%272019-10-30T17%3a20%3a00.0000000Z%27)+%0d%0a++++++++++++++++%7c+where+itemType+%3d%3d+%27systemEvent%27+and+name+%3d%3d+%27ProactiveDetectionInsight%27+%0d%0a++++++++++++++++%7c+where+dimensions.InsightType+in+(%275%27%2c+%277%27)+%0d%0a++++++++++++++++%7c+where+dimensions.InsightDocumentId+%3d%3d+%27718fb0c3-425b-4185-be33-4311dfb4deeb%27+%0d%0a++++++++++++++++%7c+project+dimensions.InsightOneClassTable%2c+%0d%0a++++++++++++++++++++++++++dimensions.InsightExceptionCorrelationTable%2c+%0d%0a++++++++++++++++++++++++++dimensions.InsightDependencyCorrelationTable%2c+%0d%0a++++++++++++++++++++++++++dimensions.InsightRequestCorrelationTable%2c+%0d%0a++++++++++++++++++++++++++dimensions.InsightTraceCorrelationTable%0d%0a++++++++++++&api-version=2018-04-20",
            "LinksTable": [
                {
                    "Link": "<a href=\"https://portal.azure.com/#blade/AppInsightsExtension/ProactiveDetectionFeedBlade/ComponentId/{\"SubscriptionId\":\"4f9b81be-fa32-4f96-aeb3-fc5c3f678df9\",\"ResourceGroup\":\"test-group\",\"Name\":\"test-rule\"}/SelectedItemGroup/718fb0c3-425b-4185-be33-4311dfb4deeb/SelectedItemTime/2019-10-30T17:50:00Z/InsightType/5\" target=\"_blank\">View full details in Application Insights</a>"
                }
            ],
            "SmartDetectorId": "FailureAnomaliesDetector",
            "SmartDetectorName": "Failure Anomalies",
            "AnalysisTimestamp": "2019-10-30T17:52:32.5802978Z"
        },
        "egressConfig": {
            "displayConfig": [
                {
                    "rootJsonNode": null,
                    "sectionName": null,
                    "displayControls": [
                        {
                            "property": "DetectionSummary",
                            "displayName": "What was detected?",
                            "type": "Text",
                            "isOptional": false,
                            "isPropertySerialized": false
                        },
                        {
                            "property": "FormattedOccurenceTime",
                            "displayName": "When did this occur?",
                            "type": "Text",
                            "isOptional": false,
                            "isPropertySerialized": false
                        },
                        {
                            "property": "DetectedFailureRate",
                            "displayName": "Detected failure rate",
                            "type": "Text",
                            "isOptional": false,
                            "isPropertySerialized": false
                        },
                        {
                            "property": "NormalFailureRate",
                            "displayName": "Normal failure rate",
                            "type": "Text",
                            "isOptional": false,
                            "isPropertySerialized": false
                        },
                        {
                            "chartType": "Line",
                            "xAxisType": "Date",
                            "yAxisType": "Percentage",
                            "xAxisName": "",
                            "yAxisName": "",
                            "property": "FailureRateChart",
                            "displayName": "Failure rate over last 12 hours",
                            "type": "Chart",
                            "isOptional": false,
                            "isPropertySerialized": false
                        },
                        {
                            "defaultLoad": true,
                            "displayConfig": [
                                {
                                    "rootJsonNode": null,
                                    "sectionName": null,
                                    "displayControls": [
                                        {
                                            "showHeader": false,
                                            "columns": [
                                                {
                                                    "property": "Name",
                                                    "displayName": "Name"
                                                },
                                                {
                                                    "property": "Value",
                                                    "displayName": "Value"
                                                }
                                            ],
                                            "property": "tables[0].rows[0][0]",
                                            "displayName": "All of the failed requests had these characteristics:",
                                            "type": "Table",
                                            "isOptional": false,
                                            "isPropertySerialized": true
                                        }
                                    ]
                                }
                            ],
                            "property": "ArmSystemEventsRequest",
                            "displayName": "",
                            "type": "ARMRequest",
                            "isOptional": false,
                            "isPropertySerialized": false
                        },
                        {
                            "showHeader": false,
                            "columns": [
                                {
                                    "property": "Link",
                                    "displayName": "Link"
                                }
                            ],
                            "property": "LinksTable",
                            "displayName": "Links",
                            "type": "Table",
                            "isOptional": false,
                            "isPropertySerialized": false
                        }
                    ]
                }
            ]
        }
    },
    "id": "/subscriptions/4f9b81be-fa32-4f96-aeb3-fc5c3f678df9/resourcegroups/test-group/providers/microsoft.insights/components/test-rule/providers/Microsoft.AlertsManagement/alerts/7daf8739-ca8a-4562-b69a-ff28db4ba0a5",
    "type": "Microsoft.AlertsManagement/alerts",
    "name": "Failure Anomalies - test-rule"
}

アラートのトリアージと診断

アラートは、要求失敗率の異常な上昇が検出されたことを示します。 アプリやその環境に何らかの問題があることが考えられます。

さらに詳しく調査する場合は、[Application Insights で詳細をすべて表示する] をクリックします このページのリンクをクリックすると、関連する要求、例外、依存関係、トレースでフィルター処理された検索ページに直接移動できます。 さらに詳しく調査する場合は、このページの [View full details in Application Insights]\(Application Insights で完全な詳細を表示\) リンクをクリックすると、関連する要求、例外、依存関係、トレースでフィルター処理された検索ページに直接移動できます。

また、Azure portal を開き、アプリの Application Insights リソースに移動して、失敗ページを開くこともできます。

[失敗の診断] をクリックすると、問題の詳細を確認して解決するのに役立ちます。

診断検索。

要求の割合と影響を受けるユーザーの数から、問題の緊急度を判断できます。 前に示した例では、78.5% という失敗率が通常の失敗率である 2.2% と比較され、異常事態が発生していることを示しています。 一方、影響を受けたユーザー数は 46 人のみです。 この情報は、問題がどの程度深刻かを評価するのに役立ちます。

多くの場合は、提供された要求名、例外、依存関係エラー、トレース データからすばやく問題を診断できます。

この例では、要求の制限を超えたため、SQL Database から例外が発生しました。

失敗した要求の詳細。

最新のアラートを確認する

Application Insights リソース ページで [アラート] をクリックすると、直近の発生アラートが表示されます。

アラートの概要。

スマート検出アラートを受け取った場合

このアラートを受信した理由

  • 先行する期間の正常な基準値と比較し、要求失敗率の異常な上昇が検出されました。 失敗と関連するアプリケーション データを分析したところ、調査すべき問題があると思われます。

この通知は、明らかに問題があることを意味していますか。

  • アプリの中断や劣化に対してアラートを出すように試みますが、セマンティックスとアプリまたはユーザーに与える影響を完全に理解できるのは当人だけです。

ユーザーのアプリケーション データは Microsoft からも見られるのですか。

  • いいえ。 サービスは完全に自動化されています。 通知を受け取るだけです。 ユーザーのデータは プライベートです。

このアラートをサブスクライブする必要はありますか。

  • いいえ。 要求データを送信するすべてのアプリケーションには、スマート検出アラート ルールがあります。

サブスクライブの取消しはできますか。または、代わりに同僚に通知が送信されるように設定できますか。

  • はい。[アラート ルール] で、スマート検出ルールをクリックし、設定します。 アラートを無効にしたり、アラートの受信者を変更したりできます。

メールが消えました。 どうしたらポータルで通知を見つけられますか。

  • Azure portal のApplication Insights [アラート] ページで、失敗の異常のアラートを確認できます。

一部のアラートは既知の問題に関するものであるため、受信を停止したいのですが。

次のステップ

これらの診断ツールを使用すると、アプリからのデータを調査できます。

スマート検出は自動化されています。 ただし、アラートを追加で設定する機能が用意されています。