14325: Merge branch 'master'
[arvados.git] / services / keep-web / server_test.go
index 6688cc2ee743ec53bf4f2ce15fdfcb4621f09253..8b689efbdc1f1d731bc2a9dfb106c12e3c214cef 100644 (file)
@@ -306,16 +306,33 @@ func (s *IntegrationSuite) TestMetrics(c *check.C) {
        resp, err := http.DefaultClient.Do(req)
        c.Assert(err, check.IsNil)
        c.Check(resp.StatusCode, check.Equals, http.StatusOK)
-       req, _ = http.NewRequest("GET", origin+"/foo", nil)
-       req.Host = arvadostest.FooCollection + ".example.com"
-       req.Header.Set("Authorization", "Bearer "+arvadostest.ActiveToken)
+       for i := 0; i < 2; i++ {
+               req, _ = http.NewRequest("GET", origin+"/foo", nil)
+               req.Host = arvadostest.FooCollection + ".example.com"
+               req.Header.Set("Authorization", "Bearer "+arvadostest.ActiveToken)
+               resp, err = http.DefaultClient.Do(req)
+               c.Assert(err, check.IsNil)
+               c.Check(resp.StatusCode, check.Equals, http.StatusOK)
+               buf, _ := ioutil.ReadAll(resp.Body)
+               c.Check(buf, check.DeepEquals, []byte("foo"))
+               resp.Body.Close()
+       }
+
+       s.testServer.Config.Cache.updateGauges()
+
+       req, _ = http.NewRequest("GET", origin+"/metrics.json", nil)
        resp, err = http.DefaultClient.Do(req)
        c.Assert(err, check.IsNil)
-       c.Check(resp.StatusCode, check.Equals, http.StatusOK)
-       buf, _ := ioutil.ReadAll(resp.Body)
-       c.Check(buf, check.DeepEquals, []byte("foo"))
+       c.Check(resp.StatusCode, check.Equals, http.StatusUnauthorized)
 
        req, _ = http.NewRequest("GET", origin+"/metrics.json", nil)
+       req.Header.Set("Authorization", "Bearer badtoken")
+       resp, err = http.DefaultClient.Do(req)
+       c.Assert(err, check.IsNil)
+       c.Check(resp.StatusCode, check.Equals, http.StatusForbidden)
+
+       req, _ = http.NewRequest("GET", origin+"/metrics.json", nil)
+       req.Header.Set("Authorization", "Bearer "+arvadostest.ManagementToken)
        resp, err = http.DefaultClient.Do(req)
        c.Assert(err, check.IsNil)
        c.Check(resp.StatusCode, check.Equals, http.StatusOK)
@@ -327,6 +344,12 @@ func (s *IntegrationSuite) TestMetrics(c *check.C) {
                        Value    float64
                }
        }
+       type counter struct {
+               Value int64
+       }
+       type gauge struct {
+               Value float64
+       }
        var ents []struct {
                Name   string
                Help   string
@@ -336,24 +359,38 @@ func (s *IntegrationSuite) TestMetrics(c *check.C) {
                                Name  string
                                Value string
                        }
+                       Counter counter
+                       Gauge   gauge
                        Summary summary
                }
        }
        json.NewDecoder(resp.Body).Decode(&ents)
-       flat := map[string]summary{}
+       summaries := map[string]summary{}
+       gauges := map[string]gauge{}
+       counters := map[string]counter{}
        for _, e := range ents {
                for _, m := range e.Metric {
                        labels := map[string]string{}
                        for _, lbl := range m.Label {
                                labels[lbl.Name] = lbl.Value
                        }
-                       flat[e.Name+"/"+labels["method"]+"/"+labels["code"]] = m.Summary
+                       summaries[e.Name+"/"+labels["method"]+"/"+labels["code"]] = m.Summary
+                       counters[e.Name+"/"+labels["method"]+"/"+labels["code"]] = m.Counter
+                       gauges[e.Name+"/"+labels["method"]+"/"+labels["code"]] = m.Gauge
                }
        }
-       c.Check(flat["request_duration_seconds/get/200"].SampleSum, check.Not(check.Equals), 0)
-       c.Check(flat["request_duration_seconds/get/200"].SampleCount, check.Equals, "2")
-       c.Check(flat["request_duration_seconds/get/404"].SampleCount, check.Equals, "1")
-       c.Check(flat["time_to_status_seconds/get/404"].SampleCount, check.Equals, "1")
+       c.Check(summaries["request_duration_seconds/get/200"].SampleSum, check.Not(check.Equals), 0)
+       c.Check(summaries["request_duration_seconds/get/200"].SampleCount, check.Equals, "3")
+       c.Check(summaries["request_duration_seconds/get/404"].SampleCount, check.Equals, "1")
+       c.Check(summaries["time_to_status_seconds/get/404"].SampleCount, check.Equals, "1")
+       c.Check(counters["arvados_keepweb_collectioncache_requests//"].Value, check.Equals, int64(2))
+       c.Check(counters["arvados_keepweb_collectioncache_api_calls//"].Value, check.Equals, int64(1))
+       c.Check(counters["arvados_keepweb_collectioncache_hits//"].Value, check.Equals, int64(1))
+       c.Check(counters["arvados_keepweb_collectioncache_pdh_hits//"].Value, check.Equals, int64(1))
+       c.Check(counters["arvados_keepweb_collectioncache_permission_hits//"].Value, check.Equals, int64(1))
+       c.Check(gauges["arvados_keepweb_collectioncache_cached_manifests//"].Value, check.Equals, float64(1))
+       // FooCollection's cached manifest size is 45 ("1f4b0....+45") plus one 51-byte blob signature
+       c.Check(gauges["arvados_keepweb_collectioncache_cached_manifest_bytes//"].Value, check.Equals, float64(45+51))
 
        // If the Host header indicates a collection, /metrics.json
        // refers to a file in the collection -- the metrics handler
@@ -378,6 +415,7 @@ func (s *IntegrationSuite) SetUpSuite(c *check.C) {
        kc.PutB([]byte("Hello world\n"))
        kc.PutB([]byte("foo"))
        kc.PutB([]byte("foobar"))
+       kc.PutB([]byte("waz"))
 }
 
 func (s *IntegrationSuite) TearDownSuite(c *check.C) {
@@ -393,6 +431,7 @@ func (s *IntegrationSuite) SetUpTest(c *check.C) {
                Insecure: true,
        }
        cfg.Listen = "127.0.0.1:0"
+       cfg.ManagementToken = arvadostest.ManagementToken
        s.testServer = &server{Config: cfg}
        err := s.testServer.Start()
        c.Assert(err, check.Equals, nil)