@oneuptime/common 10.0.54 → 10.0.55
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.
|
@@ -94,13 +94,15 @@ export class Service extends DatabaseService<MonitorProbe> {
|
|
|
94
94
|
const claimedIds: Array<ObjectID> = await this.executeTransaction(
|
|
95
95
|
async (transactionalEntityManager: EntityManager) => {
|
|
96
96
|
/*
|
|
97
|
-
*
|
|
97
|
+
* Select and lock the monitor probes that need to be processed,
|
|
98
|
+
* including the monitoringInterval so we can compute the real nextPingAt
|
|
99
|
+
* in a single UPDATE (avoiding a second round-trip).
|
|
98
100
|
* FOR UPDATE SKIP LOCKED ensures that:
|
|
99
101
|
* 1. Rows are locked for this transaction
|
|
100
102
|
* 2. Rows already locked by other transactions are skipped
|
|
101
103
|
*/
|
|
102
104
|
const selectQuery: string = `
|
|
103
|
-
SELECT mp."_id"
|
|
105
|
+
SELECT mp."_id", m."monitoringInterval"
|
|
104
106
|
FROM "MonitorProbe" mp
|
|
105
107
|
INNER JOIN "Monitor" m ON mp."monitorId" = m."_id"
|
|
106
108
|
INNER JOIN "Project" p ON mp."projectId" = p."_id"
|
|
@@ -122,41 +124,60 @@ export class Service extends DatabaseService<MonitorProbe> {
|
|
|
122
124
|
FOR UPDATE OF mp SKIP LOCKED
|
|
123
125
|
`;
|
|
124
126
|
|
|
125
|
-
const selectedRows: Array<{
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
127
|
+
const selectedRows: Array<{
|
|
128
|
+
_id: string;
|
|
129
|
+
monitoringInterval: string | null;
|
|
130
|
+
}> = await transactionalEntityManager.query(selectQuery, [
|
|
131
|
+
data.probeId.toString(),
|
|
132
|
+
currentDate,
|
|
133
|
+
data.limit,
|
|
134
|
+
]);
|
|
131
135
|
|
|
132
136
|
if (selectedRows.length === 0) {
|
|
133
137
|
return [];
|
|
134
138
|
}
|
|
135
139
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
});
|
|
139
|
-
|
|
140
|
-
/*
|
|
141
|
-
* Update the claimed monitors to set nextPingAt to 1 minute from now
|
|
142
|
-
* This is a temporary value; the actual nextPingAt will be calculated
|
|
143
|
-
* based on the monitor's interval after the probe fetches the full details
|
|
144
|
-
*/
|
|
145
|
-
const tempNextPingAt: Date = OneUptimeDate.addRemoveMinutes(
|
|
140
|
+
// Compute the real nextPingAt per monitor and batch-update in one query
|
|
141
|
+
const defaultNextPing: Date = OneUptimeDate.addRemoveMinutes(
|
|
146
142
|
currentDate,
|
|
147
143
|
1,
|
|
148
144
|
);
|
|
149
145
|
|
|
146
|
+
const ids: Array<string> = [];
|
|
147
|
+
const nextPingDates: Array<Date> = [];
|
|
148
|
+
const caseFragments: Array<string> = [];
|
|
149
|
+
|
|
150
|
+
for (let i: number = 0; i < selectedRows.length; i++) {
|
|
151
|
+
const row: { _id: string; monitoringInterval: string | null } =
|
|
152
|
+
selectedRows[i]!;
|
|
153
|
+
ids.push(row._id);
|
|
154
|
+
|
|
155
|
+
let nextPing: Date = defaultNextPing;
|
|
156
|
+
if (row.monitoringInterval) {
|
|
157
|
+
try {
|
|
158
|
+
nextPing = CronTab.getNextExecutionTime(row.monitoringInterval);
|
|
159
|
+
} catch {
|
|
160
|
+
// fall back to default 1 minute
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
nextPingDates.push(nextPing);
|
|
165
|
+
caseFragments.push(
|
|
166
|
+
`WHEN '${row._id}'::uuid THEN $${i + 3}::timestamptz`,
|
|
167
|
+
);
|
|
168
|
+
}
|
|
169
|
+
|
|
150
170
|
const updateQuery: string = `
|
|
151
171
|
UPDATE "MonitorProbe"
|
|
152
|
-
SET "lastPingAt" = $1,
|
|
153
|
-
|
|
172
|
+
SET "lastPingAt" = $1,
|
|
173
|
+
"nextPingAt" = CASE "_id" ${caseFragments.join(" ")} END
|
|
174
|
+
WHERE "_id" = ANY($2::uuid[])
|
|
154
175
|
`;
|
|
155
176
|
|
|
156
177
|
await transactionalEntityManager.query(updateQuery, [
|
|
157
178
|
currentDate,
|
|
158
|
-
tempNextPingAt,
|
|
159
179
|
ids,
|
|
180
|
+
...nextPingDates,
|
|
160
181
|
]);
|
|
161
182
|
|
|
162
183
|
return ids.map((id: string) => {
|
|
@@ -74,13 +74,15 @@ export class Service extends DatabaseService {
|
|
|
74
74
|
*/
|
|
75
75
|
const claimedIds = await this.executeTransaction(async (transactionalEntityManager) => {
|
|
76
76
|
/*
|
|
77
|
-
*
|
|
77
|
+
* Select and lock the monitor probes that need to be processed,
|
|
78
|
+
* including the monitoringInterval so we can compute the real nextPingAt
|
|
79
|
+
* in a single UPDATE (avoiding a second round-trip).
|
|
78
80
|
* FOR UPDATE SKIP LOCKED ensures that:
|
|
79
81
|
* 1. Rows are locked for this transaction
|
|
80
82
|
* 2. Rows already locked by other transactions are skipped
|
|
81
83
|
*/
|
|
82
84
|
const selectQuery = `
|
|
83
|
-
SELECT mp."_id"
|
|
85
|
+
SELECT mp."_id", m."monitoringInterval"
|
|
84
86
|
FROM "MonitorProbe" mp
|
|
85
87
|
INNER JOIN "Monitor" m ON mp."monitorId" = m."_id"
|
|
86
88
|
INNER JOIN "Project" p ON mp."projectId" = p."_id"
|
|
@@ -109,24 +111,36 @@ export class Service extends DatabaseService {
|
|
|
109
111
|
if (selectedRows.length === 0) {
|
|
110
112
|
return [];
|
|
111
113
|
}
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
114
|
+
// Compute the real nextPingAt per monitor and batch-update in one query
|
|
115
|
+
const defaultNextPing = OneUptimeDate.addRemoveMinutes(currentDate, 1);
|
|
116
|
+
const ids = [];
|
|
117
|
+
const nextPingDates = [];
|
|
118
|
+
const caseFragments = [];
|
|
119
|
+
for (let i = 0; i < selectedRows.length; i++) {
|
|
120
|
+
const row = selectedRows[i];
|
|
121
|
+
ids.push(row._id);
|
|
122
|
+
let nextPing = defaultNextPing;
|
|
123
|
+
if (row.monitoringInterval) {
|
|
124
|
+
try {
|
|
125
|
+
nextPing = CronTab.getNextExecutionTime(row.monitoringInterval);
|
|
126
|
+
}
|
|
127
|
+
catch (_a) {
|
|
128
|
+
// fall back to default 1 minute
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
nextPingDates.push(nextPing);
|
|
132
|
+
caseFragments.push(`WHEN '${row._id}'::uuid THEN $${i + 3}::timestamptz`);
|
|
133
|
+
}
|
|
121
134
|
const updateQuery = `
|
|
122
135
|
UPDATE "MonitorProbe"
|
|
123
|
-
SET "lastPingAt" = $1,
|
|
124
|
-
|
|
136
|
+
SET "lastPingAt" = $1,
|
|
137
|
+
"nextPingAt" = CASE "_id" ${caseFragments.join(" ")} END
|
|
138
|
+
WHERE "_id" = ANY($2::uuid[])
|
|
125
139
|
`;
|
|
126
140
|
await transactionalEntityManager.query(updateQuery, [
|
|
127
141
|
currentDate,
|
|
128
|
-
tempNextPingAt,
|
|
129
142
|
ids,
|
|
143
|
+
...nextPingDates,
|
|
130
144
|
]);
|
|
131
145
|
return ids.map((id) => {
|
|
132
146
|
return new ObjectID(id);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MonitorProbeService.js","sourceRoot":"","sources":["../../../../Server/Services/MonitorProbeService.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,sBAAsB,CAAC;AAG5C,OAAO,eAAkC,MAAM,mBAAmB,CAAC;AACnE,OAAO,aAAa,MAAM,kBAAkB,CAAC;AAC7C,OAAO,gBAAgB,MAAM,wCAAwC,CAAC;AACtE,OAAO,YAAY,MAAM,0CAA0C,CAAC;AAEpE,OAAO,WAAW,MAAM,+BAA+B,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,cAAc,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,OAAO,MAAM,kBAAkB,CAAC;AACvC,OAAO,MAAyB,MAAM,iBAAiB,CAAC;AAExD,MAAM,OAAO,OAAQ,SAAQ,eAA6B;IACxD;QACE,KAAK,CAAC,YAAY,CAAC,CAAC;IACtB,CAAC;IAEM,KAAK,CAAC,0BAA0B,CAAC,IAEvC;;QACC,MAAM,aAAa,GAAwB,MAAM,IAAI,CAAC,MAAM,CAAC;YAC3D,KAAK,EAAE;gBACL,SAAS,EAAE,IAAI,CAAC,SAAS;aAC1B;YACD,MAAM,EAAE;gBACN,UAAU,EAAE,IAAI;gBAChB,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE;oBACP,kBAAkB,EAAE,IAAI;iBACzB;aACF;YACD,KAAK,EAAE,iBAAiB;YACxB,IAAI,EAAE,CAAC;YACP,KAAK,EAAE;gBACL,MAAM,EAAE,IAAI;aACb;SACF,CAAC,CAAC;QAEH,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE,CAAC;YACzC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;gBAC1B,SAAS;YACX,CAAC;YAED,IAAI,QAAQ,GAAS,aAAa,CAAC,gBAAgB,CACjD,aAAa,CAAC,cAAc,EAAE,EAC9B,CAAC,CACF,CAAC;YAEF,IAAI,CAAC;gBACH,QAAQ,GAAG,OAAO,CAAC,oBAAoB,CACrC,MAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,OAAO,0CAAE,kBAA4B,CACpD,CAAC;YACJ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE;oBAChB,SAAS,EAAE,MAAA,IAAI,CAAC,SAAS,0CAAE,QAAQ,EAAE;iBACrB,CAAC,CAAC;YACtB,CAAC;YAED,IAAI,QAAQ,IAAI,YAAY,CAAC,EAAE,EAAE,CAAC;gBAChC,MAAM,IAAI,CAAC,aAAa,CAAC;oBACvB,EAAE,EAAE,YAAY,CAAC,EAAE;oBACnB,IAAI,EAAE;wBACJ,UAAU,EAAE,QAAQ;qBACrB;oBACD,KAAK,EAAE;wBACL,MAAM,EAAE,IAAI;qBACb;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;;;;OAOG;IACI,KAAK,CAAC,4BAA4B,CAAC,IAGzC;QACC,MAAM,WAAW,GAAS,aAAa,CAAC,cAAc,EAAE,CAAC;QAEzD;;;WAGG;QACH,MAAM,UAAU,GAAoB,MAAM,IAAI,CAAC,kBAAkB,CAC/D,KAAK,EAAE,0BAAyC,EAAE,EAAE;YAClD
|
|
1
|
+
{"version":3,"file":"MonitorProbeService.js","sourceRoot":"","sources":["../../../../Server/Services/MonitorProbeService.ts"],"names":[],"mappings":"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"}
|