...
1 package graphql
2
3 import (
4 "context"
5 "fmt"
6 "time"
7 )
8
9 type Stats struct {
10 OperationStart time.Time
11 Read TraceTiming
12 Parsing TraceTiming
13 Validation TraceTiming
14
15
16
17 extension map[string]interface{}
18 }
19
20 type TraceTiming struct {
21 Start time.Time
22 End time.Time
23 }
24
25 var ctxTraceStart key = "trace_start"
26
27
28
29
30
31 func StartOperationTrace(ctx context.Context) context.Context {
32 return context.WithValue(ctx, ctxTraceStart, Now())
33 }
34
35
36
37 func GetStartTime(ctx context.Context) time.Time {
38 t, ok := ctx.Value(ctxTraceStart).(time.Time)
39 if !ok {
40 panic(fmt.Sprintf("missing start time: %T", ctx.Value(ctxTraceStart)))
41 }
42 return t
43 }
44
45 func (c *Stats) SetExtension(name string, data interface{}) {
46 if c.extension == nil {
47 c.extension = map[string]interface{}{}
48 }
49 c.extension[name] = data
50 }
51
52 func (c *Stats) GetExtension(name string) interface{} {
53 if c.extension == nil {
54 return nil
55 }
56 return c.extension[name]
57 }
58
59
60 var Now = time.Now
61
View as plain text