Skip to content

Commit

Permalink
add support for OTEL_EXPORTER_OTLP_HEADERS for spring boot starter
Browse files Browse the repository at this point in the history
  • Loading branch information
zeitlinger committed Nov 24, 2023
1 parent 7c3a412 commit 01b786a
Show file tree
Hide file tree
Showing 7 changed files with 110 additions and 48 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.api.trace.TracerProvider;
import io.opentelemetry.context.propagation.ContextPropagators;
import io.opentelemetry.instrumentation.spring.autoconfigure.exporters.otlp.MapConverter;
import io.opentelemetry.instrumentation.spring.autoconfigure.resources.SpringResourceConfigProperties;
import io.opentelemetry.sdk.OpenTelemetrySdk;
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
Expand All @@ -32,6 +33,7 @@
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.ConfigurationPropertiesBinding;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
Expand All @@ -51,6 +53,12 @@ public class OpenTelemetryAutoConfiguration {

public OpenTelemetryAutoConfiguration() {}

@Bean
@ConfigurationPropertiesBinding
public MapConverter mapConverter() {
return new MapConverter();
}

@Configuration
@ConditionalOnMissingBean(OpenTelemetry.class)
@ConditionalOnProperty(name = "otel.sdk.disabled", havingValue = "false", matchIfMissing = true)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/

package io.opentelemetry.instrumentation.spring.autoconfigure.exporters.otlp;

import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties;
import java.util.Collections;
import java.util.Map;
import org.springframework.core.convert.converter.Converter;

public class MapConverter implements Converter<String, Map<String, String>> {

public static final String KEY = "key";

@Override
public Map<String, String> convert(String source) {
DefaultConfigProperties properties =
DefaultConfigProperties.createFromMap(Collections.singletonMap(KEY, source));

return properties.getMap(KEY);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
package io.opentelemetry.instrumentation.spring.autoconfigure.exporters.otlp;

import java.time.Duration;
import java.util.HashMap;
import java.util.Map;
import javax.annotation.Nullable;
import org.springframework.boot.context.properties.ConfigurationProperties;

Expand All @@ -24,6 +26,9 @@ public final class OtlpExporterProperties {

private boolean enabled = true;
@Nullable private String endpoint;

private final Map<String, String> headers = new HashMap<>();

@Nullable private Duration timeout;
private final SignalProperties traces = new SignalProperties();
private final SignalProperties metrics = new SignalProperties();
Expand All @@ -46,6 +51,10 @@ public void setEndpoint(String endpoint) {
this.endpoint = endpoint;
}

public Map<String, String> getHeaders() {
return headers;
}

@Nullable
public Duration getTimeout() {
return timeout;
Expand All @@ -71,6 +80,9 @@ public static class SignalProperties {

private boolean enabled = true;
@Nullable private String endpoint;

private final Map<String, String> headers = new HashMap<>();

@Nullable private Duration timeout;

public boolean isEnabled() {
Expand All @@ -90,6 +102,10 @@ public void setEndpoint(@Nullable String endpoint) {
this.endpoint = endpoint;
}

public Map<String, String> getHeaders() {
return headers;
}

@Nullable
public Duration getTimeout() {
return timeout;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/

package io.opentelemetry.instrumentation.spring.autoconfigure.exporters.otlp;

import java.time.Duration;
import java.util.Map;
import java.util.function.BiConsumer;
import java.util.function.Consumer;

class OtlpExporterUtil {
private OtlpExporterUtil() {}

static void applySignalProperties(
OtlpExporterProperties properties,
OtlpExporterProperties.SignalProperties signalProperties,
Consumer<String> setEndpoint,
BiConsumer<String, String> addHeader,
Consumer<Duration> setTimeout) {
String endpoint = properties.getLogs().getEndpoint();
if (endpoint == null) {
endpoint = properties.getEndpoint();
}
if (endpoint != null) {
setEndpoint.accept(endpoint);
}

Map<String, String> headers = signalProperties.getHeaders();
if (headers.isEmpty()) {
headers = properties.getHeaders();
}
headers.forEach(addHeader);

Duration timeout = signalProperties.getTimeout();
if (timeout == null) {
timeout = properties.getTimeout();
}
if (timeout != null) {
setTimeout.accept(timeout);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
import io.opentelemetry.exporter.otlp.logs.OtlpGrpcLogRecordExporter;
import io.opentelemetry.exporter.otlp.logs.OtlpGrpcLogRecordExporterBuilder;
import io.opentelemetry.instrumentation.spring.autoconfigure.OpenTelemetryAutoConfiguration;
import java.time.Duration;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
Expand All @@ -31,21 +30,12 @@ public OtlpGrpcLogRecordExporter otelOtlpGrpcLogRecordExporter(
OtlpExporterProperties properties) {
OtlpGrpcLogRecordExporterBuilder builder = OtlpGrpcLogRecordExporter.builder();

String endpoint = properties.getLogs().getEndpoint();
if (endpoint == null) {
endpoint = properties.getEndpoint();
}
if (endpoint != null) {
builder.setEndpoint(endpoint);
}

Duration timeout = properties.getLogs().getTimeout();
if (timeout == null) {
timeout = properties.getTimeout();
}
if (timeout != null) {
builder.setTimeout(timeout);
}
OtlpExporterUtil.applySignalProperties(
properties,
properties.getLogs(),
builder::setEndpoint,
builder::addHeader,
builder::setTimeout);

return builder.build();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
import io.opentelemetry.exporter.otlp.metrics.OtlpGrpcMetricExporter;
import io.opentelemetry.exporter.otlp.metrics.OtlpGrpcMetricExporterBuilder;
import io.opentelemetry.instrumentation.spring.autoconfigure.OpenTelemetryAutoConfiguration;
import java.time.Duration;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
Expand All @@ -32,21 +31,12 @@ public class OtlpMetricExporterAutoConfiguration {
public OtlpGrpcMetricExporter otelOtlpGrpcMetricExporter(OtlpExporterProperties properties) {
OtlpGrpcMetricExporterBuilder builder = OtlpGrpcMetricExporter.builder();

String endpoint = properties.getMetrics().getEndpoint();
if (endpoint == null) {
endpoint = properties.getEndpoint();
}
if (endpoint != null) {
builder.setEndpoint(endpoint);
}

Duration timeout = properties.getMetrics().getTimeout();
if (timeout == null) {
timeout = properties.getTimeout();
}
if (timeout != null) {
builder.setTimeout(timeout);
}
OtlpExporterUtil.applySignalProperties(
properties,
properties.getMetrics(),
builder::setEndpoint,
builder::addHeader,
builder::setTimeout);

return builder.build();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter;
import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporterBuilder;
import io.opentelemetry.instrumentation.spring.autoconfigure.OpenTelemetryAutoConfiguration;
import java.time.Duration;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
Expand Down Expand Up @@ -37,21 +36,12 @@ public class OtlpSpanExporterAutoConfiguration {
public OtlpGrpcSpanExporter otelOtlpGrpcSpanExporter(OtlpExporterProperties properties) {
OtlpGrpcSpanExporterBuilder builder = OtlpGrpcSpanExporter.builder();

String endpoint = properties.getTraces().getEndpoint();
if (endpoint == null) {
endpoint = properties.getEndpoint();
}
if (endpoint != null) {
builder.setEndpoint(endpoint);
}

Duration timeout = properties.getTraces().getTimeout();
if (timeout == null) {
timeout = properties.getTimeout();
}
if (timeout != null) {
builder.setTimeout(timeout);
}
OtlpExporterUtil.applySignalProperties(
properties,
properties.getTraces(),
builder::setEndpoint,
builder::addHeader,
builder::setTimeout);

return builder.build();
}
Expand Down

0 comments on commit 01b786a

Please sign in to comment.