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  }