* ============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.
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;
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;
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;
*/
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) {
// 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
* ============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.
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;
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;
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";
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();
*/
@Before
public void setUp() throws Exception {
-
+ CollectorRegistry.defaultRegistry.clear();
properties = new Properties();
prov1 = mock(PolicyEngineFeatureApi.class);
prov2 = mock(PolicyEngineFeatureApi.class);
mgr = new PolicyEngineManagerImpl();
}
+ @After
+ public void tearDown() {
+ CollectorRegistry.defaultRegistry.clear();
+ }
+
@Test
public void testSerialize() {
mgr.configure(properties);
@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