Loki: Add feature tracking to reduce repetition (#69900)

add tracking to predefined queries
pull/69910/head
Sven Grossmann 2 years ago committed by GitHub
parent 2fd7d95d7e
commit 15d55c371c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 14
      public/app/plugins/datasource/loki/configuration/ConfigEditor.tsx
  2. 6
      public/app/plugins/datasource/loki/datasource.ts
  3. 3
      public/app/plugins/datasource/loki/querySplitting.test.ts
  4. 4
      public/app/plugins/datasource/loki/querySplitting.ts
  5. 31
      public/app/plugins/datasource/loki/tracking.test.ts
  6. 13
      public/app/plugins/datasource/loki/tracking.ts

@ -1,7 +1,7 @@
import React from 'react';
import React, { useCallback } from 'react';
import { DataSourcePluginOptionsEditorProps, DataSourceSettings } from '@grafana/data';
import { config } from '@grafana/runtime';
import { config, reportInteraction } from '@grafana/runtime';
import { AlertingSettings, DataSourceHttpSettings } from '@grafana/ui';
import { LokiOptions } from '../types';
@ -30,6 +30,14 @@ const setDerivedFields = makeJsonUpdater('derivedFields');
export const ConfigEditor = (props: Props) => {
const { options, onOptionsChange } = props;
const updatePredefinedOperations = useCallback(
(value: string) => {
reportInteraction('grafana_loki_predefined_operations_changed', { value });
onOptionsChange(setPredefinedOperations(options, value));
},
[options, onOptionsChange]
);
return (
<>
<DataSourceHttpSettings
@ -46,7 +54,7 @@ export const ConfigEditor = (props: Props) => {
maxLines={options.jsonData.maxLines || ''}
onMaxLinedChange={(value) => onOptionsChange(setMaxLines(options, value))}
predefinedOperations={options.jsonData.predefinedOperations || ''}
onPredefinedOperationsChange={(value) => onOptionsChange(setPredefinedOperations(options, value))}
onPredefinedOperationsChange={updatePredefinedOperations}
/>
<DerivedFields

@ -290,7 +290,11 @@ export class LokiDatasource
}
const startTime = new Date();
return this.runQuery(fixedRequest).pipe(tap((response) => trackQuery(response, fixedRequest, startTime)));
return this.runQuery(fixedRequest).pipe(
tap((response) =>
trackQuery(response, fixedRequest, startTime, { predefinedOperations: this.predefinedOperations })
)
);
}
runQuery(fixedRequest: DataQueryRequest<LokiQuery>) {

@ -91,7 +91,8 @@ describe('runSplitQuery()', () => {
},
],
request,
new Date()
new Date(),
{ predefinedOperations: '' }
);
});
});

@ -281,7 +281,9 @@ export function runSplitQuery(datasource: LokiDatasource, request: DataQueryRequ
return runSplitGroupedQueries(datasource, requests).pipe(
tap((response) => {
if (response.state === LoadingState.Done) {
trackGroupedQueries(response, requests, request, startTime);
trackGroupedQueries(response, requests, request, startTime, {
predefinedOperations: datasource.predefinedOperations,
});
}
})
);

@ -92,6 +92,35 @@ test('Tracks queries', () => {
time_range_from: '2023-02-08T05:00:00.000Z',
time_range_to: '2023-02-10T06:00:00.000Z',
time_taken: 0,
predefined_operations_applied: 'n/a',
});
});
test('Tracks predefined operations', () => {
trackQuery({ data: [] }, originalRequest, new Date(), { predefinedOperations: 'count_over_time' });
expect(reportInteraction).toHaveBeenCalledWith('grafana_loki_query_executed', {
app: 'explore',
bytes_processed: 0,
editor_mode: 'builder',
grafana_version: '1.0',
has_data: false,
has_error: false,
is_split: false,
legend: undefined,
line_limit: undefined,
obfuscated_query: 'count_over_time({Identifier=String}[1m])',
parsed_query:
'LogQL,Expr,MetricExpr,RangeAggregationExpr,RangeOp,CountOverTime,LogRangeExpr,Selector,Matchers,Matcher,Identifier,Eq,String,Range,Duration',
query_type: 'metric',
query_vector_type: undefined,
resolution: 1,
simultaneously_executed_query_count: 2,
simultaneously_hidden_query_count: 1,
time_range_from: '2023-02-08T05:00:00.000Z',
time_range_to: '2023-02-10T06:00:00.000Z',
time_taken: 0,
predefined_operations_applied: true,
});
});
@ -123,6 +152,7 @@ test('Tracks grouped queries', () => {
time_range_from: '2023-02-08T05:00:00.000Z',
time_range_to: '2023-02-10T06:00:00.000Z',
time_taken: 0,
predefined_operations_applied: 'n/a',
});
expect(reportInteraction).toHaveBeenCalledWith('grafana_loki_query_executed', {
@ -149,5 +179,6 @@ test('Tracks grouped queries', () => {
time_range_from: '2023-02-08T05:00:00.000Z',
time_range_to: '2023-02-10T06:00:00.000Z',
time_taken: 0,
predefined_operations_applied: 'n/a',
});
});

@ -53,6 +53,10 @@ type LokiOnDashboardLoadedTrackingEvent = {
queries_with_changed_legend_count: number;
};
export type LokiTrackingSettings = {
predefinedOperations?: string;
};
export const onDashboardLoadedHandler = ({
payload: { dashboardId, orgId, grafanaVersion, queries },
}: DashboardLoadedEvent<LokiQuery>) => {
@ -148,6 +152,7 @@ export function trackQuery(
response: DataQueryResponse,
request: DataQueryRequest<LokiQuery>,
startTime: Date,
trackingSettings: LokiTrackingSettings = {},
extraPayload: Record<string, unknown> = {}
): void {
// We only want to track usage for these specific apps
@ -184,6 +189,9 @@ export function trackQuery(
time_taken: Date.now() - startTime.getTime(),
bytes_processed: totalBytes,
is_split: false,
predefined_operations_applied: trackingSettings.predefinedOperations
? query.expr.includes(trackingSettings.predefinedOperations)
: 'n/a',
...extraPayload,
});
}
@ -193,7 +201,8 @@ export function trackGroupedQueries(
response: DataQueryResponse,
groupedRequests: LokiGroupedRequest[],
originalRequest: DataQueryRequest<LokiQuery>,
startTime: Date
startTime: Date,
trackingSettings: LokiTrackingSettings = {}
): void {
const splittingPayload = {
split_query_group_count: groupedRequests.length,
@ -206,7 +215,7 @@ export function trackGroupedQueries(
for (const group of groupedRequests) {
const split_query_partition_size = group.partition.length;
trackQuery(response, group.request, startTime, {
trackQuery(response, group.request, startTime, trackingSettings, {
...splittingPayload,
split_query_partition_size,
});

Loading…
Cancel
Save