从Knex.js获取连接池统计信息

时间:2018-10-09 18:03:26

标签: knex.js

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

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

我猜想,我的RDS Aurora实例暂时无法从服务器访问,或者我的连接池在流量特别繁忙时耗尽了。我想在连接池中记录可用连接与已占用连接的关系并绘制图表,以查看我的连接确实用完了,以及连接使用量激增时是否存在特定问题。但是我似乎无法从Google找出是否有办法从Knex或其池管理器中获取可用连接的数量。这可能吗?如果没有,是否还有其他方法可以记录有关我的连接池的统计信息?

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

1 个答案:

答案 0 :(得分:2)

通过运行设置了环境变量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