智能检测 - 失败异常

如果 Web 应用的失败请求速率出现异常上升,那么 Application Insights 会近乎实时地自动通知你。 它会对 HTTP 请求速率或报告为失败的依赖项调用的异常上升进行检测。 对于请求而言,失败的请求通常是响应代码为 400 或更高的请求。 为了帮助会审和诊断问题,通知详情中会提供失败及相关应用程序数据的特征分析。 还提供指向 Application Insights 门户的链接,以供进一步诊断。 该功能不需要任何设置或配置,因为它使用机器学习算法来预测正常的失败率。

此功能适用于在云中或你自己的服务器上承载的、生成应用程序请求或依赖项数据的任何 Web 应用。 例如,如果你的辅助角色调用 TrackRequest() 或 TrackDependency()。

在设置适用于项目的 Application Insights 后,如果应用生成特定最低数据量,在进行切换和发送警报前,智能检测失败异常将花费 24 小时来了解应用的正常行为。

下面是一个示例警报:

显示有关故障的群集分析的示例智能检测警报。

注意

智能检测程序故障异常是针对每个 App Insights 中请求总数的失败率而计算的。 这些通知不会对发送这些请求的每个 API 或应用程序发出警报。

警报详细信息会告诉你:

  • 相较于正常应用行为的失败率。
  • 受影响的用户数,因此你知道需要有多担心。
  • 与失败关联的特征模式。 在此示例中,有特定的响应代码、请求名称(操作)和应用程序版本。 这会立即通知在代码中开始查找的位置。 其他可能性可能是特定的浏览器或客户端操作系统。
  • 似乎与特征失败相关联的异常、日志跟踪和依赖项失败(数据库或其他外部组件)。
  • 直接指向 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 门户中检查是否已解决智能检测警报。

管理失败异常警报规则

警报规则创建

创建 Application Insights 资源时,会自动创建失败异常警报规则。 该规则会自动配置为分析该资源上的遥测数据。 可以使用 Azure REST API 或使用资源管理器模板再次创建该规则。 如果出于某种原因自动创建规则失败,或者删除了规则,那么创建规则的功能就有用了。

警报规则配置

要在门户中配置失败异常警报规则,请打开“警报”页并选择“警报规则”。 失败异常警报规则包含在你手动设置的任何警报内。

在 Application Insights 资源页上,单击“警报”磁贴,然后单击“管理警报规则”。

单击警报规则以配置它。

规则配置屏幕。

可以从门户或使用 Azure 资源管理器模版禁用智能检测警报规则。

此警报规则是与名为“Application Insights 智能检测”的操作组 相关联创建的。默认情况下,此操作组包含电子邮件 Azure 资源管理器角色操作,并向在您的订阅中拥有监视参与者或监视读取者 Azure 资源管理器角色的用户发送通知。 可以移除、更改或添加规则触发的操作组,就像对待任何其他 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/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/test-group/providers/microsoft.insights/components/test-rule",
            "targetResourceName": "test-rule",
            "targetResourceGroup": "test-group",
            "targetResourceType": "microsoft.insights/components",
            "sourceCreatedId": "1a0a5b6436a9b2a13377f5c89a3477855276f8208982e0f167697a2b45fcbb3e",
            "alertRule": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/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/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/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.cn/#blade/AppInsightsExtension/ProactiveDetectionFeedBlade/ComponentId/{\"SubscriptionId\":\"aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e\",\"ResourceGroup\":\"test-group\",\"Name\":\"test-rule\"}/SelectedItemGroup/bbbb1b1b-cc2c-dd3d-ee4e-ffffff5f5f5f/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/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/test-group/providers/microsoft.insights/components/test-rule/providers/Microsoft.AlertsManagement/alerts/cccc2c2c-dd3d-ee4e-ff5f-aaaaaa6a6a6a",
    "type": "Microsoft.AlertsManagement/alerts",
    "name": "Failure Anomalies - test-rule"
}

会审和诊断警报

警报指示已检测到失败请求中有异常上升。 应用或其环境很可能存在某些问题。

要进一步调查,请单击“在 Application Insights 中查看完整详细信息”。 此页面中的链接会直接转到搜索页,筛选为相关请求、异常、依赖项或跟踪。

若要进一步调查,单击该页面的“查看 Application Insights 中的完整详细信息”链接可直接转到搜索页,该页面已针对相关请求、异常、依赖项或跟踪进行筛选。

你还可以打开 Azure 门户,导航到应用的 Application Insights 资源并打开“失败”页。

单击“对失败进行诊断”可帮助你了解更多详细信息并解决问题。

诊断搜索。

根据请求百分比和受影响用户数,可以确定问题的紧急程度。 在之前的示例中,78.5% 的失败率与 2.2% 的正常失败率产生了比较,表明一些不好的事情正在发生。 另一方面,只有 46 位用户受到影响。 此信息可以帮助你评估问题有多严重。

在许多情况下,你可以从提供的请求名称、异常、依赖项失败和跟踪数据快速诊断问题。

在此示例中,由于达到请求限制,SQL 数据库中出现异常。

失败请求的详细信息。

查看最近的警报

在 Application Insights 资源页面单击“警报”以获取最新触发的警报:

警报摘要。

如果收到智能检测警报

我为何收到此警报?

  • 我们检测到与之前一段时间的正常基线相比,失败请求率中出现异常上升。 对失败和关联应用程序数据进行分析后,我们认为存在问题并且你应当给予关注。

通知是否表示肯定存在问题?

  • 我们尝试针对应用中断或降级发出警报,但只有可以完全了解语义以及对应用或用户的影响。

那么,你是否正在查看我的应用程序数据?

  • 不是。 该服务完全是自动的。 只有你会收到通知。 数据是私有数据。

是否需要订阅此警报?

  • 不是。 发送请求数据的每个应用程序都有智能检测警报规则。

是否可以取消订阅或者获取已发送至同事的通知?

  • 是,在“警报”规则中,单击“智能检测”规则可配置它。 可以禁用警报,或更改警报的收件人。

我丢失了电子邮件。 在哪里可以找到门户中的通知?

  • 你可以在 Azure 门户的 Application Insights 警报页中找到失败异常警报。

有些警报是关于已知问题的,我不希望接收它们。

后续步骤

这些诊断工具可帮助检查应用中的数据:

智能检测是自动执行的。 但是或许你想要设置更多的警报?