open-telemetry / opentelemetry-auto-ext-amqp
为 ext-amqp 的 OpenTelemetry 自动打标
0.0.4
2024-06-25 01:39 UTC
Requires
- php: ^8.2
- composer-runtime-api: ^2.0
- ext-amqp: *
- ext-opentelemetry: *
- open-telemetry/api: ^1
- open-telemetry/sem-conv: ^1.24
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