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

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

组件是什么?

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

  • 组件与“观察到的”外部依赖项(如 SQL 和 EventHub 等)不同,团队/组织可能无权访问(代码或遥测)。
  • 组件在任意数目的服务器/角色/容器实例上运行。
  • 组件可以是单独的 Application Insights 检测密钥(即使订阅并不相同),或是向单个 Application Insights 检测密钥报告的不同角色。 预览地图体验显示了组件而不考虑如何设置它们。

复合应用程序映射

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

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

单击"更新映射组件",发现在该点之前的所有组件刷新映射。 这可能要花费一段时间来进行加载,具体取决于应用程序的复杂性。

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

屏幕截图显示了应用程序映射的示例。

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

单击以查看相关的见解,转到的性能和失败的该组件的会审体验的任何组件。

浮出控件

调查故障

选择“调查故障”以启动故障窗格。

“调查故障”按钮的屏幕截图

故障体验的屏幕截图

调查性能

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

“调查性能”按钮的屏幕截图

性能体验的屏幕截图

转到详细信息

选择“转到详细信息”可探索端到端事务体验,从而可以深入到调用堆栈级别的信息。

“转到详细信息”按钮的屏幕截图

端到端事务详细信息的屏幕截图

查看日志(分析)

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

“在 Analytics 中查看”按钮的屏幕截图

分析体验的屏幕截图。 汇总过去 12 小时内请求的平均响应持续时间的折线图。

警报

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

“警报”按钮的屏幕截图

分析体验的屏幕截图

设置或替代云角色名称

应用程序映射使用 云角色名称 属性来标识映射上的组件。 若要手动设置或替代云角色名称并更改要在应用程序映射上显示的内容,请执行以下操作:

备注

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());
    }

备注

使用 ApplicationInsights.config 或使用 TelemetryConfiguration.Active 添加初始值设定项对于 ASP.NET Core 应用程序无效。

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>();
}

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

以下包含多个云角色名称的应用程序映射可帮助你加深对 云角色名称 的理解:

应用程序映射屏幕截图

在上面的应用程序映射中,绿框中的每个名称是云角色名称值,它们反映了此特定分布式应用程序的不同方面。 因此,此应用的角色由 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

故障排除

如果无法让应用程序映射按预期方式工作,请尝试以下步骤:

常规

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

    有关受支持的 SDK 的列表,请参考此文章

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

  3. 如果将 Azure Functions 与 C# 一起使用,请升级到 Functions V2

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

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

映射中存在过多的节点

应用程序映射为请求遥测中的每个唯一云角色名称构造一个应用程序节点,并为依赖项遥测中的类型、目标和云角色名称的每个唯一组合构造一个依赖项节点。 如果遥测中包含 10,000 个以上的节点,则应用程序映射无法提取所有的节点和链接,因此映射是不完整的。 如果发生这种情况,查看映射时会显示一条警告消息。

此外,应用程序映射最多仅支持一次性呈现的 1000 个独立未分组节点。 应用程序映射将具有相同类型和调用方的依赖项分组到一起,因此可降低了视觉复杂性。但是,如果遥测包含过多的唯一云角色名称或过多的依赖项类型,则这种分组并不足够,并且映射无法呈现。

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

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

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

  • 上面的部分介绍了云角色名称的用途。

门户反馈

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

MapLink-1 图

后续步骤