usertools: add new telemetry script

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>
This commit is contained in:
Bruce Richardson 2020-04-30 17:01:28 +01:00 committed by Thomas Monjalon
parent f38748736e
commit 6a2967c112
3 changed files with 85 additions and 2 deletions

View 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

83
usertools/dpdk-telemetry.py Executable file
View file

@ -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)

View 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')