UNPKG

@elastic/apm-rum

Version:
1,553 lines (1,283 loc) 609 kB
(function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(); else if(typeof define === 'function' && define.amd) define([], factory); else if(typeof exports === 'object') exports["elastic-apm-rum"] = factory(); else root["elastic-apm-rum"] = factory(); })(self, function() { return /******/ (function() { // webpackBootstrap /******/ var __webpack_modules__ = ({ /***/ "../rum-core/dist/es/bootstrap.js": /*!****************************************!*\ !*** ../rum-core/dist/es/bootstrap.js ***! \****************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ bootstrap: function() { return /* binding */ bootstrap; } /* harmony export */ }); /* harmony import */ var _common_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./common/utils */ "../rum-core/dist/es/common/utils.js"); /* harmony import */ var _common_patching__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./common/patching */ "../rum-core/dist/es/common/patching/index.js"); /* harmony import */ var _state__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./state */ "../rum-core/dist/es/state.js"); var enabled = false; function bootstrap() { if ((0,_common_utils__WEBPACK_IMPORTED_MODULE_0__.isPlatformSupported)()) { (0,_common_patching__WEBPACK_IMPORTED_MODULE_1__.patchAll)(); _state__WEBPACK_IMPORTED_MODULE_2__.state.bootstrapTime = (0,_common_utils__WEBPACK_IMPORTED_MODULE_0__.now)(); enabled = true; } else if (_common_utils__WEBPACK_IMPORTED_MODULE_0__.isBrowser) { console.log('[Elastic APM] platform is not supported!'); } return enabled; } /***/ }), /***/ "../rum-core/dist/es/common/after-frame.js": /*!*************************************************!*\ !*** ../rum-core/dist/es/common/after-frame.js ***! \*************************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": function() { return /* binding */ afterFrame; } /* harmony export */ }); var RAF_TIMEOUT = 100; function afterFrame(callback) { var handler = function handler() { clearTimeout(timeout); cancelAnimationFrame(raf); setTimeout(callback); }; var timeout = setTimeout(handler, RAF_TIMEOUT); var raf = requestAnimationFrame(handler); } /***/ }), /***/ "../rum-core/dist/es/common/apm-server.js": /*!************************************************!*\ !*** ../rum-core/dist/es/common/apm-server.js ***! \************************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _queue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./queue */ "../rum-core/dist/es/common/queue.js"); /* harmony import */ var _throttle__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./throttle */ "../rum-core/dist/es/common/throttle.js"); /* harmony import */ var _ndjson__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./ndjson */ "../rum-core/dist/es/common/ndjson.js"); /* harmony import */ var _truncate__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./truncate */ "../rum-core/dist/es/common/truncate.js"); /* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./constants */ "../rum-core/dist/es/common/constants.js"); /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils */ "../rum-core/dist/es/common/utils.js"); /* harmony import */ var _polyfills__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./polyfills */ "../rum-core/dist/es/common/polyfills.js"); /* harmony import */ var _compress__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./compress */ "../rum-core/dist/es/common/compress.js"); /* harmony import */ var _state__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../state */ "../rum-core/dist/es/state.js"); /* harmony import */ var _http_fetch__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./http/fetch */ "../rum-core/dist/es/common/http/fetch.js"); /* harmony import */ var _http_xhr__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./http/xhr */ "../rum-core/dist/es/common/http/xhr.js"); var THROTTLE_INTERVAL = 60000; var ApmServer = function () { function ApmServer(configService, loggingService) { this._configService = configService; this._loggingService = loggingService; this.queue = undefined; this.throttleEvents = _utils__WEBPACK_IMPORTED_MODULE_0__.noop; } var _proto = ApmServer.prototype; _proto.init = function init() { var _this = this; var queueLimit = this._configService.get('queueLimit'); var flushInterval = this._configService.get('flushInterval'); var limit = this._configService.get('eventsLimit'); var onFlush = function onFlush(events) { var promise = _this.sendEvents(events); if (promise) { promise.catch(function (reason) { _this._loggingService.warn('Failed sending events!', _this._constructError(reason)); }); } }; this.queue = new _queue__WEBPACK_IMPORTED_MODULE_1__["default"](onFlush, { queueLimit: queueLimit, flushInterval: flushInterval }); this.throttleEvents = (0,_throttle__WEBPACK_IMPORTED_MODULE_2__["default"])(this.queue.add.bind(this.queue), function () { return _this._loggingService.warn('Dropped events due to throttling!'); }, { limit: limit, interval: THROTTLE_INTERVAL }); this._configService.observeEvent(_constants__WEBPACK_IMPORTED_MODULE_3__.QUEUE_FLUSH, function () { _this.queue.flush(); }); }; _proto._postJson = function _postJson(endPoint, payload) { var _this2 = this; var headers = { 'Content-Type': 'application/x-ndjson' }; var apmRequest = this._configService.get('apmRequest'); var params = { payload: payload, headers: headers, beforeSend: apmRequest }; return (0,_compress__WEBPACK_IMPORTED_MODULE_4__.compressPayload)(params).catch(function (error) { if (_state__WEBPACK_IMPORTED_MODULE_5__.__DEV__) { _this2._loggingService.debug('Compressing the payload using CompressionStream API failed', error.message); } return params; }).then(function (result) { return _this2._makeHttpRequest('POST', endPoint, result); }).then(function (_ref) { var responseText = _ref.responseText; return responseText; }); }; _proto._constructError = function _constructError(reason) { var url = reason.url, status = reason.status, responseText = reason.responseText; if (typeof status == 'undefined') { return reason; } var message = url + ' HTTP status: ' + status; if (_state__WEBPACK_IMPORTED_MODULE_5__.__DEV__ && responseText) { try { var serverErrors = []; var response = JSON.parse(responseText); if (response.errors && response.errors.length > 0) { response.errors.forEach(function (err) { return serverErrors.push(err.message); }); message += ' ' + serverErrors.join(','); } } catch (e) { this._loggingService.debug('Error parsing response from APM server', e); } } return new Error(message); }; _proto._makeHttpRequest = function _makeHttpRequest(method, url, _temp) { var _ref2 = _temp === void 0 ? {} : _temp, _ref2$timeout = _ref2.timeout, timeout = _ref2$timeout === void 0 ? _constants__WEBPACK_IMPORTED_MODULE_3__.HTTP_REQUEST_TIMEOUT : _ref2$timeout, payload = _ref2.payload, headers = _ref2.headers, beforeSend = _ref2.beforeSend; var sendCredentials = this._configService.get('sendCredentials'); if (!beforeSend && (0,_http_fetch__WEBPACK_IMPORTED_MODULE_6__.shouldUseFetchWithKeepAlive)(method, payload)) { return (0,_http_fetch__WEBPACK_IMPORTED_MODULE_6__.sendFetchRequest)(method, url, { keepalive: true, timeout: timeout, payload: payload, headers: headers, sendCredentials: sendCredentials }).catch(function (reason) { if (reason instanceof TypeError) { return (0,_http_xhr__WEBPACK_IMPORTED_MODULE_7__.sendXHR)(method, url, { timeout: timeout, payload: payload, headers: headers, beforeSend: beforeSend, sendCredentials: sendCredentials }); } throw reason; }); } return (0,_http_xhr__WEBPACK_IMPORTED_MODULE_7__.sendXHR)(method, url, { timeout: timeout, payload: payload, headers: headers, beforeSend: beforeSend, sendCredentials: sendCredentials }); }; _proto.fetchConfig = function fetchConfig(serviceName, environment) { var _this3 = this; var _this$getEndpoints = this.getEndpoints(), configEndpoint = _this$getEndpoints.configEndpoint; if (!serviceName) { return _polyfills__WEBPACK_IMPORTED_MODULE_8__.Promise.reject('serviceName is required for fetching central config.'); } configEndpoint += "?service.name=" + serviceName; if (environment) { configEndpoint += "&service.environment=" + environment; } var localConfig = this._configService.getLocalConfig(); if (localConfig) { configEndpoint += "&ifnonematch=" + localConfig.etag; } var apmRequest = this._configService.get('apmRequest'); return this._makeHttpRequest('GET', configEndpoint, { timeout: 5000, beforeSend: apmRequest }).then(function (xhr) { var status = xhr.status, responseText = xhr.responseText; if (status === 304) { return localConfig; } else { var remoteConfig = JSON.parse(responseText); var etag = xhr.getResponseHeader('etag'); if (etag) { remoteConfig.etag = etag.replace(/["]/g, ''); _this3._configService.setLocalConfig(remoteConfig, true); } return remoteConfig; } }).catch(function (reason) { var error = _this3._constructError(reason); return _polyfills__WEBPACK_IMPORTED_MODULE_8__.Promise.reject(error); }); }; _proto.createMetaData = function createMetaData() { var cfg = this._configService; var metadata = { service: { name: cfg.get('serviceName'), version: cfg.get('serviceVersion'), agent: { name: 'rum-js', version: cfg.version }, language: { name: 'javascript' }, environment: cfg.get('environment') }, labels: cfg.get('context.tags') }; return (0,_truncate__WEBPACK_IMPORTED_MODULE_9__.truncateModel)(_truncate__WEBPACK_IMPORTED_MODULE_9__.METADATA_MODEL, metadata); }; _proto.addError = function addError(error) { var _this$throttleEvents; this.throttleEvents((_this$throttleEvents = {}, _this$throttleEvents[_constants__WEBPACK_IMPORTED_MODULE_3__.ERRORS] = error, _this$throttleEvents)); }; _proto.addTransaction = function addTransaction(transaction) { var _this$throttleEvents2; this.throttleEvents((_this$throttleEvents2 = {}, _this$throttleEvents2[_constants__WEBPACK_IMPORTED_MODULE_3__.TRANSACTIONS] = transaction, _this$throttleEvents2)); }; _proto.ndjsonErrors = function ndjsonErrors(errors, compress) { var key = compress ? 'e' : 'error'; return errors.map(function (error) { var _NDJSON$stringify; return _ndjson__WEBPACK_IMPORTED_MODULE_10__["default"].stringify((_NDJSON$stringify = {}, _NDJSON$stringify[key] = compress ? (0,_compress__WEBPACK_IMPORTED_MODULE_4__.compressError)(error) : error, _NDJSON$stringify)); }); }; _proto.ndjsonMetricsets = function ndjsonMetricsets(metricsets) { return metricsets.map(function (metricset) { return _ndjson__WEBPACK_IMPORTED_MODULE_10__["default"].stringify({ metricset: metricset }); }).join(''); }; _proto.ndjsonTransactions = function ndjsonTransactions(transactions, compress) { var _this4 = this; var key = compress ? 'x' : 'transaction'; return transactions.map(function (tr) { var _NDJSON$stringify2; var spans = '', breakdowns = ''; if (!compress) { if (tr.spans) { spans = tr.spans.map(function (span) { return _ndjson__WEBPACK_IMPORTED_MODULE_10__["default"].stringify({ span: span }); }).join(''); delete tr.spans; } if (tr.breakdown) { breakdowns = _this4.ndjsonMetricsets(tr.breakdown); delete tr.breakdown; } } return _ndjson__WEBPACK_IMPORTED_MODULE_10__["default"].stringify((_NDJSON$stringify2 = {}, _NDJSON$stringify2[key] = compress ? (0,_compress__WEBPACK_IMPORTED_MODULE_4__.compressTransaction)(tr) : tr, _NDJSON$stringify2)) + spans + breakdowns; }); }; _proto.sendEvents = function sendEvents(events) { var _payload, _NDJSON$stringify3; if (events.length === 0) { return; } var transactions = []; var errors = []; for (var i = 0; i < events.length; i++) { var event = events[i]; if (event[_constants__WEBPACK_IMPORTED_MODULE_3__.TRANSACTIONS]) { transactions.push(event[_constants__WEBPACK_IMPORTED_MODULE_3__.TRANSACTIONS]); } if (event[_constants__WEBPACK_IMPORTED_MODULE_3__.ERRORS]) { errors.push(event[_constants__WEBPACK_IMPORTED_MODULE_3__.ERRORS]); } } if (transactions.length === 0 && errors.length === 0) { return; } var cfg = this._configService; var payload = (_payload = {}, _payload[_constants__WEBPACK_IMPORTED_MODULE_3__.TRANSACTIONS] = transactions, _payload[_constants__WEBPACK_IMPORTED_MODULE_3__.ERRORS] = errors, _payload); var filteredPayload = cfg.applyFilters(payload); if (!filteredPayload) { this._loggingService.warn('Dropped payload due to filtering!'); return; } var apiVersion = cfg.get('apiVersion'); var compress = apiVersion > 2; var ndjson = []; var metadata = this.createMetaData(); var metadataKey = compress ? 'm' : 'metadata'; ndjson.push(_ndjson__WEBPACK_IMPORTED_MODULE_10__["default"].stringify((_NDJSON$stringify3 = {}, _NDJSON$stringify3[metadataKey] = compress ? (0,_compress__WEBPACK_IMPORTED_MODULE_4__.compressMetadata)(metadata) : metadata, _NDJSON$stringify3))); ndjson = ndjson.concat(this.ndjsonErrors(filteredPayload[_constants__WEBPACK_IMPORTED_MODULE_3__.ERRORS], compress), this.ndjsonTransactions(filteredPayload[_constants__WEBPACK_IMPORTED_MODULE_3__.TRANSACTIONS], compress)); var ndjsonPayload = ndjson.join(''); var _this$getEndpoints2 = this.getEndpoints(), intakeEndpoint = _this$getEndpoints2.intakeEndpoint; return this._postJson(intakeEndpoint, ndjsonPayload); }; _proto.getEndpoints = function getEndpoints() { var serverUrl = this._configService.get('serverUrl'); var apiVersion = this._configService.get('apiVersion'); var serverUrlPrefix = this._configService.get('serverUrlPrefix') || "/intake/v" + apiVersion + "/rum/events"; var intakeEndpoint = serverUrl + serverUrlPrefix; var configEndpoint = serverUrl + "/config/v1/rum/agents"; return { intakeEndpoint: intakeEndpoint, configEndpoint: configEndpoint }; }; return ApmServer; }(); /* harmony default export */ __webpack_exports__["default"] = (ApmServer); /***/ }), /***/ "../rum-core/dist/es/common/compress.js": /*!**********************************************!*\ !*** ../rum-core/dist/es/common/compress.js ***! \**********************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ compressError: function() { return /* binding */ compressError; }, /* harmony export */ compressMetadata: function() { return /* binding */ compressMetadata; }, /* harmony export */ compressMetricsets: function() { return /* binding */ compressMetricsets; }, /* harmony export */ compressPayload: function() { return /* binding */ compressPayload; }, /* harmony export */ compressTransaction: function() { return /* binding */ compressTransaction; } /* harmony export */ }); /* harmony import */ var _polyfills__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./polyfills */ "../rum-core/dist/es/common/polyfills.js"); /* harmony import */ var _performance_monitoring_navigation_marks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../performance-monitoring/navigation/marks */ "../rum-core/dist/es/performance-monitoring/navigation/marks.js"); /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils */ "../rum-core/dist/es/common/utils.js"); function compressStackFrames(frames) { return frames.map(function (frame) { return { ap: frame.abs_path, f: frame.filename, fn: frame.function, li: frame.lineno, co: frame.colno }; }); } function compressResponse(response) { return { ts: response.transfer_size, ebs: response.encoded_body_size, dbs: response.decoded_body_size }; } function compressHTTP(http) { var compressed = {}; var method = http.method, status_code = http.status_code, url = http.url, response = http.response; compressed.url = url; if (method) { compressed.mt = method; } if (status_code) { compressed.sc = status_code; } if (response) { compressed.r = compressResponse(response); } return compressed; } function compressContext(context) { if (!context) { return null; } var compressed = {}; var page = context.page, http = context.http, response = context.response, destination = context.destination, user = context.user, custom = context.custom; if (page) { compressed.p = { rf: page.referer, url: page.url }; } if (http) { compressed.h = compressHTTP(http); } if (response) { compressed.r = compressResponse(response); } if (destination) { var service = destination.service; compressed.dt = { se: { n: service.name, t: service.type, rc: service.resource }, ad: destination.address, po: destination.port }; } if (user) { compressed.u = { id: user.id, un: user.username, em: user.email }; } if (custom) { compressed.cu = custom; } return compressed; } function compressMarks(marks) { if (!marks) { return null; } var compressedNtMarks = compressNavigationTimingMarks(marks.navigationTiming); var compressed = { nt: compressedNtMarks, a: compressAgentMarks(compressedNtMarks, marks.agent) }; return compressed; } function compressNavigationTimingMarks(ntMarks) { if (!ntMarks) { return null; } var compressed = {}; _performance_monitoring_navigation_marks__WEBPACK_IMPORTED_MODULE_0__.COMPRESSED_NAV_TIMING_MARKS.forEach(function (mark, index) { var mapping = _performance_monitoring_navigation_marks__WEBPACK_IMPORTED_MODULE_0__.NAVIGATION_TIMING_MARKS[index]; compressed[mark] = ntMarks[mapping]; }); return compressed; } function compressAgentMarks(compressedNtMarks, agentMarks) { var compressed = {}; if (compressedNtMarks) { compressed = { fb: compressedNtMarks.rs, di: compressedNtMarks.di, dc: compressedNtMarks.dc }; } if (agentMarks) { var fp = agentMarks.firstContentfulPaint; var lp = agentMarks.largestContentfulPaint; if (fp) { compressed.fp = fp; } if (lp) { compressed.lp = lp; } } if (Object.keys(compressed).length === 0) { return null; } return compressed; } function compressMetadata(metadata) { var service = metadata.service, labels = metadata.labels; var agent = service.agent, language = service.language; return { se: { n: service.name, ve: service.version, a: { n: agent.name, ve: agent.version }, la: { n: language.name }, en: service.environment }, l: labels }; } function compressTransaction(transaction) { var spans = transaction.spans.map(function (span) { var spanData = { id: span.id, n: span.name, t: span.type, s: span.start, d: span.duration, c: compressContext(span.context), o: span.outcome, sr: span.sample_rate }; if (span.parent_id !== transaction.id) { spanData.pid = span.parent_id; } if (span.sync === true) { spanData.sy = true; } if (span.subtype) { spanData.su = span.subtype; } if (span.action) { spanData.ac = span.action; } return spanData; }); var tr = { id: transaction.id, pid: transaction.parent_id, tid: transaction.trace_id, n: transaction.name, t: transaction.type, d: transaction.duration, c: compressContext(transaction.context), k: compressMarks(transaction.marks), me: compressMetricsets(transaction.breakdown), y: spans, yc: { sd: spans.length }, sm: transaction.sampled, sr: transaction.sample_rate, o: transaction.outcome }; if (transaction.experience) { var _transaction$experien = transaction.experience, cls = _transaction$experien.cls, fid = _transaction$experien.fid, tbt = _transaction$experien.tbt, longtask = _transaction$experien.longtask; tr.exp = { cls: cls, fid: fid, tbt: tbt, lt: longtask }; } if (transaction.session) { var _transaction$session = transaction.session, id = _transaction$session.id, sequence = _transaction$session.sequence; tr.ses = { id: id, seq: sequence }; } return tr; } function compressError(error) { var exception = error.exception; var compressed = { id: error.id, cl: error.culprit, ex: { mg: exception.message, st: compressStackFrames(exception.stacktrace), t: error.type }, c: compressContext(error.context) }; var transaction = error.transaction; if (transaction) { compressed.tid = error.trace_id; compressed.pid = error.parent_id; compressed.xid = error.transaction_id; compressed.x = { t: transaction.type, sm: transaction.sampled }; } return compressed; } function compressMetricsets(breakdowns) { return breakdowns.map(function (_ref) { var span = _ref.span, samples = _ref.samples; return { y: { t: span.type }, sa: { ysc: { v: samples['span.self_time.count'].value }, yss: { v: samples['span.self_time.sum.us'].value } } }; }); } function compressPayload(params, type) { if (type === void 0) { type = 'gzip'; } var isCompressionStreamSupported = typeof CompressionStream === 'function'; return new _polyfills__WEBPACK_IMPORTED_MODULE_1__.Promise(function (resolve) { if (!isCompressionStreamSupported) { return resolve(params); } if ((0,_utils__WEBPACK_IMPORTED_MODULE_2__.isBeaconInspectionEnabled)()) { return resolve(params); } var payload = params.payload, headers = params.headers, beforeSend = params.beforeSend; var payloadStream = new Blob([payload]).stream(); var compressedStream = payloadStream.pipeThrough(new CompressionStream(type)); return new Response(compressedStream).blob().then(function (payload) { headers['Content-Encoding'] = type; return resolve({ payload: payload, headers: headers, beforeSend: beforeSend }); }); }); } /***/ }), /***/ "../rum-core/dist/es/common/config-service.js": /*!****************************************************!*\ !*** ../rum-core/dist/es/common/config-service.js ***! \****************************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils */ "../rum-core/dist/es/common/utils.js"); /* harmony import */ var _event_handler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./event-handler */ "../rum-core/dist/es/common/event-handler.js"); /* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./constants */ "../rum-core/dist/es/common/constants.js"); function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } function getConfigFromScript() { var script = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getCurrentScript)(); var config = getDataAttributesFromNode(script); return config; } function getDataAttributesFromNode(node) { if (!node) { return {}; } var dataAttrs = {}; var dataRegex = /^data-([\w-]+)$/; var attrs = node.attributes; for (var i = 0; i < attrs.length; i++) { var attr = attrs[i]; if (dataRegex.test(attr.nodeName)) { var key = attr.nodeName.match(dataRegex)[1]; var camelCasedkey = key.split('-').map(function (value, index) { return index > 0 ? value.charAt(0).toUpperCase() + value.substring(1) : value; }).join(''); dataAttrs[camelCasedkey] = attr.value || attr.nodeValue; } } return dataAttrs; } var Config = function () { function Config() { this.config = { serviceName: '', serviceVersion: '', environment: '', serverUrl: 'http://localhost:8200', serverUrlPrefix: '', active: true, instrument: true, disableInstrumentations: [], logLevel: 'warn', breakdownMetrics: false, ignoreTransactions: [], eventsLimit: 80, queueLimit: -1, flushInterval: 500, distributedTracing: true, distributedTracingOrigins: [], distributedTracingHeaderName: 'traceparent', pageLoadTraceId: '', pageLoadSpanId: '', pageLoadSampled: false, pageLoadParentId: '', pageLoadTransactionName: '', propagateTracestate: false, transactionSampleRate: 1.0, centralConfig: false, monitorLongtasks: true, apiVersion: 2, context: {}, session: false, apmRequest: null, sendCredentials: false }; this.events = new _event_handler__WEBPACK_IMPORTED_MODULE_1__["default"](); this.filters = []; this.version = ''; } var _proto = Config.prototype; _proto.init = function init() { var scriptData = getConfigFromScript(); this.setConfig(scriptData); }; _proto.setVersion = function setVersion(version) { this.version = version; }; _proto.addFilter = function addFilter(cb) { if (typeof cb !== 'function') { throw new Error('Argument to must be function'); } this.filters.push(cb); }; _proto.applyFilters = function applyFilters(data) { for (var i = 0; i < this.filters.length; i++) { data = this.filters[i](data); if (!data) { return; } } return data; }; _proto.get = function get(key) { return key.split('.').reduce(function (obj, objKey) { return obj && obj[objKey]; }, this.config); }; _proto.setUserContext = function setUserContext(userContext) { if (userContext === void 0) { userContext = {}; } var context = {}; var _userContext = userContext, id = _userContext.id, username = _userContext.username, email = _userContext.email; if (typeof id === 'number' || typeof id === 'string') { context.id = id; } if (typeof username === 'string') { context.username = username; } if (typeof email === 'string') { context.email = email; } this.config.context.user = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.extend)(this.config.context.user || {}, context); }; _proto.setCustomContext = function setCustomContext(customContext) { if (customContext === void 0) { customContext = {}; } this.config.context.custom = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.extend)(this.config.context.custom || {}, customContext); }; _proto.addLabels = function addLabels(tags) { var _this = this; if (!this.config.context.tags) { this.config.context.tags = {}; } var keys = Object.keys(tags); keys.forEach(function (k) { return (0,_utils__WEBPACK_IMPORTED_MODULE_0__.setLabel)(k, tags[k], _this.config.context.tags); }); }; _proto.setConfig = function setConfig(properties) { if (properties === void 0) { properties = {}; } var _properties = properties, transactionSampleRate = _properties.transactionSampleRate, serverUrl = _properties.serverUrl; if (serverUrl) { properties.serverUrl = serverUrl.replace(/\/+$/, ''); } if (!(0,_utils__WEBPACK_IMPORTED_MODULE_0__.isUndefined)(transactionSampleRate)) { if (transactionSampleRate < 0.0001 && transactionSampleRate > 0) { transactionSampleRate = 0.0001; } properties.transactionSampleRate = Math.round(transactionSampleRate * 10000) / 10000; } this.config = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.merge)(this.config, properties); this.events.send(_constants__WEBPACK_IMPORTED_MODULE_2__.CONFIG_CHANGE, [this.config]); }; _proto.validate = function validate(properties) { if (properties === void 0) { properties = {}; } var requiredKeys = ['serviceName', 'serverUrl']; var allKeys = Object.keys(this.config); var errors = { missing: [], invalid: [], unknown: [] }; Object.keys(properties).forEach(function (key) { if (requiredKeys.indexOf(key) !== -1 && !properties[key]) { errors.missing.push(key); } if (allKeys.indexOf(key) === -1) { errors.unknown.push(key); } }); if (properties.serviceName && !/^[a-zA-Z0-9 _-]+$/.test(properties.serviceName)) { errors.invalid.push({ key: 'serviceName', value: properties.serviceName, allowed: 'a-z, A-Z, 0-9, _, -, <space>' }); } var sampleRate = properties.transactionSampleRate; if (typeof sampleRate !== 'undefined' && (typeof sampleRate !== 'number' || isNaN(sampleRate) || sampleRate < 0 || sampleRate > 1)) { errors.invalid.push({ key: 'transactionSampleRate', value: sampleRate, allowed: 'Number between 0 and 1' }); } return errors; }; _proto.getLocalConfig = function getLocalConfig() { var storage = sessionStorage; if (this.config.session) { storage = localStorage; } var config = storage.getItem(_constants__WEBPACK_IMPORTED_MODULE_2__.LOCAL_CONFIG_KEY); if (config) { return JSON.parse(config); } }; _proto.setLocalConfig = function setLocalConfig(config, merge) { if (config) { if (merge) { var prevConfig = this.getLocalConfig(); config = _extends({}, prevConfig, config); } var storage = sessionStorage; if (this.config.session) { storage = localStorage; } storage.setItem(_constants__WEBPACK_IMPORTED_MODULE_2__.LOCAL_CONFIG_KEY, JSON.stringify(config)); } }; _proto.dispatchEvent = function dispatchEvent(name, args) { this.events.send(name, args); }; _proto.observeEvent = function observeEvent(name, fn) { return this.events.observe(name, fn); }; return Config; }(); /* harmony default export */ __webpack_exports__["default"] = (Config); /***/ }), /***/ "../rum-core/dist/es/common/constants.js": /*!***********************************************!*\ !*** ../rum-core/dist/es/common/constants.js ***! \***********************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ADD_EVENT_LISTENER_STR: function() { return /* binding */ ADD_EVENT_LISTENER_STR; }, /* harmony export */ AFTER_EVENT: function() { return /* binding */ AFTER_EVENT; }, /* harmony export */ APM_SERVER: function() { return /* binding */ APM_SERVER; }, /* harmony export */ BEFORE_EVENT: function() { return /* binding */ BEFORE_EVENT; }, /* harmony export */ CLICK: function() { return /* binding */ CLICK; }, /* harmony export */ CONFIG_CHANGE: function() { return /* binding */ CONFIG_CHANGE; }, /* harmony export */ CONFIG_SERVICE: function() { return /* binding */ CONFIG_SERVICE; }, /* harmony export */ ERROR: function() { return /* binding */ ERROR; }, /* harmony export */ ERRORS: function() { return /* binding */ ERRORS; }, /* harmony export */ ERROR_LOGGING: function() { return /* binding */ ERROR_LOGGING; }, /* harmony export */ EVENT: function() { return /* binding */ EVENT; }, /* harmony export */ EVENT_TARGET: function() { return /* binding */ EVENT_TARGET; }, /* harmony export */ FETCH: function() { return /* binding */ FETCH; }, /* harmony export */ FIRST_CONTENTFUL_PAINT: function() { return /* binding */ FIRST_CONTENTFUL_PAINT; }, /* harmony export */ FIRST_INPUT: function() { return /* binding */ FIRST_INPUT; }, /* harmony export */ HISTORY: function() { return /* binding */ HISTORY; }, /* harmony export */ HTTP_REQUEST_TIMEOUT: function() { return /* binding */ HTTP_REQUEST_TIMEOUT; }, /* harmony export */ HTTP_REQUEST_TYPE: function() { return /* binding */ HTTP_REQUEST_TYPE; }, /* harmony export */ INVOKE: function() { return /* binding */ INVOKE; }, /* harmony export */ KEYWORD_LIMIT: function() { return /* binding */ KEYWORD_LIMIT; }, /* harmony export */ LARGEST_CONTENTFUL_PAINT: function() { return /* binding */ LARGEST_CONTENTFUL_PAINT; }, /* harmony export */ LAYOUT_SHIFT: function() { return /* binding */ LAYOUT_SHIFT; }, /* harmony export */ LOCAL_CONFIG_KEY: function() { return /* binding */ LOCAL_CONFIG_KEY; }, /* harmony export */ LOGGING_SERVICE: function() { return /* binding */ LOGGING_SERVICE; }, /* harmony export */ LONG_TASK: function() { return /* binding */ LONG_TASK; }, /* harmony export */ MAX_SPAN_DURATION: function() { return /* binding */ MAX_SPAN_DURATION; }, /* harmony export */ MEASURE: function() { return /* binding */ MEASURE; }, /* harmony export */ NAME_UNKNOWN: function() { return /* binding */ NAME_UNKNOWN; }, /* harmony export */ NAVIGATION: function() { return /* binding */ NAVIGATION; }, /* harmony export */ OUTCOME_FAILURE: function() { return /* binding */ OUTCOME_FAILURE; }, /* harmony export */ OUTCOME_SUCCESS: function() { return /* binding */ OUTCOME_SUCCESS; }, /* harmony export */ OUTCOME_UNKNOWN: function() { return /* binding */ OUTCOME_UNKNOWN; }, /* harmony export */ PAGE_EXIT: function() { return /* binding */ PAGE_EXIT; }, /* harmony export */ PAGE_LOAD: function() { return /* binding */ PAGE_LOAD; }, /* harmony export */ PAGE_LOAD_DELAY: function() { return /* binding */ PAGE_LOAD_DELAY; }, /* harmony export */ PAINT: function() { return /* binding */ PAINT; }, /* harmony export */ PERFORMANCE_MONITORING: function() { return /* binding */ PERFORMANCE_MONITORING; }, /* harmony export */ QUEUE_ADD_TRANSACTION: function() { return /* binding */ QUEUE_ADD_TRANSACTION; }, /* harmony export */ QUEUE_FLUSH: function() { return /* binding */ QUEUE_FLUSH; }, /* harmony export */ REMOVE_EVENT_LISTENER_STR: function() { return /* binding */ REMOVE_EVENT_LISTENER_STR; }, /* harmony export */ RESOURCE: function() { return /* binding */ RESOURCE; }, /* harmony export */ RESOURCE_INITIATOR_TYPES: function() { return /* binding */ RESOURCE_INITIATOR_TYPES; }, /* harmony export */ REUSABILITY_THRESHOLD: function() { return /* binding */ REUSABILITY_THRESHOLD; }, /* harmony export */ ROUTE_CHANGE: function() { return /* binding */ ROUTE_CHANGE; }, /* harmony export */ SCHEDULE: function() { return /* binding */ SCHEDULE; }, /* harmony export */ SESSION_TIMEOUT: function() { return /* binding */ SESSION_TIMEOUT; }, /* harmony export */ TEMPORARY_TYPE: function() { return /* binding */ TEMPORARY_TYPE; }, /* harmony export */ TRANSACTIONS: function() { return /* binding */ TRANSACTIONS; }, /* harmony export */ TRANSACTION_END: function() { return /* binding */ TRANSACTION_END; }, /* harmony export */ TRANSACTION_IGNORE: function() { return /* binding */ TRANSACTION_IGNORE; }, /* harmony export */ TRANSACTION_SERVICE: function() { return /* binding */ TRANSACTION_SERVICE; }, /* harmony export */ TRANSACTION_START: function() { return /* binding */ TRANSACTION_START; }, /* harmony export */ TRANSACTION_TYPE_ORDER: function() { return /* binding */ TRANSACTION_TYPE_ORDER; }, /* harmony export */ TRUNCATED_TYPE: function() { return /* binding */ TRUNCATED_TYPE; }, /* harmony export */ TYPE_CUSTOM: function() { return /* binding */ TYPE_CUSTOM; }, /* harmony export */ USER_INTERACTION: function() { return /* binding */ USER_INTERACTION; }, /* harmony export */ USER_TIMING_THRESHOLD: function() { return /* binding */ USER_TIMING_THRESHOLD; }, /* harmony export */ XMLHTTPREQUEST: function() { return /* binding */ XMLHTTPREQUEST; } /* harmony export */ }); var SCHEDULE = 'schedule'; var INVOKE = 'invoke'; var ADD_EVENT_LISTENER_STR = 'addEventListener'; var REMOVE_EVENT_LISTENER_STR = 'removeEventListener'; var RESOURCE_INITIATOR_TYPES = ['link', 'css', 'script', 'img', 'xmlhttprequest', 'fetch', 'beacon', 'iframe']; var REUSABILITY_THRESHOLD = 5000; var MAX_SPAN_DURATION = 5 * 60 * 1000; var PAGE_LOAD_DELAY = 1000; var PAGE_LOAD = 'page-load'; var ROUTE_CHANGE = 'route-change'; var TYPE_CUSTOM = 'custom'; var USER_INTERACTION = 'user-interaction'; var HTTP_REQUEST_TYPE = 'http-request'; var TEMPORARY_TYPE = 'temporary'; var NAME_UNKNOWN = 'Unknown'; var PAGE_EXIT = 'page-exit'; var TRANSACTION_TYPE_ORDER = [PAGE_LOAD, ROUTE_CHANGE, USER_INTERACTION, HTTP_REQUEST_TYPE, TYPE_CUSTOM, TEMPORARY_TYPE]; var OUTCOME_SUCCESS = 'success'; var OUTCOME_FAILURE = 'failure'; var OUTCOME_UNKNOWN = 'unknown'; var USER_TIMING_THRESHOLD = 60; var TRANSACTION_START = 'transaction:start'; var TRANSACTION_END = 'transaction:end'; var CONFIG_CHANGE = 'config:change'; var QUEUE_FLUSH = 'queue:flush'; var QUEUE_ADD_TRANSACTION = 'queue:add_transaction'; var TRANSACTION_IGNORE = 'transaction:ignore'; var XMLHTTPREQUEST = 'xmlhttprequest'; var FETCH = 'fetch'; var HISTORY = 'history'; var EVENT_TARGET = 'eventtarget'; var CLICK = 'click'; var ERROR = 'error'; var BEFORE_EVENT = ':before'; var AFTER_EVENT = ':after'; var LOCAL_CONFIG_KEY = 'elastic_apm_config'; var LONG_TASK = 'longtask'; var PAINT = 'paint'; var MEASURE = 'measure'; var NAVIGATION = 'navigation'; var RESOURCE = 'resource'; var FIRST_CONTENTFUL_PAINT = 'first-contentful-paint'; var LARGEST_CONTENTFUL_PAINT = 'largest-contentful-paint'; var FIRST_INPUT = 'first-input'; var LAYOUT_SHIFT = 'layout-shift'; var EVENT = 'event'; var ERRORS = 'errors'; var TRANSACTIONS = 'transactions'; var CONFIG_SERVICE = 'ConfigService'; var LOGGING_SERVICE = 'LoggingService'; var TRANSACTION_SERVICE = 'TransactionService'; var APM_SERVER = 'ApmServer'; var PERFORMANCE_MONITORING = 'PerformanceMonitoring'; var ERROR_LOGGING = 'ErrorLogging'; var TRUNCATED_TYPE = '.truncated'; var KEYWORD_LIMIT = 1024; var SESSION_TIMEOUT = 30 * 60000; var HTTP_REQUEST_TIMEOUT = 10000; /***/ }), /***/ "../rum-core/dist/es/common/context.js": /*!*********************************************!*\ !*** ../rum-core/dist/es/common/context.js ***! \*********************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ addSpanContext: function() { return /* binding */ addSpanContext; }, /* harmony export */ addTransactionContext: function() { return /* binding */ addTransactionContext; }, /* harmony export */ getPageContext: function() { return /* binding */ getPageContext; } /* harmony export */ }); /* harmony import */ var _url__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./url */ "../rum-core/dist/es/common/url.js"); /* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./constants */ "../rum-core/dist/es/common/constants.js"); /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils */ "../rum-core/dist/es/common/utils.js"); var _excluded = ["tags"]; function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; } var LEFT_SQUARE_BRACKET = 91; var RIGHT_SQUARE_BRACKET = 93; var EXTERNAL = 'external'; var RESOURCE = 'resource'; var HARD_NAVIGATION = 'hard-navigation'; function getPortNumber(port, protocol) { if (port === '') { port = protocol === 'http:' ? '80' : protocol === 'https:' ? '443' : ''; } return port; } function getResponseContext(perfTimingEntry) { var transferSize = perfTimingEntry.transferSize, encodedBodySize = perfTimingEntry.encodedBodySize, decodedBodySize = perfTimingEntry.decodedBodySize, serverTiming = perfTimingEntry.serverTiming; var respContext = { transfer_size: transferSize, encoded_body_size: encodedBodySize, decoded_body_size: decodedBodySize }; var serverTimingStr = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getServerTimingInfo)(serverTiming); if (serverTimingStr) { respContext.headers = { 'server-timing': serverTimingStr }; } return respContext; } function getDestination(parsedUrl) { var port = parsedUrl.port, protocol = parsedUrl.protocol, hostname = parsedUrl.hostname; var portNumber = getPortNumber(port, protocol); var ipv6Hostname = hostname.charCodeAt(0) === LEFT_SQUARE_BRACKET && hostname.charCodeAt(hostname.length - 1) === RIGHT_SQUARE_BRACKET; var address = hostname; if (ipv6Hostname) { address = hostname.slice(1, -1); } return { service: { resource: hostname + ':' + portNumber, name: '', type: '' }, address: address, port: Number(portNumber) }; } function getResourceContext(data) { var entry = data.entry, url = data.url; var parsedUrl = new _url__WEBPACK_IMPORTED_MODULE_1__.Url(url); var destination = getDestination(parsedUrl); return { http: { url: url, response: getResponseContext(entry) }, destination: destination }; } function getExternalContext(data) { var url = data.url, method = data.method, target = data.target, response = data.response; var parsedUrl = new _url__WEBPACK_IMPORTED_MODULE_1__.Url(url); var destination = getDestination(parsedUrl); var context = { http: { method: method, url: parsedUrl.href }, destination: destination }; var statusCode; if (target && typeof target.status !== 'undefined') { statusCode = target.status; } else if (response) { statusCode = response.status; } context.http.status_code = statusCode; return context; } function getNavigationContext(data) { var url = data.url; var parsedUrl = new _url__WEBPACK_IMPORTED_MODULE_1__.Url(url); var destination = getDestination(parsedUrl); return { destination: destination }; } function getPageContext() { return { page: { referer: document.referrer, url: location.href } }; } function addSpanContext(span, data) { if (!data) { return; } var type = span.type; var context; switch (type) { case EXTERNAL: context = getExternalContext(data); break; case RESOURCE: context = getResourceContext(data); break; case HARD_NAVIGATION: context = getNavigationContext(data); break; } span.addContext(context); } function addTransactionContext(transaction, _temp) { var _ref = _temp === void 0 ? {} : _temp, tags = _ref.tags, configContext = _objectWithoutPropertiesLoose(_ref, _excluded); var pageContext = getPageContext(); var responseContext = {}; if (transaction.type === _constants__WEBPACK_IMPORTED_MODULE_2__.PAGE_EXIT) { transaction.ensureContext(); if (transaction.context.page && transaction.context.page.url) { pageContext.page.url = transaction.context.page.url; } } else if (transaction.type === _constants__WEBPACK_IMPORTED_MODULE_2__.PAGE_LOAD && (0,_utils__WEBPACK_IMPORTED_MODULE_0__.isPerfTimelineSupported)()) { var entries = _utils__WEBPACK_IMPORTED_MODULE_0__.PERF.getEntriesByType(_constants__WEBPACK_IMPORTED_MODULE_2__.NAVIGATION); if (entries && entries.length > 0) { responseContext = { response: getResponseContext(entries[0]) }; } } transaction.addContext(pageContext, responseContext, configContext); } /***/ }), /***/ "../rum-core/dist/es/common/event-handler.js": /*!***************************************************!*\ !*** ../rum-core/dist/es/common/event-handler.js ***! \***************************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./constants */ "../rum-core/dist/es/common/constants.js"); var EventHandler = function () { function EventHandler() { this.observers = {}; } var _proto = EventHandler.prototype; _proto.observe = function observe(name, fn) { var _this = this; if (typeof fn === 'function') { if (!this.observers[name]) { this.observers[name] = []; } this.observers[name].push(fn); return function () { var index = _this.observers[name].indexOf(fn); if (index > -1) { _this.observers[name].splice(index, 1); } }; } }; _proto.sendOnly = function sendOnly(name, args) { var obs = this.observers[name]; if (obs) { obs.forEach(function (fn) { try { fn.apply(undefined, args); } catch (error) { console.log(error, error.stack); } }); } }; _proto.send = function send(name, args) { this.sendOnly(name + _constants__WEBPACK_IMPORTED_MODULE_0__.BEFORE_EVENT, args); this.sendOnly(name, args); this.sendOnly(name + _constants__WEBPACK_IMPORTED_MODULE_0__.AFTER_EVENT, args); }; return EventHandler; }(); /* harmony default export */ __webpack_exports__["default"] = (EventHandler); /***/ }), /***/ "../rum-core/dist/es/common/http/fetch.js": /*!************************************************!*\ !*** ../rum-core/dist/es/common/http/fetch.js ***! \************************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ BYTE_LIMIT: function() { return /* binding */ BYTE_LIMIT; }, /* harmony export */ isFetchSupported: function() { return /* binding */ isFetchSupported; }, /* harmony export */ sendFetchRequest: function() { return /* binding */ sendFetchRequest; }, /* harmony export */ shouldUseFetchWithKeepAlive: function() { return /* binding */ shouldUseFetchWithKeepAlive; } /* harmony export */ }); /* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../constants */ "../rum-core/dist/es/common/constants.js"); /* harmony import */ var _response_status__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./response-status */ "../rum-core/dist/es/common/http/response-status.js"); function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } var BYTE_LIMIT = 60 * 1000; function shouldUseFetchWithKeepAlive(method, payload) { if (!isFetchSupported()) { return false; } var isKeepAliveSupported = ('keepalive' in new Request('')); if (!isKeepAliveSupported) { return false; } var size = calculateSize(payload); return method === 'POST' && size < BYTE_LIMIT; } f