package monitoring 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) }