Skip to content
Merged
38 changes: 20 additions & 18 deletions src/sentry/src/Aspect/GuzzleHttpClientAspect.php
Original file line number Diff line number Diff line change
Expand Up @@ -54,28 +54,30 @@ public function process(ProceedingJoinPoint $proceedingJoinPoint)

$onStats = $options['on_stats'] ?? null;

// Override the on_stats option to record the request.
$proceedingJoinPoint->arguments['keys']['options']['on_stats'] = function (TransferStats $stats) use ($onStats, $guzzleConfig, $options) {
$request = $stats->getRequest();
$response = $stats->getResponse();

$uri = $request->getUri()->__toString();
$data = [];
$data['config'] = $guzzleConfig;
// request
$data['request.method'] = $request->getMethod();
$data['request.body.size'] = strlen($options['body'] ?? '');
$data['request.full_url'] = (string) $request->getUri();
$data['request.path'] = $request->getUri()->getPath();
$data['request.scheme'] = $request->getUri()->getScheme();
$data['request.host'] = $request->getUri()->getHost();
$data['request.port'] = $request->getUri()->getPort();
$data['request.user_agent'] = $request->getHeaderLine('User-Agent'); // updated key for consistency
$data['request.headers'] = $request->getHeaders();
// response
$data['response.status'] = $response?->getStatusCode();
$data['response.reason'] = $response?->getReasonPhrase();
$data['response.headers'] = $response?->getHeaders();
$data['duration'] = $stats->getTransferTime() * 1000;
$data = [
'config' => $guzzleConfig,
// request
'http.request.method' => $request->getMethod(),
'http.request.body.size' => strlen($options['body'] ?? ''),
'http.request.full_url' => (string) $request->getUri(),
'http.request.path' => $request->getUri()->getPath(),
'http.request.scheme' => $request->getUri()->getScheme(),
'http.request.host' => $request->getUri()->getHost(),
'http.request.port' => $request->getUri()->getPort(),
'http.request.user_agent' => $request->getHeaderLine('User-Agent'), // updated key for consistency
'http.request.headers' => $request->getHeaders(),
// response
'http.response.status_code' => $response?->getStatusCode(),
'http.response.body.size' => $response?->getBody()->getSize() ?? 0,
'http.response.reason' => $response?->getReasonPhrase(),
'http.response.headers' => $response?->getHeaders(),
'duration' => $stats->getTransferTime() * 1000,
];

Integration::addBreadcrumb(new Breadcrumb(
Breadcrumb::LEVEL_INFO,
Expand Down
18 changes: 16 additions & 2 deletions src/sentry/src/Tracing/Aspect/GuzzleHttpClientAspect.php
Original file line number Diff line number Diff line change
Expand Up @@ -121,11 +121,25 @@ public function process(ProceedingJoinPoint $proceedingJoinPoint)
'http.response.reason' => $response->getReasonPhrase(),
'http.response.headers' => $response->getHeaders(),
'http.response.body.size' => $response->getBody()->getSize() ?? 0,
'http.response_content_length' => $response->getHeaderLine('Content-Length'),
'http.decoded_response_content_length' => $response->getHeaderLine('X-Decoded-Content-Length'),
'http.response_transfer_size' => $response->getHeaderLine('Content-Length'),
]);

if ($this->switcher->isTracingExtraTagEnable('http.response.body.contents')) {
$data['http.response.body.contents'] = $response->getBody()->getContents();
$response->getBody()->isSeekable() && $response->getBody()->rewind();
$isTextual = \preg_match(
'/^(text\/|application\/(json|xml|x-www-form-urlencoded))/i',
$response->getHeaderLine('Content-Type')
) === 1;
$body = $response->getBody();

if ($isTextual && $body->isSeekable()) {
$pos = $body->tell();
$data['http.response.body.contents'] = \GuzzleHttp\Psr7\Utils::copyToString($body, 8192); // 8KB 上限
$body->seek($pos);
} else {
$data['http.response.body.contents'] = '[binary omitted]';
}
}

$span->setStatus(SpanStatus::createFromHttpStatusCode($response->getStatusCode()));
Expand Down