import { PostableRulerRuleGroupDTO, RulerRuleGroupDTO, RulerRulesConfigDTO } from 'app/types/unified-alerting-dto'; import { getDatasourceAPIId } from '../utils/datasource'; import { getBackendSrv } from '@grafana/runtime'; import { RULER_NOT_SUPPORTED_MSG } from '../utils/constants'; // upsert a rule group. use this to update rules export async function setRulerRuleGroup( dataSourceName: string, namespace: string, group: PostableRulerRuleGroupDTO ): Promise { await await getBackendSrv() .fetch({ method: 'POST', url: `/api/ruler/${getDatasourceAPIId(dataSourceName)}/api/v1/rules/${encodeURIComponent(namespace)}`, data: group, showErrorAlert: false, showSuccessAlert: false, }) .toPromise(); } // fetch all ruler rule namespaces and included groups export async function fetchRulerRules(dataSourceName: string) { return rulerGetRequest(`/api/ruler/${getDatasourceAPIId(dataSourceName)}/api/v1/rules`, {}); } // fetch rule groups for a particular namespace // will throw with { status: 404 } if namespace does not exist export async function fetchRulerRulesNamespace(dataSourceName: string, namespace: string) { const result = await rulerGetRequest>( `/api/ruler/${getDatasourceAPIId(dataSourceName)}/api/v1/rules/${encodeURIComponent(namespace)}`, {} ); return result[namespace] || []; } // fetch a particular rule group // will throw with { status: 404 } if rule group does not exist export async function fetchRulerRulesGroup( dataSourceName: string, namespace: string, group: string ): Promise { return rulerGetRequest( `/api/ruler/${getDatasourceAPIId(dataSourceName)}/api/v1/rules/${encodeURIComponent( namespace )}/${encodeURIComponent(group)}`, null ); } export async function deleteRulerRulesGroup(dataSourceName: string, namespace: string, groupName: string) { return getBackendSrv() .fetch({ url: `/api/ruler/${getDatasourceAPIId(dataSourceName)}/api/v1/rules/${encodeURIComponent( namespace )}/${encodeURIComponent(groupName)}`, method: 'DELETE', showSuccessAlert: false, showErrorAlert: false, }) .toPromise(); } // false in case ruler is not supported. this is weird, but we'll work on it async function rulerGetRequest(url: string, empty: T): Promise { try { const response = await getBackendSrv() .fetch({ url, showErrorAlert: false, showSuccessAlert: false, }) .toPromise(); return response.data; } catch (e) { if (e?.status === 404 || e?.data?.message?.includes('group does not exist')) { return empty; } else if ( e?.status === 500 && e?.data?.message?.includes('unexpected content type from upstream. expected YAML, got text/html') ) { throw { ...e, data: { ...e?.data, message: RULER_NOT_SUPPORTED_MSG, }, }; } throw e; } }