@@ -113,10 +113,15 @@ func runTailCmd(opts *TailOptions) error {
113113 fmt .Fprint (opts .IO .Out , "\n Waiting for events... Press Ctrl+C to stop.\n " )
114114 }
115115
116- c := time .Tick (Interval )
117- for t := range c {
118- utc := t .UTC ()
119- events , err := client .GetEvents (utc .Add (- 1 * time .Second ), utc , 1000 )
116+ ticker := time .NewTicker (Interval )
117+ defer ticker .Stop ()
118+
119+ windowStart := time .Now ().UTC ().Add (- Interval )
120+ seenRequestIDs := map [string ]time.Time {}
121+
122+ for {
123+ windowEnd := time .Now ().UTC ()
124+ events , err := client .GetEvents (windowStart , windowEnd , 1000 )
120125 if err != nil {
121126 if strings .Contains (err .Error (), "The log processing region does not match" ) {
122127 cs := opts .IO .ColorScheme ()
@@ -127,9 +132,12 @@ func runTailCmd(opts *TailOptions) error {
127132 ` , cs .FailureIcon (), opts .Region )
128133 return errors .New (errDetails )
129134 }
135+
136+ return err
130137 }
131138
132- for _ , event := range events .Events {
139+ pruneSeenRequestIDs (seenRequestIDs , windowStart .Add (- Interval ))
140+ for _ , event := range unseenEvents (events .Events , seenRequestIDs , windowEnd ) {
133141 if p != nil {
134142 if err := p .Print (opts .IO , event ); err != nil {
135143 return err
@@ -140,9 +148,35 @@ func runTailCmd(opts *TailOptions) error {
140148 }
141149 }
142150 }
151+
152+ windowStart = windowEnd .Add (- Interval )
153+ <- ticker .C
143154 }
155+ }
144156
145- return nil
157+ func unseenEvents (events []insights.EventWrapper , seenRequestIDs map [string ]time.Time , seenAt time.Time ) []insights.EventWrapper {
158+ freshEvents := make ([]insights.EventWrapper , 0 , len (events ))
159+ for _ , event := range events {
160+ requestID := event .RequestID
161+ if requestID != "" {
162+ if _ , ok := seenRequestIDs [requestID ]; ok {
163+ continue
164+ }
165+ seenRequestIDs [requestID ] = seenAt
166+ }
167+
168+ freshEvents = append (freshEvents , event )
169+ }
170+
171+ return freshEvents
172+ }
173+
174+ func pruneSeenRequestIDs (seenRequestIDs map [string ]time.Time , cutoff time.Time ) {
175+ for requestID , timestamp := range seenRequestIDs {
176+ if timestamp .Before (cutoff ) {
177+ delete (seenRequestIDs , requestID )
178+ }
179+ }
146180}
147181
148182func printEvent (io * iostreams.IOStreams , event insights.EventWrapper ) error {
0 commit comments