2025-04-01 10:38:02 +09:00

71 lines
2.3 KiB
TypeScript

import { GrafanaPromRuleGroupDTO, PromRuleDTO, PromRuleGroupDTO } from 'app/types/unified-alerting-dto';
import { GRAFANA_RULES_SOURCE_NAME } from '../utils/datasource';
import { alertingApi } from './alertingApi';
import { normalizeRuleGroup } from './prometheus';
export interface PromRulesResponse<TRuleGroup> {
status: string;
data: {
groups: TRuleGroup[];
groupNextToken?: string;
};
errorType?: string;
error?: string;
}
interface PromRulesOptions {
ruleSource: { uid: string };
namespace?: string;
groupName?: string;
ruleName?: string;
groupLimit?: number;
excludeAlerts?: boolean;
groupNextToken?: string;
}
type GrafanaPromRulesOptions = Omit<PromRulesOptions, 'ruleSource'> & {
dashboardUid?: string;
panelId?: number;
};
export const prometheusApi = alertingApi.injectEndpoints({
endpoints: (build) => ({
getGroups: build.query<PromRulesResponse<PromRuleGroupDTO<PromRuleDTO>>, PromRulesOptions>({
query: ({ ruleSource, namespace, groupName, ruleName, groupLimit, excludeAlerts, groupNextToken }) => {
if (ruleSource.uid === GRAFANA_RULES_SOURCE_NAME) {
throw new Error('Please use getGrafanaGroups endpoint for grafana rules');
}
return {
url: `api/prometheus/${ruleSource.uid}/api/v1/rules`,
params: {
'file[]': namespace,
'group[]': groupName,
'rule[]': ruleName,
exclude_alerts: excludeAlerts?.toString(),
group_limit: groupLimit?.toFixed(0),
group_next_token: groupNextToken,
},
};
},
transformResponse: (response: PromRulesResponse<PromRuleGroupDTO<PromRuleDTO>>) => {
return { ...response, data: { ...response.data, groups: response.data.groups.map(normalizeRuleGroup) } };
},
}),
getGrafanaGroups: build.query<PromRulesResponse<GrafanaPromRuleGroupDTO>, GrafanaPromRulesOptions>({
query: ({ namespace, groupName, ruleName, groupLimit, excludeAlerts, groupNextToken }) => ({
url: `api/prometheus/grafana/api/v1/rules`,
params: {
'file[]': namespace,
'group[]': groupName,
'rule[]': ruleName,
exclude_alerts: excludeAlerts?.toString(),
group_limit: groupLimit?.toFixed(0),
group_next_token: groupNextToken,
},
}),
}),
}),
});