Open
Description
Multiprocess mode's collect() reads the registry files and aggregates metrics that have been written to prometheus_multiproc_dir
.
This doesn't work with gauge.set_function()
which does not record its value. The provided function is just called during collection.
That means with the following code:
registry = CollectorRegistry()
Gauge("test", "test", registry=self._registry).set_function(lambda: 100)
multiprocess.MultiProcessCollector(registry)
The output will be:
# HELP test test
# TYPE test gauge
test 100.0
# HELP test Multiprocess metric
# TYPE test gauge
test{pid="10705"} 0.0
Current side effects:
- If any mode other than
all
orliveall
is used, thepid
tag won't be included. This results in duplicate metrics being reported to Prometheus. Prometheus currently only uses the first metric it reads, which is non-deterministic due to iteration over the registry's dictionary. - If
registry=None
to avoid double reporting, only the default value of0.0
is reported. - Current way to work around it is to use the mode
all
and to ignore gauges in Prometheus and with the tagpid
.
Proposal:
I'm not sure how you could incorporate set_function
into the multiprocess registry and I'm not convinced how useful of a feature it would be. Is it reasonable to add a new multiprocess_mode: exclude
which would prevent the incorrect 0.0 value being reported? Or would it be better to just add documentation to recommend using two independent registries?
Metadata
Metadata
Assignees
Labels
No labels