diff --git a/src/sentry/src/Constants.php b/src/sentry/src/Constants.php index 735f4417a..da8ec9caf 100644 --- a/src/sentry/src/Constants.php +++ b/src/sentry/src/Constants.php @@ -15,6 +15,8 @@ class Constants { public const TRACE_CARRIER = 'sentry.tracing.trace_carrier'; + public const TRACE_DB_USE_READ_PDO = 'sentry.tracing.db.use_read_pdo'; + public const TRACE_DB_SERVER_ADDRESS = 'sentry.tracing.db.server.address'; public const TRACE_DB_SERVER_PORT = 'sentry.tracing.db.server.port'; diff --git a/src/sentry/src/Tracing/Aspect/DbConnectionAspect.php b/src/sentry/src/Tracing/Aspect/DbConnectionAspect.php index 109f573e1..925d0f760 100644 --- a/src/sentry/src/Tracing/Aspect/DbConnectionAspect.php +++ b/src/sentry/src/Tracing/Aspect/DbConnectionAspect.php @@ -28,7 +28,12 @@ class DbConnectionAspect extends AbstractAspect public function process(ProceedingJoinPoint $proceedingJoinPoint) { - return tap($proceedingJoinPoint->process(), function ($pdo) { + return tap($proceedingJoinPoint->process(), function ($pdo) use ($proceedingJoinPoint) { + if ($proceedingJoinPoint->methodName === 'getPdoForSelect') { + $arguments = $proceedingJoinPoint->arguments['keys'] ?? []; + Context::set(Constants::TRACE_DB_USE_READ_PDO, $arguments['useReadPdo'] ?? false); + } + Context::getOrSet(self::class, function () use ($pdo) { $connectionStatus = $pdo->getAttribute(PDO::ATTR_CONNECTION_STATUS); [$host] = explode(' ', $connectionStatus); diff --git a/src/sentry/src/Tracing/Listener/EventHandleListener.php b/src/sentry/src/Tracing/Listener/EventHandleListener.php index 71e3ac35a..67cc2a743 100644 --- a/src/sentry/src/Tracing/Listener/EventHandleListener.php +++ b/src/sentry/src/Tracing/Listener/EventHandleListener.php @@ -186,6 +186,23 @@ protected function handleDbQueryExecuted(DbEvent\QueryExecuted $event): void $data['db.collection.name'] = $sqlParse['table']; } + // Get port from config + $host = (string) Context::get(Constants::TRACE_DB_SERVER_ADDRESS, 'localhost'); + if (! Context::has(Constants::TRACE_DB_SERVER_PORT)) { + $useReadPdo = (bool) Context::get(Constants::TRACE_DB_USE_READ_PDO, false); + $dbConfig = (fn () => $this->config ?? ['host' => $host, 'port' => 3306])->call($event->connection); + $hosts = $dbConfig['write']['host'] ?? [$dbConfig['host']]; + $ports = $dbConfig['write']['port'] ?? [$dbConfig['port']]; + if ($useReadPdo) { + $hosts = $dbConfig['read']['host'] ?? $hosts; + $ports = $dbConfig['read']['port'] ?? $ports; + } + $index = array_search($host, $hosts, true); + $port = $ports[$index] ?? $ports[0] ?? 3306; + } else { + $port = (int) Context::get(Constants::TRACE_DB_SERVER_PORT); + } + $pool = $this->container->get(PoolFactory::class)->getPool($event->connectionName); $data += [ 'db.pool.name' => $event->connectionName, @@ -193,8 +210,8 @@ protected function handleDbQueryExecuted(DbEvent\QueryExecuted $event): void 'db.pool.max_idle_time' => $pool->getOption()->getMaxIdleTime(), 'db.pool.idle' => $pool->getConnectionsInChannel(), 'db.pool.using' => $pool->getCurrentConnections(), - 'server.address' => (string) Context::get(Constants::TRACE_DB_SERVER_ADDRESS, 'localhost'), - 'server.port' => (int) Context::get(Constants::TRACE_DB_SERVER_PORT, 3306), + 'server.address' => $host, + 'server.port' => $port, ]; if ($this->feature->isTracingTagEnabled('db.sql.bindings', true)) {