auxmoney/opentracing-bundle-amqplib-rabbitmq
auxmoney/opentracing-bundle-core and php-amqplib/rabbitmq-bundle are installed.
composer require auxmoney/opentracing-bundle-core php-amqplib/rabbitmq-bundle
composer require auxmoney/opentracing-bundle-amqplib-rabbitmq
// config/bundles.php
Auxmoney\OpentracingAmqplibRabbitMqBundle\OpentracingAmqplibRabbitMqBundle::class => ['all' => true],
Trace a RabbitMQ message flow:
RabbitMQProducer (e.g., via MessageProducerInterface).RabbitMQConsumer (e.g., via MessageConsumerInterface).Producers: The bundle decorates RabbitMQ producers to inject OpenTracing headers (e.g., X-B3-TraceId) into message properties.
$producer = $this->container->get('rabbit_mq.producer.message');
$producer->publish(new AmqpMessage('Hello', ['headers' => ['trace_id' => '123']]));
Headers are auto-populated if a trace is active.
Consumers: Consumers extract headers and resume the trace context.
$consumer = $this->container->get('rabbit_mq.consumer.message');
$consumer->consume(function (AmqpMessage $msg) {
// Span is automatically resumed here.
logger()->info('Processing message: ' . $msg->body);
});
Add metadata to spans via message headers or consumer callbacks:
// Producer: Tag the span
$producer->publish(new AmqpMessage('Data', [
'headers' => [
'opentracing_span_tags' => json_encode(['component' => 'order-service']),
],
]));
// Consumer: Access tags in the callback
$consumer->consume(function (AmqpMessage $msg) {
$tags = json_decode($msg->getHeaders()['opentracing_span_tags'] ?? '{}', true);
$this->tracer->activeSpan()->setTag('component', $tags['component'] ?? 'unknown');
});
Wrap consumer logic in try-catch to log errors as span tags:
$consumer->consume(function (AmqpMessage $msg) {
try {
// Process message...
} catch (\Exception $e) {
$this->tracer->activeSpan()->setTag('error', $e->getMessage());
$this->tracer->activeSpan()->log(['event' => 'error', 'message' => $e->getMessage()]);
throw $e; // Re-throw to mark span as failed.
}
});
Mock the tracer in tests:
use OpenTracing\MockTracer;
public function testMessageFlow()
{
$mockTracer = new MockTracer();
$this->container->set('opentracing.tracer', $mockTracer);
// Trigger message flow...
$spans = $mockTracer->finishedSpans();
$this->assertCount(2, $spans); // Producer + Consumer spans.
}
Missing Core Bundle:
auxmoney/opentracing-bundle-core. Install it first or expect ServiceNotFoundException.composer require auxmoney/opentracing-bundle-core.Header Propagation Issues:
opentracing tracer is active in the producer.message_properties filtering).logger()->debug('Message headers:', $msg->getHeaders());
Symfony 6+ Flex Compatibility:
symfony/flex for seamless updates.PHP 8+ Attributes:
Attribute for decorators). Downgrade if using PHP <8.0.v1.2.0 (pre-PHP8) if needed.# config/packages/opentracing.yaml
auxmoney_opentracing:
tracer:
logging: true # Logs all spans to Symfony logger.
opentracing.tracer service to manually inspect spans:
$span = $this->tracer->activeSpan();
logger()->debug('Current span:', $span->toArray());
php-amqplib/rabbitmq-bundle:^2.10.0. Older versions may break decorator injection.Custom Propagator: Override the default propagator (e.g., for custom header formats):
auxmoney_opentracing:
propagator:
class: App\Service\CustomRabbitMqPropagator
Implement OpenTracing\Propagation\TextMapPropagator.
Span Naming: Modify span names dynamically:
$this->tracer->activeSpan()->setOperationName('process_order_' . $orderId);
Async Consumers:
For async consumers (e.g., RabbitMQAsyncConsumer), ensure the tracer is injected into the worker process:
$consumer->setWorkerOptions(['tracer' => $this->tracer]);
How can I help you explore Laravel packages today?