From 1a739397e91ad7a16e4f10a5f0af848c84b2826f Mon Sep 17 00:00:00 2001 From: Bartlomiej Obecny Date: Fri, 28 Aug 2020 01:16:49 +0200 Subject: [PATCH] chore: collection from observers when using batch observer --- .../src/BatchObserverMetric.ts | 2 +- packages/opentelemetry-metrics/src/Meter.ts | 25 +++++++++++++-- packages/opentelemetry-metrics/src/Metric.ts | 7 +++++ .../opentelemetry-metrics/src/export/types.ts | 1 + .../opentelemetry-metrics/test/Meter.test.ts | 31 +++++++++---------- 5 files changed, 46 insertions(+), 20 deletions(-) diff --git a/packages/opentelemetry-metrics/src/BatchObserverMetric.ts b/packages/opentelemetry-metrics/src/BatchObserverMetric.ts index 9b0a19a09d..241ff0813a 100644 --- a/packages/opentelemetry-metrics/src/BatchObserverMetric.ts +++ b/packages/opentelemetry-metrics/src/BatchObserverMetric.ts @@ -44,7 +44,7 @@ export class BatchObserverMetric super( name, options, - MetricKind.VALUE_OBSERVER, + MetricKind.BATCH_OBSERVER, resource, instrumentationLibrary ); diff --git a/packages/opentelemetry-metrics/src/Meter.ts b/packages/opentelemetry-metrics/src/Meter.ts index 61261fea01..d6b24b31c3 100644 --- a/packages/opentelemetry-metrics/src/Meter.ts +++ b/packages/opentelemetry-metrics/src/Meter.ts @@ -19,6 +19,7 @@ import { ConsoleLogger, InstrumentationLibrary } from '@opentelemetry/core'; import { Resource } from '@opentelemetry/resources'; import { BatchObserverMetric } from './BatchObserverMetric'; import { BaseBoundInstrument } from './BoundInstrument'; +import { MetricKind } from './export/types'; import { UpDownCounterMetric } from './UpDownCounterMetric'; import { CounterMetric } from './CounterMetric'; import { UpDownSumObserverMetric } from './UpDownSumObserverMetric'; @@ -296,9 +297,29 @@ export class Meter implements api.Meter { * meter instance. */ async collect(): Promise { - const metrics = Array.from(this._metrics.values()).map(metric => { - return metric.getMetricRecord(); + // call batch observers first + const batchObservers = Array.from(this._metrics.values()) + .filter(metric => { + return metric.getKind() === MetricKind.BATCH_OBSERVER; + }) + .map(metric => { + return metric.getMetricRecord(); + }); + await Promise.all(batchObservers).then(records => { + records.forEach(metrics => { + metrics.forEach(metric => this._batcher.process(metric)); + }); }); + + // after this all remaining metrics can be run + const metrics = Array.from(this._metrics.values()) + .filter(metric => { + return metric.getKind() !== MetricKind.BATCH_OBSERVER; + }) + .map(metric => { + return metric.getMetricRecord(); + }); + await Promise.all(metrics).then(records => { records.forEach(metrics => { metrics.forEach(metric => this._batcher.process(metric)); diff --git a/packages/opentelemetry-metrics/src/Metric.ts b/packages/opentelemetry-metrics/src/Metric.ts index 6edfc3aa92..8516ac7095 100644 --- a/packages/opentelemetry-metrics/src/Metric.ts +++ b/packages/opentelemetry-metrics/src/Metric.ts @@ -77,6 +77,13 @@ export abstract class Metric this._instruments.clear(); } + /** + * Returns kind of metric + */ + getKind(): MetricKind { + return this._kind; + } + getMetricRecord(): Promise { return new Promise(resolve => { resolve( diff --git a/packages/opentelemetry-metrics/src/export/types.ts b/packages/opentelemetry-metrics/src/export/types.ts index 99ff678047..dffb033f12 100644 --- a/packages/opentelemetry-metrics/src/export/types.ts +++ b/packages/opentelemetry-metrics/src/export/types.ts @@ -26,6 +26,7 @@ export enum MetricKind { SUM_OBSERVER, UP_DOWN_SUM_OBSERVER, VALUE_OBSERVER, + BATCH_OBSERVER, } /** The kind of aggregator. */ diff --git a/packages/opentelemetry-metrics/test/Meter.test.ts b/packages/opentelemetry-metrics/test/Meter.test.ts index 19960fcb9f..ed26ac6cc4 100644 --- a/packages/opentelemetry-metrics/test/Meter.test.ts +++ b/packages/opentelemetry-metrics/test/Meter.test.ts @@ -1230,16 +1230,13 @@ describe('Meter', () => { ); await meter.collect(); + const records = meter.getBatcher().checkPointSet(); + assert.strictEqual(records.length, 8); - const tempMetricRecords: MetricRecord[] = await tempMetric.getMetricRecord(); - const cpuUsageMetricRecords: MetricRecord[] = await cpuUsageMetric.getMetricRecord(); - assert.strictEqual(tempMetricRecords.length, 4); - assert.strictEqual(cpuUsageMetricRecords.length, 4); - - const metric1 = tempMetricRecords[0]; - const metric2 = tempMetricRecords[1]; - const metric3 = tempMetricRecords[2]; - const metric4 = tempMetricRecords[3]; + const metric1 = records[0]; + const metric2 = records[1]; + const metric3 = records[2]; + const metric4 = records[3]; assert.strictEqual(hashLabels(metric1.labels), '|#app:app1,core:1'); assert.strictEqual(hashLabels(metric2.labels), '|#app:app1,core:2'); assert.strictEqual(hashLabels(metric3.labels), '|#app:app2,core:1'); @@ -1274,14 +1271,14 @@ describe('Meter', () => { sum: 69, }); - const metric5 = cpuUsageMetricRecords[0]; - const metric6 = cpuUsageMetricRecords[1]; - const metric7 = cpuUsageMetricRecords[2]; - const metric8 = cpuUsageMetricRecords[3]; - assert.strictEqual(hashLabels(metric1.labels), '|#app:app1,core:1'); - assert.strictEqual(hashLabels(metric2.labels), '|#app:app1,core:2'); - assert.strictEqual(hashLabels(metric3.labels), '|#app:app2,core:1'); - assert.strictEqual(hashLabels(metric4.labels), '|#app:app2,core:2'); + const metric5 = records[4]; + const metric6 = records[5]; + const metric7 = records[6]; + const metric8 = records[7]; + assert.strictEqual(hashLabels(metric5.labels), '|#app:app1,core:1'); + assert.strictEqual(hashLabels(metric6.labels), '|#app:app1,core:2'); + assert.strictEqual(hashLabels(metric7.labels), '|#app:app2,core:1'); + assert.strictEqual(hashLabels(metric8.labels), '|#app:app2,core:2'); ensureMetric(metric5, 'cpu_usage_per_app', { count: 1,