]> git.ipfire.org Git - pbs.git/commitdiff
builders: Add a new stats handler
authorMichael Tremer <michael.tremer@ipfire.org>
Tue, 31 Oct 2023 11:46:37 +0000 (11:46 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Tue, 31 Oct 2023 11:46:37 +0000 (11:46 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/buildservice/builders.py
src/web/__init__.py
src/web/base.py
src/web/builders.py

index b01a059aa51b00850c9ccae55adec751605d1a4c..4cf1014c01e25816b40e1b4ae2ffc092787a50e7 100644 (file)
@@ -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
                """
index daedd8bcc3014f29d2e2dec9180f3c6beaa61dad..1abe4d19ea894e94321e2079d18f86bad4ef5e29 100644 (file)
@@ -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),
index 4aaf9a09a168606afdbdfd189dce9e65fe7bd05c..cea68c5cb947acadfcba6fd50e9fe679771ae249 100644 (file)
@@ -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)
 
index c0cb87dbd5001d308fb5a9eaabb2e1d074ddc887..f3705b77666f294476256024bc8b958e7672ab66 100644 (file)
@@ -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)