mongodb.js 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. const { Gauge } = require('prom-client')
  2. function monitor(mongoClient) {
  3. const labelNames = ['mongo_server']
  4. const poolSize = new Gauge({
  5. name: 'mongo_connection_pool_size',
  6. help: 'number of connections in the connection pool',
  7. labelNames,
  8. // Use this one metric's collect() to set all metrics' values.
  9. collect,
  10. })
  11. const availableConnections = new Gauge({
  12. name: 'mongo_connection_pool_available',
  13. help: 'number of connections that are not busy',
  14. labelNames,
  15. })
  16. const waitQueueSize = new Gauge({
  17. name: 'mongo_connection_pool_waiting',
  18. help: 'number of operations waiting for an available connection',
  19. labelNames,
  20. })
  21. const maxPoolSize = new Gauge({
  22. name: 'mongo_connection_pool_max',
  23. help: 'max size for the connection pool',
  24. labelNames,
  25. })
  26. function collect() {
  27. // Reset all gauges in case they contain values for servers that
  28. // disappeared
  29. poolSize.reset()
  30. availableConnections.reset()
  31. waitQueueSize.reset()
  32. maxPoolSize.reset()
  33. const servers = mongoClient.topology?.s?.servers
  34. if (servers != null) {
  35. for (const [address, server] of servers) {
  36. const pool = server.s?.pool
  37. if (pool == null) {
  38. continue
  39. }
  40. const labels = { mongo_server: address }
  41. poolSize.set(labels, pool.totalConnectionCount)
  42. availableConnections.set(labels, pool.availableConnectionCount)
  43. waitQueueSize.set(labels, pool.waitQueueSize)
  44. maxPoolSize.set(labels, pool.options.maxPoolSize)
  45. }
  46. }
  47. }
  48. }
  49. module.exports = { monitor }