diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2021-12-15 12:31:57 +0100 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2021-12-15 12:31:57 +0100 |
commit | 7d64109e647c5a321cf989006e9e99b873abcda9 (patch) | |
tree | 6168a579383ac0b824f4a19509c09225528932bb /metrics-proxy/src/main | |
parent | 08ce958004934a27fd6544600ffe2a8d6faa0a46 (diff) |
Avoid creating many sets and lists containing the same list of consumers.
Use a dictionary to keep track of the unique ones.
Diffstat (limited to 'metrics-proxy/src/main')
3 files changed, 28 insertions, 49 deletions
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 b08c3f4d668..02ccd2c988c 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 @@ -36,7 +36,7 @@ public class MetricsPacket { public final ServiceId service; private final Map<MetricId, Number> metrics; private final Map<DimensionId, String> dimensions; - private final List<ConsumerId> consumers; + private final Set<ConsumerId> consumers; private MetricsPacket(int statusCode, String statusMessage, long timestamp, ServiceId service, Map<MetricId, Number> metrics, Map<DimensionId, String> dimensions, Set<ConsumerId> consumers ) { @@ -46,7 +46,7 @@ public class MetricsPacket { this.service = service; this.metrics = metrics; this.dimensions = dimensions; - this.consumers = new ArrayList<>(consumers); + this.consumers = Set.copyOf(consumers); } public Map<MetricId, Number> metrics() { @@ -57,8 +57,8 @@ public class MetricsPacket { return unmodifiableMap(dimensions); } - public List<ConsumerId> consumers() { - return unmodifiableList(consumers); + public Set<ConsumerId> consumers() { + return consumers; } @Override 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 e86ab2ab41a..d2be7be25d1 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 @@ -60,29 +60,6 @@ public class YamasJsonModel { } /** - * Convenience method to add targets to the routing object - * - * @param names Namespaces E.g "Vespa" - */ - public void addRouting(Set<ConsumerId> names) { - // Setup routing structure if not already existing - if (routing == null) { - routing = new HashMap<>(); - } - - if (! routing.containsKey("yamas")) { - routing.put("yamas", new YamasJsonModel.YamasJsonNamespace()); - } - YamasJsonModel.YamasJsonNamespace namespace = routing.get("yamas"); - - if (namespace.namespaces == null) { - namespace.namespaces = new ArrayList<>(); - } - - namespace.namespaces.addAll(names.stream().map(consumer -> consumer.id).collect(Collectors.toList())); - } - - /** * Convenience method to add dimensions */ public void addDimensions(Map<DimensionId, String> additionalDimensions, boolean replace) { 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 19bcdbfdb74..602879aa0b6 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 @@ -7,13 +7,14 @@ 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; -import com.google.common.collect.ImmutableMap; +import com.yahoo.concurrent.CopyOnWriteHashMap; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.logging.Logger; import java.util.stream.Collectors; @@ -30,6 +31,7 @@ public class YamasJsonUtil { static final String YAMAS_ROUTING = "yamas"; + private static final Map<Set<ConsumerId>, Map<String, YamasJsonModel.YamasJsonNamespace>> globalNameSpaces = new CopyOnWriteHashMap<>(); public static MetricsPacket.Builder toMetricsPacketBuilder(YamasJsonModel jsonModel) { if (jsonModel.application == null) throw new IllegalArgumentException("Service id cannot be null"); @@ -79,12 +81,12 @@ public class YamasJsonUtil { } } - private static YamasJsonModel getStatusYamasModel(String statusMessage, int statusCode, Collection<ConsumerId> consumers) { + private static YamasJsonModel getStatusYamasModel(String statusMessage, int statusCode, Set<ConsumerId> consumers) { YamasJsonModel model = new YamasJsonModel(); model.status_code = statusCode; model.status_msg = statusMessage; model.application = "yms_check_vespa"; - model.routing = ImmutableMap.of(YAMAS_ROUTING, toYamasJsonNamespaces(consumers)); + model.routing = computeIfAbsent(consumers); return model; } @@ -99,38 +101,38 @@ public class YamasJsonUtil { model.application = packet.service.id; model.timestamp = (packet.timestamp == 0L) ? null : packet.timestamp; - if (packet.metrics().isEmpty()) model.metrics = null; - else { - model.metrics = packet.metrics().entrySet().stream().collect( + model.metrics = (packet.metrics().isEmpty()) + ? null + : packet.metrics().entrySet().stream().collect( toLinkedMap(id2metric -> id2metric.getKey().id, id2metric -> id2metric.getValue().doubleValue())); - } - if (packet.dimensions().isEmpty()) model.dimensions = null; - else { - model.dimensions = packet.dimensions().entrySet() + model.dimensions = (packet.dimensions().isEmpty()) + ? null + : packet.dimensions().entrySet() .stream() .filter(entry -> entry.getKey() != null && entry.getValue() != null) - .collect(toLinkedMap( - id2dim -> id2dim.getKey().id, - Map.Entry::getValue) - ); - } + .collect(toLinkedMap(id2dim -> id2dim.getKey().id, Map.Entry::getValue)); - YamasJsonModel.YamasJsonNamespace namespaces = toYamasJsonNamespaces(packet.consumers()); - if (namespaces.namespaces.isEmpty()) model.routing = null; - else model.routing = ImmutableMap.of(YAMAS_ROUTING, namespaces); + model.routing = computeIfAbsent(packet.consumers()); return model; } - private static YamasJsonModel.YamasJsonNamespace toYamasJsonNamespaces(Collection<ConsumerId> consumers) { - YamasJsonModel.YamasJsonNamespace namespaces = new YamasJsonModel.YamasJsonNamespace(); - namespaces.namespaces = consumers.stream() + private static Map<String, YamasJsonModel.YamasJsonNamespace> computeIfAbsent(Set<ConsumerId> consumers) { + return globalNameSpaces.computeIfAbsent(consumers, YamasJsonUtil::createYamasJson); + } + + private static Map<String, YamasJsonModel.YamasJsonNamespace> createYamasJson(Set<ConsumerId> consumers) { + List<String> namespaces = consumers.stream() .filter(consumerId -> consumerId != defaultMetricsConsumerId) .map(consumer -> consumer.id) .collect(Collectors.toList()); - return namespaces; + if (namespaces.isEmpty()) return null; + + YamasJsonModel.YamasJsonNamespace yamasJsonNamespace = new YamasJsonModel.YamasJsonNamespace(); + yamasJsonNamespace.namespaces = namespaces; + return Map.of(YAMAS_ROUTING, yamasJsonNamespace); } } |