Skip to content

Commit dcbf8d8

Browse files
committed
Feat: Add contextual attributes register for queue
1 parent 9b97522 commit dcbf8d8

File tree

11 files changed

+299
-33
lines changed

11 files changed

+299
-33
lines changed

src/Instrumentation/Laravel/src/Hooks/Illuminate/Queue/AttributesBuilder.php

Lines changed: 6 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,7 @@
55
namespace OpenTelemetry\Contrib\Instrumentation\Laravel\Hooks\Illuminate\Queue;
66

77
use Illuminate\Contracts\Queue\Queue as QueueContract;
8-
use Illuminate\Queue\BeanstalkdQueue;
9-
use Illuminate\Queue\RedisQueue;
10-
use Illuminate\Queue\SqsQueue;
118
use OpenTelemetry\SemConv\TraceAttributes;
12-
use OpenTelemetry\SemConv\TraceAttributeValues;
139

1410
trait AttributesBuilder
1511
{
@@ -42,35 +38,12 @@ private function contextualMessageSystemAttributes(
4238
array $options = [],
4339
mixed ...$params,
4440
): array {
45-
return match (true) {
46-
$queue instanceof BeanstalkdQueue => $this->beanstalkContextualAttributes($queue, $payload, $queueName, $options, ...$params),
47-
$queue instanceof RedisQueue => $this->redisContextualAttributes($queue, $payload, $queueName, $options, ...$params),
48-
$queue instanceof SqsQueue => $this->awsSqsContextualAttributes($queue, $payload, $queueName, $options, ...$params),
49-
default => [],
50-
};
51-
}
52-
53-
private function beanstalkContextualAttributes(BeanstalkdQueue $queue, array $payload, ?string $queueName = null, array $options = [], mixed ...$params): array
54-
{
55-
return [
56-
TraceAttributes::MESSAGING_SYSTEM => 'beanstalk',
57-
TraceAttributes::MESSAGING_DESTINATION_NAME => $queue->getQueue($queueName),
58-
];
59-
}
60-
61-
private function redisContextualAttributes(RedisQueue $queue, array $payload, ?string $queueName = null, array $options = [], mixed ...$params): array
62-
{
63-
return [
64-
TraceAttributes::MESSAGING_SYSTEM => 'redis',
65-
TraceAttributes::MESSAGING_DESTINATION_NAME => $queue->getQueue($queueName),
66-
];
67-
}
41+
foreach (AttributesBuilderRegister::getBuilders() as $builder) {
42+
if ($builder->canHandle($queue)) {
43+
return $builder->contextualAttributes($queue, $payload, $queueName, $options, $params);
44+
}
45+
}
6846

69-
private function awsSqsContextualAttributes(SqsQueue $queue, array $payload, ?string $queueName = null, array $options = [], mixed ...$params): array
70-
{
71-
return [
72-
TraceAttributes::MESSAGING_SYSTEM => TraceAttributeValues::MESSAGING_SYSTEM_AWS_SQS,
73-
TraceAttributes::MESSAGING_DESTINATION_NAME => $queue->getQueue($queueName),
74-
];
47+
return [];
7548
}
7649
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace OpenTelemetry\Contrib\Instrumentation\Laravel\Hooks\Illuminate\Queue;
6+
7+
use Illuminate\Queue\BeanstalkdQueue;
8+
use Illuminate\Queue\RedisQueue;
9+
use Illuminate\Queue\SqsQueue;
10+
use OpenTelemetry\Contrib\Instrumentation\Laravel\Hooks\Illuminate\Queue\ContextualAttributesBuilders\BeanstalkdQueueAttributes;
11+
use OpenTelemetry\Contrib\Instrumentation\Laravel\Hooks\Illuminate\Queue\ContextualAttributesBuilders\RedisQueueAttributes;
12+
use OpenTelemetry\Contrib\Instrumentation\Laravel\Hooks\Illuminate\Queue\ContextualAttributesBuilders\SqsQueueAttributes;
13+
14+
class AttributesBuilderRegister
15+
{
16+
/**
17+
* @var ContextualAttributesBuilder[]
18+
*/
19+
private static array $contextualAttributesBuilders = [];
20+
21+
public static function registerContextualAttributesBuilder(ContextualAttributesBuilder $instance): void
22+
{
23+
self::$contextualAttributesBuilders[$instance::class] ??= $instance;
24+
}
25+
26+
public static function clean(): void
27+
{
28+
self::$contextualAttributesBuilders = [];
29+
}
30+
31+
/**
32+
* @return ContextualAttributesBuilder[]
33+
*/
34+
public static function getBuilders(): array
35+
{
36+
self::ensureDefaultBuilderIsRegistered();
37+
38+
return self::$contextualAttributesBuilders;
39+
}
40+
41+
private static function ensureDefaultBuilderIsRegistered(): void
42+
{
43+
self::$contextualAttributesBuilders[BeanstalkdQueue::class] ??= new BeanstalkdQueueAttributes();
44+
self::$contextualAttributesBuilders[RedisQueue::class] ??= new RedisQueueAttributes();
45+
self::$contextualAttributesBuilders[SqsQueue::class] ??= new SqsQueueAttributes();
46+
}
47+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace OpenTelemetry\Contrib\Instrumentation\Laravel\Hooks\Illuminate\Queue;
6+
7+
use Illuminate\Contracts\Queue\Queue as QueueContract;
8+
9+
interface ContextualAttributesBuilder
10+
{
11+
public function canHandle(QueueContract $queue): bool;
12+
13+
public function contextualAttributes(
14+
QueueContract $queue,
15+
array $payload,
16+
?string $queueName = null,
17+
array $options = [],
18+
mixed ...$params
19+
): array;
20+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace OpenTelemetry\Contrib\Instrumentation\Laravel\Hooks\Illuminate\Queue\ContextualAttributesBuilders;
6+
7+
use Illuminate\Contracts\Queue\Queue as QueueContract;
8+
use InvalidArgumentException;
9+
use OpenTelemetry\Contrib\Instrumentation\Laravel\Hooks\Illuminate\Queue\ContextualAttributesBuilder;
10+
11+
abstract class AbstractContextualAttributesBuilder implements ContextualAttributesBuilder
12+
{
13+
protected ?string $handleClass = null;
14+
15+
public function canHandle(QueueContract $queue): bool
16+
{
17+
if ($this->handleClass === null) {
18+
throw new InvalidArgumentException('ContextualAttributesBuilder cannot handle an null class.');
19+
}
20+
21+
return $queue instanceof $this->handleClass;
22+
}
23+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace OpenTelemetry\Contrib\Instrumentation\Laravel\Hooks\Illuminate\Queue\ContextualAttributesBuilders;
6+
7+
use Illuminate\Contracts\Queue\Queue;
8+
use Illuminate\Queue\BeanstalkdQueue;
9+
use OpenTelemetry\SemConv\TraceAttributes;
10+
11+
class BeanstalkdQueueAttributes extends AbstractContextualAttributesBuilder
12+
{
13+
protected ?string $handleClass = BeanstalkdQueue::class;
14+
15+
public function contextualAttributes(
16+
Queue $queue,
17+
array $payload,
18+
?string $queueName = null,
19+
array $options = [],
20+
...$params
21+
): array {
22+
/** @var BeanstalkdQueue $queue */
23+
return [
24+
TraceAttributes::MESSAGING_SYSTEM => 'beanstalk',
25+
TraceAttributes::MESSAGING_DESTINATION_NAME => $queue->getQueue($queueName),
26+
];
27+
}
28+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace OpenTelemetry\Contrib\Instrumentation\Laravel\Hooks\Illuminate\Queue\ContextualAttributesBuilders;
6+
7+
use Illuminate\Contracts\Queue\Queue;
8+
use Illuminate\Queue\RedisQueue;
9+
use OpenTelemetry\SemConv\TraceAttributes;
10+
11+
class RedisQueueAttributes extends AbstractContextualAttributesBuilder
12+
{
13+
protected ?string $handleClass = RedisQueue::class;
14+
15+
public function contextualAttributes(
16+
Queue $queue,
17+
array $payload,
18+
?string $queueName = null,
19+
array $options = [],
20+
...$params
21+
): array {
22+
/** @var RedisQueue $queue */
23+
return [
24+
TraceAttributes::MESSAGING_SYSTEM => 'redis',
25+
TraceAttributes::MESSAGING_DESTINATION_NAME => $queue->getQueue($queueName),
26+
];
27+
}
28+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace OpenTelemetry\Contrib\Instrumentation\Laravel\Hooks\Illuminate\Queue\ContextualAttributesBuilders;
6+
7+
use Illuminate\Contracts\Queue\Queue;
8+
use Illuminate\Queue\SqsQueue;
9+
use OpenTelemetry\SemConv\TraceAttributes;
10+
use OpenTelemetry\SemConv\TraceAttributeValues;
11+
12+
class SqsQueueAttributes extends AbstractContextualAttributesBuilder
13+
{
14+
protected ?string $handleClass = SqsQueue::class;
15+
16+
public function contextualAttributes(
17+
Queue $queue,
18+
array $payload,
19+
?string $queueName = null,
20+
array $options = [],
21+
...$params
22+
): array {
23+
/** @var SqsQueue $queue */
24+
return [
25+
TraceAttributes::MESSAGING_SYSTEM => TraceAttributeValues::MESSAGING_SYSTEM_AWS_SQS,
26+
TraceAttributes::MESSAGING_DESTINATION_NAME => $queue->getQueue($queueName),
27+
];
28+
}
29+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace OpenTelemetry\Contrib\Instrumentation\Laravel\Propagators;
6+
7+
use Illuminate\Http\Client\PendingRequest;
8+
9+
/**
10+
* @internal
11+
*/
12+
class RequestPropagationSetter
13+
{
14+
public static function instance(): self
15+
{
16+
static $instance;
17+
18+
return $instance ??= new self();
19+
}
20+
21+
public function set(&$carrier, string $key, string $value): void
22+
{
23+
assert($carrier instanceof PendingRequest);
24+
25+
$carrier->withHeader($key, $value);
26+
}
27+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace OpenTelemetry\Tests\Contrib\Instrumentation\Laravel\Fixtures\Queues;
6+
7+
use Illuminate\Contracts\Queue\Queue as QueueContract;
8+
use OpenTelemetry\Contrib\Instrumentation\Laravel\Hooks\Illuminate\Queue\ContextualAttributesBuilders\AbstractContextualAttributesBuilder;
9+
use OpenTelemetry\SemConv\TraceAttributes;
10+
11+
class AnotherAttributesBuilder extends AbstractContextualAttributesBuilder
12+
{
13+
protected ?string $handleClass = AnotherQueue::class;
14+
15+
public function contextualAttributes(
16+
QueueContract $queue,
17+
array $payload,
18+
?string $queueName = null,
19+
array $options = [],
20+
...$params
21+
): array {
22+
return [
23+
TraceAttributes::MESSAGING_SYSTEM => 'another-queue',
24+
TraceAttributes::MESSAGING_DESTINATION_NAME => $queue->getQueue($queueName),
25+
];
26+
}
27+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace OpenTelemetry\Tests\Contrib\Instrumentation\Laravel\Fixtures\Queues;
6+
7+
use Illuminate\Contracts\Queue\Queue as QueueContract;
8+
use Illuminate\Queue\Queue;
9+
10+
class AnotherQueue extends Queue implements QueueContract
11+
{
12+
public function getQueue($queue)
13+
{
14+
return 'another-queue-name';
15+
}
16+
17+
public function size($queue = null)
18+
{
19+
// dummy
20+
}
21+
22+
public function push($job, $data = '', $queue = null)
23+
{
24+
// dummy
25+
}
26+
27+
public function pushRaw($payload, $queue = null, array $options = [])
28+
{
29+
// dummy
30+
}
31+
32+
public function later($delay, $job, $data = '', $queue = null)
33+
{
34+
// dummy
35+
}
36+
37+
public function pop($queue = null)
38+
{
39+
// dummy
40+
}
41+
}

0 commit comments

Comments
 (0)