Skip to content
Draft
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,10 @@ public Map<String, String> apply(ConfigProperties otelConfig) {

Map<String, String> properties = new HashMap<>();

properties.put(
"applicationinsights.internal.micrometer.step.millis",
Long.toString(SECONDS.toMillis(configuration.metricIntervalSeconds)));
String micrometerStepMillis = Long.toString(SECONDS.toMillis(configuration.metricIntervalSeconds));
properties.put("applicationinsights.internal.micrometer.step.millis", micrometerStepMillis);
// Also set as system property so AzureMonitorRegistryConfig can access it
System.setProperty("applicationinsights.internal.micrometer.step.millis", micrometerStepMillis);

properties.put(
"otel.metric.export.interval",
Expand Down Expand Up @@ -101,7 +102,10 @@ public Map<String, String> apply(ConfigProperties otelConfig) {
sb.append(customInstrumentation.methodName);
sb.append(']');
}
properties.put("applicationinsights.internal.methods.include", sb.toString());
String customInstrConfig = sb.toString();
properties.put("applicationinsights.internal.methods.include", customInstrConfig);
// Also set as system property so MethodInstrumentationModule can access it
System.setProperty("applicationinsights.internal.methods.include", customInstrConfig);
}

properties.put("otel.propagators", DelegatingPropagatorProvider.NAME);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@
import io.opentelemetry.javaagent.bootstrap.InternalLogger;
import io.opentelemetry.javaagent.bootstrap.JavaagentFileHolder;
import io.opentelemetry.javaagent.tooling.LoggingCustomizer;
import io.opentelemetry.javaagent.tooling.config.EarlyInitAgentConfig;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
Expand Down Expand Up @@ -77,7 +76,7 @@ public String name() {
}

@Override
public void init(EarlyInitAgentConfig earlyConfig) {
public void init() {
try {
if (DEBUG_SIGNED_JAR_ACCESS) {
JarVerifierClassFileTransformer transformer = new JarVerifierClassFileTransformer();
Expand Down
1 change: 1 addition & 0 deletions agent/agent/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ tasks {
exclude(dependency("io.opentelemetry:opentelemetry-api"))
exclude(dependency("io.opentelemetry:opentelemetry-context"))
exclude(dependency("io.opentelemetry:opentelemetry-api-incubator"))
exclude(dependency("io.opentelemetry:opentelemetry-common"))
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,10 @@
import com.microsoft.applicationinsights.agent.bootstrap.BytecodeUtil;
import com.microsoft.azure.functions.rpc.messages.InvocationRequest;
import com.microsoft.azure.functions.rpc.messages.RpcTraceContext;
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.SpanContext;
import io.opentelemetry.api.trace.TraceFlags;
import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator;
import io.opentelemetry.context.Context;
import io.opentelemetry.context.Scope;
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
Expand Down Expand Up @@ -61,9 +61,7 @@ public static Scope methodEnter(@Advice.Argument(0) InvocationRequest request) {

RpcTraceContext traceContext = request.getTraceContext();
Context extractedContext =
GlobalOpenTelemetry.getPropagators()
.getTextMapPropagator()
.extract(Context.root(), traceContext, GETTER);
W3CTraceContextPropagator.getInstance().extract(Context.root(), traceContext, GETTER);
SpanContext spanContext = Span.fromContext(extractedContext).getSpanContext();

// recreate SpanContext to override the trace flags since the host currently always sends "00"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,12 @@

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

import com.google.auto.service.AutoService;
import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig;
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil;
import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule;
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
import io.opentelemetry.javaagent.tooling.config.MethodsConfigurationParser;
Expand All @@ -32,9 +35,18 @@ public class MethodInstrumentationModule extends InstrumentationModule {
public MethodInstrumentationModule() {
super("ai-methods");

// First try to get config from DeclarativeConfigUtil
DeclarativeConfigProperties config =
DeclarativeConfigUtil.getInstrumentationConfig(GlobalOpenTelemetry.get(), "ai-methods");
String include = config.getString(TRACE_METHODS_CONFIG);

// Fallback to system property if not found in declarative config
if (include == null) {
include = System.getProperty(TRACE_METHODS_CONFIG);
}

Map<String, Set<String>> classMethodsToTrace =
MethodsConfigurationParser.parse(
AgentInstrumentationConfig.get().getString(TRACE_METHODS_CONFIG));
include != null ? MethodsConfigurationParser.parse(include) : emptyMap();

typeInstrumentations =
classMethodsToTrace.entrySet().stream()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,25 +4,54 @@
package io.opentelemetry.javaagent.instrumentation.micrometer.ai;

import io.micrometer.core.instrument.step.StepRegistryConfig;
import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig;
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil;
import java.time.Duration;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.Nullable;

public class AzureMonitorRegistryConfig implements StepRegistryConfig {

private static final Logger logger = Logger.getLogger(AzureMonitorRegistryConfig.class.getName());
private static final Duration DEFAULT_STEP = Duration.ofSeconds(60);

private final Duration step;
@Nullable private final String namespace;

public static final AzureMonitorRegistryConfig INSTANCE = new AzureMonitorRegistryConfig();

private AzureMonitorRegistryConfig() {
step =
AgentInstrumentationConfig.get()
.getDuration(
"applicationinsights.internal.micrometer.step.millis", Duration.ofSeconds(60));
namespace =
AgentInstrumentationConfig.get()
.getString("applicationinsights.internal.micrometer.namespace");
DeclarativeConfigProperties config =
DeclarativeConfigUtil.getInstrumentationConfig(GlobalOpenTelemetry.get(), "micrometer");

// Get step duration in milliseconds, default to 60 seconds
String stepMillisStr = config.getString("applicationinsights.internal.micrometer.step.millis");
// Fallback to system property if not found in declarative config
if (stepMillisStr == null) {
stepMillisStr = System.getProperty("applicationinsights.internal.micrometer.step.millis");
}

Duration parsedStep = DEFAULT_STEP;
if (stepMillisStr != null) {
try {
parsedStep = Duration.ofMillis(Long.parseLong(stepMillisStr));
} catch (NumberFormatException e) {
logger.log(
Level.WARNING,
"Invalid value for applicationinsights.internal.micrometer.step.millis: {0}, using default of {1}",
new Object[] {stepMillisStr, DEFAULT_STEP});
}
}
step = parsedStep;

String namespaceValue = config.getString("applicationinsights.internal.micrometer.namespace");
// Fallback to system property if not found in declarative config
if (namespaceValue == null) {
namespaceValue = System.getProperty("applicationinsights.internal.micrometer.namespace");
}
namespace = namespaceValue;
}

@Override
Expand Down
22 changes: 18 additions & 4 deletions buildSrc/src/main/kotlin/ai.shadow-conventions.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,27 @@ tasks.withType<ShadowJar>().configureEach {
// Exclude resource providers since they live in the agent class loader
exclude("io.opentelemetry.instrumentation.resources.*")
exclude("io.opentelemetry.instrumentation.spring.resources.*")
// Exclude already-shaded classes from upstream agent to prevent double relocation
exclude("io.opentelemetry.javaagent.shaded.instrumentation.*")
}

// relocate(OpenTelemetry API) since these classes live in the bootstrap class loader
relocate("io.opentelemetry.api", "io.opentelemetry.javaagent.shaded.io.opentelemetry.api")
relocate("io.opentelemetry.semconv", "io.opentelemetry.javaagent.shaded.io.opentelemetry.semconv")
relocate("io.opentelemetry.context", "io.opentelemetry.javaagent.shaded.io.opentelemetry.context")
relocate("io.opentelemetry.common", "io.opentelemetry.javaagent.shaded.io.opentelemetry.common")
relocate("io.opentelemetry.api", "io.opentelemetry.javaagent.shaded.io.opentelemetry.api") {
// Exclude already-shaded classes from upstream agent to prevent double relocation
exclude("io.opentelemetry.javaagent.shaded.io.opentelemetry.api.*")
}
relocate("io.opentelemetry.semconv", "io.opentelemetry.javaagent.shaded.io.opentelemetry.semconv") {
// Exclude already-shaded classes from upstream agent to prevent double relocation
exclude("io.opentelemetry.javaagent.shaded.io.opentelemetry.semconv.*")
}
relocate("io.opentelemetry.context", "io.opentelemetry.javaagent.shaded.io.opentelemetry.context") {
// Exclude already-shaded classes from upstream agent to prevent double relocation
exclude("io.opentelemetry.javaagent.shaded.io.opentelemetry.context.*")
}
relocate("io.opentelemetry.common", "io.opentelemetry.javaagent.shaded.io.opentelemetry.common") {
// Exclude already-shaded classes from upstream agent to prevent double relocation
exclude("io.opentelemetry.javaagent.shaded.io.opentelemetry.common.*")
}

// relocate(the OpenTelemetry extensions that are used by instrumentation modules)
// these extensions live in the AgentClassLoader, and are injected into the user's class loader
Expand Down
6 changes: 3 additions & 3 deletions dependencyManagement/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@ data class DependencySet(val group: String, val version: String, val modules: Li
val dependencyVersions = hashMapOf<String, String>()
rootProject.extra["versions"] = dependencyVersions

val otelSdkVersion = "1.55.0"
val otelInstrumentationAlphaVersion = "2.21.0-alpha"
val otelInstrumentationVersion = "2.21.0"
val otelSdkVersion = "1.58.0"
val otelInstrumentationAlphaVersion = "2.24.0-alpha"
val otelInstrumentationVersion = "2.24.0"
val otelContribVersion = "1.48.0"

rootProject.extra["otelInstrumentationVersion"] = otelInstrumentationVersion
Expand Down