This is an automated email from the ASF dual-hosted git repository.

fjtiradosarti pushed a commit to branch main
in repository 
https://gitbox.apache.org/repos/asf/incubator-kie-kogito-runtimes.git


The following commit(s) were added to refs/heads/main by this push:
     new 64b3242c99 [Fix #3483] Adding state duration summary (#3485)
64b3242c99 is described below

commit 64b3242c9995781bebddd691d3535c12ada4a69b
Author: Francisco Javier Tirado Sarti 
<[email protected]>
AuthorDate: Thu Apr 25 18:13:55 2024 +0200

    [Fix #3483] Adding state duration summary (#3485)
---
 .../process/MetricsProcessEventListener.java       | 25 ++++++++++++++++------
 .../org/kie/kogito/internal/utils/KogitoTags.java  |  2 ++
 .../workflow/parser/handlers/StateHandler.java     |  4 ++--
 3 files changed, 23 insertions(+), 8 deletions(-)

diff --git 
a/addons/common/monitoring/core/src/main/java/org/kie/kogito/monitoring/core/common/process/MetricsProcessEventListener.java
 
b/addons/common/monitoring/core/src/main/java/org/kie/kogito/monitoring/core/common/process/MetricsProcessEventListener.java
index a2fbebf6e1..92ddf1241e 100644
--- 
a/addons/common/monitoring/core/src/main/java/org/kie/kogito/monitoring/core/common/process/MetricsProcessEventListener.java
+++ 
b/addons/common/monitoring/core/src/main/java/org/kie/kogito/monitoring/core/common/process/MetricsProcessEventListener.java
@@ -35,6 +35,7 @@ import 
org.kie.kogito.internal.process.runtime.KogitoNodeInstance;
 import org.kie.kogito.internal.process.runtime.KogitoProcessInstance;
 import org.kie.kogito.internal.process.runtime.KogitoWorkItemNodeInstance;
 import org.kie.kogito.internal.process.runtime.KogitoWorkflowProcessInstance;
+import org.kie.kogito.internal.utils.KogitoTags;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -120,6 +121,11 @@ public class MetricsProcessEventListener extends 
DefaultKogitoProcessEventListen
                 "Work Items Duration", Tag.of("name", name));
     }
 
+    private DistributionSummary getNodeInstancesDurationSummary(String 
processId, String nodeName) {
+        return 
buildDistributionSummary("kogito_node_instance_duration_milliseconds", 
"Relevant nodes duration in milliseconds", Tag.of("process_id", processId),
+                Tag.of("node_name", nodeName));
+    }
+
     protected void recordRunningProcessInstance(String processId) {
         getRunningProcessInstancesGauge(processId).incrementAndGet();
     }
@@ -164,12 +170,19 @@ public class MetricsProcessEventListener extends 
DefaultKogitoProcessEventListen
         final KogitoNodeInstance nodeInstance = (KogitoNodeInstance) 
event.getNodeInstance();
         if (nodeInstance instanceof KogitoWorkItemNodeInstance) {
             KogitoWorkItemNodeInstance wi = (KogitoWorkItemNodeInstance) 
nodeInstance;
-            if (wi.getTriggerTime() != null) {
-                final String name = (String) 
wi.getWorkItem().getParameters().getOrDefault("TaskName", 
wi.getWorkItem().getName());
-                final double duration = 
millisToSeconds(wi.getLeaveTime().getTime() - wi.getTriggerTime().getTime());
-                getWorkItemsDurationSummary(name).record(duration);
-                LOGGER.debug("Work Item {}, duration: {}s", name, duration);
-            }
+            recordNodeDuration(getWorkItemsDurationSummary((String) 
wi.getWorkItem().getParameters().getOrDefault("TaskName", 
wi.getWorkItem().getName())), nodeInstance, TimeUnit.SECONDS);
+        }
+        String nodeName = (String) 
nodeInstance.getNode().getMetaData().get(KogitoTags.METRIC_NAME_METADATA);
+        if (nodeName != null) {
+            
recordNodeDuration(getNodeInstancesDurationSummary(event.getProcessInstance().getProcessId(),
 nodeName), nodeInstance, TimeUnit.MILLISECONDS);
+        }
+    }
+
+    private void recordNodeDuration(DistributionSummary summary, 
KogitoNodeInstance instance, TimeUnit target) {
+        if (instance.getTriggerTime() != null) {
+            double duration = target.convert(instance.getLeaveTime().getTime() 
- instance.getTriggerTime().getTime(), TimeUnit.MILLISECONDS);
+            summary.record(duration);
+            LOGGER.debug("Recorded {} {} because of node {} for summary {}", 
duration, target, instance.getNode().getName(), summary.getId().getName());
         }
     }
 
diff --git 
a/api/kogito-api/src/main/java/org/kie/kogito/internal/utils/KogitoTags.java 
b/api/kogito-api/src/main/java/org/kie/kogito/internal/utils/KogitoTags.java
index a514146fb3..431feba23b 100644
--- a/api/kogito-api/src/main/java/org/kie/kogito/internal/utils/KogitoTags.java
+++ b/api/kogito-api/src/main/java/org/kie/kogito/internal/utils/KogitoTags.java
@@ -27,4 +27,6 @@ public class KogitoTags {
     public static final String INPUT_TAG = "input";
     public static final String OUTPUT_TAG = "output";
 
+    public static final String METRIC_NAME_METADATA = "MetricName";
+
 }
diff --git 
a/kogito-serverless-workflow/kogito-serverless-workflow-builder/src/main/java/org/kie/kogito/serverless/workflow/parser/handlers/StateHandler.java
 
b/kogito-serverless-workflow/kogito-serverless-workflow-builder/src/main/java/org/kie/kogito/serverless/workflow/parser/handlers/StateHandler.java
index 0c1781d604..599ea4a3dd 100644
--- 
a/kogito-serverless-workflow/kogito-serverless-workflow-builder/src/main/java/org/kie/kogito/serverless/workflow/parser/handlers/StateHandler.java
+++ 
b/kogito-serverless-workflow/kogito-serverless-workflow-builder/src/main/java/org/kie/kogito/serverless/workflow/parser/handlers/StateHandler.java
@@ -189,7 +189,7 @@ public abstract class StateHandler<S extends State> {
 
     protected void handleState(RuleFlowNodeContainerFactory<?, ?> factory) {
         MakeNodeResult result = makeNode(factory);
-        node = result.getIncomingNode().metaData(SWFConstants.STATE_NAME, 
state.getName());
+        node = result.getIncomingNode().metaData(SWFConstants.STATE_NAME, 
state.getName()).metaData(KogitoTags.METRIC_NAME_METADATA, state.getName());
         outgoingNode = 
result.getOutgoingNode().metaData(SWFConstants.STATE_NAME, state.getName());
         if (state.getCompensatedBy() != null) {
             handleCompensation(factory);
@@ -208,7 +208,7 @@ public abstract class StateHandler<S extends State> {
             if (output != null) {
                 ActionNodeFactory<?> actionNode = handleStateFilter(factory, 
output);
                 factory.connection(outgoingNode.getNode().getId(), 
actionNode.getNode().getId());
-                outgoingNode = actionNode.metaData(SWFConstants.STATE_NAME, 
state.getName());
+                outgoingNode = actionNode.metaData(SWFConstants.STATE_NAME, 
state.getName()).metaData(KogitoTags.METRIC_NAME_METADATA, state.getName());
             }
         }
         connectStart(factory);


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to