使用 Azure 的 Application Insights 实现分布式跟踪
介绍
作为软件工程师,了解分布式系统对于增强、维护和交付业务价值至关重要。通过实施跟踪,分布式系统可以变得更容易调试和诊断。
本指南将演示如何使用 Microsoft Azure 的 Application Insights 实现跟踪。在本指南中,跟踪是指从相关系统写入事件,以便可以重建端到端事务日志。您将学习如何在更大的操作中创建子请求。这对于在上下文中查看所有日志很有用。本指南假设您对安装和使用Application Insights有基本的了解。
理解问题
分布式系统带来的挑战使得问题诊断变得更加困难:
- 多个系统参与满足单个用户请求。
- 并发系统会交错来自不同请求的跟踪事件
监控系统变得更加困难。查找与一个请求相关的所有日志是一场噩梦。
Application Insights 中的分布式跟踪
Application Insights 可以解决这个问题,因为它允许您构建事件层次结构。这些事件可以发生在同一个应用程序进程中,也可以发生在多个应用程序进程中。
要描述与子进程相同的进程中发生的事件,请调用StartOperation并为其命名。在下面的代码片段中,使用RenderEmail作为进程内子操作的示例。
public void RenderEmail(string emailType, EmailViewModel emailViewModel)
{
using var operation = _telemetryClient.StartOperation<DependencyTelemetry>($"Render email {emailType}");
operation.Telemetry.Type = "Email";
operation.Telemetry.Properties["EmailType"] = emailType;
body = _razorViewToStringRenderer.RenderViewToString(emailViewModel);
}
请注意,上面的代码示例使用了using 声明,这是 C# 8 中的新功能。在 ASP.NET Core API 请求内部调用此方法时,Application Insights 会构建一个层次结构。
跟踪也可以跨进程边界关联。如果两个系统以订阅者/发布者关系协作,则可以推断出它们的关系。如下所示。
- 系统 A 收到 HTTP POST 消息请求
- 然后系统 A 将消息放入队列。
- 系统 B 是处理消息的工作人员
注意:当将 Azure 服务总线与 Azure 应用服务结合使用时,如果两个应用都配置了 Application Insights,则会自动创建此层次结构。
为了在代码中实现这一点,消息生产者(系统 A)需要在消息的某个地方写入System.Diagnostics.Activity.Id。在消息消费者端(系统 B),需要添加以下代码。
public async Task Process(T message, CancellationToken cancellationToken)
{
using var operation = _telemetryClient.StartOperation<RequestTelemetry>(new Activity($"Process message").SetParentId(message.ParentId));
try
{
await _inner.Process(message, cancellationToken);
operation.Telemetry.Success = result.Success;
}
catch (Exception ex)
{
operation.Telemetry.Success = false;
throw;
}
}
上面描述了如何使用System.Diagnostics.Activity和StartOperation方法创建跟踪事件层次结构。这有助于查找单个用户请求上下文中涉及的所有跟踪事件。
使用案例
通过在应用中配置跟踪层次结构,许多调试场景会变得更加简单。其中一些示例包括:
- 分布式系统存在间歇性性能问题。分布式跟踪可以显示时间信息,可以检查这些信息以查明问题所在。N+1 个数据库请求或特别慢的 API 将立即显现出来。
- 每天执行一次批处理作业,执行情况如何?通过以上述方式记录操作,很容易了解作业运行需要多长时间?每天处理多少条消息?
- 一个请求涉及多个资源。通过分布式跟踪,您可以查看所有子操作并了解请求是如何完成的。
结论
使用这些技术可以轻松诊断分布式系统。如果您想了解更多信息,可以阅读Application Insights 如何关联遥测来了解技术细节。
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~