diff --git a/packages/node-integration-tests/suites/tracing/auto-instrument/mysql/test.ts b/packages/node-integration-tests/suites/tracing/auto-instrument/mysql/test.ts index dbdd658f6ef4..b28c6b613e48 100644 --- a/packages/node-integration-tests/suites/tracing/auto-instrument/mysql/test.ts +++ b/packages/node-integration-tests/suites/tracing/auto-instrument/mysql/test.ts @@ -14,6 +14,9 @@ test('should auto-instrument `mysql` package.', async () => { op: 'db', data: { 'db.system': 'mysql', + 'db.user': 'root', + 'server.address': expect.any(String), + 'server.port': expect.any(Number), }, }, @@ -22,6 +25,9 @@ test('should auto-instrument `mysql` package.', async () => { op: 'db', data: { 'db.system': 'mysql', + 'db.user': 'root', + 'server.address': expect.any(String), + 'server.port': expect.any(Number), }, }, ], diff --git a/packages/tracing-internal/src/node/integrations/mysql.ts b/packages/tracing-internal/src/node/integrations/mysql.ts index 8f85de1c9a8f..77ce6a66cd32 100644 --- a/packages/tracing-internal/src/node/integrations/mysql.ts +++ b/packages/tracing-internal/src/node/integrations/mysql.ts @@ -6,9 +6,18 @@ import type { LazyLoadedIntegration } from './lazy'; import { shouldDisableAutoInstrumentation } from './utils/node-utils'; interface MysqlConnection { + prototype: { + connect: () => void; + }; createQuery: () => void; } +interface MysqlConnectionConfig { + host: string; + port: number; + user: string; +} + /** Tracing integration for node-mysql package */ export class Mysql implements LazyLoadedIntegration { /** @@ -48,6 +57,32 @@ export class Mysql implements LazyLoadedIntegration { return; } + let mySqlConfig: MysqlConnectionConfig | undefined = undefined; + + try { + pkg.prototype.connect = new Proxy(pkg.prototype.connect, { + apply(wrappingTarget, thisArg: { config: MysqlConnectionConfig }, args) { + if (!mySqlConfig) { + mySqlConfig = thisArg.config; + } + return wrappingTarget.apply(thisArg, args); + }, + }); + } catch (e) { + __DEBUG_BUILD__ && logger.error('Mysql Integration was unable to instrument `mysql` config.'); + } + + function spanDataFromConfig(): Record { + if (!mySqlConfig) { + return {}; + } + return { + 'server.address': mySqlConfig.host, + 'server.port': mySqlConfig.port, + 'db.user': mySqlConfig.user, + }; + } + // The original function will have one of these signatures: // function (callback) => void // function (options, callback) => void @@ -60,6 +95,7 @@ export class Mysql implements LazyLoadedIntegration { description: typeof options === 'string' ? options : (options as { sql: string }).sql, op: 'db', data: { + ...spanDataFromConfig(), 'db.system': 'mysql', }, });