Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ public Collection<Record<Event>> doExecute(Collection<Record<Event>> records) {

private void dissectField(Event event, String field){
Dissector dissector = dissectorMap.get(field);
boolean isDeleteSourceOnSuccessfulDissect = dissectConfig.isDeleteSourceRequested();
String text = event.get(field, String.class);
if (dissector.dissectText(text)) {
List<Field> dissectedFields = dissector.getDissectedFields();
Expand All @@ -96,6 +97,9 @@ private void dissectField(Event event, String field){
Object dissectFieldValue = convertTargetType(dissectFieldName,disectedField.getValue());
event.put(disectedField.getKey(), dissectFieldValue);
}
if (isDeleteSourceOnSuccessfulDissect) {
event.delete(field);
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,10 @@ public class DissectProcessorConfig {
"For example, <code>/some_value == \"log\"</code>.")
private String dissectWhen;

@JsonProperty
@JsonPropertyDescription("If true, the configured fields in the <code>map</code> will be deleted if the processor was successful.")
private boolean deleteSource;

public String getDissectWhen(){
return dissectWhen;
}
Expand All @@ -64,6 +68,10 @@ public Map<String, String> getMap() {

public Map<String, TargetType> getTargetTypes() { return targetTypeMap; }

public boolean isDeleteSourceRequested() {
return deleteSource;
}

@AssertTrue(message = "target_type must be a Map<String, TargetType>. Valid options include [ 'integer', 'string', 'double', 'boolean', 'long', and 'big_decimal' ]")
boolean isTargetTypeValid() {
try {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.when;

Expand Down Expand Up @@ -267,4 +268,58 @@ private void reflectivelySetDissectorMap(DissectProcessor processor) throws NoSu
reflectField.setAccessible(false);
}
}

@Test
void test_delete_source_requested() throws NoSuchFieldException, IllegalAccessException {

Field dissectedField = new NormalField("level");
dissectedField.setValue("WARN");

when(dissector.dissectText(any(String.class))).thenReturn(true);
when(dissector.getDissectedFields()).thenReturn(List.of(dissectedField));
when(dissectConfig.isDeleteSourceRequested()).thenReturn(true);

final DissectProcessor processor = createObjectUnderTest();
reflectivelySetDissectorMap(processor);
final Record<Event> dataPrepperRecord = getEvent("2025-01-28T00:00:00.000Z WARN This is a test log");
final List<Record<Event>> dissectedRecords = (List<Record<Event>>) processor.doExecute(Collections.singletonList(dataPrepperRecord));

assertTrue(dissectedRecords.get(0).getData().containsKey("level"));
assertThat(dissectedRecords.get(0).getData().get("level", String.class), is("WARN"));
assertFalse(dissectedRecords.get(0).getData().containsKey("test"));
}

@Test
void test_delete_source_not_requested() throws NoSuchFieldException, IllegalAccessException {
Field dissectedField = new NormalField("level");
dissectedField.setValue("WARN");

when(dissector.dissectText(any(String.class))).thenReturn(true);
when(dissector.getDissectedFields()).thenReturn(List.of(dissectedField));
when(dissectConfig.isDeleteSourceRequested()).thenReturn(false);

final DissectProcessor processor = createObjectUnderTest();
reflectivelySetDissectorMap(processor);
final Record<Event> dataPrepperRecord = getEvent("2025-01-28T00:00:00.000Z WARN This is a test log");
final List<Record<Event>> dissectedRecords = (List<Record<Event>>) processor.doExecute(Collections.singletonList(dataPrepperRecord));

assertTrue(dissectedRecords.get(0).getData().containsKey("level"));
assertThat(dissectedRecords.get(0).getData().get("level", String.class), is("WARN"));
assertTrue(dissectedRecords.get(0).getData().containsKey("test"));
}

@Test
void test_delete_source_requested_dissect_fail() throws NoSuchFieldException, IllegalAccessException {

when(dissector.dissectText(any(String.class))).thenReturn(false);
when(dissectConfig.isDeleteSourceRequested()).thenReturn(true);

final DissectProcessor processor = createObjectUnderTest();
reflectivelySetDissectorMap(processor);
final Record<Event> dataPrepperRecord = getEvent("2025-01-28T00:00:00.000Z WARN This is a test log");
final List<Record<Event>> dissectedRecords = (List<Record<Event>>) processor.doExecute(Collections.singletonList(dataPrepperRecord));

assertTrue(dissectedRecords.get(0).getData().containsKey("test"));
}

}
Loading