自定义插桩

在本页中,您将学习如何手动传播跟踪信息到和从您的 PHP 应用程序。

要手动设置,您需要确保您的应用程序提取传入的标头,并在应用程序内发出传出请求时再次设置这些标头。

传入的跟踪信息需要提取并存储在内存中以供后续使用。Sentry 提供了 \Sentry\continueTrace() 函数来帮助您完成此操作。传入的跟踪信息可以来自不同的地方:

  • 在 Web 环境中,它将通过 HTTP 标头发送,例如,由前端项目中使用的另一个 Sentry SDK 发送。
  • 您也可以从环境变量中提取跟踪信息。

以下是如何使用 \Sentry\continueTrace() 提取并存储传入跟踪信息的示例:

Copied
$sentryTraceHeader = $request->getHeaderLine('sentry-trace');
$baggageHeader = $request->getHeaderLine('baggage');

\Sentry\continueTrace($sentryTraceHeader, $baggageHeader);

Sentry 的 \Sentry\continueTrace() 函数将提取给定的标头,尝试查找 sentry-tracebaggage 标头,并将它们存储在内存中以供后续使用。

为了使分布式跟踪正常工作,sentry-tracebaggage 两个标头也必须添加到传出请求中。如果您在服务器端预生成 HTML,您可能还需要查看选项 2,该选项描述了如何通过 HTML meta 标签传递跟踪信息。

您可以使用 Sentry SDK 的 \Sentry\getTraceparent()\Sentry\getBaggage() 函数生成此跟踪信息。以下是一个使用 Guzzle 的示例:

Copied
$client = new GuzzleHttp\Client();
$res = $client->request('GET', 'https://example.com', [
    'headers' => [
        'baggage' => \Sentry\getBaggage(),
        'sentry-trace' => \Sentry\getTraceparent(),
    ]
]);

在这个示例中,跟踪信息被传播到运行在 https://example.com 的项目。如果这个项目使用了 Sentry SDK,它将提取并保存跟踪信息以供后续使用。

这两个服务现在通过您的自定义分布式跟踪实现连接在一起。

要将跟踪信息传播到渲染的 HTML 中运行的 JavaScript,您需要将 sentry-tracebaggage 数据的 HTML meta 标签注入到渲染的 HTML 中。以下是一个示例:

Copied
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <?= sprintf('<meta name="baggage" content="%s"/>', \Sentry\getBaggage()); ?>
        <?= sprintf('<meta name="sentry-trace" content="%s"/>', \Sentry\getTraceparent()); ?>
    </head>
    <body>
        <p>This is a website.</p>
    </body>
</html>

如果您从项目向其他服务发出传出请求,请检查请求中是否包含 sentry-tracebaggage 标头。如果包含,则分布式跟踪正在正常工作。