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 }