opentelemetry-java-instrume.../javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/OpenTelemetryInstaller.java

73 lines
2.8 KiB
Java

/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.javaagent.tooling;
import com.google.auto.service.AutoService;
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.api.metrics.GlobalMeterProvider;
import io.opentelemetry.api.metrics.MeterProvider;
import io.opentelemetry.extension.noopapi.NoopOpenTelemetry;
import io.opentelemetry.instrumentation.api.config.Config;
import io.opentelemetry.javaagent.extension.AgentListener;
import io.opentelemetry.javaagent.instrumentation.api.OpenTelemetrySdkAccess;
import io.opentelemetry.javaagent.tooling.config.ConfigPropertiesAdapter;
import io.opentelemetry.sdk.OpenTelemetrySdk;
import io.opentelemetry.sdk.autoconfigure.OpenTelemetrySdkAutoConfiguration;
import io.opentelemetry.sdk.common.CompletableResultCode;
import io.opentelemetry.sdk.metrics.SdkMeterProvider;
import java.util.Arrays;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@AutoService(AgentListener.class)
public class OpenTelemetryInstaller implements AgentListener {
private static final Logger logger = LoggerFactory.getLogger(OpenTelemetryInstaller.class);
static final String JAVAAGENT_ENABLED_CONFIG = "otel.javaagent.enabled";
static final String JAVAAGENT_NOOP_CONFIG = "otel.javaagent.experimental.use-noop-api";
@Override
public void beforeAgent(Config config) {
installAgentTracer(config);
}
/**
* Register agent tracer if no agent tracer is already registered.
*
* @param config Configuration instance
*/
@SuppressWarnings("unused")
public static synchronized void installAgentTracer(Config config) {
if (config.getBoolean(JAVAAGENT_ENABLED_CONFIG, true)) {
if (config.getBoolean(JAVAAGENT_NOOP_CONFIG, false)) {
GlobalOpenTelemetry.set(NoopOpenTelemetry.getInstance());
} else {
System.setProperty("io.opentelemetry.context.contextStorageProvider", "default");
OpenTelemetrySdk sdk =
OpenTelemetrySdkAutoConfiguration.initialize(true, new ConfigPropertiesAdapter(config));
OpenTelemetrySdkAccess.internalSetForceFlush(
(timeout, unit) -> {
CompletableResultCode traceResult = sdk.getSdkTracerProvider().forceFlush();
MeterProvider meterProvider = GlobalMeterProvider.get();
final CompletableResultCode metricsResult;
if (meterProvider instanceof SdkMeterProvider) {
metricsResult = ((SdkMeterProvider) meterProvider).forceFlush();
} else {
metricsResult = CompletableResultCode.ofSuccess();
}
CompletableResultCode.ofAll(Arrays.asList(traceResult, metricsResult))
.join(timeout, unit);
});
}
} else {
logger.info("Tracing is disabled.");
}
}
}