From 29f739970858cdcb9eb9378ba365e95c1fbc8b97 Mon Sep 17 00:00:00 2001 From: Silversthorn Date: Sun, 27 Aug 2023 13:50:22 +0200 Subject: [PATCH] Adding API route for history stats Fixing close db connexion for stats --- app/classes/models/server_stats.py | 8 ++++-- app/classes/shared/server.py | 5 +++- app/classes/web/routes/api/api_handlers.py | 6 ++++ .../web/routes/api/servers/server/history.py | 28 +++++++++++++++++++ .../templates/panel/server_metrics.html | 8 +++--- 5 files changed, 48 insertions(+), 7 deletions(-) create mode 100644 app/classes/web/routes/api/servers/server/history.py diff --git a/app/classes/models/server_stats.py b/app/classes/models/server_stats.py index 14f85ad3..448508d0 100644 --- a/app/classes/models/server_stats.py +++ b/app/classes/models/server_stats.py @@ -144,13 +144,17 @@ class HelperServerStats: def get_history_stats(self, server_id, num_days): self.database.connect(reuse_if_open=True) max_age = datetime.datetime.now() - timedelta(days=num_days) - server_stats = ( + query_stats = ( ServerStats.select() .where(ServerStats.created > max_age) .where(ServerStats.server_id == server_id) + #.order_by(ServerStats.created.desc()) .execute(self.database) ) - self.database.connect(reuse_if_open=True) + server_stats = [] + for stat in query_stats: + server_stats.append(DatabaseShortcuts.get_data_obj(stat)) + self.database.close() return server_stats def insert_server_stats(self, server_stats): diff --git a/app/classes/shared/server.py b/app/classes/shared/server.py index abf63362..f08322e8 100644 --- a/app/classes/shared/server.py +++ b/app/classes/shared/server.py @@ -33,7 +33,6 @@ from app.classes.shared.helpers import Helpers from app.classes.shared.file_helpers import FileHelpers from app.classes.shared.null_writer import NullWriter from app.classes.shared.websocket_manager import WebSocketManager -from app.classes.shared.websocket_manager import WebSocketManager with redirect_stderr(NullWriter()): import psutil @@ -1805,3 +1804,7 @@ class ServerInstance: minimum_to_exist = now - datetime.timedelta(days=max_age) self.stats_helper.remove_old_stats(minimum_to_exist) + + def get_server_history(self): + history = self.stats_helper.get_history_stats(self.server_id, 3) + return history \ No newline at end of file diff --git a/app/classes/web/routes/api/api_handlers.py b/app/classes/web/routes/api/api_handlers.py index 29ee02c5..a91cca82 100644 --- a/app/classes/web/routes/api/api_handlers.py +++ b/app/classes/web/routes/api/api_handlers.py @@ -22,6 +22,7 @@ from app.classes.web.routes.api.servers.server.public import ( ApiServersServerPublicHandler, ) from app.classes.web.routes.api.servers.server.stats import ApiServersServerStatsHandler +from app.classes.web.routes.api.servers.server.history import ApiServersServerHistoryHandler from app.classes.web.routes.api.servers.server.stdin import ApiServersServerStdinHandler from app.classes.web.routes.api.servers.server.tasks.index import ( ApiServersServerTasksIndexHandler, @@ -132,6 +133,11 @@ def api_handlers(handler_args): ApiServersServerStatsHandler, handler_args, ), + ( + r"/api/v2/servers/([0-9]+)/history/?", + ApiServersServerHistoryHandler, + handler_args, + ), ( r"/api/v2/servers/([0-9]+)/action/([a-z_]+)/?", ApiServersServerActionHandler, diff --git a/app/classes/web/routes/api/servers/server/history.py b/app/classes/web/routes/api/servers/server/history.py new file mode 100644 index 00000000..1a4aac24 --- /dev/null +++ b/app/classes/web/routes/api/servers/server/history.py @@ -0,0 +1,28 @@ +import logging +from app.classes.web.base_api_handler import BaseApiHandler +from app.classes.controllers.servers_controller import ServersController + + +logger = logging.getLogger(__name__) + + +class ApiServersServerHistoryHandler(BaseApiHandler): + def get(self, server_id: str): + auth_data = self.authenticate_user() + if not auth_data: + return + + if server_id not in [str(x["server_id"]) for x in auth_data[0]]: + # if the user doesn't have access to the server, return an error + return self.finish_json(400, {"status": "error", "error": "NOT_AUTHORIZED"}) + + srv = ServersController().get_server_instance_by_id(server_id) + history = srv.get_server_history() + + self.finish_json( + 200, + { + "status": "ok", + "data": history, + }, + ) diff --git a/app/frontend/templates/panel/server_metrics.html b/app/frontend/templates/panel/server_metrics.html index d10fec51..5067e709 100644 --- a/app/frontend/templates/panel/server_metrics.html +++ b/app/frontend/templates/panel/server_metrics.html @@ -89,11 +89,11 @@ const cpu = [] {% for item in data['history_stats'] %} {% if 'minecraft-java' in data['server_stats']['server_type'] %} - players.push("{{ item.online }}"); + players.push("{{ item.get('online') }}"); {% end %} - dates.push("{{ item.created.strftime('%Y/%m/%d, %H:%M:%S') }}"); - ram.push("{{ item.mem_percent }}") - cpu.push("{{ item.cpu }}") + dates.push("{{ item.get('created').strftime('%Y/%m/%d, %H:%M:%S') }}"); + ram.push("{{ item.get('mem_percent') }}") + cpu.push("{{ item.get('cpu') }}") {% end %} var hist_chart = new Chart(ctxL, { type: 'line',