【问题标题】:Get connection pool stats from Knex.js从 Knex.js 获取连接池统计信息
【发布时间】:2018-10-09 18:03:25
【问题描述】:

我的 Knex 驱动程序出现间歇性错误:

TimeoutError: Knex: Timeout acquiring a connection. The pool is probably full. Are you missing a .transacting(trx) call?

我猜,要么是我的 RDS Aurora 实例暂时无法从服务器访问,要么是我的连接池在特别繁忙的流量增长期间用完了。我想记录并绘制连接池中可用连接与占用连接的图表,以查看我确实用完了连接,以及连接使用高峰时是否存在特定点。但我似乎无法从谷歌那里找到是否有办法从 Knex 或其池管理器获取可用连接数。这可能吗?如果没有,是否有其他方法可以记录有关我的连接池的统计信息?

我看到有一个选项可以传递给连接池 init log,它需要一个布尔值。我正在使用Winston 将我的日志发送到 Loggly,而不仅仅是发送 stdout 的内容。我不知道“日志”属性会记录我感兴趣的事件,但无论如何我都需要将该信息作为数据获取,以便我可以以有意义的方式将其发送到 Loggly。

【问题讨论】:

  • 我意识到 node-postgres 而不是 Knex 满足了我的需求,并且 node-postgres 可以轻松访问有关池的统计信息。我不再需要这个问题的答案,但我把它留在这里以防其他人需要。

标签: knex.js


【解决方案1】:

您可以通过设置环境变量DEBUG=knex:* 运行您的应用程序来获取有关如何获取/返回连接池的一些信息。

Knex 使用 tarn.js 作为其池实现。获取池资源https://github.com/vincit/tarn.js/的一些方法在页尾列出。

// returns the number of non-free resources
pool.numUsed()

// returns the number of free resources
pool.numFree()

// how many acquires are waiting for a resource to be released
pool.numPendingAcquires()

// how many asynchronous create calls are running
pool.numPendingCreates()

可以通过knex.client.pool找到池实例。

const knex = require('knex')({ client: 'pg', connection: 'postgres://knex_test' });
knex.client.pool.numPendingCreates(); // returns 0

【讨论】:

  • DEBUG=knex:* 小费对我来说是救命稻草。我的问题与连接池无关,而是我在错误的地方调用了knex.destroy()。这个调试命令帮助我快速发现了这个问题!
猜你喜欢
  • 2014-02-12
  • 1970-01-01
  • 1970-01-01
  • 2019-12-15
  • 1970-01-01
  • 1970-01-01
  • 2018-09-10
  • 1970-01-01
  • 2017-08-31
相关资源
最近更新 更多