lightstep-tracer
Version:
> ❗ **This instrumentation is no longer recommended**. Please review [documentation on setting up and configuring the OpenTelemetry Node.js Launcher](https://github.com/lightstep/otel-launcher-node) or [OpenTelemetry JS (Browser)](https://github.com/open-
222 lines (183 loc) • 8.08 kB
JavaScript
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var https = _interopRequireWildcard(require("https"));
var http = _interopRequireWildcard(require("http"));
var zlib = _interopRequireWildcard(require("zlib"));
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
var kMaxDetailedErrorFrequencyMs = 30000;
var kMaxStringLength = 2048;
function truncatedString(s) {
if (!s || s.length <= kMaxStringLength) {
return s;
}
var half = Math.floor(kMaxStringLength / 2);
return "".concat(s.substr(0, half), "...").concat(s.substr(-half));
}
function encodeAndTruncate(obj) {
try {
return truncatedString(JSON.stringify(obj.toThrift()));
} catch (exception) {
return exception;
}
}
function errorFromResponse(res, buffer) {
if (buffer && buffer.length) {
buffer = truncatedString("".concat(buffer).replace(/\s+$/, ''));
}
return new Error("status code=".concat(res.statusCode, ", message='").concat(res.statusMessage, "', body='").concat(buffer, "'"));
}
var TransportHTTPThrift = /*#__PURE__*/function () {
function TransportHTTPThrift(logger) {
_classCallCheck(this, TransportHTTPThrift);
this._host = '';
this._port = 0;
this._encryption = '';
this._timeoutMs = 0;
this._logger = logger;
this._lastLogMs = 0;
}
_createClass(TransportHTTPThrift, [{
key: "ensureConnection",
value: function ensureConnection(opts) {
this._host = opts.collector_host;
this._port = opts.collector_port;
this._encryption = opts.collector_encryption;
this._timeoutMs = opts.report_timeout_millis;
this._gzipJSON = opts.gzip_json_requests;
}
}, {
key: "_preparePayload",
value: function _preparePayload(useGzip, reportRequest, cb) {
var payload;
try {
payload = JSON.stringify(reportRequest.toThrift());
} catch (exception) {
// This should never happen. The library should always be constructing
// valid reports.
this._error('Could not JSON.stringify report!');
return cb(exception);
}
if (useGzip) {
return zlib.gzip(payload, cb);
}
return cb(null, payload);
}
}, {
key: "report",
value: function report(detached, auth, reportRequest, done) {
var _this = this;
var options = {
hostname: this._host,
port: this._port,
method: 'POST',
path: '/api/v0/reports'
};
var protocol = this._encryption === 'none' ? http : https;
var useGzip = this._gzipJSON;
this._preparePayload(useGzip, reportRequest, function (payloadErr, payload) {
if (payloadErr) {
_this._error('Error compressing payload');
return done(payloadErr);
}
var extraErrorData = [];
var req = protocol.request(options, function (res) {
var buffer = '';
res.on('data', function (chunk) {
buffer += chunk;
});
res.on('end', function () {
var err = null;
var resp = null;
if (res.statusCode === 400) {
_this._throttleLog(function () {
_this._warning('transport status code = 400', {
code: res.statusCode,
message: res.statusMessage,
body: buffer,
extra: extraErrorData,
report: encodeAndTruncate(reportRequest)
});
});
err = errorFromResponse(res, buffer);
} else if (res.statusCode !== 200) {
err = errorFromResponse(res, buffer);
} else if (!buffer) {
err = new Error('unexpected empty response');
} else {
try {
resp = JSON.parse(buffer);
} catch (exception) {
err = exception;
}
}
return done(err, resp);
});
});
req.on('socket', function (socket, head) {
socket.setTimeout(_this._timeoutMs);
socket.on('timeout', function () {
// abort() will generate an error, so done() is called as a
// result.
req.abort();
extraErrorData.push("Request timed out (".concat(_this._timeoutMs, " ms)"));
});
});
req.on('error', function (err) {
_this._throttleLog(function () {
_this._warning('HTTP request error', {
error: err,
extra: extraErrorData,
report: encodeAndTruncate(reportRequest)
});
});
done(err, null);
});
req.setHeader('Host', _this._host);
req.setHeader('User-Agent', 'LightStep-JavaScript-Node');
req.setHeader('LightStep-Access-Token', auth.getAccessToken());
req.setHeader('Content-Type', 'application/json');
req.setHeader('Content-Length', payload.length);
if (useGzip) {
req.setHeader('Content-Encoding', 'gzip');
}
if (!detached) {
req.setHeader('Connection', 'keep-alive');
}
req.write(payload);
req.end();
});
}
}, {
key: "_throttleLog",
value: function _throttleLog(f) {
var now = Date.now();
if (now - this._lastLogMs < kMaxDetailedErrorFrequencyMs) {
return;
}
this._lastLogMs = now;
f();
}
}, {
key: "_warning",
value: function _warning(msg, payload) {
this._logger.warn(msg, payload);
}
}, {
key: "_error",
value: function _error(msg, payload) {
this._logger.error(msg, payload);
}
}]);
return TransportHTTPThrift;
}();
exports["default"] = TransportHTTPThrift;
module.exports = exports.default;
//# sourceMappingURL=transport_httpthrift.js.map
;