diff --git a/src/sentry/src/Tracing/Aspect/AmqpProducerAspect.php b/src/sentry/src/Tracing/Aspect/AmqpProducerAspect.php index e438266a6..fb1a04595 100644 --- a/src/sentry/src/Tracing/Aspect/AmqpProducerAspect.php +++ b/src/sentry/src/Tracing/Aspect/AmqpProducerAspect.php @@ -75,6 +75,6 @@ protected function produceMessage(ProceedingJoinPoint $proceedingJoinPoint) $this->properties['application_headers']->set(Constants::TRACE_CARRIER, $carrier); })->call($producerMessage); - return tap($proceedingJoinPoint->process(), fn () => $span->finish()); + return tap($proceedingJoinPoint->process(), fn () => $span->setOrigin('auto.amqp')->finish()); } } diff --git a/src/sentry/src/Tracing/Aspect/AsyncQueueJobMessageAspect.php b/src/sentry/src/Tracing/Aspect/AsyncQueueJobMessageAspect.php index 39078a2a0..8b537ca76 100644 --- a/src/sentry/src/Tracing/Aspect/AsyncQueueJobMessageAspect.php +++ b/src/sentry/src/Tracing/Aspect/AsyncQueueJobMessageAspect.php @@ -88,7 +88,7 @@ public function handlePush(ProceedingJoinPoint $proceedingJoinPoint) return $proceedingJoinPoint->process(); } catch (Throwable) { } finally { - $span->finish(); + $span->setOrigin('auto.queue')->finish(); } } diff --git a/src/sentry/src/Tracing/Aspect/CacheAspect.php b/src/sentry/src/Tracing/Aspect/CacheAspect.php index e31ae7a6c..8dff46e8b 100644 --- a/src/sentry/src/Tracing/Aspect/CacheAspect.php +++ b/src/sentry/src/Tracing/Aspect/CacheAspect.php @@ -16,7 +16,6 @@ use Hyperf\Di\Aop\AbstractAspect; use Hyperf\Di\Aop\ProceedingJoinPoint; use Sentry\SentrySdk; -use Sentry\Tracing\Span; use function Hyperf\Tappable\tap; @@ -53,99 +52,50 @@ public function process(ProceedingJoinPoint $proceedingJoinPoint) try { $method = $proceedingJoinPoint->methodName; $op = match ($method) { - 'set' => 'cache.put', - 'get', 'fetch' => 'cache.get', - 'delete' => 'cache.remove', - 'setMultiple' => 'cache.put', - 'getMultiple' => 'cache.get', - 'deleteMultiple' => 'cache.remove', + 'set', 'setMultiple' => 'cache.put', + 'get', 'fetch', 'getMultiple' => 'cache.get', + 'delete', 'deleteMultiple' => 'cache.remove', 'clear' => 'cache.flush', default => 'cache', }; + $arguments = $proceedingJoinPoint->arguments['keys'] ?? []; + /** @var string|string[] $key */ - $key = match ($method) { - 'set', 'get', 'delete', 'setMultiple', 'getMultiple', 'deleteMultiple' => $proceedingJoinPoint->arguments['order'][0] ?? 'unknown', - default => '', + [$key, $ttl] = match ($method) { + 'set', 'get', 'delete' => [ + $arguments['key'] ?? 'unknown', + $arguments['ttl'] ?? null, + ], + 'setMultiple' => [ + array_keys($arguments['values'] ?? []), + $arguments['ttl'] ?? null, + ], + 'getMultiple', 'deleteMultiple' => [ + $arguments['keys'] ?? [], + $arguments['ttl'] ?? null, + ], + default => ['', null], }; - $span = $this->startSpan(op: $op, description: $key); - - return tap($proceedingJoinPoint->process(), function ($value) use ($span, $method, $key) { - match ($method) { - 'set', => $this->handleSet($span, $key, $value), - 'get', 'fetch' => $this->handleGet($span, $key, $value), - 'delete' => $this->handleDelete($span, $key, $value), - 'setMultiple' => $this->handleSetMultiple($span, $key, $value), - 'getMultiple' => $this->handleGetMultiple($span, $key, $value), - 'deleteMultiple' => $this->handleDeleteMultiple($span, $key, $value), - 'clear' => $this->handleClear($span), - default => null, + $span = $this->startSpan( + op: $op, + description: implode(', ', (array) $key), + asParent: true + ); + + return tap($proceedingJoinPoint->process(), function ($result) use ($span, $method, $key, $ttl) { + $data = match ($method) { + 'set', 'setMultiple' => ['cache.key' => $key, 'cache.ttl' => $ttl], + 'delete', 'deleteMultiple' => ['cache.key' => $key], + 'get', 'fetch' => ['cache.key' => $key, 'cache.hit' => ! is_null($result)], + 'getMultiple' => ['cache.key' => $key, 'cache.hit' => ! empty($result)], + default => [], }; + $span->setOrigin('auto.cache')->setData($data)->finish(); }); } finally { SentrySdk::getCurrentHub()->setSpan($parent); } } - - private function handleSet(Span $span, string $key, mixed $value) - { - $span - ->setData([ - 'cache.key' => $key, - ]) - ->finish(); - } - - private function handleGet(Span $span, string $key, mixed $value) - { - $span - ->setData([ - 'cache.key' => $key, - 'cache.hit' => ! is_null($value), - ]) - ->finish(); - } - - private function handleDelete(Span $span, string $key, mixed $value) - { - $span - ->setData([ - 'cache.key' => $key, - ]) - ->finish(); - } - - private function handleSetMultiple(Span $span, array $keys, array $values) - { - $span - ->setData([ - 'cache.key' => $keys, - ]) - ->finish(); - } - - private function handleGetMultiple(Span $span, array $keys, array $values) - { - $span - ->setData([ - 'cache.key' => $keys, - 'cache.hit' => ! empty($values), - ]) - ->finish(); - } - - private function handleDeleteMultiple(Span $span, array $keys, array $values) - { - $span - ->setData([ - 'cache.key' => $keys, - ]) - ->finish(); - } - - private function handleClear(Span $span) - { - $span->finish(); - } } diff --git a/src/sentry/src/Tracing/Aspect/CoordinatorAspect.php b/src/sentry/src/Tracing/Aspect/CoordinatorAspect.php index b7557691e..c4e0d06e0 100644 --- a/src/sentry/src/Tracing/Aspect/CoordinatorAspect.php +++ b/src/sentry/src/Tracing/Aspect/CoordinatorAspect.php @@ -61,8 +61,7 @@ public function process(ProceedingJoinPoint $proceedingJoinPoint) } throw $exception; } finally { - $span?->setData($data); - $span?->finish(microtime(true)); + $span?->setOrigin('auto.coordinator')->setData($data)->finish(microtime(true)); } } } diff --git a/src/sentry/src/Tracing/Aspect/CoroutineAspect.php b/src/sentry/src/Tracing/Aspect/CoroutineAspect.php index 6875550ec..36ef72986 100644 --- a/src/sentry/src/Tracing/Aspect/CoroutineAspect.php +++ b/src/sentry/src/Tracing/Aspect/CoroutineAspect.php @@ -93,11 +93,11 @@ public function process(ProceedingJoinPoint $proceedingJoinPoint) throw $exception; } finally { - $transaction->setData($data); + $transaction->setOrigin('auto.coroutine')->setData($data); } }; - $parent->finish(); + $parent->setOrigin('auto.coroutine')->finish(); return $proceedingJoinPoint->process(); } diff --git a/src/sentry/src/Tracing/Aspect/DbAspect.php b/src/sentry/src/Tracing/Aspect/DbAspect.php index b61aeeb47..174959601 100644 --- a/src/sentry/src/Tracing/Aspect/DbAspect.php +++ b/src/sentry/src/Tracing/Aspect/DbAspect.php @@ -122,8 +122,7 @@ public function process(ProceedingJoinPoint $proceedingJoinPoint) throw $exception; } finally { - $span->setData($data); - $span->finish(); + $span->setOrigin('auto.db')->setData($data)->finish(); } return $result; diff --git a/src/sentry/src/Tracing/Aspect/ElasticsearchAspect.php b/src/sentry/src/Tracing/Aspect/ElasticsearchAspect.php index cbd9c46b9..7e844e6b3 100644 --- a/src/sentry/src/Tracing/Aspect/ElasticsearchAspect.php +++ b/src/sentry/src/Tracing/Aspect/ElasticsearchAspect.php @@ -102,8 +102,7 @@ public function process(ProceedingJoinPoint $proceedingJoinPoint) throw $exception; } finally { - $span->setData($data); - $span->finish(); + $span->setOrigin('auto.elasticsearch')->setData($data)->finish(); } return $result; diff --git a/src/sentry/src/Tracing/Aspect/GrpcAspect.php b/src/sentry/src/Tracing/Aspect/GrpcAspect.php index 9aa9c637d..9dce0f50a 100644 --- a/src/sentry/src/Tracing/Aspect/GrpcAspect.php +++ b/src/sentry/src/Tracing/Aspect/GrpcAspect.php @@ -76,21 +76,20 @@ public function process(ProceedingJoinPoint $proceedingJoinPoint) } } } catch (Throwable $exception) { - $span->setStatus(SpanStatus::internalError()); - $span->setTags([ - 'error' => true, - 'exception.class' => $exception::class, - 'exception.message' => $exception->getMessage(), - 'exception.code' => $exception->getCode(), - ]); + $span?->setStatus(SpanStatus::internalError()) + ->setTags([ + 'error' => true, + 'exception.class' => $exception::class, + 'exception.message' => $exception->getMessage(), + 'exception.code' => $exception->getCode(), + ]); if ($this->switcher->isTracingExtraTagEnable('exception.stack_trace')) { $data['exception.stack_trace'] = (string) $exception; } throw $exception; } finally { - $span->setData($data); - $span->finish(); + $span?->setOrigin('auto.grpc')->setData($data)->finish(); } return $result; } diff --git a/src/sentry/src/Tracing/Aspect/GuzzleHttpClientAspect.php b/src/sentry/src/Tracing/Aspect/GuzzleHttpClientAspect.php index 35b7a7fc8..761f93e15 100644 --- a/src/sentry/src/Tracing/Aspect/GuzzleHttpClientAspect.php +++ b/src/sentry/src/Tracing/Aspect/GuzzleHttpClientAspect.php @@ -144,8 +144,7 @@ public function process(ProceedingJoinPoint $proceedingJoinPoint) } } - $span->setData($data); - $span->finish(); + $span->setOrigin('auto.http.client')->setData($data)->finish(); if (is_callable($onStats)) { ($onStats)($stats); diff --git a/src/sentry/src/Tracing/Aspect/KafkaProducerAspect.php b/src/sentry/src/Tracing/Aspect/KafkaProducerAspect.php index 3bc1b829c..41a544c8f 100644 --- a/src/sentry/src/Tracing/Aspect/KafkaProducerAspect.php +++ b/src/sentry/src/Tracing/Aspect/KafkaProducerAspect.php @@ -70,7 +70,7 @@ protected function sendAsync(ProceedingJoinPoint $proceedingJoinPoint) ->setValue($carrier); $proceedingJoinPoint->arguments['keys']['headers'] = $headers; - return tap($proceedingJoinPoint->process(), fn () => $span->finish()); + return tap($proceedingJoinPoint->process(), fn () => $span->setOrigin('auto.kafka')->finish()); } protected function sendBatchAsync(ProceedingJoinPoint $proceedingJoinPoint) @@ -96,6 +96,6 @@ protected function sendBatchAsync(ProceedingJoinPoint $proceedingJoinPoint) )->call($message); } - return tap($proceedingJoinPoint->process(), fn () => $span->finish()); + return tap($proceedingJoinPoint->process(), fn () => $span->setOrigin('auto.kafka')->finish()); } } diff --git a/src/sentry/src/Tracing/Aspect/RedisAspect.php b/src/sentry/src/Tracing/Aspect/RedisAspect.php index 6f48b770c..2bf27cef6 100644 --- a/src/sentry/src/Tracing/Aspect/RedisAspect.php +++ b/src/sentry/src/Tracing/Aspect/RedisAspect.php @@ -110,8 +110,7 @@ class_exists(CommandExecuted::class) throw $exception; } finally { - $span->setData($data); - $span->finish(); + $span->setOrigin('auto.cache.redis')->setData($data)->finish(); } return $result; diff --git a/src/sentry/src/Tracing/Aspect/RpcAspect.php b/src/sentry/src/Tracing/Aspect/RpcAspect.php index 0b894d8b4..7e8523a73 100644 --- a/src/sentry/src/Tracing/Aspect/RpcAspect.php +++ b/src/sentry/src/Tracing/Aspect/RpcAspect.php @@ -124,29 +124,24 @@ private function handleSend(ProceedingJoinPoint $proceedingJoinPoint) try { $result = $proceedingJoinPoint->process(); - if (! $span) { - return $result; - } - if ($this->switcher->isTracingExtraTagEnable('rpc.result')) { $data['rpc.result'] = $result; } } catch (Throwable $exception) { - $span->setStatus(SpanStatus::internalError()); - $span->setTags([ - 'error' => true, - 'exception.class' => $exception::class, - 'exception.message' => $exception->getMessage(), - 'exception.code' => $exception->getCode(), - ]); + $span?->setStatus(SpanStatus::internalError()) + ->setTags([ + 'error' => true, + 'exception.class' => $exception::class, + 'exception.message' => $exception->getMessage(), + 'exception.code' => $exception->getCode(), + ]); if ($this->switcher->isTracingExtraTagEnable('exception.stack_trace')) { $data['exception.stack_trace'] = (string) $exception; } throw $exception; } finally { - $span->setData($data); - $span->finish(); + $span?->setOrigin('auto.rpc')->setData($data)->finish(); Context::destroy(static::SPAN); Context::destroy(static::DATA); diff --git a/src/sentry/src/Tracing/Listener/TracingAmqpListener.php b/src/sentry/src/Tracing/Listener/TracingAmqpListener.php index 4e2899dbf..b2ff1aa9f 100644 --- a/src/sentry/src/Tracing/Listener/TracingAmqpListener.php +++ b/src/sentry/src/Tracing/Listener/TracingAmqpListener.php @@ -122,10 +122,10 @@ protected function finishTransaction(AfterConsume|FailToConsume $event): void } } - $transaction->setData($data); - $transaction->setTags($tags); + $transaction->setOrigin('auto.amqp')->setData($data)->setTags($tags); SentrySdk::getCurrentHub()->setSpan($transaction); + $transaction->finish(microtime(true)); } } diff --git a/src/sentry/src/Tracing/Listener/TracingAsyncQueueListener.php b/src/sentry/src/Tracing/Listener/TracingAsyncQueueListener.php index d246e4723..2ee432aa8 100644 --- a/src/sentry/src/Tracing/Listener/TracingAsyncQueueListener.php +++ b/src/sentry/src/Tracing/Listener/TracingAsyncQueueListener.php @@ -110,10 +110,10 @@ protected function finishTransaction(AfterHandle|RetryHandle|FailedHandle $event } } - $transaction->setData($data); - $transaction->setTags($tags); + $transaction->setOrigin('auto.queue')->setData($data)->setTags($tags); SentrySdk::getCurrentHub()->setSpan($transaction); + $transaction->finish(microtime(true)); } } diff --git a/src/sentry/src/Tracing/Listener/TracingCommandListener.php b/src/sentry/src/Tracing/Listener/TracingCommandListener.php index 5a17f0fb6..9ecb47bf2 100644 --- a/src/sentry/src/Tracing/Listener/TracingCommandListener.php +++ b/src/sentry/src/Tracing/Listener/TracingCommandListener.php @@ -114,11 +114,14 @@ protected function finishTransaction(AfterExecute $event): void } } - $transaction->setStatus($exitCode == SymfonyCommand::SUCCESS ? SpanStatus::ok() : SpanStatus::internalError()); - $transaction->setData($data); - $transaction->setTags($tags); + $transaction + ->setOrigin('auto.command') + ->setStatus($exitCode == SymfonyCommand::SUCCESS ? SpanStatus::ok() : SpanStatus::internalError()) + ->setData($data) + ->setTags($tags); SentrySdk::getCurrentHub()->setSpan($transaction); + $transaction->finish(microtime(true)); } } diff --git a/src/sentry/src/Tracing/Listener/TracingCrontabListener.php b/src/sentry/src/Tracing/Listener/TracingCrontabListener.php index f4190de72..2361e3adc 100644 --- a/src/sentry/src/Tracing/Listener/TracingCrontabListener.php +++ b/src/sentry/src/Tracing/Listener/TracingCrontabListener.php @@ -97,10 +97,12 @@ protected function finishTransaction(AfterExecute|FailToExecute $event): void } } - $transaction->setData($data); - $transaction->setTags($tags); + $transaction->setOrigin('auto.crontab') + ->setData($data) + ->setTags($tags); SentrySdk::getCurrentHub()->setSpan($transaction); + $transaction->finish(microtime(true)); } } diff --git a/src/sentry/src/Tracing/Listener/TracingDbQueryListener.php b/src/sentry/src/Tracing/Listener/TracingDbQueryListener.php index cba5e5ea5..75d19d9a0 100644 --- a/src/sentry/src/Tracing/Listener/TracingDbQueryListener.php +++ b/src/sentry/src/Tracing/Listener/TracingDbQueryListener.php @@ -105,10 +105,10 @@ protected function queryExecutedHandler(object $event): void $description = $event->sql; // Already check in the previous context - /** @var \Sentry\Tracing\Span $span */ - $span = $this->startSpan($op, $description); - $span->setData($data); - $span->setStartTimestamp($startTimestamp); - $span->finish($startTimestamp + $event->time / 1000); + $this->startSpan($op, $description) + ->setOrigin('auto.db') + ->setData($data) + ->setStartTimestamp($startTimestamp) + ->finish($startTimestamp + $event->time / 1000); } } diff --git a/src/sentry/src/Tracing/Listener/TracingKafkaListener.php b/src/sentry/src/Tracing/Listener/TracingKafkaListener.php index a745fb3e2..e7ad48118 100644 --- a/src/sentry/src/Tracing/Listener/TracingKafkaListener.php +++ b/src/sentry/src/Tracing/Listener/TracingKafkaListener.php @@ -116,10 +116,12 @@ protected function finishTransaction(AfterConsume|FailToConsume $event): void } } - $transaction->setData($data); - $transaction->setTags($tags); + $transaction->setOrigin('auto.kafka') + ->setData($data) + ->setTags($tags); SentrySdk::getCurrentHub()->setSpan($transaction); + $transaction->finish(microtime(true)); } } diff --git a/src/sentry/src/Tracing/Listener/TracingRedisListener.php b/src/sentry/src/Tracing/Listener/TracingRedisListener.php index ae788b590..fd2095ab2 100644 --- a/src/sentry/src/Tracing/Listener/TracingRedisListener.php +++ b/src/sentry/src/Tracing/Listener/TracingRedisListener.php @@ -82,19 +82,20 @@ public function process(object $event): void } if ($exception = $event->throwable) { - $span->setStatus(SpanStatus::internalError()); - $span->setTags([ - 'error' => true, - 'exception.class' => $exception::class, - 'exception.message' => $exception->getMessage(), - 'exception.code' => $exception->getCode(), - ]); + $span->setStatus(SpanStatus::internalError()) + ->setTags([ + 'error' => true, + 'exception.class' => $exception::class, + 'exception.message' => $exception->getMessage(), + 'exception.code' => $exception->getCode(), + ]); if ($this->switcher->isTracingExtraTagEnable('exception.stack_trace')) { $data['exception.stack_trace'] = (string) $exception; } } - $span->setData($data); - $span->finish(); + $span->setOrigin('auto.redis') + ->setData($data) + ->finish(); } } diff --git a/src/sentry/src/Tracing/Listener/TracingRequestListener.php b/src/sentry/src/Tracing/Listener/TracingRequestListener.php index d9ed47642..3ff3c77c9 100644 --- a/src/sentry/src/Tracing/Listener/TracingRequestListener.php +++ b/src/sentry/src/Tracing/Listener/TracingRequestListener.php @@ -126,14 +126,16 @@ private function startTransaction(RequestReceived|RpcRequestReceived $event): vo $data['rpc.context'] = $this->container->get(RpcContext::class)->getData(); } - $transaction->setData($data); + $transaction->setOrigin('auto.request')->setData($data); $span = $this->startSpan('request.received', 'request.received', true); defer(function () use ($transaction, $span) { - $span->finish(); + $span?->setOrigin('auto.request') + ->finish(); SentrySdk::getCurrentHub()->setSpan($transaction); + $transaction->finish(); }); } @@ -160,16 +162,16 @@ private function setTraceIdAndException(RequestHandled|RpcRequestHandled $event) $transaction->setHttpStatus($event->response->getStatusCode()); if ($exception = $event->getThrowable()) { - $transaction->setStatus(SpanStatus::internalError()); - $transaction->setTags([ - 'error' => true, - 'exception.class' => $exception::class, - 'exception.code' => $exception->getCode(), - 'exception.message' => $exception->getMessage(), - ]); - $transaction->setData([ - 'exception.stack_trace' => (string) $exception, - ]); + $transaction->setStatus(SpanStatus::internalError()) + ->setTags([ + 'error' => true, + 'exception.class' => $exception::class, + 'exception.code' => $exception->getCode(), + 'exception.message' => $exception->getMessage(), + ]) + ->setData([ + 'exception.stack_trace' => (string) $exception, + ]); } }