48 lines
1.8 KiB
Python
48 lines
1.8 KiB
Python
# Изменено: 2026-03-14
|
|
# Функция event-monitor: считает строки в events.
|
|
# Если больше 50 — публикует сообщение в RabbitMQ queue "cleanup-needed".
|
|
# Запускается по cron (каждую минуту).
|
|
# Env:
|
|
# POSTGRES_DSN — строка подключения к PostgreSQL
|
|
# RABBITMQ_URL — amqp://sless:sless123@rabbitmq.sless.svc.cluster.local:5672/
|
|
|
|
import os
|
|
import json
|
|
import psycopg2
|
|
import pika
|
|
|
|
THRESHOLD = 50
|
|
|
|
def handle(request):
|
|
"""Мониторит таблицу events. При переполнении шлёт в RabbitMQ."""
|
|
dsn = os.environ["POSTGRES_DSN"]
|
|
rabbit_url = os.environ["RABBITMQ_URL"]
|
|
|
|
conn = psycopg2.connect(dsn)
|
|
try:
|
|
with conn.cursor() as cur:
|
|
# Считаем количество событий
|
|
cur.execute("SELECT COUNT(*) FROM events")
|
|
count = cur.fetchone()[0]
|
|
finally:
|
|
conn.close()
|
|
|
|
result = {"count": count, "threshold": THRESHOLD, "action": "none"}
|
|
|
|
if count > THRESHOLD:
|
|
# Публикуем в очередь — event-cleaner получит и удалит старые строки
|
|
params = pika.URLParameters(rabbit_url)
|
|
connection = pika.BlockingConnection(params)
|
|
channel = connection.channel()
|
|
channel.queue_declare(queue="cleanup-needed", durable=True)
|
|
channel.basic_publish(
|
|
exchange="",
|
|
routing_key="cleanup-needed",
|
|
body=json.dumps({"count": count, "delete_n": 10}),
|
|
properties=pika.BasicProperties(delivery_mode=2) # persistent
|
|
)
|
|
connection.close()
|
|
result["action"] = "cleanup_requested"
|
|
|
|
return json.dumps(result), 200, {"Content-Type": "application/json"}
|