Передача нового атрибута через Knex для ведения журнала метрик - PullRequest
0 голосов
/ 18 июня 2020

Я использую 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...