Files
grafana/public/app/features/alerting/alert_def.ts
2017-12-19 16:06:54 +01:00

172 lines
4.2 KiB
TypeScript

///<reference path="../../headers/common.d.ts" />
import _ from "lodash";
import {
QueryPartDef,
QueryPart
} from "app/core/components/query_part/query_part";
var alertQueryDef = new QueryPartDef({
type: "query",
params: [
{ name: "queryRefId", type: "string", dynamicLookup: true },
{
name: "from",
type: "string",
options: ["1s", "10s", "1m", "5m", "10m", "15m", "1h", "24h", "48h"]
},
{ name: "to", type: "string", options: ["now"] }
],
defaultParams: ["#A", "15m", "now", "avg"]
});
var conditionTypes = [{ text: "Query", value: "query" }];
var alertStateSortScore = {
alerting: 1,
no_data: 2,
pending: 3,
ok: 4,
paused: 5
};
var evalFunctions = [
{ text: "IS ABOVE", value: "gt" },
{ text: "IS BELOW", value: "lt" },
{ text: "IS OUTSIDE RANGE", value: "outside_range" },
{ text: "IS WITHIN RANGE", value: "within_range" },
{ text: "HAS NO VALUE", value: "no_value" }
];
var evalOperators = [
{ text: "OR", value: "or" },
{ text: "AND", value: "and" }
];
var reducerTypes = [
{ text: "avg()", value: "avg" },
{ text: "min()", value: "min" },
{ text: "max()", value: "max" },
{ text: "sum()", value: "sum" },
{ text: "count()", value: "count" },
{ text: "last()", value: "last" },
{ text: "median()", value: "median" },
{ text: "diff()", value: "diff" },
{ text: "percent_diff()", value: "percent_diff" },
{ text: "count_non_null()", value: "count_non_null" }
];
var noDataModes = [
{ text: "Alerting", value: "alerting" },
{ text: "No Data", value: "no_data" },
{ text: "Keep Last State", value: "keep_state" },
{ text: "Ok", value: "ok" }
];
var executionErrorModes = [
{ text: "Alerting", value: "alerting" },
{ text: "Keep Last State", value: "keep_state" }
];
function createReducerPart(model) {
var def = new QueryPartDef({ type: model.type, defaultParams: [] });
return new QueryPart(model, def);
}
function getStateDisplayModel(state) {
switch (state) {
case "ok": {
return {
text: "OK",
iconClass: "icon-gf icon-gf-online",
stateClass: "alert-state-ok"
};
}
case "alerting": {
return {
text: "ALERTING",
iconClass: "icon-gf icon-gf-critical",
stateClass: "alert-state-critical"
};
}
case "no_data": {
return {
text: "NO DATA",
iconClass: "fa fa-question",
stateClass: "alert-state-warning"
};
}
case "paused": {
return {
text: "PAUSED",
iconClass: "fa fa-pause",
stateClass: "alert-state-paused"
};
}
case "pending": {
return {
text: "PENDING",
iconClass: "fa fa-exclamation",
stateClass: "alert-state-warning"
};
}
}
throw { message: "Unknown alert state" };
}
function joinEvalMatches(matches, separator: string) {
return _.reduce(
matches,
(res, ev) => {
if (ev.metric !== undefined && ev.value !== undefined) {
res.push(ev.metric + "=" + ev.value);
}
// For backwards compatibility . Should be be able to remove this after ~2017-06-01
if (ev.Metric !== undefined && ev.Value !== undefined) {
res.push(ev.Metric + "=" + ev.Value);
}
return res;
},
[]
).join(separator);
}
function getAlertAnnotationInfo(ah) {
// backward compatability, can be removed in grafana 5.x
// old way stored evalMatches in data property directly,
// new way stores it in evalMatches property on new data object
if (_.isArray(ah.data)) {
return joinEvalMatches(ah.data, ", ");
} else if (_.isArray(ah.data.evalMatches)) {
return joinEvalMatches(ah.data.evalMatches, ", ");
}
if (ah.data.error) {
return "Error: " + ah.data.error;
}
if (ah.data.noData || ah.data.no_data) {
return "No Data";
}
return "";
}
export default {
alertQueryDef: alertQueryDef,
getStateDisplayModel: getStateDisplayModel,
conditionTypes: conditionTypes,
evalFunctions: evalFunctions,
evalOperators: evalOperators,
noDataModes: noDataModes,
executionErrorModes: executionErrorModes,
reducerTypes: reducerTypes,
createReducerPart: createReducerPart,
getAlertAnnotationInfo: getAlertAnnotationInfo,
alertStateSortScore: alertStateSortScore
};