Files
Marcus Andersson e19b3df1a9 Alerting: added possibility to preview grafana managed alert rules. (#34600)
* starting to add eval logic.

* wip

* first version of test rule.

* reverted file.

* add info colum to result to show error or (with CC evalmatches)

* fix labels in evalmatch

* fix be test

* refactored using observables.

* moved widht/height div to outside panel rendere.

* adding docs api level.

* adding container styles to error div.

* increasing size of preview.

Co-authored-by: kyle <kyle@grafana.com>
2021-05-26 10:06:28 +02:00

84 lines
2.2 KiB
TypeScript

import {
dataFrameFromJSON,
DataFrameJSON,
getDefaultTimeRange,
LoadingState,
PanelData,
withLoadingIndicator,
} from '@grafana/data';
import { getBackendSrv, toDataQueryError } from '@grafana/runtime';
import { Observable, of } from 'rxjs';
import { catchError, map, share } from 'rxjs/operators';
import {
CloudPreviewRuleRequest,
GrafanaPreviewRuleRequest,
isCloudPreviewRequest,
isGrafanaPreviewRequest,
PreviewRuleRequest,
PreviewRuleResponse,
} from '../types/preview';
import { RuleFormType } from '../types/rule-form';
export function previewAlertRule(request: PreviewRuleRequest): Observable<PreviewRuleResponse> {
if (isCloudPreviewRequest(request)) {
return previewCloudAlertRule(request);
}
if (isGrafanaPreviewRequest(request)) {
return previewGrafanaAlertRule(request);
}
throw new Error('unsupported preview rule request');
}
type GrafanaPreviewRuleResponse = {
instances: DataFrameJSON[];
};
function previewGrafanaAlertRule(request: GrafanaPreviewRuleRequest): Observable<PreviewRuleResponse> {
const type = RuleFormType.grafana;
return withLoadingIndicator({
whileLoading: createResponse(type),
source: getBackendSrv()
.fetch<GrafanaPreviewRuleResponse>({
method: 'POST',
url: `/api/v1/rule/test/grafana`,
data: request,
})
.pipe(
map(({ data }) => {
return createResponse(type, {
state: LoadingState.Done,
series: data.instances.map(dataFrameFromJSON),
});
}),
catchError((error: Error) => {
return of(
createResponse(type, {
state: LoadingState.Error,
error: toDataQueryError(error),
})
);
}),
share()
),
});
}
function createResponse(ruleType: RuleFormType, data: Partial<PanelData> = {}): PreviewRuleResponse {
return {
ruleType,
data: {
state: LoadingState.Loading,
series: [],
timeRange: getDefaultTimeRange(),
...data,
},
};
}
function previewCloudAlertRule(request: CloudPreviewRuleRequest): Observable<PreviewRuleResponse> {
throw new Error('preview for cloud alerting rules is not implemented');
}