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 }