aboutsummaryrefslogtreecommitdiffstats
path: root/container-core/src/main/java/com/yahoo/metrics/simple/UntypedMetric.java
diff options
context:
space:
mode:
Diffstat (limited to 'container-core/src/main/java/com/yahoo/metrics/simple/UntypedMetric.java')
-rw-r--r--container-core/src/main/java/com/yahoo/metrics/simple/UntypedMetric.java142
1 files changed, 142 insertions, 0 deletions
diff --git a/container-core/src/main/java/com/yahoo/metrics/simple/UntypedMetric.java b/container-core/src/main/java/com/yahoo/metrics/simple/UntypedMetric.java
new file mode 100644
index 00000000000..f757ab15022
--- /dev/null
+++ b/container-core/src/main/java/com/yahoo/metrics/simple/UntypedMetric.java
@@ -0,0 +1,142 @@
+// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.metrics.simple;
+
+import java.util.logging.Logger;
+
+import org.HdrHistogram.DoubleHistogram;
+
+import java.util.logging.Level;
+
+/**
+ * A gauge or a counter or... who knows? The class for storing a metric when the
+ * metric has not been declared.
+ *
+ * @author Steinar Knutsen
+ */
+public class UntypedMetric {
+
+ private static final Logger log = Logger.getLogger(UntypedMetric.class.getName());
+
+ private long count = 0L;
+ private double current = 0.0d;
+ private double max;
+ private double min;
+ private double sum;
+ private AssumedType outputFormat = AssumedType.NONE;
+ private final DoubleHistogram histogram;
+ private final MetricSettings metricSettings;
+
+ public enum AssumedType { NONE, GAUGE, COUNTER };
+
+ UntypedMetric(MetricSettings metricSettings) {
+ this.metricSettings = metricSettings;
+ if (metricSettings == null || !metricSettings.isHistogram()) {
+ histogram = null;
+ } else {
+ histogram = new DoubleHistogram(metricSettings.getSignificantdigits());
+ }
+ }
+
+ void add(Number x) {
+ outputFormat = AssumedType.COUNTER;
+ count += x.longValue();
+ }
+
+ void put(Number x) {
+ outputFormat = AssumedType.GAUGE;
+ current = x.doubleValue();
+ if (histogram != null) {
+ histogram.recordValue(current);
+ }
+ if (count > 0) {
+ max = Math.max(current, max);
+ min = Math.min(current, min);
+ sum += current;
+ } else {
+ max = current;
+ min = current;
+ sum = current;
+ }
+ ++count;
+ }
+
+ UntypedMetric pruneData() {
+ UntypedMetric pruned = new UntypedMetric(null);
+ pruned.outputFormat = this.outputFormat;
+ pruned.current = this.current;
+ return pruned;
+ }
+
+ void merge(UntypedMetric other, boolean otherIsNewer) throws IllegalArgumentException {
+ if (outputFormat == AssumedType.NONE) {
+ outputFormat = other.outputFormat;
+ }
+ if (outputFormat != other.outputFormat) {
+ throw new IllegalArgumentException("Mismatching output formats: " + outputFormat + " and " + other.outputFormat + ".");
+ }
+ if (count > 0) {
+ if (other.count > 0) {
+ max = Math.max(other.max, max);
+ min = Math.min(other.min, min);
+ if (otherIsNewer) {
+ current = other.current;
+ }
+ }
+ } else {
+ max = other.max;
+ min = other.min;
+ current = other.current;
+ }
+ count += other.count;
+ sum += other.sum;
+ if (histogram != null) {
+ // some config scenarios may lead to differing histogram settings,
+ // so doing this defensively
+ if (other.histogram != null) {
+ try {
+ histogram.add(other.histogram);
+ } catch (ArrayIndexOutOfBoundsException e) {
+ log.log(Level.WARNING, "Had trouble merging histograms: " + e.getMessage());
+ }
+ }
+ }
+ }
+
+ public boolean isCounter() { return outputFormat == AssumedType.COUNTER; }
+
+ public long getCount() { return count; }
+ public double getLast() { return current; }
+ public double getMax() { return max; }
+ public double getMin() { return min; }
+ public double getSum() { return sum; }
+
+ MetricSettings getMetricDefinition() {
+ return metricSettings;
+ }
+
+ public DoubleHistogram getHistogram() {
+ return histogram;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder buf = new StringBuilder();
+ buf.append(this.getClass().getName()).append(": ");
+ buf.append("outputFormat=").append(outputFormat).append(", ");
+ if (count > 0 && outputFormat == AssumedType.GAUGE) {
+ buf.append("max=").append(max).append(", ");
+ buf.append("min=").append(min).append(", ");
+ buf.append("sum=").append(sum).append(", ");
+ }
+ if (histogram != null) {
+ buf.append("histogram=").append(histogram).append(", ");
+ }
+ if (metricSettings != null) {
+ buf.append("metricSettings=").append(metricSettings).append(", ");
+ }
+ buf.append("current=").append(current).append(", ");
+ buf.append("count=").append(count);
+ return buf.toString();
+ }
+
+}