From fcf75892a49fe35c36cad10c6597c6192f0d04b8 Mon Sep 17 00:00:00 2001 From: Daniel Schadt Date: Wed, 26 Mar 2025 19:39:55 +0100 Subject: add system stats to admin page --- fietsboek/scripts/fietscron.py | 4 +++- fietsboek/templates/admin_overview.jinja2 | 27 +++++++++++++++++++++- fietsboek/views/admin.py | 38 +++++++++++++++++++++++++++++++ 3 files changed, 67 insertions(+), 2 deletions(-) diff --git a/fietsboek/scripts/fietscron.py b/fietsboek/scripts/fietscron.py index 7687e12..923885f 100644 --- a/fietsboek/scripts/fietscron.py +++ b/fietsboek/scripts/fietscron.py @@ -53,10 +53,12 @@ def cli(config): remove_old_tokens(engine) rebuild_cache(engine, data_manager) + redis = mod_redis.from_url(config.redis_url) if config.hittekaart_autogenerate: - redis = mod_redis.from_url(config.redis_url) run_hittekaart(engine, data_manager, redis, config) + redis.set("last-cronjob", datetime.datetime.now(datetime.UTC).timestamp()) + def remove_old_uploads(engine: Engine): """Removes old uploads from the database.""" diff --git a/fietsboek/templates/admin_overview.jinja2 b/fietsboek/templates/admin_overview.jinja2 index 0e1bac8..dedd57e 100644 --- a/fietsboek/templates/admin_overview.jinja2 +++ b/fietsboek/templates/admin_overview.jinja2 @@ -14,12 +14,37 @@

- … {{ (total_size / 1024 / 1024) | round(2) }} MiB bytes of data + … {{ (total_size / 1024 / 1024) | round(2) }} MiB of data

+ +

System information

+ + + + + + + + + + + + + + + + + + + + + + +
Fietsboek version{{ versions["fietsboek"] }}
Python version{{ versions["python"] }}
Kernel version{{ versions["linux"] }}
Distribution{{ versions["distro"] }}
Last cronjob {% if not cron_good %}{% endif %}{{ last_cronjob }}
{% endblock %} {% block latescripts %} diff --git a/fietsboek/views/admin.py b/fietsboek/views/admin.py index 78eec12..ca002c8 100644 --- a/fietsboek/views/admin.py +++ b/fietsboek/views/admin.py @@ -1,6 +1,9 @@ """Admin views.""" +import datetime +import platform import stat +import subprocess from dataclasses import dataclass from pathlib import Path @@ -13,6 +16,9 @@ from sqlalchemy import func, select from .. import models, util +GOOD_CRON_THRESHOLD = datetime.timedelta(hours=1) + + def _safe_size(path: Path) -> int: try: res = path.stat() @@ -51,6 +57,14 @@ def _get_size_breakdown(data_manager): return breakdown +def _get_fietsboek_version(): + modules = subprocess.check_output(["pip", "list"]).split(b"\n") + for module in modules: + if module.startswith(b"fietsboek "): + return module.split()[1].decode("ascii") + return "" + + @view_config( route_name="admin", renderer="fietsboek:templates/admin_overview.jinja2", @@ -70,11 +84,35 @@ def admin(request: Request): size_total = request.data_manager.size() size_breakdown = _get_size_breakdown(request.data_manager) + try: + distro = platform.freedesktop_os_release()["PRETTY_NAME"] + except OSError: + distro = None + + try: + last_cronjob_timestamp = float(request.redis.get("last-cronjob")) + except (TypeError, ValueError): + last_cronjob = None + cron_good = False + else: + last_cronjob = datetime.datetime.fromtimestamp(last_cronjob_timestamp, datetime.UTC) + cron_good = (datetime.datetime.now(datetime.UTC) - last_cronjob) < GOOD_CRON_THRESHOLD + + versions = { + "fietsboek": _get_fietsboek_version(), + "python": platform.python_version(), + "linux": platform.platform(), + "distro": distro, + } + return { "user_count": user_count, "track_count": track_count, "total_size": size_total, "size_breakdown": size_breakdown, + "versions": versions, + "last_cronjob": last_cronjob, + "cron_good": cron_good, } -- cgit v1.2.3