@oneuptime/common 8.0.5514 → 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/UI/Components/Filters/FiltersForm.tsx +4 -1
- 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/build/dist/UI/Components/Filters/FiltersForm.js +2 -1
- package/build/dist/UI/Components/Filters/FiltersForm.js.map +1 -1
- package/package.json +5 -5
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import {
|
|
2
|
+
CriteriaFilter,
|
|
3
|
+
FilterType,
|
|
4
|
+
} from "../../../Types/Monitor/CriteriaFilter";
|
|
5
|
+
|
|
6
|
+
export default class MonitorCriteriaExpectationBuilder {
|
|
7
|
+
public static getCriteriaFilterDescription(
|
|
8
|
+
criteriaFilter: CriteriaFilter,
|
|
9
|
+
): string {
|
|
10
|
+
const parts: Array<string> = [criteriaFilter.checkOn];
|
|
11
|
+
|
|
12
|
+
if (criteriaFilter.filterType) {
|
|
13
|
+
parts.push(criteriaFilter.filterType);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
if (criteriaFilter.value !== undefined && criteriaFilter.value !== null) {
|
|
17
|
+
parts.push(String(criteriaFilter.value));
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
return parts.join(" ").trim();
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
public static describeCriteriaExpectation(
|
|
24
|
+
criteriaFilter: CriteriaFilter,
|
|
25
|
+
): string | null {
|
|
26
|
+
if (!criteriaFilter.filterType) {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
let expectation: string;
|
|
31
|
+
|
|
32
|
+
const value: string | number | undefined = criteriaFilter.value;
|
|
33
|
+
|
|
34
|
+
switch (criteriaFilter.filterType) {
|
|
35
|
+
case FilterType.GreaterThan:
|
|
36
|
+
expectation = `to be greater than ${value}`;
|
|
37
|
+
break;
|
|
38
|
+
case FilterType.GreaterThanOrEqualTo:
|
|
39
|
+
expectation = `to be greater than or equal to ${value}`;
|
|
40
|
+
break;
|
|
41
|
+
case FilterType.LessThan:
|
|
42
|
+
expectation = `to be less than ${value}`;
|
|
43
|
+
break;
|
|
44
|
+
case FilterType.LessThanOrEqualTo:
|
|
45
|
+
expectation = `to be less than or equal to ${value}`;
|
|
46
|
+
break;
|
|
47
|
+
case FilterType.EqualTo:
|
|
48
|
+
expectation = `to equal ${value}`;
|
|
49
|
+
break;
|
|
50
|
+
case FilterType.NotEqualTo:
|
|
51
|
+
expectation = `to not equal ${value}`;
|
|
52
|
+
break;
|
|
53
|
+
case FilterType.Contains:
|
|
54
|
+
expectation = `to contain ${value}`;
|
|
55
|
+
break;
|
|
56
|
+
case FilterType.NotContains:
|
|
57
|
+
expectation = `to not contain ${value}`;
|
|
58
|
+
break;
|
|
59
|
+
case FilterType.StartsWith:
|
|
60
|
+
expectation = `to start with ${value}`;
|
|
61
|
+
break;
|
|
62
|
+
case FilterType.EndsWith:
|
|
63
|
+
expectation = `to end with ${value}`;
|
|
64
|
+
break;
|
|
65
|
+
case FilterType.IsEmpty:
|
|
66
|
+
expectation = "to be empty";
|
|
67
|
+
break;
|
|
68
|
+
case FilterType.IsNotEmpty:
|
|
69
|
+
expectation = "to not be empty";
|
|
70
|
+
break;
|
|
71
|
+
case FilterType.True:
|
|
72
|
+
expectation = "to be true";
|
|
73
|
+
break;
|
|
74
|
+
case FilterType.False:
|
|
75
|
+
expectation = "to be false";
|
|
76
|
+
break;
|
|
77
|
+
case FilterType.IsExecuting:
|
|
78
|
+
expectation = "to be executing";
|
|
79
|
+
break;
|
|
80
|
+
case FilterType.IsNotExecuting:
|
|
81
|
+
expectation = "to not be executing";
|
|
82
|
+
break;
|
|
83
|
+
case FilterType.RecievedInMinutes:
|
|
84
|
+
expectation = value
|
|
85
|
+
? `to receive a heartbeat within ${value} minutes`
|
|
86
|
+
: "to receive a heartbeat within the configured window";
|
|
87
|
+
break;
|
|
88
|
+
case FilterType.NotRecievedInMinutes:
|
|
89
|
+
expectation = value
|
|
90
|
+
? `to miss a heartbeat for at least ${value} minutes`
|
|
91
|
+
: "to miss a heartbeat within the configured window";
|
|
92
|
+
break;
|
|
93
|
+
case FilterType.EvaluatesToTrue:
|
|
94
|
+
expectation = "to evaluate to true";
|
|
95
|
+
break;
|
|
96
|
+
default:
|
|
97
|
+
expectation = `${criteriaFilter.filterType}${value ? ` ${value}` : ""}`;
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const evaluationWindow: string | null =
|
|
102
|
+
MonitorCriteriaExpectationBuilder.getEvaluationWindowDescription(
|
|
103
|
+
criteriaFilter,
|
|
104
|
+
);
|
|
105
|
+
|
|
106
|
+
if (evaluationWindow) {
|
|
107
|
+
expectation += ` ${evaluationWindow}`;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
return expectation.trim();
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
public static getEvaluationWindowDescription(
|
|
114
|
+
criteriaFilter: CriteriaFilter,
|
|
115
|
+
): string | null {
|
|
116
|
+
const parts: Array<string> = [];
|
|
117
|
+
|
|
118
|
+
if (
|
|
119
|
+
criteriaFilter.eveluateOverTime &&
|
|
120
|
+
criteriaFilter.evaluateOverTimeOptions?.timeValueInMinutes
|
|
121
|
+
) {
|
|
122
|
+
parts.push(
|
|
123
|
+
`over the last ${criteriaFilter.evaluateOverTimeOptions.timeValueInMinutes} minutes`,
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
const aggregation: string | undefined =
|
|
128
|
+
criteriaFilter.evaluateOverTimeOptions?.evaluateOverTimeType ||
|
|
129
|
+
criteriaFilter.metricMonitorOptions?.metricAggregationType;
|
|
130
|
+
|
|
131
|
+
if (aggregation) {
|
|
132
|
+
parts.push(`using ${aggregation.toLowerCase()}`);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
if (!parts.length) {
|
|
136
|
+
return null;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
return parts.join(" ");
|
|
140
|
+
}
|
|
141
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import Monitor from "../../../Models/DatabaseModels/Monitor";
|
|
2
|
+
import MonitorStep from "../../../Types/Monitor/MonitorStep";
|
|
3
|
+
import DataToProcess from "./DataToProcess";
|
|
4
|
+
import { CriteriaFilter } from "../../../Types/Monitor/CriteriaFilter";
|
|
5
|
+
import MonitorCriteriaExpectationBuilder from "./MonitorCriteriaExpectationBuilder";
|
|
6
|
+
import MonitorCriteriaObservationBuilder from "./MonitorCriteriaObservationBuilder";
|
|
7
|
+
|
|
8
|
+
export default class MonitorCriteriaMessageBuilder {
|
|
9
|
+
public static buildCriteriaFilterMessage(input: {
|
|
10
|
+
monitor: Monitor;
|
|
11
|
+
criteriaFilter: CriteriaFilter;
|
|
12
|
+
dataToProcess: DataToProcess;
|
|
13
|
+
monitorStep: MonitorStep;
|
|
14
|
+
didMeetCriteria: boolean;
|
|
15
|
+
matchMessage: string | null;
|
|
16
|
+
}): string {
|
|
17
|
+
if (input.matchMessage) {
|
|
18
|
+
return input.matchMessage;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
if (input.didMeetCriteria) {
|
|
22
|
+
const description: string =
|
|
23
|
+
MonitorCriteriaExpectationBuilder.getCriteriaFilterDescription(
|
|
24
|
+
input.criteriaFilter,
|
|
25
|
+
);
|
|
26
|
+
|
|
27
|
+
return `${description} condition met.`;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const failureMessage: string | null =
|
|
31
|
+
MonitorCriteriaMessageBuilder.buildCriteriaFilterFailureMessage({
|
|
32
|
+
monitor: input.monitor,
|
|
33
|
+
criteriaFilter: input.criteriaFilter,
|
|
34
|
+
dataToProcess: input.dataToProcess,
|
|
35
|
+
monitorStep: input.monitorStep,
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
if (failureMessage) {
|
|
39
|
+
return failureMessage;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const description: string =
|
|
43
|
+
MonitorCriteriaExpectationBuilder.getCriteriaFilterDescription(
|
|
44
|
+
input.criteriaFilter,
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
return `${description} condition was not met.`;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
private static buildCriteriaFilterFailureMessage(input: {
|
|
51
|
+
monitor: Monitor;
|
|
52
|
+
criteriaFilter: CriteriaFilter;
|
|
53
|
+
dataToProcess: DataToProcess;
|
|
54
|
+
monitorStep: MonitorStep;
|
|
55
|
+
}): string | null {
|
|
56
|
+
const expectation: string | null =
|
|
57
|
+
MonitorCriteriaExpectationBuilder.describeCriteriaExpectation(
|
|
58
|
+
input.criteriaFilter,
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
const observation: string | null =
|
|
62
|
+
MonitorCriteriaObservationBuilder.describeFilterObservation({
|
|
63
|
+
monitor: input.monitor,
|
|
64
|
+
criteriaFilter: input.criteriaFilter,
|
|
65
|
+
dataToProcess: input.dataToProcess,
|
|
66
|
+
monitorStep: input.monitorStep,
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
if (observation) {
|
|
70
|
+
if (expectation) {
|
|
71
|
+
return `${observation} (expected ${expectation}).`;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return `${observation}; configured filter was not met.`;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
if (expectation) {
|
|
78
|
+
const description: string =
|
|
79
|
+
MonitorCriteriaExpectationBuilder.getCriteriaFilterDescription(
|
|
80
|
+
input.criteriaFilter,
|
|
81
|
+
);
|
|
82
|
+
|
|
83
|
+
return `${description} did not satisfy the configured condition (${expectation}).`;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import logger from "../Logger";
|
|
2
|
+
import BasicInfrastructureMetrics from "../../../Types/Infrastructure/BasicMetrics";
|
|
3
|
+
import Typeof from "../../../Types/Typeof";
|
|
4
|
+
import { ServerProcess } from "../../../Types/Monitor/ServerMonitor/ServerMonitorResponse";
|
|
5
|
+
|
|
6
|
+
export default class MonitorCriteriaMessageFormatter {
|
|
7
|
+
public static formatNumber(
|
|
8
|
+
value: number | null | undefined,
|
|
9
|
+
options?: { maximumFractionDigits?: number },
|
|
10
|
+
): string | null {
|
|
11
|
+
if (value === null || value === undefined || isNaN(value)) {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const fractionDigits: number =
|
|
16
|
+
options?.maximumFractionDigits !== undefined
|
|
17
|
+
? options.maximumFractionDigits
|
|
18
|
+
: Math.abs(value) < 10
|
|
19
|
+
? 2
|
|
20
|
+
: Math.abs(value) < 100
|
|
21
|
+
? 1
|
|
22
|
+
: 0;
|
|
23
|
+
|
|
24
|
+
return value.toFixed(fractionDigits);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
public static formatPercentage(
|
|
28
|
+
value: number | null | undefined,
|
|
29
|
+
): string | null {
|
|
30
|
+
const formatted: string | null =
|
|
31
|
+
MonitorCriteriaMessageFormatter.formatNumber(value, {
|
|
32
|
+
maximumFractionDigits:
|
|
33
|
+
value !== null && value !== undefined && Math.abs(value) < 100
|
|
34
|
+
? 1
|
|
35
|
+
: 0,
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
if (!formatted) {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return `${formatted}%`;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
public static formatBytes(bytes: number | null | undefined): string | null {
|
|
46
|
+
if (bytes === null || bytes === undefined || isNaN(bytes)) {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const units: Array<string> = ["B", "KB", "MB", "GB", "TB", "PB"];
|
|
51
|
+
let value: number = bytes;
|
|
52
|
+
let index: number = 0;
|
|
53
|
+
|
|
54
|
+
while (value >= 1024 && index < units.length - 1) {
|
|
55
|
+
value = value / 1024;
|
|
56
|
+
index++;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const formatted: string | null =
|
|
60
|
+
MonitorCriteriaMessageFormatter.formatNumber(value, {
|
|
61
|
+
maximumFractionDigits: value >= 100 ? 0 : value >= 10 ? 1 : 2,
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
if (!formatted) {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
return `${formatted} ${units[index]}`;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
public static formatList(items: Array<string>, maxItems: number = 5): string {
|
|
72
|
+
if (!items.length) {
|
|
73
|
+
return "";
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const trimmedItems: Array<string> = items.slice(0, maxItems);
|
|
77
|
+
const suffix: string =
|
|
78
|
+
items.length > maxItems ? `, +${items.length - maxItems} more` : "";
|
|
79
|
+
|
|
80
|
+
return `${trimmedItems.join(", ")} ${suffix}`.trim();
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
public static formatSnippet(text: string, maxLength: number = 120): string {
|
|
84
|
+
const sanitized: string = text.replace(/\s+/g, " ").trim();
|
|
85
|
+
|
|
86
|
+
if (sanitized.length <= maxLength) {
|
|
87
|
+
return sanitized;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
return `${sanitized.slice(0, maxLength)}…`;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
public static describeProcesses(
|
|
94
|
+
processes: Array<ServerProcess>,
|
|
95
|
+
): string | null {
|
|
96
|
+
if (!processes.length) {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const processSummaries: Array<string> = processes.map(
|
|
101
|
+
(process: ServerProcess) => {
|
|
102
|
+
return `${process.name} (pid ${process.pid})`;
|
|
103
|
+
},
|
|
104
|
+
);
|
|
105
|
+
|
|
106
|
+
return MonitorCriteriaMessageFormatter.formatList(processSummaries);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
public static computeDiskUsagePercent(
|
|
110
|
+
diskMetric: BasicInfrastructureMetrics["diskMetrics"][number],
|
|
111
|
+
): number | null {
|
|
112
|
+
if (!diskMetric) {
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
if (
|
|
117
|
+
diskMetric.percentUsed !== undefined &&
|
|
118
|
+
diskMetric.percentUsed !== null &&
|
|
119
|
+
!isNaN(diskMetric.percentUsed)
|
|
120
|
+
) {
|
|
121
|
+
return diskMetric.percentUsed;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
if (
|
|
125
|
+
diskMetric.percentFree !== undefined &&
|
|
126
|
+
diskMetric.percentFree !== null &&
|
|
127
|
+
!isNaN(diskMetric.percentFree)
|
|
128
|
+
) {
|
|
129
|
+
return 100 - diskMetric.percentFree;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
if (diskMetric.total && diskMetric.used && diskMetric.total > 0) {
|
|
133
|
+
return (diskMetric.used / diskMetric.total) * 100;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
return null;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
public static summarizeNumericSeries(values: Array<number>): string | null {
|
|
140
|
+
if (!values.length) {
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
const latest: number | undefined = values[values.length - 1];
|
|
145
|
+
|
|
146
|
+
if (latest === undefined) {
|
|
147
|
+
return null;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
const latestFormatted: string | null =
|
|
151
|
+
MonitorCriteriaMessageFormatter.formatNumber(latest, {
|
|
152
|
+
maximumFractionDigits: 2,
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
let summary: string = `latest ${latestFormatted ?? latest}`;
|
|
156
|
+
|
|
157
|
+
if (values.length > 1) {
|
|
158
|
+
const min: number = Math.min(...values);
|
|
159
|
+
const max: number = Math.max(...values);
|
|
160
|
+
|
|
161
|
+
const minFormatted: string | null =
|
|
162
|
+
MonitorCriteriaMessageFormatter.formatNumber(min, {
|
|
163
|
+
maximumFractionDigits: 2,
|
|
164
|
+
});
|
|
165
|
+
const maxFormatted: string | null =
|
|
166
|
+
MonitorCriteriaMessageFormatter.formatNumber(max, {
|
|
167
|
+
maximumFractionDigits: 2,
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
summary += ` (min ${minFormatted ?? min}, max ${maxFormatted ?? max})`;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
summary += ` across ${values.length} data point${
|
|
174
|
+
values.length === 1 ? "" : "s"
|
|
175
|
+
}`;
|
|
176
|
+
|
|
177
|
+
return summary;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
public static formatResultValue(value: unknown): string {
|
|
181
|
+
if (value === null || value === undefined) {
|
|
182
|
+
return "undefined";
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
if (typeof value === Typeof.Object) {
|
|
186
|
+
try {
|
|
187
|
+
return JSON.stringify(value);
|
|
188
|
+
} catch (err) {
|
|
189
|
+
logger.error(err);
|
|
190
|
+
return "[object]";
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
return value.toString();
|
|
195
|
+
}
|
|
196
|
+
}
|