new999day / opentelemetry-auto-ext-amqp
OpenTelemetry auto-instrumentation for ext-amqp
Requires
- php: ^8.0
- composer-runtime-api: ^2.0
- ext-opentelemetry: *
- open-telemetry/api: ^1
- open-telemetry/sem-conv: ^1.23
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3
- open-telemetry/sdk: ^1.0
- phan/phan: ^5.0
- php-http/mock-client: *
- phpstan/phpstan: ^1.1
- phpstan/phpstan-phpunit: ^1.0
- phpunit/phpunit: ^9.5
- psalm/plugin-phpunit: ^0.18.4
- vimeo/psalm: ^5.0
README
This is a read-only subtree split of https://github.com/open-telemetry/opentelemetry-php-contrib.
OpenTelemetry ext-amqp auto-instrumentation
Please read https://opentelemetry.io/docs/instrumentation/php/automatic/ for instructions on how to install and configure the extension and SDK.
Overview
Auto-instrumentation hooks are registered via composer, and spans will automatically be created for the following methods:
AMQPExchange::publish
AMQPQueue::ack
AMQPQueue::nack
AMQPQueue::reject
The instrumentation automatically creates a span for each of the above methods and injects the span context into the message headers. A consumer SHOULD create a span for each message received, extract the span context and can decide to assume the context for processing the message or start a new trace and use trace-links to link the producer with the consumer.
Example
//Create and declare channel $channel = new AMQPChannel($connection); $routing_key = 'task_queue'; $callback_func = function(AMQPEnvelope $message, AMQPQueue $q) { $context = $propagator->extract($message->getHeaders(), ArrayAccessGetterSetter::getInstance()); $tracer = Globals::tracerProvider()->getTracer('my.org.consumer'); // Start a new span that assumes the context that was injected by the producer $span = $tracer ->spanBuilder('my_queue consume') ->setSpanKind(SpanKind::KIND_CONSUMER) ->setParent($context) ->startSpan(); sleep(sleep(substr_count($message->getBody(), '.'))); $q->ack($message->getDeliveryTag()); $span->end(); }; try{ $queue = new AMQPQueue($channel); $queue->setName($routing_key); $queue->setFlags(AMQP_DURABLE); $queue->declareQueue(); $queue->consume($callback_func); } catch(AMQPQueueException $ex){ print_r($ex); } catch(Exception $ex){ print_r($ex); } $connection->disconnect();
Full Example: https://github.com/rabbitmq/rabbitmq-tutorials/blob/main/php-amqp/worker.php
Configuration
The extension can be disabled via runtime configuration:
OTEL_PHP_DISABLED_INSTRUMENTATIONS=ext_amqp