Skip to content

Commit 70876ed

Browse files
author
Anuraag Agrawal
authored
Add SdkMeterProviderBuilder.buildAndRegisterGlobal (open-telemetry#2407)
1 parent c0ff748 commit 70876ed

3 files changed

Lines changed: 55 additions & 2 deletions

File tree

api/metrics/src/main/java/io/opentelemetry/api/metrics/GlobalMetricsProvider.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,16 @@ public static MeterProvider get() {
3939
return meterProvider;
4040
}
4141

42+
/**
43+
* Sets the {@link MeterProvider} that should be the global instance. Future calls to {@link
44+
* #get()} will return the provided {@link MeterProvider} instance. This should be called once as
45+
* early as possible in your application initialization logic, often in a {@code static} block in
46+
* your main class.
47+
*/
48+
public static void set(MeterProvider meterProvider) {
49+
globalMeterProvider.set(meterProvider);
50+
}
51+
4252
/**
4353
* Gets or creates a named meter instance from the globally registered {@link MeterProvider}.
4454
*

sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkMeterProviderBuilder.java

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
package io.opentelemetry.sdk.metrics;
77

8+
import io.opentelemetry.api.metrics.GlobalMetricsProvider;
89
import io.opentelemetry.sdk.common.Clock;
910
import io.opentelemetry.sdk.internal.SystemClock;
1011
import io.opentelemetry.sdk.resources.Resource;
@@ -47,9 +48,27 @@ public SdkMeterProviderBuilder setResource(@Nonnull Resource resource) {
4748
}
4849

4950
/**
50-
* Create a new TracerSdkFactory instance.
51+
* Returns a new {@link SdkMeterProvider} built with the configuration of this {@link
52+
* SdkMeterProviderBuilder} and registers it as the global {@link
53+
* io.opentelemetry.api.metrics.MeterProvider}.
5154
*
52-
* @return An initialized TracerSdkFactory.
55+
* @see GlobalMetricsProvider
56+
*/
57+
public SdkMeterProvider buildAndRegisterGlobal() {
58+
SdkMeterProvider meterProvider = build();
59+
GlobalMetricsProvider.set(meterProvider);
60+
return meterProvider;
61+
}
62+
63+
/**
64+
* Returns a new {@link SdkMeterProvider} built with the configuration of this {@link
65+
* SdkMeterProviderBuilder}. This provider is not registered as the global {@link
66+
* io.opentelemetry.api.metrics.MeterProvider}. It is recommended that you register one provider
67+
* using {@link SdkMeterProviderBuilder#buildAndRegisterGlobal()} for use by instrumentation when
68+
* that requires access to a global instance of {@link
69+
* io.opentelemetry.api.metrics.MeterProvider}.
70+
*
71+
* @see GlobalMetricsProvider
5372
*/
5473
public SdkMeterProvider build() {
5574
return new SdkMeterProvider(clock, resource);
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.sdk.metrics;
7+
8+
import static org.assertj.core.api.Assertions.assertThat;
9+
10+
import io.opentelemetry.api.metrics.GlobalMetricsProvider;
11+
import org.junit.jupiter.api.Test;
12+
13+
class SdkMeterProviderBuilderTest {
14+
15+
@Test
16+
void buildAndRegisterGlobal() {
17+
SdkMeterProvider meterProvider = SdkMeterProvider.builder().buildAndRegisterGlobal();
18+
try {
19+
assertThat(GlobalMetricsProvider.get()).isSameAs(meterProvider);
20+
} finally {
21+
GlobalMetricsProvider.set(null);
22+
}
23+
}
24+
}

0 commit comments

Comments
 (0)