mirror of
https://github.com/grafana/grafana.git
synced 2025-02-11 16:15:42 -06:00
Co-authored-by: Juan Cabanas <juan.cabanas@grafana.com> Co-authored-by: Ezequiel Victorero <ezequiel.victorero@grafana.com> Co-authored-by: Ryan McKinley <ryantxu@gmail.com>
82 lines
2.3 KiB
TypeScript
82 lines
2.3 KiB
TypeScript
import { Observable, of } from 'rxjs';
|
|
import { map, mergeMap } from 'rxjs/operators';
|
|
|
|
import { AnnotationQuery, CoreApp, DataQueryRequest, DataSourceApi, rangeUtil, ScopedVars } from '@grafana/data';
|
|
|
|
import { runRequest } from '../query/state/runRequest';
|
|
|
|
import { standardAnnotationSupport } from './standardAnnotationSupport';
|
|
import { AnnotationQueryOptions, AnnotationQueryResponse } from './types';
|
|
|
|
let counter = 100;
|
|
function getNextRequestId() {
|
|
return 'AQ' + counter++;
|
|
}
|
|
|
|
export function executeAnnotationQuery(
|
|
options: AnnotationQueryOptions,
|
|
datasource: DataSourceApi,
|
|
savedJsonAnno: AnnotationQuery
|
|
): Observable<AnnotationQueryResponse> {
|
|
const processor = {
|
|
...standardAnnotationSupport,
|
|
...datasource.annotations,
|
|
};
|
|
|
|
const annotationWithDefaults = {
|
|
...processor.getDefaultQuery?.(),
|
|
...savedJsonAnno,
|
|
};
|
|
const annotation = processor.prepareAnnotation!(annotationWithDefaults);
|
|
if (!annotation) {
|
|
return of({});
|
|
}
|
|
|
|
const query = processor.prepareQuery!(annotation);
|
|
if (!query) {
|
|
return of({});
|
|
}
|
|
|
|
// No more points than pixels
|
|
const maxDataPoints = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
|
|
|
|
// Add interval to annotation queries
|
|
const interval = rangeUtil.calculateInterval(options.range, maxDataPoints, datasource.interval);
|
|
|
|
const scopedVars: ScopedVars = {
|
|
__interval: { text: interval.interval, value: interval.interval },
|
|
__interval_ms: { text: interval.intervalMs.toString(), value: interval.intervalMs },
|
|
__annotation: { text: annotation.name, value: annotation },
|
|
};
|
|
|
|
const queryRequest: DataQueryRequest = {
|
|
startTime: Date.now(),
|
|
requestId: getNextRequestId(),
|
|
range: options.range,
|
|
maxDataPoints,
|
|
scopedVars,
|
|
...interval,
|
|
app: CoreApp.Dashboard,
|
|
|
|
timezone: options.dashboard.timezone,
|
|
|
|
targets: [
|
|
{
|
|
...query,
|
|
refId: 'Anno',
|
|
},
|
|
],
|
|
};
|
|
|
|
return runRequest(datasource, queryRequest).pipe(
|
|
mergeMap((panelData) => {
|
|
// Some annotations set the topic already
|
|
const data = panelData?.series.length ? panelData.series : panelData.annotations;
|
|
if (!data?.length) {
|
|
return of({ panelData, events: [] });
|
|
}
|
|
return processor.processEvents!(annotation, data).pipe(map((events) => ({ panelData, events })));
|
|
})
|
|
);
|
|
}
|