Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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