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

rzo1 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/storm.git


The following commit(s) were added to refs/heads/master by this push:
     new 0eb7212e0 [STORM-3565] add support for adding dimensions to metric 
data points (#3194)
0eb7212e0 is described below

commit 0eb7212e0d8c5188d1366692b08c98e4d3e576b0
Author: Rui Li <[email protected]>
AuthorDate: Mon Dec 4 06:48:26 2023 -0600

    [STORM-3565] add support for adding dimensions to metric data points (#3194)
    
    * [STORM-3565] add support for adding dimensions to metric data points
    
    * STORM-3565 - Applies left over reviewer comments
    
    ---------
    
    Co-authored-by: Richard Zowalla <[email protected]>
---
 .../jvm/org/apache/storm/executor/Executor.java    |  4 +++-
 .../jvm/org/apache/storm/metric/api/IMetric.java   | 16 ++++++++++++++-
 .../apache/storm/metric/api/IMetricsConsumer.java  | 24 ++++++++++++++++++++--
 3 files changed, 40 insertions(+), 4 deletions(-)

diff --git a/storm-client/src/jvm/org/apache/storm/executor/Executor.java 
b/storm-client/src/jvm/org/apache/storm/executor/Executor.java
index 39181663c..b3df9c9e6 100644
--- a/storm-client/src/jvm/org/apache/storm/executor/Executor.java
+++ b/storm-client/src/jvm/org/apache/storm/executor/Executor.java
@@ -335,10 +335,12 @@ public abstract class Executor implements Callable, 
JCQueue.Consumer {
             List<IMetricsConsumer.DataPoint> dataPoints = new ArrayList<>();
             if (nameToRegistry != null) {
                 for (Map.Entry<String, IMetric> entry : 
nameToRegistry.entrySet()) {
+                    String name = entry.getKey();
                     IMetric metric = entry.getValue();
                     Object value = metric.getValueAndReset();
+                    Map<String, String> dimensions = metric.getDimensions();
                     if (value != null) {
-                        IMetricsConsumer.DataPoint dataPoint = new 
IMetricsConsumer.DataPoint(entry.getKey(), value);
+                        IMetricsConsumer.DataPoint dataPoint = new 
IMetricsConsumer.DataPoint(name, value, dimensions);
                         dataPoints.add(dataPoint);
                     }
                 }
diff --git a/storm-client/src/jvm/org/apache/storm/metric/api/IMetric.java 
b/storm-client/src/jvm/org/apache/storm/metric/api/IMetric.java
index 20e7f2f05..3ba0c187c 100644
--- a/storm-client/src/jvm/org/apache/storm/metric/api/IMetric.java
+++ b/storm-client/src/jvm/org/apache/storm/metric/api/IMetric.java
@@ -12,17 +12,31 @@
 
 package org.apache.storm.metric.api;
 
+import java.util.Collections;
+import java.util.Map;
+
 /**
  * Produces metrics.
+ * Usually, metric is a measurement identified by a name string.
+ * Dimensions are a collection of additional key-value metadata map containing 
extra information of this measurement.
+ * It is optional when customizing your metric by implementing this interface
  */
 public interface IMetric {
     /**
      * Get value and reset.
      *
      * @return an object that will be sent to
-     *     {@link 
IMetricsConsumer#handleDataPoints(org.apache.storm.metric.api.IMetricsConsumer.TaskInfo,java.util.Collection)}.
+     *     {@link 
IMetricsConsumer#handleDataPoints(org.apache.storm.metric.api.IMetricsConsumer.TaskInfo,
 java.util.Collection)}.
      *     If {@code null} is returned nothing will be sent. If this value can 
be reset, like with a counter, a side effect
      *     of calling this should be that the value is reset.
      */
     Object getValueAndReset();
+
+    /**
+     * Get dimension map. An empty map will be returned if metric is not 
dimensional.
+     * @return a K-V map of the additional metadata.
+     */
+    default Map<String, String> getDimensions() {
+        return Collections.emptyMap();
+    }
 }
diff --git 
a/storm-client/src/jvm/org/apache/storm/metric/api/IMetricsConsumer.java 
b/storm-client/src/jvm/org/apache/storm/metric/api/IMetricsConsumer.java
index 1fe21c724..68c641269 100644
--- a/storm-client/src/jvm/org/apache/storm/metric/api/IMetricsConsumer.java
+++ b/storm-client/src/jvm/org/apache/storm/metric/api/IMetricsConsumer.java
@@ -13,6 +13,7 @@
 package org.apache.storm.metric.api;
 
 import java.util.Collection;
+import java.util.Collections;
 import java.util.Map;
 import java.util.Objects;
 import org.apache.storm.task.IErrorReporter;
@@ -59,18 +60,34 @@ public interface IMetricsConsumer {
     class DataPoint {
         public String name;
         public Object value;
+        public Map<String, String> dimensions;
 
         public DataPoint() {
         }
 
         public DataPoint(String name, Object value) {
+            this(name, value, Collections.emptyMap());
+        }
+
+        public DataPoint(String name, Object value, Map<String, String> 
dimensions) {
             this.name = name;
             this.value = value;
+            this.dimensions = dimensions;
         }
 
         @Override
         public String toString() {
-            return "[" + name + " = " + value + "]";
+            StringBuilder sb = new StringBuilder();
+            sb.append("[");
+            sb.append(name);
+            sb.append("=");
+            sb.append(value);
+            if (!dimensions.isEmpty()) {
+                sb.append(", ");
+                sb.append(dimensions.toString());
+            }
+            sb.append("]");
+            return sb.toString();
         }
 
         @Override
@@ -84,13 +101,16 @@ public interface IMetricsConsumer {
 
             DataPoint dataPoint = (DataPoint) o;
 
-            return Objects.equals(name, dataPoint.name) && 
Objects.deepEquals(value, dataPoint.value);
+            return Objects.equals(name, dataPoint.name)
+                && Objects.deepEquals(value, dataPoint.value)
+                && Objects.deepEquals(dimensions, dataPoint.dimensions);
         }
 
         @Override
         public int hashCode() {
             int result = name != null ? name.hashCode() : 0;
             result = 31 * result + (value != null ? value.hashCode() : 0);
+            result = 31 * result + (dimensions != null ? dimensions.hashCode() 
: 0);
             return result;
         }
     }

Reply via email to