首页 > 解决方案 > 从 Knex.js 获取连接池统计信息

问题描述

我的 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 的内容。我不知道“log”属性会记录我感兴趣的事件,但无论如何我需要将该信息作为数据获取,以便我可以以有意义的方式将其发送到 Loggly。

标签: knex.js

解决方案


通过运行设置了环境变量的应用程序,您可以获得一些有关如何获取/返回连接池的信息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

推荐阅读