| import $ from 'jquery'; |
| |
| export const LOG_ACTIONS_PAGE_LOAD = 'page_load_perf'; |
| export const LOG_ACTIONS_LOAD_EVENT = 'load_events'; |
| export const LOG_ACTIONS_RENDER_EVENT = 'render_events'; |
| |
| const handlers = {}; |
| |
| export const Logger = { |
| start(log) { |
| log.setAttribute('startAt', new Date().getTime() - this.getTimestamp()); |
| log.eventNames.forEach((eventName) => { |
| if (!handlers[eventName]) { |
| handlers[eventName] = []; |
| } |
| handlers[eventName].push(log.addEvent.bind(log)); |
| }); |
| }, |
| |
| append(eventName, eventBody) { |
| return handlers[eventName].length && |
| handlers[eventName].forEach(handler => (handler(eventName, eventBody))); |
| }, |
| |
| end(log) { |
| log.setAttribute('duration', new Date().getTime() - log.startAt); |
| this.send(log); |
| |
| log.eventNames.forEach((eventName) => { |
| if (handlers[eventName].length) { |
| const index = handlers[eventName] |
| .findIndex(handler => (handler === log.addEvent)); |
| handlers[eventName].splice(index, 1); |
| } |
| }); |
| }, |
| |
| send(log) { |
| const { impressionId, actionType, source, sourceId, events, startAt, duration } = log; |
| const requestPrams = []; |
| requestPrams.push(['impression_id', impressionId]); |
| switch (source) { |
| case 'dashboard': |
| requestPrams.push(['dashboard_id', sourceId]); |
| break; |
| case 'slice': |
| requestPrams.push(['slice_id', sourceId]); |
| break; |
| default: |
| break; |
| } |
| let url = '/superset/log/'; |
| if (requestPrams.length) { |
| url += '?' + requestPrams.map(([k, v]) => (k + '=' + v)).join('&'); |
| } |
| const eventData = {}; |
| for (const eventName in events) { |
| eventData[eventName] = []; |
| events[eventName].forEach((event) => { |
| eventData[eventName].push(event); |
| }); |
| } |
| |
| $.ajax({ |
| url, |
| method: 'POST', |
| dataType: 'json', |
| data: { |
| source: 'client', |
| type: actionType, |
| started_time: startAt, |
| duration, |
| events: JSON.stringify(eventData), |
| }, |
| }); |
| }, |
| |
| getTimestamp() { |
| return Math.round(window.performance.now()); |
| }, |
| }; |
| |
| export class ActionLog { |
| constructor({ impressionId, actionType, source, sourceId, eventNames, sendNow }) { |
| this.impressionId = impressionId; |
| this.source = source; |
| this.sourceId = sourceId; |
| this.actionType = actionType; |
| this.eventNames = eventNames; |
| this.sendNow = sendNow || false; |
| this.startAt = 0; |
| this.duration = 0; |
| this.events = {}; |
| |
| this.addEvent = this.addEvent.bind(this); |
| } |
| |
| setAttribute(name, value) { |
| this[name] = value; |
| } |
| |
| addEvent(eventName, eventBody) { |
| if (!this.events[eventName]) { |
| this.events[eventName] = []; |
| } |
| this.events[eventName].push(eventBody); |
| |
| if (this.sendNow) { |
| this.setAttribute('duration', new Date().getTime() - this.startAt); |
| Logger.send(this); |
| this.events = {}; |
| } |
| } |
| } |