src/Events/JobProcessed.php
<?php namespace Honeybadger\HoneybadgerLaravel\Events; use Illuminate\Events\Dispatcher;use Illuminate\Queue\Events\JobProcessed as LaravelJobProcessed;use Illuminate\Queue\Events\JobProcessing; class JobProcessed extends ApplicationEvent{ public string $handles = LaravelJobProcessed::class; private float $startTime; /** * @param LaravelJobProcessed $event * @return EventPayload */ public function getEventPayload($event): EventPayload { $job = $event->job; $metadata = [ 'connectionName' => $event->connectionName, // we have to call 'resolveName' because sometimes the actual job is wrapped (i.e. DatabaseJob -> Job) 'job' => $job->resolveName(), 'id' => $job->getJobId(), // number of attempts made to process the job 'attempts' => $job->attempts(), // if the job has been marked as failed 'hasFailed' => $job->hasFailed(), // if the job has been released back into the queue 'isReleased' => $job->isReleased(), // if the job has been deleted (i.e. it's not in the queue anymore) 'isDeleted' => $job->isDeleted(), // number of times the job can be retried 'maxTries' => $job->maxTries(), // number of exceptions that can be thrown before the job is considered failed (regardless of the number of attempts) 'maxExceptions' => $job->maxExceptions(), // number of seconds the job can run before it's considered timed out 'timeout' => $job->timeout(), // timestamp indicating when the job should timeout 'retryUntil' => $job->retryUntil(), // duration in milliseconds of the job processing // calculated by measuring the time difference since the JobProcessing event was raised 'duration' => $this->getDurationInMs($this->startTime), ]; return new EventPayload( 'job', 'job.processed', 'Job processed', $metadata, ); } /** * Register the listeners for the subscriber. * We are overriding the register() method from the parent class, * so we can listen to the JobProcessing event as well. */ public function register(): void { /** @var Dispatcher $dispatcher */ $dispatcher = app('events'); $dispatcher->listen(JobProcessing::class, function ($event) { $this->startTime = microtime(true); }); $dispatcher->listen($this->handles, [$this, 'handle']); }}