From 3774d43bcda157d88e0b2a2fb7e38abf24ecfbee Mon Sep 17 00:00:00 2001 From: Marius Oehler Date: Fri, 10 Jul 2020 14:32:22 +0200 Subject: [PATCH] Extend EUM server to handle non existing beacon fields as empty values --- .../RegexReplacementBeaconProcessor.java | 21 ++++++++++++++----- .../model/BeaconTagSettings.java | 5 +++++ .../RegexReplacementBeaconProcessorTest.java | 21 +++++++++++++++++++ 3 files changed, 42 insertions(+), 5 deletions(-) diff --git a/components/inspectit-ocelot-eum-server/src/main/java/rocks/inspectit/oce/eum/server/beacon/processor/RegexReplacementBeaconProcessor.java b/components/inspectit-ocelot-eum-server/src/main/java/rocks/inspectit/oce/eum/server/beacon/processor/RegexReplacementBeaconProcessor.java index 850aebe710..ebf0c9cde6 100644 --- a/components/inspectit-ocelot-eum-server/src/main/java/rocks/inspectit/oce/eum/server/beacon/processor/RegexReplacementBeaconProcessor.java +++ b/components/inspectit-ocelot-eum-server/src/main/java/rocks/inspectit/oce/eum/server/beacon/processor/RegexReplacementBeaconProcessor.java @@ -60,20 +60,25 @@ public Beacon process(Beacon beacon) { } private String deriveTag(RegexDerivedTag tag, String input) { - if (input == null) { - return null; + String value = input; + if (value == null) { + if (tag.isNullAsEmpty()) { + value = ""; + } else { + return null; + } } Pattern regex = tag.getRegex(); if (regex != null) { try { - return regexReplaceAll(input, regex, tag.getReplacement(), tag.isKeepIfNoMatch()); + return regexReplaceAll(value, regex, tag.getReplacement(), tag.isKeepIfNoMatch()); } catch (Exception ex) { - log.error("Could not derive beacon tag value <{}> of input string <{}>!", tag.getTagName(), input, tag.getReplacement(), ex); + log.error("Could not derive beacon tag value <{}> of input string <{}>!", tag.getTagName(), value, tag.getReplacement(), ex); return null; } } else { - return input; + return value; } } @@ -149,6 +154,11 @@ private static class RegexDerivedTag { */ boolean keepIfNoMatch; + /** + * Specify whether the input field should be considered as an empty string if it does not exists. + */ + boolean nullAsEmpty; + private static RegexDerivedTag fromSettings(String tagName, BeaconTagSettings settings) { Pattern pattern = null; String regex = settings.getRegex(); @@ -161,6 +171,7 @@ private static RegexDerivedTag fromSettings(String tagName, BeaconTagSettings se .regex(pattern) .replacement(settings.getReplacement()) .keepIfNoMatch(settings.isKeepNoMatch()) + .nullAsEmpty(settings.isNullAsEmpty()) .build(); } } diff --git a/components/inspectit-ocelot-eum-server/src/main/java/rocks/inspectit/oce/eum/server/configuration/model/BeaconTagSettings.java b/components/inspectit-ocelot-eum-server/src/main/java/rocks/inspectit/oce/eum/server/configuration/model/BeaconTagSettings.java index 3113381f14..2c0be28d85 100644 --- a/components/inspectit-ocelot-eum-server/src/main/java/rocks/inspectit/oce/eum/server/configuration/model/BeaconTagSettings.java +++ b/components/inspectit-ocelot-eum-server/src/main/java/rocks/inspectit/oce/eum/server/configuration/model/BeaconTagSettings.java @@ -47,4 +47,9 @@ public class BeaconTagSettings { @Builder.Default private String replacement = ""; + /** + * Specify whether the input field should be considered as an empty string if it does not exists. + */ + @Builder.Default + private boolean nullAsEmpty = false; } diff --git a/components/inspectit-ocelot-eum-server/src/test/java/rocks/inspectit/oce/eum/server/beacon/processor/RegexReplacementBeaconProcessorTest.java b/components/inspectit-ocelot-eum-server/src/test/java/rocks/inspectit/oce/eum/server/beacon/processor/RegexReplacementBeaconProcessorTest.java index 902aaad858..7e60adea7e 100644 --- a/components/inspectit-ocelot-eum-server/src/test/java/rocks/inspectit/oce/eum/server/beacon/processor/RegexReplacementBeaconProcessorTest.java +++ b/components/inspectit-ocelot-eum-server/src/test/java/rocks/inspectit/oce/eum/server/beacon/processor/RegexReplacementBeaconProcessorTest.java @@ -139,5 +139,26 @@ void nullAttribute() { entry("value", "Hello World") ); } + + @Test + void nullAttributeAsEmpty() { + BeaconTagSettings first = BeaconTagSettings.builder().input("not-existing").regex("^$").replacement("one").nullAsEmpty(true).build(); + + Map beaconTags = new LinkedHashMap<>(); + beaconTags.put("first", first); + + EumServerConfiguration conf = new EumServerConfiguration(); + conf.setTags(new EumTagsSettings()); + conf.getTags().setBeacon(beaconTags); + + RegexReplacementBeaconProcessor processor = new RegexReplacementBeaconProcessor(conf); + + Beacon result = processor.process(Beacon.of(ImmutableMap.of("value", "Hello World"))); + + assertThat(result.toMap()).containsOnly( + entry("value", "Hello World"), + entry("first", "one") + ); + } } }