function captureQuery()

in packages/postgres/lib/postgres_p.js [52:123]


function captureQuery() {
  var lastArg = arguments[arguments.length-1];
  var parent = AWSXRay.resolveSegment(
    (lastArg != null && lastArg.constructor &&
      (lastArg.constructor.name === 'Segment' || lastArg.constructor.name === 'Subsegment'))
      ? lastArg
      : null
  );

  if (!parent) {
    AWSXRay.getLogger().info('Failed to capture Postgres. Cannot resolve sub/segment.');
    return this.__query.apply(this, arguments);
  }


  var args = pgNormalizeQueryConfig.apply(this, arguments) || {};

  var subsegment = parent.addNewSubsegment(this.database + '@' + this.host);
  subsegment.namespace = 'remote';

  if (args.callback) {
    var cb = args.callback;

    if (AWSXRay.isAutomaticMode()) {
      args.callback = function autoContext(err, data) {
        var session = AWSXRay.getNamespace();

        session.run(function() {
          AWSXRay.setSegment(subsegment);
          cb(err, data);
        });

        subsegment.close(err);
      };
    } else {
      args.callback = function(err, data) {
        cb(err, data, subsegment);
        subsegment.close(err);
      };
    }
  }

  var result = this.__query.call(this, args);

  if (this._queryable && !this._ending) {
    var query;
    // To get the actual query object, we have to extract it from the
    // owning connection object.  The query will either be the last one in
    // the queue or it will be the active query.
    if (this.queryQueue.length === 0) {
      query = this.activeQuery;
    } else {
      query = this.queryQueue[this.queryQueue.length-1];
    }

    if (!args.callback && query.on instanceof Function) {
      query.on('end', function() {
        subsegment.close();
      });

      var errorCapturer = function (err) {
        subsegment.close(err);
      };

      query.on(events.errorMonitor || 'error', errorCapturer);
    }

    subsegment.addSqlData(createSqlData(this.connectionParameters, query));
  }

  return result;
}