github.com/cockroachdb/cockroach@v20.2.0-alpha.1+incompatible/pkg/server/status/health_check_test.go (about) 1 // Copyright 2018 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 status 12 13 import ( 14 "strings" 15 "testing" 16 17 "github.com/cockroachdb/cockroach/pkg/util/leaktest" 18 "github.com/kr/pretty" 19 ) 20 21 func TestHealthCheckMetricsMap(t *testing.T) { 22 defer leaktest.AfterTest(t)() 23 24 m := metricsMap{} 25 26 tracked := map[string]threshold{ 27 "gauge0": gaugeZero, 28 "gauge1": gaugeZero, 29 "gauge2": {gauge: true, min: 100}, 30 "counter0": counterZero, 31 "counter1": counterZero, 32 "counter2": {min: 100}, 33 } 34 35 check := func(act, exp metricsMap) { 36 t.Helper() 37 if diff := pretty.Diff(act, exp); len(diff) != 0 { 38 t.Fatalf("diff(act,exp) = %s\n\nact=%+v\nexp=%+v", strings.Join(diff, "\n"), act, exp) 39 } 40 } 41 42 // A gauge and a counter show up. 43 check(m.update(tracked, metricsMap{ 44 0: { 45 "gauge0": 1, 46 "counter0": 12, 47 }, 48 1: { 49 "gauge0": 10, 50 "counter2": 0, 51 }, 52 }), metricsMap{ 53 0: {"gauge0": 1}, 54 1: {"gauge0": 10}, 55 }) 56 57 check(m, metricsMap{ 58 0: { 59 "counter0": 12, 60 }, 61 1: { 62 "counter2": 0, 63 }, 64 }) 65 66 // A counter increments for the second time, and another one shows up for the 67 // first time. The thresholded counter moves, but stays below threshold. 68 check(m.update(tracked, metricsMap{ 69 0: { 70 "counter0": 14, 71 "counter1": 5, 72 }, 73 1: { 74 "counter2": 100, // barely misses threshold 75 }, 76 }), metricsMap{ 77 0: {"counter0": 2}, 78 }) 79 80 check(m, metricsMap{ 81 0: { 82 "counter0": 14, 83 "counter1": 5, 84 }, 85 1: { 86 "counter2": 100, 87 }, 88 }) 89 90 // A gauge shows up for the second time. A counter we've seen before increments, 91 // but on a different store (so it's really a first time still). The thresholded 92 // counter jumps by the threshold value (note that counter thresholds aren't 93 // really that useful, except as a very poor man's rate limiter). 94 check(m.update(tracked, metricsMap{ 95 1: { 96 "gauge0": 12, 97 "counter1": 9, 98 "counter2": 201, 99 }, 100 }), metricsMap{ 101 1: { 102 "gauge0": 12, 103 "counter2": 101, 104 }, 105 }) 106 107 check(m, metricsMap{ 108 0: { 109 "counter0": 14, 110 "counter1": 5, 111 }, 112 1: { 113 "counter1": 9, 114 "counter2": 201, 115 }, 116 }) 117 118 // Both metrics we've seen before change. One increments (expected) and one 119 // decrements (we never do that in practice). 120 check(m.update(tracked, metricsMap{ 121 0: { 122 "counter0": 3, 123 "counter1": 10, 124 }, 125 1: { 126 "counter1": 4, 127 }, 128 }), metricsMap{ 129 0: { 130 "counter1": 5, 131 }, 132 }) 133 134 finalMap := metricsMap{ 135 0: { 136 "counter0": 3, 137 "counter1": 10, 138 }, 139 1: { 140 "counter1": 4, 141 "counter2": 201, 142 }, 143 } 144 check(m, finalMap) 145 146 // Nothing changes, except something we don't track. 147 check(m.update(tracked, metricsMap{1: {"banana": 100}}), metricsMap{}) 148 check(m.update(tracked, metricsMap{1: {"banana": 300}}), metricsMap{}) 149 check(m, finalMap) 150 }