keep-observers
Version:
This is a monitoring service applied to the web side Support Elasticsearch+kiban The middleware extension interface is provided by means of plug-in service compositionkeep-observers
816 lines (647 loc) • 23.2 kB
JavaScript
(function webpackUniversalModuleDefinition(root, factory) {
if(typeof exports === 'object' && typeof module === 'object')
module.exports = factory(require("@util/index"));
else if(typeof define === 'function' && define.amd)
define(["@util/index"], factory);
else {
var a = typeof exports === 'object' ? factory(require("@util/index")) : factory(root["@util/index"]);
for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
}
})(this, function(__WEBPACK_EXTERNAL_MODULE__util_index__) {
return /******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, {
/******/ configurable: false,
/******/ enumerable: true,
/******/ get: getter
/******/ });
/******/ }
/******/ };
/******/
/******/ // define __esModule on exports
/******/ __webpack_require__.r = function(exports) {
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = "./src/services/middleware/kibanaApmTrack/index.ts");
/******/ })
/************************************************************************/
/******/ ({
/***/ "./src/services/middleware/kibanaApmTrack/api.ts":
/*!*******************************************************!*\
!*** ./src/services/middleware/kibanaApmTrack/api.ts ***!
\*******************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.cancelTrack = function () {
this.isCancelTrack = true;
};
exports.startTrack = function () {
this.isCancelTrack = false;
};
exports.cancelPatch = function () {
window.removeEventListener("hashchange", this._handleHashPageChange);
window.history.pushState = this._pushState;
window.history.replaceState = this._replaceState;
};
/***/ }),
/***/ "./src/services/middleware/kibanaApmTrack/defaultConfig.ts":
/*!*****************************************************************!*\
!*** ./src/services/middleware/kibanaApmTrack/defaultConfig.ts ***!
\*****************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = {
//是否中断掉正常的catch内容
isInterruptNormal: false,
//自定义中断捕获的catch
onInterruptJudge: false,
//是否自动开始上报
automaticStart: true,
//上报时间format
reportDateFormat: 'yyyy-MM-dd hh:mm:ss'
};
/***/ }),
/***/ "./src/services/middleware/kibanaApmTrack/handleMiddle.ts":
/*!****************************************************************!*\
!*** ./src/services/middleware/kibanaApmTrack/handleMiddle.ts ***!
\****************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var __read = this && this.__read || function (o, n) {
var m = typeof Symbol === "function" && o[Symbol.iterator];
if (!m) return o;
var i = m.call(o),
r,
ar = [],
e;
try {
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) {
ar.push(r.value);
}
} catch (error) {
e = {
error: error
};
} finally {
try {
if (r && !r.done && (m = i["return"])) m.call(i);
} finally {
if (e) throw e.error;
}
}
return ar;
};
var __spread = this && this.__spread || function () {
for (var ar = [], i = 0; i < arguments.length; i++) {
ar = ar.concat(__read(arguments[i]));
}
return ar;
};
Object.defineProperty(exports, "__esModule", {
value: true
});
var index_1 = __webpack_require__(/*! @util/index */ "@util/index");
exports._handleReciceReportMessage = function (interrupt, next) {
var _this = this;
return function () {
var params = [];
for (var _i = 0; _i < arguments.length; _i++) {
params[_i] = arguments[_i];
}
var _a = _this._config,
isInterruptNormal = _a.isInterruptNormal,
onInterruptJudge = _a.onInterruptJudge;
var _b = __read(params, 1),
_c = _b[0],
message = _c === void 0 ? {} : _c;
var _d = message.type,
type = _d === void 0 ? false : _d,
typeName = message.typeName,
_e = message.isError,
isError = _e === void 0 ? false : _e; //中间件执行中会屏蔽发起的sendMessage
_this.isSendlock = true; //valid message
if (_this.isCancelTrack || !type || !index_1.Tools.isString(type) || type !== 'monitor') {
next.apply(void 0, __spread(params));
return;
} //handle message
switch (typeName) {
case 'log':
_this._handleTrackLog(message);
break;
case 'network':
_this._handleTrackNetwork(message);
break;
case 'htmlElementActive':
_this._handleTrackHtmlElementActive(message);
break;
case 'error':
_this._handleTrackError(message);
break;
case 'kibanaApmTrack':
return next.apply(void 0, __spread(params));
default:
index_1.consoleTools.warnError("is no support track typeName:" + typeName);
return next.apply(void 0, __spread(params));
} //是否中断判断
if (onInterruptJudge && index_1.Tools.isFunction(onInterruptJudge) && !isError) {
return onInterruptJudge(message) ? interrupt(false) : next.apply(void 0, __spread(params));
}
return isInterruptNormal && !isError ? interrupt(false) : next.apply(void 0, __spread(params));
};
};
exports._handleTrackLog = function (params) {
this.trackList.push(params); //判断是否是error类型
var type = params.data.type;
if (type === 'error') {
this.isWaitSend = 'pageError';
this.errorContent = index_1.Tools.objectStringify(params.data);
this._handleSendTrackMessage();
}
};
exports._handleTrackNetwork = function (params) {
this.trackList.push(params); //判断是否是请求出错
var isError = params.data.isError;
if (isError) {
this.isWaitSend = 'pageError';
this.errorContent = index_1.Tools.objectStringify(params.data);
this._handleSendTrackMessage();
}
};
exports._handleTrackHtmlElementActive = function (params) {
this.trackList.push(params);
};
exports._handleTrackError = function (params) {
this.trackList.push(params);
this.isWaitSend = 'pageError';
this.errorContent = index_1.Tools.objectStringify(params.data);
this._handleSendTrackMessage();
}; //send
exports._handleSendTrackMessage = function () {
var reportData = null;
var develop = this._config.develop;
switch (this.isWaitSend) {
case 'pageError':
if (this.isSendlock) return;
this.isWaitSend = false;
reportData = this._handleCreateReport('pageError'); //clear
this.errorContent = '';
break;
case 'pageHashChange':
if (this.isSendlock) return;
this.isWaitSend = false;
reportData = this._handleCreateReport('pageHashChange'); //update url
this._pageStart();
break;
}
if (!reportData) return;
if (reportData.data && reportData.data.type === 'pageHashChange') {
this.trackList = [];
this.isPageChangeHandle = false;
} //send
if (develop) {
index_1.consoleTools.log('track-reportData', reportData);
}
this.sendMessage(reportData);
}; //create Data
exports._handleCreateReport = function (type) {
var _this = this;
var _a = this._config,
reportDateFormat = _a.reportDateFormat,
isInterruptNormal = _a.isInterruptNormal;
var now = new Date().getTime();
var trackInfo = {
type: type,
url: window.location.href,
tags: null,
spans: []
};
switch (type) {
case 'pageHashChange':
trackInfo['tags'] = this.pageInfo;
break;
case 'pageError':
trackInfo['tags'] = {
startUrl: this.pageInfo.startUrl,
startDate: this.pageInfo.startDate,
findErrorDate: index_1.Tools.dateFormat(now, reportDateFormat),
errorContent: this.errorContent
};
break;
default:
return false;
}
trackInfo['spans'] = this.trackList.map(function (span) {
var reportDateFormat = _this._config.reportDateFormat;
var typeName = span.typeName,
reportTime = span.reportTime,
data = span.data;
var name = 'undefined';
var type = span.type + "-" + typeName + ":" + index_1.Tools.dateFormat(reportTime, reportDateFormat);
var tags = null;
switch (typeName) {
case 'log':
name = data.type + "->" + index_1.Tools.substringLimt(data.data);
tags = {
type: typeName,
content: data
};
break;
case 'network':
var _a = data.method,
method = _a === void 0 ? "" : _a,
_b = data.url,
url = _b === void 0 ? "" : _b,
_c = data.params,
params = _c === void 0 ? null : _c,
_d = data.status,
status_1 = _d === void 0 ? 0 : _d,
_e = data.response,
response = _e === void 0 ? "" : _e,
_f = data.body,
body = _f === void 0 ? "" : _f,
_g = data.startTime,
startTime = _g === void 0 ? 0 : _g,
_h = data.endTime,
endTime = _h === void 0 ? 0 : _h,
_j = data.costTime,
costTime = _j === void 0 ? 0 : _j,
_k = data.timeout,
timeout = _k === void 0 ? undefined : _k;
name = data.type + "->" + method + ":" + url + "(" + data.statusType + ":" + status_1 + (response ? "->" + index_1.Tools.substringLimt(response) + ")" : ')');
tags = {
type: typeName,
content: {
method: method,
url: url,
params: params ? index_1.Tools.objectStringify(params) : '',
body: body,
status: status_1,
startTime: startTime,
endTime: endTime,
costTime: costTime,
response: response,
timeout: timeout
}
};
break;
case 'htmlElementActive':
name = data.type + "->" + data.title + "(xpath:" + data.xPath + ")" + (data.type === 'change' ? '->' + index_1.Tools.substringLimt(data.value) : '');
tags = {
type: typeName,
content: data
};
break;
case 'error':
name = "Error->" + data.message + (data.filename ? '(' + data.filename + ')' : '');
tags = {
type: typeName,
content: {
message: data.message,
filename: data.filename
}
};
break;
}
return {
name: name,
type: type,
tags: isInterruptNormal ? tags : null
};
});
return {
type: 'monitor',
typeName: 'kibanaApmTrack',
data: trackInfo,
isError: type === 'pageError' ? true : false
};
};
/***/ }),
/***/ "./src/services/middleware/kibanaApmTrack/index.ts":
/*!*********************************************************!*\
!*** ./src/services/middleware/kibanaApmTrack/index.ts ***!
\*********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var __extends = this && this.__extends || function () {
var _extendStatics = function extendStatics(d, b) {
_extendStatics = Object.setPrototypeOf || {
__proto__: []
} instanceof Array && function (d, b) {
d.__proto__ = b;
} || function (d, b) {
for (var p in b) {
if (b.hasOwnProperty(p)) d[p] = b[p];
}
};
return _extendStatics(d, b);
};
return function (d, b) {
_extendStatics(d, b);
function __() {
this.constructor = d;
}
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
}();
var __assign = this && this.__assign || function () {
__assign = Object.assign || function (t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) {
if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
}
}
return t;
};
return __assign.apply(this, arguments);
};
var __read = this && this.__read || function (o, n) {
var m = typeof Symbol === "function" && o[Symbol.iterator];
if (!m) return o;
var i = m.call(o),
r,
ar = [],
e;
try {
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) {
ar.push(r.value);
}
} catch (error) {
e = {
error: error
};
} finally {
try {
if (r && !r.done && (m = i["return"])) m.call(i);
} finally {
if (e) throw e.error;
}
}
return ar;
};
var __importDefault = this && this.__importDefault || function (mod) {
return mod && mod.__esModule ? mod : {
"default": mod
};
};
Object.defineProperty(exports, "__esModule", {
value: true
});
var defaultConfig_1 = __importDefault(__webpack_require__(/*! ./defaultConfig */ "./src/services/middleware/kibanaApmTrack/defaultConfig.ts"));
var index_1 = __webpack_require__(/*! @util/index */ "@util/index");
var handleMiddle_1 = __webpack_require__(/*! ./handleMiddle */ "./src/services/middleware/kibanaApmTrack/handleMiddle.ts");
var pageHashChange_1 = __webpack_require__(/*! ./pageHashChange */ "./src/services/middleware/kibanaApmTrack/pageHashChange.ts");
var api_1 = __webpack_require__(/*! ./api */ "./src/services/middleware/kibanaApmTrack/api.ts");
var KeepObserverMiddlewareKibanaApmTrack =
/** @class */
function (_super) {
__extends(KeepObserverMiddlewareKibanaApmTrack, _super); //构造函数
function KeepObserverMiddlewareKibanaApmTrack(config) {
if (config === void 0) {
config = {};
}
var _this = _super.call(this, config) || this;
_this.isSendlock = true;
_this.isWaitSend = false;
_this.isPageChangeHandle = false;
_this.isCancelTrack = true;
_this.trackInfo = undefined;
_this.pageInfo = null;
_this.errorContent = '';
_this.trackList = [];
_this.resgisterPageHashChangeEventListener = pageHashChange_1.resgisterPageHashChangeEventListener.bind(_this);
_this.checkPageHashUrlChange = pageHashChange_1.checkPageHashUrlChange.bind(_this);
_this._handleHashPageChange = pageHashChange_1._handleHashPageChange.bind(_this);
_this._pageStart = pageHashChange_1._pageStart.bind(_this);
_this._pageHashNext = pageHashChange_1._pageHashNext.bind(_this); //send
_this._handleSendTrackMessage = handleMiddle_1._handleSendTrackMessage.bind(_this);
_this._handleCreateReport = handleMiddle_1._handleCreateReport.bind(_this); //method
_this._handleReciceReportMessage = handleMiddle_1._handleReciceReportMessage.bind(_this);
_this._handleTrackLog = handleMiddle_1._handleTrackLog.bind(_this);
_this._handleTrackNetwork = handleMiddle_1._handleTrackNetwork.bind(_this);
_this._handleTrackHtmlElementActive = handleMiddle_1._handleTrackHtmlElementActive.bind(_this);
_this._handleTrackError = handleMiddle_1._handleTrackError.bind(_this); //api
_this.cancelTrack = api_1.cancelTrack.bind(_this);
_this.startTrack = api_1.startTrack.bind(_this);
_this.cancelPatch = api_1.cancelPatch.bind(_this);
var _a = config.develop,
develop = _a === void 0 ? false : _a; //存混合配置
_this._config = index_1.Tools.extend(__assign({}, defaultConfig_1["default"]), __assign({}, config, {
develop: develop
}));
var reportDateFormat = _this._config.reportDateFormat;
_this.pageInfo = {
startUrl: '',
startDate: index_1.Tools.dateFormat(new Date().getTime(), reportDateFormat),
nextUrl: '',
nextDate: 0
}; //发送方法
_this.sendMessage = function () {
return index_1.consoleTools.warnError('sendMessage is not active, apply receive sendPipeMessage fail ');
}; //注册pageHashChange事件
_this.resgisterPageHashChangeEventListener();
return _this;
} //提供一个挂载入口
KeepObserverMiddlewareKibanaApmTrack.prototype.apply = function (_a) {
var _this = this;
var sendMessage = _a.sendMessage,
useExtendMiddle = _a.useExtendMiddle,
registerSendDoneCallback = _a.registerSendDoneCallback;
var automaticStart = this._config.automaticStart;
this.sendMessage = sendMessage; //receive message
var _b = __read(this._publicMiddleScopeNames, 1),
sendMessageName = _b[0];
useExtendMiddle(sendMessageName, this._handleReciceReportMessage); //send wait
registerSendDoneCallback(function () {
_this.isSendlock = false;
if (!_this.isWaitSend) return;
_this._handleSendTrackMessage();
});
if (automaticStart) {
this.startTrack();
}
return {
cancelTrack: this.cancelTrack,
startTrack: this.startTrack,
cancelHashChangePatch: this.cancelPatch
};
};
return KeepObserverMiddlewareKibanaApmTrack;
}(index_1.KeepObserverPublic);
exports["default"] = KeepObserverMiddlewareKibanaApmTrack;
/***/ }),
/***/ "./src/services/middleware/kibanaApmTrack/pageHashChange.ts":
/*!******************************************************************!*\
!*** ./src/services/middleware/kibanaApmTrack/pageHashChange.ts ***!
\******************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var __assign = this && this.__assign || function () {
__assign = Object.assign || function (t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) {
if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
}
}
return t;
};
return __assign.apply(this, arguments);
};
Object.defineProperty(exports, "__esModule", {
value: true
});
var index_1 = __webpack_require__(/*! @util/index */ "@util/index");
exports.resgisterPageHashChangeEventListener = function () {
//监听相关内容
var self = this; //hashchange
window.addEventListener("hashchange", this._handleHashPageChange); //pushStateModel replaceStateModel
self._pushState = window.history.pushState;
window.history.pushState = function (state, title, url) {
var oldURL = window.location.href;
var newURL = url ? url : oldURL; // hook
self._handleHashPageChange({
eventName: 'pushState',
oldURL: oldURL,
newURL: newURL,
state: state,
title: title
}); //run
return self._pushState.apply(window.history, arguments);
};
self._replaceState = window.history.replaceState;
window.history.replaceState = function (state, title, url) {
var oldURL = window.location.href;
var newURL = url ? url : oldURL; // hook
self._handleHashPageChange({
eventName: 'replaceState',
oldURL: oldURL,
newURL: newURL,
state: state,
title: title
});
return self._replaceState.apply(window.history, arguments);
}; //start receive
this._pageStart();
};
exports.checkPageHashUrlChange = function (oldUrl, newUrL) {
//其中某一次不存在
if (!oldUrl || !newUrL || !index_1.Tools.isString(oldUrl) || !index_1.Tools.isString(newUrL)) {
return false;
} //has path没有变化
var newPath = newUrL.indexOf('?') > -1 ? newUrL.split('?')[0] : newUrL;
var oldPath = oldUrl.indexOf('?') > -1 ? oldUrl.split('?')[0] : oldUrl;
if (newPath === oldPath) {
return false;
}
return true;
};
exports._handleHashPageChange = function (event) {
if (this.isPageChangeHandle) {
return false;
}
var newURL = event.newURL,
oldURL = event.oldURL;
if (this.isCancelTrack || !this.checkPageHashUrlChange(oldURL, newURL)) return; // next page
this.isPageChangeHandle = true;
this._pageHashNext(newURL);
}; // page status
exports._pageStart = function () {
var reportDateFormat = this._config.reportDateFormat;
var startUrl = window.location.href;
var startDate = index_1.Tools.dateFormat(new Date().getTime(), reportDateFormat);
this.pageInfo = __assign({}, this.pageInfo, {
startUrl: startUrl,
startDate: startDate
});
};
exports._pageHashNext = function (nextHash) {
var reportDateFormat = this._config.reportDateFormat;
var nextUrl = nextHash || window.location.href;
var nextDate = index_1.Tools.dateFormat(new Date().getTime(), reportDateFormat);
this.pageInfo = __assign({}, this.pageInfo, {
nextUrl: nextUrl,
nextDate: nextDate
}); //开启pageHashChange上报
//如果有pageError未发生的就忽略
if (!this.isWaitSend) {
this.isWaitSend = 'pageHashChange';
this._handleSendTrackMessage();
}
};
/***/ }),
/***/ "@util/index":
/*!******************************!*\
!*** external "@util/index" ***!
\******************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = __WEBPACK_EXTERNAL_MODULE__util_index__;
/***/ })
/******/ });
});