你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn 。
应用程序映射:会审分散式应用程序
本文内容
了解组件
浏览应用程序映射
了解云角色名称和节点
设置云角色名称
使用应用程序映射筛选器
浏览和保存筛选器
浏览智能视图
故障排除提示
相关内容
显示另外 5 个
开发者使用应用程序映射来表示其分散式应用程序的逻辑结构。 通过记录的遥测中单个应用程序组件的 roleName
或 name
属性,来识别各个应用程序组件,即可生成映射。 映射中的圆(或“节点” )表示组件,方向线(“连接器” 或“边缘” )显示从“源” 节点到“目标” 节点的 HTTP 调用。
Azure Monitor 提供“应用程序映射” 功能,可帮助你快速实现映射,并发现所有组件的性能瓶颈或故障作用点。 每个映射节点都是应用程序组件或其依赖项,并提供健康状况 KPI 和警报状态。 可以选择任何节点来查看组件的详细诊断,例如 Application Insights 事件。 如果应用使用了 Azure 服务,你还可以选择 Azure 诊断,例如 SQL 数据库顾问建议。
应用程序映射 还提供智能视图 ,用于帮助快速调查服务健康状况。
组件是分布式或微服务应用程序的可独立部署的部件。 开发者或操作团队具有代码级可见性,或有权访问由这些应用程序组件生成的遥测。
有关组件的一些注意事项:
组件不同于“观察到的”外部依赖项,例如 Azure SQL 和 Azure 事件中心,你的团队或组织可能无权访问这些依赖项(代码或遥测)。
组件在任意数目的服务器、角色或容器实例上运行。
即使订阅不同,组件也可以是单独的 Application Insights 资源。 它们还可以是向单个 Application Insights 资源报告的不同角色。 预览图体验会显示组件,无论它们的设置如何。
你可以借助应用程序映射 ,跨多个级别的相关应用程序组件查看完整的应用程序拓扑。 如前所述,组件可以是不同 Application Insights 资源、依赖组件或单个资源中的不同角色。 应用程序映射 通过跟踪已安装 Application Insights SDK 的服务器之间进行的任何 HTTP 依赖项调用来查找服务器节点。
映射体验从应用程序的组件及其依赖项的渐进式发现开始。 首次加载应用程序映射 时,会触发查询集,以发现与主组件相关的组件。 发现组件时,状态栏会显示当前发现的组件数:
以下部分介绍在 Azure 门户中使用应用程序映射 时可采取的一些操作。
“更新映射组件” 选项会触发组件发现,并刷新映射以显示所有当前节点。 加载此更新可能需要一段时间,具体取决于应用程序的复杂性:
当所有应用程序组件都是单个 Application Insights 资源中的角色时,不需要此发现步骤。 此应用程序场景中的初始负载可发现所有组件。
应用程序映射 体验的关键目标是帮助你可视化具有数百个组件的复杂拓扑。 在此场景中,使用“视图详细信息 ”选项通过单个节点的详细信息来增强映射视图非常有用。 节点详细信息窗格显示所选组件的相关见解、性能和故障会审体验:
每个窗格部分都包含一个选项,用于在展开的视图中查看详细信息,包括故障、性能和有关失败的请求和依赖项的详细信息。
在节点详细信息窗格中,可以使用“调查故障 ”选项查看组件的所有故障:
通过“故障” 视图,可以浏览与所选组件相关的操作、依赖项、异常和角色的故障数据:
在节点详细信息窗格中,可以通过选择“调查性能” 选项来排查组件的性能问题:
通过“性能” 视图,可以浏览与所选组件连接的操作、依赖项和角色的遥测数据:
节点详细信息窗格中的“转到详细信息” 选项显示组件的端到端事务体验。 此窗格可让你在调用堆栈级别查看详细信息:
此时会打开以下页面以显示详细信息的“时间线” 视图:
可以使用“查看所有 ”选项来查看堆栈详细信息,其中包含组件的跟踪和事件信息:
在节点详细信息窗格中,可以使用“在日志中查看(分析)” 选项进一步查询和调查应用程序数据:
“在日志中查看(分析)” 页提供了使用内置查询或自定义查询和函数浏览应用程序遥测表记录的选项。 可以通过调整格式并保存和导出分析来处理数据:
“节点详细信息” 窗格中的“查看警报”选项可让你看到活动警报:
“警报” 页显示关键警报和触发的警报:
“警报” 页上的“警报规则” 选项显示导致警报触发的基础规则:
应用程序映射 使用云角色名称属性来标识映射上的应用程序组件。 若要了解云角色名称如何与组件节点一起使用,请查看具有多个云角色名称的应用程序映射。
以下示例演示分层视图 中的一个映射,其中包含五个组件节点和连接九个依赖节点的连接器。 每个节点都有一个云角色名称。
应用程序映射 使用不同的颜色、突出显示和大小来描述应用程序组件数据和关系:
云角色名称体现分散式应用程序的不同方面。 在此示例中,一些应用程序角色包括 Contoso Retail Check
、 Fabrikam-App
、fabrikam-loadfunc
、retailfabrikam-37ha6
和 retailapp
。
节点周围的虚线蓝色圆圈表示它是最后一个选定的组件。 在此示例中,最后一个选定的组件是 Web
节点。
选择节点以查看详细信息时,实心蓝色圆圈会突出显示相应节点。 在此示例中,当前选定的节点为 Contoso Retail Reports
。
与其他节点相比,远处或不相关的组件节点显示较小。 这些项在视图中灰显,以突出显示当前所选组件的性能。
在此示例中,每个云角色名称也代表具有自身检测密钥的唯一 Application Insights 资源。 由于此应用程序的所有者有权访问这四个不同 Application Insights 资源中的每一个,因此,应用程序映射 可将基础关系的映射拼接到一起。
当云角色名称显示 Web 前端中的某个位置有问题,并且你正在 Web 前端上运行多个负载均衡的服务器时,使用云角色实例 可能会有所帮助。 通过应用程序映射 ,可以使用 Kusto 查询查看有关组件节点的更深入的信息。 可以调查节点以查看有关特定云角色实例的详细信息。 此方法可帮助你确定问题是影响所有 Web 前端服务器还是仅影响特定实例。
可能需要替代云角色实例值的另一种情况是应用在容器化环境中运行。 在这种情况下,有关单个服务器的信息可能不足以定位特定问题。
有关如何使用遥测数据初始化表达式替代云角色名称属性的详细信息,请参阅添加属性:ITelemetryInitializer 。
应用程序映射 使用云角色名称属性来标识映射上的组件。 此部分提供示例,指导你如何手动设置或替代云角色名称并更改要在应用程序映射上显示的内容。
备注
Application Insights SDK 或代理会自动将云角色名称属性添加到 Azure 应用服务环境中组件发出的遥测数据。
以下代码片段显示了云角色和云角色实例的架构定义:
[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";
官方定义 :
编写自定义 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.config
或 TelemetryConfiguration.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>();
}
设置云角色名称
{
"role": {
"name": "my cloud role name"
}
}
还可以通过环境变量或系统属性设置云角色名称。 有关详细信息,请参阅配置云角色名称 。
设置云角色名称
var appInsights = require("applicationinsights");
appInsights.setup('INSTRUMENTATION_KEY').start();
appInsights.defaultClient.context.tags["ai.cloud.role"] = "your role name";
appInsights.defaultClient.context.tags["ai.cloud.roleInstance"] = "your role instance";
Node.js:设置云角色名称
var appInsights = require("applicationinsights");
appInsights.setup('INSTRUMENTATION_KEY').start();
appInsights.defaultClient.addTelemetryProcessor(envelope => {
envelope.tags["ai.cloud.role"] = "your role name";
envelope.tags["ai.cloud.roleInstance"] = "your role instance"
});
设置云角色名称
appInsights.queue.push(() => {
appInsights.addTelemetryInitializer((envelope) => {
envelope.tags["ai.cloud.role"] = "your role name";
envelope.tags["ai.cloud.roleInstance"] = "your role instance";
});
});
设置云角色名称
对于 Python,可以使用 OpenCensus Python 遥测处理器 。
def callback_function(envelope):
envelope.tags['ai.cloud.role'] = 'new_role_name'
# AzureLogHandler
handler.add_telemetry_processor(callback_function)
# AzureExporter
exporter.add_telemetry_processor(callback_function)
应用程序映射 筛选器有助于减少映射上可见节点和边缘的数量。 这些筛选器可用于缩小映射的范围,显示更小且更集中的视图。
筛选的一种快速方法是在映射上任何节点的上下文菜单上使用“在此节点上筛选” 选项:
还可以使用“添加筛选器” 选项创建筛选器:
选择筛选器类型(节点或连接器)和所需的设置,然后查看选择并将其应用于当前映射。
节点筛选器允许仅查看应用程序映射中的某些节点并隐藏所有其他节点。 配置参数以在映射中搜索与条件匹配的值的节点属性。 当节点筛选器移除节点时,筛选器还会删除节点的所有连接器和边缘。
节点筛选器有三个要配置的参数:
包括的节点 :要在应用程序映射中查看、与匹配的属性对应的节点类型。 下面有四个选择:
节点、源和目标 :与搜索条件匹配的所有节点都包含在结果映射中。 匹配的节点的所有源节点目标节点也会自动包含在结果映射中,即使源节点或目标节点不满足搜索条件也是如此。 源节点和目标节点统称为“已连接” 节点。
节点和源 :与“节点、源和目标” 的行为相同,但目标节点不会自动包含在结果映射中。
节点和目标 :与“节点、源和目标” 的行为相同,但源节点不会自动包含在结果映射中。
仅节点 :结果映射中的所有节点都必须具有与搜索条件匹配的属性值。
运算符 :要对每个节点的属性值执行的条件测试的类型。 下面有四个选择:
contains
:节点属性值包含“搜索值” 参数中指定的值。
!contains
:节点属性值不包含“搜索值” 值参数中指定的值。
==
:节点属性值等于“搜索值” 参数中指定的值。
!=
:节点属性值不等于“搜索值” 参数中指定的值。
搜索值 :用于属性值条件测试的文本字符串。 参数的下拉列表显示应用程序映射中现有节点的值。 可以从列表中选择一个值,也可以创建自己的值。 在参数字段中输入自定义值,然后在列表中选择“创建选项...” 。 例如,可以输入 test
,然后在列表中选择“创建‘测试’选项” 。
下图显示了应用于应用程序映射的筛选器示例,其中显示了 30 天的数据。 筛选器指示应用程序映射 搜索包含文本“retailapp”的属性的节点和连接的目标:
结果映射中包含匹配的节点及这些节点连接的目标节点:
连接器筛选器仅允许在应用程序映射中查看具有特定连接器的某些节点,并隐藏所有其他节点和连接器。 配置参数以在映射中搜索连接器的属性,以获取与条件匹配的值。 当节点没有匹配的连接器时,筛选器将从映射中移除节点。
连接器筛选器有三个要配置的参数:
下表汇总了基于你对“连接器筛选器” 参数的选择的配置选项。
展开表
连接器筛选器
说明
运算符参数
Value 参数
使用情况
错误连接器(以红色突出显示)
根据连接器的颜色搜索连接器。 红色表示连接器处于错误状态。
==
:等于 !=
:不等于
始终设置为“错误”
仅显示包含错误的连接器,或仅显示没有错误的连接器。
错误率 (0% - 100%)
根据连接器的平均错误率 (失败调用数除以所有调用数)搜索连接器。 此值是以百分比表示的。
>=
大于或等于 <=
小于或等于
下拉列表显示与应用程序映射中的当前连接器相关的平均错误率。 按照前面所述的过程,从列表中选择一个值或输入自定义值。
显示故障率大于或低于所选值的连接器。
平均调用持续时间 (ms)
根据连接器中所有调用的平均持续时间搜索连接器。 该值以毫秒为单位。
>=
大于或等于 <=
小于或等于
下拉列表显示与应用程序映射中的当前连接器相关的平均持续时间。 例如,1000
值是指平均持续时间为 1 秒的调用。 按照前面所述的过程,从列表中选择一个值或输入自定义值。
显示平均调用持续时间率大于或低于所选值的连接器。
调用计数
根据连接器中的调用总数搜索连接器。
>=
大于或等于 <=
小于或等于
下拉列表显示与应用程序映射中的当前连接器相关的总调用计数。 按照前面所述的过程,从列表中选择一个值或输入自定义值。
显示调用计数大于或低于所选值的连接器。
按错误率 、平均调用持续时间 或调用计数 筛选连接器时,Value 参数的某些 选项包括 (Pxx)
指定。 此指示器显示百分位级别。 对于“平均调用持续时间” 筛选器,你可能会看到值 200 (P90)
。 此选项意味着 90% 的所有连接器(无论它们表示的调用数如何)的调用持续时间都小于 200 ms。
可以通过在参数字段中输入 P
来查看 包含百分位级别的值选项。
选择后,“添加筛选器” 弹出窗口的“查看” 部分将显示有关筛选器的文本和视觉说明。 摘要显示可以帮助你了解筛选器如何应用于应用程序映射。
以下示例显示了节点筛选器的“查看 ”摘要,该筛选器搜索具有文本“-west”的属性的节点和目标:
此示例显示连接器筛选器的摘要,该筛选器搜索平均调用持续时间等于或大于 42 ms 的连接器(及其连接的节点):
配置并查看筛选器设置后,选择“应用” 以创建筛选器。 可以将多个筛选器应用到同一应用程序映射。 在应用程序映射 中,应用的筛选器显示为映射上方的 药丸:
筛选器药丸上的“移除” 操作 用于删除筛选器。 删除已应用的筛选器时,映射视图会更新以减去相应的筛选器逻辑。
应用程序映射 按顺序将筛选器逻辑应用到映射,从列表中的最左侧筛选器开始。 应用筛选器后,系统将从映射视图中删除节点和连接器。 从视图中删除节点或连接器后,后续筛选器无法还原该项。
可以通过选择筛选器药丸来更改已应用筛选器的配置。 更改筛选器设置时,应用程序映射 将显示具有新筛选器逻辑的映射视图预览。 如果决定不应用更改,则可以将“取消” 选项用于当前映射视图和筛选器。
发现感兴趣的筛选器时,可以保存筛选器,以便稍后使用“复制链接” 或“固定到仪表板 ”选项重复使用它:
“复制链接 ”选项对复制的 URL 中所有当前筛选器设置进行编码。 可以在浏览器书签中保存此链接,或与他人共享。 此功能在筛选器设置中保留持续时间值,但不会保留绝对时间。 稍后使用链接时,生成的应用程序映射可能与捕获链接时存在的映射不同。
“固定到仪表板 ”选项将当前应用程序映射添加到仪表板及其当前筛选器。 常见的诊断方法是固定应用了“错误连接器”筛选器的 映射。 可以监视应用程序的 HTTP 调用中出现错误的节点。
以下部分介绍适用于大多数映射的一些常见筛选器,可用于固定在仪表板上。
生成过去 24 小时内仅显示包含错误(突出显示为红色)的连接器的映射视图。 筛选器包括“错误连接器” 参数与“智能视图” :
本文稍后将介绍“智能视图” 功能。
从映射视图中隐藏低流量连接器,以便快速专注于更重要的问题。 筛选器包括过去 24 小时内的连接器,调用计数 大于 2872 (P20):
显示平均调用持续时间也很高的高流量连接器。 此筛选器可帮助识别潜在的性能问题。 此示例中的筛选器包括过去 24 小时内调用计数 大于 10854 (P50) 且平均调用持续时间 大于 578 (P80) 的连接器:
根据组件 roleName
属性命名约定的实现,按名称查找应用程序中的组件(节点和连接器)。 可以使用此方法查看分散式应用程序的特定部分。 筛选器在最近 24 小时内搜索包含指定值的节点、源和目标 。 在此示例中,搜索值为“west”:
通过从映射中删除干扰组件来将筛选器定义为隐藏干扰组件。 有时,应用程序组件可以具有活动依赖节点,这些节点生成对映射视图来说并不重要的数据。 在此示例中,筛选器搜索过去 24 小时内不包含指定值“retail”的节点、源和目标 :
仅显示错误率高于特定值的连接器。 此示例中的筛选器搜索过去 24 小时内的错误率 大于 3% 的连接器:
智能视图功能旨在帮助应用程序映射调查服务健康状况 。 它应用机器学习通过筛选出干扰性信息来快速识别问题的潜在根本原因。 机器学习模型从应用程序映射 的历史行为中学习,以识别指示事件潜在原因的主导模式和异常。
在大型分散式应用程序中,“良性”故障总会造成一定程度的干扰,这可能导致应用程序映射 显示许多红色边缘,从而出现干扰性信息。 智能视图 仅显示服务故障的最可能原因,并删除健康状况服务中的节点到节点红色边缘(服务到服务通信)。 智能视图 用红色突出显示应调查的边缘。 它还为突出显示的边缘提供可操作的见解。
使用智能视图 有很多好处:
通过仅突出显示需要调查的故障来减少问题的解决时间
提供有关为何突出显示特定红色边缘的可操作见解
使应用程序映射 能够无缝地用于大型分散式应用程序(只需重点关注用红色标记的边缘)
智能视图 存在一些局限性:
大型分散式应用程序可能需要花费一段时间来加载。
支持的时间范围最长为 7 天。
通过应用程序映射上方的切换开关,可以启用智能视图 并控制问题检测敏感度:
智能视图 使用已获专利的 AIOps 机器学习模型来突出显示(红色)应用程序映射中的重要数据。 各种应用程序数据用于确定要在映射上突出显示的数据,包括故障率、请求计数、持续时间、异常和依赖项类型。 为了进行比较,标准映射视图仅利用原始 故障率。
应用程序映射 根据敏感度设置用红色突出显示边缘。 可以调整敏感度,让突出显示的边缘达到所需的置信度。
展开表
敏感性
说明
高
突出显示的边缘更少。
中等
(默认设置)突出显示了平衡的边缘数。
低
突出显示的边缘更多。
启用智能视图 后,在映射上选择突出显示的边缘(红色),以查看组件的“可操作见解”。 见解显示在右侧的窗格中,并解释为何突出显示边缘。
若要开始排查问题,请选择“调查故障 ”。 可以在“故障 ”窗格中查看有关组件的信息,以确定检测到的问题是否为根本原因。
当智能视图 不突出显示应用程序映射上的任何边缘时,机器学习模型在应用程序的依赖项中找不到潜在事件。
如果在使应用程序映射 按预期工作时遇到问题,请查看以下部分中的建议。
下面是一些常规建议:
应用程序映射 为请求遥测中的每个唯一云角色名称添加组件节点。 此过程还将为类型、目标和云角色名称的每种唯一组合添加一个依赖项节点。
如果遥测中有超过 10,000 个节点,则应用程序映射 无法提取所有节点和链接。 在此情况中,映射结构不完整。 如果发生这种情况,查看映射时会显示一条警告消息。
应用程序映射 最多可以同时呈现 1,000 个单独的未分组节点。 应用程序映射 通过将类型和调用方相同的依赖项分组到一起,降低视觉复杂性。
如果遥测包含过多的唯一云角色名称或过多的依赖项类型,则这种分组将不足以降低视觉复杂性,因此映射无法呈现。
若要解决此问题,需要更改检测,以正确设置云角色名称、依赖项类型和依赖项目标字段。 确认应用程序符合以下条件:
每个依赖项目标表示依赖项的逻辑名称。 在许多情况下,此值相当于依赖项的服务器或资源名称。 例如,如果存在 HTTP 依赖项,则此值为主机名。 此值不应包含会在不同的请求中发生变化的唯一 ID 或参数。
每个依赖项类型表示依赖项的逻辑类型。 例如,HTTP、 SQL 或 Azure Blob 就是典型的依赖项类型。 此值不应包含唯一 ID。
每个云角色名称用途都遵循“设置或替代云角色名称” 部分中的说明。
即使具有低敏感度设置,智能视图 可能不会按预期突出显示边缘。 依赖项似乎出现故障,但模型未指示此问题为潜在事件。 下面是一些可能的使用场合:
如果你的情况是个例,则可以使用“反馈 ”选项来描述你的体验,帮助改进未来的模型版本。
当智能视图 突出显示边缘时,机器学习模型中的可操作见解应确定导致高概率分数的重要问题。 请记住,建议并不是单纯根据故障提供的,而是考虑到了其他指标,例如主导流中的意外延迟。
如果“智能视图”未加载,请将配置的期限设置为六天或更短。
如果智能视图 加载时间超过预期,请避免选择“更新映射组件 ”选项。 仅为单个 Application Insights 资源启用智能视图。
通过遥测相关性 了解相关性如何在 Application Insights 中起作用。
了解将所有受 Application Insights 监视的组件中的服务器端遥测数据关联到单个视图中的端到端事务诊断体验 。
通过跟踪自定义操作 了解 ASP.NET Core 和 ASP.NET 中支持的高级关联方案。