From f8831be7e9aa70b1fbd1ab5f17a0fef5ba19cf37 Mon Sep 17 00:00:00 2001 From: Eric Charles Date: Mon, 14 Feb 2022 10:35:07 +0100 Subject: [PATCH] panel content for #4 and #7 --- Makefile | 3 + notebooks/cpu.ipynb | 17 ++++- src/widget.tsx | 153 +++++++++++++++++++++----------------------- 3 files changed, 92 insertions(+), 81 deletions(-) diff --git a/Makefile b/Makefile index a68074b..8d9f9ae 100644 --- a/Makefile +++ b/Makefile @@ -70,6 +70,9 @@ jlab-watch: --ServerApp.jpserver_extensions="{'jupyterlab_resource_usage': True}" \ --port 8234) +kill: + lsof -i TCP:8234 | grep LISTEN | awk '{print $2}' | xargs kill -9 + watch: ($(CONDA_ACTIVATE) ${ENV_NAME}; \ yarn watch ) diff --git a/notebooks/cpu.ipynb b/notebooks/cpu.ipynb index 0b37183..c677ee3 100644 --- a/notebooks/cpu.ipynb +++ b/notebooks/cpu.ipynb @@ -2,10 +2,23 @@ "cells": [ { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "0ccb3a21-64c5-4ee2-a4fc-59c23afb0944", "metadata": {}, - "outputs": [], + "outputs": [ + { + "ename": "KeyboardInterrupt", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "Input \u001b[0;32mIn [1]\u001b[0m, in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 6\u001b[0m x\u001b[38;5;241m*\u001b[39mx\n\u001b[1;32m 8\u001b[0m \u001b[38;5;66;03m# processes = cpu_count()\u001b[39;00m\n\u001b[1;32m 9\u001b[0m \u001b[38;5;66;03m# print('utilizing %d cores\\n' % processes)\u001b[39;00m\n\u001b[1;32m 10\u001b[0m \u001b[38;5;66;03m# pool = Pool(processes)\u001b[39;00m\n\u001b[1;32m 11\u001b[0m \u001b[38;5;66;03m# pool.map(f, range(processes))\u001b[39;00m\n\u001b[0;32m---> 13\u001b[0m \u001b[43mf\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m)\u001b[49m\n", + "Input \u001b[0;32mIn [1]\u001b[0m, in \u001b[0;36mf\u001b[0;34m(x)\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mf\u001b[39m(x):\n\u001b[0;32m----> 5\u001b[0m \u001b[38;5;28;01mwhile\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m:\n\u001b[1;32m 6\u001b[0m x\u001b[38;5;241m*\u001b[39mx\n", + "\u001b[0;31mKeyboardInterrupt\u001b[0m: " + ] + } + ], "source": [ "# from multiprocessing import Pool\n", "# from multiprocessing import cpu_count\n", diff --git a/src/widget.tsx b/src/widget.tsx index 37838e6..135c197 100644 --- a/src/widget.tsx +++ b/src/widget.tsx @@ -11,6 +11,7 @@ import useInterval from './useInterval'; type Usage = { timestamp: Date | null; kernelId: string; + hostname: string; kernel_cpu: number; kernel_memory: number; host_cpu_percent: number; @@ -26,43 +27,18 @@ type Usage = { }; }; -const UNKONWN_USAGE: Usage = { - timestamp: null, - kernelId: '', - kernel_cpu: -1, - kernel_memory: -1, - host_cpu_percent: -1, - host_virtual_memory: { - active: -1, - available: -1, - free: -1, - inactive: -1, - percent: -1, - total: -1, - used: -1, - wired: -1 - } -}; - const POLL_INTERVAL_SEC = 5; const POLL_MAX_INTERVAL_SEC = 300; type KernelPoll = { poll: Poll; - usage: Usage; + path: string; + usage: Usage | undefined; }; const kernelPools = new Map(); -const getUsage = (kernelId: string) => { - const kernelPoll = kernelPools.get(kernelId); - if (kernelPoll) { - return kernelPoll.usage; - } - return UNKONWN_USAGE; -}; - const KernelUsage = (props: { widgetAdded: ISignal; currentNotebookChanged: ISignal; @@ -98,7 +74,7 @@ const KernelUsage = (props: { }); }; - const doPoll = (kernelId: string) => { + const doPoll = (kernelId: string, path: string) => { let kernelPoll = kernelPools.get(kernelId); if (!kernelPoll) { const poll = new Poll({ @@ -114,7 +90,8 @@ const KernelUsage = (props: { }); kernelPoll = { poll, - usage: UNKONWN_USAGE + path, + usage: undefined }; kernelPools.set(kernelId, kernelPoll); } @@ -132,65 +109,83 @@ const KernelUsage = (props: { > ) => { const kernelId = args.newValue?.id; - setKernelId(kernelId); - doPoll(kernelId as string); + if (kernelId) { + setKernelId(kernelId); + const path = panel?.sessionContext.session?.model.path; + doPoll(kernelId as string, path as string); + } } ); if (panel?.sessionContext.session?.id !== kernelId) { if (panel?.sessionContext.session?.kernel?.id) { const kernelId = panel?.sessionContext.session?.kernel?.id; - setKernelId(kernelId); - doPoll(kernelId as string); + if (kernelId) { + setKernelId(kernelId); + const path = panel?.sessionContext.session?.model.path; + doPoll(kernelId as string, path); + } } } } ); - return ( - <> -

Kernel Usage

-
Kernel ID: {kernelId}
-
- Timestamp: {kernelId && getUsage(kernelId).timestamp?.toLocaleString()} -
-
- CPU: {kernelId && getUsage(kernelId).kernel_cpu} -
-
- Memory: {kernelId && getUsage(kernelId).kernel_memory} -
-
-

Host CPU

-
- Percentage {kernelId && getUsage(kernelId).host_cpu_percent} -
-

Host Virtual Memory

-
- Active: {kernelId && getUsage(kernelId).host_virtual_memory.active} -
-
- Available:{' '} - {kernelId && getUsage(kernelId).host_virtual_memory.available} -
-
- Free: {kernelId && getUsage(kernelId).host_virtual_memory.free} -
-
- Inactive: {kernelId && getUsage(kernelId).host_virtual_memory.inactive} -
-
- Percent: {kernelId && getUsage(kernelId).host_virtual_memory.percent} -
-
- Total: {kernelId && getUsage(kernelId).host_virtual_memory.total} -
-
- Used: {kernelId && getUsage(kernelId).host_virtual_memory.used} -
-
- Wired: {kernelId && getUsage(kernelId).host_virtual_memory.wired} -
- - ); + + if (kernelId) { + const kernelPoll = kernelPools.get(kernelId); + if (kernelPoll) { + return ( + <> +

Kernel Usage

+
+ Kernel Host: {kernelPoll.usage?.hostname} +
+
+ Notebook: {kernelPoll.path} +
+
Kernel ID: {kernelId}
+
+ Timestamp: {kernelPoll.usage?.timestamp?.toLocaleString()} +
+
+ CPU: {kernelPoll.usage?.kernel_cpu} +
+
+ Memory: {kernelPoll.usage?.kernel_memory} +
+
+

Host CPU

+
+ Percentage {kernelPoll.usage?.host_cpu_percent} +
+

Host Virtual Memory

+
+ Active: {kernelPoll.usage?.host_virtual_memory.active} +
+
+ Available: {kernelPoll.usage?.host_virtual_memory.available} +
+
+ Free: {kernelPoll.usage?.host_virtual_memory.free} +
+
+ Inactive: {kernelPoll.usage?.host_virtual_memory.inactive} +
+
+ Percent: {kernelPoll.usage?.host_virtual_memory.percent} +
+
+ Total: {kernelPoll.usage?.host_virtual_memory.total} +
+
+ Used: {kernelPoll.usage?.host_virtual_memory.used} +
+
+ Wired: {kernelPoll.usage?.host_virtual_memory.wired} +
+ + ); + } + } + return

Kernel usage is not available

; }; export class KernelUsageWidget extends ReactWidget {