This is an automated email from the ASF dual-hosted git repository. kezhenxu94 pushed a commit to branch otelhandlerspi in repository https://gitbox.apache.org/repos/asf/skywalking.git
commit d740467a2c3ae37f82fb8445af95c84377e24b46 Author: kezhenxu94 <kezhenx...@apache.org> AuthorDate: Thu Jun 12 16:28:58 2025 +0800 refactor: implement OTEL handler with SPI for extensibility --- .../oap/server/receiver/otel/Handler.java | 3 +++ .../receiver/otel/OtelMetricReceiverProvider.java | 24 ++++++++-------------- .../otel/otlp/OpenTelemetryLogHandler.java | 8 +++++++- .../otel/otlp/OpenTelemetryMetricHandler.java | 16 +++++++++++---- .../otel/otlp/OpenTelemetryTraceHandler.java | 9 ++++++-- ...che.skywalking.oap.server.receiver.otel.Handler | 3 +++ 6 files changed, 40 insertions(+), 23 deletions(-) diff --git a/oap-server/server-receiver-plugin/otel-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/otel/Handler.java b/oap-server/server-receiver-plugin/otel-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/otel/Handler.java index 0a9b96abf5..a631af4fcc 100644 --- a/oap-server/server-receiver-plugin/otel-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/otel/Handler.java +++ b/oap-server/server-receiver-plugin/otel-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/otel/Handler.java @@ -18,9 +18,12 @@ package org.apache.skywalking.oap.server.receiver.otel; +import org.apache.skywalking.oap.server.library.module.ModuleManager; import org.apache.skywalking.oap.server.library.module.ModuleStartException; public interface Handler { + void init(ModuleManager manager, OtelMetricReceiverConfig config); + String type(); void active() throws ModuleStartException; diff --git a/oap-server/server-receiver-plugin/otel-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/otel/OtelMetricReceiverProvider.java b/oap-server/server-receiver-plugin/otel-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/otel/OtelMetricReceiverProvider.java index 0cf91ca315..61fc0b5793 100644 --- a/oap-server/server-receiver-plugin/otel-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/otel/OtelMetricReceiverProvider.java +++ b/oap-server/server-receiver-plugin/otel-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/otel/OtelMetricReceiverProvider.java @@ -22,14 +22,12 @@ import org.apache.skywalking.oap.server.library.module.ModuleDefine; import org.apache.skywalking.oap.server.library.module.ModuleProvider; import org.apache.skywalking.oap.server.library.module.ModuleStartException; import org.apache.skywalking.oap.server.library.module.ServiceNotProvidedException; -import org.apache.skywalking.oap.server.receiver.otel.otlp.OpenTelemetryLogHandler; -import org.apache.skywalking.oap.server.receiver.otel.otlp.OpenTelemetryMetricHandler; import org.apache.skywalking.oap.server.receiver.otel.otlp.OpenTelemetryMetricRequestProcessor; -import org.apache.skywalking.oap.server.receiver.otel.otlp.OpenTelemetryTraceHandler; import org.apache.skywalking.oap.server.receiver.sharing.server.SharingServerModule; import java.util.ArrayList; import java.util.List; +import java.util.ServiceLoader; public class OtelMetricReceiverProvider extends ModuleProvider { public static final String NAME = "default"; @@ -71,21 +69,15 @@ public class OtelMetricReceiverProvider extends ModuleProvider { getManager(), config); registerServiceImplementation(OpenTelemetryMetricRequestProcessor.class, metricRequestProcessor); final List<String> enabledHandlers = config.getEnabledHandlers(); - List<Handler> handlers = new ArrayList<>(); - final var openTelemetryMetricHandler = new OpenTelemetryMetricHandler(getManager(), metricRequestProcessor); - if (enabledHandlers.contains(openTelemetryMetricHandler.type())) { - handlers.add(openTelemetryMetricHandler); - } - final var openTelemetryLogHandler = new OpenTelemetryLogHandler(getManager()); - if (enabledHandlers.contains(openTelemetryLogHandler.type())) { - handlers.add(openTelemetryLogHandler); - } - final var openTelemetryTraceHandler = new OpenTelemetryTraceHandler(getManager()); - if (enabledHandlers.contains(openTelemetryTraceHandler.type())) { - handlers.add(openTelemetryTraceHandler); + final var activatedHandlers = new ArrayList<Handler>(); + for (final var handler: ServiceLoader.load(Handler.class)) { + if (enabledHandlers.contains(handler.type())) { + handler.init(getManager(), config); + activatedHandlers.add(handler); + } } - this.handlers = handlers; + this.handlers = activatedHandlers; } @Override diff --git a/oap-server/server-receiver-plugin/otel-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/otel/otlp/OpenTelemetryLogHandler.java b/oap-server/server-receiver-plugin/otel-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/otel/otlp/OpenTelemetryLogHandler.java index 35c75b7ace..a98839445c 100644 --- a/oap-server/server-receiver-plugin/otel-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/otel/otlp/OpenTelemetryLogHandler.java +++ b/oap-server/server-receiver-plugin/otel-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/otel/otlp/OpenTelemetryLogHandler.java @@ -39,6 +39,7 @@ import org.apache.skywalking.oap.server.core.server.GRPCHandlerRegister; import org.apache.skywalking.oap.server.library.module.ModuleManager; import org.apache.skywalking.oap.server.library.module.ModuleStartException; import org.apache.skywalking.oap.server.receiver.otel.Handler; +import org.apache.skywalking.oap.server.receiver.otel.OtelMetricReceiverConfig; import org.apache.skywalking.oap.server.receiver.sharing.server.SharingServerModule; import org.apache.skywalking.oap.server.telemetry.TelemetryModule; import org.apache.skywalking.oap.server.telemetry.api.HistogramMetrics; @@ -55,7 +56,7 @@ import static java.util.stream.Collectors.toMap; public class OpenTelemetryLogHandler extends LogsServiceGrpc.LogsServiceImplBase implements Handler { - private final ModuleManager manager; + private ModuleManager manager; private ILogAnalyzerService logAnalyzerService; @@ -70,6 +71,11 @@ public class OpenTelemetryLogHandler MetricsTag.EMPTY_VALUE ); + @Override + public void init(ModuleManager manager, OtelMetricReceiverConfig config) { + this.manager = manager; + } + @Override public String type() { return "otlp-logs"; diff --git a/oap-server/server-receiver-plugin/otel-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/otel/otlp/OpenTelemetryMetricHandler.java b/oap-server/server-receiver-plugin/otel-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/otel/otlp/OpenTelemetryMetricHandler.java index edc7941221..5c69711ee6 100644 --- a/oap-server/server-receiver-plugin/otel-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/otel/otlp/OpenTelemetryMetricHandler.java +++ b/oap-server/server-receiver-plugin/otel-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/otel/otlp/OpenTelemetryMetricHandler.java @@ -22,22 +22,30 @@ import io.grpc.stub.StreamObserver; import io.opentelemetry.proto.collector.metrics.v1.ExportMetricsServiceRequest; import io.opentelemetry.proto.collector.metrics.v1.ExportMetricsServiceResponse; import io.opentelemetry.proto.collector.metrics.v1.MetricsServiceGrpc; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.skywalking.oap.server.core.server.GRPCHandlerRegister; import org.apache.skywalking.oap.server.library.module.ModuleManager; import org.apache.skywalking.oap.server.library.module.ModuleStartException; import org.apache.skywalking.oap.server.receiver.otel.Handler; +import org.apache.skywalking.oap.server.receiver.otel.OtelMetricReceiverConfig; +import org.apache.skywalking.oap.server.receiver.otel.OtelMetricReceiverModule; import org.apache.skywalking.oap.server.receiver.sharing.server.SharingServerModule; @Slf4j -@RequiredArgsConstructor public class OpenTelemetryMetricHandler extends MetricsServiceGrpc.MetricsServiceImplBase implements Handler { - private final ModuleManager manager; - private final OpenTelemetryMetricRequestProcessor metricRequestProcessor; + private OpenTelemetryMetricRequestProcessor metricRequestProcessor; + private ModuleManager manager; + + @Override + public void init(ModuleManager manager, OtelMetricReceiverConfig config) { + this.manager = manager; + metricRequestProcessor = manager.find(OtelMetricReceiverModule.NAME) + .provider() + .getService(OpenTelemetryMetricRequestProcessor.class); + } @Override public String type() { diff --git a/oap-server/server-receiver-plugin/otel-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/otel/otlp/OpenTelemetryTraceHandler.java b/oap-server/server-receiver-plugin/otel-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/otel/otlp/OpenTelemetryTraceHandler.java index f1b687ba50..cd044de18a 100644 --- a/oap-server/server-receiver-plugin/otel-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/otel/otlp/OpenTelemetryTraceHandler.java +++ b/oap-server/server-receiver-plugin/otel-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/otel/otlp/OpenTelemetryTraceHandler.java @@ -38,6 +38,7 @@ import org.apache.skywalking.oap.server.library.module.ModuleManager; import org.apache.skywalking.oap.server.library.module.ModuleStartException; import org.apache.skywalking.oap.server.library.util.StringUtil; import org.apache.skywalking.oap.server.receiver.otel.Handler; +import org.apache.skywalking.oap.server.receiver.otel.OtelMetricReceiverConfig; import org.apache.skywalking.oap.server.receiver.sharing.server.SharingServerModule; import org.apache.skywalking.oap.server.receiver.zipkin.SpanForwardService; import org.apache.skywalking.oap.server.receiver.zipkin.ZipkinReceiverModule; @@ -62,11 +63,10 @@ import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @Slf4j -@RequiredArgsConstructor public class OpenTelemetryTraceHandler extends TraceServiceGrpc.TraceServiceImplBase implements Handler { - private final ModuleManager manager; + private ModuleManager manager; private SpanForwardService forwardService; @Getter(lazy = true) @@ -80,6 +80,11 @@ public class OpenTelemetryTraceHandler MetricsTag.EMPTY_VALUE ); + @Override + public void init(ModuleManager manager, OtelMetricReceiverConfig config) { + this.manager = manager; + } + @Override public String type() { return "otlp-traces"; diff --git a/oap-server/server-receiver-plugin/otel-receiver-plugin/src/main/resources/META-INF/services/org.apache.skywalking.oap.server.receiver.otel.Handler b/oap-server/server-receiver-plugin/otel-receiver-plugin/src/main/resources/META-INF/services/org.apache.skywalking.oap.server.receiver.otel.Handler new file mode 100644 index 0000000000..210561be2e --- /dev/null +++ b/oap-server/server-receiver-plugin/otel-receiver-plugin/src/main/resources/META-INF/services/org.apache.skywalking.oap.server.receiver.otel.Handler @@ -0,0 +1,3 @@ +org.apache.skywalking.oap.server.receiver.otel.otlp.OpenTelemetryMetricHandler +org.apache.skywalking.oap.server.receiver.otel.otlp.OpenTelemetryLogHandler +org.apache.skywalking.oap.server.receiver.otel.otlp.OpenTelemetryTraceHandler