From d654cdd4638476eb8df8d422d923dc8cc4064dbb Mon Sep 17 00:00:00 2001 From: Michael Hoffmann Date: Mon, 16 Jun 2025 04:35:18 +0200 Subject: [PATCH 1/2] Fix missing user attributes on logs --- src/Logs/LogsAggregator.php | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/Logs/LogsAggregator.php b/src/Logs/LogsAggregator.php index 6c0bde51a4..e4587b124c 100644 --- a/src/Logs/LogsAggregator.php +++ b/src/Logs/LogsAggregator.php @@ -84,6 +84,21 @@ public function add( $log->setAttribute('sentry.sdk.version', $client->getSdkVersion()); } + $hub->configureScope(function (Scope $scope) use ($log) { + $user = $scope->getUser(); + if ($user !== null) { + if ($user->getId() !== null) { + $log->setAttribute('user.id', $user->getId()); + } + if ($user->getEmail() !== null) { + $log->setAttribute('user.email', $user->getEmail()); + } + if ($user->getUsername() !== null) { + $log->setAttribute('user.name', $user->getUsername()); + } + } + }); + foreach ($values as $key => $value) { $log->setAttribute("sentry.message.parameter.{$key}", $value); } From bb1f03741a31634b15e4e2c5ba9d76714261e0e6 Mon Sep 17 00:00:00 2001 From: Michael Hoffmann Date: Fri, 20 Jun 2025 02:47:56 +0200 Subject: [PATCH 2/2] Add test --- tests/Logs/LogsAggregatorTest.php | 59 ++++++++++++++++++++++++++++++- 1 file changed, 58 insertions(+), 1 deletion(-) diff --git a/tests/Logs/LogsAggregatorTest.php b/tests/Logs/LogsAggregatorTest.php index fbb3e8b704..7e5e38b988 100644 --- a/tests/Logs/LogsAggregatorTest.php +++ b/tests/Logs/LogsAggregatorTest.php @@ -5,11 +5,18 @@ namespace Sentry\Tests\Logs; use PHPUnit\Framework\TestCase; +use Sentry\Client; use Sentry\ClientBuilder; use Sentry\Logs\LogLevel; use Sentry\Logs\LogsAggregator; use Sentry\SentrySdk; use Sentry\State\Hub; +use Sentry\State\Scope; +use Sentry\Tracing\Span; +use Sentry\Tracing\SpanContext; +use Sentry\Tracing\SpanId; +use Sentry\Tracing\TraceId; +use Sentry\UserDataBag; final class LogsAggregatorTest extends TestCase { @@ -35,7 +42,7 @@ public function testMessageFormatting(string $message, array $values, string $ex $log = $logs[0]; - $this->assertEquals($expected, $log->getBody()); + $this->assertSame($expected, $log->getBody()); } public static function messageFormattingDataProvider(): \Generator @@ -82,4 +89,54 @@ public static function messageFormattingDataProvider(): \Generator : 'Message with a percentage: 42', ]; } + + public function testAttributesAreAddedToLogMessage(): void + { + $client = ClientBuilder::create([ + 'enable_logs' => true, + 'release' => '1.0.0', + 'environment' => 'production', + 'server_name' => 'web-server-01', + ])->getClient(); + + $hub = new Hub($client); + SentrySdk::setCurrentHub($hub); + + $hub->configureScope(function (Scope $scope) { + $userDataBag = new UserDataBag(); + $userDataBag->setId('unique_id'); + $userDataBag->setEmail('foo@example.com'); + $userDataBag->setUsername('my_user'); + $scope->setUser($userDataBag); + }); + + $spanContext = new SpanContext(); + $spanContext->setTraceId(new TraceId('566e3688a61d4bc888951642d6f14a19')); + $spanContext->setSpanId(new SpanId('566e3688a61d4bc8')); + $span = new Span($spanContext); + $hub->setSpan($span); + + $aggregator = new LogsAggregator(); + + $aggregator->add(LogLevel::info(), 'User %s performed action %s', [ + 'testuser', 'login', + ]); + + $logs = $aggregator->all(); + $this->assertCount(1, $logs); + + $log = $logs[0]; + $attributes = $log->attributes(); + + $this->assertSame('1.0.0', $attributes->get('sentry.release')->getValue()); + $this->assertSame('production', $attributes->get('sentry.environment')->getValue()); + $this->assertSame('web-server-01', $attributes->get('sentry.server.address')->getValue()); + $this->assertSame('User %s performed action %s', $attributes->get('sentry.message.template')->getValue()); + $this->assertSame('566e3688a61d4bc8', $attributes->get('sentry.trace.parent_span_id')->getValue()); + $this->assertSame('sentry.php', $attributes->get('sentry.sdk.name')->getValue()); + $this->assertSame(Client::SDK_VERSION, $attributes->get('sentry.sdk.version')->getValue()); + $this->assertSame('unique_id', $attributes->get('user.id')->getValue()); + $this->assertSame('foo@example.com', $attributes->get('user.email')->getValue()); + $this->assertSame('my_user', $attributes->get('user.name')->getValue()); + } }