From 94d1c0adaedff8152526b84cc9f2479d54efb851 Mon Sep 17 00:00:00 2001 From: admin Date: Tue, 24 Feb 2026 11:31:04 -0500 Subject: [PATCH] feat(01-01): create monitoring tables migration - Add service_health_checks table with status CHECK constraint, JSONB probe_details, checked_at column - Add alert_events table with alert_type and status CHECK constraints, lifecycle timestamps - Add created_at indexes on both tables (INFR-01 requirement) - Add composite indexes for common query patterns - Enable RLS on both tables (service role bypasses RLS per Supabase pattern) --- .../012_create_monitoring_tables.sql | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 backend/src/models/migrations/012_create_monitoring_tables.sql diff --git a/backend/src/models/migrations/012_create_monitoring_tables.sql b/backend/src/models/migrations/012_create_monitoring_tables.sql new file mode 100644 index 0000000..d3ea12b --- /dev/null +++ b/backend/src/models/migrations/012_create_monitoring_tables.sql @@ -0,0 +1,64 @@ +-- Migration: Create monitoring tables for service health checks and alert events +-- Created: 2026-02-24 +-- Purpose: Establish data foundation for the monitoring system. +-- Phase 1 of the monitoring feature — tables must exist before health probes +-- or alert services can write data. + +-- ============================================================================= +-- TABLE: service_health_checks +-- Records the result of each health probe run against a monitored service. +-- ============================================================================= + +CREATE TABLE IF NOT EXISTS service_health_checks ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + service_name VARCHAR(100) NOT NULL, + status TEXT NOT NULL CHECK (status IN ('healthy', 'degraded', 'down')), + latency_ms INTEGER, -- nullable: not applicable for all probe types + checked_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, -- when the probe actually ran (distinct from created_at) + error_message TEXT, -- nullable: probe failure details + probe_details JSONB, -- nullable: flexible metadata (response codes, error specifics, etc.) + created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP +); + +-- Index required by INFR-01: supports 30-day retention queries +CREATE INDEX IF NOT EXISTS idx_service_health_checks_created_at + ON service_health_checks(created_at); + +-- Composite index for dashboard "latest check per service" queries +CREATE INDEX IF NOT EXISTS idx_service_health_checks_service_created + ON service_health_checks(service_name, created_at); + +-- Enable RLS (service role key bypasses RLS automatically — explicit policies added in Phase 3) +ALTER TABLE service_health_checks ENABLE ROW LEVEL SECURITY; + +-- ============================================================================= +-- TABLE: alert_events +-- Tracks alert lifecycle: creation, acknowledgement, and resolution. +-- ============================================================================= + +CREATE TABLE IF NOT EXISTS alert_events ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + service_name VARCHAR(100) NOT NULL, + alert_type TEXT NOT NULL CHECK (alert_type IN ('service_down', 'service_degraded', 'recovery')), + status TEXT NOT NULL CHECK (status IN ('active', 'acknowledged', 'resolved')), + message TEXT, -- nullable: human-readable alert description + details JSONB, -- nullable: structured metadata about the alert + created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, + acknowledged_at TIMESTAMP WITH TIME ZONE, -- nullable: set when status → acknowledged + resolved_at TIMESTAMP WITH TIME ZONE -- nullable: set when status → resolved +); + +-- Index required by INFR-01: supports 30-day retention queries +CREATE INDEX IF NOT EXISTS idx_alert_events_created_at + ON alert_events(created_at); + +-- Index for "active alerts" queries +CREATE INDEX IF NOT EXISTS idx_alert_events_status + ON alert_events(status); + +-- Composite index for "active alerts per service" queries +CREATE INDEX IF NOT EXISTS idx_alert_events_service_status + ON alert_events(service_name, status); + +-- Enable RLS (service role key bypasses RLS automatically — explicit policies added in Phase 3) +ALTER TABLE alert_events ENABLE ROW LEVEL SECURITY;