mirror of
https://github.com/grafana/grafana.git
synced 2025-02-13 00:55:47 -06:00
75 lines
2.1 KiB
TypeScript
75 lines
2.1 KiB
TypeScript
|
import { Observable, of } from 'rxjs';
|
||
|
import { map, mergeMap } from 'rxjs/operators';
|
||
|
import { CoreApp, DataQueryRequest, DataSourceApi, rangeUtil, ScopedVars } from '@grafana/data';
|
||
|
|
||
|
import { AnnotationQueryOptions, AnnotationQueryResponse } from './types';
|
||
|
import { standardAnnotationSupport } from './standardAnnotationSupport';
|
||
|
import { runRequest } from '../query/state/runRequest';
|
||
|
|
||
|
let counter = 100;
|
||
|
function getNextRequestId() {
|
||
|
return 'AQ' + counter++;
|
||
|
}
|
||
|
|
||
|
export function executeAnnotationQuery(
|
||
|
options: AnnotationQueryOptions,
|
||
|
datasource: DataSourceApi,
|
||
|
savedJsonAnno: any
|
||
|
): Observable<AnnotationQueryResponse> {
|
||
|
const processor = {
|
||
|
...standardAnnotationSupport,
|
||
|
...datasource.annotations,
|
||
|
};
|
||
|
|
||
|
const annotation = processor.prepareAnnotation!(savedJsonAnno);
|
||
|
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) => {
|
||
|
if (!panelData.series) {
|
||
|
return of({ panelData, events: [] });
|
||
|
}
|
||
|
|
||
|
return processor.processEvents!(annotation, panelData.series).pipe(map((events) => ({ panelData, events })));
|
||
|
})
|
||
|
);
|
||
|
}
|