diff --git a/simpleclient/src/main/java/io/prometheus/client/CollectorRegistry.java b/simpleclient/src/main/java/io/prometheus/client/CollectorRegistry.java index 47af5b136..63234ff35 100644 --- a/simpleclient/src/main/java/io/prometheus/client/CollectorRegistry.java +++ b/simpleclient/src/main/java/io/prometheus/client/CollectorRegistry.java @@ -168,10 +168,17 @@ private Iterator filteredCollectorIterator() { } else { HashSet collectors = new HashSet(); synchronized (namesCollectorsLock) { - for (Map.Entry entry : namesToCollectors.entrySet()) { - // Note that namesToCollectors contains keys for all combinations of suffixes (_total, _info, etc.). - if (sampleNameFilter.test(entry.getKey())) { - collectors.add(entry.getValue()); + for (Map.Entry> entry : collectorsToNames.entrySet()) { + List names = entry.getValue(); + if (names.isEmpty()) { + collectors.add(entry.getKey()); + } else { + for (String name : names) { + if (sampleNameFilter.test(name)) { + collectors.add(entry.getKey()); + break; + } + } } } } diff --git a/simpleclient/src/test/java/io/prometheus/client/EmptyDescribableTest.java b/simpleclient/src/test/java/io/prometheus/client/EmptyDescribableTest.java new file mode 100644 index 000000000..bdff0dac1 --- /dev/null +++ b/simpleclient/src/test/java/io/prometheus/client/EmptyDescribableTest.java @@ -0,0 +1,47 @@ +package io.prometheus.client; + +import org.junit.Test; + +import java.util.*; + +import static org.junit.Assert.assertEquals; + +public class EmptyDescribableTest { + + static class TestCollector extends Collector implements Collector.Describable { + + private final List describeResult; + + TestCollector(List describeResult) { + this.describeResult = describeResult; + } + + @Override + public List collect() { + List labelNames = Arrays.asList("label1", "label2"); + List labelValues1 = Arrays.asList("a", "b"); + List labelValues2 = Arrays.asList("c", "d"); + List samples = new ArrayList(2); + samples.add(new MetricFamilySamples.Sample("my_metric", labelNames, labelValues1, 1.0)); + samples.add(new MetricFamilySamples.Sample("my_metric", labelNames, labelValues2, 2.0)); + MetricFamilySamples mfs = new MetricFamilySamples("my_metric", "", Type.UNKNOWN, "help text", samples); + return Collections.singletonList(mfs); + } + + @Override + public List describe() { + return describeResult; + } + } + + @Test + public void testEmptyDescribe() { + CollectorRegistry registry = new CollectorRegistry(); + TestCollector collector = new TestCollector(new ArrayList()); + collector.register(registry); + Set includedNames = new HashSet(Collections.singletonList("my_metric")); + List mfs = Collections.list(registry.filteredMetricFamilySamples(includedNames)); + assertEquals(1, mfs.size()); + assertEquals(2, mfs.get(0).samples.size()); + } +}