From 9f586b2e243a86d5094ab7fe6493c2398d673c79 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Tue, 31 Oct 2023 11:46:37 +0000 Subject: [PATCH] builders: Add a new stats handler Signed-off-by: Michael Tremer --- src/buildservice/builders.py | 2 +- src/web/__init__.py | 1 + src/web/base.py | 12 ++++++++ src/web/builders.py | 58 +++++++++++++++++++++++++++++++++++- 4 files changed, 71 insertions(+), 2 deletions(-) diff --git a/src/buildservice/builders.py b/src/buildservice/builders.py index b01a059..4cf1014 100644 --- a/src/buildservice/builders.py +++ b/src/buildservice/builders.py @@ -333,7 +333,7 @@ class Builder(base.DataObject): cpu_guest_nice=None, loadavg1=None, loadavg5=None, loadavg15=None, mem_total=None, mem_available=None, mem_used=None, mem_free=None, mem_active=None, mem_inactive=None, mem_buffers=None, mem_cached=None, mem_shared=None, swap_total=None, swap_used=None, - swap_free=None, **kwargs): + swap_free=None): """ Logs some stats about this builder """ diff --git a/src/web/__init__.py b/src/web/__init__.py index daedd8b..1abe4d1 100644 --- a/src/web/__init__.py +++ b/src/web/__init__.py @@ -196,6 +196,7 @@ class Application(tornado.web.Application): (r"/builders/([A-Za-z0-9\-\.]+)/stats", builders.StatsHandler), (r"/builders/([A-Za-z0-9\-\.]+)/stop", builders.StopHandler), (r"/api/v1/builders/control", builders.APIv1ControlHandler), + (r"/api/v1/builders/stats", builders.APIv1StatsHandler), # Distributions (r"/distros", distributions.IndexHandler), diff --git a/src/web/base.py b/src/web/base.py index 4aaf9a0..cea68c5 100644 --- a/src/web/base.py +++ b/src/web/base.py @@ -260,6 +260,18 @@ class BaseHandler(tornado.web.RequestHandler): except (TypeError, ValueError): raise tornado.web.HTTPError(400, "%s is not an integer" % arg) + def get_argument_float(self, *args, **kwargs): + arg = self.get_argument(*args, **kwargs) + + # Return nothing + if not arg: + return None + + try: + return float(arg) + except (TypeError, ValueError): + raise tornado.web.HTTPError(400, "%s is not an float" % arg) + def get_argument_builder(self, *args, **kwargs): name = self.get_argument(*args, **kwargs) diff --git a/src/web/builders.py b/src/web/builders.py index c0cb87d..f3705b7 100644 --- a/src/web/builders.py +++ b/src/web/builders.py @@ -49,7 +49,63 @@ class APIv1ControlHandler(base.APIMixin, tornado.websocket.WebSocketHandler): await self.builder.log_stats(**data) -class StatsHandler(base.BackendMixin, tornado.websocket.WebSocketHandler): +class APIv1StatsHandler(base.APIMixin, base.BaseHandler): + @base.negotiate + async def post(self): + stats = { + # CPU info + "cpu_model" : self.get_argument("cpu_model"), + "cpu_count" : self.get_argument_int("cpu_count"), + "cpu_arch" : self.get_argument("cpu_arch"), + + # Pakfire Version + "pakfire_version" : self.get_argument("pakfire_version"), + + # OS + "os_name" : self.get_argument("os_name"), + + # CPU stats + "cpu_user" : self.get_argument_float("cpu_user"), + "cpu_nice" : self.get_argument_float("cpu_nice"), + "cpu_system" : self.get_argument_float("cpu_system"), + "cpu_idle" : self.get_argument_float("cpu_idle"), + "cpu_iowait" : self.get_argument_float("cpu_iowait"), + "cpu_irq" : self.get_argument_float("cpu_irq"), + "cpu_softirq" : self.get_argument_float("cpu_softirq"), + "cpu_steal" : self.get_argument_float("cpu_steal"), + "cpu_guest" : self.get_argument_float("cpu_guest"), + "cpu_guest_nice" : self.get_argument_float("cpu_guest_nice"), + + # Load Average + "loadavg1" : self.get_argument_float("loadavg1"), + "loadavg5" : self.get_argument_float("loadavg5"), + "loadavg15" : self.get_argument_float("loadavg15"), + + # Memory + "mem_total" : self.get_argument_int("mem_total"), + "mem_available" : self.get_argument_int("mem_available"), + "mem_used" : self.get_argument_int("mem_used"), + "mem_free" : self.get_argument_int("mem_free"), + "mem_active" : self.get_argument_int("mem_active"), + "mem_inactive" : self.get_argument_int("mem_inactive"), + "mem_buffers" : self.get_argument_int("mem_buffers"), + "mem_cached" : self.get_argument_int("mem_cached"), + "mem_shared" : self.get_argument_int("mem_shared"), + + # Swap + "swap_total" : self.get_argument_int("swap_total"), + "swap_used" : self.get_argument_int("swap_used"), + "swap_free" : self.get_argument_int("swap_free"), + } + + with self.db.transaction(): + await self.builder.log_stats(**stats) + + # Send OK + self.finish({}) + + +class StatsHandler(base.BaseHandler, tornado.websocket.WebSocketHandler): # No authentication required async def open(self, name): builder = self.backend.builders.get_by_name(name) -- 2.39.2