diff options
author | nicolargo <nicolas@nicolargo.com> | 2024-04-24 19:47:57 +0200 |
---|---|---|
committer | nicolargo <nicolas@nicolargo.com> | 2024-04-24 19:47:57 +0200 |
commit | 0df1371513ec4452e71d75a70f6fa7058f4277c0 (patch) | |
tree | 5c14cb3db1de1cbbdf0f1a4fc2dca8d397fdb7a0 | |
parent | c2fe2de35509ef7683204e3549bdcc983d5d934a (diff) |
--stdout plugin.attr is not compliant with plugins returning list of dicts #2446
-rw-r--r-- | docs/api.rst | 263 | ||||
-rw-r--r-- | docs/man/glances.1 | 2 | ||||
-rw-r--r-- | docs/quickstart.rst | 6 | ||||
-rw-r--r-- | glances/main.py | 4 | ||||
-rw-r--r-- | glances/outputs/glances_stdout.py | 46 | ||||
-rw-r--r-- | glances/plugins/processcount/__init__.py | 1 | ||||
-rw-r--r-- | glances/standalone.py | 2 |
7 files changed, 176 insertions, 148 deletions
diff --git a/docs/api.rst b/docs/api.rst index f1fd5a5b..a45f8daa 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -141,7 +141,7 @@ Get plugin stats:: "refresh": 3.0, "regex": True, "result": None, - "timer": 1.0572876930236816}, + "timer": 0.924252986907959}, {"count": 0, "countmax": 20.0, "countmin": None, @@ -150,7 +150,7 @@ Get plugin stats:: "refresh": 3.0, "regex": True, "result": None, - "timer": 1.0569162368774414}] + "timer": 0.9241466522216797}] Fields descriptions: @@ -178,7 +178,7 @@ Get a specific item when field matches the given value:: "refresh": 3.0, "regex": True, "result": None, - "timer": 1.0572876930236816}]} + "timer": 0.924252986907959}]} GET cloud --------- @@ -226,16 +226,16 @@ Get plugin stats:: "engine": "docker", "id": "3abd51c615968482d9ccff5afc629f267f6dda113ed68b75b432615fae3b49fb", "image": ["portainer/portainer-ce:2.9.3"], - "io": {"cumulative_ior": 31543296, "cumulative_iow": 6189056}, + "io": {"cumulative_ior": 65536, "cumulative_iow": 839680}, "key": "name", "memory": {"cache": None, "limit": 7823499264, "max_usage": None, "rss": None, - "usage": 21929984}, - "memory_usage": 21929984, + "usage": 14393344}, + "memory_usage": 14393344, "name": "portainer", - "network": {"cumulative_rx": 809260, "cumulative_tx": 0}, + "network": {"cumulative_rx": 1619220, "cumulative_tx": 0}, "status": "running", "uptime": "yesterday"}] @@ -273,16 +273,16 @@ Get a specific item when field matches the given value:: "engine": "docker", "id": "3abd51c615968482d9ccff5afc629f267f6dda113ed68b75b432615fae3b49fb", "image": ["portainer/portainer-ce:2.9.3"], - "io": {"cumulative_ior": 31543296, "cumulative_iow": 6189056}, + "io": {"cumulative_ior": 65536, "cumulative_iow": 839680}, "key": "name", "memory": {"cache": None, "limit": 7823499264, "max_usage": None, "rss": None, - "usage": 21929984}, - "memory_usage": 21929984, + "usage": 14393344}, + "memory_usage": 14393344, "name": "portainer", - "network": {"cumulative_rx": 809260, "cumulative_tx": 0}, + "network": {"cumulative_rx": 1619220, "cumulative_tx": 0}, "status": "running", "uptime": "yesterday"}]} @@ -311,19 +311,19 @@ Get plugin stats:: # curl http://localhost:61208/api/4/cpu {"cpucore": 4, - "ctx_switches": 49762424, + "ctx_switches": 239191661, "guest": 0.0, - "idle": 69.2, - "interrupts": 21528778, - "iowait": 1.7, + "idle": 81.6, + "interrupts": 120974887, + "iowait": 0.4, "irq": 0.0, "nice": 0.0, - "soft_interrupts": 14048210, + "soft_interrupts": 64042196, "steal": 0.0, "syscalls": 0, - "system": 5.6, - "total": 29.1, - "user": 23.2} + "system": 2.7, + "total": 18.0, + "user": 15.3} Fields descriptions: @@ -356,7 +356,7 @@ Fields descriptions: Get a specific field:: # curl http://localhost:61208/api/4/cpu/total - {"total": 29.1} + {"total": 18.0} GET diskio ---------- @@ -366,16 +366,16 @@ Get plugin stats:: # curl http://localhost:61208/api/4/diskio [{"disk_name": "sda", "key": "disk_name", - "read_bytes": 5258122240, - "read_count": 180256, - "write_bytes": 4720267264, - "write_count": 137068}, + "read_bytes": 21587683840, + "read_count": 1376851, + "write_bytes": 25792397312, + "write_count": 710177}, {"disk_name": "sda1", "key": "disk_name", - "read_bytes": 3715072, - "read_count": 123, + "read_bytes": 3837952, + "read_count": 135, "write_bytes": 0, - "write_count": 19}] + "write_count": 25}] Fields descriptions: @@ -404,10 +404,10 @@ Get a specific item when field matches the given value:: # curl http://localhost:61208/api/4/diskio/disk_name/sda {"sda": [{"disk_name": "sda", "key": "disk_name", - "read_bytes": 5258122240, - "read_count": 180256, - "write_bytes": 4720267264, - "write_count": 137068}]} + "read_bytes": 21587683840, + "read_count": 1376851, + "write_bytes": 25792397312, + "write_count": 710177}]} GET folders ----------- @@ -434,13 +434,13 @@ Get plugin stats:: # curl http://localhost:61208/api/4/fs [{"device_name": "/dev/mapper/ubuntu--gnome--vg-root", - "free": 36169797632, + "free": 30779019264, "fs_type": "ext4", "key": "mnt_point", "mnt_point": "/", - "percent": 84.3, + "percent": 86.7, "size": 243334156288, - "used": 194776903680}, + "used": 200167682048}, {"device_name": "zsfpool", "free": 31195136, "fs_type": "zfs", @@ -469,13 +469,13 @@ Get a specific item when field matches the given value:: # curl http://localhost:61208/api/4/fs/mnt_point// {"/": [{"device_name": "/dev/mapper/ubuntu--gnome--vg-root", - "free": 36169797632, + "free": 30779019264, "fs_type": "ext4", "key": "mnt_point", "mnt_point": "/", - "percent": 84.3, + "percent": 86.7, "size": 243334156288, - "used": 194776903680}]} + "used": 200167682048}]} GET gpu ------- @@ -549,9 +549,9 @@ Get plugin stats:: # curl http://localhost:61208/api/4/load {"cpucore": 4, - "min1": 2.4365234375, - "min15": 1.41748046875, - "min5": 1.76123046875} + "min1": 0.88818359375, + "min15": 1.0537109375, + "min5": 1.0107421875} Fields descriptions: @@ -563,7 +563,7 @@ Fields descriptions: Get a specific field:: # curl http://localhost:61208/api/4/load/min1 - {"min1": 2.4365234375} + {"min1": 0.88818359375} GET mem ------- @@ -571,16 +571,16 @@ GET mem Get plugin stats:: # curl http://localhost:61208/api/4/mem - {"active": 1829126144, - "available": 2252705792, - "buffers": 195567616, - "cached": 2715656192, - "free": 2252705792, - "inactive": 4596236288, - "percent": 71.2, - "shared": 777666560, + {"active": 3001933824, + "available": 2005618688, + "buffers": 248893440, + "cached": 2834280448, + "free": 2005618688, + "inactive": 3382648832, + "percent": 74.4, + "shared": 988557312, "total": 7823499264, - "used": 5570793472} + "used": 5817880576} Fields descriptions: @@ -607,13 +607,13 @@ GET memswap Get plugin stats:: # curl http://localhost:61208/api/4/memswap - {"free": 7855878144, - "percent": 2.8, - "sin": 10948608, - "sout": 235782144, + {"free": 6126551040, + "percent": 24.2, + "sin": 1005674496, + "sout": 3159068672, "time_since_update": 1, "total": 8082419712, - "used": 226541568} + "used": 1955868672} Fields descriptions: @@ -638,26 +638,26 @@ Get plugin stats:: # curl http://localhost:61208/api/4/network [{"alias": None, "bytes_all": 0, - "bytes_all_gauge": 535068344, + "bytes_all_gauge": 2981693329, "bytes_recv": 0, - "bytes_recv_gauge": 499170928, + "bytes_recv_gauge": 2799888851, "bytes_sent": 0, - "bytes_sent_gauge": 35897416, + "bytes_sent_gauge": 181804478, "interface_name": "wlp2s0", "key": "interface_name", "speed": 0, - "time_since_update": 0.8122844696044922}, + "time_since_update": 0.8728673458099365}, {"alias": None, "bytes_all": 0, - "bytes_all_gauge": 0, + "bytes_all_gauge": 393003, "bytes_recv": 0, - "bytes_recv_gauge": 0, + "bytes_recv_gauge": 88482, "bytes_sent": 0, - "bytes_sent_gauge": 0, - "interface_name": "br-40875d2e2716", + "bytes_sent_gauge": 304521, + "interface_name": "br_grafana", "key": "interface_name", "speed": 0, - "time_since_update": 0.8122844696044922}] + "time_since_update": 0.8728673458099365}] Fields descriptions: @@ -680,28 +680,27 @@ Get a specific field:: # curl http://localhost:61208/api/4/network/interface_name {"interface_name": ["wlp2s0", - "br-40875d2e2716", "br_grafana", - "veth0785bc8", "lxdbr0", "vethe9985946", "veth20c434a2", - "mpqemubr0"]} + "mpqemubr0", + "veth26f9c1d"]} Get a specific item when field matches the given value:: # curl http://localhost:61208/api/4/network/interface_name/wlp2s0 {"wlp2s0": [{"alias": None, "bytes_all": 0, - "bytes_all_gauge": 535068344, + "bytes_all_gauge": 2981693329, "bytes_recv": 0, - "bytes_recv_gauge": 499170928, + "bytes_recv_gauge": 2799888851, "bytes_sent": 0, - "bytes_sent_gauge": 35897416, + "bytes_sent_gauge": 181804478, "interface_name": "wlp2s0", "key": "interface_name", "speed": 0, - "time_since_update": 0.8122844696044922}]} + "time_since_update": 0.8728673458099365}]} GET now ------- @@ -709,7 +708,7 @@ GET now Get plugin stats:: # curl http://localhost:61208/api/4/now - "2024-04-21 16:51:51 CEST" + "2024-04-24 19:39:29 CEST" GET percpu ---------- @@ -720,29 +719,29 @@ Get plugin stats:: [{"cpu_number": 0, "guest": 0.0, "guest_nice": 0.0, - "idle": 84.4, - "iowait": 0.6, + "idle": 73.2, + "iowait": 0.0, "irq": 0.0, "key": "cpu_number", "nice": 0.0, "softirq": 0.0, "steal": 0.0, - "system": 3.9, - "total": 15.6, - "user": 11.2}, + "system": 3.6, + "total": 26.8, + "user": 23.2}, {"cpu_number": 1, "guest": 0.0, "guest_nice": 0.0, - "idle": 52.8, - "iowait": 1.7, + "idle": 75.2, + "iowait": 0.0, "irq": 0.0, "key": "cpu_number", "nice": 0.0, "softirq": 0.0, "steal": 0.0, - "system": 5.6, - "total": 47.2, - "user": 40.0}] + "system": 5.1, + "total": 24.8, + "user": 19.7}] Fields descriptions: @@ -776,7 +775,7 @@ Get plugin stats:: "port": 0, "refresh": 30, "rtt_warning": None, - "status": 0.007086, + "status": 0.004414, "timeout": 3}] Fields descriptions: @@ -804,7 +803,7 @@ Get a specific item when field matches the given value:: "port": 0, "refresh": 30, "rtt_warning": None, - "status": 0.007086, + "status": 0.004414, "timeout": 3}]} GET processcount @@ -813,7 +812,7 @@ GET processcount Get plugin stats:: # curl http://localhost:61208/api/4/processcount - {"pid_max": 0, "running": 1, "sleeping": 321, "thread": 1477, "total": 391} + {"pid_max": 0, "running": 1, "sleeping": 332, "thread": 1612, "total": 402} Fields descriptions: @@ -826,7 +825,7 @@ Fields descriptions: Get a specific field:: # curl http://localhost:61208/api/4/processcount/total - {"total": 391} + {"total": 402} GET processlist --------------- @@ -866,67 +865,67 @@ GET quicklook Get plugin stats:: # curl http://localhost:61208/api/4/quicklook - {"cpu": 29.1, - "cpu_hz": 2025000000.0, - "cpu_hz_current": 1574552500.0, + {"cpu": 18.0, + "cpu_hz": 3000000000.0, + "cpu_hz_current": 2549918750.0, "cpu_log_core": 4, "cpu_name": "Intel(R) Core(TM) i7-4500U CPU @ 1.80GHz", "cpu_phys_core": 2, - "load": 35.4, - "mem": 71.2, + "load": 26.3, + "mem": 74.4, "percpu": [{"cpu_number": 0, "guest": 0.0, "guest_nice": 0.0, - "idle": 84.4, - "iowait": 0.6, + "idle": 73.2, + "iowait": 0.0, "irq": 0.0, "key": "cpu_number", "nice": 0.0, "softirq": 0.0, "steal": 0.0, - "system": 3.9, - "total": 15.6, - "user": 11.2}, + "system": 3.6, + "total": 26.8, + "user": 23.2}, {"cpu_number": 1, "guest": 0.0, "guest_nice": 0.0, - "idle": 52.8, - "iowait": 1.7, + "idle": 75.2, + "iowait": 0.0, "irq": 0.0, "key": "cpu_number", "nice": 0.0, "softirq": 0.0, "steal": 0.0, - "system": 5.6, - "total": 47.2, - "user": 40.0}, + "system": 5.1, + "total": 24.8, + "user": 19.7}, {"cpu_number": 2, "guest": 0.0, "guest_nice": 0.0, - "idle": 62.8, - "iowait": 1.6, + "idle": 89.5, + "iowait": 1.8, "irq": 0.0, "key": "cpu_number", "nice": 0.0, - "softirq": 1.1, + "softirq": 0.0, "steal": 0.0, - "system": 6.6, - "total": 37.2, - "user": 27.9}, + "system": 1.8, + "total": 10.5, + "user": 7.0}, {"cpu_number": 3, "guest": 0.0, "guest_nice": 0.0, - "idle": 77.3, - "iowait": 2.8, + "idle": 87.0, + "iowait": 0.9, "irq": 0.0, "key": "cpu_number", "nice": 0.0, - "softirq": 0.0, + "softirq": 0.9, "steal": 0.0, - "system": 7.2, - "total": 22.7, - "user": 12.7}], - "swap": 2.8} + "system": 0.9, + "total": 13.0, + "user": 10.4}], + "swap": 24.2} Fields descriptions: @@ -1048,7 +1047,7 @@ GET uptime Get plugin stats:: # curl http://localhost:61208/api/4/uptime - "1 day, 5:31:59" + "4 days, 8:19:34" GET version ----------- @@ -1056,7 +1055,7 @@ GET version Get plugin stats:: # curl http://localhost:61208/api/4/version - "4.0.0_beta01" + "4.0.0_beta04" GET wifi -------- @@ -1108,34 +1107,34 @@ GET stats history History of a plugin:: # curl http://localhost:61208/api/4/cpu/history - {"system": [["2024-04-21T16:51:53.555669", 5.6], - ["2024-04-21T16:51:54.620159", 3.6], - ["2024-04-21T16:51:56.063781", 3.6]], - "user": [["2024-04-21T16:51:53.555642", 23.2], - ["2024-04-21T16:51:54.620131", 12.2], - ["2024-04-21T16:51:56.063754", 12.2]]} + {"system": [["2024-04-24T19:39:30.842812", 2.7], + ["2024-04-24T19:39:31.868404", 1.4], + ["2024-04-24T19:39:32.992936", 1.4]], + "user": [["2024-04-24T19:39:30.842803", 15.3], + ["2024-04-24T19:39:31.868395", 3.4], + ["2024-04-24T19:39:32.992925", 3.4]]} Limit history to last 2 values:: # curl http://localhost:61208/api/4/cpu/history/2 - {"system": [["2024-04-21T16:51:54.620159", 3.6], - ["2024-04-21T16:51:56.063781", 3.6]], - "user": [["2024-04-21T16:51:54.620131", 12.2], - ["2024-04-21T16:51:56.063754", 12.2]]} + {"system": [["2024-04-24T19:39:31.868404", 1.4], + ["2024-04-24T19:39:32.992936", 1.4]], + "user": [["2024-04-24T19:39:31.868395", 3.4], + ["2024-04-24T19:39:32.992925", 3.4]]} History for a specific field:: # curl http://localhost:61208/api/4/cpu/system/history - {"system": [["2024-04-21T16:51:51.876628", 5.6], - ["2024-04-21T16:51:53.555669", 5.6], - ["2024-04-21T16:51:54.620159", 3.6], - ["2024-04-21T16:51:56.063781", 3.6]]} + {"system": [["2024-04-24T19:39:29.207977", 2.7], + ["2024-04-24T19:39:30.842812", 2.7], + ["2024-04-24T19:39:31.868404", 1.4], + ["2024-04-24T19:39:32.992936", 1.4]]} Limit history for a specific field to last 2 values:: # curl http://localhost:61208/api/4/cpu/system/history - {"system": [["2024-04-21T16:51:54.620159", 3.6], - ["2024-04-21T16:51:56.063781", 3.6]]} + {"system": [["2024-04-24T19:39:31.868404", 1.4], + ["2024-04-24T19:39:32.992936", 1.4]]} GET limits (used for thresholds) -------------------------------- diff --git a/docs/man/glances.1 b/docs/man/glances.1 index d3cb9876..fe1c71af 100644 --- a/docs/man/glances.1 +++ b/docs/man/glances.1 @@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. -.TH "GLANCES" "1" "Apr 21, 2024" "4.0.0_beta01" "Glances" +.TH "GLANCES" "1" "Apr 24, 2024" "4.0.0_beta04" "Glances" .SH NAME glances \- An eye on your system .SH SYNOPSIS diff --git a/docs/quickstart.rst b/docs/quickstart.rst index 70b047a9..9bdb5075 100644 --- a/docs/quickstart.rst +++ b/docs/quickstart.rst @@ -28,16 +28,18 @@ It is also possible to display RAW (Python) stats directly to stdout using: .. code-block:: console - $ glances --stdout cpu.user,mem.used,load + $ glances --stdout cpu.user,mem.used,load,network.wlp2s0.bytes_all cpu.user: 30.7 mem.used: 3278204928 load: {'cpucore': 4, 'min1': 0.21, 'min5': 0.4, 'min15': 0.27} + network.wlp2s0.bytes_all: 13479 cpu.user: 3.4 mem.used: 3275251712 load: {'cpucore': 4, 'min1': 0.19, 'min5': 0.39, 'min15': 0.27} + network.wlp2s0.bytes_all: 12868 ... -or in a CSV format thanks to the stdout-csv option: +or in a CSV format thanks to the stdout-csv option (key not supported in this mode): .. code-block:: console diff --git a/glances/main.py b/glances/main.py index 61a1273f..43f33d34 100644 --- a/glances/main.py +++ b/glances/main.py @@ -611,6 +611,10 @@ Examples of use: if getattr(args, 'enable_processlist', False): enable(args, 'processcount') + # Set a default export_process_filter (with all process) when using the stdout mode + if getattr(args, 'stdout', True) and args.process_filter is None: + setattr(args, 'export_process_filter', '.*') + def init_client_server(self, args): """Init Glances client/server mode.""" diff --git a/glances/outputs/glances_stdout.py b/glances/outputs/glances_stdout.py index 60e6381f..bbb89fe4 100644 --- a/glances/outputs/glances_stdout.py +++ b/glances/outputs/glances_stdout.py @@ -2,7 +2,7 @@ # # This file is part of Glances. # -# SPDX-FileCopyrightText: 2022 Nicolas Hennion <nicolas@nicolargo.com> +# SPDX-FileCopyrightText: 2024 Nicolas Hennion <nicolas@nicolargo.com> # # SPDX-License-Identifier: LGPL-3.0-only # @@ -30,15 +30,21 @@ class GlancesStdout(object): def build_list(self): """Return a list of tuples taken from self.args.stdout - :return: A list of tuples. Example -[(plugin, attribute), ... ] + :return: A list of tuples. Example [(plugin, key, attribute), ... ] """ ret = [] for p in self.args.stdout.split(','): - if '.' in p: - p, a = p.split('.') - else: - a = None - ret.append((p, a)) + pka = p.split('.') + if len(pka) == 1: + # Only plugin name is provided + new = (pka[0], None, None) + elif len(pka) == 2: + # Plugin name and attribute is provided + new = (pka[0], None, pka[1]) + elif len(pka) == 3: + # Plugin name, key and attribute are provided + new = (pka[0], pka[1], pka[2]) + ret.append(new) return ret def end(self): @@ -49,7 +55,7 @@ class GlancesStdout(object): Refresh every duration second. """ - for plugin, attribute in self.plugins_list: + for plugin, key, attribute in self.plugins_list: # Check if the plugin exist and is enable if plugin in stats.getPluginsList() and stats.get_plugin(plugin).is_enabled(): stat = stats.get_plugin(plugin).get_export() @@ -58,10 +64,26 @@ class GlancesStdout(object): # Display stats if attribute is not None: # With attribute - try: - printandflush("{}.{}: {}".format(plugin, attribute, stat[attribute])) - except KeyError as err: - logger.error("Can not display stat {}.{} ({})".format(plugin, attribute, err)) + if isinstance(stat, dict): + try: + printandflush("{}.{}: {}".format(plugin, attribute, stat[attribute])) + except KeyError as err: + logger.error("Can not display stat {}.{} ({})".format(plugin, attribute, err)) + elif isinstance(stat, list): + for i in stat: + if key is None: + i_key = i[i['key']] + elif str(key) == str(i[i['key']]): + i_key = key + else: + continue + try: + printandflush("{}.{}.{}: {}".format(plugin, + i_key, + attribute, + i[attribute])) + except KeyError as err: + logger.error("Can not display stat {}.{} ({})".format(plugin, attribute, err)) else: # Without attribute printandflush("{}: {}".format(plugin, stat)) diff --git a/glances/plugins/processcount/__init__.py b/glances/plugins/processcount/__init__.py index 830dd863..113c47d0 100644 --- a/glances/plugins/processcount/__init__.py +++ b/glances/plugins/processcount/__init__.py @@ -9,6 +9,7 @@ """Process count plugin.""" +from glances.logger import logger from glances.processes import glances_processes, sort_for_human from glances.plugins.plugin.model import GlancesPluginModel diff --git a/glances/standalone.py b/glances/standalone.py index d2d01d67..68700c8c 100644 --- a/glances/standalone.py +++ b/glances/standalone.py @@ -67,7 +67,7 @@ class GlancesStandalone(object): logger.info("Process filter is set to: {}".format(args.process_filter)) glances_processes.process_filter = args.process_filter - if args.export and args.export_process_filter is not None: + if (args.export or args.stdout) and args.export_process_filter is not None: logger.info("Export process filter is set to: {}".format(args.export_process_filter)) glances_processes.export_process_filter = args.export_process_filter |