usertools: add new telemetry script
authorBruce Richardson <bruce.richardson@intel.com>
Thu, 30 Apr 2020 16:01:28 +0000 (17:01 +0100)
committerThomas Monjalon <thomas@monjalon.net>
Sun, 10 May 2020 21:56:47 +0000 (23:56 +0200)
This patch adds a python script that can be used with the new telemetry
socket. It connects as a client to the socket, and allows the user send
a command and see the JSON response.

The example usage below shows the script connecting to the new telemetry
socket, and sending three default telemetry commands entered by the user.
The response for each command is shown below the user input.

Connecting to /var/run/dpdk/rte/dpdk_telemetry.v2
{"version": "DPDK 20.05.0-rc0", "pid": 32794, "max_output_len": 16384}
--> /
{"/": ["/", "/help", "/info"]}
--> /info
{"/info": {"version": "DPDK 20.05.0-rc0", "pid": 32794, \
    "max_output_len": 16384}}
--> /help,/info
{"/help": {"/info": "Returns DPDK Telemetry information. \
    Takes no parameters"}}

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
Signed-off-by: Ciara Power <ciara.power@intel.com>
Reviewed-by: Keith Wiles <keith.wiles@intel.com>
MAINTAINERS
usertools/dpdk-telemetry.py [new file with mode: 0755]
usertools/meson.build

index d20d86d..94c290f 100644 (file)
@@ -1463,7 +1463,7 @@ Telemetry - EXPERIMENTAL
 M: Kevin Laatz <kevin.laatz@intel.com>
 F: lib/librte_telemetry/
 F: app/test/test_telemetry*
-F: usertools/dpdk-telemetry-client.py
+F: usertools/dpdk-telemetry*
 F: doc/guides/howto/telemetry.rst
 
 BPF - EXPERIMENTAL
diff --git a/usertools/dpdk-telemetry.py b/usertools/dpdk-telemetry.py
new file mode 100755 (executable)
index 0000000..afbf01b
--- /dev/null
@@ -0,0 +1,83 @@
+#! /usr/bin/python3
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright(c) 2020 Intel Corporation
+
+"""
+Script to be used with V2 Telemetry.
+Allows the user input commands and read the Telemetry response.
+"""
+
+import socket
+import os
+import glob
+import json
+import readline
+
+# global vars
+TELEMETRY_VERSION = "v2"
+CMDS = []
+
+
+def read_socket(sock, buf_len, echo=True):
+    """ Read data from socket and return it in JSON format """
+    reply = sock.recv(buf_len).decode()
+    try:
+        ret = json.loads(reply)
+    except json.JSONDecodeError:
+        print("Error in reply: ", reply)
+        sock.close()
+        raise
+    if echo:
+        print(json.dumps(ret))
+    return ret
+
+
+def handle_socket(path):
+    """ Connect to socket and handle user input """
+    sock = socket.socket(socket.AF_UNIX, socket.SOCK_SEQPACKET)
+    global CMDS
+    print("Connecting to " + path)
+    try:
+        sock.connect(path)
+    except OSError:
+        print("Error connecting to " + path)
+        sock.close()
+        return
+    json_reply = read_socket(sock, 1024)
+    output_buf_len = json_reply["max_output_len"]
+
+    # get list of commands for readline completion
+    sock.send("/".encode())
+    CMDS = read_socket(sock, output_buf_len, False)["/"]
+
+    # interactive prompt
+    text = input('--> ').strip()
+    while text != "quit":
+        if text.startswith('/'):
+            sock.send(text.encode())
+            read_socket(sock, output_buf_len)
+        text = input('--> ').strip()
+    sock.close()
+
+
+def readline_complete(text, state):
+    """ Find any matching commands from the list based on user input """
+    all_cmds = ['quit'] + CMDS
+    if text:
+        matches = [c for c in all_cmds if c.startswith(text)]
+    else:
+        matches = all_cmds
+    return matches[state]
+
+
+readline.parse_and_bind('tab: complete')
+readline.set_completer(readline_complete)
+readline.set_completer_delims(readline.get_completer_delims().replace('/', ''))
+
+# Path to sockets for processes run as a root user
+for f in glob.glob('/var/run/dpdk/*/dpdk_telemetry.%s' % TELEMETRY_VERSION):
+    handle_socket(f)
+# Path to sockets for processes run as a regular user
+for f in glob.glob('/run/user/%d/dpdk/*/dpdk_telemetry.%s' %
+                   (os.getuid(), TELEMETRY_VERSION)):
+    handle_socket(f)
index 149e788..64e2723 100644 (file)
@@ -1,4 +1,4 @@
 # SPDX-License-Identifier: BSD-3-Clause
 # Copyright(c) 2017 Intel Corporation
 
-install_data(['dpdk-devbind.py', 'dpdk-pmdinfo.py'], install_dir: 'bin')
+install_data(['dpdk-devbind.py', 'dpdk-pmdinfo.py', 'dpdk-telemetry.py'], install_dir: 'bin')