Files
AtreidesAssetsFree/server/data/api-metrics.js
T
2026-10-29 11:57:29 +01:00

57 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]);
}