ping: compute average latency when interrupted
(this should always have been done on the client, IMO, but, oh well...) License: MIT Signed-off-by: Steven Allen <steven@stebalien.com>
Steven Allen committed
May 8, 2019 at 22:54 UTC
6a91d14888ccb4d40ee427c5511ecb1110b21ce7
1 file changed
+38
core/commands/ping.go
+38
@@ -153,6 +153,44 @@ trip latency information.
153
})
154
},
155
Type: PingResult{},
156
+ PostRun: cmds.PostRunMap{
157
+ cmds.CLI: func(res cmds.Response, re cmds.ResponseEmitter) error {
158
+ var (
159
+ total time.Duration
160
+ count int
161
+ )
162
+
163
+ for {
164
+ event, err := res.Next()
165
+ switch err {
166
+ case nil:
167
+ case io.EOF:
168
+ return nil
169
+ case context.Canceled, context.DeadlineExceeded:
170
+ if count == 0 {
171
+ return err
172
+ }
173
+ averagems := total.Seconds() * 1000 / float64(count)
174
+ return re.Emit(&PingResult{
175
+ Success: true,
176
+ Text: fmt.Sprintf("Average latency: %.2fms", averagems),
177
+ })
178
+ default:
179
+ return err
180
+ }
181
+
182
+ pr := event.(*PingResult)
183
+ if pr.Success && pr.Text == "" {
184
+ total += pr.Time
185
+ count++
186
+ }
187
+ err = re.Emit(event)
188
+ if err != nil {
189
+ return err
190
+ }
191
+ }
192
+ },
193
+ },
194
Encoders: cmds.EncoderMap{
195
cmds.Text: cmds.MakeTypedEncoder(func(req *cmds.Request, w io.Writer, out *PingResult) error {
196
if len(out.Text) > 0 {