From d6760d35ebe882ef8057edaea7d6531a2f4ee113 Mon Sep 17 00:00:00 2001 From: wusheng Date: Wed, 22 Feb 2017 17:05:35 +0800 Subject: [PATCH] Fix serialize bugs. --- .../skywalking/messages/ISerializable.java | 19 ++++++++ .../com/a/eye/skywalking/trace/LogData.java | 4 ++ .../java/com/a/eye/skywalking/trace/Span.java | 25 ++++++----- .../a/eye/skywalking/trace/TraceSegment.java | 15 +++++-- .../a/eye/skywalking/trace/SpanTestCase.java | 2 + .../trace/TraceSegmentTestCase.java | 45 +++++++++++++++++-- 6 files changed, 91 insertions(+), 19 deletions(-) diff --git a/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/messages/ISerializable.java b/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/messages/ISerializable.java index 792787011..25896c30a 100644 --- a/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/messages/ISerializable.java +++ b/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/messages/ISerializable.java @@ -1,10 +1,29 @@ package com.a.eye.skywalking.messages; +import com.a.eye.skywalking.trace.TraceSegment; + /** + * All messages, which need to send between Akka actors, should implement this interface. + * The whole {@link TraceSegment} supports this. + * + * T should be a protobuf Object, which is generated by protoc. + * {@see /sky-walking/skywalking-commons/skywalking-trace/src/main/proto/trace.proto} + * + * {@see https://github.com/google/protobuf/tree/master/java} + * * Created by wusheng on 2017/2/22. */ public interface ISerializable { + /** + * Serialize this object to T + * @return + */ T serialize(); + /** + * Initialize this object by the given message. + * + * @param message to init object. + */ void deserialize(T message); } diff --git a/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/LogData.java b/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/LogData.java index 83c5c0602..24e6a42ef 100644 --- a/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/LogData.java +++ b/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/LogData.java @@ -26,6 +26,10 @@ public class LogData implements ISerializable{ this.fields = fields; } + LogData(LogDataMessage message){ + deserialize(message); + } + public long getTime() { return time; } diff --git a/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/Span.java b/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/Span.java index 1c0c31b22..ba6e91162 100644 --- a/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/Span.java +++ b/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/Span.java @@ -140,13 +140,15 @@ public class Span implements ISerializable { } /** - * This is a empty constructor, only to get a object. + * Create a new span, by given {@link SpanMessage}, which you can get from another {@link Span} object, + * by calling {@link Span#serialize()}; * - * DO NOT use this in anywhere, except {@link TraceSegment#deserialize(SegmentMessage)}. + * @param spanMessage from another {@link Span#serialize()} */ - Span() { + public Span(SpanMessage spanMessage) { tags = new HashMap(); logs = new LinkedList(); + this.deserialize(spanMessage); } /** @@ -294,18 +296,17 @@ public class Span implements ISerializable { endTime = message.getEndTime(); operationName = message.getOperationName(); + List tagsList = message.getTagsList(); + if(tagsList != null){ + for (KeyValue tag : tagsList) { + tags.put(tag.getKey(), tag.getValue()); + } + } + List logsList = message.getLogsList(); if (logsList != null) { for (LogDataMessage logDataMessage : logsList) { - List fieldsList = logDataMessage.getFieldsList(); - Map fieldsMap = new HashMap(); - if (fieldsList != null) { - for (KeyValue field : fieldsList) { - fieldsMap.put(field.getKey(), field.getValue()); - } - } - LogData logData = new LogData(logDataMessage.getTime(), fieldsMap); - logs.add(logData); + logs.add(new LogData(logDataMessage)); } } } diff --git a/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/TraceSegment.java b/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/TraceSegment.java index be7e8ac1a..f41c7c5f7 100644 --- a/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/TraceSegment.java +++ b/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/TraceSegment.java @@ -67,6 +67,15 @@ public class TraceSegment implements ISerializable { this.spans = new LinkedList(); } + /** + * Create a trace segment, by given {@link SegmentMessage} + * + * @param message from another {@link TraceSegment#serialize()} + */ + public TraceSegment(SegmentMessage message){ + deserialize(message); + } + /** * Establish the link between this segment and its parents. * The first time, you {@link #ref(TraceSegmentRef)} to parent, it is affirmed as {@link #primaryRef}. @@ -163,6 +172,7 @@ public class TraceSegment implements ISerializable { (primaryRef = new TraceSegmentRef()).deserialize(message.getPrimaryRef()); List refsList = message.getRefsList(); if(refsList != null){ + this.refs = new LinkedList(); for (SegmentRefMessage refMessage : refsList) { TraceSegmentRef ref = new TraceSegmentRef(); ref.deserialize(refMessage); @@ -172,10 +182,9 @@ public class TraceSegment implements ISerializable { List spansList = message.getSpansList(); if(spansList != null){ + this.spans = new LinkedList(); for (SpanMessage spanMessage : spansList) { - Span span = new Span(); - span.deserialize(spanMessage); - spans.add(span); + spans.add(new Span(spanMessage)); } } } diff --git a/skywalking-commons/skywalking-trace/src/test/java/com/a/eye/skywalking/trace/SpanTestCase.java b/skywalking-commons/skywalking-trace/src/test/java/com/a/eye/skywalking/trace/SpanTestCase.java index 8108a2aad..72ce1369d 100644 --- a/skywalking-commons/skywalking-trace/src/test/java/com/a/eye/skywalking/trace/SpanTestCase.java +++ b/skywalking-commons/skywalking-trace/src/test/java/com/a/eye/skywalking/trace/SpanTestCase.java @@ -14,6 +14,8 @@ public class SpanTestCase { public void testConstructors() { Span span1 = new Span(0, "serviceA"); Span span2 = new Span(2, span1, "serviceA"); + span2.setOperationName("serviceA-2"); + Assert.assertEquals("serviceA-2", span2.getOperationName()); Assert.assertEquals(-1, span1.getParentSpanId()); Assert.assertEquals(0, span2.getParentSpanId()); diff --git a/skywalking-commons/skywalking-trace/src/test/java/com/a/eye/skywalking/trace/TraceSegmentTestCase.java b/skywalking-commons/skywalking-trace/src/test/java/com/a/eye/skywalking/trace/TraceSegmentTestCase.java index 401c9f380..8cb632d8c 100644 --- a/skywalking-commons/skywalking-trace/src/test/java/com/a/eye/skywalking/trace/TraceSegmentTestCase.java +++ b/skywalking-commons/skywalking-trace/src/test/java/com/a/eye/skywalking/trace/TraceSegmentTestCase.java @@ -1,5 +1,6 @@ package com.a.eye.skywalking.trace; +import com.a.eye.skywalking.trace.tag.Tags; import org.junit.Assert; import org.junit.Test; @@ -8,7 +9,7 @@ import org.junit.Test; */ public class TraceSegmentTestCase { @Test - public void testConstructor(){ + public void testConstructor() { TraceSegment segment = new TraceSegment("trace_1"); Assert.assertEquals("trace_1", segment.getTraceSegmentId()); @@ -16,7 +17,7 @@ public class TraceSegmentTestCase { } @Test - public void testRef(){ + public void testRef() { TraceSegment segment = new TraceSegment("trace_3"); TraceSegmentRef ref1 = new TraceSegmentRef(); @@ -43,7 +44,7 @@ public class TraceSegmentTestCase { } @Test - public void testArchiveSpan(){ + public void testArchiveSpan() { TraceSegment segment = new TraceSegment("trace_1"); Span span1 = new Span(1, "/serviceA"); segment.archive(span1); @@ -56,11 +57,47 @@ public class TraceSegmentTestCase { } @Test - public void testFinish(){ + public void testFinish() { TraceSegment segment = new TraceSegment("trace_1"); Assert.assertTrue(segment.getEndTime() == 0); segment.finish(); Assert.assertTrue(segment.getEndTime() > 0); } + + @Test + public void testSerialize() { + TraceSegment segment = new TraceSegment("trace_3"); + + TraceSegmentRef ref1 = new TraceSegmentRef(); + ref1.setTraceSegmentId("parent_trace_0"); + ref1.setSpanId(1); + segment.ref(ref1); + + TraceSegmentRef ref2 = new TraceSegmentRef(); + ref2.setTraceSegmentId("parent_trace_1"); + ref2.setSpanId(5); + segment.ref(ref2); + + TraceSegmentRef ref3 = new TraceSegmentRef(); + ref3.setTraceSegmentId("parent_trace_1"); + ref3.setSpanId(5); + segment.ref(ref3); + + Span span1 = new Span(1, "/serviceA"); + Tags.SPAN_LAYER.asHttp(span1); + segment.archive(span1); + + Span span2 = new Span(2, span1, "/db/sql"); + Tags.SPAN_LAYER.asNoSQL(span2); + span2.log(new NullPointerException()); + segment.archive(span2); + + TraceSegment newSegment = new TraceSegment(segment.serialize()); + + Assert.assertEquals(segment.getSpans().size(), newSegment.getSpans().size()); + Assert.assertEquals(segment.getPrimaryRef().getTraceSegmentId(), newSegment.getPrimaryRef().getTraceSegmentId()); + Assert.assertEquals(Tags.SPAN_LAYER.get(segment.getSpans().get(0)), Tags.SPAN_LAYER.get(newSegment.getSpans().get(0))); + Assert.assertEquals(segment.getSpans().get(1).getLogs().get(0).getTime(), newSegment.getSpans().get(1).getLogs().get(0).getTime()); + } } -- GitLab