42 lines
1.0 KiB
Go
42 lines
1.0 KiB
Go
package otelsetup
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"github.com/99designs/gqlgen/graphql"
|
|
"go.opentelemetry.io/otel/trace"
|
|
)
|
|
|
|
func AroundOperations(ctx context.Context, next graphql.OperationHandler) graphql.ResponseHandler {
|
|
op := graphql.GetOperationContext(ctx)
|
|
spanName := fmt.Sprintf("graphql:operation:%s", op.OperationName)
|
|
// Span always injected in the http handler above
|
|
sp := trace.SpanFromContext(ctx)
|
|
if sp != nil {
|
|
sp.SetName(spanName)
|
|
}
|
|
return next(ctx)
|
|
}
|
|
|
|
func AroundRootFields(ctx context.Context, next graphql.RootResolver) graphql.Marshaler {
|
|
oc := graphql.GetRootFieldContext(ctx)
|
|
spanCtx, span := StartSpan(ctx, fmt.Sprintf("graphql:rootfield:%s", oc.Field.Name))
|
|
defer span.Finish()
|
|
return next(spanCtx)
|
|
}
|
|
|
|
func AroundFields(ctx context.Context, next graphql.Resolver) (res any, err error) {
|
|
oc := graphql.GetFieldContext(ctx)
|
|
var span Span
|
|
if oc.IsResolver {
|
|
ctx, span = StartSpan(ctx, fmt.Sprintf("graphql:field:%s", oc.Field.Name))
|
|
}
|
|
defer func() {
|
|
if span != nil {
|
|
span.Finish()
|
|
}
|
|
}()
|
|
return next(ctx)
|
|
}
|