Skip to content

Commit

Permalink
GoogleCloudLoggingFormatter trace context
Browse files Browse the repository at this point in the history
  • Loading branch information
iamacarpet committed Apr 2, 2024
1 parent 479c936 commit 5efa13b
Showing 1 changed file with 44 additions and 0 deletions.
44 changes: 44 additions & 0 deletions src/Monolog/Formatter/GoogleCloudLoggingFormatter.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,10 @@
*/
final class GoogleCloudLoggingFormatter extends JsonFormatter
{
const CONTEXT_HEADER_FORMAT = '/([0-9a-fA-F]{32})(?:\/(\d+))?(?:;o=(\d+))?/';

private static ?string $traceID = null;

protected function normalizeRecord(LogRecord $record): array
{
$normalized = parent::normalizeRecord($record);
Expand All @@ -32,9 +36,49 @@ protected function normalizeRecord(LogRecord $record): array
$normalized['severity'] = $normalized['level_name'];
$normalized['time'] = $record->datetime->format(DateTimeInterface::RFC3339_EXTENDED);

// Tag with Trace ID for request attribution
$normalized['logging.googleapis.com/trace'] = $this->getTraceID();

// Remove keys that are not used by GCP
unset($normalized['level'], $normalized['level_name'], $normalized['datetime']);

return $normalized;
}

private function getTraceID(): ?string
{
if (empty($this->traceID) && !empty($_SERVER['HTTP_X_CLOUD_TRACE_CONTEXT'])) {
$matched = preg_match(
self::CONTEXT_HEADER_FORMAT,
$_SERVER['HTTP_X_CLOUD_TRACE_CONTEXT'] ?? '',
$matches,
);

if (!$matched) {
return null;
}

$projectID = $this->getProjectID();
if (empty($projectID)) {
return null;
}

$this->traceID = 'projects/'.$projectID.'/traces/'.strtolower($matches[1]);
}

return $this->traceID;
}

private function getProjectID(): ?string
{
if (isset($_SERVER['GOOGLE_CLOUD_PROJECT'])) {
return $_SERVER['GOOGLE_CLOUD_PROJECT'];
}

if (class_exists('\Google\Cloud\Core\Compute\Metadata')) {
return (new \Google\Cloud\Core\Compute\Metadata())->getProjectId();
}

return null;
}
}

0 comments on commit 5efa13b

Please sign in to comment.