Eagerly convert value to float in *MetricFamily.add_metric()
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Accessibilité débutants
- 35/100
- Type d'issue
- Fonctionnalité
- Clarté
- Plutôt claire
- Activité
- À l'abandon
- Stack technique
- prometheus, python
- Domaine
- observability-sre
Piste de recherche
Commencez par MetricFamily.add_metric(), puis comparez le chemin de sérialisation dans openmetrics/exposition.py et utils.py, notamment generate_latest et floatToGoString de la trace d’exécution. Le travail est terminé lorsque les valeurs invalides échouent lors de l’ajout de la métrique plutôt que lors de la sérialisation, et que l’impact sur la compatibilité ainsi que le comportement pertinent sont couverts par des tests.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Hi there, an experience report and improvement suggestion.
I have a pretty simple exporter which queries a backend URL for JSON, grabs the JSON, stuffs it into prometheus metric families, which it then yields.
Sometimes it errors with stacktraces only when the request is finishing, with a stack traces that points at finish_request rather than the code that added the bad float:
TypeError: ("float() argument must be a string or a number, not 'NoneType'", Metric(bom_wind_speed, Wind speed (km/h) from the Bureau of Meterology, gauge, , [Sample(name='bom_wind_speed', labels={'location': 'Sydney Airport'}, value=None, timestamp=None, exemplar=None), Sample(name='bom_wind_speed', labels={'location': 'Sydney - Observatory Hill'}, value=20, timestamp=None, exemplar=None)]))
Traceback (most recent call last):
File "/usr/local/lib/python3.5/socketserver.py", line 625, in process_request_thread
self.finish_request(request, client_address)
File "/usr/local/lib/python3.5/socketserver.py", line 354, in finish_request
self.RequestHandlerClass(request, client_address, self)
File "/usr/local/lib/python3.5/socketserver.py", line 681, in __init__
self.handle()
File "/usr/local/lib/python3.5/http/server.py", line 422, in handle
self.handle_one_request()
File "/usr/local/lib/python3.5/http/server.py", line 410, in handle_one_request
method()
File "/usr/local/lib/python3.5/site-packages/prometheus_client/exposition.py", line 152, in do_GET
output = encoder(registry)
File "/usr/local/lib/python3.5/site-packages/prometheus_client/openmetrics/exposition.py", line 56, in generate_latest
floatToGoString(s.value),
File "/usr/local/lib/python3.5/site-packages/prometheus_client/utils.py", line 8, in floatToGoString
d = float(d)
TypeError: ("float() argument must be a string or a number, not 'NoneType'", Metric(bom_wind_speed, Wind speed (km/h) from the Bureau of Meterology, gauge, , [Sample(name='bom_wind_speed', labels={'location': 'Sydney Airport'}, value=None, timestamp=None, exemplar=None), Sample(name='bom_wind_speed', labels={'location': 'Sydney - Observatory Hill'}, value=20, timestamp=None, exemplar=None)]))
I've hit this kind of bug a few times in different exporters (I guess it's to be expected to get type errors in Python sometimes).
How about eagerly converting the value passed to add_metric to a float? Then the stack trace would point at the exact cause.
This might be a breaking change - that'd be a reasonable reason to reject this. But any code doing this will likely fail soon after, as soon as an attempt is made to serialize the metric, so maybe it'd be worth the change for better debuggability? What do you think?
- Langage dominant
- Python
- Étoiles
- 4.4k
- Forks
- 876
- Merge moyen
- 8 j 4 h
- PR mergées (30 j)
- 1
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de prometheus/client_python
-
bug
Difficulté 2/5 1-3 heures Accessibilité débutants 70/100
prometheus/client_python#1177 · 1 commentaire ·
-
Difficulté 4/5 3-5 jours Accessibilité débutants 45/100
prometheus/client_python#1210 ·
-
Difficulté 2/5 1-3 heures Accessibilité débutants 58/100
prometheus/client_python#1199 · 1 réaction ·
-
Difficulté 5/5 Plus d'une semaine Accessibilité débutants 35/100
prometheus/client_python#1176 ·
-
WSL and MultiProcessCollector Ouverte
Difficulté 1/5 1-3 heures Accessibilité débutants 52/100
prometheus/client_python#1126 · 2 commentaires ·
Toutes les issues de prometheus/client_python
Issues similaires
-
agent-ready documentation needs-triage
Difficulté 1/5 1-3 heures Accessibilité débutants 88/100
-
documentation
Difficulté 1/5 Moins d'une heure Accessibilité débutants 91/100
-
workflow-status page template still says reusable workflows are "triggered only by workflow_call:" Ouverte
Difficulté 1/5 Moins d'une heure Accessibilité débutants 92/100
-
Add https://search.jeremyh.xyz/ Ouverteinstance instance add
Difficulté 1/5 Moins d'une heure Accessibilité débutants 72/100
searxng/searx-instances#939 · 1 commentaire ·
-
area-deployment area-integrations triage:bot-seen
Difficulté 2/5 Une demi-journée Accessibilité débutants 86/100