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  }