90 lines
2.4 KiB
Python
90 lines
2.4 KiB
Python
import psycopg2
|
|
from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT
|
|
|
|
def recreate_logs_table(conn_info, retention_days=30):
|
|
"""
|
|
Elimina y recrea la tabla 'logs' en TimescaleDB con configuración optimizada.
|
|
Incluye:
|
|
- Hypertable por 'timestamp'
|
|
- Índices por service, timestamp y level
|
|
- Políticas de compresión y retención automáticas
|
|
"""
|
|
|
|
conn = psycopg2.connect(**conn_info)
|
|
conn.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT)
|
|
cur = conn.cursor()
|
|
|
|
print("⚠️ Eliminando tabla 'logs' si existe...")
|
|
cur.execute("DROP TABLE IF EXISTS logs CASCADE;")
|
|
|
|
print("🔧 Creando tabla 'logs'...")
|
|
cur.execute("""
|
|
CREATE TABLE logs (
|
|
id BIGSERIAL,
|
|
service TEXT NOT NULL,
|
|
level TEXT NOT NULL,
|
|
message TEXT NOT NULL,
|
|
timestamp TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
metadata JSONB
|
|
);
|
|
""")
|
|
|
|
print("🧱 Configurando hypertable 'logs'...")
|
|
cur.execute("""
|
|
SELECT create_hypertable('logs', 'timestamp', if_not_exists => TRUE);
|
|
""")
|
|
|
|
print("⚡ Creando índices...")
|
|
cur.execute("""
|
|
CREATE INDEX IF NOT EXISTS idx_logs_service_timestamp
|
|
ON logs (service, timestamp DESC);
|
|
""")
|
|
cur.execute("""
|
|
CREATE INDEX IF NOT EXISTS idx_logs_level
|
|
ON logs (level);
|
|
""")
|
|
cur.execute("""
|
|
CREATE INDEX IF NOT EXISTS idx_logs_timestamp
|
|
ON logs (timestamp DESC);
|
|
""")
|
|
|
|
print("📦 Activando compresión...")
|
|
cur.execute("""
|
|
ALTER TABLE logs SET (
|
|
timescaledb.compress,
|
|
timescaledb.compress_segmentby = 'service'
|
|
);
|
|
""")
|
|
|
|
print("🗓️ Añadiendo políticas automáticas...")
|
|
cur.execute("""
|
|
SELECT add_compression_policy('logs', INTERVAL '7 days');
|
|
""")
|
|
cur.execute(f"""
|
|
SELECT add_retention_policy('logs', INTERVAL '{retention_days} days');
|
|
""")
|
|
|
|
|
|
conn.commit()
|
|
cur.close()
|
|
conn.close()
|
|
|
|
print("✅ Tabla 'logs' recreada y configurada correctamente.")
|
|
|
|
|
|
|
|
# Ejecutar la configuración al ejecutar el script directamente
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
|
|
conn_info = {
|
|
"dbname": "basededatos",
|
|
"user": "postgres",
|
|
"password": "mipassword",
|
|
"host": "localhost",
|
|
"port": 55432,
|
|
}
|
|
|
|
recreate_logs_table(conn_info, retention_days=90) |