summaryrefslogtreecommitdiffstats
path: root/metrics-proxy/src/main/java/ai/vespa/metricsproxy/core/VespaMetrics.java
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2021-09-09 09:24:58 +0200
committerHenning Baldersheim <balder@yahoo-inc.com>2021-09-09 09:24:58 +0200
commite94825d50e0f2828f100da891a7a25860ed24700 (patch)
treec669941884b57d290425c250f62c44d29c5f3380 /metrics-proxy/src/main/java/ai/vespa/metricsproxy/core/VespaMetrics.java
parente42881f213bc22c8e60f11b236a8de77fe2735f4 (diff)
Refactor metric aggregation in preparation for inline metric handling.
Diffstat (limited to 'metrics-proxy/src/main/java/ai/vespa/metricsproxy/core/VespaMetrics.java')
-rw-r--r--metrics-proxy/src/main/java/ai/vespa/metricsproxy/core/VespaMetrics.java34
1 files changed, 23 insertions, 11 deletions
diff --git a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/core/VespaMetrics.java b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/core/VespaMetrics.java
index 3fc2bb316a1..f112acd6e05 100644
--- a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/core/VespaMetrics.java
+++ b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/core/VespaMetrics.java
@@ -82,9 +82,10 @@ public class VespaMetrics {
// One metrics packet per set of metrics that share the same dimensions+consumers
// TODO: Move aggregation into MetricsPacket itself?
- Map<AggregationKey, List<Metric>> aggregatedMetrics = aggregateMetrics(service.getDimensions(), serviceMetrics);
+ MetricAggregator aggregator = new MetricAggregator(service.getDimensions());
+ serviceMetrics.getMetrics().forEach(metric -> aggregator.aggregate(metric));
- aggregatedMetrics.forEach((aggregationKey, metrics) -> {
+ aggregator.getAggregated().forEach((aggregationKey, metrics) -> {
MetricsPacket.Builder builder = new MetricsPacket.Builder(service.getMonitoringName())
.putMetrics(metrics)
.putDimension(METRIC_TYPE_DIMENSION_ID, "standard")
@@ -194,25 +195,36 @@ public class VespaMetrics {
return mostRecentTimestamp;
}
- private Map<AggregationKey, List<Metric>> aggregateMetrics(Map<DimensionId, String> serviceDimensions,
- Metrics metrics) {
- Map<AggregationKey, List<Metric>> aggregatedMetrics = new HashMap<>();
-
- for (Metric metric : metrics.getMetrics() ) {
+ private static class MetricAggregator {
+ private final Map<AggregationKey, List<Metric>> aggregated = new HashMap<>();
+ private final Map<DimensionId, String> serviceDimensions;
+ MetricAggregator(Map<DimensionId, String> serviceDimensions) {
+ this.serviceDimensions = serviceDimensions;
+ }
+ Map<AggregationKey, List<Metric>> getAggregated() { return aggregated; }
+ void aggregate(Metric metric) {
Map<DimensionId, String> mergedDimensions = new LinkedHashMap<>();
mergedDimensions.putAll(metric.getDimensions());
mergedDimensions.putAll(serviceDimensions);
AggregationKey aggregationKey = new AggregationKey(mergedDimensions, metric.getConsumers());
- if (aggregatedMetrics.containsKey(aggregationKey)) {
- aggregatedMetrics.get(aggregationKey).add(metric);
+ if (aggregated.containsKey(aggregationKey)) {
+ aggregated.get(aggregationKey).add(metric);
} else {
List<Metric> ml = new ArrayList<>();
ml.add(metric);
- aggregatedMetrics.put(aggregationKey, ml);
+ aggregated.put(aggregationKey, ml);
}
}
- return aggregatedMetrics;
+ }
+
+ private Map<AggregationKey, List<Metric>> aggregateMetrics(Map<DimensionId, String> serviceDimensions, Metrics metrics) {
+ MetricAggregator aggregator = new MetricAggregator(serviceDimensions);
+
+ for (Metric metric : metrics.getMetrics() ) {
+ aggregator.aggregate(metric);
+ }
+ return aggregator.getAggregated();
}
private List<ConfiguredMetric> getMetricDefinitions(ConsumerId consumer) {