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();
});
};