diff --git a/public/app/plugins/datasource/elasticsearch/tracking.test.ts b/public/app/plugins/datasource/elasticsearch/tracking.test.ts new file mode 100644 index 00000000000..81a86a388af --- /dev/null +++ b/public/app/plugins/datasource/elasticsearch/tracking.test.ts @@ -0,0 +1,63 @@ +import { DashboardLoadedEvent } from '@grafana/data'; +import { reportInteraction } from '@grafana/runtime'; + +import pluginJson from './plugin.json'; +import { onDashboardLoadedHandler } from './tracking'; +import { ElasticsearchQuery } from './types'; + +jest.mock('@grafana/runtime', () => ({ + ...jest.requireActual('@grafana/runtime'), + reportInteraction: jest.fn(), +})); + +const targets: ElasticsearchQuery[] = [ + { + refId: 'test', + alias: '$varAlias', + bucketAggs: [], + metrics: [], + query: 'test', + }, +]; + +afterAll(() => { + jest.clearAllMocks(); +}); + +describe('onDashboardLoadedHandler', () => { + beforeEach(() => { + jest.mocked(reportInteraction).mockClear(); + jest.spyOn(console, 'error'); + }); + test('Reports dashboard loaded interactions', () => { + const event = new DashboardLoadedEvent({ + dashboardId: 'test', + orgId: 1, + userId: 2, + grafanaVersion: '11', + queries: { + [pluginJson.id]: targets, + }, + }); + onDashboardLoadedHandler(event); + + expect(reportInteraction).toHaveBeenCalled(); + expect(console.error).not.toHaveBeenCalled(); + }); + + test('Does not report or fails when the dashboard id has no queries', () => { + const event = new DashboardLoadedEvent({ + dashboardId: 'test', + orgId: 1, + userId: 2, + grafanaVersion: '11', + queries: { + 'not elasticsearch': targets, + }, + }); + onDashboardLoadedHandler(event); + + expect(reportInteraction).not.toHaveBeenCalled(); + expect(console.error).not.toHaveBeenCalled(); + }); +}); diff --git a/public/app/plugins/datasource/elasticsearch/tracking.ts b/public/app/plugins/datasource/elasticsearch/tracking.ts index bc0456756e6..a4d25158ec7 100644 --- a/public/app/plugins/datasource/elasticsearch/tracking.ts +++ b/public/app/plugins/datasource/elasticsearch/tracking.ts @@ -41,7 +41,7 @@ export const onDashboardLoadedHandler = ({ }: DashboardLoadedEvent) => { try { // We only want to track visible ElasticSearch queries - const elasticsearchQueries = queries[pluginJson.id].filter((query) => !query.hide); + const elasticsearchQueries = queries[pluginJson.id]?.filter((query) => !query.hide); if (!elasticsearchQueries?.length) { return; } diff --git a/public/app/plugins/datasource/loki/tracking.test.ts b/public/app/plugins/datasource/loki/tracking.test.ts index 9f3a01151d6..26af7b38541 100644 --- a/public/app/plugins/datasource/loki/tracking.test.ts +++ b/public/app/plugins/datasource/loki/tracking.test.ts @@ -1,12 +1,13 @@ import { getQueryOptions } from 'test/helpers/getQueryOptions'; -import { dateTime } from '@grafana/data'; +import { DashboardLoadedEvent, dateTime } from '@grafana/data'; import { reportInteraction } from '@grafana/runtime'; import { QueryEditorMode } from '../prometheus/querybuilder/shared/types'; +import pluginJson from './plugin.json'; import { partitionTimeRange } from './querySplitting'; -import { trackGroupedQueries, trackQuery } from './tracking'; +import { onDashboardLoadedHandler, trackGroupedQueries, trackQuery } from './tracking'; import { LokiGroupedRequest, LokiQuery } from './types'; jest.mock('@grafana/runtime', () => ({ @@ -63,6 +64,7 @@ beforeAll(() => { }); afterAll(() => { jest.useRealTimers(); + jest.clearAllMocks(); }); beforeEach(() => { jest.mocked(reportInteraction).mockClear(); @@ -182,3 +184,41 @@ test('Tracks grouped queries', () => { predefined_operations_applied: 'n/a', }); }); + +describe('onDashboardLoadedHandler', () => { + beforeEach(() => { + jest.mocked(reportInteraction).mockClear(); + jest.spyOn(console, 'error'); + }); + test('Reports dashboard loaded interactions', () => { + const event = new DashboardLoadedEvent({ + dashboardId: 'test', + orgId: 1, + userId: 2, + grafanaVersion: '11', + queries: { + [pluginJson.id]: originalRequest.targets, + }, + }); + onDashboardLoadedHandler(event); + + expect(reportInteraction).toHaveBeenCalled(); + expect(console.error).not.toHaveBeenCalled(); + }); + + test('Does not report or fails when the dashboard id has no queries', () => { + const event = new DashboardLoadedEvent({ + dashboardId: 'test', + orgId: 1, + userId: 2, + grafanaVersion: '11', + queries: { + 'not loki': originalRequest.targets, + }, + }); + onDashboardLoadedHandler(event); + + expect(reportInteraction).not.toHaveBeenCalled(); + expect(console.error).not.toHaveBeenCalled(); + }); +}); diff --git a/public/app/plugins/datasource/loki/tracking.ts b/public/app/plugins/datasource/loki/tracking.ts index cd6c117e147..f2707b0d72e 100644 --- a/public/app/plugins/datasource/loki/tracking.ts +++ b/public/app/plugins/datasource/loki/tracking.ts @@ -63,8 +63,8 @@ export const onDashboardLoadedHandler = ({ try { // We only want to track visible Loki queries const lokiQueries = queries[pluginJson.id] - .filter((query) => !query.hide) - .map((query) => getNormalizedLokiQuery(query)); + ?.filter((query) => !query.hide) + ?.map((query) => getNormalizedLokiQuery(query)); if (!lokiQueries?.length) { return;