From f5f3b701032cd289e503da7d20a95019d4b1c334 Mon Sep 17 00:00:00 2001 From: Paul Fairless Date: Fri, 14 Aug 2020 13:48:12 +0100 Subject: [PATCH 1/3] feat: add prom export for VALUE_RECORDER, SUM_OBSERVER & UP_DOWN_SUM_OBSERVER --- .../src/prometheus.ts | 9 +- .../test/prometheus.test.ts | 116 +++++++++++++++++- 2 files changed, 121 insertions(+), 4 deletions(-) diff --git a/packages/opentelemetry-exporter-prometheus/src/prometheus.ts b/packages/opentelemetry-exporter-prometheus/src/prometheus.ts index af0c551dba..e58499c40b 100644 --- a/packages/opentelemetry-exporter-prometheus/src/prometheus.ts +++ b/packages/opentelemetry-exporter-prometheus/src/prometheus.ts @@ -208,9 +208,12 @@ export class PrometheusExporter implements MetricExporter { return new Counter(metricObject); case MetricKind.UP_DOWN_COUNTER: return new Gauge(metricObject); - // case MetricKind.VALUE_RECORDER: - // case MetricKind.SUM_OBSERVER: - // case MetricKind.UP_DOWN_SUM_OBSERVER: + case MetricKind.VALUE_RECORDER: + return new Gauge(metricObject); + case MetricKind.SUM_OBSERVER: + return new Counter(metricObject); + case MetricKind.UP_DOWN_SUM_OBSERVER: + return new Gauge(metricObject); case MetricKind.VALUE_OBSERVER: return new Gauge(metricObject); default: diff --git a/packages/opentelemetry-exporter-prometheus/test/prometheus.test.ts b/packages/opentelemetry-exporter-prometheus/test/prometheus.test.ts index 12acad6669..9ff530cea0 100644 --- a/packages/opentelemetry-exporter-prometheus/test/prometheus.test.ts +++ b/packages/opentelemetry-exporter-prometheus/test/prometheus.test.ts @@ -417,7 +417,121 @@ describe('PrometheusExporter', () => { }); }); }); - }); + + it('should export a SumObserver as a counter', done => { + function getValue() { + return 20; + } + + meter.createSumObserver('sum_observer', { + description: 'a test description', + }, + (observerResult: ObserverResult) => { + observerResult.observe(getValue(), { + key1: "labelValue1", + }) + }); + + meter.collect().then(() => { + exporter.export(meter.getBatcher().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 sum_observer a test description', + '# TYPE sum_observer counter', + `sum_observer{key1="labelValue1"} 20 ${mockedTimeMS}`, + '', + ]); + }); + + done(); + }) + .on('error', errorHandler(done)); + }); + }); + }); + + it('should export a UpDownSumObserver as a gauge', done => { + function getValue() { + return 20; + } + + meter.createUpDownSumObserver('updown_observer', { + description: 'a test description', + }, + (observerResult: ObserverResult) => { + observerResult.observe(getValue(), { + key1: "labelValue1", + }) + }); + + meter.collect().then(() => { + exporter.export(meter.getBatcher().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 updown_observer a test description', + '# TYPE updown_observer gauge', + 'updown_observer{key1="labelValue1"} 20', + '', + ]); + }); + + done(); + }) + .on('error', errorHandler(done)); + }); + }); + }); + + it('should export a ValueRecorder as a guage', done => { + + const valueRecorder = meter.createValueRecorder('value_recorder', { + description: 'a test description', + }); + + valueRecorder.bind({ key1: 'labelValue1' }).record(20); + + + meter.collect().then(() => { + exporter.export(meter.getBatcher().checkPointSet(), () => { + http + .get('http://localhost:9464/metrics', res => { + res.on('data', chunk => { + + const body = chunk.toString(); + const lines = body.split('\n'); + + assert.strictEqual( + lines[0], + '# HELP value_recorder a test description' + ); + assert.strictEqual(lines[1], '# TYPE value_recorder gauge'); + + const line3 = lines[2].split(' '); + assert.strictEqual( + line3[0], + 'value_recorder{key1="labelValue1"}' + ); + assert.equal(line3[1], 20); + + done(); + }); + }) + .on('error', errorHandler(done)); + }); + }); + }); + + }); describe('configuration', () => { let meter: Meter; From 2c5626c7ef135ec2fd0c517a3f6dd77b52b2c805 Mon Sep 17 00:00:00 2001 From: Paul Fairless Date: Fri, 14 Aug 2020 14:37:02 +0100 Subject: [PATCH 2/3] fix: linting for prometheus.test --- .../test/prometheus.test.ts | 140 +++++++++--------- 1 file changed, 71 insertions(+), 69 deletions(-) diff --git a/packages/opentelemetry-exporter-prometheus/test/prometheus.test.ts b/packages/opentelemetry-exporter-prometheus/test/prometheus.test.ts index 9ff530cea0..5ec35e7d2a 100644 --- a/packages/opentelemetry-exporter-prometheus/test/prometheus.test.ts +++ b/packages/opentelemetry-exporter-prometheus/test/prometheus.test.ts @@ -423,34 +423,37 @@ describe('PrometheusExporter', () => { return 20; } - meter.createSumObserver('sum_observer', { - description: 'a test description', - }, - (observerResult: ObserverResult) => { - observerResult.observe(getValue(), { - key1: "labelValue1", - }) - }); + meter.createSumObserver( + 'sum_observer', + { + description: 'a test description', + }, + (observerResult: ObserverResult) => { + observerResult.observe(getValue(), { + key1: 'labelValue1', + }); + } + ); meter.collect().then(() => { exporter.export(meter.getBatcher().checkPointSet(), () => { http - .get('http://localhost:9464/metrics', res => { - res.on('data', chunk => { - const body = chunk.toString(); - const lines = body.split('\n'); + .get('http://localhost:9464/metrics', res => { + res.on('data', chunk => { + const body = chunk.toString(); + const lines = body.split('\n'); - assert.deepStrictEqual(lines, [ - '# HELP sum_observer a test description', - '# TYPE sum_observer counter', - `sum_observer{key1="labelValue1"} 20 ${mockedTimeMS}`, - '', - ]); - }); + assert.deepStrictEqual(lines, [ + '# HELP sum_observer a test description', + '# TYPE sum_observer counter', + `sum_observer{key1="labelValue1"} 20 ${mockedTimeMS}`, + '', + ]); + }); - done(); - }) - .on('error', errorHandler(done)); + done(); + }) + .on('error', errorHandler(done)); }); }); }); @@ -460,78 +463,77 @@ describe('PrometheusExporter', () => { return 20; } - meter.createUpDownSumObserver('updown_observer', { - description: 'a test description', - }, - (observerResult: ObserverResult) => { - observerResult.observe(getValue(), { - key1: "labelValue1", - }) - }); + meter.createUpDownSumObserver( + 'updown_observer', + { + description: 'a test description', + }, + (observerResult: ObserverResult) => { + observerResult.observe(getValue(), { + key1: 'labelValue1', + }); + } + ); meter.collect().then(() => { exporter.export(meter.getBatcher().checkPointSet(), () => { http - .get('http://localhost:9464/metrics', res => { - res.on('data', chunk => { - const body = chunk.toString(); - const lines = body.split('\n'); + .get('http://localhost:9464/metrics', res => { + res.on('data', chunk => { + const body = chunk.toString(); + const lines = body.split('\n'); - assert.deepStrictEqual(lines, [ - '# HELP updown_observer a test description', - '# TYPE updown_observer gauge', - 'updown_observer{key1="labelValue1"} 20', - '', - ]); - }); + assert.deepStrictEqual(lines, [ + '# HELP updown_observer a test description', + '# TYPE updown_observer gauge', + 'updown_observer{key1="labelValue1"} 20', + '', + ]); + }); - done(); - }) - .on('error', errorHandler(done)); + done(); + }) + .on('error', errorHandler(done)); }); }); }); it('should export a ValueRecorder as a guage', done => { - const valueRecorder = meter.createValueRecorder('value_recorder', { - description: 'a test description', + description: 'a test description', }); valueRecorder.bind({ key1: 'labelValue1' }).record(20); - meter.collect().then(() => { exporter.export(meter.getBatcher().checkPointSet(), () => { http - .get('http://localhost:9464/metrics', res => { - res.on('data', chunk => { - - const body = chunk.toString(); - const lines = body.split('\n'); + .get('http://localhost:9464/metrics', res => { + res.on('data', chunk => { + const body = chunk.toString(); + const lines = body.split('\n'); - assert.strictEqual( - lines[0], - '# HELP value_recorder a test description' - ); - assert.strictEqual(lines[1], '# TYPE value_recorder gauge'); + assert.strictEqual( + lines[0], + '# HELP value_recorder a test description' + ); + assert.strictEqual(lines[1], '# TYPE value_recorder gauge'); - const line3 = lines[2].split(' '); - assert.strictEqual( - line3[0], - 'value_recorder{key1="labelValue1"}' - ); - assert.equal(line3[1], 20); + const line3 = lines[2].split(' '); + assert.strictEqual( + line3[0], + 'value_recorder{key1="labelValue1"}' + ); + assert.equal(line3[1], 20); - done(); - }); - }) - .on('error', errorHandler(done)); + done(); + }); + }) + .on('error', errorHandler(done)); }); }); }); - - }); + }); describe('configuration', () => { let meter: Meter; From 298d68bc880ef6807c7139d8a2add918c4a61fef Mon Sep 17 00:00:00 2001 From: Paul Fairless Date: Fri, 14 Aug 2020 14:49:29 +0100 Subject: [PATCH 3/3] fix typo in test --- .../opentelemetry-exporter-prometheus/test/prometheus.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/opentelemetry-exporter-prometheus/test/prometheus.test.ts b/packages/opentelemetry-exporter-prometheus/test/prometheus.test.ts index 5ec35e7d2a..1091ac0482 100644 --- a/packages/opentelemetry-exporter-prometheus/test/prometheus.test.ts +++ b/packages/opentelemetry-exporter-prometheus/test/prometheus.test.ts @@ -498,7 +498,7 @@ describe('PrometheusExporter', () => { }); }); - it('should export a ValueRecorder as a guage', done => { + it('should export a ValueRecorder as a gauge', done => { const valueRecorder = meter.createValueRecorder('value_recorder', { description: 'a test description', });