import * as Tools from "../tool"; import { PAGE_CHANGE_TASK, NETWORK_TASL, ELEMENT_ACTION_TASK, } from './type' import { ELEMENT_ACTION_TASK_FALG } from './type' //查找标记元素 const queryFlagElement = function(el){ if(!Tools.isElement(el) || el.tagName.toLowerCase() === 'body'){ return false; } var flag = el.getAttribute(ELEMENT_ACTION_TASK_FALG) return flag?el:(el.parentNode?queryFlagElement(el.parentNode):false) } // 完整时间轴纪录 export function pageLoadTransaction(next) { //加载load监听 //挂载第一次pageload let performanceMonitoring = this.apmCoreServiceFactory.getService( "PerformanceMonitoring" ); performanceMonitoring.init(); //send page load if (this.apmCoreConfigServer.get("sendPageLoadTransaction")) { var transactionService = this.apmCoreServiceFactory.getService( "TransactionService" ); var tr = transactionService.startTransaction( this.apmCoreConfigServer.get("pageLoadTransactionName"), "page-load" ); var sendPageLoadMetrics = function() { // to make sure PerformanceTiming.loadEventEnd has a value setTimeout(() => { if (tr) { tr.detectFinish(); //取消elastic-apm自带的log以及xhr相关patch performanceMonitoring.cancelPatchSub(); //进入下一个阶段 next(); } }); }; if (document.readyState === "complete") { sendPageLoadMetrics(); } else { window.addEventListener( "load", sendPageLoadMetrics.bind(this) ); } } } export function pageErrorTransaction(next) { let errorLogging = this.apmCoreServiceFactory.getService("ErrorLogging"); errorLogging.registerGlobalEventListener(); next(); } export function pageRunTransactionStart(next){ const { createTransaction } = this.tracerTransaction const time = Tools.dateFormat(new Date(), "yyyy-MM-dd hh:mm:ss"); var name = `pageRun:${window.location.href}` //new transaction this.currTransaction = createTransaction( name, "PageRun" ); this.currTransaction.startSpan(window.location.href, "pageStart"); this.currTransaction.startSpan(time, "start_date"); next(); } export function pageRunTransactionEnd(next){ if (this.currTransaction) { var key = `pageNext:${window.location.href}` const time = Tools.dateFormat(new Date(), "yyyy-MM-dd hh:mm:ss"); this.currTransaction.startSpan(key,"pageNext"); this.currTransaction.startSpan(time, "end_date"); //send this.currTransaction.end(); this.currTransaction = false; } next(); } //片段纪录 export function networkTaskPart(networkInfo){ const { ajaxInfo } = networkInfo let value = '' var partTask = this.tracerTransaction.createCustomEventTransaction(NETWORK_TASL,NETWORK_TASL,{ transactionSampleRate:1 }) if(!partTask || !ajaxInfo){ return false; } try{ Object.keys(ajaxInfo).map(key=>{ var tag = {} var info = ajaxInfo[key] if(Tools.isObject(info)||Tools.isArray(info)){ try{ tag[key] = JSON.stringify(info) }catch(e){ tag[key] = Tools.toString(info) } }else{ tag[key] = info } partTask.addTags(tag); }) }catch(e){ partTask.addTags(ajaxInfo); } this.currTransaction.startSpan(ajaxInfo, "ajaxInfo"); partTask.end() } export function pageChangeTaskPart(event){ const { eventName ,newURL ,oldURL } = event var partTask = this.tracerTransaction.createCustomEventTransaction(PAGE_CHANGE_TASK,PAGE_CHANGE_TASK,{ transactionSampleRate:1 }) if(!partTask){ return false; } partTask.addTags({eventName:eventName}); partTask.addTags({newURL:newURL}); partTask.addTags({oldURL:oldURL}); partTask.end() } export function elementActionTaskPart(type,info){ const { target,title,value,xPath } = info //是否全量捕获 if(this.isGlobalElementActionCatch){ var partTask = this.tracerTransaction.createCustomEventTransaction(ELEMENT_ACTION_TASK,ELEMENT_ACTION_TASK,{ transactionSampleRate:1 }) if(!partTask){ return false; } partTask.addTags({actionEvent:type}); partTask.addTags({title:title}); partTask.addTags({value:value}); partTask.addTags({xPath:xPath}); partTask.end() return false; } //标记捕获 var flag = queryFlagElement(target) if(!flag){ return false; } var flagKey = flag.getAttribute(ELEMENT_ACTION_TASK_FALG) //标记捕获 var partTask = this.tracerTransaction.createCustomEventTransaction(flagKey,ELEMENT_ACTION_TASK,{ transactionSampleRate:1 }) if(!partTask){ return false; } partTask.addTags({actionEvent:type}); partTask.addTags({title:title}); partTask.addTags({value:value}); partTask.addTags({xPath:xPath}); partTask.end() }