@sentry/node
Version:
Sentry Node SDK using OpenTelemetry for performance instrumentation
92 lines (89 loc) • 3.26 kB
JavaScript
import { ATTR_DB_CONNECTION_STRING, ATTR_DB_NAME, ATTR_DB_USER, ATTR_NET_PEER_NAME, ATTR_NET_PEER_PORT } from './semconv.js';
import { SemconvStability } from '@opentelemetry/instrumentation';
import { ATTR_DB_NAMESPACE, ATTR_SERVER_ADDRESS, ATTR_SERVER_PORT } from '@opentelemetry/semantic-conventions';
function getConnectionAttributes(config, dbSemconvStability, netSemconvStability) {
const { host, port, database, user } = getConfig(config);
const attrs = {};
if (dbSemconvStability & SemconvStability.OLD) {
attrs[ATTR_DB_CONNECTION_STRING] = getJDBCString(host, port, database);
attrs[ATTR_DB_NAME] = database;
attrs[ATTR_DB_USER] = user;
}
if (dbSemconvStability & SemconvStability.STABLE) {
attrs[ATTR_DB_NAMESPACE] = database;
}
const portNumber = parseInt(port, 10);
if (netSemconvStability & SemconvStability.OLD) {
attrs[ATTR_NET_PEER_NAME] = host;
if (!isNaN(portNumber)) {
attrs[ATTR_NET_PEER_PORT] = portNumber;
}
}
if (netSemconvStability & SemconvStability.STABLE) {
attrs[ATTR_SERVER_ADDRESS] = host;
if (!isNaN(portNumber)) {
attrs[ATTR_SERVER_PORT] = portNumber;
}
}
return attrs;
}
function getConfig(config) {
const { host, port, database, user } = config && config.connectionConfig || config || {};
return { host, port, database, user };
}
function getJDBCString(host, port, database) {
let jdbcString = `jdbc:mysql://${host || "localhost"}`;
if (typeof port === "number") {
jdbcString += `:${port}`;
}
if (typeof database === "string") {
jdbcString += `/${database}`;
}
return jdbcString;
}
function getQueryText(query, format, values, maskStatement = false, maskStatementHook = defaultMaskingHook) {
const [querySql, queryValues] = typeof query === "string" ? [query, values] : [query.sql, hasValues(query) ? values || query.values : values];
try {
if (maskStatement) {
return maskStatementHook(querySql);
} else if (format && queryValues) {
return format(querySql, queryValues);
} else {
return querySql;
}
} catch (e) {
return "Could not determine the query due to an error in masking or formatting";
}
}
function defaultMaskingHook(query) {
return query.replace(/\b\d+\b/g, "?").replace(/(["'])(?:(?=(\\?))\2.)*?\1/g, "?");
}
function hasValues(obj) {
return "values" in obj;
}
function getSpanName(query) {
const rawQuery = typeof query === "object" ? query.sql : query;
const firstSpace = rawQuery?.indexOf(" ");
if (typeof firstSpace === "number" && firstSpace !== -1) {
return rawQuery?.substring(0, firstSpace);
}
return rawQuery;
}
const once = (fn) => {
let called = false;
return (...args) => {
if (called) return;
called = true;
return fn(...args);
};
};
function getConnectionPrototypeToInstrument(connection) {
const connectionPrototype = connection.prototype;
const basePrototype = Object.getPrototypeOf(connectionPrototype);
if (typeof basePrototype?.query === "function" && typeof basePrototype?.execute === "function") {
return basePrototype;
}
return connectionPrototype;
}
export { getConnectionAttributes, getConnectionPrototypeToInstrument, getQueryText, getSpanName, once };
//# sourceMappingURL=utils.js.map