diff options
| author | Paul Buetow <pbuetow@mimecast.com> | 2020-11-27 14:47:43 +0000 |
|---|---|---|
| committer | Paul Buetow <pbuetow@mimecast.com> | 2020-11-27 14:47:43 +0000 |
| commit | 45853f487830d5f74f2de81b5348ae6463096a57 (patch) | |
| tree | 1963fa6c2614ae58a0c6134afa8cd1928c6f1516 /internal | |
| parent | 48bbe327834f3fbb1066a0dc8587a73c0e2a2a36 (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.go | 2 | ||||
| -rw-r--r-- | internal/clients/client.go | 2 | ||||
| -rw-r--r-- | internal/clients/maprclient.go | 2 | ||||
| -rw-r--r-- | internal/clients/stats.go | 26 | ||||
| -rw-r--r-- | internal/io/signal/signal.go | 11 |
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. |
