diff --git a/skywalking-api/pom.xml b/skywalking-api/pom.xml index c0a71cb9609475f8f6e30325c6ffd2c2f48f6c6c..5cced7e8e82c34d6ce44344c4f7ed89706a47741 100644 --- a/skywalking-api/pom.xml +++ b/skywalking-api/pom.xml @@ -46,9 +46,9 @@ - junit - junit - 4.12 + com.ai.cloud + skywalking-test-api + 1.0-Final test diff --git a/skywalking-api/src/main/java/com/ai/cloud/skywalking/buffer/BufferGroup.java b/skywalking-api/src/main/java/com/ai/cloud/skywalking/buffer/BufferGroup.java index f012b66a9304bfb17eef47f4ccd861dad19402be..0a532149840fd6982be26d3744a0b73c3065101b 100644 --- a/skywalking-api/src/main/java/com/ai/cloud/skywalking/buffer/BufferGroup.java +++ b/skywalking-api/src/main/java/com/ai/cloud/skywalking/buffer/BufferGroup.java @@ -16,6 +16,7 @@ import static com.ai.cloud.skywalking.conf.Config.Consumer.*; public class BufferGroup { private static Logger logger = LogManager.getLogger(BufferGroup.class); private String groupName; + //注意: 修改这个变量名,需要修改test-api工程的Config类中的SPAN_ARRAY_FIELD_NAME变量 private Span[] dataBuffer = new Span[BUFFER_MAX_SIZE]; AtomicRangeInteger index = new AtomicRangeInteger(0, BUFFER_MAX_SIZE); diff --git a/skywalking-api/src/main/java/com/ai/cloud/skywalking/buffer/ContextBuffer.java b/skywalking-api/src/main/java/com/ai/cloud/skywalking/buffer/ContextBuffer.java index a45317af2ac7ecf50f144729735980468a386b71..8409c17ed20ce410453a3fc109c50adbfda0bdca 100644 --- a/skywalking-api/src/main/java/com/ai/cloud/skywalking/buffer/ContextBuffer.java +++ b/skywalking-api/src/main/java/com/ai/cloud/skywalking/buffer/ContextBuffer.java @@ -28,6 +28,7 @@ public class ContextBuffer { static class BufferPool { + // 注意: 这个变量名如果改变需要改变test-api工程中的Config变量 private static BufferGroup[] bufferGroups = new BufferGroup[POOL_SIZE]; static { for (int i = 0; i < POOL_SIZE; i++) { diff --git a/skywalking-api/src/test/java/test/ai/cloud/assertspandata/TraceTreeAssertTest.java b/skywalking-api/src/test/java/test/ai/cloud/assertspandata/TraceTreeAssertTest.java new file mode 100644 index 0000000000000000000000000000000000000000..24d8661c957283f01ca0ce9431077b888754ae9e --- /dev/null +++ b/skywalking-api/src/test/java/test/ai/cloud/assertspandata/TraceTreeAssertTest.java @@ -0,0 +1,25 @@ +package test.ai.cloud.assertspandata; + +import com.ai.cloud.skywalking.buffer.ContextBuffer; +import com.ai.cloud.skywalking.conf.Config; +import com.ai.cloud.skywalking.protocol.Span; +import org.junit.Test; +import test.com.ai.skywalking.test.api.TraceTreeAssert; + +/** + * Created by xin on 16-6-6. + */ +public class TraceTreeAssertTest { + + @Test + public void traceTreeAssertTest() { + Config.Consumer.MAX_CONSUMER = 0; + Span testSpan = new Span("1.0b.1465224457414.7e57f54.22905.61.2691", "", 0, "test-application", "5"); + testSpan.setViewPointId("http://hire.asiainfo.com/Aisse-Mobile-Web/aisseWorkPage/submitReimbursement"); + ContextBuffer.save(testSpan); + TraceTreeAssert.assertEquals(new String[][]{ + {null, "0", "http://hire.asiainfo.com/Aisse-Mobile-Web/aisseWorkPage/submitReimbursement", null} + }); + + } +} diff --git a/skywalking-api/src/test/resources/sky-walking.auth b/skywalking-api/src/test/resources/sky-walking.auth index 5ff5360490afa9027008aa2e6329e9791ed8bf13..5b8bfafcf27fa4b4d617d18751fc37b2aaa85a7d 100644 --- a/skywalking-api/src/test/resources/sky-walking.auth +++ b/skywalking-api/src/test/resources/sky-walking.auth @@ -31,7 +31,7 @@ sender.is_off=false #最大消费线程数 -consumer.max_consumer=2 +consumer.max_consumer=0 #消费者最大等待时间 consumer.max_wait_time=5 #发送失败等待时间 diff --git a/test/skywalking-agent-test/redis-test/pom.xml b/test/skywalking-agent-test/redis-test/pom.xml index d26241bbebb6c78d6d4fd1cdf2fc4e98114afa6a..4c8e3b0c538d4986f4fc6b218d45cef37f5ac943 100644 --- a/test/skywalking-agent-test/redis-test/pom.xml +++ b/test/skywalking-agent-test/redis-test/pom.xml @@ -1,38 +1,43 @@ - - com.ai.cloud - skywalking-agent-test - 1.0-Final - - 4.0.0 + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + + com.ai.cloud + skywalking-agent-test + 1.0-Final + + 4.0.0 - redis-test - jar + redis-test + jar - redis-test - http://maven.apache.org + redis-test + http://maven.apache.org - - UTF-8 - + + UTF-8 + - - - junit - junit - 4.12 - test - - - org.apache.logging.log4j - log4j-core - 2.4.1 - - - redis.clients - jedis - 2.8.1 - - + + + junit + junit + 4.12 + test + + + org.apache.logging.log4j + log4j-core + 2.4.1 + + + com.ai.cloud + skywalking-test-api + 1.0-Final + + + redis.clients + jedis + 2.8.1 + + diff --git a/test/skywalking-agent-test/redis-test/src/main/java/com/ai/cloud/skywalking/agent/test/RedisPluginTest.java b/test/skywalking-agent-test/redis-test/src/main/java/com/ai/cloud/skywalking/agent/test/RedisPluginTest.java index 5f0c9ae3968dcd756a28b08e4335bd146b280968..6d3aea175e6dac31b56a344a835a78ecc1c0f515 100644 --- a/test/skywalking-agent-test/redis-test/src/main/java/com/ai/cloud/skywalking/agent/test/RedisPluginTest.java +++ b/test/skywalking-agent-test/redis-test/src/main/java/com/ai/cloud/skywalking/agent/test/RedisPluginTest.java @@ -1,7 +1,12 @@ package com.ai.cloud.skywalking.agent.test; +import test.com.ai.skywalking.reflect.api.TraceTreeAssert; + public class RedisPluginTest { public static void main(String[] args) { RedisOperator.setData("key1", "value1"); + TraceTreeAssert.assertEquals(new String[][]{ + {null, "0", "127.0.0.1:6379 set", "key=key1"}, + }); } } diff --git a/test/skywalking-agent-test/redis-test/src/main/resources/sky-walking.auth b/test/skywalking-agent-test/redis-test/src/main/resources/sky-walking.auth index 5e4c0b8dc719f8ac63be01991abef515036c317b..dd58a4968de2dd10f11f663948e55862d3dc3e6c 100644 --- a/test/skywalking-agent-test/redis-test/src/main/resources/sky-walking.auth +++ b/test/skywalking-agent-test/redis-test/src/main/resources/sky-walking.auth @@ -4,9 +4,9 @@ buriedpoint.businesskey_max_length=300 sender.retry_get_sender_wait_interval=2000 buffer.pool_size=5 senderchecker.check_polling_time=200 -sender.is_off=true +sender.is_off=false sender.max_send_length=20000 -consumer.max_consumer=2 +consumer.max_consumer=0 consumer.max_wait_time=5 sender.max_copy_num=2 skywalking.application_code=redis-plugin-test diff --git a/test/skywalking-test-api/pom.xml b/test/skywalking-test-api/pom.xml index 012f97b66005e3504a28f25ada297593d27b223e..0e7ccd75d7ad0298e38afda5209763f6b08a1764 100644 --- a/test/skywalking-test-api/pom.xml +++ b/test/skywalking-test-api/pom.xml @@ -22,7 +22,7 @@ com.ai.cloud - skywalking-api + skywalking-protocol ${parent.version} diff --git a/test/skywalking-test-api/src/main/java/test/com/ai/skywalking/api/TraceTreeAssert.java b/test/skywalking-test-api/src/main/java/test/com/ai/skywalking/api/TraceTreeAssert.java deleted file mode 100644 index 969bde189619a4a3a2f8a6dd8bc70ffd153ae773..0000000000000000000000000000000000000000 --- a/test/skywalking-test-api/src/main/java/test/com/ai/skywalking/api/TraceTreeAssert.java +++ /dev/null @@ -1,32 +0,0 @@ -package test.com.ai.skywalking.api; - -import com.ai.cloud.skywalking.protocol.Span; - -import java.util.List; - -public class TraceTreeAssert { - - public static void assertEquals(String[][] assertTraceTree) { - List bufferTraceSpanList = TraceTreeDataAcquirer.acquireCurrentTraceSpanData(); - validateTraceId(bufferTraceSpanList); - validateTraceSpanSize(bufferTraceSpanList.size(), assertTraceTree.length); - validateSpanData(bufferTraceSpanList, assertTraceTree); - } - - private static void validateTraceSpanSize(int actualSpanSize, int expectedSpanSize) { - if (actualSpanSize != expectedSpanSize) { - throw new RuntimeException("expected span size : " + expectedSpanSize + "\n actual span size : " + actualSpanSize); - } - } - - private static void validateSpanData(List traceSpanList, String[][] traceTree) { - - } - - private static void validateTraceId(List traceSpanList) { - String traceId = null; - for (Span span : traceSpanList) { - - } - } -} diff --git a/test/skywalking-test-api/src/main/java/test/com/ai/skywalking/api/TraceTreeDataAcquirer.java b/test/skywalking-test-api/src/main/java/test/com/ai/skywalking/api/TraceTreeDataAcquirer.java deleted file mode 100644 index 99d7b058b16aa028aae89bb7e1570eafa3652427..0000000000000000000000000000000000000000 --- a/test/skywalking-test-api/src/main/java/test/com/ai/skywalking/api/TraceTreeDataAcquirer.java +++ /dev/null @@ -1,12 +0,0 @@ -package test.com.ai.skywalking.api; - -import com.ai.cloud.skywalking.protocol.Span; - -import java.util.List; - -public class TraceTreeDataAcquirer { - public static List acquireCurrentTraceSpanData() { - - return null; - } -} diff --git a/test/skywalking-test-api/src/main/java/test/com/ai/skywalking/test/api/TraceTreeAssert.java b/test/skywalking-test-api/src/main/java/test/com/ai/skywalking/test/api/TraceTreeAssert.java new file mode 100644 index 0000000000000000000000000000000000000000..399d7d85a202ad410326a3aaa9791b54c48ff7de --- /dev/null +++ b/test/skywalking-test-api/src/main/java/test/com/ai/skywalking/test/api/TraceTreeAssert.java @@ -0,0 +1,102 @@ +package test.com.ai.skywalking.test.api; + +import com.ai.cloud.skywalking.protocol.Span; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public class TraceTreeAssert { + + public static void assertEquals(String[][] expectedTraceTree) { + List spanDataInBuffer = TraceTreeDataAcquirer.acquireCurrentTraceSpanData(); + + validateTraceId(spanDataInBuffer); + + Set assertSpanData = distinctAndConvertSpanData(spanDataInBuffer); + Set expectedSpanData = distinctAndConvertSpanData(expectedTraceTree); + + validateTraceSpanSize(expectedSpanData.size(), assertSpanData.size()); + validateSpanData(expectedSpanData, assertSpanData); + } + + private static Set distinctAndConvertSpanData(List assertSpanData) { + Set resultSpanData = new HashSet<>(); + for (Span span : assertSpanData) { + StringBuffer tmpSpanDataStr = new StringBuffer(jointTraceLevelId(span.getParentLevel(), span.getLevelId() + " ")); + tmpSpanDataStr.append(span.getViewPointId().trim() + " ") + .append(span.getBusinessKey().trim() + " "); + + resultSpanData.add(tmpSpanDataStr.toString()); + } + return resultSpanData; + } + + private static String jointTraceLevelId(String parentLevelId, String levelId) { + String traceLevelId = ""; + if (parentLevelId != null && parentLevelId.length() > 0) { + traceLevelId = parentLevelId + "."; + } + traceLevelId += levelId; + return traceLevelId; + } + + private static Set distinctAndConvertSpanData(String[][] assertTraceTree) { + Set resultSpanData = new HashSet(); + for (String[] spanDataArray : assertTraceTree) { + if (spanDataArray.length != 4) { + throw new IllegalArgumentException("assert trace tree is illegal, " + + "Format :\tParentLevelId\t|\tlevelId\t|\tviewPoint\t|\tbusinesskey"); + } + + StringBuffer tmpSpanDataStr = new StringBuffer(jointTraceLevelId(spanDataArray[0], spanDataArray[1]) + " "); + tmpSpanDataStr.append(spanDataArray[2] == null ? " " : spanDataArray[2].trim() + " ") + .append(spanDataArray[3] == null ? " " : spanDataArray[3].trim() + " "); + + resultSpanData.add(tmpSpanDataStr.toString()); + } + + return resultSpanData; + } + + + private static void validateTraceSpanSize(int actualSpanSize, int expectedSpanSize) { + if (actualSpanSize != expectedSpanSize) { + throw new RuntimeException("expected span size : " + expectedSpanSize + + "\n actual span size : " + actualSpanSize); + } + } + + private static void validateSpanData(Set expectedSpanData, Set assertTraceTree) { + for (String assertSpanDataStr : assertTraceTree) { + if (expectedSpanData.contains(assertSpanDataStr)) { + expectedSpanData.remove(assertSpanDataStr); + } + } + + if (expectedSpanData.size() != 0) { + StringBuffer stringBuffer = new StringBuffer(); + for (String expectedSpan : expectedSpanData) { + stringBuffer.append(expectedSpan + "\n"); + } + + throw new RuntimeException("actual trace tree is not contain those span as follow:\n" + stringBuffer); + } + + } + + private static void validateTraceId(List traceSpanList) { + String traceId = null; + for (Span span : traceSpanList) { + if (traceId == null) { + traceId = span.getTraceId(); + } + + if (!traceId.equals(span.getTraceId())) { + throw new RuntimeException("trace id is not all the same.trace id :" + + traceId + ",Error trace id :" + span.getTraceId()); + } + + } + } +} diff --git a/test/skywalking-test-api/src/main/java/test/com/ai/skywalking/test/api/TraceTreeDataAcquirer.java b/test/skywalking-test-api/src/main/java/test/com/ai/skywalking/test/api/TraceTreeDataAcquirer.java new file mode 100644 index 0000000000000000000000000000000000000000..f1d33b94c51ba80932c36ff07c9f870e54ce7ed7 --- /dev/null +++ b/test/skywalking-test-api/src/main/java/test/com/ai/skywalking/test/api/TraceTreeDataAcquirer.java @@ -0,0 +1,60 @@ +package test.com.ai.skywalking.test.api; + +import com.ai.cloud.skywalking.protocol.Span; +import test.com.ai.skywalking.test.api.config.Config; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; + +public class TraceTreeDataAcquirer { + public static List acquireCurrentTraceSpanData() { + List resultSpan = new ArrayList(); + Object[] bufferGroupObjectArray = acquireBufferGroupObjectArrayByClassLoader(); + + for (Object bufferGroup : bufferGroupObjectArray) { + Span[] spanList = acquireSpanData(bufferGroup); + for (Span span : spanList) { + if (span != null) { + resultSpan.add(span); + } + } + } + + return resultSpan; + } + + private static Span[] acquireSpanData(Object bufferGroup) { + try { + Class bufferGroupClass = Thread.currentThread().getContextClassLoader() + .loadClass(Config.BUFFER_GROUP_CLASS_NAME); + Field spanArrayField = bufferGroupClass.getDeclaredField(Config.SPAN_ARRAY_FIELD_NAME); + spanArrayField.setAccessible(true); + return (Span[]) spanArrayField.get(bufferGroup); + } catch (Exception e) { + throw new RuntimeException("Failed to acquire span array",e); + } + } + + + private static Object[] acquireBufferGroupObjectArrayByClassLoader() { + try { + Class bufferPoolClass = fetchBufferPoolClass(); + Field field = fetchBufferPoolObject(bufferPoolClass); + return (Object[]) field.get(bufferPoolClass); + } catch (Exception e) { + throw new RuntimeException("Failed to acquire buffer group object array",e); + } + } + + private static Field fetchBufferPoolObject(Class bufferPoolClass) throws NoSuchFieldException { + Field field = bufferPoolClass.getDeclaredField(Config.BUFFER_GROUP_FIELD_NAME); + field.setAccessible(true); + return field; + } + + private static Class fetchBufferPoolClass() throws ClassNotFoundException { + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + return classLoader.loadClass(Config.BUFFER_POOL_CLASS_NAME); + } +} diff --git a/test/skywalking-test-api/src/main/java/test/com/ai/skywalking/test/api/config/Config.java b/test/skywalking-test-api/src/main/java/test/com/ai/skywalking/test/api/config/Config.java new file mode 100644 index 0000000000000000000000000000000000000000..eb4e98ab3eb08235fc7f0a74b11f121a2b9e9f42 --- /dev/null +++ b/test/skywalking-test-api/src/main/java/test/com/ai/skywalking/test/api/config/Config.java @@ -0,0 +1,12 @@ +package test.com.ai.skywalking.test.api.config; + +public class Config { + + public static String BUFFER_POOL_CLASS_NAME = "com.ai.cloud.skywalking.buffer.ContextBuffer$BufferPool"; + + public static String BUFFER_GROUP_FIELD_NAME = "bufferGroups"; + + public static String BUFFER_GROUP_CLASS_NAME = "com.ai.cloud.skywalking.buffer.BufferGroup"; + + public static String SPAN_ARRAY_FIELD_NAME = "dataBuffer"; +} diff --git a/test/skywalking-test-api/src/test/java/test/com/ai/skywalking/reflect/SubClassReflect.java b/test/skywalking-test-api/src/test/java/test/com/ai/skywalking/reflect/SubClassReflect.java new file mode 100644 index 0000000000000000000000000000000000000000..c1bfd7ca1cba278aab84dc18c37736d23924fb7f --- /dev/null +++ b/test/skywalking-test-api/src/test/java/test/com/ai/skywalking/reflect/SubClassReflect.java @@ -0,0 +1,25 @@ +package test.com.ai.skywalking.reflect; + +import org.junit.Test; + +import java.lang.reflect.Field; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +/** + * Created by xin on 16-6-6. + */ +public class SubClassReflect { + + @Test + public void fetchSubClassField() throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException { + ClassLoader loader = Thread.currentThread().getContextClassLoader(); + Class testSubClass = loader.loadClass("test.com.ai.skywalking.reflect.TestClass$TestSubClass"); + Field field = testSubClass.getDeclaredField("testStringArray"); + assertNotNull(field); + field.setAccessible(true); + Object[] objects = (Object[]) field.get(testSubClass); + assertEquals(5, objects.length); + } +} diff --git a/test/skywalking-test-api/src/test/java/test/com/ai/skywalking/reflect/TestClass.java b/test/skywalking-test-api/src/test/java/test/com/ai/skywalking/reflect/TestClass.java new file mode 100644 index 0000000000000000000000000000000000000000..2f3a73f6057d327c404ca40367d53ddcf7949916 --- /dev/null +++ b/test/skywalking-test-api/src/test/java/test/com/ai/skywalking/reflect/TestClass.java @@ -0,0 +1,10 @@ +package test.com.ai.skywalking.reflect; + +public class TestClass { + + private static TestSubClass testSubClass = new TestSubClass(); + + static class TestSubClass { + private static String[] testStringArray = new String[5]; + } +}