From aa04fe795e785b63321f88682103c957935e01b1 Mon Sep 17 00:00:00 2001 From: Mayur Kale Date: Wed, 12 Dec 2018 17:13:21 -0800 Subject: [PATCH 1/5] Add MetricProducerManager to keep set of MetricProducer --- .../src/metrics/export/export-component.ts | 32 +++++++ .../metrics/export/metric-producer-manager.ts | 60 +++++++++++++ .../src/metrics/metric-component.ts | 52 +++++++++++ .../opencensus-core/src/metrics/metrics.ts | 20 +++-- packages/opencensus-core/src/stats/stats.ts | 8 ++ .../test/test-export-component.ts | 29 +++++++ .../test/test-metric-component.ts | 46 ++++++++++ .../test/test-metric-producer-manager.ts | 86 +++++++++++++++++++ 8 files changed, 327 insertions(+), 6 deletions(-) create mode 100644 packages/opencensus-core/src/metrics/export/export-component.ts create mode 100644 packages/opencensus-core/src/metrics/export/metric-producer-manager.ts create mode 100644 packages/opencensus-core/src/metrics/metric-component.ts create mode 100644 packages/opencensus-core/test/test-export-component.ts create mode 100644 packages/opencensus-core/test/test-metric-component.ts create mode 100644 packages/opencensus-core/test/test-metric-producer-manager.ts diff --git a/packages/opencensus-core/src/metrics/export/export-component.ts b/packages/opencensus-core/src/metrics/export/export-component.ts new file mode 100644 index 000000000..37d50f3d1 --- /dev/null +++ b/packages/opencensus-core/src/metrics/export/export-component.ts @@ -0,0 +1,32 @@ +/** + * Copyright 2018, OpenCensus Authors + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import {MetricProducerManager} from './metric-producer-manager'; + +// Class that holds the implementation instance for MetricProducerManager. +export class ExportComponent { + private static readonly METRIC_PRODUCER_MANAGER = new MetricProducerManager(); + + /** + * Returns the global MetricProducerManager which can be used to register + * handlers to export all the recorded metrics. + * + * @return {MetricProducerManager}. + */ + getMetricProducerManager(): MetricProducerManager { + return ExportComponent.METRIC_PRODUCER_MANAGER; + } +} diff --git a/packages/opencensus-core/src/metrics/export/metric-producer-manager.ts b/packages/opencensus-core/src/metrics/export/metric-producer-manager.ts new file mode 100644 index 000000000..85b264eb1 --- /dev/null +++ b/packages/opencensus-core/src/metrics/export/metric-producer-manager.ts @@ -0,0 +1,60 @@ +/** + * Copyright 2018, OpenCensus Authors + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import {validateNotNull} from '../../common/validations'; +import {MetricProducer} from '../export/metric-producer'; + +/** + * Keeps a set of MetricProducer that is used by exporters to determine the + * metrics that need to be exported. + */ +export class MetricProducerManager { + private metricProducers: Set = new Set(); + + /** + * Adds the MetricProducer to the manager if it is not already present. + * + * @param {MetricProducer} The MetricProducer to be added to the manager. + */ + add(metricProducer: MetricProducer): void { + validateNotNull(metricProducer, 'metricProducer'); + if (!this.metricProducers.has(metricProducer)) { + this.metricProducers.add(metricProducer); + } + } + + /** + * Removes the MetricProducer to the manager if it is present. + * + * @param {MetricProducer} The MetricProducer to be removed from the manager. + */ + remove(metricProducer: MetricProducer): void { + validateNotNull(metricProducer, 'metricProducer'); + this.metricProducers.delete(metricProducer); + } + + /** + * Returns all registered MetricProducers that should be exported. + * + * This method should be used by any metrics exporter that automatically + * exports data for MetricProducer registered with the MetricProducerManager. + * + * @return {MetricProducer[]} List of MetricProducers. + */ + getAllMetricProducer(): Set { + return this.metricProducers; + } +} diff --git a/packages/opencensus-core/src/metrics/metric-component.ts b/packages/opencensus-core/src/metrics/metric-component.ts new file mode 100644 index 000000000..e5d016dd8 --- /dev/null +++ b/packages/opencensus-core/src/metrics/metric-component.ts @@ -0,0 +1,52 @@ +/** + * Copyright 2018, OpenCensus Authors + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import {ExportComponent} from './export/export-component'; +import {MetricRegistry} from './metric-registry'; + +// Class that holds the implementation instance for ExportComponent. +export class MetricsComponent { + private metricRegistry: MetricRegistry; + private exportComponent: ExportComponent; + + constructor() { + this.exportComponent = new ExportComponent(); + this.metricRegistry = new MetricRegistry(); + + // Register the MetricRegistry's MetricProducer to the global + // MetricProducerManager. + this.exportComponent.getMetricProducerManager().add( + this.metricRegistry.getMetricProducer()); + } + + /** + * Returns the ExportComponent. + * + * @return {ExportComponent}. + */ + getExportComponent(): ExportComponent { + return this.exportComponent; + } + + /** + * Returns the MetricRegistry. + * + * @return {MetricRegistry}. + */ + getMetricRegistry(): MetricRegistry { + return this.metricRegistry; + } +} diff --git a/packages/opencensus-core/src/metrics/metrics.ts b/packages/opencensus-core/src/metrics/metrics.ts index 6f0e33f54..905cc56c4 100644 --- a/packages/opencensus-core/src/metrics/metrics.ts +++ b/packages/opencensus-core/src/metrics/metrics.ts @@ -14,10 +14,22 @@ * limitations under the License. */ +import {ExportComponent} from './export/export-component'; +import {MetricsComponent} from './metric-component'; import {MetricRegistry} from './metric-registry'; +// Class for accessing the default MetricsComponent. export class Metrics { - private static readonly METRIC_REGISTRY = Metrics.newMetricRegistry(); + private static readonly METRIC_COMPONENT = new MetricsComponent(); + + /** + * Returns the global ExportComponent. + * + * @return {ExportComponent}. + */ + static getExportComponent(): ExportComponent { + return Metrics.METRIC_COMPONENT.getExportComponent(); + } /** * Returns the global MetricRegistry. @@ -25,10 +37,6 @@ export class Metrics { * @return {MetricRegistry}. */ static getMetricRegistry(): MetricRegistry { - return Metrics.METRIC_REGISTRY; - } - - private static newMetricRegistry(): MetricRegistry { - return new MetricRegistry(); + return Metrics.METRIC_COMPONENT.getMetricRegistry(); } } diff --git a/packages/opencensus-core/src/stats/stats.ts b/packages/opencensus-core/src/stats/stats.ts index 89826c26e..081a52aab 100644 --- a/packages/opencensus-core/src/stats/stats.ts +++ b/packages/opencensus-core/src/stats/stats.ts @@ -36,6 +36,14 @@ export class Stats { */ constructor(logger = defaultLogger) { this.logger = logger.logger(); + + // TODO (mayurkale): Decide how to inject MetricProducerForStats. + // It should be something like below, but looks like not the right place. + + // Create a new MetricProducerForStats and register it to + // MetricProducerManager when Stats is initialized. + // const metricProducer: MetricProducer = new MetricProducerForStats(this); + // Metrics.getExportComponent().getMetricProducerManager().add(metricProducer); } /** diff --git a/packages/opencensus-core/test/test-export-component.ts b/packages/opencensus-core/test/test-export-component.ts new file mode 100644 index 000000000..ef3f960c5 --- /dev/null +++ b/packages/opencensus-core/test/test-export-component.ts @@ -0,0 +1,29 @@ +/** + * Copyright 2018, OpenCensus Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as assert from 'assert'; +import {ExportComponent} from '../src/metrics/export/export-component'; +import {MetricProducerManager} from '../src/metrics/export/metric-producer-manager'; + +describe('ExportComponent()', () => { + it('should return a MetricProducerManager instance', () => { + const exportComponent: ExportComponent = new ExportComponent(); + + assert.ok( + exportComponent.getMetricProducerManager() instanceof + MetricProducerManager); + }); +}); diff --git a/packages/opencensus-core/test/test-metric-component.ts b/packages/opencensus-core/test/test-metric-component.ts new file mode 100644 index 000000000..7013ca194 --- /dev/null +++ b/packages/opencensus-core/test/test-metric-component.ts @@ -0,0 +1,46 @@ +/** + * Copyright 2018, OpenCensus Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as assert from 'assert'; +import {ExportComponent} from '../src/metrics/export/export-component'; +import {MetricsComponent} from '../src/metrics/metric-component'; +import {MetricRegistry} from '../src/metrics/metric-registry'; + +describe('MetricsComponent()', () => { + const metricsComponent: MetricsComponent = new MetricsComponent(); + + it('should return a ExportComponent instance', () => { + assert.ok(metricsComponent.getExportComponent() instanceof ExportComponent); + }); + + it('should return a MetricRegistry instance', () => { + assert.ok(metricsComponent.getMetricRegistry() instanceof MetricRegistry); + }); + + it('should register metricRegistry to MetricProducerManger', () => { + assert.equal( + metricsComponent.getExportComponent() + .getMetricProducerManager() + .getAllMetricProducer() + .size, + 1); + assert.ok( + metricsComponent.getExportComponent() + .getMetricProducerManager() + .getAllMetricProducer() + .has(metricsComponent.getMetricRegistry().getMetricProducer())); + }); +}); diff --git a/packages/opencensus-core/test/test-metric-producer-manager.ts b/packages/opencensus-core/test/test-metric-producer-manager.ts new file mode 100644 index 000000000..e9c8ba29c --- /dev/null +++ b/packages/opencensus-core/test/test-metric-producer-manager.ts @@ -0,0 +1,86 @@ +/** + * Copyright 2018, OpenCensus Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as assert from 'assert'; +import {MetricProducerManager} from '../src/metrics/export/metric-producer-manager'; +import {MetricRegistry} from '../src/metrics/metric-registry'; + +describe('MetricProducerManager()', () => { + let instance: MetricProducerManager; + const registry: MetricRegistry = new MetricRegistry(); + const metricProducer = registry.getMetricProducer(); + const registryOther: MetricRegistry = new MetricRegistry(); + const metricProducerOther = registryOther.getMetricProducer(); + + beforeEach(() => { + instance = new MetricProducerManager(); + }); + + describe('add()', () => { + it('should throw an error when the metricproducer is null', () => { + assert.throws(() => { + instance.add(null); + }, /^Error: Missing mandatory metricProducer parameter$/); + }); + + it('add metricproducer', () => { + instance.add(metricProducer); + const metricProducerList = instance.getAllMetricProducer(); + + assert.notDeepEqual(metricProducerList, null); + assert.equal(metricProducerList.size, 1); + }); + + it('should not add same metricproducer instance', () => { + instance.add(metricProducer); + instance.add(metricProducer); + instance.add(metricProducer); + const metricProducerList = instance.getAllMetricProducer(); + + assert.equal(metricProducerList.size, 1); + assert.ok(metricProducerList.has(metricProducer)); + }); + + it('should add different metricproducer instance', () => { + instance.add(metricProducer); + instance.add(metricProducerOther); + const metricProducerList = instance.getAllMetricProducer(); + + assert.equal(metricProducerList.size, 2); + assert.ok(metricProducerList.has(metricProducer)); + assert.ok(metricProducerList.has(metricProducerOther)); + }); + }); + + describe('remove()', () => { + it('should throw an error when the metricproducer is null', () => { + assert.throws(() => { + instance.add(null); + }, /^Error: Missing mandatory metricProducer parameter$/); + }); + + it('remove metricproducer', () => { + instance.add(metricProducer); + + const metricProducerList = instance.getAllMetricProducer(); + assert.equal(metricProducerList.size, 1); + assert.ok(metricProducerList.has(metricProducer)); + + instance.remove(metricProducer); + assert.equal(metricProducerList.size, 0); + }); + }); +}); From 9a706671c82077edf86a355985216a51989463f9 Mon Sep 17 00:00:00 2001 From: Mayur Kale Date: Wed, 2 Jan 2019 15:20:57 -0800 Subject: [PATCH 2/5] fix review comments --- .../src/metrics/export/export-component.ts | 32 ----------- .../metrics/export/metric-producer-manager.ts | 9 +++ .../src/metrics/metric-component.ts | 18 +----- .../opencensus-core/src/metrics/metrics.ts | 10 ++-- packages/opencensus-core/src/stats/stats.ts | 2 +- .../test/test-export-component.ts | 29 ---------- .../test/test-metric-component.ts | 20 ++----- .../test/test-metric-producer-manager.ts | 57 ++++++++++--------- 8 files changed, 53 insertions(+), 124 deletions(-) delete mode 100644 packages/opencensus-core/src/metrics/export/export-component.ts delete mode 100644 packages/opencensus-core/test/test-export-component.ts diff --git a/packages/opencensus-core/src/metrics/export/export-component.ts b/packages/opencensus-core/src/metrics/export/export-component.ts deleted file mode 100644 index 37d50f3d1..000000000 --- a/packages/opencensus-core/src/metrics/export/export-component.ts +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Copyright 2018, OpenCensus Authors - * - * Licensed under the Apache License, Version 2.0 the "License"; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import {MetricProducerManager} from './metric-producer-manager'; - -// Class that holds the implementation instance for MetricProducerManager. -export class ExportComponent { - private static readonly METRIC_PRODUCER_MANAGER = new MetricProducerManager(); - - /** - * Returns the global MetricProducerManager which can be used to register - * handlers to export all the recorded metrics. - * - * @return {MetricProducerManager}. - */ - getMetricProducerManager(): MetricProducerManager { - return ExportComponent.METRIC_PRODUCER_MANAGER; - } -} diff --git a/packages/opencensus-core/src/metrics/export/metric-producer-manager.ts b/packages/opencensus-core/src/metrics/export/metric-producer-manager.ts index 85b264eb1..5881dc9db 100644 --- a/packages/opencensus-core/src/metrics/export/metric-producer-manager.ts +++ b/packages/opencensus-core/src/metrics/export/metric-producer-manager.ts @@ -46,6 +46,13 @@ export class MetricProducerManager { this.metricProducers.delete(metricProducer); } + /** + * Clears all MetricProducers. + */ + removeAll(): void { + this.metricProducers.clear(); + } + /** * Returns all registered MetricProducers that should be exported. * @@ -58,3 +65,5 @@ export class MetricProducerManager { return this.metricProducers; } } + +export const metricProducerManagerInstance = new MetricProducerManager(); diff --git a/packages/opencensus-core/src/metrics/metric-component.ts b/packages/opencensus-core/src/metrics/metric-component.ts index e5d016dd8..0e79970bc 100644 --- a/packages/opencensus-core/src/metrics/metric-component.ts +++ b/packages/opencensus-core/src/metrics/metric-component.ts @@ -14,31 +14,19 @@ * limitations under the License. */ -import {ExportComponent} from './export/export-component'; +import {metricProducerManagerInstance} from './export/metric-producer-manager'; import {MetricRegistry} from './metric-registry'; -// Class that holds the implementation instance for ExportComponent. +// Class that holds the implementation instance for MetricRegistry. export class MetricsComponent { private metricRegistry: MetricRegistry; - private exportComponent: ExportComponent; constructor() { - this.exportComponent = new ExportComponent(); this.metricRegistry = new MetricRegistry(); // Register the MetricRegistry's MetricProducer to the global // MetricProducerManager. - this.exportComponent.getMetricProducerManager().add( - this.metricRegistry.getMetricProducer()); - } - - /** - * Returns the ExportComponent. - * - * @return {ExportComponent}. - */ - getExportComponent(): ExportComponent { - return this.exportComponent; + metricProducerManagerInstance.add(this.metricRegistry.getMetricProducer()); } /** diff --git a/packages/opencensus-core/src/metrics/metrics.ts b/packages/opencensus-core/src/metrics/metrics.ts index 905cc56c4..d112375c4 100644 --- a/packages/opencensus-core/src/metrics/metrics.ts +++ b/packages/opencensus-core/src/metrics/metrics.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import {ExportComponent} from './export/export-component'; +import {MetricProducerManager, metricProducerManagerInstance} from './export/metric-producer-manager'; import {MetricsComponent} from './metric-component'; import {MetricRegistry} from './metric-registry'; @@ -23,12 +23,12 @@ export class Metrics { private static readonly METRIC_COMPONENT = new MetricsComponent(); /** - * Returns the global ExportComponent. + * Returns the global MetricProducerManager. * - * @return {ExportComponent}. + * @return {MetricProducerManager}. */ - static getExportComponent(): ExportComponent { - return Metrics.METRIC_COMPONENT.getExportComponent(); + static getMetricProducerManager(): MetricProducerManager { + return metricProducerManagerInstance; } /** diff --git a/packages/opencensus-core/src/stats/stats.ts b/packages/opencensus-core/src/stats/stats.ts index 081a52aab..686b2b955 100644 --- a/packages/opencensus-core/src/stats/stats.ts +++ b/packages/opencensus-core/src/stats/stats.ts @@ -43,7 +43,7 @@ export class Stats { // Create a new MetricProducerForStats and register it to // MetricProducerManager when Stats is initialized. // const metricProducer: MetricProducer = new MetricProducerForStats(this); - // Metrics.getExportComponent().getMetricProducerManager().add(metricProducer); + // Metrics.getMetricProducerManager().add(metricProducer); } /** diff --git a/packages/opencensus-core/test/test-export-component.ts b/packages/opencensus-core/test/test-export-component.ts deleted file mode 100644 index ef3f960c5..000000000 --- a/packages/opencensus-core/test/test-export-component.ts +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Copyright 2018, OpenCensus Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import * as assert from 'assert'; -import {ExportComponent} from '../src/metrics/export/export-component'; -import {MetricProducerManager} from '../src/metrics/export/metric-producer-manager'; - -describe('ExportComponent()', () => { - it('should return a MetricProducerManager instance', () => { - const exportComponent: ExportComponent = new ExportComponent(); - - assert.ok( - exportComponent.getMetricProducerManager() instanceof - MetricProducerManager); - }); -}); diff --git a/packages/opencensus-core/test/test-metric-component.ts b/packages/opencensus-core/test/test-metric-component.ts index 7013ca194..93944fe69 100644 --- a/packages/opencensus-core/test/test-metric-component.ts +++ b/packages/opencensus-core/test/test-metric-component.ts @@ -15,32 +15,20 @@ */ import * as assert from 'assert'; -import {ExportComponent} from '../src/metrics/export/export-component'; +import {metricProducerManagerInstance} from '../src/metrics/export/metric-producer-manager'; import {MetricsComponent} from '../src/metrics/metric-component'; import {MetricRegistry} from '../src/metrics/metric-registry'; describe('MetricsComponent()', () => { const metricsComponent: MetricsComponent = new MetricsComponent(); - it('should return a ExportComponent instance', () => { - assert.ok(metricsComponent.getExportComponent() instanceof ExportComponent); - }); - it('should return a MetricRegistry instance', () => { assert.ok(metricsComponent.getMetricRegistry() instanceof MetricRegistry); }); it('should register metricRegistry to MetricProducerManger', () => { - assert.equal( - metricsComponent.getExportComponent() - .getMetricProducerManager() - .getAllMetricProducer() - .size, - 1); - assert.ok( - metricsComponent.getExportComponent() - .getMetricProducerManager() - .getAllMetricProducer() - .has(metricsComponent.getMetricRegistry().getMetricProducer())); + assert.equal(metricProducerManagerInstance.getAllMetricProducer().size, 1); + assert.ok(metricProducerManagerInstance.getAllMetricProducer().has( + metricsComponent.getMetricRegistry().getMetricProducer())); }); }); diff --git a/packages/opencensus-core/test/test-metric-producer-manager.ts b/packages/opencensus-core/test/test-metric-producer-manager.ts index e9c8ba29c..2a8c594b1 100644 --- a/packages/opencensus-core/test/test-metric-producer-manager.ts +++ b/packages/opencensus-core/test/test-metric-producer-manager.ts @@ -15,71 +15,76 @@ */ import * as assert from 'assert'; -import {MetricProducerManager} from '../src/metrics/export/metric-producer-manager'; +import {metricProducerManagerInstance} from '../src/metrics/export/metric-producer-manager'; import {MetricRegistry} from '../src/metrics/metric-registry'; describe('MetricProducerManager()', () => { - let instance: MetricProducerManager; const registry: MetricRegistry = new MetricRegistry(); const metricProducer = registry.getMetricProducer(); const registryOther: MetricRegistry = new MetricRegistry(); const metricProducerOther = registryOther.getMetricProducer(); beforeEach(() => { - instance = new MetricProducerManager(); + metricProducerManagerInstance.removeAll(); }); describe('add()', () => { it('should throw an error when the metricproducer is null', () => { assert.throws(() => { - instance.add(null); + metricProducerManagerInstance.add(null); }, /^Error: Missing mandatory metricProducer parameter$/); }); it('add metricproducer', () => { - instance.add(metricProducer); - const metricProducerList = instance.getAllMetricProducer(); + metricProducerManagerInstance.add(metricProducer); + const metricProducerList = + metricProducerManagerInstance.getAllMetricProducer(); assert.notDeepEqual(metricProducerList, null); assert.equal(metricProducerList.size, 1); }); - it('should not add same metricproducer instance', () => { - instance.add(metricProducer); - instance.add(metricProducer); - instance.add(metricProducer); - const metricProducerList = instance.getAllMetricProducer(); + it('should not add same metricproducer metricProducerManagerInstance', + () => { + metricProducerManagerInstance.add(metricProducer); + metricProducerManagerInstance.add(metricProducer); + metricProducerManagerInstance.add(metricProducer); + const metricProducerList = + metricProducerManagerInstance.getAllMetricProducer(); - assert.equal(metricProducerList.size, 1); - assert.ok(metricProducerList.has(metricProducer)); - }); + assert.equal(metricProducerList.size, 1); + assert.ok(metricProducerList.has(metricProducer)); + }); - it('should add different metricproducer instance', () => { - instance.add(metricProducer); - instance.add(metricProducerOther); - const metricProducerList = instance.getAllMetricProducer(); + it('should add different metricproducer metricProducerManagerInstance', + () => { + metricProducerManagerInstance.add(metricProducer); + metricProducerManagerInstance.add(metricProducerOther); + const metricProducerList = + metricProducerManagerInstance.getAllMetricProducer(); - assert.equal(metricProducerList.size, 2); - assert.ok(metricProducerList.has(metricProducer)); - assert.ok(metricProducerList.has(metricProducerOther)); - }); + assert.equal(metricProducerList.size, 2); + assert.ok(metricProducerList.has(metricProducer)); + assert.ok(metricProducerList.has(metricProducerOther)); + }); }); describe('remove()', () => { it('should throw an error when the metricproducer is null', () => { assert.throws(() => { - instance.add(null); + metricProducerManagerInstance.add(null); }, /^Error: Missing mandatory metricProducer parameter$/); }); it('remove metricproducer', () => { - instance.add(metricProducer); + metricProducerManagerInstance.add(metricProducer); - const metricProducerList = instance.getAllMetricProducer(); + const metricProducerList = + metricProducerManagerInstance.getAllMetricProducer(); assert.equal(metricProducerList.size, 1); assert.ok(metricProducerList.has(metricProducer)); - instance.remove(metricProducer); + metricProducerManagerInstance.remove(metricProducer); assert.equal(metricProducerList.size, 0); }); }); From b232d00a5b66966294cc740ff4b62495796e2e5d Mon Sep 17 00:00:00 2001 From: Mayur Kale Date: Wed, 2 Jan 2019 16:24:39 -0800 Subject: [PATCH 3/5] fix review comments --- ...ic-producer.ts => base-metric-producer.ts} | 4 ++-- .../metrics/export/metric-producer-manager.ts | 6 ++--- .../src/metrics/export/types.ts | 24 +++++++++++++++++++ .../src/metrics/metric-registry.ts | 8 +++---- .../opencensus-core/src/metrics/metrics.ts | 4 +++- .../src/stats/metric-producer.ts | 4 ++-- 6 files changed, 38 insertions(+), 12 deletions(-) rename packages/opencensus-core/src/metrics/export/{metric-producer.ts => base-metric-producer.ts} (88%) diff --git a/packages/opencensus-core/src/metrics/export/metric-producer.ts b/packages/opencensus-core/src/metrics/export/base-metric-producer.ts similarity index 88% rename from packages/opencensus-core/src/metrics/export/metric-producer.ts rename to packages/opencensus-core/src/metrics/export/base-metric-producer.ts index af7c26f1b..87f2dbe2b 100644 --- a/packages/opencensus-core/src/metrics/export/metric-producer.ts +++ b/packages/opencensus-core/src/metrics/export/base-metric-producer.ts @@ -14,13 +14,13 @@ * limitations under the License. */ -import {Metric} from './types'; +import {Metric, MetricProducer} from './types'; /** * A MetricProducer producer that can be registered for exporting using * MetricProducerManager. */ -export abstract class MetricProducer { +export abstract class BaseMetricProducer implements MetricProducer { /** * Gets a collection of produced Metric`s to be exported. * @returns {Metric[]} List of metrics diff --git a/packages/opencensus-core/src/metrics/export/metric-producer-manager.ts b/packages/opencensus-core/src/metrics/export/metric-producer-manager.ts index 5881dc9db..0cfd5d06c 100644 --- a/packages/opencensus-core/src/metrics/export/metric-producer-manager.ts +++ b/packages/opencensus-core/src/metrics/export/metric-producer-manager.ts @@ -15,13 +15,13 @@ */ import {validateNotNull} from '../../common/validations'; -import {MetricProducer} from '../export/metric-producer'; +import {MetricProducer, MetricProducerManager} from './types'; /** * Keeps a set of MetricProducer that is used by exporters to determine the * metrics that need to be exported. */ -export class MetricProducerManager { +class BaseMetricProducerManager implements MetricProducerManager { private metricProducers: Set = new Set(); /** @@ -66,4 +66,4 @@ export class MetricProducerManager { } } -export const metricProducerManagerInstance = new MetricProducerManager(); +export const metricProducerManagerInstance = new BaseMetricProducerManager(); diff --git a/packages/opencensus-core/src/metrics/export/types.ts b/packages/opencensus-core/src/metrics/export/types.ts index e8e8a1b20..c9f0288df 100644 --- a/packages/opencensus-core/src/metrics/export/types.ts +++ b/packages/opencensus-core/src/metrics/export/types.ts @@ -326,3 +326,27 @@ export interface Timestamp { */ nanos: number|null; } + +/** + * Keeps a set of MetricProducer that is used by exporters to determine the + * metrics that need to be exported. + */ +export interface MetricProducerManager { + /** Adds the MetricProducer to the manager */ + add(metricProducer: MetricProducer): void; + /** Removes the MetricProducer to the manager */ + remove(metricProducer: MetricProducer): void; + /** Clears all MetricProducers */ + removeAll(): void; + /** Gets all registered MetricProducers that should be exported */ + getAllMetricProducer(): Set; +} + +/** + * A MetricProducer producer that can be registered for exporting using + * MetricProducerManager. + */ +export interface MetricProducer { + /** Gets a collection of produced Metric`s to be exported */ + getMetrics(): Metric[]; +} diff --git a/packages/opencensus-core/src/metrics/metric-registry.ts b/packages/opencensus-core/src/metrics/metric-registry.ts index 462a8abb6..f72f21dca 100644 --- a/packages/opencensus-core/src/metrics/metric-registry.ts +++ b/packages/opencensus-core/src/metrics/metric-registry.ts @@ -15,10 +15,10 @@ */ import {validateArrayElementsNotNull, validateNotNull} from '../common/validations'; -import {MeasureUnit} from '../stats/types'; +import {MeasureUnit,} from '../stats/types'; -import {MetricProducer} from './export/metric-producer'; -import {LabelKey, Metric, MetricDescriptorType} from './export/types'; +import {BaseMetricProducer} from './export/base-metric-producer'; +import {LabelKey, Metric, MetricDescriptorType, MetricProducer} from './export/types'; import {DerivedGauge} from './gauges/derived-gauge'; import {Gauge} from './gauges/gauge'; import {Meter} from './gauges/types'; @@ -184,7 +184,7 @@ export class MetricRegistry { * MetricProducer that is used by exporters to determine the metrics that * need to be exported. */ -class MetricProducerForRegistry extends MetricProducer { +class MetricProducerForRegistry extends BaseMetricProducer { private registeredMetrics: Map; constructor(registeredMetrics: Map) { diff --git a/packages/opencensus-core/src/metrics/metrics.ts b/packages/opencensus-core/src/metrics/metrics.ts index d112375c4..794fdd6a8 100644 --- a/packages/opencensus-core/src/metrics/metrics.ts +++ b/packages/opencensus-core/src/metrics/metrics.ts @@ -14,10 +14,12 @@ * limitations under the License. */ -import {MetricProducerManager, metricProducerManagerInstance} from './export/metric-producer-manager'; +import {metricProducerManagerInstance} from './export/metric-producer-manager'; +import {MetricProducerManager} from './export/types'; import {MetricsComponent} from './metric-component'; import {MetricRegistry} from './metric-registry'; + // Class for accessing the default MetricsComponent. export class Metrics { private static readonly METRIC_COMPONENT = new MetricsComponent(); diff --git a/packages/opencensus-core/src/stats/metric-producer.ts b/packages/opencensus-core/src/stats/metric-producer.ts index 3aed75a4c..2d539db83 100644 --- a/packages/opencensus-core/src/stats/metric-producer.ts +++ b/packages/opencensus-core/src/stats/metric-producer.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import {MetricProducer} from '../metrics/export/metric-producer'; +import {BaseMetricProducer} from '../metrics/export/base-metric-producer'; import {Metric} from '../metrics/export/types'; import {Stats} from './stats'; @@ -23,7 +23,7 @@ import {Stats} from './stats'; * A MetricProducer producer that can be registered for exporting using * MetricProducerManager. */ -export class MetricProducerForStats extends MetricProducer { +export class MetricProducerForStats extends BaseMetricProducer { private statsManager: Stats; /** From 88b833da101a0f68f349ac0359050fda04c71cd7 Mon Sep 17 00:00:00 2001 From: Mayur Kale Date: Sat, 5 Jan 2019 13:15:55 -0800 Subject: [PATCH 4/5] Fix JSDoc and change copyright 2018 -> 2019 --- .../src/metrics/export/metric-producer-manager.ts | 2 +- packages/opencensus-core/src/metrics/metric-component.ts | 6 ++++-- packages/opencensus-core/test/test-metric-component.ts | 2 +- .../opencensus-core/test/test-metric-producer-manager.ts | 2 +- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/packages/opencensus-core/src/metrics/export/metric-producer-manager.ts b/packages/opencensus-core/src/metrics/export/metric-producer-manager.ts index 0cfd5d06c..7aeda3ff3 100644 --- a/packages/opencensus-core/src/metrics/export/metric-producer-manager.ts +++ b/packages/opencensus-core/src/metrics/export/metric-producer-manager.ts @@ -1,5 +1,5 @@ /** - * Copyright 2018, OpenCensus Authors + * Copyright 2019, OpenCensus Authors * * Licensed under the Apache License, Version 2.0 the "License"; * you may not use this file except in compliance with the License. diff --git a/packages/opencensus-core/src/metrics/metric-component.ts b/packages/opencensus-core/src/metrics/metric-component.ts index 0e79970bc..a41133d02 100644 --- a/packages/opencensus-core/src/metrics/metric-component.ts +++ b/packages/opencensus-core/src/metrics/metric-component.ts @@ -1,5 +1,5 @@ /** - * Copyright 2018, OpenCensus Authors + * Copyright 2019, OpenCensus Authors * * Licensed under the Apache License, Version 2.0 the "License"; * you may not use this file except in compliance with the License. @@ -17,7 +17,9 @@ import {metricProducerManagerInstance} from './export/metric-producer-manager'; import {MetricRegistry} from './metric-registry'; -// Class that holds the implementation instance for MetricRegistry. +/** + * Class that holds the implementation instance for MetricRegistry. + */ export class MetricsComponent { private metricRegistry: MetricRegistry; diff --git a/packages/opencensus-core/test/test-metric-component.ts b/packages/opencensus-core/test/test-metric-component.ts index 93944fe69..4e47f5138 100644 --- a/packages/opencensus-core/test/test-metric-component.ts +++ b/packages/opencensus-core/test/test-metric-component.ts @@ -1,5 +1,5 @@ /** - * Copyright 2018, OpenCensus Authors + * Copyright 2019, OpenCensus Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/opencensus-core/test/test-metric-producer-manager.ts b/packages/opencensus-core/test/test-metric-producer-manager.ts index 2a8c594b1..26a7a43a0 100644 --- a/packages/opencensus-core/test/test-metric-producer-manager.ts +++ b/packages/opencensus-core/test/test-metric-producer-manager.ts @@ -1,5 +1,5 @@ /** - * Copyright 2018, OpenCensus Authors + * Copyright 2019, OpenCensus Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. From 96c5bba41b6b41ca0c561e75ecbbf2a192612d1b Mon Sep 17 00:00:00 2001 From: Mayur Kale Date: Mon, 7 Jan 2019 10:39:37 -0800 Subject: [PATCH 5/5] Fix JSDoc comments --- .../metrics/export/metric-producer-manager.ts | 2 +- packages/opencensus-core/src/metrics/metrics.ts | 17 +++++------------ 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/packages/opencensus-core/src/metrics/export/metric-producer-manager.ts b/packages/opencensus-core/src/metrics/export/metric-producer-manager.ts index 7aeda3ff3..9d45ed5b3 100644 --- a/packages/opencensus-core/src/metrics/export/metric-producer-manager.ts +++ b/packages/opencensus-core/src/metrics/export/metric-producer-manager.ts @@ -59,7 +59,7 @@ class BaseMetricProducerManager implements MetricProducerManager { * This method should be used by any metrics exporter that automatically * exports data for MetricProducer registered with the MetricProducerManager. * - * @return {MetricProducer[]} List of MetricProducers. + * @return {Set} The Set of MetricProducers. */ getAllMetricProducer(): Set { return this.metricProducers; diff --git a/packages/opencensus-core/src/metrics/metrics.ts b/packages/opencensus-core/src/metrics/metrics.ts index 794fdd6a8..d5284b33f 100644 --- a/packages/opencensus-core/src/metrics/metrics.ts +++ b/packages/opencensus-core/src/metrics/metrics.ts @@ -19,25 +19,18 @@ import {MetricProducerManager} from './export/types'; import {MetricsComponent} from './metric-component'; import {MetricRegistry} from './metric-registry'; - -// Class for accessing the default MetricsComponent. +/** + * Class for accessing the default MetricsComponent. + */ export class Metrics { private static readonly METRIC_COMPONENT = new MetricsComponent(); - /** - * Returns the global MetricProducerManager. - * - * @return {MetricProducerManager}. - */ + /** @return {MetricProducerManager} The global MetricProducerManager. */ static getMetricProducerManager(): MetricProducerManager { return metricProducerManagerInstance; } - /** - * Returns the global MetricRegistry. - * - * @return {MetricRegistry}. - */ + /** @return {MetricRegistry} The global MetricRegistry. */ static getMetricRegistry(): MetricRegistry { return Metrics.METRIC_COMPONENT.getMetricRegistry(); }