Skip to content

Commit 7de891e

Browse files
authored
Fix Describable returning an empty list (#785)
* Fix Describable returning an empty list Signed-off-by: Fabian Stäber <[email protected]> * Fix implementation and add test Signed-off-by: Fabian Stäber <[email protected]>
1 parent 6730f3e commit 7de891e

File tree

2 files changed

+58
-4
lines changed

2 files changed

+58
-4
lines changed

simpleclient/src/main/java/io/prometheus/client/CollectorRegistry.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -168,10 +168,17 @@ private Iterator<Collector> filteredCollectorIterator() {
168168
} else {
169169
HashSet<Collector> collectors = new HashSet<Collector>();
170170
synchronized (namesCollectorsLock) {
171-
for (Map.Entry<String, Collector> entry : namesToCollectors.entrySet()) {
172-
// Note that namesToCollectors contains keys for all combinations of suffixes (_total, _info, etc.).
173-
if (sampleNameFilter.test(entry.getKey())) {
174-
collectors.add(entry.getValue());
171+
for (Map.Entry<Collector, List<String>> entry : collectorsToNames.entrySet()) {
172+
List<String> names = entry.getValue();
173+
if (names.isEmpty()) {
174+
collectors.add(entry.getKey());
175+
} else {
176+
for (String name : names) {
177+
if (sampleNameFilter.test(name)) {
178+
collectors.add(entry.getKey());
179+
break;
180+
}
181+
}
175182
}
176183
}
177184
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package io.prometheus.client;
2+
3+
import org.junit.Test;
4+
5+
import java.util.*;
6+
7+
import static org.junit.Assert.assertEquals;
8+
9+
public class EmptyDescribableTest {
10+
11+
static class TestCollector extends Collector implements Collector.Describable {
12+
13+
private final List<MetricFamilySamples> describeResult;
14+
15+
TestCollector(List<MetricFamilySamples> describeResult) {
16+
this.describeResult = describeResult;
17+
}
18+
19+
@Override
20+
public List<MetricFamilySamples> collect() {
21+
List<String> labelNames = Arrays.asList("label1", "label2");
22+
List<String> labelValues1 = Arrays.asList("a", "b");
23+
List<String> labelValues2 = Arrays.asList("c", "d");
24+
List<MetricFamilySamples.Sample> samples = new ArrayList<MetricFamilySamples.Sample>(2);
25+
samples.add(new MetricFamilySamples.Sample("my_metric", labelNames, labelValues1, 1.0));
26+
samples.add(new MetricFamilySamples.Sample("my_metric", labelNames, labelValues2, 2.0));
27+
MetricFamilySamples mfs = new MetricFamilySamples("my_metric", "", Type.UNKNOWN, "help text", samples);
28+
return Collections.singletonList(mfs);
29+
}
30+
31+
@Override
32+
public List<MetricFamilySamples> describe() {
33+
return describeResult;
34+
}
35+
}
36+
37+
@Test
38+
public void testEmptyDescribe() {
39+
CollectorRegistry registry = new CollectorRegistry();
40+
TestCollector collector = new TestCollector(new ArrayList<Collector.MetricFamilySamples>());
41+
collector.register(registry);
42+
Set<String> includedNames = new HashSet<String>(Collections.singletonList("my_metric"));
43+
List<Collector.MetricFamilySamples> mfs = Collections.list(registry.filteredMetricFamilySamples(includedNames));
44+
assertEquals(1, mfs.size());
45+
assertEquals(2, mfs.get(0).samples.size());
46+
}
47+
}

0 commit comments

Comments
 (0)