main
ts 122 lines 3.17 KB
Raw
1 import type { AlertsByHost, AlertsByRule, AlertsByRulePerHost, AlertsSummary } from "@/types/alerts.d"
2 import type { FlaskBaseResponse } from "@/types/flask.d"
3 import { HttpClient } from "../httpClient"
4
5 export type AlertsQueryTimeRange = `${number}${"h" | "d" | "w"}`
6
7 export interface GraylogAlertsQuery {
8 size: number
9 timerange: AlertsQueryTimeRange
10 index_prefix: string
11 }
12
13 interface AlertsQuery {
14 size: number
15 timerange: AlertsQueryTimeRange
16 alert_field?: string
17 alert_value?: string
18 timestamp_field: "timestamp_utc"
19 agent_name?: string
20 index_name?: string
21 }
22
23 export interface AlertsSummaryQuery {
24 agentHostname?: string
25 indexName?: string
26 maxAlerts?: number
27 timerange?: AlertsQueryTimeRange
28 alertField?: string
29 alertValue?: string
30 }
31
32 function getQueryByFilter(filter?: AlertsSummaryQuery): AlertsQuery {
33 const query: AlertsQuery = {
34 size: filter?.maxAlerts || 10,
35 timerange: filter?.timerange || "24h",
36 timestamp_field: "timestamp_utc"
37 }
38
39 filter?.agentHostname && (query.agent_name = filter.agentHostname)
40 filter?.indexName && (query.index_name = filter.indexName)
41
42 if (filter?.alertField && filter?.alertValue) {
43 query.alert_field = filter.alertField
44 query.alert_value = filter.alertValue
45 }
46
47 return query
48 }
49
50 function getGraylogQueryByFilter(filter?: Partial<GraylogAlertsQuery>): GraylogAlertsQuery {
51 const query: GraylogAlertsQuery = {
52 size: filter?.size || 10,
53 timerange: filter?.timerange || "24h",
54 index_prefix: "gl-events*"
55 }
56
57 return query
58 }
59
60 export default {
61 getGraylogAlertsList(filter?: Partial<GraylogAlertsQuery>, signal?: AbortSignal) {
62 const query = getGraylogQueryByFilter(filter)
63
64 return HttpClient.post<FlaskBaseResponse & { alerts_summary: AlertsSummary[] }>(
65 `/alerts/alerts/graylog`,
66 query,
67 signal ? { signal } : {}
68 )
69 },
70 getAll(filter?: AlertsSummaryQuery, signal?: AbortSignal) {
71 const query = getQueryByFilter(filter)
72
73 let url = "/alerts"
74
75 if (filter?.agentHostname) {
76 url = "/alerts/host"
77 }
78 if (filter?.indexName) {
79 url = "/alerts/index"
80 }
81
82 return HttpClient.post<FlaskBaseResponse & { alerts_summary: AlertsSummary[] }>(
83 url,
84 query,
85 signal ? { signal } : {}
86 )
87 },
88 getCountByHost(filter?: AlertsSummaryQuery, signal?: AbortSignal) {
89 const query = getQueryByFilter(filter)
90 return HttpClient.post<FlaskBaseResponse & { alerts_by_host: AlertsByHost[] }>(
91 `/alerts/hosts/all`,
92 query,
93 signal ? { signal } : {}
94 )
95 },
96 getCountByRule(filter?: AlertsSummaryQuery, signal?: AbortSignal) {
97 const query = getQueryByFilter(filter)
98 return HttpClient.post<FlaskBaseResponse & { alerts_by_rule: AlertsByRule[] }>(
99 `/alerts/rules/all`,
100 query,
101 signal ? { signal } : {}
102 )
103 },
104 getCountByRuleHost(filter?: AlertsSummaryQuery, signal?: AbortSignal) {
105 const query = getQueryByFilter(filter)
106 return HttpClient.post<FlaskBaseResponse & { alerts_by_rule_per_host: AlertsByRulePerHost[] }>(
107 `/alerts/rules/hosts/all`,
108 query,
109 signal ? { signal } : {}
110 )
111 },
112 create(indexName: string, alertId: string) {
113 const body = {
114 index_name: indexName,
115 alert_id: alertId
116 }
117 return HttpClient.post<FlaskBaseResponse & { alert_id: number; alert_url: string }>(
118 `/incidents/alerts/create/manual`,
119 body
120 )
121 }
122 }