Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,15 @@

package io.opentelemetry.instrumentation.api.incubator.config.internal;

import static java.util.Collections.emptyList;
import static java.util.Collections.emptyMap;

import io.opentelemetry.api.incubator.config.ConfigProvider;
import io.opentelemetry.api.incubator.config.InstrumentationConfigUtil;
import io.opentelemetry.instrumentation.api.incubator.log.LoggingContextConstants;
import io.opentelemetry.instrumentation.api.incubator.semconv.net.PeerServiceResolver;
import io.opentelemetry.instrumentation.api.internal.HttpConstants;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.function.Function;
import java.util.function.Supplier;

/**
* This class is internal and is hence not for public use. Its APIs are unstable and can change at
Expand All @@ -44,37 +39,16 @@ public final class CommonConfig {
public CommonConfig(InstrumentationConfig config) {
peerServiceResolver =
PeerServiceResolver.create(
getFromConfigProviderOrFallback(
config,
InstrumentationConfigUtil::peerServiceMapping,
emptyMap(),
() ->
config.getMap("otel.instrumentation.common.peer-service-mapping", emptyMap())));
config.getMap("otel.instrumentation.common.peer-service-mapping", emptyMap()));

clientRequestHeaders =
getFromConfigProviderOrFallback(
config,
InstrumentationConfigUtil::httpClientRequestCapturedHeaders,
emptyList(),
() -> config.getList("otel.instrumentation.http.client.capture-request-headers"));
config.getList("otel.instrumentation.http.client.capture-request-headers");
clientResponseHeaders =
getFromConfigProviderOrFallback(
config,
InstrumentationConfigUtil::httpClientResponseCapturedHeaders,
emptyList(),
() -> config.getList("otel.instrumentation.http.client.capture-response-headers"));
config.getList("otel.instrumentation.http.client.capture-response-headers");
serverRequestHeaders =
getFromConfigProviderOrFallback(
config,
InstrumentationConfigUtil::httpServerRequestCapturedHeaders,
emptyList(),
() -> config.getList("otel.instrumentation.http.server.capture-request-headers"));
config.getList("otel.instrumentation.http.server.capture-request-headers");
serverResponseHeaders =
getFromConfigProviderOrFallback(
config,
InstrumentationConfigUtil::httpServerResponseCapturedHeaders,
emptyList(),
() -> config.getList("otel.instrumentation.http.server.capture-response-headers"));
config.getList("otel.instrumentation.http.server.capture-response-headers");
knownHttpRequestMethods =
new HashSet<>(
config.getList(
Expand Down Expand Up @@ -156,18 +130,4 @@ public String getSpanIdKey() {
public String getTraceFlagsKey() {
return loggingTraceFlagsKey;
}

private static <T> T getFromConfigProviderOrFallback(
InstrumentationConfig config,
Function<ConfigProvider, T> getFromConfigProvider,
T defaultValue,
Supplier<T> fallback) {
ConfigProvider configProvider = config.getConfigProvider();
if (configProvider != null) {
T value = getFromConfigProvider.apply(configProvider);
return value != null ? value : defaultValue;
}
// fallback doesn't return null, so we can safely call it
return fallback.get();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@

import static java.util.Collections.emptyList;

import io.opentelemetry.api.incubator.config.ConfigProvider;
import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
import java.time.Duration;
import java.util.List;
Expand Down Expand Up @@ -110,30 +109,17 @@ default List<String> getList(String name) {
*/
Map<String, String> getMap(String name, Map<String, String> defaultValue);

/** Returns {@code true} if declarative configuration is used in this configuration. */
boolean isDeclarative();

/**
* Returns a {@link DeclarativeConfigProperties} for the given node name, which is usually an
* instrumentation name
*
* <p>Call {@link #isDeclarative()} first to check if declarative configuration is used.
* Returns a {@link DeclarativeConfigProperties} for the given instrumentation name, or {@code
* null} if no declarative configuration is available for that instrumentation.
*
* <p>Declarative configuration is used to configure instrumentation properties in a declarative
* way, such as through YAML or JSON files.
*
* @param node the name of the instrumentation (e.g. "log4j"), the vendor name (e.g. "google"), or
* "common" for common Java settings that don't apply to other languages.
* @return the declarative configuration properties for the given node name
* @throws IllegalStateException if {@link #isDeclarative()} returns {@code false}
*/
DeclarativeConfigProperties getDeclarativeConfig(String node);

/**
* Returns the {@link ConfigProvider} if declarative configuration is used.
*
* @return the {@link ConfigProvider} or {@code null} if no provider is available
* @param instrumentationName the name of the instrumentation
* @return the declarative configuration properties for the given instrumentation name, or {@code
* null} if not available
*/
@Nullable
ConfigProvider getConfigProvider();
DeclarativeConfigProperties getDeclarativeConfig(String instrumentationName);
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@
import io.opentelemetry.instrumentation.jmx.engine.MetricConfiguration;
import io.opentelemetry.instrumentation.jmx.yaml.RuleParser;
import io.opentelemetry.javaagent.extension.AgentListener;
import io.opentelemetry.javaagent.extension.internal.ConfigPropertiesUtil;
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
import io.opentelemetry.sdk.autoconfigure.internal.AutoConfigureUtil;
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
import java.io.InputStream;
import java.nio.file.Files;
Expand All @@ -29,7 +29,7 @@ public class JmxMetricInsightInstaller implements AgentListener {

@Override
public void afterAgent(AutoConfiguredOpenTelemetrySdk autoConfiguredSdk) {
ConfigProperties config = AutoConfigureUtil.getConfig(autoConfiguredSdk);
ConfigProperties config = ConfigPropertiesUtil.resolveConfigProperties(autoConfiguredSdk);

if (config.getBoolean("otel.jmx.enabled", true)) {
JmxMetricInsight service =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@
import static java.util.Collections.singletonMap;

import com.google.auto.service.AutoService;
import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
import io.opentelemetry.api.trace.SpanKind;
import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig;
import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig;
import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule;
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
Expand All @@ -34,11 +34,10 @@ public MethodInstrumentationModule() {
}

private static List<TypeInstrumentation> createInstrumentations() {
InstrumentationConfig config = AgentInstrumentationConfig.get();
DeclarativeConfigProperties methods =
AgentInstrumentationConfig.get().getDeclarativeConfig("methods");
List<TypeInstrumentation> list =
config.isDeclarative()
? MethodsConfig.parseDeclarativeConfig(config.getDeclarativeConfig("methods"))
: parseConfigProperties();
methods != null ? MethodsConfig.parseDeclarativeConfig(methods) : parseConfigProperties();
// ensure that there is at least one instrumentation so that muzzle reference collection could
// work
if (list.isEmpty()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@

import com.google.auto.service.AutoService;
import io.opentelemetry.javaagent.extension.AgentListener;
import io.opentelemetry.javaagent.extension.internal.ConfigPropertiesUtil;
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
import io.opentelemetry.sdk.autoconfigure.internal.AutoConfigureUtil;
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
import java.lang.reflect.Method;

Expand All @@ -21,7 +21,7 @@ public class OshiMetricsInstaller implements AgentListener {

@Override
public void afterAgent(AutoConfiguredOpenTelemetrySdk autoConfiguredSdk) {
ConfigProperties config = AutoConfigureUtil.getConfig(autoConfiguredSdk);
ConfigProperties config = ConfigPropertiesUtil.resolveConfigProperties(autoConfiguredSdk);

boolean defaultEnabled = config.getBoolean("otel.instrumentation.common.default-enabled", true);
if (!config.getBoolean("otel.instrumentation.oshi.enabled", defaultEnabled)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@

import com.google.auto.service.AutoService;
import io.opentelemetry.javaagent.bootstrap.InstrumentationHolder;
import io.opentelemetry.javaagent.extension.internal.ConfigPropertiesUtil;
import io.opentelemetry.javaagent.tooling.BeforeAgentListener;
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
import io.opentelemetry.sdk.autoconfigure.internal.AutoConfigureUtil;
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
import java.lang.instrument.Instrumentation;

Expand All @@ -19,7 +19,8 @@ public class JarAnalyzerInstaller implements BeforeAgentListener {

@Override
public void beforeAgent(AutoConfiguredOpenTelemetrySdk autoConfiguredOpenTelemetrySdk) {
ConfigProperties config = AutoConfigureUtil.getConfig(autoConfiguredOpenTelemetrySdk);
ConfigProperties config =
ConfigPropertiesUtil.resolveConfigProperties(autoConfiguredOpenTelemetrySdk);

boolean enabled =
config.getBoolean("otel.instrumentation.runtime-telemetry.package-emitter.enabled", false);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@

package io.opentelemetry.instrumentation.spring.autoconfigure.internal.properties;

import io.opentelemetry.api.incubator.config.ConfigProvider;
import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig;
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
Expand Down Expand Up @@ -111,21 +110,10 @@ public Map<String, String> getMap(String name, Map<String, String> defaultValue)
}
}

@Override
public boolean isDeclarative() {
return false;
}

@Override
public DeclarativeConfigProperties getDeclarativeConfig(String node) {
throw new IllegalStateException(
"Declarative configuration is not supported in spring boot autoconfigure yet");
}

@Nullable
@Override
public ConfigProvider getConfigProvider() {
// declarative config support will be added in the future
public DeclarativeConfigProperties getDeclarativeConfig(String instrumentationName) {
// create a spring boot bridge for DeclarativeConfigProperties
return null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@

package io.opentelemetry.javaagent.bootstrap.internal;

import io.opentelemetry.api.incubator.config.ConfigProvider;
import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig;
import java.time.Duration;
Expand Down Expand Up @@ -61,20 +60,9 @@ public Map<String, String> getMap(String name, Map<String, String> defaultValue)
return defaultValue;
}

@Override
public boolean isDeclarative() {
return false;
}

@Override
public DeclarativeConfigProperties getDeclarativeConfig(String node) {
throw new IllegalStateException(
"Declarative configuration is not supported in the empty instrumentation config");
}

@Nullable
@Override
public ConfigProvider getConfigProvider() {
public DeclarativeConfigProperties getDeclarativeConfig(String instrumentationName) {
return null;
}
}
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.javaagent.extension.internal;

import io.opentelemetry.api.incubator.config.ConfigProvider;
import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
import io.opentelemetry.sdk.autoconfigure.internal.AutoConfigureUtil;
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;

/**
* This class is internal and is hence not for public use. Its APIs are unstable and can change at
* any time.
*/
public final class ConfigPropertiesUtil {
private ConfigPropertiesUtil() {}

/** Resolve {@link ConfigProperties} from the {@code autoConfiguredOpenTelemetrySdk}. */
public static ConfigProperties resolveConfigProperties(
AutoConfiguredOpenTelemetrySdk autoConfiguredOpenTelemetrySdk) {
ConfigProperties sdkConfigProperties =
AutoConfigureUtil.getConfig(autoConfiguredOpenTelemetrySdk);
if (sdkConfigProperties != null) {
return sdkConfigProperties;
}
ConfigProvider configProvider =
AutoConfigureUtil.getConfigProvider(autoConfiguredOpenTelemetrySdk);
if (configProvider != null) {
DeclarativeConfigProperties instrumentationConfig = configProvider.getInstrumentationConfig();

if (instrumentationConfig == null) {
instrumentationConfig = DeclarativeConfigProperties.empty();
}

return new DeclarativeConfigPropertiesBridge(instrumentationConfig);
}
// Should never happen
throw new IllegalStateException(
"AutoConfiguredOpenTelemetrySdk does not have ConfigProperties or DeclarativeConfigProperties. This is likely a programming error in opentelemetry-java");
}
}
Loading
Loading