UNPKG

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
"use strict"; 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