diff --git a/composer.json b/composer.json index ea88bcd63..ed3e6aaf6 100644 --- a/composer.json +++ b/composer.json @@ -85,6 +85,7 @@ "hyperf/redis": "~3.1.0", "hyperf/rpc": "~3.1.0", "hyperf/rpc-client": "~3.1.0", + "hyperf/rpc-multiplex": "~3.1.0", "hyperf/rpc-server": "~3.1.0", "hyperf/scout": "~3.1.0", "hyperf/session": "~3.1.0", diff --git a/src/sentry/composer.json b/src/sentry/composer.json index 2c0237806..f90440eb4 100644 --- a/src/sentry/composer.json +++ b/src/sentry/composer.json @@ -41,6 +41,7 @@ "hyperf/amqp": "Required to use the amqp event (~3.1.9).", "hyperf/crontab": "Required to use the crontab event (~3.1.7).", "hyperf/database": "Required to use the crontab event (~3.1.0).", + "hyperf/rpc-multiplex": "Required to use the rpc tracing (~3.1.0).", "phpmyadmin/sql-parser": "Required to use the sql parser (^5.9)." }, "minimum-stability": "dev", diff --git a/src/sentry/src/ConfigProvider.php b/src/sentry/src/ConfigProvider.php index 82407ec37..47e2c23fc 100644 --- a/src/sentry/src/ConfigProvider.php +++ b/src/sentry/src/ConfigProvider.php @@ -39,6 +39,7 @@ public function __invoke(): array Tracing\Aspect\GuzzleHttpClientAspect::class, Tracing\Aspect\KafkaProducerAspect::class, Tracing\Aspect\RpcAspect::class, + Tracing\Aspect\RpcEndpointAspect::class, Tracing\Aspect\RedisAspect::class, Tracing\Aspect\TraceAnnotationAspect::class, Tracing\Aspect\ViewRenderAspect::class, diff --git a/src/sentry/src/Constants.php b/src/sentry/src/Constants.php index 0fbd4bf30..e37f16d29 100644 --- a/src/sentry/src/Constants.php +++ b/src/sentry/src/Constants.php @@ -15,6 +15,10 @@ class Constants { public const TRACE_CARRIER = 'sentry.tracing.trace_carrier'; + public const TRACE_RPC_SERVER_ADDRESS = 'sentry.tracing.rpc.server.address'; + + public const TRACE_RPC_SERVER_PORT = 'sentry.tracing.rpc.server.port'; + public const CRON_CHECKIN_ID = 'sentry.crons.checkin_id'; public const DISABLE_COROUTINE_TRACING = 'sentry.tracing.disable_coroutine_tracing'; diff --git a/src/sentry/src/Tracing/Aspect/RpcAspect.php b/src/sentry/src/Tracing/Aspect/RpcAspect.php index c3c3077b4..cbbf9bd70 100644 --- a/src/sentry/src/Tracing/Aspect/RpcAspect.php +++ b/src/sentry/src/Tracing/Aspect/RpcAspect.php @@ -75,6 +75,7 @@ private function handleGenerateRpcPath(ProceedingJoinPoint $proceedingJoinPoint) default => 'rpc', }; + // https://github.com/open-telemetry/semantic-conventions/blob/main/docs/rpc/rpc-spans.md Context::set(static::SPAN_CONTEXT, SpanContext::make() ->setOp('rpc.client') ->setDescription($path) @@ -112,8 +113,14 @@ function (Scope $scope) use ($proceedingJoinPoint) { $rpcCtx->set(Constants::TRACE_CARRIER, $carrier->toJson()); } return tap($proceedingJoinPoint->process(), function ($result) use ($span) { - if ($span && $this->feature->isTracingTagEnabled('rpc.result')) { - $span->setData(['rpc.result' => $result]); + if ($this->feature->isTracingTagEnabled('rpc.result')) { + $span?->setData(['rpc.result' => $result]); + } + if (Context::has(Constants::TRACE_RPC_SERVER_ADDRESS)) { + $span?->setData([ + 'server.address' => Context::get(Constants::TRACE_RPC_SERVER_ADDRESS), + 'server.port' => Context::get(Constants::TRACE_RPC_SERVER_PORT), + ]); } }); }, diff --git a/src/sentry/src/Tracing/Aspect/RpcEndpointAspect.php b/src/sentry/src/Tracing/Aspect/RpcEndpointAspect.php new file mode 100644 index 000000000..e57a7cb5c --- /dev/null +++ b/src/sentry/src/Tracing/Aspect/RpcEndpointAspect.php @@ -0,0 +1,37 @@ +process(), function ($socket) { + if ($socket instanceof Socket) { + Context::set(Constants::TRACE_RPC_SERVER_ADDRESS, $socket->getName()); + Context::set(Constants::TRACE_RPC_SERVER_PORT, $socket->getPort()); + } + }); + } +}