function wrapGraphql()

in lib/instrumentation/modules/graphql.js [67:132]


  function wrapGraphql(orig) {
    return function wrappedGraphql(args) {
      agent.logger.debug('intercepted call to graphql.graphql');
      const span = ins.createSpan(
        'GraphQL: Unknown Query',
        'db',
        'graphql',
        'execute',
      );
      if (!span) {
        return orig.apply(this, arguments);
      }

      let schema;
      let source;
      let operationName;
      const singleArgForm =
        onlySupportsSingleArg ||
        (!onlySupportsPositionalArgs && arguments.length === 1);
      if (singleArgForm) {
        schema = args.schema;
        source = args.source;
        operationName = args.operationName;
      } else {
        schema = arguments[0];
        source = arguments[1];
        operationName = arguments[5];
      }

      const sourceObj =
        typeof source === 'string'
          ? new graphql.Source(source || '', 'GraphQL request')
          : source;
      if (sourceObj) {
        var documentAST;

        try {
          documentAST = graphql.parse(sourceObj);
        } catch (syntaxError) {
          agent.logger.debug(
            'graphql.parse(source) failed - skipping graphql query extraction',
          );
        }

        if (documentAST) {
          var validationErrors = graphql.validate(schema, documentAST);
          if (validationErrors && validationErrors.length === 0) {
            var queries = extractDetails(documentAST, operationName).queries;
            if (queries.length > 0)
              span.name = 'GraphQL: ' + queries.join(', ');
          }
        }
      } else {
        agent.logger.debug(
          'graphql.Source(query) failed - skipping graphql query extraction',
        );
      }

      const spanRunContext = ins.currRunContext().enterSpan(span);
      const p = ins.withRunContext(spanRunContext, orig, this, ...arguments);
      p.then(function () {
        span.end();
      });
      return p;
    };
  }