Skip to content

Commit bc1c384

Browse files
add testing extension for declarative config (#14228)
Co-authored-by: otelbot <[email protected]>
1 parent 893c601 commit bc1c384

File tree

12 files changed

+263
-43
lines changed

12 files changed

+263
-43
lines changed

instrumentation/methods/javaagent/src/declarativeConfigTest/resources/declarative-config.yaml

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,4 @@
11
file_format: "0.4"
2-
tracer_provider:
3-
processors:
4-
- simple:
5-
exporter:
6-
test:
7-
- simple:
8-
exporter:
9-
console:
10-
11-
logger_provider:
12-
processors:
13-
- simple:
14-
exporter:
15-
test:
16-
17-
meter_provider:
18-
readers:
19-
- periodic:
20-
# Set really long interval. We'll call forceFlush when we need the metrics
21-
# instead of collecting them periodically.
22-
interval: 1000000
23-
exporter:
24-
test:
25-
262
instrumentation/development:
273
java:
284
methods:

instrumentation/resources/library/src/test/java/io/opentelemetry/instrumentation/resources/internal/DeclarativeConfigTest.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
import static org.assertj.core.api.Assertions.assertThat;
1010

1111
import io.opentelemetry.api.common.AttributeKey;
12+
import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension;
13+
import io.opentelemetry.instrumentation.testing.junit.LibraryInstrumentationExtension;
1214
import io.opentelemetry.sdk.OpenTelemetrySdk;
1315
import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfiguration;
1416
import io.opentelemetry.sdk.resources.Resource;
@@ -18,9 +20,14 @@
1820
import java.util.stream.Collectors;
1921
import org.assertj.core.api.InstanceOfAssertFactories;
2022
import org.junit.jupiter.api.Test;
23+
import org.junit.jupiter.api.extension.RegisterExtension;
2124

2225
class DeclarativeConfigTest {
2326

27+
// just to ensure that the test exporters are registered
28+
@RegisterExtension
29+
static final InstrumentationExtension testing = LibraryInstrumentationExtension.create();
30+
2431
@Test
2532
void endToEnd() {
2633
String yaml =

testing-common/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ dependencies {
7777
implementation("io.opentelemetry:opentelemetry-exporter-logging")
7878
implementation("io.opentelemetry.contrib:opentelemetry-baggage-processor")
7979
implementation("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi")
80+
compileOnly("io.opentelemetry:opentelemetry-sdk-extension-incubator")
8081
api(project(":instrumentation-api-incubator"))
8182

8283
annotationProcessor("com.google.auto.service:auto-service")
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.instrumentation.testing.provider;
7+
8+
import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfigurationCustomizer;
9+
import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfigurationCustomizerProvider;
10+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ConsoleExporterModel;
11+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.LogRecordExporterModel;
12+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.LogRecordProcessorModel;
13+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.LoggerProviderModel;
14+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.MeterProviderModel;
15+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.MetricReaderModel;
16+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel;
17+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.PeriodicMetricReaderModel;
18+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.PushMetricExporterModel;
19+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SimpleLogRecordProcessorModel;
20+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SimpleSpanProcessorModel;
21+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SpanExporterModel;
22+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SpanProcessorModel;
23+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.TracerProviderModel;
24+
import java.util.ArrayList;
25+
import java.util.Collections;
26+
import java.util.List;
27+
28+
public class TestExporterCustomizerProvider implements DeclarativeConfigurationCustomizerProvider {
29+
@Override
30+
public void customize(DeclarativeConfigurationCustomizer customizer) {
31+
customizer.addModelCustomizer(
32+
model -> {
33+
if (model.getTracerProvider() == null) {
34+
addTracerProvider(model);
35+
}
36+
if (model.getLoggerProvider() == null) {
37+
addLoggerProvider(model);
38+
}
39+
if (model.getMeterProvider() == null) {
40+
addMeterProvider(model);
41+
}
42+
return model;
43+
});
44+
}
45+
46+
private static void addTracerProvider(OpenTelemetryConfigurationModel model) {
47+
// adds the following to the configuration:
48+
// tracer_provider:
49+
// processors:
50+
// - simple:
51+
// exporter:
52+
// test:
53+
// - simple:
54+
// exporter:
55+
// console:
56+
List<SpanProcessorModel> processors = new ArrayList<>();
57+
processors.add(getProcessorModel(new SpanExporterModel().withAdditionalProperty("test", null)));
58+
processors.add(
59+
getProcessorModel(new SpanExporterModel().withConsole(new ConsoleExporterModel())));
60+
model.withTracerProvider(new TracerProviderModel().withProcessors(processors));
61+
}
62+
63+
private static SpanProcessorModel getProcessorModel(SpanExporterModel exporter) {
64+
return new SpanProcessorModel()
65+
.withSimple(new SimpleSpanProcessorModel().withExporter(exporter));
66+
}
67+
68+
private static void addLoggerProvider(OpenTelemetryConfigurationModel model) {
69+
// adds the following to the configuration:
70+
// logger_provider:
71+
// processors:
72+
// - simple:
73+
// exporter:
74+
// test:
75+
model.withLoggerProvider(
76+
new LoggerProviderModel()
77+
.withProcessors(
78+
Collections.singletonList(
79+
new LogRecordProcessorModel()
80+
.withSimple(
81+
new SimpleLogRecordProcessorModel()
82+
.withExporter(
83+
new LogRecordExporterModel()
84+
.withAdditionalProperty("test", null))))));
85+
}
86+
87+
private static void addMeterProvider(OpenTelemetryConfigurationModel model) {
88+
// adds the following to the configuration:
89+
// meter_provider:
90+
// readers:
91+
// - periodic:
92+
// interval: 1000000
93+
// exporter:
94+
// test:
95+
model.withMeterProvider(
96+
new MeterProviderModel()
97+
.withReaders(
98+
Collections.singletonList(
99+
new MetricReaderModel()
100+
.withPeriodic(
101+
new PeriodicMetricReaderModel()
102+
// Set really long interval. We'll call forceFlush when we need the
103+
// metrics instead of collecting them periodically.
104+
.withInterval(1000000)
105+
.withExporter(
106+
new PushMetricExporterModel()
107+
.withAdditionalProperty("test", null))))));
108+
}
109+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
io.opentelemetry.instrumentation.testing.provider.TestExporterCustomizerProvider

testing/agent-exporter/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,5 @@ dependencies {
1919
implementation("io.opentelemetry:opentelemetry-exporter-otlp-common")
2020
compileOnly("io.opentelemetry:opentelemetry-api-incubator")
2121
compileOnly("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure")
22+
compileOnly("io.opentelemetry:opentelemetry-sdk-extension-incubator")
2223
}

testing/agent-exporter/src/main/java/io/opentelemetry/javaagent/testing/exporter/AgentTestingExporterFactory.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55

66
package io.opentelemetry.javaagent.testing.exporter;
77

8-
import io.opentelemetry.javaagent.testing.provider.TestLogRecordExporterComponentProvider;
9-
import io.opentelemetry.javaagent.testing.provider.TestMetricExporterComponentProvider;
10-
import io.opentelemetry.javaagent.testing.provider.TestSpanExporterComponentProvider;
8+
import io.opentelemetry.javaagent.testing.provider.AgentTestLogRecordExporterComponentProvider;
9+
import io.opentelemetry.javaagent.testing.provider.AgentTestMetricExporterComponentProvider;
10+
import io.opentelemetry.javaagent.testing.provider.AgentTestSpanExporterComponentProvider;
1111
import java.util.List;
1212
import java.util.concurrent.TimeUnit;
1313

@@ -18,9 +18,13 @@ public final class AgentTestingExporterFactory {
1818
static final OtlpInMemoryLogRecordExporter logExporter = new OtlpInMemoryLogRecordExporter();
1919

2020
static {
21-
TestSpanExporterComponentProvider.setSpanExporter(spanExporter);
22-
TestMetricExporterComponentProvider.setMetricExporter(metricExporter);
23-
TestLogRecordExporterComponentProvider.setLogRecordExporter(logExporter);
21+
init();
22+
}
23+
24+
public static void init() {
25+
AgentTestSpanExporterComponentProvider.setSpanExporter(spanExporter);
26+
AgentTestMetricExporterComponentProvider.setMetricExporter(metricExporter);
27+
AgentTestLogRecordExporterComponentProvider.setLogRecordExporter(logExporter);
2428
}
2529

2630
public static List<byte[]> getSpanExportRequests() {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.javaagent.testing.provider;
7+
8+
import com.google.auto.service.AutoService;
9+
import io.opentelemetry.javaagent.testing.exporter.AgentTestingExporterFactory;
10+
import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfigurationCustomizer;
11+
import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfigurationCustomizerProvider;
12+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ConsoleExporterModel;
13+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.LogRecordExporterModel;
14+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.LogRecordProcessorModel;
15+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.LoggerProviderModel;
16+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.MeterProviderModel;
17+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.MetricReaderModel;
18+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel;
19+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.PeriodicMetricReaderModel;
20+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.PushMetricExporterModel;
21+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SimpleLogRecordProcessorModel;
22+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SimpleSpanProcessorModel;
23+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SpanExporterModel;
24+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SpanProcessorModel;
25+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.TracerProviderModel;
26+
import java.util.ArrayList;
27+
import java.util.Collections;
28+
import java.util.List;
29+
30+
@AutoService(DeclarativeConfigurationCustomizerProvider.class)
31+
public class AgentTestExporterCustomizerProvider
32+
implements DeclarativeConfigurationCustomizerProvider {
33+
@Override
34+
public void customize(DeclarativeConfigurationCustomizer customizer) {
35+
AgentTestingExporterFactory.init();
36+
37+
customizer.addModelCustomizer(
38+
model -> {
39+
if (model.getTracerProvider() == null) {
40+
addTracerProvider(model);
41+
}
42+
if (model.getLoggerProvider() == null) {
43+
addLoggerProvider(model);
44+
}
45+
if (model.getMeterProvider() == null) {
46+
addMeterProvider(model);
47+
}
48+
return model;
49+
});
50+
}
51+
52+
private static void addTracerProvider(OpenTelemetryConfigurationModel model) {
53+
// adds the following to the configuration:
54+
// tracer_provider:
55+
// processors:
56+
// - simple:
57+
// exporter:
58+
// agent_test:
59+
// - simple:
60+
// exporter:
61+
// console:
62+
List<SpanProcessorModel> processors = new ArrayList<>();
63+
processors.add(
64+
getProcessorModel(new SpanExporterModel().withAdditionalProperty("agent_test", null)));
65+
processors.add(
66+
getProcessorModel(new SpanExporterModel().withConsole(new ConsoleExporterModel())));
67+
model.withTracerProvider(new TracerProviderModel().withProcessors(processors));
68+
}
69+
70+
private static SpanProcessorModel getProcessorModel(SpanExporterModel exporter) {
71+
return new SpanProcessorModel()
72+
.withSimple(new SimpleSpanProcessorModel().withExporter(exporter));
73+
}
74+
75+
private static void addLoggerProvider(OpenTelemetryConfigurationModel model) {
76+
// adds the following to the configuration:
77+
// logger_provider:
78+
// processors:
79+
// - simple:
80+
// exporter:
81+
// agent_test:
82+
model.withLoggerProvider(
83+
new LoggerProviderModel()
84+
.withProcessors(
85+
Collections.singletonList(
86+
new LogRecordProcessorModel()
87+
.withSimple(
88+
new SimpleLogRecordProcessorModel()
89+
.withExporter(
90+
new LogRecordExporterModel()
91+
.withAdditionalProperty("agent_test", null))))));
92+
}
93+
94+
private static void addMeterProvider(OpenTelemetryConfigurationModel model) {
95+
// adds the following to the configuration:
96+
// meter_provider:
97+
// readers:
98+
// - periodic:
99+
// interval: 1000000
100+
// exporter:
101+
// agent_test:
102+
model.withMeterProvider(
103+
new MeterProviderModel()
104+
.withReaders(
105+
Collections.singletonList(
106+
new MetricReaderModel()
107+
.withPeriodic(
108+
new PeriodicMetricReaderModel()
109+
// Set really long interval. We'll call forceFlush when we need the
110+
// metrics instead of collecting them periodically.
111+
.withInterval(1000000)
112+
.withExporter(
113+
new PushMetricExporterModel()
114+
.withAdditionalProperty("agent_test", null))))));
115+
}
116+
}
Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,15 @@
55

66
package io.opentelemetry.javaagent.testing.provider;
77

8+
import com.google.auto.service.AutoService;
89
import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
910
import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider;
1011
import io.opentelemetry.sdk.logs.export.LogRecordExporter;
1112
import java.util.Objects;
1213

13-
public class TestLogRecordExporterComponentProvider
14+
@SuppressWarnings("rawtypes")
15+
@AutoService(ComponentProvider.class)
16+
public class AgentTestLogRecordExporterComponentProvider
1417
implements ComponentProvider<LogRecordExporter> {
1518

1619
private static LogRecordExporter logRecordExporter;
@@ -22,7 +25,7 @@ public Class<LogRecordExporter> getType() {
2225

2326
@Override
2427
public String getName() {
25-
return "test";
28+
return "agent_test";
2629
}
2730

2831
@Override
@@ -31,6 +34,6 @@ public LogRecordExporter create(DeclarativeConfigProperties config) {
3134
}
3235

3336
public static void setLogRecordExporter(LogRecordExporter logRecordExporter) {
34-
TestLogRecordExporterComponentProvider.logRecordExporter = logRecordExporter;
37+
AgentTestLogRecordExporterComponentProvider.logRecordExporter = logRecordExporter;
3538
}
3639
}
Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,15 @@
55

66
package io.opentelemetry.javaagent.testing.provider;
77

8+
import com.google.auto.service.AutoService;
89
import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
910
import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider;
1011
import io.opentelemetry.sdk.metrics.export.MetricExporter;
1112
import java.util.Objects;
1213

13-
public class TestMetricExporterComponentProvider implements ComponentProvider<MetricExporter> {
14+
@SuppressWarnings("rawtypes")
15+
@AutoService(ComponentProvider.class)
16+
public class AgentTestMetricExporterComponentProvider implements ComponentProvider<MetricExporter> {
1417

1518
private static MetricExporter metricExporter;
1619

@@ -21,7 +24,7 @@ public Class<MetricExporter> getType() {
2124

2225
@Override
2326
public String getName() {
24-
return "test";
27+
return "agent_test";
2528
}
2629

2730
@Override
@@ -30,6 +33,6 @@ public MetricExporter create(DeclarativeConfigProperties config) {
3033
}
3134

3235
public static void setMetricExporter(MetricExporter metricExporter) {
33-
TestMetricExporterComponentProvider.metricExporter = metricExporter;
36+
AgentTestMetricExporterComponentProvider.metricExporter = metricExporter;
3437
}
3538
}

0 commit comments

Comments
 (0)