diff options
27 files changed, 103 insertions, 108 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 index 6148e864373..290a15312a9 100644 --- a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/core/ConfiguredMetric.java +++ b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/core/ConfiguredMetric.java @@ -12,17 +12,17 @@ import java.util.Objects; public class ConfiguredMetric { private final MetricId name; private final String description; - private final String outputname; + private final MetricId outputname; private final List<Dimension> dimension; public ConfiguredMetric(ConsumersConfig.Consumer.Metric m) { name = MetricId.toMetricId(m.name()); - outputname = m.outputname(); + outputname = MetricId.toMetricId(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 MetricId outputname() { return outputname; } public String description() { return description; } public List<Dimension> dimension() { return 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 82f341ec64d..8691b569a95 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 @@ -14,7 +14,6 @@ import java.util.Set; import java.util.function.Function; import java.util.stream.Collector; -import static ai.vespa.metricsproxy.metric.model.ConsumerId.toConsumerId; import static com.yahoo.stream.CustomCollectors.toLinkedMap; import static java.util.Collections.unmodifiableSet; import static java.util.stream.Collectors.collectingAndThen; @@ -35,7 +34,7 @@ public class MetricsConsumers { public MetricsConsumers(ConsumersConfig config) { consumerMetrics = config.consumer().stream().collect( - toUnmodifiableLinkedMap(consumer -> toConsumerId(consumer.name()), consumer -> convert(consumer.metric()))); + toUnmodifiableLinkedMap(consumer -> ConsumerId.toConsumerId(consumer.name()), consumer -> convert(consumer.metric()))); consumersByMetric = createConsumersByMetric(consumerMetrics); } diff --git a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/core/MetricsManager.java b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/core/MetricsManager.java index 53398073314..d098b56c302 100644 --- a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/core/MetricsManager.java +++ b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/core/MetricsManager.java @@ -22,7 +22,6 @@ import java.util.logging.Logger; import java.util.stream.Collectors; import static ai.vespa.metricsproxy.metric.ExternalMetrics.extractConfigserverDimensions; -import static ai.vespa.metricsproxy.metric.model.DimensionId.toDimensionId; import static java.util.logging.Level.FINE; import static java.util.stream.Collectors.toList; @@ -35,7 +34,7 @@ public class MetricsManager { private static final Logger log = Logger.getLogger(MetricsManager.class.getName()); - static final DimensionId VESPA_VERSION = toDimensionId("vespaVersion"); + static final DimensionId VESPA_VERSION = DimensionId.toDimensionId("vespaVersion"); private final VespaServices vespaServices; private final VespaMetrics vespaMetrics; @@ -106,8 +105,9 @@ public class MetricsManager { result.addAll(externalPackets); + Map<DimensionId, String> globalDims = getGlobalDimensions(); return result.stream() - .map(builder -> builder.putDimensionsIfAbsent(getGlobalDimensions())) + .map(builder -> builder.putDimensionsIfAbsent(globalDims)) .map(builder -> builder.putDimensionsIfAbsent(extraDimensions)) .map(builder -> adjustTimestamp(builder, startTime)) .collect(Collectors.toList()); 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 68f53e3de04..0c83d8f73c4 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 @@ -10,13 +10,13 @@ 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.MetricId; import ai.vespa.metricsproxy.metric.model.MetricsPacket; import ai.vespa.metricsproxy.service.VespaService; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; -import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -25,16 +25,14 @@ import java.util.Set; 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 com.google.common.base.Strings.isNullOrEmpty; /** * @author gjoranv */ public class VespaMetrics { - public static final ConsumerId vespaMetricsConsumerId = toConsumerId("Vespa"); + public static final ConsumerId vespaMetricsConsumerId = ConsumerId.toConsumerId("Vespa"); public static final DimensionId METRIC_TYPE_DIMENSION_ID = toDimensionId("metrictype"); public static final DimensionId INSTANCE_DIMENSION_ID = toDimensionId(INTERNAL_SERVICE_ID); @@ -147,8 +145,7 @@ public class VespaMetrics { if ( configuredConsumers.size() == 1) { consumers = Collections.singleton(configuredConsumers.get(0)); } else if (configuredConsumers.size() > 1){ - consumers = new HashSet<>(configuredConsumers); - consumers = Collections.unmodifiableSet(consumers); + consumers = Set.copyOf(configuredConsumers); } } return consumers; @@ -161,7 +158,7 @@ public class VespaMetrics { metric.setDimensions(extractDimensions(candidate.getDimensions(), configuredMetric.dimension())); metric.setConsumers(extractConsumers(consumersByMetric.get(configuredMetric))); - if (!isNullOrEmpty(configuredMetric.outputname())) + if (configuredMetric.outputname() != null && !configuredMetric.outputname().id.isEmpty()) metric.setName(configuredMetric.outputname()); return metric; } @@ -169,9 +166,9 @@ public class VespaMetrics { /** * Returns all configured metrics (for any consumer) that have the given id as 'name'. */ - private static Set<ConfiguredMetric> getConfiguredMetrics(String id, Set<ConfiguredMetric> configuredMetrics) { + private static Set<ConfiguredMetric> getConfiguredMetrics(MetricId id, Set<ConfiguredMetric> configuredMetrics) { return configuredMetrics.stream() - .filter(m -> m.id().id.equals(id)) + .filter(m -> m.id().equals(id)) .collect(Collectors.toSet()); } @@ -243,18 +240,18 @@ public class VespaMetrics { StringBuilder b = new StringBuilder(); for (VespaService s : services) { for (Metric metric : s.getMetrics().getMetrics()) { - String key = metric.getName(); - String alias = key; + MetricId key = metric.getName(); + MetricId alias = key; boolean isForwarded = false; for (ConfiguredMetric metricConsumer : getMetricDefinitions(vespaMetricsConsumerId)) { - if (metricConsumer.id().id.equals(key)) { + if (metricConsumer.id().equals(key)) { alias = metricConsumer.outputname(); isForwarded = true; } } if (isForwarded) { - b.append(formatter.format(s, alias, metric.getValue())).append(" "); + b.append(formatter.format(s, alias.id, metric.getValue())).append(" "); } } } @@ -273,11 +270,11 @@ public class VespaMetrics { for (Metric m : s.getMetrics().getMetrics()) { String description = m.getDescription(); - String alias = ""; + MetricId alias = MetricId.empty; boolean isForwarded = false; for (ConfiguredMetric metric : getMetricDefinitions(consumer)) { - if (metric.id().id.equals(m.getName())) { + if (metric.id().equals(m.getName())) { alias = metric.outputname(); isForwarded = true; if (description.isEmpty()) { @@ -296,7 +293,7 @@ public class VespaMetrics { if (!description.isEmpty()) { buffer.append(";description=").append(description); } - if (!alias.isEmpty()) { + if (!alias.id.isEmpty()) { buffer.append(";output-name=").append(alias); } buffer.append(','); diff --git a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/AggregationKey.java b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/AggregationKey.java index ae79e891e3d..dbc502d24ba 100644 --- a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/AggregationKey.java +++ b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/AggregationKey.java @@ -14,8 +14,8 @@ import java.util.Set; */ public final class AggregationKey { - private Map<DimensionId, String> dimensions; - private Set<ConsumerId> consumers; + private final Map<DimensionId, String> dimensions; + private final Set<ConsumerId> consumers; public AggregationKey(Map<DimensionId, String> dimensions, Set<ConsumerId> consumers) { this.dimensions = dimensions; 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 e39f34c43ce..f8d2184a454 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 @@ -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.ServiceId.toServiceId; import static java.util.logging.Level.FINE; import static java.util.stream.Collectors.toCollection; @@ -33,7 +32,7 @@ public class ExternalMetrics { private static final Logger log = Logger.getLogger(ExternalMetrics.class.getName()); // NOTE: node service id must be kept in sync with the same constant _value_ used in node-admin:Metrics.java - public static final ServiceId VESPA_NODE_SERVICE_ID = toServiceId("vespa.node"); + public static final ServiceId VESPA_NODE_SERVICE_ID = ServiceId.toServiceId("vespa.node"); public static final DimensionId ROLE_DIMENSION = toDimensionId("role"); public static final DimensionId STATE_DIMENSION = toDimensionId("state"); @@ -55,11 +54,9 @@ public class ExternalMetrics { // Split each packet per metric, and re-aggregate based on the metrics each consumer wants. // Then filter out all packages with no consumers. log.log(FINE, () -> "Setting new external metrics with " + externalPackets.size() + " metrics packets."); - externalPackets.forEach(packet -> { - packet.addConsumers(consumers.getAllConsumers()) - .retainMetrics(metricsToRetain()) - .applyOutputNames(outputNamesById()); - }); + externalPackets.forEach(packet -> packet.addConsumers(consumers.getAllConsumers()) + .retainMetrics(metricsToRetain()) + .applyOutputNames(outputNamesById())); metrics = List.copyOf(externalPackets); } @@ -73,8 +70,8 @@ public class ExternalMetrics { * Returns a mapping from metric id to a list of the metric's output names. * Metrics that only have their id as output name are included in the output. */ - private Map<MetricId, List<String>> outputNamesById() { - Map<MetricId, List<String>> outputNamesById = new LinkedHashMap<>(); + private Map<MetricId, List<MetricId>> outputNamesById() { + Map<MetricId, List<MetricId>> outputNamesById = new LinkedHashMap<>(); for (ConfiguredMetric metric : consumers.getConsumersByMetric().keySet()) { outputNamesById.computeIfAbsent(metric.id(), unused -> new ArrayList<>()) .add(metric.outputname()); diff --git a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/Metric.java b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/Metric.java index 63e147bf6b4..8030e03b0ff 100644 --- a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/Metric.java +++ b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/Metric.java @@ -3,6 +3,7 @@ package ai.vespa.metricsproxy.metric; import ai.vespa.metricsproxy.metric.model.ConsumerId; import ai.vespa.metricsproxy.metric.model.DimensionId; +import ai.vespa.metricsproxy.metric.model.MetricId; import java.util.Collections; import java.util.LinkedHashMap; @@ -17,7 +18,7 @@ public class Metric { private final long time; private final Number value; private final String description; - private String name; + private MetricId name; private Map<DimensionId, String> dimensions; private Set<ConsumerId> consumers; @@ -28,7 +29,7 @@ public class Metric { * @param value The numeric value * @param time The timestamp of this metric in seconds */ - public Metric(String name, Number value, long time, Map<DimensionId, String> dimensions, String description) { + public Metric(MetricId name, Number value, long time, Map<DimensionId, String> dimensions, String description) { this.time = time; this.value = value; this.name = name; @@ -36,11 +37,11 @@ public class Metric { this.description = description; } - public Metric(String name, Number value, long timestamp) { + public Metric(MetricId name, Number value, long timestamp) { this(name, value, timestamp, Collections.emptyMap(), ""); } - public Metric(String name, Number value) { + public Metric(MetricId name, Number value) { this(name, value, System.currentTimeMillis() / 1000); } @@ -72,14 +73,14 @@ public class Metric { * * @param name The name to use for this metric */ - public void setName(String name) { + public void setName(MetricId name) { this.name = name; } /** * @return The name of the metric */ - public String getName() { + public MetricId getName() { return name; } @@ -94,7 +95,7 @@ public class Metric { public String toString() { return "Metric{" + "time=" + time + - ", name=" + name + + ", name=" + name.id + ", value='" + value + '\'' + ", dimensions=" + dimensions + '}'; diff --git a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/Metrics.java b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/Metrics.java index b45e7743640..143b999cf1c 100644 --- a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/Metrics.java +++ b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/Metrics.java @@ -1,6 +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.metric.model.MetricId; + import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -65,7 +67,7 @@ public class Metrics { * @param key metric name * @return the metric, or null */ - public Metric getMetric(String key) { + public Metric getMetric(MetricId key) { isFrozen = true; for (Metric m: metrics) { if (m.getName().equals(key)) { diff --git a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/ConsumerId.java b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/ConsumerId.java index 795d1005b10..555a49228ef 100644 --- a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/ConsumerId.java +++ b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/ConsumerId.java @@ -28,9 +28,7 @@ public class ConsumerId { @Override public String toString() { - return "ConsumerId{" + - "id='" + id + '\'' + - '}'; + return id; } } 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 3804794804b..b99f720cb03 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 @@ -28,8 +28,6 @@ public final class DimensionId { @Override public String toString() { - return "DimensionId{" + - "id='" + id + '\'' + - '}'; + return id; } } diff --git a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/MetricId.java b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/MetricId.java index 9be67607d4d..dcee4100f98 100644 --- a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/MetricId.java +++ b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/MetricId.java @@ -8,6 +8,7 @@ import java.util.Objects; */ public class MetricId { + public static final MetricId empty = toMetricId(""); public final String id; private MetricId(String id) { this.id = id; } @@ -28,9 +29,7 @@ public class MetricId { @Override public String toString() { - return "MetricId{" + - "id='" + id + '\'' + - '}'; + return 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 4e60838270a..dc289c6dac7 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 @@ -15,7 +15,6 @@ import java.util.Objects; import java.util.Set; import java.util.function.Function; -import static ai.vespa.metricsproxy.metric.model.MetricId.toMetricId; import static java.util.Collections.unmodifiableList; import static java.util.Collections.unmodifiableMap; import static java.util.stream.Collectors.joining; @@ -121,8 +120,7 @@ public class MetricsPacket { public Builder putMetrics(Collection<Metric> extraMetrics) { if (extraMetrics != null) - extraMetrics.forEach(metric -> metrics.put(toMetricId(metric.getName()), - metric.getValue().doubleValue())); + extraMetrics.forEach(metric -> metrics.put(metric.getName(), metric.getValue().doubleValue())); return this; } @@ -136,11 +134,11 @@ public class MetricsPacket { return this; } - public Builder applyOutputNames(Map<MetricId, List<String>> outputNamesById) { + public Builder applyOutputNames(Map<MetricId, List<MetricId>> outputNamesById) { Map<MetricId, Number> newMetrics = new LinkedHashMap<>(); outputNamesById.forEach((id, outputNames) -> { if (metrics.containsKey(id)) - outputNames.forEach(outputName -> newMetrics.put(toMetricId(outputName), metrics.get(id))); + outputNames.forEach(outputName -> newMetrics.put(outputName, metrics.get(id))); }); metrics = newMetrics; return this; diff --git a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/ServiceId.java b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/ServiceId.java index 14f1a67bef3..bbc958fcda5 100644 --- a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/ServiceId.java +++ b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/ServiceId.java @@ -28,9 +28,7 @@ public class ServiceId { @Override public String toString() { - return "ServiceId{" + - "id='" + id + '\'' + - '}'; + return id; } } diff --git a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/json/GenericJsonUtil.java b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/json/GenericJsonUtil.java index e249338c318..c04b6ea66ad 100644 --- a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/json/GenericJsonUtil.java +++ b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/json/GenericJsonUtil.java @@ -18,7 +18,6 @@ import java.util.stream.Collectors; import static ai.vespa.metricsproxy.metric.ExternalMetrics.VESPA_NODE_SERVICE_ID; 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 ai.vespa.metricsproxy.metric.model.json.JacksonUtil.createObjectMapper; import static java.util.Collections.emptyList; import static java.util.Collections.singletonList; @@ -139,7 +138,7 @@ public class GenericJsonUtil { } private static MetricsPacket.Builder newServicePacket(GenericService service) { - return new MetricsPacket.Builder(toServiceId(service.name)) + return new MetricsPacket.Builder(ServiceId.toServiceId(service.name)) .statusCode(StatusCode.fromString(service.status.code).ordinal()) .statusMessage(service.status.description) .timestamp(service.timestamp); diff --git a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/json/YamasJsonModel.java b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/json/YamasJsonModel.java index 38038fda66a..f5b7f67038a 100644 --- a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/json/YamasJsonModel.java +++ b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/json/YamasJsonModel.java @@ -4,6 +4,7 @@ package ai.vespa.metricsproxy.metric.model.json; import ai.vespa.metricsproxy.metric.Metric; import ai.vespa.metricsproxy.metric.model.ConsumerId; import ai.vespa.metricsproxy.metric.model.DimensionId; +import ai.vespa.metricsproxy.metric.model.MetricId; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; @@ -55,7 +56,7 @@ public class YamasJsonModel { // NOTE: do not rename to 'setMetrics', as jackson will try to use it. public void resetMetrics(List<Metric> newMetrics) { metrics = new LinkedHashMap<>(); - newMetrics.forEach(metric -> metrics.put(metric.getName(), metric.getValue().doubleValue())); + newMetrics.forEach(metric -> metrics.put(metric.getName().id, metric.getValue().doubleValue())); } /** @@ -106,7 +107,7 @@ public class YamasJsonModel { if (metrics == null) return emptyList(); return metrics.keySet().stream() - .map(name -> new Metric(name, metrics.get(name))) + .map(name -> new Metric(MetricId.toMetricId(name), metrics.get(name))) .collect(Collectors.toList()); } diff --git a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/json/YamasJsonUtil.java b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/json/YamasJsonUtil.java index 4413a9ebc2e..4dbe1a9a982 100644 --- a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/json/YamasJsonUtil.java +++ b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/json/YamasJsonUtil.java @@ -3,6 +3,7 @@ package ai.vespa.metricsproxy.metric.model.json; import ai.vespa.metricsproxy.metric.model.ConsumerId; import ai.vespa.metricsproxy.metric.model.MetricsPacket; +import ai.vespa.metricsproxy.metric.model.ServiceId; import com.fasterxml.jackson.core.JsonFactory; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.ObjectMapper; @@ -17,7 +18,6 @@ import java.util.logging.Logger; import java.util.stream.Collectors; import static ai.vespa.metricsproxy.http.ValuesFetcher.defaultMetricsConsumerId; -import static ai.vespa.metricsproxy.metric.model.ServiceId.toServiceId; import static com.yahoo.stream.CustomCollectors.toLinkedMap; import static java.util.Collections.emptyList; import static java.util.logging.Level.WARNING; @@ -34,7 +34,7 @@ public class YamasJsonUtil { if (jsonModel.application == null) throw new IllegalArgumentException("Service id cannot be null"); - return new MetricsPacket.Builder(toServiceId(jsonModel.application)) + return new MetricsPacket.Builder(ServiceId.toServiceId(jsonModel.application)) .statusCode(jsonModel.status_code) .statusMessage(jsonModel.status_msg) .timestamp(jsonModel.timestamp) diff --git a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/service/MetricsParser.java b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/service/MetricsParser.java index 20c2325e1f3..48621b9abab 100644 --- a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/service/MetricsParser.java +++ b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/service/MetricsParser.java @@ -4,6 +4,7 @@ package ai.vespa.metricsproxy.service; import ai.vespa.metricsproxy.metric.Metric; import ai.vespa.metricsproxy.metric.Metrics; import ai.vespa.metricsproxy.metric.model.DimensionId; +import ai.vespa.metricsproxy.metric.model.MetricId; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonToken; import com.fasterxml.jackson.databind.JsonNode; @@ -30,9 +31,7 @@ public class MetricsParser { static Metrics parse(String data) throws IOException { return parse(jsonMapper.createParser(data)); } - static Metrics parse(byte [] data) throws IOException { - return parse(jsonMapper.createParser(data)); - } + static Metrics parse(InputStream data) throws IOException { return parse(jsonMapper.createParser(data)); } @@ -155,8 +154,8 @@ public class MetricsParser { if (value == null) { throw new IllegalArgumentException("Value for aggregator '" + aggregator + "' is not a number"); } - StringBuilder metricName = (new StringBuilder()).append(name).append(".").append(aggregator); - metrics.add(new Metric(metricName.toString(), value, timestamp, dim, description)); + String metricName = new StringBuilder().append(name).append(".").append(aggregator).toString(); + metrics.add(new Metric(MetricId.toMetricId(metricName), value, timestamp, dim, description)); } } } diff --git a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/service/SystemPoller.java b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/service/SystemPoller.java index 5d119fc30e6..fbccd3dc066 100644 --- a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/service/SystemPoller.java +++ b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/service/SystemPoller.java @@ -3,6 +3,8 @@ package ai.vespa.metricsproxy.service; import ai.vespa.metricsproxy.metric.Metric; import ai.vespa.metricsproxy.metric.Metrics; +import ai.vespa.metricsproxy.metric.model.MetricId; + import java.util.logging.Level; import java.io.BufferedReader; @@ -115,8 +117,8 @@ public class SystemPoller { long[] size = getMemoryUsage(s); log.log(Level.FINE, () -> "Updating memory metric for service " + s); - metrics.add(new Metric("memory_virt", size[memoryTypeVirtual], startTime / 1000)); - metrics.add(new Metric("memory_rss", size[memoryTypeResident], startTime / 1000)); + metrics.add(new Metric(MetricId.toMetricId("memory_virt"), size[memoryTypeVirtual], startTime / 1000)); + metrics.add(new Metric(MetricId.toMetricId("memory_rss"), size[memoryTypeResident], startTime / 1000)); long procJiffies = getPidJiffies(s); if (lastTotalCpuJiffies >= 0 && lastCpuJiffiesMetrics.containsKey(s)) { @@ -124,7 +126,7 @@ public class SystemPoller { long diff = procJiffies - last; if (diff >= 0) { - metrics.add(new Metric("cpu", 100 * ((double) diff) / (sysJiffies - lastTotalCpuJiffies), startTime / 1000)); + metrics.add(new Metric(MetricId.toMetricId("cpu"), 100 * ((double) diff) / (sysJiffies - lastTotalCpuJiffies), startTime / 1000)); } } lastCpuJiffiesMetrics.put(s, procJiffies); diff --git a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/core/MetricsManagerTest.java b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/core/MetricsManagerTest.java index fd1961fc168..36a6aa01620 100644 --- a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/core/MetricsManagerTest.java +++ b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/core/MetricsManagerTest.java @@ -11,6 +11,7 @@ import ai.vespa.metricsproxy.metric.dimensions.ApplicationDimensionsConfig; import ai.vespa.metricsproxy.metric.dimensions.NodeDimensions; import ai.vespa.metricsproxy.metric.dimensions.NodeDimensionsConfig; 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.metric.model.ServiceId; import ai.vespa.metricsproxy.service.DownService; @@ -54,7 +55,7 @@ public class MetricsManagerTest { new DummyService(0, SERVICE_0_ID), new DummyService(1, SERVICE_1_ID)); - private static final String WHITELISTED_METRIC_ID = "whitelisted"; + private static final MetricId WHITELISTED_METRIC_ID = toMetricId("whitelisted"); @Before public void setupMetricsManager() { @@ -127,7 +128,7 @@ public class MetricsManagerTest { VespaService service0 = testServices.get(0); Metrics oldSystemMetrics = service0.getSystemMetrics(); - service0.getSystemMetrics().add(new Metric("cpu", 1)); + service0.getSystemMetrics().add(new Metric(toMetricId("cpu"), 1)); List<MetricsPacket> packets = metricsManager.getMetrics(testServices, Instant.EPOCH); assertEquals(3, packets.size()); @@ -154,7 +155,7 @@ public class MetricsManagerTest { public void extra_metrics_packets_without_whitelisted_metrics_are_not_added() { metricsManager.setExtraMetrics(ImmutableList.of( new MetricsPacket.Builder(toServiceId("foo")) - .putMetrics(ImmutableList.of(new Metric("not-whitelisted", 0))))); + .putMetrics(ImmutableList.of(new Metric(toMetricId("not-whitelisted"), 0))))); List<MetricsPacket> packets = metricsManager.getMetrics(testServices, Instant.EPOCH); assertThat(packets.size(), is(2)); @@ -243,8 +244,8 @@ public class MetricsManagerTest { .consumer(new Consumer.Builder() .name(vespaMetricsConsumerId.id) .metric(new Consumer.Metric.Builder() - .name(WHITELISTED_METRIC_ID) - .outputname(WHITELISTED_METRIC_ID)) + .name(WHITELISTED_METRIC_ID.id) + .outputname(WHITELISTED_METRIC_ID.id)) .metric(new Consumer.Metric.Builder() .name(DummyService.METRIC_1) .outputname(DummyService.METRIC_1) diff --git a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/http/HttpHandlerTestBase.java b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/http/HttpHandlerTestBase.java index ab586334baa..4bfb80e0f07 100644 --- a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/http/HttpHandlerTestBase.java +++ b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/http/HttpHandlerTestBase.java @@ -11,6 +11,7 @@ import ai.vespa.metricsproxy.metric.dimensions.ApplicationDimensions; import ai.vespa.metricsproxy.metric.dimensions.ApplicationDimensionsConfig; import ai.vespa.metricsproxy.metric.dimensions.NodeDimensions; import ai.vespa.metricsproxy.metric.dimensions.NodeDimensionsConfig; +import ai.vespa.metricsproxy.metric.model.MetricId; import ai.vespa.metricsproxy.metric.model.MetricsPacket; import ai.vespa.metricsproxy.service.DownService; import ai.vespa.metricsproxy.service.DummyService; @@ -57,7 +58,7 @@ public class HttpHandlerTestBase { metricsManager.setExtraMetrics(ImmutableList.of( new MetricsPacket.Builder(VESPA_NODE_SERVICE_ID) .timestamp(Instant.now().getEpochSecond()) - .putMetrics(ImmutableList.of(new Metric(CPU_METRIC, 12.345))))); + .putMetrics(ImmutableList.of(new Metric(MetricId.toMetricId(CPU_METRIC), 12.345))))); return metricsManager; } diff --git a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/metric/MetricsTest.java b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/metric/MetricsTest.java index 84f40592f46..57446395afe 100644 --- a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/metric/MetricsTest.java +++ b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/metric/MetricsTest.java @@ -8,6 +8,7 @@ import org.junit.Test; import java.util.HashMap; import java.util.Map; +import static ai.vespa.metricsproxy.metric.model.MetricId.toMetricId; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; @@ -21,16 +22,16 @@ public class MetricsTest { public void testIterator() { Metrics m = new Metrics(); long now = System.currentTimeMillis() / 1000; - m.add(new Metric("a", 1, now)); - m.add(new Metric("b", 2.5, now)); + m.add(new Metric(toMetricId("a"), 1, now)); + m.add(new Metric(toMetricId("b"), 2.5, now)); //should expire after 0 seconds - m.add(new Metric("c", 2, now)); + m.add(new Metric(toMetricId("c"), 2, now)); Map<String, Number> map = new HashMap<>(); for (Metric metric: m.getMetrics()) { - String k = metric.getName(); + String k = metric.getName().id; assertThat(map.containsKey(k), is(false)); map.put(k, metric.getValue()); @@ -43,9 +44,9 @@ public class MetricsTest { @Test public void testBasicMetric() { Metrics m = new Metrics(); - m.add(new Metric("count", 1, System.currentTimeMillis() / 1000)); + m.add(new Metric(toMetricId("count"), 1, System.currentTimeMillis() / 1000)); assertThat(m.getMetrics().size(), is(1)); - assertThat(m.getMetrics().get(0).getName(), is("count")); + assertThat(m.getMetrics().get(0).getName(), is(toMetricId("count"))); } @Test diff --git a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/metric/model/MetricsPacketTest.java b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/metric/model/MetricsPacketTest.java index 78c80689299..7c16fe9f8f6 100644 --- a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/metric/model/MetricsPacketTest.java +++ b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/metric/model/MetricsPacketTest.java @@ -7,7 +7,6 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import org.junit.Test; -import java.util.Collections; import java.util.List; import java.util.Map; @@ -66,8 +65,8 @@ public class MetricsPacketTest { public void builder_can_retain_subset_of_metrics() { MetricsPacket packet = new MetricsPacket.Builder(toServiceId("foo")) .putMetrics(ImmutableList.of( - new Metric("remove", 1), - new Metric("keep", 2))) + new Metric(toMetricId("remove"), 1), + new Metric(toMetricId("keep"), 2))) .retainMetrics(ImmutableSet.of(toMetricId("keep"), toMetricId("non-existent"))) .build(); @@ -87,17 +86,17 @@ public class MetricsPacketTest { MetricId THREE_ID = toMetricId(THREE); MetricId NON_EXISTENT_ID = toMetricId(NON_EXISTENT); - Map<MetricId, List<String>> outputNamesById = ImmutableMap.of( - toMetricId(ONE), ImmutableList.of(ONE), - toMetricId(TWO), ImmutableList.of(TWO, "dos"), - toMetricId(THREE), ImmutableList.of("3"), - toMetricId(NON_EXISTENT), ImmutableList.of(NON_EXISTENT)); + Map<MetricId, List<MetricId>> outputNamesById = ImmutableMap.of( + ONE_ID, ImmutableList.of(ONE_ID), + TWO_ID, ImmutableList.of(TWO_ID, toMetricId("dos")), + THREE_ID, ImmutableList.of(toMetricId("3")), + NON_EXISTENT_ID, ImmutableList.of(NON_EXISTENT_ID)); MetricsPacket packet = new MetricsPacket.Builder(toServiceId("foo")) .putMetrics(ImmutableList.of( - new Metric(ONE, 1), - new Metric(TWO, 2), - new Metric(THREE, 3))) + new Metric(ONE_ID, 1), + new Metric(TWO_ID, 2), + new Metric(THREE_ID, 3))) .applyOutputNames(outputNamesById) .build(); 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 f4acb8c312f..f13e63edc81 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 @@ -19,6 +19,7 @@ import org.junit.Test; import java.io.IOException; import java.util.List; +import static ai.vespa.metricsproxy.metric.model.MetricId.toMetricId; import static ai.vespa.metricsproxy.TestUtil.getFileContents; import static ai.vespa.metricsproxy.core.VespaMetrics.vespaMetricsConsumerId; import static ai.vespa.metricsproxy.metric.model.DimensionId.toDimensionId; @@ -107,9 +108,9 @@ public class RpcMetricsTest { Metrics metrics = qrserver.getMetrics(); assertThat("Fetched number of metrics is not correct", metrics.size(), is(2)); - Metric m = metrics.getMetric("foo.count"); + Metric m = metrics.getMetric(toMetricId("foo.count")); assertNotNull("Did not find expected metric with name 'foo.count'", m); - Metric m2 = metrics.getMetric("bar.count"); + Metric m2 = metrics.getMetric(toMetricId("bar.count")); assertNotNull("Did not find expected metric with name 'bar.count'", m2); try (RpcClient rpcClient = new RpcClient(tester.rpcPort())) { @@ -160,7 +161,7 @@ public class RpcMetricsTest { private void verfiyMetricsFromServiceObject(VespaService service) { Metrics storageMetrics = service.getMetrics(); assertThat(storageMetrics.size(), is(2)); - Metric foo = storageMetrics.getMetric("foo.count"); + Metric foo = storageMetrics.getMetric(toMetricId("foo.count")); assertNotNull("Did not find expected metric with name 'foo.count'", foo); assertThat("Expected 2 dimensions for metric foo", foo.getDimensions().size(), is(2)); assertThat("Metric foo did not contain correct dimension mapping for key = foo.count", foo.getDimensions().containsKey(toDimensionId("foo")), is(true)); @@ -186,10 +187,10 @@ public class RpcMetricsTest { assertThat(services.size(), is(1)); Metrics metrics = services.get(0).getMetrics(); assertThat("Fetched number of metrics is not correct", metrics.size(), is(2)); - Metric m = metrics.getMetric("foo.count"); + Metric m = metrics.getMetric(toMetricId("foo.count")); assertNotNull("Did not find expected metric with name 'foo.count'", m); - Metric m2 = metrics.getMetric("bar.count"); + Metric m2 = metrics.getMetric(toMetricId("bar.count")); assertNotNull("Did not find expected metric with name 'bar'", m2); try (RpcClient rpcClient = new RpcClient(tester.rpcPort())) { diff --git a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/service/ContainerServiceTest.java b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/service/ContainerServiceTest.java index 7ff179e5528..1fbdaadab25 100644 --- a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/service/ContainerServiceTest.java +++ b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/service/ContainerServiceTest.java @@ -9,6 +9,7 @@ import org.junit.Test; import static ai.vespa.metricsproxy.TestUtil.getFileContents; import static ai.vespa.metricsproxy.metric.model.DimensionId.toDimensionId; +import static ai.vespa.metricsproxy.metric.model.MetricId.toMetricId; import static ai.vespa.metricsproxy.service.RemoteMetricsFetcher.METRICS_PATH; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; @@ -40,7 +41,7 @@ public class ContainerServiceTest { int count = 0; VespaService service = VespaService.create("service1", "id", httpServer.port()); for (Metric m : service.getMetrics().getMetrics()) { - if (m.getName().equals("queries.rate")) { + if (m.getName().equals(toMetricId("queries.rate"))) { count++; System.out.println("Name: " + m.getName() + " value: " + m.getValue()); if (m.getDimensions().get(toDimensionId("chain")).equals("asvBlendingResult")) { diff --git a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/service/DummyService.java b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/service/DummyService.java index 7b36e1d4b8b..ccbb237ae37 100644 --- a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/service/DummyService.java +++ b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/service/DummyService.java @@ -3,6 +3,7 @@ package ai.vespa.metricsproxy.service; import ai.vespa.metricsproxy.metric.Metric; import ai.vespa.metricsproxy.metric.Metrics; +import ai.vespa.metricsproxy.metric.model.MetricId; /** * @author Unknown @@ -24,8 +25,8 @@ public class DummyService extends VespaService { Metrics m = new Metrics(); long timestamp = System.currentTimeMillis() / 1000; - m.add(new Metric(METRIC_1, 5 * num + 1, timestamp)); - m.add(new Metric(METRIC_2, 1.3 * num + 1.05, timestamp)); + m.add(new Metric(MetricId.toMetricId(METRIC_1), 5 * num + 1, timestamp)); + m.add(new Metric(MetricId.toMetricId(METRIC_2), 1.3 * num + 1.05, timestamp)); return m; } diff --git a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/service/MetricsFetcherTest.java b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/service/MetricsFetcherTest.java index 57185d55131..defcf4bfaaa 100644 --- a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/service/MetricsFetcherTest.java +++ b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/service/MetricsFetcherTest.java @@ -3,6 +3,7 @@ package ai.vespa.metricsproxy.service; import ai.vespa.metricsproxy.TestUtil; import ai.vespa.metricsproxy.metric.Metrics; +import ai.vespa.metricsproxy.metric.model.MetricId; import org.junit.Test; import static org.hamcrest.CoreMatchers.is; @@ -20,8 +21,8 @@ public class MetricsFetcherTest { RemoteMetricsFetcher fetcher = new RemoteMetricsFetcher(new DummyService(0, "dummy/id/0"), port); Metrics metrics = fetcher.createMetrics(jsonData, 0); assertThat(metrics.size(), is(10)); - assertThat(metrics.getMetric("query_hits.count").getValue().intValue(), is(28)); - assertThat(metrics.getMetric("queries.rate").getValue().doubleValue(), is(0.4667)); + assertThat(metrics.getMetric(MetricId.toMetricId("query_hits.count")).getValue().intValue(), is(28)); + assertThat(metrics.getMetric(MetricId.toMetricId("queries.rate")).getValue().doubleValue(), is(0.4667)); assertThat(metrics.getTimeStamp(), is(1334134700L)); } diff --git a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/service/VespaServiceTest.java b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/service/VespaServiceTest.java index 9400d74fa3a..87b55b3b00b 100644 --- a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/service/VespaServiceTest.java +++ b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/service/VespaServiceTest.java @@ -2,6 +2,7 @@ package ai.vespa.metricsproxy.service; import ai.vespa.metricsproxy.metric.Metrics; +import ai.vespa.metricsproxy.metric.model.MetricId; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -53,7 +54,7 @@ public class VespaServiceTest { public void testMetricsFetching() { VespaService service = VespaService.create("service1", "id", httpServer.port()); Metrics metrics = service.getMetrics(); - assertThat(metrics.getMetric("queries.count").getValue().intValue(), is(28)); + assertThat(metrics.getMetric(MetricId.toMetricId("queries.count")).getValue().intValue(), is(28)); // Shutdown server and check that no metrics are returned (should use empty metrics // when unable to fetch new metrics) |