Files
awoooi/apps/api/migrations/adr105_mcp_audit_snapshots.sql
Your Name 7e4d995e4b
Some checks failed
CD Pipeline / tests (push) Successful in 1m59s
Code Review / ai-code-review (push) Successful in 28s
run-migration / migrate (push) Failing after 24s
CD Pipeline / post-deploy-checks (push) Has been cancelled
CD Pipeline / build-and-deploy (push) Has been cancelled
feat(aiops): add mcp agent loop foundation
2026-05-01 13:21:19 +08:00

78 lines
2.7 KiB
SQL

-- ADR-105 MCP audit and snapshot foundation
-- 2026-05-01
-- Notes:
-- AWOOOI incident ids are string values such as INC-20260429-xxxx, not UUIDs.
-- Keep incident_id as VARCHAR(64) so MCP audit can join existing incident records.
CREATE TABLE IF NOT EXISTS mcp_audit_log (
id BIGSERIAL PRIMARY KEY,
session_id VARCHAR(36) NOT NULL,
flywheel_node VARCHAR(20),
mcp_server VARCHAR(80) NOT NULL,
tool_name VARCHAR(120) NOT NULL,
input_params JSONB,
output_result JSONB,
duration_ms INTEGER,
success BOOLEAN,
error_message TEXT,
incident_id VARCHAR(64),
agent_role VARCHAR(40),
created_at TIMESTAMPTZ DEFAULT NOW()
);
ALTER TABLE mcp_audit_log
ADD COLUMN IF NOT EXISTS agent_role VARCHAR(40);
CREATE INDEX IF NOT EXISTS idx_mcp_audit_session
ON mcp_audit_log(session_id);
CREATE INDEX IF NOT EXISTS idx_mcp_audit_incident
ON mcp_audit_log(incident_id);
CREATE INDEX IF NOT EXISTS idx_mcp_audit_node
ON mcp_audit_log(flywheel_node, created_at DESC);
CREATE INDEX IF NOT EXISTS idx_mcp_audit_server_tool
ON mcp_audit_log(mcp_server, tool_name, created_at DESC);
CREATE INDEX IF NOT EXISTS idx_mcp_audit_agent_role
ON mcp_audit_log(agent_role, created_at DESC);
CREATE TABLE IF NOT EXISTS mcp_daily_stats (
date DATE NOT NULL,
mcp_server VARCHAR(80) NOT NULL,
tool_name VARCHAR(120) NOT NULL,
call_count INTEGER DEFAULT 0 NOT NULL,
success_count INTEGER DEFAULT 0 NOT NULL,
avg_duration_ms FLOAT,
PRIMARY KEY (date, mcp_server, tool_name)
);
CREATE TABLE IF NOT EXISTS k8s_state_snapshots (
id BIGSERIAL PRIMARY KEY,
incident_id VARCHAR(64),
snapshot_type VARCHAR(40) NOT NULL,
namespace VARCHAR(63),
resource_type VARCHAR(80),
resource_name VARCHAR(253),
state_json JSONB,
captured_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS idx_k8s_snapshot_incident
ON k8s_state_snapshots(incident_id);
CREATE INDEX IF NOT EXISTS idx_k8s_snapshot_resource
ON k8s_state_snapshots(namespace, resource_type, resource_name);
CREATE INDEX IF NOT EXISTS idx_k8s_snapshot_captured
ON k8s_state_snapshots(captured_at DESC);
CREATE TABLE IF NOT EXISTS prometheus_snapshots (
id BIGSERIAL PRIMARY KEY,
incident_id VARCHAR(64),
query TEXT NOT NULL,
result_json JSONB,
snapshot_type VARCHAR(40),
captured_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS idx_prom_snapshot_incident
ON prometheus_snapshots(incident_id);
CREATE INDEX IF NOT EXISTS idx_prom_snapshot_type
ON prometheus_snapshots(snapshot_type, captured_at DESC);