mongodb.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  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 = {
  15. on() {},
  16. topology: { s: { servers: this.servers } },
  17. }
  18. Metrics.mongodb.reset()
  19. })
  20. it('handles an unconnected client', async function () {
  21. const mongoClient = { on() {} }
  22. Metrics.mongodb.monitor(mongoClient)
  23. const metrics = await getMetrics()
  24. expect(metrics).to.deep.equal({})
  25. })
  26. it('collects Mongo metrics', async function () {
  27. Metrics.mongodb.monitor(this.mongoClient)
  28. const metrics = await getMetrics()
  29. expect(metrics).to.deep.equal({
  30. 'mongo_connection_pool_max:server1': 10,
  31. 'mongo_connection_pool_size:server1': 8,
  32. 'mongo_connection_pool_available:server1': 2,
  33. 'mongo_connection_pool_waiting:server1': 4,
  34. })
  35. })
  36. it('collects Mongo metrics with client', async function () {
  37. Metrics.mongodb.monitor(this.mongoClient, 'native')
  38. const metrics = await getMetrics()
  39. expect(metrics).to.deep.equal({
  40. 'mongo_connection_pool_max:server1:native': 10,
  41. 'mongo_connection_pool_size:server1:native': 8,
  42. 'mongo_connection_pool_available:server1:native': 2,
  43. 'mongo_connection_pool_waiting:server1:native': 4,
  44. })
  45. })
  46. it('handles topology changes', async function () {
  47. Metrics.mongodb.monitor(this.mongoClient)
  48. let metrics = await getMetrics()
  49. expect(metrics).to.deep.equal({
  50. 'mongo_connection_pool_max:server1': 10,
  51. 'mongo_connection_pool_size:server1': 8,
  52. 'mongo_connection_pool_available:server1': 2,
  53. 'mongo_connection_pool_waiting:server1': 4,
  54. })
  55. // Add a server
  56. this.servers.set('server2', this.servers.get('server1'))
  57. metrics = await getMetrics()
  58. expect(metrics).to.deep.equal({
  59. 'mongo_connection_pool_max:server1': 10,
  60. 'mongo_connection_pool_size:server1': 8,
  61. 'mongo_connection_pool_available:server1': 2,
  62. 'mongo_connection_pool_waiting:server1': 4,
  63. 'mongo_connection_pool_max:server2': 10,
  64. 'mongo_connection_pool_size:server2': 8,
  65. 'mongo_connection_pool_available:server2': 2,
  66. 'mongo_connection_pool_waiting:server2': 4,
  67. })
  68. // Delete a server
  69. this.servers.delete('server1')
  70. metrics = await getMetrics()
  71. expect(metrics).to.deep.equal({
  72. 'mongo_connection_pool_max:server2': 10,
  73. 'mongo_connection_pool_size:server2': 8,
  74. 'mongo_connection_pool_available:server2': 2,
  75. 'mongo_connection_pool_waiting:server2': 4,
  76. })
  77. // Delete another server
  78. this.servers.delete('server2')
  79. metrics = await getMetrics()
  80. expect(metrics).to.deep.equal({})
  81. })
  82. })
  83. async function getMetrics() {
  84. const metrics = await prom.register.getMetricsAsJSON()
  85. const result = {}
  86. for (const metric of metrics) {
  87. for (const value of metric.values) {
  88. let key = `${metric.name}:${value.labels.mongo_server}`
  89. if (value.labels.client) {
  90. key = `${key}:${value.labels.client}`
  91. }
  92. result[key] = value.value
  93. }
  94. }
  95. return result
  96. }