On Mon, 5 Jan 2026 17:55:58 +0000 Bruce Richardson <[email protected]> wrote:
> TL;DR > ------ > > For a quick demo, apply patches, run e.g. testpmd and then in a separate > terminal run: > > ./usertools/dpdk-telemetry-watcher.py -d1T eth.tx > > Output, updated once per second, will be traffic rate per port e.g.: > > Connected to application: "dpdk-testpmd" > Time /ethdev/stats,0.opackets /ethdev/stats,1.opackets Total > 16:29:12 5,213,119 5,214,304 10,427,423 > > > Fuller details > -------------- > > While we have the dpdk-telemetry.py CLI app for interactive querying of > telemetry on the commandline, and a telemetry exporter script for > sending telemetry to external tools for real-time monitoring, we don't > have an app that can print real-time stats for DPDK apps on the > terminal. This patchset adds such a script, developed with the help of > Github copilot to fill a need that I found in my testing. Submitting it > here in the hopes that others find it of use. > > The script acts as a wrapper around the existing dpdk-telemetry.py > script, and pipes the commands to that script and reads the responses, > querying it once per second. It takes a number of flag parameters, such > as the ones above: > - "-d" for delta values, i.e. PPS rather than total packets > - "-1" for single-line output, i.e. no scrolling up the screen > - "-T" to display a total column > > Other flag parameters can be seen by looking at the help output. > > Beyond the flags, the script also takes a number of positional > parameters, which refer to specific stats to display. These stats must > be numeric values, and should take the form of the telemetry command to > send, followed by a "." and the stat within the result which is to be > tracked. As above, a stat would be e.g. "/ethdev/stats,0.opackets", > where we send "/ethdev/stats,0" to telemetry and extract the "opackets" > part of the result. > > However, specifying individual stats can be awkward, so some shortcuts > are provided too for the common case of monitoring ethernet ports. Any > positional arg starting with "eth" will be replaced by the set of > equivalent values for each port, e.g. "eth.imissed" will track the > imissed value on all ports in use in the app. The ipackets and opackets > values, as common metrics, are also available as shortened values as > just "rx" and "tx", so in the example above, "eth.tx" means to track the > opackets stat for every ethdev port. > > Finally, the script also has reconnection support so you can leave it > running while you start and stop your application in another terminal. > The watcher will try and reconnect to a running instance every second. > > v2: > - improve reconnection handling, eliminating some crashes seen in testing. > > Bruce Richardson (7): > usertools: add new script to monitor telemetry on terminal > usertools/telemetry-watcher: add displaying stats > usertools/telemetry-watcher: add delta and timeout opts > usertools/telemetry-watcher: add total and one-line opts > usertools/telemetry-watcher: add thousands separator > usertools/telemetry-watcher: add eth name shortcuts > usertools/telemetry-watcher: support reconnection > > usertools/dpdk-telemetry-watcher.py | 435 ++++++++++++++++++++++++++++ > usertools/meson.build | 1 + > 2 files changed, 436 insertions(+) > create mode 100755 usertools/dpdk-telemetry-watcher.py > > -- > 2.51.0 Series-Acked-by: Stephen Hemminger <[email protected]> Automated patch review reports some things that could be added. ## DPDK Patch Review: Telemetry Watcher (v2, 7 patches) **Submitter:** Bruce Richardson <[email protected]> **Series:** [PATCH v2 1-7/7] usertools: add telemetry watcher script --- ### Overall Summary This is a well-structured patch series adding a new Python script (`dpdk-telemetry-watcher.py`) to monitor DPDK telemetry statistics on the command line. The series progressively builds up functionality across 7 commits, making the series bisectable. --- ### Patch-by-Patch Review #### **Patch 1/7: usertools: add new script to monitor telemetry on terminal** | Check | Status | Notes | |-------|--------|-------| | Subject ≤60 chars | ✅ PASS | 53 characters | | Lowercase after colon | ✅ PASS | | | Imperative mood | ✅ PASS | "add new script" | | No trailing period | ✅ PASS | | | Signed-off-by | ✅ PASS | | | Body doesn't start with "It" | ✅ PASS | Starts with "The" | | SPDX license | ✅ PASS | BSD-3-Clause on line 2 (correct for shebang script) | | Copyright line | ✅ PASS | | | Blank line after copyright | ✅ PASS | | **Warning (should fix):** - **Line 178**: Unnecessary f-string prefix: ```python print(f"Error: Python interpreter or script not found", file=sys.stderr) ``` Should be: ```python print("Error: Python interpreter or script not found", file=sys.stderr) ``` #### **Patch 2/7: usertools/telemetry-watcher: add displaying stats** | Check | Status | Notes | |-------|--------|-------| | Subject ≤60 chars | ✅ PASS | 47 characters | | Signed-off-by | ✅ PASS | | | Body wrapping | ✅ PASS | Wrapped at 75 chars | ✅ No issues found. #### **Patch 3/7: usertools/telemetry-watcher: add delta and timeout opts** | Check | Status | Notes | |-------|--------|-------| | Subject ≤60 chars | ✅ PASS | 55 characters | | Signed-off-by | ✅ PASS | | ✅ No issues found. #### **Patch 4/7: usertools/telemetry-watcher: add total and one-line opts** | Check | Status | Notes | |-------|--------|-------| | Subject ≤60 chars | ✅ PASS | 56 characters | | Signed-off-by | ✅ PASS | | ✅ No issues found. #### **Patch 5/7: usertools/telemetry-watcher: add thousands separator** | Check | Status | Notes | |-------|--------|-------| | Subject ≤60 chars | ✅ PASS | 51 characters | | Signed-off-by | ✅ PASS | | ✅ No issues found. #### **Patch 6/7: usertools/telemetry-watcher: add eth name shortcuts** | Check | Status | Notes | |-------|--------|-------| | Subject ≤60 chars | ✅ PASS | 50 characters | | Signed-off-by | ✅ PASS | | **Info (consider):** - Line 1124: f-string without interpolation: ```python print(f"Error: Failed to get ethernet device list", file=sys.stderr) ``` #### **Patch 7/7: usertools/telemetry-watcher: support reconnection** | Check | Status | Notes | |-------|--------|-------| | Subject ≤60 chars | ✅ PASS | 48 characters | | Signed-off-by | ✅ PASS | | **Info (consider):** - Lines 1243-1244: Dynamically adding attributes to `subprocess.Popen` object: ```python process.script = telemetry_script process.args = args_list ``` This works but could be cleaner using a wrapper class or dataclass to hold the process and its metadata together. --- ### Series-Level Issues #### **Warning: Missing Documentation** Per AGENTS.md: *"Code and documentation must be updated atomically in same patch"* and *"Documentation must match the code"* The series adds a new usertool but does not include documentation updates. Consider adding: - Usage documentation in `doc/guides/tools/` describing the new script - Entry in the tools index #### **Warning: Missing Release Notes** Per AGENTS.md: *"New drivers or subsystems must have release notes"* and *"Current release notes updated for significant changes"* A new usertools script should be mentioned in `doc/guides/rel_notes/release_XX_XX.rst` under a section like "New Features" or similar. #### **Info: meson.build List Ordering** In patch 1/7, the addition to `usertools/meson.build`: ```python 'dpdk-hugepages.py', 'dpdk-rss-flows.py', 'dpdk-telemetry-exporter.py', + 'dpdk-telemetry-watcher.py', ``` Per AGENTS.md: *"Lists alphabetically ordered"*. The insertion is correctly placed alphabetically between `dpdk-telemetry-exporter.py` and the end. ✅ --- ### Code Quality Observations **Positive:** - Clean incremental commits that are individually bisectable - Good docstrings on functions - Proper error handling with messages to stderr - Sensible defaults for optional arguments - Good use of argparse for CLI handling **Info (minor suggestions):** 1. The reconnection logic in patch 7/7 could benefit from exponential backoff instead of fixed 1-second retries 2. Consider adding `--help` examples in the epilog of argparse --- ### Summary Table | Severity | Count | Items | |----------|-------|-------| | **Error** | 0 | None | | **Warning** | 3 | Missing documentation, missing release notes, unnecessary f-string (1/7 line 178) | | **Info** | 3 | Unnecessary f-string (6/7), dynamic attribute assignment style (7/7), reconnection backoff | --- ### Recommendation **Acked-by candidate** with minor fixes needed: 1. Remove unnecessary f-string prefix in patch 1/7 line 178 2. Add documentation for the new tool 3. Add release notes entry The code itself is well-written and the series structure is good. The issues are primarily around the documentation requirements rather than technical problems with the implementation.

