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;
}
}