@oneuptime/common 8.0.5516 → 8.0.5544
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Models/DatabaseModels/AcmeChallenge.ts +3 -0
- package/Models/DatabaseModels/Domain.ts +6 -1
- package/Server/API/AcmeChallengeAPI.ts +64 -0
- package/Server/EnvironmentConfig.ts +54 -0
- package/Server/Infrastructure/Queue.ts +12 -16
- package/Server/Infrastructure/QueueWorker.ts +2 -6
- package/Server/Services/DomainService.ts +48 -40
- package/Server/Utils/AnalyticsDatabase/Statement.ts +8 -4
- package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +47 -15
- package/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.ts +13 -12
- package/Server/Utils/Monitor/MonitorAlert.ts +46 -1
- package/Server/Utils/Monitor/MonitorCriteriaDataExtractor.ts +208 -0
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +439 -0
- package/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.ts +141 -0
- package/Server/Utils/Monitor/MonitorCriteriaMessageBuilder.ts +88 -0
- package/Server/Utils/Monitor/MonitorCriteriaMessageFormatter.ts +196 -0
- package/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.ts +1123 -0
- package/Server/Utils/Monitor/MonitorIncident.ts +46 -1
- package/Server/Utils/Monitor/MonitorLogUtil.ts +44 -0
- package/Server/Utils/Monitor/MonitorMetricUtil.ts +482 -0
- package/Server/Utils/Monitor/MonitorResource.ts +185 -914
- package/Server/Utils/StartServer.ts +14 -6
- package/Types/Email.ts +3 -7
- package/Types/Monitor/IncomingMonitor/IncomingMonitorRequest.ts +2 -0
- package/Types/Monitor/LogMonitor/LogMonitorResponse.ts +2 -0
- package/Types/Monitor/MetricMonitor/MetricMonitorResponse.ts +2 -0
- package/Types/Monitor/MonitorEvaluationSummary.ts +48 -0
- package/Types/Monitor/ServerMonitor/ServerMonitorResponse.ts +2 -0
- package/Types/Monitor/TraceMonitor/TraceMonitorResponse.ts +2 -0
- package/Types/Probe/ProbeApiIngestResponse.ts +2 -0
- package/Types/Probe/ProbeMonitorResponse.ts +2 -0
- package/build/dist/Models/DatabaseModels/AcmeChallenge.js +3 -0
- package/build/dist/Models/DatabaseModels/AcmeChallenge.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Domain.js +6 -1
- package/build/dist/Models/DatabaseModels/Domain.js.map +1 -1
- package/build/dist/Server/API/AcmeChallengeAPI.js +39 -0
- package/build/dist/Server/API/AcmeChallengeAPI.js.map +1 -0
- package/build/dist/Server/EnvironmentConfig.js +44 -0
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Queue.js +8 -11
- package/build/dist/Server/Infrastructure/Queue.js.map +1 -1
- package/build/dist/Server/Infrastructure/QueueWorker.js +2 -6
- package/build/dist/Server/Infrastructure/QueueWorker.js.map +1 -1
- package/build/dist/Server/Services/DomainService.js +31 -29
- package/build/dist/Server/Services/DomainService.js.map +1 -1
- package/build/dist/Server/Utils/AnalyticsDatabase/Statement.js +2 -1
- package/build/dist/Server/Utils/AnalyticsDatabase/Statement.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +34 -16
- package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.js +12 -12
- package/build/dist/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +42 -4
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaDataExtractor.js +119 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaDataExtractor.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +312 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.js +109 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaMessageBuilder.js +45 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaMessageBuilder.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaMessageFormatter.js +132 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaMessageFormatter.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js +583 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js +42 -4
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorLogUtil.js +32 -0
- package/build/dist/Server/Utils/Monitor/MonitorLogUtil.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +361 -0
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorResource.js +133 -666
- package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
- package/build/dist/Server/Utils/StartServer.js +7 -4
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Types/Email.js +2 -5
- package/build/dist/Types/Email.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorEvaluationSummary.js +2 -0
- package/build/dist/Types/Monitor/MonitorEvaluationSummary.js.map +1 -0
- package/package.json +5 -5
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import DataToProcess from "./DataToProcess";
|
|
2
|
+
import ProbeMonitorResponse from "../../../Types/Probe/ProbeMonitorResponse";
|
|
3
|
+
import ServerMonitorResponse from "../../../Types/Monitor/ServerMonitor/ServerMonitorResponse";
|
|
4
|
+
import IncomingMonitorRequest from "../../../Types/Monitor/IncomingMonitor/IncomingMonitorRequest";
|
|
5
|
+
import LogMonitorResponse from "../../../Types/Monitor/LogMonitor/LogMonitorResponse";
|
|
6
|
+
import TraceMonitorResponse from "../../../Types/Monitor/TraceMonitor/TraceMonitorResponse";
|
|
7
|
+
import MetricMonitorResponse from "../../../Types/Monitor/MetricMonitor/MetricMonitorResponse";
|
|
8
|
+
import CustomCodeMonitorResponse from "../../../Types/Monitor/CustomCodeMonitor/CustomCodeMonitorResponse";
|
|
9
|
+
import SyntheticMonitorResponse from "../../../Types/Monitor/SyntheticMonitors/SyntheticMonitorResponse";
|
|
10
|
+
import SslMonitorResponse from "../../../Types/Monitor/SSLMonitor/SslMonitorResponse";
|
|
11
|
+
import MonitorStep from "../../../Types/Monitor/MonitorStep";
|
|
12
|
+
import { CriteriaFilter } from "../../../Types/Monitor/CriteriaFilter";
|
|
13
|
+
import AggregatedResult from "../../../Types/BaseDatabase/AggregatedResult";
|
|
14
|
+
import AggregateModel from "../../../Types/BaseDatabase/AggregatedModel";
|
|
15
|
+
import MetricQueryConfigData from "../../../Types/Metrics/MetricQueryConfigData";
|
|
16
|
+
import MetricFormulaConfigData from "../../../Types/Metrics/MetricFormulaConfigData";
|
|
17
|
+
|
|
18
|
+
export default class MonitorCriteriaDataExtractor {
|
|
19
|
+
public static getProbeMonitorResponse(
|
|
20
|
+
dataToProcess: DataToProcess,
|
|
21
|
+
): ProbeMonitorResponse | null {
|
|
22
|
+
if ((dataToProcess as ProbeMonitorResponse).monitorStepId) {
|
|
23
|
+
return dataToProcess as ProbeMonitorResponse;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
public static getServerMonitorResponse(
|
|
30
|
+
dataToProcess: DataToProcess,
|
|
31
|
+
): ServerMonitorResponse | null {
|
|
32
|
+
if ((dataToProcess as ServerMonitorResponse).hostname) {
|
|
33
|
+
return dataToProcess as ServerMonitorResponse;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
public static getIncomingMonitorRequest(
|
|
40
|
+
dataToProcess: DataToProcess,
|
|
41
|
+
): IncomingMonitorRequest | null {
|
|
42
|
+
if (
|
|
43
|
+
(dataToProcess as IncomingMonitorRequest).incomingRequestReceivedAt !==
|
|
44
|
+
undefined
|
|
45
|
+
) {
|
|
46
|
+
return dataToProcess as IncomingMonitorRequest;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
public static getLogMonitorResponse(
|
|
53
|
+
dataToProcess: DataToProcess,
|
|
54
|
+
): LogMonitorResponse | null {
|
|
55
|
+
if ((dataToProcess as LogMonitorResponse).logCount !== undefined) {
|
|
56
|
+
return dataToProcess as LogMonitorResponse;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
public static getTraceMonitorResponse(
|
|
63
|
+
dataToProcess: DataToProcess,
|
|
64
|
+
): TraceMonitorResponse | null {
|
|
65
|
+
if ((dataToProcess as TraceMonitorResponse).spanCount !== undefined) {
|
|
66
|
+
return dataToProcess as TraceMonitorResponse;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
public static getMetricMonitorResponse(
|
|
73
|
+
dataToProcess: DataToProcess,
|
|
74
|
+
): MetricMonitorResponse | null {
|
|
75
|
+
if ((dataToProcess as MetricMonitorResponse).metricResult !== undefined) {
|
|
76
|
+
return dataToProcess as MetricMonitorResponse;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
public static getCustomCodeMonitorResponse(
|
|
83
|
+
dataToProcess: DataToProcess,
|
|
84
|
+
): CustomCodeMonitorResponse | null {
|
|
85
|
+
const probeResponse: ProbeMonitorResponse | null =
|
|
86
|
+
MonitorCriteriaDataExtractor.getProbeMonitorResponse(dataToProcess);
|
|
87
|
+
|
|
88
|
+
if (probeResponse?.customCodeMonitorResponse) {
|
|
89
|
+
return probeResponse.customCodeMonitorResponse;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
public static getSyntheticMonitorResponses(
|
|
96
|
+
dataToProcess: DataToProcess,
|
|
97
|
+
): Array<SyntheticMonitorResponse> {
|
|
98
|
+
const probeResponse: ProbeMonitorResponse | null =
|
|
99
|
+
MonitorCriteriaDataExtractor.getProbeMonitorResponse(dataToProcess);
|
|
100
|
+
|
|
101
|
+
return probeResponse?.syntheticMonitorResponse || [];
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
public static getSslResponse(
|
|
105
|
+
dataToProcess: DataToProcess,
|
|
106
|
+
): SslMonitorResponse | null {
|
|
107
|
+
const probeResponse: ProbeMonitorResponse | null =
|
|
108
|
+
MonitorCriteriaDataExtractor.getProbeMonitorResponse(dataToProcess);
|
|
109
|
+
|
|
110
|
+
if (probeResponse?.sslResponse) {
|
|
111
|
+
return probeResponse.sslResponse;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
public static extractMetricValues(input: {
|
|
118
|
+
criteriaFilter: CriteriaFilter;
|
|
119
|
+
dataToProcess: DataToProcess;
|
|
120
|
+
monitorStep: MonitorStep;
|
|
121
|
+
}): { alias: string | null; values: Array<number> } | null {
|
|
122
|
+
const metricResponse: MetricMonitorResponse | null =
|
|
123
|
+
MonitorCriteriaDataExtractor.getMetricMonitorResponse(
|
|
124
|
+
input.dataToProcess,
|
|
125
|
+
);
|
|
126
|
+
|
|
127
|
+
if (!metricResponse) {
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
const aggregatedResults: Array<AggregatedResult> =
|
|
132
|
+
metricResponse.metricResult || [];
|
|
133
|
+
|
|
134
|
+
if (!aggregatedResults.length) {
|
|
135
|
+
return {
|
|
136
|
+
alias: input.criteriaFilter.metricMonitorOptions?.metricAlias || null,
|
|
137
|
+
values: [],
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
let alias: string | null =
|
|
142
|
+
input.criteriaFilter.metricMonitorOptions?.metricAlias || null;
|
|
143
|
+
|
|
144
|
+
let result: AggregatedResult | undefined;
|
|
145
|
+
|
|
146
|
+
if (alias) {
|
|
147
|
+
const queryConfigs: Array<MetricQueryConfigData> =
|
|
148
|
+
input.monitorStep.data?.metricMonitor?.metricViewConfig?.queryConfigs ||
|
|
149
|
+
[];
|
|
150
|
+
|
|
151
|
+
let aliasIndex: number = queryConfigs.findIndex(
|
|
152
|
+
(queryConfig: MetricQueryConfigData) => {
|
|
153
|
+
return queryConfig.metricAliasData?.metricVariable === alias;
|
|
154
|
+
},
|
|
155
|
+
);
|
|
156
|
+
|
|
157
|
+
if (aliasIndex < 0) {
|
|
158
|
+
const formulaConfigs: Array<MetricFormulaConfigData> =
|
|
159
|
+
input.monitorStep.data?.metricMonitor?.metricViewConfig
|
|
160
|
+
?.formulaConfigs || [];
|
|
161
|
+
|
|
162
|
+
const formulaIndex: number = formulaConfigs.findIndex(
|
|
163
|
+
(formulaConfig: MetricFormulaConfigData) => {
|
|
164
|
+
return formulaConfig.metricAliasData?.metricVariable === alias;
|
|
165
|
+
},
|
|
166
|
+
);
|
|
167
|
+
|
|
168
|
+
if (formulaIndex >= 0) {
|
|
169
|
+
aliasIndex = queryConfigs.length + formulaIndex;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
if (aliasIndex >= 0 && aliasIndex < aggregatedResults.length) {
|
|
174
|
+
result = aggregatedResults[aliasIndex];
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
if (!result) {
|
|
179
|
+
result = aggregatedResults[0];
|
|
180
|
+
if (!alias) {
|
|
181
|
+
const defaultAlias: string | undefined =
|
|
182
|
+
input.monitorStep.data?.metricMonitor?.metricViewConfig
|
|
183
|
+
?.queryConfigs?.[0]?.metricAliasData?.metricVariable;
|
|
184
|
+
alias = defaultAlias || null;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
if (!result) {
|
|
189
|
+
return {
|
|
190
|
+
alias: alias,
|
|
191
|
+
values: [],
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
const values: Array<number> = result.data
|
|
196
|
+
.map((entry: AggregateModel) => {
|
|
197
|
+
return entry.value;
|
|
198
|
+
})
|
|
199
|
+
.filter((value: number) => {
|
|
200
|
+
return typeof value === "number" && !isNaN(value);
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
return {
|
|
204
|
+
alias: alias,
|
|
205
|
+
values: values,
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
}
|
|
@@ -0,0 +1,439 @@
|
|
|
1
|
+
import logger from "../Logger";
|
|
2
|
+
import VMUtil from "../VM/VMAPI";
|
|
3
|
+
import APIRequestCriteria from "./Criteria/APIRequestCriteria";
|
|
4
|
+
import CustomCodeMonitoringCriteria from "./Criteria/CustomCodeMonitorCriteria";
|
|
5
|
+
import IncomingRequestCriteria from "./Criteria/IncomingRequestCriteria";
|
|
6
|
+
import SSLMonitorCriteria from "./Criteria/SSLMonitorCriteria";
|
|
7
|
+
import ServerMonitorCriteria from "./Criteria/ServerMonitorCriteria";
|
|
8
|
+
import SyntheticMonitoringCriteria from "./Criteria/SyntheticMonitor";
|
|
9
|
+
import LogMonitorCriteria from "./Criteria/LogMonitorCriteria";
|
|
10
|
+
import MetricMonitorCriteria from "./Criteria/MetricMonitorCriteria";
|
|
11
|
+
import TraceMonitorCriteria from "./Criteria/TraceMonitorCriteria";
|
|
12
|
+
import MonitorCriteriaMessageBuilder from "./MonitorCriteriaMessageBuilder";
|
|
13
|
+
import DataToProcess from "./DataToProcess";
|
|
14
|
+
import Monitor from "../../../Models/DatabaseModels/Monitor";
|
|
15
|
+
import MonitorCriteria from "../../../Types/Monitor/MonitorCriteria";
|
|
16
|
+
import MonitorCriteriaInstance from "../../../Types/Monitor/MonitorCriteriaInstance";
|
|
17
|
+
import MonitorStep from "../../../Types/Monitor/MonitorStep";
|
|
18
|
+
import FilterCondition from "../../../Types/Filter/FilterCondition";
|
|
19
|
+
import MonitorEvaluationSummary, {
|
|
20
|
+
MonitorEvaluationCriteriaResult,
|
|
21
|
+
MonitorEvaluationEvent,
|
|
22
|
+
MonitorEvaluationFilterResult,
|
|
23
|
+
} from "../../../Types/Monitor/MonitorEvaluationSummary";
|
|
24
|
+
import ProbeApiIngestResponse from "../../../Types/Probe/ProbeApiIngestResponse";
|
|
25
|
+
import ProbeMonitorResponse from "../../../Types/Probe/ProbeMonitorResponse";
|
|
26
|
+
import IncomingMonitorRequest from "../../../Types/Monitor/IncomingMonitor/IncomingMonitorRequest";
|
|
27
|
+
import MonitorType from "../../../Types/Monitor/MonitorType";
|
|
28
|
+
import { CheckOn, CriteriaFilter } from "../../../Types/Monitor/CriteriaFilter";
|
|
29
|
+
import OneUptimeDate from "../../../Types/Date";
|
|
30
|
+
import { JSONObject } from "../../../Types/JSON";
|
|
31
|
+
import Typeof from "../../../Types/Typeof";
|
|
32
|
+
import ReturnResult from "../../../Types/IsolatedVM/ReturnResult";
|
|
33
|
+
|
|
34
|
+
export default class MonitorCriteriaEvaluator {
|
|
35
|
+
public static async processMonitorStep(input: {
|
|
36
|
+
dataToProcess: DataToProcess;
|
|
37
|
+
monitorStep: MonitorStep;
|
|
38
|
+
monitor: Monitor;
|
|
39
|
+
probeApiIngestResponse: ProbeApiIngestResponse;
|
|
40
|
+
evaluationSummary: MonitorEvaluationSummary;
|
|
41
|
+
}): Promise<ProbeApiIngestResponse> {
|
|
42
|
+
const criteria: MonitorCriteria | undefined =
|
|
43
|
+
input.monitorStep.data?.monitorCriteria;
|
|
44
|
+
|
|
45
|
+
if (!criteria || !criteria.data) {
|
|
46
|
+
return input.probeApiIngestResponse;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
for (const criteriaInstance of criteria.data.monitorCriteriaInstanceArray) {
|
|
50
|
+
const criteriaResult: MonitorEvaluationCriteriaResult = {
|
|
51
|
+
criteriaId: criteriaInstance.data?.id,
|
|
52
|
+
criteriaName: criteriaInstance.data?.name,
|
|
53
|
+
filterCondition:
|
|
54
|
+
criteriaInstance.data?.filterCondition || FilterCondition.All,
|
|
55
|
+
met: false,
|
|
56
|
+
message: "",
|
|
57
|
+
filters: [],
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
input.evaluationSummary.criteriaResults.push(criteriaResult);
|
|
61
|
+
|
|
62
|
+
const rootCause: string | null =
|
|
63
|
+
await MonitorCriteriaEvaluator.processMonitorCriteriaInstance({
|
|
64
|
+
dataToProcess: input.dataToProcess,
|
|
65
|
+
monitorStep: input.monitorStep,
|
|
66
|
+
monitor: input.monitor,
|
|
67
|
+
probeApiIngestResponse: input.probeApiIngestResponse,
|
|
68
|
+
criteriaInstance: criteriaInstance,
|
|
69
|
+
criteriaResult: criteriaResult,
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
if (!criteriaResult.message) {
|
|
73
|
+
criteriaResult.message = criteriaResult.met
|
|
74
|
+
? "Criteria met."
|
|
75
|
+
: "Criteria was not met.";
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const criteriaEvent: MonitorEvaluationEvent = {
|
|
79
|
+
type: criteriaResult.met ? "criteria-met" : "criteria-not-met",
|
|
80
|
+
title: `${criteriaResult.met ? "Criteria met" : "Criteria not met"}: ${criteriaResult.criteriaName || "Unnamed criteria"}`,
|
|
81
|
+
message: criteriaResult.message,
|
|
82
|
+
relatedCriteriaId: criteriaResult.criteriaId,
|
|
83
|
+
at: OneUptimeDate.getCurrentDate(),
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
input.evaluationSummary.events.push(criteriaEvent);
|
|
87
|
+
|
|
88
|
+
if (rootCause) {
|
|
89
|
+
input.probeApiIngestResponse.criteriaMetId = criteriaInstance.data?.id;
|
|
90
|
+
input.probeApiIngestResponse.rootCause = `
|
|
91
|
+
**Created because the following criteria was met**:
|
|
92
|
+
|
|
93
|
+
**Criteria Name**: ${criteriaInstance.data?.name}
|
|
94
|
+
`;
|
|
95
|
+
|
|
96
|
+
input.probeApiIngestResponse.rootCause += `
|
|
97
|
+
**Filter Conditions Met**: ${rootCause}
|
|
98
|
+
`;
|
|
99
|
+
|
|
100
|
+
if ((input.dataToProcess as ProbeMonitorResponse).failureCause) {
|
|
101
|
+
input.probeApiIngestResponse.rootCause += `
|
|
102
|
+
**Cause**: ${(input.dataToProcess as ProbeMonitorResponse).failureCause || ""}
|
|
103
|
+
`;
|
|
104
|
+
}
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
return input.probeApiIngestResponse;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
private static async processMonitorCriteriaInstance(input: {
|
|
113
|
+
dataToProcess: DataToProcess;
|
|
114
|
+
monitorStep: MonitorStep;
|
|
115
|
+
monitor: Monitor;
|
|
116
|
+
probeApiIngestResponse: ProbeApiIngestResponse;
|
|
117
|
+
criteriaInstance: MonitorCriteriaInstance;
|
|
118
|
+
criteriaResult: MonitorEvaluationCriteriaResult;
|
|
119
|
+
}): Promise<string | null> {
|
|
120
|
+
return MonitorCriteriaEvaluator.isMonitorInstanceCriteriaFiltersMet({
|
|
121
|
+
dataToProcess: input.dataToProcess,
|
|
122
|
+
monitorStep: input.monitorStep,
|
|
123
|
+
monitor: input.monitor,
|
|
124
|
+
probeApiIngestResponse: input.probeApiIngestResponse,
|
|
125
|
+
criteriaInstance: input.criteriaInstance,
|
|
126
|
+
criteriaResult: input.criteriaResult,
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
private static async isMonitorInstanceCriteriaFiltersMet(input: {
|
|
131
|
+
dataToProcess: DataToProcess;
|
|
132
|
+
monitorStep: MonitorStep;
|
|
133
|
+
monitor: Monitor;
|
|
134
|
+
probeApiIngestResponse: ProbeApiIngestResponse;
|
|
135
|
+
criteriaInstance: MonitorCriteriaInstance;
|
|
136
|
+
criteriaResult: MonitorEvaluationCriteriaResult;
|
|
137
|
+
}): Promise<string | null> {
|
|
138
|
+
const filterCondition: FilterCondition =
|
|
139
|
+
input.criteriaInstance.data?.filterCondition || FilterCondition.All;
|
|
140
|
+
|
|
141
|
+
const matchedFilterMessages: Array<string> = [];
|
|
142
|
+
let hasMatch: boolean = false;
|
|
143
|
+
let allFiltersMet: boolean = true;
|
|
144
|
+
|
|
145
|
+
for (const criteriaFilter of input.criteriaInstance.data?.filters || []) {
|
|
146
|
+
const rootCause: string | null =
|
|
147
|
+
await MonitorCriteriaEvaluator.isMonitorInstanceCriteriaFilterMet({
|
|
148
|
+
dataToProcess: input.dataToProcess,
|
|
149
|
+
monitorStep: input.monitorStep,
|
|
150
|
+
monitor: input.monitor,
|
|
151
|
+
probeApiIngestResponse: input.probeApiIngestResponse,
|
|
152
|
+
criteriaInstance: input.criteriaInstance,
|
|
153
|
+
criteriaFilter: criteriaFilter,
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
const didMeetCriteria: boolean = Boolean(rootCause);
|
|
157
|
+
|
|
158
|
+
const filterMessage: string =
|
|
159
|
+
MonitorCriteriaMessageBuilder.buildCriteriaFilterMessage({
|
|
160
|
+
monitor: input.monitor,
|
|
161
|
+
criteriaFilter: criteriaFilter,
|
|
162
|
+
dataToProcess: input.dataToProcess,
|
|
163
|
+
monitorStep: input.monitorStep,
|
|
164
|
+
didMeetCriteria: didMeetCriteria,
|
|
165
|
+
matchMessage: rootCause,
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
const filterSummary: MonitorEvaluationFilterResult = {
|
|
169
|
+
checkOn: criteriaFilter.checkOn,
|
|
170
|
+
filterType: criteriaFilter.filterType,
|
|
171
|
+
value: criteriaFilter.value,
|
|
172
|
+
met: didMeetCriteria,
|
|
173
|
+
message: filterMessage,
|
|
174
|
+
};
|
|
175
|
+
|
|
176
|
+
input.criteriaResult.filters.push(filterSummary);
|
|
177
|
+
|
|
178
|
+
if (didMeetCriteria) {
|
|
179
|
+
hasMatch = true;
|
|
180
|
+
matchedFilterMessages.push(filterMessage);
|
|
181
|
+
} else if (filterCondition === FilterCondition.All) {
|
|
182
|
+
allFiltersMet = false;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
if (filterCondition === FilterCondition.All) {
|
|
187
|
+
if (allFiltersMet && input.criteriaResult.filters.length > 0) {
|
|
188
|
+
let message: string = "All filters met.";
|
|
189
|
+
|
|
190
|
+
if (matchedFilterMessages.length > 0) {
|
|
191
|
+
message += matchedFilterMessages
|
|
192
|
+
.map((item: string) => {
|
|
193
|
+
return `\n- ${item}`;
|
|
194
|
+
})
|
|
195
|
+
.join("");
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
input.criteriaResult.met = true;
|
|
199
|
+
input.criteriaResult.message = message;
|
|
200
|
+
|
|
201
|
+
return message;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
input.criteriaResult.met = false;
|
|
205
|
+
input.criteriaResult.message =
|
|
206
|
+
"One or more filters did not meet the configured conditions.";
|
|
207
|
+
|
|
208
|
+
return null;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
if (filterCondition === FilterCondition.Any) {
|
|
212
|
+
if (hasMatch) {
|
|
213
|
+
const firstMatch: string =
|
|
214
|
+
matchedFilterMessages[0] ||
|
|
215
|
+
"At least one filter met the configured condition.";
|
|
216
|
+
|
|
217
|
+
input.criteriaResult.met = true;
|
|
218
|
+
input.criteriaResult.message = firstMatch;
|
|
219
|
+
|
|
220
|
+
return firstMatch;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
input.criteriaResult.met = false;
|
|
224
|
+
input.criteriaResult.message =
|
|
225
|
+
"No filters met the configured conditions.";
|
|
226
|
+
|
|
227
|
+
return null;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
return null;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
private static async isMonitorInstanceCriteriaFilterMet(input: {
|
|
234
|
+
dataToProcess: DataToProcess;
|
|
235
|
+
monitorStep: MonitorStep;
|
|
236
|
+
monitor: Monitor;
|
|
237
|
+
probeApiIngestResponse: ProbeApiIngestResponse;
|
|
238
|
+
criteriaInstance: MonitorCriteriaInstance;
|
|
239
|
+
criteriaFilter: CriteriaFilter;
|
|
240
|
+
}): Promise<string | null> {
|
|
241
|
+
if (input.criteriaFilter.checkOn === CheckOn.JavaScriptExpression) {
|
|
242
|
+
let storageMap: JSONObject = {};
|
|
243
|
+
|
|
244
|
+
if (
|
|
245
|
+
input.monitor.monitorType === MonitorType.API ||
|
|
246
|
+
input.monitor.monitorType === MonitorType.Website
|
|
247
|
+
) {
|
|
248
|
+
let responseBody: JSONObject | null = null;
|
|
249
|
+
try {
|
|
250
|
+
responseBody = JSON.parse(
|
|
251
|
+
((input.dataToProcess as ProbeMonitorResponse)
|
|
252
|
+
.responseBody as string) || "{}",
|
|
253
|
+
);
|
|
254
|
+
} catch (err) {
|
|
255
|
+
logger.error(err);
|
|
256
|
+
responseBody = (input.dataToProcess as ProbeMonitorResponse)
|
|
257
|
+
.responseBody as JSONObject;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
if (
|
|
261
|
+
typeof responseBody === Typeof.String &&
|
|
262
|
+
responseBody?.toString() === ""
|
|
263
|
+
) {
|
|
264
|
+
responseBody = {};
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
storageMap = {
|
|
268
|
+
responseBody: responseBody,
|
|
269
|
+
responseHeaders: (input.dataToProcess as ProbeMonitorResponse)
|
|
270
|
+
.responseHeaders,
|
|
271
|
+
responseStatusCode: (input.dataToProcess as ProbeMonitorResponse)
|
|
272
|
+
.responseCode,
|
|
273
|
+
responseTimeInMs: (input.dataToProcess as ProbeMonitorResponse)
|
|
274
|
+
.responseTimeInMs,
|
|
275
|
+
isOnline: (input.dataToProcess as ProbeMonitorResponse).isOnline,
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
if (input.monitor.monitorType === MonitorType.IncomingRequest) {
|
|
280
|
+
storageMap = {
|
|
281
|
+
requestBody: (input.dataToProcess as IncomingMonitorRequest)
|
|
282
|
+
.requestBody,
|
|
283
|
+
requestHeaders: (input.dataToProcess as IncomingMonitorRequest)
|
|
284
|
+
.requestHeaders,
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
let expression: string = input.criteriaFilter.value as string;
|
|
289
|
+
expression = VMUtil.replaceValueInPlace(storageMap, expression, false);
|
|
290
|
+
|
|
291
|
+
const code: string = `return Boolean(${expression});`;
|
|
292
|
+
let result: ReturnResult | null = null;
|
|
293
|
+
|
|
294
|
+
try {
|
|
295
|
+
result = await VMUtil.runCodeInSandbox({
|
|
296
|
+
code: code,
|
|
297
|
+
options: {
|
|
298
|
+
args: {},
|
|
299
|
+
},
|
|
300
|
+
});
|
|
301
|
+
} catch (err) {
|
|
302
|
+
logger.error(err);
|
|
303
|
+
return null;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
if (result && result.returnValue) {
|
|
307
|
+
return `JavaScript Expression - ${expression} - evaluated to true.`;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
return null;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
if (
|
|
314
|
+
input.monitor.monitorType === MonitorType.API ||
|
|
315
|
+
input.monitor.monitorType === MonitorType.Website ||
|
|
316
|
+
input.monitor.monitorType === MonitorType.IP ||
|
|
317
|
+
input.monitor.monitorType === MonitorType.Ping ||
|
|
318
|
+
input.monitor.monitorType === MonitorType.Port
|
|
319
|
+
) {
|
|
320
|
+
const apiRequestCriteriaResult: string | null =
|
|
321
|
+
await APIRequestCriteria.isMonitorInstanceCriteriaFilterMet({
|
|
322
|
+
dataToProcess: input.dataToProcess,
|
|
323
|
+
criteriaFilter: input.criteriaFilter,
|
|
324
|
+
});
|
|
325
|
+
|
|
326
|
+
if (apiRequestCriteriaResult) {
|
|
327
|
+
return apiRequestCriteriaResult;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
if (
|
|
332
|
+
input.monitor.monitorType === MonitorType.CustomJavaScriptCode &&
|
|
333
|
+
(input.dataToProcess as ProbeMonitorResponse).customCodeMonitorResponse
|
|
334
|
+
) {
|
|
335
|
+
const criteriaResult: string | null =
|
|
336
|
+
await CustomCodeMonitoringCriteria.isMonitorInstanceCriteriaFilterMet({
|
|
337
|
+
monitorResponse: (input.dataToProcess as ProbeMonitorResponse)
|
|
338
|
+
.customCodeMonitorResponse!,
|
|
339
|
+
criteriaFilter: input.criteriaFilter,
|
|
340
|
+
});
|
|
341
|
+
|
|
342
|
+
if (criteriaResult) {
|
|
343
|
+
return criteriaResult;
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
if (
|
|
348
|
+
input.monitor.monitorType === MonitorType.SyntheticMonitor &&
|
|
349
|
+
(input.dataToProcess as ProbeMonitorResponse).syntheticMonitorResponse
|
|
350
|
+
) {
|
|
351
|
+
const criteriaResult: string | null =
|
|
352
|
+
await SyntheticMonitoringCriteria.isMonitorInstanceCriteriaFilterMet({
|
|
353
|
+
monitorResponse:
|
|
354
|
+
(input.dataToProcess as ProbeMonitorResponse)
|
|
355
|
+
.syntheticMonitorResponse || [],
|
|
356
|
+
criteriaFilter: input.criteriaFilter,
|
|
357
|
+
});
|
|
358
|
+
|
|
359
|
+
if (criteriaResult) {
|
|
360
|
+
return criteriaResult;
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
if (input.monitor.monitorType === MonitorType.IncomingRequest) {
|
|
365
|
+
const incomingRequestResult: string | null =
|
|
366
|
+
await IncomingRequestCriteria.isMonitorInstanceCriteriaFilterMet({
|
|
367
|
+
dataToProcess: input.dataToProcess,
|
|
368
|
+
criteriaFilter: input.criteriaFilter,
|
|
369
|
+
});
|
|
370
|
+
|
|
371
|
+
if (incomingRequestResult) {
|
|
372
|
+
return incomingRequestResult;
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
if (input.monitor.monitorType === MonitorType.SSLCertificate) {
|
|
377
|
+
const sslMonitorResult: string | null =
|
|
378
|
+
await SSLMonitorCriteria.isMonitorInstanceCriteriaFilterMet({
|
|
379
|
+
dataToProcess: input.dataToProcess,
|
|
380
|
+
criteriaFilter: input.criteriaFilter,
|
|
381
|
+
});
|
|
382
|
+
|
|
383
|
+
if (sslMonitorResult) {
|
|
384
|
+
return sslMonitorResult;
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
if (input.monitor.monitorType === MonitorType.Server) {
|
|
389
|
+
const serverMonitorResult: string | null =
|
|
390
|
+
await ServerMonitorCriteria.isMonitorInstanceCriteriaFilterMet({
|
|
391
|
+
dataToProcess: input.dataToProcess,
|
|
392
|
+
criteriaFilter: input.criteriaFilter,
|
|
393
|
+
});
|
|
394
|
+
|
|
395
|
+
if (serverMonitorResult) {
|
|
396
|
+
return serverMonitorResult;
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
if (input.monitor.monitorType === MonitorType.Logs) {
|
|
401
|
+
const logMonitorResult: string | null =
|
|
402
|
+
await LogMonitorCriteria.isMonitorInstanceCriteriaFilterMet({
|
|
403
|
+
dataToProcess: input.dataToProcess,
|
|
404
|
+
criteriaFilter: input.criteriaFilter,
|
|
405
|
+
});
|
|
406
|
+
|
|
407
|
+
if (logMonitorResult) {
|
|
408
|
+
return logMonitorResult;
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
if (input.monitor.monitorType === MonitorType.Metrics) {
|
|
413
|
+
const metricMonitorResult: string | null =
|
|
414
|
+
await MetricMonitorCriteria.isMonitorInstanceCriteriaFilterMet({
|
|
415
|
+
dataToProcess: input.dataToProcess,
|
|
416
|
+
criteriaFilter: input.criteriaFilter,
|
|
417
|
+
monitorStep: input.monitorStep,
|
|
418
|
+
});
|
|
419
|
+
|
|
420
|
+
if (metricMonitorResult) {
|
|
421
|
+
return metricMonitorResult;
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
if (input.monitor.monitorType === MonitorType.Traces) {
|
|
426
|
+
const traceMonitorResult: string | null =
|
|
427
|
+
await TraceMonitorCriteria.isMonitorInstanceCriteriaFilterMet({
|
|
428
|
+
dataToProcess: input.dataToProcess,
|
|
429
|
+
criteriaFilter: input.criteriaFilter,
|
|
430
|
+
});
|
|
431
|
+
|
|
432
|
+
if (traceMonitorResult) {
|
|
433
|
+
return traceMonitorResult;
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
return null;
|
|
438
|
+
}
|
|
439
|
+
}
|