-
Notifications
You must be signed in to change notification settings - Fork 8k
/
get_health.ts
99 lines (88 loc) · 3.24 KB
/
get_health.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
import { ISavedObjectsRepository } from 'src/core/server';
import { AlertsHealth, HealthStatus, RawAlert, AlertExecutionStatusErrorReasons } from '../types';
export const getHealth = async (
internalSavedObjectsRepository: ISavedObjectsRepository
): Promise<AlertsHealth> => {
const healthStatuses = {
decryptionHealth: {
status: HealthStatus.OK,
timestamp: '',
},
executionHealth: {
status: HealthStatus.OK,
timestamp: '',
},
readHealth: {
status: HealthStatus.OK,
timestamp: '',
},
};
const { saved_objects: decryptErrorData } = await internalSavedObjectsRepository.find<RawAlert>({
filter: `alert.attributes.executionStatus.status:error and alert.attributes.executionStatus.error.reason:${AlertExecutionStatusErrorReasons.Decrypt}`,
fields: ['executionStatus'],
type: 'alert',
sortField: 'executionStatus.lastExecutionDate',
sortOrder: 'desc',
page: 1,
perPage: 1,
});
if (decryptErrorData.length > 0) {
healthStatuses.decryptionHealth = {
status: HealthStatus.Warning,
timestamp: decryptErrorData[0].attributes.executionStatus.lastExecutionDate,
};
}
const { saved_objects: executeErrorData } = await internalSavedObjectsRepository.find<RawAlert>({
filter: `alert.attributes.executionStatus.status:error and alert.attributes.executionStatus.error.reason:${AlertExecutionStatusErrorReasons.Execute}`,
fields: ['executionStatus'],
type: 'alert',
sortField: 'executionStatus.lastExecutionDate',
sortOrder: 'desc',
page: 1,
perPage: 1,
});
if (executeErrorData.length > 0) {
healthStatuses.executionHealth = {
status: HealthStatus.Warning,
timestamp: executeErrorData[0].attributes.executionStatus.lastExecutionDate,
};
}
const { saved_objects: readErrorData } = await internalSavedObjectsRepository.find<RawAlert>({
filter: `alert.attributes.executionStatus.status:error and alert.attributes.executionStatus.error.reason:${AlertExecutionStatusErrorReasons.Read}`,
fields: ['executionStatus'],
type: 'alert',
sortField: 'executionStatus.lastExecutionDate',
sortOrder: 'desc',
page: 1,
perPage: 1,
});
if (readErrorData.length > 0) {
healthStatuses.readHealth = {
status: HealthStatus.Warning,
timestamp: readErrorData[0].attributes.executionStatus.lastExecutionDate,
};
}
const { saved_objects: noErrorData } = await internalSavedObjectsRepository.find<RawAlert>({
filter: 'not alert.attributes.executionStatus.status:error',
fields: ['executionStatus'],
type: 'alert',
sortField: 'executionStatus.lastExecutionDate',
sortOrder: 'desc',
});
const lastExecutionDate =
noErrorData.length > 0
? noErrorData[0].attributes.executionStatus.lastExecutionDate
: new Date().toISOString();
for (const [, statusItem] of Object.entries(healthStatuses)) {
if (statusItem.status === HealthStatus.OK) {
statusItem.timestamp = lastExecutionDate;
}
}
return healthStatuses;
};