提交 d6760d35 编写于 作者: wu-sheng's avatar wu-sheng

Fix serialize bugs.

上级 886d6ea3
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<T> {
/**
* Serialize this object to T
* @return
*/
T serialize();
/**
* Initialize this object by the given message.
*
* @param message to init object.
*/
void deserialize(T message);
}
......@@ -26,6 +26,10 @@ public class LogData implements ISerializable<LogDataMessage>{
this.fields = fields;
}
LogData(LogDataMessage message){
deserialize(message);
}
public long getTime() {
return time;
}
......
......@@ -140,13 +140,15 @@ public class Span implements ISerializable<SpanMessage> {
}
/**
* 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<String, Object>();
logs = new LinkedList<LogData>();
this.deserialize(spanMessage);
}
/**
......@@ -294,18 +296,17 @@ public class Span implements ISerializable<SpanMessage> {
endTime = message.getEndTime();
operationName = message.getOperationName();
List<KeyValue> tagsList = message.getTagsList();
if(tagsList != null){
for (KeyValue tag : tagsList) {
tags.put(tag.getKey(), tag.getValue());
}
}
List<LogDataMessage> logsList = message.getLogsList();
if (logsList != null) {
for (LogDataMessage logDataMessage : logsList) {
List<KeyValue> fieldsList = logDataMessage.getFieldsList();
Map<String, String> fieldsMap = new HashMap<String, String>();
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));
}
}
}
......
......@@ -67,6 +67,15 @@ public class TraceSegment implements ISerializable<SegmentMessage> {
this.spans = new LinkedList<Span>();
}
/**
* 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<SegmentMessage> {
(primaryRef = new TraceSegmentRef()).deserialize(message.getPrimaryRef());
List<SegmentRefMessage> refsList = message.getRefsList();
if(refsList != null){
this.refs = new LinkedList<TraceSegmentRef>();
for (SegmentRefMessage refMessage : refsList) {
TraceSegmentRef ref = new TraceSegmentRef();
ref.deserialize(refMessage);
......@@ -172,10 +182,9 @@ public class TraceSegment implements ISerializable<SegmentMessage> {
List<SpanMessage> spansList = message.getSpansList();
if(spansList != null){
this.spans = new LinkedList<Span>();
for (SpanMessage spanMessage : spansList) {
Span span = new Span();
span.deserialize(spanMessage);
spans.add(span);
spans.add(new Span(spanMessage));
}
}
}
......
......@@ -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());
......
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());
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册