智能检测 - 失败异常

如果 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 警报页中找到失败异常警报。

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

后续步骤

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

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