Skip to content

docs: add API reference for CollectorRegistry and custom collector classes#1169

Merged
csmarchbanks merged 2 commits intoprometheus:masterfrom
k1chik:fix/1163-api-reference-registry-collectors
Apr 24, 2026
Merged

docs: add API reference for CollectorRegistry and custom collector classes#1169
csmarchbanks merged 2 commits intoprometheus:masterfrom
k1chik:fix/1163-api-reference-registry-collectors

Conversation

@k1chik
Copy link
Copy Markdown
Contributor

@k1chik k1chik commented Apr 24, 2026

Closes #1163

Follows the same pattern as #1021 and #1162.

collector/custom.md: Collector protocol section (collect/describe), value vs labels mutual exclusivity note with correct per-type parameter names, full constructor and add_metric tables for GaugeMetricFamily, CounterMetricFamily, SummaryMetricFamily, HistogramMetricFamily, and InfoMetricFamily, plus a runnable real-world example.

collector/_index.md: constructor parameter tables for ProcessCollector, PlatformCollector, and GCCollector, with exported metrics listed for each.

registry/_index.md (new page): CollectorRegistry constructor and all public methods (register, unregister, collect, restricted_registry, get_sample_value, set_target_info, get_target_info), the global REGISTRY instance, and examples for isolated registry usage and registry=None.

All code examples verified by running them in Python.

cc @csmarchbanks

k1chik added 2 commits April 24, 2026 11:04
…asses

Closes prometheus#1163

collector/custom.md: Collector protocol section (collect/describe), value vs
labels mutual exclusivity note, full constructor and add_metric tables for
GaugeMetricFamily, CounterMetricFamily, SummaryMetricFamily,
HistogramMetricFamily, and InfoMetricFamily, plus a runnable real-world example.

collector/_index.md: constructor parameter tables for ProcessCollector,
PlatformCollector, and GCCollector, with exported metrics listed for each.

registry/_index.md (new): CollectorRegistry constructor and all public methods
(register, unregister, collect, restricted_registry, get_sample_value,
set_target_info, get_target_info), the global REGISTRY instance, and examples
for isolated registry usage and registry=None.

All code examples verified by running them in Python.

Signed-off-by: k1chik <107162115+k1chik@users.noreply.github.com>
- GCCollector does not support registry=None on CPython; remove that claim
- Remove unused CONTENT_TYPE_LATEST import from registry example
- Fix 'value vs labels' section to correctly describe Summary (count_value/sum_value) and Histogram (buckets)

Signed-off-by: k1chik <107162115+k1chik@users.noreply.github.com>
Copy link
Copy Markdown
Member

@csmarchbanks csmarchbanks left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

@csmarchbanks csmarchbanks merged commit 482656c into prometheus:master Apr 24, 2026
12 checks passed
@calestyo
Copy link
Copy Markdown

calestyo commented May 3, 2026

Hey.

Thanks for improving on the documentation... that really helps a lot, compared to few years ago when I had to basically fiddle out most of these things from the code :-)

But one thing:

Why the yields in the collect()? I don’t quite get that.

Shouldn't collect() return sequences of *MetricFamily objects? You now return only a single one, and there even alternating ones like in:
a708480#diff-eadfec94068584be6fec5cce354e065ead34a754bc84ead564adf9e8c497ab10R237-R243

Or maybe you mean this as two independent examples?
What makes it confusing though is (which is however not from your commit):

def collect(self):
yield GaugeMetricFamily('my_gauge', 'Help text', value=7)
c = CounterMetricFamily('my_counter_total', 'Help text', labels=['foo'])
c.add_metric(['bar'], 1.7)
c.add_metric(['baz'], 3.8)
yield c

There collect() alternates between returning (well yielding) a Gauge and Counter (also not as sequences)?

I generally don't quite understand why one would yield here at all.

Isn't the reason for custom collectors to start every time fresh (and get rid of all stale metrics, labels, etc.)?
With yield wouldn't you keep all that?

Thanks,
Chris.

@calestyo
Copy link
Copy Markdown

calestyo commented May 3, 2026

Shouldn't do stuff late night... yield of course makes it an iterator o.O

Still I wonder, is there any advantage over using that in the current form rather than return?

I mean is Python' GC smart enough that it can already clean the objects that have already been yielded and thus give an advantage by reducing e.g. memory use for very large metric sets?

In:

        yield GaugeMetricFamily('my_gauge', 'Help text', value=7)
        c = CounterMetricFamily('my_counter_total', 'Help text', labels=['foo'])
        c.add_metric(['bar'], 1.7)
        c.add_metric(['baz'], 3.8)
        yield c

I could imagine that it may release the GaugeMetricFamily object early... but c? It still has a reference?

In any case it would be nice to have in the docs why generators are used (if it's memory advantages) and how to use them so that this actually works out. :-)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

docs: add API reference for CollectorRegistry and custom collector classes

3 participants