Skip to content

Commit 121d7a3

Browse files
committed
feat(sdk-metrics): add 'readers' constructor option, deprecate MeterProvider.addMetricReader()
1 parent 43e598e commit 121d7a3

File tree

18 files changed

+142
-106
lines changed

18 files changed

+142
-106
lines changed

CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ For experimental package changes, see the [experimental CHANGELOG](experimental/
1111

1212
### :rocket: (Enhancement)
1313

14+
* feat(sdk-metrics): add constructor option to add metric readers [#4419](https://github.com/open-telemetry/opentelemetry-js/pull/4419) @pichlermarc
15+
* deprecates `MeterProvider.addMetricReader()` please use the constructor option `readers` instead.
16+
17+
1418
### :bug: (Bug Fix)
1519

1620
* fix(sdk-trace-base): ensure attribute value length limit is enforced on span creation [#4417](https://github.com/open-telemetry/opentelemetry-js/pull/4417) @pichlermarc

experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/test/metricsHelper.ts

+6-5
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,11 @@ const testResource = new Resource({
5555
cost: 112.12,
5656
});
5757

58-
let meterProvider = new MeterProvider({ resource: testResource });
59-
6058
let reader = new TestMetricReader();
61-
meterProvider.addMetricReader(reader);
59+
let meterProvider = new MeterProvider({
60+
resource: testResource,
61+
readers: [reader],
62+
});
6263

6364
let meter = meterProvider.getMeter('default', '0.0.1');
6465

@@ -67,6 +68,7 @@ export async function collect() {
6768
}
6869

6970
export function setUp() {
71+
reader = new TestMetricReader();
7072
meterProvider = new MeterProvider({
7173
resource: testResource,
7274
views: [
@@ -75,9 +77,8 @@ export function setUp() {
7577
instrumentName: 'int-histogram',
7678
}),
7779
],
80+
readers: [reader],
7881
});
79-
reader = new TestMetricReader();
80-
meterProvider.addMetricReader(reader);
8182
meter = meterProvider.getMeter('default', '0.0.1');
8283
}
8384

experimental/packages/opentelemetry-exporter-metrics-otlp-http/test/metricsHelper.ts

+9-4
Original file line numberDiff line numberDiff line change
@@ -72,19 +72,24 @@ const defaultResource = Resource.default().merge(
7272
})
7373
);
7474

75-
let meterProvider = new MeterProvider({ resource: defaultResource });
7675
let reader = new TestMetricReader();
77-
meterProvider.addMetricReader(reader);
76+
let meterProvider = new MeterProvider({
77+
resource: defaultResource,
78+
readers: [reader],
79+
});
7880
let meter = meterProvider.getMeter('default', '0.0.1');
7981

8082
export async function collect() {
8183
return (await reader.collect())!;
8284
}
8385

8486
export function setUp(views?: View[]) {
85-
meterProvider = new MeterProvider({ resource: defaultResource, views });
8687
reader = new TestMetricReader();
87-
meterProvider.addMetricReader(reader);
88+
meterProvider = new MeterProvider({
89+
resource: defaultResource,
90+
views,
91+
readers: [reader],
92+
});
8893
meter = meterProvider.getMeter('default', '0.0.1');
8994
}
9095

experimental/packages/opentelemetry-exporter-metrics-otlp-proto/test/metricsHelper.ts

+6-5
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,11 @@ const testResource = new Resource({
5454
cost: 112.12,
5555
});
5656

57-
let meterProvider = new MeterProvider({ resource: testResource });
58-
5957
let reader = new TestMetricReader();
60-
meterProvider.addMetricReader(reader);
58+
let meterProvider = new MeterProvider({
59+
resource: testResource,
60+
readers: [reader],
61+
});
6162

6263
let meter = meterProvider.getMeter('default', '0.0.1');
6364

@@ -66,6 +67,7 @@ export async function collect() {
6667
}
6768

6869
export function setUp() {
70+
reader = new TestMetricReader();
6971
meterProvider = new MeterProvider({
7072
resource: testResource,
7173
views: [
@@ -74,9 +76,8 @@ export function setUp() {
7476
instrumentName: 'int-histogram',
7577
}),
7678
],
79+
readers: [reader],
7780
});
78-
reader = new TestMetricReader();
79-
meterProvider.addMetricReader(reader);
8081
meter = meterProvider.getMeter('default', '0.0.1');
8182
}
8283

experimental/packages/opentelemetry-exporter-prometheus/test/PrometheusExporter.test.ts

+6-4
Original file line numberDiff line numberDiff line change
@@ -261,8 +261,9 @@ describe('PrometheusExporter', () => {
261261

262262
beforeEach(done => {
263263
exporter = new PrometheusExporter({}, () => {
264-
meterProvider = new MeterProvider();
265-
meterProvider.addMetricReader(exporter);
264+
meterProvider = new MeterProvider({
265+
readers: [exporter],
266+
});
266267
meter = meterProvider.getMeter('test-prometheus', '1');
267268
done();
268269
});
@@ -533,8 +534,9 @@ describe('PrometheusExporter', () => {
533534
let exporter: PrometheusExporter;
534535

535536
function setup(reader: PrometheusExporter) {
536-
meterProvider = new MeterProvider();
537-
meterProvider.addMetricReader(reader);
537+
meterProvider = new MeterProvider({
538+
readers: [exporter],
539+
});
538540

539541
meter = meterProvider.getMeter('test-prometheus');
540542
counter = meter.createCounter('counter');

experimental/packages/opentelemetry-exporter-prometheus/test/PrometheusSerializer.test.ts

+9-9
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,8 @@ describe('PrometheusSerializer', () => {
9191
instrumentName: '*',
9292
}),
9393
],
94+
readers: [reader],
9495
});
95-
meterProvider.addMetricReader(reader);
9696
const meter = meterProvider.getMeter('test');
9797

9898
const counter = meter.createCounter('test_total');
@@ -141,8 +141,8 @@ describe('PrometheusSerializer', () => {
141141
instrumentName: '*',
142142
}),
143143
],
144+
readers: [reader],
144145
});
145-
meterProvider.addMetricReader(reader);
146146
const meter = meterProvider.getMeter('test');
147147

148148
const histogram = meter.createHistogram('test');
@@ -206,8 +206,8 @@ describe('PrometheusSerializer', () => {
206206
instrumentName: '*',
207207
}),
208208
],
209+
readers: [reader],
209210
});
210-
meterProvider.addMetricReader(reader);
211211
const meter = meterProvider.getMeter('test');
212212

213213
const counter = meter.createCounter('test_total', {
@@ -261,8 +261,8 @@ describe('PrometheusSerializer', () => {
261261
instrumentName: '*',
262262
}),
263263
],
264+
readers: [reader],
264265
});
265-
meterProvider.addMetricReader(reader);
266266
const meter = meterProvider.getMeter('test');
267267

268268
const counter = meter.createUpDownCounter('test_total', {
@@ -315,8 +315,8 @@ describe('PrometheusSerializer', () => {
315315
instrumentName: '*',
316316
}),
317317
],
318+
readers: [reader],
318319
});
319-
meterProvider.addMetricReader(reader);
320320
const meter = meterProvider.getMeter('test');
321321

322322
const counter = meter.createUpDownCounter('test_total', {
@@ -369,8 +369,8 @@ describe('PrometheusSerializer', () => {
369369
instrumentName: '*',
370370
}),
371371
],
372+
readers: [reader],
372373
});
373-
meterProvider.addMetricReader(reader);
374374
const meter = meterProvider.getMeter('test');
375375

376376
const histogram = meter.createHistogram('test', {
@@ -424,8 +424,8 @@ describe('PrometheusSerializer', () => {
424424
instrumentName: '*',
425425
}),
426426
],
427+
readers: [reader],
427428
});
428-
meterProvider.addMetricReader(reader);
429429
const meter = meterProvider.getMeter('test');
430430

431431
const upDownCounter = meter.createUpDownCounter('test', {
@@ -474,8 +474,8 @@ describe('PrometheusSerializer', () => {
474474
views: [
475475
new View({ aggregation: new SumAggregation(), instrumentName: '*' }),
476476
],
477+
readers: [reader],
477478
});
478-
meterProvider.addMetricReader(reader);
479479
const meter = meterProvider.getMeter('test');
480480

481481
const { unit, exportAll = false } = options;
@@ -563,8 +563,8 @@ describe('PrometheusSerializer', () => {
563563
views: [
564564
new View({ aggregation: new SumAggregation(), instrumentName: '*' }),
565565
],
566+
readers: [reader],
566567
});
567-
meterProvider.addMetricReader(reader);
568568
const meter = meterProvider.getMeter('test');
569569

570570
const counter = meter.createUpDownCounter(name);

experimental/packages/opentelemetry-instrumentation-http/test/functionals/http-metrics.test.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,12 @@ const protocol = 'http';
3838
const hostname = 'localhost';
3939
const pathname = '/test';
4040
const tracerProvider = new NodeTracerProvider();
41-
const meterProvider = new MeterProvider();
4241
const metricsMemoryExporter = new InMemoryMetricExporter(
4342
AggregationTemporality.DELTA
4443
);
4544
const metricReader = new TestMetricReader(metricsMemoryExporter);
45+
const meterProvider = new MeterProvider({ readers: [metricReader] });
4646

47-
meterProvider.addMetricReader(metricReader);
4847
instrumentation.setTracerProvider(tracerProvider);
4948
instrumentation.setMeterProvider(meterProvider);
5049

experimental/packages/opentelemetry-sdk-node/src/sdk.ts

+5-4
Original file line numberDiff line numberDiff line change
@@ -350,15 +350,16 @@ export class NodeSDK {
350350
}
351351

352352
if (this._meterProviderConfig) {
353+
const readers: MetricReader[] = [];
354+
if (this._meterProviderConfig.reader) {
355+
readers.push(this._meterProviderConfig.reader);
356+
}
353357
const meterProvider = new MeterProvider({
354358
resource: this._resource,
355359
views: this._meterProviderConfig?.views ?? [],
360+
readers: readers,
356361
});
357362

358-
if (this._meterProviderConfig.reader) {
359-
meterProvider.addMetricReader(this._meterProviderConfig.reader);
360-
}
361-
362363
this._meterProvider = meterProvider;
363364

364365
metrics.setGlobalMeterProvider(meterProvider);

packages/sdk-metrics/src/MeterProvider.ts

+13
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ export interface MeterProviderOptions {
3535
/** Resource associated with metric telemetry */
3636
resource?: IResource;
3737
views?: View[];
38+
readers?: MetricReader[];
3839
}
3940

4041
/**
@@ -54,6 +55,12 @@ export class MeterProvider implements IMeterProvider {
5455
this._sharedState.viewRegistry.addView(view);
5556
}
5657
}
58+
59+
if (options?.readers != null && options.readers.length > 0) {
60+
for (const metricReader of options.readers) {
61+
this.addMetricReader(metricReader);
62+
}
63+
}
5764
}
5865

5966
/**
@@ -77,7 +84,13 @@ export class MeterProvider implements IMeterProvider {
7784
* Register a {@link MetricReader} to the meter provider. After the
7885
* registration, the MetricReader can start metrics collection.
7986
*
87+
* <p> NOTE: {@link MetricReader} instances MUST be added before creating any instruments.
88+
* A {@link MetricReader} instance registered later may receive no or incomplete metric data.
89+
*
8090
* @param metricReader the metric reader to be registered.
91+
*
92+
* @deprecated This method will be removed in SDK 2.0. Please use
93+
* {@link MeterProviderOptions.readers} via the {@link MeterProvider} constructor instead
8194
*/
8295
addMetricReader(metricReader: MetricReader) {
8396
const collector = new MetricCollector(this._sharedState, metricReader);

packages/sdk-metrics/test/Instruments.test.ts

+6-5
Original file line numberDiff line numberDiff line change
@@ -751,18 +751,19 @@ describe('Instruments', () => {
751751
});
752752

753753
function setup() {
754-
const meterProvider = new MeterProvider({ resource: defaultResource });
754+
const deltaReader = new TestDeltaMetricReader();
755+
const cumulativeReader = new TestMetricReader();
756+
const meterProvider = new MeterProvider({
757+
resource: defaultResource,
758+
readers: [deltaReader, cumulativeReader],
759+
});
755760
const meter = meterProvider.getMeter(
756761
defaultInstrumentationScope.name,
757762
defaultInstrumentationScope.version,
758763
{
759764
schemaUrl: defaultInstrumentationScope.schemaUrl,
760765
}
761766
);
762-
const deltaReader = new TestDeltaMetricReader();
763-
meterProvider.addMetricReader(deltaReader);
764-
const cumulativeReader = new TestMetricReader();
765-
meterProvider.addMetricReader(cumulativeReader);
766767

767768
return {
768769
meterProvider,

0 commit comments

Comments
 (0)