Since an expected main use of the script is to monitor ethdev packet stats, provide a shortened form of parameters to make it easier to monitor all ports on the system. Any stat starting with "eth." is taken not as a direct command, but instead as a shortcut for getting the stats for all ports on the system. For example: eth.ibytes shows the byte counts for all ports.
Beyond that, provide a shortcut for ipackets and opackets as just rx and tx respectively. Therefore, to monitor the output rate of an app, one can use "dpdk-telemetry-watcher -dT eth.tx" Signed-off-by: Bruce Richardson <[email protected]> Acked-by: Stephen Hemminger <[email protected]> --- doc/guides/tools/telemetrywatcher.rst | 33 ++++++++++++++++++ usertools/dpdk-telemetry-watcher.py | 49 ++++++++++++++++++++++++++- 2 files changed, 81 insertions(+), 1 deletion(-) diff --git a/doc/guides/tools/telemetrywatcher.rst b/doc/guides/tools/telemetrywatcher.rst index 3d22818260..99e51881ff 100644 --- a/doc/guides/tools/telemetrywatcher.rst +++ b/doc/guides/tools/telemetrywatcher.rst @@ -96,6 +96,19 @@ Example telemetry commands: See `Examples`_ section for usage examples based on the results of these telemetry commands. +Shortcuts +--------- + +The tool provides convenient shortcuts for common statistics: + +* ``eth.rx`` - Expands to ``/ethdev/stats,N.ipackets`` for all ethernet devices +* ``eth.tx`` - Expands to ``/ethdev/stats,N.opackets`` for all ethernet devices +* ``eth.FIELD`` - Expands to ``/ethdev/stats,N.FIELD`` for all ethernet devices + +These shortcuts automatically detect all available ethernet devices +and create a column for each one. + + Examples -------- @@ -107,10 +120,30 @@ Monitor received and transmitted packets on device 0:: dpdk-telemetry-watcher.py /ethdev/stats,0.ipackets /ethdev/stats,0.opackets +Monitor received packets on all ethernet devices using shortcut:: + + dpdk-telemetry-watcher.py eth.rx + +Monitor packet deltas (rates) for device 0:: + + dpdk-telemetry-watcher.py -d /ethdev/stats,0.ipackets /ethdev/stats,0.opackets + +Monitor with a total column showing aggregate traffic:: + + dpdk-telemetry-watcher.py -d -T eth.rx eth.tx + +Monitor for a specific duration (60 iterations = 60 seconds):: + + dpdk-telemetry-watcher.py -t 60 /ethdev/stats,0.ipackets + Monitor a DPDK application with a custom file-prefix:: dpdk-telemetry-watcher.py -f myapp /ethdev/stats,0.ipackets +Monitor in single-line mode (no scrolling):: + + dpdk-telemetry-watcher.py -1 -d eth.rx eth.tx + List all running DPDK applications:: dpdk-telemetry-watcher.py -l diff --git a/usertools/dpdk-telemetry-watcher.py b/usertools/dpdk-telemetry-watcher.py index 7ec7267a38..9685ffa01f 100755 --- a/usertools/dpdk-telemetry-watcher.py +++ b/usertools/dpdk-telemetry-watcher.py @@ -139,6 +139,48 @@ def print_connected_app(process): print(f'Connected to application: "{app_name}"') +def expand_shortcuts(process, stat_specs): + """Expand special shortcuts like eth.rx and eth.tx into actual stat specifications. + + Args: + process: The subprocess.Popen handle to the telemetry process + stat_specs: List of stat specifications, possibly including shortcuts + + Returns: + List of expanded stat specifications + """ + expanded = [] + for spec in stat_specs: + if not spec.startswith("eth."): + expanded.append(spec) + continue + + # Extract the field name after "eth." + field = spec[4:] # Remove "eth." prefix + if not field: + print(f"Error: Invalid shortcut '{spec}' - missing field name", file=sys.stderr) + return None + + # Map common shortcuts to actual field names + field_map = { + "rx": "ipackets", + "tx": "opackets", + } + field = field_map.get(field, field) + + # Get list of ethernet devices + port_list = query_telemetry(process, "/ethdev/list") + if not isinstance(port_list, list): + print(f"Error: Failed to get ethernet device list", file=sys.stderr) + return None + + # Create stat specs for each port + for port in port_list: + expanded.append(f"/ethdev/stats,{port}.{field}") + + return expanded + + def validate_stats(process, stat_specs): """Validate stat specifications and check that fields are numeric. @@ -202,8 +244,13 @@ def monitor_stats(process, args): process: The subprocess.Popen handle to the telemetry process args: Parsed command line arguments """ + # Expand any shortcuts like eth-rx, eth-tx + expanded_stats = expand_shortcuts(process, args.stats) + if not expanded_stats: + return + # Validate all stat specifications and get initial values - parsed_specs, prev_values = validate_stats(process, args.stats) + parsed_specs, prev_values = validate_stats(process, expanded_stats) if not parsed_specs: return -- 2.51.0

