- Create separate scanner interfaces for storage, system, and docker data - Add dedicated endpoints for metrics and docker images instead of misclassifying as updates - Implement proper database tables for storage metrics and docker images - Fix storage/system metrics appearing incorrectly as package updates - Add scanner types with proper data structures for each subsystem - Update agent handlers to use correct endpoints for each data type
84 lines
4.4 KiB
PL/PgSQL
84 lines
4.4 KiB
PL/PgSQL
-- Migration: Create separate tables for metrics and docker images
|
|
-- Purpose: Fix data classification issue where storage/system metrics were incorrectly stored as package updates
|
|
|
|
-- Create metrics table for system and storage metrics
|
|
CREATE TABLE IF NOT EXISTS metrics (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
agent_id UUID NOT NULL REFERENCES agents(id) ON DELETE CASCADE,
|
|
package_type VARCHAR(50) NOT NULL, -- "storage", "system", "cpu", "memory"
|
|
package_name VARCHAR(255) NOT NULL,
|
|
current_version TEXT NOT NULL, -- current usage, value
|
|
available_version TEXT NOT NULL, -- available space, threshold
|
|
severity VARCHAR(20) NOT NULL DEFAULT 'low', -- "low", "moderate", "high", "critical"
|
|
repository_source VARCHAR(255),
|
|
metadata JSONB DEFAULT '{}',
|
|
event_type VARCHAR(50) NOT NULL DEFAULT 'discovered',
|
|
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
|
|
|
-- Unique constraint to prevent duplicate entries
|
|
UNIQUE (agent_id, package_name, package_type, created_at)
|
|
);
|
|
|
|
-- Create docker_images table for Docker image information
|
|
CREATE TABLE IF NOT EXISTS docker_images (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
agent_id UUID NOT NULL REFERENCES agents(id) ON DELETE CASCADE,
|
|
package_type VARCHAR(50) NOT NULL DEFAULT 'docker_image',
|
|
package_name VARCHAR(500) NOT NULL, -- image name:tag
|
|
current_version VARCHAR(255) NOT NULL, -- current image ID
|
|
available_version VARCHAR(255), -- latest image ID
|
|
severity VARCHAR(20) NOT NULL DEFAULT 'low', -- "low", "moderate", "high", "critical"
|
|
repository_source VARCHAR(500), -- registry URL
|
|
metadata JSONB DEFAULT '{}',
|
|
event_type VARCHAR(50) NOT NULL DEFAULT 'discovered',
|
|
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
|
|
|
-- Unique constraint to prevent duplicate entries
|
|
UNIQUE (agent_id, package_name, package_type, created_at)
|
|
);
|
|
|
|
-- Create indexes for better performance
|
|
CREATE INDEX IF NOT EXISTS idx_metrics_agent_id ON metrics(agent_id);
|
|
CREATE INDEX IF NOT EXISTS idx_metrics_package_type ON metrics(package_type);
|
|
CREATE INDEX IF NOT EXISTS idx_metrics_created_at ON metrics(created_at);
|
|
CREATE INDEX IF NOT EXISTS idx_metrics_severity ON metrics(severity);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_docker_images_agent_id ON docker_images(agent_id);
|
|
CREATE INDEX IF NOT EXISTS idx_docker_images_package_type ON docker_images(package_type);
|
|
CREATE INDEX IF NOT EXISTS idx_docker_images_created_at ON docker_images(created_at);
|
|
CREATE INDEX IF NOT EXISTS idx_docker_images_severity ON docker_images(severity);
|
|
CREATE INDEX IF NOT EXISTS idx_docker_images_has_updates ON docker_images(current_version, available_version) WHERE current_version != available_version;
|
|
|
|
-- Add comments for documentation
|
|
COMMENT ON TABLE metrics IS 'Stores system and storage metrics collected from agents, separate from package updates';
|
|
COMMENT ON TABLE docker_images IS 'Stores Docker image information and update availability, separate from package updates';
|
|
|
|
COMMENT ON COLUMN metrics.package_type IS 'Type of metric: storage, system, cpu, memory, etc.';
|
|
COMMENT ON COLUMN metrics.package_name IS 'Name of the metric (mount point, metric name, etc.)';
|
|
COMMENT ON COLUMN metrics.current_version IS 'Current value or usage';
|
|
COMMENT ON COLUMN metrics.available_version IS 'Available space or threshold';
|
|
COMMENT ON COLUMN metrics.severity IS 'Severity level: low, moderate, high, critical';
|
|
|
|
COMMENT ON COLUMN docker_images.package_name IS 'Docker image name with tag (e.g., nginx:latest)';
|
|
COMMENT ON COLUMN docker_images.current_version IS 'Current image ID';
|
|
COMMENT ON COLUMN docker_images.available_version IS 'Latest available image ID';
|
|
COMMENT ON COLUMN docker_images.severity IS 'Update severity: low, moderate, high, critical';
|
|
|
|
-- Create or replace function to clean old data (optional)
|
|
CREATE OR REPLACE FUNCTION clean_misclassified_data()
|
|
RETURNS INTEGER AS $$
|
|
DECLARE
|
|
deleted_count INTEGER := 0;
|
|
BEGIN
|
|
-- This function can be called to clean up any storage/system metrics that were
|
|
-- incorrectly stored in the update_events table before migration
|
|
|
|
-- For now, just return 0 as we're keeping the old data for audit purposes
|
|
RETURN deleted_count;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
-- Grant permissions (adjust as needed for your setup)
|
|
-- GRANT ALL PRIVILEGES ON TABLE metrics TO redflag_user;
|
|
-- GRANT ALL PRIVILEGES ON TABLE docker_images TO redflag_user;
|
|
-- GRANT USAGE ON SCHEMA public TO redflag_user; |