github.com/jjneely/statsdaemon@v0.7.1/statsdaemon_test.go (about)

     1  package main
     2  
     3  import (
     4  	"bytes"
     5  	"flag"
     6  	"math"
     7  	"math/rand"
     8  	"net"
     9  	"strconv"
    10  	"sync"
    11  	"testing"
    12  	"time"
    13  
    14  	"github.com/bmizerany/assert"
    15  )
    16  
    17  var commonPercentiles = Percentiles{
    18  	&Percentile{
    19  		99,
    20  		"99",
    21  	},
    22  }
    23  
    24  func TestParseLineGauge(t *testing.T) {
    25  	d := []byte("gaugor:333|g")
    26  	packet := parseLine(d)
    27  	assert.NotEqual(t, packet, nil)
    28  	assert.Equal(t, "gaugor", packet.Bucket)
    29  	assert.Equal(t, GaugeData{false, false, 333}, packet.Value)
    30  	assert.Equal(t, "g", packet.Modifier)
    31  	assert.Equal(t, float32(1), packet.Sampling)
    32  
    33  	d = []byte("gaugor:-10|g")
    34  	packet = parseLine(d)
    35  	assert.NotEqual(t, packet, nil)
    36  	assert.Equal(t, "gaugor", packet.Bucket)
    37  	assert.Equal(t, GaugeData{true, true, 10}, packet.Value)
    38  	assert.Equal(t, "g", packet.Modifier)
    39  	assert.Equal(t, float32(1), packet.Sampling)
    40  
    41  	d = []byte("gaugor:+4|g")
    42  	packet = parseLine(d)
    43  	assert.NotEqual(t, packet, nil)
    44  	assert.Equal(t, "gaugor", packet.Bucket)
    45  	assert.Equal(t, GaugeData{true, false, 4}, packet.Value)
    46  	assert.Equal(t, "g", packet.Modifier)
    47  	assert.Equal(t, float32(1), packet.Sampling)
    48  
    49  	// >max(int64) && <max(uint64)
    50  	d = []byte("gaugor:18446744073709551606|g")
    51  	packet = parseLine(d)
    52  	assert.NotEqual(t, packet, nil)
    53  	assert.Equal(t, "gaugor", packet.Bucket)
    54  	assert.Equal(t, GaugeData{false, false, 18446744073709551606}, packet.Value)
    55  	assert.Equal(t, "g", packet.Modifier)
    56  	assert.Equal(t, float32(1), packet.Sampling)
    57  }
    58  
    59  func TestParseLineCount(t *testing.T) {
    60  	d := []byte("gorets:2|c|@0.1")
    61  	packet := parseLine(d)
    62  	assert.NotEqual(t, packet, nil)
    63  	assert.Equal(t, "gorets", packet.Bucket)
    64  	assert.Equal(t, int64(2), packet.Value.(int64))
    65  	assert.Equal(t, "c", packet.Modifier)
    66  	assert.Equal(t, float32(0.1), packet.Sampling)
    67  
    68  	d = []byte("gorets:4|c")
    69  	packet = parseLine(d)
    70  	assert.NotEqual(t, packet, nil)
    71  	assert.Equal(t, "gorets", packet.Bucket)
    72  	assert.Equal(t, int64(4), packet.Value.(int64))
    73  	assert.Equal(t, "c", packet.Modifier)
    74  	assert.Equal(t, float32(1), packet.Sampling)
    75  
    76  	d = []byte("gorets:-4|c")
    77  	packet = parseLine(d)
    78  	assert.NotEqual(t, packet, nil)
    79  	assert.Equal(t, "gorets", packet.Bucket)
    80  	assert.Equal(t, int64(-4), packet.Value.(int64))
    81  	assert.Equal(t, "c", packet.Modifier)
    82  	assert.Equal(t, float32(1), packet.Sampling)
    83  }
    84  
    85  func TestParseLineTimer(t *testing.T) {
    86  	d := []byte("glork:320|ms")
    87  	packet := parseLine(d)
    88  	assert.NotEqual(t, packet, nil)
    89  	assert.Equal(t, "glork", packet.Bucket)
    90  	assert.Equal(t, uint64(320), packet.Value.(uint64))
    91  	assert.Equal(t, "ms", packet.Modifier)
    92  	assert.Equal(t, float32(1), packet.Sampling)
    93  
    94  	d = []byte("glork:320|ms|@0.1")
    95  	packet = parseLine(d)
    96  	assert.NotEqual(t, packet, nil)
    97  	assert.Equal(t, "glork", packet.Bucket)
    98  	assert.Equal(t, uint64(320), packet.Value.(uint64))
    99  	assert.Equal(t, "ms", packet.Modifier)
   100  	assert.Equal(t, float32(0.1), packet.Sampling)
   101  }
   102  
   103  func TestParseLineSet(t *testing.T) {
   104  	d := []byte("uniques:765|s")
   105  	packet := parseLine(d)
   106  	assert.NotEqual(t, packet, nil)
   107  	assert.Equal(t, "uniques", packet.Bucket)
   108  	assert.Equal(t, "765", packet.Value)
   109  	assert.Equal(t, "s", packet.Modifier)
   110  	assert.Equal(t, float32(1), packet.Sampling)
   111  }
   112  
   113  func TestParseLineMisc(t *testing.T) {
   114  	d := []byte("a.key.with-0.dash:4|c")
   115  	packet := parseLine(d)
   116  	assert.NotEqual(t, packet, nil)
   117  	assert.Equal(t, "a.key.with-0.dash", packet.Bucket)
   118  	assert.Equal(t, int64(4), packet.Value.(int64))
   119  	assert.Equal(t, "c", packet.Modifier)
   120  	assert.Equal(t, float32(1), packet.Sampling)
   121  
   122  	d = []byte("a.key.with 0.space:4|c")
   123  	packet = parseLine(d)
   124  	assert.Equal(t, "a.key.with_0.space", packet.Bucket)
   125  	assert.Equal(t, int64(4), packet.Value.(int64))
   126  	assert.Equal(t, "c", packet.Modifier)
   127  	assert.Equal(t, float32(1), packet.Sampling)
   128  
   129  	d = []byte("a.key.with/0.slash:4|c")
   130  	packet = parseLine(d)
   131  	assert.Equal(t, "a.key.with-0.slash", packet.Bucket)
   132  	assert.Equal(t, int64(4), packet.Value.(int64))
   133  	assert.Equal(t, "c", packet.Modifier)
   134  	assert.Equal(t, float32(1), packet.Sampling)
   135  
   136  	d = []byte("a.key.with@#*&%$^_0.garbage:4|c")
   137  	packet = parseLine(d)
   138  	assert.Equal(t, "a.key.with_0.garbage", packet.Bucket)
   139  	assert.Equal(t, int64(4), packet.Value.(int64))
   140  	assert.Equal(t, "c", packet.Modifier)
   141  	assert.Equal(t, float32(1), packet.Sampling)
   142  
   143  	flag.Set("prefix", "test.")
   144  	d = []byte("prefix:4|c")
   145  	packet = parseLine(d)
   146  	assert.Equal(t, "test.prefix", packet.Bucket)
   147  	assert.Equal(t, int64(4), packet.Value.(int64))
   148  	assert.Equal(t, "c", packet.Modifier)
   149  	assert.Equal(t, float32(1), packet.Sampling)
   150  	flag.Set("prefix", "")
   151  
   152  	flag.Set("postfix", ".test")
   153  	d = []byte("postfix:4|c")
   154  	packet = parseLine(d)
   155  	assert.Equal(t, "postfix.test", packet.Bucket)
   156  	assert.Equal(t, int64(4), packet.Value.(int64))
   157  	assert.Equal(t, "c", packet.Modifier)
   158  	assert.Equal(t, float32(1), packet.Sampling)
   159  	flag.Set("postfix", "")
   160  
   161  	d = []byte("a.key.with-0.dash:4|c\ngauge:3|g")
   162  	parser := NewParser(bytes.NewBuffer(d), true)
   163  	packet, more := parser.Next()
   164  	assert.Equal(t, more, true)
   165  	assert.Equal(t, "a.key.with-0.dash", packet.Bucket)
   166  	assert.Equal(t, int64(4), packet.Value.(int64))
   167  	assert.Equal(t, "c", packet.Modifier)
   168  	assert.Equal(t, float32(1), packet.Sampling)
   169  
   170  	packet, more = parser.Next()
   171  	assert.Equal(t, more, false)
   172  	assert.Equal(t, "gauge", packet.Bucket)
   173  	assert.Equal(t, GaugeData{false, false, 3}, packet.Value)
   174  	assert.Equal(t, "g", packet.Modifier)
   175  	assert.Equal(t, float32(1), packet.Sampling)
   176  
   177  	d = []byte("a.key.with-0.dash:4\ngauge3|g")
   178  	packet = parseLine(d)
   179  	if packet != nil {
   180  		t.Fail()
   181  	}
   182  
   183  	d = []byte("a.key.with-0.dash:4")
   184  	packet = parseLine(d)
   185  	if packet != nil {
   186  		t.Fail()
   187  	}
   188  
   189  	d = []byte("gorets:5m")
   190  	packet = parseLine(d)
   191  	if packet != nil {
   192  		t.Fail()
   193  	}
   194  
   195  	d = []byte("gorets")
   196  	packet = parseLine(d)
   197  	if packet != nil {
   198  		t.Fail()
   199  	}
   200  
   201  	d = []byte("gorets:")
   202  	packet = parseLine(d)
   203  	if packet != nil {
   204  		t.Fail()
   205  	}
   206  
   207  	d = []byte("gorets:5|mg")
   208  	packet = parseLine(d)
   209  	if packet != nil {
   210  		t.Fail()
   211  	}
   212  
   213  	d = []byte("gorets:5|ms|@")
   214  	packet = parseLine(d)
   215  	if packet != nil {
   216  		t.Fail()
   217  	}
   218  
   219  	d = []byte("")
   220  	packet = parseLine(d)
   221  	if packet != nil {
   222  		t.Fail()
   223  	}
   224  
   225  	d = []byte("gorets:xxx|c")
   226  	packet = parseLine(d)
   227  	if packet != nil {
   228  		t.Fail()
   229  	}
   230  
   231  	d = []byte("gaugor:xxx|g")
   232  	packet = parseLine(d)
   233  	if packet != nil {
   234  		t.Fail()
   235  	}
   236  
   237  	d = []byte("gaugor:xxx|z")
   238  	packet = parseLine(d)
   239  	if packet != nil {
   240  		t.Fail()
   241  	}
   242  
   243  	d = []byte("deploys.test.myservice4:100|t")
   244  	packet = parseLine(d)
   245  	if packet != nil {
   246  		t.Fail()
   247  	}
   248  
   249  	d = []byte("up-to-colon:")
   250  	packet = parseLine(d)
   251  	if packet != nil {
   252  		t.Fail()
   253  	}
   254  
   255  	d = []byte("up-to-pipe:1|")
   256  	packet = parseLine(d)
   257  	if packet != nil {
   258  		t.Fail()
   259  	}
   260  }
   261  
   262  func TestMultiLine(t *testing.T) {
   263  	b := bytes.NewBuffer([]byte("a.key.with-0.dash:4|c\ngauge:3|g"))
   264  	parser := NewParser(b, true)
   265  
   266  	packet, more := parser.Next()
   267  	assert.NotEqual(t, packet, nil)
   268  	assert.Equal(t, more, true)
   269  	assert.Equal(t, "a.key.with-0.dash", packet.Bucket)
   270  	assert.Equal(t, int64(4), packet.Value.(int64))
   271  	assert.Equal(t, "c", packet.Modifier)
   272  	assert.Equal(t, float32(1), packet.Sampling)
   273  
   274  	packet, more = parser.Next()
   275  	assert.NotEqual(t, packet, nil)
   276  	assert.Equal(t, more, false)
   277  	assert.Equal(t, "gauge", packet.Bucket)
   278  	assert.Equal(t, GaugeData{false, false, 3}, packet.Value)
   279  	assert.Equal(t, "g", packet.Modifier)
   280  	assert.Equal(t, float32(1), packet.Sampling)
   281  }
   282  
   283  func TestPacketHandlerReceiveCounter(t *testing.T) {
   284  	counters = make(map[string]int64)
   285  	*receiveCounter = "countme"
   286  
   287  	p := &Packet{
   288  		Bucket:   "gorets",
   289  		Value:    int64(100),
   290  		Modifier: "c",
   291  		Sampling: float32(1),
   292  	}
   293  	packetHandler(p)
   294  	assert.Equal(t, counters["countme"], int64(1))
   295  
   296  	packetHandler(p)
   297  	assert.Equal(t, counters["countme"], int64(2))
   298  }
   299  
   300  func TestPacketHandlerCount(t *testing.T) {
   301  	counters = make(map[string]int64)
   302  
   303  	p := &Packet{
   304  		Bucket:   "gorets",
   305  		Value:    int64(100),
   306  		Modifier: "c",
   307  		Sampling: float32(1),
   308  	}
   309  	packetHandler(p)
   310  	assert.Equal(t, counters["gorets"], int64(100))
   311  
   312  	p.Value = int64(3)
   313  	packetHandler(p)
   314  	assert.Equal(t, counters["gorets"], int64(103))
   315  
   316  	p.Value = int64(-4)
   317  	packetHandler(p)
   318  	assert.Equal(t, counters["gorets"], int64(99))
   319  
   320  	p.Value = int64(-100)
   321  	packetHandler(p)
   322  	assert.Equal(t, counters["gorets"], int64(-1))
   323  }
   324  
   325  func TestPacketHandlerGauge(t *testing.T) {
   326  	gauges = make(map[string]uint64)
   327  
   328  	p := &Packet{
   329  		Bucket:   "gaugor",
   330  		Value:    GaugeData{false, false, 333},
   331  		Modifier: "g",
   332  		Sampling: float32(1),
   333  	}
   334  	packetHandler(p)
   335  	assert.Equal(t, gauges["gaugor"], uint64(333))
   336  
   337  	// -10
   338  	p.Value = GaugeData{true, true, 10}
   339  	packetHandler(p)
   340  	assert.Equal(t, gauges["gaugor"], uint64(323))
   341  
   342  	// +4
   343  	p.Value = GaugeData{true, false, 4}
   344  	packetHandler(p)
   345  	assert.Equal(t, gauges["gaugor"], uint64(327))
   346  
   347  	// <0 overflow
   348  	p.Value = GaugeData{false, false, 10}
   349  	packetHandler(p)
   350  	p.Value = GaugeData{true, true, 20}
   351  	packetHandler(p)
   352  	assert.Equal(t, gauges["gaugor"], uint64(0))
   353  
   354  	// >2^64 overflow
   355  	p.Value = GaugeData{false, false, uint64(math.MaxUint64 - 10)}
   356  	packetHandler(p)
   357  	p.Value = GaugeData{true, false, 20}
   358  	packetHandler(p)
   359  	assert.Equal(t, gauges["gaugor"], uint64(math.MaxUint64))
   360  }
   361  
   362  func TestPacketHandlerTimer(t *testing.T) {
   363  	timers = make(map[string]Uint64Slice)
   364  
   365  	p := &Packet{
   366  		Bucket:   "glork",
   367  		Value:    uint64(320),
   368  		Modifier: "ms",
   369  		Sampling: float32(1),
   370  	}
   371  	packetHandler(p)
   372  	assert.Equal(t, len(timers["glork"]), 1)
   373  	assert.Equal(t, timers["glork"][0], uint64(320))
   374  
   375  	p.Value = uint64(100)
   376  	packetHandler(p)
   377  	assert.Equal(t, len(timers["glork"]), 2)
   378  	assert.Equal(t, timers["glork"][1], uint64(100))
   379  }
   380  
   381  func TestPacketHandlerSet(t *testing.T) {
   382  	sets = make(map[string][]string)
   383  
   384  	p := &Packet{
   385  		Bucket:   "uniques",
   386  		Value:    "765",
   387  		Modifier: "s",
   388  		Sampling: float32(1),
   389  	}
   390  	packetHandler(p)
   391  	assert.Equal(t, len(sets["uniques"]), 1)
   392  	assert.Equal(t, sets["uniques"][0], "765")
   393  
   394  	p.Value = "567"
   395  	packetHandler(p)
   396  	assert.Equal(t, len(sets["uniques"]), 2)
   397  	assert.Equal(t, sets["uniques"][1], "567")
   398  }
   399  
   400  func TestProcessCounters(t *testing.T) {
   401  
   402  	*persistCountKeys = int64(10)
   403  	counters = make(map[string]int64)
   404  	var buffer bytes.Buffer
   405  	now := int64(1418052649)
   406  
   407  	counters["gorets"] = int64(123)
   408  
   409  	num := processCounters(&buffer, now)
   410  	assert.Equal(t, num, int64(1))
   411  	assert.Equal(t, buffer.String(), "gorets 123 1418052649\n")
   412  
   413  	// run processCounters() enough times to make sure it purges items
   414  	for i := 0; i < int(*persistCountKeys)+10; i++ {
   415  		num = processCounters(&buffer, now)
   416  	}
   417  	lines := bytes.Split(buffer.Bytes(), []byte("\n"))
   418  
   419  	// expect two more lines - the good one and an empty one at the end
   420  	assert.Equal(t, len(lines), int(*persistCountKeys+2))
   421  	assert.Equal(t, string(lines[0]), "gorets 123 1418052649")
   422  	assert.Equal(t, string(lines[*persistCountKeys]), "gorets 0 1418052649")
   423  }
   424  
   425  func TestProcessTimers(t *testing.T) {
   426  	// Some data with expected mean of 20
   427  	timers = make(map[string]Uint64Slice)
   428  	timers["response_time"] = []uint64{0, 30, 30}
   429  
   430  	now := int64(1418052649)
   431  
   432  	var buffer bytes.Buffer
   433  	num := processTimers(&buffer, now, Percentiles{})
   434  
   435  	lines := bytes.Split(buffer.Bytes(), []byte("\n"))
   436  
   437  	assert.Equal(t, num, int64(1))
   438  	assert.Equal(t, string(lines[0]), "response_time.mean 20.000000 1418052649")
   439  	assert.Equal(t, string(lines[1]), "response_time.upper 30 1418052649")
   440  	assert.Equal(t, string(lines[2]), "response_time.lower 0 1418052649")
   441  	assert.Equal(t, string(lines[3]), "response_time.count 3 1418052649")
   442  
   443  	num = processTimers(&buffer, now, Percentiles{})
   444  	assert.Equal(t, num, int64(0))
   445  }
   446  
   447  func TestProcessGauges(t *testing.T) {
   448  	// Some data with expected mean of 20
   449  	flag.Set("delete-gauges", "false")
   450  	gauges = make(map[string]uint64)
   451  	gauges["gaugor"] = math.MaxUint64
   452  
   453  	now := int64(1418052649)
   454  
   455  	var buffer bytes.Buffer
   456  
   457  	num := processGauges(&buffer, now)
   458  	assert.Equal(t, num, int64(0))
   459  	assert.Equal(t, buffer.String(), "")
   460  
   461  	gauges["gaugor"] = 12345
   462  	num = processGauges(&buffer, now)
   463  	assert.Equal(t, num, int64(1))
   464  
   465  	gauges["gaugor"] = math.MaxUint64
   466  	num = processGauges(&buffer, now)
   467  	assert.Equal(t, buffer.String(), "gaugor 12345 1418052649\ngaugor 12345 1418052649\n")
   468  	assert.Equal(t, num, int64(1))
   469  }
   470  
   471  func TestProcessDeleteGauges(t *testing.T) {
   472  	// Some data with expected mean of 20
   473  	flag.Set("delete-gauges", "true")
   474  	gauges = make(map[string]uint64)
   475  	gauges["gaugordelete"] = math.MaxUint64
   476  
   477  	now := int64(1418052649)
   478  
   479  	var buffer bytes.Buffer
   480  
   481  	num := processGauges(&buffer, now)
   482  	assert.Equal(t, num, int64(0))
   483  	assert.Equal(t, buffer.String(), "")
   484  
   485  	gauges["gaugordelete"] = 12345
   486  	num = processGauges(&buffer, now)
   487  	assert.Equal(t, num, int64(1))
   488  
   489  	gauges["gaugordelete"] = math.MaxUint64
   490  	num = processGauges(&buffer, now)
   491  	assert.Equal(t, buffer.String(), "gaugordelete 12345 1418052649\n")
   492  	assert.Equal(t, num, int64(0))
   493  }
   494  
   495  func TestProcessSets(t *testing.T) {
   496  	sets = make(map[string][]string)
   497  
   498  	now := int64(1418052649)
   499  
   500  	var buffer bytes.Buffer
   501  
   502  	// three unique values
   503  	sets["uniques"] = []string{"123", "234", "345"}
   504  	num := processSets(&buffer, now)
   505  	assert.Equal(t, num, int64(1))
   506  	assert.Equal(t, buffer.String(), "uniques 3 1418052649\n")
   507  
   508  	// one value is repeated
   509  	buffer.Reset()
   510  	sets["uniques"] = []string{"123", "234", "234"}
   511  	num = processSets(&buffer, now)
   512  	assert.Equal(t, num, int64(1))
   513  	assert.Equal(t, buffer.String(), "uniques 2 1418052649\n")
   514  
   515  	// make sure sets are purged
   516  	num = processSets(&buffer, now)
   517  	assert.Equal(t, num, int64(0))
   518  }
   519  
   520  func TestProcessTimersUpperPercentile(t *testing.T) {
   521  	// Some data with expected 75% of 2
   522  	timers = make(map[string]Uint64Slice)
   523  	timers["response_time"] = []uint64{0, 1, 2, 3}
   524  
   525  	now := int64(1418052649)
   526  
   527  	var buffer bytes.Buffer
   528  	num := processTimers(&buffer, now, Percentiles{
   529  		&Percentile{
   530  			75,
   531  			"75",
   532  		},
   533  	})
   534  
   535  	lines := bytes.Split(buffer.Bytes(), []byte("\n"))
   536  
   537  	assert.Equal(t, num, int64(1))
   538  	assert.Equal(t, string(lines[0]), "response_time.upper_75 2 1418052649")
   539  }
   540  
   541  func TestProcessTimersUpperPercentilePostfix(t *testing.T) {
   542  	flag.Set("postfix", ".test")
   543  	// Some data with expected 75% of 2
   544  	timers = make(map[string]Uint64Slice)
   545  	timers["postfix_response_time.test"] = []uint64{0, 1, 2, 3}
   546  
   547  	now := int64(1418052649)
   548  
   549  	var buffer bytes.Buffer
   550  	num := processTimers(&buffer, now, Percentiles{
   551  		&Percentile{
   552  			75,
   553  			"75",
   554  		},
   555  	})
   556  
   557  	lines := bytes.Split(buffer.Bytes(), []byte("\n"))
   558  
   559  	assert.Equal(t, num, int64(1))
   560  	assert.Equal(t, string(lines[0]), "postfix_response_time.upper_75.test 2 1418052649")
   561  	flag.Set("postfix", "")
   562  }
   563  
   564  func TestProcessTimesLowerPercentile(t *testing.T) {
   565  	timers = make(map[string]Uint64Slice)
   566  	timers["time"] = []uint64{0, 1, 2, 3}
   567  
   568  	now := int64(1418052649)
   569  
   570  	var buffer bytes.Buffer
   571  	num := processTimers(&buffer, now, Percentiles{
   572  		&Percentile{
   573  			-75,
   574  			"-75",
   575  		},
   576  	})
   577  
   578  	lines := bytes.Split(buffer.Bytes(), []byte("\n"))
   579  
   580  	assert.Equal(t, num, int64(1))
   581  	assert.Equal(t, string(lines[0]), "time.lower_75 1 1418052649")
   582  }
   583  
   584  func TestMultipleUDPSends(t *testing.T) {
   585  	addr := "127.0.0.1:8126"
   586  
   587  	address, _ := net.ResolveUDPAddr("udp", addr)
   588  	listener, err := net.ListenUDP("udp", address)
   589  	assert.Equal(t, nil, err)
   590  
   591  	ch := make(chan *Packet, MAX_UNPROCESSED_PACKETS)
   592  
   593  	wg := &sync.WaitGroup{}
   594  	wg.Add(1)
   595  	go func() {
   596  		parseTo(listener, false, ch)
   597  		wg.Done()
   598  	}()
   599  
   600  	conn, err := net.DialTimeout("udp", addr, 50*time.Millisecond)
   601  	assert.Equal(t, nil, err)
   602  
   603  	n, err := conn.Write([]byte("deploys.test.myservice:2|c"))
   604  	assert.Equal(t, nil, err)
   605  	assert.Equal(t, len("deploys.test.myservice:2|c"), n)
   606  
   607  	n, err = conn.Write([]byte("deploys.test.my:service:2|c"))
   608  
   609  	n, err = conn.Write([]byte("deploys.test.myservice:1|c"))
   610  	assert.Equal(t, nil, err)
   611  	assert.Equal(t, len("deploys.test.myservice:1|c"), n)
   612  
   613  	select {
   614  	case pack := <-ch:
   615  		assert.Equal(t, "deploys.test.myservice", pack.Bucket)
   616  		assert.Equal(t, int64(2), pack.Value.(int64))
   617  		assert.Equal(t, "c", pack.Modifier)
   618  		assert.Equal(t, float32(1), pack.Sampling)
   619  	case <-time.After(50 * time.Millisecond):
   620  		t.Fatal("packet receive timeout")
   621  	}
   622  
   623  	select {
   624  	case pack := <-ch:
   625  		assert.Equal(t, "deploys.test.myservice", pack.Bucket)
   626  		assert.Equal(t, int64(1), pack.Value.(int64))
   627  		assert.Equal(t, "c", pack.Modifier)
   628  		assert.Equal(t, float32(1), pack.Sampling)
   629  	case <-time.After(50 * time.Millisecond):
   630  		t.Fatal("packet receive timeout")
   631  	}
   632  
   633  	listener.Close()
   634  	wg.Wait()
   635  }
   636  
   637  func BenchmarkManyDifferentSensors(t *testing.B) {
   638  	r := rand.New(rand.NewSource(438))
   639  	for i := 0; i < 1000; i++ {
   640  		bucket := "response_time" + strconv.Itoa(i)
   641  		for i := 0; i < 10000; i++ {
   642  			a := uint64(r.Uint32() % 1000)
   643  			timers[bucket] = append(timers[bucket], a)
   644  		}
   645  	}
   646  
   647  	for i := 0; i < 1000; i++ {
   648  		bucket := "count" + strconv.Itoa(i)
   649  		for i := 0; i < 10000; i++ {
   650  			a := int64(r.Uint32() % 1000)
   651  			counters[bucket] = a
   652  		}
   653  	}
   654  
   655  	for i := 0; i < 1000; i++ {
   656  		bucket := "gauge" + strconv.Itoa(i)
   657  		for i := 0; i < 10000; i++ {
   658  			a := uint64(r.Uint32() % 1000)
   659  			gauges[bucket] = a
   660  		}
   661  	}
   662  
   663  	var buff bytes.Buffer
   664  	now := time.Now().Unix()
   665  	t.ResetTimer()
   666  	processTimers(&buff, now, commonPercentiles)
   667  	processCounters(&buff, now)
   668  	processGauges(&buff, now)
   669  }
   670  
   671  func BenchmarkOneBigTimer(t *testing.B) {
   672  	r := rand.New(rand.NewSource(438))
   673  	bucket := "response_time"
   674  	for i := 0; i < 10000000; i++ {
   675  		a := uint64(r.Uint32() % 1000)
   676  		timers[bucket] = append(timers[bucket], a)
   677  	}
   678  
   679  	var buff bytes.Buffer
   680  	t.ResetTimer()
   681  	processTimers(&buff, time.Now().Unix(), commonPercentiles)
   682  }
   683  
   684  func BenchmarkLotsOfTimers(t *testing.B) {
   685  	r := rand.New(rand.NewSource(438))
   686  	for i := 0; i < 1000; i++ {
   687  		bucket := "response_time" + strconv.Itoa(i)
   688  		for i := 0; i < 10000; i++ {
   689  			a := uint64(r.Uint32() % 1000)
   690  			timers[bucket] = append(timers[bucket], a)
   691  		}
   692  	}
   693  
   694  	var buff bytes.Buffer
   695  	t.ResetTimer()
   696  	processTimers(&buff, time.Now().Unix(), commonPercentiles)
   697  }
   698  
   699  func BenchmarkParseLine(b *testing.B) {
   700  	d := []byte("a.key.with-0.dash:4|c|@0.5")
   701  	for i := 0; i < b.N; i++ {
   702  		parseLine(d)
   703  	}
   704  }