mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Loki/ES: Add further items to query tracking (#60347)
* add more tracking to queries from ES and Loki * improve tracking elasticsearch * update type assertion * remove unused import
This commit is contained in:
parent
d0a68b266c
commit
ae05c6180c
@ -638,7 +638,8 @@ export class ElasticDatasource
|
|||||||
const shouldRunTroughBackend =
|
const shouldRunTroughBackend =
|
||||||
request.app === CoreApp.Explore && config.featureToggles.elasticsearchBackendMigration;
|
request.app === CoreApp.Explore && config.featureToggles.elasticsearchBackendMigration;
|
||||||
if (shouldRunTroughBackend) {
|
if (shouldRunTroughBackend) {
|
||||||
return super.query(request).pipe(tap((response) => trackQuery(response, request.targets, request.app)));
|
const start = new Date();
|
||||||
|
return super.query(request).pipe(tap((response) => trackQuery(response, request, start)));
|
||||||
}
|
}
|
||||||
let payload = '';
|
let payload = '';
|
||||||
const targets = this.interpolateVariablesInQueries(cloneDeep(request.targets), request.scopedVars);
|
const targets = this.interpolateVariablesInQueries(cloneDeep(request.targets), request.scopedVars);
|
||||||
@ -705,6 +706,7 @@ export class ElasticDatasource
|
|||||||
|
|
||||||
const url = this.getMultiSearchUrl();
|
const url = this.getMultiSearchUrl();
|
||||||
|
|
||||||
|
const start = new Date();
|
||||||
return this.post(url, payload).pipe(
|
return this.post(url, payload).pipe(
|
||||||
map((res) => {
|
map((res) => {
|
||||||
const er = new ElasticResponse(sentTargets, res);
|
const er = new ElasticResponse(sentTargets, res);
|
||||||
@ -721,7 +723,7 @@ export class ElasticDatasource
|
|||||||
|
|
||||||
return er.getTimeSeries();
|
return er.getTimeSeries();
|
||||||
}),
|
}),
|
||||||
tap((response) => trackQuery(response, request.targets, request.app))
|
tap((response) => trackQuery(response, request, start))
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import { CoreApp, DashboardLoadedEvent, DataQueryResponse } from '@grafana/data';
|
import { CoreApp, DashboardLoadedEvent, DataQueryRequest, DataQueryResponse } from '@grafana/data';
|
||||||
import { reportInteraction } from '@grafana/runtime';
|
import { config, reportInteraction } from '@grafana/runtime';
|
||||||
import { variableRegex } from 'app/features/variables/utils';
|
import { variableRegex } from 'app/features/variables/utils';
|
||||||
|
|
||||||
import { REF_ID_STARTER_LOG_VOLUME } from './datasource';
|
import { REF_ID_STARTER_LOG_VOLUME } from './datasource';
|
||||||
@ -110,7 +110,12 @@ const shouldNotReportBasedOnRefId = (refId: string): boolean => {
|
|||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
|
||||||
export function trackQuery(response: DataQueryResponse, queries: ElasticsearchQuery[], app: string): void {
|
export function trackQuery(
|
||||||
|
response: DataQueryResponse,
|
||||||
|
request: DataQueryRequest<ElasticsearchQuery> & { targets: ElasticsearchQuery[] },
|
||||||
|
startTime: Date
|
||||||
|
): void {
|
||||||
|
const { targets: queries, app } = request;
|
||||||
if (app === CoreApp.Dashboard || app === CoreApp.PanelViewer) {
|
if (app === CoreApp.Dashboard || app === CoreApp.PanelViewer) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -121,6 +126,7 @@ export function trackQuery(response: DataQueryResponse, queries: ElasticsearchQu
|
|||||||
}
|
}
|
||||||
reportInteraction('grafana_elasticsearch_query_executed', {
|
reportInteraction('grafana_elasticsearch_query_executed', {
|
||||||
app,
|
app,
|
||||||
|
grafana_version: config.buildInfo.version,
|
||||||
with_lucene_query: query.query ? true : false,
|
with_lucene_query: query.query ? true : false,
|
||||||
query_type: getQueryType(query),
|
query_type: getQueryType(query),
|
||||||
line_limit: getLineLimit(query),
|
line_limit: getLineLimit(query),
|
||||||
@ -128,6 +134,9 @@ export function trackQuery(response: DataQueryResponse, queries: ElasticsearchQu
|
|||||||
has_error: response.error !== undefined,
|
has_error: response.error !== undefined,
|
||||||
has_data: response.data.some((frame) => frame.length > 0),
|
has_data: response.data.some((frame) => frame.length > 0),
|
||||||
simultaneously_sent_query_count: queries.length,
|
simultaneously_sent_query_count: queries.length,
|
||||||
|
time_range_from: request?.range?.from?.toISOString(),
|
||||||
|
time_range_to: request?.range?.to?.toISOString(),
|
||||||
|
time_taken: Date.now() - startTime.getTime(),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -170,7 +170,7 @@ export class LokiDatasource
|
|||||||
.map(getNormalizedLokiQuery) // "fix" the `.queryType` prop
|
.map(getNormalizedLokiQuery) // "fix" the `.queryType` prop
|
||||||
.map((q) => ({ ...q, maxLines: q.maxLines || this.maxLines })); // set maxLines if not set
|
.map((q) => ({ ...q, maxLines: q.maxLines || this.maxLines })); // set maxLines if not set
|
||||||
|
|
||||||
const fixedRequest = {
|
const fixedRequest: DataQueryRequest<LokiQuery> & { targets: LokiQuery[] } = {
|
||||||
...request,
|
...request,
|
||||||
targets: queries,
|
targets: queries,
|
||||||
};
|
};
|
||||||
@ -197,12 +197,13 @@ export class LokiDatasource
|
|||||||
if (fixedRequest.liveStreaming) {
|
if (fixedRequest.liveStreaming) {
|
||||||
return this.runLiveQueryThroughBackend(fixedRequest);
|
return this.runLiveQueryThroughBackend(fixedRequest);
|
||||||
} else {
|
} else {
|
||||||
|
const startTime = new Date();
|
||||||
return super.query(fixedRequest).pipe(
|
return super.query(fixedRequest).pipe(
|
||||||
// in case of an empty query, this is somehow run twice. `share()` is no workaround here as the observable is generated from `of()`.
|
// in case of an empty query, this is somehow run twice. `share()` is no workaround here as the observable is generated from `of()`.
|
||||||
map((response) =>
|
map((response) =>
|
||||||
transformBackendResult(response, fixedRequest.targets, this.instanceSettings.jsonData.derivedFields ?? [])
|
transformBackendResult(response, fixedRequest.targets, this.instanceSettings.jsonData.derivedFields ?? [])
|
||||||
),
|
),
|
||||||
tap((response) => trackQuery(response, fixedRequest.targets, fixedRequest.app))
|
tap((response) => trackQuery(response, fixedRequest, startTime))
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import { CoreApp, DashboardLoadedEvent, DataQueryResponse } from '@grafana/data';
|
import { CoreApp, DashboardLoadedEvent, DataQueryRequest, DataQueryResponse } from '@grafana/data';
|
||||||
import { reportInteraction } from '@grafana/runtime';
|
import { reportInteraction, config } from '@grafana/runtime';
|
||||||
import { variableRegex } from 'app/features/variables/utils';
|
import { variableRegex } from 'app/features/variables/utils';
|
||||||
|
|
||||||
import { QueryEditorMode } from '../prometheus/querybuilder/shared/types';
|
import { QueryEditorMode } from '../prometheus/querybuilder/shared/types';
|
||||||
@ -132,18 +132,35 @@ const shouldNotReportBasedOnRefId = (refId: string): boolean => {
|
|||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
|
||||||
export function trackQuery(response: DataQueryResponse, queries: LokiQuery[], app: string): void {
|
export function trackQuery(
|
||||||
|
response: DataQueryResponse,
|
||||||
|
request: DataQueryRequest<LokiQuery> & { targets: LokiQuery[] },
|
||||||
|
startTime: Date
|
||||||
|
): void {
|
||||||
// We only want to track usage for these specific apps
|
// We only want to track usage for these specific apps
|
||||||
|
const { app, targets: queries } = request;
|
||||||
|
|
||||||
if (app === CoreApp.Dashboard || app === CoreApp.PanelViewer) {
|
if (app === CoreApp.Dashboard || app === CoreApp.PanelViewer) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let totalBytes = 0;
|
||||||
|
for (const frame of response.data) {
|
||||||
|
const byteKey = frame.meta?.custom?.lokiQueryStatKey;
|
||||||
|
if (byteKey) {
|
||||||
|
totalBytes +=
|
||||||
|
frame.meta?.stats?.find((stat: { displayName: string }) => stat.displayName === byteKey)?.value ?? 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (const query of queries) {
|
for (const query of queries) {
|
||||||
if (shouldNotReportBasedOnRefId(query.refId)) {
|
if (shouldNotReportBasedOnRefId(query.refId)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
reportInteraction('grafana_loki_query_executed', {
|
reportInteraction('grafana_loki_query_executed', {
|
||||||
app,
|
app,
|
||||||
|
grafana_version: config.buildInfo.version,
|
||||||
editor_mode: query.editorMode,
|
editor_mode: query.editorMode,
|
||||||
has_data: response.data.some((frame) => frame.length > 0),
|
has_data: response.data.some((frame) => frame.length > 0),
|
||||||
has_error: response.error !== undefined,
|
has_error: response.error !== undefined,
|
||||||
@ -154,6 +171,10 @@ export function trackQuery(response: DataQueryResponse, queries: LokiQuery[], ap
|
|||||||
query_vector_type: query.queryType,
|
query_vector_type: query.queryType,
|
||||||
resolution: query.resolution,
|
resolution: query.resolution,
|
||||||
simultaneously_sent_query_count: queries.length,
|
simultaneously_sent_query_count: queries.length,
|
||||||
|
time_range_from: request?.range?.from?.toISOString(),
|
||||||
|
time_range_to: request?.range?.to?.toISOString(),
|
||||||
|
time_taken: Date.now() - startTime.getTime(),
|
||||||
|
bytes_processed: totalBytes,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user