首页  >  文章  >  后端开发  >  使用 openTelemetry 和 Signoz 掌握通过 Span Links 进行跟踪分析(实用指南,第 2 部分)

使用 openTelemetry 和 Signoz 掌握通过 Span Links 进行跟踪分析(实用指南,第 2 部分)

Barbara Streisand
Barbara Streisand原创
2024-10-25 04:28:02727浏览

在上一个教程中,我们学习了如何使用跨度链接来跟踪分布式系统内的交互

在本教程中,我们将了解如何实施使用跨度链接和高级用例的最佳实践

在 OpenTelemetry 中使用 Span 链接的最佳实践

在处理复杂的分布式系统时,选择正确的跟踪策略对于保持清晰度和性能至关重要。

在 OpenTelemetry 中,您可以使用的两个主要工具是父子关系和跨度链接。让我们探讨何时以及如何有效地使用跨度链接,特别是与更常见的父子关系相比。

1. 何时使用跨度链接和父子关系

了解何时使用跨度链接而不是父子跟踪对于正确映射服务的通信方式至关重要。

亲子关系:标准追踪模型

追踪中的亲子关系很简单。如果一个服务调用另一个服务,则跟踪会在两个跨度之间创建直接的父子链接。子跨度依赖于父跨度,清楚地显示操作流程。

该模型在同步操作中效果很好,其中一个任务直接触发另一个任务,并且它们遵循线性进展,例如:

  • 用户请求触发一个函数。
  • 该函数调用数据库。
  • 数据库返回响应。
  • 每个动作都是前一个动作的子跨度,形成整齐、连续的轨迹。

跨度链接

在现实世界的系统中,特别是那些使用微服务或异步进程的系统,并非所有操作都遵循这种整洁的分层流程。这就是跨度链接变得有价值的地方。

跨度链接允许您连接可能不遵循直接因果模式的两个跨度。例如:

异步任务:消息队列可能会向处理服务发送请求,但您可能还希望将该请求连接到触发它的原始服务。

批处理作业:您可能有一个批量处理数据的系统,其中多个子作业链接回单个触发事件,但这些作业不会按顺序执行。

Span 链接增加价值的流程:

解耦或异步系统:
一个进程启动另一个进程,但没有直接调用。

多个父级:如果多个进程贡献一个结果(例如,来自多个服务的数据聚合到一份报告中),跨度链接允许您连接所有相关的跨度。

相关事件:当您需要关联来自不同跟踪的跨度时,例如当一个服务中的故障间接导致另一个服务中的错误时,跨度链接是理想的选择。

使跨度链接冗余的过程:

同步操作:如果任务之间的关系是直接且同步的,则跨度链接可能会使您的跟踪可视化变得混乱,而不会增加实际价值。在这种情况下,为了简单起见,请坚持亲子关系。

使用带有跨度链接的采样策略来优化跟踪性能:

在高流量系统中,并非每个跨度或链接都需要捕获。 采样是一种仅记录一部分跟踪的策略,可确保您捕获足够的数据进行分析,而不会压垮您的系统。

基于头部的采样:这会捕获系统入口点(头部)的痕迹。您可以将此应用于关键服务,确保仅为高优先级或重要跟踪创建跨度链接。

基于尾部的采样: 此采样基于结果的跟踪,例如仅捕获导致错误的跟踪。您可以使用它来确保在最有可能需要深入调查的情况下使用跨度链接,例如失败。

2. 为清晰起见命名和构建跨度链接

良好的命名约定和结构化跟踪对于拥有完美的可观测性数据非常重要,特别是在涉及跨度链接时。跨度的名称应该清楚地描述它所代表的内容。当使用跨度链接时,这一点变得更加重要,因为跨度之间的关系并不总是在视觉上显而易见。

一致的命名约定:

对跨度名称使用一致的模式,例如包含服务名称、函数或操作。例如,支付处理服务的跨度可能被命名为 payment-service.processPayment。

指出链接跨度的作用:

在您的跨度名称中,指示链接跨度的角色(如果相关)。例如,user-authentication.request 可以链接到 session-creation.init,使它们之间的联系清晰。

组相关跨度: 逻辑上的组跨度例如,如果多个微服务参与一个更大的流程,请确保跨度链接和命名有助于识别哪个服务负责每个部分。

文档链接原因: 如果可能,请在跟踪本身(通过元数据)或文档中记录跨度链接存在的原因。这可以像跟踪代码中解释两个跨度之间的关系的简短注释一样简单。

在应用程序中使用 Span Link 的高级用例错误跟踪

如何使用 Span 链接跟踪服务之间的错误流

想象一下,您正在管理一个包含大量微服务的复杂 Web 应用程序,每个微服务负责用户体验的不同部分。

用户可能下订单,这会触发支付服务、库存服务和运输服务。如果此链中的某个位置发生错误,了解错误发生的位置以及它如何影响其他服务至关重要。这就是跨度链接的用武之地。

跨度链接允许您连接不具有直接父子关系但仍具有上下文相关性的跟踪。使用跨度链接进行错误跟踪,您可以将一项服务中的错误与后续对其他服务的影响关联起来,即使他们没有直接关系。

用例: 假设您的支付服务在尝试处理交易时遇到错误,并且此故障间接影响了运输服务。使用跨度链接,您可以在付款服务的错误跨度与检测到问题的运输服务的跨度之间创建关系。

这可以帮助您可视化跨服务的错误流并了解其连锁反应。

跨微服务捕获和链接错误跨度的代码示例

让我们看看如何使用 OpenTelemetry 捕获这些错误并在它们之间创建跨度链接。这是一个使用 Python 的简单示例:

from opentelemetry import trace

# Initialize tracer
tracer = trace.get_tracer("order-service")

# Create a span in the payment service
with tracer.start_as_current_span("payment-processing") as payment_span:
    try:
        # Simulate a payment process that raises an error
        process_payment()
    except Exception as e:
        payment_span.record_exception(e)
        payment_span.set_status(trace.Status(trace.StatusCode.ERROR, str(e)))

        # Capture the error trace and create a span link
        error_link = trace.Link(payment_span.get_span_context())

# Now in the shipping service, you can link this error trace
with tracer.start_as_current_span("shipping-service", links=[error_link]) as shipping_span:
    # Handle the impact of the payment error here
    process_shipping()

Mastering Trace Analysis with Span Links using openTelemetry and Signoz (A Practical Guide,Part 2)

上述代码片段的解释

付款处理范围捕获付款失败时的错误。
使用支付处理范围的上下文创建范围链接 (error_link)。

此链接随后会添加到运输服务范围中,以便您跟踪付款错误如何影响运输过程。

您可以使用 SigNoz 等工具来可视化这些错误,从而更轻松地确定问题的根本原因。

在复杂的微服务架构中实现跨度链接

真实用例:使用跨度链接跨多服务架构跟踪客户交互

让我们来看一个现实世界的场景。想象一个电子商务平台,其中客户操作(例如下订单)由多种服务处理:订单服务、库存服务、付款服务和运输服务。

用户下一个订单可以生成多个跨度,每个服务对应一个跨度。

现在,这些跨度通常以父子关系排列,其中订单服务可能是付款服务的父级,依此类推。但是如果您想跟踪更复杂的关系怎么办?

例如,如果库存服务在付款确认后独立检查库存水平,则它不是付款服务的直接子级。跨度链接允许您直接连接这些服务,从而更准确地了解您的服务如何交互。

为什么跨度链接在复杂架构中很重要

跨度链接使您能够灵活地捕获这些非线性交互,从而提供跨服务的用户操作的全面视图。这对于解决用户体验问题特别有用,例如由于库存检查而延迟发货。

跨度链接如何增强无服务器或事件驱动系统中的可观察性

在无服务器或事件驱动的系统中,服务通常以一种解耦的方式进行交互,事件触发操作,而服务彼此之间没有直接了解。

例如,来自支付服务的事件可能会通过事件总线触发库存更新服务。由于这些服务没有父子关系,因此用传统方法追踪它们可能具有挑战性。

如何使用无服务器的跨度链接

跨度链接可以充当这些脱节服务之间的粘合剂。当一个事件从一个服务生成并由另一个服务使用时,您可以创建一个跨度链接,将原始事件的跨度与使用服务的跨度连接起来。

这样,即使您的无服务器函数独立运行,您仍然可以获得交互的完整故事。

示例:假设您的支付服务在处理付款后向队列发送一条消息,并且该消息触发无服务器架构中的库存更新功能。

这是有关如何链接这些跨度的代码片段

from opentelemetry import trace

# Initialize tracer
tracer = trace.get_tracer("order-service")

# Create a span in the payment service
with tracer.start_as_current_span("payment-processing") as payment_span:
    try:
        # Simulate a payment process that raises an error
        process_payment()
    except Exception as e:
        payment_span.record_exception(e)
        payment_span.set_status(trace.Status(trace.StatusCode.ERROR, str(e)))

        # Capture the error trace and create a span link
        error_link = trace.Link(payment_span.get_span_context())

# Now in the shipping service, you can link this error trace
with tracer.start_as_current_span("shipping-service", links=[error_link]) as shipping_span:
    # Handle the impact of the payment error here
    process_shipping()

Mastering Trace Analysis with Span Links using openTelemetry and Signoz (A Practical Guide,Part 2)

通过此设置,您可以跟踪从付款处理到库存更新的流程,即使它们是异步操作的。

可视化后,无服务器应用程序的不同部分如何交互就变得清晰,从而提高诊断瓶颈或意外延迟的能力。

为什么这种方法对于可观察性很重要

传统监控可能会显示库存更新速度很慢,但通过跨度链接,您可以将该延迟追溯到触发它的特定支付事件。

这种洞察力对于优化系统和确保流畅的用户体验非常宝贵。

主要经验回顾:

Span 链接是 OpenTelemetry 一项未充分利用的强大功能,可以显着增强分布式系统中的跟踪关联性。

但这到底是什么意思,你为什么要关心?

将您的应用程序想象为一个由不同服务和进程组成的网络,所有服务和进程都进行通信和协作来满足用户请求。您经常会遇到这样的场景:跟踪之间简单的父子关系并不能完全捕捉正在发生的事情的复杂性。

例如,如果后台作业正在处理由用户操作触发的事件,或者多个服务正在异步协同工作,该怎么办?这就是跨度链接可以轻松解决挑战的地方。

那么,使用span links有什么好处呢?

超越亲子约束的关联跨度:

Span 链接允许您跨服务连接跟踪,而不受父级和子级 Span 的典型层次结构的约束。

当您想要关联同时发生的事件或共享公共上下文但没有直接的父子关系时,这特别有用。例如,将面向用户的服务的跟踪链接到后台进程可以让您更全面地了解用户操作如何影响系统性能。

它有助于改进调试和故障排除:

通过跨度链接,您可以更丰富地了解不同服务如何交互,尤其是在复杂的工作流程中。通过查看哪些跨度通过链接相关,您可以识别否则可能难以发现的瓶颈、错误模式或性能问题。这使得跨度链接成为调试跨多个服务的问题的强大工具。

它在异步系统中提供更好的可见性:

对于依赖异步处理的应用程序,例如使用消息队列或事件驱动架构的应用程序,跨度链接是非常宝贵的。

它们允许您跟踪任务或消息流经不同服务时的生命周期。这可以帮助您了解单个事件对整个系统的影响,从而更轻松地优化和完善流程。

简而言之,跨度链接允许您创建应用程序行为的更加互联且更有意义的图片,从而实现更好的可观察性并更深入地了解分布式系统的运行方式。

通过有效地利用跨度链接,您可以增强跟踪关联性,从而更快地排除故障并提供更完整的系统性能视图。

Span 链接的相关 OpenTelemetry 文档的链接

对于那些希望深入了解跨度链接和相关概念的官方指南的人,以下资源将对您的研究非常有价值:

OpenTelemetry Span 链接文档

这是了解如何创建和管理跨度链接的首选参考。它涵盖了链接范围的 API 规范,以及各种支持的编程语言的示例。这是了解跨度链接如何在后台工作的技术细节的一个很好的起点。

OpenTelemetry 上下文传播

理解上下文传播是充分利用跨度链接的关键,本文档提供了如何跨跟踪管理上下文的全面概述。如果您希望确保跨分布式服务的跟踪数据的一致性,这尤其有用。

开放遥测采样策略

实现跨度链接时,了解采样如何影响跟踪至关重要。本文档的这一部分提供了有关如何配置不同采样策略的详细指导,帮助您在数据粒度和性能之间取得适当的平衡。

这些链接是可供参考和实际应用的宝贵资源,对于任何认真掌握 OpenTelemetry 跟踪功能的人来说都是必不可少的。为这些资源添加书签,并在构建更复杂的可观察性设置时将它们用作指南。

如果您有疑问或进一步解释,请在评论部分分享。

以上是使用 openTelemetry 和 Signoz 掌握通过 Span Links 进行跟踪分析(实用指南,第 2 部分)的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn