69 lines
1.8 KiB
Go
69 lines
1.8 KiB
Go
// Package metrics provides monitoring of the GitHub related metrics.
|
|
//
|
|
// This depends on the metrics exporter of kubebuilder.
|
|
// See https://book.kubebuilder.io/reference/metrics.html for details.
|
|
package metrics
|
|
|
|
import (
|
|
"net/http"
|
|
"strconv"
|
|
"sync"
|
|
|
|
"github.com/prometheus/client_golang/prometheus"
|
|
"sigs.k8s.io/controller-runtime/pkg/metrics"
|
|
)
|
|
|
|
var onceRegister sync.Once
|
|
|
|
func Register() {
|
|
onceRegister.Do(func() {
|
|
metrics.Registry.MustRegister(metricRateLimit, metricRateLimitRemaining)
|
|
})
|
|
}
|
|
|
|
var (
|
|
// https://docs.github.com/en/rest/overview/resources-in-the-rest-api#rate-limiting
|
|
metricRateLimit = prometheus.NewGauge(
|
|
prometheus.GaugeOpts{
|
|
Name: "github_rate_limit",
|
|
Help: "The maximum number of requests you're permitted to make per hour",
|
|
},
|
|
)
|
|
metricRateLimitRemaining = prometheus.NewGauge(
|
|
prometheus.GaugeOpts{
|
|
Name: "github_rate_limit_remaining",
|
|
Help: "The number of requests remaining in the current rate limit window",
|
|
},
|
|
)
|
|
)
|
|
|
|
const (
|
|
// https://docs.github.com/en/rest/overview/resources-in-the-rest-api#rate-limiting
|
|
headerRateLimit = "X-RateLimit-Limit"
|
|
headerRateLimitRemaining = "X-RateLimit-Remaining"
|
|
)
|
|
|
|
// Transport wraps a transport with metrics monitoring
|
|
type Transport struct {
|
|
Transport http.RoundTripper
|
|
}
|
|
|
|
func (t Transport) RoundTrip(req *http.Request) (*http.Response, error) {
|
|
resp, err := t.Transport.RoundTrip(req)
|
|
if resp != nil {
|
|
parseResponse(resp)
|
|
}
|
|
return resp, err
|
|
}
|
|
|
|
func parseResponse(resp *http.Response) {
|
|
rateLimit, err := strconv.Atoi(resp.Header.Get(headerRateLimit))
|
|
if err == nil {
|
|
metricRateLimit.Set(float64(rateLimit))
|
|
}
|
|
rateLimitRemaining, err := strconv.Atoi(resp.Header.Get(headerRateLimitRemaining))
|
|
if err == nil {
|
|
metricRateLimitRemaining.Set(float64(rateLimitRemaining))
|
|
}
|
|
}
|