github.com/whamcloud/lemur@v0.0.0-20190827193804-4655df8a52af/cmd/lhsmd/transport/grpc/stats.go (about) 1 // Copyright (c) 2018 DDN. All rights reserved. 2 // Use of this source code is governed by a MIT-style 3 // license that can be found in the LICENSE file. 4 5 package rpc 6 7 import ( 8 "bytes" 9 "fmt" 10 "runtime" 11 "time" 12 13 "github.com/dustin/go-humanize" 14 "github.com/rcrowley/go-metrics" 15 ) 16 17 type messageStats struct { 18 StartTime time.Time 19 StartSysMem uint64 20 MaxSysMem uint64 21 Count metrics.Counter 22 Rate metrics.Meter 23 Latencies metrics.Histogram 24 } 25 26 func (s *messageStats) String() string { 27 var buf bytes.Buffer 28 29 ms := runtime.MemStats{} 30 runtime.ReadMemStats(&ms) 31 if ms.Sys > s.MaxSysMem { 32 s.MaxSysMem = ms.Sys 33 } 34 35 fmt.Fprintf(&buf, "mem usage (start/cur/max): %s/%s/%s\n", 36 humanize.Bytes(s.StartSysMem), 37 humanize.Bytes(ms.Sys), 38 humanize.Bytes(s.MaxSysMem), 39 ) 40 fmt.Fprintf(&buf, "runtime: %s\n", time.Since(s.StartTime)) 41 fmt.Fprintf(&buf, " count: %s\n", humanize.Comma(s.Count.Count())) 42 fmt.Fprintf(&buf, "msg/sec (1 min/5 min/15 min/inst): %s/%s/%s/%s\n", 43 humanize.Comma(int64(s.Rate.Rate1())), 44 humanize.Comma(int64(s.Rate.Rate5())), 45 humanize.Comma(int64(s.Rate.Rate15())), 46 humanize.Comma(int64(s.Rate.RateMean())), 47 ) 48 fmt.Fprintln(&buf, "latencies:") 49 fmt.Fprintf(&buf, " min: %s\n", time.Duration(s.Latencies.Min())) 50 fmt.Fprintf(&buf, " mean: %s\n", time.Duration(int64(s.Latencies.Mean()))) 51 fmt.Fprintf(&buf, " max: %s\n", time.Duration(s.Latencies.Max())) 52 53 return buf.String() 54 } 55 56 func newMessageStats() *messageStats { 57 ms := runtime.MemStats{} 58 runtime.ReadMemStats(&ms) 59 60 return &messageStats{ 61 StartTime: time.Now(), 62 StartSysMem: ms.Sys, 63 MaxSysMem: ms.Sys, 64 Count: metrics.NewCounter(), 65 Rate: metrics.NewMeter(), 66 Latencies: metrics.NewHistogram( 67 metrics.NewUniformSample(1024), 68 ), 69 } 70 }