xref: /dpdk/usertools/dpdk-telemetry-client.py (revision bd03d3f1e4f1734c70bf6be32cdeb5e3ae6fa611)
1# SPDK-License-Identifier: BSD-3-Clause
2# Copyright(c) 2018 Intel Corporation
3
4import socket
5import os
6import sys
7import time
8
9BUFFER_SIZE = 200000
10
11METRICS_REQ = "{\"action\":0,\"command\":\"ports_all_stat_values\",\"data\":null}"
12API_REG = "{\"action\":1,\"command\":\"clients\",\"data\":{\"client_path\":\""
13API_UNREG = "{\"action\":2,\"command\":\"clients\",\"data\":{\"client_path\":\""
14DEFAULT_FP = "/var/run/dpdk/default_client"
15
16class Socket:
17
18    def __init__(self):
19        self.send_fd = socket.socket(socket.AF_UNIX, socket.SOCK_SEQPACKET)
20        self.recv_fd = socket.socket(socket.AF_UNIX, socket.SOCK_SEQPACKET)
21        self.client_fd = None
22
23    def __del__(self):
24        try:
25            self.send_fd.close()
26            self.recv_fd.close()
27            self.client_fd.close()
28        except:
29            print("Error - Sockets could not be closed")
30
31class Client:
32
33    def __init__(self): # Creates a client instance
34        self.socket = Socket()
35        self.file_path = None
36        self.choice = None
37        self.unregistered = 0
38
39    def __del__(self):
40        try:
41            if self.unregistered == 0:
42                self.unregister();
43        except:
44            print("Error - Client could not be destroyed")
45
46    def getFilepath(self, file_path): # Gets arguments from Command-Line and assigns to instance of client
47        self.file_path = file_path
48
49    def register(self): # Connects a client to DPDK-instance
50        if os.path.exists(self.file_path):
51            os.unlink(self.file_path)
52        try:
53            self.socket.recv_fd.bind(self.file_path)
54        except socket.error as msg:
55            print ("Error - Socket binding error: " + str(msg) + "\n")
56        self.socket.recv_fd.settimeout(2)
57        self.socket.send_fd.connect("/var/run/dpdk/rte/telemetry")
58        JSON = (API_REG + self.file_path + "\"}}")
59        self.socket.send_fd.sendall(JSON)
60        self.socket.recv_fd.listen(1)
61        self.socket.client_fd = self.socket.recv_fd.accept()[0]
62
63    def unregister(self): # Unregister a given client
64        self.socket.client_fd.send(API_UNREG + self.file_path + "\"}}")
65        self.socket.client_fd.close()
66
67    def requestMetrics(self): # Requests metrics for given client
68        self.socket.client_fd.send(METRICS_REQ)
69        data = self.socket.client_fd.recv(BUFFER_SIZE)
70        print "\nResponse: \n", str(data)
71
72    def repeatedlyRequestMetrics(self, sleep_time): # Recursively requests metrics for given client
73        print("\nPlease enter the number of times you'd like to continuously request Metrics:")
74        n_requests = int(input("\n:"))
75        print("\033[F") #Removes the user input from screen, cleans it up
76        print("\033[K")
77        for i in range(n_requests):
78            self.requestMetrics()
79            time.sleep(sleep_time)
80
81    def interactiveMenu(self, sleep_time): # Creates Interactive menu within the script
82        while self.choice != 3:
83            print("\nOptions Menu")
84            print("[1] Send for Metrics for all ports")
85            print("[2] Send for Metrics for all ports recursively")
86            print("[3] Unregister client")
87
88            try:
89                self.choice = int(input("\n:"))
90                print("\033[F") #Removes the user input for screen, cleans it up
91                print("\033[K")
92                if self.choice == 1:
93                    self.requestMetrics()
94                elif self.choice == 2:
95                    self.repeatedlyRequestMetrics(sleep_time)
96                elif self.choice == 3:
97                    self.unregister()
98                    self.unregistered = 1
99                else:
100                    print("Error - Invalid request choice")
101            except:
102                pass
103
104if __name__ == "__main__":
105
106    sleep_time = 1
107    file_path = ""
108    if (len(sys.argv) == 2):
109	file_path = sys.argv[1]
110    else:
111        print("Warning - No filepath passed, using default (" + DEFAULT_FP + ").")
112	file_path = DEFAULT_FP
113    client = Client()
114    client.getFilepath(file_path)
115    client.register()
116    client.interactiveMenu(sleep_time)
117