router/pkg/art/timing.go (119 lines of code) (raw):

package art import ( "context" "time" "github.com/wundergraph/graphql-go-tools/v2/pkg/engine/resolve" ) type TraceTimings struct { ctx context.Context ParseStart int64 ParseEnd int64 NormalizeStart int64 NormalizeEnd int64 ValidateStart int64 ValidateEnd int64 PlanningStart int64 PlanningEnd int64 } func NewTraceTimings(ctx context.Context) *TraceTimings { return &TraceTimings{ ctx: ctx, } } func (tt *TraceTimings) StartParse() { if tt == nil { return } tt.ParseStart = resolve.GetDurationNanoSinceTraceStart(tt.ctx) } func (tt *TraceTimings) EndParse() { if tt == nil { return } tt.ParseEnd = resolve.GetDurationNanoSinceTraceStart(tt.ctx) } // StartNormalize starts the timing for the normalization step func (tt *TraceTimings) StartNormalize() { if tt == nil { return } tt.NormalizeStart = resolve.GetDurationNanoSinceTraceStart(tt.ctx) } func (tt *TraceTimings) EndNormalize() { if tt == nil { return } tt.NormalizeEnd = resolve.GetDurationNanoSinceTraceStart(tt.ctx) } func (tt *TraceTimings) StartValidate() { if tt == nil { return } tt.ValidateStart = resolve.GetDurationNanoSinceTraceStart(tt.ctx) } func (tt *TraceTimings) EndValidate() { if tt == nil { return } tt.ValidateEnd = resolve.GetDurationNanoSinceTraceStart(tt.ctx) } func (tt *TraceTimings) StartPlanning() { if tt == nil { return } tt.PlanningStart = resolve.GetDurationNanoSinceTraceStart(tt.ctx) } func (tt *TraceTimings) EndPlanning() { if tt == nil { return } tt.PlanningEnd = resolve.GetDurationNanoSinceTraceStart(tt.ctx) } func (tt *TraceTimings) DurationParse() int64 { return tt.ParseEnd - tt.ParseStart } func (tt *TraceTimings) DurationNormalize() int64 { return tt.NormalizeEnd - tt.NormalizeStart } func (tt *TraceTimings) DurationValidate() int64 { return tt.ValidateEnd - tt.ValidateStart } func (tt *TraceTimings) DurationPlanning() int64 { return tt.PlanningEnd - tt.PlanningStart } func SetRequestTracingStats(ctx context.Context, traceOptions resolve.TraceOptions, traceTimings *TraceTimings) { if traceTimings == nil { return } if !traceOptions.ExcludeParseStats { resolve.SetParseStats(ctx, resolve.PhaseStats{ DurationSinceStartNano: traceTimings.ParseStart, DurationSinceStartPretty: time.Duration(traceTimings.ParseStart).String(), DurationNano: traceTimings.DurationParse(), DurationPretty: time.Duration(traceTimings.DurationParse()).String(), }) } if !traceOptions.ExcludeNormalizeStats { resolve.SetNormalizeStats(ctx, resolve.PhaseStats{ DurationSinceStartNano: traceTimings.NormalizeStart, DurationSinceStartPretty: time.Duration(traceTimings.NormalizeStart).String(), DurationNano: traceTimings.DurationNormalize(), DurationPretty: time.Duration(traceTimings.DurationNormalize()).String(), }) } if !traceOptions.ExcludeValidateStats { resolve.SetValidateStats(ctx, resolve.PhaseStats{ DurationSinceStartNano: traceTimings.ValidateStart, DurationSinceStartPretty: time.Duration(traceTimings.ValidateStart).String(), DurationNano: traceTimings.DurationValidate(), DurationPretty: time.Duration(traceTimings.DurationValidate()).String(), }) } if !traceOptions.ExcludePlannerStats { resolve.SetPlannerStats(ctx, resolve.PhaseStats{ DurationSinceStartNano: traceTimings.PlanningStart, DurationSinceStartPretty: time.Duration(traceTimings.PlanningStart).String(), DurationNano: traceTimings.DurationPlanning(), DurationPretty: time.Duration(traceTimings.DurationPlanning()).String(), }) } }