Skip to content

Commit 2b23aee

Browse files
committed
When sending an event, also send pending logs
1 parent f210459 commit 2b23aee

10 files changed

Lines changed: 100 additions & 19 deletions

File tree

src/Client.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
use Psr\Log\NullLogger;
99
use Sentry\Integration\IntegrationInterface;
1010
use Sentry\Integration\IntegrationRegistry;
11+
use Sentry\Logs\Logs;
1112
use Sentry\Serializer\RepresentationSerializer;
1213
use Sentry\Serializer\RepresentationSerializerInterface;
1314
use Sentry\State\Scope;
@@ -358,6 +359,11 @@ private function prepareEvent(Event $event, ?EventHint $hint = null, ?Scope $sco
358359
return null;
359360
}
360361

362+
// When we sent an non-logs event to Sentry, also flush the logs in the same envelope to prevent needing to make multiple requests
363+
if ($event->getType() !== EventType::logs() && !\count($event->getLogs())) {
364+
$event->setLogs(Logs::getInstance()->aggregator()->flushWithoutEvent());
365+
}
366+
361367
return $event;
362368
}
363369

src/Logs/Logs.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,4 +103,14 @@ public function flush(): ?EventId
103103
{
104104
return $this->aggregator->flush();
105105
}
106+
107+
/**
108+
* Get the logs aggregator.
109+
*
110+
* @internal
111+
*/
112+
public function aggregator(): LogsAggregator
113+
{
114+
return $this->aggregator;
115+
}
106116
}

src/Logs/LogsAggregator.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,4 +124,18 @@ public function flush(): ?EventId
124124

125125
return $hub->captureEvent($event);
126126
}
127+
128+
/**
129+
* @internal
130+
*
131+
* @return Log[]
132+
*/
133+
public function flushWithoutEvent(): array
134+
{
135+
$logs = $this->logs;
136+
137+
$this->logs = [];
138+
139+
return $logs;
140+
}
127141
}

src/Serializer/EnvelopItems/EnvelopeItemInterface.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,5 @@
1111
*/
1212
interface EnvelopeItemInterface
1313
{
14-
public static function toEnvelopeItem(Event $event): string;
14+
public static function toEnvelopeItem(Event $event): ?string;
1515
}

src/Serializer/EnvelopItems/LogsItem.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace Sentry\Serializer\EnvelopItems;
66

77
use Sentry\Event;
8+
use Sentry\EventType;
89
use Sentry\Util\JSON;
910

1011
/**
@@ -17,7 +18,7 @@ public static function toEnvelopeItem(Event $event): string
1718
$logs = $event->getLogs();
1819

1920
$header = [
20-
'type' => (string) $event->getType(),
21+
'type' => (string) EventType::logs(),
2122
'item_count' => \count($logs),
2223
'content_type' => 'application/vnd.sentry.items.log+json',
2324
];

src/Serializer/EnvelopItems/ProfileItem.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
*/
1414
class ProfileItem implements EnvelopeItemInterface
1515
{
16-
public static function toEnvelopeItem(Event $event): string
16+
public static function toEnvelopeItem(Event $event): ?string
1717
{
1818
$header = [
1919
'type' => 'profile',
@@ -22,12 +22,12 @@ public static function toEnvelopeItem(Event $event): string
2222

2323
$profile = $event->getSdkMetadata('profile');
2424
if (!$profile instanceof Profile) {
25-
return '';
25+
return null;
2626
}
2727

2828
$payload = $profile->getFormattedData($event);
2929
if ($payload === null) {
30-
return '';
30+
return null;
3131
}
3232

3333
return \sprintf("%s\n%s", JSON::encode($header), JSON::encode($payload));

src/Serializer/EnvelopItems/TransactionItem.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace Sentry\Serializer\EnvelopItems;
66

77
use Sentry\Event;
8+
use Sentry\EventType;
89
use Sentry\Serializer\Traits\BreadcrumbSeralizerTrait;
910
use Sentry\Tracing\Span;
1011
use Sentry\Tracing\TransactionMetadata;
@@ -28,7 +29,7 @@ class TransactionItem implements EnvelopeItemInterface
2829
public static function toEnvelopeItem(Event $event): string
2930
{
3031
$header = [
31-
'type' => (string) $event->getType(),
32+
'type' => (string) EventType::transaction(),
3233
'content_type' => 'application/json',
3334
];
3435

src/Serializer/PayloadSerializer.php

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -55,31 +55,30 @@ public function serialize(Event $event): string
5555
}
5656
}
5757

58-
$items = '';
58+
$items = [];
5959

6060
switch ($event->getType()) {
6161
case EventType::event():
62-
$items = EventItem::toEnvelopeItem($event);
62+
$items[] = EventItem::toEnvelopeItem($event);
6363
break;
6464
case EventType::transaction():
65-
$transactionItem = TransactionItem::toEnvelopeItem($event);
65+
$items[] = TransactionItem::toEnvelopeItem($event);
6666
if ($event->getSdkMetadata('profile') !== null) {
67-
$profileItem = ProfileItem::toEnvelopeItem($event);
68-
if ($profileItem !== '') {
69-
$items = \sprintf("%s\n%s", $transactionItem, $profileItem);
70-
break;
71-
}
67+
$items[] = ProfileItem::toEnvelopeItem($event);
7268
}
73-
$items = $transactionItem;
7469
break;
7570
case EventType::checkIn():
76-
$items = CheckInItem::toEnvelopeItem($event);
71+
$items[] = CheckInItem::toEnvelopeItem($event);
7772
break;
7873
case EventType::logs():
79-
$items = LogsItem::toEnvelopeItem($event);
74+
$items[] = LogsItem::toEnvelopeItem($event);
8075
break;
8176
}
8277

83-
return \sprintf("%s\n%s", JSON::encode($envelopeHeader), $items);
78+
if ($event->getType() !== EventType::logs() && \count($event->getLogs())) {
79+
$items[] = LogsItem::toEnvelopeItem($event);
80+
}
81+
82+
return \sprintf("%s\n%s", JSON::encode($envelopeHeader), implode("\n", array_filter($items)));
8483
}
8584
}

tests/Logs/LogsTest.php

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,22 @@ public function testLogSentWhenEnabled(): void
5959
$this->assertNotNull(logger()->flush());
6060
}
6161

62+
public function testLogSentWithOtherEvents(): void
63+
{
64+
$client = $this->assertEvent(function (Event $event) {
65+
$this->assertCount(1, $event->getLogs());
66+
67+
$logItem = $event->getLogs()[0]->jsonSerialize();
68+
69+
$this->assertEquals(LogLevel::info(), $logItem['level']);
70+
$this->assertEquals('Some info message', $logItem['body']);
71+
});
72+
73+
logger()->info('Some info message');
74+
75+
$this->assertNotNull($client->captureMessage('Some message'));
76+
}
77+
6278
public function testLogWithTemplate(): void
6379
{
6480
$this->assertEvent(function (Event $event) {
@@ -78,7 +94,7 @@ public function testLogWithTemplate(): void
7894
/**
7995
* @param callable(Event): void $assert
8096
*/
81-
private function assertEvent(callable $assert): void
97+
private function assertEvent(callable $assert): ClientInterface
8298
{
8399
/** @var TransportInterface&MockObject $transport */
84100
$transport = $this->createMock(TransportInterface::class);
@@ -99,5 +115,7 @@ private function assertEvent(callable $assert): void
99115

100116
$hub = new Hub($client);
101117
SentrySdk::setCurrentHub($hub);
118+
119+
return $client;
102120
}
103121
}

tests/Serializer/PayloadSerializerTest.php

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
use Sentry\ExceptionDataBag;
1717
use Sentry\ExceptionMechanism;
1818
use Sentry\Frame;
19+
use Sentry\Logs\Log;
20+
use Sentry\Logs\LogLevel;
1921
use Sentry\MonitorConfig;
2022
use Sentry\MonitorSchedule;
2123
use Sentry\Options;
@@ -408,5 +410,35 @@ public static function serializeAsEnvelopeDataProvider(): iterable
408410
TEXT
409411
,
410412
];
413+
414+
$event = Event::createLogs(new EventId('fc9442f5aef34234bb22b9a615e30ccd'));
415+
$event->setLogs([
416+
new Log(ClockMock::microtime(true), '21160e9b836d479f81611368b2aa3d2c', LogLevel::info(), 'A log message'),
417+
]);
418+
419+
yield [
420+
$event,
421+
<<<TEXT
422+
{"event_id":"fc9442f5aef34234bb22b9a615e30ccd","sent_at":"2020-08-18T22:47:15Z","dsn":"http:\/\/public@example.com\/sentry\/1","sdk":{"name":"sentry.php","version":"4.11.1","packages":[{"name":"composer:sentry\/sentry","version":"4.11.1"}]}}
423+
{"type":"log","item_count":1,"content_type":"application\/vnd.sentry.items.log+json"}
424+
{"items":[{"timestamp":1597790835,"trace_id":"21160e9b836d479f81611368b2aa3d2c","level":"info","body":"A log message","attributes":[]}]}
425+
TEXT,
426+
];
427+
428+
$event = Event::createEvent(new EventId('fc9442f5aef34234bb22b9a615e30ccd'));
429+
$event->setLogs([
430+
new Log(ClockMock::microtime(true), '21160e9b836d479f81611368b2aa3d2c', LogLevel::info(), 'A log message'),
431+
]);
432+
433+
yield [
434+
$event,
435+
<<<TEXT
436+
{"event_id":"fc9442f5aef34234bb22b9a615e30ccd","sent_at":"2020-08-18T22:47:15Z","dsn":"http:\/\/public@example.com\/sentry\/1","sdk":{"name":"sentry.php","version":"4.11.1","packages":[{"name":"composer:sentry\/sentry","version":"4.11.1"}]}}
437+
{"type":"event","content_type":"application\/json"}
438+
{"timestamp":1597790835,"platform":"php","sdk":{"name":"sentry.php","version":"$sdkVersion","packages":[{"name":"composer:sentry\/sentry","version":"$sdkVersion"}]}}
439+
{"type":"log","item_count":1,"content_type":"application\/vnd.sentry.items.log+json"}
440+
{"items":[{"timestamp":1597790835,"trace_id":"21160e9b836d479f81611368b2aa3d2c","level":"info","body":"A log message","attributes":[]}]}
441+
TEXT,
442+
];
411443
}
412444
}

0 commit comments

Comments
 (0)