Client.prototype.lambdaRegisterTransaction = function()

in lib/apm-client/http-apm-client/index.js [797:876]


Client.prototype.lambdaRegisterTransaction = function (trans, awsRequestId) {
  if (!isLambdaExecutionEnvironment) {
    return;
  }
  if (!this._lambdaShouldRegisterTransactions) {
    return;
  }
  assert(this._encodedMetadata, '_encodedMetadata is set');

  // We expect to be talking to the localhost Elastic Lambda extension, so we
  // want a shorter timeout than `_conf.serverTimeout`.
  const TIMEOUT_MS = 5000;
  const startTime = performance.now();

  return new Promise((resolve, reject) => {
    this._log.trace(
      { awsRequestId, traceId: trans.trace_id, transId: trans.id },
      'lambdaRegisterTransaction start',
    );

    const finish = (errOrErrMsg) => {
      const durationMs = performance.now() - startTime;
      if (errOrErrMsg) {
        this._log.debug(
          { awsRequestId, err: errOrErrMsg, durationMs },
          'lambdaRegisterTransaction unsuccessful',
        );
        this._lambdaShouldRegisterTransactions = false;
      } else {
        this._log.trace(
          { awsRequestId, durationMs },
          'lambdaRegisterTransaction success',
        );
      }
      resolve(); // always resolve, never reject
    };

    var out = this._encode({ transaction: trans }, Client.encoding.TRANSACTION);
    if (!out) {
      finish('could not encode transaction');
      return;
    }

    // Every `POST /register/transaction` request must set the
    // `x-elastic-aws-request-id` header. Instead of creating a new options obj
    // each time, we just modify in-place.
    this._conf.requestRegisterTransaction.headers['x-elastic-aws-request-id'] =
      awsRequestId;

    const req = this._transportRequest(
      this._conf.requestRegisterTransaction,
      (res) => {
        res.on('error', (err) => {
          // Not sure this event can ever be emitted, but just in case.
          res.destroy(err);
        });
        res.resume();
        if (res.statusCode !== 200) {
          finish(`unexpected response status code: ${res.statusCode}`);
          return;
        }
        res.on('end', function () {
          finish();
        });
      },
    );
    req.setTimeout(TIMEOUT_MS);
    req.on('timeout', () => {
      req.destroy(
        new Error(`timeout (${TIMEOUT_MS}ms) registering lambda transaction`),
      );
    });
    req.on('error', (err) => {
      finish(err);
    });
    req.write(this._encodedMetadata);
    req.write(out);
    req.end();
  });
};