Hacktoberfest 2026: as issues que os mantenedores marcaram para outubro, abertas e boas para iniciantes. Ver issues do Hacktoberfest

How to measure time spent by collector.collect?

Aberta
#859 0 comentários 0 reações 0 responsáveis Ver no GitHub

Ninguém assumiu esta issue ainda.

Avaliação

Dificuldade
2/5
Tempo estimado
1-3 horas
Facilidade para iniciantes
35/100
Tipo de issue
Documentação
Clareza
Razoavelmente clara
Status de atividade
Estagnada
Stack de tecnologia
prometheus, python
Domínio
observability

Direção de pesquisa

Comece pelo gerador Collector.collect mostrado e pelo decorador Gauge.time(), depois compare a medição de tempo do decorador com o código dentro de collect(). Explique por que as duas medições diferem e documente o comportamento para que os usuários possam medir corretamente o tempo de coleta do collector.

Escrita pelo modelo de indexação a partir do texto da issue.

Descrição

Having a 3rd-party application which can not expose any metrics by itself I wrote my own exporter which takes data from the app and exposes metrics. The next idea was to measure and expose to prometheus an exact time it takes for all of the collectors to get actual data from the app. But two different approaches - with collector.collect() decorator and measurements taken directly inside of collector.collect() yields different results, and I don't understand what the decorator is actually measures.

Could you please explain this difference or maybe I'm missing something?

import time
from typing import Iterable
from prometheus_client import make_wsgi_app, Gauge
from prometheus_client.core import REGISTRY, GaugeMetricFamily, Metric
from prometheus_client.registry import Collector
from wsgiref.simple_server import make_server


COLLECTOR_TIME = Gauge('collector_spent_secods', 'Time spent by collector to get data', ['collector'])


class MetricsCollector(Collector):
    @COLLECTOR_TIME.labels('decorator').time()
    def collect(self) -> Iterable[Metric]:
        st = time.perf_counter()
        gauge = GaugeMetricFamily(
            name='some_metric_seconds',
            documentation='Some seconds metric',
            labels=['somename']
        )
        time.sleep(1)
        gauge.add_metric(['foo'], 3.0)
        COLLECTOR_TIME.labels('inside').set(time.perf_counter() - st)
        yield gauge


if __name__ == "__main__":
    REGISTRY.register(MetricsCollector())
    app = make_wsgi_app(REGISTRY)
    host = '0.0.0.0'
    port = 6543
    httpd = make_server(host, port, app)
    httpd.serve_forever()
$ curl localhost:6543 2>/dev/null | egrep -v '^#' | grep 'collector_spent_secods'
collector_spent_secods{collector="decorator"} 7.499998901039362e-06
collector_spent_secods{collector="inside"} 1.0012022000155412
Linguagem predominante
Python
Estrelas
4.4k
Forks
876
Merge médio
8d 4h
PRs com merge (30d)
1

Guia de contribuição

Abrir o guia de contribuição

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Mais de prometheus/client_python

Todas as issues de prometheus/client_python

Issues semelhantes

Mais issues de Python

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.