From 0e08abbbf9ac8b7bcb84e8f98439822a1cfd99fb Mon Sep 17 00:00:00 2001 From: Venkata Molluru Date: Thu, 25 Nov 2021 04:04:35 +0000 Subject: [DCAEGEN2] Enhance (KPI-MS) KpiComputation for SUM-RATIO operation. Issue-ID: DCAEGEN2-2989 Signed-off-by: Venkata Molluru Change-Id: Iba9dc9cab49fc085dc2f987cea65ad258d937d5b --- components/kpi-computation-ms/Changelog.md | 4 ++ .../kpi/computation/SumRatioKpiComputation.java | 83 +++++++++++++++++++++ .../org/onap/dcaegen2/kpi/config/Operation.java | 5 +- .../kpi/computation/KpiComputationTest.java | 52 +++++++++++++- .../org/onap/dcaegen2/kpi/computation/KpiTest.java | 10 ++- .../src/test/resources/kpi/cbs_config3.json | 38 ++++++++++ .../test/resources/kpi/kpi_config_sumratio.json | 34 +++++++++ .../src/test/resources/kpi/ves_message_empty.json | 84 ++++++++++++++++++++++ .../test/resources/kpi/ves_message_eventname.json | 84 ++++++++++++++++++++++ .../src/test/resources/kpi/ves_message_null.json | 80 +++++++++++++++++++++ 10 files changed, 470 insertions(+), 4 deletions(-) create mode 100644 components/kpi-computation-ms/src/main/java/org/onap/dcaegen2/kpi/computation/SumRatioKpiComputation.java create mode 100644 components/kpi-computation-ms/src/test/resources/kpi/cbs_config3.json create mode 100644 components/kpi-computation-ms/src/test/resources/kpi/kpi_config_sumratio.json create mode 100644 components/kpi-computation-ms/src/test/resources/kpi/ves_message_empty.json create mode 100644 components/kpi-computation-ms/src/test/resources/kpi/ves_message_eventname.json create mode 100644 components/kpi-computation-ms/src/test/resources/kpi/ves_message_null.json (limited to 'components') diff --git a/components/kpi-computation-ms/Changelog.md b/components/kpi-computation-ms/Changelog.md index a5dfd969..a1530641 100644 --- a/components/kpi-computation-ms/Changelog.md +++ b/components/kpi-computation-ms/Changelog.md @@ -5,6 +5,10 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/). +## [1.0.3] +### Changed +* Add KpiComputation for SUMRATIO operation (DCAEGEN2-2989) + ## [1.0.2] ### Changed * [DCAEGEN2-2972] diff --git a/components/kpi-computation-ms/src/main/java/org/onap/dcaegen2/kpi/computation/SumRatioKpiComputation.java b/components/kpi-computation-ms/src/main/java/org/onap/dcaegen2/kpi/computation/SumRatioKpiComputation.java new file mode 100644 index 00000000..a031abde --- /dev/null +++ b/components/kpi-computation-ms/src/main/java/org/onap/dcaegen2/kpi/computation/SumRatioKpiComputation.java @@ -0,0 +1,83 @@ +/*- +* ============LICENSE_START======================================================= +* Copyright (C) 2022 Deutsche Telekom AG. All rights reserved. +* ================================================================================ +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +* SPDX-License-Identifier: Apache-2.0 +* ============LICENSE_END========================================================= +*/ + +package org.onap.dcaegen2.kpi.computation; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.ArrayList; +import java.util.List; +import java.util.LinkedList; +import java.util.ListIterator; +import java.util.Map; + +import org.onap.dcaegen2.kpi.config.ControlLoopSchemaType; +import org.onap.dcaegen2.kpi.models.CommonEventHeader; +import org.onap.dcaegen2.kpi.models.KpiOperand; +import org.onap.dcaegen2.kpi.models.MeasDataCollection; +import org.onap.dcaegen2.kpi.models.MeasInfo; +import org.onap.dcaegen2.kpi.models.MeasInfoId; +import org.onap.dcaegen2.kpi.models.MeasResult; +import org.onap.dcaegen2.kpi.models.MeasTypes; +import org.onap.dcaegen2.kpi.models.MeasValues; +import org.onap.dcaegen2.kpi.models.Perf3gppFields; +import org.onap.dcaegen2.kpi.models.PerformanceEvent; +import org.onap.dcaegen2.kpi.models.VesEvent; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** +* SumRatioKpiComputation. +* +* @author Tarun Agrawal +*/ +public class SumRatioKpiComputation extends BaseKpiComputation { + + private static Logger logger = LoggerFactory.getLogger(SumRatioKpiComputation.class); + + @Override + public List handle(PerformanceEvent pmEvent, ControlLoopSchemaType schemaType, + Map> measInfoMap, String measType, List operands) { + + BigDecimal sumK1; + BigDecimal sumK2; + final List vesEvents = new LinkedList<>(); + + if (operands.size() == 2) { + List k1 = measInfoMap.get(operands.get(0)); + List k2 = measInfoMap.get(operands.get(1)); + + if (k1.size() != k2.size()) { + return null; + } + + sumK1 = k1.stream().map(KpiOperand::getValue).reduce(BigDecimal.ZERO, BigDecimal::add); + sumK2 = k2.stream().map(KpiOperand::getValue).reduce(BigDecimal.ZERO, BigDecimal::add); + + if (sumK2.compareTo(BigDecimal.ZERO) == 0) { + return null; + } + + BigDecimal result = sumK1.multiply(new BigDecimal("100")).divide(sumK2, 0, RoundingMode.HALF_UP); + vesEvents.add(generateVesEvent(pmEvent, schemaType.toString(), result, measType)); + } + return vesEvents; + } +} diff --git a/components/kpi-computation-ms/src/main/java/org/onap/dcaegen2/kpi/config/Operation.java b/components/kpi-computation-ms/src/main/java/org/onap/dcaegen2/kpi/config/Operation.java index 248c3817..82f65ca8 100644 --- a/components/kpi-computation-ms/src/main/java/org/onap/dcaegen2/kpi/config/Operation.java +++ b/components/kpi-computation-ms/src/main/java/org/onap/dcaegen2/kpi/config/Operation.java @@ -1,7 +1,7 @@ /*- * ============LICENSE_START======================================================= * Copyright (C) 2021 China Mobile. - * Copyright (C) 2021 Deutsche Telekom AG. All rights reserved. + * Copyright (C) 2022 Deutsche Telekom AG. All rights reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,7 +25,8 @@ public enum Operation { SUM("org.onap.dcaegen2.kpi.computation.SumKpiComputation"), RATIO("org.onap.dcaegen2.kpi.computation.RatioKpiComputation"), - MEAN("org.onap.dcaegen2.kpi.computation.MEAN"); + MEAN("org.onap.dcaegen2.kpi.computation.MEAN"), + SUMRATIO("org.onap.dcaegen2.kpi.computation.SumRatioKpiComputation"); public final String value; diff --git a/components/kpi-computation-ms/src/test/java/org/onap/dcaegen2/kpi/computation/KpiComputationTest.java b/components/kpi-computation-ms/src/test/java/org/onap/dcaegen2/kpi/computation/KpiComputationTest.java index 69494ab5..1ed65572 100644 --- a/components/kpi-computation-ms/src/test/java/org/onap/dcaegen2/kpi/computation/KpiComputationTest.java +++ b/components/kpi-computation-ms/src/test/java/org/onap/dcaegen2/kpi/computation/KpiComputationTest.java @@ -1,7 +1,7 @@ /*- * ============LICENSE_START======================================================= * Copyright (C) 2021 China Mobile. - * Copyright (C) 2021 Deutsche Telekom AG. All rights reserved. + * Copyright (C) 2022 Deutsche Telekom AG. All rights reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -40,6 +40,10 @@ public class KpiComputationTest { private static final String KPI_CONFIG_FILE = "kpi/kpi_config.json"; private static final String VES_MESSAGE_FILE = "kpi/ves_message.json"; private static final String KPI_CONFIG_RATIO_FILE = "kpi/kpi_config_ratio.json"; + private static final String KPI_CONFIG_SUMRATIO_FILE = "kpi/kpi_config_sumratio.json"; + private static final String VES_MESSAGE_EMPTY_FILE = "kpi/ves_message_empty.json"; + private static final String VES_MESSAGE_NULL_FILE = "kpi/ves_message_null.json"; + private static final String VES_MESSAGE_EVENTNAME_FILE = "kpi/ves_message_eventname.json"; @Test public void testKpiComputation() { @@ -70,4 +74,50 @@ public class KpiComputationTest { .getMeasValuesList().get(0).getMeasResults().get(0).getSvalue(), "50"); } + @Test + public void testKpiComputationSumRatio() { + + String strKpiConfigSumRatio = FileUtils.getFileContents(KPI_CONFIG_SUMRATIO_FILE); + String vesMessage = FileUtils.getFileContents(VES_MESSAGE_FILE); + Configuration config = mock(Configuration.class); + when(config.getKpiConfig()).thenReturn(strKpiConfigSumRatio); + List vesList = new KpiComputation().checkAndDoComputation(vesMessage, config); + VesEvent vesEvent = vesList.get(0); + assertEquals(vesEvent.getEvent().getPerf3gppFields().getMeasDataCollection().getMeasInfoList().get(0) + .getMeasValuesList().get(0).getMeasResults().get(0).getSvalue(), "67"); + } + + @Test + public void testKpiComputationSumRatioEmptyCheck() { + String strKpiConfigSumRatio = FileUtils.getFileContents(KPI_CONFIG_SUMRATIO_FILE); + + String vesMessage = FileUtils.getFileContents(VES_MESSAGE_EMPTY_FILE); + Configuration config = mock(Configuration.class); + when(config.getKpiConfig()).thenReturn(strKpiConfigSumRatio); + List vesList = new KpiComputation().checkAndDoComputation(vesMessage, config); + assertEquals(0, vesList.size()); + } + + @Test + public void testKpiComputationSumRatioOperandsCheck() { + String strKpiConfigSumRatio = FileUtils.getFileContents(KPI_CONFIG_SUMRATIO_FILE); + + String vesMessage = FileUtils.getFileContents(VES_MESSAGE_NULL_FILE); + Configuration config = mock(Configuration.class); + when(config.getKpiConfig()).thenReturn(strKpiConfigSumRatio); + List vesList = new KpiComputation().checkAndDoComputation(vesMessage, config); + assertEquals(0, vesList.size()); + } + + @Test + public void testKpiComputationSumRatioEventNameCheck() { + String strKpiConfigSumRatio = FileUtils.getFileContents(KPI_CONFIG_SUMRATIO_FILE); + + String vesMessage = FileUtils.getFileContents(VES_MESSAGE_EVENTNAME_FILE); + Configuration config = mock(Configuration.class); + when(config.getKpiConfig()).thenReturn(strKpiConfigSumRatio); + List vesList = new KpiComputation().checkAndDoComputation(vesMessage, config); + assertEquals(null, vesList); + } + } diff --git a/components/kpi-computation-ms/src/test/java/org/onap/dcaegen2/kpi/computation/KpiTest.java b/components/kpi-computation-ms/src/test/java/org/onap/dcaegen2/kpi/computation/KpiTest.java index 236a15c4..5a552c51 100644 --- a/components/kpi-computation-ms/src/test/java/org/onap/dcaegen2/kpi/computation/KpiTest.java +++ b/components/kpi-computation-ms/src/test/java/org/onap/dcaegen2/kpi/computation/KpiTest.java @@ -1,7 +1,7 @@ /*- * ============LICENSE_START======================================================= * Copyright (C) 2021 China Mobile. - * Copyright (C) 2021 Deutsche Telekom AG. All rights reserved. + * Copyright (C) 2022 Deutsche Telekom AG. All rights reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -34,6 +34,7 @@ public class KpiTest { private static final String KPI_CONFIG_FILE = "kpi/kpi_config.json"; private static final String VES_MESSAGE_FILE = "kpi/ves_message.json"; private static final String KPI_CONFIG_RATIO_FILE = "kpi/kpi_config_ratio.json"; + private static final String KPI_CONFIG_SUMRATIO_FILE = "kpi/kpi_config_sumratio.json"; @Test public void testKpiConfigValidate() { @@ -60,4 +61,11 @@ public class KpiTest { assertEquals(kpiConfig.getDomain(), "measurementsForKpi"); } + @Test + public void testKpiConfigSumRatioValidate() { + String strKpiConfig = FileUtils.getFileContents(KPI_CONFIG_SUMRATIO_FILE); + KpiConfig kpiConfig = KpiJsonConversion.convertKpiConfig(strKpiConfig); + assertEquals(kpiConfig.getDomain(), "measurementsForKpi"); + } + } diff --git a/components/kpi-computation-ms/src/test/resources/kpi/cbs_config3.json b/components/kpi-computation-ms/src/test/resources/kpi/cbs_config3.json new file mode 100644 index 00000000..33ae3111 --- /dev/null +++ b/components/kpi-computation-ms/src/test/resources/kpi/cbs_config3.json @@ -0,0 +1,38 @@ +{ + "config": { + "pollingInterval": 20, + "aafUsername": "dcae@dcae.onap.org", + "cbsPollingInterval": 60, + "mongo.host": "192.168.225.61", + "cid": "kpi-cid", + "trust_store_pass_path": "/opt/app/kpims/etc/cert/trust.pass", + "cg": "kpi-cg", + "mongo.port": 27017, + "mongo.databasename": "datalake", + "streams_subscribes": { + "performance_management_topic": { + "aaf_password": "demo123456!", + "type": "message-router", + "dmaap_info": { + "topic_url": "https://message-router.onap.svc.cluster.local:3905/events/org.onap.dmaap.mr.PERFORMANCE_MEASUREMENTS" + }, + "aaf_username": "dcae@dcae.onap.org" + } + }, + "trust_store_path": "/opt/app/kpims/etc/cert/trust.jks", + "pollingTimeout": 60, + "streams_publishes": { + "kpi_topic": { + "aaf_password": "demo123456!", + "type": "message-router", + "dmaap_info": { + "topic_url": "https://message-router.onap.svc.cluster.local:3905/events/unauthenticated.DCAE_KPI_OUTPUT" + }, + "aaf_username": "dcae@dcae.onap.org" + } + }, + "aafPassword": "demo123456!", + "kpi.policy": "{\"domain\":\"measurementsForKpi\",\"methodForKpi\":[{\"eventName\":\"perf3gpp_CORE-AMF_pmMeasResult\",\"controlLoopSchemaType\":\"SLICE\",\"policyScope\":\"resource=networkSlice;type=configuration\",\"policyName\":\"configuration.dcae.microservice.pm-mapper.xml\",\"policyVersion\":\"v0.0.1\",\"kpis\":[{\"measType\":\"AMFRegNbr\",\"operation\":\"SUM\",\"operands\":[\"RM.RegisteredSubNbrMean\"]}]},{\"eventName\":\"perf3gpp_AcmeNode-Acme_pmMeasResult\",\"controlLoopSchemaType\":\"SLICE\",\"policyScope\":\"resource=networkSlice;type=configuration\",\"policyName\":\"configuration.dcae.microservice.pm-mapper.xml\",\"policyVersion\":\"v0.0.1\",\"kpis\":[{\"measType\":\"UpstreamThr\",\"operation\":\"SUMRATIO\",\"operands\":[\"GTP.InDataOctN3UPF\",\"GTP.OutDataOctN3UPF\"]},{\"measType\":\"DownstreamThr\",\"operation\":\"SUMRATIO\",\"operands\":[\"GTP.InDataOctN3UPF\",\"GTP.OutDataOctN3UPF\"]}]}]}", + "dmaap.server": ["message-router"] + } +} diff --git a/components/kpi-computation-ms/src/test/resources/kpi/kpi_config_sumratio.json b/components/kpi-computation-ms/src/test/resources/kpi/kpi_config_sumratio.json new file mode 100644 index 00000000..1c6f79b9 --- /dev/null +++ b/components/kpi-computation-ms/src/test/resources/kpi/kpi_config_sumratio.json @@ -0,0 +1,34 @@ +{ + "domain": "measurementsForKpi", + "methodForKpi": [{ + "eventName": "perf3gpp_CORE_AMF_pmMeasResult", + "controlLoopSchemaType": "SLICE", + "policyScope": "resource=networkSlice;type=configuration", + "policyName": "configuration.dcae.microservice.pm-mapper.xml", + "policyVersion": "v0.0.1", + "kpis": [{ + "measType": "AMFRegNbr", + "operation": "SUM", + "operands": ["RM.RegisteredSubNbrMean"] + }] + }, + { + "eventName": "perf3gpp_AcmeNode-Acme_pmMeasResult", + "controlLoopSchemaType": "SLICE", + "policyScope": "resource=networkSlice;type=configuration", + "policyName": "configuration.dcae.microservice.pm-mapper.xml", + "policyVersion": "v0.0.1", + "kpis": [{ + "measType": "UpstreamThr", + "operation": "SUMRATIO", + "operands": ["GTP.InDataOctN3UPF","GTP.OutDataOctN3UPF"] + }, + { + "measType": "DownstreamThr", + "operation": "SUMRATIO", + "operands": ["GTP.InDataOctN3UPF","GTP.OutDataOctN3UPF"] + } + ] + } + ] +} diff --git a/components/kpi-computation-ms/src/test/resources/kpi/ves_message_empty.json b/components/kpi-computation-ms/src/test/resources/kpi/ves_message_empty.json new file mode 100644 index 00000000..b2988a33 --- /dev/null +++ b/components/kpi-computation-ms/src/test/resources/kpi/ves_message_empty.json @@ -0,0 +1,84 @@ +{ + "event": { + "commonEventHeader": { + "domain": "perf3gpp", + "eventId": "14618daf-c0ce-4ccc-9169-9e1ac79971f2", + "sequence": 0, + "eventName": "perf3gpp_AcmeNode-Acme_pmMeasResult", + "sourceName": "oteNB5309", + "reportingEntityName": "", + "priority": "Normal", + "startEpochMicrosec": 1591099200000, + "lastEpochMicrosec": 1591100100000, + "version": "4.0", + "vesEventListenerVersion": "7.1", + "timeZoneOffset": "UTC+05:00" + }, + "perf3gppFields": { + "perf3gppFieldsVersion": "1.0", + "measDataCollection": { + "granularityPeriod": 1591100100000, + "measuredEntityUserName": "", + "measuredEntityDn": "UPFMeasurement", + "measuredEntitySoftwareVersion": "r0.1", + "measInfoList": [ + { + "measInfoId": { + "sMeasInfoId": "UPFFunction0" + }, + "measTypes": { + "sMeasTypesList": [ + "RRC.RrcConnectionSuccess.08_010101", + "RRC.RrcConnectionTotal.08_010101" + ] + }, + "measValuesList": [ + { + "measObjInstId": "some measObjLdn", + "suspectFlag": "false", + "measResults": [ + { + "p": 1, + "sValue": "10" + }, + { + "p": 2, + "sValue": "0" + } + ] + } + ] + }, + { + "measInfoId": { + "sMeasInfoId": "UPFFunction1" + }, + "measTypes": { + "sMeasTypesList": [ + "RRC.RrcConnectionSuccess.08_010101", + "RRC.RrcConnectionTotal.08_010101" + ] + }, + "measValuesList": [ + { + "measObjInstId": "some measObjLdn", + "suspectFlag": "false", + "measResults": [ + { + "p": 1, + "sValue": "30" + }, + { + "p": 2, + "sValue": "0" + } + ] + } + ] + } + ] + } + } + } +} + diff --git a/components/kpi-computation-ms/src/test/resources/kpi/ves_message_eventname.json b/components/kpi-computation-ms/src/test/resources/kpi/ves_message_eventname.json new file mode 100644 index 00000000..be7225e0 --- /dev/null +++ b/components/kpi-computation-ms/src/test/resources/kpi/ves_message_eventname.json @@ -0,0 +1,84 @@ +{ + "event": { + "commonEventHeader": { + "domain": "perf3gpp", + "eventId": "14618daf-c0ce-4ccc-9169-9e1ac79971f2", + "sequence": 0, + "eventName": "perf3gpp_AcmeNode-Acme", + "sourceName": "oteNB5309", + "reportingEntityName": "", + "priority": "Normal", + "startEpochMicrosec": 1591099200000, + "lastEpochMicrosec": 1591100100000, + "version": "4.0", + "vesEventListenerVersion": "7.1", + "timeZoneOffset": "UTC+05:00" + }, + "perf3gppFields": { + "perf3gppFieldsVersion": "1.0", + "measDataCollection": { + "granularityPeriod": 1591100100000, + "measuredEntityUserName": "", + "measuredEntityDn": "UPFMeasurement", + "measuredEntitySoftwareVersion": "r0.1", + "measInfoList": [ + { + "measInfoId": { + "sMeasInfoId": "UPFFunction0" + }, + "measTypes": { + "sMeasTypesList": [ + "RRC.RrcConnectionSuccess.08_010101", + "RRC.RrcConnectionTotal.08_010101" + ] + }, + "measValuesList": [ + { + "measObjInstId": "some measObjLdn", + "suspectFlag": "false", + "measResults": [ + { + "p": 1, + "sValue": "10" + }, + { + "p": 2, + "sValue": "20" + } + ] + } + ] + }, + { + "measInfoId": { + "sMeasInfoId": "UPFFunction1" + }, + "measTypes": { + "sMeasTypesList": [ + "RRC.RrcConnectionSuccess.08_010101", + "RRC.RrcConnectionTotal.08_010101" + ] + }, + "measValuesList": [ + { + "measObjInstId": "some measObjLdn", + "suspectFlag": "false", + "measResults": [ + { + "p": 1, + "sValue": "30" + }, + { + "p": 2, + "sValue": "40" + } + + ] + } + ] + } + ] + } + } + } +} diff --git a/components/kpi-computation-ms/src/test/resources/kpi/ves_message_null.json b/components/kpi-computation-ms/src/test/resources/kpi/ves_message_null.json new file mode 100644 index 00000000..98656859 --- /dev/null +++ b/components/kpi-computation-ms/src/test/resources/kpi/ves_message_null.json @@ -0,0 +1,80 @@ +{ + "event": { + "commonEventHeader": { + "domain": "perf3gpp", + "eventId": "14618daf-c0ce-4ccc-9169-9e1ac79971f2", + "sequence": 0, + "eventName": "perf3gpp_AcmeNode-Acme_pmMeasResult", + "sourceName": "oteNB5309", + "reportingEntityName": "", + "priority": "Normal", + "startEpochMicrosec": 1591099200000, + "lastEpochMicrosec": 1591100100000, + "version": "4.0", + "vesEventListenerVersion": "7.1", + "timeZoneOffset": "UTC+05:00" + }, + "perf3gppFields": { + "perf3gppFieldsVersion": "1.0", + "measDataCollection": { + "granularityPeriod": 1591100100000, + "measuredEntityUserName": "", + "measuredEntityDn": "UPFMeasurement", + "measuredEntitySoftwareVersion": "r0.1", + "measInfoList": [ + { + "measInfoId": { + "sMeasInfoId": "UPFFunction0" + }, + "measTypes": { + "sMeasTypesList": [ + "RRC.RrcConnectionSuccess.08_010101", + "RRC.RrcConnectionTotal.08_010101" + ] + }, + "measValuesList": [ + { + "measObjInstId": "some measObjLdn", + "suspectFlag": "false", + "measResults": [ + { + "p": 1, + "sValue": "10" + }, + { + "p": 2, + "sValue": "20" + } + ] + } + ] + }, + { + "measInfoId": { + "sMeasInfoId": "UPFFunction1" + }, + "measTypes": { + "sMeasTypesList": [ + "RRC.RrcConnectionSuccess.08_010101", + "RRC.RrcConnectionTotal.08_010101" + ] + }, + "measValuesList": [ + { + "measObjInstId": "some measObjLdn", + "suspectFlag": "false", + "measResults": [ + { + "p": 1, + "sValue": "30" + } + ] + } + ] + } + ] + } + } + } +} + -- cgit 1.2.3-korg