summaryrefslogtreecommitdiff
path: root/internal
diff options
context:
space:
mode:
authorPaul Buetow <pbuetow@mimecast.com>2020-11-27 14:47:43 +0000
committerPaul Buetow <pbuetow@mimecast.com>2020-11-27 14:47:43 +0000
commit45853f487830d5f74f2de81b5348ae6463096a57 (patch)
tree1963fa6c2614ae58a0c6134afa8cd1928c6f1516 /internal
parent48bbe327834f3fbb1066a0dc8587a73c0e2a2a36 (diff)
First Ctrl+C will print out stats, a second Ctrl+C within 3s will terminate dtail
Diffstat (limited to 'internal')
-rw-r--r--internal/clients/baseclient.go2
-rw-r--r--internal/clients/client.go2
-rw-r--r--internal/clients/maprclient.go2
-rw-r--r--internal/clients/stats.go26
-rw-r--r--internal/io/signal/signal.go11
5 files changed, 29 insertions, 14 deletions
diff --git a/internal/clients/baseclient.go b/internal/clients/baseclient.go
index d8d4fde..69055a3 100644
--- a/internal/clients/baseclient.go
+++ b/internal/clients/baseclient.go
@@ -66,7 +66,7 @@ func (c *baseClient) makeConnections(maker maker) {
c.stats = newTailStats(len(c.connections))
}
-func (c *baseClient) Start(ctx context.Context, statsCh <-chan struct{}) (status int) {
+func (c *baseClient) Start(ctx context.Context, statsCh <-chan string) (status int) {
// Periodically check for unknown hosts, and ask the user whether to trust them or not.
go c.hostKeyCallback.PromptAddHosts(ctx)
// Print client stats every time something on statsCh is recieved.
diff --git a/internal/clients/client.go b/internal/clients/client.go
index eb8452d..4a547e8 100644
--- a/internal/clients/client.go
+++ b/internal/clients/client.go
@@ -4,5 +4,5 @@ import "context"
// Client is the interface for the end user command line client.
type Client interface {
- Start(ctx context.Context, statsCh <-chan struct{}) int
+ Start(ctx context.Context, statsCh <-chan string) int
}
diff --git a/internal/clients/maprclient.go b/internal/clients/maprclient.go
index 149129d..6aadd6b 100644
--- a/internal/clients/maprclient.go
+++ b/internal/clients/maprclient.go
@@ -94,7 +94,7 @@ func NewMaprClient(args Args, queryStr string, maprClientMode MaprClientMode) (*
}
// Start starts the mapreduce client.
-func (c *MaprClient) Start(ctx context.Context, statsCh <-chan struct{}) (status int) {
+func (c *MaprClient) Start(ctx context.Context, statsCh <-chan string) (status int) {
go c.periodicReportResults(ctx)
status = c.baseClient.Start(ctx, statsCh)
diff --git a/internal/clients/stats.go b/internal/clients/stats.go
index e7eabd8..d5bcd2d 100644
--- a/internal/clients/stats.go
+++ b/internal/clients/stats.go
@@ -33,16 +33,18 @@ func newTailStats(connectionsTotal int) *stats {
// 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, statsCh <-chan struct{}) {
+func (s *stats) Start(ctx context.Context, throttleCh <-chan struct{}, statsCh <-chan string) {
var connectedLast int
for {
var force bool
+ var messages []string
select {
- case <-statsCh:
+ case message := <-statsCh:
+ messages = append(messages, message)
force = true
- case <-time.After(time.Second * 2):
+ case <-time.After(time.Second * 10):
case <-ctx.Done():
return
}
@@ -56,7 +58,14 @@ func (s *stats) Start(ctx context.Context, throttleCh, statsCh <-chan struct{})
continue
}
- logger.Info(s.statsLine(connected, newConnections, throttle))
+ stats := s.statsLine(connected, newConnections, throttle)
+ switch force {
+ case true:
+ messages = append(messages, fmt.Sprintf("Connection stats: %s", stats))
+ s.forcePrintStats(messages)
+ default:
+ logger.Info(stats)
+ }
connectedLast = connected
s.mutex.Lock()
@@ -65,6 +74,15 @@ func (s *stats) Start(ctx context.Context, throttleCh, statsCh <-chan struct{})
}
}
+func (s *stats) forcePrintStats(messages []string) {
+ logger.Pause()
+ for _, message := range messages {
+ fmt.Println(fmt.Sprintf("\t%s", message))
+ }
+ time.Sleep(time.Second * 3)
+ logger.Resume()
+}
+
func (s *stats) statsLine(connected, newConnections int, throttle int) string {
percConnected := percentOf(float64(s.connectionsTotal), float64(connected))
diff --git a/internal/io/signal/signal.go b/internal/io/signal/signal.go
index 9401707..06abb0b 100644
--- a/internal/io/signal/signal.go
+++ b/internal/io/signal/signal.go
@@ -6,31 +6,28 @@ import (
gosignal "os/signal"
"syscall"
"time"
-
- "github.com/mimecast/dtail/internal/io/logger"
)
// StatsCh returns a channel for "please print stats" signalling.
-func InterruptCh(ctx context.Context) <-chan struct{} {
+func InterruptCh(ctx context.Context) <-chan string {
sigIntCh := make(chan os.Signal)
gosignal.Notify(sigIntCh, os.Interrupt)
sigOtherCh := make(chan os.Signal)
gosignal.Notify(sigOtherCh, syscall.SIGHUP, syscall.SIGTERM, syscall.SIGQUIT)
- statsCh := make(chan struct{})
+ statsCh := make(chan string)
go func() {
for {
select {
case <-sigIntCh:
select {
- case statsCh <- struct{}{}:
- logger.Info("Hint: Hit Ctrl+C twice to exit")
+ case statsCh <- "Hint: Hit Ctrl+C again to exit":
select {
case <-sigIntCh:
os.Exit(0)
- case <-time.After(time.Second):
+ case <-time.After(time.Second * 3):
}
default:
// Stats already printed.