X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/6613ec1e9c705fb5b950611fd160d4a2babed251..711711827bb0c3564836707bb7d4453c60c6a98c:/services/keep-web/server_test.go diff --git a/services/keep-web/server_test.go b/services/keep-web/server_test.go index 6441364e99..6688cc2ee7 100644 --- a/services/keep-web/server_test.go +++ b/services/keep-web/server_test.go @@ -1,11 +1,17 @@ +// Copyright (C) The Arvados Authors. All rights reserved. +// +// SPDX-License-Identifier: AGPL-3.0 + package main import ( "crypto/md5" + "encoding/json" "fmt" "io" "io/ioutil" "net" + "net/http" "os" "os/exec" "strings" @@ -55,7 +61,6 @@ func (s *IntegrationSuite) TestNoToken(c *check.C) { func (s *IntegrationSuite) Test404(c *check.C) { for _, uri := range []string{ // Routing errors (always 404 regardless of what's stored in Keep) - "/", "/foo", "/download", "/collections", @@ -77,7 +82,9 @@ func (s *IntegrationSuite) Test404(c *check.C) { } { hdr, body, _ := s.runCurl(c, arvadostest.ActiveToken, "collections.example.com", uri) c.Check(hdr, check.Matches, "(?s)HTTP/1.1 404 Not Found\r\n.*") - c.Check(body, check.Equals, "") + if len(body) > 0 { + c.Check(body, check.Equals, "404 page not found\n") + } } } @@ -267,7 +274,6 @@ func (s *IntegrationSuite) runCurl(c *check.C, token, host, uri string, args ... // Discard (but measure size of) anything past 128 MiB. var discarded int64 if err == io.ErrUnexpectedEOF { - err = nil buf = buf[:n] } else { c.Assert(err, check.Equals, nil) @@ -290,6 +296,76 @@ func (s *IntegrationSuite) runCurl(c *check.C, token, host, uri string, args ... return } +func (s *IntegrationSuite) TestMetrics(c *check.C) { + origin := "http://" + s.testServer.Addr + req, _ := http.NewRequest("GET", origin+"/notfound", nil) + _, err := http.DefaultClient.Do(req) + c.Assert(err, check.IsNil) + req, _ = http.NewRequest("GET", origin+"/by_id/", nil) + 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) + 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")) + + 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) + type summary struct { + SampleCount string `json:"sample_count"` + SampleSum float64 `json:"sample_sum"` + Quantile []struct { + Quantile float64 + Value float64 + } + } + var ents []struct { + Name string + Help string + Type string + Metric []struct { + Label []struct { + Name string + Value string + } + Summary summary + } + } + json.NewDecoder(resp.Body).Decode(&ents) + flat := map[string]summary{} + 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 + } + } + 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") + + // If the Host header indicates a collection, /metrics.json + // refers to a file in the collection -- the metrics handler + // must not intercept that route. + req, _ = http.NewRequest("GET", origin+"/metrics.json", nil) + req.Host = strings.Replace(arvadostest.FooCollectionPDH, "+", "-", -1) + ".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.StatusNotFound) +} + func (s *IntegrationSuite) SetUpSuite(c *check.C) { arvadostest.StartAPI() arvadostest.StartKeep(2, true) @@ -311,13 +387,13 @@ func (s *IntegrationSuite) TearDownSuite(c *check.C) { func (s *IntegrationSuite) SetUpTest(c *check.C) { arvadostest.ResetEnv() - s.testServer = &server{Config: &Config{ - Client: arvados.Client{ - APIHost: testAPIHost, - Insecure: true, - }, - Listen: "127.0.0.1:0", - }} + cfg := DefaultConfig() + cfg.Client = arvados.Client{ + APIHost: testAPIHost, + Insecure: true, + } + cfg.Listen = "127.0.0.1:0" + s.testServer = &server{Config: cfg} err := s.testServer.Start() c.Assert(err, check.Equals, nil) }