mirror of https://github.com/calzoneman/sync.git
53 lines
1.5 KiB
JavaScript
53 lines
1.5 KiB
JavaScript
import http from 'http';
|
|
import { register, collectDefaultMetrics } from 'prom-client';
|
|
import { parse as parseURL } from 'url';
|
|
|
|
const LOGGER = require('@calzoneman/jsli')('prometheus-server');
|
|
|
|
let server = null;
|
|
let defaultMetricsTimer = null;
|
|
|
|
export function init(prometheusConfig) {
|
|
if (server !== null) {
|
|
LOGGER.error('init() called but server is already initialized! %s',
|
|
new Error().stack);
|
|
return;
|
|
}
|
|
|
|
defaultMetricsTimer = collectDefaultMetrics();
|
|
|
|
server = http.createServer((req, res) => {
|
|
if (req.method !== 'GET'
|
|
|| parseURL(req.url).pathname !== prometheusConfig.getPath()) {
|
|
res.writeHead(400, { 'Content-Type': 'text/plain' });
|
|
res.end('Bad Request');
|
|
return;
|
|
}
|
|
|
|
res.writeHead(200, {
|
|
'Content-Type': register.contentType
|
|
});
|
|
res.end(register.metrics());
|
|
});
|
|
|
|
server.on('error', error => {
|
|
LOGGER.error('Server error: %s', error.stack);
|
|
});
|
|
|
|
server.once('listening', () => {
|
|
LOGGER.info('Prometheus metrics reporter listening on %s:%s',
|
|
prometheusConfig.getHost(),
|
|
prometheusConfig.getPort());
|
|
});
|
|
|
|
server.listen(prometheusConfig.getPort(), prometheusConfig.getHost());
|
|
return { once: server.once.bind(server) };
|
|
}
|
|
|
|
export function shutdown() {
|
|
server.close();
|
|
server = null;
|
|
clearInterval(defaultMetricsTimer);
|
|
defaultMetricsTimer = null;
|
|
}
|