1

https://github.com/prometheus/client_python/blob/master/prometheus_client/gc_collector.py

import gc
import platform
from typing import Iterable

from .metrics_core import CounterMetricFamily, Metric
from .registry import Collector, CollectorRegistry, REGISTRY


class GCCollector(Collector):
    """Collector for Garbage collection statistics."""

    def __init__(self, registry: CollectorRegistry = REGISTRY):
        if not hasattr(gc, 'get_stats') or platform.python_implementation() != 'CPython':
            return
        registry.register(self)

    def collect(self) -> Iterable[Metric]:
        collected = CounterMetricFamily(
            'python_gc_objects_collected',
            'Objects collected during gc',
            labels=['generation'],
        )
        uncollectable = CounterMetricFamily(
            'python_gc_objects_uncollectable',
            'Uncollectable objects found during GC',
            labels=['generation'],
        )

        collections = CounterMetricFamily(
            'python_gc_collections',
            'Number of times this generation was collected',
            labels=['generation'],
        )

        for gen, stat in enumerate(gc.get_stats()):
            generation = str(gen)
            collected.add_metric([generation], value=stat['collected'])
            uncollectable.add_metric([generation], value=stat['uncollectable'])
            collections.add_metric([generation], value=stat['collections'])

        return [collected, uncollectable, collections]

Instead of re-using metric object it creates it every time just to log one value. What if I need to pull metric every second? does it mean it will create it every second? it's not an optimal at all. I feel that under certain circumstances it may contribute into memory allocation even more than time app

What I'm missing? Is it by design?

1 Answer 1

0

Yes, this is by design. It's by design for custom collectors for reasons like Accuracy , Simplicity , Low Impact:

This pattern is for custom collectors pulling external data. Standard metrics like Counter are stateful and long-lived.

Sign up to request clarification or add additional context in comments.

1 Comment

> for reasons like Accuracy , Simplicity , Low Impact I didn't get this. What does it mean? How to use those custom collectors if it allocates lots of object whenever I send metrics out

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.