Tracing query performance with Knex.js
1 min read

Tracing query performance with Knex.js

Tracing query performance with Knex.js

Over the years, I found myself searching for the same exact problem whenever I was using Knex.js, the query planner for Node.js. Since, the following code snippet is small enough to not be a Node library, I'm intrigued to share this as a blog post.

Initially, a blog post from Atomic Object proposed to use query and query-response events on the knex.js instance, since it's also an event emitter, but I guess it's time to use perf_hooks and properly mark the performance of a query using the native tooling.

import { PerformanceObserver, performance } from 'perf_hooks'

const performanceObserver = new PerformanceObserver((list) => {
  list.getEntries().forEach((entry) => {
    console.group(`${entry.duration.toFixed(2)} ms`)
    console.info(entry.name)
    console.groupEnd()
  })
})
performanceObserver.observe({ buffered: true, entryTypes: ['measure'] })

pg.on('query', (query) => {
  const id = query.__knexQueryUid
  performance.mark(`${id}-started`)
}).on('query-response', (response, query) => {
  const id = query.__knexQueryUid
  performance.mark(`${id}-ended`)
  performance.measure(query.sql, `${id}-started`, `${id}-ended`)
})
Small snippet using perf_hooks
With the following code, we'll see the following code on our terminal.