Retry mechanism behaves incorrectly when HTTP 429 is returned by Datadog
Les mainteneurs répondent en général sous 2 jours
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 3/5
- Temps estimé
- 1-2 jours
- Accessibilité débutants
- 45/100
Piste de recherche
Commencez par suivre la manière dont l’option enable_retry gère les réponses HTTP 429 dans le client, en utilisant la séquence de récupération du dashboard et les tests liés aux nouvelles tentatives décrits dans l’issue. Reproduisez le cas de limitation de débit et vérifiez que le client attend x-ratelimit-reset avant de réessayer, plutôt que de quitter dès le premier 429.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Describe the bug
Summary:
Script which fetches all dashboards in the loop exits with an error, when rate limit runs out, even though enable_retry option is turned on. According to debug logs, script exits on first HTTP 429 returned, with no retry attempted.
Details:
We have a script, which runs every night to fetch all dashboards from Datadog. It does it by fetching list of dashboards, and then goes one after another to fetch details of each one. After number of our dashboard grew, we have run into HTTP 429 errors due to Datadog's rate limit.
We decided to use retry option, which is built into the library since 2.16.0, but it seems it's not ready to how Datadog responds in case of hitting rate limit.
When I started the script in a loop with debug option enabled I see that Datadog returns HTTP 200 up until the moment when rate limit is reached, then next request gets HTTP 429 (API Keys removed from logs below):
# normal request before rate limit runs out
send: b'GET /api/v1/dashboard/<id-of-dashboard-59> Host: us5.datadoghq.com Accept-Encoding: gzip User-Agent: datadog-api-client-python/2.23.0
reply: 'HTTP/1.1 200 OK'
...
header: content-encoding: gzip
header: x-ratelimit-limit: 60
header: x-ratelimit-period: 60
header: x-ratelimit-remaining: 1
header: x-ratelimit-reset: 29
header: x-ratelimit-name: dashboards_get_custom_api
# normal request, last one within the limits
send: b'GET /api/v1/dashboard/<id-of-dashboard-60> Host: us5.datadoghq.com Accept-Encoding: gzip User-Agent: datadog-api-client-python/2.23.0
reply: 'HTTP/1.1 200 OK'
...
header: content-encoding: gzip
header: x-ratelimit-limit: 60
header: x-ratelimit-period: 60
header: x-ratelimit-remaining: 0
header: x-ratelimit-reset: 28
header: x-ratelimit-name: dashboards_get_custom_api
# next request, this one gets HTTP 429
send: b'GET /api/v1/dashboard/<id-of-dashboard-61> Host: us5.datadoghq.com Accept-Encoding: gzip User-Agent: datadog-api-client-python/2.23.0
reply: 'HTTP/1.1 429 Too Many Requests'
...
header: x-ratelimit-limit: 60
header: x-ratelimit-period: 60
header: x-ratelimit-remaining: 0
header: x-ratelimit-reset: 28
header: x-ratelimit-name: dashboards_get_custom_api
# and at this point script fails with
Error: (429)
Reason: Too Many Requests
HTTP response headers: {'x-ratelimit-limit': '60', 'x-ratelimit-period': '60', 'x-ratelimit-remaining': '0', 'x-ratelimit-reset': '28', 'x-ratelimit-name': 'dashboards_get_custom_api', 'content-type': 'application/json', 'Content-Length': '183', 'x-content-type-options': 'nosniff', 'strict-transport-security': 'max-age=31536000; includeSubDomains; preload', 'date': 'Mon, 25 Mar 2024 09:05:32 GMT', 'Via': '1.1 google', 'Alt-Svc': 'h3=":443"; ma=2592000,h3-29=":443"; ma=2592000'}
HTTP response body: {'status': 'error', 'code': 429, 'errors': ['Too many requests'], 'statuspage': 'http://status.us5.datadoghq.com', 'twitter': 'http://twitter.com/datadogops', 'email': '[email protected]'}
To Reproduce
See description above
Expected behavior
I expect library to sleep for x-ratelimit-reset time, just like it's described in tests, which introduced this functionality. Right now I need to add a sleep between requests to API as a workaround
Screenshots
N/A - logs attached
Environment and Versions (please complete the following information):
client library version 2.23.0
Additional context
Add any other context about the problem here.
- Langage dominant
- Python
- Étoiles
- 167
- Forks
- 55
- Merge moyen
- 3 j 17 h
- PR mergées (30 j)
- 80
Préparer son environnement
- Aucun Dockerfile ni fichier Docker Compose
- Propose un modèle de pull request
- Lire 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 DataDog/datadog-api-client-python
-
Python 3.13/3.14 SyntaxWarning in v1 LogsPipelinesApi docstringPeut-être pris @Mirochill l’a pris il y a 141 jours. Ouvertestale
Difficulté 1/5 1-3 heures Accessibilité débutants 72/100
DataDog/datadog-api-client-python#3535 · 1 commentaire ·
Les mainteneurs répondent en général sous 2 jours
-
kind/bug stale
Difficulté 3/5 1-2 jours Accessibilité débutants 66/100
DataDog/datadog-api-client-python#3717 · 3 commentaires ·
Les mainteneurs répondent en général sous 2 jours
-
kind/bug stale
Difficulté 3/5 1-2 jours Accessibilité débutants 75/100
DataDog/datadog-api-client-python#3656 · 1 commentaire ·
Les mainteneurs répondent en général sous 2 jours
-
kind/bug stale
Difficulté 3/5 1-2 jours Accessibilité débutants 38/100
DataDog/datadog-api-client-python#3120 · 1 commentaire ·
Les mainteneurs répondent en général sous 2 jours
-
stale
Difficulté 3/5 1-2 jours Accessibilité débutants 45/100
DataDog/datadog-api-client-python#2986 · 1 commentaire ·
Les mainteneurs répondent en général sous 2 jours
Toutes les issues de DataDog/datadog-api-client-python
Issues similaires
-
Add `django-upgrade` to the CIOuvertedependencies feature github_actions good first issue
Difficulté 2/5 1-3 heures Accessibilité débutants 62/100
wemake-services/wemake-django-template#3149 ·
Les mainteneurs répondent en général sous 1 jour
-
[request] vsg/1.1.16Ouverteupstream update
Difficulté 2/5 1-3 heures Accessibilité débutants 65/100
conan-io/conan-center-index#31142 ·
Les mainteneurs répondent en général sous 1 jour
-
area:core bug
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
Les mainteneurs répondent en général sous 1 jour
-
request-theme
Difficulté 2/5 Moins d'une heure Accessibilité débutants 70/100
LizardByte/ThemerrDB#8877 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
area/install-update comp/gateway P0 sweeper:risk-compatibility type/bug
Difficulté 2/5 Moins d'une heure Accessibilité débutants 72/100
NousResearch/hermes-agent#135997 · 3 commentaires ·
Les mainteneurs répondent en général sous 1 jour