自定义插桩
在本页中,您将学习如何手动传播跟踪信息到和从您的 PHP 应用程序。
要手动设置,您需要确保您的应用程序提取传入的标头,并在应用程序内发出传出请求时再次设置这些标头。
传入的跟踪信息需要提取并存储在内存中以供后续使用。Sentry 提供了 \Sentry\continueTrace()
函数来帮助您完成此操作。传入的跟踪信息可以来自不同的地方:
- 在 Web 环境中,它将通过 HTTP 标头发送,例如,由前端项目中使用的另一个 Sentry SDK 发送。
- 您也可以从环境变量中提取跟踪信息。
以下是如何使用 \Sentry\continueTrace()
提取并存储传入跟踪信息的示例:
$sentryTraceHeader = $request->getHeaderLine('sentry-trace');
$baggageHeader = $request->getHeaderLine('baggage');
\Sentry\continueTrace($sentryTraceHeader, $baggageHeader);
Sentry 的 \Sentry\continueTrace()
函数将提取给定的标头,尝试查找 sentry-trace
和 baggage
标头,并将它们存储在内存中以供后续使用。
为了使分布式跟踪正常工作,sentry-trace
和 baggage
两个标头也必须添加到传出请求中。如果您在服务器端预生成 HTML,您可能还需要查看选项 2,该选项描述了如何通过 HTML meta 标签传递跟踪信息。
您可以使用 Sentry SDK 的 \Sentry\getTraceparent()
和 \Sentry\getBaggage()
函数生成此跟踪信息。以下是一个使用 Guzzle 的示例:
$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-trace
和 baggage
数据的 HTML meta
标签注入到渲染的 HTML 中。以下是一个示例:
<!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-trace
和 baggage
标头。如果包含,则分布式跟踪正在正常工作。