Files
call_monitor/migrations/002_function_stats_view.sql
2026-05-14 00:28:13 +02:00

101 lines
3.8 KiB
SQL

-- Vista agregada por funcion del registry. Lectura O(N) sobre tablas event-log.
-- Si performance degrada, materializar como TABLE refrescada por cron.
DROP VIEW IF EXISTS function_stats;
CREATE VIEW function_stats AS
WITH
call_agg AS (
SELECT
function_id,
COUNT(*) AS calls_total,
SUM(CASE WHEN ts >= CAST(strftime('%s','now','-1 day') AS INTEGER) THEN 1 ELSE 0 END) AS calls_24h,
SUM(CASE WHEN ts >= CAST(strftime('%s','now','-7 days') AS INTEGER) THEN 1 ELSE 0 END) AS calls_7d,
SUM(CASE WHEN ts >= CAST(strftime('%s','now','-30 days') AS INTEGER) THEN 1 ELSE 0 END) AS calls_30d,
SUM(CASE WHEN ts >= CAST(strftime('%s','now','-90 days') AS INTEGER) THEN 1 ELSE 0 END) AS calls_90d,
SUM(CASE WHEN success = 0 THEN 1 ELSE 0 END) AS errors_total,
AVG(duration_ms) AS mean_duration_ms,
MAX(ts) AS last_used_at,
MAX(CASE WHEN success = 0 THEN ts ELSE 0 END) AS last_error_ts
FROM calls
WHERE function_id != ''
GROUP BY function_id
),
write_agg AS (
SELECT function_id, COUNT(*) AS writes_count, MAX(ts) AS last_write_at
FROM code_writes
WHERE function_id != ''
GROUP BY function_id
),
test_agg AS (
SELECT
function_id,
COUNT(*) AS tests_total,
SUM(CASE WHEN passed = 0 THEN 1 ELSE 0 END) AS tests_failed,
MAX(CASE WHEN passed = 0 THEN ts ELSE 0 END) AS last_test_failed_at
FROM test_runs
WHERE function_id != ''
GROUP BY function_id
),
e2e_agg AS (
SELECT
function_id,
COUNT(*) AS e2e_total,
SUM(CASE WHEN passed = 0 THEN 1 ELSE 0 END) AS e2e_failed,
COUNT(DISTINCT app_id) AS consumer_apps_count
FROM e2e_runs_fn
GROUP BY function_id
),
viol_agg AS (
SELECT function_id, COUNT(*) AS violations_caused
FROM violations
WHERE function_id != ''
GROUP BY function_id
),
all_fns AS (
SELECT function_id FROM call_agg
UNION
SELECT function_id FROM write_agg
UNION
SELECT function_id FROM test_agg
UNION
SELECT function_id FROM e2e_agg
UNION
SELECT function_id FROM viol_agg
)
SELECT
f.function_id,
COALESCE(c.calls_total, 0) AS calls_total,
COALESCE(c.calls_24h, 0) AS calls_24h,
COALESCE(c.calls_7d, 0) AS calls_7d,
COALESCE(c.calls_30d, 0) AS calls_30d,
COALESCE(c.calls_90d, 0) AS calls_90d,
COALESCE(c.errors_total, 0) AS errors_total,
CASE WHEN COALESCE(c.calls_total, 0) > 0
THEN CAST(c.errors_total AS REAL) / c.calls_total
ELSE 0 END AS error_rate,
COALESCE(c.mean_duration_ms, 0) AS mean_duration_ms,
c.last_used_at,
CASE WHEN c.last_error_ts > 0 THEN c.last_error_ts END AS last_error_ts,
COALESCE(w.writes_count, 0) AS writes_count,
w.last_write_at,
COALESCE(t.tests_total, 0) AS tests_total,
COALESCE(t.tests_failed, 0) AS tests_failed,
CASE WHEN COALESCE(t.tests_total, 0) > 0
THEN CAST(t.tests_failed AS REAL) / t.tests_total
ELSE 0 END AS test_fail_rate,
CASE WHEN t.last_test_failed_at > 0 THEN t.last_test_failed_at END AS last_test_failed_at,
COALESCE(e.e2e_total, 0) AS e2e_total,
COALESCE(e.e2e_failed, 0) AS e2e_failed,
CASE WHEN COALESCE(e.e2e_total, 0) > 0
THEN CAST(e.e2e_failed AS REAL) / e.e2e_total
ELSE 0 END AS e2e_fail_rate,
COALESCE(e.consumer_apps_count, 0) AS consumer_apps_count,
COALESCE(v.violations_caused, 0) AS violations_caused
FROM all_fns f
LEFT JOIN call_agg c ON c.function_id = f.function_id
LEFT JOIN write_agg w ON w.function_id = f.function_id
LEFT JOIN test_agg t ON t.function_id = f.function_id
LEFT JOIN e2e_agg e ON e.function_id = f.function_id
LEFT JOIN viol_agg v ON v.function_id = f.function_id;