diff --git a/frontend/public/locales/en-GB/alerts.json b/frontend/public/locales/en-GB/alerts.json index fa2d9516fe..b5c769a021 100644 --- a/frontend/public/locales/en-GB/alerts.json +++ b/frontend/public/locales/en-GB/alerts.json @@ -102,9 +102,11 @@ "user_tooltip_more_help": "More details on how to create alerts", "choose_alert_type": "Choose a type for the alert:", "metric_based_alert": "Metric based Alert", - "metric_based_alert_desc": "Send a notification when a condition occurs in metric data", + "metric_based_alert_desc": "Send a notification when a condition occurs in the metric data", "log_based_alert": "Log-based Alert", - "log_based_alert_desc": "Send a notification when a condition occurs in logs data.", + "log_based_alert_desc": "Send a notification when a condition occurs in the logs data.", "traces_based_alert": "Trace-based Alert", - "traces_based_alert_desc": "Send a notification when a condition occurs in traces data." + "traces_based_alert_desc": "Send a notification when a condition occurs in the traces data.", + "exceptions_based_alert": "Exceptions-based Alert", + "exceptions_based_alert_desc": "Send a notification when a condition occurs in the exceptions data." } \ No newline at end of file diff --git a/frontend/public/locales/en/alerts.json b/frontend/public/locales/en/alerts.json index fa2d9516fe..b5c769a021 100644 --- a/frontend/public/locales/en/alerts.json +++ b/frontend/public/locales/en/alerts.json @@ -102,9 +102,11 @@ "user_tooltip_more_help": "More details on how to create alerts", "choose_alert_type": "Choose a type for the alert:", "metric_based_alert": "Metric based Alert", - "metric_based_alert_desc": "Send a notification when a condition occurs in metric data", + "metric_based_alert_desc": "Send a notification when a condition occurs in the metric data", "log_based_alert": "Log-based Alert", - "log_based_alert_desc": "Send a notification when a condition occurs in logs data.", + "log_based_alert_desc": "Send a notification when a condition occurs in the logs data.", "traces_based_alert": "Trace-based Alert", - "traces_based_alert_desc": "Send a notification when a condition occurs in traces data." + "traces_based_alert_desc": "Send a notification when a condition occurs in the traces data.", + "exceptions_based_alert": "Exceptions-based Alert", + "exceptions_based_alert_desc": "Send a notification when a condition occurs in the exceptions data." } \ No newline at end of file diff --git a/frontend/src/container/CreateAlertRule/SelectAlertType/index.tsx b/frontend/src/container/CreateAlertRule/SelectAlertType/index.tsx index e892f3ac22..cc2da48727 100644 --- a/frontend/src/container/CreateAlertRule/SelectAlertType/index.tsx +++ b/frontend/src/container/CreateAlertRule/SelectAlertType/index.tsx @@ -1,8 +1,9 @@ +import { Row } from 'antd'; import React from 'react'; import { useTranslation } from 'react-i18next'; import { AlertTypes } from 'types/api/alerts/alertTypes'; -import { AlertTypeCard, AlertTypeCards, SelectTypeContainer } from './styles'; +import { AlertTypeCard, SelectTypeContainer } from './styles'; interface OptionType { title: string; @@ -30,6 +31,11 @@ function SelectAlertType({ onSelect }: SelectAlertTypeProps): JSX.Element { selection: AlertTypes.TRACES_BASED_ALERT, description: t('traces_based_alert_desc'), }, + { + title: t('exceptions_based_alert'), + selection: AlertTypes.EXCEPTIONS_BASED_ALERT, + description: t('exceptions_based_alert_desc'), + }, ]; return ( <> @@ -50,7 +56,7 @@ function SelectAlertType({ onSelect }: SelectAlertTypeProps): JSX.Element { return (

{t('choose_alert_type')}

- {renderOptions()} + {renderOptions()}
); } diff --git a/frontend/src/container/CreateAlertRule/SelectAlertType/styles.ts b/frontend/src/container/CreateAlertRule/SelectAlertType/styles.ts index 9cbde02b5f..9c3323aea3 100644 --- a/frontend/src/container/CreateAlertRule/SelectAlertType/styles.ts +++ b/frontend/src/container/CreateAlertRule/SelectAlertType/styles.ts @@ -1,4 +1,4 @@ -import { Card, Row } from 'antd'; +import { Card } from 'antd'; import styled from 'styled-components'; export const SelectTypeContainer = styled.div` @@ -7,12 +7,6 @@ export const SelectTypeContainer = styled.div` } `; -export const AlertTypeCards = styled(Row)` - &&& { - flex-wrap: nowrap; - } -`; - export const AlertTypeCard = styled(Card)` &&& { margin: 5px; diff --git a/frontend/src/container/CreateAlertRule/defaults.ts b/frontend/src/container/CreateAlertRule/defaults.ts index 0172fcdff2..645d1ff454 100644 --- a/frontend/src/container/CreateAlertRule/defaults.ts +++ b/frontend/src/container/CreateAlertRule/defaults.ts @@ -117,8 +117,8 @@ export const traceAlertDefaults: AlertDef = { chQueries: { A: { name: 'A', - rawQuery: `SELECT \n\tcount() as value,\n\ttoStartOfInterval(timestamp, toIntervalMinute(1)) AS interval,\n\tserviceName\nFROM signoz_traces.signoz_error_index_v2\nWHERE exceptionType !='OSError'\nAND timestamp BETWEEN {{.start_datetime}} AND {{.end_datetime}}\nGROUP BY serviceName, interval;\n\n-- available variables:\n-- \t{{.start_datetime}}\n-- \t{{.end_datetime}}\n\n-- required column alias:\n-- \tvalue\n-- \tinterval`, - query: `SELECT \n\tcount() as value,\n\ttoStartOfInterval(timestamp, toIntervalMinute(1)) AS interval,\n\tserviceName\nFROM signoz_traces.signoz_error_index_v2\nWHERE exceptionType !='OSError'\nAND timestamp BETWEEN {{.start_datetime}} AND {{.end_datetime}}\nGROUP BY serviceName, interval;\n\n-- available variables:\n-- \t{{.start_datetime}}\n-- \t{{.end_datetime}}\n\n-- required column alias:\n-- \tvalue\n-- \tinterval`, + rawQuery: `SELECT \n\ttoStartOfInterval(timestamp, INTERVAL 1 MINUTE) AS interval, \n\ttagMap['peer.service'] AS op_name, \n\ttoFloat64(avg(durationNano)) AS value \nFROM signoz_traces.signoz_index_v2 \nWHERE tagMap['peer.service']!='' \nAND timestamp BETWEEN {{.start_datetime}} AND {{.end_datetime}} \nGROUP BY (op_name, interval);\n\n-- available variables:\n-- \t{{.start_datetime}}\n-- \t{{.end_datetime}}\n\n-- required column alias:\n-- \tvalue\n-- \tinterval`, + query: `SELECT \n\ttoStartOfInterval(timestamp, INTERVAL 1 MINUTE) AS interval, \n\ttagMap['peer.service'] AS op_name, \n\ttoFloat64(avg(durationNano)) AS value \nFROM signoz_traces.signoz_index_v2 \nWHERE tagMap['peer.service']!='' \nAND timestamp BETWEEN {{.start_datetime}} AND {{.end_datetime}} \nGROUP BY (op_name, interval);\n\n-- available variables:\n-- \t{{.start_datetime}}\n-- \t{{.end_datetime}}\n\n-- required column alias:\n-- \tvalue\n-- \tinterval`, legend: '', disabled: false, }, @@ -137,3 +137,50 @@ export const traceAlertDefaults: AlertDef = { }, evalWindow: defaultEvalWindow, }; + +export const exceptionAlertDefaults: AlertDef = { + alertType: AlertTypes.EXCEPTIONS_BASED_ALERT, + condition: { + compositeMetricQuery: { + builderQueries: { + A: { + queryName: 'A', + name: 'A', + formulaOnly: false, + metricName: '', + tagFilters: { + op: 'AND', + items: [], + }, + groupBy: [], + aggregateOperator: 1, + expression: 'A', + disabled: false, + toggleDisable: false, + toggleDelete: false, + }, + }, + promQueries: {}, + chQueries: { + A: { + name: 'A', + rawQuery: `SELECT \n\tcount() as value,\n\ttoStartOfInterval(timestamp, toIntervalMinute(1)) AS interval,\n\tserviceName\nFROM signoz_traces.signoz_error_index_v2\nWHERE exceptionType !='OSError'\nAND timestamp BETWEEN {{.start_datetime}} AND {{.end_datetime}}\nGROUP BY serviceName, interval;\n\n-- available variables:\n-- \t{{.start_datetime}}\n-- \t{{.end_datetime}}\n\n-- required column alias:\n-- \tvalue\n-- \tinterval`, + query: `SELECT \n\tcount() as value,\n\ttoStartOfInterval(timestamp, toIntervalMinute(1)) AS interval,\n\tserviceName\nFROM signoz_traces.signoz_error_index_v2\nWHERE exceptionType !='OSError'\nAND timestamp BETWEEN {{.start_datetime}} AND {{.end_datetime}}\nGROUP BY serviceName, interval;\n\n-- available variables:\n-- \t{{.start_datetime}}\n-- \t{{.end_datetime}}\n\n-- required column alias:\n-- \tvalue\n-- \tinterval`, + legend: '', + disabled: false, + }, + }, + queryType: 2, + }, + op: defaultCompareOp, + matchType: '4', + }, + labels: { + severity: 'warning', + details: `${window.location.protocol}//${window.location.host}/exceptions`, + }, + annotations: { + description: 'A new exceptions-based alert', + }, + evalWindow: defaultEvalWindow, +}; diff --git a/frontend/src/container/CreateAlertRule/index.tsx b/frontend/src/container/CreateAlertRule/index.tsx index 101b0cae1b..ae3d21897e 100644 --- a/frontend/src/container/CreateAlertRule/index.tsx +++ b/frontend/src/container/CreateAlertRule/index.tsx @@ -5,6 +5,7 @@ import { AlertTypes } from 'types/api/alerts/alertTypes'; import { alertDefaults, + exceptionAlertDefaults, logAlertDefaults, traceAlertDefaults, } from './defaults'; @@ -27,6 +28,9 @@ function CreateRules(): JSX.Element { case AlertTypes.TRACES_BASED_ALERT: setInitValues(traceAlertDefaults); break; + case AlertTypes.EXCEPTIONS_BASED_ALERT: + setInitValues(exceptionAlertDefaults); + break; default: setInitValues(alertDefaults); } diff --git a/frontend/src/container/FormAlertRules/QuerySection.tsx b/frontend/src/container/FormAlertRules/QuerySection.tsx index c7b4053c6e..b5cf9574bd 100644 --- a/frontend/src/container/FormAlertRules/QuerySection.tsx +++ b/frontend/src/container/FormAlertRules/QuerySection.tsx @@ -292,6 +292,7 @@ function QuerySection({ switch (typ) { case AlertTypes.TRACES_BASED_ALERT: case AlertTypes.LOGS_BASED_ALERT: + case AlertTypes.EXCEPTIONS_BASED_ALERT: return ( { - console.log('c:', c[key]); chQueryList.push({ ...c[key], name: key, rawQuery: c[key].query }); }); } diff --git a/frontend/src/types/api/alerts/alertTypes.ts b/frontend/src/types/api/alerts/alertTypes.ts index ed80bb5168..b8ec9f38ef 100644 --- a/frontend/src/types/api/alerts/alertTypes.ts +++ b/frontend/src/types/api/alerts/alertTypes.ts @@ -4,4 +4,5 @@ export enum AlertTypes { METRICS_BASED_ALERT = 'METRIC_BASED_ALERT', LOGS_BASED_ALERT = 'LOGS_BASED_ALERT', TRACES_BASED_ALERT = 'TRACES_BASED_ALERT', + EXCEPTIONS_BASED_ALERT = 'EXCEPTIONS_BASED_ALERT', }