From eeaffb259bbfa3d701ec03f9643e225bf60980c0 Mon Sep 17 00:00:00 2001 From: Tom Manner Date: Wed, 6 May 2020 17:25:29 -0400 Subject: [PATCH] Implemented virtual memory usage metric type. --- taskobra/monitor/__main__.py | 6 +++-- taskobra/orm/__init__.py | 2 +- taskobra/orm/metrics/__init__.py | 1 + taskobra/orm/metrics/metric.py | 1 + taskobra/orm/metrics/virtual_memory.py | 28 ++++++++++++++++++++ tests/orm/metrics/test_VirtualMemoryUsage.py | 15 +++++++++++ 6 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 taskobra/orm/metrics/virtual_memory.py create mode 100644 tests/orm/metrics/test_VirtualMemoryUsage.py diff --git a/taskobra/monitor/__main__.py b/taskobra/monitor/__main__.py index b4a987c..576fae3 100644 --- a/taskobra/monitor/__main__.py +++ b/taskobra/monitor/__main__.py @@ -5,9 +5,9 @@ import psutil import sys import time -import platform +import platform -from taskobra.orm import CpuPercent, get_engine, get_session, Snapshot +from taskobra.orm import CpuPercent, VirtualMemoryUsage, get_engine, get_session, Snapshot from taskobra.monitor import system_info @@ -27,6 +27,8 @@ def create_snapshot(args): # print(f"Disk : {psutil.disk_usage('/')}") # print(f"VMem : {psutil.virtual_memory()}") # print(f"SwapMem : {psutil.swap_memory()}") + vmem = psutil.virtual_memory() + snapshot.metrics.append(VirtualMemoryUsage(total=vmem.total, mean=vmem.used)) snapshot.metrics.append(CpuPercent(core_id=0, mean=psutil.cpu_percent())) # snapshot = for each metric snapshot.add(metric) return snapshot diff --git a/taskobra/orm/__init__.py b/taskobra/orm/__init__.py index 07cc3ab..1e11dfe 100644 --- a/taskobra/orm/__init__.py +++ b/taskobra/orm/__init__.py @@ -1,6 +1,6 @@ from .base import get_engine, get_session, ORMBase from .components import Component, CPU, GPU, Memory, OperatingSystem, Storage -from .metrics import Metric, CpuPercent +from .metrics import Metric, CpuPercent, VirtualMemoryUsage from .role import Role from .user import User from .snapshot import Snapshot diff --git a/taskobra/orm/metrics/__init__.py b/taskobra/orm/metrics/__init__.py index fca228b..b3e0baf 100644 --- a/taskobra/orm/metrics/__init__.py +++ b/taskobra/orm/metrics/__init__.py @@ -1,2 +1,3 @@ from .metric import Metric from .cpu_percent import CpuPercent +from .virtual_memory import VirtualMemoryUsage diff --git a/taskobra/orm/metrics/metric.py b/taskobra/orm/metrics/metric.py index e8f7002..8b584c5 100644 --- a/taskobra/orm/metrics/metric.py +++ b/taskobra/orm/metrics/metric.py @@ -16,6 +16,7 @@ class Metric(ORMBase): variance = Column(Float, default=0.0) metric_type = Column(Enum( "CpuPercent", + "VirtualMemoryUsage", "TestMetricMetric", "TestSnapshotMetric", name="MetricType" diff --git a/taskobra/orm/metrics/virtual_memory.py b/taskobra/orm/metrics/virtual_memory.py new file mode 100644 index 0000000..5c1877a --- /dev/null +++ b/taskobra/orm/metrics/virtual_memory.py @@ -0,0 +1,28 @@ +from collections import defaultdict +from sqlalchemy import Column, Float, ForeignKey, Integer +from typing import Collection +from taskobra.orm.metrics.metric import Metric + + +class VirtualMemoryUsage(Metric): + __tablename__ = "VirtualMemoryUsage" + unique_id = Column(Integer, ForeignKey("Metric.unique_id"), primary_key=True) + total = Column(Float) + __mapper_args__ = { + "polymorphic_identity": __tablename__ + } + + @property + def used(self): + return self.mean + + @property + def percent(self): + return self.used / self.total + + def __repr__(self): + s = f" 1: + s += f" sd:{self.standard_deviation:.3} {self.sample_count})" + s += ")>" + return s diff --git a/tests/orm/metrics/test_VirtualMemoryUsage.py b/tests/orm/metrics/test_VirtualMemoryUsage.py new file mode 100644 index 0000000..ce04e79 --- /dev/null +++ b/tests/orm/metrics/test_VirtualMemoryUsage.py @@ -0,0 +1,15 @@ +from ..ORMTestCase import ORMTestCase +from sqlalchemy import Column, ForeignKey, Integer +import statistics +from taskobra.orm import get_engine, get_session +from taskobra.orm.metrics import VirtualMemoryUsage + + +class TestCpuPercent(ORMTestCase): + def test_prune(self): + with get_session(bind=get_engine("sqlite:///:memory:")) as session: + session.add(VirtualMemoryUsage(total=10, mean=2)) + session.add(VirtualMemoryUsage(total=10, mean=3)) + session.add(VirtualMemoryUsage(total=10, mean=4)) + session.add(VirtualMemoryUsage(total=10, mean=4)) + session.add(VirtualMemoryUsage(total=10, mean=5))