追踪传播

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

如果您希望使用 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 跨度结束后启动新的跨度,它们仍然属于同一个追踪。这使得连接您的跨度前后发生的事件变得容易。

服务器端 SDK 以每个请求为基础自动处理追踪。这意味着 SDK 会:

  • 如果传入请求包含追踪头,则继续现有的追踪。
  • 如果传入请求不包含追踪头,则启动一个新的追踪。此追踪在响应发送之前保持活动状态。

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

If you're using the current version of our Next.js SDK, distributed tracing will work out of the box for the client, server, and edge runtimes.

For client-side you might have to define tracePropagationTargets to get around possible Browser CORS issues.

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

If you're using version 7.57.x or below, you'll need to have our tracing feature enabled in order for distributed tracing to work.

If you want to disable distributed tracing and ensure no Sentry trace headers are sent, you can configure your SDK like this:

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

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