You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by wu...@apache.org on 2021/03/11 01:14:05 UTC

[skywalking] branch master updated: Add telemetry data about metrics in, metrics scraping and trace in metrics to zipkin receiver. (#6516)

This is an automated email from the ASF dual-hosted git repository.

wusheng pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/skywalking.git


The following commit(s) were added to refs/heads/master by this push:
     new d9617cb  Add telemetry data about metrics in, metrics scraping and trace in metrics to zipkin receiver. (#6516)
d9617cb is described below

commit d9617cbe7b417774d9f0d1f14461ff5d0d5a01e5
Author: Ax1an <ax...@foxmail.com>
AuthorDate: Thu Mar 11 09:13:49 2021 +0800

    Add telemetry data about metrics in, metrics scraping and trace in metrics to zipkin receiver. (#6516)
---
 CHANGES.md                                         |   1 +
 .../agent/kafka/provider/KafkaFetcherProvider.java |   2 +
 .../provider/handler/MeterServiceHandler.java      |  28 +++++-
 .../provider/PrometheusFetcherProvider.java        | 103 +++++++++++++--------
 .../meter/provider/MeterReceiverProvider.java      |   4 +-
 .../provider/handler/MeterServiceHandler.java      |  28 +++++-
 .../receiver/zipkin/ZipkinReceiverProvider.java    |   6 +-
 .../zipkin/handler/SpanV1JettyHandler.java         |  21 ++++-
 .../zipkin/handler/SpanV2JettyHandler.java         |  21 ++++-
 9 files changed, 166 insertions(+), 48 deletions(-)

diff --git a/CHANGES.md b/CHANGES.md
index 8dfc92c..019545f 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -45,6 +45,7 @@ Release Notes.
 * Save Envoy http access logs when error occurs.
 * Fix wrong `service_instance_sla` setting in the `topology-instance.yml`.
 * Fix wrong metrics name setting in the `self-observability.yml`.
+* Add telemetry data about metrics in, metrics scraping and trace in metrics to zipkin receiver.
 
 #### UI
 * Update selector scroller to show in all pages.
diff --git a/oap-server/server-fetcher-plugin/kafka-fetcher-plugin/src/main/java/org/apache/skywalking/oap/server/analyzer/agent/kafka/provider/KafkaFetcherProvider.java b/oap-server/server-fetcher-plugin/kafka-fetcher-plugin/src/main/java/org/apache/skywalking/oap/server/analyzer/agent/kafka/provider/KafkaFetcherProvider.java
index 89ca6da..367edf2 100644
--- a/oap-server/server-fetcher-plugin/kafka-fetcher-plugin/src/main/java/org/apache/skywalking/oap/server/analyzer/agent/kafka/provider/KafkaFetcherProvider.java
+++ b/oap-server/server-fetcher-plugin/kafka-fetcher-plugin/src/main/java/org/apache/skywalking/oap/server/analyzer/agent/kafka/provider/KafkaFetcherProvider.java
@@ -36,6 +36,7 @@ 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.telemetry.TelemetryModule;
 
 @Slf4j
 public class KafkaFetcherProvider extends ModuleProvider {
@@ -89,6 +90,7 @@ public class KafkaFetcherProvider extends ModuleProvider {
     @Override
     public String[] requiredModules() {
         return new String[] {
+            TelemetryModule.NAME,
             AnalyzerModule.NAME,
             LogAnalyzerModule.NAME,
             CoreModule.NAME
diff --git a/oap-server/server-fetcher-plugin/kafka-fetcher-plugin/src/main/java/org/apache/skywalking/oap/server/analyzer/agent/kafka/provider/handler/MeterServiceHandler.java b/oap-server/server-fetcher-plugin/kafka-fetcher-plugin/src/main/java/org/apache/skywalking/oap/server/analyzer/agent/kafka/provider/handler/MeterServiceHandler.java
index c20a169..1b2acc6 100644
--- a/oap-server/server-fetcher-plugin/kafka-fetcher-plugin/src/main/java/org/apache/skywalking/oap/server/analyzer/agent/kafka/provider/handler/MeterServiceHandler.java
+++ b/oap-server/server-fetcher-plugin/kafka-fetcher-plugin/src/main/java/org/apache/skywalking/oap/server/analyzer/agent/kafka/provider/handler/MeterServiceHandler.java
@@ -27,6 +27,11 @@ import org.apache.skywalking.oap.server.analyzer.module.AnalyzerModule;
 import org.apache.skywalking.oap.server.analyzer.provider.meter.process.IMeterProcessService;
 import org.apache.skywalking.oap.server.analyzer.provider.meter.process.MeterProcessor;
 import org.apache.skywalking.oap.server.library.module.ModuleManager;
+import org.apache.skywalking.oap.server.telemetry.TelemetryModule;
+import org.apache.skywalking.oap.server.telemetry.api.CounterMetrics;
+import org.apache.skywalking.oap.server.telemetry.api.HistogramMetrics;
+import org.apache.skywalking.oap.server.telemetry.api.MetricsCreator;
+import org.apache.skywalking.oap.server.telemetry.api.MetricsTag;
 
 /**
  * A handler deserializes the message of meter system data and pushes it to downstream.
@@ -35,19 +40,38 @@ import org.apache.skywalking.oap.server.library.module.ModuleManager;
 public class MeterServiceHandler implements KafkaHandler {
     private KafkaFetcherConfig config;
     private IMeterProcessService processService;
+    private final HistogramMetrics histogram;
+    private final CounterMetrics errorCounter;
 
     public MeterServiceHandler(ModuleManager manager, KafkaFetcherConfig config) {
         this.config = config;
         this.processService = manager.find(AnalyzerModule.NAME).provider().getService(IMeterProcessService.class);
+        MetricsCreator metricsCreator = manager.find(TelemetryModule.NAME)
+                .provider()
+                .getService(MetricsCreator.class);
+        histogram = metricsCreator.createHistogramMetric(
+                "meter_in_latency", "The process latency of meter",
+                new MetricsTag.Keys("protocol"), new MetricsTag.Values("kafka-fetcher")
+        );
+        errorCounter = metricsCreator.createCounter("meter_analysis_error_count", "The error number of meter analysis",
+                new MetricsTag.Keys("protocol"),
+                new MetricsTag.Values("kafka-fetcher")
+        );
     }
 
     @Override
     public void handle(final ConsumerRecord<String, Bytes> record) {
         try {
             MeterDataCollection meterDataCollection = MeterDataCollection.parseFrom(record.value().get());
-
             MeterProcessor processor = processService.createProcessor();
-            meterDataCollection.getMeterDataList().forEach(meterData -> processor.read(meterData));
+            meterDataCollection.getMeterDataList().forEach(meterData -> {
+                try (HistogramMetrics.Timer ignored = histogram.createTimer()) {
+                    processor.read(meterData);
+                } catch (Exception e) {
+                    errorCounter.inc();
+                    log.error(e.getMessage(), e);
+                }
+            });
             processor.process();
 
         } catch (Exception e) {
diff --git a/oap-server/server-fetcher-plugin/prometheus-fetcher-plugin/src/main/java/org/apache/skywalking/oap/server/fetcher/prometheus/provider/PrometheusFetcherProvider.java b/oap-server/server-fetcher-plugin/prometheus-fetcher-plugin/src/main/java/org/apache/skywalking/oap/server/fetcher/prometheus/provider/PrometheusFetcherProvider.java
index 3536203..8118122 100644
--- a/oap-server/server-fetcher-plugin/prometheus-fetcher-plugin/src/main/java/org/apache/skywalking/oap/server/fetcher/prometheus/provider/PrometheusFetcherProvider.java
+++ b/oap-server/server-fetcher-plugin/prometheus-fetcher-plugin/src/main/java/org/apache/skywalking/oap/server/fetcher/prometheus/provider/PrometheusFetcherProvider.java
@@ -52,6 +52,11 @@ import org.apache.skywalking.oap.server.library.util.prometheus.Parser;
 import org.apache.skywalking.oap.server.library.util.prometheus.Parsers;
 import org.apache.skywalking.oap.server.library.util.prometheus.metrics.Metric;
 import org.apache.skywalking.oap.server.library.util.prometheus.metrics.MetricFamily;
+import org.apache.skywalking.oap.server.telemetry.TelemetryModule;
+import org.apache.skywalking.oap.server.telemetry.api.CounterMetrics;
+import org.apache.skywalking.oap.server.telemetry.api.HistogramMetrics;
+import org.apache.skywalking.oap.server.telemetry.api.MetricsCreator;
+import org.apache.skywalking.oap.server.telemetry.api.MetricsTag;
 
 @Slf4j
 public class PrometheusFetcherProvider extends ModuleProvider {
@@ -62,6 +67,10 @@ public class PrometheusFetcherProvider extends ModuleProvider {
 
     private ScheduledExecutorService ses;
 
+    private HistogramMetrics histogram;
+
+    private CounterMetrics errorCounter;
+
     public PrometheusFetcherProvider() {
         config = new PrometheusFetcherConfig();
     }
@@ -89,6 +98,16 @@ public class PrometheusFetcherProvider extends ModuleProvider {
 
     @Override
     public void start() throws ServiceNotProvidedException, ModuleStartException {
+        MetricsCreator metricsCreator = getManager().find(TelemetryModule.NAME)
+                .provider()
+                .getService(MetricsCreator.class);
+        histogram = metricsCreator.createHistogramMetric(
+                "metrics_fetcher_latency", "The process latency of metrics scraping",
+                MetricsTag.EMPTY_KEY, MetricsTag.EMPTY_VALUE
+        );
+        errorCounter = metricsCreator.createCounter("metrics_fetcher_error_count", "The error number of metrics scraping",
+                MetricsTag.EMPTY_KEY, MetricsTag.EMPTY_VALUE
+        );
     }
 
     @Override
@@ -103,44 +122,49 @@ public class PrometheusFetcherProvider extends ModuleProvider {
                 private final PrometheusMetricConverter converter = new PrometheusMetricConverter(r, service);
 
                 @Override public void run() {
-                    if (Objects.isNull(r.getStaticConfig())) {
-                        return;
-                    }
-                    StaticConfig sc = r.getStaticConfig();
-                    long now = System.currentTimeMillis();
-                    converter.toMeter(sc.getTargets().stream()
-                        .map(CheckedFunction1.liftTry(target -> {
-                            URI url = new URI(target.getUrl());
-                            URI targetURL = url.resolve(r.getMetricsPath());
-                            String content = HttpClient.builder().url(targetURL.toString()).caFilePath(target.getSslCaFilePath()).build().request();
-                            List<Metric> result = new ArrayList<>();
-                            try (InputStream targetStream = new ByteArrayInputStream(content.getBytes(Charsets.UTF_8))) {
-                                Parser p = Parsers.text(targetStream);
-                                MetricFamily mf;
-                                while ((mf = p.parse(now)) != null) {
-                                    mf.getMetrics().forEach(metric -> {
-                                        if (Objects.isNull(sc.getLabels())) {
-                                            return;
+                    try (HistogramMetrics.Timer ignored = histogram.createTimer()) {
+                        if (Objects.isNull(r.getStaticConfig())) {
+                            return;
+                        }
+                        StaticConfig sc = r.getStaticConfig();
+                        long now = System.currentTimeMillis();
+                        converter.toMeter(sc.getTargets().stream()
+                                .map(CheckedFunction1.liftTry(target -> {
+                                    URI url = new URI(target.getUrl());
+                                    URI targetURL = url.resolve(r.getMetricsPath());
+                                    String content = HttpClient.builder().url(targetURL.toString()).caFilePath(target.getSslCaFilePath()).build().request();
+                                    List<Metric> result = new ArrayList<>();
+                                    try (InputStream targetStream = new ByteArrayInputStream(content.getBytes(Charsets.UTF_8))) {
+                                        Parser p = Parsers.text(targetStream);
+                                        MetricFamily mf;
+                                        while ((mf = p.parse(now)) != null) {
+                                            mf.getMetrics().forEach(metric -> {
+                                                if (Objects.isNull(sc.getLabels())) {
+                                                    return;
+                                                }
+                                                Map<String, String> extraLabels = Maps.newHashMap(sc.getLabels());
+                                                extraLabels.put("instance", target.getUrl());
+                                                extraLabels.forEach((key, value) -> {
+                                                    if (metric.getLabels().containsKey(key)) {
+                                                        metric.getLabels().put("exported_" + key, metric.getLabels().get(key));
+                                                    }
+                                                    metric.getLabels().put(key, value);
+                                                });
+                                            });
+                                            result.addAll(mf.getMetrics());
                                         }
-                                        Map<String, String> extraLabels = Maps.newHashMap(sc.getLabels());
-                                        extraLabels.put("instance", target.getUrl());
-                                        extraLabels.forEach((key, value) -> {
-                                            if (metric.getLabels().containsKey(key)) {
-                                                metric.getLabels().put("exported_" + key, metric.getLabels().get(key));
-                                            }
-                                            metric.getLabels().put(key, value);
-                                        });
-                                    });
-                                    result.addAll(mf.getMetrics());
-                                }
-                            }
-                            if (log.isDebugEnabled()) {
-                                log.debug("Fetch metrics from prometheus: {}", result);
-                            }
-                            return result;
-                        }))
-                        .flatMap(tryIt -> MetricConvert.log(tryIt, "Load metric"))
-                        .flatMap(Collection::stream));
+                                    }
+                                    if (log.isDebugEnabled()) {
+                                        log.debug("Fetch metrics from prometheus: {}", result);
+                                    }
+                                    return result;
+                                }))
+                                .flatMap(tryIt -> MetricConvert.log(tryIt, "Load metric"))
+                                .flatMap(Collection::stream));
+                    } catch (Exception e) {
+                        errorCounter.inc();
+                        log.error(e.getMessage(), e);
+                    }
                 }
             }, 0L, Duration.parse(r.getFetcherInterval()).getSeconds(), TimeUnit.SECONDS);
         });
@@ -148,6 +172,9 @@ public class PrometheusFetcherProvider extends ModuleProvider {
 
     @Override
     public String[] requiredModules() {
-        return new String[] {CoreModule.NAME};
+        return new String[] {
+            TelemetryModule.NAME,
+            CoreModule.NAME
+        };
     }
 }
diff --git a/oap-server/server-receiver-plugin/skywalking-meter-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/meter/provider/MeterReceiverProvider.java b/oap-server/server-receiver-plugin/skywalking-meter-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/meter/provider/MeterReceiverProvider.java
index 730ee1c..5a4938b 100644
--- a/oap-server/server-receiver-plugin/skywalking-meter-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/meter/provider/MeterReceiverProvider.java
+++ b/oap-server/server-receiver-plugin/skywalking-meter-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/meter/provider/MeterReceiverProvider.java
@@ -30,6 +30,7 @@ import org.apache.skywalking.oap.server.receiver.meter.module.MeterReceiverModul
 import org.apache.skywalking.oap.server.receiver.meter.provider.handler.MeterServiceHandler;
 import org.apache.skywalking.oap.server.receiver.meter.provider.handler.MeterServiceHandlerCompat;
 import org.apache.skywalking.oap.server.receiver.sharing.server.SharingServerModule;
+import org.apache.skywalking.oap.server.telemetry.TelemetryModule;
 
 public class MeterReceiverProvider extends ModuleProvider {
 
@@ -62,7 +63,7 @@ public class MeterReceiverProvider extends ModuleProvider {
         GRPCHandlerRegister grpcHandlerRegister = getManager().find(SharingServerModule.NAME)
                                                               .provider()
                                                               .getService(GRPCHandlerRegister.class);
-        MeterServiceHandler meterServiceHandlerCompat = new MeterServiceHandler(processService);
+        MeterServiceHandler meterServiceHandlerCompat = new MeterServiceHandler(getManager(), processService);
         grpcHandlerRegister.addHandler(meterServiceHandlerCompat);
         grpcHandlerRegister.addHandler(new MeterServiceHandlerCompat(meterServiceHandlerCompat));
     }
@@ -74,6 +75,7 @@ public class MeterReceiverProvider extends ModuleProvider {
     @Override
     public String[] requiredModules() {
         return new String[] {
+            TelemetryModule.NAME,
             CoreModule.NAME,
             AnalyzerModule.NAME,
             SharingServerModule.NAME
diff --git a/oap-server/server-receiver-plugin/skywalking-meter-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/meter/provider/handler/MeterServiceHandler.java b/oap-server/server-receiver-plugin/skywalking-meter-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/meter/provider/handler/MeterServiceHandler.java
index c458a14..b2f0d2e 100644
--- a/oap-server/server-receiver-plugin/skywalking-meter-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/meter/provider/handler/MeterServiceHandler.java
+++ b/oap-server/server-receiver-plugin/skywalking-meter-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/meter/provider/handler/MeterServiceHandler.java
@@ -25,7 +25,13 @@ import org.apache.skywalking.apm.network.language.agent.v3.MeterData;
 import org.apache.skywalking.apm.network.language.agent.v3.MeterReportServiceGrpc;
 import org.apache.skywalking.oap.server.analyzer.provider.meter.process.IMeterProcessService;
 import org.apache.skywalking.oap.server.analyzer.provider.meter.process.MeterProcessor;
+import org.apache.skywalking.oap.server.library.module.ModuleManager;
 import org.apache.skywalking.oap.server.library.server.grpc.GRPCHandler;
+import org.apache.skywalking.oap.server.telemetry.TelemetryModule;
+import org.apache.skywalking.oap.server.telemetry.api.CounterMetrics;
+import org.apache.skywalking.oap.server.telemetry.api.HistogramMetrics;
+import org.apache.skywalking.oap.server.telemetry.api.MetricsCreator;
+import org.apache.skywalking.oap.server.telemetry.api.MetricsTag;
 
 /**
  * Meter protocol receiver, collect and process the meters.
@@ -34,9 +40,22 @@ import org.apache.skywalking.oap.server.library.server.grpc.GRPCHandler;
 public class MeterServiceHandler extends MeterReportServiceGrpc.MeterReportServiceImplBase implements GRPCHandler {
 
     private final IMeterProcessService processService;
+    private final HistogramMetrics histogram;
+    private final CounterMetrics errorCounter;
 
-    public MeterServiceHandler(IMeterProcessService processService) {
+    public MeterServiceHandler(ModuleManager manager, IMeterProcessService processService) {
         this.processService = processService;
+        MetricsCreator metricsCreator = manager.find(TelemetryModule.NAME)
+                .provider()
+                .getService(MetricsCreator.class);
+        histogram = metricsCreator.createHistogramMetric(
+                "meter_in_latency", "The process latency of meter",
+                new MetricsTag.Keys("protocol"), new MetricsTag.Values("grpc")
+        );
+        errorCounter = metricsCreator.createCounter("meter_analysis_error_count", "The error number of meter analysis",
+                new MetricsTag.Keys("protocol"),
+                new MetricsTag.Values("grpc")
+        );
     }
 
     @Override
@@ -45,7 +64,12 @@ public class MeterServiceHandler extends MeterReportServiceGrpc.MeterReportServi
         return new StreamObserver<MeterData>() {
             @Override
             public void onNext(MeterData meterData) {
-                processor.read(meterData);
+                try (HistogramMetrics.Timer ignored = histogram.createTimer()) {
+                    processor.read(meterData);
+                } catch (Exception e) {
+                    errorCounter.inc();
+                    log.error(e.getMessage(), e);
+                }
             }
 
             @Override
diff --git a/oap-server/server-receiver-plugin/zipkin-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/zipkin/ZipkinReceiverProvider.java b/oap-server/server-receiver-plugin/zipkin-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/zipkin/ZipkinReceiverProvider.java
index 81e6d28..9514814 100644
--- a/oap-server/server-receiver-plugin/zipkin-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/zipkin/ZipkinReceiverProvider.java
+++ b/oap-server/server-receiver-plugin/zipkin-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/zipkin/ZipkinReceiverProvider.java
@@ -29,6 +29,7 @@ import org.apache.skywalking.oap.server.library.server.jetty.JettyServer;
 import org.apache.skywalking.oap.server.library.server.jetty.JettyServerConfig;
 import org.apache.skywalking.oap.server.receiver.zipkin.handler.SpanV1JettyHandler;
 import org.apache.skywalking.oap.server.receiver.zipkin.handler.SpanV2JettyHandler;
+import org.apache.skywalking.oap.server.telemetry.TelemetryModule;
 
 public class ZipkinReceiverProvider extends ModuleProvider {
     public static final String NAME = "default";
@@ -91,6 +92,9 @@ public class ZipkinReceiverProvider extends ModuleProvider {
 
     @Override
     public String[] requiredModules() {
-        return new String[] {CoreModule.NAME};
+        return new String[] {
+            TelemetryModule.NAME,
+            CoreModule.NAME
+        };
     }
 }
diff --git a/oap-server/server-receiver-plugin/zipkin-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/zipkin/handler/SpanV1JettyHandler.java b/oap-server/server-receiver-plugin/zipkin-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/zipkin/handler/SpanV1JettyHandler.java
index 817d9ec..0e45ed6 100644
--- a/oap-server/server-receiver-plugin/zipkin-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/zipkin/handler/SpanV1JettyHandler.java
+++ b/oap-server/server-receiver-plugin/zipkin-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/zipkin/handler/SpanV1JettyHandler.java
@@ -27,6 +27,11 @@ import org.apache.skywalking.oap.server.core.source.SourceReceiver;
 import org.apache.skywalking.oap.server.library.module.ModuleManager;
 import org.apache.skywalking.oap.server.library.server.jetty.JettyHandler;
 import org.apache.skywalking.oap.server.receiver.zipkin.ZipkinReceiverConfig;
+import org.apache.skywalking.oap.server.telemetry.TelemetryModule;
+import org.apache.skywalking.oap.server.telemetry.api.CounterMetrics;
+import org.apache.skywalking.oap.server.telemetry.api.HistogramMetrics;
+import org.apache.skywalking.oap.server.telemetry.api.MetricsCreator;
+import org.apache.skywalking.oap.server.telemetry.api.MetricsTag;
 import zipkin2.codec.SpanBytesDecoder;
 
 @Slf4j
@@ -34,11 +39,23 @@ public class SpanV1JettyHandler extends JettyHandler {
     private final ZipkinReceiverConfig config;
     private final SourceReceiver sourceReceiver;
     private final NamingControl namingControl;
+    private final HistogramMetrics histogram;
+    private final CounterMetrics errorCounter;
 
     public SpanV1JettyHandler(ZipkinReceiverConfig config, ModuleManager manager) {
         sourceReceiver = manager.find(CoreModule.NAME).provider().getService(SourceReceiver.class);
         namingControl = manager.find(CoreModule.NAME).provider().getService(NamingControl.class);
         this.config = config;
+        MetricsCreator metricsCreator = manager.find(TelemetryModule.NAME)
+                .provider()
+                .getService(MetricsCreator.class);
+        histogram = metricsCreator.createHistogramMetric(
+                "trace_in_latency", "The process latency of trace data",
+                new MetricsTag.Keys("protocol"), new MetricsTag.Values("zipkin-v1")
+        );
+        errorCounter = metricsCreator.createCounter("trace_analysis_error_count", "The error number of trace analysis",
+                new MetricsTag.Keys("protocol"), new MetricsTag.Values("zipkin-v1")
+        );
     }
 
     @Override
@@ -51,7 +68,7 @@ public class SpanV1JettyHandler extends JettyHandler {
         response.setContentType("application/json");
         response.setCharacterEncoding("utf-8");
 
-        try {
+        try (HistogramMetrics.Timer ignored = histogram.createTimer()) {
             String type = request.getHeader("Content-Type");
 
             int encode = type != null && type.contains("/x-thrift") ? SpanEncode.THRIFT : SpanEncode.JSON_V1;
@@ -64,7 +81,7 @@ public class SpanV1JettyHandler extends JettyHandler {
             response.setStatus(202);
         } catch (Exception e) {
             response.setStatus(500);
-
+            errorCounter.inc();
             log.error(e.getMessage(), e);
         }
     }
diff --git a/oap-server/server-receiver-plugin/zipkin-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/zipkin/handler/SpanV2JettyHandler.java b/oap-server/server-receiver-plugin/zipkin-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/zipkin/handler/SpanV2JettyHandler.java
index 00a07be..817b11e 100644
--- a/oap-server/server-receiver-plugin/zipkin-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/zipkin/handler/SpanV2JettyHandler.java
+++ b/oap-server/server-receiver-plugin/zipkin-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/zipkin/handler/SpanV2JettyHandler.java
@@ -27,6 +27,11 @@ import org.apache.skywalking.oap.server.core.source.SourceReceiver;
 import org.apache.skywalking.oap.server.library.module.ModuleManager;
 import org.apache.skywalking.oap.server.library.server.jetty.JettyHandler;
 import org.apache.skywalking.oap.server.receiver.zipkin.ZipkinReceiverConfig;
+import org.apache.skywalking.oap.server.telemetry.TelemetryModule;
+import org.apache.skywalking.oap.server.telemetry.api.CounterMetrics;
+import org.apache.skywalking.oap.server.telemetry.api.HistogramMetrics;
+import org.apache.skywalking.oap.server.telemetry.api.MetricsCreator;
+import org.apache.skywalking.oap.server.telemetry.api.MetricsTag;
 import zipkin2.codec.SpanBytesDecoder;
 
 @Slf4j
@@ -35,11 +40,23 @@ public class SpanV2JettyHandler extends JettyHandler {
     private final ZipkinReceiverConfig config;
     private final SourceReceiver sourceReceiver;
     private final NamingControl namingControl;
+    private final HistogramMetrics histogram;
+    private final CounterMetrics errorCounter;
 
     public SpanV2JettyHandler(ZipkinReceiverConfig config, ModuleManager manager) {
         sourceReceiver = manager.find(CoreModule.NAME).provider().getService(SourceReceiver.class);
         namingControl = manager.find(CoreModule.NAME).provider().getService(NamingControl.class);
         this.config = config;
+        MetricsCreator metricsCreator = manager.find(TelemetryModule.NAME)
+                .provider()
+                .getService(MetricsCreator.class);
+        histogram = metricsCreator.createHistogramMetric(
+                "trace_in_latency", "The process latency of trace data",
+                new MetricsTag.Keys("protocol"), new MetricsTag.Values("zipkin-v2")
+        );
+        errorCounter = metricsCreator.createCounter("trace_analysis_error_count", "The error number of trace analysis",
+                new MetricsTag.Keys("protocol"), new MetricsTag.Values("zipkin-v2")
+        );
     }
 
     @Override
@@ -52,7 +69,7 @@ public class SpanV2JettyHandler extends JettyHandler {
         response.setContentType("application/json");
         response.setCharacterEncoding("utf-8");
 
-        try {
+        try (HistogramMetrics.Timer ignored = histogram.createTimer()) {
             String type = request.getHeader("Content-Type");
 
             int encode = type != null && type.contains("/x-protobuf") ? SpanEncode.PROTO3 : SpanEncode.JSON_V2;
@@ -65,7 +82,7 @@ public class SpanV2JettyHandler extends JettyHandler {
             response.setStatus(202);
         } catch (Exception e) {
             response.setStatus(500);
-
+            errorCounter.inc();
             log.error(e.getMessage(), e);
         }
     }