The open and composable observability and data visualization platform. Visualize metrics, logs, and traces from multiple sources like Prometheus, Loki, Elasticsearch, InfluxDB, Postgres and many more.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
grafana/public/app/features/alerting/unified/search/rulesSearchParser.ts

118 lines
4.0 KiB

import { isPromAlertingRuleState, PromAlertingRuleState, PromRuleType } from '../../../../types/unified-alerting-dto';
import { getRuleHealth, isPromRuleType } from '../utils/rules';
import * as terms from './search.terms';
import {
applyFiltersToQuery,
FilterExpr,
FilterSupportedTerm,
parseQueryToFilter,
QueryFilterMapper,
} from './searchParser';
export interface RulesFilter {
freeFormWords: string[];
namespace?: string;
groupName?: string;
ruleName?: string;
ruleState?: PromAlertingRuleState;
ruleType?: PromRuleType;
dataSourceNames: string[];
labels: string[];
ruleHealth?: RuleHealth;
dashboardUid?: string;
}
const filterSupportedTerms: FilterSupportedTerm[] = [
FilterSupportedTerm.dataSource,
FilterSupportedTerm.nameSpace,
FilterSupportedTerm.label,
FilterSupportedTerm.group,
FilterSupportedTerm.rule,
FilterSupportedTerm.state,
FilterSupportedTerm.type,
FilterSupportedTerm.health,
FilterSupportedTerm.dashboard,
];
export enum RuleHealth {
Ok = 'ok',
Error = 'error',
NoData = 'nodata',
Unknown = 'unknown',
}
// Define how to map parsed tokens into the filter object
export function getSearchFilterFromQuery(query: string): RulesFilter {
const filter: RulesFilter = { labels: [], freeFormWords: [], dataSourceNames: [] };
const tokenToFilterMap: QueryFilterMapper = {
[terms.DataSourceToken]: (value) => filter.dataSourceNames.push(value),
[terms.NameSpaceToken]: (value) => (filter.namespace = value),
[terms.GroupToken]: (value) => (filter.groupName = value),
[terms.RuleToken]: (value) => (filter.ruleName = value),
[terms.LabelToken]: (value) => filter.labels.push(value),
[terms.StateToken]: (value) => (filter.ruleState = parseStateToken(value)),
[terms.TypeToken]: (value) => (isPromRuleType(value) ? (filter.ruleType = value) : undefined),
[terms.HealthToken]: (value) => (filter.ruleHealth = getRuleHealth(value)),
[terms.DashboardToken]: (value) => (filter.dashboardUid = value),
[terms.FreeFormExpression]: (value) => filter.freeFormWords.push(value),
};
parseQueryToFilter(query, filterSupportedTerms, tokenToFilterMap);
return filter;
}
// Reverse of the previous function
// Describes how to map the object into an array of tokens and values
export function applySearchFilterToQuery(query: string, filter: RulesFilter): string {
const filterStateArray: FilterExpr[] = [];
// Convert filter object into an array
// It allows to pick filters from the array in the same order as they were applied in the original query
if (filter.dataSourceNames) {
filterStateArray.push(...filter.dataSourceNames.map((t) => ({ type: terms.DataSourceToken, value: t })));
}
if (filter.namespace) {
filterStateArray.push({ type: terms.NameSpaceToken, value: filter.namespace });
}
if (filter.groupName) {
filterStateArray.push({ type: terms.GroupToken, value: filter.groupName });
}
if (filter.ruleName) {
filterStateArray.push({ type: terms.RuleToken, value: filter.ruleName });
}
if (filter.ruleState) {
filterStateArray.push({ type: terms.StateToken, value: filter.ruleState });
}
if (filter.ruleType) {
filterStateArray.push({ type: terms.TypeToken, value: filter.ruleType });
}
if (filter.ruleHealth) {
filterStateArray.push({ type: terms.HealthToken, value: filter.ruleHealth });
}
if (filter.labels) {
filterStateArray.push(...filter.labels.map((l) => ({ type: terms.LabelToken, value: l })));
}
if (filter.dashboardUid) {
filterStateArray.push({ type: terms.DashboardToken, value: filter.dashboardUid });
}
if (filter.freeFormWords) {
filterStateArray.push(...filter.freeFormWords.map((word) => ({ type: terms.FreeFormExpression, value: word })));
}
return applyFiltersToQuery(query, filterSupportedTerms, filterStateArray);
}
function parseStateToken(value: string): PromAlertingRuleState | undefined {
if (value === 'normal') {
return PromAlertingRuleState.Inactive;
}
if (isPromAlertingRuleState(value)) {
return value;
}
return;
}