应用程序映射:会审分布式应用程序

应用程序映射表示分布式应用程序的逻辑结构。 应用程序的各个组件由记录遥测中的“roleName”或“name”属性确定。 这些组件在映射中表示为圆圈,称为“节点”。节点之间的 HTTP 调用表示为连接这些节点的箭头,称为“连接器”或“边缘”。进行调用的节点是调用的“源”,接收节点是调用的“目标”。

应用程序映射可帮助你发现的性能瓶颈或热点失败的所有组件的分布式应用程序。 映射中的每个节点表示应用程序组件或其依赖项,并具有运行状况 KPI 和警报状态。 你可以选择任何组件来获取更详细的诊断,例如 Application Insights 事件。 如果应用使用了 Azure 服务,你还可以选择 Azure 诊断,例如 SQL 数据库顾问建议。

应用程序映射还提供智能视图用于帮助快速调查服务运行状况。

什么是组件?

组件是分布式或微服务应用程序的可独立部署的部件。 开发者或操作团队具有代码级可见性,或有权访问由这些应用程序组件生成的遥测。 例如:

  • 组件不同于“观察到的”外部依赖项,例如 Azure SQL 和 Azure 事件中心,你的团队或组织可能无权访问这些依赖项(代码或遥测)。
  • 组件在任意数目的服务器、角色或容器实例上运行。
  • 即使订阅不同,组件也可以是单独的 Application Insights 资源。 它们还可以是向单个 Application Insights 资源报告的不同角色。 预览图体验会显示组件,无论它们的设置如何。

复合应用程序映射

你可以跨多个级别的相关应用程序组件中查看完整的应用程序拓扑。 组件可以是不同的 Application Insights 资源,或单个资源中的不同角色。 应用程序映射通过跟踪已安装 Application Insights SDK 的服务器之间进行的任何 HTTP 依赖项调用来查找服务器节点。

这种体验开头渐进式发现的组件。 首次加载应用程序映射时,会触发一组查询来发现与此组件相关的组件。 左上角的某个按钮会随着在应用程序中发现的组件数量而更新。

当你选择“更新映射组件”时,映射将会刷新,其中会显示在此前发现的所有组件。 加载此更新内容可能需要一段时间,具体取决于应用程序的复杂性。

如果所有组件都是单个 Application Insights 资源中的角色,则不需要此发现步骤。 这样的应用程序的初始负载将具有所有组件。

Screenshot that shows an example of an application map.

使用此体验的主要目标之一是能够实现可视化效果具有数百个组件的复杂拓扑。

选择任何组件可查看相关的见解,并转到该组件的性能和故障会审体验。

Diagram that shows application map details.

调查故障

选择“调查故障”打开“故障”窗格。

Screenshot that shows the Investigate failures button.

Screenshot that shows the Failures screen.

调查性能

若要排查性能问题,请选择“调查性能”。

Screenshot that shows the Investigate performance button.

Screenshot that shows the Performance screen.

转到详细信息

“转到详细信息”按钮显示端到端事务体验,提供调用堆栈级别的视图。

Screenshot that shows the Go to details button.

Screenshot that shows the End-to-end transaction details screen.

在日志(分析)中查看

若要进一步查询和调查应用程序数据,请选择“在日志(分析)中查看”。

Screenshot that shows the View in Logs (Analytics) button.

Screenshot that shows the Logs screen with a line graph that summarizes the average response duration of a request over the past 12 hours.

警报

若要查看活动警报和导致警报触发的基础规则,请选择“警报”。

Screenshot that shows the Alerts button.

Screenshot that shows a list of alerts.

设置或替代云角色名称

应用程序映射使用云角色名称属性来标识映射上的组件。

按照以下指导手动设置或替代云角色名称并更改要在应用程序映射上显示的内容。

注意

Application Insights SDK 或代理会自动将云角色名称属性添加到 Azure 应用服务环境中组件发出的遥测数据。

编写自定义 TelemetryInitializer

using Microsoft.ApplicationInsights.Channel;
using Microsoft.ApplicationInsights.Extensibility;

namespace CustomInitializer.Telemetry
{
    public class MyTelemetryInitializer : ITelemetryInitializer
    {
        public void Initialize(ITelemetry telemetry)
        {
            if (string.IsNullOrEmpty(telemetry.Context.Cloud.RoleName))
            {
                //set custom role name here
                telemetry.Context.Cloud.RoleName = "Custom RoleName";
                telemetry.Context.Cloud.RoleInstance = "Custom RoleInstance";
            }
        }
    }
}

ASP.NET 应用:在活动的 TelemetryConfiguration 中加载初始值设定项

ApplicationInsights.config中:

    <ApplicationInsights>
      <TelemetryInitializers>
        <!-- Fully qualified type name, assembly name: -->
        <Add Type="CustomInitializer.Telemetry.MyTelemetryInitializer, CustomInitializer"/>
        ...
      </TelemetryInitializers>
    </ApplicationInsights>

ASP.NET Web 应用程序的另一种方法是在代码中(例如在 Global.aspx.cs 中)实例化初始化表达式:

 using Microsoft.ApplicationInsights.Extensibility;
 using CustomInitializer.Telemetry;

    protected void Application_Start()
    {
        // ...
        TelemetryConfiguration.Active.TelemetryInitializers.Add(new MyTelemetryInitializer());
    }

注意

对于 ASP.NET Core 应用程序,无法使用 ApplicationInsights.configTelemetryConfiguration.Active 添加初始化表达式。

ASP.NET Core 应用:将初始化表达式加载到 TelemetryConfiguration

对于 ASP.NET Core 应用程序,若要添加新的 TelemetryInitializer 实例,请将其添加到依赖项注入容器,如下所示。 在 Startup.cs 类的 ConfigureServices 方法中执行此步骤。

 using Microsoft.ApplicationInsights.Extensibility;
 using CustomInitializer.Telemetry;
 public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<ITelemetryInitializer, MyTelemetryInitializer>();
}

了解应用程序映射上下文中的云角色名称

请查看包含多个云角色名称的应用程序映射来帮助理解云角色名称的概念。

Screenshot that shows an application map example.

在所示的应用程序映射中,绿框中的每个名称是云角色名称值,它们反映了此特定分布式应用程序的不同方面。 此应用的角色由 AuthenticationacmefrontendInventory ManagementPayment Processing Worker Role 组成。

在此应用中,每个云角色名称也代表具有自身检测密钥的唯一 Application Insights 资源。 由于此应用程序的所有者有权访问这四个不同 Application Insights 资源中的每一个,因此,应用程序映射可将基础关系的映射拼接到一起。

官方定义

   [Description("Name of the role the application is a part of. Maps directly to the role name in azure.")]
    [MaxStringLength("256")]
    705: string      CloudRole = "ai.cloud.role";

    [Description("Name of the instance where the application is running. Computer name for on-premises, instance name for Azure.")]
    [MaxStringLength("256")]
    715: string      CloudRoleInstance = "ai.cloud.roleInstance";

或者,如果云角色名称能够告知问题出现在 Web 前端中的某个位置,则云角色实例可能有所帮助。 但是,你可能在 Web 前端中运行多个负载均衡的服务器。 能够通过 Kusto 查询下钻到更深的层并了解问题是影响所有 Web 前端服务器或实例还是只影响其中的一个服务器或实例可能非常重要。

智能视图 需要替代云角色实例值的另一种情况是应用在容器化环境中运行。 在这种情况下,只需了解单个服务器可能无法获得足够的信息来找出特定的问题。

有关如何使用遥测数据初始化表达式替代云角色名称属性的详细信息,请参阅添加属性:ITelemetryInitializer


应用程序映射筛选器

应用程序映射筛选器允许用户通过应用一个或多个筛选器来减少显示的节点和边缘数。 这些筛选器可用于缩小映射的范围,显示更小且更集中的映射。

创建应用程序映射筛选器

若要创建筛选器,请选择应用程序映射工具栏中的“添加筛选器”按钮。

A screenshot of the Add Filter button.

这将弹出一个包含三个部分的对话框:1) 选择筛选器类型,2) 选择筛选器参数,以及 3) 审阅。

A screenshot with the Node Filter radio button selected.

A screenshot with the Connector Edge Filter radio button selected.

第一部分有两个选项:

  1. 节点筛选器
  2. 连接器(边缘)筛选器

其他部分中的内容根据所选选项而更改。

节点筛选器

节点筛选器允许用户仅保留映射上的选定节点并隐藏其余节点。 节点筛选器检查每个节点是否包含属性(例如其名称),其值与通过给定运算符的搜索值匹配。 如果节点筛选器删除了某个节点,则其所有连接器(边缘)也会被删除。

有三个参数可用于节点:

  • “包含的节点”允许用户仅选择具有匹配属性的节点,或者在生成的映射中还包括源节点和/或目标节点。

    • “节点和源,目标”- 这意味着与搜索参数匹配的节点将包含在生成的映射中,并且作为匹配节点的源或目标的节点也将包括在内,即使它们没有与搜索匹配的属性值。 源节点和目标节点统称为“已连接”节点。

    • “节点和源”- 与上述相同,但目标节点不会自动包含在结果中。

    • “节点和目标”- 与上述相同,但不会自动包含源节点。

    • “仅限节点”- 结果映射中的所有节点都必须具有匹配的属性值。

  • “运算符”是将在每个节点的属性值上执行的检查类型:

    • contains

    • !contains(不包含)

    • ==(等于)

    • !=(不等于)

  • “搜索值”是必须包含、不包含、等于或不等于节点属性值的文本。 在映射中的节点中找到的一些值显示在下拉列表中。 可以通过在下拉列表中单击“创建选项...”输入任意值。

例如,在下面的屏幕截图中,筛选器配置为选择包含文本“-west”的节点。源和目标节点也将包含在生成的映射中。 在同一屏幕截图中,用户可以选择在映射中找到的值之一,或创建与映射中找到的值不完全匹配的选项。

A screenshot with the filter configured to select nodes that contain the text west.

连接器(边缘)筛选器

连接器筛选器检查连接器的属性以匹配值。 与筛选器不匹配的连接器将从映射中删除。 没有连接器的节点也会发生同样的情况。

连接器筛选器需要三个参数:

  • “筛选连接器的依据”允许用户选择要使用的连接器属性:

    • “错误连接器(突出显示为红色)”根据连接器的颜色(红色或非红色)选择连接器。 不能为这种类型的筛选器输入值,只能输入“==”或“!=”的运算符,表示“有错误的连接器”和“没有错误的连接器”。

    • “错误率”使用连接器的平均错误率 - 失败的呼叫数除以所有呼叫数 - 以百分比表示。 例如,值为“1”表示 1% 的失败调用。

    • “平均呼叫持续时间 (****ms)”仅使用:连接器表示的所有呼叫的平均持续时间(以毫秒为单位)。 例如,值“1000”表示平均 1 秒的调用。

    • “呼叫计数”使用连接器表示的呼叫总数。

  • “运算符”是将在连接器属性和下面输入的值之间应用的比较。 选项更改:“错误连接器”具有等于/不等于选项;所有其他的都有大于/小于。

  • “值”是筛选器的比较值。 “错误连接器”筛选器只有一个选项:“错误”。其他筛选器类型需要数值,并提供一个下拉列表,其中包含一些与映射相关的预填充条目。

    • 其中一些条目具有指定“(Pxx)”,这是百分位级别。 例如,“平均调用持续时间”筛选器的值可能为“200 (P90)”,该值指示所有连接器中有 90%(无论它们表示的调用数是多少)的调用持续时间都小于 200 毫秒。

    • 当下拉列表中未显示特定数字时,可以通过键入该数字,然后单击“创建选项”来创建该数字。键入“P”会在下拉列表中显示所有百分位值。

“审阅”部分

“审阅”部分包含筛选器将执行的操作的文本和视觉说明,这在了解筛选器的工作原理时应该会有所帮助:

A screenshot of the Review section with node in focus.

A screenshot of the Review section depicting an average call duration greater than 42 milliseconds.

在应用程序映射中使用筛选器

筛选器交互性

在“添加筛选器”弹出窗口中配置筛选器后,选择“应用”以创建筛选器。 可以应用多个筛选器,它们从左到右按顺序工作。 每个筛选器都可以删除其他节点和连接器,但不能将它们添加回映射。

筛选器显示为应用程序映射上方的圆角按钮:

A screenshot displaying the rounded filter buttons above the application map.

单击筛选器上的A screenshot of a rounded X button. 将删除该筛选器。 单击按钮上的其他位置可让用户编辑筛选器的值。 当用户更改筛选器中的值时,将应用新值,以便映射呈现为更改后的预览。 单击“取消”将还原到编辑前的筛选器。

A screenshot displaying the Configure Connector Filter section with a Cancel button.

重用筛选器

可以通过两种方式重用筛选器:

  • 映射上方工具栏上的“复制链接”按钮对复制的 URL 中的筛选器信息进行编码。 此链接可以保存在浏览器的书签中或与他人共享。 “复制链接”保留持续时间值,但不保留绝对时间,因此稍后显示的映射可能与创建链接时观察到的映射不同。

  • 仪表板图钉A screenshot displaying the dashboard pin button.位于“应用程序映射”窗格的标题栏旁边。 此按钮将映射与应用于仪表板的筛选器一起固定到仪表板。 此操作对常用筛选非常有用。 例如,用户可以固定应用了“错误连接器”筛选器的映射,仪表板映射将仅显示在其 HTTP 调用中出现错误的节点。

筛选器使用方案

有许多筛选器组合。 下面是适用于大多数映射的一些建议,这些建议可能有助于固定在仪表板上:

  • 仅使用“错误连接器”筛选器和“智能视图”显示重大错误:
    A screenshot displaying the Last 24 hours and Highlighted Errors filters.A screenshot displaying the Intelligent Overview toggle.

  • 隐藏没有错误的低流量连接器,以快速关注影响较大的问题:A screenshot displaying the Last 24 hours, calls greater than 876, and highlighted errors filters.

  • 显示具有较高平均持续时间的高流量连接器,以专注于潜在的性能问题:A screenshot displaying the Last 24 hours, calls greater than 3057, and average time greater than 467 filters.

  • 显示分布式应用程序的特定部分(需要合适的 roleName 命名约定):A screenshot displaying the Last 24 hours and Connected Contains West filters.

  • 隐藏过于嘈杂的依赖项类型:A screenshot displaying the Last 24 hours and Nodes Contains Storage Accounts filters.

  • 仅显示错误率高于特定值的连接器A screenshot displaying the Last 24 hours and Errors greater than 0.01 filters.


应用程序映射智能视图

以下部分介绍智能视图。

智能视图摘要

应用程序映射的智能视图旨在帮助调查服务运行状况。 它应用机器学习通过筛选出干扰性信息来快速识别问题的潜在根本原因。 机器学习模型从应用程序映射的历史行为中学习,以识别指示事件潜在原因的主导模式和异常。

在大型分布式应用程序中,“良性”故障总会造成一定程度的干扰,这可能导致应用程序映射显示许多红色边缘,从而出现干扰性信息。 智能视图仅显示服务故障的最可能原因,并删除运行状况服务中的节点到节点红色边缘(服务到服务通信)。 智能视图用红色突出显示应调查的边缘。 它还为突出显示的边缘提供可操作的见解。

智能视图的优势

  • 通过仅突出显示需要调查的故障来减少问题的解决时间
  • 提供有关为何突出显示特定红色边缘的可操作见解
  • 使应用程序映射能够无缝地用于大型分布式应用程序(只需重点关注用红色标记的边缘)

在应用程序映射中启用智能视图

启用“智能视图”切换开关。 (可选)若要更改检测灵敏度,请选择“低”、“中”或“高”。 有关详细信息,请参阅有关灵敏度的故障排除问题。

Screenshot that shows the Application Map user interface with options to toggle Intelligent view and provide feedback.

启用“智能视图”后,选择突出显示的边缘之一以查看“可操作的见解”。见解显示在右侧的窗格中,并解释为何突出显示该边缘。

Screenshot that shows the Application Map user interface section about actionable insights.

若要开始进行故障排除,请选择“调查故障”。 在打开的“故障”窗格中,调查检测到的问题是否是根本原因。 如果没有任何边缘以红色显示,则表示机器学习模型未在应用程序的依赖项中发现潜在事件。

若要提供反馈,请在映射中选择“反馈”按钮。

智能视图如何确定突出显示红色边缘的位置?

智能视图使用已获专利的 AIOps 机器学习模型来突出显示应用程序映射中真正重要的内容。

部分示例考虑因素包括:

  • 故障率
  • 请求计数
  • 持续时间
  • 数据中的异常
  • 依赖项的类型

为了进行比较,常规视图仅使用了原始故障率。

智能视图灵敏度的工作原理是什么?

智能视图灵敏度用于调整检测的服务问题的概率。

调整灵敏度可以在突出显示的边缘中实现所需的置信度。

灵敏度设置 结果
将突出显示更少的边缘。
中等(默认值) 将突出显示均衡数量的边缘。
将突出显示更多的边缘。

智能视图的局限性

智能视图存在一些局限性:

  • 大型分布式应用程序可能需要花费一点时间来加载智能视图。
  • 支持的时间范围最长为 7 天。

若要提供反馈,请参阅门户反馈


疑难解答

如果应用程序映射不按预期方式工作,请尝试执行以下步骤。

常规

  1. 请确保你使用的是官方支持的 SDK。 不受支持的 SDK 或社区 SDK 可能不支持关联。

    有关受支持 SDK 的列表,请参阅 Application Insights:语言、平台和集成

  2. 将所有组件都升级到最新 SDK 版本。

  3. 如果要将 Azure Functions 与 C# 配合使用,请升级到 Azure Functions V2

  4. 确认已正确配置云角色名称

  5. 如果缺少某个依赖项,请确保它在自动收集的依赖项列表中。 如果不在其中,也可以使用某个跟踪依赖项调用手动跟踪它。

映射中存在过多的节点

应用程序映射为请求遥测中存在的每个唯一云角色名称构造一个应用程序节点。 此外,将为类型、目标和云角色名称的每种唯一组合构造一个依赖项节点。

如果遥测中包含 10,000 个以上的节点,则应用程序映射无法提取所有的节点和链接,因此映射是不完整的。 如果发生这种情况,查看映射时会显示一条警告消息。

应用程序映射最多仅支持一次性呈现的 1,000 个独立未分组节点。 应用程序映射通过类型和调用方相同的依赖项分组到一起来减轻视觉复杂性。

如果遥测包含过多的唯一云角色名称或过多的依赖项类型,则这种分组将不足以减轻视觉复杂性,因此映射无法呈现。

若要解决此问题,需要更改检测,以正确设置云角色名称、依赖项类型和依赖项目标字段。

  • 依赖项目标应代表依赖项的逻辑名称。 在许多情况下,它相当于依赖项的服务器或资源名称。 例如,如果存在 HTTP 依赖项,则目标将设置为主机名。 依赖项目标不应包含会在不同的请求中发生变化的唯一 ID 或参数。

  • 依赖项类型应代表依赖项的逻辑类型。 例如,HTTP、 SQL 或 Azure Blob 就是典型的依赖项类型。 它不应包含唯一 ID。

  • 设置或替代云角色名称部分中介绍了云角色名称的用途。

智能视图

有关智能视图的常见故障排除问题。

为何即使灵敏度很低,也不会突出显示此边缘?

依赖项似乎发生故障,但模型未指明该故障是潜在事件:

  • 如果此依赖项发生故障已有一段时间,则模型可能会认为它是一种常规状态,因此不会突出显示边缘。 它注重于在 RT 中解决问题。
  • 如果此依赖项对应用的整体性能影响很小,则模型也有可能会忽略它。
  • 如果上面所述均不正确,请使用“反馈”选项并描述你的经历。 你可以帮助我们改进将来的模型版本。

边缘为何突出显示?

如果突出显示了某个边缘,模型中的解释应会将你指向最重要的特征,这些特征使得模型为此依赖项给出了一个较高的概率分数。 建议并不是单纯根据故障提供的,而是考虑到了其他指标,例如主导流中的意外延迟。

智能视图为何不加载?

如果“智能视图”未加载,请将配置的期限设置为六天或更短。

为何加载智能视图需要很长时间?

避免选择“更新映射组件”。

仅为单个 Application Insights 资源启用智能视图。

Screenshot that shows the Update map components button in the Application Map user interface.

门户反馈

若要提供反馈,请使用反馈选项。

Screenshot that shows the Feedback option.

后续步骤