Skip to content

Commit 274f9a5

Browse files
authored
fix: failed to record while result type is mono (#343)
1 parent 2658733 commit 274f9a5

File tree

3 files changed

+38
-24
lines changed

3 files changed

+38
-24
lines changed

arex-instrumentation/dynamic/arex-dynamic-common/src/main/java/io/arex/inst/dynamic/common/DynamicClassExtractor.java

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import io.arex.agent.bootstrap.util.StringUtil;
1010
import io.arex.agent.thirdparty.util.time.DateFormatUtils;
1111
import io.arex.inst.dynamic.common.listener.ListenableFutureAdapter;
12+
import io.arex.inst.dynamic.common.listener.MonoConsumer;
1213
import io.arex.inst.dynamic.common.listener.ResponseConsumer;
1314
import io.arex.inst.runtime.config.Config;
1415
import io.arex.inst.runtime.context.ArexContext;
@@ -93,7 +94,7 @@ public Object recordResponse(Object response) {
9394
}
9495
// Compatible with not import package reactor-core
9596
if (MONO.equals(methodReturnType) && response instanceof Mono<?>) {
96-
return this.resetMonoResponse((Mono<?>) response);
97+
return new MonoConsumer(this).accept((Mono<?>) response);
9798
}
9899
this.result = response;
99100
if (needRecord()) {
@@ -155,12 +156,6 @@ void setFutureResponse(Future<?> result) {
155156
}
156157
}
157158

158-
public Mono<?> resetMonoResponse(Mono<?> result) {
159-
return result
160-
.doOnError(this::recordResponse)
161-
.doOnSuccess((Consumer<Object>) this::recordResponse);
162-
}
163-
164159
String buildResultClazz(String resultClazz) {
165160
if (StringUtil.isEmpty(resultClazz) || resultClazz.contains(TypeUtil.HORIZONTAL_LINE_STR)) {
166161
return resultClazz;
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package io.arex.inst.dynamic.common.listener;
2+
3+
import io.arex.agent.bootstrap.ctx.TraceTransmitter;
4+
import io.arex.inst.dynamic.common.DynamicClassExtractor;
5+
import reactor.core.publisher.Mono;
6+
7+
public class MonoConsumer {
8+
9+
private final TraceTransmitter traceTransmitter;
10+
private final DynamicClassExtractor extractor;
11+
12+
public MonoConsumer(DynamicClassExtractor extractor) {
13+
this.traceTransmitter = TraceTransmitter.create();
14+
this.extractor = extractor;
15+
}
16+
17+
public Mono<?> accept(Mono<?> responseMono) {
18+
return responseMono
19+
.doOnSuccess(o -> {
20+
try (TraceTransmitter tm = traceTransmitter.transmit()) {
21+
extractor.recordResponse(o);
22+
}
23+
})
24+
.doOnError(o -> {
25+
try (TraceTransmitter tm = traceTransmitter.transmit()) {
26+
extractor.recordResponse(o);
27+
}
28+
});
29+
}
30+
}

arex-instrumentation/dynamic/arex-dynamic-common/src/test/java/io/arex/inst/dynamic/common/DynamicClassExtractorTest.java

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import io.arex.agent.bootstrap.model.ArexMocker;
66
import io.arex.agent.bootstrap.model.Mocker.Target;
77
import io.arex.agent.thirdparty.util.time.DateFormatUtils;
8+
import io.arex.inst.dynamic.common.listener.MonoConsumer;
89
import io.arex.inst.runtime.config.ConfigBuilder;
910
import io.arex.inst.runtime.context.ArexContext;
1011
import io.arex.inst.runtime.context.ContextManager;
@@ -16,25 +17,15 @@
1617
import io.arex.inst.runtime.util.MockUtils;
1718
import java.lang.reflect.Field;
1819
import java.lang.reflect.Method;
19-
import java.sql.Timestamp;
20-
import java.text.SimpleDateFormat;
21-
import java.time.LocalDate;
2220
import java.time.LocalDateTime;
2321
import java.time.LocalTime;
24-
import java.time.format.DateTimeFormatter;
25-
import java.time.temporal.TemporalAccessor;
2622
import java.util.Calendar;
2723
import java.util.Date;
28-
import java.util.GregorianCalendar;
2924
import java.util.HashSet;
30-
import java.util.Locale;
3125
import java.util.Set;
3226
import java.util.TimeZone;
3327
import java.util.concurrent.CompletableFuture;
3428
import java.util.concurrent.ExecutionException;
35-
import java.util.function.Consumer;
36-
37-
import org.joda.time.format.DateTimeFormat;
3829
import org.junit.jupiter.api.AfterAll;
3930
import org.junit.jupiter.api.BeforeAll;
4031
import org.junit.jupiter.api.Test;
@@ -55,8 +46,6 @@
5546
import org.mockito.stubbing.Answer;
5647
import reactor.core.publisher.Mono;
5748

58-
import javax.xml.datatype.XMLGregorianCalendar;
59-
6049
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
6150
import static org.junit.jupiter.api.Assertions.assertEquals;
6251
import static org.junit.jupiter.api.Assertions.assertNull;
@@ -66,7 +55,6 @@
6655
import static org.mockito.ArgumentMatchers.any;
6756
import static org.mockito.ArgumentMatchers.anyString;
6857
import static org.mockito.Mockito.mockStatic;
69-
import static org.mockito.Mockito.times;
7058

7159
@ExtendWith(MockitoExtension.class)
7260
class DynamicClassExtractorTest {
@@ -119,15 +107,16 @@ void resetMonoResponse() {
119107
final DynamicClassExtractor extractor = new DynamicClassExtractor(testWithArexMock, args);
120108
final Predicate<Object> nonNull = Objects::nonNull;
121109

122-
//exception
110+
// exception
123111
Mono<?> result = monoExceptionTest();
124-
result = extractor.resetMonoResponse(result);
112+
MonoConsumer monoConsumer = new MonoConsumer(extractor);
113+
result = monoConsumer.accept(result);
125114
result.subscribe();
126115
assertTrue(nonNull.test(result));
127116

128-
//nomal
117+
// normal
129118
result = monoTest();
130-
result = extractor.resetMonoResponse(result);
119+
result = monoConsumer.accept(result);
131120
result.subscribe();
132121
assertTrue(nonNull.test(result));
133122
} catch (NoSuchMethodException e) {

0 commit comments

Comments
 (0)