From 12d9ac1dff05ac74ba304cbf9186aa159fde1d61 Mon Sep 17 00:00:00 2001 From: nicolargo Date: Sun, 31 Mar 2024 12:21:01 +0200 Subject: First try, stdout JSON work ok but not the CSV export --- conf/glances.conf | 6 ++++++ glances/exports/export.py | 2 +- glances/exports/glances_csv/__init__.py | 4 +++- glances/filter.py | 4 +++- glances/plugins/plugin/model.py | 5 ++++- glances/plugins/processlist/__init__.py | 15 +++++++++++++-- glances/processes.py | 32 ++++++++++++++++++++++++++++---- glances/stats.py | 4 ++-- 8 files changed, 60 insertions(+), 12 deletions(-) diff --git a/conf/glances.conf b/conf/glances.conf index a9986280..bfdd9c4a 100644 --- a/conf/glances.conf +++ b/conf/glances.conf @@ -357,6 +357,12 @@ nice_warning=-20,-19,-18,-17,-16,-15,-14,-13,-12,-11,-10,-9,-8,-7,-6,-5,-4,-3,-2 #nice_careful=1,2,3,4,5,6,7,8,9 #nice_warning=10,11,12,13,14 #nice_critical=15,16,17,18,19 +# +# Define the list of processes to export using: +# a comma-separated list of regular expression (apply on name and cmdline) +export=.*firefox.*,.*python.* +# or an uniq key:value filter +#export=pid:1234 [ports] disable=False diff --git a/glances/exports/export.py b/glances/exports/export.py index dbcabe62..8522f9dd 100644 --- a/glances/exports/export.py +++ b/glances/exports/export.py @@ -33,7 +33,7 @@ class GlancesExport(object): 'now', 'plugin', 'ports', - 'processlist', + # 'processlist', 'psutilversion', 'quicklook', 'version', diff --git a/glances/exports/glances_csv/__init__.py b/glances/exports/glances_csv/__init__.py index 88e0615a..82497d47 100644 --- a/glances/exports/glances_csv/__init__.py +++ b/glances/exports/glances_csv/__init__.py @@ -69,7 +69,9 @@ class Export(GlancesExport): self.csv_file.close() def update(self, stats): - """Update stats in the CSV output file.""" + """Update stats in the CSV output file. + This class overwrite the one in the parent class. + """ # Get the stats all_stats = stats.getAllExportsAsDict(plugin_list=self.plugins_to_export(stats)) diff --git a/glances/filter.py b/glances/filter.py index 55950060..449fa619 100644 --- a/glances/filter.py +++ b/glances/filter.py @@ -79,7 +79,9 @@ class GlancesFilter(object): self._filter_re = None if self.filter is not None: - logger.info("Set filter to {} on key {}".format(self.filter, self.filter_key)) + logger.info("Set filter to {} on {}".format( + self.filter, + self.filter_key if self.filter_key else 'name or cmdline')) # Compute the regular expression try: self._filter_re = re.compile(self.filter) diff --git a/glances/plugins/plugin/model.py b/glances/plugins/plugin/model.py index 8e3a4643..d6b84e09 100644 --- a/glances/plugins/plugin/model.py +++ b/glances/plugins/plugin/model.py @@ -392,7 +392,10 @@ class GlancesPluginModel(object): return self.stats def get_export(self): - """Return the stats object to export.""" + """Return the stats object to export. + By default, return the raw stats. + Note: this method could be overwritten by the plugin if a specific format is needed (ex: processlist) + """ return self.get_raw() def get_stats(self): diff --git a/glances/plugins/processlist/__init__.py b/glances/plugins/processlist/__init__.py index d780af02..17c4a041 100644 --- a/glances/plugins/processlist/__init__.py +++ b/glances/plugins/processlist/__init__.py @@ -179,14 +179,18 @@ class PluginModel(GlancesPluginModel): self.pid_max = glances_processes.pid_max # Set the default sort key if it is defined in the configuration file - if config is not None: - if 'processlist' in config.as_dict() and 'sort_key' in config.as_dict()['processlist']: + if config is not None and 'processlist' in config.as_dict(): + if 'sort_key' in config.as_dict()['processlist']: logger.debug( 'Configuration overwrites processes sort key by {}'.format( config.as_dict()['processlist']['sort_key'] ) ) glances_processes.set_sort_key(config.as_dict()['processlist']['sort_key'], False) + if 'export' in config.as_dict()['processlist']: + logger.debug('Processlist will export processes matching following regexp: {}'.format( + config.as_dict()['processlist']['export'])) + glances_processes.set_export(config.as_dict()['processlist']['export']) # The default sort key could also be overwrite by command line (see #1903) if args.sort_processes_key is not None: @@ -226,6 +230,13 @@ class PluginModel(GlancesPluginModel): return stats + def get_export(self): + """Return the processes list to export. + Not all the processeses are exported. + Only the one defined in the Glances configuration file (see #794 for details). + """ + return glances_processes.get_export() + def get_nice_alert(self, value): """Return the alert relative to the Nice configuration list""" value = str(value) diff --git a/glances/processes.py b/glances/processes.py index ec8962af..1575e81a 100644 --- a/glances/processes.py +++ b/glances/processes.py @@ -69,6 +69,10 @@ class GlancesProcesses(object): # Cache is a dict with key=pid and value = dict of cached value self.processlist_cache = {} + # List of processes stats to export (filtred by the _filter_export) + self._filter_export = GlancesFilter() + self.processlist_export = [] + # Tag to enable/disable the processes stats (to reduce the Glances CPU consumption) # Default is to enable the processes stats self.disable_tag = False @@ -119,6 +123,10 @@ class GlancesProcesses(object): """Set args.""" self.args = args + def set_export(self, export): + """Set the process export list of regexp.""" + self._filter_export.filter = '|'.join(export.split(',')) + def reset_processcount(self): """Reset the global process count""" self.processcount = {'total': 0, 'running': 0, 'sleeping': 0, 'thread': 0, 'pid_max': None} @@ -482,11 +490,11 @@ class GlancesProcesses(object): except KeyError: pass - # Apply user filter - processlist = list(filter(lambda p: not self._filter.is_filtered(p), processlist)) + # Filter and transform process list + processlist = self.update_export_list(processlist) - # Save the new processlist and transform all namedtuples to dict - processlist = list_of_namedtuple_to_list_of_dict(processlist) + # Filter and transform process export list + self.processlist_export = self.update_export_list(processlist) # Compute the maximum value for keys in self._max_values_list: CPU, MEM # Useful to highlight the processes with maximum values @@ -500,6 +508,18 @@ class GlancesProcesses(object): return self.processlist + def update_list(self, processlist): + """Return the process list after filtering and transformation (namedtuple to dict).""" + ret = list(filter(lambda p: not self._filter.is_filtered(p), processlist)) + return list_of_namedtuple_to_list_of_dict(ret) + + def update_export_list(self, processlist): + """Return the process export list after filtering and transformation (namedtuple to dict).""" + if self._filter_export.filter is None: + return [] + ret = list(filter(lambda p: not self._filter_export.is_filtered(p), processlist)) + return list_of_namedtuple_to_list_of_dict(ret) + def get_count(self): """Get the number of processes.""" return self.processcount @@ -513,6 +533,10 @@ class GlancesProcesses(object): else: return self.processlist + def get_export(self): + """Return the processlist for export.""" + return self.processlist_export + @property def sort_key(self): """Get the current sort key.""" diff --git a/glances/stats.py b/glances/stats.py index 3929f337..9b875a63 100644 --- a/glances/stats.py +++ b/glances/stats.py @@ -315,10 +315,10 @@ class GlancesStats(object): return [self._plugins[p].get_export() for p in self._plugins] def getAllExportsAsDict(self, plugin_list=None): - """Return all the stats to be exported (list). + """Return all the stats to be exported (dict). Default behavior is to export all the stat - if plugin_list is provided, only export stats of given plugin (list) + if plugin_list is provided (list), only export stats of given plugins """ if plugin_list is None: # All enabled plugins should be exported -- cgit v1.2.3 From 8107525aef658a87a74688ef74aaf87fe165cda2 Mon Sep 17 00:00:00 2001 From: nicolargo Date: Mon, 1 Apr 2024 19:48:52 +0200 Subject: It Works ! Have to finalise documentation + configuration file --- conf/glances.conf | 2 +- glances/exports/export.py | 8 ++++---- glances/exports/glances_csv/__init__.py | 25 ++++++++++--------------- glances/main.py | 4 ++++ 4 files changed, 19 insertions(+), 20 deletions(-) diff --git a/conf/glances.conf b/conf/glances.conf index bfdd9c4a..02239b10 100644 --- a/conf/glances.conf +++ b/conf/glances.conf @@ -360,7 +360,7 @@ nice_warning=-20,-19,-18,-17,-16,-15,-14,-13,-12,-11,-10,-9,-8,-7,-6,-5,-4,-3,-2 # # Define the list of processes to export using: # a comma-separated list of regular expression (apply on name and cmdline) -export=.*firefox.*,.*python.* +export=.*firefox.* # or an uniq key:value filter #export=pid:1234 diff --git a/glances/exports/export.py b/glances/exports/export.py index 8522f9dd..cbe1eb84 100644 --- a/glances/exports/export.py +++ b/glances/exports/export.py @@ -167,12 +167,12 @@ class GlancesExport(object): i.update(all_limits[plugin]) else: continue - export_names, export_values = self.__build_export(all_stats[plugin]) + export_names, export_values = self.build_export(all_stats[plugin]) self.export(plugin, export_names, export_values) return True - def __build_export(self, stats): + def build_export(self, stats): """Build the export lists.""" export_names = [] export_values = [] @@ -194,7 +194,7 @@ class GlancesExport(object): except IndexError: value = '' if isinstance(value, dict): - item_names, item_values = self.__build_export(value) + item_names, item_values = self.build_export(value) item_names = [pre_key + key.lower() + str(i) for i in item_names] export_names += item_names export_values += item_values @@ -205,7 +205,7 @@ class GlancesExport(object): # Stats is a list (of dict) # Recursive loop through the list for item in stats: - item_names, item_values = self.__build_export(item) + item_names, item_values = self.build_export(item) export_names += item_names export_values += item_values return export_names, export_values diff --git a/glances/exports/glances_csv/__init__.py b/glances/exports/glances_csv/__init__.py index 82497d47..3324cbf9 100644 --- a/glances/exports/glances_csv/__init__.py +++ b/glances/exports/glances_csv/__init__.py @@ -70,7 +70,7 @@ class Export(GlancesExport): def update(self, stats): """Update stats in the CSV output file. - This class overwrite the one in the parent class. + Note: This class overwrite the one in the parent class because we need to manage the header. """ # Get the stats all_stats = stats.getAllExportsAsDict(plugin_list=self.plugins_to_export(stats)) @@ -82,20 +82,10 @@ class Export(GlancesExport): # Loop over plugins to export for plugin in self.plugins_to_export(stats): - if isinstance(all_stats[plugin], list): - for stat in sorted(all_stats[plugin], key=lambda x: x['key']): - # First line: header - if self.first_line: - csv_header += ['{}_{}_{}'.format(plugin, self.get_item_key(stat), item) for item in stat] - # Others lines: stats - csv_data += itervalues(stat) - elif isinstance(all_stats[plugin], dict): - # First line: header - if self.first_line: - fieldnames = iterkeys(all_stats[plugin]) - csv_header += ('{}_{}'.format(plugin, fieldname) for fieldname in fieldnames) - # Others lines: stats - csv_data += itervalues(all_stats[plugin]) + export_names, export_values = self.build_export(all_stats[plugin]) + if self.first_line: + csv_header += export_names + csv_data += export_values # Export to CSV # Manage header @@ -119,6 +109,11 @@ class Export(GlancesExport): self.writer.writerow(csv_data) self.csv_file.flush() + def export(self, name, columns, points): + """Export the stats to the CSV file. + For the moment everything is done in the update method.""" + pass + def open_csv_file(file_name, file_mode): return open(file_name, file_mode, newline='') diff --git a/glances/main.py b/glances/main.py index 9dd35117..30bf6f88 100644 --- a/glances/main.py +++ b/glances/main.py @@ -600,6 +600,10 @@ Examples of use: args.network_sum = False args.network_cumul = False + # Processlist id updated in processcount + if getattr(args, 'enable_processlist', False): + enable(args, 'processcount') + def init_client_server(self, args): """Init Glances client/server mode.""" -- cgit v1.2.3 From 194ae67d88b475d247ea07f49ac9a0e25762a03e Mon Sep 17 00:00:00 2001 From: nicolargo Date: Wed, 3 Apr 2024 18:44:31 +0200 Subject: Update docs but 'make docs' do not work... --- docs/aoa/ps.rst | 59 ++++- docs/api.rst | 755 ++++++----------------------------------------------- docs/man/glances.1 | 2 +- 3 files changed, 146 insertions(+), 670 deletions(-) diff --git a/docs/aoa/ps.rst b/docs/aoa/ps.rst index 7b5d8cf8..f03c5f9f 100644 --- a/docs/aoa/ps.rst +++ b/docs/aoa/ps.rst @@ -199,4 +199,61 @@ Accumulated per program — key 'j' When activated ('j' hotkey or --programs option in the command line), processes are merged to display which programs are active. The columns show the accumulated cpu consumption, the accumulated virtual and resident memory consumption, the accumulated transferred data I/O. -The PID columns is replaced by a NPROCS column which is the number of processes. \ No newline at end of file +The PID columns is replaced by a NPROCS column which is the number of processes. + +Export process +-------------- + +Glances version 4 introduces a new feature to export specifics processes. In order to use this +feature, you need to use the export option in the processlist section of the Glances configuration +file. + +The export option is one of the following: +- a comma separated list of process names or regular expressions +- a single filter (see above) + +Example number one, export all processes with the name 'python': + +.. code-block:: ini + + [processlist] + export=.*python.* + +Example number two, export all processes with the name 'python' or 'bash': + +.. code-block:: ini + + [processlist] + export=.*python.*,.*bash.* + +Example number three, export all processes belong to the user 'nicolargo': + +.. code-block:: ini + + [processlist] + export=username:nicolargo + +The output of the export use the PID as the key (for example if you want to export firefox process +to a CSV file): + +Configuration file (glances.conf): + +.. code-block:: ini + + [processlist] + export=.*firefox.* + +Command line example: + +.. code-block:: bash + + glances -C ./conf/glances.conf --export csv --export-csv-file /tmp/glances.csv --disable-plugin all --enable-plugin processlist --quiet + +the result will be: + +.. code-block:: csv + + timestamp,845992.memory_percent,845992.status,845992.num_threads,845992.cpu_timesuser,845992.cpu_timessystem,845992.cpu_timeschildren_user,845992.cpu_timeschildren_system,845992.cpu_timesiowait,845992.memory_inforss,845992.memory_infovms,845992.memory_infoshared,845992.memory_infotext,845992.memory_infolib,845992.memory_infodata,845992.memory_infodirty,845992.name,845992.io_counters,845992.nice,845992.cpu_percent,845992.pid,845992.gidsreal,845992.gidseffective,845992.gidssaved,845992.key,845992.time_since_update,845992.cmdline,845992.username,total,running,sleeping,thread,pid_max + 2024-04-03 18:39:55,3.692938041968513,S,138,1702.88,567.89,1752.79,244.18,0.0,288919552,12871561216,95182848,856064,0,984535040,0,firefox,1863281664,0,0.5,845992,1000,1000,1000,pid,2.2084147930145264,/snap/firefox/3836/usr/lib/firefox/firefox,nicolargo,403,1,333,1511,0 + 2024-04-03 18:39:57,3.692938041968513,S,138,1702.88,567.89,1752.79,244.18,0.0,288919552,12871561216,95182848,856064,0,984535040,0,firefox,1863281664,0,0.5,845992,1000,1000,1000,pid,2.2084147930145264,/snap/firefox/3836/usr/lib/firefox/firefox,nicolargo,403,1,333,1511,0 + diff --git a/docs/api.rst b/docs/api.rst index 1df68638..3e538572 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -141,7 +141,7 @@ Get plugin stats:: "refresh": 3.0, "regex": True, "result": None, - "timer": 0.42368555068969727}, + "timer": 0.4525735378265381}, {"count": 0, "countmax": 20.0, "countmin": None, @@ -150,7 +150,7 @@ Get plugin stats:: "refresh": 3.0, "regex": True, "result": None, - "timer": 0.42352890968322754}] + "timer": 0.4524049758911133}] Fields descriptions: @@ -178,7 +178,7 @@ Get a specific item when field matches the given value:: "refresh": 3.0, "regex": True, "result": None, - "timer": 0.42368555068969727}]} + "timer": 0.4525735378265381}]} GET cloud --------- @@ -233,7 +233,7 @@ Get plugin stats:: "name": "portainer", "network": {}, "status": "running", - "uptime": "1 weeks"}] + "uptime": "3 days"}] Fields descriptions: @@ -276,7 +276,7 @@ Get a specific item when field matches the given value:: "name": "portainer", "network": {}, "status": "running", - "uptime": "1 weeks"}]} + "uptime": "3 days"}]} GET core -------- @@ -303,19 +303,19 @@ Get plugin stats:: # curl http://localhost:61208/api/4/cpu {"cpucore": 4, - "ctx_switches": 483265492, + "ctx_switches": 1004315514, "guest": 0.0, - "idle": 72.4, - "interrupts": 271401643, - "iowait": 0.3, + "idle": 73.4, + "interrupts": 465901810, + "iowait": 0.0, "irq": 0.0, "nice": 0.0, - "soft_interrupts": 128147575, + "soft_interrupts": 204824951, "steal": 0.0, "syscalls": 0, - "system": 4.7, - "total": 27.3, - "user": 22.6} + "system": 3.3, + "total": 26.6, + "user": 23.3} Fields descriptions: @@ -348,7 +348,7 @@ Fields descriptions: Get a specific field:: # curl http://localhost:61208/api/4/cpu/total - {"total": 27.3} + {"total": 26.6} GET diskio ---------- @@ -358,16 +358,16 @@ Get plugin stats:: # curl http://localhost:61208/api/4/diskio [{"disk_name": "sda", "key": "disk_name", - "read_bytes": 66748604928, - "read_count": 2974717, - "write_bytes": 168312320000, - "write_count": 1561378}, + "read_bytes": 99876579840, + "read_count": 5269570, + "write_bytes": 202760364032, + "write_count": 2469865}, {"disk_name": "sda1", "key": "disk_name", - "read_bytes": 15003648, - "read_count": 432, + "read_bytes": 24269824, + "read_count": 659, "write_bytes": 0, - "write_count": 34}] + "write_count": 44}] Fields descriptions: @@ -396,10 +396,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": 66748604928, - "read_count": 2974717, - "write_bytes": 168312320000, - "write_count": 1561378}]} + "read_bytes": 99876579840, + "read_count": 5269570, + "write_bytes": 202760364032, + "write_count": 2469865}]} GET folders ----------- @@ -426,13 +426,13 @@ Get plugin stats:: # curl http://localhost:61208/api/4/fs [{"device_name": "/dev/mapper/ubuntu--gnome--vg-root", - "free": 36907282432, + "free": 35933167616, "fs_type": "ext4", "key": "mnt_point", "mnt_point": "/", - "percent": 84.0, + "percent": 84.4, "size": 243334156288, - "used": 194039418880}, + "used": 195013533696}, {"device_name": "zsfpool", "free": 31195136, "fs_type": "zfs", @@ -461,13 +461,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": 36907282432, + "free": 35933167616, "fs_type": "ext4", "key": "mnt_point", "mnt_point": "/", - "percent": 84.0, + "percent": 84.4, "size": 243334156288, - "used": 194039418880}]} + "used": 195013533696}]} GET gpu ------- @@ -500,11 +500,11 @@ GET ip Get plugin stats:: # curl http://localhost:61208/api/4/ip - {"address": "192.168.0.32", - "gateway": "192.168.0.254", + {"address": "192.168.1.14", + "gateway": "192.168.1.1", "mask": "255.255.255.0", "mask_cidr": 24, - "public_address": "91.166.228.228", + "public_address": "92.151.148.66", "public_info_human": ""} Fields descriptions: @@ -519,7 +519,7 @@ Fields descriptions: Get a specific field:: # curl http://localhost:61208/api/4/ip/gateway - {"gateway": "192.168.0.254"} + {"gateway": "192.168.1.1"} GET irq ------- @@ -540,10 +540,7 @@ GET load Get plugin stats:: # curl http://localhost:61208/api/4/load - {"cpucore": 4, - "min1": 0.91845703125, - "min15": 0.896484375, - "min5": 0.79931640625} + {"cpucore": 4, "min1": 1.4765625, "min15": 1.560546875, "min5": 1.44580078125} Fields descriptions: @@ -555,7 +552,7 @@ Fields descriptions: Get a specific field:: # curl http://localhost:61208/api/4/load/min1 - {"min1": 0.91845703125} + {"min1": 1.4765625} GET mem ------- @@ -563,16 +560,16 @@ GET mem Get plugin stats:: # curl http://localhost:61208/api/4/mem - {"active": 2973868032, - "available": 2273656832, - "buffers": 282787840, - "cached": 2105749504, - "free": 2273656832, - "inactive": 2872504320, - "percent": 70.9, - "shared": 598622208, + {"active": 2266718208, + "available": 2772324352, + "buffers": 597647360, + "cached": 2750038016, + "free": 2772324352, + "inactive": 3575382016, + "percent": 64.6, + "shared": 579096576, "total": 7823568896, - "used": 5549912064} + "used": 5051244544} Fields descriptions: @@ -599,13 +596,13 @@ GET memswap Get plugin stats:: # curl http://localhost:61208/api/4/memswap - {"free": 3853631488, - "percent": 52.3, - "sin": 4358995968, - "sout": 9174384640, + {"free": 6852558848, + "percent": 15.2, + "sin": 7842959360, + "sout": 15690727424, "time_since_update": 1, "total": 8082419712, - "used": 4228788224} + "used": 1229860864} Fields descriptions: @@ -630,15 +627,15 @@ Get plugin stats:: # curl http://localhost:61208/api/4/network [{"alias": None, "bytes_all": 0, - "bytes_all_gauge": 5346184024, + "bytes_all_gauge": 8333116275, "bytes_recv": 0, - "bytes_recv_gauge": 5021772215, + "bytes_recv_gauge": 7810821873, "bytes_sent": 0, - "bytes_sent_gauge": 324411809, + "bytes_sent_gauge": 522294402, "interface_name": "wlp2s0", "key": "interface_name", "speed": 0, - "time_since_update": 0.3248739242553711}, + "time_since_update": 0.3446004390716553}, {"alias": None, "bytes_all": 0, "bytes_all_gauge": 0, @@ -649,7 +646,7 @@ Get plugin stats:: "interface_name": "br-40875d2e2716", "key": "interface_name", "speed": 0, - "time_since_update": 0.3248739242553711}] + "time_since_update": 0.3446004390716553}] Fields descriptions: @@ -677,22 +674,23 @@ Get a specific field:: "lxdbr0", "veth05608da0", "mpqemubr0", - "veth3c5f47a"]} + "veth601e59cb", + "vethfd301c0"]} 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": 5346184024, + "bytes_all_gauge": 8333116275, "bytes_recv": 0, - "bytes_recv_gauge": 5021772215, + "bytes_recv_gauge": 7810821873, "bytes_sent": 0, - "bytes_sent_gauge": 324411809, + "bytes_sent_gauge": 522294402, "interface_name": "wlp2s0", "key": "interface_name", "speed": 0, - "time_since_update": 0.3248739242553711}]} + "time_since_update": 0.3446004390716553}]} GET now ------- @@ -700,7 +698,7 @@ GET now Get plugin stats:: # curl http://localhost:61208/api/4/now - "2024-03-23 09:37:55 CET" + "2024-04-03 18:43:04 CEST" GET percpu ---------- @@ -711,29 +709,29 @@ Get plugin stats:: [{"cpu_number": 0, "guest": 0.0, "guest_nice": 0.0, - "idle": 45.0, - "iowait": 1.0, + "idle": 73.0, + "iowait": 0.0, "irq": 0.0, "key": "cpu_number", "nice": 0.0, "softirq": 0.0, "steal": 0.0, - "system": 6.0, - "total": 55.0, - "user": 25.0}, + "system": 2.0, + "total": 27.0, + "user": 4.0}, {"cpu_number": 1, "guest": 0.0, "guest_nice": 0.0, - "idle": 48.0, - "iowait": 0.0, + "idle": 71.0, + "iowait": 1.0, "irq": 0.0, "key": "cpu_number", "nice": 0.0, "softirq": 0.0, "steal": 0.0, - "system": 4.0, - "total": 52.0, - "user": 24.0}] + "system": 2.0, + "total": 29.0, + "user": 7.0}] Fields descriptions: @@ -762,12 +760,12 @@ Get plugin stats:: # curl http://localhost:61208/api/4/ports [{"description": "DefaultGateway", - "host": "192.168.0.254", + "host": "192.168.1.1", "indice": "port_0", "port": 0, "refresh": 30, "rtt_warning": None, - "status": 0.00386, + "status": 0.006906, "timeout": 3}] Fields descriptions: @@ -784,19 +782,19 @@ Fields descriptions: Get a specific field:: # curl http://localhost:61208/api/4/ports/host - {"host": ["192.168.0.254"]} + {"host": ["192.168.1.1"]} Get a specific item when field matches the given value:: - # curl http://localhost:61208/api/4/ports/host/192.168.0.254 - {"192.168.0.254": [{"description": "DefaultGateway", - "host": "192.168.0.254", - "indice": "port_0", - "port": 0, - "refresh": 30, - "rtt_warning": None, - "status": 0.00386, - "timeout": 3}]} + # curl http://localhost:61208/api/4/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.006906, + "timeout": 3}]} GET processcount ---------------- @@ -804,7 +802,7 @@ GET processcount Get plugin stats:: # curl http://localhost:61208/api/4/processcount - {"pid_max": 0, "running": 1, "sleeping": 334, "thread": 1655, "total": 403} + {"pid_max": 0, "running": 1, "sleeping": 335, "thread": 1517, "total": 401} Fields descriptions: @@ -817,7 +815,7 @@ Fields descriptions: Get a specific field:: # curl http://localhost:61208/api/4/processcount/total - {"total": 403} + {"total": 401} GET processlist --------------- @@ -843,582 +841,3 @@ Fields descriptions: * **gids**: Process group IDs (dict with real, effective, saved keys) (unit is *number*) * **io_counters**: Process IO counters (list with read_count, write_count, read_bytes, write_bytes, io_tag keys) (unit is *byte*) -GET psutilversion ------------------ - -Get plugin stats:: - - # curl http://localhost:61208/api/4/psutilversion - "5.9.8" - -GET quicklook -------------- - -Get plugin stats:: - - # curl http://localhost:61208/api/4/quicklook - {"cpu": 27.3, - "cpu_hz": 2025000000.0, - "cpu_hz_current": 2034554500.0, - "cpu_name": "Intel(R) Core(TM) i7-4500U CPU @ 1.80GHz", - "cpucore": 4, - "load": 22.4, - "mem": 70.9, - "percpu": [{"cpu_number": 0, - "guest": 0.0, - "guest_nice": 0.0, - "idle": 45.0, - "iowait": 1.0, - "irq": 0.0, - "key": "cpu_number", - "nice": 0.0, - "softirq": 0.0, - "steal": 0.0, - "system": 6.0, - "total": 55.0, - "user": 25.0}, - {"cpu_number": 1, - "guest": 0.0, - "guest_nice": 0.0, - "idle": 48.0, - "iowait": 0.0, - "irq": 0.0, - "key": "cpu_number", - "nice": 0.0, - "softirq": 0.0, - "steal": 0.0, - "system": 4.0, - "total": 52.0, - "user": 24.0}, - {"cpu_number": 2, - "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": 2.0, - "total": 36.0, - "user": 9.0}, - {"cpu_number": 3, - "guest": 0.0, - "guest_nice": 0.0, - "idle": 66.0, - "iowait": 0.0, - "irq": 0.0, - "key": "cpu_number", - "nice": 0.0, - "softirq": 0.0, - "steal": 0.0, - "system": 2.0, - "total": 34.0, - "user": 10.0}], - "swap": 52.3} - -Fields descriptions: - -* **cpu**: CPU percent usage (unit is *percent*) -* **mem**: MEM percent usage (unit is *percent*) -* **swap**: SWAP percent usage (unit is *percent*) -* **load**: LOAD percent usage (unit is *percent*) -* **cpu_name**: CPU name (unit is *None*) -* **cpu_hz_current**: CPU current frequency (unit is *hertz*) -* **cpu_hz**: CPU max frequency (unit is *hertz*) - -Get a specific field:: - - # curl http://localhost:61208/api/4/quicklook/cpu_name - {"cpu_name": "Intel(R) Core(TM) i7-4500U CPU @ 1.80GHz"} - -GET raid --------- - -Get plugin stats:: - - # curl http://localhost:61208/api/4/raid - {} - -GET sensors ------------ - -Get plugin stats:: - - # curl http://localhost:61208/api/4/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}] - -Fields descriptions: - -* **label**: Sensor label (unit is *None*) -* **unit**: Sensor unit (unit is *None*) -* **value**: Sensor value (unit is *number*) -* **warning**: Warning threshold (unit is *number*) -* **critical**: Critical threshold (unit is *number*) -* **type**: Sensor type (one of battery, temperature_core, fan_speed) (unit is *None*) - -Get a specific field:: - - # curl http://localhost:61208/api/4/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 matches the given value:: - - # curl http://localhost:61208/api/4/sensors/label/acpitz 0 - {"acpitz 0": [{"critical": 105, - "key": "label", - "label": "acpitz 0", - "type": "temperature_core", - "unit": "C", - "value": 27, - "warning": 105}]} - -GET smart ---------- - -Get plugin stats:: - - # curl http://localhost:61208/api/4/smart - {} - -GET system ----------- - -Get plugin stats:: - - # curl http://localhost:61208/api/4/system - {"hostname": "XPS13-9333", - "hr_name": "Ubuntu 22.04 64bit / Linux 5.15.0-94-generic", - "linux_distro": "Ubuntu 22.04", - "os_name": "Linux", - "os_version": "5.15.0-94-generic", - "platform": "64bit"} - -Fields descriptions: - -* **os_name**: Operating system name (unit is *None*) -* **hostname**: Hostname (unit is *None*) -* **platform**: Platform (32 or 64 bits) (unit is *None*) -* **linux_distro**: Linux distribution (unit is *None*) -* **os_version**: Operating system version (unit is *None*) -* **hr_name**: Human readable operating sytem name (unit is *None*) - -Get a specific field:: - - # curl http://localhost:61208/api/4/system/os_name - {"os_name": "Linux"} - -GET uptime ----------- - -Get plugin stats:: - - # curl http://localhost:61208/api/4/uptime - "19 days, 0:37:13" - -GET version ------------ - -Get plugin stats:: - - # curl http://localhost:61208/api/4/version - "4.0.0_beta01" - -GET wifi --------- - -Get plugin stats:: - - # curl http://localhost:61208/api/4/wifi - [] - -GET all stats -------------- - -Get all Glances stats:: - - # curl http://localhost:61208/api/4/all - Return a very big dictionary (avoid using this request, performances will be poor)... - -GET top n items of a specific plugin ------------------------------------- - -Get top 2 processes of the processlist plugin:: - - # curl http://localhost:61208/api/4/processlist/top/2 - [{"cmdline": ["/usr/share/code/code", - "--type=renderer", - "--crashpad-handler-pid=35523", - "--enable-crash-reporter=721e05a9-6035-4dcb-bd58-68097aa48dd0,no_channel", - "--user-data-dir=/home/nicolargo/.config/Code", - "--standard-schemes=vscode-webview,vscode-file", - "--enable-sandbox", - "--secure-schemes=vscode-webview,vscode-file", - "--cors-schemes=vscode-webview,vscode-file", - "--fetch-schemes=vscode-webview,vscode-file", - "--service-worker-schemes=vscode-webview", - "--code-cache-schemes=vscode-webview,vscode-file", - "--app-path=/usr/share/code/resources/app", - "--enable-sandbox", - "--enable-blink-features=HighlightAPI", - "--first-renderer-process", - "--lang=en-US", - "--num-raster-threads=2", - "--enable-main-frame-before-activation", - "--renderer-client-id=4", - "--time-ticks-at-unix-epoch=-1709539275787032", - "--launch-time-ticks=3773104105", - "--shared-files=v8_context_snapshot_data:100", - "--field-trial-handle=0,i,2992833077465328896,17440056338018087593,262144", - "--disable-features=CalculateNativeWinOcclusion,SpareRendererForSitePerProcess", - "--vscode-window-config=vscode:0a3f42ef-a12c-453d-8061-6c7b57ac6b4f"], - "cpu_percent": 0.0, - "cpu_times": {"children_system": 0.0, - "children_user": 0.0, - "iowait": 0.0, - "system": 710.62, - "user": 8468.8}, - "gids": {"effective": 1000, "real": 1000, "saved": 1000}, - "io_counters": [544399360, 3325952, 0, 0, 0], - "key": "pid", - "memory_info": {"data": 1233420288, - "dirty": 0, - "lib": 0, - "rss": 499662848, - "shared": 67067904, - "text": 126423040, - "vms": 1221792747520}, - "memory_percent": 6.386635749516636, - "name": "code", - "nice": 0, - "num_threads": 14, - "pid": 35570, - "status": "S", - "time_since_update": 1, - "username": "nicolargo"}, - {"cmdline": ["/usr/share/code/code", - "/home/nicolargo/.vscode/extensions/ms-python.vscode-pylance-2024.2.2/dist/server.bundle.js", - "--cancellationReceive=file:a926d4bb77e62306671377ffa0d7cb38591c07e817", - "--node-ipc", - "--clientProcessId=35618"], - "cpu_percent": 0.0, - "cpu_times": {"children_system": 0.34, - "children_user": 4.37, - "iowait": 0.0, - "system": 202.23, - "user": 4568.12}, - "gids": {"effective": 1000, "real": 1000, "saved": 1000}, - "io_counters": [619593728, 1871872, 0, 0, 0], - "key": "pid", - "memory_info": {"data": 888487936, - "dirty": 0, - "lib": 0, - "rss": 465555456, - "shared": 20754432, - "text": 126423040, - "vms": 1208849584128}, - "memory_percent": 5.9506788038644, - "name": "code", - "nice": 0, - "num_threads": 13, - "pid": 36130, - "status": "S", - "time_since_update": 1, - "username": "nicolargo"}] - -Note: Only work for plugin with a list of items - -GET item description --------------------- -Get item description (human readable) for a specific plugin/item:: - - # curl http://localhost:61208/api/4/diskio/read_bytes/description - "Number of bytes read." - -Note: the description is defined in the fields_description variable of the plugin. - -GET item unit -------------- -Get item unit for a specific plugin/item:: - - # curl http://localhost:61208/api/4/diskio/read_bytes/unit - "byte" - -Note: the description is defined in the fields_description variable of the plugin. - -GET stats history ------------------ - -History of a plugin:: - - # curl http://localhost:61208/api/4/cpu/history - {"system": [["2024-03-23T09:37:57.408003", 4.7], - ["2024-03-23T09:37:58.434789", 3.6], - ["2024-03-23T09:37:59.644529", 3.6]], - "user": [["2024-03-23T09:37:57.407990", 22.6], - ["2024-03-23T09:37:58.434780", 7.2], - ["2024-03-23T09:37:59.644514", 7.2]]} - -Limit history to last 2 values:: - - # curl http://localhost:61208/api/4/cpu/history/2 - {"system": [["2024-03-23T09:37:58.434789", 3.6], - ["2024-03-23T09:37:59.644529", 3.6]], - "user": [["2024-03-23T09:37:58.434780", 7.2], - ["2024-03-23T09:37:59.644514", 7.2]]} - -History for a specific field:: - - # curl http://localhost:61208/api/4/cpu/system/history - {"system": [["2024-03-23T09:37:55.811463", 4.7], - ["2024-03-23T09:37:57.408003", 4.7], - ["2024-03-23T09:37:58.434789", 3.6], - ["2024-03-23T09:37:59.644529", 3.6]]} - -Limit history for a specific field to last 2 values:: - - # curl http://localhost:61208/api/4/cpu/system/history - {"system": [["2024-03-23T09:37:58.434789", 3.6], - ["2024-03-23T09:37:59.644529", 3.6]]} - -GET limits (used for thresholds) --------------------------------- - -All limits/thresholds:: - - # curl http://localhost:61208/api/4/all/limits - {"alert": {"alert_disable": ["False"], "history_size": 1200.0}, - "amps": {"amps_disable": ["False"], "history_size": 1200.0}, - "containers": {"containers_all": ["False"], - "containers_disable": ["False"], - "containers_max_name_size": 20.0, - "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}, - "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_hide": ["docker.*", "lo"], - "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_bar_char": ["|"], - "quicklook_cpu_careful": 50.0, - "quicklook_cpu_critical": 90.0, - "quicklook_cpu_warning": 70.0, - "quicklook_disable": ["False"], - "quicklook_list": ["cpu", "mem", "load"], - "quicklook_load_careful": 70.0, - "quicklook_load_critical": 500.0, - "quicklook_load_warning": 100.0, - "quicklook_mem_careful": 50.0, - "quicklook_mem_critical": 90.0, - "quicklook_mem_warning": 70.0, - "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}, - "version": {"history_size": 1200.0}, - "wifi": {"history_size": 1200.0, - "wifi_careful": -65.0, - "wifi_critical": -85.0, - "wifi_disable": ["False"], - "wifi_warning": -75.0}} - -Limits/thresholds for the cpu plugin:: - - # curl http://localhost:61208/api/4/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} - diff --git a/docs/man/glances.1 b/docs/man/glances.1 index cdd386b1..fc9c4d64 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" "Mar 23, 2024" "4.0.0_beta01" "Glances" +.TH "GLANCES" "1" "Apr 03, 2024" "4.0.0_beta01" "Glances" .SH NAME glances \- An eye on your system .SH SYNOPSIS -- cgit v1.2.3 From 2a381e09ff1016ce1730d374bb059f55012f4520 Mon Sep 17 00:00:00 2001 From: nicolargo Date: Wed, 3 Apr 2024 22:20:00 +0200 Subject: Update comment --- glances/stats.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/glances/stats.py b/glances/stats.py index 9b875a63..336476e7 100644 --- a/glances/stats.py +++ b/glances/stats.py @@ -304,10 +304,10 @@ class GlancesStats(object): return {p: self._plugins[p].get_raw() for p in self._plugins} def getAllExports(self, plugin_list=None): - """Return all the stats to be exported (list). + """Return all the stats to be exported as a list. Default behavior is to export all the stat - if plugin_list is provided, only export stats of given plugin (list) + if plugin_list is provided (list), only export stats of given plugins """ if plugin_list is None: # All enabled plugins should be exported @@ -315,7 +315,7 @@ class GlancesStats(object): return [self._plugins[p].get_export() for p in self._plugins] def getAllExportsAsDict(self, plugin_list=None): - """Return all the stats to be exported (dict). + """Return all the stats to be exported as a dict. Default behavior is to export all the stat if plugin_list is provided (list), only export stats of given plugins -- cgit v1.2.3 From 4a5dfe7584610d1f263959b9c8a29d73c25f3fa6 Mon Sep 17 00:00:00 2001 From: nicolargo Date: Fri, 5 Apr 2024 19:06:51 +0200 Subject: Correct issue with bad filter used to filter process --- glances/filter.py | 2 +- glances/processes.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/glances/filter.py b/glances/filter.py index 449fa619..727bf695 100644 --- a/glances/filter.py +++ b/glances/filter.py @@ -79,7 +79,7 @@ class GlancesFilter(object): self._filter_re = None if self.filter is not None: - logger.info("Set filter to {} on {}".format( + logger.debug("Set filter to {} on {}".format( self.filter, self.filter_key if self.filter_key else 'name or cmdline')) # Compute the regular expression diff --git a/glances/processes.py b/glances/processes.py index 1575e81a..f088ce5a 100644 --- a/glances/processes.py +++ b/glances/processes.py @@ -491,7 +491,7 @@ class GlancesProcesses(object): pass # Filter and transform process list - processlist = self.update_export_list(processlist) + processlist = self.update_list(processlist) # Filter and transform process export list self.processlist_export = self.update_export_list(processlist) -- cgit v1.2.3 From 6fc0814a320e4deb8299da635fb862518a3053a2 Mon Sep 17 00:00:00 2001 From: nicolargo Date: Fri, 5 Apr 2024 19:39:12 +0200 Subject: Add optino to set export process filter from the command line --- conf/glances.conf | 2 +- docker-compose/glances.conf | 6 ++ docs/aoa/ps.rst | 12 ++- docs/api.rst | 163 +++++++++++++++++--------------- docs/man/glances.1 | 2 +- glances/main.py | 7 ++ glances/plugins/processlist/__init__.py | 7 +- glances/processes.py | 20 +++- glances/standalone.py | 5 + 9 files changed, 137 insertions(+), 87 deletions(-) diff --git a/conf/glances.conf b/conf/glances.conf index 02239b10..a1435372 100644 --- a/conf/glances.conf +++ b/conf/glances.conf @@ -360,7 +360,7 @@ nice_warning=-20,-19,-18,-17,-16,-15,-14,-13,-12,-11,-10,-9,-8,-7,-6,-5,-4,-3,-2 # # Define the list of processes to export using: # a comma-separated list of regular expression (apply on name and cmdline) -export=.*firefox.* +#export=.*firefox.* # or an uniq key:value filter #export=pid:1234 diff --git a/docker-compose/glances.conf b/docker-compose/glances.conf index 50ca289d..4cfe67ea 100755 --- a/docker-compose/glances.conf +++ b/docker-compose/glances.conf @@ -357,6 +357,12 @@ nice_warning=-20,-19,-18,-17,-16,-15,-14,-13,-12,-11,-10,-9,-8,-7,-6,-5,-4,-3,-2 #nice_careful=1,2,3,4,5,6,7,8,9 #nice_warning=10,11,12,13,14 #nice_critical=15,16,17,18,19 +# +# Define the list of processes to export using: +# a comma-separated list of regular expression (apply on name and cmdline) +#export=.*firefox.* +# or an uniq key:value filter +#export=pid:1234 [ports] disable=False diff --git a/docs/aoa/ps.rst b/docs/aoa/ps.rst index f03c5f9f..fe788cf3 100644 --- a/docs/aoa/ps.rst +++ b/docs/aoa/ps.rst @@ -206,11 +206,11 @@ Export process Glances version 4 introduces a new feature to export specifics processes. In order to use this feature, you need to use the export option in the processlist section of the Glances configuration -file. +file or the --export-process-filter option in the command line. The export option is one of the following: - a comma separated list of process names or regular expressions -- a single filter (see above) +- a single Glances filter (see above) Example number one, export all processes with the name 'python': @@ -219,6 +219,8 @@ Example number one, export all processes with the name 'python': [processlist] export=.*python.* +Note: or the --export-process-filter ".*python.*" option in the command line. + Example number two, export all processes with the name 'python' or 'bash': .. code-block:: ini @@ -226,6 +228,8 @@ Example number two, export all processes with the name 'python' or 'bash': [processlist] export=.*python.*,.*bash.* +Note: or the --export-process-filter ".*python.*,.*bash.*" option in the command line. + Example number three, export all processes belong to the user 'nicolargo': .. code-block:: ini @@ -233,6 +237,8 @@ Example number three, export all processes belong to the user 'nicolargo': [processlist] export=username:nicolargo +Note: or the --export-process-filter "username:nicolargo" option in the command line. + The output of the export use the PID as the key (for example if you want to export firefox process to a CSV file): @@ -243,6 +249,8 @@ Configuration file (glances.conf): [processlist] export=.*firefox.* +Note: or the --export-process-filter ".*firefox.*" option in the command line. + Command line example: .. code-block:: bash diff --git a/docs/api.rst b/docs/api.rst index 3e538572..2332f9c7 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -141,7 +141,7 @@ Get plugin stats:: "refresh": 3.0, "regex": True, "result": None, - "timer": 0.4525735378265381}, + "timer": 0.5245327949523926}, {"count": 0, "countmax": 20.0, "countmin": None, @@ -150,7 +150,7 @@ Get plugin stats:: "refresh": 3.0, "regex": True, "result": None, - "timer": 0.4524049758911133}] + "timer": 0.5243725776672363}] Fields descriptions: @@ -178,7 +178,7 @@ Get a specific item when field matches the given value:: "refresh": 3.0, "regex": True, "result": None, - "timer": 0.4525735378265381}]} + "timer": 0.5245327949523926}]} GET cloud --------- @@ -226,14 +226,18 @@ Get plugin stats:: "engine": "docker", "id": "3abd51c615968482d9ccff5afc629f267f6dda113ed68b75b432615fae3b49fb", "image": ["portainer/portainer-ce:2.9.3"], - "io": {}, + "io": {"cumulative_ior": 40960, "cumulative_iow": 741376}, "key": "name", - "memory": {}, - "memory_usage": None, + "memory": {"cache": None, + "limit": 7823568896, + "max_usage": None, + "rss": None, + "usage": 13950976}, + "memory_usage": 13950976, "name": "portainer", - "network": {}, + "network": {"cumulative_rx": 1265768, "cumulative_tx": 1496}, "status": "running", - "uptime": "3 days"}] + "uptime": "5 days"}] Fields descriptions: @@ -269,14 +273,18 @@ Get a specific item when field matches the given value:: "engine": "docker", "id": "3abd51c615968482d9ccff5afc629f267f6dda113ed68b75b432615fae3b49fb", "image": ["portainer/portainer-ce:2.9.3"], - "io": {}, + "io": {"cumulative_ior": 40960, "cumulative_iow": 741376}, "key": "name", - "memory": {}, - "memory_usage": None, + "memory": {"cache": None, + "limit": 7823568896, + "max_usage": None, + "rss": None, + "usage": 13950976}, + "memory_usage": 13950976, "name": "portainer", - "network": {}, + "network": {"cumulative_rx": 1265768, "cumulative_tx": 1496}, "status": "running", - "uptime": "3 days"}]} + "uptime": "5 days"}]} GET core -------- @@ -303,19 +311,19 @@ Get plugin stats:: # curl http://localhost:61208/api/4/cpu {"cpucore": 4, - "ctx_switches": 1004315514, + "ctx_switches": 1045187154, "guest": 0.0, - "idle": 73.4, - "interrupts": 465901810, - "iowait": 0.0, + "idle": 61.8, + "interrupts": 480320693, + "iowait": 1.2, "irq": 0.0, "nice": 0.0, - "soft_interrupts": 204824951, + "soft_interrupts": 212881982, "steal": 0.0, "syscalls": 0, - "system": 3.3, - "total": 26.6, - "user": 23.3} + "system": 3.8, + "total": 37.0, + "user": 33.2} Fields descriptions: @@ -348,7 +356,7 @@ Fields descriptions: Get a specific field:: # curl http://localhost:61208/api/4/cpu/total - {"total": 26.6} + {"total": 37.0} GET diskio ---------- @@ -358,10 +366,10 @@ Get plugin stats:: # curl http://localhost:61208/api/4/diskio [{"disk_name": "sda", "key": "disk_name", - "read_bytes": 99876579840, - "read_count": 5269570, - "write_bytes": 202760364032, - "write_count": 2469865}, + "read_bytes": 103780120576, + "read_count": 5592700, + "write_bytes": 205655142400, + "write_count": 2536615}, {"disk_name": "sda1", "key": "disk_name", "read_bytes": 24269824, @@ -396,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": 99876579840, - "read_count": 5269570, - "write_bytes": 202760364032, - "write_count": 2469865}]} + "read_bytes": 103780120576, + "read_count": 5592700, + "write_bytes": 205655142400, + "write_count": 2536615}]} GET folders ----------- @@ -426,13 +434,13 @@ Get plugin stats:: # curl http://localhost:61208/api/4/fs [{"device_name": "/dev/mapper/ubuntu--gnome--vg-root", - "free": 35933167616, + "free": 36362936320, "fs_type": "ext4", "key": "mnt_point", "mnt_point": "/", - "percent": 84.4, + "percent": 84.3, "size": 243334156288, - "used": 195013533696}, + "used": 194583764992}, {"device_name": "zsfpool", "free": 31195136, "fs_type": "zfs", @@ -461,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": 35933167616, + "free": 36362936320, "fs_type": "ext4", "key": "mnt_point", "mnt_point": "/", - "percent": 84.4, + "percent": 84.3, "size": 243334156288, - "used": 195013533696}]} + "used": 194583764992}]} GET gpu ------- @@ -540,7 +548,10 @@ GET load Get plugin stats:: # curl http://localhost:61208/api/4/load - {"cpucore": 4, "min1": 1.4765625, "min15": 1.560546875, "min5": 1.44580078125} + {"cpucore": 4, + "min1": 1.55322265625, + "min15": 1.49072265625, + "min5": 1.41357421875} Fields descriptions: @@ -552,7 +563,7 @@ Fields descriptions: Get a specific field:: # curl http://localhost:61208/api/4/load/min1 - {"min1": 1.4765625} + {"min1": 1.55322265625} GET mem ------- @@ -560,16 +571,16 @@ GET mem Get plugin stats:: # curl http://localhost:61208/api/4/mem - {"active": 2266718208, - "available": 2772324352, -