Skip to content

Commit c1ef02d

Browse files
committed
add support for missing spring list properties
1 parent f143d47 commit c1ef02d

File tree

5 files changed

+248
-9
lines changed

5 files changed

+248
-9
lines changed

instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/properties/OtelSpringProperties.java

Lines changed: 194 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,12 +195,142 @@ public void setResource(Resource resource) {
195195
}
196196
}
197197

198+
public static final class Logs {
199+
private List<String> exporters = Collections.emptyList();
200+
201+
public List<String> getExporters() {
202+
return exporters;
203+
}
204+
205+
public void setExporters(List<String> exporters) {
206+
this.exporters = exporters;
207+
}
208+
}
209+
210+
public static final class Metrics {
211+
private List<String> exporters = Collections.emptyList();
212+
213+
public List<String> getExporters() {
214+
return exporters;
215+
}
216+
217+
public void setExporters(List<String> exporters) {
218+
this.exporters = exporters;
219+
}
220+
}
221+
222+
public static final class Traces {
223+
private List<String> exporters = Collections.emptyList();
224+
225+
public List<String> getExporters() {
226+
return exporters;
227+
}
228+
229+
public void setExporters(List<String> exporters) {
230+
this.exporters = exporters;
231+
}
232+
}
233+
234+
private static final class Instrumentation {
235+
private static final class Http {
236+
private static final class Client {
237+
private List<String> captureRequestHeaders = Collections.emptyList();
238+
private List<String> captureResponseHeaders = Collections.emptyList();
239+
240+
public List<String> getCaptureRequestHeaders() {
241+
return captureRequestHeaders;
242+
}
243+
244+
public void setCaptureRequestHeaders(List<String> captureRequestHeaders) {
245+
this.captureRequestHeaders = captureRequestHeaders;
246+
}
247+
248+
public List<String> getCaptureResponseHeaders() {
249+
return captureResponseHeaders;
250+
}
251+
252+
public void setCaptureResponseHeaders(List<String> captureResponseHeaders) {
253+
this.captureResponseHeaders = captureResponseHeaders;
254+
}
255+
}
256+
257+
private static final class Server {
258+
private List<String> captureRequestHeaders = Collections.emptyList();
259+
private List<String> captureResponseHeaders = Collections.emptyList();
260+
261+
public List<String> getCaptureRequestHeaders() {
262+
return captureRequestHeaders;
263+
}
264+
265+
public void setCaptureRequestHeaders(List<String> captureRequestHeaders) {
266+
this.captureRequestHeaders = captureRequestHeaders;
267+
}
268+
269+
public List<String> getCaptureResponseHeaders() {
270+
return captureResponseHeaders;
271+
}
272+
273+
public void setCaptureResponseHeaders(List<String> captureResponseHeaders) {
274+
this.captureResponseHeaders = captureResponseHeaders;
275+
}
276+
}
277+
278+
private Client client = new Client();
279+
280+
private Server server = new Server();
281+
282+
private List<String> knownMethods = Collections.emptyList();
283+
284+
public Client getClient() {
285+
return client;
286+
}
287+
288+
public void setClient(Client client) {
289+
this.client = client;
290+
}
291+
292+
public Server getServer() {
293+
return server;
294+
}
295+
296+
public void setServer(Server server) {
297+
this.server = server;
298+
}
299+
300+
public List<String> getKnownMethods() {
301+
return knownMethods;
302+
}
303+
304+
public void setKnownMethods(List<String> knownMethods) {
305+
this.knownMethods = knownMethods;
306+
}
307+
}
308+
309+
private Http http = new Http();
310+
311+
public Http getHttp() {
312+
return http;
313+
}
314+
315+
public void setHttp(Http http) {
316+
this.http = http;
317+
}
318+
}
319+
198320
private List<String> propagators = Collections.emptyList();
199321

200322
private Java java = new Java();
201323

202324
private Experimental experimental = new Experimental();
203325

326+
private Logs logs = new Logs();
327+
328+
private Metrics metrics = new Metrics();
329+
330+
private Traces traces = new Traces();
331+
332+
private Instrumentation instrumentation = new Instrumentation();
333+
204334
public List<String> getPropagators() {
205335
return propagators;
206336
}
@@ -225,6 +355,38 @@ public void setExperimental(Experimental experimental) {
225355
this.experimental = experimental;
226356
}
227357

358+
public Logs getLogs() {
359+
return logs;
360+
}
361+
362+
public void setLogs(Logs logs) {
363+
this.logs = logs;
364+
}
365+
366+
public Metrics getMetrics() {
367+
return metrics;
368+
}
369+
370+
public void setMetrics(Metrics metrics) {
371+
this.metrics = metrics;
372+
}
373+
374+
public Traces getTraces() {
375+
return traces;
376+
}
377+
378+
public void setTraces(Traces traces) {
379+
this.traces = traces;
380+
}
381+
382+
public Instrumentation getInstrumentation() {
383+
return instrumentation;
384+
}
385+
386+
public void setInstrumentation(Instrumentation instrumentation) {
387+
this.instrumentation = instrumentation;
388+
}
389+
228390
public List<String> getJavaEnabledResourceProviders() {
229391
return java.getEnabled().getResource().getProviders();
230392
}
@@ -240,4 +402,36 @@ public List<String> getExperimentalMetricsViewConfig() {
240402
public List<String> getExperimentalResourceDisabledKeys() {
241403
return experimental.getResource().getDisabled().getKeys();
242404
}
405+
406+
public List<String> getLogsExporter() {
407+
return logs.getExporters();
408+
}
409+
410+
public List<String> getMetricsExporter() {
411+
return metrics.getExporters();
412+
}
413+
414+
public List<String> getTracesExporter() {
415+
return traces.getExporters();
416+
}
417+
418+
public List<String> getHttpClientCaptureRequestHeaders() {
419+
return instrumentation.getHttp().getClient().getCaptureRequestHeaders();
420+
}
421+
422+
public List<String> getHttpClientCaptureResponseHeaders() {
423+
return instrumentation.getHttp().getClient().getCaptureResponseHeaders();
424+
}
425+
426+
public List<String> getHttpServerCaptureRequestHeaders() {
427+
return instrumentation.getHttp().getServer().getCaptureRequestHeaders();
428+
}
429+
430+
public List<String> getHttpServerCaptureResponseHeaders() {
431+
return instrumentation.getHttp().getServer().getCaptureResponseHeaders();
432+
}
433+
434+
public List<String> getHttpKnownMethods() {
435+
return instrumentation.getHttp().getKnownMethods();
436+
}
243437
}

instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/properties/SpringConfigProperties.java

Lines changed: 37 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public class SpringConfigProperties implements ConfigProperties {
3232
private final OtelResourceProperties resourceProperties;
3333
private final ConfigProperties otelSdkProperties;
3434
private final ConfigProperties customizedListProperties;
35-
private final Map<String, List<String>> listPropertyValues = new HashMap<>();
35+
private final Map<String, List<String>> listPropertyValues;
3636

3737
static final String DISABLED_KEY = "otel.java.disabled.resource.providers";
3838
static final String ENABLED_KEY = "otel.java.enabled.resource.providers";
@@ -52,15 +52,46 @@ public SpringConfigProperties(
5252
this.customizedListProperties =
5353
createCustomizedListProperties(otelSdkProperties, otelSpringProperties);
5454

55-
listPropertyValues.put(ENABLED_KEY, otelSpringProperties.getJavaEnabledResourceProviders());
56-
listPropertyValues.put(DISABLED_KEY, otelSpringProperties.getJavaDisabledResourceProviders());
57-
listPropertyValues.put(
55+
listPropertyValues = createListPropertyValues(otelSpringProperties);
56+
}
57+
58+
private static Map<String, List<String>> createListPropertyValues(
59+
OtelSpringProperties otelSpringProperties) {
60+
Map<String, List<String>> values = new HashMap<>();
61+
62+
// SDK
63+
values.put(ENABLED_KEY, otelSpringProperties.getJavaEnabledResourceProviders());
64+
values.put(DISABLED_KEY, otelSpringProperties.getJavaDisabledResourceProviders());
65+
values.put(
5866
"otel.experimental.metrics.view.config",
5967
otelSpringProperties.getExperimentalMetricsViewConfig());
60-
listPropertyValues.put(
68+
values.put(
6169
"otel.experimental.resource.disabled.keys",
6270
otelSpringProperties.getExperimentalResourceDisabledKeys());
63-
listPropertyValues.put("otel.propagators", otelSpringProperties.getPropagators());
71+
values.put("otel.propagators", otelSpringProperties.getPropagators());
72+
73+
// exporters
74+
values.put("otel.logs.exporter", otelSpringProperties.getLogsExporter());
75+
values.put("otel.metrics.exporter", otelSpringProperties.getMetricsExporter());
76+
values.put("otel.traces.exporter", otelSpringProperties.getTracesExporter());
77+
78+
// instrumentations
79+
values.put(
80+
"otel.instrumentation.http.client.capture-request-headers",
81+
otelSpringProperties.getHttpClientCaptureRequestHeaders());
82+
values.put(
83+
"otel.instrumentation.http.client.capture-response-headers",
84+
otelSpringProperties.getHttpClientCaptureResponseHeaders());
85+
values.put(
86+
"otel.instrumentation.http.server.capture-request-headers",
87+
otelSpringProperties.getHttpServerCaptureRequestHeaders());
88+
values.put(
89+
"otel.instrumentation.http.server.capture-response-headers",
90+
otelSpringProperties.getHttpServerCaptureResponseHeaders());
91+
values.put(
92+
"otel.instrumentation.http.known-methods", otelSpringProperties.getHttpKnownMethods());
93+
94+
return values;
6495
}
6596

6697
private static Map<String, String> createMapForListProperty(

instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -419,8 +419,8 @@
419419
},
420420
{
421421
"name": "otel.instrumentation.logback-appender.experimental.capture-mdc-attributes",
422-
"type": "java.util.List<java.lang.String>",
423-
"description": "MDC attributes to capture. Use the wildcard character <code>*</code> to capture all attributes."
422+
"type": "java.lang.String",
423+
"description": "MDC attributes to capture. Use the wildcard character <code>*</code> to capture all attributes. This is a comma-separated list of attribute names.",
424424
},
425425
{
426426
"name": "otel.instrumentation.logback-mdc.enabled",

smoke-tests-otel-starter/spring-boot-common/src/main/java/io/opentelemetry/spring/smoketest/AbstractOtelSpringStarterSmokeTest.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import io.opentelemetry.semconv.incubating.CodeIncubatingAttributes;
2929
import io.opentelemetry.semconv.incubating.DbIncubatingAttributes;
3030
import io.opentelemetry.semconv.incubating.ServiceIncubatingAttributes;
31+
import java.net.URI;
3132
import java.util.Collections;
3233
import java.util.List;
3334
import org.assertj.core.api.AbstractCharSequenceAssert;
@@ -46,6 +47,9 @@
4647
import org.springframework.context.event.EventListener;
4748
import org.springframework.core.annotation.Order;
4849
import org.springframework.core.env.Environment;
50+
import org.springframework.http.HttpHeaders;
51+
import org.springframework.http.HttpMethod;
52+
import org.springframework.http.RequestEntity;
4953
import org.springframework.jdbc.core.JdbcTemplate;
5054
import org.springframework.web.client.RestTemplate;
5155

@@ -142,7 +146,13 @@ void propertyConversion() {
142146
@Test
143147
@org.junit.jupiter.api.Order(1)
144148
void shouldSendTelemetry() {
145-
testRestTemplate.getForObject(OtelSpringStarterSmokeTestController.PING, String.class);
149+
HttpHeaders headers = new HttpHeaders();
150+
headers.add("key", "value");
151+
152+
testRestTemplate.exchange(
153+
new RequestEntity<>(
154+
null, headers, HttpMethod.GET, URI.create(OtelSpringStarterSmokeTestController.PING)),
155+
String.class);
146156

147157
// Span
148158
testing.waitAndAssertTraces(
@@ -186,6 +196,9 @@ void shouldSendTelemetry() {
186196
equalTo(HttpAttributes.HTTP_ROUTE, "/ping"),
187197
equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"),
188198
equalTo(ClientAttributes.CLIENT_ADDRESS, "127.0.0.1"),
199+
equalTo(
200+
AttributeKey.stringArrayKey("http.request.header.key"),
201+
Collections.singletonList("value")),
189202
satisfies(
190203
ServerAttributes.SERVER_PORT,
191204
integerAssert -> integerAssert.isNotZero())),

smoke-tests-otel-starter/spring-boot-common/src/main/resources/application.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ otel:
1313
emit-experimental-telemetry: true
1414
server:
1515
emit-experimental-telemetry: true
16+
capture-request-headers: [key]
1617
propagators:
1718
- b3
1819
resource:

0 commit comments

Comments
 (0)