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  }