@oneuptime/common 8.0.5516 → 8.0.5547
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 +134 -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,132 @@
|
|
|
1
|
+
import logger from "../Logger";
|
|
2
|
+
import Typeof from "../../../Types/Typeof";
|
|
3
|
+
export default class MonitorCriteriaMessageFormatter {
|
|
4
|
+
static formatNumber(value, options) {
|
|
5
|
+
if (value === null || value === undefined || isNaN(value)) {
|
|
6
|
+
return null;
|
|
7
|
+
}
|
|
8
|
+
const fractionDigits = (options === null || options === void 0 ? void 0 : options.maximumFractionDigits) !== undefined
|
|
9
|
+
? options.maximumFractionDigits
|
|
10
|
+
: Math.abs(value) < 10
|
|
11
|
+
? 2
|
|
12
|
+
: Math.abs(value) < 100
|
|
13
|
+
? 1
|
|
14
|
+
: 0;
|
|
15
|
+
return value.toFixed(fractionDigits);
|
|
16
|
+
}
|
|
17
|
+
static formatPercentage(value) {
|
|
18
|
+
const formatted = MonitorCriteriaMessageFormatter.formatNumber(value, {
|
|
19
|
+
maximumFractionDigits: value !== null && value !== undefined && Math.abs(value) < 100
|
|
20
|
+
? 1
|
|
21
|
+
: 0,
|
|
22
|
+
});
|
|
23
|
+
if (!formatted) {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
return `${formatted}%`;
|
|
27
|
+
}
|
|
28
|
+
static formatBytes(bytes) {
|
|
29
|
+
if (bytes === null || bytes === undefined || isNaN(bytes)) {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
const units = ["B", "KB", "MB", "GB", "TB", "PB"];
|
|
33
|
+
let value = bytes;
|
|
34
|
+
let index = 0;
|
|
35
|
+
while (value >= 1024 && index < units.length - 1) {
|
|
36
|
+
value = value / 1024;
|
|
37
|
+
index++;
|
|
38
|
+
}
|
|
39
|
+
const formatted = MonitorCriteriaMessageFormatter.formatNumber(value, {
|
|
40
|
+
maximumFractionDigits: value >= 100 ? 0 : value >= 10 ? 1 : 2,
|
|
41
|
+
});
|
|
42
|
+
if (!formatted) {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
return `${formatted} ${units[index]}`;
|
|
46
|
+
}
|
|
47
|
+
static formatList(items, maxItems = 5) {
|
|
48
|
+
if (!items.length) {
|
|
49
|
+
return "";
|
|
50
|
+
}
|
|
51
|
+
const trimmedItems = items.slice(0, maxItems);
|
|
52
|
+
const suffix = items.length > maxItems ? `, +${items.length - maxItems} more` : "";
|
|
53
|
+
return `${trimmedItems.join(", ")} ${suffix}`.trim();
|
|
54
|
+
}
|
|
55
|
+
static formatSnippet(text, maxLength = 120) {
|
|
56
|
+
const sanitized = text.replace(/\s+/g, " ").trim();
|
|
57
|
+
if (sanitized.length <= maxLength) {
|
|
58
|
+
return sanitized;
|
|
59
|
+
}
|
|
60
|
+
return `${sanitized.slice(0, maxLength)}…`;
|
|
61
|
+
}
|
|
62
|
+
static describeProcesses(processes) {
|
|
63
|
+
if (!processes.length) {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
const processSummaries = processes.map((process) => {
|
|
67
|
+
return `${process.name} (pid ${process.pid})`;
|
|
68
|
+
});
|
|
69
|
+
return MonitorCriteriaMessageFormatter.formatList(processSummaries);
|
|
70
|
+
}
|
|
71
|
+
static computeDiskUsagePercent(diskMetric) {
|
|
72
|
+
if (!diskMetric) {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
if (diskMetric.percentUsed !== undefined &&
|
|
76
|
+
diskMetric.percentUsed !== null &&
|
|
77
|
+
!isNaN(diskMetric.percentUsed)) {
|
|
78
|
+
return diskMetric.percentUsed;
|
|
79
|
+
}
|
|
80
|
+
if (diskMetric.percentFree !== undefined &&
|
|
81
|
+
diskMetric.percentFree !== null &&
|
|
82
|
+
!isNaN(diskMetric.percentFree)) {
|
|
83
|
+
return 100 - diskMetric.percentFree;
|
|
84
|
+
}
|
|
85
|
+
if (diskMetric.total && diskMetric.used && diskMetric.total > 0) {
|
|
86
|
+
return (diskMetric.used / diskMetric.total) * 100;
|
|
87
|
+
}
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
static summarizeNumericSeries(values) {
|
|
91
|
+
if (!values.length) {
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
const latest = values[values.length - 1];
|
|
95
|
+
if (latest === undefined) {
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
const latestFormatted = MonitorCriteriaMessageFormatter.formatNumber(latest, {
|
|
99
|
+
maximumFractionDigits: 2,
|
|
100
|
+
});
|
|
101
|
+
let summary = `latest ${latestFormatted !== null && latestFormatted !== void 0 ? latestFormatted : latest}`;
|
|
102
|
+
if (values.length > 1) {
|
|
103
|
+
const min = Math.min(...values);
|
|
104
|
+
const max = Math.max(...values);
|
|
105
|
+
const minFormatted = MonitorCriteriaMessageFormatter.formatNumber(min, {
|
|
106
|
+
maximumFractionDigits: 2,
|
|
107
|
+
});
|
|
108
|
+
const maxFormatted = MonitorCriteriaMessageFormatter.formatNumber(max, {
|
|
109
|
+
maximumFractionDigits: 2,
|
|
110
|
+
});
|
|
111
|
+
summary += ` (min ${minFormatted !== null && minFormatted !== void 0 ? minFormatted : min}, max ${maxFormatted !== null && maxFormatted !== void 0 ? maxFormatted : max})`;
|
|
112
|
+
}
|
|
113
|
+
summary += ` across ${values.length} data point${values.length === 1 ? "" : "s"}`;
|
|
114
|
+
return summary;
|
|
115
|
+
}
|
|
116
|
+
static formatResultValue(value) {
|
|
117
|
+
if (value === null || value === undefined) {
|
|
118
|
+
return "undefined";
|
|
119
|
+
}
|
|
120
|
+
if (typeof value === Typeof.Object) {
|
|
121
|
+
try {
|
|
122
|
+
return JSON.stringify(value);
|
|
123
|
+
}
|
|
124
|
+
catch (err) {
|
|
125
|
+
logger.error(err);
|
|
126
|
+
return "[object]";
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return value.toString();
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=MonitorCriteriaMessageFormatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MonitorCriteriaMessageFormatter.js","sourceRoot":"","sources":["../../../../../Server/Utils/Monitor/MonitorCriteriaMessageFormatter.ts"],"names":[],"mappings":"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"}
|