@oneuptime/common 11.5.10 → 11.5.12
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/AnalyticsModels/NetworkFlow.ts +12 -1
- package/Server/API/StatusPageAPI.ts +14 -1
- package/Server/Services/IncidentService.ts +62 -67
- package/Server/Services/MonitorGroupService.ts +15 -2
- package/Server/Services/MonitorService.ts +91 -3
- package/Server/Services/MonitorStatusTimelineService.ts +285 -100
- package/Server/Services/StatusPageService.ts +59 -34
- package/Server/Utils/Monitor/MonitorResource.ts +43 -14
- package/Server/Utils/Monitor/MonitorStatusTimeline.ts +32 -7
- package/Server/Utils/Monitor/MonitorStatusTimelineReconciler.ts +362 -0
- package/Tests/Server/Services/MonitorStatusTimelineService.test.ts +235 -0
- package/Tests/Server/Utils/Monitor/MonitorStatusTimelineReconciler.test.ts +555 -0
- package/Tests/Types/Database/CompareOperatorWireSerialization.test.ts +216 -0
- package/Tests/Types/Database/GreaterThan.test.ts +5 -1
- package/Tests/Types/Database/GreaterThanOrEqual.test.ts +5 -1
- package/Tests/Types/Database/GreaterThanOrNull.test.ts +24 -1
- package/Tests/Types/Database/LessThan.test.ts +5 -1
- package/Tests/Types/Database/LessThanOrEqual.test.ts +24 -1
- package/Tests/Types/Database/LessThanOrNull.test.ts +5 -1
- package/Tests/Utils/Uptime/UptimeUtil.test.ts +726 -0
- package/Types/BaseDatabase/GreaterThan.ts +8 -1
- package/Types/BaseDatabase/GreaterThanOrEqual.ts +8 -1
- package/Types/BaseDatabase/GreaterThanOrNull.ts +9 -1
- package/Types/BaseDatabase/LessThan.ts +8 -1
- package/Types/BaseDatabase/LessThanOrEqual.ts +9 -1
- package/Types/BaseDatabase/LessThanOrNull.ts +8 -1
- package/Utils/StatusPage/ResourceUptime.ts +11 -1
- package/Utils/Uptime/UptimeUtil.ts +142 -36
- package/build/dist/Models/AnalyticsModels/NetworkFlow.js +12 -1
- package/build/dist/Models/AnalyticsModels/NetworkFlow.js.map +1 -1
- package/build/dist/Server/API/StatusPageAPI.js +12 -2
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +47 -56
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/MonitorGroupService.js +15 -2
- package/build/dist/Server/Services/MonitorGroupService.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +66 -3
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/MonitorStatusTimelineService.js +244 -102
- package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageService.js +57 -33
- package/build/dist/Server/Services/StatusPageService.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorResource.js +34 -12
- package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorStatusTimeline.js +25 -8
- package/build/dist/Server/Utils/Monitor/MonitorStatusTimeline.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorStatusTimelineReconciler.js +268 -0
- package/build/dist/Server/Utils/Monitor/MonitorStatusTimelineReconciler.js.map +1 -0
- package/build/dist/Types/BaseDatabase/GreaterThan.js +8 -1
- package/build/dist/Types/BaseDatabase/GreaterThan.js.map +1 -1
- package/build/dist/Types/BaseDatabase/GreaterThanOrEqual.js +8 -1
- package/build/dist/Types/BaseDatabase/GreaterThanOrEqual.js.map +1 -1
- package/build/dist/Types/BaseDatabase/GreaterThanOrNull.js +9 -1
- package/build/dist/Types/BaseDatabase/GreaterThanOrNull.js.map +1 -1
- package/build/dist/Types/BaseDatabase/LessThan.js +8 -1
- package/build/dist/Types/BaseDatabase/LessThan.js.map +1 -1
- package/build/dist/Types/BaseDatabase/LessThanOrEqual.js +9 -1
- package/build/dist/Types/BaseDatabase/LessThanOrEqual.js.map +1 -1
- package/build/dist/Types/BaseDatabase/LessThanOrNull.js +8 -1
- package/build/dist/Types/BaseDatabase/LessThanOrNull.js.map +1 -1
- package/build/dist/Utils/StatusPage/ResourceUptime.js +4 -1
- package/build/dist/Utils/StatusPage/ResourceUptime.js.map +1 -1
- package/build/dist/Utils/Uptime/UptimeUtil.js +86 -33
- package/build/dist/Utils/Uptime/UptimeUtil.js.map +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
import PostgresAppInstance from "../../Infrastructure/PostgresDatabase";
|
|
11
|
+
import DatabaseNotConnectedException from "../../../Types/Exception/DatabaseNotConnectedException";
|
|
12
|
+
import ObjectID from "../../../Types/ObjectID";
|
|
13
|
+
import logger from "../Logger";
|
|
14
|
+
import CaptureSpan from "../Telemetry/CaptureSpan";
|
|
15
|
+
/*
|
|
16
|
+
* Bounded so a single run never loads a pathological monitor's whole backlog into memory.
|
|
17
|
+
* Production currently has ~67.5k stale rows, ~56k of them on ONE monitor.
|
|
18
|
+
*/
|
|
19
|
+
export const DEFAULT_STALE_OPEN_ROW_BATCH_SIZE = 1000;
|
|
20
|
+
const MIN_BATCH_SIZE = 1;
|
|
21
|
+
const MAX_BATCH_SIZE = 10000;
|
|
22
|
+
/*
|
|
23
|
+
* Pure runaway guard. Every non-terminal round repairs exactly batchSize rows, so the loop
|
|
24
|
+
* is already guaranteed to terminate; this only bounds a run if that invariant is ever broken.
|
|
25
|
+
*/
|
|
26
|
+
const MAX_ROUNDS = 100000;
|
|
27
|
+
export default class MonitorStatusTimelineReconciler {
|
|
28
|
+
/*
|
|
29
|
+
* Finds and repairs stale open rows. Idempotent: a second run over the same data repairs
|
|
30
|
+
* nothing, because a repaired row no longer matches endsAt IS NULL.
|
|
31
|
+
*
|
|
32
|
+
* Monitors are processed round-robin, one batch each per round, so a monitor with tens of
|
|
33
|
+
* thousands of stale rows cannot starve the rest of the fleet.
|
|
34
|
+
*/
|
|
35
|
+
static async repairStaleOpenRows(options = {}) {
|
|
36
|
+
const batchSize = this.getBatchSize(options.batchSize);
|
|
37
|
+
const monitorIds = options.monitorId
|
|
38
|
+
? [options.monitorId]
|
|
39
|
+
: await this.getMonitorIdsWithStaleOpenRows();
|
|
40
|
+
const result = {
|
|
41
|
+
scanned: 0,
|
|
42
|
+
repaired: 0,
|
|
43
|
+
monitorsWithStaleRows: monitorIds.length,
|
|
44
|
+
repairedMonitorIds: [],
|
|
45
|
+
failedMonitorIds: [],
|
|
46
|
+
};
|
|
47
|
+
if (monitorIds.length === 0) {
|
|
48
|
+
logger.debug("MonitorStatusTimelineReconciler: no monitors have stale open status timeline rows.");
|
|
49
|
+
return result;
|
|
50
|
+
}
|
|
51
|
+
logger.debug(`MonitorStatusTimelineReconciler: ${monitorIds.length} monitor(s) have stale open status timeline rows. Batch size ${batchSize}.`);
|
|
52
|
+
const repairedMonitorIds = new Set();
|
|
53
|
+
const failedMonitorIds = new Set();
|
|
54
|
+
let pendingMonitorIds = monitorIds;
|
|
55
|
+
let round = 0;
|
|
56
|
+
while (pendingMonitorIds.length > 0) {
|
|
57
|
+
round++;
|
|
58
|
+
if (round > MAX_ROUNDS) {
|
|
59
|
+
logger.error(`MonitorStatusTimelineReconciler: aborting after ${MAX_ROUNDS} rounds with ${pendingMonitorIds.length} monitor(s) still pending. This should be unreachable.`);
|
|
60
|
+
break;
|
|
61
|
+
}
|
|
62
|
+
const stillPendingMonitorIds = [];
|
|
63
|
+
for (const monitorId of pendingMonitorIds) {
|
|
64
|
+
/*
|
|
65
|
+
* Per-monitor try/catch, matching the sibling KeepCurrentStateConsistent jobs: one bad
|
|
66
|
+
* monitor is skipped for the remainder of the run instead of aborting it. It is not
|
|
67
|
+
* re-queued, so a monitor that fails deterministically cannot spin forever.
|
|
68
|
+
*/
|
|
69
|
+
try {
|
|
70
|
+
const batch = await this.repairStaleOpenRowsBatch({
|
|
71
|
+
monitorId: monitorId,
|
|
72
|
+
batchSize: batchSize,
|
|
73
|
+
});
|
|
74
|
+
result.scanned += batch.scanned;
|
|
75
|
+
result.repaired += batch.repaired;
|
|
76
|
+
if (batch.repaired > 0) {
|
|
77
|
+
repairedMonitorIds.add(monitorId.toString());
|
|
78
|
+
}
|
|
79
|
+
/*
|
|
80
|
+
* A full batch of repairs means there may be more stale rows on this monitor. Anything
|
|
81
|
+
* short of a full batch means every open row on this monitor has now been examined -
|
|
82
|
+
* whatever is still open has no strictly later row and is therefore legitimate.
|
|
83
|
+
*/
|
|
84
|
+
if (batch.repaired >= batchSize) {
|
|
85
|
+
stillPendingMonitorIds.push(monitorId);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
failedMonitorIds.add(monitorId.toString());
|
|
90
|
+
logger.error(`MonitorStatusTimelineReconciler: failed to repair stale open rows for monitor ${monitorId.toString()}.`);
|
|
91
|
+
logger.error(err);
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
pendingMonitorIds = stillPendingMonitorIds;
|
|
96
|
+
}
|
|
97
|
+
result.repairedMonitorIds = Array.from(repairedMonitorIds).map((id) => {
|
|
98
|
+
return new ObjectID(id);
|
|
99
|
+
});
|
|
100
|
+
result.failedMonitorIds = Array.from(failedMonitorIds).map((id) => {
|
|
101
|
+
return new ObjectID(id);
|
|
102
|
+
});
|
|
103
|
+
return result;
|
|
104
|
+
}
|
|
105
|
+
/*
|
|
106
|
+
* Counts stale open rows without repairing anything. Useful for telemetry and for asserting
|
|
107
|
+
* that a repair run actually converged.
|
|
108
|
+
*/
|
|
109
|
+
static async countStaleOpenRows(options = {}) {
|
|
110
|
+
var _a;
|
|
111
|
+
const dataSource = this.getDataSource();
|
|
112
|
+
const parameters = [];
|
|
113
|
+
let monitorFilter = "";
|
|
114
|
+
if (options.monitorId) {
|
|
115
|
+
monitorFilter = `AND t."monitorId" = $1::uuid`;
|
|
116
|
+
parameters.push(options.monitorId.toString());
|
|
117
|
+
}
|
|
118
|
+
const sql = `
|
|
119
|
+
SELECT COUNT(*)::int AS "staleCount"
|
|
120
|
+
FROM "MonitorStatusTimeline" t
|
|
121
|
+
WHERE t."endsAt" IS NULL
|
|
122
|
+
AND t."deletedAt" IS NULL
|
|
123
|
+
AND t."startsAt" IS NOT NULL
|
|
124
|
+
${monitorFilter}
|
|
125
|
+
AND EXISTS (
|
|
126
|
+
SELECT 1
|
|
127
|
+
FROM "MonitorStatusTimeline" n
|
|
128
|
+
WHERE n."monitorId" = t."monitorId"
|
|
129
|
+
AND n."deletedAt" IS NULL
|
|
130
|
+
AND n."startsAt" > t."startsAt"
|
|
131
|
+
)
|
|
132
|
+
`;
|
|
133
|
+
const rows = await dataSource.query(sql, parameters);
|
|
134
|
+
return ((_a = rows[0]) === null || _a === void 0 ? void 0 : _a.staleCount) || 0;
|
|
135
|
+
}
|
|
136
|
+
/*
|
|
137
|
+
* The set of monitors that currently have at least one stale open row.
|
|
138
|
+
*
|
|
139
|
+
* Note this is deliberately NOT "monitors with more than one open row". A monitor can have
|
|
140
|
+
* exactly one open row that is still stale, if the newest row on the monitor happens to be
|
|
141
|
+
* closed. Encoding the definition directly keeps both cases covered.
|
|
142
|
+
*/
|
|
143
|
+
static async getMonitorIdsWithStaleOpenRows() {
|
|
144
|
+
const dataSource = this.getDataSource();
|
|
145
|
+
const sql = `
|
|
146
|
+
SELECT DISTINCT t."monitorId" AS "monitorId"
|
|
147
|
+
FROM "MonitorStatusTimeline" t
|
|
148
|
+
WHERE t."endsAt" IS NULL
|
|
149
|
+
AND t."deletedAt" IS NULL
|
|
150
|
+
AND t."startsAt" IS NOT NULL
|
|
151
|
+
AND EXISTS (
|
|
152
|
+
SELECT 1
|
|
153
|
+
FROM "MonitorStatusTimeline" n
|
|
154
|
+
WHERE n."monitorId" = t."monitorId"
|
|
155
|
+
AND n."deletedAt" IS NULL
|
|
156
|
+
AND n."startsAt" > t."startsAt"
|
|
157
|
+
)
|
|
158
|
+
ORDER BY t."monitorId" ASC
|
|
159
|
+
`;
|
|
160
|
+
const rows = await dataSource.query(sql);
|
|
161
|
+
return rows.map((row) => {
|
|
162
|
+
return new ObjectID(row.monitorId);
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
/*
|
|
166
|
+
* Repairs up to batchSize stale open rows on a single monitor, oldest first.
|
|
167
|
+
*
|
|
168
|
+
* Ordering is by startsAt, NEVER createdAt. createdAt is assigned DB-side by now() while
|
|
169
|
+
* startsAt is assigned by the worker pod's clock, so the two orderings genuinely disagree on
|
|
170
|
+
* real data. Two earlier migrations ordered by createdAt and produced wrong results.
|
|
171
|
+
*/
|
|
172
|
+
static async repairStaleOpenRowsBatch(data) {
|
|
173
|
+
var _a, _b;
|
|
174
|
+
const dataSource = this.getDataSource();
|
|
175
|
+
/*
|
|
176
|
+
* candidates is materialised once (a data-modifying CTE forces materialisation), so the
|
|
177
|
+
* counts below and the UPDATE all see the same snapshot and one round trip yields both the
|
|
178
|
+
* scanned and the repaired count.
|
|
179
|
+
*
|
|
180
|
+
* nextStartsAt is NULL for an open row with no strictly later row. Those rows are the
|
|
181
|
+
* legitimate current-state row (or a startsAt tie at the head of the timeline) and are
|
|
182
|
+
* excluded from the UPDATE, so they stay open.
|
|
183
|
+
*
|
|
184
|
+
* The UPDATE re-checks m."endsAt" IS NULL even though candidates already filtered on it:
|
|
185
|
+
* the reconciler runs WITHOUT the per-monitor mutex, and under READ COMMITTED a live
|
|
186
|
+
* writer can close a candidate row between this statement's snapshot and the UPDATE
|
|
187
|
+
* taking the row lock. Postgres then re-evaluates only the UPDATE's own WHERE against
|
|
188
|
+
* the new row version (EvalPlanQual), so the openness check must live in the UPDATE
|
|
189
|
+
* itself - otherwise the reconciler would overwrite the endsAt the writer just committed
|
|
190
|
+
* with its stale snapshot-time value.
|
|
191
|
+
*/
|
|
192
|
+
const sql = `
|
|
193
|
+
WITH candidates AS (
|
|
194
|
+
SELECT
|
|
195
|
+
t."_id" AS "_id",
|
|
196
|
+
(
|
|
197
|
+
SELECT MIN(n."startsAt")
|
|
198
|
+
FROM "MonitorStatusTimeline" n
|
|
199
|
+
WHERE n."monitorId" = t."monitorId"
|
|
200
|
+
AND n."deletedAt" IS NULL
|
|
201
|
+
AND n."startsAt" > t."startsAt"
|
|
202
|
+
) AS "nextStartsAt"
|
|
203
|
+
FROM "MonitorStatusTimeline" t
|
|
204
|
+
WHERE t."monitorId" = $1::uuid
|
|
205
|
+
AND t."endsAt" IS NULL
|
|
206
|
+
AND t."deletedAt" IS NULL
|
|
207
|
+
AND t."startsAt" IS NOT NULL
|
|
208
|
+
ORDER BY t."startsAt" ASC
|
|
209
|
+
LIMIT $2
|
|
210
|
+
),
|
|
211
|
+
repaired AS (
|
|
212
|
+
UPDATE "MonitorStatusTimeline" m
|
|
213
|
+
SET "endsAt" = c."nextStartsAt",
|
|
214
|
+
"updatedAt" = NOW(),
|
|
215
|
+
"version" = m."version" + 1
|
|
216
|
+
FROM candidates c
|
|
217
|
+
WHERE m."_id" = c."_id"
|
|
218
|
+
AND m."endsAt" IS NULL
|
|
219
|
+
AND c."nextStartsAt" IS NOT NULL
|
|
220
|
+
RETURNING m."_id"
|
|
221
|
+
)
|
|
222
|
+
SELECT
|
|
223
|
+
(SELECT COUNT(*) FROM candidates)::int AS "scanned",
|
|
224
|
+
(SELECT COUNT(*) FROM repaired)::int AS "repaired"
|
|
225
|
+
`;
|
|
226
|
+
const rows = await dataSource.query(sql, [
|
|
227
|
+
data.monitorId.toString(),
|
|
228
|
+
data.batchSize.toString(),
|
|
229
|
+
]);
|
|
230
|
+
const scanned = ((_a = rows[0]) === null || _a === void 0 ? void 0 : _a.scanned) || 0;
|
|
231
|
+
const repaired = ((_b = rows[0]) === null || _b === void 0 ? void 0 : _b.repaired) || 0;
|
|
232
|
+
if (repaired > 0) {
|
|
233
|
+
logger.debug(`MonitorStatusTimelineReconciler: repaired ${repaired} of ${scanned} open row(s) examined on monitor ${data.monitorId.toString()}.`);
|
|
234
|
+
}
|
|
235
|
+
return {
|
|
236
|
+
scanned: scanned,
|
|
237
|
+
repaired: repaired,
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
static getBatchSize(batchSize) {
|
|
241
|
+
if (!batchSize ||
|
|
242
|
+
!Number.isFinite(batchSize) ||
|
|
243
|
+
batchSize < MIN_BATCH_SIZE) {
|
|
244
|
+
return DEFAULT_STALE_OPEN_ROW_BATCH_SIZE;
|
|
245
|
+
}
|
|
246
|
+
return Math.min(Math.floor(batchSize), MAX_BATCH_SIZE);
|
|
247
|
+
}
|
|
248
|
+
static getDataSource() {
|
|
249
|
+
const dataSource = PostgresAppInstance.getDataSource();
|
|
250
|
+
if (!dataSource) {
|
|
251
|
+
throw new DatabaseNotConnectedException();
|
|
252
|
+
}
|
|
253
|
+
return dataSource;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
__decorate([
|
|
257
|
+
CaptureSpan(),
|
|
258
|
+
__metadata("design:type", Function),
|
|
259
|
+
__metadata("design:paramtypes", [Object]),
|
|
260
|
+
__metadata("design:returntype", Promise)
|
|
261
|
+
], MonitorStatusTimelineReconciler, "repairStaleOpenRows", null);
|
|
262
|
+
__decorate([
|
|
263
|
+
CaptureSpan(),
|
|
264
|
+
__metadata("design:type", Function),
|
|
265
|
+
__metadata("design:paramtypes", [Object]),
|
|
266
|
+
__metadata("design:returntype", Promise)
|
|
267
|
+
], MonitorStatusTimelineReconciler, "countStaleOpenRows", null);
|
|
268
|
+
//# sourceMappingURL=MonitorStatusTimelineReconciler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MonitorStatusTimelineReconciler.js","sourceRoot":"","sources":["../../../../../Server/Utils/Monitor/MonitorStatusTimelineReconciler.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,7 +9,14 @@ export default class GreaterThan extends CompareBase {
|
|
|
9
9
|
toJSON() {
|
|
10
10
|
return {
|
|
11
11
|
_type: ObjectType.GreaterThan,
|
|
12
|
-
|
|
12
|
+
/*
|
|
13
|
+
* The RAW value is serialized (like InBetween), not toString():
|
|
14
|
+
* toString() collapses a Date to a local-timezone date-only string
|
|
15
|
+
* (asDateForDatabaseQuery), shifting Date bounds sent from the browser
|
|
16
|
+
* by up to a day. JSON.stringify emits a raw Date as its full ISO
|
|
17
|
+
* timestamp, which the server binds at full precision.
|
|
18
|
+
*/
|
|
19
|
+
value: this.value,
|
|
13
20
|
};
|
|
14
21
|
}
|
|
15
22
|
toString() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GreaterThan.js","sourceRoot":"","sources":["../../../../Types/BaseDatabase/GreaterThan.ts"],"names":[],"mappings":"AAAA,OAAO,WAA4B,MAAM,yBAAyB,CAAC;AACnE,OAAO,aAAa,MAAM,SAAS,CAAC;AACpC,OAAO,gBAAgB,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAc,UAAU,EAAE,MAAM,SAAS,CAAC;AAEjD,MAAM,CAAC,OAAO,OAAO,WAAmC,SAAQ,WAAc;IAC5E,YAAmB,KAAQ;QACzB,KAAK,CAAC,KAAK,CAAC,CAAC;IACf,CAAC;IAEe,MAAM;QACpB,OAAO;YACL,KAAK,EAAE,UAAU,CAAC,WAAW;YAC7B,KAAK,EAAG,IAAuB,CAAC,
|
|
1
|
+
{"version":3,"file":"GreaterThan.js","sourceRoot":"","sources":["../../../../Types/BaseDatabase/GreaterThan.ts"],"names":[],"mappings":"AAAA,OAAO,WAA4B,MAAM,yBAAyB,CAAC;AACnE,OAAO,aAAa,MAAM,SAAS,CAAC;AACpC,OAAO,gBAAgB,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAc,UAAU,EAAE,MAAM,SAAS,CAAC;AAEjD,MAAM,CAAC,OAAO,OAAO,WAAmC,SAAQ,WAAc;IAC5E,YAAmB,KAAQ;QACzB,KAAK,CAAC,KAAK,CAAC,CAAC;IACf,CAAC;IAEe,MAAM;QACpB,OAAO;YACL,KAAK,EAAE,UAAU,CAAC,WAAW;YAC7B;;;;;;eAMG;YACH,KAAK,EAAG,IAAuB,CAAC,KAAK;SACtC,CAAC;IACJ,CAAC;IAEe,QAAQ;QACtB,IAAI,KAAK,GAAM,IAAI,CAAC,KAAK,CAAC;QAE1B,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;YAC1B,KAAK,GAAG,aAAa,CAAC,sBAAsB,CAAC,KAAK,CAAM,CAAC;QAC3D,CAAC;QAED,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC1B,CAAC;IAEM,MAAM,CAAU,QAAQ,CAC7B,IAAgB;QAEhB,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,UAAU,CAAC,WAAW,EAAE,CAAC;YAC7C,OAAO,IAAI,WAAW,CAAC,IAAI,CAAC,OAAO,CAAM,CAAC,CAAC;QAC7C,CAAC;QAED,MAAM,IAAI,gBAAgB,CAAC,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IACtE,CAAC;CACF"}
|
|
@@ -9,7 +9,14 @@ export default class GreaterThanOrEqual extends CompareBase {
|
|
|
9
9
|
toJSON() {
|
|
10
10
|
return {
|
|
11
11
|
_type: ObjectType.GreaterThanOrEqual,
|
|
12
|
-
|
|
12
|
+
/*
|
|
13
|
+
* The RAW value is serialized (like InBetween), not toString():
|
|
14
|
+
* toString() collapses a Date to a local-timezone date-only string
|
|
15
|
+
* (asDateForDatabaseQuery), shifting Date bounds sent from the browser
|
|
16
|
+
* by up to a day. JSON.stringify emits a raw Date as its full ISO
|
|
17
|
+
* timestamp, which the server binds at full precision.
|
|
18
|
+
*/
|
|
19
|
+
value: this.value,
|
|
13
20
|
};
|
|
14
21
|
}
|
|
15
22
|
toString() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GreaterThanOrEqual.js","sourceRoot":"","sources":["../../../../Types/BaseDatabase/GreaterThanOrEqual.ts"],"names":[],"mappings":"AAAA,OAAO,WAA4B,MAAM,yBAAyB,CAAC;AACnE,OAAO,aAAa,MAAM,SAAS,CAAC;AACpC,OAAO,gBAAgB,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAc,UAAU,EAAE,MAAM,SAAS,CAAC;AAEjD,MAAM,CAAC,OAAO,OAAO,kBAEnB,SAAQ,WAAc;IACtB,YAAmB,KAAQ;QACzB,KAAK,CAAC,KAAK,CAAC,CAAC;IACf,CAAC;IAEe,MAAM;QACpB,OAAO;YACL,KAAK,EAAE,UAAU,CAAC,kBAAkB;YACpC,KAAK,EAAG,IAA8B,CAAC,
|
|
1
|
+
{"version":3,"file":"GreaterThanOrEqual.js","sourceRoot":"","sources":["../../../../Types/BaseDatabase/GreaterThanOrEqual.ts"],"names":[],"mappings":"AAAA,OAAO,WAA4B,MAAM,yBAAyB,CAAC;AACnE,OAAO,aAAa,MAAM,SAAS,CAAC;AACpC,OAAO,gBAAgB,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAc,UAAU,EAAE,MAAM,SAAS,CAAC;AAEjD,MAAM,CAAC,OAAO,OAAO,kBAEnB,SAAQ,WAAc;IACtB,YAAmB,KAAQ;QACzB,KAAK,CAAC,KAAK,CAAC,CAAC;IACf,CAAC;IAEe,MAAM;QACpB,OAAO;YACL,KAAK,EAAE,UAAU,CAAC,kBAAkB;YACpC;;;;;;eAMG;YACH,KAAK,EAAG,IAA8B,CAAC,KAAK;SAC7C,CAAC;IACJ,CAAC;IAEe,QAAQ;QACtB,IAAI,KAAK,GAAM,IAAI,CAAC,KAAK,CAAC;QAE1B,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;YAC1B,KAAK,GAAG,aAAa,CAAC,sBAAsB,CAAC,KAAK,CAAM,CAAC;QAC3D,CAAC;QAED,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC1B,CAAC;IAEM,MAAM,CAAU,QAAQ,CAC7B,IAAgB;QAEhB,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,UAAU,CAAC,kBAAkB,EAAE,CAAC;YACpD,OAAO,IAAI,kBAAkB,CAAI,IAAI,CAAC,OAAO,CAAM,CAAC,CAAC;QACvD,CAAC;QAED,MAAM,IAAI,gBAAgB,CAAC,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IACtE,CAAC;CACF"}
|
|
@@ -6,10 +6,18 @@ export default class GreaterThanOrNull extends CompareBase {
|
|
|
6
6
|
constructor(value) {
|
|
7
7
|
super(value);
|
|
8
8
|
}
|
|
9
|
+
/*
|
|
10
|
+
* Serializes the RAW value (like InBetween does), not toString(): toString()
|
|
11
|
+
* collapses a Date to a date-only string in the LOCAL timezone
|
|
12
|
+
* (asDateForDatabaseQuery), so a Date bound would arrive at the server as
|
|
13
|
+
* midnight of the browser's calendar date and shift the query bound by up to
|
|
14
|
+
* a day. JSON.stringify turns a raw Date into its full ISO timestamp, which
|
|
15
|
+
* the server binds at full precision.
|
|
16
|
+
*/
|
|
9
17
|
toJSON() {
|
|
10
18
|
return {
|
|
11
19
|
_type: ObjectType.GreaterThanOrNull,
|
|
12
|
-
value: this.
|
|
20
|
+
value: this.value,
|
|
13
21
|
};
|
|
14
22
|
}
|
|
15
23
|
toString() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GreaterThanOrNull.js","sourceRoot":"","sources":["../../../../Types/BaseDatabase/GreaterThanOrNull.ts"],"names":[],"mappings":"AAAA,OAAO,WAA4B,MAAM,yBAAyB,CAAC;AACnE,OAAO,aAAa,MAAM,SAAS,CAAC;AACpC,OAAO,gBAAgB,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAc,UAAU,EAAE,MAAM,SAAS,CAAC;AAEjD,MAAM,CAAC,OAAO,OAAO,iBAEnB,SAAQ,WAAc;IACtB,YAAmB,KAAQ;QACzB,KAAK,CAAC,KAAK,CAAC,CAAC;IACf,CAAC;
|
|
1
|
+
{"version":3,"file":"GreaterThanOrNull.js","sourceRoot":"","sources":["../../../../Types/BaseDatabase/GreaterThanOrNull.ts"],"names":[],"mappings":"AAAA,OAAO,WAA4B,MAAM,yBAAyB,CAAC;AACnE,OAAO,aAAa,MAAM,SAAS,CAAC;AACpC,OAAO,gBAAgB,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAc,UAAU,EAAE,MAAM,SAAS,CAAC;AAEjD,MAAM,CAAC,OAAO,OAAO,iBAEnB,SAAQ,WAAc;IACtB,YAAmB,KAAQ;QACzB,KAAK,CAAC,KAAK,CAAC,CAAC;IACf,CAAC;IAED;;;;;;;OAOG;IACa,MAAM;QACpB,OAAO;YACL,KAAK,EAAE,UAAU,CAAC,iBAAiB;YACnC,KAAK,EAAG,IAA6B,CAAC,KAAK;SAC5C,CAAC;IACJ,CAAC;IAEe,QAAQ;QACtB,IAAI,KAAK,GAAM,IAAI,CAAC,KAAK,CAAC;QAE1B,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;YAC1B,KAAK,GAAG,aAAa,CAAC,sBAAsB,CAAC,KAAK,CAAM,CAAC;QAC3D,CAAC;QAED,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC1B,CAAC;IAEM,MAAM,CAAU,QAAQ,CAC7B,IAAgB;QAEhB,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,UAAU,CAAC,iBAAiB,EAAE,CAAC;YACnD,OAAO,IAAI,iBAAiB,CAAI,IAAI,CAAC,OAAO,CAAM,CAAC,CAAC;QACtD,CAAC;QAED,MAAM,IAAI,gBAAgB,CAAC,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IACtE,CAAC;CACF"}
|
|
@@ -9,7 +9,14 @@ export default class LessThan extends CompareBase {
|
|
|
9
9
|
toJSON() {
|
|
10
10
|
return {
|
|
11
11
|
_type: ObjectType.LessThan,
|
|
12
|
-
|
|
12
|
+
/*
|
|
13
|
+
* The RAW value is serialized (like InBetween), not toString():
|
|
14
|
+
* toString() collapses a Date to a local-timezone date-only string
|
|
15
|
+
* (asDateForDatabaseQuery), shifting Date bounds sent from the browser
|
|
16
|
+
* by up to a day. JSON.stringify emits a raw Date as its full ISO
|
|
17
|
+
* timestamp, which the server binds at full precision.
|
|
18
|
+
*/
|
|
19
|
+
value: this.value,
|
|
13
20
|
};
|
|
14
21
|
}
|
|
15
22
|
toString() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LessThan.js","sourceRoot":"","sources":["../../../../Types/BaseDatabase/LessThan.ts"],"names":[],"mappings":"AAAA,OAAO,WAA4B,MAAM,yBAAyB,CAAC;AACnE,OAAO,aAAa,MAAM,SAAS,CAAC;AACpC,OAAO,gBAAgB,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAc,UAAU,EAAE,MAAM,SAAS,CAAC;AAEjD,MAAM,CAAC,OAAO,OAAO,QAAgC,SAAQ,WAAc;IACzE,YAAmB,KAAQ;QACzB,KAAK,CAAC,KAAK,CAAC,CAAC;IACf,CAAC;IAEe,MAAM;QACpB,OAAO;YACL,KAAK,EAAE,UAAU,CAAC,QAAQ;YAC1B,KAAK,EAAG,IAAoB,CAAC,
|
|
1
|
+
{"version":3,"file":"LessThan.js","sourceRoot":"","sources":["../../../../Types/BaseDatabase/LessThan.ts"],"names":[],"mappings":"AAAA,OAAO,WAA4B,MAAM,yBAAyB,CAAC;AACnE,OAAO,aAAa,MAAM,SAAS,CAAC;AACpC,OAAO,gBAAgB,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAc,UAAU,EAAE,MAAM,SAAS,CAAC;AAEjD,MAAM,CAAC,OAAO,OAAO,QAAgC,SAAQ,WAAc;IACzE,YAAmB,KAAQ;QACzB,KAAK,CAAC,KAAK,CAAC,CAAC;IACf,CAAC;IAEe,MAAM;QACpB,OAAO;YACL,KAAK,EAAE,UAAU,CAAC,QAAQ;YAC1B;;;;;;eAMG;YACH,KAAK,EAAG,IAAoB,CAAC,KAAK;SACnC,CAAC;IACJ,CAAC;IAEe,QAAQ;QACtB,IAAI,KAAK,GAAM,IAAI,CAAC,KAAK,CAAC;QAE1B,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;YAC1B,KAAK,GAAG,aAAa,CAAC,sBAAsB,CAAC,KAAK,CAAM,CAAC;QAC3D,CAAC;QAED,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC1B,CAAC;IAEM,MAAM,CAAU,QAAQ,CAC7B,IAAgB;QAEhB,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,UAAU,CAAC,QAAQ,EAAE,CAAC;YAC1C,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAM,CAAC,CAAC;QAC1C,CAAC;QAED,MAAM,IAAI,gBAAgB,CAAC,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IACtE,CAAC;CACF"}
|
|
@@ -6,10 +6,18 @@ export default class LessThanOrEqual extends CompareBase {
|
|
|
6
6
|
constructor(value) {
|
|
7
7
|
super(value);
|
|
8
8
|
}
|
|
9
|
+
/*
|
|
10
|
+
* Serializes the RAW value (like InBetween does), not toString(): toString()
|
|
11
|
+
* collapses a Date to a date-only string in the LOCAL timezone
|
|
12
|
+
* (asDateForDatabaseQuery), so a bound of "now" would arrive at the server as
|
|
13
|
+
* midnight of the browser's calendar date and silently exclude every row from
|
|
14
|
+
* today. JSON.stringify turns a raw Date into its full ISO timestamp, which
|
|
15
|
+
* the server binds at full precision.
|
|
16
|
+
*/
|
|
9
17
|
toJSON() {
|
|
10
18
|
return {
|
|
11
19
|
_type: ObjectType.LessThanOrEqual,
|
|
12
|
-
value: this.
|
|
20
|
+
value: this.value,
|
|
13
21
|
};
|
|
14
22
|
}
|
|
15
23
|
toString() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LessThanOrEqual.js","sourceRoot":"","sources":["../../../../Types/BaseDatabase/LessThanOrEqual.ts"],"names":[],"mappings":"AAAA,OAAO,WAA4B,MAAM,yBAAyB,CAAC;AACnE,OAAO,aAAa,MAAM,SAAS,CAAC;AACpC,OAAO,gBAAgB,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAc,UAAU,EAAE,MAAM,SAAS,CAAC;AAEjD,MAAM,CAAC,OAAO,OAAO,eAEnB,SAAQ,WAAc;IACtB,YAAmB,KAAQ;QACzB,KAAK,CAAC,KAAK,CAAC,CAAC;IACf,CAAC;
|
|
1
|
+
{"version":3,"file":"LessThanOrEqual.js","sourceRoot":"","sources":["../../../../Types/BaseDatabase/LessThanOrEqual.ts"],"names":[],"mappings":"AAAA,OAAO,WAA4B,MAAM,yBAAyB,CAAC;AACnE,OAAO,aAAa,MAAM,SAAS,CAAC;AACpC,OAAO,gBAAgB,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAc,UAAU,EAAE,MAAM,SAAS,CAAC;AAEjD,MAAM,CAAC,OAAO,OAAO,eAEnB,SAAQ,WAAc;IACtB,YAAmB,KAAQ;QACzB,KAAK,CAAC,KAAK,CAAC,CAAC;IACf,CAAC;IAED;;;;;;;OAOG;IACa,MAAM;QACpB,OAAO;YACL,KAAK,EAAE,UAAU,CAAC,eAAe;YACjC,KAAK,EAAG,IAA2B,CAAC,KAAK;SAC1C,CAAC;IACJ,CAAC;IAEe,QAAQ;QACtB,IAAI,KAAK,GAAM,IAAI,CAAC,KAAK,CAAC;QAE1B,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;YAC1B,KAAK,GAAG,aAAa,CAAC,sBAAsB,CAAC,KAAK,CAAM,CAAC;QAC3D,CAAC;QAED,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC1B,CAAC;IAEM,MAAM,CAAU,QAAQ,CAC7B,IAAgB;QAEhB,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,UAAU,CAAC,eAAe,EAAE,CAAC;YACjD,OAAO,IAAI,eAAe,CAAI,IAAI,CAAC,OAAO,CAAM,CAAC,CAAC;QACpD,CAAC;QAED,MAAM,IAAI,gBAAgB,CAAC,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IACtE,CAAC;CACF"}
|
|
@@ -9,7 +9,14 @@ export default class LessThanOrNull extends CompareBase {
|
|
|
9
9
|
toJSON() {
|
|
10
10
|
return {
|
|
11
11
|
_type: ObjectType.LessThanOrNull,
|
|
12
|
-
|
|
12
|
+
/*
|
|
13
|
+
* The RAW value is serialized (like InBetween), not toString():
|
|
14
|
+
* toString() collapses a Date to a local-timezone date-only string
|
|
15
|
+
* (asDateForDatabaseQuery), shifting Date bounds sent from the browser
|
|
16
|
+
* by up to a day. JSON.stringify emits a raw Date as its full ISO
|
|
17
|
+
* timestamp, which the server binds at full precision.
|
|
18
|
+
*/
|
|
19
|
+
value: this.value,
|
|
13
20
|
};
|
|
14
21
|
}
|
|
15
22
|
toString() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LessThanOrNull.js","sourceRoot":"","sources":["../../../../Types/BaseDatabase/LessThanOrNull.ts"],"names":[],"mappings":"AAAA,OAAO,WAA4B,MAAM,yBAAyB,CAAC;AACnE,OAAO,aAAa,MAAM,SAAS,CAAC;AACpC,OAAO,gBAAgB,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAc,UAAU,EAAE,MAAM,SAAS,CAAC;AAEjD,MAAM,CAAC,OAAO,OAAO,cAEnB,SAAQ,WAAc;IACtB,YAAmB,KAAQ;QACzB,KAAK,CAAC,KAAK,CAAC,CAAC;IACf,CAAC;IAEe,MAAM;QACpB,OAAO;YACL,KAAK,EAAE,UAAU,CAAC,cAAc;YAChC,KAAK,EAAG,IAA0B,CAAC,
|
|
1
|
+
{"version":3,"file":"LessThanOrNull.js","sourceRoot":"","sources":["../../../../Types/BaseDatabase/LessThanOrNull.ts"],"names":[],"mappings":"AAAA,OAAO,WAA4B,MAAM,yBAAyB,CAAC;AACnE,OAAO,aAAa,MAAM,SAAS,CAAC;AACpC,OAAO,gBAAgB,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAc,UAAU,EAAE,MAAM,SAAS,CAAC;AAEjD,MAAM,CAAC,OAAO,OAAO,cAEnB,SAAQ,WAAc;IACtB,YAAmB,KAAQ;QACzB,KAAK,CAAC,KAAK,CAAC,CAAC;IACf,CAAC;IAEe,MAAM;QACpB,OAAO;YACL,KAAK,EAAE,UAAU,CAAC,cAAc;YAChC;;;;;;eAMG;YACH,KAAK,EAAG,IAA0B,CAAC,KAAK;SACzC,CAAC;IACJ,CAAC;IAEe,QAAQ;QACtB,IAAI,KAAK,GAAM,IAAI,CAAC,KAAK,CAAC;QAE1B,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;YAC1B,KAAK,GAAG,aAAa,CAAC,sBAAsB,CAAC,KAAK,CAAM,CAAC;QAC3D,CAAC;QAED,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC1B,CAAC;IAEM,MAAM,CAAU,QAAQ,CAC7B,IAAgB;QAEhB,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,UAAU,CAAC,cAAc,EAAE,CAAC;YAChD,OAAO,IAAI,cAAc,CAAI,IAAI,CAAC,OAAO,CAAM,CAAC,CAAC;QACnD,CAAC;QAED,MAAM,IAAI,gBAAgB,CAAC,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IACtE,CAAC;CACF"}
|
|
@@ -88,7 +88,7 @@ export default class StatusPageResourceUptimeUtil {
|
|
|
88
88
|
monitorsInGroup: data.monitorsInGroup,
|
|
89
89
|
});
|
|
90
90
|
const downtimeMonitorStatuses = (data === null || data === void 0 ? void 0 : data.downtimeMonitorStatuses) || [];
|
|
91
|
-
const uptimePercent = UptimeUtil.calculateUptimePercentage(monitorStatusTimelines, data.precision, downtimeMonitorStatuses);
|
|
91
|
+
const uptimePercent = UptimeUtil.calculateUptimePercentage(monitorStatusTimelines, data.precision, downtimeMonitorStatuses, data.uptimeWindow);
|
|
92
92
|
return uptimePercent;
|
|
93
93
|
}
|
|
94
94
|
static calculateAvgUptimePercentOfStatusPageGroup(data) {
|
|
@@ -110,6 +110,7 @@ export default class StatusPageResourceUptimeUtil {
|
|
|
110
110
|
precision: data.precision,
|
|
111
111
|
downtimeMonitorStatuses: data.downtimeMonitorStatuses,
|
|
112
112
|
monitorsInGroup: data.monitorsInGroup,
|
|
113
|
+
uptimeWindow: data.uptimeWindow,
|
|
113
114
|
});
|
|
114
115
|
if (calculateUptimePercentOfResource !== null) {
|
|
115
116
|
uptimePercentPerResource.push(calculateUptimePercentOfResource);
|
|
@@ -161,6 +162,7 @@ export default class StatusPageResourceUptimeUtil {
|
|
|
161
162
|
downtimeMonitorStatuses: data.downtimeMonitorStatuses,
|
|
162
163
|
statusPageResources: data.statusPageResources,
|
|
163
164
|
monitorsInGroup: data.monitorsInGroup,
|
|
165
|
+
uptimeWindow: data.uptimeWindow,
|
|
164
166
|
});
|
|
165
167
|
if (calculateAvgUptimePercentOfStatusPageGroup !== null) {
|
|
166
168
|
allUptimePercent.push(calculateAvgUptimePercentOfStatusPageGroup);
|
|
@@ -177,6 +179,7 @@ export default class StatusPageResourceUptimeUtil {
|
|
|
177
179
|
precision: data.precision,
|
|
178
180
|
downtimeMonitorStatuses: data.downtimeMonitorStatuses,
|
|
179
181
|
monitorsInGroup: data.monitorsInGroup,
|
|
182
|
+
uptimeWindow: data.uptimeWindow,
|
|
180
183
|
});
|
|
181
184
|
if (calculateUptimePercentOfResource !== null) {
|
|
182
185
|
allUptimePercent.push(calculateUptimePercentOfResource);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResourceUptime.js","sourceRoot":"","sources":["../../../../Utils/StatusPage/ResourceUptime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAEhD,OAAO,aAAa,MAAM,2CAA2C,CAAC;AAItE,OAAO,eAAe,MAAM,wCAAwC,CAAC;AAErE,OAAO,
|
|
1
|
+
{"version":3,"file":"ResourceUptime.js","sourceRoot":"","sources":["../../../../Utils/StatusPage/ResourceUptime.ts"],"names":[],"mappings":"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"}
|