56 lines
3.1 KiB
JavaScript
56 lines
3.1 KiB
JavaScript
// Generated, do not edit. sha256:227dda965713b9b51597f6f128f59f6569f0a5729dc340b98c56d958390f053d
|
|||
|
|
import * as db from '../db.js';
|
||
|
|
|
||
|
|
export async function recordApiCall({ providerId, capability, ok, latency_ms }) {
|
||
|
|
if (!Number.isInteger(providerId)) return;
|
||
|
|
const bucket = new Date().toISOString().slice(0, 16);
|
||
|
|
const lat = Number.isFinite(latency_ms) ? Math.max(0, Math.round(latency_ms)) : 0;
|
||
|
|
db.run(`INSERT INTO ApiCallMetric (providerId, capability, bucketMinute, okCount, failCount, sumLatencyMs, maxLatencyMs)
|
||
|
|
VALUES (?,?,?,?,?,?,?)
|
||
|
|
ON CONFLICT(providerId, capability, bucketMinute) DO UPDATE SET
|
||
|
|
okCount = okCount + excluded.okCount,
|
||
|
|
failCount = failCount + excluded.failCount,
|
||
|
|
sumLatencyMs = sumLatencyMs + excluded.sumLatencyMs,
|
||
|
|
maxLatencyMs = MAX(maxLatencyMs, excluded.maxLatencyMs)`,
|
||
|
|
[providerId, capability, bucket, ok ? 1 : 0, ok ? 0 : 1, lat, lat]);
|
||
|
|
await db.persist();
|
||
|
|
}
|
||
|
|
|
||
|
|
export function apiMetricsTotals(providerId, sinceBucket) {
|
||
|
|
const r = db.one(`SELECT COALESCE(SUM(okCount),0) AS ok, COALESCE(SUM(failCount),0) AS fail,
|
||
|
|
COALESCE(SUM(sumLatencyMs),0) AS sum_lat, COALESCE(MAX(maxLatencyMs),0) AS max_lat
|
||
|
|
FROM ApiCallMetric WHERE providerId = ? AND bucketMinute >= ?`, [providerId, sinceBucket]);
|
||
|
|
const calls = (r.ok || 0) + (r.fail || 0);
|
||
|
|
return { ok: r.ok || 0, fail: r.fail || 0, calls,
|
||
|
|
avg_latency_ms: calls ? Math.round(r.sum_lat / calls) : 0, maxLatencyMs: r.max_lat || 0 };
|
||
|
|
}
|
||
|
|
|
||
|
|
export function apiMetricsGlobal(sinceBucket) {
|
||
|
|
const r = db.one(`SELECT COALESCE(SUM(okCount),0) AS ok, COALESCE(SUM(failCount),0) AS fail,
|
||
|
|
COALESCE(SUM(sumLatencyMs),0) AS sum_lat, COALESCE(MAX(maxLatencyMs),0) AS max_lat
|
||
|
|
FROM ApiCallMetric WHERE bucketMinute >= ?`, [sinceBucket]);
|
||
|
|
const calls = (r.ok || 0) + (r.fail || 0);
|
||
|
|
return { ok: r.ok || 0, fail: r.fail || 0, calls,
|
||
|
|
avg_latency_ms: calls ? Math.round(r.sum_lat / calls) : 0, maxLatencyMs: r.max_lat || 0 };
|
||
|
|
}
|
||
|
|
|
||
|
|
export function apiCallsByProvider(sinceBucket) {
|
||
|
|
return db.all(`SELECT providerId, SUM(okCount) + SUM(failCount) AS calls
|
||
|
|
FROM ApiCallMetric WHERE bucketMinute >= ?
|
||
|
|
GROUP BY providerId`, [sinceBucket]);
|
||
|
|
}
|
||
|
|
|
||
|
|
export function apiMetricsByCapability(providerId, sinceBucket) {
|
||
|
|
return db.all(`SELECT capability, SUM(okCount) AS ok, SUM(failCount) AS fail,
|
||
|
|
SUM(sumLatencyMs) AS sum_lat, MAX(maxLatencyMs) AS max_lat
|
||
|
|
FROM ApiCallMetric WHERE providerId = ? AND bucketMinute >= ?
|
||
|
|
GROUP BY capability ORDER BY capability`, [providerId, sinceBucket]);
|
||
|
|
}
|
||
|
|
|
||
|
|
export function apiMetricsSeries(providerId, sinceBucket, groupLen) {
|
||
|
|
return db.all(`SELECT substr(bucketMinute,1,?) AS b,
|
||
|
|
COALESCE(SUM(okCount),0) AS ok, COALESCE(SUM(failCount),0) AS fail,
|
||
|
|
COALESCE(MAX(maxLatencyMs),0) AS max_lat
|
||
|
|
FROM ApiCallMetric WHERE providerId = ? AND bucketMinute >= ?
|
||
|
|
GROUP BY b ORDER BY b`, [groupLen, providerId, sinceBucket]);
|
||
|
|
}
|