refactor: Enhance error handling and logging in monitor criteria classes

This commit is contained in:
Simon Larsen 2025-04-24 12:11:17 +01:00
parent 9c65febf9c
commit 851d4361e8
No known key found for this signature in database
GPG key ID: 96C5DCA24769DBCA
5 changed files with 108 additions and 74 deletions

View file

@ -370,7 +370,7 @@
<concurrent_threads_soft_limit_ratio_to_cores>2</concurrent_threads_soft_limit_ratio_to_cores>
<!-- Maximum number of concurrent queries. -->
<max_concurrent_queries>1000</max_concurrent_queries>
<max_concurrent_queries>10000</max_concurrent_queries>
<!-- Maximum memory usage (resident set size) for server process.
Zero value or unset means default. Default is "max_server_memory_usage_to_ram_ratio" of available physical RAM.

View file

@ -10,6 +10,7 @@ import {
import ProbeMonitorResponse from "Common/Types/Probe/ProbeMonitorResponse";
import Typeof from "Common/Types/Typeof";
import CaptureSpan from "../../Telemetry/CaptureSpan";
import logger from "../../Logger";
export default class APIRequestCriteria {
@CaptureSpan()
@ -29,19 +30,27 @@ export default class APIRequestCriteria {
input.criteriaFilter.eveluateOverTime &&
input.criteriaFilter.evaluateOverTimeOptions
) {
overTimeValue = await EvaluateOverTime.getValueOverTime({
monitorId: input.dataToProcess.monitorId!,
evaluateOverTimeOptions: input.criteriaFilter.evaluateOverTimeOptions,
metricType: input.criteriaFilter.checkOn,
miscData: input.criteriaFilter.serverMonitorOptions as JSONObject,
});
try {
overTimeValue = await EvaluateOverTime.getValueOverTime({
monitorId: input.dataToProcess.monitorId!,
evaluateOverTimeOptions: input.criteriaFilter.evaluateOverTimeOptions,
metricType: input.criteriaFilter.checkOn,
miscData: input.criteriaFilter.serverMonitorOptions as JSONObject,
});
if (Array.isArray(overTimeValue) && overTimeValue.length === 0) {
return null;
}
if (Array.isArray(overTimeValue) && overTimeValue.length === 0) {
return null;
}
if (overTimeValue === undefined) {
return null;
if (overTimeValue === undefined) {
return null;
}
} catch (err) {
logger.error(
`Error in getting over time value for ${input.criteriaFilter.checkOn}`,
);
logger.error(err);
overTimeValue = undefined;
}
}
@ -128,7 +137,7 @@ export default class APIRequestCriteria {
if (input.criteriaFilter.checkOn === CheckOn.ResponseHeader) {
const headerKeys: Array<string> = Object.keys(
(input.dataToProcess as ProbeMonitorResponse).responseHeaders || {},
(input.dataToProcess as ProbeMonitorResponse).responseHeaders || {}
).map((key: string) => {
return key.toLowerCase();
});
@ -159,7 +168,7 @@ export default class APIRequestCriteria {
if (input.criteriaFilter.checkOn === CheckOn.ResponseHeaderValue) {
const headerValues: Array<string> = Object.values(
(input.dataToProcess as ProbeMonitorResponse).responseHeaders || {},
(input.dataToProcess as ProbeMonitorResponse).responseHeaders || {}
).map((key: string) => {
return key.toLowerCase();
});

View file

@ -24,15 +24,15 @@ export default class IncomingRequestCriteria {
logger.debug(
"Checking IncomingRequestCriteria for Monitor: " +
input.dataToProcess.monitorId.toString(),
input.dataToProcess.monitorId.toString()
);
logger.debug(
"Data to process: " + JSON.stringify(input.dataToProcess, null, 2),
"Data to process: " + JSON.stringify(input.dataToProcess, null, 2)
);
logger.debug(
"Criteria Filter: " + JSON.stringify(input.criteriaFilter, null, 2),
"Criteria Filter: " + JSON.stringify(input.criteriaFilter, null, 2)
);
let value: number | string | undefined = input.criteriaFilter.value;
@ -44,18 +44,26 @@ export default class IncomingRequestCriteria {
input.criteriaFilter.eveluateOverTime &&
input.criteriaFilter.evaluateOverTimeOptions
) {
overTimeValue = await EvaluateOverTime.getValueOverTime({
monitorId: input.dataToProcess.monitorId!,
evaluateOverTimeOptions: input.criteriaFilter.evaluateOverTimeOptions,
metricType: input.criteriaFilter.checkOn,
});
try {
overTimeValue = await EvaluateOverTime.getValueOverTime({
monitorId: input.dataToProcess.monitorId!,
evaluateOverTimeOptions: input.criteriaFilter.evaluateOverTimeOptions,
metricType: input.criteriaFilter.checkOn,
});
if (Array.isArray(overTimeValue) && overTimeValue.length === 0) {
return null;
}
if (Array.isArray(overTimeValue) && overTimeValue.length === 0) {
return null;
}
if (overTimeValue === undefined) {
return null;
if (overTimeValue === undefined) {
return null;
}
} catch (err) {
logger.error(
`Error in getting over time value for ${input.criteriaFilter.checkOn}`
);
logger.error(err);
overTimeValue = undefined;
}
}
@ -75,7 +83,7 @@ export default class IncomingRequestCriteria {
if (input.criteriaFilter.checkOn === CheckOn.IncomingRequest) {
logger.debug(
"Checking IncomingRequest for Monitor: " +
input.dataToProcess.monitorId.toString(),
input.dataToProcess.monitorId.toString()
);
const lastCheckTime: Date = (
@ -86,7 +94,7 @@ export default class IncomingRequestCriteria {
const differenceInMinutes: number = OneUptimeDate.getDifferenceInMinutes(
lastCheckTime,
OneUptimeDate.getCurrentDate(),
OneUptimeDate.getCurrentDate()
);
logger.debug("Difference in minutes: " + differenceInMinutes);
@ -111,13 +119,13 @@ export default class IncomingRequestCriteria {
if (input.criteriaFilter.filterType === FilterType.RecievedInMinutes) {
logger.debug(
"Checking RecievedInMinutes for Monitor: " +
input.dataToProcess.monitorId.toString(),
input.dataToProcess.monitorId.toString()
);
if (value && differenceInMinutes <= (value as number)) {
logger.debug(
"RecievedInMinutes for Monitor: " +
input.dataToProcess.monitorId.toString() +
" is true",
" is true"
);
return `Incoming request / heartbeat received in ${value} minutes.`;
}
@ -127,13 +135,13 @@ export default class IncomingRequestCriteria {
if (input.criteriaFilter.filterType === FilterType.NotRecievedInMinutes) {
logger.debug(
"Checking NotRecievedInMinutes for Monitor: " +
input.dataToProcess.monitorId.toString(),
input.dataToProcess.monitorId.toString()
);
if (value && differenceInMinutes > (value as number)) {
logger.debug(
"NotRecievedInMinutes for Monitor: " +
input.dataToProcess.monitorId.toString() +
" is true",
" is true"
);
return `Incoming request / heartbeat not received in ${value} minutes.`;
}
@ -188,7 +196,7 @@ export default class IncomingRequestCriteria {
.onlyCheckForIncomingRequestReceivedAt
) {
const headerKeys: Array<string> = Object.keys(
(input.dataToProcess as IncomingMonitorRequest).requestHeaders || {},
(input.dataToProcess as IncomingMonitorRequest).requestHeaders || {}
).map((key: string) => {
return key.toLowerCase();
});
@ -215,7 +223,7 @@ export default class IncomingRequestCriteria {
.onlyCheckForIncomingRequestReceivedAt
) {
const headerValues: Array<string> = Object.values(
(input.dataToProcess as IncomingMonitorRequest).requestHeaders || {},
(input.dataToProcess as IncomingMonitorRequest).requestHeaders || {}
).map((key: string) => {
return key.toLowerCase();
});

View file

@ -10,6 +10,7 @@ import SslMonitorResponse from "Common/Types/Monitor/SSLMonitor/SslMonitorRespon
import ProbeMonitorResponse from "Common/Types/Probe/ProbeMonitorResponse";
import EvaluateOverTime from "./EvaluateOverTime";
import CaptureSpan from "../../Telemetry/CaptureSpan";
import logger from "../../Logger";
export default class ServerMonitorCriteria {
@CaptureSpan()
@ -33,18 +34,26 @@ export default class ServerMonitorCriteria {
input.criteriaFilter.eveluateOverTime &&
input.criteriaFilter.evaluateOverTimeOptions
) {
overTimeValue = await EvaluateOverTime.getValueOverTime({
monitorId: input.dataToProcess.monitorId!,
evaluateOverTimeOptions: input.criteriaFilter.evaluateOverTimeOptions,
metricType: input.criteriaFilter.checkOn,
});
try {
overTimeValue = await EvaluateOverTime.getValueOverTime({
monitorId: input.dataToProcess.monitorId!,
evaluateOverTimeOptions: input.criteriaFilter.evaluateOverTimeOptions,
metricType: input.criteriaFilter.checkOn,
});
if (Array.isArray(overTimeValue) && overTimeValue.length === 0) {
return null;
}
if (Array.isArray(overTimeValue) && overTimeValue.length === 0) {
return null;
}
if (overTimeValue === undefined) {
return null;
if (overTimeValue === undefined) {
return null;
}
} catch (err) {
logger.error(
`Error in getting over time value for ${input.criteriaFilter.checkOn}`
);
logger.error(err);
overTimeValue = undefined;
}
}
@ -67,8 +76,8 @@ export default class ServerMonitorCriteria {
!sslResponse.isSelfSigned &&
OneUptimeDate.isAfter(
sslResponse.expiresAt,
OneUptimeDate.getCurrentDate(),
),
OneUptimeDate.getCurrentDate()
)
);
const isTrue: boolean =
@ -88,7 +97,7 @@ export default class ServerMonitorCriteria {
if (input.criteriaFilter.checkOn === CheckOn.IsSelfSignedCertificate) {
const isSelfSigned: boolean = Boolean(
sslResponse && sslResponse.isSelfSigned,
sslResponse && sslResponse.isSelfSigned
);
const isTrue: boolean =
input.criteriaFilter.filterType === FilterType.True;
@ -111,8 +120,8 @@ export default class ServerMonitorCriteria {
sslResponse.expiresAt &&
OneUptimeDate.isBefore(
sslResponse.expiresAt,
OneUptimeDate.getCurrentDate(),
),
OneUptimeDate.getCurrentDate()
)
);
const isTrue: boolean =
@ -140,8 +149,8 @@ export default class ServerMonitorCriteria {
(sslResponse.isSelfSigned ||
OneUptimeDate.isBefore(
sslResponse.expiresAt,
OneUptimeDate.getCurrentDate(),
)),
OneUptimeDate.getCurrentDate()
))
);
const isTrue: boolean =
input.criteriaFilter.filterType === FilterType.True;
@ -170,7 +179,7 @@ export default class ServerMonitorCriteria {
expiresAt &&
OneUptimeDate.getHoursBetweenTwoDates(
OneUptimeDate.getCurrentDate(),
expiresAt,
expiresAt
);
if (hours === null || hours === undefined) {
@ -196,7 +205,7 @@ export default class ServerMonitorCriteria {
expiresAt &&
OneUptimeDate.getDaysBetweenTwoDates(
OneUptimeDate.getCurrentDate(),
expiresAt,
expiresAt
);
if (days === null || days === undefined) {

View file

@ -32,19 +32,27 @@ export default class ServerMonitorCriteria {
input.criteriaFilter.eveluateOverTime &&
input.criteriaFilter.evaluateOverTimeOptions
) {
overTimeValue = await EvaluateOverTime.getValueOverTime({
monitorId: input.dataToProcess.monitorId!,
evaluateOverTimeOptions: input.criteriaFilter.evaluateOverTimeOptions,
metricType: input.criteriaFilter.checkOn,
miscData: input.criteriaFilter.serverMonitorOptions as JSONObject,
});
try {
overTimeValue = await EvaluateOverTime.getValueOverTime({
monitorId: input.dataToProcess.monitorId!,
evaluateOverTimeOptions: input.criteriaFilter.evaluateOverTimeOptions,
metricType: input.criteriaFilter.checkOn,
miscData: input.criteriaFilter.serverMonitorOptions as JSONObject,
});
if (Array.isArray(overTimeValue) && overTimeValue.length === 0) {
return null;
}
if (Array.isArray(overTimeValue) && overTimeValue.length === 0) {
return null;
}
if (overTimeValue === undefined) {
return null;
if (overTimeValue === undefined) {
return null;
}
} catch (err) {
logger.error(
`Error in getting over time value for ${input.criteriaFilter.checkOn}`
);
logger.error(err);
overTimeValue = undefined;
}
}
@ -53,7 +61,7 @@ export default class ServerMonitorCriteria {
const differenceInMinutes: number = OneUptimeDate.getDifferenceInMinutes(
lastCheckTime,
OneUptimeDate.getCurrentDate(),
OneUptimeDate.getCurrentDate()
);
let offlineIfNotCheckedInMinutes: number = 3;
@ -72,7 +80,7 @@ export default class ServerMonitorCriteria {
logger.debug(`Check On: ${input.criteriaFilter.checkOn}`);
logger.debug(`Difference in Minutes: ${differenceInMinutes}`);
logger.debug(
`Offline if not checked in minutes: ${offlineIfNotCheckedInMinutes}`,
`Offline if not checked in minutes: ${offlineIfNotCheckedInMinutes}`
);
if (
@ -169,7 +177,7 @@ export default class ServerMonitorCriteria {
item.diskPath.trim().toLowerCase() ===
diskPath.trim().toLowerCase()
);
},
}
)[0]?.percentFree || 0;
return CompareCriteria.compareCriteriaNumbers({
@ -194,7 +202,7 @@ export default class ServerMonitorCriteria {
(input.dataToProcess as ServerMonitorResponse)?.processes?.map(
(item: ServerProcess) => {
return item.name.trim().toLowerCase();
},
}
) || [];
if (processNames.includes(thresholdProcessName)) {
@ -209,7 +217,7 @@ export default class ServerMonitorCriteria {
(input.dataToProcess as ServerMonitorResponse)?.processes?.map(
(item: ServerProcess) => {
return item.name.trim().toLowerCase();
},
}
) || [];
if (!processNames.includes(thresholdProcessName)) {
@ -235,7 +243,7 @@ export default class ServerMonitorCriteria {
(input.dataToProcess as ServerMonitorResponse)?.processes?.map(
(item: ServerProcess) => {
return item.pid.toString().trim().toLowerCase();
},
}
) || [];
if (processPIDs.includes(thresholdProcessPID)) {
@ -250,7 +258,7 @@ export default class ServerMonitorCriteria {
(input.dataToProcess as ServerMonitorResponse)?.processes?.map(
(item: ServerProcess) => {
return item.pid.toString().trim().toLowerCase();
},
}
) || [];
if (!processPIDs.includes(thresholdProcessPID)) {
@ -278,7 +286,7 @@ export default class ServerMonitorCriteria {
(input.dataToProcess as ServerMonitorResponse)?.processes?.map(
(item: ServerProcess) => {
return item.command.trim().toLowerCase();
},
}
) || [];
if (processCommands.includes(thresholdProcessCommand)) {
@ -293,7 +301,7 @@ export default class ServerMonitorCriteria {
(input.dataToProcess as ServerMonitorResponse)?.processes?.map(
(item: ServerProcess) => {
return item.command.trim().toLowerCase();
},
}
) || [];
if (!processCommands.includes(thresholdProcessCommand)) {