github.com/hashicorp/go-metrics@v0.5.3/statsite_test.go (about) 1 package metrics 2 3 import ( 4 "bufio" 5 "net" 6 "net/url" 7 "strings" 8 "testing" 9 "time" 10 ) 11 12 func TestStatsite_Flatten(t *testing.T) { 13 s := &StatsiteSink{} 14 flat := s.flattenKey([]string{"a", "b", "c", "d"}) 15 if flat != "a.b.c.d" { 16 t.Fatalf("Bad flat") 17 } 18 } 19 20 func TestStatsite_PushFullQueue(t *testing.T) { 21 q := make(chan string, 1) 22 q <- "full" 23 24 s := &StatsiteSink{metricQueue: q} 25 s.pushMetric("omit") 26 27 out := <-q 28 if out != "full" { 29 t.Fatalf("bad val %v", out) 30 } 31 32 select { 33 case v := <-q: 34 t.Fatalf("bad val %v", v) 35 default: 36 } 37 } 38 39 func TestStatsite_Conn(t *testing.T) { 40 addr := "localhost:7523" 41 42 ln, _ := net.Listen("tcp", addr) 43 44 done := make(chan bool) 45 go func() { 46 conn, err := ln.Accept() 47 if err != nil { 48 t.Fatalf("unexpected err %s", err) 49 } 50 51 reader := bufio.NewReader(conn) 52 53 line, err := reader.ReadString('\n') 54 if err != nil { 55 t.Fatalf("unexpected err %s", err) 56 } 57 if line != "gauge.val:1.000000|g\n" { 58 t.Fatalf("bad line %s", line) 59 } 60 61 line, err = reader.ReadString('\n') 62 if err != nil { 63 t.Fatalf("unexpected err %s", err) 64 } 65 if line != "gauge_labels.val.label:2.000000|g\n" { 66 t.Fatalf("bad line %s", line) 67 } 68 69 line, err = reader.ReadString('\n') 70 if err != nil { 71 t.Fatalf("unexpected err %s", err) 72 } 73 if line != "key.other:3.000000|kv\n" { 74 t.Fatalf("bad line %s", line) 75 } 76 77 line, err = reader.ReadString('\n') 78 if err != nil { 79 t.Fatalf("unexpected err %s", err) 80 } 81 if line != "counter.me:4.000000|c\n" { 82 t.Fatalf("bad line %s", line) 83 } 84 85 line, err = reader.ReadString('\n') 86 if err != nil { 87 t.Fatalf("unexpected err %s", err) 88 } 89 if line != "counter_labels.me.label:5.000000|c\n" { 90 t.Fatalf("bad line %s", line) 91 } 92 93 line, err = reader.ReadString('\n') 94 if err != nil { 95 t.Fatalf("unexpected err %s", err) 96 } 97 if line != "sample.slow_thingy:6.000000|ms\n" { 98 t.Fatalf("bad line %s", line) 99 } 100 101 line, err = reader.ReadString('\n') 102 if err != nil { 103 t.Fatalf("unexpected err %s", err) 104 } 105 if line != "sample_labels.slow_thingy.label:7.000000|ms\n" { 106 t.Fatalf("bad line %s", line) 107 } 108 109 conn.Close() 110 done <- true 111 }() 112 s, err := NewStatsiteSink(addr) 113 if err != nil { 114 t.Fatalf("bad error") 115 } 116 117 s.SetGauge([]string{"gauge", "val"}, float32(1)) 118 s.SetGaugeWithLabels([]string{"gauge_labels", "val"}, float32(2), []Label{{"a", "label"}}) 119 s.SetPrecisionGauge([]string{"gauge", "val"}, float64(1)) 120 s.SetPrecisionGaugeWithLabels([]string{"gauge_labels", "val"}, float64(2), []Label{{"a", "label"}}) 121 s.EmitKey([]string{"key", "other"}, float32(3)) 122 s.IncrCounter([]string{"counter", "me"}, float32(4)) 123 s.IncrCounterWithLabels([]string{"counter_labels", "me"}, float32(5), []Label{{"a", "label"}}) 124 s.AddSample([]string{"sample", "slow thingy"}, float32(6)) 125 s.AddSampleWithLabels([]string{"sample_labels", "slow thingy"}, float32(7), []Label{{"a", "label"}}) 126 127 select { 128 case <-done: 129 s.Shutdown() 130 case <-time.After(3 * time.Second): 131 t.Fatalf("timeout") 132 } 133 } 134 135 func TestNewStatsiteSinkFromURL(t *testing.T) { 136 for _, tc := range []struct { 137 desc string 138 input string 139 expectErr string 140 expectAddr string 141 }{ 142 { 143 desc: "address is populated", 144 input: "statsd://statsd.service.consul", 145 expectAddr: "statsd.service.consul", 146 }, 147 { 148 desc: "address includes port", 149 input: "statsd://statsd.service.consul:1234", 150 expectAddr: "statsd.service.consul:1234", 151 }, 152 } { 153 t.Run(tc.desc, func(t *testing.T) { 154 u, err := url.Parse(tc.input) 155 if err != nil { 156 t.Fatalf("error parsing URL: %s", err) 157 } 158 ms, err := NewStatsiteSinkFromURL(u) 159 if tc.expectErr != "" { 160 if !strings.Contains(err.Error(), tc.expectErr) { 161 t.Fatalf("expected err: %q, to contain: %q", err, tc.expectErr) 162 } 163 } else { 164 if err != nil { 165 t.Fatalf("unexpected err: %s", err) 166 } 167 is := ms.(*StatsiteSink) 168 if is.addr != tc.expectAddr { 169 t.Fatalf("expected addr %s, got: %s", tc.expectAddr, is.addr) 170 } 171 } 172 }) 173 } 174 }