UNPKG

@sentry/node

Version:

Sentry Node SDK using OpenTelemetry for performance instrumentation

92 lines (89 loc) 3.26 kB
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