前端监控完成
This commit is contained in:
@@ -1,38 +1,67 @@
|
||||
/**
|
||||
* 获取符合要求的请求
|
||||
* @param entries 监测的请求对象
|
||||
* @param type 设置满足条件的请求类型
|
||||
* @returns {PerformanceEntry[]}
|
||||
*/
|
||||
const getRequests = (entries = performance.getEntriesByType('resource'), type = ['xmlhttprequest']) =>
|
||||
entries?.filter(e => type.includes(e.initiatorType)) || []
|
||||
import http from "./request"
|
||||
|
||||
/**
|
||||
* 观察者工具对象,用于前端接口监测
|
||||
*/
|
||||
|
||||
class Observer {
|
||||
constructor() {
|
||||
this.saveLogs(getRequests())
|
||||
this.ins = new PerformanceObserver((list, ob) => {
|
||||
const watchLogs = getRequests(list.getEntriesByType("resource"))
|
||||
this.saveLogs(watchLogs)
|
||||
})
|
||||
this.ins.observe({entryTypes: ["resource"]})
|
||||
this.initXHRObserver()
|
||||
}
|
||||
|
||||
saveLogs(list = []) {
|
||||
list.map(e => {
|
||||
if (!/sockjs/.test(e.name)) {
|
||||
const api = {
|
||||
status: e.responseStatus,
|
||||
path: e.name,
|
||||
url: location.href,
|
||||
nodeProcess: process.env.NODE_ENV,
|
||||
}
|
||||
console.log(api)
|
||||
// http.post("/node/monitorApi/addOrUpdate", api)
|
||||
static saveLog(item = {}) {
|
||||
const api = {
|
||||
method: item.method,
|
||||
path: item.url,
|
||||
url: location.href,
|
||||
nodeProcess: process.env.NODE_ENV,
|
||||
status: item.status,
|
||||
code: item.response?.code,
|
||||
error: item.response?.code != 0 ? item.response?.data : null,
|
||||
device: navigator.userAgentData.platform
|
||||
}
|
||||
if (!/(sockjs-node|hot-update|monitorApi)/.test(api.path)) {
|
||||
if (!!this.timer) {
|
||||
clearTimeout(this.timer)
|
||||
}
|
||||
})
|
||||
this.pending = [this.pending, api].flat().filter(Boolean)
|
||||
this.timer = setTimeout(() => {
|
||||
http.post("/admin/apiForward", this.pending, {
|
||||
withoutToken: true,
|
||||
params: {url: "http://dvcp.cunwuyun.cn/ns/node/monitorApi/addOrUpdate"}
|
||||
}).then(res => {
|
||||
if (res?.code == 0) {
|
||||
this.pending = []
|
||||
}
|
||||
})
|
||||
}, 5000)
|
||||
}
|
||||
}
|
||||
|
||||
initXHRObserver() {
|
||||
const origin = XMLHttpRequest.prototype.open;
|
||||
XMLHttpRequest.prototype.open = function (...args) {
|
||||
let send = this.send;
|
||||
let _this = this
|
||||
let post_data = []
|
||||
this.send = function (...data) {
|
||||
post_data = data;
|
||||
return send.apply(_this, data)
|
||||
}
|
||||
this.addEventListener("readystatechange", function () {
|
||||
if (this.readyState === 4) {
|
||||
// 请求后拦截
|
||||
Observer.saveLog({
|
||||
url: args[1],
|
||||
status: this.status,
|
||||
method: args[0],
|
||||
data: post_data,
|
||||
response: JSON.parse(this.response || null)
|
||||
})
|
||||
}
|
||||
}, false)
|
||||
return origin.apply(this, args)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user