1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
|
package datadog
import (
"fmt"
"net/http"
"net/url"
)
// The list of Rate Limited Endpoints of the Datadog API.
// https://docs.datadoghq.com/api/?lang=bash#rate-limiting
func (client *Client) updateRateLimits(resp *http.Response, api *url.URL) error {
if resp == nil || resp.Header == nil || api.Path == "" {
return fmt.Errorf("malformed HTTP content.")
}
if resp.Header.Get("X-RateLimit-Remaining") == "" {
// The endpoint is not Rate Limited.
return nil
}
client.m.Lock()
defer client.m.Unlock()
client.rateLimitingStats[api.Path] = RateLimit{
Limit: resp.Header.Get("X-RateLimit-Limit"),
Reset: resp.Header.Get("X-RateLimit-Reset"),
Period: resp.Header.Get("X-RateLimit-Period"),
Remaining: resp.Header.Get("X-RateLimit-Remaining"),
}
return nil
}
// GetRateLimitStats is a threadsafe getter to retrieve the rate limiting stats associated with the Client.
func (client *Client) GetRateLimitStats() map[string]RateLimit {
client.m.Lock()
defer client.m.Unlock()
// Shallow copy to avoid corrupted data
mapCopy := make(map[string]RateLimit, len(client.rateLimitingStats))
for k, v := range client.rateLimitingStats {
mapCopy[k] = v
}
return mapCopy
}
|