Skip to content
3 changes: 3 additions & 0 deletions api/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@ All notable changes to this project will be documented in this file.

### :boom: Breaking Change

* feat(api) Add delegating no-op meter provider [#4858](https://github.com/open-telemetry/opentelemetry-js/pull/4858) @hectorhdzg
* Proxy meters now upgrade previously created instruments and batch callbacks once an SDK registers, mirroring the behavior of the tracing and logging APIs.

### :rocket: (Enhancement)

* feat(api): improve isValidSpanId, isValidTraceId performance [#5714](https://github.com/open-telemetry/opentelemetry-js/pull/5714) @seemk
Expand Down
17 changes: 14 additions & 3 deletions api/src/api/metrics.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,13 @@

import { Meter, MeterOptions } from '../metrics/Meter';
import { MeterProvider } from '../metrics/MeterProvider';
import { NOOP_METER_PROVIDER } from '../metrics/NoopMeterProvider';
import {
getGlobal,
registerGlobal,
unregisterGlobal,
} from '../internal/global-utils';
import { DiagAPI } from './diag';
import { ProxyMeterProvider } from '../metrics/ProxyMeterProvider';

const API_NAME = 'metrics';

Expand All @@ -32,6 +32,8 @@ const API_NAME = 'metrics';
export class MetricsAPI {
private static _instance?: MetricsAPI;

private _proxyMeterProvider = new ProxyMeterProvider();

/** Empty private constructor prevents end users from constructing a new instance of the API */
private constructor() {}

Expand All @@ -49,14 +51,22 @@ export class MetricsAPI {
* Returns true if the meter provider was successfully registered, else false.
*/
public setGlobalMeterProvider(provider: MeterProvider): boolean {
return registerGlobal(API_NAME, provider, DiagAPI.instance());
const success = registerGlobal(
API_NAME,
this._proxyMeterProvider,
DiagAPI.instance()
);
if (success) {
this._proxyMeterProvider.setDelegate(provider);
}
return success;
}

/**
* Returns the global meter provider.
*/
public getMeterProvider(): MeterProvider {
return getGlobal(API_NAME) || NOOP_METER_PROVIDER;
return getGlobal(API_NAME) || this._proxyMeterProvider;
}

/**
Expand All @@ -73,5 +83,6 @@ export class MetricsAPI {
/** Remove the global meter provider */
public disable(): void {
unregisterGlobal(API_NAME, DiagAPI.instance());
this._proxyMeterProvider = new ProxyMeterProvider();
}
}
1 change: 1 addition & 0 deletions api/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ export type {
export type { DiagAPI } from './api/diag';

// Metrics APIs
export { ProxyMeterProvider } from './metrics/ProxyMeterProvider';
export { createNoopMeter } from './metrics/NoopMeter';
export type { MeterOptions, Meter } from './metrics/Meter';
export type { MeterProvider } from './metrics/MeterProvider';
Expand Down
Loading
Loading