diff --git a/packages/opentelemetry-exporter-prometheus/src/PrometheusExporter.ts b/packages/opentelemetry-exporter-prometheus/src/PrometheusExporter.ts index c83fcb944b..9bc14117e6 100644 --- a/packages/opentelemetry-exporter-prometheus/src/PrometheusExporter.ts +++ b/packages/opentelemetry-exporter-prometheus/src/PrometheusExporter.ts @@ -33,6 +33,7 @@ export class PrometheusExporter implements MetricExporter { port: 9464, endpoint: '/metrics', prefix: '', + appendTimestamp: true, }; private readonly _logger: api.Logger; @@ -40,6 +41,7 @@ export class PrometheusExporter implements MetricExporter { private readonly _endpoint: string; private readonly _server: Server; private readonly _prefix?: string; + private readonly _appendTimestamp: boolean; private _serializer: PrometheusSerializer; private _batcher = new PrometheusLabelsBatcher(); @@ -56,8 +58,15 @@ export class PrometheusExporter implements MetricExporter { this._logger = config.logger || new NoopLogger(); this._port = config.port || PrometheusExporter.DEFAULT_OPTIONS.port; this._prefix = config.prefix || PrometheusExporter.DEFAULT_OPTIONS.prefix; + this._appendTimestamp = + typeof config.appendTimestamp === 'boolean' + ? config.appendTimestamp + : PrometheusExporter.DEFAULT_OPTIONS.appendTimestamp; this._server = createServer(this._requestHandler); - this._serializer = new PrometheusSerializer(this._prefix); + this._serializer = new PrometheusSerializer( + this._prefix, + this._appendTimestamp + ); this._endpoint = ( config.endpoint || PrometheusExporter.DEFAULT_OPTIONS.endpoint diff --git a/packages/opentelemetry-exporter-prometheus/src/export/types.ts b/packages/opentelemetry-exporter-prometheus/src/export/types.ts index 99574d13c6..40efc413cf 100644 --- a/packages/opentelemetry-exporter-prometheus/src/export/types.ts +++ b/packages/opentelemetry-exporter-prometheus/src/export/types.ts @@ -27,6 +27,12 @@ export interface ExporterConfig { * */ prefix?: string; + /** + * Append timestamp to metrics + * @default true + */ + appendTimestamp?: boolean; + /** * Endpoint the metrics should be exposed at with preceding slash * @default '/metrics' diff --git a/packages/opentelemetry-exporter-prometheus/test/PrometheusExporter.test.ts b/packages/opentelemetry-exporter-prometheus/test/PrometheusExporter.test.ts index a10e58d02b..28da5cf48f 100644 --- a/packages/opentelemetry-exporter-prometheus/test/PrometheusExporter.test.ts +++ b/packages/opentelemetry-exporter-prometheus/test/PrometheusExporter.test.ts @@ -660,6 +660,36 @@ describe('PrometheusExporter', () => { } ); }); + + it('should export a metric without timestamp', done => { + exporter = new PrometheusExporter( + { + appendTimestamp: false, + }, + async () => { + await meter.collect(); + exporter!.export(meter.getProcessor().checkPointSet(), () => { + http + .get('http://localhost:9464/metrics', res => { + res.on('data', chunk => { + const body = chunk.toString(); + const lines = body.split('\n'); + + assert.deepStrictEqual(lines, [ + '# HELP counter description missing', + '# TYPE counter counter', + 'counter{key1="labelValue1"} 10', + '', + ]); + + done(); + }); + }) + .on('error', errorHandler(done)); + }); + } + ); + }); }); });