makeRequest()

in lib/instrumentation/modules/tedious.js [93:154]


      makeRequest(request, _packetType, payload) {
        // if not a Request object (i.e. a BulkLoad), then bail
        if (!request.parametersByName) {
          return super.makeRequest(...arguments);
        }
        const span = ins.createSpan(null, 'db', 'mssql', 'query', {
          exitSpan: true,
        });
        if (!span) {
          return super.makeRequest(...arguments);
        }

        let host, port, instanceName;
        if (typeof this.config === 'object') {
          // http://tediousjs.github.io/tedious/api-connection.html#function_newConnection
          host = this.config.server;
          if (this.config.options) {
            port = this.config.options.port;
            instanceName = this.config.options.instanceName;
          }
        }
        span._setDestinationContext(getDBDestination(host, port));

        let sql;
        let preparing;
        if (payload.parameters !== undefined) {
          // This looks for tedious instance with `RpcRequestPayload` started
          // since version >=v11.0.10, when RPC parameter handling was refactored
          // (https://github.com/tediousjs/tedious/pull/1275).
          preparing =
            typeof payload.procedure === 'number'
              ? // tedious@16.2.0 starts using stored procedure *IDs*
                // (https://github.com/tediousjs/tedious/pull/1327)
                payload.procedure === 11
              : payload.procedure === 'sp_prepare';
          const stmtParam =
            payload.parameters.find(({ name }) => name === 'statement') ||
            payload.parameters.find(({ name }) => name === 'stmt');
          sql = stmtParam ? stmtParam.value : request.sqlTextOrProcedure;
        } else {
          preparing = request.sqlTextOrProcedure === 'sp_prepare';
          const params = request.parametersByName;
          sql = (params.statement || params.stmt || {}).value;
        }
        span.name = sqlSummary(sql) + (preparing ? ' (prepare)' : '');
        const dbContext = { type: 'sql', statement: sql };
        if (instanceName) {
          dbContext.instance = instanceName;
        }
        span.setDbContext(dbContext);

        const origCallback = request.userCallback;
        request.userCallback = ins.bindFunction(function tracedCallback() {
          // TODO: captureError and setOutcome on err first arg here
          span.end();
          if (origCallback) {
            return origCallback.apply(this, arguments);
          }
        });

        return super.makeRequest(...arguments);
      }