From cb84feced44638fe7e19a123db486a18647196ce Mon Sep 17 00:00:00 2001 From: jvo Date: Wed, 16 Apr 2025 17:09:22 +0200 Subject: [PATCH] chore(messenger): add trace parent in dispatched messages (AMQP) --- composer.json | 3 +- .../Amqp/AddStampForPropagationMiddleware.php | 46 +++++++++++++++++++ .../Symfony/Messenger/TraceStamp.php | 25 ++++++++++ .../Context/Propagator/PropagatorFactory.php | 26 +++++++++++ .../Propagator/TraceStampPropagator.php | 29 ++++++++++++ src/Resources/config/services.php | 2 + .../services_tracing_instrumentation.php | 6 +++ 7 files changed, 136 insertions(+), 1 deletion(-) create mode 100644 src/Instrumentation/Symfony/Messenger/Amqp/AddStampForPropagationMiddleware.php create mode 100644 src/Instrumentation/Symfony/Messenger/TraceStamp.php create mode 100644 src/OpenTelemetry/Context/Propagator/PropagatorFactory.php create mode 100644 src/OpenTelemetry/Context/Propagator/TraceStampPropagator.php diff --git a/composer.json b/composer.json index 9aef88b..77176a4 100644 --- a/composer.json +++ b/composer.json @@ -33,9 +33,11 @@ "open-telemetry/sdk": "^1", "open-telemetry/sem-conv": "^1", "open-telemetry/symfony-sdk-bundle": "^0", + "symfony/amqp-messenger": "^7.2", "symfony/config": "^7.2", "symfony/dependency-injection": "^7.2", "symfony/event-dispatcher": "^7.2", + "symfony/messenger": "^7.2", "zenstruck/dsn": "^0.2", "zenstruck/uri": "^2.3" }, @@ -67,7 +69,6 @@ "symfony/http-client": "^7.2", "symfony/http-kernel": "^7.2", "symfony/mailer": "^7.2", - "symfony/messenger": "^7.2", "symfony/monolog-bundle": "^3.10", "symfony/phpunit-bridge": "^7.2", "symfony/runtime": "^7.2", diff --git a/src/Instrumentation/Symfony/Messenger/Amqp/AddStampForPropagationMiddleware.php b/src/Instrumentation/Symfony/Messenger/Amqp/AddStampForPropagationMiddleware.php new file mode 100644 index 0000000..8db77fb --- /dev/null +++ b/src/Instrumentation/Symfony/Messenger/Amqp/AddStampForPropagationMiddleware.php @@ -0,0 +1,46 @@ +last(AmqpStamp::class) !== null) { + $this->onMessageSent($envelope); + } + + return $stack->next()->handle($envelope, $stack); + } + + private function onMessageSent(Envelope &$envelope): void + { + $scope = Context::storage()->scope(); + + if ($scope === null) { + $this->logger?->debug('No active scope'); + } + + $this->propagator->inject($envelope, new TraceStampPropagator(), Context::getCurrent()); + $this->logger?->debug('Trace stamp added to envelope for propagation'); + } +} diff --git a/src/Instrumentation/Symfony/Messenger/TraceStamp.php b/src/Instrumentation/Symfony/Messenger/TraceStamp.php new file mode 100644 index 0000000..e73fdf2 --- /dev/null +++ b/src/Instrumentation/Symfony/Messenger/TraceStamp.php @@ -0,0 +1,25 @@ +traceParent; + } +} diff --git a/src/OpenTelemetry/Context/Propagator/PropagatorFactory.php b/src/OpenTelemetry/Context/Propagator/PropagatorFactory.php new file mode 100644 index 0000000..0f4eacf --- /dev/null +++ b/src/OpenTelemetry/Context/Propagator/PropagatorFactory.php @@ -0,0 +1,26 @@ +with(new TraceStamp($value)); + } +} diff --git a/src/Resources/config/services.php b/src/Resources/config/services.php index 1bffd70..92fa64f 100644 --- a/src/Resources/config/services.php +++ b/src/Resources/config/services.php @@ -1,6 +1,7 @@ set('open_telemetry.propagator_text_map.noop', NoopTextMapPropagator::class) ->set('open_telemetry.propagator_text_map.multi', MultiTextMapPropagator::class) + ->factory([PropagatorFactory::class, 'createDefault']) ->set('open_telemetry.propagation_getter.headers', HeadersPropagationGetter::class) ->set('open_telemetry.propagation_getter.sanitize_combined_headers', SanitizeCombinedHeadersPropagationGetter::class) diff --git a/src/Resources/config/services_tracing_instrumentation.php b/src/Resources/config/services_tracing_instrumentation.php index 99ef1e2..f990587 100644 --- a/src/Resources/config/services_tracing_instrumentation.php +++ b/src/Resources/config/services_tracing_instrumentation.php @@ -9,6 +9,7 @@ use FriendsOfOpenTelemetry\OpenTelemetryBundle\Instrumentation\Symfony\HttpKernel\TraceableHttpKernelEventSubscriber; use FriendsOfOpenTelemetry\OpenTelemetryBundle\Instrumentation\Symfony\Mailer\TraceableMailer; use FriendsOfOpenTelemetry\OpenTelemetryBundle\Instrumentation\Symfony\Mailer\TraceableMailerTransport; +use FriendsOfOpenTelemetry\OpenTelemetryBundle\Instrumentation\Symfony\Messenger\Amqp\AddStampForPropagationMiddleware; use FriendsOfOpenTelemetry\OpenTelemetryBundle\Instrumentation\Symfony\Messenger\TraceableMessengerMiddleware; use FriendsOfOpenTelemetry\OpenTelemetryBundle\Instrumentation\Symfony\Messenger\TraceableMessengerTransport; use FriendsOfOpenTelemetry\OpenTelemetryBundle\Instrumentation\Symfony\Messenger\TraceableMessengerTransportFactory; @@ -103,6 +104,11 @@ ->tag('monolog.logger', ['channel' => 'open_telemetry']) ->alias('messenger.middleware.open_telemetry_tracer', 'open_telemetry.instrumentation.messenger.trace.middleware') + ->set('open_telemetry.instrumentation.messenger.propagation.amqp.middleware', AddStampForPropagationMiddleware::class) + ->arg('$propagator', service('open_telemetry.propagator_text_map.multi')) + ->tag('messenger.middleware') + ->tag('monolog.logger', ['channel' => 'open_telemetry']) + // Twig ->set('open_telemetry.instrumentation.twig.trace.extension', TraceableTwigExtension::class) ->arg('$tracer', service('open_telemetry.traces.default_tracer'))