github.com/cockroachdb/cockroach@v20.2.0-alpha.1+incompatible/pkg/util/metric/prometheus_exporter_test.go (about)

     1  // Copyright 2016 The Cockroach Authors.
     2  //
     3  // Use of this software is governed by the Business Source License
     4  // included in the file licenses/BSL.txt.
     5  //
     6  // As of the Change Date specified in that file, in accordance with
     7  // the Business Source License, use of this software will be governed
     8  // by the Apache License, Version 2.0, included in the file
     9  // licenses/APL.txt.
    10  
    11  package metric
    12  
    13  import "testing"
    14  
    15  func TestPrometheusExporter(t *testing.T) {
    16  	r1, r2 := NewRegistry(), NewRegistry()
    17  	// r2 has a registry-level label, r1 does not.
    18  	r2.AddLabel("registry", "two")
    19  
    20  	r1.AddMetric(NewGauge(Metadata{Name: "one.gauge"}))
    21  	r2.AddMetric(NewGauge(Metadata{Name: "two.gauge"}))
    22  
    23  	c1Meta := Metadata{Name: "shared.counter"}
    24  	c1Meta.AddLabel("counter", "one")
    25  	c2Meta := Metadata{Name: "shared.counter"}
    26  	c2Meta.AddLabel("counter", "two")
    27  
    28  	r1.AddMetric(NewCounter(c1Meta))
    29  	r2.AddMetric(NewCounter(c2Meta))
    30  
    31  	pe := MakePrometheusExporter()
    32  	pe.ScrapeRegistry(r1)
    33  	pe.ScrapeRegistry(r2)
    34  
    35  	type metricLabels map[string]string
    36  	type family struct {
    37  		// List of metric. The order depends on the order of "AddMetricsFromRegistry".
    38  		// Each entry is a list of labels for the metric at that index,  "registry labels" followed by
    39  		// "metric labels" in the order they were added.
    40  		metrics []metricLabels
    41  	}
    42  
    43  	expected := map[string]family{
    44  		"one_gauge": {[]metricLabels{
    45  			{},
    46  		}},
    47  		"two_gauge": {[]metricLabels{
    48  			{"registry": "two"},
    49  		}},
    50  		"shared_counter": {[]metricLabels{
    51  			{"counter": "one"},
    52  			{"counter": "two", "registry": "two"},
    53  		}},
    54  	}
    55  
    56  	if lenExpected, lenExporter := len(expected), len(pe.families); lenExpected != lenExporter {
    57  		t.Errorf("wrong number of families, expected %d, got %d", lenExpected, lenExporter)
    58  	}
    59  
    60  	for name, fam := range expected {
    61  		fam2, ok := pe.families[name]
    62  		if !ok {
    63  			t.Errorf("exporter does not have metric family named %s", name)
    64  		}
    65  		if lenExpected, lenExporter := len(fam.metrics), len(fam2.GetMetric()); lenExpected != lenExporter {
    66  			t.Errorf("wrong number of metrics for family %s, expected %d, got %d", name, lenExpected, lenExporter)
    67  		}
    68  		for i, met := range fam2.GetMetric() {
    69  			expectedLabels := fam.metrics[i]
    70  			if lenExpected, lenExporter := len(expectedLabels), len(met.Label); lenExpected != lenExporter {
    71  				t.Errorf("wrong number of labels for metric %d in family %s, expected %d, got %d",
    72  					i, name, lenExpected, lenExporter)
    73  			}
    74  			for _, l := range met.Label {
    75  				if val, ok := expectedLabels[l.GetName()]; !ok {
    76  					t.Errorf("unexpected label name %s for metric %d in family %s", l.GetName(), i, name)
    77  				} else if val != l.GetValue() {
    78  					t.Errorf("label %s for metric %d in family %s has value %s, expected %s",
    79  						l.GetName(), i, name, l.GetValue(), val)
    80  				}
    81  			}
    82  		}
    83  	}
    84  
    85  	// Test Gather
    86  	families, err := pe.Gather()
    87  	if err != nil {
    88  		t.Errorf("unexpected error from Gather(): %v", err)
    89  	}
    90  	for _, fam := range families {
    91  		if len(fam.Metric) == 0 {
    92  			t.Errorf("gathered %s has no data points", fam.GetName())
    93  		}
    94  	}
    95  
    96  	// Test clearMetrics
    97  	pe.clearMetrics()
    98  	for _, fam := range pe.families {
    99  		if numPoints := len(fam.Metric); numPoints != 0 {
   100  			t.Errorf("%s has %d data points, want 0", fam.GetName(), numPoints)
   101  		}
   102  	}
   103  	// Check families returned by Gather are empty, right after calling clearMetrics
   104  	// before another call to scrape.
   105  	families, err = pe.Gather()
   106  	if err != nil {
   107  		t.Errorf("unexpected error from Gather(): %v", err)
   108  	}
   109  	for _, fam := range families {
   110  		if num := len(fam.Metric); num != 0 {
   111  			t.Errorf("gathered %s has %d data points but expect none", fam.GetName(), num)
   112  		}
   113  	}
   114  }