提交 0e25c6ea 编写于 作者: A ascrutae

support new api for activation project and fix test case compile fail

上级 93a45165
......@@ -43,11 +43,11 @@ public class JVMService implements BootService, Runnable {
String second = sdf.format(day);
if (Integer.parseInt(second) % 15 == 0) {
JVMMetric.Builder JVMBuilder = JVMMetric.newBuilder();
JVMBuilder.setTime(currentTimeMillis);
JVMBuilder.setCpu(CPUProvider.INSTANCE.getCpuMetric());
JVMBuilder.addAllMemory(MemoryProvider.INSTANCE.getMemoryMetricList());
JVMBuilder.addAllMemoryPool(MemoryPoolProvider.INSTANCE.getMemoryPoolMetricList());
JVMMetric.Builder jvmBuilder = JVMMetric.newBuilder();
jvmBuilder.setTime(currentTimeMillis);
jvmBuilder.setCpu(CPUProvider.INSTANCE.getCpuMetric());
jvmBuilder.addAllMemory(MemoryProvider.INSTANCE.getMemoryMetricList());
jvmBuilder.addAllMemoryPool(MemoryPoolProvider.INSTANCE.getMemoryPoolMetricList());
}
}
}
......@@ -6,7 +6,7 @@ import java.util.List;
/**
* @author wusheng
*/
public class ParallelCollectorModule extends MemoryPoolModule{
public class ParallelCollectorModule extends MemoryPoolModule {
public ParallelCollectorModule(List<MemoryPoolMXBean> beans) {
super(beans);
......
package org.skywalking.apm.agent.core.context;
import org.junit.Assert;
import org.junit.Test;
import org.skywalking.apm.agent.core.context.ids.DistributedTraceId;
import org.skywalking.apm.agent.core.context.ids.PropagatedTraceId;
import java.util.LinkedList;
import java.util.List;
/**
* Created by wusheng on 2017/2/19.
*/
public class ContextCarrierTestCase {
@Test
public void testSerialize() {
ContextCarrier carrier = new ContextCarrier();
carrier.setTraceSegmentId("trace_id_A");
carrier.setSpanId(100);
carrier.setApplicationCode("REMOTE_APP");
carrier.setPeerHost("10.2.3.16:8080");
List<DistributedTraceId> ids = new LinkedList<DistributedTraceId>();
ids.add(new PropagatedTraceId("Trace.global.id.123"));
carrier.setDistributedTraceIds(ids);
Assert.assertEquals("trace_id_A|100|REMOTE_APP|10.2.3.16:8080|Trace.global.id.123", carrier.serialize());
}
@Test
public void testDeserialize() {
ContextCarrier carrier = new ContextCarrier();
carrier.deserialize("trace_id_A|100|REMOTE_APP|10.2.3.16:8080|Trace.global.id.123,Trace.global.id.222");
Assert.assertEquals("trace_id_A", carrier.getTraceSegmentId());
Assert.assertEquals(100, carrier.getSpanId());
Assert.assertEquals("REMOTE_APP", carrier.getApplicationCode());
Assert.assertEquals("10.2.3.16:8080", carrier.getPeerHost());
Assert.assertEquals("Trace.global.id.123", carrier.getDistributedTraceIds().get(0).get());
Assert.assertEquals("Trace.global.id.222", carrier.getDistributedTraceIds().get(1).get());
}
@Test
public void testIllegalDeserialize() {
ContextCarrier carrier = new ContextCarrier();
carrier.deserialize("abcde");
Assert.assertFalse(carrier.isValid());
carrier = new ContextCarrier();
carrier.deserialize("trace_id|-100");
Assert.assertFalse(carrier.isValid());
carrier = new ContextCarrier();
carrier.deserialize("trace_id|illegal-spanid");
Assert.assertFalse(carrier.isValid());
carrier = new ContextCarrier();
carrier.deserialize("trace_id|100|other-illegal");
Assert.assertFalse(carrier.isValid());
carrier = new ContextCarrier();
carrier.deserialize("trace_id|100|REMOTE_APP|10.2.3.16:8080");
Assert.assertFalse(carrier.isValid());
carrier = new ContextCarrier();
carrier.deserialize("trace_id|100|REMOTE_APP|10.2.3.16:8080|Trace.global.id.123,Trace.global.id.222");
Assert.assertTrue(carrier.isValid());
carrier = new ContextCarrier();
carrier.deserialize("trace_id|100|REMOTE_APP|10.2.3.16:8080|Trace.global.id.123,Trace.global.id.222|0");
Assert.assertFalse(carrier.isValid());
}
}
......@@ -6,10 +6,10 @@ import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
import org.skywalking.apm.agent.core.boot.ServiceManager;
import org.skywalking.apm.agent.core.context.tag.Tags;
import org.skywalking.apm.agent.core.context.trace.AbstractSpan;
import org.skywalking.apm.agent.core.context.trace.NoopSpan;
import org.skywalking.apm.agent.core.context.trace.TraceSegment;
import org.skywalking.apm.agent.core.context.util.TraceSegmentHelper;
/**
* Created by wusheng on 2017/2/19.
......@@ -22,23 +22,23 @@ public class ContextManagerTestCase {
@Test
public void testDelegateToTracerContext() {
AbstractSpan span = ContextManager.createSpan("serviceA");
Tags.COMPONENT.set(span, "test");
AbstractSpan span = ContextManager.createLocalSpan("serviceA");
span.setComponent("test");
Assert.assertEquals(span, ContextManager.activeSpan());
TracerContext.ListenerManager.add(TestTracingContextListener.INSTANCE);
TracingContext.ListenerManager.add(TestTracingContextListener.INSTANCE);
ContextManager.stopSpan();
TraceSegment segment = TestTracingContextListener.INSTANCE.finishedSegmentCarrier[0];
Assert.assertEquals(span, segment.getSpans().get(0));
Assert.assertEquals(span, TraceSegmentHelper.getSpans(segment).get(0));
}
@Test
public void testSwitchToIgnoredTracerContext() throws NoSuchFieldException, IllegalAccessException {
AbstractSpan span = ContextManager.createSpan("/webresource/jquery.js");
Tags.COMPONENT.set(span, "test");
AbstractSpan span = ContextManager.createLocalSpan("/webresource/jquery.js");
span.setComponent("test");
Assert.assertTrue(span instanceof NoopSpan);
Assert.assertTrue(ContextManager.activeSpan() instanceof NoopSpan);
......@@ -54,11 +54,11 @@ public class ContextManagerTestCase {
Assert.assertNull(tracerContext);
// check normal trace again
span = ContextManager.createSpan("serviceA");
Tags.COMPONENT.set(span, "test");
span = ContextManager.createLocalSpan("serviceA");
span.setComponent("test");
tracerContext = ((ThreadLocal<AbstractTracerContext>)context.get(null)).get();
Assert.assertTrue(tracerContext instanceof TracerContext);
Assert.assertTrue(tracerContext instanceof TracingContext);
ContextManager.stopSpan();
tracerContext = ((ThreadLocal<AbstractTracerContext>)context.get(null)).get();
Assert.assertNull(tracerContext);
......@@ -66,6 +66,6 @@ public class ContextManagerTestCase {
@After
public void reset() {
TracerContext.ListenerManager.remove(TestTracingContextListener.INSTANCE);
TracingContext.ListenerManager.remove(TestTracingContextListener.INSTANCE);
}
}
......@@ -9,6 +9,8 @@ import org.skywalking.apm.agent.core.context.ids.DistributedTraceId;
import org.skywalking.apm.agent.core.context.ids.PropagatedTraceId;
import org.skywalking.apm.agent.core.context.trace.AbstractSpan;
import org.skywalking.apm.agent.core.context.trace.TraceSegment;
import org.skywalking.apm.agent.core.context.util.TraceSegmentHelper;
import org.skywalking.apm.agent.core.context.util.TraceSegmentRefHelper;
/**
* Created by wusheng on 2017/2/19.
......@@ -16,29 +18,30 @@ import org.skywalking.apm.agent.core.context.trace.TraceSegment;
public class TracerContextTestCase {
@Test
public void testSpanLifeCycle() {
TracerContext context = new TracerContext();
AbstractSpan span = context.createSpan("/serviceA", false);
TracingContext context = new TracingContext();
AbstractSpan span = context.createLocalSpan("/serviceA");
Assert.assertEquals(span, context.activeSpan());
TracerContext.ListenerManager.add(TestTracingContextListener.INSTANCE);
TracingContext.ListenerManager.add(TestTracingContextListener.INSTANCE);
final TraceSegment[] finishedSegmentCarrier = TestTracingContextListener.INSTANCE.finishedSegmentCarrier;
context.stopSpan(span);
Assert.assertNotNull(finishedSegmentCarrier[0]);
Assert.assertEquals(1, finishedSegmentCarrier[0].getSpans().size());
Assert.assertEquals(span, finishedSegmentCarrier[0].getSpans().get(0));
TraceSegment traceSegment = finishedSegmentCarrier[0];
Assert.assertNotNull(traceSegment);
Assert.assertEquals(1, TraceSegmentHelper.getSpans(traceSegment).size());
Assert.assertEquals(span, TraceSegmentHelper.getSpans(traceSegment).get(0));
}
@Test
public void testChildOfSpan() {
TracerContext context = new TracerContext();
AbstractSpan serviceSpan = context.createSpan("/serviceA", false);
AbstractSpan dbSpan = context.createSpan("db/preparedStatement/execute", false);
TracingContext context = new TracingContext();
AbstractSpan serviceSpan = context.createLocalSpan("/serviceA");
AbstractSpan dbSpan = context.createExitSpan("db/preparedStatement/execute", "127.0.0.1:3306");
Assert.assertEquals(dbSpan, context.activeSpan());
TracerContext.ListenerManager.add(TestTracingContextListener.INSTANCE);
TracingContext.ListenerManager.add(TestTracingContextListener.INSTANCE);
final TraceSegment[] finishedSegmentCarrier = TestTracingContextListener.INSTANCE.finishedSegmentCarrier;
try {
......@@ -50,23 +53,22 @@ public class TracerContextTestCase {
context.stopSpan(dbSpan);
context.stopSpan(serviceSpan);
Assert.assertNotNull(finishedSegmentCarrier[0]);
Assert.assertEquals(2, finishedSegmentCarrier[0].getSpans().size());
Assert.assertEquals(dbSpan, finishedSegmentCarrier[0].getSpans().get(0));
TraceSegment traceSegment = finishedSegmentCarrier[0];
Assert.assertNotNull(traceSegment);
Assert.assertEquals(2, TraceSegmentHelper.getSpans(traceSegment).size());
Assert.assertEquals(dbSpan, TraceSegmentHelper.getSpans(traceSegment).get(0));
}
@Test
public void testInject() {
TracerContext context = new TracerContext();
AbstractSpan serviceSpan = context.createSpan("/serviceA", false);
AbstractSpan dbSpan = context.createSpan("db/preparedStatement/execute", false);
dbSpan.setPeerHost("127.0.0.1");
dbSpan.setPort(8080);
TracingContext context = new TracingContext();
AbstractSpan serviceSpan = context.createLocalSpan("/serviceA");
AbstractSpan dbSpan = context.createExitSpan("db/preparedStatement/execute", "127.0.0.1:3306");
ContextCarrier carrier = new ContextCarrier();
context.inject(carrier);
Assert.assertEquals("127.0.0.1:8080", carrier.getPeerHost());
Assert.assertEquals("127.0.0.1:3306", carrier.getPeerHost());
Assert.assertEquals(1, carrier.getSpanId());
}
......@@ -75,7 +77,6 @@ public class TracerContextTestCase {
ContextCarrier carrier = new ContextCarrier();
carrier.setTraceSegmentId("trace_id_1");
carrier.setSpanId(5);
carrier.setApplicationCode("REMOTE_APP");
carrier.setPeerHost("10.2.3.16:8080");
List<DistributedTraceId> ids = new LinkedList<DistributedTraceId>();
ids.add(new PropagatedTraceId("Trace.global.id.123"));
......@@ -83,21 +84,22 @@ public class TracerContextTestCase {
Assert.assertTrue(carrier.isValid());
TracerContext context = new TracerContext();
TracingContext context = new TracingContext();
context.extract(carrier);
AbstractSpan span = context.createSpan("/serviceC", false);
AbstractSpan span = context.createLocalSpan("/serviceC");
TracerContext.ListenerManager.add(TestTracingContextListener.INSTANCE);
TracingContext.ListenerManager.add(TestTracingContextListener.INSTANCE);
final TraceSegment[] finishedSegmentCarrier = TestTracingContextListener.INSTANCE.finishedSegmentCarrier;
context.stopSpan(span);
Assert.assertEquals("trace_id_1", finishedSegmentCarrier[0].getRefs().get(0).getTraceSegmentId());
Assert.assertEquals(5, finishedSegmentCarrier[0].getRefs().get(0).getSpanId());
TraceSegment segment = finishedSegmentCarrier[0];
Assert.assertEquals("trace_id_1", TraceSegmentRefHelper.getTraceSegmentId(segment.getRefs().get(0)));
Assert.assertEquals(5, TraceSegmentRefHelper.getSpanId(segment.getRefs().get(0)));
}
@After
public void reset() {
TracerContext.ListenerManager.remove(TestTracingContextListener.INSTANCE);
TracingContext.ListenerManager.remove(TestTracingContextListener.INSTANCE);
}
}
package org.skywalking.apm.agent.core.context.trace;
import java.util.HashMap;
import java.util.Map;
import org.junit.Assert;
import org.junit.Test;
/**
* Created by wusheng on 2017/2/18.
*/
public class LogDataTestCase {
@Test
public void testHoldValue() {
Map<String, String> fields = new HashMap<String, String>();
LogData logData = new LogData(123L, fields);
Assert.assertEquals(123, logData.getTime());
Assert.assertEquals(fields, logData.getFields());
}
}
package org.skywalking.apm.agent.core.context.trace;
import java.lang.reflect.Field;
import java.util.List;
import org.junit.Assert;
import org.junit.Test;
import org.skywalking.apm.agent.core.tags.StringTagReader;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.skywalking.apm.agent.core.context.tag.Tags;
import org.skywalking.apm.agent.core.context.util.KeyValuePair;
import org.skywalking.apm.agent.core.context.util.KeyValuePairReader;
import org.skywalking.apm.agent.core.context.util.TraceSegmentHelper;
import org.skywalking.apm.agent.core.dictionary.ApplicationDictionary;
/**
* Created by wusheng on 2017/2/18.
*/
@RunWith(PowerMockRunner.class)
@PrepareForTest(ApplicationDictionary.class)
public class SpanTestCase {
@Test
public void testConstructors() {
Span span1 = new Span(0, "serviceA");
Span span2 = new Span(2, span1, "serviceA");
AbstractTracingSpan span1 = new LocalSpan(0, -1, "serviceA");
AbstractTracingSpan span2 = new LocalSpan(1, 0, "serviceA");
span2.setOperationName("serviceA-2");
span1.start();
span2.start();
Assert.assertEquals("serviceA-2", span2.getOperationName());
Assert.assertEquals(-1, span1.getParentSpanId());
Assert.assertEquals(0, span2.getParentSpanId());
Assert.assertTrue(span1.getStartTime() > 0);
Assert.assertTrue(span2.getStartTime() > 0);
Assert.assertEquals(-1, span1.parentSpanId);
Assert.assertEquals(0, span2.parentSpanId);
Assert.assertTrue(span1.startTime > 0);
Assert.assertTrue(span2.startTime > 0);
}
@Test
public void testFinish() {
TraceSegment owner = new TraceSegment("billing_app");
TraceSegment owner = new TraceSegment();
Span span1 = new Span(0, "serviceA");
AbstractTracingSpan span1 = new LocalSpan(0, -1, "serviceA");
Assert.assertTrue(span1.getEndTime() == 0);
Assert.assertTrue(span1.endTime == 0);
span1.finish(owner);
Assert.assertEquals(span1, owner.getSpans().get(0));
Assert.assertTrue(span1.getEndTime() > 0);
Assert.assertEquals(span1, TraceSegmentHelper.getSpans(owner).get(0));
Assert.assertTrue(span1.endTime > 0);
}
@Test
public void testSetTag() {
Span span1 = new Span(0, "serviceA");
Tags.SPAN_LAYER.asHttp(span1);
Tags.COMPONENT.set(span1, "Spring");
span1.setPeerHost("127.0.0.1");
Tags.ERROR.set(span1, true);
Tags.STATUS_CODE.set(span1, 302);
AbstractTracingSpan span1 = new LocalSpan(0, -1, "serviceA");
SpanLayer.asHttp(span1);
span1.setComponent("Spring");
span1.errorOccurred();
Tags.STATUS_CODE.set(span1, "505");
Tags.URL.set(span1, "http://127.0.0.1/serviceA");
Tags.DB_STATEMENT.set(span1, "select * from users");
Assert.assertEquals("http", StringTagReader.get(span1, Tags.SPAN_LAYER.SPAN_LAYER_TAG));
Assert.assertEquals("127.0.0.1", span1.getPeerHost());
Assert.assertTrue(BooleanTagReader.get(span1, Tags.ERROR));
Assert.assertEquals(SpanLayer.HTTP, span1.layer);
Assert.assertTrue(span1.errorOccurred);
}
@Test
public void testLogException() throws NoSuchFieldException, IllegalAccessException {
Span span1 = new Span(0, "serviceA");
AbstractTracingSpan span1 = new LocalSpan(0, -1, "serviceA");
Exception exp = new Exception("exception msg");
span1.log(exp);
Field logsField = Span.class.getDeclaredField("logs");
logsField.setAccessible(true);
List<LogData> logs = (List<LogData>)logsField.get(span1);
LogDataEntity logs = span1.logs.get(0);
List<KeyValuePair> keyValuePairs = logs.getLogs();
Assert.assertEquals("java.lang.Exception", logs.get(0).getFields().get("error.kind"));
Assert.assertEquals("exception msg", logs.get(0).getFields().get("message"));
Assert.assertNotNull(logs.get(0).getFields().get("stack"));
Assert.assertEquals("java.lang.Exception", KeyValuePairReader.get(keyValuePairs, "error.kind"));
Assert.assertEquals("exception msg", KeyValuePairReader.get(keyValuePairs, "message"));
Assert.assertNotNull(KeyValuePairReader.get(keyValuePairs, "stack"));
}
}
package org.skywalking.apm.agent.core.context.trace;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonObject;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.skywalking.apm.agent.core.context.tag.Tags;
import org.skywalking.apm.agent.core.tags.StringTagReader;
import org.skywalking.apm.agent.core.context.util.TraceSegmentHelper;
/**
* Created by wusheng on 2017/2/18.
*/
public class TraceSegmentTestCase {
@Test
public void testConstructor() {
TraceSegment segment = new TraceSegment("billing_app");
Assert.assertTrue(segment.getTraceSegmentId().startsWith("Segment"));
Assert.assertTrue(segment.getStartTime() > 0);
Assert.assertEquals("billing_app", segment.getApplicationId());
@Before
public void setUp() {
}
@Test
public void testRef() {
TraceSegment segment = new TraceSegment("billing_app");
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_3");
ref3.setSpanId(5);
segment.ref(ref3);
Assert.assertEquals(ref1, segment.getRefs().get(0));
Assert.assertEquals(ref2, segment.getRefs().get(1));
Assert.assertEquals(ref3, segment.getRefs().get(2));
Assert.assertEquals("parent_trace_0", segment.getRefs().get(0).getTraceSegmentId());
Assert.assertEquals(1, segment.getRefs().get(0).getSpanId());
}
@Test
public void testArchiveSpan() {
TraceSegment segment = new TraceSegment("billing_app");
Span span1 = new Span(1, "/serviceA");
TraceSegment segment = new TraceSegment();
AbstractTracingSpan span1 = new LocalSpan(1, 0, "/serviceA");
segment.archive(span1);
Span span2 = new Span(2, "/db/sql");
AbstractTracingSpan span2 = new LocalSpan(2, 1, "/db/sql");
segment.archive(span2);
Assert.assertEquals(span1, segment.getSpans().get(0));
Assert.assertEquals(span2, segment.getSpans().get(1));
}
@Test
public void testFinish() {
TraceSegment segment = new TraceSegment("billing_app");
Assert.assertTrue(segment.getEndTime() == 0);
segment.finish();
Assert.assertTrue(segment.getEndTime() > 0);
}
@Test
public void testSerialize() {
TraceSegment segment = new TraceSegment("billing_app");
TraceSegmentRef ref1 = new TraceSegmentRef();
ref1.setTraceSegmentId("parent_trace_0");
ref1.setSpanId(1);
ref1.setApplicationCode("REMOTE_APP");
ref1.setPeerHost("10.2.3.16:8080");
segment.ref(ref1);
TraceSegmentRef ref2 = new TraceSegmentRef();
ref2.setTraceSegmentId("parent_trace_1");
ref2.setSpanId(5);
ref2.setApplicationCode("REMOTE_APP");
ref2.setPeerHost("10.2.3.16:8080");
segment.ref(ref2);
TraceSegmentRef ref3 = new TraceSegmentRef();
ref3.setTraceSegmentId("parent_trace_2");
ref3.setSpanId(5);
ref3.setApplicationCode("REMOTE_APP");
ref3.setPeerHost("10.2.3.16:8080");
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.asDB(span2);
span2.log(new NullPointerException());
segment.archive(span2);
Gson gson = new GsonBuilder()
.excludeFieldsWithoutExposeAnnotation()
.create();
SegmentsMessage message = new SegmentsMessage();
message.append(segment);
String jsonString = message.serialize(gson);
int length = Integer.parseInt(jsonString.substring(0, 4));
String segmentJson = jsonString.substring(5);
Assert.assertEquals(length, segmentJson.length());
JsonObject jsonObject = gson.fromJson(segmentJson, JsonObject.class);
Assert.assertEquals(segment.getSpans().size(), jsonObject.get("ss").getAsJsonArray().size());
Assert.assertEquals(segment.getRefs().get(0).getTraceSegmentId(),
jsonObject.get("rs").getAsJsonArray().get(0).getAsJsonObject().get("ts").getAsString());
Assert.assertEquals(StringTagReader.get(segment.getSpans().get(1), Tags.SPAN_LAYER.SPAN_LAYER_TAG),
jsonObject.get("ss").getAsJsonArray().get(1).getAsJsonObject().get("ts").getAsJsonObject().get("span.layer").getAsString());
Assert.assertEquals(span1, TraceSegmentHelper.getSpans(segment).get(0));
Assert.assertEquals(span2, TraceSegmentHelper.getSpans(segment).get(1));
}
}
package org.skywalking.apm.agent.core.context.util;
import java.util.List;
public class KeyValuePairReader {
public static String get(List<KeyValuePair> pairs, String key) {
for (KeyValuePair pair : pairs) {
if (pair.getKey().equals(key)) {
return pair.getValue();
}
}
return null;
}
}
package org.skywalking.apm.agent.core.context.util;
import java.lang.reflect.Field;
import java.util.List;
import org.skywalking.apm.agent.core.context.trace.AbstractTracingSpan;
import org.skywalking.apm.agent.core.context.trace.TraceSegment;
public class TraceSegmentHelper {
public static List<AbstractTracingSpan> getSpans(TraceSegment traceSegment) {
try {
Field field = AbstractTracingSpan.class.getDeclaredField("spans");
return (List<AbstractTracingSpan>)field.get(traceSegment);
} catch (Exception e) {
throw new RuntimeException("Failed to get spans", e);
}
}
}
package org.skywalking.apm.agent.core.context.util;
import java.lang.reflect.Field;
import org.skywalking.apm.agent.core.context.trace.TraceSegmentRef;
public class TraceSegmentRefHelper {
public static int getSpanId(TraceSegmentRef ref) {
try {
Field field = TraceSegmentRef.class.getDeclaredField("spanId");
return Integer.valueOf(field.get(ref).toString());
} catch (Exception e) {
throw new RuntimeException("Failed to get span id", e);
}
}
public static String getTraceSegmentId(TraceSegmentRef ref) {
try {
Field field = TraceSegmentRef.class.getDeclaredField("traceSegmentId");
return field.get(ref).toString();
} catch (Exception e) {
throw new RuntimeException("Failed to get span id", e);
}
}
}
package org.skywalking.apm.agent.core.datacarrier;
import org.skywalking.apm.agent.core.datacarrier.buffer.Buffer;
import org.skywalking.apm.agent.core.datacarrier.buffer.BufferStrategy;
import org.skywalking.apm.agent.core.datacarrier.buffer.Channels;
import org.skywalking.apm.agent.core.datacarrier.consumer.IConsumer;
import org.skywalking.apm.agent.core.datacarrier.partition.ProducerThreadPartitioner;
import org.skywalking.apm.agent.core.datacarrier.partition.SimpleRollingPartitioner;
import org.junit.Assert;
import org.junit.Test;
import org.powermock.api.support.membermodification.MemberModifier;
import java.util.List;
/**
* Created by wusheng on 2016/10/25.
*/
public class DataCarrierTest {
@Test
public void testCreateDataCarrier() throws IllegalAccessException {
DataCarrier<SampleData> carrier = new DataCarrier<SampleData>(5, 100);
Assert.assertEquals(((Integer) (MemberModifier.field(DataCarrier.class, "bufferSize").get(carrier))).intValue(), 100);
Assert.assertEquals(((Integer) (MemberModifier.field(DataCarrier.class, "channelSize").get(carrier))).intValue(), 5);
Channels<SampleData> channels = (Channels<SampleData>) (MemberModifier.field(DataCarrier.class, "channels").get(carrier));
Assert.assertEquals(channels.getChannelSize(), 5);
Buffer<SampleData> buffer = channels.getBuffer(0);
Assert.assertEquals(buffer.getBufferSize(), 100);
Assert.assertEquals(MemberModifier.field(Buffer.class, "strategy").get(buffer), BufferStrategy.BLOCKING);
carrier.setBufferStrategy(BufferStrategy.IF_POSSIBLE);
Assert.assertEquals(MemberModifier.field(Buffer.class, "strategy").get(buffer), BufferStrategy.IF_POSSIBLE);
Assert.assertEquals(MemberModifier.field(Channels.class, "dataPartitioner").get(channels).getClass(), SimpleRollingPartitioner.class);
carrier.setPartitioner(new ProducerThreadPartitioner<SampleData>());
Assert.assertEquals(MemberModifier.field(Channels.class, "dataPartitioner").get(channels).getClass(), ProducerThreadPartitioner.class);
}
@Test
public void testProduce() throws IllegalAccessException {
DataCarrier<SampleData> carrier = new DataCarrier<SampleData>(2, 100);
Assert.assertTrue(carrier.produce(new SampleData().setName("a")));
Assert.assertTrue(carrier.produce(new SampleData().setName("b")));
Assert.assertTrue(carrier.produce(new SampleData().setName("c")));
Assert.assertTrue(carrier.produce(new SampleData().setName("d")));
Channels<SampleData> channels = (Channels<SampleData>) (MemberModifier.field(DataCarrier.class, "channels").get(carrier));
Buffer<SampleData> buffer1 = channels.getBuffer(0);
List result1 = buffer1.obtain(0, 100);
Buffer<SampleData> buffer2 = channels.getBuffer(1);
List result2 = buffer2.obtain(0, 100);
Assert.assertEquals(2, result1.size());
Assert.assertEquals(4, result1.size() + result2.size());
}
@Test
public void testOverrideProduce() throws IllegalAccessException {
DataCarrier<SampleData> carrier = new DataCarrier<SampleData>(2, 100);
carrier.setBufferStrategy(BufferStrategy.OVERRIDE);
for (int i = 0; i < 500; i++) {
Assert.assertTrue(carrier.produce(new SampleData().setName("d" + i)));
}
Channels<SampleData> channels = (Channels<SampleData>) (MemberModifier.field(DataCarrier.class, "channels").get(carrier));
Buffer<SampleData> buffer1 = channels.getBuffer(0);
List result1 = buffer1.obtain(0, 100);
Buffer<SampleData> buffer2 = channels.getBuffer(1);
List result2 = buffer2.obtain(0, 100);
Assert.assertEquals(200, result1.size() + result2.size());
}
@Test
public void testIfPossibleProduce() throws IllegalAccessException {
DataCarrier<SampleData> carrier = new DataCarrier<SampleData>(2, 100);
carrier.setBufferStrategy(BufferStrategy.IF_POSSIBLE);
for (int i = 0; i < 200; i++) {
Assert.assertTrue(carrier.produce(new SampleData().setName("d" + i)));
}
for (int i = 0; i < 200; i++) {
Assert.assertFalse(carrier.produce(new SampleData().setName("d" + i + "_2")));
}
Channels<SampleData> channels = (Channels<SampleData>) (MemberModifier.field(DataCarrier.class, "channels").get(carrier));
Buffer<SampleData> buffer1 = channels.getBuffer(0);
List result1 = buffer1.obtain(0, 100);
Buffer<SampleData> buffer2 = channels.getBuffer(1);
List result2 = buffer2.obtain(0, 100);
Assert.assertEquals(200, result1.size() + result2.size());
}
@Test
public void testBlockingProduce() throws IllegalAccessException {
final DataCarrier<SampleData> carrier = new DataCarrier<SampleData>(2, 100);
for (int i = 0; i < 200; i++) {
Assert.assertTrue(carrier.produce(new SampleData().setName("d" + i)));
}
long time1 = System.currentTimeMillis();
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
IConsumer<SampleData> consumer = new IConsumer<SampleData>() {
int i = 0;
@Override
public void init() {
}
@Override
public void consume(List<SampleData> data) {
}
@Override
public void onError(List<SampleData> data, Throwable t) {
}
@Override
public void onExit() {
}
};
carrier.consume(consumer, 1);
}
}).start();
carrier.produce(new SampleData().setName("blocking-data"));
long time2 = System.currentTimeMillis();
Assert.assertTrue(time2 - time1 > 2000);
}
}
package org.skywalking.apm.agent.core.datacarrier;
/**
* Created by wusheng on 2016/10/25.
*/
public class SampleData {
private int intValue;
private String name;
public int getIntValue() {
return intValue;
}
public String getName() {
return name;
}
public SampleData setIntValue(int intValue) {
this.intValue = intValue;
return this;
}
public SampleData setName(String name) {
this.name = name;
return this;
}
}
package org.skywalking.apm.agent.core.datacarrier.common;
import org.junit.Assert;
import org.junit.Test;
/**
* Created by wusheng on 2016/10/25.
*/
public class AtomicRangeIntegerTest {
@Test
public void testGetAndIncrement() {
AtomicRangeInteger atomicI = new AtomicRangeInteger(0, 10);
for (int i = 0; i < 10; i++) {
Assert.assertEquals(i, atomicI.getAndIncrement());
}
Assert.assertEquals(0, atomicI.getAndIncrement());
Assert.assertEquals(1, atomicI.get());
Assert.assertEquals(1, atomicI.intValue());
Assert.assertEquals(1, atomicI.longValue());
Assert.assertEquals(1, (int)atomicI.floatValue());
Assert.assertEquals(1, (int)atomicI.doubleValue());
}
}
package org.skywalking.apm.agent.core.datacarrier.consumer;
import org.junit.Assert;
import org.junit.Test;
import org.powermock.api.support.membermodification.MemberModifier;
import org.skywalking.apm.agent.core.datacarrier.SampleData;
import org.skywalking.apm.agent.core.datacarrier.buffer.BufferStrategy;
import org.skywalking.apm.agent.core.datacarrier.buffer.Channels;
import org.skywalking.apm.agent.core.datacarrier.partition.SimpleRollingPartitioner;
/**
* Created by wusheng on 2016/10/26.
*/
public class ConsumerPoolTest {
@Test
public void testBeginConsumerPool() throws IllegalAccessException {
Channels<SampleData> channels = new Channels<SampleData>(2, 100, new SimpleRollingPartitioner<SampleData>(), BufferStrategy.BLOCKING);
ConsumerPool<SampleData> pool = new ConsumerPool<SampleData>(channels, new SampleConsumer(), 2);
pool.begin();
ConsumerThread[] threads = (ConsumerThread[])MemberModifier.field(ConsumerPool.class, "consumerThreads").get(pool);
Assert.assertEquals(2, threads.length);
Assert.assertTrue(threads[0].isAlive());
Assert.assertTrue(threads[1].isAlive());
}
@Test
public void testCloseConsumerPool() throws InterruptedException, IllegalAccessException {
Channels<SampleData> channels = new Channels<SampleData>(2, 100, new SimpleRollingPartitioner<SampleData>(), BufferStrategy.BLOCKING);
ConsumerPool<SampleData> pool = new ConsumerPool<SampleData>(channels, new SampleConsumer(), 2);
pool.begin();
Thread.sleep(5000);
pool.close();
ConsumerThread[] threads = (ConsumerThread[])MemberModifier.field(ConsumerPool.class, "consumerThreads").get(pool);
Assert.assertEquals(2, threads.length);
Assert.assertFalse((Boolean)MemberModifier.field(ConsumerThread.class, "running").get(threads[0]));
Assert.assertFalse((Boolean)MemberModifier.field(ConsumerThread.class, "running").get(threads[1]));
}
}
package org.skywalking.apm.agent.core.datacarrier.consumer;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.concurrent.LinkedBlockingQueue;
import org.junit.Assert;
import org.junit.Test;
import org.powermock.api.support.membermodification.MemberModifier;
import org.skywalking.apm.agent.core.datacarrier.DataCarrier;
import org.skywalking.apm.agent.core.datacarrier.SampleData;
/**
* Created by wusheng on 2016/10/26.
*/
public class ConsumerTest {
public static LinkedBlockingQueue<SampleData> buffer = new LinkedBlockingQueue<SampleData>();
public static boolean isOccurError = false;
@Test
public void testConsumerLessThanChannel() throws IllegalAccessException {
final DataCarrier<SampleData> carrier = new DataCarrier<SampleData>(2, 100);
for (int i = 0; i < 100; i++) {
Assert.assertTrue(carrier.produce(new SampleData().setName("data" + i)));
}
SampleConsumer consumer = new SampleConsumer();
consumer.i = 100;
carrier.consume(SampleConsumer.class, 1);
Assert.assertEquals(1, ((SampleConsumer)getConsumer(carrier)).i);
SampleConsumer2 consumer2 = new SampleConsumer2();
consumer2.i = 100;
carrier.consume(consumer2, 1);
Assert.assertEquals(100, ((SampleConsumer2)getConsumer(carrier)).i);
carrier.shutdownConsumers();
}
@Test
public void testConsumerMoreThanChannel() throws IllegalAccessException, InterruptedException {
final DataCarrier<SampleData> carrier = new DataCarrier<SampleData>(2, 100);
for (int i = 0; i < 200; i++) {
Assert.assertTrue(carrier.produce(new SampleData().setName("data" + i)));
}
SampleConsumer consumer = new SampleConsumer();
carrier.consume(SampleConsumer.class, 5);
Thread.sleep(2000);
List<SampleData> result = new ArrayList<SampleData>();
buffer.drainTo(result);
Assert.assertEquals(200, result.size());
HashSet<Integer> consumerCounter = new HashSet<Integer>();
for (SampleData data : result) {
consumerCounter.add(data.getIntValue());
}
Assert.assertEquals(5, consumerCounter.size());
}
@Test
public void testConsumerOnError() {
final DataCarrier<SampleData> carrier = new DataCarrier<SampleData>(2, 100);
for (int i = 0; i < 200; i++) {
Assert.assertTrue(carrier.produce(new SampleData().setName("data" + i)));
}
SampleConsumer2 consumer = new SampleConsumer2();
consumer.onError = true;
carrier.consume(consumer, 5);
Assert.assertTrue(isOccurError);
}
class SampleConsumer2 implements IConsumer<SampleData> {
public int i = 1;
public boolean onError = false;
@Override
public void init() {
}
@Override
public void consume(List<SampleData> data) {
if (onError) {
throw new RuntimeException("consume exception");
}
}
@Override
public void onError(List<SampleData> data, Throwable t) {
isOccurError = true;
}
@Override
public void onExit() {
}
}
private IConsumer getConsumer(DataCarrier<SampleData> carrier) throws IllegalAccessException {
ConsumerPool pool = ((ConsumerPool)MemberModifier.field(DataCarrier.class, "consumerPool").get(carrier));
ConsumerThread[] threads = (ConsumerThread[])MemberModifier.field(ConsumerPool.class, "consumerThreads").get(pool);
return (IConsumer)MemberModifier.field(ConsumerThread.class, "consumer").get(threads[0]);
}
}
package org.skywalking.apm.agent.core.datacarrier.consumer;
import java.util.List;
import org.skywalking.apm.agent.core.datacarrier.SampleData;
/**
* Created by wusheng on 2016/10/26.
*/
public class SampleConsumer implements IConsumer<SampleData> {
public int i = 1;
@Override
public void init() {
}
@Override
public void consume(List<SampleData> data) {
for(SampleData one : data) {
one.setIntValue(this.hashCode());
ConsumerTest.buffer.offer(one);
}
}
@Override
public void onError(List<SampleData> data, Throwable t) {
}
@Override
public void onExit() {
}
}
package org.skywalking.apm.agent.core.datacarrier.partition;
import org.junit.Assert;
import org.junit.Test;
import org.skywalking.apm.agent.core.datacarrier.SampleData;
/**
* Created by wusheng on 2016/10/25.
*/
public class ProducerThreadPartitionerTest {
@Test
public void testPartition(){
int partitionNum = (int)Thread.currentThread().getId() % 10;
ProducerThreadPartitioner<SampleData> partitioner = new ProducerThreadPartitioner<SampleData>();
Assert.assertEquals(partitioner.partition(10, new SampleData()), partitionNum);
Assert.assertEquals(partitioner.partition(10, new SampleData()), partitionNum);
Assert.assertEquals(partitioner.partition(10, new SampleData()), partitionNum);
}
}
package org.skywalking.apm.agent.core.datacarrier.partition;
import org.junit.Assert;
import org.junit.Test;
import org.skywalking.apm.agent.core.datacarrier.SampleData;
/**
* Created by wusheng on 2016/10/25.
*/
public class SimpleRollingPartitionerTest {
@Test
public void testPartition() {
SimpleRollingPartitioner<SampleData> partitioner = new SimpleRollingPartitioner<SampleData>();
Assert.assertEquals(partitioner.partition(10, new SampleData()), 0);
Assert.assertEquals(partitioner.partition(10, new SampleData()), 1);
Assert.assertEquals(partitioner.partition(10, new SampleData()), 2);
}
}
package org.skywalking.apm.agent.core.datacarrier.performance.comparetest;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
import org.junit.Test;
import org.skywalking.apm.agent.core.datacarrier.DataCarrier;
import org.skywalking.apm.agent.core.datacarrier.consumer.IConsumer;
/**
* Created by wusheng on 2016/11/24.
*/
public class VsABQ {
private static int totalSize = 100000000;
/**
* 39469
*
* @throws InterruptedException
*/
@Test
public void testABQ() throws InterruptedException {
final ArrayBlockingQueue queue = new ArrayBlockingQueue(5000);
Thread consumer = new Thread(new Runnable() {
@Override
public void run() {
long startTime = -1;
int dataCounter = 0;
while (true) {
ArrayList data = new ArrayList();
queue.drainTo(data);
if (startTime == -1 && data.size() > 0) {
startTime = System.currentTimeMillis();
}
dataCounter += data.size();
if (dataCounter == totalSize) {
break;
}
}
System.out.println("time cost:" + (System.currentTimeMillis() - startTime));
}
});
consumer.start();
for (int i = 0; i < totalSize; i++) {
boolean status = false;
while (!status) {
try {
queue.add(i);
status = true;
} catch (Exception e) {
}
}
}
consumer.join();
}
public static void main(String[] args) throws InterruptedException {
final DataCarrier<Integer> dataCarrier = new DataCarrier<Integer>(5, 1000);
dataCarrier.consume(new IConsumer<Integer>() {
long startTime = -1;
int dataCounter = 0;
@Override
public void init() {
}
@Override
public void consume(List<Integer> data) {
if (startTime == -1 && data.size() > 0) {
startTime = System.currentTimeMillis();
}
dataCounter += data.size();
if (dataCounter == totalSize) {
System.out.println("cost:" + (System.currentTimeMillis() - startTime));
}
}
@Override
public void onError(List<Integer> data, Throwable t) {
}
@Override
public void onExit() {
}
}, 1);
for (int i = 0; i < totalSize; i++) {
dataCarrier.produce(i);
}
Thread.sleep(10 * 1000L);
}
}
package org.skywalking.apm.agent.core.datacarrier.performance.comparetest.disruptor;
/**
* Created by wusheng on 2016/11/24.
*/
public class Data {
private long value1;
public long getValue1() {
return value1;
}
public void setValue1(long value1) {
this.value1 = value1;
}
}
package org.skywalking.apm.agent.core.datacarrier.performance.comparetest.disruptor;
import com.lmax.disruptor.EventFactory;
/**
* Created by wusheng on 2016/11/24.
*/
public class DataEventFactory implements EventFactory<Data> {
@Override
public Data newInstance() {
return new Data();
}
}
package org.skywalking.apm.agent.core.datacarrier.performance.comparetest.disruptor;
import com.lmax.disruptor.EventHandler;
/**
* Created by wusheng on 2016/11/24.
*/
public class DataEventHandler implements EventHandler<Data> {
public long counter = 0;
@Override
public void onEvent(Data data, long sequence, boolean endOfBatch) throws Exception {
counter++;
System.out.println("handler:" + data.getValue1());
if (counter == TestDisruptor.totalSize) {
System.out.println("time cost:" + (System.currentTimeMillis() - TestDisruptor.startTime));
TestDisruptor.isEnd = true;
}
}
}
package org.skywalking.apm.agent.core.datacarrier.performance.comparetest.disruptor;
import com.lmax.disruptor.RingBuffer;
/**
* Created by wusheng on 2016/11/24.
*/
public class DataProducer {
private final RingBuffer<Data> ringBuffer;
public DataProducer(RingBuffer<Data> ringBuffer) {
this.ringBuffer = ringBuffer;
}
public void onData(Data bb) {
long sequence = ringBuffer.next(); // Grab the next sequence
try {
Data event = ringBuffer.get(sequence); // Get the entry in the Disruptor
// for the sequence
event.setValue1(bb.getValue1());// Fill with data
} finally {
ringBuffer.publish(sequence);
}
}
}
package org.skywalking.apm.agent.core.datacarrier.performance.comparetest.disruptor;
import com.lmax.disruptor.RingBuffer;
import com.lmax.disruptor.WorkHandler;
import com.lmax.disruptor.dsl.Disruptor;
import com.lmax.disruptor.util.DaemonThreadFactory;
/**
* Created by wusheng on 2016/11/24.
*/
public class TestDisruptor {
public static int totalSize = 100000000;
public static long startTime;
public static volatile boolean isEnd = false;
public static void main(String[] args) throws InterruptedException {
// The factory for the event
DataEventFactory factory = new DataEventFactory();
// Specify the size of the ring buffer, must be power of 2.
int bufferSize = 1024;
// Construct the Disruptor
Disruptor<Data> disruptor = new Disruptor<Data>(factory, bufferSize, DaemonThreadFactory.INSTANCE);
disruptor.handleEventsWithWorkerPool(new WorkHandler<Data>(){
@Override
public void onEvent(Data event) throws Exception {
System.out.println("work1:" + event.getValue1());
}
}, new WorkHandler<Data>(){
@Override
public void onEvent(Data event) throws Exception {
System.out.println("work2:" + event.getValue1());
}
});
// Connect the handler
disruptor.handleEventsWith(new DataEventHandler());
// Start the Disruptor, starts all threads running
disruptor.start();
RingBuffer<Data> ringBuffer = disruptor.getRingBuffer();
DataProducer producer = new DataProducer(ringBuffer);
startTime = System.currentTimeMillis();
for (int i = 0; i < totalSize; i++) {
Data data = new Data();
data.setValue1(i);
producer.onData(data);
Thread.sleep(1000L);
}
disruptor.shutdown();
while(!TestDisruptor.isEnd){
Thread.sleep(100L);
}
}
}
package org.skywalking.apm.agent.core.plugin;
import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.Instrumentation;
import net.bytebuddy.agent.ByteBuddyAgent;
import net.bytebuddy.agent.builder.AgentBuilder;
import net.bytebuddy.description.type.TypeDescription;
......@@ -7,6 +9,7 @@ import net.bytebuddy.dynamic.DynamicType;
import net.bytebuddy.dynamic.loading.ByteArrayClassLoader;
import net.bytebuddy.dynamic.loading.PackageDefinitionStrategy;
import net.bytebuddy.matcher.ElementMatchers;
import net.bytebuddy.utility.JavaModule;
import org.hamcrest.CoreMatchers;
import org.junit.Before;
import org.junit.Test;
......@@ -14,9 +17,8 @@ import org.junit.runner.RunWith;
import org.powermock.modules.junit4.PowerMockRunner;
import org.skywalking.apm.agent.core.plugin.utility.ClassFileExtraction;
import java.lang.instrument.ClassFileTransformer;
import static net.bytebuddy.matcher.ElementMatchers.none;
import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.MatcherAssert.assertThat;
@RunWith(PowerMockRunner.class)
......@@ -32,9 +34,7 @@ public class AbstractClassEnhancePluginDefineTest {
public void setUp() throws Exception {
classLoader = new ByteArrayClassLoader.ChildFirst(getClass().getClassLoader(),
ClassFileExtraction.of(TargetObject.class),
null,
ByteArrayClassLoader.PersistenceHandler.MANIFEST,
PackageDefinitionStrategy.NoOp.INSTANCE);
ByteArrayClassLoader.PersistenceHandler.MANIFEST);
}
@Test
......@@ -91,17 +91,6 @@ public class AbstractClassEnhancePluginDefineTest {
public static class MockTargetObjectTransformer implements AgentBuilder.Transformer {
@Override
public DynamicType.Builder<?> transform(DynamicType.Builder<?> builder, TypeDescription typeDescription,
ClassLoader classLoader) {
try {
DynamicType.Builder newBuilder = transformInstanceMethod(builder);
return transformStaticMethod(newBuilder);
} catch (Exception exception) {
throw new AssertionError(exception);
}
}
private DynamicType.Builder<?> transformStaticMethod(DynamicType.Builder newBuilder) {
MockPluginStaticMethodInstrumentation staticMethodInstrumentation = new MockPluginStaticMethodInstrumentation();
return staticMethodInstrumentation.define(WEAVE_CLASS, newBuilder, AbstractClassEnhancePluginDefineTest.class.getClassLoader());
......@@ -111,6 +100,17 @@ public class AbstractClassEnhancePluginDefineTest {
MockPluginInstanceMethodInstrumentation instrumentation = new MockPluginInstanceMethodInstrumentation();
return instrumentation.define(WEAVE_CLASS, builder, AbstractClassEnhancePluginDefineTest.class.getClassLoader());
}
@Override
public DynamicType.Builder<?> transform(DynamicType.Builder<?> builder, TypeDescription typeDescription,
ClassLoader classLoader, JavaModule module) {
try {
DynamicType.Builder newBuilder = transformInstanceMethod(builder);
return transformStaticMethod(newBuilder);
} catch (Exception exception) {
throw new AssertionError(exception);
}
}
}
}
......@@ -6,9 +6,10 @@ import net.bytebuddy.dynamic.DynamicType;
* Created by wusheng on 2017/2/27.
*/
public class MockAbstractClassEnhancePluginDefine extends AbstractClassEnhancePluginDefine {
@Override
protected DynamicType.Builder<?> enhance(String enhanceOriginClassName,
DynamicType.Builder<?> newClassBuilder) throws PluginException {
protected DynamicType.Builder<?> enhance(String enhanceOriginClassName, DynamicType.Builder<?> newClassBuilder,
ClassLoader classLoader) throws PluginException {
return newClassBuilder;
}
......
......@@ -45,6 +45,10 @@ public class MockPluginInstanceMethodInstrumentation extends ClassInstanceMethod
public String getMethodsInterceptor() {
return AbstractClassEnhancePluginDefineTest.INTERCEPTOR_CLASS;
}
@Override public boolean isOverrideArgs() {
return false;
}
},
new InstanceMethodsInterceptPoint() {
@Override
......@@ -56,6 +60,10 @@ public class MockPluginInstanceMethodInstrumentation extends ClassInstanceMethod
public String getMethodsInterceptor() {
return AbstractClassEnhancePluginDefineTest.INTERCEPTOR_CLASS;
}
@Override public boolean isOverrideArgs() {
return false;
}
}
};
}
......
package org.skywalking.apm.agent.core.plugin;
import org.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance;
import org.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceConstructorInterceptor;
import org.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor;
import org.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult;
import org.skywalking.apm.agent.core.plugin.interceptor.enhance.StaticMethodsAroundInterceptor;
public class MockPluginInterceptor implements InstanceMethodsAroundInterceptor, StaticMethodsAroundInterceptor, InstanceConstructorInterceptor {
@Override
public void beforeMethod(StaticMethodInvokeContext interceptorContext, MethodInterceptResult result) {
public void onConstruct(EnhancedInstance objInst, Object[] allArguments) {
objInst.setSkyWalkingDynamicField(allArguments[0]);
}
@Override
public Object afterMethod(StaticMethodInvokeContext interceptorContext, Object ret) {
return ret + "_STATIC";
public void beforeMethod(Class clazz, String methodName, Object[] allArguments, Class<?>[] parameterTypes,
MethodInterceptResult result) {
}
@Override
public void handleMethodException(Throwable t, MethodInvokeContext interceptorContext) {
public Object afterMethod(Class clazz, String methodName, Object[] allArguments, Class<?>[] parameterTypes,
Object ret) {
return ret + "_STATIC";
}
@Override
public void beforeMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext,
MethodInterceptResult result) {
public void handleMethodException(Class clazz, String methodName, Object[] allArguments, Class<?>[] parameterTypes,
Throwable t) {
}
@Override
public Object afterMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext,
Object ret) {
return ret + String.valueOf(context.get("VALUE"));
@Override public void beforeMethod(EnhancedInstance objInst, String methodName, Object[] allArguments,
Class<?>[] argumentsTypes, MethodInterceptResult result) throws Throwable {
}
@Override
public void handleMethodException(Throwable t, EnhancedClassInstanceContext context,
InstanceMethodInvokeContext interceptorContext) {
@Override public Object afterMethod(EnhancedInstance objInst, String methodName, Object[] allArguments,
Class<?>[] argumentsTypes, Object ret) throws Throwable {
return ret + String.valueOf(objInst.getSkyWalkingDynamicField());
}
@Override
public void onConstruct(EnhancedClassInstanceContext context, ConstructorInvokeContext interceptorContext) {
context.set("VALUE", interceptorContext.allArguments()[0]);
@Override public void handleMethodException(EnhancedInstance objInst, String methodName, Object[] allArguments,
Class<?>[] argumentsTypes, Throwable t) {
}
}
......@@ -26,6 +26,10 @@ public class MockPluginStaticMethodInstrumentation extends ClassStaticMethodsEnh
public String getMethodsInterceptor() {
return AbstractClassEnhancePluginDefineTest.INTERCEPTOR_CLASS;
}
@Override public boolean isOverrideArgs() {
return false;
}
}
};
}
......
package org.skywalking.apm.agent.core.plugin;
import java.util.ArrayList;
import net.bytebuddy.dynamic.DynamicType;
import org.junit.Assert;
import org.junit.Test;
import java.util.ArrayList;
/**
* Created by wusheng on 2017/2/27.
*/
......@@ -31,9 +30,10 @@ public class PluginFinderTest {
}
public class NewTestPlugin extends AbstractClassEnhancePluginDefine {
@Override
protected DynamicType.Builder<?> enhance(String enhanceOriginClassName,
DynamicType.Builder<?> newClassBuilder) throws PluginException {
protected DynamicType.Builder<?> enhance(String enhanceOriginClassName, DynamicType.Builder<?> newClassBuilder,
ClassLoader classLoader) throws PluginException {
return newClassBuilder;
}
......@@ -44,9 +44,10 @@ public class PluginFinderTest {
}
public class NewTestPlugin2 extends AbstractClassEnhancePluginDefine {
@Override
protected DynamicType.Builder<?> enhance(String enhanceOriginClassName,
DynamicType.Builder<?> newClassBuilder) throws PluginException {
protected DynamicType.Builder<?> enhance(String enhanceOriginClassName, DynamicType.Builder<?> newClassBuilder,
ClassLoader classLoader) throws PluginException {
return newClassBuilder;
}
......
package org.skywalking.apm.agent.core.plugin.assist;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.skywalking.apm.agent.core.plugin.interceptor.assist.NoConcurrencyAccessObject;
/**
* @author wusheng
*/
@RunWith(MockitoJUnitRunner.class)
public class NoConcurrencyAccessObjectTest {
@Mock
private InstanceMethodInvokeContext invokeContext;
@Test
public void testEntraExitCounter() {
final EnhancedClassInstanceContext context = new EnhancedClassInstanceContext();
NoConcurrencyAccessObject first = new NoConcurrencyAccessObject() {
@Override
protected void enter(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext) {
context.set("firstEntrance", true);
}
@Override
protected void exit() {
context.set("firstExit", true);
}
};
NoConcurrencyAccessObject second = new NoConcurrencyAccessObject() {
@Override
protected void enter(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext) {
context.set("secondEntrance", true);
}
@Override
protected void exit() {
context.set("lastEntrance", true);
}
};
first.whenEnter(context, invokeContext);
second.whenEnter(context, invokeContext);
first.whenExist(context);
second.whenExist(context);
Assert.assertTrue(!context.isContain("secondEntrance"));
Assert.assertTrue(!context.isContain("firstExit"));
Assert.assertTrue(context.isContain("firstEntrance"));
Assert.assertTrue(context.isContain("lastEntrance"));
}
}
package org.skywalking.apm.agent.core.plugin.bytebuddy;
import org.junit.Test;
/**
* Created by wusheng on 2017/2/28.
*/
public class AllObjectDefaultMethodsMatchTest {
@Test
public void testMatches() {
}
}
package org.skywalking.apm.agent.core.plugin.interceptor;
import org.junit.Assert;
import org.junit.Test;
/**
* @author wusheng
*/
public class EnhancedClassInstanceContextTest {
@Test
public void test() {
EnhancedClassInstanceContext context = new EnhancedClassInstanceContext();
context.set("key", "value");
Assert.assertTrue(context.isContain("key"));
Assert.assertEquals("value", context.get("key"));
Assert.assertEquals("value", (String)context.get("key"));
}
}
package org.skywalking.apm.agent.core.plugin.interceptor.enhance;
import org.junit.Assert;
import org.junit.Test;
/**
* @author wusheng
*/
public class InvokeContextTest {
@Test
public void testConstructorInvokeContext() {
ConstructorInvokeContext context = new ConstructorInvokeContext(this, new Object[] {"obj1", 1});
Assert.assertEquals(this, context.inst());
Assert.assertEquals("obj1", context.allArguments()[0]);
Assert.assertEquals(1, context.allArguments()[1]);
}
@Test
public void testInstanceMethodInvokeContext() {
InstanceMethodInvokeContext context = new InstanceMethodInvokeContext(this, "methodA", new Object[] {"obj1", 1}, new Class<?>[] {String.class, Integer.class});
Assert.assertEquals(this, context.inst());
Assert.assertEquals("obj1", context.allArguments()[0]);
Assert.assertEquals(1, context.allArguments()[1]);
Assert.assertEquals("methodA", context.methodName());
Assert.assertEquals(String.class, context.argumentTypes()[0]);
Assert.assertEquals(Integer.class, context.argumentTypes()[1]);
}
@Test
public void testStaticMethodInvokeContext() {
StaticMethodInvokeContext context = new StaticMethodInvokeContext(InvokeContextTest.class, "methodA", new Object[] {"obj1", 1}, new Class<?>[] {String.class, Integer.class});
Assert.assertEquals(InvokeContextTest.class, context.claszz());
Assert.assertEquals("obj1", context.allArguments()[0]);
Assert.assertEquals(1, context.allArguments()[1]);
Assert.assertEquals("methodA", context.methodName());
Assert.assertEquals(String.class, context.argumentTypes()[0]);
Assert.assertEquals(Integer.class, context.argumentTypes()[1]);
}
}
package org.skywalking.apm.agent.core.plugin.utility;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import net.bytebuddy.ClassFileVersion;
import net.bytebuddy.asm.AsmVisitorWrapper;
import net.bytebuddy.description.field.FieldDescription;
import net.bytebuddy.description.field.FieldList;
import net.bytebuddy.description.method.MethodDescription;
import net.bytebuddy.description.method.MethodList;
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.implementation.Implementation;
import net.bytebuddy.implementation.auxiliary.AuxiliaryType;
......@@ -12,10 +18,6 @@ import net.bytebuddy.jar.asm.ClassWriter;
import net.bytebuddy.pool.TypePool;
import org.junit.Test;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
......@@ -38,6 +40,8 @@ public class ClassFileExtraction {
classWriter,
new IllegalContext(),
TypePool.Empty.INSTANCE,
new FieldList.Empty<FieldDescription.InDefinedShape>(),
new MethodList.Empty<MethodDescription>(),
AsmVisitorWrapper.NO_FLAGS,
AsmVisitorWrapper.NO_FLAGS), AsmVisitorWrapper.NO_FLAGS);
return classWriter.toByteArray();
......@@ -82,5 +86,23 @@ public class ClassFileExtraction {
public ClassFileVersion getClassFileVersion() {
throw new AssertionError("Did not expect method call");
}
@Override
public MethodDescription.InDefinedShape registerAccessorFor(
Implementation.SpecialMethodInvocation specialMethodInvocation, AccessType accessType) {
throw new AssertionError("Did not expect method call");
}
@Override
public MethodDescription.InDefinedShape registerGetterFor(FieldDescription fieldDescription,
AccessType accessType) {
throw new AssertionError("Did not expect method call");
}
@Override
public MethodDescription.InDefinedShape registerSetterFor(FieldDescription fieldDescription,
AccessType accessType) {
throw new AssertionError("Did not expect method call");
}
}
}
......@@ -7,9 +7,10 @@ import org.junit.Test;
import org.skywalking.apm.agent.core.boot.ServiceManager;
import org.skywalking.apm.agent.core.conf.Config;
import org.skywalking.apm.agent.core.context.ContextManager;
import org.skywalking.apm.agent.core.context.TracingContext;
import org.skywalking.apm.agent.core.context.TracingContextListener;
import org.skywalking.apm.agent.core.context.tag.Tags;
import org.skywalking.apm.agent.core.context.trace.AbstractSpan;
import org.skywalking.apm.agent.core.context.trace.AbstractTracingSpan;
import org.skywalking.apm.agent.core.context.trace.TraceSegment;
/**
......@@ -29,24 +30,24 @@ public class SamplingTracerContextTestCase {
@Before
public void setUp() throws Exception {
Config.Agent.SAMPLE_N_PER_10_SECS = 5;
Config.Agent.SAMPLE_N_PER_3_SECS = 5;
ServiceManager.INSTANCE.boot();
TracerContext.ListenerManager.add(listener);
TracingContext.ListenerManager.add(listener);
}
@Test
public void testSample5InALoop() throws InterruptedException {
for (int i = 0; i < 11; i++) {
AbstractSpan span = ContextManager.createSpan("serviceA");
Tags.COMPONENT.set(span, "test");
AbstractSpan span = ContextManager.createLocalSpan("serviceA");
span.setComponent("test");
ContextManager.stopSpan();
}
/**
* Considering the reset cycle, in ci-env, may sample 5-7 trace through 1 or 2 cycle.
*/
Assert.assertTrue(finishedTracerCounter >= 5);
Assert.assertTrue(finishedTracerCounter <= 7);
Assert.assertTrue(finishedTracerCounter >= 2);
Assert.assertTrue(finishedTracerCounter <= 3);
Thread.sleep(10 * 1000L);
}
......@@ -54,10 +55,10 @@ public class SamplingTracerContextTestCase {
public void testSample5InLoopWithMultiSpans() {
finishedTracerCounter = 0;
for (int i = 0; i < 11; i++) {
AbstractSpan span = ContextManager.createSpan("serviceA");
Tags.COMPONENT.set(span, "test");
AbstractSpan span2 = ContextManager.createSpan("serviceB");
Tags.COMPONENT.set(span2, "test2");
AbstractSpan span = ContextManager.createLocalSpan("serviceA");
span.setComponent("test");
AbstractSpan span2 = ContextManager.createLocalSpan("serviceB");
span.setComponent("test2");
ContextManager.stopSpan();
ContextManager.stopSpan();
}
......@@ -71,7 +72,7 @@ public class SamplingTracerContextTestCase {
@After
public void tearDown() throws Exception {
Config.Agent.SAMPLE_N_PER_10_SECS = -1;
TracerContext.ListenerManager.remove(listener);
Config.Agent.SAMPLE_N_PER_3_SECS = -1;
TracingContext.ListenerManager.remove(listener);
}
}
package org.skywalking.apm.agent.core.tags;
import java.lang.reflect.Field;
import java.util.List;
import org.skywalking.apm.agent.core.context.tag.StringTag;
/**
* @author wusheng
*/
public class StringTagReader {
public static String get(Span span, StringTag tag) {
List<StringTagItem> tagsWithStrList = null;
try {
Field tagsWithStr = Span.class.getDeclaredField("tagsWithStr");
tagsWithStr.setAccessible(true);
tagsWithStrList = (List<StringTagItem>)tagsWithStr.get(span);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
for (StringTagItem item : tagsWithStrList) {
if (tag.key().equals(item.getKey())) {
return item.getValue();
}
}
return null;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>apm-sniffer</artifactId>
<groupId>org.skywalking</groupId>
<version>3.2-2017</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>apm-sniffer-mock</artifactId>
<description>This is a sniffer mock module. Simulate a sniffer, assemble one or more trace segments.
Test-dependency, only.
</description>
<dependencies>
<dependency>
<groupId>org.skywalking</groupId>
<artifactId>apm-agent-core</artifactId>
<version>${project.version}</version>
</dependency>
<!-- direct dependency junit, based on this is a mock module. -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
</project>
package org.skywalking.apm.sniffer.mock.context;
import org.junit.Assert;
import org.skywalking.apm.agent.core.context.TracingContextListener;
import org.skywalking.apm.agent.core.context.trace.TraceSegment;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* This is mock tracer context listener, which should be added by calling {@link TracerContext.ListenerManager#add(TracingContextListener)}.
* This mock listener will hold all finished trace, which all are generated by {@link TracerContext#finish()}.
* <p>
* Created by wusheng on 2017/2/20.
*/
public class MockTracingContextListener implements TracingContextListener {
private List<TraceSegment> finishedTraceSegments = Collections.synchronizedList(new ArrayList<TraceSegment>());
@Override
public void afterFinished(TraceSegment traceSegment) {
finishedTraceSegments.add(traceSegment);
}
/**
* Assert all finished {@link #finishedTraceSegments} match the given size.
*
* @param size the give size.
*/
public void assertSize(int size) {
Assert.assertEquals(size, finishedTraceSegments.size());
}
/**
* Assert the given index is a valid index of {@link #finishedTraceSegments}
*
* @param index the given index.
*/
public void assertValidIndex(int index) {
Assert.assertTrue(index < finishedTraceSegments.size());
}
/**
* Assert the {@link TraceSegment} at the given index of {@link #finishedTraceSegments},
* and run the given {@link SegmentAssert#call(TraceSegment)} to assert.
*
* @param index the given index.
* @param segmentAssert the given assert.
*/
public void assertTraceSegment(int index, SegmentAssert segmentAssert) {
assertValidIndex(index);
segmentAssert.call(finishedTraceSegments.get(index));
}
/**
* Clear all hold data.
*/
public void clear() {
finishedTraceSegments.clear();
}
/**
* Get {@link TraceSegment} of the given index.
*
* @param index
* @return
*/
public TraceSegment getFinished(int index) {
assertSize(index + 1);
return finishedTraceSegments.get(index);
}
}
package org.skywalking.apm.sniffer.mock.context;
import org.skywalking.apm.agent.core.context.trace.TraceSegment;
/**
* The <code>SegmentAssert</code> interface should be implemented by any
* class whose instances are intended to assert a trace segment data.
* <p>
* Created by wusheng on 2017/2/20.
*/
public interface SegmentAssert {
void call(TraceSegment finishedSegment);
}
package org.skywalking.apm.sniffer.mock.trace;
import java.lang.reflect.Field;
import java.util.List;
/**
* @author wusheng
*/
public class SpanLogReader {
public static List<LogData> getLogs(Span span) {
Field logs = null;
try {
logs = Span.class.getDeclaredField("logs");
} catch (NoSuchFieldException e) {
throw new RuntimeException(e);
}
logs.setAccessible(true);
try {
return (List<LogData>)logs.get(span);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
}
package org.skywalking.apm.sniffer.mock.trace;
import org.skywalking.apm.sniffer.mock.context.MockTracingContextListener;
import org.skywalking.apm.agent.core.context.trace.TraceSegment;
/**
* Created by wusheng on 2017/2/20.
*/
public interface TraceSegmentBuilder {
TraceSegment build(MockTracingContextListener listener);
}
package org.skywalking.apm.sniffer.mock.trace;
import org.skywalking.apm.sniffer.mock.context.MockTracingContextListener;
import org.skywalking.apm.sniffer.mock.trace.builders.trace.*;
import org.skywalking.apm.agent.core.context.trace.TraceSegment;
/**
* The <code>TraceSegmentBuilderFactory</code> contains all {@link TraceSegmentBuilder} implementations. All the
* implementations can build a true {@link TraceSegment} object, and contain all necessary spans, with all tags/events,
* all refs.
* <p>
* Created by wusheng on 2017/2/20.
*/
public enum TraceSegmentBuilderFactory {
INSTANCE;
/**
* @see {@link SingleTomcat200TraceBuilder}
*/
public TraceSegment singleTomcat200Trace() {
return this.build(SingleTomcat200TraceBuilder.INSTANCE);
}
/**
* @see {@link SingleTomcat404TraceBuilder}
*/
public TraceSegment singleTomcat404Trace() {
return this.build(SingleTomcat404TraceBuilder.INSTANCE);
}
/**
* @see {@link SingleTomcat500TraceBuilder}
*/
public TraceSegment singleTomcat500Trace() {
return this.build(SingleTomcat500TraceBuilder.INSTANCE);
}
/**
* @see {@link TomcatDubboClientTraceBuilder}
*/
public TraceSegment traceOf_Tomcat_DubboClient() {
return this.build(TomcatDubboClientTraceBuilder.INSTANCE);
}
/**
* @see {@link DubboServerMysqlTraceBuilder}
*/
public TraceSegment traceOf_DubboServer_MySQL() {
return this.build(DubboServerMysqlTraceBuilder.INSTANCE);
}
private TraceSegment build(TraceSegmentBuilder builder) {
MockTracingContextListener listener = new MockTracingContextListener();
try {
TracerContext.ListenerManager.add(listener);
return builder.build(listener);
} finally {
TracerContext.ListenerManager.remove(listener);
}
}
}
package org.skywalking.apm.sniffer.mock.trace.builders.span;
import org.skywalking.apm.agent.core.context.ContextManager;
import org.skywalking.apm.agent.core.context.tag.Tags;
import org.skywalking.apm.agent.core.context.trace.AbstractSpan;
/**
* The <code>DubboSpanGenerator</code> generates all possible spans, by tracing Dubbo rpc.
* Including discovery/server side span.
*
* @author wusheng
*/
public class DubboSpanGenerator {
public static class Client extends SpanGeneration {
@Override
protected void before() {
AbstractSpan span = ContextManager.createSpan("/default_rpc/org.skywalking.apm.test.persistence.PersistenceService.query");
Tags.COMPONENT.set(span, "Dubbo");
Tags.URL.set(span, "rest://192.168.1.8:20880/default_rpc/org.skywalking.apm.test.persistence.PersistenceService.query(String)");
Tags.SPAN_KIND.set(span, Tags.SPAN_KIND_SERVER);
span.setPeerHost("192.168.1.8");
span.setPort(20880);
Tags.SPAN_LAYER.asHttp(span);
}
@Override
protected void after() {
ContextManager.stopSpan();
}
}
public static class Server extends SpanGeneration {
@Override
protected void before() {
AbstractSpan span = ContextManager.createSpan("/default_rpc/org.skywalking.apm.test.persistence.PersistenceService.query");
Tags.COMPONENT.set(span, "Dubbo");
Tags.URL.set(span, "rest://192.168.1.8:20880/default_rpc/org.skywalking.apm.test.persistence.PersistenceService.query(String)");
Tags.SPAN_KIND.set(span, Tags.SPAN_KIND_CLIENT);
span.setPeerHost("10.21.9.35");
Tags.SPAN_LAYER.asHttp(span);
}
@Override
protected void after() {
ContextManager.stopSpan();
}
}
}
package org.skywalking.apm.sniffer.mock.trace.builders.span;
import org.skywalking.apm.agent.core.context.ContextManager;
import org.skywalking.apm.agent.core.context.tag.Tags;
import org.skywalking.apm.agent.core.context.trace.AbstractSpan;
/**
* The <code>MySQLGenerator</code> generates all possible spans, by tracing mysql discovery access.
*
* @author wusheng
*/
public class MySQLGenerator {
public static class Query extends SpanGeneration {
@Override
protected void before() {
AbstractSpan span = ContextManager.createSpan("mysql/jdbi/statement/executeQuery");
Tags.COMPONENT.set(span, "Mysql");
Tags.SPAN_KIND.set(span, Tags.SPAN_KIND_CLIENT);
span.setPeerHost("10.5.34.18");
span.setPort(30088);
Tags.DB_INSTANCE.set(span, "mysql-instance");
Tags.DB_STATEMENT.set(span, "select * from users where user_id = 1");
Tags.DB_TYPE.set(span, "sql");
Tags.SPAN_LAYER.asDB(span);
}
@Override
protected void after() {
ContextManager.stopSpan();
}
}
}
package org.skywalking.apm.sniffer.mock.trace.builders.span;
/**
* The <code>SpanGeneration</code> implementations can generate several kinds of spans.
*
* @author wusheng
*/
public abstract class SpanGeneration {
private SpanGeneration[] next;
public SpanGeneration build(SpanGeneration next) {
this.next = new SpanGeneration[] {next};
return next;
}
public void build(SpanGeneration... next) {
this.next = next;
}
protected abstract void before();
protected abstract void after();
public void generate() {
this.before();
if (next != null) {
for (SpanGeneration generation : next) {
generation.generate();
}
}
this.after();
}
}
package org.skywalking.apm.sniffer.mock.trace.builders.span;
import org.skywalking.apm.agent.core.context.ContextManager;
import org.skywalking.apm.agent.core.context.tag.Tags;
import org.skywalking.apm.agent.core.context.trace.AbstractSpan;
/**
* The <code>TomcatSpanGenerator</code> generate all possible spans, by tracing Tomcat.
* <p>
* Created by wusheng on 2017/2/20.
*/
public class TomcatSpanGenerator {
public static class ON200 extends SpanGeneration {
public static final ON200 INSTANCE = new ON200();
@Override
protected void before() {
AbstractSpan webSpan = ContextManager.createSpan("/web/serviceA");
Tags.COMPONENT.set(webSpan, "Tomcat");
Tags.URL.set(webSpan, "http://10.21.9.35/web/serviceA");
Tags.SPAN_KIND.set(webSpan, Tags.SPAN_KIND_SERVER);
webSpan.setPeerHost("10.21.9.35");
webSpan.setPort(80);
Tags.SPAN_LAYER.asHttp(webSpan);
}
@Override
protected void after() {
AbstractSpan webSpan = ContextManager.activeSpan();
Tags.STATUS_CODE.set(webSpan, 200);
ContextManager.stopSpan();
}
}
public static class ON404 extends SpanGeneration {
public static final ON404 INSTANCE = new ON404();
@Override
protected void before() {
AbstractSpan webSpan = ContextManager.createSpan("/web/service/unknown");
Tags.COMPONENT.set(webSpan, "Tomcat");
Tags.URL.set(webSpan, "http://10.21.9.35/web/unknown");
Tags.SPAN_KIND.set(webSpan, Tags.SPAN_KIND_SERVER);
webSpan.setPeerHost("10.21.9.35");
webSpan.setPort(80);
Tags.SPAN_LAYER.asHttp(webSpan);
}
@Override
protected void after() {
AbstractSpan webSpan = ContextManager.activeSpan();
Tags.STATUS_CODE.set(webSpan, 404);
Tags.ERROR.set(webSpan, true);
ContextManager.stopSpan();
}
}
public static class ON500 extends SpanGeneration {
public static final ON500 INSTANCE = new ON500();
@Override
protected void before() {
AbstractSpan webSpan = ContextManager.createSpan("/web/error/service");
Tags.COMPONENT.set(webSpan, "Tomcat");
Tags.URL.set(webSpan, "http://10.21.9.35/web/error/service");
Tags.SPAN_KIND.set(webSpan, Tags.SPAN_KIND_SERVER);
webSpan.setPeerHost("10.21.9.35");
webSpan.setPort(80);
Tags.SPAN_LAYER.asHttp(webSpan);
}
@Override
protected void after() {
AbstractSpan webSpan = ContextManager.activeSpan();
Tags.STATUS_CODE.set(webSpan, 500);
Tags.ERROR.set(webSpan, true);
webSpan.log(new NumberFormatException("Can't convert 'abc' to int."));
ContextManager.stopSpan();
}
}
}
package org.skywalking.apm.sniffer.mock.trace.builders.trace;
import org.skywalking.apm.sniffer.mock.context.MockTracingContextListener;
import org.skywalking.apm.sniffer.mock.trace.TraceSegmentBuilder;
import org.skywalking.apm.sniffer.mock.trace.builders.span.DubboSpanGenerator;
import org.skywalking.apm.sniffer.mock.trace.builders.span.MySQLGenerator;
import org.skywalking.apm.agent.core.context.trace.TraceSegment;
/**
* @author wusheng
*/
public enum DubboServerMysqlTraceBuilder implements TraceSegmentBuilder {
INSTANCE;
@Override
public TraceSegment build(MockTracingContextListener listener) {
DubboSpanGenerator.Server rootSpan = new DubboSpanGenerator.Server();
rootSpan.build(new MySQLGenerator.Query());
rootSpan.generate();
return listener.getFinished(0);
}
}
package org.skywalking.apm.sniffer.mock.trace.builders.trace;
import org.skywalking.apm.sniffer.mock.context.MockTracingContextListener;
import org.skywalking.apm.sniffer.mock.trace.TraceSegmentBuilder;
import org.skywalking.apm.sniffer.mock.trace.builders.span.TomcatSpanGenerator;
import org.skywalking.apm.agent.core.context.trace.TraceSegment;
/**
* A Trace contains only one span, which represent a tomcat server side span.
* <p>
* Created by wusheng on 2017/2/20.
*/
public enum SingleTomcat200TraceBuilder implements TraceSegmentBuilder {
INSTANCE;
@Override
public TraceSegment build(MockTracingContextListener listener) {
TomcatSpanGenerator.ON200.INSTANCE.generate();
return listener.getFinished(0);
}
}
package org.skywalking.apm.sniffer.mock.trace.builders.trace;
import org.skywalking.apm.sniffer.mock.context.MockTracingContextListener;
import org.skywalking.apm.sniffer.mock.trace.TraceSegmentBuilder;
import org.skywalking.apm.sniffer.mock.trace.builders.span.TomcatSpanGenerator;
import org.skywalking.apm.agent.core.context.trace.TraceSegment;
/**
* A Trace contains only one span, which represent a tomcat server side span.
* <p>
* Created by wusheng on 2017/2/20.
*/
public enum SingleTomcat404TraceBuilder implements TraceSegmentBuilder {
INSTANCE;
@Override
public TraceSegment build(MockTracingContextListener listener) {
TomcatSpanGenerator.ON404.INSTANCE.generate();
return listener.getFinished(0);
}
}
package org.skywalking.apm.sniffer.mock.trace.builders.trace;
import org.skywalking.apm.sniffer.mock.context.MockTracingContextListener;
import org.skywalking.apm.sniffer.mock.trace.TraceSegmentBuilder;
import org.skywalking.apm.sniffer.mock.trace.builders.span.TomcatSpanGenerator;
import org.skywalking.apm.agent.core.context.trace.TraceSegment;
/**
* A Trace contains only one span, which represent a tomcat server side span.
* <p>
* Created by wusheng on 2017/2/20.
*/
public enum SingleTomcat500TraceBuilder implements TraceSegmentBuilder {
INSTANCE;
@Override
public TraceSegment build(MockTracingContextListener listener) {
TomcatSpanGenerator.ON500.INSTANCE.generate();
return listener.getFinished(0);
}
}
package org.skywalking.apm.sniffer.mock.trace.builders.trace;
import org.skywalking.apm.sniffer.mock.context.MockTracingContextListener;
import org.skywalking.apm.sniffer.mock.trace.TraceSegmentBuilder;
import org.skywalking.apm.sniffer.mock.trace.builders.span.DubboSpanGenerator;
import org.skywalking.apm.sniffer.mock.trace.builders.span.TomcatSpanGenerator;
import org.skywalking.apm.agent.core.context.trace.TraceSegment;
/**
* A Trace segment contains two spans with ChildOf relations,
* the parent is a Tomcat span,
* the child is a Dubbo discovery span.
*
* @author wusheng
*/
public enum TomcatDubboClientTraceBuilder implements TraceSegmentBuilder {
INSTANCE;
@Override
public TraceSegment build(MockTracingContextListener listener) {
TomcatSpanGenerator.ON200 rootSpan = new TomcatSpanGenerator.ON200();
rootSpan.build(new DubboSpanGenerator.Client());
rootSpan.generate();
return listener.getFinished(0);
}
}
package org.skywalking.apm.sniffer.mock.trace.tags;
import java.lang.reflect.Field;
import java.util.List;
import org.skywalking.apm.agent.core.context.tag.StringTag;
/**
* @author wusheng
*/
public class StringTagReader {
public static String get(Span span, StringTag tag) {
List<StringTagItem> tagsWithStrList = null;
try {
Field tagsWithStr = Span.class.getDeclaredField("tagsWithStr");
tagsWithStr.setAccessible(true);
tagsWithStrList = (List<StringTagItem>)tagsWithStr.get(span);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
for (StringTagItem item : tagsWithStrList) {
if (tag.key().equals(item.getKey())) {
return item.getValue();
}
}
return null;
}
}
package org.skywalking.apm.sniffer.mock;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
import org.skywalking.apm.agent.core.boot.ServiceManager;
import org.skywalking.apm.sniffer.mock.context.MockTracingContextListener;
import org.skywalking.apm.sniffer.mock.context.SegmentAssert;
import org.skywalking.apm.sniffer.mock.trace.TraceSegmentBuilderFactory;
import org.skywalking.apm.agent.core.context.trace.TraceSegment;
/**
* Created by wusheng on 2017/2/21.
*/
public class MockTracingContextListenerTestCase {
@BeforeClass
public static void setup() {
ServiceManager.INSTANCE.boot();
}
@Test
public void testAfterFinished() {
MockTracingContextListener listener = new MockTracingContextListener();
listener.afterFinished(TraceSegmentBuilderFactory.INSTANCE.singleTomcat200Trace());
Assert.assertNotNull(listener.getFinished(0));
}
@Test(expected = AssertionError.class)
public void testAssertSize() {
MockTracingContextListener listener = new MockTracingContextListener();
listener.afterFinished(TraceSegmentBuilderFactory.INSTANCE.singleTomcat404Trace());
listener.assertSize(0);
}
@Test
public void testAssertTraceSegment() {
MockTracingContextListener listener = new MockTracingContextListener();
listener.afterFinished(TraceSegmentBuilderFactory.INSTANCE.singleTomcat404Trace());
listener.afterFinished(TraceSegmentBuilderFactory.INSTANCE.singleTomcat500Trace());
listener.assertTraceSegment(0, new SegmentAssert() {
@Override
public void call(TraceSegment finishedSegment) {
Assert.assertNotNull(finishedSegment);
}
});
}
@Test(expected = AssertionError.class)
public void testClear() {
MockTracingContextListener listener = new MockTracingContextListener();
listener.afterFinished(TraceSegmentBuilderFactory.INSTANCE.singleTomcat404Trace());
listener.afterFinished(TraceSegmentBuilderFactory.INSTANCE.singleTomcat500Trace());
listener.clear();
listener.assertValidIndex(0);
}
@Test
public void testTraceOf_Tomcat_DubboClient() {
TraceSegment segment = TraceSegmentBuilderFactory.INSTANCE.traceOf_Tomcat_DubboClient();
Assert.assertEquals(2, segment.getSpans().size());
}
@Test
public void testTraceOf_DubboServer_MySQL() {
TraceSegment segment = TraceSegmentBuilderFactory.INSTANCE.traceOf_DubboServer_MySQL();
Assert.assertEquals(2, segment.getSpans().size());
}
}
package org.skywalking.apm.toolkit.activation.log.log4j.v1.x;
import org.skywalking.apm.agent.core.context.ContextManager;
import org.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance;
import org.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor;
import org.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult;
......@@ -8,29 +9,19 @@ import org.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptR
* Created by wusheng on 2016/12/7.
*/
public class PrintTraceIdInterceptor implements InstanceMethodsAroundInterceptor {
@Override
public void beforeMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext,
MethodInterceptResult result) {
@Override public void beforeMethod(EnhancedInstance objInst, String methodName, Object[] allArguments,
Class<?>[] argumentsTypes, MethodInterceptResult result) throws Throwable {
}
/**
* Override org.skywalking.apm.toolkit.log.log4j.v1.x.TraceIdPatternConverter.convert(),
*
* @param context instance context, a class instance only has one {@link EnhancedClassInstanceContext} instance.
* @param interceptorContext method context, includes class name, method name, etc.
* @param ret the method's original return value.
* @return the traceId
*/
@Override
public Object afterMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext,
Object ret) {
@Override public Object afterMethod(EnhancedInstance objInst, String methodName, Object[] allArguments,
Class<?>[] argumentsTypes, Object ret) throws Throwable {
return "TID:" + ContextManager.getGlobalTraceId();
}
@Override
public void handleMethodException(Throwable t, EnhancedClassInstanceContext context,
InstanceMethodInvokeContext interceptorContext) {
@Override public void handleMethodException(EnhancedInstance objInst, String methodName, Object[] allArguments,
Class<?>[] argumentsTypes, Throwable t) {
}
}
......@@ -50,6 +50,10 @@ public class TraceIdPatternConverterActivation extends ClassInstanceMethodsEnhan
public String getMethodsInterceptor() {
return "org.skywalking.apm.toolkit.activation.log.log4j.v1.x.PrintTraceIdInterceptor";
}
@Override public boolean isOverrideArgs() {
return false;
}
}
};
}
......
......@@ -41,6 +41,10 @@ public class Log4j2OutputAppenderActivation extends ClassStaticMethodsEnhancePlu
public String getMethodsInterceptor() {
return "org.skywalking.apm.toolkit.activation.log.log4j.v2.x.PrintTraceIdInterceptor";
}
@Override public boolean isOverrideArgs() {
return false;
}
}
};
}
......
......@@ -11,24 +11,25 @@ public class PrintTraceIdInterceptor implements StaticMethodsAroundInterceptor {
/**
* Override org.skywalking.apm.toolkit.log.log4j.v2.x.Log4j2OutputAppender.append(),
*
* @param interceptorContext method context, includes class name, method name, etc.
* @param result change this result, to output the traceId. The origin append() method will not invoke.
* @param result change this result, to output the traceId. The origin append() method will not invoke.
*/
@Override
public void beforeMethod(StaticMethodInvokeContext interceptorContext, MethodInterceptResult result) {
((StringBuilder) interceptorContext.allArguments()[0]).append("TID:" + ContextManager.getGlobalTraceId());
@Override public void beforeMethod(Class clazz, String methodName, Object[] allArguments, Class<?>[] parameterTypes,
MethodInterceptResult result) {
((StringBuilder)allArguments[0]).append("TID:" + ContextManager.getGlobalTraceId());
//make sure origin method do not invoke.
result.defineReturnValue(null);
}
@Override
public Object afterMethod(StaticMethodInvokeContext interceptorContext, Object ret) {
public Object afterMethod(Class clazz, String methodName, Object[] allArguments, Class<?>[] parameterTypes,
Object ret) {
return null;
}
@Override
public void handleMethodException(Throwable t, MethodInvokeContext interceptorContext) {
public void handleMethodException(Class clazz, String methodName, Object[] allArguments, Class<?>[] parameterTypes,
Throwable t) {
}
}
......@@ -51,6 +51,10 @@ public class LogbackPatternConverterActivation extends ClassInstanceMethodsEnhan
public String getMethodsInterceptor() {
return "org.skywalking.apm.toolkit.activation.log.logback.v1.x.PrintTraceIdInterceptor";
}
@Override public boolean isOverrideArgs() {
return false;
}
}
};
}
......
package org.skywalking.apm.toolkit.activation.log.logback.v1.x;
import org.skywalking.apm.agent.core.context.ContextManager;
import org.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance;
import org.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor;
import org.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult;
......@@ -8,29 +9,19 @@ import org.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptR
* Created by wusheng on 2016/12/7.
*/
public class PrintTraceIdInterceptor implements InstanceMethodsAroundInterceptor {
@Override
public void beforeMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext,
MethodInterceptResult result) {
@Override public void beforeMethod(EnhancedInstance objInst, String methodName, Object[] allArguments,
Class<?>[] argumentsTypes, MethodInterceptResult result) throws Throwable {
}
/**
* Override org.skywalking.apm.toolkit.log.logback.v1.x.LogbackPatternConverter.convert(),
*
* @param context instance context, a class instance only has one {@link EnhancedClassInstanceContext} instance.
* @param interceptorContext method context, includes class name, method name, etc.
* @param ret the method's original return value.
* @return the traceId
*/
@Override
public Object afterMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext,
Object ret) {
@Override public Object afterMethod(EnhancedInstance objInst, String methodName, Object[] allArguments,
Class<?>[] argumentsTypes, Object ret) throws Throwable {
return "TID:" + ContextManager.getGlobalTraceId();
}
@Override
public void handleMethodException(Throwable t, EnhancedClassInstanceContext context,
InstanceMethodInvokeContext interceptorContext) {
@Override public void handleMethodException(EnhancedInstance objInst, String methodName, Object[] allArguments,
Class<?>[] argumentsTypes, Throwable t) {
}
}
package org.skywalking.apm.toolkit.activation.opentracing.span;
import net.bytebuddy.description.method.MethodDescription;
import net.bytebuddy.matcher.ElementMatcher;
import org.skywalking.apm.agent.core.plugin.interceptor.ConstructorInterceptPoint;
import org.skywalking.apm.agent.core.plugin.interceptor.InstanceMethodsInterceptPoint;
import org.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine;
import java.util.Map;
import static net.bytebuddy.matcher.ElementMatchers.named;
import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
/**
* Created by xin on 2017/1/16.
*/
public class SkyWalkingSpanActivation extends ClassInstanceMethodsEnhancePluginDefine {
@Override
protected String enhanceClassName() {
return "SkyWalkingSpan";
}
@Override
protected ConstructorInterceptPoint[] getConstructorsInterceptPoints() {
return new ConstructorInterceptPoint[] {
new ConstructorInterceptPoint() {
@Override
public ElementMatcher<MethodDescription> getConstructorMatcher() {
return takesArguments(String.class, long.class, Map.class);
}
@Override
public String getConstructorInterceptor() {
return "SpanNewInstanceInterceptor";
}
}
};
}
@Override
protected InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() {
return new InstanceMethodsInterceptPoint[] {
new InstanceMethodsInterceptPoint() {
@Override
public ElementMatcher<MethodDescription> getMethodsMatcher() {
return named("setTag");
}
@Override
public String getMethodsInterceptor() {
return "org.skywalking.apm.toolkit.activation.opentracing.span.interceptor.SpanSetTagInterceptor";
}
},
new InstanceMethodsInterceptPoint() {
@Override
public ElementMatcher<MethodDescription> getMethodsMatcher() {
return named("setOperationName");
}
@Override
public String getMethodsInterceptor() {
return "org.skywalking.apm.toolkit.activation.opentracing.span.interceptor.SpanSetOperationNameInterceptor";
}
},
new InstanceMethodsInterceptPoint() {
@Override
public ElementMatcher<MethodDescription> getMethodsMatcher() {
return named("finish");
}
@Override
public String getMethodsInterceptor() {
return "org.skywalking.apm.toolkit.activation.opentracing.span.interceptor.SpanFinishInterceptor";
}
}
};
}
}
package org.skywalking.apm.toolkit.activation.opentracing.span.interceptor;
import org.skywalking.apm.agent.core.context.ContextManager;
import org.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor;
import org.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult;
import org.skywalking.apm.toolkit.opentracing.SkyWalkingSpan;
/**
* Intercept these following methods:
* {@link SkyWalkingSpan#finish()}
* {@link SkyWalkingSpan#finish(long)}
*/
public class SpanFinishInterceptor implements InstanceMethodsAroundInterceptor {
@Override
public void beforeMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext,
MethodInterceptResult result) {
}
@Override
public Object afterMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext,
Object ret) {
Object[] allArguments = interceptorContext.allArguments();
if (allArguments.length == 1) {
ContextManager.stopSpan((Long) allArguments[0]);
} else {
ContextManager.stopSpan();
}
return ret;
}
@Override
public void handleMethodException(Throwable t, EnhancedClassInstanceContext context,
InstanceMethodInvokeContext interceptorContext) {
}
}
package org.skywalking.apm.toolkit.activation.opentracing.span.interceptor;
import java.util.Map;
import org.skywalking.apm.agent.core.context.ContextManager;
import org.skywalking.apm.agent.core.context.trace.AbstractSpan;
import org.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceConstructorInterceptor;
import org.skywalking.apm.toolkit.opentracing.SkyWalkingSpan;
/**
* Intercept {@link SkyWalkingSpan} constructor.
*/
public class SpanNewInstanceInterceptor implements InstanceConstructorInterceptor {
@Override
public void onConstruct(EnhancedClassInstanceContext context, ConstructorInvokeContext interceptorContext) {
Object[] allArguments = interceptorContext.allArguments();
String operationName = (String) allArguments[0];
long startTime = (Long) allArguments[1];
Map<String, String> tags = (Map<String, String>) allArguments[2];
AbstractSpan span = ContextManager.createSpan(operationName, startTime);
for (Map.Entry<String, String> entry : tags.entrySet()) {
span.setTag(entry.getKey(), entry.getValue());
}
}
}
package org.skywalking.apm.toolkit.activation.opentracing.span.interceptor;
import org.skywalking.apm.agent.core.context.ContextManager;
import org.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor;
import org.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult;
import org.skywalking.apm.toolkit.opentracing.SkyWalkingSpan;
/**
* Intercept {@link SkyWalkingSpan#setOperationName(String)}
*/
public class SpanSetOperationNameInterceptor implements InstanceMethodsAroundInterceptor {
@Override
public void beforeMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext,
MethodInterceptResult result) {
String operationName = (String) interceptorContext.allArguments()[0];
ContextManager.activeSpan().setOperationName(operationName);
}
@Override
public Object afterMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext,
Object ret) {
return ret;
}
@Override
public void handleMethodException(Throwable t, EnhancedClassInstanceContext context,
InstanceMethodInvokeContext interceptorContext) {
}
}
package org.skywalking.apm.toolkit.activation.opentracing.span.interceptor;
import io.opentracing.tag.Tags;
import org.skywalking.apm.agent.core.context.ContextManager;
import org.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor;
import org.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult;
import org.skywalking.apm.toolkit.opentracing.SkyWalkingSpan;
/**
* Intercept these following methods:
* {@link SkyWalkingSpan#setTag(String, boolean)}
* {@link SkyWalkingSpan#setTag(String, Number)}
* {@link SkyWalkingSpan#setTag(String, String)}
*/
public class SpanSetTagInterceptor implements InstanceMethodsAroundInterceptor {
/**
* key of {@link org.skywalking.apm.trace.tag.Tags#PEER_HOST}
*/
private static final String KEY_OF_PEER_HOST_TAG = "peer.host";
@Override
public void beforeMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext,
MethodInterceptResult result) {
String key = adaptTag((String) interceptorContext.allArguments()[0]);
Object value = interceptorContext.allArguments()[1];
if (value instanceof String)
ContextManager.activeSpan().setTag(key, (String) value);
else if (value instanceof Boolean)
ContextManager.activeSpan().setTag(key, (Boolean) value);
else if (value instanceof Integer)
ContextManager.activeSpan().setTag(key, (Integer) value);
else if (value instanceof Short)
ContextManager.activeSpan().setTag(key, ((Short) value).intValue());
else
ContextManager.activeSpan().setTag(key, value.toString());
}
/**
* Adapt {@link Tags} of open tracing.
*
* @return tag key
*/
private String adaptTag(String tagKey) {
String key = tagKey;
if (isPeerTag(key)) {
key = KEY_OF_PEER_HOST_TAG;
}
return key;
}
/**
* Check whether current tag is one of {@link Tags#PEER_HOSTNAME}, {@link Tags#PEER_HOST_IPV4} and {@link Tags#PEER_HOST_IPV6}.
* If yes, will use the {@link org.skywalking.apm.trace.tag.Tags#PEER_HOST} as the key, instead of original key,
* in {@link #adaptTag(String)}.
*
* @param key of current tag
* @return true if this tag is host related.
*/
private boolean isPeerTag(String key) {
return Tags.PEER_HOST_IPV4.equals(key) || Tags.PEER_HOST_IPV6.equals(key) || Tags.PEER_HOSTNAME.equals(key);
}
@Override
public Object afterMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext,
Object ret) {
return ret;
}
@Override
public void handleMethodException(Throwable t, EnhancedClassInstanceContext context,
InstanceMethodInvokeContext interceptorContext) {
}
}
package org.skywalking.apm.toolkit.activation.opentracing.tracer;
import net.bytebuddy.description.method.MethodDescription;
import net.bytebuddy.matcher.ElementMatcher;
import org.skywalking.apm.agent.core.plugin.interceptor.ConstructorInterceptPoint;
import org.skywalking.apm.agent.core.plugin.interceptor.InstanceMethodsInterceptPoint;
import org.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine;
import static net.bytebuddy.matcher.ElementMatchers.named;
/**
* @author wusheng
*/
public class SkyWalkingTracerActivation extends ClassInstanceMethodsEnhancePluginDefine {
@Override
protected String enhanceClassName() {
return "SkyWalkingTracer";
}
@Override
protected ConstructorInterceptPoint[] getConstructorsInterceptPoints() {
return null;
}
@Override
protected InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() {
return new InstanceMethodsInterceptPoint[] {
new InstanceMethodsInterceptPoint() {
@Override
public ElementMatcher<MethodDescription> getMethodsMatcher() {
return named("formatInjectCrossProcessPropagationContextData");
}
@Override
public String getMethodsInterceptor() {
return "TracerInjectFormatCrossProcessContextInterceptor";
}
},
new InstanceMethodsInterceptPoint() {
@Override
public ElementMatcher<MethodDescription> getMethodsMatcher() {
return named("formatExtractCrossProcessPropagationContextData");
}
@Override
public String getMethodsInterceptor() {
return "TracerExtractCrossProcessContextInterceptor";
}
}
};
}
}
package org.skywalking.apm.toolkit.activation.opentracing.tracer.interceptor;
import org.skywalking.apm.agent.core.context.ContextCarrier;
import org.skywalking.apm.agent.core.context.ContextManager;
import org.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor;
import org.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult;
import org.skywalking.apm.toolkit.opentracing.SkyWalkingTracer;
/**
* Intercept {@link SkyWalkingTracer#formatExtractCrossProcessPropagationContextData(String)}
*/
public class TracerExtractCrossProcessContextInterceptor implements InstanceMethodsAroundInterceptor {
@Override
public void beforeMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext,
MethodInterceptResult result) {
}
@Override
public Object afterMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext,
Object ret) {
String contextDataStr = (String) interceptorContext.allArguments()[0];
ContextCarrier carrier = new ContextCarrier();
carrier.deserialize(contextDataStr);
ContextManager.extract(carrier);
return ret;
}
@Override
public void handleMethodException(Throwable t, EnhancedClassInstanceContext context,
InstanceMethodInvokeContext interceptorContext) {
}
}
package org.skywalking.apm.toolkit.activation.opentracing.tracer.interceptor;
import org.skywalking.apm.agent.core.context.ContextCarrier;
import org.skywalking.apm.agent.core.context.ContextManager;
import org.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor;
import org.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult;
import org.skywalking.apm.toolkit.opentracing.SkyWalkingTracer;
/**
* Intercept {@link SkyWalkingTracer#formatInjectCrossProcessPropagationContextData()}
*/
public class TracerInjectFormatCrossProcessContextInterceptor implements InstanceMethodsAroundInterceptor {
@Override
public void beforeMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext,
MethodInterceptResult result) {
}
@Override
public Object afterMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext,
Object ret) {
ContextCarrier carrier = new ContextCarrier();
ContextManager.inject(carrier);
return carrier.serialize();
}
@Override
public void handleMethodException(Throwable t, EnhancedClassInstanceContext context,
InstanceMethodInvokeContext interceptorContext) {
}
}
......@@ -41,6 +41,10 @@ public class TraceContextActivation extends ClassStaticMethodsEnhancePluginDefin
public String getMethodsInterceptor() {
return "org.skywalking.apm.toolkit.activation.trace.TraceContextInterceptor";
}
@Override public boolean isOverrideArgs() {
return false;
}
}
};
}
......
......@@ -6,25 +6,24 @@ import org.skywalking.apm.agent.core.plugin.interceptor.enhance.StaticMethodsAro
import org.skywalking.apm.logging.ILog;
import org.skywalking.apm.logging.LogManager;
/**
* Created by xin on 2016/12/15.
*/
public class TraceContextInterceptor implements StaticMethodsAroundInterceptor {
private ILog logger = LogManager.getLogger(TraceContextInterceptor.class);
@Override
public void beforeMethod(StaticMethodInvokeContext interceptorContext, MethodInterceptResult result) {
@Override public void beforeMethod(Class clazz, String methodName, Object[] allArguments, Class<?>[] parameterTypes,
MethodInterceptResult result) {
}
@Override
public Object afterMethod(StaticMethodInvokeContext interceptorContext, Object ret) {
public Object afterMethod(Class clazz, String methodName, Object[] allArguments, Class<?>[] parameterTypes,
Object ret) {
return ContextManager.getGlobalTraceId();
}
@Override
public void handleMethodException(Throwable t, MethodInvokeContext interceptorContext) {
public void handleMethodException(Class clazz, String methodName, Object[] allArguments, Class<?>[] parameterTypes,
Throwable t) {
logger.error("Failed to get trace Id.", t);
}
}
......@@ -17,7 +17,6 @@
<module>apm-agent-core</module>
<module>apm-sdk-plugin</module>
<module>apm-toolkit-activation</module>
<module>apm-sniffer-mock</module>
</modules>
<properties>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册