From e360ca3628290c5fb04c44bb8f7fa05622900b30 Mon Sep 17 00:00:00 2001 From: "pg.yang" Date: Mon, 23 Jan 2023 16:10:23 +0800 Subject: [PATCH] Remove handler scan in otel receiver, manual initialization instead (#10303) --- docs/en/changes/changes.md | 1 + .../oap/server/receiver/otel/Handler.java | 35 +----------- .../otel/OtelMetricReceiverProvider.java | 40 +++++++------- .../receiver/otel/oc/OCMetricHandler.java | 23 +++++--- .../otel/otlp/OpenTelemetryMetricHandler.java | 55 +++++++++++-------- 5 files changed, 72 insertions(+), 82 deletions(-) diff --git a/docs/en/changes/changes.md b/docs/en/changes/changes.md index fd6aac7d5d..61bd10c947 100644 --- a/docs/en/changes/changes.md +++ b/docs/en/changes/changes.md @@ -82,6 +82,7 @@ * Add Python Websocket module component ID(7018). * [Optional] Optimize single trace query performance by customizing routing in ElasticSearch. SkyWalking trace segments and Zipkin spans are using trace ID for routing. This is OFF by default, controlled by `storage/elasticsearch/enableCustomRouting`. * Enhance OAP HTTP server to support HTTPS +* Remove handler scan in otel receiver, manual initialization instead #### UI 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 afaf0924f3..0a9b96abf5 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,43 +18,10 @@ package org.apache.skywalking.oap.server.receiver.otel; -import com.google.common.collect.ImmutableSet; -import com.google.common.reflect.ClassPath; -import java.io.IOException; -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import org.apache.skywalking.oap.server.core.analysis.meter.MeterSystem; -import org.apache.skywalking.oap.server.core.server.GRPCHandlerRegister; import org.apache.skywalking.oap.server.library.module.ModuleStartException; public interface Handler { - static List all() throws HandlerInitializationException { - ClassPath classpath; - try { - classpath = ClassPath.from(Handler.class.getClassLoader()); - } catch (IOException e) { - throw new HandlerInitializationException("failed to load handler classes", e); - } - ImmutableSet classes = classpath.getTopLevelClassesRecursive(Handler.class.getPackage().getName()); - List result = new ArrayList<>(); - for (ClassPath.ClassInfo each : classes) { - Class c = each.load(); - if (Arrays.stream(c.getInterfaces()).anyMatch(interfaceClass -> interfaceClass.isAssignableFrom(Handler.class))) { - try { - result.add((Handler) c.getDeclaredConstructor().newInstance()); - } catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { - throw new HandlerInitializationException("failed to get instances of handler classed", e); - } - } - } - return result; - } - String type(); - void active(OtelMetricReceiverConfig config, - MeterSystem meterSystem, - GRPCHandlerRegister grpcHandlerRegister) throws ModuleStartException; + 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 80233f01ba..baba16082b 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 @@ -18,20 +18,21 @@ package org.apache.skywalking.oap.server.receiver.otel; +import java.util.ArrayList; import java.util.List; -import org.apache.skywalking.oap.server.core.CoreModule; -import org.apache.skywalking.oap.server.core.analysis.meter.MeterSystem; -import org.apache.skywalking.oap.server.core.server.GRPCHandlerRegister; 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.oc.OCMetricHandler; +import org.apache.skywalking.oap.server.receiver.otel.otlp.OpenTelemetryMetricHandler; import org.apache.skywalking.oap.server.receiver.sharing.server.SharingServerModule; -import static java.util.stream.Collectors.toList; - public class OtelMetricReceiverProvider extends ModuleProvider { public static final String NAME = "default"; + + private List handlers; + private OtelMetricReceiverConfig config; @Override @@ -45,10 +46,10 @@ public class OtelMetricReceiverProvider extends ModuleProvider { } @Override - public ConfigCreator newConfigCreator() { + public ConfigCreator newConfigCreator() { return new ConfigCreator() { @Override - public Class type() { + public Class type() { return OtelMetricReceiverConfig.class; } @@ -61,23 +62,24 @@ public class OtelMetricReceiverProvider extends ModuleProvider { @Override public void prepare() throws ServiceNotProvidedException, ModuleStartException { + final List enabledHandlers = config.getEnabledHandlers(); + List handlers = new ArrayList<>(); + final OpenTelemetryMetricHandler openTelemetryMetricHandler = new OpenTelemetryMetricHandler( + getManager(), config); + if (enabledHandlers.contains(openTelemetryMetricHandler.type())) { + handlers.add(openTelemetryMetricHandler); + } + final OCMetricHandler ocMetricHandler = new OCMetricHandler(getManager(), config); + if (enabledHandlers.contains(ocMetricHandler.type())) { + handlers.add(ocMetricHandler); + } + this.handlers = handlers; } @Override public void start() throws ServiceNotProvidedException, ModuleStartException { - if (config.getEnabledHandlers().isEmpty()) { - return; - } - GRPCHandlerRegister grpcHandlerRegister = getManager().find(SharingServerModule.NAME) - .provider() - .getService(GRPCHandlerRegister.class); - final MeterSystem meterSystem = getManager().find(CoreModule.NAME).provider().getService(MeterSystem.class); - final List handlers = - Handler.all().stream() - .filter(h -> config.getEnabledHandlers().contains(h.type())) - .collect(toList()); for (Handler h : handlers) { - h.active(config, meterSystem, grpcHandlerRegister); + h.active(); } } diff --git a/oap-server/server-receiver-plugin/otel-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/otel/oc/OCMetricHandler.java b/oap-server/server-receiver-plugin/otel-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/otel/oc/OCMetricHandler.java index d5d4ea19d6..b8c4baf9aa 100644 --- a/oap-server/server-receiver-plugin/otel-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/otel/oc/OCMetricHandler.java +++ b/oap-server/server-receiver-plugin/otel-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/otel/oc/OCMetricHandler.java @@ -33,33 +33,41 @@ import io.opencensus.proto.metrics.v1.SummaryValue; import io.opencensus.proto.resource.v1.Resource; import io.vavr.Function1; import io.vavr.Tuple; - import java.io.IOException; import java.time.Instant; import java.util.HashMap; import java.util.List; import java.util.Map; - -import org.apache.skywalking.oap.server.library.util.StringUtil; +import lombok.RequiredArgsConstructor; import org.apache.skywalking.oap.meter.analyzer.MetricConvert; import org.apache.skywalking.oap.meter.analyzer.prometheus.PrometheusMetricConverter; import org.apache.skywalking.oap.meter.analyzer.prometheus.rule.Rule; import org.apache.skywalking.oap.meter.analyzer.prometheus.rule.Rules; +import org.apache.skywalking.oap.server.core.CoreModule; import org.apache.skywalking.oap.server.core.analysis.meter.MeterSystem; 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.library.util.StringUtil; import org.apache.skywalking.oap.server.library.util.prometheus.metrics.Counter; import org.apache.skywalking.oap.server.library.util.prometheus.metrics.Gauge; import org.apache.skywalking.oap.server.library.util.prometheus.metrics.Histogram; import org.apache.skywalking.oap.server.library.util.prometheus.metrics.Summary; 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 static java.util.stream.Collectors.toList; +@RequiredArgsConstructor public class OCMetricHandler extends MetricsServiceGrpc.MetricsServiceImplBase implements Handler { private static final String HOST_NAME_LABEL = "node_identifier_host_name"; private List converters; + private final ModuleManager manager; + + private final OtelMetricReceiverConfig config; + @Override public StreamObserver export( StreamObserver responseObserver) { return new StreamObserver() { @@ -175,10 +183,7 @@ public class OCMetricHandler extends MetricsServiceGrpc.MetricsServiceImplBase i } @Override - public void active( - OtelMetricReceiverConfig config, - MeterSystem meterSystem, - GRPCHandlerRegister grpcHandlerRegister) + public void active() throws ModuleStartException { final List enabledRules = Splitter.on(",") @@ -193,6 +198,10 @@ public class OCMetricHandler extends MetricsServiceGrpc.MetricsServiceImplBase i if (rules.isEmpty()) { return; } + GRPCHandlerRegister grpcHandlerRegister = manager.find(SharingServerModule.NAME) + .provider() + .getService(GRPCHandlerRegister.class); + final MeterSystem meterSystem = manager.find(CoreModule.NAME).provider().getService(MeterSystem.class); this.converters = rules.stream().map(r -> new PrometheusMetricConverter(r, meterSystem)) .collect(toList()); grpcHandlerRegister.addHandler(this); 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 fd18e6970b..304bdb0a94 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 @@ -18,22 +18,32 @@ package org.apache.skywalking.oap.server.receiver.otel.otlp; -import static io.opentelemetry.proto.metrics.v1.AggregationTemporality.AGGREGATION_TEMPORALITY_CUMULATIVE; -import static java.util.stream.Collectors.toList; -import static java.util.stream.Collectors.toMap; - +import com.google.common.base.Splitter; +import com.google.common.collect.ImmutableMap; +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 io.opentelemetry.proto.common.v1.KeyValue; +import io.opentelemetry.proto.metrics.v1.Sum; +import io.opentelemetry.proto.metrics.v1.SummaryDataPoint.ValueAtQuantile; +import io.vavr.Function1; import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.function.Function; import java.util.stream.Stream; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.apache.skywalking.oap.meter.analyzer.MetricConvert; import org.apache.skywalking.oap.meter.analyzer.prometheus.PrometheusMetricConverter; import org.apache.skywalking.oap.meter.analyzer.prometheus.rule.Rule; import org.apache.skywalking.oap.meter.analyzer.prometheus.rule.Rules; +import org.apache.skywalking.oap.server.core.CoreModule; import org.apache.skywalking.oap.server.core.analysis.meter.MeterSystem; 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.library.util.prometheus.metrics.Counter; import org.apache.skywalking.oap.server.library.util.prometheus.metrics.Gauge; @@ -42,23 +52,22 @@ import org.apache.skywalking.oap.server.library.util.prometheus.metrics.Metric; import org.apache.skywalking.oap.server.library.util.prometheus.metrics.Summary; import org.apache.skywalking.oap.server.receiver.otel.Handler; import org.apache.skywalking.oap.server.receiver.otel.OtelMetricReceiverConfig; -import com.google.common.base.Splitter; -import com.google.common.collect.ImmutableMap; -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 io.opentelemetry.proto.common.v1.KeyValue; -import io.opentelemetry.proto.metrics.v1.Sum; -import io.opentelemetry.proto.metrics.v1.SummaryDataPoint.ValueAtQuantile; -import io.vavr.Function1; -import lombok.extern.slf4j.Slf4j; +import org.apache.skywalking.oap.server.receiver.sharing.server.SharingServerModule; + +import static io.opentelemetry.proto.metrics.v1.AggregationTemporality.AGGREGATION_TEMPORALITY_CUMULATIVE; +import static java.util.stream.Collectors.toList; +import static java.util.stream.Collectors.toMap; @Slf4j +@RequiredArgsConstructor public class OpenTelemetryMetricHandler extends MetricsServiceGrpc.MetricsServiceImplBase implements Handler { + private final ModuleManager manager; + + private final OtelMetricReceiverConfig config; + private static final Map LABEL_MAPPINGS = ImmutableMap .builder() @@ -75,14 +84,11 @@ public class OpenTelemetryMetricHandler } @Override - public void active( - final OtelMetricReceiverConfig config, - final MeterSystem service, - final GRPCHandlerRegister grpcHandlerRegister) throws ModuleStartException { + public void active() throws ModuleStartException { final List enabledRules = Splitter.on(",") - .omitEmptyStrings() - .splitToList(config.getEnabledOtelRules()); + .omitEmptyStrings() + .splitToList(config.getEnabledOtelRules()); final List rules; try { rules = Rules.loadRules("otel-rules", enabledRules); @@ -94,9 +100,14 @@ public class OpenTelemetryMetricHandler return; } + GRPCHandlerRegister grpcHandlerRegister = manager.find(SharingServerModule.NAME) + .provider() + .getService(GRPCHandlerRegister.class); + final MeterSystem meterSystem = manager.find(CoreModule.NAME).provider().getService(MeterSystem.class); + converters = rules .stream() - .map(r -> new PrometheusMetricConverter(r, service)) + .map(r -> new PrometheusMetricConverter(r, meterSystem)) .collect(toList()); grpcHandlerRegister.addHandler(this); -- GitLab