From f38c97c54befe02958fe1bc884512681a4e1a175 Mon Sep 17 00:00:00 2001 From: Alex Bouma Date: Wed, 17 Jan 2024 22:31:36 +0100 Subject: [PATCH] Add span for publishing a job to the queue --- .../Laravel/Features/QueueIntegration.php | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/src/Sentry/Laravel/Features/QueueIntegration.php b/src/Sentry/Laravel/Features/QueueIntegration.php index 18f12417..165a9429 100644 --- a/src/Sentry/Laravel/Features/QueueIntegration.php +++ b/src/Sentry/Laravel/Features/QueueIntegration.php @@ -2,10 +2,13 @@ namespace Sentry\Laravel\Features; +use Closure; use Illuminate\Contracts\Events\Dispatcher; use Illuminate\Queue\Events\JobExceptionOccurred; use Illuminate\Queue\Events\JobProcessed; use Illuminate\Queue\Events\JobProcessing; +use Illuminate\Queue\Events\JobQueued; +use Illuminate\Queue\Events\JobQueueing; use Illuminate\Queue\Events\WorkerStopping; use Illuminate\Queue\Queue; use Sentry\Breadcrumb; @@ -45,6 +48,9 @@ public function isApplicable(): bool public function onBoot(Dispatcher $events): void { + $events->listen(JobQueueing::class, [$this, 'handleJobQueueingEvent']); + $events->listen(JobQueued::class, [$this, 'handleJobQueuedEvent']); + $events->listen(JobProcessed::class, [$this, 'handleJobProcessedQueueEvent']); $events->listen(JobProcessing::class, [$this, 'handleJobProcessingQueueEvent']); $events->listen(WorkerStopping::class, [$this, 'handleWorkerStoppingQueueEvent']); @@ -62,6 +68,43 @@ public function onBoot(Dispatcher $events): void } } + public function handleJobQueueingEvent(JobQueueing $event): void + { + $parentSpan = SentrySdk::getCurrentHub()->getSpan(); + + // If there is no tracing span active there is no need to handle the event + if ($parentSpan === null) { + return; + } + + $jobName = $event->job; + + if ($jobName instanceof Closure) { + $jobName = 'Closure'; + } elseif (is_object($jobName)) { + $jobName = get_class($jobName); + } + + $context = (new SpanContext) + ->setOp('queue.publish') + ->setData([ + 'job' => $jobName, + 'connection' => $event->connectionName, + ]) + ->setDescription($jobName); + + $this->pushSpan($parentSpan->startChild($context)); + } + + public function handleJobQueuedEvent(JobQueued $event): void + { + $span = $this->maybePopSpan(); + + if ($span !== null) { + $span->finish(); + } + } + public function handleJobProcessedQueueEvent(JobProcessed $event): void { $this->finishJobWithStatus(SpanStatus::ok());