You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
watchtower/pkg/api/metrics/metrics_test.go

91 lines
2.1 KiB
Go

package metrics_test
import (
"fmt"
"io"
"net/http"
"net/http/httptest"
"strings"
"testing"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
"github.com/containrrr/watchtower/pkg/api"
metricsAPI "github.com/containrrr/watchtower/pkg/api/metrics"
"github.com/containrrr/watchtower/pkg/metrics"
)
const (
token = "123123123"
getURL = "http://localhost:8080/v1/metrics"
)
func TestMetrics(t *testing.T) {
RegisterFailHandler(Fail)
RunSpecs(t, "Metrics Suite")
}
func getWithToken(handler http.Handler) map[string]string {
metricMap := map[string]string{}
respWriter := httptest.NewRecorder()
req := httptest.NewRequest("GET", getURL, nil)
req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", token))
handler.ServeHTTP(respWriter, req)
res := respWriter.Result()
body, _ := io.ReadAll(res.Body)
for _, line := range strings.Split(string(body), "\n") {
if len(line) < 1 || line[0] == '#' {
continue
}
parts := strings.Split(line, " ")
metricMap[parts[0]] = parts[1]
}
return metricMap
}
var _ = Describe("the metrics API", func() {
httpAPI := api.New(token)
m := metricsAPI.New()
handleReq := httpAPI.RequireToken(m.Handle)
tryGetMetrics := func() map[string]string { return getWithToken(handleReq) }
It("should serve metrics", func() {
Expect(tryGetMetrics()).To(HaveKeyWithValue("watchtower_containers_updated", "0"))
metric := &metrics.Metric{
Scanned: 4,
Updated: 3,
Failed: 1,
}
metrics.RegisterScan(metric)
Eventually(metrics.Default().QueueIsEmpty).Should(BeTrue())
Eventually(tryGetMetrics).Should(SatisfyAll(
HaveKeyWithValue("watchtower_containers_updated", "3"),
HaveKeyWithValue("watchtower_containers_failed", "1"),
HaveKeyWithValue("watchtower_containers_scanned", "4"),
HaveKeyWithValue("watchtower_scans_total", "1"),
HaveKeyWithValue("watchtower_scans_skipped", "0"),
))
for i := 0; i < 3; i++ {
metrics.RegisterScan(nil)
}
Eventually(metrics.Default().QueueIsEmpty).Should(BeTrue())
Eventually(tryGetMetrics).Should(SatisfyAll(
HaveKeyWithValue("watchtower_scans_total", "4"),
HaveKeyWithValue("watchtower_scans_skipped", "3"),
))
})
})