client_python icon indicating copy to clipboard operation
client_python copied to clipboard

Feature request - public `registry._names_to_collectors` access

Open Lancetnik opened this issue 1 year ago • 5 comments

Now we are working on Prometheus support in FastStream and faced with a problem. Shared registry between different middlewares leads to MetricsContainer duplication. So, we would like to have a public API to chech registry for already registered objects.

Can you please provide public access to this property some way?

https://github.com/prometheus/client_python/blob/master/prometheus_client/registry.py#L31

I think, the easiest way to save old API and provide us with a new one - add a public property like in the following snipper

class CollectorRegistry(Collector):
    def __init__(self):
        self._names_to_collectors: Dict[str, Collector] = {}

    @property
    def names_to_collectors(self):
        return self._names_to_collectors

Lancetnik avatar Nov 15 '24 17:11 Lancetnik

Related to - https://github.com/airtai/faststream/pull/1921

Lancetnik avatar Nov 19 '24 14:11 Lancetnik

Is it not sufficient to call collect() and see what all is returned to get a list of all metrics?

My concern with adding that function is that not all registries are instances of CollectorRegistry, some applications may use their own implementation. Not to mention things like custom collectors.

csmarchbanks avatar Nov 19 '24 22:11 csmarchbanks

To clarify - we just want to avoid double metrics registration

counter_name = "..."

counter = (
    registry._names_to_collectors.get(counter_name)
) or Counter(
    name=counter_name,
    ...
    registry=registry,
)

https://github.com/airtai/faststream/blob/main/faststream/prometheus/container.py#L40

Lancetnik avatar Nov 20 '24 16:11 Lancetnik

Well, seems like we can't create any metric with custom CollectorRegistry implementation - all registry options are Optional[CollectorRegistry] = REGISTRY type

https://github.com/prometheus/client_python/blob/master/prometheus_client/metrics.py#L132

So, the initial point about CollectorRegistry property still actual

Lancetnik avatar Nov 20 '24 16:11 Lancetnik

Is it not sufficient to call collect() and see what all is returned to get a list of all metrics?

collect() returns only non-zero metrics and resets their state. In addition, we need to get an instance of the metric by the name of the metric.

draincoder avatar Nov 20 '24 16:11 draincoder