add policy_executions_latency_seconds summary 37/127037/1
authorjhh <jorge.hernandez-herrero@att.com>
Wed, 9 Feb 2022 13:59:29 +0000 (07:59 -0600)
committerjhh <jorge.hernandez-herrero@att.com>
Wed, 9 Feb 2022 13:59:29 +0000 (07:59 -0600)
Issue-ID: POLICY-3761
Signed-off-by: jhh <jorge.hernandez-herrero@att.com>
Change-Id: I9867472784d8f153b6955ce95b34de250f60f558

policy-management/src/main/java/org/onap/policy/drools/system/PolicyEngineManager.java
policy-management/src/test/java/org/onap/policy/drools/system/PolicyEngineManagerTest.java

index 7252179..ea4094f 100644 (file)
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * ONAP
  * ================================================================================
- * Copyright (C) 2019-2021 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2019-2022 AT&T Intellectual Property. 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.
@@ -26,8 +26,10 @@ import static org.onap.policy.drools.system.PolicyEngineConstants.TELEMETRY_SERV
 
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
+import io.prometheus.client.Summary;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
 import java.util.Properties;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.ScheduledThreadPoolExecutor;
@@ -57,6 +59,7 @@ import org.onap.policy.common.endpoints.properties.PolicyEndPointProperties;
 import org.onap.policy.common.gson.annotation.GsonJsonIgnore;
 import org.onap.policy.common.gson.annotation.GsonJsonProperty;
 import org.onap.policy.common.utils.logging.LoggerUtils;
+import org.onap.policy.common.utils.resources.PrometheusUtils;
 import org.onap.policy.common.utils.services.FeatureApiUtils;
 import org.onap.policy.drools.controller.DroolsControllerConstants;
 import org.onap.policy.drools.core.PolicyContainer;
@@ -83,6 +86,7 @@ import org.onap.policy.drools.stats.PolicyStatsManager;
 import org.onap.policy.drools.system.internal.SimpleLockManager;
 import org.onap.policy.drools.utils.PropertyUtil;
 import org.onap.policy.drools.utils.logging.MdcTransaction;
+import org.onap.policy.models.pdp.enums.PdpResponseStatus;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -171,6 +175,20 @@ class PolicyEngineManager implements PolicyEngine {
      */
     private final Gson decoder = new GsonBuilder().disableHtmlEscaping().create();
 
+    protected static final String CONTROLLOOP_NAME_LABEL = "controlloop";
+    protected static final String CONTROLLER_LABEL = "controller";
+    protected static final String POLICY_LABEL = "policy";
+
+    protected static final Summary transLatencySecsSummary =
+            Summary.build().namespace(PrometheusUtils.PdpType.PDPD.getNamespace())
+                    .name(PrometheusUtils.POLICY_EXECUTIONS_LATENCY_SECONDS_METRIC)
+                    .labelNames(CONTROLLER_LABEL,
+                            CONTROLLOOP_NAME_LABEL,
+                            POLICY_LABEL,
+                            PrometheusUtils.STATUS_METRIC_LABEL)
+                    .help(PrometheusUtils.POLICY_EXECUTIONS_LATENCY_SECONDS_HELP)
+                    .register();
+
 
     @Override
     public synchronized void boot(String[] cliArgs) {
@@ -266,6 +284,21 @@ class PolicyEngineManager implements PolicyEngine {
         // the controller name is used for tracking purposes
 
         getStats().stat(controlLoopName, transaction);
+
+        Long elapsedTime = transaction.getElapsedTime();
+        String policyName = transaction.getServiceInstanceId();
+        if (Objects.isNull(elapsedTime) || StringUtils.isEmpty(policyName)) {
+            logger.warn("{} transaction in controller {} incomplete transaction object: {}",
+                    controlLoopName, controllerName, transaction);
+            return;
+        }
+
+        transLatencySecsSummary
+            .labels(controllerName,
+                    controlLoopName,
+                    policyName,
+                    transaction.isSuccess() ? PdpResponseStatus.SUCCESS.name() : PdpResponseStatus.FAIL.name())
+            .observe(transaction.getElapsedTime() / 1000D);
     }
 
     @Override
index 4be25d1..82c2869 100644 (file)
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * ONAP
  * ================================================================================
- * Copyright (C) 2018-2021 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2018-2022 AT&T Intellectual Property. 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,8 @@ import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import io.prometheus.client.CollectorRegistry;
+import io.prometheus.client.Summary;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
@@ -47,6 +49,7 @@ import java.util.Properties;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.function.BiConsumer;
 import java.util.function.Consumer;
+import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.onap.policy.common.endpoints.event.comm.Topic.CommInfrastructure;
@@ -74,6 +77,7 @@ import org.onap.policy.drools.protocol.configuration.PdpdConfiguration;
 import org.onap.policy.drools.stats.PolicyStatsManager;
 import org.onap.policy.drools.system.internal.SimpleLockManager;
 import org.onap.policy.drools.system.internal.SimpleLockProperties;
+import org.onap.policy.models.pdp.enums.PdpResponseStatus;
 
 public class PolicyEngineManagerTest {
     private static final String EXPECTED = "expected exception";
@@ -90,6 +94,8 @@ public class PolicyEngineManagerTest {
     private static final String MESSAGE = "my-message";
     private static final String MY_OWNER = "my-owner";
     private static final String MY_RESOURCE = "my-resource";
+    private static final String POLICY = "policy";
+    private static final String CONTROLLOOP = "controlloop";
 
     private static final Object MY_EVENT = new Object();
 
@@ -153,7 +159,7 @@ public class PolicyEngineManagerTest {
      */
     @Before
     public void setUp() throws Exception {
-
+        CollectorRegistry.defaultRegistry.clear();
         properties = new Properties();
         prov1 = mock(PolicyEngineFeatureApi.class);
         prov2 = mock(PolicyEngineFeatureApi.class);
@@ -317,6 +323,11 @@ public class PolicyEngineManagerTest {
         mgr = new PolicyEngineManagerImpl();
     }
 
+    @After
+    public void tearDown() {
+        CollectorRegistry.defaultRegistry.clear();
+    }
+
     @Test
     public void testSerialize() {
         mgr.configure(properties);
@@ -1360,14 +1371,34 @@ public class PolicyEngineManagerTest {
 
     @Test
     public void testTransaction() {
-        mgr.metric("foo", "bar", new Metric());
+        mgr.metric(CONTROLLER1, POLICY, new Metric());
         assertEquals(0, mgr.getStats().getGroupStat().getPolicyExecutedCount());
         assertEquals(0, mgr.getStats().getSubgroupStats().size());
 
-        mgr.transaction("foo", "bar", new Metric());
+        Metric metric = new Metric();
+        mgr.transaction(CONTROLLER1, CONTROLLOOP, metric);
         assertEquals(1, mgr.getStats().getGroupStat().getPolicyExecutedCount());
         assertEquals(1, mgr.getStats().getSubgroupStats().size());
-        assertEquals(1, mgr.getStats().getSubgroupStats().get("bar").getPolicyExecutedFailCount());
+        assertEquals(1, mgr.getStats().getSubgroupStats().get(CONTROLLOOP).getPolicyExecutedFailCount());
+
+        Summary.Child.Value summary =
+                PolicyEngineManagerImpl.transLatencySecsSummary
+                        .labels(CONTROLLER1, CONTROLLOOP, POLICY, PdpResponseStatus.FAIL.name()).get();
+
+        assertEquals(0, summary.count, 0.0);
+        assertEquals(0, summary.sum, 0.0);
+
+        metric.setServiceInstanceId(POLICY);
+        metric.setElapsedTime(5000L);
+        metric.setSuccess(false);
+        mgr.transaction(CONTROLLER1, CONTROLLOOP, metric);
+
+        summary =
+                PolicyEngineManagerImpl.transLatencySecsSummary
+                        .labels(CONTROLLER1, CONTROLLOOP, POLICY, PdpResponseStatus.FAIL.name()).get();
+
+        assertEquals(1, summary.count, 0.0);
+        assertEquals(5, summary.sum, 0.0);
     }
 
     @Test