github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/apiserver/apiservermetrics_test.go (about) 1 // Copyright 2017 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENSE file for details. 3 4 package apiserver_test 5 6 import ( 7 "fmt" 8 "regexp" 9 10 "github.com/juju/testing" 11 jc "github.com/juju/testing/checkers" 12 "github.com/prometheus/client_golang/prometheus" 13 gc "gopkg.in/check.v1" 14 15 "github.com/juju/juju/apiserver" 16 "github.com/juju/juju/version" 17 ) 18 19 type apiservermetricsSuite struct { 20 testing.IsolationSuite 21 collector prometheus.Collector 22 } 23 24 var _ = gc.Suite(&apiservermetricsSuite{}) 25 26 func (s *apiservermetricsSuite) SetUpTest(c *gc.C) { 27 s.IsolationSuite.SetUpTest(c) 28 s.collector = apiserver.NewMetricsCollector() 29 } 30 31 func (s *apiservermetricsSuite) TestDescribe(c *gc.C) { 32 ch := make(chan *prometheus.Desc) 33 go func() { 34 defer close(ch) 35 s.collector.Describe(ch) 36 }() 37 var descs []*prometheus.Desc 38 for desc := range ch { 39 descs = append(descs, desc) 40 } 41 c.Assert(descs, gc.HasLen, 11) 42 c.Assert(descs[0].String(), gc.Matches, `.*fqName: "juju_apiserver_connections_total".*`) 43 c.Assert(descs[1].String(), gc.Matches, `.*fqName: "juju_apiserver_connections".*`) 44 c.Assert(descs[2].String(), gc.Matches, `.*fqName: "juju_apiserver_active_login_attempts".*`) 45 c.Assert(descs[3].String(), gc.Matches, `.*fqName: "juju_apiserver_request_duration_seconds".*`) 46 c.Assert(descs[4].String(), gc.Matches, `.*fqName: "juju_apiserver_ping_failure_count".*`) 47 c.Assert(descs[5].String(), gc.Matches, `.*fqName: "juju_apiserver_log_write_count".*`) 48 c.Assert(descs[6].String(), gc.Matches, `.*fqName: "juju_apiserver_log_read_count".*`) 49 50 c.Assert(descs[7].String(), gc.Matches, `.*fqName: "juju_apiserver_outbound_requests_total".*`) 51 c.Assert(descs[8].String(), gc.Matches, `.*fqName: "juju_apiserver_outbound_request_errors_total".*`) 52 c.Assert(descs[9].String(), gc.Matches, `.*fqName: "juju_apiserver_outbound_request_duration_seconds".*`) 53 build_info_description := descs[10].String() 54 c.Check(build_info_description, gc.Matches, `.*fqName: "juju_apiserver_build_info".*`) 55 // Ensure that the current version of the Juju controller is one of the const labels on the 56 //build_info metric. 57 expectedVersionRe := fmt.Sprintf(`.*constLabels:.*version="%s".*`, 58 regexp.QuoteMeta(version.Current.String())) 59 c.Check(build_info_description, gc.Matches, expectedVersionRe) 60 } 61 62 func (s *apiservermetricsSuite) TestCollect(c *gc.C) { 63 ch := make(chan prometheus.Metric) 64 go func() { 65 defer close(ch) 66 s.collector.Collect(ch) 67 }() 68 69 var metrics []prometheus.Metric 70 for metric := range ch { 71 metrics = append(metrics, metric) 72 } 73 c.Assert(metrics, gc.HasLen, 3) 74 } 75 76 func (s *apiservermetricsSuite) TestLabelNames(c *gc.C) { 77 // This is the prometheus label specs. 78 labelNameRE := regexp.MustCompile("^[a-zA-Z_][a-zA-Z0-9_]*$") 79 testCases := []struct { 80 name string 81 labels []string 82 checker gc.Checker 83 }{ 84 { 85 name: "api connections label names", 86 labels: apiserver.MetricAPIConnectionsLabelNames, 87 checker: jc.IsTrue, 88 }, 89 { 90 name: "ping failure label names", 91 labels: apiserver.MetricPingFailureLabelNames, 92 checker: jc.IsTrue, 93 }, 94 { 95 name: "log failure label names", 96 labels: apiserver.MetricLogLabelNames, 97 checker: jc.IsTrue, 98 }, 99 { 100 name: "total requests with status label names", 101 labels: apiserver.MetricTotalRequestsWithStatusLabelNames, 102 checker: jc.IsTrue, 103 }, 104 { 105 name: "total requests label names", 106 labels: apiserver.MetricTotalRequestsLabelNames, 107 checker: jc.IsTrue, 108 }, 109 { 110 name: "invalid names", 111 labels: []string{"model-uuid"}, 112 checker: jc.IsFalse, 113 }, 114 } 115 116 for i, testCase := range testCases { 117 c.Logf("running test %d", i) 118 for k, label := range testCase.labels { 119 c.Assert(labelNameRE.MatchString(label), testCase.checker, gc.Commentf("%d %s", k, testCase.name)) 120 } 121 } 122 }