Skip to content

Commit a40988e

Browse files
authored
OpenTelemetry metrics exporter instrumentation breaks with instrument=false (#3326)
* OpenTelemetry metrics exporter instrumentation should be enabled even with instrument=false * Added changelog * Reproduce failure in tests
1 parent e968cf3 commit a40988e

File tree

3 files changed

+49
-5
lines changed

3 files changed

+49
-5
lines changed

CHANGELOG.asciidoc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ Use subheadings with the "=====" level for adding notes for unreleased changes:
4747
* Fix micrometer histogram serialization - {pull}3290[#3290], {pull}3304[#3304]
4848
* Fix transactions not being correctly handled in certain edge cases - {pull}3294[#3294]
4949
* Fixed JDBC instrumentation for DB2 - {pull}3313[#3313]
50+
* Fixed OpenTelemetry metrics export breaking when `instrument=false` is configured - {pull}3326[#3326]
5051
5152
[[release-notes-1.x]]
5253
=== Java Agent version 1.x

apm-agent-plugins/apm-opentelemetry/apm-opentelemetry-metricsdk-plugin/src/main/java/co/elastic/apm/agent/otelmetricsdk/SdkMeterProviderBuilderInstrumentation.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,13 @@
1919
package co.elastic.apm.agent.otelmetricsdk;
2020

2121
import co.elastic.apm.agent.impl.ElasticApmTracer;
22-
import co.elastic.apm.agent.tracer.GlobalTracer;
2322
import co.elastic.apm.agent.sdk.ElasticApmInstrumentation;
23+
import co.elastic.apm.agent.sdk.internal.util.LoggerUtils;
2424
import co.elastic.apm.agent.sdk.logging.Logger;
2525
import co.elastic.apm.agent.sdk.logging.LoggerFactory;
2626
import co.elastic.apm.agent.sdk.weakconcurrent.WeakConcurrent;
2727
import co.elastic.apm.agent.sdk.weakconcurrent.WeakSet;
28-
import co.elastic.apm.agent.sdk.internal.util.LoggerUtils;
28+
import co.elastic.apm.agent.tracer.GlobalTracer;
2929
import io.opentelemetry.sdk.metrics.SdkMeterProviderBuilder;
3030
import io.opentelemetry.sdk.metrics.export.MetricExporter;
3131
import net.bytebuddy.asm.Advice;
@@ -55,6 +55,11 @@ public Collection<String> getInstrumentationGroupNames() {
5555
return Arrays.asList("opentelemetry", "opentelemetry-metrics", "experimental");
5656
}
5757

58+
@Override
59+
public final boolean includeWhenInstrumentationIsDisabled() {
60+
return true;
61+
}
62+
5863
@Override
5964
public String getAdviceClassName() {
6065
return getClass().getName() + "$SdkMeterProviderBuilderAdvice";

apm-agent-plugins/apm-opentelemetry/apm-opentelemetry-metricsdk-plugin/src/test/java/co/elastic/apm/agent/otelmetricsdk/AbstractOtelMetricsTest.java

Lines changed: 41 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,14 @@
1818
*/
1919
package co.elastic.apm.agent.otelmetricsdk;
2020

21-
import co.elastic.apm.agent.AbstractInstrumentationTest;
21+
import co.elastic.apm.agent.MockReporter;
22+
import co.elastic.apm.agent.MockTracer;
23+
import co.elastic.apm.agent.bci.ElasticApmAgent;
2224
import co.elastic.apm.agent.common.util.WildcardMatcher;
25+
import co.elastic.apm.agent.configuration.CoreConfiguration;
2326
import co.elastic.apm.agent.configuration.MetricsConfiguration;
27+
import co.elastic.apm.agent.configuration.SpyConfiguration;
28+
import co.elastic.apm.agent.impl.ElasticApmTracer;
2429
import co.elastic.apm.agent.report.ReporterConfiguration;
2530
import co.elastic.apm.agent.util.AtomicDouble;
2631
import io.opentelemetry.api.common.Attributes;
@@ -41,8 +46,13 @@
4146
import io.opentelemetry.api.metrics.ObservableLongGauge;
4247
import io.opentelemetry.api.metrics.ObservableLongMeasurement;
4348
import io.opentelemetry.api.metrics.ObservableLongUpDownCounter;
49+
import net.bytebuddy.agent.ByteBuddyAgent;
50+
import org.junit.AfterClass;
51+
import org.junit.jupiter.api.AfterAll;
52+
import org.junit.jupiter.api.BeforeAll;
4453
import org.junit.jupiter.api.BeforeEach;
4554
import org.junit.jupiter.api.Test;
55+
import org.stagemonitor.configuration.ConfigurationRegistry;
4656

4757
import javax.annotation.Nullable;
4858
import java.time.Instant;
@@ -63,7 +73,12 @@
6373
import static io.opentelemetry.api.common.AttributeKey.stringKey;
6474
import static org.mockito.Mockito.doReturn;
6575

66-
public abstract class AbstractOtelMetricsTest extends AbstractInstrumentationTest {
76+
public abstract class AbstractOtelMetricsTest {
77+
78+
protected static ElasticApmTracer tracer;
79+
protected static MockReporter reporter;
80+
protected static ConfigurationRegistry config;
81+
6782

6883
private ReporterConfiguration reporterConfig;
6984

@@ -74,9 +89,32 @@ public abstract class AbstractOtelMetricsTest extends AbstractInstrumentationTes
7489
@Nullable
7590
private MeterProvider meterProvider;
7691

92+
93+
@BeforeAll
94+
public static synchronized void beforeAll() {
95+
MockTracer.MockInstrumentationSetup mockInstrumentationSetup = MockTracer.createMockInstrumentationSetup();
96+
config = mockInstrumentationSetup.getConfig();
97+
tracer = mockInstrumentationSetup.getTracer();
98+
reporter = mockInstrumentationSetup.getReporter();
99+
100+
//Metrics export should work even with instrument=false
101+
CoreConfiguration coreConfig = config.getConfig(CoreConfiguration.class);
102+
doReturn(false).when(coreConfig).isInstrument();
103+
104+
assertThat(tracer.isRunning()).isTrue();
105+
ElasticApmAgent.initInstrumentation(tracer, ByteBuddyAgent.install());
106+
}
107+
108+
@AfterAll
109+
@AfterClass
110+
public static synchronized void afterAll() {
111+
ElasticApmAgent.reset();
112+
}
113+
77114
@BeforeEach
78115
public void setup() {
79-
reporterConfig = tracer.getConfig(ReporterConfiguration.class);
116+
SpyConfiguration.reset(config);
117+
reporterConfig = config.getConfig(ReporterConfiguration.class);
80118
// we use explicit flush in tests instead of periodic reporting to prevent flakyness
81119
doReturn(1_000_000L).when(reporterConfig).getMetricsIntervalMs();
82120
meterProvider = null;

0 commit comments

Comments
 (0)