From 6487e5d35faa81d717cd7432f86cda3b38d89614 Mon Sep 17 00:00:00 2001 From: Tiger He Date: Mon, 27 Jul 2020 23:45:44 -0400 Subject: [PATCH 1/7] Adding support and updating tests --- .../src/monitoring.ts | 14 +++++---- .../src/transform.ts | 19 +++++++----- .../test/transform.test.ts | 31 +++++++++++++++---- 3 files changed, 44 insertions(+), 20 deletions(-) diff --git a/packages/opentelemetry-cloud-monitoring-exporter/src/monitoring.ts b/packages/opentelemetry-cloud-monitoring-exporter/src/monitoring.ts index d8391611..e819f9f5 100644 --- a/packages/opentelemetry-cloud-monitoring-exporter/src/monitoring.ts +++ b/packages/opentelemetry-cloud-monitoring-exporter/src/monitoring.ts @@ -108,7 +108,7 @@ export class MetricExporter implements IMetricExporter { const timeSeries: TimeSeries[] = []; for (const metric of metrics) { const isRegistered = await this._registerMetricDescriptor( - metric.descriptor + metric ); if (isRegistered) { timeSeries.push( @@ -150,8 +150,9 @@ export class MetricExporter implements IMetricExporter { * @param metricDescriptor The OpenTelemetry MetricDescriptor. */ private async _registerMetricDescriptor( - metricDescriptor: OTMetricDescriptor + metric: MetricRecord, ) { + const metricDescriptor = metric.descriptor const existingMetricDescriptor = this.registeredMetricDescriptors.get( metricDescriptor.name ); @@ -167,7 +168,7 @@ export class MetricExporter implements IMetricExporter { return false; } } - const isRegistered = await this._createMetricDescriptor(metricDescriptor) + const isRegistered = await this._createMetricDescriptor(metric) .then(() => { this.registeredMetricDescriptors.set( metricDescriptor.name, @@ -186,14 +187,15 @@ export class MetricExporter implements IMetricExporter { * Creates a new metric descriptor. * @param metricDescriptor The OpenTelemetry MetricDescriptor. */ - private async _createMetricDescriptor(metricDescriptor: OTMetricDescriptor) { + private async _createMetricDescriptor(metric: MetricRecord) { const authClient = await this._authorize(); const request = { name: `projects/${this._projectId}`, resource: transformMetricDescriptor( - metricDescriptor, + metric.descriptor, this._metricPrefix, - this._displayNamePrefix + this._displayNamePrefix, + metric.aggregator.toPoint() ), auth: authClient, }; diff --git a/packages/opentelemetry-cloud-monitoring-exporter/src/transform.ts b/packages/opentelemetry-cloud-monitoring-exporter/src/transform.ts index d97d9eee..170fd3e9 100644 --- a/packages/opentelemetry-cloud-monitoring-exporter/src/transform.ts +++ b/packages/opentelemetry-cloud-monitoring-exporter/src/transform.ts @@ -47,14 +47,15 @@ export const OPENTELEMETRY_TASK_VALUE_DEFAULT = generateDefaultTaskValue(); export function transformMetricDescriptor( metricDescriptor: OTMetricDescriptor, metricPrefix: string, - displayNamePrefix: string + displayNamePrefix: string, + point: OTPoint ): MetricDescriptor { return { type: transformMetricType(metricPrefix, metricDescriptor.name), description: metricDescriptor.description, displayName: transformDisplayName(displayNamePrefix, metricDescriptor.name), metricKind: transformMetricKind(metricDescriptor.metricKind), - valueType: transformValueType(metricDescriptor.valueType), + valueType: transformValueType(metricDescriptor.valueType, point), unit: metricDescriptor.unit, labels: [ { @@ -86,17 +87,18 @@ function transformMetricKind(kind: OTMetricKind): MetricKind { case OTMetricKind.UP_DOWN_COUNTER: case OTMetricKind.VALUE_OBSERVER: case OTMetricKind.UP_DOWN_SUM_OBSERVER: + case OTMetricKind.VALUE_RECORDER: return MetricKind.GAUGE; default: - // TODO: Add support for OTMetricKind.ValueRecorder - // OTMetricKind.Measure was renamed to ValueRecorder in #1117 return MetricKind.UNSPECIFIED; } } /** Transforms a OpenTelemetry ValueType to a StackDriver ValueType. */ -function transformValueType(valueType: OTValueType): ValueType { - if (valueType === OTValueType.DOUBLE) { +function transformValueType(valueType: OTValueType, point: OTPoint): ValueType { + if (isDistributionValue(point.value) || isHistogramValue(point.value)) { + return ValueType.DISTRIBUTION; + } else if (valueType === OTValueType.DOUBLE) { return ValueType.DOUBLE; } else if (valueType === OTValueType.INT) { return ValueType.INT64; @@ -115,13 +117,14 @@ export function createTimeSeries( startTime: string, projectId: string ): TimeSeries { + const point = metric.aggregator.toPoint(); return { metric: transformMetric(metric, metricPrefix), resource: transformResource(metric.resource, projectId), metricKind: transformMetricKind(metric.descriptor.metricKind), - valueType: transformValueType(metric.descriptor.valueType), + valueType: transformValueType(metric.descriptor.valueType, point), points: [ - transformPoint(metric.aggregator.toPoint(), metric.descriptor, startTime), + transformPoint(point, metric.descriptor, startTime), ], }; } diff --git a/packages/opentelemetry-cloud-monitoring-exporter/test/transform.test.ts b/packages/opentelemetry-cloud-monitoring-exporter/test/transform.test.ts index 7d178f01..a95cba97 100644 --- a/packages/opentelemetry-cloud-monitoring-exporter/test/transform.test.ts +++ b/packages/opentelemetry-cloud-monitoring-exporter/test/transform.test.ts @@ -49,6 +49,19 @@ describe('transform', () => { metricKind: OTMetricKind.OBSERVER, valueType: OTValueType.DOUBLE, }; + const point: OTPoint = { + value: 50, + timestamp: process.hrtime(), + }; + const distributionPoint: OTPoint = { + value: { + min: 0, + max: 100, + count: 5, + sum: 200, + }, + timestamp: process.hrtime(), + }; it('should return a Google Cloud Monitoring MetricKind', () => { assert.strictEqual( @@ -77,21 +90,25 @@ describe('transform', () => { ); assert.strictEqual( TEST_ONLY.transformMetricKind(OTMetricKind.VALUE_RECORDER), - MetricKind.UNSPECIFIED + MetricKind.GAUGE ); }); it('should return a Google Cloud Monitoring ValueType', () => { assert.strictEqual( - TEST_ONLY.transformValueType(OTValueType.INT), + TEST_ONLY.transformValueType(OTValueType.INT, point), ValueType.INT64 ); assert.strictEqual( - TEST_ONLY.transformValueType(OTValueType.DOUBLE), + TEST_ONLY.transformValueType(OTValueType.DOUBLE, point), ValueType.DOUBLE ); assert.strictEqual( - TEST_ONLY.transformValueType(2), + TEST_ONLY.transformValueType(OTValueType.DOUBLE, distributionPoint), + ValueType.DISTRIBUTION + ); + assert.strictEqual( + TEST_ONLY.transformValueType(2, point), ValueType.VALUE_TYPE_UNSPECIFIED ); }); @@ -117,7 +134,8 @@ describe('transform', () => { const descriptor: MetricDescriptor = transformMetricDescriptor( metricDescriptor, 'custom.googleapis.com/myorg/', - 'myorg/' + 'myorg/', + point ); assert.strictEqual(descriptor.description, METRIC_DESCRIPTION); @@ -135,7 +153,8 @@ describe('transform', () => { const descriptor: MetricDescriptor = transformMetricDescriptor( metricDescriptor1, 'custom.googleapis.com/myorg/', - 'myorg/' + 'myorg/', + point ); assert.strictEqual(descriptor.description, METRIC_DESCRIPTION); From 896dcf259e235c69f7c787569e7531f3b3403a9d Mon Sep 17 00:00:00 2001 From: Tiger He Date: Tue, 28 Jul 2020 00:13:06 -0400 Subject: [PATCH 2/7] fix lint --- .../src/monitoring.ts | 8 ++------ .../src/transform.ts | 4 +--- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/packages/opentelemetry-cloud-monitoring-exporter/src/monitoring.ts b/packages/opentelemetry-cloud-monitoring-exporter/src/monitoring.ts index e819f9f5..9bedb399 100644 --- a/packages/opentelemetry-cloud-monitoring-exporter/src/monitoring.ts +++ b/packages/opentelemetry-cloud-monitoring-exporter/src/monitoring.ts @@ -107,9 +107,7 @@ export class MetricExporter implements IMetricExporter { this._logger.debug('Google Cloud Monitoring export'); const timeSeries: TimeSeries[] = []; for (const metric of metrics) { - const isRegistered = await this._registerMetricDescriptor( - metric - ); + const isRegistered = await this._registerMetricDescriptor(metric); if (isRegistered) { timeSeries.push( createTimeSeries( @@ -149,9 +147,7 @@ export class MetricExporter implements IMetricExporter { * registered. Returns false otherwise. * @param metricDescriptor The OpenTelemetry MetricDescriptor. */ - private async _registerMetricDescriptor( - metric: MetricRecord, - ) { + private async _registerMetricDescriptor(metric: MetricRecord) { const metricDescriptor = metric.descriptor const existingMetricDescriptor = this.registeredMetricDescriptors.get( metricDescriptor.name diff --git a/packages/opentelemetry-cloud-monitoring-exporter/src/transform.ts b/packages/opentelemetry-cloud-monitoring-exporter/src/transform.ts index 170fd3e9..9951cb2b 100644 --- a/packages/opentelemetry-cloud-monitoring-exporter/src/transform.ts +++ b/packages/opentelemetry-cloud-monitoring-exporter/src/transform.ts @@ -123,9 +123,7 @@ export function createTimeSeries( resource: transformResource(metric.resource, projectId), metricKind: transformMetricKind(metric.descriptor.metricKind), valueType: transformValueType(metric.descriptor.valueType, point), - points: [ - transformPoint(point, metric.descriptor, startTime), - ], + points: [transformPoint(point, metric.descriptor, startTime)], }; } From e75daaba8ea954cf58157345c4975da318cdc44b Mon Sep 17 00:00:00 2001 From: Tiger He Date: Tue, 28 Jul 2020 11:21:14 -0400 Subject: [PATCH 3/7] gix lint --- .../opentelemetry-cloud-monitoring-exporter/src/monitoring.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/opentelemetry-cloud-monitoring-exporter/src/monitoring.ts b/packages/opentelemetry-cloud-monitoring-exporter/src/monitoring.ts index 9bedb399..e0c3c7f3 100644 --- a/packages/opentelemetry-cloud-monitoring-exporter/src/monitoring.ts +++ b/packages/opentelemetry-cloud-monitoring-exporter/src/monitoring.ts @@ -148,7 +148,7 @@ export class MetricExporter implements IMetricExporter { * @param metricDescriptor The OpenTelemetry MetricDescriptor. */ private async _registerMetricDescriptor(metric: MetricRecord) { - const metricDescriptor = metric.descriptor + const metricDescriptor = metric.descriptor; const existingMetricDescriptor = this.registeredMetricDescriptors.get( metricDescriptor.name ); From cd251b9cc5967c5522c9556702788549cdca48db Mon Sep 17 00:00:00 2001 From: Tiger He Date: Tue, 11 Aug 2020 03:00:36 -0400 Subject: [PATCH 4/7] add test for second conditional branch --- .../test/transform.test.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/packages/opentelemetry-cloud-monitoring-exporter/test/transform.test.ts b/packages/opentelemetry-cloud-monitoring-exporter/test/transform.test.ts index a95cba97..68518814 100644 --- a/packages/opentelemetry-cloud-monitoring-exporter/test/transform.test.ts +++ b/packages/opentelemetry-cloud-monitoring-exporter/test/transform.test.ts @@ -62,6 +62,17 @@ describe('transform', () => { }, timestamp: process.hrtime(), }; + const historgramPoint: OTPoint = { + value: { + buckets: { + boundaries: [5], + counts: [1,1], + }, + sum: 10, + count: 2, + }, + timestamp: process.hrtime(), + }; it('should return a Google Cloud Monitoring MetricKind', () => { assert.strictEqual( @@ -107,6 +118,10 @@ describe('transform', () => { TEST_ONLY.transformValueType(OTValueType.DOUBLE, distributionPoint), ValueType.DISTRIBUTION ); + assert.strictEqual( + TEST_ONLY.transformValueType(OTValueType.DOUBLE, historgramPoint), + ValueType.DISTRIBUTION + ); assert.strictEqual( TEST_ONLY.transformValueType(2, point), ValueType.VALUE_TYPE_UNSPECIFIED From 63f848849c389140184f359351d463fc9cef2392 Mon Sep 17 00:00:00 2001 From: Tiger He Date: Tue, 11 Aug 2020 11:10:36 -0400 Subject: [PATCH 5/7] fix lint --- .../test/transform.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/opentelemetry-cloud-monitoring-exporter/test/transform.test.ts b/packages/opentelemetry-cloud-monitoring-exporter/test/transform.test.ts index 68518814..bffec14d 100644 --- a/packages/opentelemetry-cloud-monitoring-exporter/test/transform.test.ts +++ b/packages/opentelemetry-cloud-monitoring-exporter/test/transform.test.ts @@ -66,7 +66,7 @@ describe('transform', () => { value: { buckets: { boundaries: [5], - counts: [1,1], + counts: [1, 1], }, sum: 10, count: 2, From b3a6b44168349e3e6bc2db0ce7969cdd2cd37ef2 Mon Sep 17 00:00:00 2001 From: Tiger He Date: Tue, 11 Aug 2020 14:55:53 -0400 Subject: [PATCH 6/7] add tests to fix code cov --- .../test/transform.test.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/packages/opentelemetry-cloud-monitoring-exporter/test/transform.test.ts b/packages/opentelemetry-cloud-monitoring-exporter/test/transform.test.ts index bffec14d..35ded33c 100644 --- a/packages/opentelemetry-cloud-monitoring-exporter/test/transform.test.ts +++ b/packages/opentelemetry-cloud-monitoring-exporter/test/transform.test.ts @@ -103,6 +103,10 @@ describe('transform', () => { TEST_ONLY.transformMetricKind(OTMetricKind.VALUE_RECORDER), MetricKind.GAUGE ); + assert.strictEqual( + TEST_ONLY.transformMetricKind(100), + MetricKind.UNSPECIFIED + ); }); it('should return a Google Cloud Monitoring ValueType', () => { @@ -126,6 +130,11 @@ describe('transform', () => { TEST_ONLY.transformValueType(2, point), ValueType.VALUE_TYPE_UNSPECIFIED ); + try { + TEST_ONLY.transformValueType(100, point); + } catch(err) { + assert.equal(err, `unsupported value type: 100`); + } }); it('should return a Google Cloud Monitoring DisplayName', () => { From b1e52cb3c1cdd4567c1ef6ce4392d4c581f3a181 Mon Sep 17 00:00:00 2001 From: Tiger He Date: Tue, 11 Aug 2020 14:59:57 -0400 Subject: [PATCH 7/7] fix lint --- .../test/transform.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/opentelemetry-cloud-monitoring-exporter/test/transform.test.ts b/packages/opentelemetry-cloud-monitoring-exporter/test/transform.test.ts index 35ded33c..2bb08027 100644 --- a/packages/opentelemetry-cloud-monitoring-exporter/test/transform.test.ts +++ b/packages/opentelemetry-cloud-monitoring-exporter/test/transform.test.ts @@ -132,8 +132,8 @@ describe('transform', () => { ); try { TEST_ONLY.transformValueType(100, point); - } catch(err) { - assert.equal(err, `unsupported value type: 100`); + } catch (err) { + assert.equal(err, 'unsupported value type: 100'); } });