@@ -83,6 +83,7 @@ func (s *BaseSession) GetAll() map[string]TypedValue {
83
83
// ID implements the Session interface.
84
84
func (s * BaseSession ) ID () uint32 { return s .id }
85
85
86
+ // TypedValue is a value along with its type.
86
87
type TypedValue struct {
87
88
Typ Type
88
89
Value interface {}
@@ -192,21 +193,38 @@ func (c *Context) WithContext(ctx context.Context) *Context {
192
193
193
194
// NewSpanIter creates a RowIter executed in the given span.
194
195
func NewSpanIter (span opentracing.Span , iter RowIter ) RowIter {
195
- return & spanIter {span , iter , 0 , false }
196
+ return & spanIter {
197
+ span : span ,
198
+ iter : iter ,
199
+ }
196
200
}
197
201
198
202
type spanIter struct {
199
203
span opentracing.Span
200
204
iter RowIter
201
205
count int
206
+ max time.Duration
207
+ min time.Duration
208
+ total time.Duration
202
209
done bool
203
210
}
204
211
205
- func (i * spanIter ) Next () (Row , error ) {
206
- if i .done {
207
- return nil , io .EOF
212
+ func (i * spanIter ) updateTimings (start time.Time ) {
213
+ elapsed := time .Since (start )
214
+ if i .max < elapsed {
215
+ i .max = elapsed
208
216
}
209
217
218
+ if i .min > elapsed || i .min == 0 {
219
+ i .min = elapsed
220
+ }
221
+
222
+ i .total += elapsed
223
+ }
224
+
225
+ func (i * spanIter ) Next () (Row , error ) {
226
+ start := time .Now ()
227
+
210
228
row , err := i .iter .Next ()
211
229
if err == io .EOF {
212
230
i .finish ()
@@ -219,15 +237,27 @@ func (i *spanIter) Next() (Row, error) {
219
237
}
220
238
221
239
i .count ++
240
+ i .updateTimings (start )
222
241
return row , nil
223
242
}
224
243
225
244
func (i * spanIter ) finish () {
245
+ var avg time.Duration
246
+ if i .count > 0 {
247
+ avg = i .total / time .Duration (i .count )
248
+ }
249
+
226
250
i .span .FinishWithOptions (opentracing.FinishOptions {
227
251
LogRecords : []opentracing.LogRecord {
228
252
{
229
253
Timestamp : time .Now (),
230
- Fields : []log.Field {log .Int ("rows" , i .count )},
254
+ Fields : []log.Field {
255
+ log .Int ("rows" , i .count ),
256
+ log .String ("total_time" , i .total .String ()),
257
+ log .String ("max_time" , i .max .String ()),
258
+ log .String ("min_time" , i .min .String ()),
259
+ log .String ("avg_time" , avg .String ()),
260
+ },
231
261
},
232
262
},
233
263
})
0 commit comments