Skip to content

Commit

Permalink
feat: add prometheus exporter env vars
Browse files Browse the repository at this point in the history
Signed-off-by: naseemkullah <naseem@transit.app>
  • Loading branch information
naseemkullah committed Feb 5, 2021
1 parent 7e423a9 commit 49642fa
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 15 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -26,16 +26,17 @@ import * as url from 'url';
import { ExporterConfig } from './export/types';
import { PrometheusSerializer } from './PrometheusSerializer';
import { PrometheusLabelsBatcher } from './PrometheusLabelsBatcher';

export class PrometheusExporter implements MetricExporter {
static readonly DEFAULT_OPTIONS = {
port: 9464,
host: process.env.OTEL_EXPORTER_PROMETHEUS_HOST,
port: Number(process.env.OTEL_EXPORTER_PROMETHEUS_PORT) ?? 9464,
endpoint: '/metrics',
prefix: '',
appendTimestamp: true,
};

private readonly _logger: api.Logger;
private readonly _host?: string;
private readonly _port: number;
private readonly _endpoint: string;
private readonly _server: Server;
Expand All @@ -55,6 +56,7 @@ export class PrometheusExporter implements MetricExporter {
*/
constructor(config: ExporterConfig = {}, callback?: () => void) {
this._logger = config.logger || new api.NoopLogger();
this._host = config.host || PrometheusExporter.DEFAULT_OPTIONS.host;
this._port = config.port || PrometheusExporter.DEFAULT_OPTIONS.port;
this._prefix = config.prefix || PrometheusExporter.DEFAULT_OPTIONS.prefix;
this._appendTimestamp =
Expand All @@ -72,7 +74,9 @@ export class PrometheusExporter implements MetricExporter {
).replace(/^([^/])/, '/$1');

if (config.preventServerStart !== true) {
this.startServer().then(callback);
this.startServer()
.then(callback)
.catch(err => this._logger.error(err));
} else if (callback) {
callback();
}
Expand Down Expand Up @@ -148,12 +152,18 @@ export class PrometheusExporter implements MetricExporter {
*/
startServer(): Promise<void> {
return new Promise(resolve => {
this._server.listen(this._port, () => {
this._logger.debug(
`Prometheus exporter started on port ${this._port} at endpoint ${this._endpoint}`
);
resolve();
});
this._server.listen(
{
port: this._port,
host: this._host,
},
() => {
this._logger.debug(
`Prometheus exporter server started: ${this._host}:${this._port}/${this._endpoint}`
);
resolve();
}
);
});
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,11 @@ export interface ExporterConfig {
*/
endpoint?: string;

/**
* @default undefined (all interfaces)
*/
host?: string;

/**
* Port number for Prometheus exporter server
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,11 @@ describe('PrometheusExporter', () => {
mockAggregator(LastValueAggregator);
mockAggregator(HistogramAggregator);

afterEach(() => {
delete process.env.OTEL_EXPORTER_PROMETHEUS_HOST;
delete process.env.OTEL_EXPORTER_PROMETHEUS_PORT;
});

describe('constructor', () => {
it('should construct an exporter', done => {
const exporter = new PrometheusExporter();
Expand Down Expand Up @@ -62,7 +67,7 @@ describe('PrometheusExporter', () => {
});

describe('server', () => {
it('it should start on startServer() and call the callback', done => {
it('should start on startServer() and call the callback', done => {
const exporter = new PrometheusExporter({
port: 9722,
preventServerStart: true,
Expand All @@ -74,7 +79,7 @@ describe('PrometheusExporter', () => {
});
});

it('it should listen on the default port and default endpoint', done => {
it('should listen on the default port and default endpoint', done => {
const port = PrometheusExporter.DEFAULT_OPTIONS.port;
const endpoint = PrometheusExporter.DEFAULT_OPTIONS.endpoint;
const exporter = new PrometheusExporter({}, () => {
Expand All @@ -88,7 +93,8 @@ describe('PrometheusExporter', () => {
});
});

it('it should listen on a custom port and endpoint if provided', done => {
it('should listen on a custom host, port and endpoint if provided', done => {
const host = 'prometheus.exporter.com';
const port = 9991;
const endpoint = '/metric';

Expand All @@ -98,7 +104,7 @@ describe('PrometheusExporter', () => {
endpoint,
},
() => {
const url = `http://localhost:${port}${endpoint}`;
const url = `http://${host}:${port}${endpoint}`;
http.get(url, (res: any) => {
assert.strictEqual(res.statusCode, 200);
exporter.shutdown().then(() => {
Expand All @@ -109,7 +115,24 @@ describe('PrometheusExporter', () => {
);
});

it('it should not require endpoints to start with a slash', done => {
it('should listen on environmentally set host and port', done => {
const envSetHost = 'env-set-host';
const envSetPort = '1234';
process.env.OTEL_EXPORTER_PROMETHEUS_HOST = envSetHost;
process.env.OTEL_EXPORTER_PROMETHEUS_PORT = envSetPort;

const exporter = new PrometheusExporter({}, () => {
const url = `http://${envSetHost}:${envSetPort}/metrics`;
http.get(url, (res: any) => {
assert.strictEqual(res.statusCode, 200);
exporter.shutdown().then(() => {
return done();
});
});
});
});

it('should not require endpoints to start with a slash', done => {
const port = 9991;
const endpoint = 'metric';

Expand Down Expand Up @@ -144,7 +167,7 @@ describe('PrometheusExporter', () => {
);
});

it('it should return a HTTP status 404 if the endpoint does not match', done => {
it('should return a HTTP status 404 if the endpoint does not match', done => {
const port = 9912;
const endpoint = '/metrics';
const exporter = new PrometheusExporter(
Expand Down

0 comments on commit 49642fa

Please sign in to comment.