Files
I2-end-2025/Case study 1/monitoring/collect-to-db.py
2025-10-29 14:31:41 +01:00

81 lines
2.2 KiB
Python

from flask import Flask, request, jsonify
import sqlite3
from datetime import datetime
import os
app = Flask(__name__)
DB_PATH = "metrics.db"
# Creates the database table if it doesn't exist
def init_db():
with sqlite3.connect(DB_PATH) as conn:
conn.execute("""
CREATE TABLE IF NOT EXISTS metrics (
id INTEGER PRIMARY KEY AUTOINCREMENT,
hostname TEXT,
os TEXT,
cpu_percent REAL,
memory_percent REAL,
disk_usage REAL,
timestamp TEXT
)
""")
print("Database initialized")
# route for sending metrics
@app.route('/collect', methods=['POST'])
def collect():
data = request.get_json()
if not data or "hostname" not in data:
return jsonify({"error": "Invalid data"}), 400
timestamp = datetime.now().isoformat()
with sqlite3.connect(DB_PATH) as conn:
conn.execute("""
INSERT INTO metrics (hostname, os, cpu_percent, memory_percent, disk_usage, timestamp)
VALUES (?, ?, ?, ?, ?, ?)
""", (
data.get("hostname"),
data.get("os"),
data.get("cpu_percent"),
data.get("memory_percent"),
data.get("disk_usage"),
timestamp
))
conn.commit()
print(f"[{timestamp}] Data received from {data.get('hostname')}")
return jsonify({"status": "stored"}), 200
# for posting metrics which you can view in the browser
@app.route('/metrics', methods=['GET'])
def list_metrics():
with sqlite3.connect(DB_PATH) as conn:
cursor = conn.execute("""
SELECT hostname, os, cpu_percent, memory_percent, disk_usage, timestamp
FROM metrics
ORDER BY id DESC
LIMIT 10
""")
rows = cursor.fetchall()
results = [
{
"hostname": row[0],
"os": row[1],
"cpu_percent": row[2],
"memory_percent": row[3],
"disk_usage": row[4],
"timestamp": row[5],
}
for row in rows
]
return jsonify(results)
if __name__ == '__main__':
if not os.path.exists(DB_PATH):
init_db()
app.run(host='0.0.0.0', port=5000)