Skip to content

Commit 7a56b92

Browse files
authored
Add before_send_check_in & before_send_metrics (#1690)
1 parent 1b3e5fd commit 7a56b92

File tree

5 files changed

+258
-14
lines changed

5 files changed

+258
-14
lines changed

phpstan-baseline.neon

+10
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,16 @@ parameters:
6060
count: 1
6161
path: src/Options.php
6262

63+
-
64+
message: "#^Method Sentry\\\\Options\\:\\:getBeforeSendCheckInCallback\\(\\) should return callable\\(Sentry\\\\Event, Sentry\\\\EventHint\\|null\\)\\: \\(Sentry\\\\Event\\|null\\) but returns mixed\\.$#"
65+
count: 1
66+
path: src/Options.php
67+
68+
-
69+
message: "#^Method Sentry\\\\Options\\:\\:getBeforeSendMetricsCallback\\(\\) should return callable\\(Sentry\\\\Event, Sentry\\\\EventHint\\|null\\)\\: \\(Sentry\\\\Event\\|null\\) but returns mixed\\.$#"
70+
count: 1
71+
path: src/Options.php
72+
6373
-
6474
message: "#^Method Sentry\\\\Options\\:\\:getBeforeSendTransactionCallback\\(\\) should return callable\\(Sentry\\\\Event, Sentry\\\\EventHint\\|null\\)\\: \\(Sentry\\\\Event\\|null\\) but returns mixed\\.$#"
6575
count: 1

src/Client.php

+20-14
Original file line numberDiff line numberDiff line change
@@ -359,26 +359,32 @@ private function applyIgnoreOptions(Event $event): ?Event
359359

360360
private function applyBeforeSendCallback(Event $event, ?EventHint $hint): ?Event
361361
{
362-
if ($event->getType() === EventType::event()) {
363-
return ($this->options->getBeforeSendCallback())($event, $hint);
364-
}
365-
366-
if ($event->getType() === EventType::transaction()) {
367-
return ($this->options->getBeforeSendTransactionCallback())($event, $hint);
362+
switch ($event->getType()) {
363+
case EventType::event():
364+
return ($this->options->getBeforeSendCallback())($event, $hint);
365+
case EventType::transaction():
366+
return ($this->options->getBeforeSendTransactionCallback())($event, $hint);
367+
case EventType::checkIn():
368+
return ($this->options->getBeforeSendCheckInCallback())($event, $hint);
369+
case EventType::metrics():
370+
return ($this->options->getBeforeSendMetricsCallback())($event, $hint);
371+
default:
372+
return $event;
368373
}
369-
370-
return $event;
371374
}
372375

373376
private function getBeforeSendCallbackName(Event $event): string
374377
{
375-
$beforeSendCallbackName = 'before_send';
376-
377-
if ($event->getType() === EventType::transaction()) {
378-
$beforeSendCallbackName = 'before_send_transaction';
378+
switch ($event->getType()) {
379+
case EventType::transaction():
380+
return 'before_send_transaction';
381+
case EventType::checkIn():
382+
return 'before_send_check_in';
383+
case EventType::metrics():
384+
return 'before_send_metrics';
385+
default:
386+
return 'before_send';
379387
}
380-
381-
return $beforeSendCallbackName;
382388
}
383389

384390
/**

src/Options.php

+62
Original file line numberDiff line numberDiff line change
@@ -535,6 +535,62 @@ public function setBeforeSendTransactionCallback(callable $callback): self
535535
return $this;
536536
}
537537

538+
/**
539+
* Gets a callback that will be invoked before a check-in is sent to the server.
540+
* If `null` is returned it won't be sent.
541+
*
542+
* @psalm-return callable(Event, ?EventHint): ?Event
543+
*/
544+
public function getBeforeSendCheckInCallback(): callable
545+
{
546+
return $this->options['before_send_check_in'];
547+
}
548+
549+
/**
550+
* Sets a callable to be called to decide whether a check-in should
551+
* be captured or not.
552+
*
553+
* @param callable $callback The callable
554+
*
555+
* @psalm-param callable(Event, ?EventHint): ?Event $callback
556+
*/
557+
public function setBeforeSendCheckInCallback(callable $callback): self
558+
{
559+
$options = array_merge($this->options, ['before_send_check_in' => $callback]);
560+
561+
$this->options = $this->resolver->resolve($options);
562+
563+
return $this;
564+
}
565+
566+
/**
567+
* Gets a callback that will be invoked before metrics are sent to the server.
568+
* If `null` is returned it won't be sent.
569+
*
570+
* @psalm-return callable(Event, ?EventHint): ?Event
571+
*/
572+
public function getBeforeSendMetricsCallback(): callable
573+
{
574+
return $this->options['before_send_metrics'];
575+
}
576+
577+
/**
578+
* Sets a callable to be called to decide whether metrics should
579+
* be send or not.
580+
*
581+
* @param callable $callback The callable
582+
*
583+
* @psalm-param callable(Event, ?EventHint): ?Event $callback
584+
*/
585+
public function setBeforeSendMetricsCallback(callable $callback): self
586+
{
587+
$options = array_merge($this->options, ['before_send_metrics' => $callback]);
588+
589+
$this->options = $this->resolver->resolve($options);
590+
591+
return $this;
592+
}
593+
538594
/**
539595
* Gets an allow list of trace propagation targets.
540596
*
@@ -1046,6 +1102,12 @@ private function configureOptions(OptionsResolver $resolver): void
10461102
'before_send_transaction' => static function (Event $transaction): Event {
10471103
return $transaction;
10481104
},
1105+
'before_send_check_in' => static function (Event $checkIn): Event {
1106+
return $checkIn;
1107+
},
1108+
'before_send_metrics' => static function (Event $metrics): Event {
1109+
return $metrics;
1110+
},
10491111
'trace_propagation_targets' => null,
10501112
'tags' => [],
10511113
'error_types' => null,

tests/ClientTest.php

+152
Original file line numberDiff line numberDiff line change
@@ -494,6 +494,16 @@ public static function processEventChecksBeforeSendOptionDataProvider(): \Genera
494494
Event::createTransaction(),
495495
false,
496496
];
497+
498+
yield [
499+
Event::createCheckIn(),
500+
false,
501+
];
502+
503+
yield [
504+
Event::createMetrics(),
505+
false,
506+
];
497507
}
498508

499509
/**
@@ -527,6 +537,102 @@ public static function processEventChecksBeforeSendTransactionOptionDataProvider
527537
Event::createTransaction(),
528538
true,
529539
];
540+
541+
yield [
542+
Event::createCheckIn(),
543+
false,
544+
];
545+
546+
yield [
547+
Event::createMetrics(),
548+
false,
549+
];
550+
}
551+
552+
/**
553+
* @dataProvider processEventChecksBeforeSendCheckInOptionDataProvider
554+
*/
555+
public function testProcessEventChecksBeforeSendCheckInOption(Event $event, bool $expectedBeforeSendCall): void
556+
{
557+
$beforeSendCalled = false;
558+
$options = [
559+
'before_send_check_in' => static function () use (&$beforeSendCalled) {
560+
$beforeSendCalled = true;
561+
562+
return null;
563+
},
564+
];
565+
566+
$client = ClientBuilder::create($options)->getClient();
567+
$client->captureEvent($event);
568+
569+
$this->assertSame($expectedBeforeSendCall, $beforeSendCalled);
570+
}
571+
572+
public static function processEventChecksBeforeSendCheckInOptionDataProvider(): \Generator
573+
{
574+
yield [
575+
Event::createEvent(),
576+
false,
577+
];
578+
579+
yield [
580+
Event::createTransaction(),
581+
false,
582+
];
583+
584+
yield [
585+
Event::createCheckIn(),
586+
true,
587+
];
588+
589+
yield [
590+
Event::createMetrics(),
591+
false,
592+
];
593+
}
594+
595+
/**
596+
* @dataProvider processEventChecksBeforeSendMetricsOptionDataProvider
597+
*/
598+
public function testProcessEventChecksBeforeMetricsSendOption(Event $event, bool $expectedBeforeSendCall): void
599+
{
600+
$beforeSendCalled = false;
601+
$options = [
602+
'before_send_metrics' => static function () use (&$beforeSendCalled) {
603+
$beforeSendCalled = true;
604+
605+
return null;
606+
},
607+
];
608+
609+
$client = ClientBuilder::create($options)->getClient();
610+
$client->captureEvent($event);
611+
612+
$this->assertSame($expectedBeforeSendCall, $beforeSendCalled);
613+
}
614+
615+
public static function processEventChecksBeforeSendMetricsOptionDataProvider(): \Generator
616+
{
617+
yield [
618+
Event::createEvent(),
619+
false,
620+
];
621+
622+
yield [
623+
Event::createTransaction(),
624+
false,
625+
];
626+
627+
yield [
628+
Event::createCheckIn(),
629+
false,
630+
];
631+
632+
yield [
633+
Event::createMetrics(),
634+
true,
635+
];
530636
}
531637

532638
public function testProcessEventDiscardsEventWhenSampleRateOptionIsZero(): void
@@ -681,6 +787,52 @@ public function testProcessEventDiscardsEventWhenBeforeSendTransactionCallbackRe
681787
$client->captureEvent(Event::createTransaction());
682788
}
683789

790+
public function testProcessEventDiscardsEventWhenBeforeSendCheckInCallbackReturnsNull(): void
791+
{
792+
/** @var LoggerInterface&MockObject $logger */
793+
$logger = $this->createMock(LoggerInterface::class);
794+
$logger->expects($this->once())
795+
->method('info')
796+
->with('The event will be discarded because the "before_send_check_in" callback returned "null".', $this->callback(static function (array $context): bool {
797+
return isset($context['event']) && $context['event'] instanceof Event;
798+
}));
799+
800+
$options = [
801+
'before_send_check_in' => static function () {
802+
return null;
803+
},
804+
];
805+
806+
$client = ClientBuilder::create($options)
807+
->setLogger($logger)
808+
->getClient();
809+
810+
$client->captureEvent(Event::createCheckIn());
811+
}
812+
813+
public function testProcessEventDiscardsEventWhenBeforeSendMetricsCallbackReturnsNull(): void
814+
{
815+
/** @var LoggerInterface&MockObject $logger */
816+
$logger = $this->createMock(LoggerInterface::class);
817+
$logger->expects($this->once())
818+
->method('info')
819+
->with('The event will be discarded because the "before_send_metrics" callback returned "null".', $this->callback(static function (array $context): bool {
820+
return isset($context['event']) && $context['event'] instanceof Event;
821+
}));
822+
823+
$options = [
824+
'before_send_metrics' => static function () {
825+
return null;
826+
},
827+
];
828+
829+
$client = ClientBuilder::create($options)
830+
->setLogger($logger)
831+
->getClient();
832+
833+
$client->captureEvent(Event::createMetrics());
834+
}
835+
684836
public function testProcessEventDiscardsEventWhenEventProcessorReturnsNull(): void
685837
{
686838
/** @var LoggerInterface&MockObject $logger */

tests/OptionsTest.php

+14
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,20 @@ static function (): void {},
250250
'setBeforeSendTransactionCallback',
251251
];
252252

253+
yield [
254+
'before_send_check_in',
255+
static function (): void {},
256+
'getBeforeSendCheckInCallback',
257+
'setBeforeSendCheckInCallback',
258+
];
259+
260+
yield [
261+
'before_send_metrics',
262+
static function (): void {},
263+
'getBeforeSendMetricsCallback',
264+
'setBeforeSendMetricsCallback',
265+
];
266+
253267
yield [
254268
'trace_propagation_targets',
255269
['www.example.com'],

0 commit comments

Comments
 (0)