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",