@Override
public FilteredData filter(DataFromTopic data) {
try {
- PmReport report = createPmReport(data);
+ PmReport report = getPmReport(data);
+ PmReport reportFiltered = new PmReport();
+
if (report.event.perf3gppFields == null) {
logger.warn("Received PM report with no perf3gppFields, ignored. {}", data);
return FilteredData.empty();
}
- if (!filter(report, this.filterData)) {
+ if (!filter(report, reportFiltered, this.filterData)) {
return FilteredData.empty();
}
- return new FilteredData(data.key, gson.toJson(report).getBytes());
+ return new FilteredData(data.key, gson.toJson(reportFiltered).getBytes());
} catch (Exception e) {
logger.warn("Could not parse PM data. {}, reason: {}", data, e.getMessage());
return FilteredData.empty();
}
@SuppressWarnings("java:S2445") // "data" is a method parameter, and should not be used for synchronization.
- private PmReport createPmReport(DataFromTopic data) {
+ private PmReport getPmReport(DataFromTopic data) {
synchronized (data) {
if (data.getCachedPmReport() == null) {
data.setCachedPmReport(gsonParse.fromJson(data.valueAsString(), PmReport.class));
* @param filterData
* @return true if there is anything left in the report
*/
- private boolean filter(PmReport report, FilterData filterData) {
+ private boolean filter(PmReport report, PmReport reportFiltered, FilterData filterData) {
if (!matchSourceNames(report, filterData.sourceNames)) {
return false;
}
- Collection<PmReport.MeasInfoList> filtered = createMeasObjInstIds(report, filterData);
- report.event.perf3gppFields.measDataCollection.measInfoList = filtered;
- return !filtered.isEmpty();
+
+ Collection<PmReport.MeasInfoList> filteredMeasObjs = createMeasObjInstIds(report, filterData);
+ reportFiltered.event.commonEventHeader = report.event.commonEventHeader;
+ reportFiltered.event.perf3gppFields = report.event.perf3gppFields.toBuilder().build();
+ reportFiltered.event.perf3gppFields.measDataCollection =
+ report.event.perf3gppFields.measDataCollection.toBuilder().build();
+ reportFiltered.event.perf3gppFields.measDataCollection.measInfoList = filteredMeasObjs;
+ return !filteredMeasObjs.isEmpty();
}
private boolean isContainedInAny(String aString, Collection<String> collection) {
import static org.assertj.core.api.Assertions.assertThat;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+
+import java.lang.invoke.MethodHandles;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
+import java.time.Instant;
import org.junit.jupiter.api.Test;
import org.oran.dmaapadapter.filter.Filter.FilteredData;
import org.oran.dmaapadapter.tasks.TopicListener;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
class PmReportFilterTest {
+ private final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
private String filterReport(PmReportFilter filter) throws Exception {
TopicListener.DataFromTopic data = new TopicListener.DataFromTopic(null, loadReport().getBytes());
@Test
void testMeasObjClass() throws Exception {
- PmReportFilter.FilterData filterData = new PmReportFilter.FilterData();
- filterData.measObjClass.add("junk");
- PmReportFilter filter = new PmReportFilter(filterData);
- String filtered = filterReport(filter);
- assertThat(filtered).isEmpty();
-
- filterData = new PmReportFilter.FilterData();
- filterData.measObjClass.add("ENodeBFunction");
- filter = new PmReportFilter(filterData);
- filtered = filterReport(filter);
- assertThat(filtered).contains("ENodeBFunction").doesNotContain("UtranCell");
+ {
+ PmReportFilter.FilterData filterData = new PmReportFilter.FilterData();
+ filterData.measObjClass.add("junk");
+ PmReportFilter filter = new PmReportFilter(filterData);
+ String filtered = filterReport(filter);
+ assertThat(filtered).isEmpty();
+ }
+
+ {
+ TopicListener.DataFromTopic data = new TopicListener.DataFromTopic(null, loadReport().getBytes());
+
+ PmReportFilter.FilterData utranCellFilter = new PmReportFilter.FilterData();
+ utranCellFilter.measObjClass.add("UtranCell");
+ FilteredData filtered = new PmReportFilter(utranCellFilter).filter(data);
+ assertThat(filtered.getValueAString()).contains("UtranCell").doesNotContain("ENodeBFunction");
+
+ PmReportFilter.FilterData eNodeBFilter = new PmReportFilter.FilterData();
+ eNodeBFilter.measObjClass.add("ENodeBFunction");
+ filtered = new PmReportFilter(eNodeBFilter).filter(data);
+ assertThat(filtered.getValueAString()).contains("ENodeBFunction").doesNotContain("UtranCell");
+ }
}
@Test
assertThat(filtered).contains("O-DU-1122");
}
+ void testCharacteristics() throws Exception {
+ Gson gson = new GsonBuilder() //
+ .disableHtmlEscaping() //
+ .create(); //
+
+ String path = "./src/test/resources/A20000626.2315+0200-2330+0200_HTTPS-6-73.json";
+ String report = Files.readString(Path.of(path), Charset.defaultCharset());
+
+ TopicListener.DataFromTopic data = new TopicListener.DataFromTopic(null, report.getBytes());
+
+ Instant startTime = Instant.now();
+
+ int CNT = 100000;
+ for (int i = 0; i < CNT; ++i) {
+ gson.fromJson(data.valueAsString(), PmReport.class);
+ }
+ printDuration("Parse", startTime, CNT);
+
+ startTime = Instant.now();
+
+ PmReportFilter.FilterData filterData = new PmReportFilter.FilterData();
+ filterData.measTypes.add("pmCounterNumber0");
+ PmReportFilter filter = new PmReportFilter(filterData);
+ for (int i = 0; i < CNT; ++i) {
+ FilteredData filtered = filter.filter(data);
+ }
+
+ printDuration("Filter", startTime, CNT);
+ }
+
+ void printDuration(String str, Instant startTime, int noOfIterations) {
+ final long durationSeconds = Instant.now().getEpochSecond() - startTime.getEpochSecond();
+ logger.info("*** Duration " + str + " :" + durationSeconds + ", objects/second: "
+ + noOfIterations / durationSeconds);
+ }
+
@Test
void testMeasuredEntityDns() throws Exception {
PmReportFilter.FilterData filterData = new PmReportFilter.FilterData();