diff --git a/src/sentry/src/Tracing/Aspect/DbConnectionAspect.php b/src/sentry/src/Tracing/Aspect/DbConnectionAspect.php index 925d0f760..9af6280ae 100644 --- a/src/sentry/src/Tracing/Aspect/DbConnectionAspect.php +++ b/src/sentry/src/Tracing/Aspect/DbConnectionAspect.php @@ -15,30 +15,46 @@ use Hyperf\Context\Context; use Hyperf\Di\Aop\AbstractAspect; use Hyperf\Di\Aop\ProceedingJoinPoint; -use PDO; +use WeakMap; use function Hyperf\Tappable\tap; class DbConnectionAspect extends AbstractAspect { public array $classes = [ + 'Hyperf\Database\Connectors\Connector::createPdoConnection', 'Hyperf\Database\Connection::getPdoForSelect', 'Hyperf\Database\Connection::getPdo', ]; + private WeakMap $serverCache; + + public function __construct() + { + $this->serverCache = new WeakMap(); + } + public function process(ProceedingJoinPoint $proceedingJoinPoint) { 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); + if ($proceedingJoinPoint->methodName === 'createPdoConnection') { + $dsn = $proceedingJoinPoint->arguments['keys']['dsn'] ?? ''; + $pattern = '/host=([^;]+);port=(\d+);?/'; + if (preg_match($pattern, $dsn, $matches)) { + $host = $matches[1]; + $port = $matches[2]; + $this->serverCache[$pdo] = ['host' => $host, 'port' => $port]; + } + return; } Context::getOrSet(self::class, function () use ($pdo) { - $connectionStatus = $pdo->getAttribute(PDO::ATTR_CONNECTION_STATUS); - [$host] = explode(' ', $connectionStatus); + $server = $this->serverCache[$pdo] ?? null; - Context::set(Constants::TRACE_DB_SERVER_ADDRESS, $host); + if (is_array($server)) { + Context::set(Constants::TRACE_DB_SERVER_ADDRESS, $server['host']); + Context::set(Constants::TRACE_DB_SERVER_PORT, $server['port']); + } return true; }); diff --git a/src/sentry/src/Tracing/Listener/EventHandleListener.php b/src/sentry/src/Tracing/Listener/EventHandleListener.php index 67cc2a743..71e3ac35a 100644 --- a/src/sentry/src/Tracing/Listener/EventHandleListener.php +++ b/src/sentry/src/Tracing/Listener/EventHandleListener.php @@ -186,23 +186,6 @@ 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, @@ -210,8 +193,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' => $host, - 'server.port' => $port, + 'server.address' => (string) Context::get(Constants::TRACE_DB_SERVER_ADDRESS, 'localhost'), + 'server.port' => (int) Context::get(Constants::TRACE_DB_SERVER_PORT, 3306), ]; if ($this->feature->isTracingTagEnabled('db.sql.bindings', true)) {