Files
shields/lib/sys/prometheus-metrics.js
Marcin Mielnicki bc4bd79e90 Metrics with Prometheus (#2069)
* Basic process metrics

* Enable Prometheus by an environment variable

* Code formatting

* Documentation for Prometheus metrics

* Link from README to documentation of Prometheus

* Link from README to documentation of Prometheus

* Link from README to documentation of Prometheus

* Separate module for metrics + tests

* Metrics limited by IP

* Metrics are forbidded for all requets by default

* Code refactoring

* allowedIps passed as a string to PrometheusMetrics

* Handle missing config

* METRICS_PROMETHEUS_ALLOWED_IPS added to documentation

* Log info about enabled metrics

* Unused code removed

* package-lock.json updated

* prom-client updated to 11.1.2

* Code refactoring

* Do not read IP address from X-Forwarder-For header
2018-11-04 18:54:43 +01:00

44 lines
1.1 KiB
JavaScript

'use strict'
const prometheus = require('prom-client')
class PrometheusMetrics {
constructor(config = {}) {
this.enabled = config.enabled || false
const matchNothing = /(?!)/
this.allowedIps = config.allowedIps
? new RegExp(config.allowedIps)
: matchNothing
if (this.enabled) {
console.log(
`Metrics are enabled. Access to /metrics resoure is limited to IP addresses matching: ${
this.allowedIps
}`
)
}
}
async initialize(server) {
if (this.enabled) {
const register = prometheus.register
prometheus.collectDefaultMetrics()
this.setRoutes(server, register)
}
}
setRoutes(server, register) {
server.route(/^\/metrics$/, (data, match, end, ask) => {
const ip = ask.req.socket.remoteAddress
if (this.allowedIps.test(ip)) {
ask.res.setHeader('Content-Type', register.contentType)
ask.res.end(register.metrics())
} else {
ask.res.statusCode = 403
ask.res.end()
}
})
}
}
module.exports = PrometheusMetrics