You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by ke...@apache.org on 2020/03/09 11:17:57 UTC

[skywalking-agent-test-tool] branch master updated: Introduce Http Receiver (#8)

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

kezhenxu94 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/skywalking-agent-test-tool.git


The following commit(s) were added to refs/heads/master by this push:
     new f13c210  Introduce Http Receiver (#8)
f13c210 is described below

commit f13c210b7c7e45d32dc27bb489600161b71feafa
Author: Daming <zt...@foxmail.com>
AuthorDate: Mon Mar 9 19:17:49 2020 +0800

    Introduce Http Receiver (#8)
---
 mock-collector/pom.xml                             | 21 ++++-
 .../skywalking/plugin/test/mockcollector/Main.java | 14 ++++
 .../rest/service/JettyJsonHandler.java             | 98 ++++++++++++++++++++++
 .../MockInstanceRegisterServletHandler.java        | 64 ++++++++++++++
 .../MockServiceInstancePingServletHandler.java     | 49 +++++++++++
 .../service/MockServiceRegisterServletHandler.java | 73 ++++++++++++++++
 .../MockTraceSegmentCollectServletHandler.java     | 93 ++++++++++++++++++++
 .../mockcollector/service/MockRegisterService.java | 10 +--
 .../service/MockTraceSegmentService.java           |  8 +-
 .../test/mockcollector/util/ProtoBufJsonUtils.java | 46 ++++++++++
 pom.xml                                            | 69 ++++++++++-----
 .../skywalking/plugin/test/agent/tool/Main.java    | 15 ++--
 .../agent/tool/validator/assertor/DataAssert.java  | 11 ++-
 .../validator/assertor/RegistryItemsAssert.java    | 11 ++-
 .../validator/assertor/SegmentItemsAssert.java     |  7 +-
 15 files changed, 529 insertions(+), 60 deletions(-)

diff --git a/mock-collector/pom.xml b/mock-collector/pom.xml
index 05c67f0..45a16d1 100644
--- a/mock-collector/pom.xml
+++ b/mock-collector/pom.xml
@@ -37,10 +37,19 @@
         <protocol.version>b512211334db26a9c1031ce7bacfa2bef99b1d89</protocol.version>
         <protocol.workingDirectory>${project.basedir}/target/protocol</protocol.workingDirectory>
         <protocol.repos>https://github.com/apache/skywalking-data-collect-protocol.git</protocol.repos>
+        <protobuf-maven-plugin.version>0.6.1</protobuf-maven-plugin.version>
+        <com.google.protobuf.protoc.version>3.3.0</com.google.protobuf.protoc.version>
+        <protoc-gen-grpc-java.plugin.version>1.8.0</protoc-gen-grpc-java.plugin.version>
+        <protobuf-java-util.version>3.11.4</protobuf-java-util.version>
     </properties>
 
     <dependencies>
         <dependency>
+            <groupId>com.google.protobuf</groupId>
+            <artifactId>protobuf-java-util</artifactId>
+            <version>${protobuf-java-util.version}</version>
+        </dependency>
+        <dependency>
             <groupId>io.grpc</groupId>
             <artifactId>grpc-netty</artifactId>
             <version>${grpc.version}</version>
@@ -117,15 +126,21 @@
             <plugin>
                 <groupId>org.xolstice.maven.plugins</groupId>
                 <artifactId>protobuf-maven-plugin</artifactId>
-                <version>0.5.0</version>
+                <version>${protobuf-maven-plugin.version}</version>
                 <configuration>
-                    <protocArtifact>com.google.protobuf:protoc:3.3.0:exe:${os.detected.classifier}</protocArtifact>
+                    <protocArtifact>
+                        com.google.protobuf:protoc:${com.google.protobuf.protoc.version}:exe:${os.detected.classifier}
+                    </protocArtifact>
                     <pluginId>grpc-java</pluginId>
-                    <pluginArtifact>io.grpc:protoc-gen-grpc-java:1.4.0:exe:${os.detected.classifier}</pluginArtifact>
+                    <pluginArtifact>
+                        io.grpc:protoc-gen-grpc-java:${protoc-gen-grpc-java.plugin.version}:exe:${os.detected.classifier}
+                    </pluginArtifact>
                     <protoSourceRoot>${protocol.workingDirectory}</protoSourceRoot>
                 </configuration>
+
                 <executions>
                     <execution>
+                        <id>grpc-build</id>
                         <goals>
                             <goal>compile</goal>
                             <goal>compile-custom</goal>
diff --git a/mock-collector/src/main/java/org/apache/skywalking/plugin/test/mockcollector/Main.java b/mock-collector/src/main/java/org/apache/skywalking/plugin/test/mockcollector/Main.java
index 14b45ce..a3ba674 100644
--- a/mock-collector/src/main/java/org/apache/skywalking/plugin/test/mockcollector/Main.java
+++ b/mock-collector/src/main/java/org/apache/skywalking/plugin/test/mockcollector/Main.java
@@ -26,6 +26,10 @@ import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import org.apache.skywalking.plugin.test.mockcollector.entity.ValidateData;
+import org.apache.skywalking.plugin.test.mockcollector.rest.service.MockInstanceRegisterServletHandler;
+import org.apache.skywalking.plugin.test.mockcollector.rest.service.MockServiceInstancePingServletHandler;
+import org.apache.skywalking.plugin.test.mockcollector.rest.service.MockServiceRegisterServletHandler;
+import org.apache.skywalking.plugin.test.mockcollector.rest.service.MockTraceSegmentCollectServletHandler;
 import org.apache.skywalking.plugin.test.mockcollector.service.ClearReceiveDataService;
 import org.apache.skywalking.plugin.test.mockcollector.service.GrpcAddressHttpService;
 import org.apache.skywalking.plugin.test.mockcollector.service.MockInstancePingService;
@@ -70,6 +74,16 @@ public class Main {
         servletContextHandler.addServlet(GrpcAddressHttpService.class, GrpcAddressHttpService.SERVLET_PATH);
         servletContextHandler.addServlet(ReceiveDataService.class, ReceiveDataService.SERVLET_PATH);
         servletContextHandler.addServlet(ClearReceiveDataService.class, ClearReceiveDataService.SERVLET_PATH);
+
+        servletContextHandler.addServlet(
+            MockInstanceRegisterServletHandler.class, MockInstanceRegisterServletHandler.SERVLET_PATH);
+        servletContextHandler.addServlet(
+            MockServiceInstancePingServletHandler.class, MockServiceInstancePingServletHandler.SERVLET_PATH);
+        servletContextHandler.addServlet(
+            MockServiceRegisterServletHandler.class, MockServiceRegisterServletHandler.SERVLET_PATH);
+        servletContextHandler.addServlet(
+            MockTraceSegmentCollectServletHandler.class, MockTraceSegmentCollectServletHandler.SERVLET_PATH);
+
         jettyServer.setHandler(servletContextHandler);
         jettyServer.start();
     }
diff --git a/mock-collector/src/main/java/org/apache/skywalking/plugin/test/mockcollector/rest/service/JettyJsonHandler.java b/mock-collector/src/main/java/org/apache/skywalking/plugin/test/mockcollector/rest/service/JettyJsonHandler.java
new file mode 100644
index 0000000..ee8923f
--- /dev/null
+++ b/mock-collector/src/main/java/org/apache/skywalking/plugin/test/mockcollector/rest/service/JettyJsonHandler.java
@@ -0,0 +1,98 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.skywalking.plugin.test.mockcollector.rest.service;
+
+import com.google.gson.JsonElement;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.PrintWriter;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import lombok.extern.slf4j.Slf4j;
+
+import static java.util.Objects.nonNull;
+
+@Slf4j
+public abstract class JettyJsonHandler extends HttpServlet {
+
+    @Override
+    protected final void doGet(HttpServletRequest req, HttpServletResponse resp) {
+        try {
+            reply(resp, doGet(req));
+        } catch (IOException e) {
+            try {
+                replyError(resp, e.getMessage(), HttpServletResponse.SC_BAD_REQUEST);
+            } catch (IOException replyException) {
+                log.error(replyException.getMessage(), e);
+            }
+        }
+    }
+
+    protected abstract JsonElement doGet(HttpServletRequest req);
+
+    @Override
+    protected final void doPost(HttpServletRequest req, HttpServletResponse resp) {
+        try {
+            reply(resp, doPost(req));
+        } catch (IOException e) {
+            try {
+                replyError(resp, e.getMessage(), HttpServletResponse.SC_BAD_REQUEST);
+            } catch (IOException replyException) {
+                log.error(replyException.getMessage(), e);
+            }
+        }
+    }
+
+    protected abstract JsonElement doPost(HttpServletRequest req) throws IOException;
+
+    private void reply(HttpServletResponse response, JsonElement resJson) throws IOException {
+        response.setContentType("application/json");
+        response.setCharacterEncoding("utf-8");
+        response.setStatus(HttpServletResponse.SC_OK);
+
+        PrintWriter out = response.getWriter();
+        if (nonNull(resJson)) {
+            out.print(resJson);
+        }
+        out.flush();
+        out.close();
+    }
+
+    private void replyError(HttpServletResponse response, String errorMessage, int status) throws IOException {
+        response.setContentType("application/json");
+        response.setCharacterEncoding("utf-8");
+        response.setStatus(status);
+        response.setHeader("error-message", errorMessage);
+
+        PrintWriter out = response.getWriter();
+        out.flush();
+        out.close();
+    }
+
+    public String getJsonBody(HttpServletRequest req) throws IOException {
+        StringBuffer stringBuffer = new StringBuffer();
+        String line = null;
+        BufferedReader reader = req.getReader();
+        while ((line = reader.readLine()) != null) {
+            stringBuffer.append(line);
+        }
+        return stringBuffer.toString();
+    }
+}
diff --git a/mock-collector/src/main/java/org/apache/skywalking/plugin/test/mockcollector/rest/service/MockInstanceRegisterServletHandler.java b/mock-collector/src/main/java/org/apache/skywalking/plugin/test/mockcollector/rest/service/MockInstanceRegisterServletHandler.java
new file mode 100644
index 0000000..52f0ec4
--- /dev/null
+++ b/mock-collector/src/main/java/org/apache/skywalking/plugin/test/mockcollector/rest/service/MockInstanceRegisterServletHandler.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.skywalking.plugin.test.mockcollector.rest.service;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import java.io.IOException;
+import javax.servlet.http.HttpServletRequest;
+import org.apache.skywalking.apm.network.register.v2.ServiceInstance;
+import org.apache.skywalking.apm.network.register.v2.ServiceInstances;
+import org.apache.skywalking.plugin.test.mockcollector.entity.RegistryItem;
+import org.apache.skywalking.plugin.test.mockcollector.entity.ValidateData;
+import org.apache.skywalking.plugin.test.mockcollector.service.Sequences;
+import org.apache.skywalking.plugin.test.mockcollector.util.ProtoBufJsonUtils;
+
+public class MockInstanceRegisterServletHandler extends JettyJsonHandler {
+    private static final String KEY = "key";
+    private static final String VALUE = "value";
+
+    public static final String SERVLET_PATH = "/v2/instance/register";
+
+    @Override
+    protected JsonElement doGet(final HttpServletRequest req) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    protected JsonElement doPost(final HttpServletRequest req) throws IOException {
+        JsonArray response = new JsonArray();
+        ServiceInstances.Builder builder = ServiceInstances.newBuilder();
+        ProtoBufJsonUtils.fromJSON(getJsonBody(req), builder);
+
+        for (ServiceInstance serviceInstance : builder.build().getInstancesList()) {
+            int instanceId = Sequences.INSTANCE_SEQUENCE.incrementAndGet();
+            ValidateData.INSTANCE.getRegistryItem()
+                                 .registryInstance(
+                                     new RegistryItem.Instance(serviceInstance.getServiceId(), instanceId));
+
+            JsonObject register = new JsonObject();
+            register.addProperty(KEY, serviceInstance.getInstanceUUID());
+            register.addProperty(VALUE, instanceId);
+
+            response.add(register);
+        }
+        return response;
+    }
+}
diff --git a/mock-collector/src/main/java/org/apache/skywalking/plugin/test/mockcollector/rest/service/MockServiceInstancePingServletHandler.java b/mock-collector/src/main/java/org/apache/skywalking/plugin/test/mockcollector/rest/service/MockServiceInstancePingServletHandler.java
new file mode 100644
index 0000000..631e49b
--- /dev/null
+++ b/mock-collector/src/main/java/org/apache/skywalking/plugin/test/mockcollector/rest/service/MockServiceInstancePingServletHandler.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.skywalking.plugin.test.mockcollector.rest.service;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import java.io.IOException;
+import javax.servlet.http.HttpServletRequest;
+import org.apache.skywalking.apm.network.register.v2.ServiceInstancePingPkg;
+import org.apache.skywalking.plugin.test.mockcollector.entity.RegistryItem;
+import org.apache.skywalking.plugin.test.mockcollector.entity.ValidateData;
+import org.apache.skywalking.plugin.test.mockcollector.util.ProtoBufJsonUtils;
+
+public class MockServiceInstancePingServletHandler extends JettyJsonHandler {
+    public static final String SERVLET_PATH = "/v2/instance/heartbeat";
+
+    @Override
+    protected JsonElement doGet(final HttpServletRequest req) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    protected JsonElement doPost(final HttpServletRequest req) throws IOException {
+
+        ServiceInstancePingPkg.Builder builder = ServiceInstancePingPkg.newBuilder();
+        ProtoBufJsonUtils.fromJSON(getJsonBody(req), builder);
+        ServiceInstancePingPkg instancePingPkg = builder.build();
+
+        ValidateData.INSTANCE.getRegistryItem()
+                             .registryHeartBeat(new RegistryItem.HeartBeat(instancePingPkg.getServiceInstanceId()));
+        return new JsonArray();
+    }
+}
diff --git a/mock-collector/src/main/java/org/apache/skywalking/plugin/test/mockcollector/rest/service/MockServiceRegisterServletHandler.java b/mock-collector/src/main/java/org/apache/skywalking/plugin/test/mockcollector/rest/service/MockServiceRegisterServletHandler.java
new file mode 100644
index 0000000..70b9ba4
--- /dev/null
+++ b/mock-collector/src/main/java/org/apache/skywalking/plugin/test/mockcollector/rest/service/MockServiceRegisterServletHandler.java
@@ -0,0 +1,73 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.skywalking.plugin.test.mockcollector.rest.service;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import java.io.IOException;
+import java.util.List;
+import javax.servlet.http.HttpServletRequest;
+import org.apache.skywalking.apm.network.register.v2.Service;
+import org.apache.skywalking.apm.network.register.v2.Services;
+import org.apache.skywalking.plugin.test.mockcollector.entity.RegistryItem;
+import org.apache.skywalking.plugin.test.mockcollector.entity.ValidateData;
+import org.apache.skywalking.plugin.test.mockcollector.service.Sequences;
+import org.apache.skywalking.plugin.test.mockcollector.util.ProtoBufJsonUtils;
+
+public class MockServiceRegisterServletHandler extends JettyJsonHandler {
+    public static final String SERVLET_PATH = "/v2/service/register";
+    private static final String KEY = "key";
+    private static final String VALUE = "value";
+
+    @Override
+    protected JsonElement doGet(final HttpServletRequest req) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    protected JsonElement doPost(final HttpServletRequest req) throws IOException {
+        JsonArray response = new JsonArray();
+
+        Services.Builder servicesBuilder = Services.newBuilder();
+        ProtoBufJsonUtils.fromJSON(getJsonBody(req), servicesBuilder);
+        List<Service> serviceList = servicesBuilder.build().getServicesList();
+
+        for (Service service : serviceList) {
+            String serviceName = service.getServiceName();
+            if (serviceName.startsWith("localhost") || serviceName.startsWith("127.0.0.1")
+                || serviceName.contains(":") || serviceName.contains("/")) {
+                return response;
+            }
+
+            Integer serviceId = Sequences.SERVICE_MAPPING.get(serviceName);
+            if (serviceId == null) {
+                serviceId = Sequences.ENDPOINT_SEQUENCE.incrementAndGet();
+                Sequences.SERVICE_MAPPING.put(serviceName, serviceId);
+                ValidateData.INSTANCE.getRegistryItem()
+                                     .registryService(new RegistryItem.Service(serviceName, serviceId));
+            }
+            JsonObject mapping = new JsonObject();
+            mapping.addProperty(KEY, serviceName);
+            mapping.addProperty(VALUE, serviceId);
+            response.add(mapping);
+        }
+        return response;
+    }
+}
diff --git a/mock-collector/src/main/java/org/apache/skywalking/plugin/test/mockcollector/rest/service/MockTraceSegmentCollectServletHandler.java b/mock-collector/src/main/java/org/apache/skywalking/plugin/test/mockcollector/rest/service/MockTraceSegmentCollectServletHandler.java
new file mode 100644
index 0000000..553aca8
--- /dev/null
+++ b/mock-collector/src/main/java/org/apache/skywalking/plugin/test/mockcollector/rest/service/MockTraceSegmentCollectServletHandler.java
@@ -0,0 +1,93 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.skywalking.plugin.test.mockcollector.rest.service;
+
+import com.google.common.io.CharStreams;
+import com.google.gson.JsonElement;
+import java.io.IOException;
+import javax.servlet.http.HttpServletRequest;
+import org.apache.skywalking.apm.network.common.KeyStringValuePair;
+import org.apache.skywalking.apm.network.language.agent.UpstreamSegment;
+import org.apache.skywalking.apm.network.language.agent.v2.Log;
+import org.apache.skywalking.apm.network.language.agent.v2.SegmentObject;
+import org.apache.skywalking.apm.network.language.agent.v2.SegmentReference;
+import org.apache.skywalking.apm.network.language.agent.v2.SpanObjectV2;
+import org.apache.skywalking.plugin.test.mockcollector.entity.Segment;
+import org.apache.skywalking.plugin.test.mockcollector.entity.Span;
+import org.apache.skywalking.plugin.test.mockcollector.entity.ValidateData;
+import org.apache.skywalking.plugin.test.mockcollector.util.ProtoBufJsonUtils;
+
+public class MockTraceSegmentCollectServletHandler extends JettyJsonHandler {
+    public static final String SERVLET_PATH = "/v2/segments";
+
+    @Override
+    protected JsonElement doGet(final HttpServletRequest req) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    protected JsonElement doPost(final HttpServletRequest req) throws IOException {
+        String json = CharStreams.toString(req.getReader());
+
+        SegmentObject.Builder _builder = SegmentObject.newBuilder();
+        ProtoBufJsonUtils.fromJSON(json, _builder);
+
+        UpstreamSegment.Builder upstreamSegmentBuilder = UpstreamSegment.newBuilder();
+        UpstreamSegment value = upstreamSegmentBuilder.setSegment(_builder.build().toByteString()).build();
+
+        SegmentObject traceSegmentObject = SegmentObject.parseFrom(value.getSegment());
+        Segment.SegmentBuilder segmentBuilder = Segment.builder()
+                                                       .segmentId(traceSegmentObject.getTraceSegmentId());
+
+        for (SpanObjectV2 spanObject : traceSegmentObject.getSpansList()) {
+            Span.SpanBuilder spanBuilder = Span.builder()
+                                               .operationName(spanObject.getOperationName())
+                                               .parentSpanId(spanObject.getParentSpanId())
+                                               .spanId(spanObject.getSpanId())
+                                               .componentId(spanObject.getComponentId())
+                                               .componentName(spanObject.getComponent())
+                                               .spanLayer(spanObject.getSpanLayer().toString())
+                                               .endTime(spanObject.getEndTime())
+                                               .isError(spanObject.getIsError())
+                                               .startTime(spanObject.getStartTime())
+                                               .spanType(spanObject.getSpanType().toString())
+                                               .peer(spanObject.getPeer())
+                                               .peerId(spanObject.getPeerId())
+                                               .operationId(spanObject.getOperationNameId());
+
+            for (Log logMessage : spanObject.getLogsList()) {
+                spanBuilder.logEvent(logMessage.getDataList());
+            }
+
+            for (KeyStringValuePair tags : spanObject.getTagsList()) {
+                spanBuilder.tags(tags.getKey(), tags.getValue());
+            }
+
+            for (SegmentReference ref : spanObject.getRefsList()) {
+                spanBuilder.ref(new Span.SegmentRef(ref));
+            }
+
+            segmentBuilder.addSpan(spanBuilder);
+        }
+
+        ValidateData.INSTANCE.getSegmentItem()
+                             .addSegmentItem(traceSegmentObject.getServiceId(), segmentBuilder.build());
+        return null;
+    }
+}
diff --git a/mock-collector/src/main/java/org/apache/skywalking/plugin/test/mockcollector/service/MockRegisterService.java b/mock-collector/src/main/java/org/apache/skywalking/plugin/test/mockcollector/service/MockRegisterService.java
index 1bb115a..f1d8f91 100644
--- a/mock-collector/src/main/java/org/apache/skywalking/plugin/test/mockcollector/service/MockRegisterService.java
+++ b/mock-collector/src/main/java/org/apache/skywalking/plugin/test/mockcollector/service/MockRegisterService.java
@@ -18,8 +18,7 @@
 package org.apache.skywalking.plugin.test.mockcollector.service;
 
 import io.grpc.stub.StreamObserver;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.skywalking.apm.network.common.KeyIntValuePair;
 import org.apache.skywalking.apm.network.register.v2.Endpoint;
 import org.apache.skywalking.apm.network.register.v2.EndpointMapping;
@@ -35,10 +34,9 @@ import org.apache.skywalking.apm.network.register.v2.Services;
 import org.apache.skywalking.plugin.test.mockcollector.entity.RegistryItem;
 import org.apache.skywalking.plugin.test.mockcollector.entity.ValidateData;
 
+@Slf4j
 public class MockRegisterService extends RegisterGrpc.RegisterImplBase {
 
-    private Logger logger = LogManager.getLogger(MockTraceSegmentService.class);
-
     @Override
     public void doEndpointRegister(Endpoints request, StreamObserver<EndpointMapping> responseObserver) {
         for (Endpoint endpoint : request.getEndpointsList()) {
@@ -86,9 +84,9 @@ public class MockRegisterService extends RegisterGrpc.RegisterImplBase {
 
     @Override
     public void doServiceRegister(Services request, StreamObserver<ServiceRegisterMapping> responseObserver) {
-        logger.debug("receive service register.");
+        log.debug("receive service register.");
         if (request.getServicesCount() <= 0) {
-            logger.warn("The service count is empty. return the default service register mapping");
+            log.warn("The service count is empty. return the default service register mapping");
             responseObserver.onNext(ServiceRegisterMapping.getDefaultInstance());
             responseObserver.onCompleted();
             return;
diff --git a/mock-collector/src/main/java/org/apache/skywalking/plugin/test/mockcollector/service/MockTraceSegmentService.java b/mock-collector/src/main/java/org/apache/skywalking/plugin/test/mockcollector/service/MockTraceSegmentService.java
index e0a48a3..f1d6388 100644
--- a/mock-collector/src/main/java/org/apache/skywalking/plugin/test/mockcollector/service/MockTraceSegmentService.java
+++ b/mock-collector/src/main/java/org/apache/skywalking/plugin/test/mockcollector/service/MockTraceSegmentService.java
@@ -19,8 +19,7 @@ package org.apache.skywalking.plugin.test.mockcollector.service;
 
 import com.google.protobuf.InvalidProtocolBufferException;
 import io.grpc.stub.StreamObserver;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.skywalking.apm.network.common.Commands;
 import org.apache.skywalking.apm.network.common.KeyStringValuePair;
 import org.apache.skywalking.apm.network.language.agent.UpstreamSegment;
@@ -33,10 +32,9 @@ import org.apache.skywalking.plugin.test.mockcollector.entity.Segment;
 import org.apache.skywalking.plugin.test.mockcollector.entity.Span;
 import org.apache.skywalking.plugin.test.mockcollector.entity.ValidateData;
 
+@Slf4j
 public class MockTraceSegmentService extends TraceSegmentReportServiceGrpc.TraceSegmentReportServiceImplBase {
 
-    private Logger logger = LogManager.getLogger(MockTraceSegmentService.class);
-
     @Override
     public StreamObserver<UpstreamSegment> collect(StreamObserver<Commands> responseObserver) {
         return new StreamObserver<UpstreamSegment>() {
@@ -46,7 +44,7 @@ public class MockTraceSegmentService extends TraceSegmentReportServiceGrpc.Trace
                     SegmentObject traceSegmentObject = SegmentObject.parseFrom(value.getSegment());
                     Segment.SegmentBuilder segmentBuilder = Segment.builder()
                                                                    .segmentId(traceSegmentObject.getTraceSegmentId());
-                    logger.debug(
+                    log.debug(
                         "Receive segment: ServiceID[{}], TraceSegmentId[{}]", traceSegmentObject.getServiceId(),
                         traceSegmentObject
                             .getTraceSegmentId()
diff --git a/mock-collector/src/main/java/org/apache/skywalking/plugin/test/mockcollector/util/ProtoBufJsonUtils.java b/mock-collector/src/main/java/org/apache/skywalking/plugin/test/mockcollector/util/ProtoBufJsonUtils.java
new file mode 100644
index 0000000..5120d33
--- /dev/null
+++ b/mock-collector/src/main/java/org/apache/skywalking/plugin/test/mockcollector/util/ProtoBufJsonUtils.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.skywalking.plugin.test.mockcollector.util;
+
+import com.google.protobuf.Message;
+import com.google.protobuf.util.JsonFormat;
+import java.io.IOException;
+
+public class ProtoBufJsonUtils {
+
+    public static String toJSON(Message sourceMessage) throws IOException {
+        return JsonFormat.printer().print(sourceMessage);
+    }
+
+    /**
+     * Extract data from a JSON String and use them to construct a Protocol Buffers Message.
+     *
+     * @param json          A JSON data string to parse
+     * @param targetBuilder A Message builder to use to construct the resulting Message
+     * @throws com.google.protobuf.InvalidProtocolBufferException Thrown in case of invalid Message data
+     */
+    public static void fromJSON(String json, Message.Builder targetBuilder) throws IOException {
+        JsonFormat.parser()
+                  .usingTypeRegistry(JsonFormat.TypeRegistry.newBuilder()
+                                                            .add(targetBuilder.getDescriptorForType())
+                                                            .build())
+                  .ignoringUnknownFields()
+                  .merge(json, targetBuilder);
+    }
+}
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 6898c1e..aebbcb7 100644
--- a/pom.xml
+++ b/pom.xml
@@ -45,11 +45,12 @@
 
         <junit.version>4.11</junit.version>
         <guava.version>20.0</guava.version>
-        <gson.version>2.8.5</gson.version>
+        <gson.version>2.8.6</gson.version>
+        <grpc.version>1.26.0</grpc.version>
         <lombok.version>1.18.10</lombok.version>
         <snakeyaml.version>1.24</snakeyaml.version>
-        <log4j-core.version>2.8.1</log4j-core.version>
-        <grpc.version>1.4.0</grpc.version>
+        <slf4j.version>1.7.25</slf4j.version>
+        <log4j.version>2.9.0</log4j.version>
         <netty.version>4.1.12.Final</netty.version>
         <jetty.version>9.4.2.v20170220</jetty.version>
 
@@ -58,25 +59,41 @@
     <dependencyManagement>
         <dependencies>
             <dependency>
-                <groupId>junit</groupId>
-                <artifactId>junit</artifactId>
-                <version>${junit.version}</version>
-                <scope>test</scope>
+                <groupId>org.slf4j</groupId>
+                <artifactId>slf4j-api</artifactId>
+                <version>${slf4j.version}</version>
             </dependency>
             <dependency>
-                <groupId>com.google.guava</groupId>
-                <artifactId>guava</artifactId>
-                <version>${guava.version}</version>
+                <groupId>org.slf4j</groupId>
+                <artifactId>log4j-over-slf4j</artifactId>
+                <version>${slf4j.version}</version>
             </dependency>
             <dependency>
                 <groupId>org.apache.logging.log4j</groupId>
                 <artifactId>log4j-core</artifactId>
-                <version>${log4j-core.version}</version>
+                <version>${log4j.version}</version>
             </dependency>
             <dependency>
                 <groupId>org.apache.logging.log4j</groupId>
-                <artifactId>log4j-api</artifactId>
-                <version>${log4j-core.version}</version>
+                <artifactId>log4j-slf4j-impl</artifactId>
+                <version>${log4j.version}</version>
+                <exclusions>
+                    <exclusion>
+                        <groupId>org.apache.logging.log4j</groupId>
+                        <artifactId>log4j-core</artifactId>
+                    </exclusion>
+                </exclusions>
+            </dependency>
+            <dependency>
+                <groupId>junit</groupId>
+                <artifactId>junit</artifactId>
+                <version>${junit.version}</version>
+                <scope>test</scope>
+            </dependency>
+            <dependency>
+                <groupId>com.google.guava</groupId>
+                <artifactId>guava</artifactId>
+                <version>${guava.version}</version>
             </dependency>
             <dependency>
                 <groupId>org.projectlombok</groupId>
@@ -94,12 +111,6 @@
                 <artifactId>gson</artifactId>
                 <version>${gson.version}</version>
             </dependency>
-            
-            <dependency>
-                <groupId>org.yaml</groupId>
-                <artifactId>snakeyaml</artifactId>
-                <version>${snakeyaml.version}</version>
-            </dependency>
         </dependencies>
     </dependencyManagement>
 
@@ -110,8 +121,12 @@
             <scope>test</scope>
         </dependency>
         <dependency>
-            <groupId>com.google.guava</groupId>
-            <artifactId>guava</artifactId>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>log4j-over-slf4j</artifactId>
         </dependency>
         <dependency>
             <groupId>org.apache.logging.log4j</groupId>
@@ -119,7 +134,17 @@
         </dependency>
         <dependency>
             <groupId>org.apache.logging.log4j</groupId>
-            <artifactId>log4j-api</artifactId>
+            <artifactId>log4j-slf4j-impl</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.apache.logging.log4j</groupId>
+                    <artifactId>log4j-core</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
         </dependency>
         <dependency>
             <groupId>org.projectlombok</groupId>
diff --git a/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/Main.java b/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/Main.java
index 423c45e..56f3e24 100644
--- a/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/Main.java
+++ b/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/Main.java
@@ -18,14 +18,13 @@
 package org.apache.skywalking.plugin.test.agent.tool;
 
 import java.io.File;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.DataAssert;
 import org.apache.skywalking.plugin.test.agent.tool.validator.entity.Data;
 import org.apache.skywalking.plugin.test.agent.tool.validator.exception.AssertFailedException;
 
+@Slf4j
 public class Main {
-    private static Logger logger = LogManager.getLogger(Main.class);
 
     public static void main(String[] args) {
         System.exit(verify() ? 0 : 1);
@@ -35,11 +34,11 @@ public class Main {
         File casePath = new File(ConfigHelper.testCaseBaseDir());
         try {
             if (!casePath.exists()) {
-                logger.error("test case dir is not exists or is not directory");
+                log.error("test case dir is not exists or is not directory");
                 return false;
             }
 
-            logger.info("start to assert data of test case[{}]", ConfigHelper.caseName());
+            log.info("start to assert data of test case[{}]", ConfigHelper.caseName());
             File actualData = new File(casePath, "actualData.yaml");
             File expectedData = new File(casePath, "expectedData.yaml");
 
@@ -51,17 +50,17 @@ public class Main {
                     );
                     return true;
                 } catch (AssertFailedException e) {
-                    logger.error("\nassert failed.\n{}\n", e.getCauseMessage());
+                    log.error("\nassert failed.\n{}\n", e.getCauseMessage());
                 }
             } else {
-                logger.error(
+                log.error(
                     "assert failed. because actual data {} and expected data {}",
                     actualData.exists() ? "founded" : "not founded", expectedData
                         .exists() ? "founded" : "not founded"
                 );
             }
         } catch (Exception e) {
-            logger.error("assert test case {} failed.", ConfigHelper.caseName(), e);
+            log.error("assert test case {} failed.", ConfigHelper.caseName(), e);
         }
         return false;
     }
diff --git a/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/DataAssert.java b/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/DataAssert.java
index 59a4124..4074817 100644
--- a/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/DataAssert.java
+++ b/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/DataAssert.java
@@ -18,18 +18,17 @@
 package org.apache.skywalking.plugin.test.agent.tool.validator.assertor;
 
 import com.google.gson.GsonBuilder;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.skywalking.plugin.test.agent.tool.validator.entity.Data;
 
+@Slf4j
 public class DataAssert {
-    private static Logger logger = LogManager.getLogger(DataAssert.class);
 
     public static void assertEquals(Data excepted, Data actual) {
-        logger.info("excepted data:\n{}", new GsonBuilder().setPrettyPrinting().create().toJson(excepted));
-        logger.info("actual data:\n{}", new GsonBuilder().setPrettyPrinting().create().toJson(actual));
+        log.info("excepted data:\n{}", new GsonBuilder().setPrettyPrinting().create().toJson(excepted));
+        log.info("actual data:\n{}", new GsonBuilder().setPrettyPrinting().create().toJson(actual));
         RegistryItemsAssert.assertEquals(excepted.registryItems(), actual.registryItems());
         SegmentItemsAssert.assertEquals(excepted.segmentItems(), actual.segmentItems());
-        logger.info("{} assert successful.", "segment items");
+        log.info("{} assert successful.", "segment items");
     }
 }
diff --git a/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/RegistryItemsAssert.java b/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/RegistryItemsAssert.java
index 1ff9d62..6ffb950 100644
--- a/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/RegistryItemsAssert.java
+++ b/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/RegistryItemsAssert.java
@@ -17,19 +17,18 @@
 
 package org.apache.skywalking.plugin.test.agent.tool.validator.assertor;
 
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.skywalking.plugin.test.agent.tool.validator.entity.RegistryItems;
 
+@Slf4j
 public class RegistryItemsAssert {
-    private static Logger logger = LogManager.getLogger(RegistryItemsAssert.class);
 
     public static void assertEquals(RegistryItems excepted, RegistryItems actual) {
         ServiceAssert.assertEquals(excepted.services(), actual.services());
-        logger.info("{} assert successful.", "registry services");
+        log.info("{} assert successful.", "registry services");
         InstanceAssert.assertEquals(excepted.instances(), actual.instances());
-        logger.info("{} assert successful.", "registry instances");
+        log.info("{} assert successful.", "registry instances");
         OperationNameAssert.assertEquals(excepted.operationNames(), actual.operationNames());
-        logger.info("{} assert successful.", "registry operation name");
+        log.info("{} assert successful.", "registry operation name");
     }
 }
diff --git a/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/SegmentItemsAssert.java b/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/SegmentItemsAssert.java
index 47227ea..4abbcbb 100644
--- a/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/SegmentItemsAssert.java
+++ b/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/SegmentItemsAssert.java
@@ -18,8 +18,7 @@
 package org.apache.skywalking.plugin.test.agent.tool.validator.assertor;
 
 import java.util.List;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.exception.ActualSegmentItemEmptyException;
 import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.exception.SegmentItemNotFoundException;
 import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.exception.SegmentSizeNotEqualsException;
@@ -29,12 +28,12 @@ import org.apache.skywalking.plugin.test.agent.tool.validator.entity.SegmentItem
 import org.apache.skywalking.plugin.test.agent.tool.validator.entity.SegmentRef;
 import org.apache.skywalking.plugin.test.agent.tool.validator.entity.Span;
 
+@Slf4j
 public class SegmentItemsAssert {
-    private static Logger logger = LogManager.getLogger(SegmentItemsAssert.class);
 
     public static void assertEquals(List<SegmentItem> expected, List<SegmentItem> actual) {
         if (expected == null) {
-            logger.info("ignore segment items. because expected segment item is null.");
+            log.info("ignore segment items. because expected segment item is null.");
             return;
         }