2960: Refactor keepstore into a streaming server.
[arvados.git] / services / keepstore / metrics_test.go
diff --git a/services/keepstore/metrics_test.go b/services/keepstore/metrics_test.go
new file mode 100644 (file)
index 0000000..0c8f1e6
--- /dev/null
@@ -0,0 +1,87 @@
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: AGPL-3.0
+
+package keepstore
+
+import (
+       "context"
+       "encoding/json"
+       "net/http"
+
+       "git.arvados.org/arvados.git/sdk/go/arvados"
+       "git.arvados.org/arvados.git/sdk/go/arvadostest"
+       "git.arvados.org/arvados.git/sdk/go/ctxlog"
+       "git.arvados.org/arvados.git/sdk/go/httpserver"
+       "github.com/prometheus/client_golang/prometheus"
+       . "gopkg.in/check.v1"
+)
+
+func (s *routerSuite) TestMetrics(c *C) {
+       reg := prometheus.NewRegistry()
+       router, cancel := testRouter(c, s.cluster, reg)
+       defer cancel()
+       instrumented := httpserver.Instrument(reg, ctxlog.TestLogger(c), router)
+       handler := instrumented.ServeAPI(s.cluster.ManagementToken, instrumented)
+
+       router.keepstore.BlockWrite(context.Background(), arvados.BlockWriteOptions{
+               Hash: fooHash,
+               Data: []byte("foo"),
+       })
+       router.keepstore.BlockWrite(context.Background(), arvados.BlockWriteOptions{
+               Hash: barHash,
+               Data: []byte("bar"),
+       })
+
+       // prime the metrics by doing a no-op request
+       resp := call(handler, "GET", "/", "", nil, nil)
+
+       resp = call(handler, "GET", "/metrics.json", "", nil, nil)
+       c.Check(resp.Code, Equals, http.StatusUnauthorized)
+       resp = call(handler, "GET", "/metrics.json", "foobar", nil, nil)
+       c.Check(resp.Code, Equals, http.StatusForbidden)
+       resp = call(handler, "GET", "/metrics.json", arvadostest.ManagementToken, nil, nil)
+       c.Check(resp.Code, Equals, http.StatusOK)
+       var j []struct {
+               Name   string
+               Help   string
+               Type   string
+               Metric []struct {
+                       Label []struct {
+                               Name  string
+                               Value string
+                       }
+                       Summary struct {
+                               SampleCount string
+                               SampleSum   float64
+                       }
+               }
+       }
+       json.NewDecoder(resp.Body).Decode(&j)
+       found := make(map[string]bool)
+       names := map[string]bool{}
+       for _, g := range j {
+               names[g.Name] = true
+               for _, m := range g.Metric {
+                       if len(m.Label) == 2 && m.Label[0].Name == "code" && m.Label[0].Value == "200" && m.Label[1].Name == "method" && m.Label[1].Value == "put" {
+                               c.Check(m.Summary.SampleCount, Equals, "2")
+                               found[g.Name] = true
+                       }
+               }
+       }
+
+       metricsNames := []string{
+               "arvados_keepstore_bufferpool_inuse_buffers",
+               "arvados_keepstore_bufferpool_max_buffers",
+               "arvados_keepstore_bufferpool_allocated_bytes",
+               "arvados_keepstore_pull_queue_inprogress_entries",
+               "arvados_keepstore_pull_queue_pending_entries",
+               "arvados_keepstore_trash_queue_inprogress_entries",
+               "arvados_keepstore_trash_queue_pending_entries",
+               "request_duration_seconds",
+       }
+       for _, m := range metricsNames {
+               _, ok := names[m]
+               c.Check(ok, Equals, true, Commentf("checking metric %q", m))
+       }
+}