summaryrefslogtreecommitdiffstats
path: root/metrics-proxy
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2021-09-01 18:35:34 +0200
committerHenning Baldersheim <balder@yahoo-inc.com>2021-09-01 18:35:34 +0200
commit2b434560283f19aa6c251d2df24b7f696a4971ef (patch)
tree129d31a29fff45c5ecc7656cce5048b012fc13ea /metrics-proxy
parentc2e4663a82dff4d6351a1e7b1db0e34cf943cf8a (diff)
The metrics proxy is very memory hungry.
This will avoid creating many identical DimensionIds, ServiceIds. It will also prefer using cheap singleton lists where possible. In addition the code relies less on generated Config code.
Diffstat (limited to 'metrics-proxy')
-rw-r--r--metrics-proxy/src/main/java/ai/vespa/metricsproxy/core/ConfiguredMetric.java41
-rw-r--r--metrics-proxy/src/main/java/ai/vespa/metricsproxy/core/MetricsConsumers.java22
-rw-r--r--metrics-proxy/src/main/java/ai/vespa/metricsproxy/core/VespaMetrics.java39
-rw-r--r--metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/ExternalMetrics.java10
-rw-r--r--metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/Dimension.java13
-rw-r--r--metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/DimensionId.java2
-rw-r--r--metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/MetricsPacket.java18
-rw-r--r--metrics-proxy/src/main/java/ai/vespa/metricsproxy/node/ServiceHealthGatherer.java3
-rw-r--r--metrics-proxy/src/main/java/ai/vespa/metricsproxy/service/VespaService.java9
-rw-r--r--metrics-proxy/src/main/java/ai/vespa/metricsproxy/service/VespaServices.java2
-rw-r--r--metrics-proxy/src/test/java/ai/vespa/metricsproxy/rpc/RpcHealthMetricsTest.java2
-rw-r--r--metrics-proxy/src/test/java/ai/vespa/metricsproxy/rpc/RpcMetricsTest.java6
12 files changed, 119 insertions, 48 deletions
diff --git a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/core/ConfiguredMetric.java b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/core/ConfiguredMetric.java
new file mode 100644
index 00000000000..6148e864373
--- /dev/null
+++ b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/core/ConfiguredMetric.java
@@ -0,0 +1,41 @@
+// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package ai.vespa.metricsproxy.core;
+
+import ai.vespa.metricsproxy.metric.model.Dimension;
+import ai.vespa.metricsproxy.metric.model.DimensionId;
+import ai.vespa.metricsproxy.metric.model.MetricId;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+public class ConfiguredMetric {
+ private final MetricId name;
+ private final String description;
+ private final String outputname;
+ private final List<Dimension> dimension;
+ public ConfiguredMetric(ConsumersConfig.Consumer.Metric m) {
+ name = MetricId.toMetricId(m.name());
+ outputname = m.outputname();
+ description = m.description();
+ dimension = new ArrayList<>(m.dimension().size());
+ m.dimension().forEach(d -> dimension.add(new Dimension(DimensionId.toDimensionId(d.key()), d.value())));
+ }
+ public MetricId id() { return name; }
+ public String outputname() { return outputname; }
+ public String description() { return description; }
+ public List<Dimension> dimension() { return dimension; }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ ConfiguredMetric that = (ConfiguredMetric) o;
+ return name.equals(that.name) && description.equals(that.description) && outputname.equals(that.outputname) && dimension.equals(that.dimension);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(name, description, outputname, dimension);
+ }
+}
diff --git a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/core/MetricsConsumers.java b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/core/MetricsConsumers.java
index 99d7b9fe8bf..82f341ec64d 100644
--- a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/core/MetricsConsumers.java
+++ b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/core/MetricsConsumers.java
@@ -28,14 +28,14 @@ import static java.util.stream.Collectors.collectingAndThen;
public class MetricsConsumers {
// All metrics for each consumer.
- private final Map<ConsumerId, List<Consumer.Metric>> consumerMetrics;
+ private final Map<ConsumerId, List<ConfiguredMetric>> consumerMetrics;
// All consumers for each metric (more useful than the opposite map).
- private final Map<Consumer.Metric, List<ConsumerId>> consumersByMetric;
+ private final Map<ConfiguredMetric, List<ConsumerId>> consumersByMetric;
public MetricsConsumers(ConsumersConfig config) {
consumerMetrics = config.consumer().stream().collect(
- toUnmodifiableLinkedMap(consumer -> toConsumerId(consumer.name()), Consumer::metric));
+ toUnmodifiableLinkedMap(consumer -> toConsumerId(consumer.name()), consumer -> convert(consumer.metric())));
consumersByMetric = createConsumersByMetric(consumerMetrics);
}
@@ -44,11 +44,11 @@ public class MetricsConsumers {
* @param consumer The consumer
* @return The metrics for the given consumer.
*/
- public List<Consumer.Metric> getMetricDefinitions(ConsumerId consumer) {
+ public List<ConfiguredMetric> getMetricDefinitions(ConsumerId consumer) {
return consumerMetrics.get(consumer);
}
- public Map<Consumer.Metric, List<ConsumerId>> getConsumersByMetric() {
+ public Map<ConfiguredMetric, List<ConsumerId>> getConsumersByMetric() {
return consumersByMetric;
}
@@ -60,9 +60,9 @@ public class MetricsConsumers {
* Helper function to create mapping from metric to consumers.
* TODO: consider reversing the mapping in metrics-consumers.def instead: metric{}.consumer[]
*/
- private static Map<Consumer.Metric, List<ConsumerId>>
- createConsumersByMetric(Map<ConsumerId, List<Consumer.Metric>> metricsByConsumer) {
- Map<Consumer.Metric, List<ConsumerId>> consumersByMetric = new LinkedHashMap<>();
+ private static Map<ConfiguredMetric, List<ConsumerId>>
+ createConsumersByMetric(Map<ConsumerId, List<ConfiguredMetric>> metricsByConsumer) {
+ Map<ConfiguredMetric, List<ConsumerId>> consumersByMetric = new LinkedHashMap<>();
metricsByConsumer.forEach(
(consumer, metrics) -> metrics.forEach(
metric -> consumersByMetric.computeIfAbsent(metric, unused -> new ArrayList<>())
@@ -75,4 +75,10 @@ public class MetricsConsumers {
return collectingAndThen(toLinkedMap(keyMapper, valueMapper), Collections::unmodifiableMap);
}
+ private List<ConfiguredMetric> convert(List<Consumer.Metric> configMetrics) {
+ List<ConfiguredMetric> metrics = new ArrayList<>(configMetrics.size());
+ configMetrics.forEach(m -> metrics.add(new ConfiguredMetric(m)));
+ return metrics;
+ }
+
}
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 f563dd27b86..68f53e3de04 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
@@ -8,6 +8,7 @@ import ai.vespa.metricsproxy.metric.Metric;
import ai.vespa.metricsproxy.metric.Metrics;
import ai.vespa.metricsproxy.metric.MetricsFormatter;
import ai.vespa.metricsproxy.metric.model.ConsumerId;
+import ai.vespa.metricsproxy.metric.model.Dimension;
import ai.vespa.metricsproxy.metric.model.DimensionId;
import ai.vespa.metricsproxy.metric.model.MetricsPacket;
import ai.vespa.metricsproxy.service.VespaService;
@@ -26,7 +27,6 @@ import java.util.stream.Collectors;
import static ai.vespa.metricsproxy.metric.dimensions.PublicDimensions.INTERNAL_SERVICE_ID;
import static ai.vespa.metricsproxy.metric.model.ConsumerId.toConsumerId;
import static ai.vespa.metricsproxy.metric.model.DimensionId.toDimensionId;
-import static ai.vespa.metricsproxy.metric.model.ServiceId.toServiceId;
import static com.google.common.base.Strings.isNullOrEmpty;
/**
@@ -51,7 +51,7 @@ public class VespaMetrics {
List<MetricsPacket> result = new ArrayList<>();
for (VespaService s : services) {
HealthMetric h = s.getHealth();
- MetricsPacket.Builder builder = new MetricsPacket.Builder(toServiceId(s.getMonitoringName()))
+ MetricsPacket.Builder builder = new MetricsPacket.Builder(s.getMonitoringName())
.statusCode(h.isOk() ? 0 : 1)
.statusMessage(h.getMessage())
.putDimension(METRIC_TYPE_DIMENSION_ID, "health")
@@ -70,7 +70,7 @@ public class VespaMetrics {
public List<MetricsPacket.Builder> getMetrics(List<VespaService> services) {
List<MetricsPacket.Builder> metricsPackets = new ArrayList<>();
- Map<ConsumersConfig.Consumer.Metric, List<ConsumerId>> consumersByMetric = metricsConsumers.getConsumersByMetric();
+ Map<ConfiguredMetric, List<ConsumerId>> consumersByMetric = metricsConsumers.getConsumersByMetric();
for (VespaService service : services) {
// One metrics packet for system metrics
@@ -87,7 +87,7 @@ public class VespaMetrics {
Map<AggregationKey, List<Metric>> aggregatedMetrics = aggregateMetrics(service.getDimensions(), serviceMetrics);
aggregatedMetrics.forEach((aggregationKey, metrics) -> {
- MetricsPacket.Builder builder = new MetricsPacket.Builder(toServiceId(service.getMonitoringName()))
+ MetricsPacket.Builder builder = new MetricsPacket.Builder(service.getMonitoringName())
.putMetrics(metrics)
.putDimension(METRIC_TYPE_DIMENSION_ID, "standard")
.putDimension(INSTANCE_DIMENSION_ID, service.getInstanceName())
@@ -107,7 +107,7 @@ public class VespaMetrics {
private MetricsPacket.Builder getHealth(VespaService service) {
HealthMetric health = service.getHealth();
- return new MetricsPacket.Builder(toServiceId(service.getMonitoringName()))
+ return new MetricsPacket.Builder(service.getMonitoringName())
.timestamp(System.currentTimeMillis() / 1000)
.statusCode(health.getStatus().ordinal()) // TODO: MetricsPacket should use StatusCode instead of int
.statusMessage(health.getMessage())
@@ -121,7 +121,7 @@ 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<ConsumersConfig.Consumer.Metric, List<ConsumerId>> consumersByMetric) {
+ private Metrics getServiceMetrics(Metrics allServiceMetrics, Map<ConfiguredMetric, List<ConsumerId>> consumersByMetric) {
Metrics configuredServiceMetrics = new Metrics();
configuredServiceMetrics.setTimeStamp(getMostRecentTimestamp(allServiceMetrics));
for (Metric candidate : allServiceMetrics.getMetrics()) {
@@ -132,10 +132,10 @@ public class VespaMetrics {
return configuredServiceMetrics;
}
- private Map<DimensionId, String> extractDimensions(Map<DimensionId, String> dimensions, List<ConsumersConfig.Consumer.Metric.Dimension> configuredDimensions) {
+ private Map<DimensionId, String> extractDimensions(Map<DimensionId, String> dimensions, List<Dimension> configuredDimensions) {
if ( ! configuredDimensions.isEmpty()) {
Map<DimensionId, String> dims = new HashMap<>(dimensions);
- configuredDimensions.forEach(d -> dims.put(toDimensionId(d.key()), d.value()));
+ configuredDimensions.forEach(d -> dims.put(d.key(), d.value()));
dimensions = Collections.unmodifiableMap(dims);
}
return dimensions;
@@ -155,8 +155,8 @@ public class VespaMetrics {
}
private Metric metricWithConfigProperties(Metric candidate,
- ConsumersConfig.Consumer.Metric configuredMetric,
- Map<ConsumersConfig.Consumer.Metric, List<ConsumerId>> consumersByMetric) {
+ ConfiguredMetric configuredMetric,
+ Map<ConfiguredMetric, List<ConsumerId>> consumersByMetric) {
Metric metric = candidate.clone();
metric.setDimensions(extractDimensions(candidate.getDimensions(), configuredMetric.dimension()));
metric.setConsumers(extractConsumers(consumersByMetric.get(configuredMetric)));
@@ -169,10 +169,9 @@ public class VespaMetrics {
/**
* Returns all configured metrics (for any consumer) that have the given id as 'name'.
*/
- private static Set<ConsumersConfig.Consumer.Metric> getConfiguredMetrics(String id,
- Set<ConsumersConfig.Consumer.Metric> configuredMetrics) {
+ private static Set<ConfiguredMetric> getConfiguredMetrics(String id, Set<ConfiguredMetric> configuredMetrics) {
return configuredMetrics.stream()
- .filter(m -> m.name().equals(id))
+ .filter(m -> m.id().id.equals(id))
.collect(Collectors.toSet());
}
@@ -180,7 +179,7 @@ public class VespaMetrics {
Metrics systemMetrics = service.getSystemMetrics();
if (systemMetrics.size() == 0) return Optional.empty();
- MetricsPacket.Builder builder = new MetricsPacket.Builder(toServiceId(service.getMonitoringName()));
+ MetricsPacket.Builder builder = new MetricsPacket.Builder(service.getMonitoringName());
setMetaInfo(builder, systemMetrics.getTimeStamp());
builder.putDimension(METRIC_TYPE_DIMENSION_ID, "system")
@@ -223,10 +222,10 @@ public class VespaMetrics {
return aggregatedMetrics;
}
- private List<ConsumersConfig.Consumer.Metric> getMetricDefinitions(ConsumerId consumer) {
+ private List<ConfiguredMetric> getMetricDefinitions(ConsumerId consumer) {
if (metricsConsumers == null) return Collections.emptyList();
- List<ConsumersConfig.Consumer.Metric> definitions = metricsConsumers.getMetricDefinitions(consumer);
+ List<ConfiguredMetric> definitions = metricsConsumers.getMetricDefinitions(consumer);
return definitions == null ? Collections.emptyList() : definitions;
}
@@ -248,8 +247,8 @@ public class VespaMetrics {
String alias = key;
boolean isForwarded = false;
- for (ConsumersConfig.Consumer.Metric metricConsumer : getMetricDefinitions(vespaMetricsConsumerId)) {
- if (metricConsumer.name().equals(key)) {
+ for (ConfiguredMetric metricConsumer : getMetricDefinitions(vespaMetricsConsumerId)) {
+ if (metricConsumer.id().id.equals(key)) {
alias = metricConsumer.outputname();
isForwarded = true;
}
@@ -277,8 +276,8 @@ public class VespaMetrics {
String alias = "";
boolean isForwarded = false;
- for (ConsumersConfig.Consumer.Metric metric : getMetricDefinitions(consumer)) {
- if (metric.name().equals(m.getName())) {
+ for (ConfiguredMetric metric : getMetricDefinitions(consumer)) {
+ if (metric.id().id.equals(m.getName())) {
alias = metric.outputname();
isForwarded = true;
if (description.isEmpty()) {
diff --git a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/ExternalMetrics.java b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/ExternalMetrics.java
index 6818a6b991f..e39f34c43ce 100644
--- a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/ExternalMetrics.java
+++ b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/ExternalMetrics.java
@@ -1,8 +1,8 @@
// Copyright 2020 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package ai.vespa.metricsproxy.metric;
+import ai.vespa.metricsproxy.core.ConfiguredMetric;
import ai.vespa.metricsproxy.core.MetricsConsumers;
-import ai.vespa.metricsproxy.core.ConsumersConfig.Consumer;
import ai.vespa.metricsproxy.metric.model.DimensionId;
import ai.vespa.metricsproxy.metric.model.MetricId;
import ai.vespa.metricsproxy.metric.model.MetricsPacket;
@@ -19,7 +19,6 @@ import java.util.Set;
import java.util.logging.Logger;
import static ai.vespa.metricsproxy.metric.model.DimensionId.toDimensionId;
-import static ai.vespa.metricsproxy.metric.model.MetricId.toMetricId;
import static ai.vespa.metricsproxy.metric.model.ServiceId.toServiceId;
import static java.util.logging.Level.FINE;
import static java.util.stream.Collectors.toCollection;
@@ -66,7 +65,7 @@ public class ExternalMetrics {
private Set<MetricId> metricsToRetain() {
return consumers.getConsumersByMetric().keySet().stream()
- .map(configuredMetric -> toMetricId(configuredMetric.name()))
+ .map(configuredMetric -> configuredMetric.id())
.collect(toCollection(LinkedHashSet::new));
}
@@ -76,9 +75,8 @@ public class ExternalMetrics {
*/
private Map<MetricId, List<String>> outputNamesById() {
Map<MetricId, List<String>> outputNamesById = new LinkedHashMap<>();
- for (Consumer.Metric metric : consumers.getConsumersByMetric().keySet()) {
- MetricId id = toMetricId(metric.name());
- outputNamesById.computeIfAbsent(id, unused -> new ArrayList<>())
+ for (ConfiguredMetric metric : consumers.getConsumersByMetric().keySet()) {
+ outputNamesById.computeIfAbsent(metric.id(), unused -> new ArrayList<>())
.add(metric.outputname());
}
return outputNamesById;
diff --git a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/Dimension.java b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/Dimension.java
new file mode 100644
index 00000000000..b5e61f38ab5
--- /dev/null
+++ b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/Dimension.java
@@ -0,0 +1,13 @@
+// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package ai.vespa.metricsproxy.metric.model;
+
+public final class Dimension {
+ private final DimensionId key;
+ private final String value;
+ public Dimension(DimensionId key, String value) {
+ this.key = key;
+ this.value = value;
+ }
+ public DimensionId key() { return key; }
+ public String value() { return value; }
+}
diff --git a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/DimensionId.java b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/DimensionId.java
index c99e54f2607..3804794804b 100644
--- a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/DimensionId.java
+++ b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/DimensionId.java
@@ -6,7 +6,7 @@ import java.util.Objects;
/**
* @author gjoranv
*/
-public class DimensionId {
+public final class DimensionId {
public final String id;
private DimensionId(String id) { this.id = id; }
diff --git a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/MetricsPacket.java b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/MetricsPacket.java
index 2d5cd9acb5d..4e60838270a 100644
--- a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/MetricsPacket.java
+++ b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/MetricsPacket.java
@@ -6,6 +6,7 @@ import ai.vespa.metricsproxy.metric.Metric;
import java.time.Instant;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
@@ -90,7 +91,7 @@ public class MetricsPacket {
private long timestamp = 0L;
private Map<MetricId, Number> metrics = new LinkedHashMap<>();
private final Map<DimensionId, String> dimensions = new LinkedHashMap<>();
- private final Set<ConsumerId> consumers = new LinkedHashSet<>();
+ private Set<ConsumerId> consumers = Collections.emptySet();
public Builder(ServiceId service) {
Objects.requireNonNull(service, "Service cannot be null.");
@@ -177,7 +178,20 @@ public class MetricsPacket {
}
public Builder addConsumers(Set<ConsumerId> extraConsumers) {
- if (extraConsumers != null) consumers.addAll(extraConsumers);
+ if ((extraConsumers != null) && !extraConsumers.isEmpty()) {
+ if (consumers.isEmpty()) {
+ if (extraConsumers.size() == 1) {
+ consumers = Collections.singleton(extraConsumers.iterator().next());
+ return this;
+ }
+ consumers = new LinkedHashSet<>(extraConsumers.size());
+ } else if (consumers.size() == 1) {
+ var copy = new LinkedHashSet<ConsumerId>(extraConsumers.size() + 1);
+ copy.addAll(consumers);
+ consumers = copy;
+ }
+ consumers.addAll(extraConsumers);
+ }
return this;
}
diff --git a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/node/ServiceHealthGatherer.java b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/node/ServiceHealthGatherer.java
index a11acf07156..4a6eeae474a 100644
--- a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/node/ServiceHealthGatherer.java
+++ b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/node/ServiceHealthGatherer.java
@@ -4,7 +4,6 @@ package ai.vespa.metricsproxy.node;
import ai.vespa.metricsproxy.metric.model.ConsumerId;
import ai.vespa.metricsproxy.metric.model.DimensionId;
import ai.vespa.metricsproxy.metric.model.MetricsPacket;
-import ai.vespa.metricsproxy.metric.model.ServiceId;
import ai.vespa.metricsproxy.service.VespaServices;
import java.time.Instant;
@@ -21,7 +20,7 @@ public class ServiceHealthGatherer {
return vespaServices.getVespaServices()
.stream()
.map(service ->
- new MetricsPacket.Builder(ServiceId.toServiceId(service.getMonitoringName()))
+ new MetricsPacket.Builder(service.getMonitoringName())
.timestamp(Instant.now().getEpochSecond())
.statusMessage(service.getHealth().getStatus().status)
.statusCode(service.getHealth().getStatus().code)
diff --git a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/service/VespaService.java b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/service/VespaService.java
index b069256f527..9d165b2d5a9 100644
--- a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/service/VespaService.java
+++ b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/service/VespaService.java
@@ -4,6 +4,7 @@ package ai.vespa.metricsproxy.service;
import ai.vespa.metricsproxy.metric.HealthMetric;
import ai.vespa.metricsproxy.metric.Metrics;
import ai.vespa.metricsproxy.metric.model.DimensionId;
+import ai.vespa.metricsproxy.metric.model.ServiceId;
import java.util.Collections;
import java.util.Map;
@@ -24,7 +25,7 @@ public class VespaService implements Comparable<VespaService> {
private final String instanceName;
private final String configId;
private final String serviceName;
- private final String monitoringPrefix;
+ private final ServiceId serviceId;
private final Map<DimensionId, String> dimensions;
private volatile int pid = -1;
@@ -67,7 +68,7 @@ public class VespaService implements Comparable<VespaService> {
Map<DimensionId, String> dimensions) {
this.serviceName = serviceName;
this.instanceName = instanceName;
- this.monitoringPrefix = monitoringPrefix;
+ serviceId = ServiceId.toServiceId(monitoringPrefix + SEPARATOR + serviceName);
this.configId = configId;
this.statePort = statePort;
this.dimensions = dimensions;
@@ -81,8 +82,8 @@ public class VespaService implements Comparable<VespaService> {
* The name used for this service in the monitoring system:
* monitoring-system-name.serviceName
*/
- public String getMonitoringName() {
- return monitoringPrefix + SEPARATOR + serviceName;
+ public ServiceId getMonitoringName() {
+ return serviceId;
}
@Override
diff --git a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/service/VespaServices.java b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/service/VespaServices.java
index b0ea7e709a1..8d846d17553 100644
--- a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/service/VespaServices.java
+++ b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/service/VespaServices.java
@@ -105,7 +105,7 @@ public class VespaServices {
List<VespaService> myServices = new ArrayList<>();
for (VespaService s : services) {
log.log(FINE, () -> "getMonitoringServices. service=" + service + ", checking against " + s + ", which has monitoring name " + s.getMonitoringName());
- if (s.getMonitoringName().equalsIgnoreCase(service)) {
+ if (s.getMonitoringName().id.equalsIgnoreCase(service)) {
myServices.add(s);
}
}
diff --git a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/rpc/RpcHealthMetricsTest.java b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/rpc/RpcHealthMetricsTest.java
index ac5fae9a727..ba46c2d1066 100644
--- a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/rpc/RpcHealthMetricsTest.java
+++ b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/rpc/RpcHealthMetricsTest.java
@@ -53,7 +53,7 @@ public class RpcHealthMetricsTest {
assertThat("Status should be failed" + h.getMessage(), h.isOk(), is(false));
assertThat(h.getMessage(), is("SOMETHING FAILED"));
- String jsonRPCMessage = getHealthMetrics(tester, qrserver.getMonitoringName());
+ String jsonRPCMessage = getHealthMetrics(tester, qrserver.getMonitoringName().id);
assertThat(jsonRPCMessage, is(WANTED_RPC_RESPONSE));
}
}
diff --git a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/rpc/RpcMetricsTest.java b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/rpc/RpcMetricsTest.java
index 70970bfe8da..f4acb8c312f 100644
--- a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/rpc/RpcMetricsTest.java
+++ b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/rpc/RpcMetricsTest.java
@@ -103,7 +103,7 @@ public class RpcMetricsTest {
assertThat("#Services should be 1 for config id " + SERVICE_1_CONFIG_ID, services.size(), is(1));
VespaService qrserver = services.get(0);
- assertThat(qrserver.getMonitoringName(), is(MONITORING_SYSTEM + VespaService.SEPARATOR + "qrserver"));
+ assertThat(qrserver.getMonitoringName().id, is(MONITORING_SYSTEM + VespaService.SEPARATOR + "qrserver"));
Metrics metrics = qrserver.getMetrics();
assertThat("Fetched number of metrics is not correct", metrics.size(), is(2));
@@ -134,7 +134,7 @@ public class RpcMetricsTest {
}
private static void verifyMetricsFromRpcRequest(VespaService service, RpcClient client) throws IOException {
- String jsonResponse = getMetricsForYamas(service.getMonitoringName(), client).trim();
+ String jsonResponse = getMetricsForYamas(service.getMonitoringName().id, client).trim();
ArrayNode metrics = (ArrayNode) jsonMapper.readTree(jsonResponse).get("metrics");
assertThat("Expected 3 metric messages", metrics.size(), is(3));
for (int i = 0; i < metrics.size() - 1; i++) { // The last "metric message" contains only status code/message
@@ -193,7 +193,7 @@ public class RpcMetricsTest {
assertNotNull("Did not find expected metric with name 'bar'", m2);
try (RpcClient rpcClient = new RpcClient(tester.rpcPort())) {
- String response = getAllMetricNamesForService(services.get(0).getMonitoringName(), vespaMetricsConsumerId, rpcClient);
+ String response = getAllMetricNamesForService(services.get(0).getMonitoringName().id, vespaMetricsConsumerId, rpcClient);
assertThat(response, is("foo.count=ON;output-name=foo_count,bar.count=OFF,"));
}
}