bifocal/node_modules/@sentry-internal/tracing/esm/node/integrations/mysql.js

132 lines
3.5 KiB
JavaScript

import { _optionalChain } from '@sentry/utils';
import { loadModule, logger, fill } from '@sentry/utils';
import { DEBUG_BUILD } from '../../common/debug-build.js';
import { shouldDisableAutoInstrumentation } from './utils/node-utils.js';
/** Tracing integration for node-mysql package */
class Mysql {
/**
* @inheritDoc
*/
static __initStatic() {this.id = 'Mysql';}
/**
* @inheritDoc
*/
constructor() {
this.name = Mysql.id;
}
/** @inheritdoc */
loadDependency() {
return (this._module = this._module || loadModule('mysql/lib/Connection.js'));
}
/**
* @inheritDoc
*/
// eslint-disable-next-line deprecation/deprecation
setupOnce(_, getCurrentHub) {
if (shouldDisableAutoInstrumentation(getCurrentHub)) {
DEBUG_BUILD && logger.log('Mysql Integration is skipped because of instrumenter configuration.');
return;
}
const pkg = this.loadDependency();
if (!pkg) {
DEBUG_BUILD && logger.error('Mysql Integration was unable to require `mysql` package.');
return;
}
let mySqlConfig = undefined;
try {
pkg.prototype.connect = new Proxy(pkg.prototype.connect, {
apply(wrappingTarget, thisArg, 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() {
if (!mySqlConfig) {
return {};
}
return {
'server.address': mySqlConfig.host,
'server.port': mySqlConfig.port,
'db.user': mySqlConfig.user,
};
}
function finishSpan(span) {
if (!span) {
return;
}
const data = spanDataFromConfig();
Object.keys(data).forEach(key => {
span.setAttribute(key, data[key]);
});
span.end();
}
// The original function will have one of these signatures:
// function (callback) => void
// function (options, callback) => void
// function (options, values, callback) => void
fill(pkg, 'createQuery', function (orig) {
return function ( options, values, callback) {
// eslint-disable-next-line deprecation/deprecation
const scope = getCurrentHub().getScope();
// eslint-disable-next-line deprecation/deprecation
const parentSpan = scope.getSpan();
// eslint-disable-next-line deprecation/deprecation
const span = _optionalChain([parentSpan, 'optionalAccess', _2 => _2.startChild, 'call', _3 => _3({
description: typeof options === 'string' ? options : (options ).sql,
op: 'db',
origin: 'auto.db.mysql',
data: {
'db.system': 'mysql',
},
})]);
if (typeof callback === 'function') {
return orig.call(this, options, values, function (err, result, fields) {
finishSpan(span);
callback(err, result, fields);
});
}
if (typeof values === 'function') {
return orig.call(this, options, function (err, result, fields) {
finishSpan(span);
values(err, result, fields);
});
}
// streaming, no callback!
const query = orig.call(this, options, values) ;
query.on('end', () => {
finishSpan(span);
});
return query;
};
});
}
}Mysql.__initStatic();
export { Mysql };
//# sourceMappingURL=mysql.js.map