@@ -25,16 +25,23 @@ import (
25
25
// resolver, then the schema can not be executed, but it may be inspected (e.g. with ToJSON).
26
26
func ParseSchema (schemaString string , resolver interface {}, opts ... SchemaOpt ) (* Schema , error ) {
27
27
s := & Schema {
28
- schema : schema .New (),
29
- maxParallelism : 10 ,
30
- tracer : trace.OpenTracingTracer {},
31
- validationTracer : trace.NoopValidationTracer {},
32
- logger : & log.DefaultLogger {},
28
+ schema : schema .New (),
29
+ maxParallelism : 10 ,
30
+ tracer : trace.OpenTracingTracer {},
31
+ logger : & log.DefaultLogger {},
33
32
}
34
33
for _ , opt := range opts {
35
34
opt (s )
36
35
}
37
36
37
+ if s .validationTracer == nil {
38
+ if tracer , ok := s .tracer .(trace.ValidationTracerContext ); ok {
39
+ s .validationTracer = tracer
40
+ } else {
41
+ s .validationTracer = & validationBridgingTracer {tracer : trace.NoopValidationTracer {}}
42
+ }
43
+ }
44
+
38
45
if err := s .schema .Parse (schemaString , s .useStringDescriptions ); err != nil {
39
46
return nil , err
40
47
}
@@ -68,7 +75,7 @@ type Schema struct {
68
75
maxDepth int
69
76
maxParallelism int
70
77
tracer trace.Tracer
71
- validationTracer trace.ValidationTracer
78
+ validationTracer trace.ValidationTracerContext
72
79
logger log.Logger
73
80
useStringDescriptions bool
74
81
disableIntrospection bool
@@ -117,9 +124,10 @@ func Tracer(tracer trace.Tracer) SchemaOpt {
117
124
}
118
125
119
126
// ValidationTracer is used to trace validation errors. It defaults to trace.NoopValidationTracer.
127
+ // Deprecated: context is needed to support tracing correctly. Use a Tracer which implements trace.ValidationTracerContext.
120
128
func ValidationTracer (tracer trace.ValidationTracer ) SchemaOpt {
121
129
return func (s * Schema ) {
122
- s .validationTracer = tracer
130
+ s .validationTracer = & validationBridgingTracer { tracer : tracer }
123
131
}
124
132
}
125
133
@@ -186,7 +194,7 @@ func (s *Schema) exec(ctx context.Context, queryString string, operationName str
186
194
return & Response {Errors : []* errors.QueryError {qErr }}
187
195
}
188
196
189
- validationFinish := s .validationTracer .TraceValidation ()
197
+ validationFinish := s .validationTracer .TraceValidation (ctx )
190
198
errs := validation .Validate (s .schema , doc , variables , s .maxDepth )
191
199
validationFinish (errs )
192
200
if len (errs ) != 0 {
@@ -272,6 +280,14 @@ func (s *Schema) validateSchema() error {
272
280
return nil
273
281
}
274
282
283
+ type validationBridgingTracer struct {
284
+ tracer trace.ValidationTracer
285
+ }
286
+
287
+ func (t * validationBridgingTracer ) TraceValidation (context.Context ) trace.TraceValidationFinishFunc {
288
+ return t .tracer .TraceValidation ()
289
+ }
290
+
275
291
func validateRootOp (s * schema.Schema , name string , mandatory bool ) error {
276
292
t , ok := s .EntryPoints [name ]
277
293
if ! ok {
0 commit comments