mirror of
https://github.com/grafana/grafana.git
synced 2025-02-16 18:34:52 -06:00
* Introduce Echo for collecting frontend metrics * Update public/app/core/services/echo/Echo.ts Co-Authored-By: Peter Holmberg <peterholmberg@users.noreply.github.com> * Custom meta when adding event * Rename consumer to backend * Remove buffer from Echo * Minor tweaks * Update package.json * Update public/app/app.ts * Update public/app/app.ts * Collect paint metrics when collecting tti. Remove echoBackendFactory * Update yarn.lock * Move Echo interfaces to runtime * progress on meta and echo * Collect meta analytics events * Move MetaanalyticsBackend to enterprise repo * Fixed unit tests * Removed unused type from test * Fixed issues with chunk loading (reverted index-template changes) * Restored changes * Fixed webpack prod
90 lines
2.2 KiB
TypeScript
90 lines
2.2 KiB
TypeScript
import { EchoBackend, EchoMeta, EchoEvent, EchoSrv } from '@grafana/runtime';
|
|
import { contextSrv } from '../context_srv';
|
|
|
|
interface EchoConfig {
|
|
// How often should metrics be reported
|
|
flushInterval: number;
|
|
// Enables debug mode
|
|
debug: boolean;
|
|
}
|
|
|
|
/**
|
|
* Echo is a service for collecting events from Grafana client-app
|
|
* It collects events, distributes them across registered backend and flushes once per configured interval
|
|
* It's up to the registered backend to decide what to do with a given type of metric
|
|
*/
|
|
export class Echo implements EchoSrv {
|
|
private config: EchoConfig = {
|
|
flushInterval: 10000, // By default Echo flushes every 10s
|
|
debug: false,
|
|
};
|
|
|
|
private backends: EchoBackend[] = [];
|
|
// meta data added to every event collected
|
|
|
|
constructor(config?: Partial<EchoConfig>) {
|
|
this.config = {
|
|
...this.config,
|
|
...config,
|
|
};
|
|
setInterval(this.flush, this.config.flushInterval);
|
|
}
|
|
|
|
logDebug = (...msg: any) => {
|
|
if (this.config.debug) {
|
|
// tslint:disable-next-line
|
|
// console.debug('ECHO:', ...msg);
|
|
}
|
|
};
|
|
|
|
flush = () => {
|
|
for (const backend of this.backends) {
|
|
backend.flush();
|
|
}
|
|
};
|
|
|
|
addBackend = (backend: EchoBackend) => {
|
|
this.logDebug('Adding backend', backend);
|
|
this.backends.push(backend);
|
|
};
|
|
|
|
addEvent = <T extends EchoEvent>(event: Omit<T, 'meta'>, _meta?: {}) => {
|
|
const meta = this.getMeta();
|
|
const _event = {
|
|
...event,
|
|
meta: {
|
|
...meta,
|
|
..._meta,
|
|
},
|
|
};
|
|
|
|
for (const backend of this.backends) {
|
|
if (backend.supportedEvents.length === 0 || backend.supportedEvents.indexOf(_event.type) > -1) {
|
|
backend.addEvent(_event);
|
|
}
|
|
}
|
|
|
|
this.logDebug('Adding event', _event);
|
|
};
|
|
|
|
getMeta = (): EchoMeta => {
|
|
return {
|
|
sessionId: '',
|
|
userId: contextSrv.user.id,
|
|
userLogin: contextSrv.user.login,
|
|
userSignedIn: contextSrv.user.isSignedIn,
|
|
screenSize: {
|
|
width: window.innerWidth,
|
|
height: window.innerHeight,
|
|
},
|
|
windowSize: {
|
|
width: window.screen.width,
|
|
height: window.screen.height,
|
|
},
|
|
userAgent: window.navigator.userAgent,
|
|
ts: performance.now(),
|
|
url: window.location.href,
|
|
};
|
|
};
|
|
}
|