Skip to content

Commit 78defd7

Browse files
authored
feat: remove the trace of case on service exit (#232)
1 parent f4d7316 commit 78defd7

11 files changed

Lines changed: 78 additions & 10 deletions

File tree

arex-instrumentation-api/src/main/java/io/arex/inst/runtime/listener/CaseEvent.java

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,22 @@
33
import java.util.EventObject;
44

55
public class CaseEvent extends EventObject {
6-
public enum Action { ENTER, CREATE, DESTROY }
7-
CaseEvent.Action action;
6+
public enum Action {
7+
/*
8+
* Mainly used to clean up the previous case on service entrance
9+
*/
10+
ENTER,
11+
/*
12+
* Mainly used to create a new trace for the current case
13+
*/
14+
CREATE,
15+
/*
16+
* Mainly used to clean up the trace of the current case on service exit
17+
*/
18+
EXIT
19+
}
20+
21+
private final CaseEvent.Action action;
822

923
private CaseEvent(EventSource source, CaseEvent.Action action) {
1024
super(source);
@@ -19,7 +33,11 @@ public static CaseEvent ofCreateEvent(EventSource source) {
1933
return new CaseEvent(source, Action.CREATE);
2034
}
2135

22-
public static CaseEvent ofDestroyEvent() {
23-
return new CaseEvent(EventSource.empty(), CaseEvent.Action.DESTROY);
36+
public static CaseEvent ofExitEvent() {
37+
return new CaseEvent(EventSource.empty(), CaseEvent.Action.EXIT);
38+
}
39+
40+
public CaseEvent.Action getAction() {
41+
return action;
2442
}
2543
}

arex-instrumentation-api/src/main/java/io/arex/inst/runtime/listener/CaseEventDispatcher.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@
22

33
public class CaseEventDispatcher {
44

5-
public static void onEvent(CaseEvent e) {
6-
switch (e.action) {
5+
public static void onEvent(CaseEvent event) {
6+
switch (event.getAction()) {
77
case ENTER:
88
EventProcessor.onRequest();
99
break;
1010
case CREATE:
11-
EventProcessor.onCreate((EventSource) e.getSource());
11+
EventProcessor.onCreate((EventSource) event.getSource());
1212
break;
13-
case DESTROY:
13+
case EXIT:
1414
EventProcessor.onExit();
1515
break;
1616
default:

arex-instrumentation-api/src/main/java/io/arex/inst/runtime/listener/EventProcessor.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,8 @@ private static void initClock(){
8888
}
8989

9090
public static void onExit(){
91+
TimeCache.remove();
92+
ContextManager.remove();
9193
}
9294

9395
/**
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package io.arex.inst.runtime.listener;
2+
3+
import static org.mockito.Mockito.times;
4+
import org.junit.jupiter.api.AfterEach;
5+
import org.junit.jupiter.api.BeforeEach;
6+
import org.junit.jupiter.api.Test;
7+
import org.mockito.MockedStatic;
8+
import org.mockito.Mockito;
9+
10+
class CaseEventDispatcherTest {
11+
12+
@BeforeEach
13+
void setUp() {
14+
}
15+
16+
@AfterEach
17+
void tearDown() {
18+
}
19+
20+
@Test
21+
void onEvent() {
22+
try (MockedStatic<EventProcessor> mockedStatic = Mockito.mockStatic(EventProcessor.class)) {
23+
// test enter event
24+
CaseEventDispatcher.onEvent(CaseEvent.ofEnterEvent());
25+
mockedStatic.verify(EventProcessor::onRequest, times(1));
26+
27+
// test create event
28+
CaseEventDispatcher.onEvent(CaseEvent.ofCreateEvent(EventSource.empty()));
29+
mockedStatic.verify(() -> EventProcessor.onCreate(EventSource.empty()), times(1));
30+
31+
// test exit event
32+
CaseEventDispatcher.onEvent(CaseEvent.ofExitEvent());
33+
mockedStatic.verify(EventProcessor::onExit, times(1));
34+
}
35+
}
36+
}

arex-instrumentation-api/src/test/java/io/arex/inst/runtime/listener/EventProcessorTest.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,11 @@ void testInit() {
9292
Assertions.assertNotNull(Serializer.getINSTANCE());
9393
}
9494

95+
@Test
96+
void onExit() {
97+
Assertions.assertDoesNotThrow(EventProcessor::onExit);
98+
}
99+
95100
public static class TestStringSerializable implements StringSerializable {
96101

97102
@Override
@@ -152,4 +157,4 @@ public StringSerializable reCreateSerializer() {
152157
return null;
153158
}
154159
}
155-
}
160+
}

arex-instrumentation/dubbo/arex-dubbo-alibaba/src/main/java/io/arex/inst/dubbo/alibaba/DubboProviderExtractor.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ public static void onServiceExit(Invoker<?> invoker, Invocation invocation, Resu
3636
RequestHandlerManager.postHandle(invocation.getAttachments(), result != null ? result.getAttachments() : null,
3737
MockCategoryType.DUBBO_PROVIDER.getName());
3838
adapter.execute(result, makeMocker(adapter));
39+
CaseEventDispatcher.onEvent(CaseEvent.ofExitEvent());
3940
}
4041
private static Mocker makeMocker(DubboAdapter adapter) {
4142
Mocker mocker = MockUtils.createDubboProvider(adapter.getServiceOperation());

arex-instrumentation/dubbo/arex-dubbo-apache-v2/src/main/java/io/arex/inst/dubbo/apache/v2/DubboProviderExtractor.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ public static void onServiceExit(Invoker<?> invoker, Invocation invocation, Resu
3939
RequestHandlerManager.postHandle(invocation.getAttachments(), RpcContext.getServerContext().getAttachments(),
4040
MockCategoryType.DUBBO_PROVIDER.getName());
4141
adapter.execute(result, makeMocker(adapter));
42+
CaseEventDispatcher.onEvent(CaseEvent.ofExitEvent());
4243
}
4344
private static Mocker makeMocker(DubboAdapter adapter) {
4445
Mocker mocker = MockUtils.createDubboProvider(adapter.getServiceOperation());

arex-instrumentation/dubbo/arex-dubbo-apache-v3/src/main/java/io/arex/inst/dubbo/apache/v3/DubboProviderExtractor.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ public static void onServiceExit(Invoker<?> invoker, Invocation invocation, Resu
3636
RequestHandlerManager.postHandle(invocation.getAttachments(), RpcContext.getServerAttachment().getAttachments(),
3737
MockCategoryType.DUBBO_PROVIDER.getName());
3838
adapter.execute(result, makeMocker(adapter));
39+
CaseEventDispatcher.onEvent(CaseEvent.ofExitEvent());
3940
}
4041
private static Mocker makeMocker(DubboAdapter adapter) {
4142
Mocker mocker = MockUtils.createDubboProvider(adapter.getServiceOperation());

arex-instrumentation/netty/arex-netty-v4/src/main/java/io/arex/inst/netty/v4/server/RequestTracingHandler.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ public class RequestTracingHandler extends ChannelInboundHandlerAdapter {
2525
public void channelRead(ChannelHandlerContext ctx, Object msg) {
2626
EventProcessor.onRequest();
2727
if (msg instanceof HttpRequest) {
28+
CaseEventDispatcher.onEvent(CaseEvent.ofEnterEvent());
2829
HttpRequest request = (HttpRequest) msg;
2930
String caseId = request.headers().get(ArexConstants.RECORD_ID);
3031
if (shouldSkip(request, caseId)) {

arex-instrumentation/netty/arex-netty-v4/src/main/java/io/arex/inst/netty/v4/server/ResponseTracingHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,6 @@ private void invoke(final Channel channel, final String content) {
8686
MockUtils.recordMocker(mocker);
8787
}
8888

89-
CaseEventDispatcher.onEvent(CaseEvent.ofEnterEvent());
89+
CaseEventDispatcher.onEvent(CaseEvent.ofExitEvent());
9090
}
9191
}

0 commit comments

Comments
 (0)