Skip to content

Commit

Permalink
move trace field so can capture recover if panic
Browse files Browse the repository at this point in the history
  • Loading branch information
agungdwiprasetyo committed Oct 29, 2020
1 parent 785b833 commit bd649a1
Showing 1 changed file with 15 additions and 9 deletions.
24 changes: 15 additions & 9 deletions internal/exec/exec.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,12 @@ type extensionser interface {
}

func makePanicError(value interface{}) *errors.QueryError {
return errors.Errorf("graphql: panic occurred: %v", value)
return &errors.QueryError{
Message: fmt.Sprintf("graphql: panic occurred: %v", value),
Extensions: map[string]interface{}{
"code": 500, "success": false,
},
}
}

func (r *Request) Execute(ctx context.Context, s *resolvable.Schema, op *query.Operation) ([]byte, []*errors.QueryError) {
Expand Down Expand Up @@ -181,11 +186,6 @@ func execFieldSelection(ctx context.Context, r *Request, s *resolvable.Schema, f
var result reflect.Value
var err *errors.QueryError

traceCtx, finish := r.Tracer.TraceField(ctx, f.field.TraceLabel, f.field.TypeName, f.field.Name, !f.field.Async, f.field.Args)
defer func() {
finish(f.out.Bytes(), err)
}()

err = func() (err *errors.QueryError) {
defer func() {
if panicValue := recover(); panicValue != nil {
Expand All @@ -199,20 +199,26 @@ func execFieldSelection(ctx context.Context, r *Request, s *resolvable.Schema, f
}
}()

var finish trace.TraceFieldFinishFunc
ctx, finish = r.Tracer.TraceField(ctx, f.field.TraceLabel, f.field.TypeName, f.field.Name, !f.field.Async, f.field.Args)
defer func() {
finish(f.out.Bytes(), err)
}()

if f.field.FixedResult.IsValid() {
result = f.field.FixedResult
return nil
}

if err := traceCtx.Err(); err != nil {
if err := ctx.Err(); err != nil {
return errors.Errorf("%s", err) // don't execute any more resolvers if context got cancelled
}

res := f.resolver
if f.field.UseMethodResolver() {
var in []reflect.Value
if f.field.HasContext {
in = append(in, reflect.ValueOf(traceCtx))
in = append(in, reflect.ValueOf(ctx))
}
if f.field.ArgsPacker != nil {
in = append(in, f.field.PackedArgs)
Expand Down Expand Up @@ -251,7 +257,7 @@ func execFieldSelection(ctx context.Context, r *Request, s *resolvable.Schema, f
return
}

r.execSelectionSet(traceCtx, f.sels, f.field.Type, path, s, result, f.out)
r.execSelectionSet(ctx, f.sels, f.field.Type, path, s, result, f.out)
}

func (r *Request) execSelectionSet(ctx context.Context, sels []selected.Selection, typ common.Type, path *pathSegment, s *resolvable.Schema, resolver reflect.Value, out *bytes.Buffer) {
Expand Down

0 comments on commit bd649a1

Please sign in to comment.