From 4225de55e86c1a6b0434f0f03f7d906bd287f5f4 Mon Sep 17 00:00:00 2001 From: Andrew Date: Sun, 21 Aug 2022 17:04:23 -0400 Subject: [PATCH 1/8] Add server metrics graph --- app/classes/controllers/servers_controller.py | 8 + app/classes/models/server_stats.py | 8 + app/classes/web/panel_handler.py | 6 + app/frontend/templates/base.html | 2 + .../panel/parts/m_server_controls_list.html | 1 + .../panel/parts/server_controls_list.html | 4 + .../templates/panel/server_metrics.html | 179 ++++++++++++++++++ 7 files changed, 208 insertions(+) create mode 100644 app/frontend/templates/panel/server_metrics.html diff --git a/app/classes/controllers/servers_controller.py b/app/classes/controllers/servers_controller.py index 650a16b0..593e24d4 100644 --- a/app/classes/controllers/servers_controller.py +++ b/app/classes/controllers/servers_controller.py @@ -4,6 +4,7 @@ import time import json import pathlib import typing as t +import datetime from app.classes.controllers.roles_controller import RolesController from app.classes.shared.file_helpers import FileHelpers @@ -102,6 +103,13 @@ class ServersController(metaclass=Singleton): server_instance.update_server_instance() return ret + def get_history_stats(self, server_id): + max_age = self.helper.get_setting("history_max_age") + now = datetime.datetime.now() + minimum_to_exist = now - datetime.timedelta(days=max_age) + srv = ServersController().get_server_instance_by_id(server_id) + return srv.stats_helper.get_history_stats(server_id, minimum_to_exist) + @staticmethod def update_unloaded_server(server_obj): ret = HelperServers.update_server(server_obj) diff --git a/app/classes/models/server_stats.py b/app/classes/models/server_stats.py index e3c943e3..4c7091aa 100644 --- a/app/classes/models/server_stats.py +++ b/app/classes/models/server_stats.py @@ -137,6 +137,14 @@ class HelperServerStats: ) return server_data + def get_history_stats(self, server_id, max_age): + return ( + ServerStats.select() + .where(ServerStats.created > max_age) + .where(ServerStats.server_id == server_id) + .execute(self.database) + ) + def insert_server_stats(self, server_stats): server_id = server_stats.get("id", 0) diff --git a/app/classes/web/panel_handler.py b/app/classes/web/panel_handler.py index a5e56029..e8592cdd 100644 --- a/app/classes/web/panel_handler.py +++ b/app/classes/web/panel_handler.py @@ -524,6 +524,7 @@ class PanelHandler(BaseHandler): "files", "admin_controls", "schedules", + "metrics", ] if not self.failed_server: server = self.controller.servers.get_server_instance_by_id(server_id) @@ -754,6 +755,11 @@ class PanelHandler(BaseHandler): page_data["backup_list"] = [] page_data["backup_path"] = Helpers.wtol_path(server_info["backup_path"]) + if subpage == "metrics": + page_data["history_stats"] = self.controller.servers.get_history_stats( + server_id + ) + def get_banned_players_html(): banned_players = self.controller.servers.get_banned_players(server_id) if banned_players is None: diff --git a/app/frontend/templates/base.html b/app/frontend/templates/base.html index 46b6e622..1d69675f 100755 --- a/app/frontend/templates/base.html +++ b/app/frontend/templates/base.html @@ -40,6 +40,8 @@ + + diff --git a/app/frontend/templates/panel/parts/m_server_controls_list.html b/app/frontend/templates/panel/parts/m_server_controls_list.html index 4a114b52..371dca05 100644 --- a/app/frontend/templates/panel/parts/m_server_controls_list.html +++ b/app/frontend/templates/panel/parts/m_server_controls_list.html @@ -30,6 +30,7 @@ {% if data['permissions']['Players'] in data['user_permissions'] and data['server_data']['type'] != 'minecraft-bedrock' %} {{ translate('serverDetails', 'playerControls', data['lang']) }} {% end %} + Metrics \ No newline at end of file diff --git a/app/frontend/templates/panel/parts/server_controls_list.html b/app/frontend/templates/panel/parts/server_controls_list.html index 8e40e7ec..c0398d41 100644 --- a/app/frontend/templates/panel/parts/server_controls_list.html +++ b/app/frontend/templates/panel/parts/server_controls_list.html @@ -49,4 +49,8 @@ {{ translate('serverDetails', 'playerControls', data['lang']) }} {% end %} + \ No newline at end of file diff --git a/app/frontend/templates/panel/server_metrics.html b/app/frontend/templates/panel/server_metrics.html new file mode 100644 index 00000000..08939772 --- /dev/null +++ b/app/frontend/templates/panel/server_metrics.html @@ -0,0 +1,179 @@ +{% extends ../base.html %} + +{% block meta %} +{% end %} + +{% block title %}Crafty Controller - {{ translate('serverDetails', 'serverDetails', data['lang']) }}{% end %} + +{% block content %} + +
+ + +
+
+ +
+ +
+ + + {% include "parts/details_stats.html %} + +
+ +
+
+
+ + {% include "parts/server_controls_list.html %} + + + {% include "parts/m_server_controls_list.html %} + + + + +
+   +   +   +
+
+
+
+
+ + + +
+ + +{% end %} \ No newline at end of file From 7e5d6fddda2fa1fe3941238eb22eb68f3711b72d Mon Sep 17 00:00:00 2001 From: amcmanu3 Date: Sun, 21 Aug 2022 21:47:05 -0400 Subject: [PATCH 2/8] Add zoom to chart --- app/frontend/templates/base.html | 1 + .../templates/panel/parts/m_server_controls_list.html | 2 +- .../templates/panel/parts/server_controls_list.html | 2 +- app/frontend/templates/panel/server_metrics.html | 8 +++++++- 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/app/frontend/templates/base.html b/app/frontend/templates/base.html index 1d69675f..37e15a3e 100755 --- a/app/frontend/templates/base.html +++ b/app/frontend/templates/base.html @@ -41,6 +41,7 @@ + diff --git a/app/frontend/templates/panel/parts/m_server_controls_list.html b/app/frontend/templates/panel/parts/m_server_controls_list.html index 371dca05..dba3802a 100644 --- a/app/frontend/templates/panel/parts/m_server_controls_list.html +++ b/app/frontend/templates/panel/parts/m_server_controls_list.html @@ -30,7 +30,7 @@ {% if data['permissions']['Players'] in data['user_permissions'] and data['server_data']['type'] != 'minecraft-bedrock' %} {{ translate('serverDetails', 'playerControls', data['lang']) }} {% end %} - Metrics + Metrics \ No newline at end of file diff --git a/app/frontend/templates/panel/parts/server_controls_list.html b/app/frontend/templates/panel/parts/server_controls_list.html index c0398d41..17fa1b74 100644 --- a/app/frontend/templates/panel/parts/server_controls_list.html +++ b/app/frontend/templates/panel/parts/server_controls_list.html @@ -51,6 +51,6 @@ {% end %} \ No newline at end of file diff --git a/app/frontend/templates/panel/server_metrics.html b/app/frontend/templates/panel/server_metrics.html index 08939772..19ed4ba3 100644 --- a/app/frontend/templates/panel/server_metrics.html +++ b/app/frontend/templates/panel/server_metrics.html @@ -62,7 +62,9 @@ const ram = [] const cpu = [] {% for item in data['history_stats'] %} + {% if 'minecraft-java' in data['server_stats']['server_type'] %} players.push("{{ item.online }}"); + {% end %} dates.push("{{ item.created }}"); ram.push("{{ item.mem_percent }}") cpu.push("{{ item.cpu }}") @@ -109,7 +111,11 @@ max: Math.max.apply(this, max_nums) + 5 } }] - } + }, + zoom: { + enabled: true, + mode: 'y' + }, } }); From eec9f0fc95041fc5237b4d1352abec3cbd21a83c Mon Sep 17 00:00:00 2001 From: amcmanu3 Date: Sun, 21 Aug 2022 21:53:24 -0400 Subject: [PATCH 3/8] Remove zooming --- app/frontend/templates/panel/server_metrics.html | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/app/frontend/templates/panel/server_metrics.html b/app/frontend/templates/panel/server_metrics.html index 19ed4ba3..812a81de 100644 --- a/app/frontend/templates/panel/server_metrics.html +++ b/app/frontend/templates/panel/server_metrics.html @@ -111,11 +111,7 @@ max: Math.max.apply(this, max_nums) + 5 } }] - }, - zoom: { - enabled: true, - mode: 'y' - }, + } } }); From 6ad9863cbf36c68c603eaf10e3249c4d742a4ac2 Mon Sep 17 00:00:00 2001 From: amcmanu3 Date: Mon, 22 Aug 2022 01:15:18 -0400 Subject: [PATCH 4/8] Still kinda broken, but this is cool --- app/frontend/templates/base.html | 11 +- .../templates/panel/server_metrics.html | 119 +++++++----------- 2 files changed, 52 insertions(+), 78 deletions(-) diff --git a/app/frontend/templates/base.html b/app/frontend/templates/base.html index 37e15a3e..543d3c71 100755 --- a/app/frontend/templates/base.html +++ b/app/frontend/templates/base.html @@ -40,8 +40,15 @@ - - + + + diff --git a/app/frontend/templates/panel/server_metrics.html b/app/frontend/templates/panel/server_metrics.html index 812a81de..3b65e9d7 100644 --- a/app/frontend/templates/panel/server_metrics.html +++ b/app/frontend/templates/panel/server_metrics.html @@ -41,11 +41,7 @@ -
-   -   -   -
+ @@ -80,7 +76,8 @@ borderColor: [ 'rgba(136, 98, 224, .5)', ], - borderWidth: 2 + borderWidth: 2, + tension: 0 }, { label: "MEM", @@ -88,7 +85,8 @@ borderColor: [ 'rgba(33, 150, 243, .5)', ], - borderWidth: 2 + borderWidth: 2, + tension: 0 }, { label: "CPU", @@ -96,86 +94,55 @@ borderColor: [ 'rgba(255, 175, 0, .5)', ], - borderWidth: 2 + borderWidth: 2, + tension: 0 }, ] }, options: { + plugins: { + zoom: { + zoom: { + wheel: { + enabled: true, + }, + drag: { + enabled: true, + modifierKey: "shift" + }, + pinch: { + enabled: true + }, + mode: 'x', + modifierKey: 'shift', + }, + }, + pan: { + enabled: true, + mode: "xy", + threshhold: 1, + pan: { + enabled: true, + mode: "xy", + threshhold: 1, + } + + } + }, fill: false, lineTension: 5, responsive: true, scales: { - yAxes: [{ - ticks: { - min: 0, - max: Math.max.apply(this, max_nums) + 5 - } - }] + y: { + min: 0, + }, + x: { + position: 'right', + min: -500, + } } } }); - - var mem_hidden = false; - var cpu_hidden = false; - var players_hidden = false; - - function toggle_mem() { - if (!mem_hidden) { - hist_chart.data.datasets = hist_chart.data.datasets.filter(function (obj) { return obj.label != "MEM" }); - mem_hidden = true; - // Repaint - } else { - hist_chart.data.datasets.splice(1, 0, { - label: "MEM", - data: ram, - borderColor: [ - 'rgba(33, 150, 243, .5)', - ], - borderWidth: 2 - }); - mem_hidden = false; - } - hist_chart.update(); - - } - function toggle_cpu() { - if (!cpu_hidden) { - hist_chart.data.datasets = hist_chart.data.datasets.filter(function (obj) { return obj.label != "CPU" }); - cpu_hidden = true; - // Repaint - } else { - hist_chart.data.datasets.push({ - label: "CPU", - data: cpu, - borderColor: [ - 'rgba(255, 175, 0, .5)', - ], - borderWidth: 2 - }); - cpu_hidden = false; - } - hist_chart.update(); - - } - function toggle_players() { - if (!players_hidden) { - hist_chart.data.datasets = hist_chart.data.datasets.filter(function (obj) { return obj.label != "Players" }); - players_hidden = true; - // Repaint - } else { - hist_chart.data.datasets.splice(0, 0, { - label: "Players", - data: players, - borderColor: [ - 'rgba(136, 98, 224, .5)', - ], - borderWidth: 2 - }); - players_hidden = false; - } - hist_chart.update(); - - } {% end %} \ No newline at end of file From 037758accbae8253d3df7178b41f5107af9d1fb1 Mon Sep 17 00:00:00 2001 From: Andrew Date: Mon, 22 Aug 2022 20:04:40 -0400 Subject: [PATCH 5/8] Working live graph --- app/classes/shared/server.py | 1 + app/frontend/templates/base.html | 6 +- .../panel/parts/m_server_controls_list.html | 2 +- .../panel/parts/server_controls_list.html | 2 +- .../templates/panel/server_metrics.html | 104 +++++++++++++++--- app/translations/en_EN.json | 8 +- 6 files changed, 99 insertions(+), 24 deletions(-) diff --git a/app/classes/shared/server.py b/app/classes/shared/server.py index 499a0080..74e93ba7 100644 --- a/app/classes/shared/server.py +++ b/app/classes/shared/server.py @@ -1223,6 +1223,7 @@ class ServerInstance: "version": raw_ping_result.get("version"), "icon": raw_ping_result.get("icon"), "crashed": self.is_crashed, + "created": datetime.datetime.now().strftime("%Y/%m/%d, %H:%M:%S"), }, ) total_players += int(raw_ping_result.get("online")) diff --git a/app/frontend/templates/base.html b/app/frontend/templates/base.html index 543d3c71..1ab50da8 100755 --- a/app/frontend/templates/base.html +++ b/app/frontend/templates/base.html @@ -40,12 +40,12 @@ - + diff --git a/app/frontend/templates/panel/parts/m_server_controls_list.html b/app/frontend/templates/panel/parts/m_server_controls_list.html index dba3802a..52f3d04d 100644 --- a/app/frontend/templates/panel/parts/m_server_controls_list.html +++ b/app/frontend/templates/panel/parts/m_server_controls_list.html @@ -30,7 +30,7 @@ {% if data['permissions']['Players'] in data['user_permissions'] and data['server_data']['type'] != 'minecraft-bedrock' %} {{ translate('serverDetails', 'playerControls', data['lang']) }} {% end %} - Metrics + {{ translate('serverDetails', 'metrics', data['lang']) }} \ No newline at end of file diff --git a/app/frontend/templates/panel/parts/server_controls_list.html b/app/frontend/templates/panel/parts/server_controls_list.html index 17fa1b74..4212bde6 100644 --- a/app/frontend/templates/panel/parts/server_controls_list.html +++ b/app/frontend/templates/panel/parts/server_controls_list.html @@ -51,6 +51,6 @@ {% end %} \ No newline at end of file diff --git a/app/frontend/templates/panel/server_metrics.html b/app/frontend/templates/panel/server_metrics.html index 3b65e9d7..01456c61 100644 --- a/app/frontend/templates/panel/server_metrics.html +++ b/app/frontend/templates/panel/server_metrics.html @@ -38,8 +38,14 @@ {% include "parts/m_server_controls_list.html %} - - + + {% if data['user_data']['hints'] %} + + {% end %} @@ -50,7 +56,14 @@ + {% end %} \ No newline at end of file diff --git a/app/translations/en_EN.json b/app/translations/en_EN.json index f398ccf5..cd3620d0 100644 --- a/app/translations/en_EN.json +++ b/app/translations/en_EN.json @@ -351,7 +351,8 @@ "playerControls": "Player Management", "schedule": "Schedule", "serverDetails": "Server Details", - "terminal": "Terminal" + "terminal": "Terminal", + "metrics": "Metrics" }, "serverFiles": { "clickUpload": "Click here to select your files", @@ -472,6 +473,9 @@ "stopScroll": "Stop Auto Scrolling", "updating": "Updating..." }, + "serverMetrics": { + "resetZoom": "Reset Zoom" + }, "serverWizard": { "absoluteServerPath": "Absolute path to your server", "absoluteZipPath": "Absolute path to your server", @@ -558,4 +562,4 @@ "userSettings": "User Settings", "uses": "Number of uses allowed (-1==No Limit)" } -} +} \ No newline at end of file From 1e569300fce6d2f27aa695d0514832816f51fbb5 Mon Sep 17 00:00:00 2001 From: Andrew Date: Mon, 22 Aug 2022 20:23:09 -0400 Subject: [PATCH 6/8] Add translations --- app/frontend/templates/panel/server_metrics.html | 4 ++-- app/translations/en_EN.json | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/app/frontend/templates/panel/server_metrics.html b/app/frontend/templates/panel/server_metrics.html index 01456c61..61eaa659 100644 --- a/app/frontend/templates/panel/server_metrics.html +++ b/app/frontend/templates/panel/server_metrics.html @@ -42,8 +42,8 @@ id="reset-button"> {{ translate('serverMetrics', 'resetZoom', data['lang']) }} {% if data['user_data']['hints'] %} - {% end %} diff --git a/app/translations/en_EN.json b/app/translations/en_EN.json index cd3620d0..1c86e364 100644 --- a/app/translations/en_EN.json +++ b/app/translations/en_EN.json @@ -474,7 +474,9 @@ "updating": "Updating..." }, "serverMetrics": { - "resetZoom": "Reset Zoom" + "resetZoom": "Reset Zoom", + "zoomHint1": "To zoom on the graph hold your shift key then use your scroll wheel.", + "zoomHint2": "Alternatively hold the shift key then click and drag the area you'd like to zoom in on." }, "serverWizard": { "absoluteServerPath": "Absolute path to your server", From 9831705677466b3a0ccc30bbcc59b430ae3bf0b2 Mon Sep 17 00:00:00 2001 From: Andrew Date: Mon, 22 Aug 2022 22:39:39 -0400 Subject: [PATCH 7/8] Fix height on different viewports --- app/frontend/templates/panel/server_metrics.html | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/app/frontend/templates/panel/server_metrics.html b/app/frontend/templates/panel/server_metrics.html index 61eaa659..9bf46941 100644 --- a/app/frontend/templates/panel/server_metrics.html +++ b/app/frontend/templates/panel/server_metrics.html @@ -42,11 +42,13 @@ id="reset-button"> {{ translate('serverMetrics', 'resetZoom', data['lang']) }} {% if data['user_data']['hints'] %} - + {% end %} - +
+ +
@@ -57,6 +59,10 @@