rittenhop-dev/versions/5.94.2/core/shared/SentryKnexTracingIntegration.js
2024-09-23 19:40:12 -04:00

68 lines
1.5 KiB
JavaScript

/**
* @typedef {import('knex').Knex.Client} KnexClient
*/
/**
* @typedef {import('@sentry/types').Integration} SentryIntegration
*/
/**
* Sentry Knex tracing integration
*
* @implements {SentryIntegration}
*/
class SentryKnexTracingIntegration {
static id = 'Knex';
name = SentryKnexTracingIntegration.id;
/** @type {KnexClient} */
#knex;
/** @type {Map} */
#spanCache = new Map();
/**
* @param {KnexClient} knex
*/
constructor(knex) {
this.#knex = knex;
}
/**
* @param {Function} addGlobalEventProcessor
* @param {Function} getCurrentHub
*/
setupOnce(addGlobalEventProcessor, getCurrentHub) {
this.#knex.on('query', (query) => {
const scope = getCurrentHub().getScope();
const parentSpan = scope?.getSpan();
const span = parentSpan?.startChild({
op: 'db.query',
description: query.sql
});
if (span) {
this.#spanCache.set(query.__knexQueryUid, span);
}
});
const handleQueryExecuted = (err, query) => {
const queryId = query.__knexQueryUid;
const span = this.#spanCache.get(queryId);
if (span) {
span.finish();
this.#spanCache.delete(queryId);
}
};
this.#knex.on('query-response', handleQueryExecuted);
this.#knex.on('query-error', handleQueryExecuted);
}
}
module.exports = SentryKnexTracingIntegration;