aboutsummaryrefslogtreecommitdiffstats
path: root/metrics-proxy/src/main/java/ai/vespa/metricsproxy/core/VespaMetrics.java
diff options
context:
space:
mode:
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.java177
1 files changed, 93 insertions, 84 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 f112acd6e05..a8ef79d827e 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
@@ -12,6 +12,7 @@ import ai.vespa.metricsproxy.metric.model.Dimension;
import ai.vespa.metricsproxy.metric.model.DimensionId;
import ai.vespa.metricsproxy.metric.model.MetricId;
import ai.vespa.metricsproxy.metric.model.MetricsPacket;
+import ai.vespa.metricsproxy.service.MetricsParser;
import ai.vespa.metricsproxy.service.VespaService;
import java.util.ArrayList;
@@ -75,23 +76,20 @@ public class VespaMetrics {
Optional<MetricsPacket.Builder> systemCheck = getSystemMetrics(service);
systemCheck.ifPresent(metricsPackets::add);
- Metrics allServiceMetrics = service.getMetrics();
+ MetricAggregator aggregator = new MetricAggregator(service.getDimensions());
+ GetServiceMetricsConsumer metricsConsumer = new GetServiceMetricsConsumer(consumersByMetric, aggregator);
+ service.consumeMetrics(metricsConsumer);
- if (! allServiceMetrics.getMetrics().isEmpty()) {
- Metrics serviceMetrics = getServiceMetrics(allServiceMetrics, consumersByMetric);
+ if (! aggregator.getAggregated().isEmpty()) {
// One metrics packet per set of metrics that share the same dimensions+consumers
- // TODO: Move aggregation into MetricsPacket itself?
- MetricAggregator aggregator = new MetricAggregator(service.getDimensions());
- serviceMetrics.getMetrics().forEach(metric -> aggregator.aggregate(metric));
-
aggregator.getAggregated().forEach((aggregationKey, metrics) -> {
MetricsPacket.Builder builder = new MetricsPacket.Builder(service.getMonitoringName())
.putMetrics(metrics)
.putDimension(METRIC_TYPE_DIMENSION_ID, "standard")
.putDimension(INSTANCE_DIMENSION_ID, service.getInstanceName())
.putDimensions(aggregationKey.getDimensions());
- setMetaInfo(builder, serviceMetrics.getTimeStamp());
+ setMetaInfo(builder, metrics.get(0).getTimeStamp());
builder.addConsumers(aggregationKey.getConsumers());
metricsPackets.add(builder);
});
@@ -120,15 +118,20 @@ public class VespaMetrics {
* In order to include a metric, it must exist in the given map of metric to consumers.
* Each returned metric will contain a collection of consumers that it should be routed to.
*/
- private Metrics getServiceMetrics(Metrics allServiceMetrics, Map<ConfiguredMetric, Set<ConsumerId>> consumersByMetric) {
- Metrics configuredServiceMetrics = new Metrics();
- configuredServiceMetrics.setTimeStamp(getMostRecentTimestamp(allServiceMetrics));
- for (Metric candidate : allServiceMetrics.getMetrics()) {
+ private class GetServiceMetricsConsumer implements MetricsParser.Consumer {
+ private final MetricAggregator aggregator;
+ private final Map<ConfiguredMetric, Set<ConsumerId>> consumersByMetric;
+ GetServiceMetricsConsumer(Map<ConfiguredMetric, Set<ConsumerId>> consumersByMetric, MetricAggregator aggregator) {
+ this.consumersByMetric = consumersByMetric;
+ this.aggregator = aggregator;
+ }
+
+ @Override
+ public void consume(Metric candidate) {
getConfiguredMetrics(candidate.getName(), consumersByMetric.keySet()).forEach(
- configuredMetric -> configuredServiceMetrics.add(
+ configuredMetric -> aggregator.aggregate(
metricWithConfigProperties(candidate, configuredMetric, consumersByMetric)));
}
- return configuredServiceMetrics;
}
private Map<DimensionId, String> extractDimensions(Map<DimensionId, String> dimensions, List<Dimension> configuredDimensions) {
@@ -185,16 +188,6 @@ public class VespaMetrics {
return Optional.of(builder);
}
- private long getMostRecentTimestamp(Metrics metrics) {
- long mostRecentTimestamp = 0L;
- for (Metric metric : metrics.getMetrics()) {
- if (metric.getTimeStamp() > mostRecentTimestamp) {
- mostRecentTimestamp = metric.getTimeStamp();
- }
- }
- return mostRecentTimestamp;
- }
-
private static class MetricAggregator {
private final Map<AggregationKey, List<Metric>> aggregated = new HashMap<>();
private final Map<DimensionId, String> serviceDimensions;
@@ -218,15 +211,6 @@ public class VespaMetrics {
}
}
- 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) {
if (metricsConsumers == null) return Collections.emptyList();
@@ -240,75 +224,100 @@ public class VespaMetrics {
.statusMessage("Data collected successfully");
}
+ private class MetricStringBuilder implements MetricsParser.Consumer {
+ private final StringBuilder sb = new StringBuilder();
+ private VespaService service;
+ @Override
+ public void consume(Metric metric) {
+ MetricId key = metric.getName();
+ MetricId alias = key;
+
+ boolean isForwarded = false;
+ for (ConfiguredMetric metricConsumer : getMetricDefinitions(vespaMetricsConsumerId)) {
+ if (metricConsumer.id().equals(key)) {
+ alias = metricConsumer.outputname();
+ isForwarded = true;
+ }
+ }
+ if (isForwarded) {
+ sb.append(formatter.format(service, alias.id, metric.getValue())).append(" ");
+ }
+ }
+
+ @Override
+ public String toString() {
+ return sb.toString();
+ }
+ }
/**
* Returns a string representation of metrics for the given services;
* a space separated list of key=value.
*/
public String getMetricsAsString(List<VespaService> services) {
- StringBuilder b = new StringBuilder();
- for (VespaService s : services) {
- for (Metric metric : s.getMetrics().getMetrics()) {
- MetricId key = metric.getName();
- MetricId alias = key;
-
- boolean isForwarded = false;
- for (ConfiguredMetric metricConsumer : getMetricDefinitions(vespaMetricsConsumerId)) {
- if (metricConsumer.id().equals(key)) {
- alias = metricConsumer.outputname();
- isForwarded = true;
+ MetricStringBuilder msb = new MetricStringBuilder();
+ for (VespaService service : services) {
+ msb.service = service;
+ service.consumeMetrics(msb);
+ }
+ return msb.toString();
+ }
+
+ private class MetricNamesBuilder implements MetricsParser.Consumer {
+ private final StringBuilder bufferOn = new StringBuilder();
+ private final StringBuilder bufferOff = new StringBuilder();
+ private final ConsumerId consumer;
+ MetricNamesBuilder(ConsumerId consumer) {
+ this.consumer = consumer;
+ }
+ @Override
+ public void consume(Metric m) {
+ String description = m.getDescription();
+ MetricId alias = MetricId.empty;
+ boolean isForwarded = false;
+
+ for (ConfiguredMetric metric : getMetricDefinitions(consumer)) {
+ if (metric.id().equals(m.getName())) {
+ alias = metric.outputname();
+ isForwarded = true;
+ if (description.isEmpty()) {
+ description = metric.description();
}
}
- if (isForwarded) {
- b.append(formatter.format(s, alias.id, metric.getValue())).append(" ");
- }
}
+
+ String message = "OFF";
+ StringBuilder buffer = bufferOff;
+ if (isForwarded) {
+ buffer = bufferOn;
+ message = "ON";
+ }
+ buffer.append(m.getName()).append('=').append(message);
+ if (!description.isEmpty()) {
+ buffer.append(";description=").append(description);
+ }
+ if (!alias.id.isEmpty()) {
+ buffer.append(";output-name=").append(alias);
+ }
+ buffer.append(',');
}
- return b.toString();
- }
+ @Override
+ public String toString() {
+ return bufferOn.append(bufferOff).toString();
+ }
+ }
/**
* Get all metric names for the given services
*
* @return String representation
*/
public String getMetricNames(List<VespaService> services, ConsumerId consumer) {
- StringBuilder bufferOn = new StringBuilder();
- StringBuilder bufferOff = new StringBuilder();
- for (VespaService s : services) {
-
- for (Metric m : s.getMetrics().getMetrics()) {
- String description = m.getDescription();
- MetricId alias = MetricId.empty;
- boolean isForwarded = false;
-
- for (ConfiguredMetric metric : getMetricDefinitions(consumer)) {
- if (metric.id().equals(m.getName())) {
- alias = metric.outputname();
- isForwarded = true;
- if (description.isEmpty()) {
- description = metric.description();
- }
- }
- }
-
- String message = "OFF";
- StringBuilder buffer = bufferOff;
- if (isForwarded) {
- buffer = bufferOn;
- message = "ON";
- }
- buffer.append(m.getName()).append('=').append(message);
- if (!description.isEmpty()) {
- buffer.append(";description=").append(description);
- }
- if (!alias.id.isEmpty()) {
- buffer.append(";output-name=").append(alias);
- }
- buffer.append(',');
- }
+ MetricNamesBuilder metricNamesBuilder = new MetricNamesBuilder(consumer);
+ for (VespaService service : services) {
+ service.consumeMetrics(metricNamesBuilder);
}
- return bufferOn.append(bufferOff).toString();
+ return metricNamesBuilder.toString();
}
}