summaryrefslogtreecommitdiff
path: root/internal/clients
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2021-09-07 10:01:32 +0300
committerPaul Buetow <paul@buetow.org>2021-09-07 10:01:32 +0300
commitf74a9e4b35feb8c07d8a70b5a581088a0a59889d (patch)
tree62ebcc6314ec70270416a4416579878b82135fce /internal/clients
parent6ae75e8f106d3eee18ea61e6c4d6925c6f514460 (diff)
Produce MAPREDUCE lines, can aggregate these via default log format
Diffstat (limited to 'internal/clients')
-rw-r--r--internal/clients/stats.go49
1 files changed, 36 insertions, 13 deletions
diff --git a/internal/clients/stats.go b/internal/clients/stats.go
index faeb9fb..6da443c 100644
--- a/internal/clients/stats.go
+++ b/internal/clients/stats.go
@@ -11,12 +11,13 @@ import (
"github.com/mimecast/dtail/internal/color"
"github.com/mimecast/dtail/internal/config"
"github.com/mimecast/dtail/internal/io/logger"
+ "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.
@@ -25,10 +26,10 @@ 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,
}
}
@@ -59,13 +60,14 @@ func (s *stats) Start(ctx context.Context, throttleCh <-chan struct{}, statsCh <
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)
+ logger.Mapreduce("STATS", data)
}
connectedLast = connected
@@ -92,16 +94,37 @@ func (s *stats) printStatsDueInterrupt(messages []string) {
logger.Resume()
}
+func (s *stats) statsData(connected, newConnections int, throttle int) map[string]interface{} {
+ percConnected := percentOf(float64(s.servers), float64(connected))
+
+ 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 data
+}
+
func (s *stats) statsLine(connected, newConnections int, throttle int) string {
- percConnected := percentOf(float64(s.connectionsTotal), float64(connected))
+ sb := strings.Builder{}
- 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()))
+ 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 strings.Join(stats, "|")
+ return sb.String()
}
func (s *stats) numConnected() int {