From fd616b64460a862338893accd135e0f5d7109752 Mon Sep 17 00:00:00 2001 From: Gareth Dawson Date: Wed, 13 Sep 2023 12:30:58 +0100 Subject: [PATCH 1/3] track executed queries and panel clicks --- src/datasource/datasource.ts | 3 + src/datasource/tracking.ts | 65 +++++++++++++++++++ .../components/Problems/Problems.tsx | 11 +++- 3 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 src/datasource/tracking.ts diff --git a/src/datasource/datasource.ts b/src/datasource/datasource.ts index ac36fc1..1a79231 100644 --- a/src/datasource/datasource.ts +++ b/src/datasource/datasource.ts @@ -26,6 +26,7 @@ import { toDataFrame, } from '@grafana/data'; import { AnnotationQueryEditor } from './components/AnnotationQueryEditor'; +import { trackRequest } from './tracking'; export class ZabbixDatasource extends DataSourceApi { name: string; @@ -113,6 +114,8 @@ export class ZabbixDatasource extends DataSourceApi) { + trackRequest(request); + // Migrate old targets const requestTargets = request.targets.map((t) => { // Prevent changes of original object diff --git a/src/datasource/tracking.ts b/src/datasource/tracking.ts new file mode 100644 index 0000000..1fe71de --- /dev/null +++ b/src/datasource/tracking.ts @@ -0,0 +1,65 @@ +import { DataQueryRequest } from '@grafana/data'; +import { ZabbixMetricsQuery } from './types'; +import { reportInteraction } from '@grafana/runtime'; + +export const trackRequest = (request: DataQueryRequest): void => { + request.targets.forEach((target) => { + const properties: any = { + app: request.app, + }; + + switch (target.queryType) { + case '0': + case '1': + case '3': + if (target.queryType === '0') { + properties.queryType = 'Metrics'; + } else if (target.queryType === '1') { + properties.queryType = 'Services'; + } else if (target.queryType === '3') { + properties.queryType = 'Item Id'; + } + properties.trends = target.options.useTrends; + properties.showDisabledItems = target.options.showDisabledItems; + properties.useZabbixValueMapping = target.options.useZabbixValueMapping; + properties.disableDataAlignment = target.options.disableDataAlignment; + break; + case '2': + properties.queryType = 'Text'; + properties.showDisabledItems = target.options.showDisabledItems; + break; + case '4': + properties.queryType = 'Triggers'; + + if (target.options.acknowledged === 0) { + properties.acknowledged = 'unacknowledged'; + } else if (target.options.acknowledged === 1) { + properties.acknowledged = 'acknowledged'; + } else if (target.options.acknowledged === 2) { + properties.acknowledged = 'all triggers'; + } + + properties.useTimeRange = target.options.useTimeRange ?? false; + break; + case '5': + properties.queryType = 'Problems'; + + if (target.options.acknowledged === 0) { + properties.acknowledged = 'unacknowledged'; + } else if (target.options.acknowledged === 1) { + properties.acknowledged = 'acknowledged'; + } else if (target.options.acknowledged === 2) { + properties.acknowledged = 'all triggers'; + } + + properties.sortProblems = target.options.sortProblems; + properties.useTimeRange = target.options.useTimeRange; + properties.hostsInMaintenance = target.options.hostsInMaintenance; + properties.hostProxy = target.options.hostProxy; + properties.limit = target.options.limit; + break; + } + + reportInteraction('grafana_zabbix_query_executed', properties); + }); +}; diff --git a/src/panel-triggers/components/Problems/Problems.tsx b/src/panel-triggers/components/Problems/Problems.tsx index 6cc30ab..eff1c88 100644 --- a/src/panel-triggers/components/Problems/Problems.tsx +++ b/src/panel-triggers/components/Problems/Problems.tsx @@ -14,6 +14,7 @@ import { ProblemDTO, ZBXAlert, ZBXEvent, ZBXTag } from '../../../datasource/type import { APIExecuteScriptResponse, ZBXScript } from '../../../datasource/zabbix/connectors/zabbix_api/types'; import { AckCell } from './AckCell'; import { DataSourceRef, TimeRange } from '@grafana/data'; +import { reportInteraction } from '@grafana/runtime'; export interface ProblemListProps { problems: ProblemDTO[]; @@ -77,6 +78,8 @@ export default class ProblemList extends PureComponent { + reportInteraction('grafana_zabbix_panel_row_expanded', {}); + const { problems, pageSize } = this.props; const { page } = this.state; const expandedProblems = {}; @@ -259,7 +262,13 @@ export default class ProblemList extends PureComponent this.setState({ page })} + onPageChange={(page) => { + reportInteraction('grafana_zabbix_panel_page_change', { + action: page > this.state.page ? 'next' : 'prev', + }); + + this.setState({ page }); + }} onPageSizeChange={this.handlePageSizeChange} onResizedChange={this.handleResizedChange} /> From ac91cb4320c5b04f2446eb19e93f59b762955072 Mon Sep 17 00:00:00 2001 From: Gareth Dawson Date: Thu, 28 Sep 2023 10:04:07 +0100 Subject: [PATCH 2/3] only report basic usage --- src/datasource/tracking.ts | 65 ++++++++++++++------------------------ 1 file changed, 23 insertions(+), 42 deletions(-) diff --git a/src/datasource/tracking.ts b/src/datasource/tracking.ts index 1fe71de..de061ab 100644 --- a/src/datasource/tracking.ts +++ b/src/datasource/tracking.ts @@ -1,6 +1,15 @@ import { DataQueryRequest } from '@grafana/data'; import { ZabbixMetricsQuery } from './types'; import { reportInteraction } from '@grafana/runtime'; +import { + MODE_ITEMID, + MODE_ITSERVICE, + MODE_MACROS, + MODE_METRICS, + MODE_PROBLEMS, + MODE_TEXT, + MODE_TRIGGERS, +} from './constants'; export const trackRequest = (request: DataQueryRequest): void => { request.targets.forEach((target) => { @@ -9,54 +18,26 @@ export const trackRequest = (request: DataQueryRequest): voi }; switch (target.queryType) { - case '0': - case '1': - case '3': - if (target.queryType === '0') { - properties.queryType = 'Metrics'; - } else if (target.queryType === '1') { - properties.queryType = 'Services'; - } else if (target.queryType === '3') { - properties.queryType = 'Item Id'; - } - properties.trends = target.options.useTrends; - properties.showDisabledItems = target.options.showDisabledItems; - properties.useZabbixValueMapping = target.options.useZabbixValueMapping; - properties.disableDataAlignment = target.options.disableDataAlignment; + case MODE_METRICS: + properties.queryType = 'Metrics'; break; - case '2': + case MODE_ITSERVICE: + properties.queryType = 'Services'; + break; + case MODE_TEXT: properties.queryType = 'Text'; - properties.showDisabledItems = target.options.showDisabledItems; break; - case '4': + case MODE_ITEMID: + properties.queryType = 'Item Id'; + break; + case MODE_TRIGGERS: properties.queryType = 'Triggers'; - - if (target.options.acknowledged === 0) { - properties.acknowledged = 'unacknowledged'; - } else if (target.options.acknowledged === 1) { - properties.acknowledged = 'acknowledged'; - } else if (target.options.acknowledged === 2) { - properties.acknowledged = 'all triggers'; - } - - properties.useTimeRange = target.options.useTimeRange ?? false; break; - case '5': + case MODE_PROBLEMS: properties.queryType = 'Problems'; - - if (target.options.acknowledged === 0) { - properties.acknowledged = 'unacknowledged'; - } else if (target.options.acknowledged === 1) { - properties.acknowledged = 'acknowledged'; - } else if (target.options.acknowledged === 2) { - properties.acknowledged = 'all triggers'; - } - - properties.sortProblems = target.options.sortProblems; - properties.useTimeRange = target.options.useTimeRange; - properties.hostsInMaintenance = target.options.hostsInMaintenance; - properties.hostProxy = target.options.hostProxy; - properties.limit = target.options.limit; + break; + case MODE_MACROS: + properties.queryType = 'Macros'; break; } From 5143dd2272d66c671a08d006b3a5c1bd85bcb0ac Mon Sep 17 00:00:00 2001 From: Gareth Dawson Date: Thu, 28 Sep 2023 10:24:45 +0100 Subject: [PATCH 3/3] mock reportInteraction --- src/datasource/specs/datasource.spec.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/datasource/specs/datasource.spec.ts b/src/datasource/specs/datasource.spec.ts index 556a207..d09b3a8 100644 --- a/src/datasource/specs/datasource.spec.ts +++ b/src/datasource/specs/datasource.spec.ts @@ -15,6 +15,7 @@ jest.mock( getTemplateSrv: () => ({ replace: jest.fn().mockImplementation((query) => query), }), + reportInteraction: jest.fn(), }), { virtual: true } );