mongodb.js 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. const Metrics = require('../../..')
  2. const { expect } = require('chai')
  3. const prom = require('prom-client')
  4. describe('mongodb', function () {
  5. beforeEach(function () {
  6. prom.register.clear()
  7. this.pool = {
  8. totalConnectionCount: 8,
  9. availableConnectionCount: 2,
  10. waitQueueSize: 4,
  11. options: { maxPoolSize: 10 },
  12. }
  13. this.servers = new Map([['server1', { s: { pool: this.pool } }]])
  14. this.mongoClient = { topology: { s: { servers: this.servers } } }
  15. })
  16. it('handles an unconnected client', async function () {
  17. const mongoClient = {}
  18. Metrics.mongodb.monitor(mongoClient)
  19. const metrics = await getMetrics()
  20. expect(metrics).to.deep.equal({})
  21. })
  22. it('collects Mongo metrics', async function () {
  23. Metrics.mongodb.monitor(this.mongoClient)
  24. const metrics = await getMetrics()
  25. expect(metrics).to.deep.equal({
  26. 'mongo_connection_pool_max:server1': 10,
  27. 'mongo_connection_pool_size:server1': 8,
  28. 'mongo_connection_pool_available:server1': 2,
  29. 'mongo_connection_pool_waiting:server1': 4,
  30. })
  31. })
  32. it('handles topology changes', async function () {
  33. Metrics.mongodb.monitor(this.mongoClient)
  34. let metrics = await getMetrics()
  35. expect(metrics).to.deep.equal({
  36. 'mongo_connection_pool_max:server1': 10,
  37. 'mongo_connection_pool_size:server1': 8,
  38. 'mongo_connection_pool_available:server1': 2,
  39. 'mongo_connection_pool_waiting:server1': 4,
  40. })
  41. // Add a server
  42. this.servers.set('server2', this.servers.get('server1'))
  43. metrics = await getMetrics()
  44. expect(metrics).to.deep.equal({
  45. 'mongo_connection_pool_max:server1': 10,
  46. 'mongo_connection_pool_size:server1': 8,
  47. 'mongo_connection_pool_available:server1': 2,
  48. 'mongo_connection_pool_waiting:server1': 4,
  49. 'mongo_connection_pool_max:server2': 10,
  50. 'mongo_connection_pool_size:server2': 8,
  51. 'mongo_connection_pool_available:server2': 2,
  52. 'mongo_connection_pool_waiting:server2': 4,
  53. })
  54. // Delete a server
  55. this.servers.delete('server1')
  56. metrics = await getMetrics()
  57. expect(metrics).to.deep.equal({
  58. 'mongo_connection_pool_max:server2': 10,
  59. 'mongo_connection_pool_size:server2': 8,
  60. 'mongo_connection_pool_available:server2': 2,
  61. 'mongo_connection_pool_waiting:server2': 4,
  62. })
  63. // Delete another server
  64. this.servers.delete('server2')
  65. metrics = await getMetrics()
  66. expect(metrics).to.deep.equal({})
  67. })
  68. })
  69. async function getMetrics() {
  70. const metrics = await prom.register.getMetricsAsJSON()
  71. const result = {}
  72. for (const metric of metrics) {
  73. for (const value of metric.values) {
  74. const key = `${metric.name}:${value.labels.mongo_server}`
  75. result[key] = value.value
  76. }
  77. }
  78. return result
  79. }