]> git.droids-corp.org - dpdk.git/commitdiff
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 d20d86dbb2aed603ee8ddc70be413a7df0b0bd94..94c290fb25d33468363b94ac4e8ee454b3dbd14a 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 149e788e3d5943e86481eec49c219fcf3e1f3d34..64e27238f45b246156fa0db412fd9491ac93d048 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')