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
891 lines (867 loc) • 47.6 kB
JavaScript
import KeepObserver,{PipeUser} from '../../@core/instance'
import KeepObserverLog from '../../@core/monitor/log'
import KeepObserverNetwork from '../../@core/monitor/network'
import KeepObserverHtmlElementActive from '../../@core/monitor/htmlElementActive'
import KeepObserverMiddlewareKibanaApmTrack from '../../@core/middleware/kibanaApmTrack'
import { KeepObserverPublic,KeepObserverMiddleWare } from '@util/index'
import { consoleTools,Tools } from '@util/index'
import axios from 'axios'
describe("KeepObserverMiddlewareKibanaApmTrack service",function(){
//init service
var ko = null
var testHashChange = false
beforeEach(function () {
//config
jasmine.DEFAULT_TIMEOUT_INTERVAL = 50000
//init service
KeepObserverMiddleWare.publicMiddles = {}
KeepObserverPublic.extendReportParams = {}
PipeUser.onSendDoneCallbackMap = []
ko = null
})
afterAll(function(){
KeepObserverMiddleWare.publicMiddles = {}
KeepObserverPublic.extendReportParams = {}
PipeUser.onSendDoneCallbackMap = []
})
it('KeepObserverMiddlewareKibanaApmTrack api',function(){
var serviceInstance = new KeepObserverMiddlewareKibanaApmTrack()
ko = new KeepObserver({
isCheckRepeatUse:false,
})
expect(serviceInstance.startTrack).toBeDefined()
expect(serviceInstance.cancelTrack).toBeDefined()
expect(serviceInstance.cancelPatch).toBeDefined()
spyOn(serviceInstance,'startTrack').and.callThrough();
spyOn(serviceInstance,'cancelTrack').and.callThrough();
spyOn(serviceInstance,'cancelPatch').and.callThrough();
ko.use(serviceInstance)
ko.apis('startTrack')
ko.apis('cancelTrack')
ko.apis('cancelHashChangePatch')
expect(serviceInstance.startTrack).toHaveBeenCalled()
expect(serviceInstance.cancelTrack).toHaveBeenCalled()
expect(serviceInstance.cancelPatch).toHaveBeenCalled()
serviceInstance = null
})
it('KeepObserverMiddlewareKibanaApmTrack config{isInterruptNormal = true} with pageError handle log',function(done){
ko = new KeepObserver({
isInterruptNormal:true,
reportDateFormat:'yyyy-MM-dd hh',
isGlobalElementActionCatch:true,
serviceName: "dev-test",
agentVersion: "step_1",
})
ko.use(KeepObserverLog)
ko.use(KeepObserverMiddlewareKibanaApmTrack)
//start
var receiveCount = 0;
var time
class ConsumerService{
getMessage(message){
if(testHashChange) return
switch(++receiveCount){
case 1:
expect(message.type).toBe(`monitor`)
expect(message.typeName).toBe(`log`)
expect(message.data.type).toBe(`error`)
expect(message.data.data).toBe(`["errorTest"]`)
expect(message.isError).toBeTrue()
break;
case 2:
expect(message.type).toBe(`monitor`)
expect(message.typeName).toBe(`kibanaApmTrack`)
expect(message.data.type).toBe(`pageError`)
expect(message.data.tags.errorContent).toBe('{"type":"error","data":"[\\"errorTest\\"]"}')
expect(message.data.tags.findErrorDate).toBe(time)
expect(message.data.spans.length).toBe(3)
expect(message.data.spans).toEqual([
{name:'log->["logTest"]',type:jasmine.stringMatching(`monitor-log:${time}`),tags:{type: 'log', content:{type:'log',data:'["logTest"]'} }},
{name:'warn->["warnTest"]',type:jasmine.stringMatching(`monitor-log:${time}`),tags:{type: 'log', content: {type:'warn',data:'["warnTest"]'}}},
{name:'error->["errorTest"]',type:jasmine.stringMatching(`monitor-log:${time}`),tags:{type: 'log', content: {type:'error',data:'["errorTest"]'}}},
])
setTimeout(()=>{
ko.apis('logStop')
ko.apis('cancelTrack')
done()
},200)
break;
default:
fail('receive error message')
}
return
}
apply(pipe,config){
const { registerReciveMessage } = pipe
registerReciveMessage(this.getMessage)
}
}
ko.use(ConsumerService)
setTimeout(()=>{
console.log('logTest')
console.warn('warnTest')
console.error('errorTest')
time = Tools.dateFormat(new Date(),'yyyy-MM-dd hh')
})
})
it('KeepObserverMiddlewareKibanaApmTrack config{isInterruptNormal = false} with pageError handle log',function(done){
ko = new KeepObserver({
isGlobalElementActionCatch:true,
serviceName: "dev-test",
reportDateFormat:'yyyy-MM-dd hh',
agentVersion: "step_1",
})
ko.use(KeepObserverLog)
ko.use(KeepObserverMiddlewareKibanaApmTrack)
//start
var receiveCount = 0;
var time
class ConsumerService{
getMessage(message){
expect(message.priorityExec).toBe(true)
switch(++receiveCount){
case 1:
expect(message.type).toBe(`monitor`)
expect(message.typeName).toBe(`log`)
expect(message.data).toEqual({type: 'log', data: '["logTest"]'})
break;
case 2:
expect(message.type).toBe(`monitor`)
expect(message.typeName).toBe(`log`)
expect(message.data).toEqual({type: 'warn', data: '["warnTest"]'})
break;
case 3:
expect(message.type).toBe(`monitor`)
expect(message.typeName).toBe(`log`)
expect(message.data).toEqual({type: 'error', data: '["errorTest"]'})
expect(message.isError).toBeTrue()
break;
case 4:
expect(message.type).toBe(`monitor`)
expect(message.typeName).toBe(`kibanaApmTrack`)
expect(message.data.type).toBe(`pageError`)
expect(message.data.tags.errorContent).toBe('{"type":"error","data":"[\\"errorTest\\"]"}')
expect(message.data.tags.findErrorDate).toBe(time)
expect(message.data.spans.length).toBe(3)
expect(message.data.spans).toEqual([
{name:'log->["logTest"]',type:jasmine.stringMatching(`monitor-log:${time}`),tags: null},
{name:'warn->["warnTest"]',type:jasmine.stringMatching(`monitor-log:${time}`),tags: null},
{name:'error->["errorTest"]',type:jasmine.stringMatching(`monitor-log:${time}`),tags: null},
])
setTimeout(()=>{
ko.apis('logStop')
ko.apis('cancelTrack')
done()
},200)
break;
default:
fail('receive error message')
}
return
}
apply(pipe,config){
const { registerReciveMessage } = pipe
registerReciveMessage(this.getMessage)
}
}
ko.use(ConsumerService)
// add middle Priority exec -> KeepObserverMiddlewareKibanaApmTrack middle exec
ko.useMiddle('sendMessage',(interrupt,next)=>(message)=>{
message['priorityExec'] = true;
next(message)
})
setTimeout(()=>{
console.log('logTest')
console.warn('warnTest')
console.error('errorTest')
time = Tools.dateFormat(new Date(),'yyyy-MM-dd hh')
})
})
it('KeepObserverMiddlewareKibanaApmTrack config{isInterruptNormal = true} with config{onInterruptJudge=("htmlElementActive")=>false}',function(done){
ko = new KeepObserver({
isGlobalElementActionCatch:true,
isInterruptNormal:true,
serviceName: "dev-test",
reportDateFormat:'yyyy-MM-dd hh',
onInterruptJudge:(report)=>{
console.log('onInterruptJudge',report.typeName)
return report.typeName !== 'htmlElementActive'
},
agentVersion: "step_1",
})
ko.use(KeepObserverLog)
ko.use(KeepObserverHtmlElementActive)
ko.use(KeepObserverMiddlewareKibanaApmTrack)
//start
var receiveCount = 0;
class ConsumerService{
getMessage(message){
expect(message.type).toBe(`monitor`)
expect(message.typeName).toBe(`htmlElementActive`)
switch(++receiveCount){
case 1:
expect(message.data).toEqual({
type: "change",
title: "input:",
xPath: "/html/body/input",
value: "test",
})
break;
case 2:
expect(message.data).toEqual({
type: "click",
title: "button:",
xPath: "/html/body/button",
value: "",
})
setTimeout(()=>{
ko.apis('logStop')
ko.apis('htmlElementActiveStop')
ko.apis('cancelTrack')
done()
},200)
break;
default:
fail('receive error message')
}
return
}
apply(pipe,config){
const { registerReciveMessage } = pipe
registerReciveMessage(this.getMessage)
}
}
ko.use(ConsumerService)
setTimeout(()=>{
console.log('logTest')
console.warn('warnTest')
//htmlElementActive start
var inputText= document.createElement('input')
document.body.appendChild(inputText)
inputText.value = 'test'
inputText.dispatchEvent(new Event('change', { 'bubbles': true }));
//click
var button = document.createElement('button')
document.body.appendChild(button)
button.dispatchEvent(new Event('click', { 'bubbles': true }));
//remove
document.body.removeChild(inputText)
document.body.removeChild(button)
})
})
it('KeepObserverMiddlewareKibanaApmTrack pageError handle netowrk',function(done){
const testRequest = 'http://localhost:9003/report'
const testTimeout = 'http://localhost:9003/timeout'
const test404 = 'http://localhost:9003/404'
const test500 = 'http://localhost:9003/500'
ko = new KeepObserver({
isInterruptNormal:true,
reportDateFormat:'yyyy-MM-dd hh',
isGlobalElementActionCatch:true,
timeout: 25000,
serviceName: "dev-test",
agentVersion: "step_1",
})
ko.use(KeepObserverNetwork)
ko.use(KeepObserverMiddlewareKibanaApmTrack)
//start
var receiveCount = 0;
var time_200
var time_404
var time_500
var time_Timeout
class ConsumerService{
getMessage(message){
switch(++receiveCount){
case 1:
expect(message.data.status).toBe(404)
expect(message.data.method).toBe("GET")
expect(message.data.params).toBe('')
expect(message.data.statusType).toBe("response")
expect(message.data.url).toBe("http://localhost:9003/404")
expect(message.data.body).toBe('')
expect(message.data.isError).toBeTrue()
expect(message.data.response).toBe('ajax request error! error statusCode:404')
expect(message.isError).toBeTrue()
break;
case 2:
expect(message.type).toBe(`monitor`)
expect(message.typeName).toBe(`kibanaApmTrack`)
expect(message.data.type).toBe(`pageError`)
expect(message.data.tags.errorContent).toEqual(jasmine.stringMatching(`"method":"GET","url":"http://localhost:9003/404","params":"","status":404`))
expect(message.data.tags.findErrorDate).toBe(time_404)
expect(message.data.spans.length).toBe(4)
expect(message.data.spans).toEqual([
{
name:'ajax->POST:http://localhost:9003/report(request:0)',
type:jasmine.stringMatching(`monitor-network:${time_200}`),
tags:{
type:"network",
content:{
method: 'POST', url: 'http://localhost:9003/report', params: '', body: '{"test":111,"params":{"type":"post"}}', status: 0, startTime: jasmine.any(Number), endTime: 0, costTime: 0, response: '', timeout: undefined
}
}
},
{ name:'ajax->POST:http://localhost:9003/report(response:200->{"code":2000,"data":{"test":111}})',
type:jasmine.stringMatching(`monitor-network:${time_200}`),
tags:{
type:"network",
content:{
method: 'POST', url: 'http://localhost:9003/report', params: '', body: '{"test":111,"params":{"type":"post"}}', status: 200, startTime: jasmine.any(Number), endTime: jasmine.any(Number), costTime: jasmine.any(Number), response: '{"code":2000,"data":{"test":111}}', timeout: undefined
}
}
},
{ name:'ajax->GET:http://localhost:9003/404(request:0)',
type:jasmine.stringMatching(`monitor-network:${time_404}`),
tags:{
type:"network",
content:{
method: 'GET', url: 'http://localhost:9003/404', params: '', body: '', status: 0, startTime: jasmine.any(Number), endTime: 0, costTime: 0, response: '', timeout: undefined
}
}
},
{
name:'ajax->GET:http://localhost:9003/404(response:404->ajax request error! error statusCode:404)',
type:jasmine.stringMatching(`monitor-network:${time_404}`),
tags:{
type:"network",
content:{
method: 'GET', url: 'http://localhost:9003/404', params: '', body: '', status: 404, startTime: jasmine.any(Number), endTime: jasmine.any(Number), costTime: jasmine.any(Number), response: 'ajax request error! error statusCode:404', timeout: undefined
}
}
},
])
break;
case 3:
expect(message.data.status).toBe(500)
expect(message.data.method).toBe("GET")
expect(message.data.params).toBe('')
expect(message.data.statusType).toBe("response")
expect(message.data.url).toBe("http://localhost:9003/500")
expect(message.data.isError).toBeTrue()
expect(message.data.body).toBe('')
expect(message.data.response).toBe('ajax request error! error statusCode:500')
break;
case 4:
expect(message.type).toBe(`monitor`)
expect(message.typeName).toBe(`kibanaApmTrack`)
expect(message.data.type).toBe(`pageError`)
expect(message.data.tags.errorContent).toEqual(jasmine.stringMatching(`"method":"GET","url":"http://localhost:9003/500","params":"","status":500`))
expect(message.data.tags.findErrorDate).toBe(time_500)
expect(message.data.spans.length).toBe(6)
expect(message.data.spans).toEqual([
{
name:'ajax->POST:http://localhost:9003/report(request:0)',
type:jasmine.stringMatching(`monitor-network:${time_200}`),
tags:{
type:"network",
content:{
method: 'POST', url: 'http://localhost:9003/report', params: '', body: '{"test":111,"params":{"type":"post"}}', status: 0, startTime: jasmine.any(Number), endTime: 0, costTime: 0, response: '', timeout: undefined
}
}
},
{ name:'ajax->POST:http://localhost:9003/report(response:200->{"code":2000,"data":{"test":111}})',
type:jasmine.stringMatching(`monitor-network:${time_200}`),
tags:{
type:"network",
content:{
method: 'POST', url: 'http://localhost:9003/report', params: '', body: '{"test":111,"params":{"type":"post"}}', status: 200, startTime: jasmine.any(Number), endTime: jasmine.any(Number), costTime: jasmine.any(Number), response: '{"code":2000,"data":{"test":111}}', timeout: undefined
}
}
},
{ name:'ajax->GET:http://localhost:9003/404(request:0)',
type:jasmine.stringMatching(`monitor-network:${time_404}`),
tags:{
type:"network",
content:{
method: 'GET', url: 'http://localhost:9003/404', params: '', body: '', status: 0, startTime: jasmine.any(Number), endTime: 0, costTime: 0, response: '', timeout: undefined
}
}
},
{
name:'ajax->GET:http://localhost:9003/404(response:404->ajax request error! error statusCode:404)',
type:jasmine.stringMatching(`monitor-network:${time_404}`),
tags:{
type:"network",
content:{
method: 'GET', url: 'http://localhost:9003/404', params: '', body: '', status: 404, startTime: jasmine.any(Number), endTime: jasmine.any(Number), costTime: jasmine.any(Number), response: 'ajax request error! error statusCode:404', timeout: undefined
}
}
},
{
name:'ajax->GET:http://localhost:9003/500(request:0)',
type:jasmine.stringMatching(`monitor-network:${time_500}`),
tags:{
type:"network",
content:{
method: 'GET', url: 'http://localhost:9003/500', params: '', body: '', status: 0, startTime: jasmine.any(Number), endTime: 0, costTime: 0, response: '', timeout: undefined
}
}
},
{
name:'ajax->GET:http://localhost:9003/500(response:500->ajax request error! error statusCode:500)',
type:jasmine.stringMatching(`monitor-network:${time_500}`),
tags:{
type:"network",
content:{
method: 'GET', url: 'http://localhost:9003/500', params: '', body: '', status: 500, startTime: jasmine.any(Number), endTime: jasmine.any(Number), costTime: jasmine.any(Number), response: 'ajax request error! error statusCode:500', timeout: undefined
}
}
},
])
break;
case 5:
expect(message.data.status).toBe(0)
expect(message.data.method).toBe("GET")
expect(message.data.params).toBe('')
expect(message.data.statusType).toBe("response")
expect(message.data.url).toBe("http://localhost:9003/timeout")
expect(message.data.body).toBe('')
expect(message.data.isError).toBeTrue()
expect(message.data.timeout).toBe(25000) //default timeout 20000 ms
expect(message.data.response).toBe('ajax request timeout,time:25000(ms)')
expect(message.data.errorContent).toBe('ajax request timeout,time:25000(ms)')
break;
case 6:
expect(message.type).toBe(`monitor`)
expect(message.typeName).toBe(`kibanaApmTrack`)
let time_Timeout_Done = Tools.dateFormat(new Date( (new Date(time_Timeout).getTime()+20000) ),'yyyy-MM-dd hh')
expect(message.data.type).toBe(`pageError`)
expect(message.data.tags.errorContent).toEqual(jasmine.stringMatching(`"method":"GET","url":"http://localhost:9003/timeout","params":"","status":0`))
expect(message.data.tags.findErrorDate).toBe(time_Timeout_Done)
expect(message.data.spans.length).toBe(8)
expect(message.data.spans).toEqual([
{
name:'ajax->POST:http://localhost:9003/report(request:0)',
type:jasmine.stringMatching(`monitor-network:${time_200}`),
tags:{
type:"network",
content:{
method: 'POST', url: 'http://localhost:9003/report', params: '', body: '{"test":111,"params":{"type":"post"}}', status: 0, startTime: jasmine.any(Number), endTime: 0, costTime: 0, response: '', timeout: undefined
}
}
},
{ name:'ajax->POST:http://localhost:9003/report(response:200->{"code":2000,"data":{"test":111}})',
type:jasmine.stringMatching(`monitor-network:${time_200}`),
tags:{
type:"network",
content:{
method: 'POST', url: 'http://localhost:9003/report', params: '', body: '{"test":111,"params":{"type":"post"}}', status: 200, startTime: jasmine.any(Number), endTime: jasmine.any(Number), costTime: jasmine.any(Number), response: '{"code":2000,"data":{"test":111}}', timeout: undefined
}
}
},
{ name:'ajax->GET:http://localhost:9003/404(request:0)',
type:jasmine.stringMatching(`monitor-network:${time_404}`),
tags:{
type:"network",
content:{
method: 'GET', url: 'http://localhost:9003/404', params: '', body: '', status: 0, startTime: jasmine.any(Number), endTime: 0, costTime: 0, response: '', timeout: undefined
}
}
},
{
name:'ajax->GET:http://localhost:9003/404(response:404->ajax request error! error statusCode:404)',
type:jasmine.stringMatching(`monitor-network:${time_404}`),
tags:{
type:"network",
content:{
method: 'GET', url: 'http://localhost:9003/404', params: '', body: '', status: 404, startTime: jasmine.any(Number), endTime: jasmine.any(Number), costTime: jasmine.any(Number), response: 'ajax request error! error statusCode:404', timeout: undefined
}
}
},
{
name:'ajax->GET:http://localhost:9003/500(request:0)',
type:jasmine.stringMatching(`monitor-network:${time_500}`),
tags:{
type:"network",
content:{
method: 'GET', url: 'http://localhost:9003/500', params: '', body: '', status: 0, startTime: jasmine.any(Number), endTime: 0, costTime: 0, response: '', timeout: undefined
}
}
},
{
name:'ajax->GET:http://localhost:9003/500(response:500->ajax request error! error statusCode:500)',
type:jasmine.stringMatching(`monitor-network:${time_500}`),
tags:{
type:"network",
content:{
method: 'GET', url: 'http://localhost:9003/500', params: '', body: '', status: 500, startTime: jasmine.any(Number), endTime: jasmine.any(Number), costTime: jasmine.any(Number), response: 'ajax request error! error statusCode:500', timeout: undefined
}
}
},
{
name:'ajax->GET:http://localhost:9003/timeout(request:0)',
type:jasmine.stringMatching(`monitor-network:${time_Timeout_Done}`),
tags:{
type:"network",
content:{
method: 'GET', url: 'http://localhost:9003/timeout', params: '', body: '', status: 0, startTime: jasmine.any(Number), endTime: 0, costTime: 0, response: '', timeout: undefined
}
}
},
{
name:'ajax->GET:http://localhost:9003/timeout(response:0->ajax request timeout,time:25000(ms))',
type:jasmine.stringMatching(`monitor-network:${time_Timeout_Done}`),
tags:{
type:"network",
content:{
method: 'GET', url: 'http://localhost:9003/timeout', params: '', body: '', status: 0, startTime: jasmine.any(Number), endTime: 0, costTime: 0, response: 'ajax request timeout,time:25000(ms)', timeout: 25000
}
}
}
])
setTimeout(()=>{
ko.apis('networkStop')
ko.apis('networkCancelPatch')
ko.apis('cancelTrack')
done()
},200)
break;
default:
fail('receive error message')
}
return
}
apply(pipe,config){
const { registerReciveMessage } = pipe
registerReciveMessage(this.getMessage)
}
}
ko.use(ConsumerService)
//ajax exec
var requestExec = axios.post(testRequest,{test:111,params:{type:'post'}})
time_200 = Tools.dateFormat(new Date(),'yyyy-MM-dd hh')
requestExec.finally(()=>{
return new Promise((res)=>setTimeout(()=>{
axios.get(test404).finally(res),
time_404 = Tools.dateFormat(new Date(),'yyyy-MM-dd hh')
},200))
})
.finally(()=>{
return new Promise((res)=>setTimeout(()=>{
axios.get(test500).finally(res),
time_500 = Tools.dateFormat(new Date(),'yyyy-MM-dd hh')
},200))
})
.finally(()=>{
return new Promise((res)=>setTimeout(()=>{
axios.get(testTimeout).finally(res),
time_Timeout = new Date()
},200))
})
})
it('KeepObserverMiddlewareKibanaApmTrack pageError handle htmlElementActive with handle errorCatch',function(done){
ko = new KeepObserver({
isInterruptNormal:true,
reportDateFormat:'yyyy-MM-dd hh',
isGlobalElementActionCatch:true,
serviceName: "dev-test",
agentVersion: "step_1",
})
ko.use(KeepObserverHtmlElementActive)
ko.use(KeepObserverMiddlewareKibanaApmTrack)
//start
var receiveCount = 0;
var time
class ConsumerService{
getMessage(message){
switch(++receiveCount){
case 1:
console.log(message,111111)
expect(message.type).toBe(`monitor`)
expect(message.typeName).toBe(`error`)
expect(message.isError).toBeTrue()
break;
case 2:
expect(message.type).toBe(`monitor`)
expect(message.typeName).toBe(`kibanaApmTrack`)
expect(message.data.type).toBe(`pageError`)
expect(message.data.tags.errorContent).toEqual(`{"message":"test error message","filename":"kibanaApmTrack.test.js"}`)
expect(message.data.tags.findErrorDate).toBe(time)
expect(message.data.spans.length).toBe(9)
expect(message.data.spans).toEqual([
{
name:'change->input:(xpath:/html/body/input)->test',
type:jasmine.stringMatching(`monitor-htmlElementActive:${time}`),
tags:{
type: 'htmlElementActive', content:{type: 'change', title: 'input:', xPath: '/html/body/input', value: 'test'}
}
},
{
name:'click->button:(xpath:/html/body/button)',
type:jasmine.stringMatching(`monitor-htmlElementActive:${time}`),
tags:{
type: 'htmlElementActive', content:{type: 'click', title: 'button:', xPath: '/html/body/button', value: ''}
}
},
{
name:'change->input:(xpath:/html/body/input[2])->true',
type:jasmine.stringMatching(`monitor-htmlElementActive:${time}`),
tags:{
type: 'htmlElementActive', content: {type: 'change', title: 'input:', xPath: '/html/body/input[2]', value: true}
}
},
{
name:'change->input:(xpath:/html/body/input[3])->true',
type:jasmine.stringMatching(`monitor-htmlElementActive:${time}`),
tags:{
type: 'htmlElementActive', content: {type: 'change', title: 'input:', xPath: '/html/body/input[3]', value: true}
}
},
{
name:'change->input:(xpath:/html/body/input[3])->false',
type:jasmine.stringMatching(`monitor-htmlElementActive:${time}`),
tags:{
type: 'htmlElementActive', content: {type: 'change', title: 'input:', xPath: '/html/body/input[3]', value: false}
}
},
{
name:'change->textarea:(xpath:/html/body/textarea)->test',
type:jasmine.stringMatching(`monitor-htmlElementActive:${time}`),
tags:{
type: 'htmlElementActive', content:{type: 'change', title: 'textarea:', xPath: '/html/body/textarea', value: 'test'}
}
},
{
name:'click->a:(xpath:/html/body/a)',
type:jasmine.stringMatching(`monitor-htmlElementActive:${time}`),
tags:{
type: 'htmlElementActive', content: {type: 'click', title: 'a:', xPath: '/html/body/a', value: ''}
}
},
{
name:'click->div:(xpath:/html/body/div)',
type:jasmine.stringMatching(`monitor-htmlElementActive:${time}`),
tags:{
type: 'htmlElementActive', content: {type: 'click', title: 'div:', xPath: '/html/body/div', value: ''}
}
},
{
name:'Error->test error message(kibanaApmTrack.test.js)',
type:jasmine.stringMatching(`monitor-error:${time}`),
tags:{
type: 'error', content: {message: 'test error message', filename: 'kibanaApmTrack.test.js'}
}
},
])
setTimeout(()=>{
ko.apis('htmlElementActiveStop')
ko.apis('cancelTrack')
done()
},200)
break;
default:
fail('receive error message')
}
return
}
apply(pipe,config){
const { registerReciveMessage } = pipe
registerReciveMessage(this.getMessage)
}
}
class SimulateCatchErrorService{
constructor(){
this.sendMessage = undefined
}
targetSendMessage(message,filename){
this.sendMessage({
type : "monitor",
typeName : 'error',
data: {
message,
filename
},
isError:true
})
}
apply(pipe,config){
const { sendMessage } = pipe
this.sendMessage = sendMessage
return{
targetSendMessage:this.targetSendMessage,
}
}
}
ko.use(ConsumerService)
ko.use(SimulateCatchErrorService)
//elementActive exec
setTimeout(()=>{
var inputText= document.createElement('input')
document.body.appendChild(inputText)
inputText.value = 'test'
inputText.dispatchEvent(new Event('change', { 'bubbles': true }));
//click
var button = document.createElement('button')
document.body.appendChild(button)
button.dispatchEvent(new Event('click', { 'bubbles': true }));
button.dispatchEvent(new Event('click', { 'bubbles': true }));
//checkbox
var inputCheckout = document.createElement('input')
inputCheckout.setAttribute('type','checkbox')
inputCheckout.checked = true
document.body.appendChild(inputCheckout)
inputCheckout.dispatchEvent(new Event('change', { 'bubbles': true }));
//radio
var inputRadio = document.createElement('input')
inputRadio.setAttribute('type','radio')
inputRadio.checked = true
document.body.appendChild(inputRadio)
inputRadio.dispatchEvent(new Event('change', { 'bubbles': true }));
inputRadio.checked = false
inputRadio.dispatchEvent(new Event('change', { 'bubbles': true }));
//textarea
var textarea= document.createElement('textarea')
document.body.appendChild(textarea)
textarea.value = 'test'
textarea.dispatchEvent(new Event('change', { 'bubbles': true }));
//a
var a= document.createElement('a')
document.body.appendChild(a)
a.dispatchEvent(new Event('click', { 'bubbles': true }));
//div
var div= document.createElement('div')
document.body.appendChild(div)
div.dispatchEvent(new Event('click', { 'bubbles': true }));
//remove
document.body.removeChild(inputText)
document.body.removeChild(button)
document.body.removeChild(inputCheckout)
document.body.removeChild(inputRadio)
document.body.removeChild(textarea)
document.body.removeChild(a)
document.body.removeChild(div)
//throw error
time = Tools.dateFormat(new Date(),'yyyy-MM-dd hh')
ko.apis('targetSendMessage','test error message','kibanaApmTrack.test.js')
},200)
})
it('KeepObserverMiddlewareKibanaApmTrack pageHashChange',function(done){
const testRequest = 'http://localhost:9003/report'
ko = new KeepObserver({
isInterruptNormal:true,
reportDateFormat:'yyyy-MM-dd hh',
isGlobalElementActionCatch:true,
serviceName: "dev-test",
agentVersion: "step_1",
})
ko.use(KeepObserverHtmlElementActive)
ko.use(KeepObserverLog)
ko.use(KeepObserverNetwork)
ko.use(KeepObserverMiddlewareKibanaApmTrack)
//start
var receiveCount = 0;
var startTime
var logTime
var clickTime
var inputTime
var nextTime
var requestTime
class ConsumerService{
getMessage(message){
switch(++receiveCount){
case 1:
expect(message.type).toBe(`monitor`)
expect(message.typeName).toBe(`kibanaApmTrack`)
expect(message.data.type).toBe(`pageHashChange`)
expect(message.data.url).toBe(window.location.origin + window.location.pathname)
expect(message.data.tags.startUrl).toBe(window.location.origin + window.location.pathname)
expect(message.data.tags.startDate).toBe(startTime)
expect(message.data.tags.nextUrl).toBe(window.location.origin + window.location.pathname + '#hasChange')
expect(message.data.tags.nextDate).toBe(nextTime)
expect(message.data.tags.errorContent).toBeUndefined()
expect(message.data.tags.findErrorDate).toBeUndefined()
expect(message.data.spans.length).toBe(5)
expect(message.data.spans).toEqual([
{
name:'warn->["warnTest"]',
type:jasmine.stringMatching(`monitor-log:${logTime}`),
tags:{
type: 'log', content: {type:'warn',data:'["warnTest"]'}
}
},
{
name:'click->button:(xpath:/html/body/button)',
type:jasmine.stringMatching(`monitor-htmlElementActive:${clickTime}`),
tags:{
type: 'htmlElementActive', content:{type: 'click', title: 'button:', xPath: '/html/body/button', value: ''}
}
},
{
name:'ajax->POST:http://localhost:9003/report(request:0)',
type:jasmine.stringMatching(`monitor-network:${requestTime}`),
tags:{
type: 'network', content: {method: 'POST', url: 'http://localhost:9003/report', params: '', body: '{"test":111,"params":{"type":"post"}}', status: 0, startTime: jasmine.any(Number), endTime: 0, costTime: 0, response: '', timeout: undefined}
}
},
{
name:'change->textarea:(xpath:/html/body/textarea)->test',
type:jasmine.stringMatching(`monitor-htmlElementActive:${inputTime}`),
tags:{
type: 'htmlElementActive', content: {type: 'change', title: 'textarea:', xPath: '/html/body/textarea', value: 'test'}
}
},
{
name:'ajax->POST:http://localhost:9003/report(response:200->{"code":2000,"data":{"test":111}})',
type:jasmine.stringMatching(`monitor-network:${inputTime}`),
tags:{
type: 'network', content:{method: 'POST', url: 'http://localhost:9003/report', params: '', body: '{"test":111,"params":{"type":"post"}}', status: 200, startTime: jasmine.any(Number), endTime: jasmine.any(Number), costTime: jasmine.any(Number), response: '{"code":2000,"data":{"test":111}}', timeout: undefined}
}
},
])
setTimeout(()=>{
ko.apis('htmlElementActiveStop')
ko.apis('networkStop')
ko.apis('logStop')
ko.apis('cancelTrack')
ko.apis('networkCancelPatch')
done()
},200)
break;
default:
fail('receive error message')
}
return
}
apply(pipe,config){
const { registerReciveMessage } = pipe
registerReciveMessage(this.getMessage)
}
}
ko.use(ConsumerService)
//elementActive exec
startTime = Tools.dateFormat(new Date(),'yyyy-MM-dd hh')
setTimeout(()=>{
//log
logTime = Tools.dateFormat(new Date(),'yyyy-MM-dd hh')
console.warn('warnTest')
//click
clickTime = Tools.dateFormat(new Date(),'yyyy-MM-dd hh')
var button = document.createElement('button')
document.body.appendChild(button)
button.dispatchEvent(new Event('click', { 'bubbles': true }));
button.dispatchEvent(new Event('click', { 'bubbles': true }));
//request
var requestExec = axios.post(testRequest,{test:111,params:{type:'post'}})
requestTime = Tools.dateFormat(new Date(),'yyyy-MM-dd hh')
requestExec.then(()=>{
//textarea input
inputTime = Tools.dateFormat(new Date(),'yyyy-MM-dd hh')
var textarea= document.createElement('textarea')
document.body.appendChild(textarea)
textarea.value = 'test'
textarea.dispatchEvent(new Event('change', { 'bubbles': true }));
//remove
document.body.removeChild(button)
document.body.removeChild(textarea)
// aysn middle Immediately pushState will Loss response
setTimeout(()=>{
// hashChange
nextTime = Tools.dateFormat(new Date(),'yyyy-MM-dd hh')
// window.location.href = window.location.origin + window.location.pathname + '#hasChange'
window.history.pushState(null,null,window.location.origin + window.location.pathname + '#hasChange')
},100)
})
},200)
})
});