From c431a45b0b4fedc028c2ce630b4cd1c66c44e2c7 Mon Sep 17 00:00:00 2001 From: Graham McIntire Date: Tue, 15 Jul 2025 09:17:30 -0500 Subject: [PATCH] remove duplicate indexes and fix telemetry metrics --- lib/aprsme_web/telemetry.ex | 27 +--------- ...0250715140830_remove_duplicate_indexes.exs | 53 +++++++++++++++++++ 2 files changed, 54 insertions(+), 26 deletions(-) create mode 100644 priv/repo/migrations/20250715140830_remove_duplicate_indexes.exs diff --git a/lib/aprsme_web/telemetry.ex b/lib/aprsme_web/telemetry.ex index 59971c8..ac08a02 100644 --- a/lib/aprsme_web/telemetry.ex +++ b/lib/aprsme_web/telemetry.ex @@ -90,32 +90,7 @@ defmodule AprsmeWeb.Telemetry do summary("aprsme.packet_pipeline.batch.error", unit: :event, description: "Number of errors per batch"), summary("aprsme.packet_pipeline.batch.duration_ms", unit: :millisecond, description: "Batch insert duration (ms)"), - # System Monitor Metrics - last_value("aprsme.system.memory.total", unit: {:byte, :megabyte}, description: "Total memory usage"), - last_value("aprsme.system.memory.process", unit: {:byte, :megabyte}, description: "Process memory usage"), - last_value("aprsme.system.memory.binary", unit: {:byte, :megabyte}, description: "Binary memory usage"), - last_value("aprsme.system.memory.pressure", unit: :percent, description: "Memory pressure (0-1)"), - last_value("aprsme.system.cpu.load1", description: "1-minute load average"), - last_value("aprsme.system.cpu.load5", description: "5-minute load average"), - last_value("aprsme.system.cpu.load15", description: "15-minute load average"), - last_value("aprsme.system.cpu.pressure", unit: :percent, description: "CPU pressure (0-1)"), - last_value("aprsme.system.processes.count", description: "Number of Erlang processes"), - last_value("aprsme.system.processes.pressure", unit: :percent, description: "Process count pressure (0-1)"), - last_value("aprsme.system.db_pool.size", description: "Database pool size"), - last_value("aprsme.system.db_pool.available", description: "Available database connections"), - last_value("aprsme.system.db_pool.pressure", unit: :percent, description: "Database pool pressure (0-1)"), - last_value("aprsme.system.batch_size.current", description: "Current adaptive batch size"), - last_value("aprsme.system.batch_size.min", description: "Minimum batch size"), - last_value("aprsme.system.batch_size.max", description: "Maximum batch size"), - - # INSERT Performance Optimizer Metrics - last_value("aprsme.insert_optimizer.batch_size", description: "Current optimized INSERT batch size"), - summary("aprsme.insert_optimizer.throughput", - unit: {:hertz, :unit}, - description: "INSERT throughput (packets/sec)" - ), - summary("aprsme.insert_optimizer.duration", unit: :millisecond, description: "INSERT duration per batch"), - counter("aprsme.insert_optimizer.optimizations", description: "Number of optimization adjustments made"), + # Note: SystemMonitor and InsertOptimizer metrics removed after reverting performance optimizations # Spatial PubSub Metrics last_value("aprsme.spatial_pubsub.clients.count", description: "Number of connected clients"), diff --git a/priv/repo/migrations/20250715140830_remove_duplicate_indexes.exs b/priv/repo/migrations/20250715140830_remove_duplicate_indexes.exs new file mode 100644 index 0000000..d7c4c45 --- /dev/null +++ b/priv/repo/migrations/20250715140830_remove_duplicate_indexes.exs @@ -0,0 +1,53 @@ +defmodule Aprsme.Repo.Migrations.RemoveDuplicateIndexes do + use Ecto.Migration + + def up do + # Remove duplicate indexes to save 2.9GB of disk space + + # 1. Remove packets_id_idx (1324 MB) - redundant with primary key packets_pkey + # The primary key already provides an index on the id column + execute("DROP INDEX IF EXISTS packets_id_idx") + + # 2. Remove packets_location_spatial_idx (1060 MB) - redundant with packets_location_selective_idx + # The selective index is more specific and provides better performance + execute("DROP INDEX IF EXISTS packets_location_spatial_idx") + + # 3. Remove packets_received_at_index (550 MB) - redundant with packets_received_at_idx + # Both indexes serve the same purpose + execute("DROP INDEX IF EXISTS packets_received_at_index") + + # Also check for other potential duplicates mentioned in earlier migrations + # Replaced by more specific indexes + execute("DROP INDEX IF EXISTS packets_location_idx") + + # Log the cleanup + execute(""" + DO $$ + BEGIN + RAISE NOTICE 'Duplicate indexes removed successfully. Estimated space saved: ~2.9GB'; + END $$; + """) + end + + def down do + # Recreate indexes if needed (though they are redundant) + + # Recreate packets_id_idx + execute(""" + CREATE INDEX CONCURRENTLY IF NOT EXISTS packets_id_idx + ON packets(id) + """) + + # Recreate packets_location_spatial_idx + execute(""" + CREATE INDEX CONCURRENTLY IF NOT EXISTS packets_location_spatial_idx + ON packets USING GIST (location) + """) + + # Recreate packets_received_at_index (using original name from migration) + execute(""" + CREATE INDEX CONCURRENTLY IF NOT EXISTS packets_received_at_index + ON packets(received_at) + """) + end +end