Currently, the dpdk-telemetry.py show json in raw format under
interactive mode, which is not good for human reading.

E.g. The command '/ethdev/xstats,0' will output:
{"/ethdev/xstats": {"rx_good_packets": 0, "tx_good_packets": 0,
"rx_good_bytes": 0, "tx_good_bytes": 0, "rx_missed_errors": 0,
"rx_errors": 0, "tx_errors": 0, "rx_mbuf_allocation_errors": 0,
"rx_q0_packets": 0,...}}

This patch supports json pretty print by adding extra indent=2
parameter under interactive mode, so the same command will output:
{
  "/ethdev/xstats": {
    "rx_good_packets": 0,
    "tx_good_packets": 0,
    "rx_good_bytes": 0,
    "tx_good_bytes": 0,
    "rx_missed_errors": 0,
    "rx_errors": 0,
    "rx_mbuf_allocation_errors": 0,
    "rx_q0_packets": 0,
    ...
  }
}

Note: the non-interactive mode is made machine-readable and remains the
original way (it means don't use indent to pretty print).

Signed-off-by: Chengwen Feng <fengcheng...@huawei.com>
Acked-by: David Marchand <david.march...@redhat.com>
Acked-by: Ciara Power <ciara.po...@intel.com>

---
v3: indent modify to 2 and make sure indent under interactive mode
according comments.
v2: fix typo of output.

---
 usertools/dpdk-telemetry.py | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/usertools/dpdk-telemetry.py b/usertools/dpdk-telemetry.py
index a81868a547..568f222a03 100755
--- a/usertools/dpdk-telemetry.py
+++ b/usertools/dpdk-telemetry.py
@@ -23,7 +23,7 @@
 CMDS = []
 
 
-def read_socket(sock, buf_len, echo=True):
+def read_socket(sock, buf_len, echo=True, pretty=False):
     """ Read data from socket and return it in JSON format """
     reply = sock.recv(buf_len).decode()
     try:
@@ -33,7 +33,8 @@ def read_socket(sock, buf_len, echo=True):
         sock.close()
         raise
     if echo:
-        print(json.dumps(ret))
+        indent = 2 if pretty else None
+        print(json.dumps(ret, indent=indent))
     return ret
 
 
@@ -127,7 +128,7 @@ def handle_socket(args, path):
         else:
             list_fp()
         return
-    json_reply = read_socket(sock, 1024, prompt)
+    json_reply = read_socket(sock, 1024, prompt, prompt)
     output_buf_len = json_reply["max_output_len"]
     app_name = get_app_name(json_reply["pid"])
     if app_name and prompt:
@@ -143,7 +144,7 @@ def handle_socket(args, path):
         while text != "quit":
             if text.startswith('/'):
                 sock.send(text.encode())
-                read_socket(sock, output_buf_len)
+                read_socket(sock, output_buf_len, pretty=prompt)
             text = input(prompt).strip()
     except EOFError:
         pass
-- 
2.17.1

Reply via email to