Я использую Knex для взаимодействия с Postgres БД. Я хотел бы начать регистрацию метрик Prometheus, которые отслеживают время запроса для каждого запроса, где каждый запрос по сути является лишь одним из уникальных, несвязанных запросов, которые я определил в своем приложении. Прямо сейчас я могу отслеживать время выполнения, подключившись к обратным вызовам knex.on('query'...)
и knex.on('query-response'...)
, однако я хотел бы иметь возможность передавать какой-то атрибут «name» в свой QueryBuilder
, чтобы я может ссылаться на это значение, когда я получаю ответ, и отслеживаю метри c против него.
export function trackDbMetrics(knex: Knex): void {
knex.on('query', query => {
queries.set(query.__knexQueryUid, {
startTime: now(),
});
// Here is where I'd like to reference the name that I pass
queryCountMetric.inc({ query: `${query.method}` });
});
knex.on('query-response', (response, obj, query) => {
const endTime = now();
const { startTime } = queries.get(obj.__knexQueryUid);
queries.delete(obj.__knexQueryUid);
const elapsedTime = endTime - startTime;
// Here is where I'd like to reference the name that I pass
queryDurarionMetric.observe({ query_name: `${query.name}` }, elapsedTime);
});
}
Когда я составляю свой запрос, я хотел бы иметь возможность установить значение имени своего запроса, например это:
return knex
.select('*')
.from('users')
.where({ id: targetId })
.queryName('fetchTokens');
Я знаю, что могу добавлять функции, используя prototype
, но я не уверен, как на самом деле получить значение имени, которое я устанавливаю полностью через Knex, чтобы оно прошло обратно в объект query-response
.