summaryrefslogtreecommitdiff
path: root/internal/clients/stats.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/clients/stats.go')
-rw-r--r--internal/clients/stats.go76
1 files changed, 53 insertions, 23 deletions
diff --git a/internal/clients/stats.go b/internal/clients/stats.go
index d8163d4..1315aea 100644
--- a/internal/clients/stats.go
+++ b/internal/clients/stats.go
@@ -8,14 +8,16 @@ import (
"sync"
"time"
+ "github.com/mimecast/dtail/internal/color"
"github.com/mimecast/dtail/internal/config"
- "github.com/mimecast/dtail/internal/io/logger"
+ "github.com/mimecast/dtail/internal/io/dlog"
+ "github.com/mimecast/dtail/internal/protocol"
)
// Used to collect and display various client stats.
type stats struct {
// Total amount servers to connect to.
- connectionsTotal int
+ servers int
// To keep track of what connected and disconnected
connectionsEstCh chan struct{}
// Amount of servers connections are established.
@@ -24,19 +26,20 @@ type stats struct {
mutex sync.Mutex
}
-func newTailStats(connectionsTotal int) *stats {
+func newTailStats(servers int) *stats {
return &stats{
- connectionsTotal: connectionsTotal,
- connectionsEstCh: make(chan struct{}, connectionsTotal),
+ servers: servers,
+ connectionsEstCh: make(chan struct{}, servers),
connected: 0,
}
}
// Start starts printing client connection stats every time a signal is recieved or
// connection count has changed.
-func (s *stats) Start(ctx context.Context, throttleCh <-chan struct{}, statsCh <-chan string, quiet bool) {
- var connectedLast int
+func (s *stats) Start(ctx context.Context, throttleCh <-chan struct{},
+ statsCh <-chan string, quiet bool) {
+ var connectedLast int
for {
var force bool
var messages []string
@@ -54,18 +57,18 @@ func (s *stats) Start(ctx context.Context, throttleCh <-chan struct{}, statsCh <
throttle := len(throttleCh)
newConnections := connected - connectedLast
-
if (connected == connectedLast || quiet) && !force {
continue
}
- stats := s.statsLine(connected, newConnections, throttle)
switch force {
case true:
+ stats := s.statsLine(connected, newConnections, throttle)
messages = append(messages, fmt.Sprintf("Connection stats: %s", stats))
s.printStatsDueInterrupt(messages)
default:
- logger.Info(stats)
+ data := s.statsData(connected, newConnections, throttle)
+ dlog.Client.Mapreduce("STATS", data)
}
connectedLast = connected
@@ -76,30 +79,58 @@ func (s *stats) Start(ctx context.Context, throttleCh <-chan struct{}, statsCh <
}
func (s *stats) printStatsDueInterrupt(messages []string) {
- logger.Pause()
- for _, message := range messages {
+ dlog.Client.Pause()
+ for i, message := range messages {
+ if i > 0 && config.Client.TermColorsEnable {
+ fmt.Println(color.PaintStrWithAttr(message,
+ config.Client.TermColors.Client.ClientFg,
+ config.Client.TermColors.Client.ClientBg,
+ config.Client.TermColors.Client.ClientAttr,
+ ))
+ continue
+ }
fmt.Println(fmt.Sprintf(" %s", message))
}
time.Sleep(time.Second * time.Duration(config.InterruptTimeoutS))
- logger.Resume()
+ dlog.Client.Resume()
}
-func (s *stats) statsLine(connected, newConnections int, throttle int) string {
- percConnected := percentOf(float64(s.connectionsTotal), float64(connected))
+func (s *stats) statsData(connected, newConnections int,
+ throttle int) map[string]interface{} {
+
+ percConnected := percentOf(float64(s.servers), float64(connected))
- var stats []string
- stats = append(stats, fmt.Sprintf("connected=%d/%d(%d%%)", connected, s.connectionsTotal, int(percConnected)))
- stats = append(stats, fmt.Sprintf("new=%d", newConnections))
- stats = append(stats, fmt.Sprintf("throttle=%d", throttle))
- stats = append(stats, fmt.Sprintf("cpus/goroutines=%d/%d", runtime.NumCPU(), runtime.NumGoroutine()))
+ data := make(map[string]interface{})
+ data["connected"] = connected
+ data["servers"] = s.servers
+ data["connected%"] = int(percConnected)
+ data["new"] = newConnections
+ data["throttle"] = throttle
+ data["goroutines"] = runtime.NumGoroutine()
+ data["cgocalls"] = runtime.NumCgoCall()
+ data["cpu"] = runtime.NumCPU()
- return strings.Join(stats, "|")
+ return data
+}
+
+func (s *stats) statsLine(connected, newConnections int, throttle int) string {
+ sb := strings.Builder{}
+ i := 0
+ for k, v := range s.statsData(connected, newConnections, throttle) {
+ if i > 0 {
+ sb.WriteString(protocol.FieldDelimiter)
+ }
+ sb.WriteString(k)
+ sb.WriteByte('=')
+ sb.WriteString(fmt.Sprintf("%v", v))
+ i++
+ }
+ return sb.String()
}
func (s *stats) numConnected() int {
s.mutex.Lock()
defer s.mutex.Unlock()
-
return s.connected
}
@@ -107,6 +138,5 @@ func percentOf(total float64, value float64) float64 {
if total == 0 || total == value {
return 100
}
-
return value / (total / 100.0)
}