]> git.ipfire.org Git - oddments/collecty.git/commitdiff
memory: Refactor plugin to store data in kilobytes instead of percentages
authorMichael Tremer <michael.tremer@ipfire.org>
Thu, 24 Sep 2020 14:48:52 +0000 (14:48 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Thu, 24 Sep 2020 14:48:52 +0000 (14:48 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/collecty/colours.py
src/collecty/plugins/base.py
src/collecty/plugins/memory.py

index e03a358e0ad0739e8e9741c48e127e2e6996398a..3a0a1883b35d2e6c2301e2b2168d797b75842fbf 100644 (file)
@@ -141,6 +141,7 @@ MEMORY_USED     = GREEN
 MEMORY_BUFFERED = BLUE
 MEMORY_CACHED   = YELLOW
 MEMORY_SWAP     = RED
+MEMORY_FREE     = LIGHT_GREY
 
 COLOURS_PROTOCOL_STATES = {
        # General states
index 3a7fd5eec98a16f2ddb0b561f608010adc04f849..fc00427f320ca8817a6264ac376a3cef6e176588 100644 (file)
@@ -510,6 +510,31 @@ class Object(object):
 
                return ret
 
+       def read_proc_meminfo(self):
+               ret = {}
+
+               with open("/proc/meminfo") as f:
+                       for line in f:
+                               # Split the key from the rest of the line
+                               key, line = line.split(":", 1)
+
+                               # Remove any whitespace
+                               line = line.strip()
+
+                               # Remove any trailing kB
+                               if line.endswith(" kB"):
+                                       line = line[:-3]
+
+                               # Try to convert to integer
+                               try:
+                                       line = int(line)
+                               except (TypeError, ValueError):
+                                       continue
+
+                               ret[key] = line
+
+               return ret
+
 
 class GraphTemplate(object):
        # A unique name to identify this graph template.
index 01ff64c36fd3f51224f99df5a4a456d79471c866..736c9422a51ae7baae4937ab86aac852a96b6bbb 100644 (file)
@@ -27,7 +27,6 @@ from ..constants import *
 class GraphTemplateMemory(base.GraphTemplate):
        name = "memory"
 
-       upper_limit = 100
        lower_limit = 0
 
        @property
@@ -42,47 +41,65 @@ class GraphTemplateMemory(base.GraphTemplate):
                        "COMMENT:%s" % (COLUMN % _("Minimum")),
                        "COMMENT:%s\\j" % (COLUMN % _("Maximum")),
 
-                       "AREA:used%s:%s" % (
+                       # Convert everything into bytes
+                       "CDEF:mem_total_bytes=mem_total,1024,*",
+                       "CDEF:mem_cached_bytes=mem_cached,1024,*",
+                       "CDEF:mem_buffered_bytes=mem_buffered,1024,*",
+                       "CDEF:mem_free_bytes=mem_free,1024,*",
+                       "CDEF:swap_total_bytes=swap_total,1024,*",
+                       "CDEF:swap_free_bytes=swap_free,1024,*",
+
+                       # Compute used memory & swap
+                       "CDEF:mem_used_bytes=mem_total_bytes,mem_free_bytes,-,mem_cached_bytes,-,mem_buffered_bytes,-",
+                       "CDEF:swap_used_bytes=swap_total_bytes,swap_free_bytes,-",
+
+                       "AREA:mem_used_bytes%s:%s" % (
                                transparency(MEMORY_USED, AREA_OPACITY),
                                LABEL % _("Used Memory"),
                        ),
-                       "GPRINT:used_cur:%s" % PERCENTAGE,
-                       "GPRINT:used_avg:%s" % PERCENTAGE,
-                       "GPRINT:used_min:%s" % PERCENTAGE,
-                       "GPRINT:used_max:%s\\j" % PERCENTAGE,
+                       "GPRINT:mem_used_bytes_cur:%s" % LARGE_FLOAT,
+                       "GPRINT:mem_used_bytes_avg:%s" % LARGE_FLOAT,
+                       "GPRINT:mem_used_bytes_min:%s" % LARGE_FLOAT,
+                       "GPRINT:mem_used_bytes_max:%s\\j" % LARGE_FLOAT,
 
-                       "STACK:buffered%s:%s" % (
+                       "STACK:mem_buffered_bytes%s:%s" % (
                                transparency(MEMORY_BUFFERED, AREA_OPACITY),
                                LABEL % _("Buffered Data"),
                        ),
-                       "GPRINT:buffered_cur:%s" % PERCENTAGE,
-                       "GPRINT:buffered_avg:%s" % PERCENTAGE,
-                       "GPRINT:buffered_min:%s" % PERCENTAGE,
-                       "GPRINT:buffered_max:%s\\j" % PERCENTAGE,
-
-                       "STACK:cached%s:%s" % (
-                               lighten(MEMORY_CACHED, AREA_OPACITY),
-                               LABEL % _("Cached data")),
-                       "GPRINT:cached_cur:%s" % PERCENTAGE,
-                       "GPRINT:cached_avg:%s" % PERCENTAGE,
-                       "GPRINT:cached_min:%s" % PERCENTAGE,
-                       "GPRINT:cached_max:%s\\j" % PERCENTAGE,
-
-#                      "STACK:free#7799ff:%-15s" % _("Free memory"),
-#                      "GPRINT:free_max:%12s\:" % _("Maximum") + " %6.2lf" ,
-#                      "GPRINT:free_min:%12s\:" % _("Minimum") + " %6.2lf",
-#                      "GPRINT:free_avg:%12s\:" % _("Average") + " %6.2lf",
-
-                       "LINE3:swap%s:%-15s" % (MEMORY_SWAP, LABEL % _("Used Swap Space")),
-                       "GPRINT:swap_cur:%s" % PERCENTAGE,
-                       "GPRINT:swap_avg:%s" % PERCENTAGE,
-                       "GPRINT:swap_min:%s" % PERCENTAGE,
-                       "GPRINT:swap_max:%s\\j" % PERCENTAGE,
+                       "GPRINT:mem_buffered_bytes_cur:%s" % LARGE_FLOAT,
+                       "GPRINT:mem_buffered_bytes_avg:%s" % LARGE_FLOAT,
+                       "GPRINT:mem_buffered_bytes_min:%s" % LARGE_FLOAT,
+                       "GPRINT:mem_buffered_bytes_max:%s\\j" % LARGE_FLOAT,
+
+                       "STACK:mem_cached_bytes%s:%s" % (
+                               transparency(MEMORY_CACHED, AREA_OPACITY),
+                               LABEL % _("Cached Data")),
+                       "GPRINT:mem_cached_bytes_cur:%s" % LARGE_FLOAT,
+                       "GPRINT:mem_cached_bytes_avg:%s" % LARGE_FLOAT,
+                       "GPRINT:mem_cached_bytes_min:%s" % LARGE_FLOAT,
+                       "GPRINT:mem_cached_bytes_max:%s\\j" % LARGE_FLOAT,
+
+                       "STACK:mem_free_bytes%s:%s" % (
+                               transparency(MEMORY_FREE, AREA_OPACITY),
+                               LABEL % _("Free Memory"),
+                       ),
+                       "GPRINT:mem_free_bytes_cur:%s" % LARGE_FLOAT,
+                       "GPRINT:mem_free_bytes_avg:%s" % LARGE_FLOAT,
+                       "GPRINT:mem_free_bytes_min:%s" % LARGE_FLOAT,
+                       "GPRINT:mem_free_bytes_max:%s\\j" % LARGE_FLOAT,
+
+                       EMPTY_LINE,
+
+                       "LINE:swap_used_bytes%s:%-15s" % (MEMORY_SWAP, LABEL % _("Used Swap Space")),
+                       "GPRINT:swap_used_bytes_cur:%s" % LARGE_FLOAT,
+                       "GPRINT:swap_used_bytes_avg:%s" % LARGE_FLOAT,
+                       "GPRINT:swap_used_bytes_min:%s" % LARGE_FLOAT,
+                       "GPRINT:swap_used_bytes_max:%s\\j" % LARGE_FLOAT,
 
                        # Draw the outlines of the areas
-                       "LINE1:used%s" % MEMORY_USED,
-                       "LINE1:buffered%s::STACK" % MEMORY_BUFFERED,
-                       "LINE1:cached%s::STACK" % MEMORY_CACHED,
+                       "LINE1:mem_used_bytes%s" % MEMORY_USED,
+                       "LINE1:mem_buffered_bytes%s::STACK" % MEMORY_BUFFERED,
+                       "LINE1:mem_cached_bytes%s::STACK" % MEMORY_CACHED,
                ]
 
        @property
@@ -95,16 +112,17 @@ class GraphTemplateMemory(base.GraphTemplate):
        def graph_vertical_label(self):
                _ = self.locale.translate
 
-               return _("Percent")
+               return _("Bytes")
 
 
 class MemoryObject(base.Object):
        rrd_schema = [
-               "DS:used:GAUGE:0:100",
-               "DS:cached:GAUGE:0:100",
-               "DS:buffered:GAUGE:0:100",
-               "DS:free:GAUGE:0:100",
-               "DS:swap:GAUGE:0:100",
+               "DS:mem_total:GAUGE:0:U",
+               "DS:mem_cached:GAUGE:0:U",
+               "DS:mem_buffered:GAUGE:0:U",
+               "DS:mem_free:GAUGE:0:U",
+               "DS:swap_total:GAUGE:0:U",
+               "DS:swap_free:GAUGE:0:U",
        ]
 
        @property
@@ -112,34 +130,16 @@ class MemoryObject(base.Object):
                return "default"
 
        def collect(self):
-               with open("/proc/meminfo") as f:
-                       for line in f:
-                               if line.startswith("MemTotal:"):
-                                       total = float(line.split()[1])
-                               if line.startswith("MemFree:"):
-                                       free = float(line.split()[1])
-                               elif line.startswith("Buffers:"):
-                                       buffered = float(line.split()[1])
-                               elif line.startswith("Cached:"):
-                                       cached = float(line.split()[1])
-                               elif line.startswith("SwapTotal:"):
-                                       swapt = float(line.split()[1])
-                               elif line.startswith("SwapFree:"):
-                                       swapf = float(line.split()[1])
-
-                       ret = [
-                               "%s" % ((total - (free + buffered + cached)) * 100 / total),
-                               "%s" % (cached * 100 / total),
-                               "%s" % (buffered * 100 / total),
-                               "%s" % (free * 100 / total),
-                       ]
-
-                       if swapt:
-                               ret.append("%s" % ((swapt - swapf) * 100 / swapt))
-                       else:
-                               ret.append("0")
-
-                       return ret
+               meminfo = self.read_proc_meminfo()
+
+               return (
+                       meminfo.get("MemTotal"),
+                       meminfo.get("Cached"),
+                       meminfo.get("Buffers"),
+                       meminfo.get("MemFree"),
+                       meminfo.get("SwapTotal"),
+                       meminfo.get("SwapFree"),
+               )
 
 
 class MemoryPlugin(base.Plugin):