From 6a7e344dea75627c9d6011738c5a3e71e9fc4173 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AD=AA=E8=84=96=E5=A4=A7=E8=82=9A=E5=AD=90Q?= Date: Wed, 4 Jul 2018 12:03:02 +0800 Subject: [PATCH] fix zipkin provider can not receive full spans data (#1420) --- .../zipkin/provider/ZipkinReceiverProvider.java | 2 ++ .../zipkin/provider/handler/SpanProcessor.java | 16 +++++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/apm-collector/apm-collector-thirdparty-receiver/receiver-zipkin/receiver-zipkin-provider/src/main/java/org/apache/skywalking/apm/collector/receiver/zipkin/provider/ZipkinReceiverProvider.java b/apm-collector/apm-collector-thirdparty-receiver/receiver-zipkin/receiver-zipkin-provider/src/main/java/org/apache/skywalking/apm/collector/receiver/zipkin/provider/ZipkinReceiverProvider.java index fd364f4e0b..0ef45e4b85 100644 --- a/apm-collector/apm-collector-thirdparty-receiver/receiver-zipkin/receiver-zipkin-provider/src/main/java/org/apache/skywalking/apm/collector/receiver/zipkin/provider/ZipkinReceiverProvider.java +++ b/apm-collector/apm-collector-thirdparty-receiver/receiver-zipkin/receiver-zipkin-provider/src/main/java/org/apache/skywalking/apm/collector/receiver/zipkin/provider/ZipkinReceiverProvider.java @@ -31,6 +31,7 @@ import org.apache.skywalking.apm.collector.core.module.*; import org.apache.skywalking.apm.collector.jetty.manager.JettyManagerModule; import org.apache.skywalking.apm.collector.jetty.manager.service.JettyManagerService; import org.apache.skywalking.apm.collector.receiver.zipkin.define.ZipkinReceiverModule; +import org.apache.skywalking.apm.collector.receiver.zipkin.provider.handler.SpanV1JettyHandler; import org.apache.skywalking.apm.collector.receiver.zipkin.provider.handler.SpanV2JettyHandler; import org.apache.skywalking.apm.collector.receiver.zipkin.provider.transform.Zipkin2SkyWalkingTransfer; import org.apache.skywalking.apm.collector.server.jetty.JettyServer; @@ -74,6 +75,7 @@ public class ZipkinReceiverProvider extends ModuleProvider { JettyManagerService managerService = getManager().find(JettyManagerModule.NAME).getService(JettyManagerService.class); JettyServer jettyServer = managerService.createIfAbsent(config.getHost(), config.getPort(), config.getContextPath()); + jettyServer.addHandler(new SpanV1JettyHandler(config, registerServices)); jettyServer.addHandler(new SpanV2JettyHandler(config, registerServices)); ISegmentParseService segmentParseService = getManager().find(AnalysisSegmentParserModule.NAME).getService(ISegmentParseService.class); diff --git a/apm-collector/apm-collector-thirdparty-receiver/receiver-zipkin/receiver-zipkin-provider/src/main/java/org/apache/skywalking/apm/collector/receiver/zipkin/provider/handler/SpanProcessor.java b/apm-collector/apm-collector-thirdparty-receiver/receiver-zipkin/receiver-zipkin-provider/src/main/java/org/apache/skywalking/apm/collector/receiver/zipkin/provider/handler/SpanProcessor.java index f791846284..0e9fa61ba7 100644 --- a/apm-collector/apm-collector-thirdparty-receiver/receiver-zipkin/receiver-zipkin-provider/src/main/java/org/apache/skywalking/apm/collector/receiver/zipkin/provider/handler/SpanProcessor.java +++ b/apm-collector/apm-collector-thirdparty-receiver/receiver-zipkin/receiver-zipkin-provider/src/main/java/org/apache/skywalking/apm/collector/receiver/zipkin/provider/handler/SpanProcessor.java @@ -21,6 +21,8 @@ package org.apache.skywalking.apm.collector.receiver.zipkin.provider.handler; import org.apache.skywalking.apm.collector.receiver.zipkin.provider.RegisterServices; import org.apache.skywalking.apm.collector.receiver.zipkin.provider.ZipkinReceiverConfig; import org.apache.skywalking.apm.collector.receiver.zipkin.provider.cache.CacheFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import zipkin2.Span; import zipkin2.codec.SpanBytesDecoder; @@ -30,11 +32,23 @@ import java.io.IOException; import java.util.List; public class SpanProcessor { + private final Logger logger = LoggerFactory.getLogger(SpanProcessor.class); + void convert(ZipkinReceiverConfig config, SpanBytesDecoder decoder, HttpServletRequest request, RegisterServices registerServices) throws IOException { int len = request.getContentLength(); ServletInputStream iii = request.getInputStream(); byte[] buffer = new byte[len]; - iii.read(buffer, 0, len); + + int readCntTotal = 0; + int readCntOnce; + while (readCntTotal < len) { + readCntOnce = iii.read(buffer, readCntTotal, len - readCntTotal); + if (readCntOnce <= 0) { + logger.error("Receive spans data failed."); + throw new IOException(); + } + readCntTotal += readCntOnce; + } List spanList = decoder.decodeList(buffer); -- GitLab