func TestMetrics20Timer(t *testing.T) { d := []byte("foo=bar.target_type=gauge.unit=ms:5|ms\nfoo=bar.target_type=gauge.unit=ms:10|ms") packets := udp.ParseMessage(d, prefix_internal, output, udp.ParseLine) pct, _ := timers.NewPercentiles("75") ti := timers.New("", *pct) for _, p := range packets { ti.Add(p) } var buff bytes.Buffer num := ti.Process(&buff, time.Now().Unix(), 10) assert.Equal(t, int(num), 1) dataForGraphite := buff.String() assert.T(t, strings.Contains(dataForGraphite, "foo=bar.target_type=gauge.unit=ms.stat=max_75 10.000000")) assert.T(t, strings.Contains(dataForGraphite, "foo=bar.target_type=gauge.unit=ms.stat=mean_75 7.500000")) assert.T(t, strings.Contains(dataForGraphite, "foo=bar.target_type=gauge.unit=ms.stat=sum_75 15.000000")) assert.T(t, strings.Contains(dataForGraphite, "foo=bar.target_type=gauge.unit=ms.stat=mean 7.500000")) assert.T(t, strings.Contains(dataForGraphite, "foo=bar.target_type=gauge.unit=ms.stat=median 7.500000")) assert.T(t, strings.Contains(dataForGraphite, "foo=bar.target_type=gauge.unit=ms.stat=std 2.500000")) assert.T(t, strings.Contains(dataForGraphite, "foo=bar.target_type=gauge.unit=ms.stat=sum 15.000000")) assert.T(t, strings.Contains(dataForGraphite, "foo=bar.target_type=gauge.unit=ms.stat=max 10.000000")) assert.T(t, strings.Contains(dataForGraphite, "foo=bar.target_type=gauge.unit=ms.stat=min 5.000000")) assert.T(t, strings.Contains(dataForGraphite, "foo=bar.target_type=count.unit=Pckt.orig_unit=ms.pckt_type=sent.direction=in 2")) assert.T(t, strings.Contains(dataForGraphite, "foo=bar.target_type=rate.unit=Pcktps.orig_unit=ms.pckt_type=sent.direction=in 0.200000")) }
func TestLowerPercentile(t *testing.T) { // Some data with expected mean of 20 d := []byte("time:0|ms\ntime:1|ms\ntime:2|ms\ntime:3|ms") packets := udp.ParseMessage(d, prefix_internal, output, udp.ParseLine) pct, _ := timers.NewPercentiles("-75") ti := timers.New("", *pct) for _, p := range packets { ti.Add(p) } var buff bytes.Buffer var num int64 num += ti.Process(&buff, time.Now().Unix(), 10) assert.Equal(t, num, int64(1)) dataForGraphite := buff.String() meanRegexp := regexp.MustCompile(`time\.upper_75 1\.`) matched := meanRegexp.MatchString(dataForGraphite) assert.Equal(t, matched, false) meanRegexp = regexp.MustCompile(`time\.lower_75 1\.`) matched = meanRegexp.MatchString(dataForGraphite) assert.Equal(t, matched, true) }
func main() { flag.Parse() if *showVersion { fmt.Printf("statsdaemon v%s (built w/%s)\n", VERSION, runtime.Version()) return } if *cpuprofile != "" { f, err := os.Create(*cpuprofile) if err != nil { log.Fatal(err) } pprof.StartCPUProfile(f) defer pprof.StopCPUProfile() } if *memprofile != "" { f, err := os.Create(*memprofile) if err != nil { log.Fatal(err) } defer f.Close() defer pprof.WriteHeapProfile(f) } config.Parse(*config_file) runtime.GOMAXPROCS(*processes) var err error pct, err := timers.NewPercentiles(*percentile_thresholds) if err != nil { log.Fatal(err) } inst := os.Expand(*instance, expand_cfg_vars) if inst == "" { inst = "null" } signalchan := make(chan os.Signal, 1) signal.Notify(signalchan) if *profile_addr != "" { go func() { fmt.Println("Profiling endpoint listening on " + *profile_addr) log.Println(http.ListenAndServe(*profile_addr, nil)) }() } daemon := statsdaemon.New(inst, *listen_addr, *admin_addr, *graphite_addr, *prefix_rates, *prefix_timers, *prefix_gauges, *pct, *flushInterval, MAX_UNPROCESSED_PACKETS, *max_timers_per_s, signalchan, *debug) if *debug { consumer := make(chan interface{}, 100) daemon.Invalid_lines.Register(consumer) go func() { for line := range consumer { log.Printf("invalid line '%s'\n", line) } }() } daemon.Run() }
func BenchmarkMillionSameTimersAddAndProcess(b *testing.B) { metrics := getSameTimers(1000000) b.ResetTimer() pct, _ := timers.NewPercentiles("99") t := timers.New("bar", *pct) for i := 0; i < len(metrics); i++ { for n := 0; n < b.N; n++ { t.Add(&metrics[i]) } } t.Process(&bytes.Buffer{}, time.Now().Unix(), 10) }