Skip to content
Merged
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 @@ -10,6 +10,7 @@
import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
import io.opentelemetry.common.ComponentLoader;
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
import java.time.Duration;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
Expand Down Expand Up @@ -93,7 +94,6 @@ public final class ConfigPropertiesBackedDeclarativeConfigProperties
// jmx properties don't have an "instrumentation" segment
SPECIAL_MAPPINGS.put("java.jmx.enabled", "otel.jmx.enabled");
SPECIAL_MAPPINGS.put("java.jmx.config", "otel.jmx.config");
SPECIAL_MAPPINGS.put("java.jmx.discovery.delay", "otel.jmx.discovery.delay");
SPECIAL_MAPPINGS.put("java.jmx.target_system", "otel.jmx.target.system");
}

Expand Down Expand Up @@ -144,6 +144,22 @@ public Integer getInt(String name) {
@Nullable
@Override
public Long getLong(String name) {
String fullPath = pathWithName(name);

if (fullPath.equals("java.jmx.discovery.delay")) {
Duration duration = configProperties.getDuration("otel.jmx.discovery.delay");
if (duration != null) {
return duration.toMillis();
}
// If discovery delay has not been configured, have a peek at the metric export interval.
// It makes sense for both of these values to be similar.
Duration fallback = configProperties.getDuration("otel.metric.export.interval");
if (fallback != null) {
return fallback.toMillis();
}
return null;
}

return configProperties.getLong(resolvePropertyKey(name));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -122,23 +122,36 @@ void testGeneralPeerServiceMapping() {

@Test
void testGetInt() {
DeclarativeConfigProperties config = createConfig("otel.jmx.discovery.delay", "5000");
DeclarativeConfigProperties config =
createConfig("otel.instrumentation.aws-lambda.flush-timeout", "5000");

assertThat(
config
.getStructured("java")
.getStructured("jmx")
.getStructured("discovery")
.getInt("delay"))
assertThat(config.getStructured("java").getStructured("aws_lambda").getInt("flush_timeout"))
.isEqualTo(5000);
}

@Test
void testGetLong() {
DeclarativeConfigProperties config =
createConfig("otel.instrumentation.aws-lambda.flush-timeout", "30000");
assertThat(
createConfig("otel.instrumentation.aws-lambda.flush-timeout", "30000")
.getStructured("java")
.getStructured("aws_lambda")
.getLong("flush_timeout"))
.isEqualTo(30000L);

assertThat(config.getStructured("java").getStructured("aws_lambda").getLong("flush_timeout"))
// special case: duration string
assertThat(
createConfig("otel.jmx.discovery.delay", "30s")
.getStructured("java")
.getStructured("jmx")
.getStructured("discovery")
.getLong("delay"))
.isEqualTo(30000L);
assertThat(
createConfig("otel.metric.export.interval", "30s")
.getStructured("java")
.getStructured("jmx")
.getStructured("discovery")
.getLong("delay"))
.isEqualTo(30000L);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,6 @@
import io.opentelemetry.instrumentation.jmx.JmxTelemetryBuilder;
import io.opentelemetry.javaagent.extension.AgentListener;
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.Path;
import java.nio.file.Paths;
Expand All @@ -32,14 +30,15 @@ public class JmxMetricInsightInstaller implements AgentListener {

@Override
public void afterAgent(AutoConfiguredOpenTelemetrySdk autoConfiguredSdk) {
ConfigProperties configProperties = AutoConfigureUtil.getConfig(autoConfiguredSdk);
ExtendedDeclarativeConfigProperties config =
DeclarativeConfigUtil.getInstrumentationConfig(GlobalOpenTelemetry.get(), "jmx");

if (config.getBoolean("enabled", true)) {
JmxTelemetryBuilder jmx =
JmxTelemetry.builder(GlobalOpenTelemetry.get())
.beanDiscoveryDelay(beanDiscoveryDelay(config, configProperties));
.beanDiscoveryDelay(
Duration.ofMillis(
config.get("discovery").getLong("delay", Duration.ofMinutes(1).toMillis())));

config.getScalarList("config", String.class, emptyList()).stream()
.map(Paths::get)
Expand Down Expand Up @@ -73,16 +72,4 @@ private static void addClasspathRules(String target, JmxTelemetryBuilder builder
Level.SEVERE, "Error while loading JMX configuration from classpath " + resource, e);
}
}

private static Duration beanDiscoveryDelay(
ExtendedDeclarativeConfigProperties config, ConfigProperties configProperties) {
Long discoveryDelayMs = config.get("discovery").getLong("delay");
if (discoveryDelayMs != null) {
return Duration.ofMillis(discoveryDelayMs);
}

// If discovery delay has not been configured, have a peek at the metric export interval.
// It makes sense for both of these values to be similar.
return configProperties.getDuration("otel.metric.export.interval", Duration.ofMinutes(1));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@
package io.opentelemetry.javaagent.instrumentation.oshi;

import com.google.auto.service.AutoService;
import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil;
import io.opentelemetry.javaagent.extension.AgentListener;
import io.opentelemetry.javaagent.tooling.config.AgentConfig;
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,10 +21,11 @@ public class OshiMetricsInstaller implements AgentListener {

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

boolean defaultEnabled = config.getBoolean("otel.instrumentation.common.default-enabled", true);
if (!config.getBoolean("otel.instrumentation.oshi.enabled", defaultEnabled)) {
boolean enabled =
DeclarativeConfigUtil.getInstrumentationConfig(
autoConfiguredSdk.getOpenTelemetrySdk(), "oshi")
.getBoolean("enabled", AgentConfig.instrumentationMode().equals("default"));
if (!enabled) {
return;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,13 @@
package io.opentelemetry.javaagent.instrumentation.runtimemetrics.java8;

import com.google.auto.service.AutoService;
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil;
import io.opentelemetry.instrumentation.api.incubator.config.internal.ExtendedDeclarativeConfigProperties;
import io.opentelemetry.javaagent.bootstrap.InstrumentationHolder;
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;

/** Installs the {@link JarAnalyzer}. */
Expand All @@ -19,21 +21,19 @@ public class JarAnalyzerInstaller implements BeforeAgentListener {

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

boolean enabled =
config.getBoolean("otel.instrumentation.runtime-telemetry.package-emitter.enabled", false);
if (!enabled) {
OpenTelemetry openTelemetry = GlobalOpenTelemetry.get();
ExtendedDeclarativeConfigProperties config =
DeclarativeConfigUtil.getInstrumentationConfig(openTelemetry, "runtime_telemetry");
if (!config.get("package_emitter").getBoolean("enabled", false)) {
return;
}
Instrumentation inst = InstrumentationHolder.getInstrumentation();
if (inst == null) {
return;
}
int jarsPerSecond =
config.getInt("otel.instrumentation.runtime-telemetry.package-emitter.jars-per-second", 10);
JarAnalyzer jarAnalyzer =
JarAnalyzer.create(autoConfiguredOpenTelemetrySdk.getOpenTelemetrySdk(), jarsPerSecond);
JarAnalyzer.create(
openTelemetry, config.get("package_emitter").getInt("jars_per_second", 10));
inst.addTransformer(jarAnalyzer);
}
}
Loading