From e3a1a774ca4cd209910c7f11d4b13d665261afd5 Mon Sep 17 00:00:00 2001 From: nicolargo Date: Mon, 8 May 2023 09:26:04 +0200 Subject: [PATCH] Correct an issue in the Podman export (date not serializable) --- docs/_static/containers.png | Bin 0 -> 34093 bytes docs/_static/docker.png | Bin 16601 -> 0 bytes docs/aoa/{docker.rst => containers.rst} | 27 +- docs/aoa/index.rst | 3 +- docs/aoa/monitor.rst | 8 - docs/api.rst | 1425 +----------------- glances/plugins/containers/glances_docker.py | 4 +- glances/plugins/containers/glances_podman.py | 4 +- setup.py | 2 +- 9 files changed, 38 insertions(+), 1435 deletions(-) create mode 100644 docs/_static/containers.png delete mode 100644 docs/_static/docker.png rename docs/aoa/{docker.rst => containers.rst} (67%) delete mode 100644 docs/aoa/monitor.rst diff --git a/docs/_static/containers.png b/docs/_static/containers.png new file mode 100644 index 0000000000000000000000000000000000000000..18213d0b58664f6b42164fbdc22266afeac46b15 GIT binary patch literal 34093 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 bekGJ4vz+*7%XIquBY=d6tZ=2Ep8x*`;Y*K5 diff --git a/docs/aoa/docker.rst b/docs/aoa/containers.rst similarity index 67% rename from docs/aoa/docker.rst rename to docs/aoa/containers.rst index 568978d1..c969b1e8 100644 --- a/docs/aoa/docker.rst +++ b/docs/aoa/containers.rst @@ -1,25 +1,25 @@ -.. _docker: +.. _containers: -Docker -====== +Containers +========== -If you use ``Docker``, Glances can help you to monitor your containers. -Glances uses the Docker API through the `docker-py`_ library. +If you use ``containers``, Glances can help you to monitor your Docker or Podman containers. +Glances uses the containers API through the `docker-py`_ and `podman-py`_ libraries. You can install this dependency using: .. code-block:: console - pip install glances[docker] + pip install glances[containers] -.. image:: ../_static/docker.png +.. image:: ../_static/containers.png It is possible to define limits and actions from the configuration file -under the ``[docker]`` section: +under the ``[containers]`` section: .. code-block:: ini - [docker] + [containers] disable=False # Only show specific containers (comma separated list of container name or regular expression) show=thiscontainer,andthisone,andthoseones.* @@ -27,7 +27,7 @@ under the ``[docker]`` section: hide=donotshowthisone,andthose.* # Show only specific containers (comma separated list of container name or regular expression) #show=showthisone,andthose.* - # Define the maximum docker size name (default is 20 chars) + # Define the maximum containers size name (default is 20 chars) max_name_size=20 # Global containers' thresholds for CPU and MEM (in %) cpu_careful=50 @@ -44,12 +44,15 @@ under the ``[docker]`` section: # By default, Glances only display running containers # Set the following key to True to display all containers all=False + # Define Podman sock + #podman_sock=unix:///run/user/1000/podman/podman.sock -You can use all the variables ({{foo}}) available in the Docker plugin. +You can use all the variables ({{foo}}) available in the containers plugin. Filtering (for hide or show) is based on regular expression. Please be sure that your regular expression works as expected. You can use an online tool like `regex101`_ in order to test your regular expression. .. _regex101: https://regex101.com/ -.. _docker-py: https://github.com/docker/docker-py +.. _docker-py: https://github.com/containers/containers-py +.. _podman-py: https://github.com/containers/podman-py \ No newline at end of file diff --git a/docs/aoa/index.rst b/docs/aoa/index.rst index edc41e36..72ce2ba7 100644 --- a/docs/aoa/index.rst +++ b/docs/aoa/index.rst @@ -40,8 +40,7 @@ Legend: sensors hddtemp ps - monitor + containers amps events - docker actions diff --git a/docs/aoa/monitor.rst b/docs/aoa/monitor.rst deleted file mode 100644 index 97b0a6dd..00000000 --- a/docs/aoa/monitor.rst +++ /dev/null @@ -1,8 +0,0 @@ -.. _monitor: - -Monitored Processes List -======================== - -.. warning:: - The monitored processes list feature has been removed. Use the new - Application Monitoring Process (AMP) instead. diff --git a/docs/api.rst b/docs/api.rst index 6fce3f43..2566c354 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -32,10 +32,10 @@ Get the plugins list:: "amps", "cloud", "connections", + "containers", "core", "cpu", "diskio", - "docker", "folders", "fs", "gpu", @@ -66,14 +66,14 @@ GET alert Get plugin stats:: # curl http://localhost:61208/api/3/alert - [[1680939943.0, + [[1683529666.0, -1, "WARNING", "MEM", - 77.81948363261539, - 77.81948363261539, - 77.81948363261539, - 77.81948363261539, + 72.14659297257798, + 72.14659297257798, + 72.14659297257798, + 72.14659297257798, 1, [], "", @@ -93,7 +93,7 @@ Get plugin stats:: "refresh": 3.0, "regex": True, "result": None, - "timer": 0.6206016540527344}, + "timer": 1.4009511470794678}, {"count": 0, "countmax": 20.0, "countmin": None, @@ -102,7 +102,7 @@ Get plugin stats:: "refresh": 3.0, "regex": True, "result": None, - "timer": 0.6204922199249268}] + "timer": 1.4008433818817139}] Get a specific field:: @@ -120,1415 +120,24 @@ Get a specific item when field matchs the given value:: "refresh": 3.0, "regex": True, "result": None, - "timer": 0.6206016540527344}]} + "timer": 1.4009511470794678}]} -GET core --------- - -Get plugin stats:: - - # curl http://localhost:61208/api/3/core - {"log": 4, "phys": 2} - -Fields descriptions: - -* **phys**: Number of physical cores (hyper thread CPUs are excluded) (unit is *number*) -* **log**: Number of logical CPUs. A logical CPU is the number of physical cores multiplied by the number of threads that can run on each core (unit is *number*) - -Get a specific field:: - - # curl http://localhost:61208/api/3/core/phys - {"phys": 2} - -GET cpu -------- - -Get plugin stats:: - - # curl http://localhost:61208/api/3/cpu - {"cpucore": 4, - "ctx_switches": 0, - "guest": 0.0, - "guest_nice": 0.0, - "idle": 70.4, - "interrupts": 0, - "iowait": 0.3, - "irq": 0.0, - "nice": 0.0, - "soft_interrupts": 0, - "softirq": 0.3, - "steal": 0.0, - "syscalls": 0, - "system": 3.7, - "time_since_update": 1, - "total": 29.7, - "user": 25.3} - -Fields descriptions: - -* **total**: Sum of all CPU percentages (except idle) (unit is *percent*) -* **system**: percent time spent in kernel space. System CPU time is the time spent running code in the Operating System kernel (unit is *percent*) -* **user**: CPU percent time spent in user space. User CPU time is the time spent on the processor running your program's code (or code in libraries) (unit is *percent*) -* **iowait**: *(Linux)*: percent time spent by the CPU waiting for I/O operations to complete (unit is *percent*) -* **dpc**: *(Windows)*: time spent servicing deferred procedure calls (DPCs) (unit is *percent*) -* **idle**: percent of CPU used by any program. Every program or task that runs on a computer system occupies a certain amount of processing time on the CPU. If the CPU has completed all tasks it is idle (unit is *percent*) -* **irq**: *(Linux and BSD)*: percent time spent servicing/handling hardware/software interrupts. Time servicing interrupts (hardware + software) (unit is *percent*) -* **nice**: *(Unix)*: percent time occupied by user level processes with a positive nice value. The time the CPU has spent running users' processes that have been *niced* (unit is *percent*) -* **steal**: *(Linux)*: percentage of time a virtual CPU waits for a real CPU while the hypervisor is servicing another virtual processor (unit is *percent*) -* **ctx_switches**: number of context switches (voluntary + involuntary) per second. A context switch is a procedure that a computer's CPU (central processing unit) follows to change from one task (or process) to another while ensuring that the tasks do not conflict (unit is *number*) -* **interrupts**: number of interrupts per second (unit is *number*) -* **soft_interrupts**: number of software interrupts per second. Always set to 0 on Windows and SunOS (unit is *number*) -* **syscalls**: number of system calls per second. Always 0 on Linux OS (unit is *number*) -* **cpucore**: Total number of CPU core (unit is *number*) -* **time_since_update**: Number of seconds since last update (unit is *seconds*) - -Get a specific field:: - - # curl http://localhost:61208/api/3/cpu/total - {"total": 29.7} - -GET diskio ----------- - -Get plugin stats:: - - # curl http://localhost:61208/api/3/diskio - [{"disk_name": "sda", - "key": "disk_name", - "read_bytes": 0, - "read_count": 0, - "time_since_update": 1, - "write_bytes": 0, - "write_count": 0}, - {"disk_name": "sda1", - "key": "disk_name", - "read_bytes": 0, - "read_count": 0, - "time_since_update": 1, - "write_bytes": 0, - "write_count": 0}] - -Get a specific field:: - - # curl http://localhost:61208/api/3/diskio/disk_name - {"disk_name": ["sda", "sda1", "sda2", "sda5", "dm-0", "dm-1"]} - -Get a specific item when field matchs the given value:: - - # curl http://localhost:61208/api/3/diskio/disk_name/sda - {"sda": [{"disk_name": "sda", - "key": "disk_name", - "read_bytes": 0, - "read_count": 0, - "time_since_update": 1, - "write_bytes": 0, - "write_count": 0}]} - -GET docker ----------- - -Get plugin stats:: - - # curl http://localhost:61208/api/3/docker - {"containers": [{"Command": ["docker-entrypoint.sh", "mongod"], - "Id": "c3a1bb27858df965e1c524c6ef33c0fd26d765cae5bcd90fbe9e662b703a52aa", - "Image": ["mongo:latest"], - "Status": "running", - "Uptime": "3 weeks", - "cpu": {"total": 0.0}, - "cpu_percent": 0.0, - "io": {"cumulative_ior": 294912, - "cumulative_iow": 52502528, - "time_since_update": 1}, - "io_r": None, - "io_w": None, - "key": "name", - "memory": {"cache": None, - "limit": 7836196864, - "max_usage": None, - "rss": None, - "usage": 22757376}, - "memory_usage": 22757376, - "name": "docker-mongo_mongo_1", - "network": {"cumulative_rx": 9491455, - "cumulative_tx": 7065249, - "time_since_update": 1}, - "network_rx": None, - "network_tx": None}, - {"Command": ["tini", - "--", - "/docker-entrypoint.sh", - "mongo-express"], - "Id": "5aa8f03d6027d00244cf5ce5f4ffe616fd8a31e95ff7091ca02b8d99c00b276c", - "Image": ["mongo-express:latest"], - "Status": "running", - "Uptime": "3 weeks", - "cpu": {"total": 0.0}, - "cpu_percent": 0.0, - "io": {}, - "io_r": None, - "io_w": None, - "key": "name", - "memory": {}, - "memory_usage": None, - "name": "docker-mongo_mongo-express_1", - "network": {}, - "network_rx": None, - "network_tx": None}, - {"Command": ["/portainer"], - "Id": "3abd51c615968482d9ccff5afc629f267f6dda113ed68b75b432615fae3b49fb", - "Image": ["portainer/portainer-ce:2.9.3"], - "Status": "running", - "Uptime": "3 weeks", - "cpu": {"total": 0.0}, - "cpu_percent": 0.0, - "io": {}, - "io_r": None, - "io_w": None, - "key": "name", - "memory": {}, - "memory_usage": None, - "name": "portainer", - "network": {}, - "network_rx": None, - "network_tx": None}], - "version": {"ApiVersion": "1.42", - "Arch": "amd64", - "BuildTime": "2023-02-09T19:46:56.000000000+00:00", - "Components": [{"Details": {"ApiVersion": "1.42", - "Arch": "amd64", - "BuildTime": "2023-02-09T19:46:56.000000000+00:00", - "Experimental": "false", - "GitCommit": "bc3805a", - "GoVersion": "go1.19.5", - "KernelVersion": "5.15.0-58-generic", - "MinAPIVersion": "1.12", - "Os": "linux"}, - "Name": "Engine", - "Version": "23.0.1"}, - {"Details": {"GitCommit": "1e1ea6e986c6c86565bc33d52e34b81b3e2bc71f"}, - "Name": "containerd", - "Version": "1.6.19"}, - {"Details": {"GitCommit": "v1.1.4-0-g5fd4c4d"}, - "Name": "runc", - "Version": "1.1.4"}, - {"Details": {"GitCommit": "de40ad0"}, - "Name": "docker-init", - "Version": "0.19.0"}], - "GitCommit": "bc3805a", - "GoVersion": "go1.19.5", - "KernelVersion": "5.15.0-58-generic", - "MinAPIVersion": "1.12", - "Os": "linux", - "Platform": {"Name": "Docker Engine - Community"}, - "Version": "23.0.1"}} - -GET fs ------- - -Get plugin stats:: - - # curl http://localhost:61208/api/3/fs - [{"device_name": "/dev/mapper/ubuntu--gnome--vg-root", - "free": 47726575616, - "fs_type": "ext4", - "key": "mnt_point", - "mnt_point": "/", - "percent": 79.3, - "size": 243334156288, - "used": 183220125696}, - {"device_name": "zsfpool", - "free": 41811968, - "fs_type": "zfs", - "key": "mnt_point", - "mnt_point": "/zsfpool", - "percent": 0.3, - "size": 41943040, - "used": 131072}] - -Get a specific field:: - - # curl http://localhost:61208/api/3/fs/mnt_point - {"mnt_point": ["/", "/zsfpool", "/var/snap/firefox/common/host-hunspell"]} - -Get a specific item when field matchs the given value:: - - # curl http://localhost:61208/api/3/fs/mnt_point// - {"/": [{"device_name": "/dev/mapper/ubuntu--gnome--vg-root", - "free": 47726575616, - "fs_type": "ext4", - "key": "mnt_point", - "mnt_point": "/", - "percent": 79.3, - "size": 243334156288, - "used": 183220125696}]} - -GET ip ------- - -Get plugin stats:: - - # curl http://localhost:61208/api/3/ip - {"address": "192.168.1.14", - "gateway": "192.168.1.1", - "mask": "255.255.255.0", - "mask_cidr": 24, - "public_address": "92.151.148.66", - "public_info_human": ""} - -Get a specific field:: - - # curl http://localhost:61208/api/3/ip/gateway - {"gateway": "192.168.1.1"} - -GET load --------- - -Get plugin stats:: - - # curl http://localhost:61208/api/3/load - {"cpucore": 4, - "min1": 2.0029296875, - "min15": 1.28759765625, - "min5": 1.45166015625} - -Fields descriptions: - -* **min1**: Average sum of the number of processes waiting in the run-queue plus the number currently executing over 1 minute (unit is *float*) -* **min5**: Average sum of the number of processes waiting in the run-queue plus the number currently executing over 5 minutes (unit is *float*) -* **min15**: Average sum of the number of processes waiting in the run-queue plus the number currently executing over 15 minutes (unit is *float*) -* **cpucore**: Total number of CPU core (unit is *number*) - -Get a specific field:: - - # curl http://localhost:61208/api/3/load/min1 - {"min1": 2.0029296875} - -GET mem -------- - -Get plugin stats:: - - # curl http://localhost:61208/api/3/mem - {"active": 2645381120, - "available": 1738108928, - "buffers": 318296064, - "cached": 2023813120, - "free": 1738108928, - "inactive": 3751419904, - "percent": 77.8, - "shared": 562442240, - "total": 7836196864, - "used": 6098087936} - -Fields descriptions: - -* **total**: Total physical memory available (unit is *bytes*) -* **available**: The actual amount of available memory that can be given instantly to processes that request more memory in bytes; this is calculated by summing different memory values depending on the platform (e.g. free + buffers + cached on Linux) and it is supposed to be used to monitor actual memory usage in a cross platform fashion (unit is *bytes*) -* **percent**: The percentage usage calculated as (total - available) / total * 100 (unit is *percent*) -* **used**: Memory used, calculated differently depending on the platform and designed for informational purposes only (unit is *bytes*) -* **free**: Memory not being used at all (zeroed) that is readily available; note that this doesn't reflect the actual memory available (use 'available' instead) (unit is *bytes*) -* **active**: *(UNIX)*: memory currently in use or very recently used, and so it is in RAM (unit is *bytes*) -* **inactive**: *(UNIX)*: memory that is marked as not used (unit is *bytes*) -* **buffers**: *(Linux, BSD)*: cache for things like file system metadata (unit is *bytes*) -* **cached**: *(Linux, BSD)*: cache for various things (unit is *bytes*) -* **wired**: *(BSD, macOS)*: memory that is marked to always stay in RAM. It is never moved to disk (unit is *bytes*) -* **shared**: *(BSD)*: memory that may be simultaneously accessed by multiple processes (unit is *bytes*) - -Get a specific field:: - - # curl http://localhost:61208/api/3/mem/total - {"total": 7836196864} - -GET memswap ------------ - -Get plugin stats:: - - # curl http://localhost:61208/api/3/memswap - {"free": 5987336192, - "percent": 25.9, - "sin": 12361428992, - "sout": 19754192896, - "time_since_update": 1, - "total": 8082419712, - "used": 2095083520} - -Fields descriptions: - -* **total**: Total swap memory (unit is *bytes*) -* **used**: Used swap memory (unit is *bytes*) -* **free**: Free swap memory (unit is *bytes*) -* **percent**: Used swap memory in percentage (unit is *percent*) -* **sin**: The number of bytes the system has swapped in from disk (cumulative) (unit is *bytes*) -* **sout**: The number of bytes the system has swapped out from disk (cumulative) (unit is *bytes*) -* **time_since_update**: Number of seconds since last update (unit is *seconds*) - -Get a specific field:: - - # curl http://localhost:61208/api/3/memswap/total - {"total": 8082419712} - -GET network ------------ - -Get plugin stats:: - - # curl http://localhost:61208/api/3/network - [{"alias": None, - "cumulative_cx": 1606186076, - "cumulative_rx": 803093038, - "cumulative_tx": 803093038, - "cx": 3024, - "interface_name": "lo", - "is_up": True, - "key": "interface_name", - "rx": 1512, - "speed": 0, - "time_since_update": 1, - "tx": 1512}, - {"alias": None, - "cumulative_cx": 43116202825, - "cumulative_rx": 41603851987, - "cumulative_tx": 1512350838, - "cx": 29024, - "interface_name": "wlp2s0", - "is_up": True, - "key": "interface_name", - "rx": 22262, - "speed": 0, - "time_since_update": 1, - "tx": 6762}] - -Fields descriptions: - -* **interface_name**: Interface name (unit is *string*) -* **alias**: Interface alias name (optional) (unit is *string*) -* **rx**: The received/input rate (in bit per second) (unit is *bps*) -* **tx**: The sent/output rate (in bit per second) (unit is *bps*) -* **cx**: The cumulative received+sent rate (in bit per second) (unit is *bps*) -* **cumulative_rx**: The number of bytes received through the interface (cumulative) (unit is *bytes*) -* **cumulative_tx**: The number of bytes sent through the interface (cumulative) (unit is *bytes*) -* **cumulative_cx**: The cumulative number of bytes reveived and sent through the interface (cumulative) (unit is *bytes*) -* **speed**: Maximum interface speed (in bit per second). Can return 0 on some operating-system (unit is *bps*) -* **is_up**: Is the interface up ? (unit is *bool*) -* **time_since_update**: Number of seconds since last update (unit is *seconds*) - -Get a specific field:: - - # curl http://localhost:61208/api/3/network/interface_name - {"interface_name": ["lo", - "wlp2s0", - "br_grafana", - "br-119e6ee04e05", - "docker0", - "br-87386b77b676", - "mpqemubr0", - "tap-1e376645a40", - "br-ef0a06c4e10f", - "vethb3a7bab", - "vethf490fc8", - "veth335689d"]} - -Get a specific item when field matchs the given value:: - - # curl http://localhost:61208/api/3/network/interface_name/lo - {"lo": [{"alias": None, - "cumulative_cx": 1606186076, - "cumulative_rx": 803093038, - "cumulative_tx": 803093038, - "cx": 3024, - "interface_name": "lo", - "is_up": True, - "key": "interface_name", - "rx": 1512, - "speed": 0, - "time_since_update": 1, - "tx": 1512}]} - -GET now -------- - -Get plugin stats:: - - # curl http://localhost:61208/api/3/now - "2023-04-08 09:45:42 CEST" - -GET percpu ----------- - -Get plugin stats:: - - # curl http://localhost:61208/api/3/percpu - [{"cpu_number": 0, - "guest": 0.0, - "guest_nice": 0.0, - "idle": 64.0, - "iowait": 0.0, - "irq": 0.0, - "key": "cpu_number", - "nice": 0.0, - "softirq": 0.0, - "steal": 0.0, - "system": 1.0, - "total": 36.0, - "user": 5.0}, - {"cpu_number": 1, - "guest": 0.0, - "guest_nice": 0.0, - "idle": 5.0, - "iowait": 0.0, - "irq": 0.0, - "key": "cpu_number", - "nice": 0.0, - "softirq": 0.0, - "steal": 0.0, - "system": 2.0, - "total": 95.0, - "user": 68.0}] - -Get a specific field:: - - # curl http://localhost:61208/api/3/percpu/cpu_number - {"cpu_number": [0, 1, 2, 3]} - -GET ports ---------- - -Get plugin stats:: - - # curl http://localhost:61208/api/3/ports - [{"description": "DefaultGateway", - "host": "192.168.1.1", - "indice": "port_0", - "port": 0, - "refresh": 30, - "rtt_warning": None, - "status": 0.006088, - "timeout": 3}] - -Get a specific field:: - - # curl http://localhost:61208/api/3/ports/host - {"host": ["192.168.1.1"]} - -Get a specific item when field matchs the given value:: - - # curl http://localhost:61208/api/3/ports/host/192.168.1.1 - {"192.168.1.1": [{"description": "DefaultGateway", - "host": "192.168.1.1", - "indice": "port_0", - "port": 0, - "refresh": 30, - "rtt_warning": None, - "status": 0.006088, - "timeout": 3}]} - -GET processcount ----------------- - -Get plugin stats:: - - # curl http://localhost:61208/api/3/processcount - {"pid_max": 0, "running": 1, "sleeping": 330, "thread": 1714, "total": 394} - -Get a specific field:: - - # curl http://localhost:61208/api/3/processcount/total - {"total": 394} - -GET processlist +GET connections --------------- Get plugin stats:: - # curl http://localhost:61208/api/3/processlist - [{"cmdline": ["/snap/firefox/2391/usr/lib/firefox/firefox", - "-contentproc", - "-childID", - "6", - "-isForBrowser", - "-prefsLen", - "37134", - "-prefMapSize", - "238694", - "-jsInitLen", - "246560", - "-parentBuildID", - "20230228074855", - "-appDir", - "/snap/firefox/2391/usr/lib/firefox/browser", - "{c1ca9a6d-573a-4f47-ae48-01d6063a6f70}", - "971363", - "true", - "tab"], - "cpu_percent": 0.0, - "cpu_times": [1150.92, 205.51, 0.0, 0.0, 0.0], - "gids": [1000, 1000, 1000], - "io_counters": [200408064, 0, 0, 0, 0], - "key": "pid", - "memory_info": [502607872, 3444826112, 39489536, 626688, 0, 847261696, 0], - "memory_percent": 6.413926050135537, - "name": "WebExtensions", - "nice": 0, - "num_threads": 20, - "pid": 971772, - "status": "S", - "time_since_update": 1, - "username": "nicolargo"}, - {"cmdline": ["/snap/firefox/2391/usr/lib/firefox/firefox"], - "cpu_percent": 0.0, - "cpu_times": [6001.81, 1837.81, 4047.83, 726.16, 0.0], - "gids": [1000, 1000, 1000], - "io_counters": [3540272128, 7502446592, 0, 0, 0], - "key": "pid", - "memory_info": [419807232, 22266421248, 106196992, 626688, 0, 1420001280, 0], - "memory_percent": 5.357282866751623, - "name": "firefox", - "nice": 0, - "num_threads": 181, - "pid": 971363, - "status": "S", - "time_since_update": 1, - "username": "nicolargo"}] + # curl http://localhost:61208/api/3/connections + {"net_connections_enabled": True, "nf_conntrack_enabled": True} Get a specific field:: - # curl http://localhost:61208/api/3/processlist/pid - {"pid": [971772, - 971363, - 1142094, - 4150, - 971555, - 1152927, - 1004923, - 971564, - 971559, - 1141786, - 1150071, - 1151591, - 4473, - 1003910, - 1004590, - 1141895, - 1004867, - 904358, - 1004969, - 1004902, - 1070813, - 1108336, - 6074, - 1159121, - 1158993, - 1159255, - 971522, - 1142299, - 883393, - 1112467, - 2512, - 1141869, - 1141872, - 1159353, - 3351, - 4035, - 1141798, - 4413, - 1004911, - 4544, - 1141957, - 1141939, - 1005000, - 95798, - 1021669, - 1145400, - 1152205, - 1085807, - 2721, - 1119851, - 904833, - 4248, - 4585, - 972136, - 4932, - 904838, - 1152226, - 971505, - 3955, - 1, - 1635, - 4332, - 1145411, - 4325, - 1660, - 14455, - 1152242, - 4561, - 4214, - 4331, - 4223, - 904977, - 4625, - 1681, - 1004872, - 4445, - 1145919, - 3934, - 4659, - 14458, - 1876, - 3944, - 4352, - 972138, - 4327, - 4263, - 1145412, - 905822, - 4130, - 1145413, - 4330, - 1004873, - 1634, - 4137, - 4233, - 3968, - 129087, - 4339, - 1141912, - 1085898, - 993612, - 1145410, - 1145536, - 4261, - 4377, - 59511, - 883381, - 3966, - 2239, - 4182, - 4452, - 17189, - 1682, - 2179, - 129101, - 904778, - 129097, - 1643, - 4524, - 5299, - 904722, - 219792, - 4229, - 96102, - 17205, - 903463, - 4192, - 706956, - 1666, - 3976, - 1631, - 1673, - 4201, - 1655, - 1873, - 4335, - 3971, - 4329, - 4443, - 4392, - 904801, - 1617, - 4155, - 1675, - 4050, - 1661, - 4337, - 4328, - 4573, - 903414, - 4324, - 4045, - 1885, - 4166, - 4178, - 1626, - 4334, - 4173, - 4348, - 4212, - 1646, - 1670, - 4347, - 4119, - 4485, - 9703, - 1159314, - 1004889, - 4314, - 49191, - 3952, - 1633, - 49179, - 14505, - 2020, - 4162, - 1441, - 129100, - 3953, - 3700, - 4579, - 1685, - 1449, - 129099, - 1145294, - 2485, - 3354, - 1450, - 2472, - 49182, - 1618, - 1159352, - 1154223, - 1145290, - 1004875, - 49194, - 4323, - 904754, - 2480, - 904748, - 904639, - 4018, - 904665, - 3707, - 904706, - 1156987, - 904719, - 3701, - 904643, - 219931, - 1803, - 904652, - 1804, - 4820, - 2475, - 3945, - 2503, - 1447, - 1695, - 1628, - 706960, - 49185, - 2, - 3, - 4, - 5, - 6, - 8, - 10, - 11, - 12, - 13, - 14, - 15, - 16, - 18, - 19, - 20, - 21, - 22, - 24, - 25, - 26, - 27, - 28, - 30, - 31, - 32, - 33, - 34, - 36, - 37, - 38, - 39, - 40, - 41, - 42, - 43, - 44, - 45, - 92, - 93, - 94, - 96, - 97, - 98, - 99, - 100, - 101, - 104, - 106, - 107, - 109, - 110, - 112, - 117, - 118, - 128, - 131, - 137, - 171, - 175, - 201, - 205, - 217, - 218, - 219, - 220, - 221, - 222, - 223, - 224, - 248, - 249, - 254, - 255, - 312, - 361, - 362, - 442, - 447, - 577, - 601, - 676, - 677, - 678, - 693, - 963, - 964, - 965, - 966, - 967, - 968, - 969, - 970, - 971, - 972, - 973, - 974, - 1026, - 1027, - 1028, - 1029, - 1030, - 1031, - 1032, - 1033, - 1034, - 1035, - 1036, - 1037, - 1038, - 1039, - 1040, - 1041, - 1042, - 1043, - 1044, - 1071, - 1072, - 1080, - 1081, - 1105, - 1106, - 1107, - 1108, - 1109, - 1110, - 1111, - 2504, - 2521, - 2531, - 2597, - 2598, - 2599, - 2600, - 2602, - 2604, - 2609, - 2610, - 4034, - 18603, - 220739, - 220749, - 220750, - 220751, - 220752, - 220756, - 904821, - 1148559, - 1148560, - 1148562, - 1151236, - 1151955, - 1151966, - 1151970, - 1151971, - 1151973, - 1151974, - 1151975, - 1152026, - 1154944, - 1155108, - 1155798, - 1156380, - 1156410, - 1156605, - 1157612, - 1157817, - 1157841, - 1158554, - 1158745, - 1159075, - 1159119]} + # curl http://localhost:61208/api/3/connections/net_connections_enabled + {"net_connections_enabled": True} -Get a specific item when field matchs the given value:: - - # curl http://localhost:61208/api/3/processlist/pid/971772 - {"971772": [{"cmdline": ["/snap/firefox/2391/usr/lib/firefox/firefox", - "-contentproc", - "-childID", - "6", - "-isForBrowser", - "-prefsLen", - "37134", - "-prefMapSize", - "238694", - "-jsInitLen", - "246560", - "-parentBuildID", - "20230228074855", - "-appDir", - "/snap/firefox/2391/usr/lib/firefox/browser", - "{c1ca9a6d-573a-4f47-ae48-01d6063a6f70}", - "971363", - "true", - "tab"], - "cpu_percent": 0.0, - "cpu_times": [1150.92, 205.51, 0.0, 0.0, 0.0], - "gids": [1000, 1000, 1000], - "io_counters": [200408064, 0, 0, 0, 0], - "key": "pid", - "memory_info": [502607872, - 3444826112, - 39489536, - 626688, - 0, - 847261696, - 0], - "memory_percent": 6.413926050135537, - "name": "WebExtensions", - "nice": 0, - "num_threads": 20, - "pid": 971772, - "status": "S", - "time_since_update": 1, - "username": "nicolargo"}]} - -GET psutilversion ------------------ +GET containers +-------------- Get plugin stats:: - # curl http://localhost:61208/api/3/psutilversion - [5, 9, 4] - -GET quicklook -------------- - -Get plugin stats:: - - # curl http://localhost:61208/api/3/quicklook - {"cpu": 29.7, - "cpu_hz": 3000000000.0, - "cpu_hz_current": 1872249249.9999998, - "cpu_name": "Intel(R) Core(TM) i7-4500U CPU @ 1.80GHz", - "mem": 77.8, - "percpu": [{"cpu_number": 0, - "guest": 0.0, - "guest_nice": 0.0, - "idle": 64.0, - "iowait": 0.0, - "irq": 0.0, - "key": "cpu_number", - "nice": 0.0, - "softirq": 0.0, - "steal": 0.0, - "system": 1.0, - "total": 36.0, - "user": 5.0}, - {"cpu_number": 1, - "guest": 0.0, - "guest_nice": 0.0, - "idle": 5.0, - "iowait": 0.0, - "irq": 0.0, - "key": "cpu_number", - "nice": 0.0, - "softirq": 0.0, - "steal": 0.0, - "system": 2.0, - "total": 95.0, - "user": 68.0}, - {"cpu_number": 2, - "guest": 0.0, - "guest_nice": 0.0, - "idle": 67.0, - "iowait": 0.0, - "irq": 0.0, - "key": "cpu_number", - "nice": 0.0, - "softirq": 0.0, - "steal": 0.0, - "system": 2.0, - "total": 33.0, - "user": 2.0}, - {"cpu_number": 3, - "guest": 0.0, - "guest_nice": 0.0, - "idle": 67.0, - "iowait": 0.0, - "irq": 0.0, - "key": "cpu_number", - "nice": 0.0, - "softirq": 0.0, - "steal": 0.0, - "system": 3.0, - "total": 33.0, - "user": 4.0}], - "swap": 25.9} - -Get a specific field:: - - # curl http://localhost:61208/api/3/quicklook/cpu - {"cpu": 29.7} - -GET sensors ------------ - -Get plugin stats:: - - # curl http://localhost:61208/api/3/sensors - [{"critical": 105, - "key": "label", - "label": "acpitz 0", - "type": "temperature_core", - "unit": "C", - "value": 27, - "warning": 105}, - {"critical": 105, - "key": "label", - "label": "acpitz 1", - "type": "temperature_core", - "unit": "C", - "value": 29, - "warning": 105}] - -Get a specific field:: - - # curl http://localhost:61208/api/3/sensors/label - {"label": ["acpitz 0", - "acpitz 1", - "Package id 0", - "Core 0", - "Core 1", - "CPU", - "Ambient", - "SODIMM", - "BAT BAT0"]} - -Get a specific item when field matchs the given value:: - - # curl http://localhost:61208/api/3/sensors/label/acpitz 0 - {"acpitz 0": [{"critical": 105, - "key": "label", - "label": "acpitz 0", - "type": "temperature_core", - "unit": "C", - "value": 27, - "warning": 105}]} - -GET system ----------- - -Get plugin stats:: - - # curl http://localhost:61208/api/3/system - {"hostname": "XPS13-9333", - "hr_name": "Ubuntu 22.04 64bit", - "linux_distro": "Ubuntu 22.04", - "os_name": "Linux", - "os_version": "5.15.0-58-generic", - "platform": "64bit"} - -Get a specific field:: - - # curl http://localhost:61208/api/3/system/os_name - {"os_name": "Linux"} - -GET uptime ----------- - -Get plugin stats:: - - # curl http://localhost:61208/api/3/uptime - "83 days, 16:34:33" - -GET all stats -------------- - -Get all Glances stats:: - - # curl http://localhost:61208/api/3/all - Return a very big dictionnary (avoid using this request, performances will be poor)... - -GET stats history ------------------ - -History of a plugin:: - - # curl http://localhost:61208/api/3/cpu/history - {"system": [["2023-04-08T09:45:43.167852", 3.7], - ["2023-04-08T09:45:44.242850", 3.7], - ["2023-04-08T09:45:45.342786", 3.3]], - "user": [["2023-04-08T09:45:43.167846", 25.3], - ["2023-04-08T09:45:44.242844", 25.3], - ["2023-04-08T09:45:45.342782", 5.5]]} - -Limit history to last 2 values:: - - # curl http://localhost:61208/api/3/cpu/history/2 - {"system": [["2023-04-08T09:45:44.242850", 3.7], - ["2023-04-08T09:45:45.342786", 3.3]], - "user": [["2023-04-08T09:45:44.242844", 25.3], - ["2023-04-08T09:45:45.342782", 5.5]]} - -History for a specific field:: - - # curl http://localhost:61208/api/3/cpu/system/history - {"system": [["2023-04-08T09:45:43.167852", 3.7], - ["2023-04-08T09:45:44.242850", 3.7], - ["2023-04-08T09:45:45.342786", 3.3]]} - -Limit history for a specific field to last 2 values:: - - # curl http://localhost:61208/api/3/cpu/system/history - {"system": [["2023-04-08T09:45:44.242850", 3.7], - ["2023-04-08T09:45:45.342786", 3.3]]} - -GET limits (used for thresholds) --------------------------------- - -All limits/thresholds:: - - # curl http://localhost:61208/api/3/all/limits - {"alert": {"history_size": 1200.0}, - "amps": {"amps_disable": ["False"], "history_size": 1200.0}, - "core": {"history_size": 1200.0}, - "cpu": {"cpu_ctx_switches_careful": 160000.0, - "cpu_ctx_switches_critical": 200000.0, - "cpu_ctx_switches_warning": 180000.0, - "cpu_disable": ["False"], - "cpu_iowait_careful": 20.0, - "cpu_iowait_critical": 25.0, - "cpu_iowait_warning": 22.5, - "cpu_steal_careful": 50.0, - "cpu_steal_critical": 90.0, - "cpu_steal_warning": 70.0, - "cpu_system_careful": 50.0, - "cpu_system_critical": 90.0, - "cpu_system_log": ["False"], - "cpu_system_warning": 70.0, - "cpu_total_careful": 65.0, - "cpu_total_critical": 85.0, - "cpu_total_log": ["True"], - "cpu_total_warning": 75.0, - "cpu_user_careful": 50.0, - "cpu_user_critical": 90.0, - "cpu_user_log": ["False"], - "cpu_user_warning": 70.0, - "history_size": 1200.0}, - "diskio": {"diskio_disable": ["False"], - "diskio_hide": ["loop.*", "/dev/loop.*"], - "history_size": 1200.0}, - "docker": {"docker_all": ["False"], - "docker_disable": ["False"], - "docker_max_name_size": 20.0, - "history_size": 1200.0}, - "folders": {"folders_disable": ["False"], "history_size": 1200.0}, - "fs": {"fs_careful": 50.0, - "fs_critical": 90.0, - "fs_disable": ["False"], - "fs_hide": ["/boot.*", "/snap.*"], - "fs_warning": 70.0, - "history_size": 1200.0}, - "gpu": {"gpu_disable": ["False"], - "gpu_mem_careful": 50.0, - "gpu_mem_critical": 90.0, - "gpu_mem_warning": 70.0, - "gpu_proc_careful": 50.0, - "gpu_proc_critical": 90.0, - "gpu_proc_warning": 70.0, - "history_size": 1200.0}, - "help": {"history_size": 1200.0}, - "ip": {"history_size": 1200.0, - "ip_censys_fields": ["location:continent", - "location:country", - "autonomous_system:name"], - "ip_censys_url": ["https://search.censys.io/api"], - "ip_disable": ["False"], - "ip_public_ip_disabled": ["False"], - "ip_public_refresh_interval": 300.0}, - "load": {"history_size": 1200.0, - "load_careful": 0.7, - "load_critical": 5.0, - "load_disable": ["False"], - "load_warning": 1.0}, - "mem": {"history_size": 1200.0, - "mem_careful": 50.0, - "mem_critical": 90.0, - "mem_disable": ["False"], - "mem_warning": 70.0}, - "memswap": {"history_size": 1200.0, - "memswap_careful": 50.0, - "memswap_critical": 90.0, - "memswap_disable": ["False"], - "memswap_warning": 70.0}, - "network": {"history_size": 1200.0, - "network_disable": ["False"], - "network_rx_careful": 70.0, - "network_rx_critical": 90.0, - "network_rx_warning": 80.0, - "network_tx_careful": 70.0, - "network_tx_critical": 90.0, - "network_tx_warning": 80.0}, - "now": {"history_size": 1200.0}, - "percpu": {"history_size": 1200.0, - "percpu_disable": ["False"], - "percpu_iowait_careful": 50.0, - "percpu_iowait_critical": 90.0, - "percpu_iowait_warning": 70.0, - "percpu_system_careful": 50.0, - "percpu_system_critical": 90.0, - "percpu_system_warning": 70.0, - "percpu_user_careful": 50.0, - "percpu_user_critical": 90.0, - "percpu_user_warning": 70.0}, - "ports": {"history_size": 1200.0, - "ports_disable": ["False"], - "ports_port_default_gateway": ["True"], - "ports_refresh": 30.0, - "ports_timeout": 3.0}, - "processcount": {"history_size": 1200.0, "processcount_disable": ["False"]}, - "processlist": {"history_size": 1200.0, - "processlist_cpu_careful": 50.0, - "processlist_cpu_critical": 90.0, - "processlist_cpu_warning": 70.0, - "processlist_disable": ["False"], - "processlist_mem_careful": 50.0, - "processlist_mem_critical": 90.0, - "processlist_mem_warning": 70.0, - "processlist_nice_warning": ["-20", - "-19", - "-18", - "-17", - "-16", - "-15", - "-14", - "-13", - "-12", - "-11", - "-10", - "-9", - "-8", - "-7", - "-6", - "-5", - "-4", - "-3", - "-2", - "-1", - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9", - "10", - "11", - "12", - "13", - "14", - "15", - "16", - "17", - "18", - "19"]}, - "psutilversion": {"history_size": 1200.0}, - "quicklook": {"history_size": 1200.0, - "quicklook_cpu_careful": 50.0, - "quicklook_cpu_critical": 90.0, - "quicklook_cpu_warning": 70.0, - "quicklook_disable": ["False"], - "quicklook_mem_careful": 50.0, - "quicklook_mem_critical": 90.0, - "quicklook_mem_warning": 70.0, - "quicklook_percentage_char": ["|"], - "quicklook_swap_careful": 50.0, - "quicklook_swap_critical": 90.0, - "quicklook_swap_warning": 70.0}, - "sensors": {"history_size": 1200.0, - "sensors_battery_careful": 80.0, - "sensors_battery_critical": 95.0, - "sensors_battery_warning": 90.0, - "sensors_disable": ["False"], - "sensors_refresh": 4.0, - "sensors_temperature_core_careful": 60.0, - "sensors_temperature_core_critical": 80.0, - "sensors_temperature_core_warning": 70.0, - "sensors_temperature_hdd_careful": 45.0, - "sensors_temperature_hdd_critical": 60.0, - "sensors_temperature_hdd_warning": 52.0}, - "system": {"history_size": 1200.0, - "system_disable": ["False"], - "system_refresh": 60}, - "uptime": {"history_size": 1200.0}} - -Limits/thresholds for the cpu plugin:: - - # curl http://localhost:61208/api/3/cpu/limits - {"cpu_ctx_switches_careful": 160000.0, - "cpu_ctx_switches_critical": 200000.0, - "cpu_ctx_switches_warning": 180000.0, - "cpu_disable": ["False"], - "cpu_iowait_careful": 20.0, - "cpu_iowait_critical": 25.0, - "cpu_iowait_warning": 22.5, - "cpu_steal_careful": 50.0, - "cpu_steal_critical": 90.0, - "cpu_steal_warning": 70.0, - "cpu_system_careful": 50.0, - "cpu_system_critical": 90.0, - "cpu_system_log": ["False"], - "cpu_system_warning": 70.0, - "cpu_total_careful": 65.0, - "cpu_total_critical": 85.0, - "cpu_total_log": ["True"], - "cpu_total_warning": 75.0, - "cpu_user_careful": 50.0, - "cpu_user_critical": 90.0, - "cpu_user_log": ["False"], - "cpu_user_warning": 70.0, - "history_size": 1200.0} - + # curl http://localhost:61208/api/3/containers diff --git a/glances/plugins/containers/glances_docker.py b/glances/plugins/containers/glances_docker.py index 7e6951a7..8ac3fbc9 100644 --- a/glances/plugins/containers/glances_docker.py +++ b/glances/plugins/containers/glances_docker.py @@ -316,7 +316,7 @@ class DockerContainersExtension: stats['Command'] = None if stats['Status'] in self.CONTAINER_ACTIVE_STATUS: - stats['StartedAt'] = container.attrs['State']['StartedAt'] + started_at = container.attrs['State']['StartedAt'] stats_fetcher = self.stats_fetchers[container.id] activity_stats = stats_fetcher.activity_stats stats.update(activity_stats) @@ -331,7 +331,7 @@ class DockerContainersExtension: stats['network_rx'] = stats['network'].get('rx') stats['network_tx'] = stats['network'].get('tx') stats['Uptime'] = pretty_date( - parser.parse(stats['StartedAt']).astimezone(tz.tzlocal()).replace(tzinfo=None) + parser.parse(started_at).astimezone(tz.tzlocal()).replace(tzinfo=None) ) else: stats['io'] = {} diff --git a/glances/plugins/containers/glances_podman.py b/glances/plugins/containers/glances_podman.py index c61a3ab2..be53acf9 100644 --- a/glances/plugins/containers/glances_podman.py +++ b/glances/plugins/containers/glances_podman.py @@ -322,7 +322,7 @@ class PodmanContainersExtension: } if stats['Status'] in self.CONTAINER_ACTIVE_STATUS: - stats['StartedAt'] = datetime.fromtimestamp(container.attrs['StartedAt']) + started_at = datetime.fromtimestamp(container.attrs['StartedAt']) stats_fetcher = self.container_stats_fetchers[container.id] activity_stats = stats_fetcher.activity_stats stats.update(activity_stats) @@ -336,7 +336,7 @@ class PodmanContainersExtension: stats['io_w'] = stats['io'].get('iow') stats['network_rx'] = stats['network'].get('rx') stats['network_tx'] = stats['network'].get('tx') - stats['Uptime'] = pretty_date(stats['StartedAt']) + stats['Uptime'] = pretty_date(started_at) else: stats['io'] = {} stats['cpu'] = {} diff --git a/setup.py b/setup.py index 4c3bf61a..316e3df2 100755 --- a/setup.py +++ b/setup.py @@ -63,7 +63,7 @@ def get_install_extras_require(): 'action': ['chevron'], 'browser': ['zeroconf==0.62.0' if PY2 else 'zeroconf>=0.19.1'], 'cloud': ['requests'], - 'docker': ['docker>=2.0.0', 'python-dateutil', 'six'], + 'containers': ['docker>=6.1.1', 'python-dateutil', 'six'], 'export': ['bernhard', 'cassandra-driver', 'couchdb', 'elasticsearch', 'graphitesender', 'influxdb>=1.0.0', 'kafka-python', 'pika', 'paho-mqtt', 'potsdb', 'prometheus_client', 'pyzmq',