追踪传播

了解如何在应用程序/服务之间连接事件。

如果您希望使用 Sentry 观察的应用程序环境不仅仅包含单个服务或应用程序,分布式追踪可以带来很大的价值。

在跨分布式系统追踪事件的背景下,分布式追踪充当了一个强大的调试工具。想象一下,您的应用程序是一个由众多互连部分组成的庞大网络。例如,您的系统可能分布在不同的服务器上,或者您的应用程序可能分为不同的后端和前端服务,每个服务可能有自己的技术栈。

当错误或性能问题发生时,由于系统的复杂性,确定根本原因可能会非常困难。分布式追踪帮助您跟踪事件在其穿越这个复杂网络的过程中所经过的路径,记录每一步。通过检查这些追踪数据,您可以重建导致关注事件的事件序列,识别涉及的具体组件,并理解它们之间的交互。这种详细的可见性使您能够更有效地诊断和解决问题,最终提高分布式系统的可靠性和性能。

以下是一个在 Sentry 中显示的分布式追踪示例:

A full distributed trace in Sentry

此分布式追踪展示了 Vue 应用的 pageload 请求发送到 Python 后端,后者再调用 Ruby 微服务的 /api 端点。

在后台发生的情况是,Sentry 在应用程序之间读取并进一步传播两个 HTTP 头:

  • sentry-trace
  • baggage

如果您在分布式系统中运行任何 JavaScript 应用程序,请确保这两个头被添加到您的 CORS 允许列表中,并且不会被代理服务器、网关或防火墙阻止或剥离。

在浏览器中,SDK 在以下情况下会自动启动新的追踪:

  • 页面加载时:每当页面重新加载时,会启动一个新的追踪。同时,会创建一个 pageload 跨度(参见 性能监控)。一旦此跨度结束,追踪将一直持续到下一次导航或页面加载。如果初始页面的服务器已经启动了一个追踪并发送了必要的 HTML 标签 到浏览器,SDK 将继续该追踪而不是启动一个新的。
  • 导航时:每当用户导航(例如在单页应用程序中),会启动一个新的追踪。同时,会创建一个 navigation 跨度(参见 性能监控)。一旦此跨度结束,追踪将一直持续到下一次导航或页面加载。

在这两种情况下,这意味着如果您在自动 pageloadnavigation 跨度结束后启动新的跨度,它们仍然属于同一个追踪。这使得连接您的跨度前后发生的事件变得容易。

如有必要,您可以通过 手动启动新的追踪 来覆盖默认的追踪持续时间。

如果您正在使用我们当前版本的 JavaScript SDK 并启用了 BrowserTracing 集成,分布式追踪将开箱即用。为了绕过可能的 浏览器 CORS 问题,请定义您的 tracePropagationTargets

Copied
Sentry.init({
  dsn: "https://examplePublicKey@o0.ingest.sentry.io/0",
  integrations: [Sentry.browserTracingIntegration()],
  tracePropagationTargets: ["https://myproject.org", /^\/api\//],
});

默认情况下,browserTracingIntegration 会自动继续在如下形式的 <meta> 标签中找到的追踪:

Copied
<html>
  <head>
    <meta
      name="sentry-trace"
      content="12345678901234567890123456789012-1234567890123456-1"
    />
    <meta
      name="baggage"
      content="sentry-trace_id=12345678901234567890123456789012,sentry-sample_rate=0.2,sentry-sampled=true,..."
    />
  </head>
</html>

如果您希望从服务器继续追踪,例如在服务器端渲染的应用程序中,服务器需要将这些 meta 标签嵌入到渲染的 HTML 中。如果您使用 browserTracingIntegration,则无需额外配置即可从 <meta> 标签中继续追踪。

如果您不希望使用 browserTracingIntegration,可以为分布式追踪设置 自定义插桩

如果您使用的是版本 7.57.x 或更低版本,则需要启用我们的 追踪功能 以使分布式追踪正常工作。

如果您希望禁用分布式追踪并确保不发送任何 Sentry 追踪头,可以按以下方式配置您的 SDK:

Copied
Sentry.init({
  dsn: "https://examplePublicKey@o0.ingest.sentry.io/0",

  // Overwrite the defaults to ensure no trace headers are sent
  tracePropagationTargets: [],
});