81 lines
2.2 KiB
Python
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)
|