Prometheus: Add query tracking (#61004)

* merge fix

* remove comments from debugging
This commit is contained in:
Brendan O'Handley 2023-01-13 12:13:52 -05:00 committed by GitHub
parent e7cd6eb13c
commit 6be341d505
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 57 additions and 8 deletions

View File

@ -51,6 +51,7 @@ import { renderLegendFormat } from './legend';
import PrometheusMetricFindQuery from './metric_find_query';
import { getInitHints, getQueryHints } from './query_hints';
import { getOriginalMetricName, transform, transformV2 } from './result_transformer';
import { trackQuery } from './tracking';
import {
ExemplarTraceIdDestination,
PromDataErrorResponse,
@ -440,14 +441,15 @@ export class PrometheusDatasource
query(request: DataQueryRequest<PromQuery>): Observable<DataQueryResponse> {
if (this.access === 'proxy') {
const targets = request.targets.map((target) => this.processTargetV2(target, request));
return super
.query({ ...request, targets: targets.flat() })
.pipe(
map((response) =>
transformV2(response, request, { exemplarTraceIdDestinations: this.exemplarTraceIdDestinations })
)
);
const startTime = new Date();
return super.query({ ...request, targets: targets.flat() }).pipe(
map((response) =>
transformV2(response, request, { exemplarTraceIdDestinations: this.exemplarTraceIdDestinations })
),
tap((response: DataQueryResponse) => {
trackQuery(response, request, startTime);
})
);
// Run queries trough browser/proxy
} else {
const start = this.getPrometheusTime(request.range.from, false);
@ -607,6 +609,7 @@ export class PrometheusDatasource
...this.getRangeScopedVars(options.range),
});
}
query.step = interval;
let expr = target.expr;

View File

@ -0,0 +1,46 @@
import { CoreApp, DataQueryRequest, DataQueryResponse } from '@grafana/data';
import { reportInteraction, config } from '@grafana/runtime';
import { PromQuery } from './types';
export function trackQuery(
response: DataQueryResponse,
request: DataQueryRequest<PromQuery> & { targets: PromQuery[] },
startTime: Date
): void {
const { app, targets: queries } = request;
// We do want to track panel-editor and explore
// We do not want to track queries from the dashboard or viewing a panel
// also included in the tracking is cloud-alerting, unified-alerting, and unknown
if (app === CoreApp.Dashboard || app === CoreApp.PanelViewer) {
return;
}
for (const query of queries) {
reportInteraction('grafana_prometheus_query_executed', {
app,
grafana_version: config.buildInfo.version,
has_data: response.data.some((frame) => frame.length > 0),
has_error: response.error !== undefined,
expr: query.expr,
format: query.format,
instant: query.instant,
range: query.range,
exemplar: query.exemplar,
hinting: query.hinting,
interval: query.interval,
intervalFactor: query.intervalFactor,
utcOffsetSec: query.utcOffsetSec,
legend: query.legendFormat,
valueWithRefId: query.valueWithRefId,
requestId: query.requestId,
showingGraph: query.showingGraph,
showingTable: query.showingTable,
editor_mode: query.editorMode,
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(),
});
}
}