diff --git a/core/base-service/base.spec.js b/core/base-service/base.spec.js index ccf8d785b70601effdb1d465f149d569cf509ddd..215be308db2b94bc72dfeead11bbf16fb59416ea 100644 --- a/core/base-service/base.spec.js +++ b/core/base-service/base.spec.js @@ -519,7 +519,7 @@ describe('BaseService', function () { await serviceInstance._request({ url }) - expect(register.getSingleMetricAsString('service_response_bytes')) + expect(await register.getSingleMetricAsString('service_response_bytes')) .to.contain( 'service_response_bytes_bucket{le="65536",category="other",family="undefined",service="dummy_service_with_service_response_size_metric_enabled"} 0\n' ) @@ -545,7 +545,7 @@ describe('BaseService', function () { await serviceInstance._request({ url }) expect( - register.getSingleMetricAsString('service_response_bytes') + await register.getSingleMetricAsString('service_response_bytes') ).to.not.contain('service_response_bytes_bucket') }) }) diff --git a/core/server/influx-metrics.js b/core/server/influx-metrics.js index 46e10a4f378965f5702455c018a116d158788089..62240fc86fa0863fbb71803fe2a98e086c332f57 100644 --- a/core/server/influx-metrics.js +++ b/core/server/influx-metrics.js @@ -22,7 +22,7 @@ module.exports = class InfluxMetrics { const request = { uri: this._config.url, headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, - body: this.metrics(), + body: await this.metrics(), timeout: this._config.timeoutMillseconds, auth, } @@ -51,8 +51,8 @@ module.exports = class InfluxMetrics { ) } - metrics() { - return promClientJsonToInfluxV2(this._metricInstance.metrics(), { + async metrics() { + return promClientJsonToInfluxV2(await this._metricInstance.metrics(), { env: this._config.envLabel, application: 'shields', instance: this._instanceId, diff --git a/core/server/influx-metrics.spec.js b/core/server/influx-metrics.spec.js index f03f96f2140266bb62fb62fe75aeb3f43ca19372..4972cdd3ad376c153522fe607142413f0668f22b 100644 --- a/core/server/influx-metrics.spec.js +++ b/core/server/influx-metrics.spec.js @@ -36,7 +36,7 @@ describe('Influx metrics', function () { instanceIdEnvVarName: 'INSTANCE_ID', }) - expect(influxMetrics.metrics()).to.contain('instance=instance3') + expect(await influxMetrics.metrics()).to.contain('instance=instance3') }) it('should use a hostname as an instance label', async function () { @@ -46,7 +46,9 @@ describe('Influx metrics', function () { } const influxMetrics = new InfluxMetrics(metricInstance, customConfig) - expect(influxMetrics.metrics()).to.be.contain('instance=test-hostname') + expect(await influxMetrics.metrics()).to.be.contain( + 'instance=test-hostname' + ) }) it('should use a random string as an instance label', async function () { @@ -55,7 +57,7 @@ describe('Influx metrics', function () { } const influxMetrics = new InfluxMetrics(metricInstance, customConfig) - expect(influxMetrics.metrics()).to.be.match(/instance=\w+ /) + expect(await influxMetrics.metrics()).to.be.match(/instance=\w+ /) }) it('should use a hostname alias as an instance label', async function () { @@ -66,7 +68,7 @@ describe('Influx metrics', function () { } const influxMetrics = new InfluxMetrics(metricInstance, customConfig) - expect(influxMetrics.metrics()).to.be.contain( + expect(await influxMetrics.metrics()).to.be.contain( 'instance=test-hostname-alias' ) }) diff --git a/core/server/metrics/format-converters.js b/core/server/metrics/format-converters.js index e6ac8e2332c01cbe28806756ed76b2ab60c03923..bb3903a68422b18a307b72259ff2062a8b578012 100644 --- a/core/server/metrics/format-converters.js +++ b/core/server/metrics/format-converters.js @@ -2,26 +2,26 @@ const groupBy = require('lodash.groupby') function promClientJsonToInfluxV2(metrics, extraLabels = {}) { - // TODO Replace with Array.prototype.flatMap() after migrating to Node.js >= 11 - const flatMap = (f, arr) => arr.reduce((acc, x) => acc.concat(f(x)), []) - return flatMap(metric => { - const valuesByLabels = groupBy(metric.values, value => - JSON.stringify(Object.entries(value.labels).sort()) - ) - return Object.values(valuesByLabels).map(metricsWithSameLabel => { - const labels = Object.entries(metricsWithSameLabel[0].labels) - .concat(Object.entries(extraLabels)) - .sort((a, b) => a[0].localeCompare(b[0])) - .map(labelEntry => `${labelEntry[0]}=${labelEntry[1]}`) - .join(',') - const labelsFormatted = labels ? `,${labels}` : '' - const values = metricsWithSameLabel - .sort((a, b) => a.metricName.localeCompare(b.metricName)) - .map(value => `${value.metricName || metric.name}=${value.value}`) - .join(',') - return `prometheus${labelsFormatted} ${values}` - }) - }, metrics).join('\n') + return metrics + .flatMap(metric => { + const valuesByLabels = groupBy(metric.values, value => + JSON.stringify(Object.entries(value.labels).sort()) + ) + return Object.values(valuesByLabels).map(metricsWithSameLabel => { + const labels = Object.entries(metricsWithSameLabel[0].labels) + .concat(Object.entries(extraLabels)) + .sort((a, b) => a[0].localeCompare(b[0])) + .map(labelEntry => `${labelEntry[0]}=${labelEntry[1]}`) + .join(',') + const labelsFormatted = labels ? `,${labels}` : '' + const values = metricsWithSameLabel + .sort((a, b) => a.metricName.localeCompare(b.metricName)) + .map(value => `${value.metricName || metric.name}=${value.value}`) + .join(',') + return `prometheus${labelsFormatted} ${values}` + }) + }, metrics) + .join('\n') } module.exports = { promClientJsonToInfluxV2 } diff --git a/core/server/metrics/format-converters.spec.js b/core/server/metrics/format-converters.spec.js index eb944f27957a9360cb7b7a44c59aad04a08c4df1..f4f238142978039235a0bffe8434fa47794c3651 100644 --- a/core/server/metrics/format-converters.spec.js +++ b/core/server/metrics/format-converters.spec.js @@ -22,7 +22,7 @@ describe('Metric format converters', function () { expect(influx).to.be.equal('prometheus counter1=11') }) - it('converts a counter (from prometheus registry)', function () { + it('converts a counter (from prometheus registry)', async function () { const register = new prometheus.Registry() const counter = new prometheus.Counter({ name: 'counter1', @@ -31,7 +31,7 @@ describe('Metric format converters', function () { }) counter.inc(11) - const influx = promClientJsonToInfluxV2(register.getMetricsAsJSON()) + const influx = promClientJsonToInfluxV2(await register.getMetricsAsJSON()) expect(influx).to.be.equal('prometheus counter1=11') }) @@ -52,7 +52,7 @@ describe('Metric format converters', function () { expect(influx).to.be.equal('prometheus gauge1=20') }) - it('converts a gauge (from prometheus registry)', function () { + it('converts a gauge (from prometheus registry)', async function () { const register = new prometheus.Registry() const gauge = new prometheus.Gauge({ name: 'gauge1', @@ -61,7 +61,7 @@ describe('Metric format converters', function () { }) gauge.inc(20) - const influx = promClientJsonToInfluxV2(register.getMetricsAsJSON()) + const influx = promClientJsonToInfluxV2(await register.getMetricsAsJSON()) expect(influx).to.be.equal('prometheus gauge1=20') }) @@ -101,7 +101,7 @@ prometheus histogram1_count=3,histogram1_sum=111`) ) }) - it('converts a histogram (from prometheus registry)', function () { + it('converts a histogram (from prometheus registry)', async function () { const register = new prometheus.Registry() const histogram = new prometheus.Histogram({ name: 'histogram1', @@ -113,7 +113,7 @@ prometheus histogram1_count=3,histogram1_sum=111`) histogram.observe(10) histogram.observe(1) - const influx = promClientJsonToInfluxV2(register.getMetricsAsJSON()) + const influx = promClientJsonToInfluxV2(await register.getMetricsAsJSON()) expect(sortLines(influx)).to.be.equal( sortLines(`prometheus,le=+Inf histogram1_bucket=3 @@ -151,7 +151,7 @@ prometheus summary1_count=3,summary1_sum=111`) ) }) - it('converts a summary (from prometheus registry)', function () { + it('converts a summary (from prometheus registry)', async function () { const register = new prometheus.Registry() const summary = new prometheus.Summary({ name: 'summary1', @@ -163,7 +163,7 @@ prometheus summary1_count=3,summary1_sum=111`) summary.observe(10) summary.observe(1) - const influx = promClientJsonToInfluxV2(register.getMetricsAsJSON()) + const influx = promClientJsonToInfluxV2(await register.getMetricsAsJSON()) expect(sortLines(influx)).to.be.equal( sortLines(`prometheus,quantile=0.99 summary1=100 diff --git a/core/server/prometheus-metrics.js b/core/server/prometheus-metrics.js index e472a0232969f57ac1c71b46e749105341391fa8..1e2a5192c7a38c46c696efc7f811e8abae024013 100644 --- a/core/server/prometheus-metrics.js +++ b/core/server/prometheus-metrics.js @@ -76,9 +76,9 @@ module.exports = class PrometheusMetrics { async registerMetricsEndpoint(server) { const { register } = this - server.route(/^\/metrics$/, (data, match, end, ask) => { + server.route(/^\/metrics$/, async (data, match, end, ask) => { ask.res.setHeader('Content-Type', register.contentType) - ask.res.end(register.metrics()) + ask.res.end(await register.metrics()) }) } @@ -90,8 +90,8 @@ module.exports = class PrometheusMetrics { } } - metrics() { - return this.register.getMetricsAsJSON() + async metrics() { + return await this.register.getMetricsAsJSON() } /** diff --git a/package-lock.json b/package-lock.json index da2cceb98ffaf3d97d143a435d5d6c4460aea073..b4223d0d5de1d400640354591db537a07c3be9fd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29310,9 +29310,9 @@ "dev": true }, "prom-client": { - "version": "11.5.3", - "resolved": "https://registry.npmjs.org/prom-client/-/prom-client-11.5.3.tgz", - "integrity": "sha512-iz22FmTbtkyL2vt0MdDFY+kWof+S9UB/NACxSn2aJcewtw+EERsen0urSkZ2WrHseNdydsvcxCTAnPcSMZZv4Q==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/prom-client/-/prom-client-13.0.0.tgz", + "integrity": "sha512-M7ZNjIO6x+2R/vjSD13yjJPjpoZA8eEwH2Bp2Re0/PvzozD7azikv+SaBtZes4Q1ca/xHjZ4RSCuTag3YZLg1A==", "requires": { "tdigest": "^0.1.1" } diff --git a/package.json b/package.json index 4a63488b88244bcc5c32884018b1aeb4ad44e0df..0f6708f578ce55b272364b4cc6c938d474c9b90e 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,7 @@ "path-to-regexp": "^6.2.0", "pretty-bytes": "^5.4.1", "priorityqueuejs": "^2.0.0", - "prom-client": "^11.5.3", + "prom-client": "^13.0.0", "query-string": "^6.13.7", "request": "~2.88.2", "semver": "~7.3.4",