mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
30 lines
1.2 KiB
TypeScript
30 lines
1.2 KiB
TypeScript
|
import { Observable, of } from 'rxjs';
|
||
|
import { catchError, map } from 'rxjs/operators';
|
||
|
import { AnnotationEvent, DataSourceApi } from '@grafana/data';
|
||
|
|
||
|
import { AnnotationQueryRunner, AnnotationQueryRunnerOptions } from './types';
|
||
|
import { PanelModel } from '../../../dashboard/state';
|
||
|
import { executeAnnotationQuery } from '../../../annotations/annotations_srv';
|
||
|
import { handleAnnotationQueryRunnerError } from './utils';
|
||
|
|
||
|
export class AnnotationsQueryRunner implements AnnotationQueryRunner {
|
||
|
canRun(datasource: DataSourceApi): boolean {
|
||
|
return !Boolean(datasource.annotationQuery && !datasource.annotations);
|
||
|
}
|
||
|
|
||
|
run({ annotation, datasource, dashboard, range }: AnnotationQueryRunnerOptions): Observable<AnnotationEvent[]> {
|
||
|
if (!this.canRun(datasource)) {
|
||
|
return of([]);
|
||
|
}
|
||
|
|
||
|
const panel: PanelModel = ({} as unknown) as PanelModel; // deliberate setting panel to empty object because executeAnnotationQuery shouldn't depend on panelModel
|
||
|
|
||
|
return executeAnnotationQuery({ dashboard, range, panel }, datasource, annotation).pipe(
|
||
|
map((result) => {
|
||
|
return result.events ?? [];
|
||
|
}),
|
||
|
catchError(handleAnnotationQueryRunnerError)
|
||
|
);
|
||
|
}
|
||
|
}
|