From 41d88a2dc4bc9820f5801223d9830bd8f7c3d1d6 Mon Sep 17 00:00:00 2001 From: Ian DesJardins Date: Wed, 31 Jul 2024 07:36:37 -0400 Subject: [PATCH] Add disk monitoring (#233) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update the server-side api * In theory, add disk stuff to the front end * Working as dev environment * shift config to individual views, tweak the CONTRIB docs, and add an example config * Update the readme * Update static/main.js to pass eslint, and create a single style entry * Correct debugging mis-naming * Replace missing semicolon.. * fix: Compute disk warning state with config.disk_warning_threshold * feat: Add model class for keeping resource warnings * feat: Condition to flash warnings no looks at all computed warnings * chore: Run lint fix * chore: Run lint fix again * chore: Address critical and high dependabot flagged packages * task: remove console log Co-authored-by: Michał Krassowski <5832902+krassowski@users.noreply.github.com> * Update CONTRIBUTING.md Co-authored-by: Michał Krassowski <5832902+krassowski@users.noreply.github.com> * Fix typo in CONTRIBUTING.md Co-authored-by: Michał Krassowski <5832902+krassowski@users.noreply.github.com> * Fix typo in README.md docs Co-authored-by: Michał Krassowski <5832902+krassowski@users.noreply.github.com> * Fix server extension docs language Co-authored-by: Michał Krassowski <5832902+krassowski@users.noreply.github.com> * Fix typo regarding disk warning thresholds Co-authored-by: Michał Krassowski <5832902+krassowski@users.noreply.github.com> * Catch Exception instead of nothing at all Co-authored-by: Michał Krassowski <5832902+krassowski@users.noreply.github.com> * Update docs and delete example server config --------- Co-authored-by: Ian Stuart Co-authored-by: Michał Krassowski <5832902+krassowski@users.noreply.github.com> --- .gitignore | 2 + CONTRIBUTING.md | 8 + README.md | 21 ++- doc/settings.png | Bin 39075 -> 48836 bytes doc/statusbar_disk.png | Bin 0 -> 7718 bytes jupyter_resource_usage/api.py | 14 ++ jupyter_resource_usage/config.py | 49 +++++- jupyter_resource_usage/metrics.py | 29 ++-- jupyter_resource_usage/prometheus.py | 14 +- jupyter_resource_usage/static/main.js | 83 ++++++---- package.json | 5 +- packages/labextension/schema/topbar-item.json | 23 ++- packages/labextension/src/cpuView.tsx | 2 + packages/labextension/src/diskView.tsx | 67 ++++++++ packages/labextension/src/format.ts | 15 +- packages/labextension/src/index.ts | 28 ++-- packages/labextension/src/memoryView.tsx | 8 +- packages/labextension/src/model.ts | 151 +++++++++++++++--- packages/labextension/src/resourceUsage.tsx | 23 ++- packages/labextension/style/base.css | 1 + yarn.lock | 93 ++--------- 21 files changed, 471 insertions(+), 165 deletions(-) create mode 100644 doc/statusbar_disk.png create mode 100644 packages/labextension/src/diskView.tsx diff --git a/.gitignore b/.gitignore index 6815e0b..9cc7be8 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,8 @@ __pycache__/ # Distribution / packaging .Python +.direnv +.envrc env/ build/ develop-eggs/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a62a47e..f6c2149 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -127,6 +127,14 @@ JupyterLab v3.0.0 jupyter-resource-usage v0.1.0 enabled OK ``` +## Which code creates what content + +The stats are created by the server-side code in `jupyter_resource_usage`. + +For the jupyterlab 4 / notebook 7 UIs, the code in `packages/labextension` creates and writes the content for both the statusbar and the topbar. + +The topbar is defined in the schema, whilst the contents of the statusbar is driven purely by the labextension code.... and labels are defined by their appropriate `*View.tsx` file + ## pre-commit `jupyter-resource-usage` has adopted automatic code formatting so you shouldn't need to worry too much about your code style. diff --git a/README.md b/README.md index 7fa613a..0ff3adb 100644 --- a/README.md +++ b/README.md @@ -134,6 +134,23 @@ memory: ![Screenshot with CPU and memory](./doc/statusbar-cpu.png) +### Disk [partition] Usage + +`jupyter-resource-usage` can also track disk usage [of a defined partition] and report the `total` and `used` values as part of the `/api/metrics/v1` response. + +You enable tracking by setting the `track_disk_usage` trait (disabled by default): + +```python +c = get_config() +c.ResourceUseDisplay.track_disk_usage = True +``` + +The values are from the partition containing the folder in the trait `disk_path` (which defaults to `/home/joyvan`). If this path does not exist, disk usage information is omitted from the display. + +Mirroring CPU and Memory, the trait `disk_warning_threshold` signifies when to flag a usage warning, and like the others, it defaults to `0.1` (10% remaining) + +![Screenshot with Disk, CPU, and memory](./doc/statusbar_disk.png) + ### Disable Prometheus Metrics There is a [known bug](https://github.com/jupyter-server/jupyter-resource-usage/issues/123) with Prometheus metrics which @@ -157,9 +174,11 @@ render the alternative frontend in the topbar. Users can change the label and refresh rate for the alternative frontend using settings editor. +(The vertical bars are included by default, to help separate the three indicators.) + ## Resources Displayed -Currently the server extension only reports memory usage and CPU usage. Other metrics will be added in the future as needed. +Currently the server extension reports disk usage, memory usage and CPU usage. Other metrics will be added in the future as needed. Memory usage will show the PSS whenever possible (Linux only feature), and default to RSS otherwise. diff --git a/doc/settings.png b/doc/settings.png index 0c3460e7fd205abb40012192881fd33c7acbe395..f8bc4524a60fa03ee3cf8b7dcbff1d2ae3ef0488 100644 GIT binary patch literal 48836 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%0DIDCsezdY=xxGxL;yx!_6 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 literal 0 HcmV?d00001 diff --git a/jupyter_resource_usage/api.py b/jupyter_resource_usage/api.py index 97e515a..22e3ae6 100644 --- a/jupyter_resource_usage/api.py +++ b/jupyter_resource_usage/api.py @@ -75,6 +75,20 @@ async def get(self): metrics.update(cpu_percent=cpu_percent, cpu_count=cpu_count) + # Optionally get Disk information + if config.track_disk_usage: + try: + disk_info = psutil.disk_usage(config.disk_path) + except Exception: + pass + else: + metrics.update(disk_used=disk_info.used, disk_total=disk_info.total) + limits["disk"] = {"disk": disk_info.total} + if config.disk_warning_threshold != 0: + limits["disk"]["warn"] = (disk_info.total - disk_info.used) < ( + disk_info.total * config.disk_warning_threshold + ) + self.write(json.dumps(metrics)) @run_on_executor diff --git a/jupyter_resource_usage/config.py b/jupyter_resource_usage/config.py index 7263fff..3d98c42 100644 --- a/jupyter_resource_usage/config.py +++ b/jupyter_resource_usage/config.py @@ -7,6 +7,7 @@ from traitlets import Int from traitlets import List from traitlets import TraitType +from traitlets import Unicode from traitlets import Union from traitlets.config import Configurable @@ -27,7 +28,7 @@ def validate(self, obj, value): keys = list(value.keys()) if "name" in keys: keys.remove("name") - if all(key in ["kwargs", "attribute"] for key in keys): + if all(key in ["args", "kwargs", "attribute"] for key in keys): return value self.error(obj, value) @@ -37,6 +38,15 @@ class ResourceUseDisplay(Configurable): Holds server-side configuration for jupyter-resource-usage """ + # Needs to be defined early, so the metrics can use it. + disk_path = Union( + trait_types=[Unicode(), Callable()], + default_value="/home/joyvan", + help=""" + A path in the partition to be reported on. + """, + ).tag(config=True) + process_memory_metrics = List( trait=PSUtilMetric(), default_value=[{"name": "memory_info", "attribute": "rss"}], @@ -56,6 +66,19 @@ class ResourceUseDisplay(Configurable): trait=PSUtilMetric(), default_value=[{"name": "cpu_count"}] ) + process_disk_metrics = List( + trait=PSUtilMetric(), + default_value=[], + ) + + system_disk_metrics = List( + trait=PSUtilMetric(), + default_value=[ + {"name": "disk_usage", "args": [disk_path], "attribute": "total"}, + {"name": "disk_usage", "args": [disk_path], "attribute": "used"}, + ], + ) + mem_warning_threshold = Float( default_value=0.1, help=""" @@ -123,6 +146,30 @@ def _mem_limit_default(self): def _cpu_limit_default(self): return float(os.environ.get("CPU_LIMIT", 0)) + track_disk_usage = Bool( + default_value=False, + help=""" + Set to True in order to enable reporting of disk usage statistics. + """, + ).tag(config=True) + + @default("disk_path") + def _disk_path_default(self): + return str(os.environ.get("HOME", "/home/joyvan")) + + disk_warning_threshold = Float( + default_value=0.1, + help=""" + Warn user with flashing lights when disk usage is within this fraction + total space. + + For example, if total size is 10G, `disk_warning_threshold` is 0.1, + we will start warning the user when they use (10 - (10 * 0.1)) G. + + Set to 0 to disable warning. + """, + ).tag(config=True) + enable_prometheus_metrics = Bool( default_value=True, help=""" diff --git a/jupyter_resource_usage/metrics.py b/jupyter_resource_usage/metrics.py index ae5e457..a19d606 100644 --- a/jupyter_resource_usage/metrics.py +++ b/jupyter_resource_usage/metrics.py @@ -13,10 +13,10 @@ def __init__(self, server_app: ServerApp): ] self.server_app = server_app - def get_process_metric_value(self, process, name, kwargs, attribute=None): + def get_process_metric_value(self, process, name, args, kwargs, attribute=None): try: # psutil.Process methods will either return... - metric_value = getattr(process, name)(**kwargs) + metric_value = getattr(process, name)(*args, **kwargs) if attribute is not None: # ... a named tuple return getattr(metric_value, attribute) else: # ... or a number @@ -26,7 +26,7 @@ def get_process_metric_value(self, process, name, kwargs, attribute=None): except BaseException: return 0 - def process_metric(self, name, kwargs={}, attribute=None): + def process_metric(self, name, args=[], kwargs={}, attribute=None): if psutil is None: return None else: @@ -34,17 +34,20 @@ def process_metric(self, name, kwargs={}, attribute=None): all_processes = [current_process] + current_process.children(recursive=True) process_metric_value = lambda process: self.get_process_metric_value( - process, name, kwargs, attribute + process, name, args, kwargs, attribute ) return sum([process_metric_value(process) for process in all_processes]) - def system_metric(self, name, kwargs={}, attribute=None): + def system_metric(self, name, args=[], kwargs={}, attribute=None): if psutil is None: return None else: - # psutil functions will either return... - metric_value = getattr(psutil, name)(**kwargs) + # psutil functions will either raise an error, or return... + try: + metric_value = getattr(psutil, name)(*args, **kwargs) + except: + return None if attribute is not None: # ... a named tuple return getattr(metric_value, attribute) else: # ... or a number @@ -63,8 +66,11 @@ def get_metric_values(self, metrics, metric_type): return metric_values def metrics(self, process_metrics, system_metrics): - metric_values = self.get_metric_values(process_metrics, "process") - metric_values.update(self.get_metric_values(system_metrics, "system")) + metric_values = {} + if process_metrics: + metric_values.update(self.get_metric_values(process_metrics, "process")) + if system_metrics: + metric_values.update(self.get_metric_values(system_metrics, "system")) if any(value is None for value in metric_values.values()): return None @@ -80,3 +86,8 @@ def cpu_metrics(self): return self.metrics( self.config.process_cpu_metrics, self.config.system_cpu_metrics ) + + def disk_metrics(self): + return self.metrics( + self.config.process_disk_metrics, self.config.system_disk_metrics + ) diff --git a/jupyter_resource_usage/prometheus.py b/jupyter_resource_usage/prometheus.py index 511ce79..8bd8ced 100644 --- a/jupyter_resource_usage/prometheus.py +++ b/jupyter_resource_usage/prometheus.py @@ -18,7 +18,14 @@ def __init__(self, metricsloader: PSUtilMetricsLoader): self.config = metricsloader.config self.session_manager = metricsloader.server_app.session_manager - gauge_names = ["total_memory", "max_memory", "total_cpu", "max_cpu"] + gauge_names = [ + "total_memory", + "max_memory", + "total_cpu", + "max_cpu", + "max_disk", + "current_disk", + ] for name in gauge_names: phrase = name + "_usage" gauge = Gauge(phrase, "counter for " + phrase.replace("_", " "), []) @@ -34,6 +41,11 @@ async def __call__(self, *args, **kwargs): if cpu_metric_values is not None: self.TOTAL_CPU_USAGE.set(cpu_metric_values["cpu_percent"]) self.MAX_CPU_USAGE.set(self.apply_cpu_limit(cpu_metric_values)) + if self.config.track_disk_usage: + disk_metric_values = self.metricsloader.disk_metrics() + if disk_metric_values is not None: + self.CURRENT_DISK_USAGE.set(disk_metric_values["disk_usage_used"]) + self.MAX_DISK_USAGE.set(disk_metric_values["disk_usage_total"]) def apply_memory_limit(self, memory_metric_values) -> Optional[int]: if memory_metric_values is None: diff --git a/jupyter_resource_usage/static/main.js b/jupyter_resource_usage/static/main.js index b4e09d2..285e3fb 100644 --- a/jupyter_resource_usage/static/main.js +++ b/jupyter_resource_usage/static/main.js @@ -1,8 +1,19 @@ -define([ +define([ // eslint-disable-line no-undef 'jquery', 'base/js/utils' -], function ($, utils) { +], ($, utils) => { function setupDOM() { + $('#maintoolbar-container').append( + $('

').attr('id', 'jupyter-resource-usage-display-disk') + .addClass('btn-group') + .addClass('jupyter-resource-usage-hide') + .addClass('pull-right').append( + $('').text(' Disk: ') + ).append( + $('').attr('id', 'jupyter-resource-usage-disk') + .attr('title', 'Actively used CPU (updates every 5s)') + ) + ); $('#maintoolbar-container').append( $('
').attr('id', 'jupyter-resource-usage-display') .addClass('btn-group') @@ -25,20 +36,16 @@ define([ .attr('title', 'Actively used CPU (updates every 5s)') ) ); - // FIXME: Do something cleaner to get styles in here? - $('head').append( - $('