From 12e7c4d8e98d7e4afff79cba842ab0301da4f8b3 Mon Sep 17 00:00:00 2001 From: James Baker Date: Mon, 18 Jun 2018 18:31:15 +0100 Subject: [PATCH 1/9] TaggedMetricRegistry composability This is a very quick thing to throw up, but basically internally we have a bunch of producers of the same set of metrics, and we'd like to be able to differentiate them (with tags). With this PR, we'd be able to have multiple metric registries, and merge them into a single metric registry. Please don't merge, since there are a few things I need to think through, but wanted to make sure that this doesn't sound super unreasonable. --- .../registry/DefaultTaggedMetricRegistry.java | 25 ++++++++++++- .../registry/DropwizardTaggedMetricSet.java | 37 +++++++++++++++++++ .../registry/TaggedMetricRegistry.java | 25 +++++++++---- .../metrics/registry/TaggedMetricSet.java | 29 +++++++++++++++ 4 files changed, 106 insertions(+), 10 deletions(-) create mode 100644 tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/DropwizardTaggedMetricSet.java create mode 100644 tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/TaggedMetricSet.java diff --git a/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/DefaultTaggedMetricRegistry.java b/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/DefaultTaggedMetricRegistry.java index 1c535e88b..33d905021 100644 --- a/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/DefaultTaggedMetricRegistry.java +++ b/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/DefaultTaggedMetricRegistry.java @@ -24,7 +24,7 @@ import com.codahale.metrics.Metric; import com.codahale.metrics.Timer; import com.google.auto.service.AutoService; -import java.util.Collections; +import com.google.common.collect.ImmutableMap; import java.util.Map; import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; @@ -36,6 +36,7 @@ public final class DefaultTaggedMetricRegistry implements TaggedMetricRegistry { private static final TaggedMetricRegistry DEFAULT = new DefaultTaggedMetricRegistry(); private final Map registry = new ConcurrentHashMap<>(); + private final Map, TaggedMetricSet> taggedRegistries = new ConcurrentHashMap<>(); public DefaultTaggedMetricRegistry() {} @@ -93,7 +94,17 @@ public Timer timer(MetricName metricName, Supplier timerSupplier) { @Override public Map getMetrics() { - return Collections.unmodifiableMap(registry); + ImmutableMap.Builder result = ImmutableMap.builder() + .putAll(registry); + taggedRegistries.forEach((tags, metrics) -> metrics.getMetrics() + .forEach((metricName, metric) -> result.put( + MetricName.builder() + .from(metricName) + .putAllSafeTags(tags) + .build(), + metric))); + + return result.build(); } @Override @@ -101,6 +112,16 @@ public Optional remove(MetricName metricName) { return Optional.ofNullable(registry.remove(metricName)); } + @Override + public void addMetrics(Map tags, TaggedMetricSet other) { + taggedRegistries.put(tags, other); + } + + @Override + public void removeMetrics(Map tags) { + taggedRegistries.remove(tags); + } + private T getOrAdd(MetricName metricName, Class metricClass, Supplier metricSupplier) { Metric metric = registry.computeIfAbsent(metricName, name -> metricSupplier.get()); if (!metricClass.isInstance(metric)) { diff --git a/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/DropwizardTaggedMetricSet.java b/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/DropwizardTaggedMetricSet.java new file mode 100644 index 000000000..67b25f527 --- /dev/null +++ b/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/DropwizardTaggedMetricSet.java @@ -0,0 +1,37 @@ +/* + * Copyright 2018 Palantir Technologies, Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.palantir.tritium.metrics.registry; + +import static java.util.stream.Collectors.toMap; + +import com.codahale.metrics.Metric; +import com.codahale.metrics.MetricRegistry; +import java.util.Map; + +public final class DropwizardTaggedMetricSet implements TaggedMetricSet { + private final MetricRegistry metricRegistry; + + public DropwizardTaggedMetricSet(MetricRegistry metricRegistry) { + this.metricRegistry = metricRegistry; + } + + @Override + public Map getMetrics() { + return metricRegistry.getMetrics().entrySet().stream() + .collect(toMap(entry -> MetricName.builder().safeName(entry.getKey()).build(), Map.Entry::getValue)); + } +} diff --git a/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/TaggedMetricRegistry.java b/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/TaggedMetricRegistry.java index 044e9a0f0..867ab3dc7 100644 --- a/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/TaggedMetricRegistry.java +++ b/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/TaggedMetricRegistry.java @@ -29,7 +29,7 @@ /** * Similar to {@link com.codahale.metrics.MetricRegistry} but allows tagging of {@link Metric}s. */ -public interface TaggedMetricRegistry { +public interface TaggedMetricRegistry extends TaggedMetricSet { /** * Returns existing or new timer metric for the specified metric name. @@ -81,13 +81,6 @@ public interface TaggedMetricRegistry { Counter counter(MetricName metricName, Supplier counterSupplier); - /** - * Returns a map of registered metrics. - * - * @return map of registered metrics - */ - Map getMetrics(); - /** * Removes the tagged metric with the specified metric name. * @@ -96,4 +89,20 @@ public interface TaggedMetricRegistry { */ Optional remove(MetricName metricName); + /** + * Adds a set of metrics to this TaggedMetricRegistry's metric set, + * which are to be uniquely identified by the tags provided. + *

+ * So, if I have a metric registry with a single metric called 'foo', and I add it + * with tag (bar, baz), this registry will now contain 'foo', tagged with (bar, baz). + * + * @param tags the tags which will be added to all the metrics in the metric set + * @param metrics the metrics which should be added + */ + void addMetrics(Map tags, TaggedMetricSet metrics); + + /** + * Removes a TaggedMetricsSet added via addMetrics from this metrics set. + */ + void removeMetrics(Map tags); } diff --git a/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/TaggedMetricSet.java b/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/TaggedMetricSet.java new file mode 100644 index 000000000..72a5ad6a4 --- /dev/null +++ b/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/TaggedMetricSet.java @@ -0,0 +1,29 @@ +/* + * Copyright 2018 Palantir Technologies, Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.palantir.tritium.metrics.registry; + +import com.codahale.metrics.Metric; +import java.util.Map; + +public interface TaggedMetricSet { + /** + * Returns a map of metrics. + * + * @return map of metrics + */ + Map getMetrics(); +} From 4b29c7e74043ba395fa946d1f19a09cd87aff8bc Mon Sep 17 00:00:00 2001 From: James Baker Date: Mon, 25 Jun 2018 16:36:26 +0100 Subject: [PATCH 2/9] add test --- .../registry/DefaultTaggedMetricRegistry.java | 15 ++++++++------- .../metrics/registry/TaggedMetricRegistry.java | 4 ++-- .../registry/TaggedMetricRegistryTest.java | 12 ++++++++++++ 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/DefaultTaggedMetricRegistry.java b/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/DefaultTaggedMetricRegistry.java index 33d905021..13c53d358 100644 --- a/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/DefaultTaggedMetricRegistry.java +++ b/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/DefaultTaggedMetricRegistry.java @@ -25,6 +25,7 @@ import com.codahale.metrics.Timer; import com.google.auto.service.AutoService; import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Maps; import java.util.Map; import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; @@ -36,7 +37,7 @@ public final class DefaultTaggedMetricRegistry implements TaggedMetricRegistry { private static final TaggedMetricRegistry DEFAULT = new DefaultTaggedMetricRegistry(); private final Map registry = new ConcurrentHashMap<>(); - private final Map, TaggedMetricSet> taggedRegistries = new ConcurrentHashMap<>(); + private final Map, TaggedMetricSet> taggedRegistries = new ConcurrentHashMap<>(); public DefaultTaggedMetricRegistry() {} @@ -96,11 +97,11 @@ public Timer timer(MetricName metricName, Supplier timerSupplier) { public Map getMetrics() { ImmutableMap.Builder result = ImmutableMap.builder() .putAll(registry); - taggedRegistries.forEach((tags, metrics) -> metrics.getMetrics() + taggedRegistries.forEach((tag, metrics) -> metrics.getMetrics() .forEach((metricName, metric) -> result.put( MetricName.builder() .from(metricName) - .putAllSafeTags(tags) + .putSafeTags(tag.getKey(), tag.getValue()) .build(), metric))); @@ -113,13 +114,13 @@ public Optional remove(MetricName metricName) { } @Override - public void addMetrics(Map tags, TaggedMetricSet other) { - taggedRegistries.put(tags, other); + public void addMetrics(String safeTagName, String safeTagValue, TaggedMetricSet other) { + taggedRegistries.put(Maps.immutableEntry(safeTagName, safeTagValue), other); } @Override - public void removeMetrics(Map tags) { - taggedRegistries.remove(tags); + public void removeMetrics(String safeTagName, String safeTagValue) { + taggedRegistries.remove(Maps.immutableEntry(safeTagName, safeTagValue)); } private T getOrAdd(MetricName metricName, Class metricClass, Supplier metricSupplier) { diff --git a/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/TaggedMetricRegistry.java b/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/TaggedMetricRegistry.java index 867ab3dc7..54bff33c9 100644 --- a/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/TaggedMetricRegistry.java +++ b/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/TaggedMetricRegistry.java @@ -99,10 +99,10 @@ public interface TaggedMetricRegistry extends TaggedMetricSet { * @param tags the tags which will be added to all the metrics in the metric set * @param metrics the metrics which should be added */ - void addMetrics(Map tags, TaggedMetricSet metrics); + void addMetrics(String safeTagName, String safeTagValue, TaggedMetricSet metrics); /** * Removes a TaggedMetricsSet added via addMetrics from this metrics set. */ - void removeMetrics(Map tags); + void removeMetrics(String safeTagName, String safeTagValue); } diff --git a/tritium-registry/src/test/java/com/palantir/tritium/metrics/registry/TaggedMetricRegistryTest.java b/tritium-registry/src/test/java/com/palantir/tritium/metrics/registry/TaggedMetricRegistryTest.java index 4bfa522aa..e5f7cb66f 100644 --- a/tritium-registry/src/test/java/com/palantir/tritium/metrics/registry/TaggedMetricRegistryTest.java +++ b/tritium-registry/src/test/java/com/palantir/tritium/metrics/registry/TaggedMetricRegistryTest.java @@ -153,4 +153,16 @@ public void testRemoveMetric() { assertThat(registry.remove(METRIC_1).isPresent()).isFalse(); } + + @Test + public void testAddMetricRegistry() { + String name = "name"; + String tagKey = "tagKey"; + String tagValue = "tagValue"; + TaggedMetricRegistry child = new DefaultTaggedMetricRegistry(); + Meter meter = child.meter(MetricName.builder().safeName(name).build()); + registry.addMetrics(tagKey, tagValue, child); + assertThat(registry.getMetrics()) + .containsEntry(MetricName.builder().safeName(name).putSafeTags(tagKey, tagValue).build(), meter); + } } From 6a79d11cc62f1efb37929f040839d10e8f0077fb Mon Sep 17 00:00:00 2001 From: James Baker Date: Mon, 25 Jun 2018 18:37:35 +0100 Subject: [PATCH 3/9] Checkstyle --- .../tritium/metrics/registry/DropwizardTaggedMetricSet.java | 2 +- .../palantir/tritium/metrics/registry/TaggedMetricRegistry.java | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/DropwizardTaggedMetricSet.java b/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/DropwizardTaggedMetricSet.java index 67b25f527..30226e55b 100644 --- a/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/DropwizardTaggedMetricSet.java +++ b/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/DropwizardTaggedMetricSet.java @@ -1,5 +1,5 @@ /* - * Copyright 2018 Palantir Technologies, Inc. All rights reserved. + * (c) Copyright 2018 Palantir Technologies Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/TaggedMetricRegistry.java b/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/TaggedMetricRegistry.java index 54bff33c9..2a6e09904 100644 --- a/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/TaggedMetricRegistry.java +++ b/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/TaggedMetricRegistry.java @@ -22,7 +22,6 @@ import com.codahale.metrics.Meter; import com.codahale.metrics.Metric; import com.codahale.metrics.Timer; -import java.util.Map; import java.util.Optional; import java.util.function.Supplier; From 2cc1b75f6c3c78bbeeb9e3d298f5a841aba99d19 Mon Sep 17 00:00:00 2001 From: James Baker Date: Mon, 25 Jun 2018 19:28:58 +0100 Subject: [PATCH 4/9] PR comments --- .../metrics/registry/DefaultTaggedMetricRegistry.java | 4 ++-- .../metrics/registry/DropwizardTaggedMetricSet.java | 10 +++++----- .../tritium/metrics/registry/TaggedMetricRegistry.java | 7 +++++-- .../tritium/metrics/registry/TaggedMetricSet.java | 2 +- 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/DefaultTaggedMetricRegistry.java b/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/DefaultTaggedMetricRegistry.java index 13c53d358..95999c29c 100644 --- a/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/DefaultTaggedMetricRegistry.java +++ b/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/DefaultTaggedMetricRegistry.java @@ -119,8 +119,8 @@ public void addMetrics(String safeTagName, String safeTagValue, TaggedMetricSet } @Override - public void removeMetrics(String safeTagName, String safeTagValue) { - taggedRegistries.remove(Maps.immutableEntry(safeTagName, safeTagValue)); + public Optional removeMetrics(String safeTagName, String safeTagValue) { + return Optional.ofNullable(taggedRegistries.remove(Maps.immutableEntry(safeTagName, safeTagValue))); } private T getOrAdd(MetricName metricName, Class metricClass, Supplier metricSupplier) { diff --git a/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/DropwizardTaggedMetricSet.java b/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/DropwizardTaggedMetricSet.java index 30226e55b..adb04939e 100644 --- a/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/DropwizardTaggedMetricSet.java +++ b/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/DropwizardTaggedMetricSet.java @@ -19,19 +19,19 @@ import static java.util.stream.Collectors.toMap; import com.codahale.metrics.Metric; -import com.codahale.metrics.MetricRegistry; +import com.codahale.metrics.MetricSet; import java.util.Map; public final class DropwizardTaggedMetricSet implements TaggedMetricSet { - private final MetricRegistry metricRegistry; + private final MetricSet metricSet; - public DropwizardTaggedMetricSet(MetricRegistry metricRegistry) { - this.metricRegistry = metricRegistry; + public DropwizardTaggedMetricSet(MetricSet metricSet) { + this.metricSet = metricSet; } @Override public Map getMetrics() { - return metricRegistry.getMetrics().entrySet().stream() + return metricSet.getMetrics().entrySet().stream() .collect(toMap(entry -> MetricName.builder().safeName(entry.getKey()).build(), Map.Entry::getValue)); } } diff --git a/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/TaggedMetricRegistry.java b/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/TaggedMetricRegistry.java index 2a6e09904..9e8684eb6 100644 --- a/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/TaggedMetricRegistry.java +++ b/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/TaggedMetricRegistry.java @@ -94,8 +94,11 @@ public interface TaggedMetricRegistry extends TaggedMetricSet { *

* So, if I have a metric registry with a single metric called 'foo', and I add it * with tag (bar, baz), this registry will now contain 'foo', tagged with (bar, baz). + *

+ * * - * @param tags the tags which will be added to all the metrics in the metric set + * @param safeTagName a tag key which should be added to all metrics in the metrics set + * @param safeTagValue a tag value which should be added to all metrics in the metrics set * @param metrics the metrics which should be added */ void addMetrics(String safeTagName, String safeTagValue, TaggedMetricSet metrics); @@ -103,5 +106,5 @@ public interface TaggedMetricRegistry extends TaggedMetricSet { /** * Removes a TaggedMetricsSet added via addMetrics from this metrics set. */ - void removeMetrics(String safeTagName, String safeTagValue); + Optional removeMetrics(String safeTagName, String safeTagValue); } diff --git a/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/TaggedMetricSet.java b/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/TaggedMetricSet.java index 72a5ad6a4..7af6a115a 100644 --- a/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/TaggedMetricSet.java +++ b/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/TaggedMetricSet.java @@ -1,5 +1,5 @@ /* - * Copyright 2018 Palantir Technologies, Inc. All rights reserved. + * (c) Copyright 2018 Palantir Technologies Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. From b36b36393c5df69b2bfb98b3fb16c0caae004623 Mon Sep 17 00:00:00 2001 From: James Baker Date: Mon, 25 Jun 2018 19:30:31 +0100 Subject: [PATCH 5/9] PR comments --- .../registry/DefaultTaggedMetricRegistry.java | 30 +++++++++++-------- .../registry/TaggedMetricRegistry.java | 3 +- .../registry/TaggedMetricRegistryTest.java | 2 ++ 3 files changed, 22 insertions(+), 13 deletions(-) diff --git a/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/DefaultTaggedMetricRegistry.java b/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/DefaultTaggedMetricRegistry.java index 95999c29c..d8fcd2a43 100644 --- a/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/DefaultTaggedMetricRegistry.java +++ b/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/DefaultTaggedMetricRegistry.java @@ -16,6 +16,8 @@ package com.palantir.tritium.metrics.registry; +import static java.util.stream.Collectors.toMap; + import com.codahale.metrics.Counter; import com.codahale.metrics.ExponentiallyDecayingReservoir; import com.codahale.metrics.Gauge; @@ -24,12 +26,12 @@ import com.codahale.metrics.Metric; import com.codahale.metrics.Timer; import com.google.auto.service.AutoService; -import com.google.common.collect.ImmutableMap; import com.google.common.collect.Maps; import java.util.Map; import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Supplier; +import java.util.stream.Stream; @AutoService(TaggedMetricRegistry.class) public final class DefaultTaggedMetricRegistry implements TaggedMetricRegistry { @@ -95,17 +97,21 @@ public Timer timer(MetricName metricName, Supplier timerSupplier) { @Override public Map getMetrics() { - ImmutableMap.Builder result = ImmutableMap.builder() - .putAll(registry); - taggedRegistries.forEach((tag, metrics) -> metrics.getMetrics() - .forEach((metricName, metric) -> result.put( - MetricName.builder() - .from(metricName) - .putSafeTags(tag.getKey(), tag.getValue()) - .build(), - metric))); - - return result.build(); + return Stream.concat(registry.entrySet().stream(), + taggedRegistries.entrySet().stream().flatMap(entry -> addTag( + entry.getKey().getKey(), + entry.getKey().getValue(), + entry.getValue().getMetrics().entrySet().stream()))) + .collect(toMap(Map.Entry::getKey, Map.Entry::getValue, (a, b) -> a)); + } + + private Stream> addTag( + String tagKey, String tagValue, Stream> untagged) { + return untagged.map(entry -> Maps.immutableEntry( + MetricName.builder().from(entry.getKey()) + .putSafeTags(tagKey, tagValue) + .build(), + entry.getValue())); } @Override diff --git a/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/TaggedMetricRegistry.java b/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/TaggedMetricRegistry.java index 9e8684eb6..241e3405d 100644 --- a/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/TaggedMetricRegistry.java +++ b/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/TaggedMetricRegistry.java @@ -95,7 +95,8 @@ public interface TaggedMetricRegistry extends TaggedMetricSet { * So, if I have a metric registry with a single metric called 'foo', and I add it * with tag (bar, baz), this registry will now contain 'foo', tagged with (bar, baz). *

- * + * If a metric exists with duplicate tags, then calling {@link TaggedMetricSet#getMetrics} + * will be impossible. * * @param safeTagName a tag key which should be added to all metrics in the metrics set * @param safeTagValue a tag value which should be added to all metrics in the metrics set diff --git a/tritium-registry/src/test/java/com/palantir/tritium/metrics/registry/TaggedMetricRegistryTest.java b/tritium-registry/src/test/java/com/palantir/tritium/metrics/registry/TaggedMetricRegistryTest.java index e5f7cb66f..5b3aabd82 100644 --- a/tritium-registry/src/test/java/com/palantir/tritium/metrics/registry/TaggedMetricRegistryTest.java +++ b/tritium-registry/src/test/java/com/palantir/tritium/metrics/registry/TaggedMetricRegistryTest.java @@ -164,5 +164,7 @@ public void testAddMetricRegistry() { registry.addMetrics(tagKey, tagValue, child); assertThat(registry.getMetrics()) .containsEntry(MetricName.builder().safeName(name).putSafeTags(tagKey, tagValue).build(), meter); + registry.removeMetrics(tagKey, tagValue); + assertThat(registry.getMetrics()).isEmpty(); } } From 3eb3645b73ee6deeb7e8336e4276e261fa5c73a5 Mon Sep 17 00:00:00 2001 From: James Baker Date: Mon, 25 Jun 2018 19:42:15 +0100 Subject: [PATCH 6/9] fixups --- .../registry/DefaultTaggedMetricRegistry.java | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/DefaultTaggedMetricRegistry.java b/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/DefaultTaggedMetricRegistry.java index d8fcd2a43..ba602c6ea 100644 --- a/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/DefaultTaggedMetricRegistry.java +++ b/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/DefaultTaggedMetricRegistry.java @@ -16,8 +16,6 @@ package com.palantir.tritium.metrics.registry; -import static java.util.stream.Collectors.toMap; - import com.codahale.metrics.Counter; import com.codahale.metrics.ExponentiallyDecayingReservoir; import com.codahale.metrics.Gauge; @@ -26,6 +24,7 @@ import com.codahale.metrics.Metric; import com.codahale.metrics.Timer; import com.google.auto.service.AutoService; +import com.google.common.collect.ImmutableMap; import com.google.common.collect.Maps; import java.util.Map; import java.util.Optional; @@ -97,12 +96,17 @@ public Timer timer(MetricName metricName, Supplier timerSupplier) { @Override public Map getMetrics() { - return Stream.concat(registry.entrySet().stream(), - taggedRegistries.entrySet().stream().flatMap(entry -> addTag( - entry.getKey().getKey(), - entry.getKey().getValue(), - entry.getValue().getMetrics().entrySet().stream()))) - .collect(toMap(Map.Entry::getKey, Map.Entry::getValue, (a, b) -> a)); + ImmutableMap.Builder result = ImmutableMap.builder() + .putAll(registry); + taggedRegistries.forEach((tag, metrics) -> metrics.getMetrics() + .forEach((metricName, metric) -> result.put( + MetricName.builder() + .from(metricName) + .putSafeTags(tag.getKey(), tag.getValue()) + .build(), + metric))); + + return result.build(); } private Stream> addTag( From 5aeaf6358101d50ef40dd51fe114b543ee7e18f0 Mon Sep 17 00:00:00 2001 From: James Baker Date: Mon, 25 Jun 2018 19:42:30 +0100 Subject: [PATCH 7/9] dead code --- .../metrics/registry/DefaultTaggedMetricRegistry.java | 9 --------- 1 file changed, 9 deletions(-) diff --git a/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/DefaultTaggedMetricRegistry.java b/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/DefaultTaggedMetricRegistry.java index ba602c6ea..0a4172753 100644 --- a/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/DefaultTaggedMetricRegistry.java +++ b/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/DefaultTaggedMetricRegistry.java @@ -109,15 +109,6 @@ public Map getMetrics() { return result.build(); } - private Stream> addTag( - String tagKey, String tagValue, Stream> untagged) { - return untagged.map(entry -> Maps.immutableEntry( - MetricName.builder().from(entry.getKey()) - .putSafeTags(tagKey, tagValue) - .build(), - entry.getValue())); - } - @Override public Optional remove(MetricName metricName) { return Optional.ofNullable(registry.remove(metricName)); From 859eb7b7a2e9d72b37adbf0394b15f44e285ea2e Mon Sep 17 00:00:00 2001 From: James Baker Date: Mon, 25 Jun 2018 19:44:35 +0100 Subject: [PATCH 8/9] unused import --- .../tritium/metrics/registry/DefaultTaggedMetricRegistry.java | 1 - 1 file changed, 1 deletion(-) diff --git a/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/DefaultTaggedMetricRegistry.java b/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/DefaultTaggedMetricRegistry.java index 0a4172753..95999c29c 100644 --- a/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/DefaultTaggedMetricRegistry.java +++ b/tritium-registry/src/main/java/com/palantir/tritium/metrics/registry/DefaultTaggedMetricRegistry.java @@ -30,7 +30,6 @@ import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Supplier; -import java.util.stream.Stream; @AutoService(TaggedMetricRegistry.class) public final class DefaultTaggedMetricRegistry implements TaggedMetricRegistry { From cf44358250dec076ae016d29be43f89a1ad2b74a Mon Sep 17 00:00:00 2001 From: James Baker Date: Mon, 25 Jun 2018 20:03:27 +0100 Subject: [PATCH 9/9] guava --- tritium-registry/build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/tritium-registry/build.gradle b/tritium-registry/build.gradle index bf5ddd34e..469a4a070 100644 --- a/tritium-registry/build.gradle +++ b/tritium-registry/build.gradle @@ -4,6 +4,7 @@ dependencies { processor 'com.google.auto.service:auto-service' processor 'org.immutables:value' + compile 'com.google.guava:guava' compile 'com.palantir.safe-logging:safe-logging' compile 'io.dropwizard.metrics:metrics-core'