forked from quarkusio/quarkus
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request quarkusio#28792 from brunobat/otel-autoconfigure-3
Fix vertx otel sdk reload in devmode
- Loading branch information
Showing
10 changed files
with
284 additions
and
119 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
115 changes: 115 additions & 0 deletions
115
...io/quarkus/opentelemetry/deployment/tracing/instrumentation/InstrumentationProcessor.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,115 @@ | ||
package io.quarkus.opentelemetry.deployment.tracing.instrumentation; | ||
|
||
import static io.quarkus.bootstrap.classloading.QuarkusClassLoader.isClassPresentAtRuntime; | ||
import static javax.interceptor.Interceptor.Priority.LIBRARY_AFTER; | ||
|
||
import java.util.Optional; | ||
import java.util.function.BooleanSupplier; | ||
import java.util.function.Consumer; | ||
|
||
import org.eclipse.microprofile.config.Config; | ||
import org.eclipse.microprofile.config.ConfigProvider; | ||
|
||
import io.quarkus.arc.deployment.AdditionalBeanBuildItem; | ||
import io.quarkus.deployment.Capabilities; | ||
import io.quarkus.deployment.Capability; | ||
import io.quarkus.deployment.annotations.BuildProducer; | ||
import io.quarkus.deployment.annotations.BuildStep; | ||
import io.quarkus.deployment.annotations.BuildSteps; | ||
import io.quarkus.deployment.annotations.ExecutionTime; | ||
import io.quarkus.deployment.annotations.Record; | ||
import io.quarkus.deployment.builditem.AdditionalIndexedClassesBuildItem; | ||
import io.quarkus.deployment.builditem.LaunchModeBuildItem; | ||
import io.quarkus.opentelemetry.deployment.tracing.TracerEnabled; | ||
import io.quarkus.opentelemetry.runtime.tracing.intrumentation.InstrumentationRecorder; | ||
import io.quarkus.opentelemetry.runtime.tracing.intrumentation.grpc.GrpcTracingClientInterceptor; | ||
import io.quarkus.opentelemetry.runtime.tracing.intrumentation.grpc.GrpcTracingServerInterceptor; | ||
import io.quarkus.opentelemetry.runtime.tracing.intrumentation.reactivemessaging.ReactiveMessagingTracingDecorator; | ||
import io.quarkus.opentelemetry.runtime.tracing.intrumentation.restclient.OpenTelemetryClientFilter; | ||
import io.quarkus.runtime.LaunchMode; | ||
import io.quarkus.vertx.core.deployment.VertxOptionsConsumerBuildItem; | ||
import io.vertx.core.VertxOptions; | ||
|
||
@BuildSteps(onlyIf = TracerEnabled.class) | ||
public class InstrumentationProcessor { | ||
static class MetricsExtensionAvailable implements BooleanSupplier { | ||
private static final boolean IS_MICROMETER_EXTENSION_AVAILABLE = isClassPresentAtRuntime( | ||
"io.quarkus.micrometer.runtime.binder.vertx.VertxHttpServerMetrics"); | ||
|
||
@Override | ||
public boolean getAsBoolean() { | ||
Config config = ConfigProvider.getConfig(); | ||
if (IS_MICROMETER_EXTENSION_AVAILABLE) { | ||
if (config.getOptionalValue("quarkus.micrometer.enabled", Boolean.class).orElse(true)) { | ||
Optional<Boolean> httpServerEnabled = config | ||
.getOptionalValue("quarkus.micrometer.binder.http-server.enabled", Boolean.class); | ||
if (httpServerEnabled.isPresent()) { | ||
return httpServerEnabled.get(); | ||
} else { | ||
return config.getOptionalValue("quarkus.micrometer.binder-enabled-default", Boolean.class).orElse(true); | ||
} | ||
} | ||
} | ||
return false; | ||
} | ||
} | ||
|
||
static class GrpcExtensionAvailable implements BooleanSupplier { | ||
private static final boolean IS_GRPC_EXTENSION_AVAILABLE = isClassPresentAtRuntime( | ||
"io.quarkus.grpc.runtime.GrpcServerRecorder"); | ||
|
||
@Override | ||
public boolean getAsBoolean() { | ||
return IS_GRPC_EXTENSION_AVAILABLE; | ||
} | ||
} | ||
|
||
@BuildStep(onlyIf = GrpcExtensionAvailable.class) | ||
void grpcTracers(BuildProducer<AdditionalBeanBuildItem> additionalBeans) { | ||
additionalBeans.produce(new AdditionalBeanBuildItem(GrpcTracingServerInterceptor.class)); | ||
additionalBeans.produce(new AdditionalBeanBuildItem(GrpcTracingClientInterceptor.class)); | ||
} | ||
|
||
@BuildStep | ||
void registerRestClientClassicProvider( | ||
Capabilities capabilities, | ||
BuildProducer<AdditionalIndexedClassesBuildItem> additionalIndexed, | ||
BuildProducer<AdditionalBeanBuildItem> additionalBeans) { | ||
if (capabilities.isPresent(Capability.REST_CLIENT) && capabilities.isMissing(Capability.REST_CLIENT_REACTIVE)) { | ||
additionalIndexed.produce(new AdditionalIndexedClassesBuildItem(OpenTelemetryClientFilter.class.getName())); | ||
additionalBeans.produce(new AdditionalBeanBuildItem(OpenTelemetryClientFilter.class)); | ||
} | ||
} | ||
|
||
@BuildStep | ||
void registerReactiveMessagingMessageDecorator( | ||
Capabilities capabilities, | ||
BuildProducer<AdditionalBeanBuildItem> additionalBeans) { | ||
if (capabilities.isPresent(Capability.SMALLRYE_REACTIVE_MESSAGING)) { | ||
additionalBeans.produce(new AdditionalBeanBuildItem(ReactiveMessagingTracingDecorator.class)); | ||
} | ||
} | ||
|
||
@BuildStep(onlyIfNot = MetricsExtensionAvailable.class) | ||
@Record(ExecutionTime.STATIC_INIT) | ||
VertxOptionsConsumerBuildItem vertxTracingMetricsOptions(InstrumentationRecorder recorder) { | ||
return new VertxOptionsConsumerBuildItem(recorder.getVertxTracingMetricsOptions(), LIBRARY_AFTER + 1); | ||
} | ||
|
||
@BuildStep | ||
@Record(ExecutionTime.RUNTIME_INIT) | ||
VertxOptionsConsumerBuildItem vertxTracingOptions(InstrumentationRecorder recorder, | ||
LaunchModeBuildItem launchMode) { | ||
Consumer<VertxOptions> vertxTracingOptions; | ||
if (launchMode.getLaunchMode() == LaunchMode.DEVELOPMENT) { | ||
// tracers are set in the OpenTelemetryProcessor | ||
vertxTracingOptions = recorder.getVertxTracingOptionsDevMode(); | ||
} else { | ||
vertxTracingOptions = recorder.getVertxTracingOptionsProd(recorder.createTracers()); | ||
} | ||
return new VertxOptionsConsumerBuildItem( | ||
vertxTracingOptions, | ||
LIBRARY_AFTER); | ||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
66 changes: 66 additions & 0 deletions
66
...java/io/quarkus/opentelemetry/runtime/tracing/intrumentation/InstrumentationRecorder.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,66 @@ | ||
package io.quarkus.opentelemetry.runtime.tracing.intrumentation; | ||
|
||
import java.util.ArrayList; | ||
import java.util.List; | ||
import java.util.function.Consumer; | ||
|
||
import io.opentelemetry.api.GlobalOpenTelemetry; | ||
import io.opentelemetry.api.OpenTelemetry; | ||
import io.quarkus.opentelemetry.runtime.tracing.intrumentation.vertx.EventBusInstrumenterVertxTracer; | ||
import io.quarkus.opentelemetry.runtime.tracing.intrumentation.vertx.HttpInstrumenterVertxTracer; | ||
import io.quarkus.opentelemetry.runtime.tracing.intrumentation.vertx.InstrumenterVertxTracer; | ||
import io.quarkus.opentelemetry.runtime.tracing.intrumentation.vertx.OpenTelemetryVertxMetricsFactory; | ||
import io.quarkus.opentelemetry.runtime.tracing.intrumentation.vertx.OpenTelemetryVertxTracer; | ||
import io.quarkus.opentelemetry.runtime.tracing.intrumentation.vertx.OpenTelemetryVertxTracingDevModeFactory; | ||
import io.quarkus.opentelemetry.runtime.tracing.intrumentation.vertx.OpenTelemetryVertxTracingFactory; | ||
import io.quarkus.opentelemetry.runtime.tracing.intrumentation.vertx.SqlClientInstrumenterVertxTracer; | ||
import io.quarkus.runtime.RuntimeValue; | ||
import io.quarkus.runtime.annotations.Recorder; | ||
import io.vertx.core.VertxOptions; | ||
import io.vertx.core.metrics.MetricsOptions; | ||
import io.vertx.core.tracing.TracingOptions; | ||
|
||
@Recorder | ||
public class InstrumentationRecorder { | ||
|
||
public static final OpenTelemetryVertxTracingDevModeFactory FACTORY = new OpenTelemetryVertxTracingDevModeFactory(); | ||
|
||
/* RUNTIME INIT */ | ||
public RuntimeValue<OpenTelemetryVertxTracer> createTracers() { | ||
OpenTelemetry openTelemetry = GlobalOpenTelemetry.get(); | ||
List<InstrumenterVertxTracer<?, ?>> instrumenterVertxTracers = new ArrayList<>(); | ||
instrumenterVertxTracers.add(new HttpInstrumenterVertxTracer(openTelemetry)); | ||
instrumenterVertxTracers.add(new EventBusInstrumenterVertxTracer(openTelemetry)); | ||
// TODO - Selectively register this in the recorder if the SQL Client is available. | ||
instrumenterVertxTracers.add(new SqlClientInstrumenterVertxTracer(openTelemetry)); | ||
return new RuntimeValue<>(new OpenTelemetryVertxTracer(instrumenterVertxTracers)); | ||
} | ||
|
||
/* RUNTIME INIT */ | ||
public Consumer<VertxOptions> getVertxTracingOptionsProd( | ||
RuntimeValue<OpenTelemetryVertxTracer> tracer) { | ||
TracingOptions tracingOptions = new TracingOptions() | ||
.setFactory(new OpenTelemetryVertxTracingFactory(tracer.getValue())); | ||
return vertxOptions -> vertxOptions.setTracingOptions(tracingOptions); | ||
} | ||
|
||
/* RUNTIME INIT */ | ||
public Consumer<VertxOptions> getVertxTracingOptionsDevMode() { | ||
TracingOptions tracingOptions = new TracingOptions() | ||
.setFactory(FACTORY); | ||
return vertxOptions -> vertxOptions.setTracingOptions(tracingOptions); | ||
} | ||
|
||
/* RUNTIME INIT */ | ||
public void setTracerDevMode(RuntimeValue<OpenTelemetryVertxTracer> tracer) { | ||
FACTORY.getVertxTracerDelegator().setDelegate(tracer.getValue()); | ||
} | ||
|
||
/* RUNTIME INIT */ | ||
public Consumer<VertxOptions> getVertxTracingMetricsOptions() { | ||
MetricsOptions metricsOptions = new MetricsOptions() | ||
.setEnabled(true) | ||
.setFactory(new OpenTelemetryVertxMetricsFactory()); | ||
return vertxOptions -> vertxOptions.setMetricsOptions(metricsOptions); | ||
} | ||
} |
Oops, something went wrong.