Skip to content

Commit a8b32ab

Browse files
authored
Merge pull request #50 from exceptionless/duplicate-checker-fix
Expanded duplicate checking logic to all events
2 parents bc7ad6a + 71053d5 commit a8b32ab

File tree

4 files changed

+25
-36
lines changed

4 files changed

+25
-36
lines changed

src/main/java/com/exceptionless/exceptionlessclient/configuration/PluginManager.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public PluginManager() {
2929
private void configureDefaultPlugins() {
3030
addPlugin(ConfigurationDefaultsPlugin.builder().build());
3131
addPlugin(ErrorPlugin.builder().build());
32-
addPlugin(DuplicateErrorCheckerPlugin.builder().build());
32+
addPlugin(DuplicateCheckerPlugin.builder().build());
3333
addPlugin(EventExclusionPlugin.builder().build());
3434
addPlugin(ModuleInfoPlugin.builder().build());
3535
addPlugin(RequestInfoPlugin.builder().build());

src/main/java/com/exceptionless/exceptionlessclient/plugins/preconfigured/DuplicateErrorCheckerPlugin.java src/main/java/com/exceptionless/exceptionlessclient/plugins/preconfigured/DuplicateCheckerPlugin.java

+19-24
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,17 @@
33
import com.exceptionless.exceptionlessclient.configuration.ConfigurationManager;
44
import com.exceptionless.exceptionlessclient.models.Event;
55
import com.exceptionless.exceptionlessclient.models.EventPluginContext;
6-
import com.exceptionless.exceptionlessclient.models.error.Error;
7-
import com.exceptionless.exceptionlessclient.models.error.InnerError;
86
import com.exceptionless.exceptionlessclient.plugins.EventPluginIF;
97
import com.exceptionless.exceptionlessclient.plugins.MergedEvent;
108
import lombok.Builder;
119
import lombok.Getter;
12-
import lombok.extern.slf4j.Slf4j;
10+
import org.slf4j.Logger;
11+
import org.slf4j.LoggerFactory;
1312

1413
import java.util.*;
1514

16-
@Slf4j
17-
public class DuplicateErrorCheckerPlugin implements EventPluginIF {
15+
public class DuplicateCheckerPlugin implements EventPluginIF {
16+
private static final Logger LOG = LoggerFactory.getLogger(DuplicateCheckerPlugin.class);
1817
private static final String MERGED_EVENTS_RESUBMISSION_TIMER_NAME =
1918
"merged-events-resubmission-timer";
2019
private static final Integer DEFAULT_PRIORITY = 1010;
@@ -28,8 +27,7 @@ public class DuplicateErrorCheckerPlugin implements EventPluginIF {
2827
private final Integer mergedEventsResubmissionInSecs;
2928

3029
@Builder
31-
public DuplicateErrorCheckerPlugin(
32-
Integer mergedEventsResubmissionInSecs, Integer maxHashesCount) {
30+
public DuplicateCheckerPlugin(Integer mergedEventsResubmissionInSecs, Integer maxHashesCount) {
3331
this.maxHashesCount = maxHashesCount == null ? DEFAULT_MAX_HASHES_COUNT : maxHashesCount;
3432
this.mergedEvents = new ArrayDeque<>();
3533
this.mergedEventsResubmissionTimer = new Timer(MERGED_EVENTS_RESUBMISSION_TIMER_NAME);
@@ -52,7 +50,7 @@ public void run() {
5250
event.resubmit();
5351
}
5452
} catch (Exception e) {
55-
log.error("Error in resubmitting merged events", e);
53+
LOG.error("Error in resubmitting merged events", e);
5654
}
5755
}
5856
},
@@ -69,20 +67,14 @@ public int getPriority() {
6967
public void run(
7068
EventPluginContext eventPluginContext, ConfigurationManager configurationManager) {
7169
Event event = eventPluginContext.getEvent();
72-
Optional<Error> maybeError = event.getError();
73-
if (maybeError.isEmpty()) {
74-
return;
75-
}
76-
Error error = maybeError.get();
77-
78-
long hash = getHashCode(error);
70+
long hash = getHash(event);
7971
Optional<MergedEvent> maybeMergedEvent =
8072
mergedEvents.stream().filter(mergedEvent -> mergedEvent.getHash() == hash).findFirst();
8173
if (maybeMergedEvent.isPresent()) {
8274
MergedEvent mergedEvent = maybeMergedEvent.get();
8375
mergedEvent.incrementCount(event.getCount());
8476
mergedEvent.updateDate(event.getDate());
85-
log.info(String.format("Ignoring duplicate event with hash: %s", hash));
77+
LOG.info(String.format("Ignoring duplicate event with hash: %s", hash));
8678
eventPluginContext.getContext().setEventCancelled(true);
8779
return;
8880
}
@@ -96,7 +88,7 @@ public void run(
9688
timeStampedHash.getHash() == hash
9789
&& timeStampedHash.getTimestamp()
9890
>= (now - mergedEventsResubmissionInSecs * 1000))) {
99-
log.trace(String.format("Adding event with hash :%s", hash));
91+
LOG.trace(String.format("Adding event with hash :%s", hash));
10092
mergedEvents.add(
10193
MergedEvent.builder()
10294
.event(event)
@@ -118,13 +110,16 @@ private void addNewHashIfPossible(long hash, long now) {
118110
hashes.add(TimeStampedHash.builder().hash(hash).timestamp(now).build());
119111
}
120112

121-
private long getHashCode(InnerError error) {
122-
long hash = 0L;
123-
while (error != null) {
124-
hash += Objects.hash(error.getMessage(), error.getStackTrace());
125-
error = error.getInner();
126-
}
127-
return hash;
113+
private long getHash(Event event) {
114+
return Objects.hash(
115+
event.getType(),
116+
event.getSource(),
117+
event.getDate(),
118+
event.getTags(),
119+
event.getMessage(),
120+
event.getData(),
121+
event.getGeo(),
122+
event.getValue());
128123
}
129124

130125
@Builder

src/test/java/com/exceptionless/exceptionlessclient/configuration/PluginManagerTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public void itCanConfigureDefaultPlugins() {
2424
List.of(
2525
"ConfigurationDefaultsPlugin",
2626
"ErrorPlugin",
27-
"DuplicateErrorCheckerPlugin",
27+
"DuplicateCheckerPlugin",
2828
"EventExclusionPlugin",
2929
"ModuleInfoPlugin",
3030
"RequestInfoPlugin",

src/test/java/com/exceptionless/exceptionlessclient/plugins/preconfigured/DuplicateErrorCheckerPluginTest.java src/test/java/com/exceptionless/exceptionlessclient/plugins/preconfigured/DuplicateCheckerPluginTest.java

+4-10
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,15 @@
2121
import static org.mockito.Mockito.verify;
2222

2323
@ExtendWith(MockitoExtension.class)
24-
public class DuplicateErrorCheckerPluginTest {
24+
public class DuplicateCheckerPluginTest {
2525
private static final String EVENT_REF_ID = "test-event";
2626
private static final Long EVENT_COUNT = 100L;
2727

2828
@Mock private DefaultEventQueue eventQueue;
2929

3030
private EventPluginContext context;
3131
private ConfigurationManager configurationManager;
32-
private DuplicateErrorCheckerPlugin plugin;
32+
private DuplicateCheckerPlugin plugin;
3333

3434
@BeforeEach
3535
public void setup() {
@@ -54,10 +54,7 @@ public void setup() {
5454

5555
@Test
5656
public void itCanDetectAPotentialToBeMergedEvent() throws InterruptedException {
57-
plugin =
58-
DuplicateErrorCheckerPlugin.builder()
59-
.mergedEventsResubmissionInSecs(1)
60-
.build();
57+
plugin = DuplicateCheckerPlugin.builder().mergedEventsResubmissionInSecs(1).build();
6158
plugin.run(context, configurationManager);
6259
plugin.run(context, configurationManager);
6360
Thread.sleep(1500);
@@ -72,10 +69,7 @@ public void itCanDetectAPotentialToBeMergedEvent() throws InterruptedException {
7269

7370
@Test
7471
public void itCanMergeEventsWithSameHash() throws InterruptedException {
75-
plugin =
76-
DuplicateErrorCheckerPlugin.builder()
77-
.mergedEventsResubmissionInSecs(1)
78-
.build();
72+
plugin = DuplicateCheckerPlugin.builder().mergedEventsResubmissionInSecs(1).build();
7973
plugin.run(context, configurationManager);
8074
plugin.run(context, configurationManager);
8175
plugin.run(context, configurationManager);

0 commit comments

Comments
 (0)