Files
story/migrations/000022_alert_operations.up.sql
T

96 lines
5.6 KiB
PL/PgSQL

BEGIN;
CREATE TABLE alert_routing_policy (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
public_id uuid NOT NULL UNIQUE DEFAULT gen_random_uuid(),
tenant_id uuid NOT NULL REFERENCES tenant(id),
category varchar(20) NOT NULL CHECK (category IN ('BUSINESS','TECHNICAL','SECURITY','COST')),
severity varchar(16) NOT NULL CHECK (severity IN ('CRITICAL','HIGH','MEDIUM','LOW')),
version_no integer NOT NULL CHECK (version_no>0),
status varchar(16) NOT NULL DEFAULT 'ACTIVE' CHECK (status IN ('ACTIVE','RETIRED')),
receiver_group varchar(120) NOT NULL,
response_minutes integer NOT NULL CHECK (response_minutes BETWEEN 1 AND 10080),
escalation_after_minutes integer NOT NULL CHECK (escalation_after_minutes BETWEEN 1 AND 10080),
escalation_receiver_group varchar(120) NOT NULL,
runbook_ref varchar(300) NOT NULL,
change_summary varchar(500) NOT NULL,
created_by uuid NOT NULL REFERENCES user_account(id),
retired_at timestamptz,
row_version bigint NOT NULL DEFAULT 1 CHECK (row_version>0),
created_at timestamptz NOT NULL DEFAULT now(),
updated_at timestamptz NOT NULL DEFAULT now(),
CONSTRAINT alert_route_version_unique UNIQUE (tenant_id,category,severity,version_no)
);
CREATE UNIQUE INDEX alert_route_active_unique ON alert_routing_policy(tenant_id,category,severity) WHERE status='ACTIVE';
CREATE TABLE alert_silence (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
public_id uuid NOT NULL UNIQUE DEFAULT gen_random_uuid(),
tenant_id uuid NOT NULL REFERENCES tenant(id),
rule_code varchar(100),
category varchar(20) CHECK (category IN ('BUSINESS','TECHNICAL','SECURITY','COST')),
resource_type varchar(80),
resource_public_id uuid,
matcher jsonb NOT NULL DEFAULT '{}'::jsonb,
reason varchar(500) NOT NULL,
starts_at timestamptz NOT NULL,
ends_at timestamptz NOT NULL,
created_by uuid NOT NULL REFERENCES user_account(id),
revoked_by uuid REFERENCES user_account(id),
revoked_at timestamptz,
row_version bigint NOT NULL DEFAULT 1 CHECK (row_version>0),
created_at timestamptz NOT NULL DEFAULT now(),
updated_at timestamptz NOT NULL DEFAULT now(),
CONSTRAINT alert_silence_scope CHECK (rule_code IS NOT NULL OR category IS NOT NULL OR resource_public_id IS NOT NULL),
CONSTRAINT alert_silence_window CHECK (ends_at>starts_at)
);
CREATE INDEX alert_silence_active_idx ON alert_silence(tenant_id,starts_at,ends_at) WHERE revoked_at IS NULL;
CREATE TABLE alert_incident (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
public_id uuid NOT NULL UNIQUE DEFAULT gen_random_uuid(),
tenant_id uuid NOT NULL REFERENCES tenant(id),
rule_code varchar(100) NOT NULL,
category varchar(20) NOT NULL CHECK (category IN ('BUSINESS','TECHNICAL','SECURITY','COST')),
severity varchar(16) NOT NULL CHECK (severity IN ('CRITICAL','HIGH','MEDIUM','LOW')),
status varchar(24) NOT NULL DEFAULT 'OPEN' CHECK (status IN ('OPEN','ACKNOWLEDGED','MITIGATED','RESOLVED','SILENCED')),
fingerprint varchar(200) NOT NULL,
title varchar(200) NOT NULL,
summary varchar(1000) NOT NULL,
resource_type varchar(80),
resource_public_id uuid,
correlation_request_id varchar(128),
routing_policy_id uuid REFERENCES alert_routing_policy(id),
current_owner_id uuid REFERENCES user_account(id),
first_detected_at timestamptz NOT NULL,
last_detected_at timestamptz NOT NULL,
occurrence_count bigint NOT NULL DEFAULT 1 CHECK (occurrence_count>0),
acknowledged_at timestamptz,
mitigated_at timestamptz,
resolved_at timestamptz,
silenced_until timestamptz,
escalated_at timestamptz,
row_version bigint NOT NULL DEFAULT 1 CHECK (row_version>0),
created_at timestamptz NOT NULL DEFAULT now(),
updated_at timestamptz NOT NULL DEFAULT now()
);
CREATE UNIQUE INDEX alert_incident_active_fingerprint ON alert_incident(tenant_id,fingerprint) WHERE status<>'RESOLVED';
CREATE INDEX alert_incident_queue_idx ON alert_incident(tenant_id,status,severity,last_detected_at DESC);
CREATE TABLE alert_action (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
public_id uuid NOT NULL UNIQUE DEFAULT gen_random_uuid(),
tenant_id uuid NOT NULL REFERENCES tenant(id),
incident_id uuid NOT NULL REFERENCES alert_incident(id) ON DELETE CASCADE,
action_type varchar(24) NOT NULL CHECK (action_type IN ('DETECTED','ACKNOWLEDGED','ASSIGNED','SILENCED','MITIGATED','RESOLVED','REOPENED','ESCALATED','COMMENTED')),
from_status varchar(24),
to_status varchar(24),
actor_type varchar(16) NOT NULL CHECK (actor_type IN ('system','user')),
actor_user_id uuid REFERENCES user_account(id),
note varchar(1000) NOT NULL,
created_at timestamptz NOT NULL DEFAULT now()
);
CREATE INDEX alert_action_incident_time_idx ON alert_action(incident_id,created_at,id);
COMMIT;