Skip to content

Commit 31c13f5

Browse files
committed
Merge branch 'main' into dev-main-mqtt
# Conflicts: # arex-instrumentation-foundation/src/main/java/io/arex/foundation/serializer/JacksonSerializer.java # arex-instrumentation/servlet/arex-httpservlet/src/main/java/io/arex/inst/httpservlet/ServletExtractor.java
2 parents 0a75e44 + 369f97f commit 31c13f5

File tree

145 files changed

+3174
-893
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

145 files changed

+3174
-893
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ yarn-error.log*
2727

2828
temp
2929

30+
.flattened-pom.xml
3031
dependency-reduced-pom.xml
3132
*.versionsBackup
3233
MANIFEST.MF

arex-agent-bootstrap/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<parent>
66
<groupId>io.arex</groupId>
77
<artifactId>arex-agent-parent</artifactId>
8-
<version>0.2.0</version>
8+
<version>${revision}</version>
99
</parent>
1010
<modelVersion>4.0.0</modelVersion>
1111

arex-agent-bootstrap/src/main/java/io/arex/agent/bootstrap/AgentClassLoader.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ private URL getJarEntryUrl(JarEntryInfo jarInfo) {
185185
if (jarInfo != null && jarInfo.getJarEntry() != null) {
186186
try {
187187
return new URL(
188-
"jar:file:" + jarInfo.getJarInfo().sourceFile.getAbsolutePath() + "!/" + jarInfo.getJarEntry()
188+
"jar:" + jarInfo.getJarInfo().getSourceFile().toURI().toURL() + "!/" + jarInfo.getJarEntry()
189189
.getName());
190190
} catch (MalformedURLException e) {
191191
throw new IllegalStateException(jarInfo.getJarEntry().getName(), e);

arex-agent-bootstrap/src/main/java/io/arex/agent/bootstrap/AgentInitializer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public static void initialize(Instrumentation inst, File agentFile, String agent
1515
return;
1616
}
1717

18-
System.setProperty("arex-agent-jar-file-path", agentFile.getAbsolutePath());
18+
System.setProperty("arex.agent.jar.file.path", agentFile.getAbsolutePath());
1919
File[] extensionFiles = getExtensionJarFiles(agentFile);
2020
classLoader = createAgentClassLoader(agentFile, extensionFiles);
2121
InstrumentationHolder.setAgentClassLoader(classLoader);

arex-agent-bootstrap/src/main/java/io/arex/agent/bootstrap/ctx/ArexThreadLocal.java

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
* 3. transmittable-thread-local not work in nio.reactor.Worker(@see AbstractMultiworkerIOReactor)
1313
* 4. Change from InheritableThreadLocal to ThreadLocal,avoid collect unexpected data
1414
*/
15-
public class ArexThreadLocal<T> extends InheritableThreadLocal<T> {
15+
public class ArexThreadLocal<T> extends ThreadLocal<T> {
1616

1717
public ArexThreadLocal() {
1818
}
@@ -75,28 +75,34 @@ private void removeThisFromHolder() {
7575
public static class Transmitter {
7676

7777
public static Object capture() {
78-
return new Snapshot(captureValues());
78+
HashMap<ArexThreadLocal<Object>, Object> values = captureValues();
79+
return values == null ? null : new Snapshot(captureValues());
7980
}
8081

8182
private static HashMap<ArexThreadLocal<Object>, Object> captureValues() {
82-
HashMap<ArexThreadLocal<Object>, Object> values = new HashMap<>();
83+
HashMap<ArexThreadLocal<Object>, Object> values = null;
8384
for (ArexThreadLocal<Object> threadLocal : holder.get().keySet()) {
85+
if (null == values) {
86+
values = new HashMap<>();
87+
}
8488
values.put(threadLocal, threadLocal.copyValue());
8589
}
8690
return values;
8791
}
8892

8993
public static Object replay(Object captured) {
94+
if (captured == null) {
95+
return null;
96+
}
97+
9098
final Snapshot capturedSnapshot = (Snapshot) captured;
9199
return new Snapshot(replayValues(capturedSnapshot.values));
92100
}
93101

94102
private static HashMap<ArexThreadLocal<Object>, Object> replayValues(HashMap<ArexThreadLocal<Object>, Object> captured) {
95103
HashMap<ArexThreadLocal<Object>, Object> backup = new HashMap<>();
96-
97104
for (final Iterator<ArexThreadLocal<Object>> iterator = holder.get().keySet().iterator(); iterator.hasNext(); ) {
98105
ArexThreadLocal<Object> threadLocal = iterator.next();
99-
100106
backup.put(threadLocal, threadLocal.get());
101107
if (!captured.containsKey(threadLocal)) {
102108
iterator.remove();
@@ -109,14 +115,17 @@ private static HashMap<ArexThreadLocal<Object>, Object> replayValues(HashMap<Are
109115
}
110116

111117
public static void restore(Object backup) {
118+
if (backup == null) {
119+
return;
120+
}
121+
112122
final Snapshot backupSnapshot = (Snapshot) backup;
113123
restoreValues(backupSnapshot.values);
114124
}
115125

116126
private static void restoreValues(HashMap<ArexThreadLocal<Object>, Object> backup) {
117127
for (final Iterator<ArexThreadLocal<Object>> iterator = holder.get().keySet().iterator(); iterator.hasNext(); ) {
118128
ArexThreadLocal<Object> threadLocal = iterator.next();
119-
120129
if (!backup.containsKey(threadLocal)) {
121130
iterator.remove();
122131
threadLocal.superRemove();

arex-agent-bootstrap/src/main/java/io/arex/agent/bootstrap/ctx/CallableWrapper.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import io.arex.agent.bootstrap.TraceContextManager;
44

55
import java.util.concurrent.Callable;
6+
import java.util.concurrent.ForkJoinTask;
67

78

89
public class CallableWrapper<V> implements Callable<V> {
@@ -47,8 +48,8 @@ public static <T> Callable<T> get(Callable<T> callable) {
4748
return callable;
4849
}
4950

50-
if (callable instanceof CallableWrapper) {
51-
return (CallableWrapper<T>) callable;
51+
if (callable instanceof CallableWrapper || callable instanceof ForkJoinTask) {
52+
return callable;
5253
}
5354
return new CallableWrapper<T>(callable);
5455
}

arex-agent-bootstrap/src/main/java/io/arex/agent/bootstrap/ctx/RunnableWrapper.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import io.arex.agent.bootstrap.TraceContextManager;
44

5+
import java.util.concurrent.ForkJoinTask;
6+
57

68
public class RunnableWrapper implements Runnable {
79
private final Runnable runnable;
@@ -43,7 +45,7 @@ public static Runnable get(Runnable runnable) {
4345
return runnable;
4446
}
4547

46-
if (runnable instanceof RunnableWrapper) {
48+
if (runnable instanceof RunnableWrapper || runnable instanceof ForkJoinTask) {
4749
return runnable;
4850
}
4951
return new RunnableWrapper(runnable);

arex-agent-bootstrap/src/main/java/io/arex/agent/bootstrap/ctx/TraceTransmitter.java

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,12 @@ public class TraceTransmitter implements AutoCloseable {
88
private AtomicReference<Object> backupRef;
99

1010
private TraceTransmitter() {
11-
this.captureRef = new AtomicReference<>(ArexThreadLocal.Transmitter.capture());
11+
this.captureRef = null;
12+
this.backupRef = null;
13+
}
14+
15+
private TraceTransmitter(Object capture) {
16+
this.captureRef = new AtomicReference<>(capture);
1217
this.backupRef = new AtomicReference<>();
1318
}
1419

@@ -29,6 +34,23 @@ public void close() {
2934
}
3035

3136
public static TraceTransmitter create() {
32-
return new TraceTransmitter();
37+
Object capture = ArexThreadLocal.Transmitter.capture();
38+
if (capture == null) {
39+
return DoNothingTransmitter.INSTANCE;
40+
}
41+
return new TraceTransmitter(capture);
42+
}
43+
44+
static class DoNothingTransmitter extends TraceTransmitter {
45+
static final TraceTransmitter INSTANCE = new DoNothingTransmitter();
46+
47+
@Override
48+
public TraceTransmitter transmit() {
49+
return this;
50+
}
51+
52+
@Override
53+
public void close() {
54+
}
3355
}
3456
}

arex-agent-bootstrap/src/main/java/io/arex/agent/bootstrap/model/Mocker.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.arex.agent.bootstrap.model;
22

3+
import io.arex.agent.bootstrap.util.StringUtil;
34
import java.io.Serializable;
45
import java.util.HashMap;
56
import java.util.Map;
@@ -90,4 +91,21 @@ public void setType(String type) {
9091
this.type = type;
9192
}
9293
}
94+
95+
default StringBuilder logBuilder() {
96+
StringBuilder builder = new StringBuilder("[arex]");
97+
boolean isReplay = StringUtil.isNotEmpty(getReplayId());
98+
if (isReplay) {
99+
builder.append("replay");
100+
} else {
101+
builder.append("record");
102+
}
103+
builder.append(" category: ").append(getCategoryType().getName());
104+
builder.append(", operation: ").append(getOperationName());
105+
builder.append(", recordId: ").append(getRecordId());
106+
if (isReplay) {
107+
builder.append(", replayId: ").append(getReplayId());
108+
}
109+
return builder;
110+
}
93111
}

arex-agent-bootstrap/src/main/java/io/arex/agent/bootstrap/util/StringUtil.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public static String join(final Iterable<?> iterable, final String separator) {
4343
Iterator<?> iterator = iterable.iterator();
4444

4545
if (!iterator.hasNext()) {
46-
return null;
46+
return EMPTY;
4747
}
4848

4949
final Object first = iterator.next();
@@ -182,6 +182,17 @@ public static String[] splitByWholeSeparator(String str, String separator) {
182182
}
183183
}
184184

185+
public static String[] splitByFirstSeparator(String str, char separator) {
186+
if (str == null) {
187+
return new String[0];
188+
}
189+
int index = str.indexOf(separator);
190+
if (index == -1) {
191+
return new String[]{str};
192+
}
193+
return new String[]{str.substring(0, index), str.substring(index + 1)};
194+
}
195+
185196
public static int encodeAndHash(String str){
186197
if (isBlank(str)) {
187198
return 0;
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package io.arex.agent.bootstrap.ctx;
2+
3+
import org.junit.jupiter.api.AfterAll;
4+
import org.junit.jupiter.api.BeforeAll;
5+
import org.junit.jupiter.api.Test;
6+
7+
import java.util.HashMap;
8+
9+
import static org.junit.jupiter.api.Assertions.*;
10+
11+
class ArexThreadLocalTest {
12+
13+
static ArexThreadLocal<String> target = null;
14+
15+
static HashMap<ArexThreadLocal<Object>, Object> snapshotMap = null;
16+
17+
@BeforeAll
18+
static void setUp() {
19+
target = new ArexThreadLocal<>();
20+
snapshotMap = new HashMap<>();
21+
}
22+
23+
@AfterAll
24+
static void tearDown() {
25+
target = null;
26+
snapshotMap = null;
27+
}
28+
29+
@Test
30+
void capture() {
31+
target.set("mock");
32+
assertNotNull(ArexThreadLocal.Transmitter.capture());
33+
}
34+
35+
@Test
36+
void replay() {
37+
assertNull(ArexThreadLocal.Transmitter.replay(null));
38+
assertNotNull(ArexThreadLocal.Transmitter.replay(new ArexThreadLocal.Transmitter.Snapshot(snapshotMap)));
39+
}
40+
41+
@Test
42+
void restore() {
43+
assertDoesNotThrow(() -> ArexThreadLocal.Transmitter.restore(null));
44+
assertDoesNotThrow(() -> ArexThreadLocal.Transmitter.restore(
45+
new ArexThreadLocal.Transmitter.Snapshot(snapshotMap)));
46+
}
47+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package io.arex.agent.bootstrap.ctx;
2+
3+
import io.arex.agent.bootstrap.TraceContextManager;
4+
import org.junit.jupiter.api.Test;
5+
6+
import java.util.concurrent.Callable;
7+
import java.util.concurrent.ForkJoinTask;
8+
import java.util.concurrent.RunnableFuture;
9+
10+
import static org.junit.jupiter.api.Assertions.*;
11+
12+
class CallableWrapperTest {
13+
14+
@Test
15+
void get() {
16+
assertNull(CallableWrapper.get(null));
17+
TraceContextManager.set("mock");
18+
assertNotNull(CallableWrapper.get(new CallableTest<>()));
19+
assertNotNull(CallableWrapper.get(() -> "mock"));
20+
TraceContextManager.remove();
21+
}
22+
23+
static class CallableTest<T> extends ForkJoinTask<T> implements Callable<T> {
24+
public final T getRawResult() { return null; }
25+
public final void setRawResult(T v) {}
26+
public final boolean exec() { return true; }
27+
public final T call() { return null; }
28+
}
29+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package io.arex.agent.bootstrap.ctx;
2+
3+
import io.arex.agent.bootstrap.TraceContextManager;
4+
import org.junit.jupiter.api.Test;
5+
6+
import java.util.concurrent.ForkJoinTask;
7+
import java.util.concurrent.RunnableFuture;
8+
9+
import static org.junit.jupiter.api.Assertions.*;
10+
11+
class RunnableWrapperTest {
12+
13+
@Test
14+
void get() {
15+
assertNull(RunnableWrapper.get(null));
16+
TraceContextManager.set("mock");
17+
assertNotNull(RunnableWrapper.get(new RunnableTest<>()));
18+
assertNotNull(RunnableWrapper.get(() -> {}));
19+
TraceContextManager.remove();
20+
}
21+
22+
static class RunnableTest<T> extends ForkJoinTask<T> implements RunnableFuture<T> {
23+
public final T getRawResult() { return null; }
24+
public final void setRawResult(T v) {}
25+
public final boolean exec() { return true; }
26+
public final void run() {}
27+
}
28+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package io.arex.agent.bootstrap.ctx;
2+
3+
import org.junit.jupiter.api.Test;
4+
import org.mockito.Mockito;
5+
6+
import static org.junit.jupiter.api.Assertions.*;
7+
8+
class TraceTransmitterTest {
9+
10+
@Test
11+
void create() {
12+
assertNotNull(TraceTransmitter.create());
13+
Mockito.mockStatic(ArexThreadLocal.Transmitter.class);
14+
Mockito.when(ArexThreadLocal.Transmitter.capture()).thenReturn("mock");
15+
TraceTransmitter transmitter = TraceTransmitter.create();
16+
assertNotNull(transmitter);
17+
transmitter.transmit();
18+
transmitter.close();
19+
}
20+
21+
@Test
22+
void doNothingTransmit() {
23+
TraceTransmitter.DoNothingTransmitter.INSTANCE.transmit();
24+
}
25+
26+
@Test
27+
void doNothingClose() {
28+
TraceTransmitter.DoNothingTransmitter.INSTANCE.close();
29+
}
30+
}

0 commit comments

Comments
 (0)