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