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 buf []byte buf, num := ti.Process(buf, time.Now().Unix(), 10) assert.Equal(t, int(num), 1) dataForGraphite := string(buf) assert.T(t, strings.Contains(dataForGraphite, "foo=bar.target_type=gauge.unit=ms.stat=max_75 10")) assert.T(t, strings.Contains(dataForGraphite, "foo=bar.target_type=gauge.unit=ms.stat=mean_75 7.5")) assert.T(t, strings.Contains(dataForGraphite, "foo=bar.target_type=gauge.unit=ms.stat=sum_75 15")) assert.T(t, strings.Contains(dataForGraphite, "foo=bar.target_type=gauge.unit=ms.stat=mean 7.5")) assert.T(t, strings.Contains(dataForGraphite, "foo=bar.target_type=gauge.unit=ms.stat=median 7.5")) assert.T(t, strings.Contains(dataForGraphite, "foo=bar.target_type=gauge.unit=ms.stat=std 2.5")) assert.T(t, strings.Contains(dataForGraphite, "foo=bar.target_type=gauge.unit=ms.stat=sum 15")) assert.T(t, strings.Contains(dataForGraphite, "foo=bar.target_type=gauge.unit=ms.stat=max 10")) assert.T(t, strings.Contains(dataForGraphite, "foo=bar.target_type=gauge.unit=ms.stat=min 5")) 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.2")) }
func TestLowerPercentile(t *testing.T) { 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 buf []byte var num int64 buf, n := ti.Process(buf, time.Now().Unix(), 10) num += n assert.Equal(t, num, int64(1)) exp := "time.upper_75 1 " got := string(buf) if strings.Contains(got, exp) { t.Fatalf("output %q contains %q", got, exp) } exp = "time.lower_75 1 " if !strings.Contains(got, exp) { t.Fatalf("output %q does not contain %q", got, exp) } }
func BenchmarkSameTimersAddAndProcess(b *testing.B) { metrics := getSameTimers(b.N) b.ResetTimer() pct, _ := timers.NewPercentiles("99") t := timers.New("bar", *pct) for i := 0; i < len(metrics); i++ { t.Add(&metrics[i]) } t.Process(make([]byte, 0), time.Now().Unix(), 10) }
func main() { flag.Parse() if *showVersion { fmt.Printf("statsdaemon v%s (built w/%s, git hash %s)\n", VERSION, runtime.Version(), GitHash) 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) } err := config.Parse(*config_file) if err != nil { fmt.Println(fmt.Sprintf("Could not read config file: %v", err)) return } proftrigHeapFreq := dur.MustParseUsec("proftrigger_heap_freq", *proftrigHeapFreqStr) proftrigHeapMinDiff := int(dur.MustParseUNsec("proftrigger_heap_min_diff", *proftrigHeapMinDiffStr)) proftrigCpuFreq := dur.MustParseUsec("proftrigger_cpu_freq", *proftrigCpuFreqStr) proftrigCpuMinDiff := int(dur.MustParseUNsec("proftrigger_cpu_min_diff", *proftrigCpuMinDiffStr)) proftrigCpuDur := int(dur.MustParseUNsec("proftrigger_cpu_dur", *proftrigCpuDurStr)) if proftrigHeapFreq > 0 { errors := make(chan error) trigger, _ := heap.New(*proftrigPath, *proftrigHeapThresh, proftrigHeapMinDiff, time.Duration(proftrigHeapFreq)*time.Second, errors) go func() { for e := range errors { log.Printf("profiletrigger heap: %s", e) } }() go trigger.Run() } if proftrigCpuFreq > 0 { errors := make(chan error) freq := time.Duration(proftrigCpuFreq) * time.Second duration := time.Duration(proftrigCpuDur) * time.Second trigger, _ := cpu.New(*proftrigPath, *proftrigCpuThresh, proftrigCpuMinDiff, freq, duration, errors) go func() { for e := range errors { log.Printf("profiletrigger cpu: %s", e) } }() go trigger.Run() } runtime.GOMAXPROCS(*processes) 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, *prefix_rates, *prefix_timers, *prefix_gauges, *prefix_counters, *pct, *flushInterval, MAX_UNPROCESSED_PACKETS, *max_timers_per_s, signalchan, *debug, *legacy_namespace, *flush_rates, *flush_counts) 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(*listen_addr, *admin_addr, *graphite_addr) }