new999day / opentelemetry-auto-ext-amqp
OpenTelemetry ext-amqp 自动仪器化
v1.0
2024-05-03 13:45 UTC
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
这是从 https://github.com/open-telemetry/opentelemetry-php-contrib 分离出的只读子树。
OpenTelemetry ext-amqp 自动仪器化
请阅读 https://opentelemetry.io/docs/instrumentation/php/automatic/ 了解如何安装和配置扩展和 SDK 的说明。
概览
通过 composer 注册自动仪器化钩子,并为以下方法自动创建跨度
AMQPExchange::publish
AMQPQueue::ack
AMQPQueue::nack
AMQPQueue::reject
仪器化自动为上述每个方法创建跨度并将跨度上下文注入消息头中。消费者 应该 为每个接收到的消息创建一个跨度,提取跨度上下文,并可以决定假设上下文以处理消息或启动新的跟踪并使用跟踪链路将生产者与消费者链接起来。
示例
//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();
完整示例: https://github.com/rabbitmq/rabbitmq-tutorials/blob/main/php-amqp/worker.php
配置
可以通过 运行时配置 禁用此扩展。
OTEL_PHP_DISABLED_INSTRUMENTATIONS=ext_amqp