From 32248b27c8885c9f8bf67d6a86998f48ba7847df Mon Sep 17 00:00:00 2001 From: Martin Linzmayer Date: Wed, 29 Apr 2026 18:57:51 +0200 Subject: [PATCH 1/5] feat: add ingest_path to envelopes routed through the agent --- agent/src/Envelope.php | 7 ++ agent/src/EnvelopeForwarder.php | 7 +- agent/src/EnvelopeItem.php | 39 +++++++++++ agent/tests/AgentForwardingTest.php | 5 ++ agent/tests/EnvelopeTest.php | 100 ++++++++++++++++++++++++++++ 5 files changed, 156 insertions(+), 2 deletions(-) diff --git a/agent/src/Envelope.php b/agent/src/Envelope.php index e6eb8ff..600f969 100644 --- a/agent/src/Envelope.php +++ b/agent/src/Envelope.php @@ -77,6 +77,13 @@ static function (EnvelopeItem $item) use ($callback) { ); } + public function appendIngestPath(string $version): void + { + foreach ($this->items as $item) { + $item->appendIngestPath($version); + } + } + public function __toString() { $data = implode( diff --git a/agent/src/EnvelopeForwarder.php b/agent/src/EnvelopeForwarder.php index 254225e..74ab556 100644 --- a/agent/src/EnvelopeForwarder.php +++ b/agent/src/EnvelopeForwarder.php @@ -83,9 +83,12 @@ public function forward(Envelope $envelope): PromiseInterface return resolve(null); } + $client = self::IDENTIFIER . '/' . self::VERSION; + $envelope->appendIngestPath($client); + $authHeader = [ 'sentry_version=' . self::PROTOCOL_VERSION, - 'sentry_client=' . self::IDENTIFIER . '/' . self::VERSION, + 'sentry_client=' . $client, 'sentry_key=' . $dsn->getPublicKey(), ]; @@ -95,7 +98,7 @@ public function forward(Envelope $envelope): PromiseInterface return (new Browser())->withTimeout($this->timeout)->post( $dsn->getEnvelopeApiEndpointUrl(), [ - 'User-Agent' => self::IDENTIFIER . '/' . self::VERSION, + 'User-Agent' => $client, 'Content-Type' => Envelope::CONTENT_TYPE, 'X-Sentry-Auth' => 'Sentry ' . implode(', ', $authHeader), ], diff --git a/agent/src/EnvelopeItem.php b/agent/src/EnvelopeItem.php index c850553..9b880c0 100644 --- a/agent/src/EnvelopeItem.php +++ b/agent/src/EnvelopeItem.php @@ -9,10 +9,16 @@ * * @phpstan-type EnvelopeItemHeader array{ * type: string, + * length?: int, * } */ class EnvelopeItem { + private const EVENT_ITEM_TYPES_WITH_INGEST_PATH = [ + 'event' => true, + 'transaction' => true, + ]; + /** * @var EnvelopeItemHeader The envelope item header */ @@ -46,6 +52,39 @@ public function getData(): string return $this->data; } + public function appendIngestPath(string $version): void + { + if (!isset(self::EVENT_ITEM_TYPES_WITH_INGEST_PATH[$this->header['type']])) { + return; + } + + $payload = json_decode($this->data, true); + + if (!\is_array($payload)) { + return; + } + + if (!isset($payload['ingest_path']) || !\is_array($payload['ingest_path'])) { + $payload['ingest_path'] = []; + } + + $payload['ingest_path'][] = [ + 'version' => $version, + ]; + + $data = json_encode($payload); + + if ($data === false) { + return; + } + + $this->data = $data; + + if (isset($this->header['length'])) { + $this->header['length'] = \strlen($this->data); + } + } + public function __toString() { return json_encode($this->header) . "\n" . $this->data; diff --git a/agent/tests/AgentForwardingTest.php b/agent/tests/AgentForwardingTest.php index 4698e42..ab65298 100644 --- a/agent/tests/AgentForwardingTest.php +++ b/agent/tests/AgentForwardingTest.php @@ -5,6 +5,7 @@ namespace Sentry\Agent\Tests; use PHPUnit\Framework\TestCase; +use Sentry\Agent\EnvelopeForwarder; use Sentry\Event; use Sentry\Options; use Sentry\Serializer\PayloadSerializer; @@ -32,6 +33,10 @@ public function testAgentForwardsEnvelopeToUpstream(): void $this->assertEquals(1, $serverOutput['request_count']); $this->assertStringContainsString('Hello from agent test!', $serverOutput['body']); $this->assertStringContainsString('"type":"event"', $serverOutput['body']); + $this->assertStringContainsString( + '"ingest_path":[{"version":"' . str_replace('/', '\/', EnvelopeForwarder::IDENTIFIER . '/' . EnvelopeForwarder::VERSION) . '"}]', + $serverOutput['body'] + ); // Verify the correct headers were sent $this->assertArrayHasKey('X-Sentry-Auth', $serverOutput['headers']); diff --git a/agent/tests/EnvelopeTest.php b/agent/tests/EnvelopeTest.php index 92daf53..6ad6e14 100644 --- a/agent/tests/EnvelopeTest.php +++ b/agent/tests/EnvelopeTest.php @@ -6,6 +6,8 @@ use PHPUnit\Framework\TestCase; use Sentry\Agent\Envelope; +use Sentry\Agent\EnvelopeForwarder; +use Sentry\Agent\EnvelopeItem; class EnvelopeTest extends TestCase { @@ -51,6 +53,99 @@ public function testCanParseEnvelopeWith2Items(): void $this->assertEquals($payload, (string) $envelope); } + public function testAppendIngestPathToEventItem(): void + { + $envelope = new Envelope( + ['dsn' => 'http://public@example.com/1'], + [new EnvelopeItem(['type' => 'event'], '{"message":"test"}')] + ); + + $envelope->appendIngestPath($this->getIngestPathVersion()); + + $payload = json_decode($envelope->getItems()[0]->getData(), true); + + $this->assertSame([['version' => $this->getIngestPathVersion()]], $payload['ingest_path']); + } + + public function testAppendIngestPathPreservesExistingEntries(): void + { + $envelope = new Envelope( + ['dsn' => 'http://public@example.com/1'], + [ + new EnvelopeItem( + ['type' => 'transaction'], + '{"transaction":"/test","ingest_path":[{"version":"relay/1.0.0","public_key":"abc"}]}' + ), + ] + ); + + $envelope->appendIngestPath($this->getIngestPathVersion()); + + $payload = json_decode($envelope->getItems()[0]->getData(), true); + + $this->assertSame( + [ + ['version' => 'relay/1.0.0', 'public_key' => 'abc'], + ['version' => $this->getIngestPathVersion()], + ], + $payload['ingest_path'] + ); + } + + public function testAppendIngestPathUpdatesLengthHeader(): void + { + $envelope = new Envelope( + ['dsn' => 'http://public@example.com/1'], + [new EnvelopeItem(['type' => 'event', 'length' => 18], '{"message":"test"}')] + ); + + $envelope->appendIngestPath($this->getIngestPathVersion()); + + $item = $envelope->getItems()[0]; + + $this->assertSame(\strlen($item->getData()), $item->getHeader()['length']); + } + + public function testAppendIngestPathReplacesInvalidExistingIngestPath(): void + { + $envelope = new Envelope( + ['dsn' => 'http://public@example.com/1'], + [new EnvelopeItem(['type' => 'event'], '{"message":"test","ingest_path":"invalid"}')] + ); + + $envelope->appendIngestPath($this->getIngestPathVersion()); + + $payload = json_decode($envelope->getItems()[0]->getData(), true); + + $this->assertSame([['version' => $this->getIngestPathVersion()]], $payload['ingest_path']); + } + + public function testAppendIngestPathDoesNotMutateUnsupportedItems(): void + { + foreach (['log', 'check_in', 'profile', 'attachment'] as $type) { + $envelope = new Envelope( + ['dsn' => 'http://public@example.com/1'], + [new EnvelopeItem(['type' => $type], '{"message":"test"}')] + ); + + $envelope->appendIngestPath($this->getIngestPathVersion()); + + $this->assertSame('{"message":"test"}', $envelope->getItems()[0]->getData()); + } + } + + public function testAppendIngestPathDoesNotMutateMalformedJson(): void + { + $envelope = new Envelope( + ['dsn' => 'http://public@example.com/1'], + [new EnvelopeItem(['type' => 'event'], '{"message":')] + ); + + $envelope->appendIngestPath($this->getIngestPathVersion()); + + $this->assertSame('{"message":', $envelope->getItems()[0]->getData()); + } + private function getFixture(string $name): string { $fixture = file_get_contents(__DIR__ . "/fixtures/envelopes/{$name}.dat"); @@ -62,4 +157,9 @@ private function getFixture(string $name): string // To make it easier to edit the fixtures, we remove the trailing new line return rtrim($fixture, "\n"); } + + private function getIngestPathVersion(): string + { + return EnvelopeForwarder::IDENTIFIER . '/' . EnvelopeForwarder::VERSION; + } } From 5c02ca8b4c7b86d8d9e389cfcaa8a8d7d0c90544 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 29 Apr 2026 16:59:27 +0000 Subject: [PATCH 2/5] Add PHAR artifact --- bin/sentry-agent | Bin 1790011 -> 1846390 bytes bin/sentry-agent.sig | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/sentry-agent b/bin/sentry-agent index 163dec67c3e7ad681a1d74f0a7bc6e8dcc972ec6..db31ccf0f4e09c48e5a61fdc90ecd1244ee74e2f 100755 GIT binary patch delta 51683 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 diff --git a/bin/sentry-agent.sig b/bin/sentry-agent.sig index d560a38..62e83e8 100644 --- a/bin/sentry-agent.sig +++ b/bin/sentry-agent.sig @@ -1 +1 @@ -317844AD097E56736C035F9331BC5AE8FCC55BBCC4DC58780B1240D00B3ECF4A1F6C5BE89B890585D5BC0F505216C2D480EBFABA97ECE9612D9F53ADCA6DE71A +BEF70BCCE41C1825A62820576DFB457F3EC24A3B425716A4BCC7535DB12B60D6D94E364A53BDE56082F762470173F978DF9FCCB76D64FAA0CE1C469B883A5402 From 9a914f39326869c1aeff3245164c628764e56f31 Mon Sep 17 00:00:00 2001 From: Martin Linzmayer Date: Thu, 30 Apr 2026 10:44:06 +0200 Subject: [PATCH 3/5] use JSON::encode for consistency --- agent/src/EnvelopeItem.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/agent/src/EnvelopeItem.php b/agent/src/EnvelopeItem.php index 9b880c0..46f7b5f 100644 --- a/agent/src/EnvelopeItem.php +++ b/agent/src/EnvelopeItem.php @@ -4,6 +4,8 @@ namespace Sentry\Agent; +use Sentry\Util\JSON; + /** * @internal * @@ -72,9 +74,9 @@ public function appendIngestPath(string $version): void 'version' => $version, ]; - $data = json_encode($payload); - - if ($data === false) { + try { + $data = JSON::encode($payload); + } catch (\Throwable $e) { return; } From 80a75b8900bc55b14ddde69b6499a39883f1b01f Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 30 Apr 2026 08:45:07 +0000 Subject: [PATCH 4/5] Add PHAR artifact --- bin/sentry-agent | Bin 1846390 -> 1846434 bytes bin/sentry-agent.sig | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/sentry-agent b/bin/sentry-agent index db31ccf0f4e09c48e5a61fdc90ecd1244ee74e2f..177a211477295a780f8283ea7772c3a50eac59b6 100755 GIT binary patch delta 290 zcmex%qhQg^f(-3(<+`N){rg?pVuiFnxo8h|=^0>!jGHTd(02 znEqyuh+s3@jCQsej6lo;#LPg<0>rF9%m&2lK+FNeoIuP4#N0s41H`;Q%m>8$Kr8^n zfq*~EC$5lKr8{ol0YoAoo$A+#uSeu8+T6D`*Uqx>7mvdrCS>$RxVqs zv2p&T2{-kGVC;H>m?Jd_?7#JAb HoqU}DZ{Tp9 delta 297 zcmZ2q~YfS41Axqz4(h-A*fLIWSg@9NXh(&-{6o|!uSR9BYfLIcUrM6qlkXD-FvF|(gnI|$5s>?JK!gGJS z*4rKOvUUm=Te9bPaO_6ygljkb%)Em4K22!)p5)G0{IlZz{4?8gQ+_QtC*wA|!zzS{ Mg@J*=-O1Mp0P4AN;{X5v diff --git a/bin/sentry-agent.sig b/bin/sentry-agent.sig index 62e83e8..417fd1e 100644 --- a/bin/sentry-agent.sig +++ b/bin/sentry-agent.sig @@ -1 +1 @@ -BEF70BCCE41C1825A62820576DFB457F3EC24A3B425716A4BCC7535DB12B60D6D94E364A53BDE56082F762470173F978DF9FCCB76D64FAA0CE1C469B883A5402 +C4B1B9932EFCD69E75C2857C22DAB018A9A6AD28B19FC5EE7315899F111AF08E0DD2476A02DB876424F4ED42AE40C953D4E94AD05963F22E393E15F8CADBB4D7 From 9a944fca5e621df366ccb01fd94f3096589698cd Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 30 Apr 2026 09:20:15 +0000 Subject: [PATCH 5/5] Add PHAR artifact --- bin/sentry-agent | Bin 1848802 -> 1849983 bytes bin/sentry-agent.sig | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/sentry-agent b/bin/sentry-agent index 07aea359867c745be4d836f2b9df2c551f2e28ec..201829761d1c5ebdddef5cf3e4845f79f5231962 100755 GIT binary patch delta 1002 zcmajddq`7J90%~t$L{X#Hm`1OzKEMlrl6Q&6fU1NboprJC~C^>;%;uHch}vk;-ioZ zCI3mg*^fli9zscxwL(J#^*_j`!}*=ZJ%{hz_{9JC z%1>m=$%SZ{taD|`9q0!>x5%ZF@>66R7Ayw(HyiWw(qnlNnMnqVfj;Hvl;r;?zt|qh z@I1@8Y+NlXh;~MFCqu=GHVN#@Avlm<o2$25_H&CX)FfI45U8ZK%CwROZ zWGrg39@sDI;pPj%2k z)QIRJyVFoXs1Nv8`tOAN>#gLBf`FyO2*r{A-ot4U-5wz=*Ud66*5@>ftvqY4hUe*u z7-@Fe2%1R(*VPGLj&`v%UKg9ZvmRzj@i-WDs>6X_i^njYX|4A%E-09ePK70-LT%Zp zIL)44QP4cf!d#s~b#zb%t2_eD_)ghI+3rqV6DL7G^unXUKo?0$b*O}z)jpJI`whZ-?ca0GqXS_2H{;+g)z;X1h@ zScd)u^qM6)Caf!eq$htwj)WkgNEi~1C=d)$A~>Q#2tQO_TfcwO_xxV;@vDTQ-fprEGJI=$rl!yPj+0WHu>2?vFTRMoJNy(FXGyq zuqc5MD#|yRe+g^zt;OxP7Bd1d6A&{4F$)m00x=s9vjZ^)5OV@C7Z7s;F%J;)0x=&D z^8>K}5DNma5D*Iku?P^00Cql_g?)o