File tree Expand file tree Collapse file tree 3 files changed +37
-2
lines changed
apm-agent-plugins/apm-opentelemetry/apm-opentelemetry-embedded-metrics-sdk/src
main/java/co/elastic/apm/agent/embeddedotel
test/java/co/elastic/apm/agent/embeddedotel Expand file tree Collapse file tree 3 files changed +37
-2
lines changed Original file line number Diff line number Diff line change @@ -31,6 +31,10 @@ Use subheadings with the "=====" level for adding notes for unreleased changes:
31
31
32
32
=== Unreleased
33
33
34
+ [float]
35
+ ===== Bug fixes
36
+ * Prevent NPE in OpenTelemetry metrics bridge in case of asynchronous agent start - {pull}3880[#3880]
37
+
34
38
[[release-notes-1.x]]
35
39
=== Java Agent version 1.x
36
40
Original file line number Diff line number Diff line change 18
18
*/
19
19
package co .elastic .apm .agent .embeddedotel ;
20
20
21
- import co .elastic .apm .agent .tracer .AbstractLifecycleListener ;
22
21
import co .elastic .apm .agent .embeddedotel .proxy .ProxyMeterProvider ;
23
22
import co .elastic .apm .agent .sdk .logging .Logger ;
24
23
import co .elastic .apm .agent .sdk .logging .LoggerFactory ;
24
+ import co .elastic .apm .agent .tracer .AbstractLifecycleListener ;
25
25
import co .elastic .apm .agent .tracer .Tracer ;
26
+ import io .opentelemetry .api .metrics .MeterProvider ;
26
27
import io .opentelemetry .sdk .metrics .SdkMeterProvider ;
27
28
import io .opentelemetry .sdk .metrics .SdkMeterProviderBuilder ;
28
29
@@ -65,6 +66,10 @@ public ProxyMeterProvider getMeterProvider() {
65
66
if (sdkInstance == null ) {
66
67
startSdk ();
67
68
}
69
+ if (sdkInstance == null ) {
70
+ logger .warn ("Returning NoOp-MeterProvider because OpenTelemetry metrics SDK could not be initialized!" );
71
+ return new ProxyMeterProvider (MeterProvider .noop ());
72
+ }
68
73
return new ProxyMeterProvider (sdkInstance );
69
74
}
70
75
@@ -78,7 +83,11 @@ synchronized void reset() {
78
83
}
79
84
80
85
private synchronized void startSdk () {
81
- if (isShutdown || sdkInstance != null || tracer == null ) {
86
+ if (isShutdown || sdkInstance != null ) {
87
+ return ;
88
+ }
89
+ if (tracer == null ) {
90
+ logger .warn ("Cannot initialize OpenTelemetry metrics SDK because tracer has not started yet" );
82
91
return ;
83
92
}
84
93
logger .debug ("Starting embedded OpenTelemetry metrics SDK" );
Original file line number Diff line number Diff line change
1
+ package co .elastic .apm .agent .embeddedotel ;
2
+
3
+ import co .elastic .apm .agent .embeddedotel .proxy .ProxyMeter ;
4
+ import co .elastic .apm .agent .tracer .Tracer ;
5
+ import org .junit .jupiter .api .Test ;
6
+
7
+ import static org .assertj .core .api .Assertions .assertThat ;
8
+
9
+ public class EmbeddedSdkManagerTest {
10
+
11
+ /**
12
+ * The instrumentation of the agent is performed before {@link EmbeddedSdkManager#init(Tracer)} is invoked.
13
+ * This means if the agent is started asynchronously, it can happen that {@link EmbeddedSdkManager#getMeterProvider()}
14
+ * is invoked before the tracer has been provided.
15
+ * This test verifies that in that case no exception occurs and a noop-meter implementation is used.
16
+ */
17
+ @ Test
18
+ public void ensureNoExceptionOnMissingTracer () throws Exception {
19
+ ProxyMeter meter = new EmbeddedSdkManager ().getMeterProvider ().get ("foobar" );
20
+ assertThat (meter .getDelegate ()).isInstanceOf (Class .forName ("io.opentelemetry.api.metrics.DefaultMeter" ));
21
+ }
22
+ }
You can’t perform that action at this time.
0 commit comments