Neha,
I tried this [1] and it works with output like this [2] in the latest VPP
branch. You should follow the instructions in
https://wiki.fd.io/view/VPP/Python_API for setting up python VPP module and
running the script.
I will update the wiki with this.
Thanks,
Shwetha
1]
from vpp_papi import VPP
import os
import sys
import fnmatch
import time
def papi_event_handler(msgname, result):
print(msgname)
print(result)
vpp_json_dir = os.environ['VPP'] +
'/build-root/install-vpp_debug-native/vpp/share/vpp/api/core'
# construct a list of all the json api files
jsonfiles = []
for root, dirnames, filenames in os.walk(vpp_json_dir):
for filename in fnmatch.filter(filenames, '*.api.json'):
jsonfiles.append(os.path.join(vpp_json_dir, filename))
if not jsonfiles:
print('Error: no json api files found')
exit(-1)
# use all those files to create vpp.
vpp = VPP(jsonfiles)
r = vpp.connect("test_papi")
print(r)
async=True
r=vpp.register_event_callback(papi_event_handler)
pid=os.getpid()
sw_ifs = [1,2,3,4,5,6,7]
r = vpp.api.want_per_interface_simple_stats(enable_disable=True, sw_ifs=sw_ifs,
num=len(sw_ifs), pid=pid)
print(r)
# Wait for some stats
time.sleep(60)
r = vpp.api.want_per_interface_simple_stats(enable_disable=False)
r = vpp.disconnect()
2]
>sudo -E LD_LIBRARY_PATH=$LD_LIBRARY_PATH $VPP/virtualenv/bin/python
>test_simple_stats.py
0
want_per_interface_simple_stats_reply(_0=818, context=1, retval=0)
vnet_per_interface_simple_counters
vnet_per_interface_simple_counters(_0=843, count=1, timestamp=158137,
data=[vl_api_vnet_simple_counter_t(sw_if_index=7, drop=0, punt=0, rx_ip4=0,
rx_ip6=0, rx_no_buffer=0, rx_miss=0, rx_error=0, tx_error=0, rx_mpls=0)])
vnet_per_interface_simple_counters
vnet_per_interface_simple_counters(_0=843, count=1, timestamp=158137,
data=[vl_api_vnet_simple_counter_t(sw_if_index=5, drop=0, punt=0, rx_ip4=0,
rx_ip6=0, rx_no_buffer=0, rx_miss=0, rx_error=0, tx_error=0, rx_mpls=0)])
vnet_per_interface_simple_counters
vnet_per_interface_simple_counters(_0=843, count=1, timestamp=158137,
data=[vl_api_vnet_simple_counter_t(sw_if_index=6, drop=0, punt=0, rx_ip4=0,
rx_ip6=0, rx_no_buffer=0, rx_miss=0, rx_error=0, tx_error=0, rx_mpls=0)])
vnet_per_interface_simple_counters
vnet_per_interface_simple_counters(_0=843, count=1, timestamp=158137,
data=[vl_api_vnet_simple_counter_t(sw_if_index=3, drop=0, punt=0, rx_ip4=0,
rx_ip6=0, rx_no_buffer=0, rx_miss=0, rx_error=0, tx_error=0, rx_mpls=0)])
vnet_per_interface_simple_counters
vnet_per_interface_simple_counters(_0=843, count=1, timestamp=158137,
data=[vl_api_vnet_simple_counter_t(sw_if_index=1, drop=0, punt=0, rx_ip4=0,
rx_ip6=0, rx_no_buffer=0, rx_miss=0, rx_error=0, tx_error=0, rx_mpls=0)])
vnet_per_interface_simple_counters
vnet_per_interface_simple_counters(_0=843, count=1, timestamp=158137,
data=[vl_api_vnet_simple_counter_t(sw_if_index=4, drop=0, punt=0, rx_ip4=0,
rx_ip6=0, rx_no_buffer=0, rx_miss=0, rx_error=0, tx_error=0, rx_mpls=0)])
vnet_per_interface_simple_counters
vnet_per_interface_simple_counters(_0=843, count=1, timestamp=158137,
data=[vl_api_vnet_simple_counter_t(sw_if_index=2, drop=0, punt=0, rx_ip4=0,
rx_ip6=0, rx_no_buffer=0, rx_miss=0, rx_error=0, tx_error=0, rx_mpls=0)])
vnet_per_interface_simple_counters
vnet_per_interface_simple_counters(_0=843, count=1, timestamp=158147,
data=[vl_api_vnet_simple_counter_t(sw_if_index=7, drop=0, punt=0, rx_ip4=0,
rx_ip6=0, rx_no_buffer=0, rx_miss=0, rx_error=0, tx_error=0, rx_mpls=0)])
vnet_per_interface_simple_counters
vnet_per_interface_simple_counters(_0=843, count=1, timestamp=158147,
data=[vl_api_vnet_simple_counter_t(sw_if_index=5, drop=0, punt=0, rx_ip4=0,
rx_ip6=0, rx_no_buffer=0, rx_miss=0, rx_error=0, tx_error=0, rx_mpls=0)])
vnet_per_interface_simple_counters
vnet_per_interface_simple_counters(_0=843, count=1, timestamp=158147,
data=[vl_api_vnet_simple_counter_t(sw_if_index=6, drop=0, punt=0, rx_ip4=0,
rx_ip6=0, rx_no_buffer=0, rx_miss=0, rx_error=0, tx_error=0, rx_mpls=0)])
vnet_per_interface_simple_counters
vnet_per_interface_simple_counters(_0=843, count=1, timestamp=158147,
data=[vl_api_vnet_simple_counter_t(sw_if_index=3, drop=0, punt=0, rx_ip4=0,
rx_ip6=0, rx_no_buffer=0, rx_miss=0, rx_error=0, tx_error=0, rx_mpls=0)])
vnet_per_interface_simple_counters
vnet_per_interface_simple_counters(_0=843, count=1, timestamp=158147,
data=[vl_api_vnet_simple_counter_t(sw_if_index=1, drop=0, punt=0, rx_ip4=0,
rx_ip6=0, rx_no_buffer=0, rx_miss=0, rx_error=0, tx_error=0, rx_mpls=0)])
vnet_per_interface_simple_counters
vnet_per_interface_simple_counters(_0=843, count=1, timestamp=158147,
data=[vl_api_vnet_simple_counter_t(sw_if_index=4, drop=0, punt=0, rx_ip4=0,
rx_ip6=0, rx_no_buffer=0, rx_miss=0, rx_error=0, tx_error=0, rx_mpls=0)])
vnet_per_interface_simple_counters
vnet_per_interface_simple_counters(_0=843, count=1, timestamp=158147,
data=[vl_api_vnet_simple_counter_t(sw_if_index=2, drop=0, punt=0, rx_ip4=0,
rx_ip6=0, rx_no_buffer=0, rx_miss=0, rx_error=0, tx_error=0, rx_mpls=0)])
From: <[email protected]> on behalf of Neha <[email protected]>
Date: Thursday, July 12, 2018 at 9:46 AM
To: Shwetha bhandari <[email protected]>, Ole Troan <[email protected]>
Cc: "[email protected]" <[email protected]>
Subject: Re: [vpp-dev] VPP python binding for getting interface stats in VPP
18.07
Hi,
I verified that values for ‘show api client’ and ‘os.getpid’ are same. But
this issue is seen in all the want_* functions.
The example provided in https://wiki.fd.io/view/VPP/Python_API does not work.
Also, examples provided in ‘src/vpp-api/python/tests/test_papi.py’ is also
failing. There is no such class ‘vpe’ in vpp_papi.py (result.vl_msg_id ==
vpp_papi.vpe.VL_API_SW_INTERFACE_SET_FLAGS).
Can you please share working example for getting statistics from interface
using want_stats functions?
Regards,
Neha
From: Shwetha Bhandari (shwethab) [mailto:[email protected]]
Sent: Tuesday, July 10, 2018 2:37 PM
To: Vadnere, Neha R <[email protected]>; Ole Troan <[email protected]>
Cc: [email protected]
Subject: Re: [vpp-dev] VPP python binding for getting interface stats in VPP
18.07
Hi Neha,
You should provide the PID of the process that wants to receive the callbacks
for the want apis not the PID of the vpp.
Look at the API documentation <VPP>/src/vpp /stats/stats.api. Something like
pid=os.getpid() instead of the VPP PID in the code snippet below will fix it.
Also the callback (papi_event_handler) accepts msgname, result, change it in
the below code snippet.
On the VPP side you can check “show api client” to check if the python client
is connected.
Thanks,
Shwetha
From: <[email protected]<mailto:[email protected]>> on behalf of Neha
<[email protected]<mailto:[email protected]>>
Date: Tuesday, July 10, 2018 at 11:46 AM
To: Ole Troan <[email protected]<mailto:[email protected]>>
Cc: "[email protected]<mailto:[email protected]>"
<[email protected]<mailto:[email protected]>>
Subject: Re: [vpp-dev] VPP python binding for getting interface stats in VPP
18.07
Hi,
This is the code snippet: (As explained in
https://wiki.fd.io/view/VPP/Python_API).
from vpp_papi import VPP
def papi_event_handler(result):
if result.vl_msg_id == vpp_papi.VL_API_VNET_INTERFACE_SIMPLE_COUNTERS:
format = '>' + str(int(len(result.data) / 8)) + 'Q'
counters = struct.unpack(format, result.data)
print('Counters:', counters)
return
print('Unknown message id:', result.vl_msg_id)
vpp_json_dir = os.environ['VPP'] +
'/build-root/install-vpp_debug-native/vpp/share/vpp/api/core'
# construct a list of all the json api files
jsonfiles = []
for root, dirnames, filenames in os.walk(vpp_json_dir):
for filename in fnmatch.filter(filenames, '*.api.json'):
jsonfiles.append(os.path.join(vpp_json_dir, filename))
if not jsonfiles:
print('Error: no json api files found')
exit(-1)
# use all those files to create vpp.
# Note that there will be no vpp method available before vpp.connect()
vpp = VPP(jsonfiles)
r = vpp.connect("test_papi")
print(r)
async=True
r=vpp.register_event_callback(papi_event_handler)
enable_disable = True
pid=85821 #This is pid of vpp process
r = vpp.api.want_stats()
r=vpp.register_event_callback(papi_event_handler)
sw_ifs=0
num=1
r = vpp.api.want_per_interface_simple_stats()
print(r)
sw_if_index=1
enable_disable=True
r = vpp.api.collect_detailed_interface_stats()
print(r)
#vpp.api.stats_enable_disable()
r=vpp.api.vnet_get_summary_stats()
print(r)
#
# Wait for some stats
#
time.sleep(60)
enale_disable = False
pid=85821
r = vpp.api.want_stats()
r = vpp.disconnect()
Regards,
Neha
From: Ole Troan [mailto:[email protected]]
Sent: Monday, July 9, 2018 12:45 PM
To: Vadnere, Neha R <[email protected]<mailto:[email protected]>>
Cc: [email protected]<mailto:[email protected]>
Subject: Re: [vpp-dev] VPP python binding for getting interface stats in VPP
18.07
Hi Neha,
Can you share your code?
Alternatively look around in the test/ directory for examples.
Cheers
Ole
On 9 Jul 2018, at 08:37, Neha
<[email protected]<mailto:[email protected]>> wrote:
Hi Ole,
If that is correct, why I am not able to see the stats? ( I am waiting for 60
sec for getting the stats)
Regards,
Neha
From: Ole Troan [mailto:[email protected]]
Sent: Monday, July 9, 2018 12:03 PM
To: Vadnere, Neha R <[email protected]<mailto:[email protected]>>
Cc: [email protected]<mailto:[email protected]>
Subject: Re: [vpp-dev] VPP python binding for getting interface stats in VPP
18.07
Neha,
On 9 Jul 2018, at 07:26, Neha
<[email protected]<mailto:[email protected]>> wrote:
Hi,
I want to get stats from vpp python api. I am following instructions as
specified in https://wiki.fd.io/view/VPP/Python_API. I am able to get other
info as interface details etc. which uses dump and req/rep messages.
vpp_papi.register_event_callback(papi_event_handler) does not call the callback
function specified, when want_stats is called.
In https://www.mail-archive.com/[email protected]/msg03819.html it is
mentioned
1.) client -> want_stats -> vpp
2.) vpp -> want_stats_reply -> client (confirms subscription)
3.) vpp -> <various stats messages> -> client (when timer fires)
in step 3.), client needs to read the shared memory queue in the
vpp->client direction (or use the appropriate XXX_read() function). Note
that stats take a few seconds to arrive (the test programs require
10-15 seconds of runtime to get some stats).
But not sure where these read_from_shared_mem functions are. I assumed that
want_stats will send the stats when enabled.
Please guide on this.
That’s correct, the Python language binding takes care of reading from shared
memory.
Sounds like you have done everything right.
Cheers
Ole
Regards,
Neha
-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#9801): https://lists.fd.io/g/vpp-dev/message/9801
Mute This Topic: https://lists.fd.io/mt/23196484/675193
Group Owner: [email protected]<mailto:[email protected]>
Unsubscribe: https://lists.fd.io/g/vpp-dev/unsub
[[email protected]<mailto:[email protected]>]
-=-=-=-=-=-=-=-=-=-=-=-
-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#9803): https://lists.fd.io/g/vpp-dev/message/9803
Mute This Topic: https://lists.fd.io/mt/23196484/675193
Group Owner: [email protected]<mailto:[email protected]>
Unsubscribe: https://lists.fd.io/g/vpp-dev/unsub
[[email protected]<mailto:[email protected]>]
-=-=-=-=-=-=-=-=-=-=-=-
-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#9826): https://lists.fd.io/g/vpp-dev/message/9826
Mute This Topic: https://lists.fd.io/mt/23196484/21656
Group Owner: [email protected]
Unsubscribe: https://lists.fd.io/g/vpp-dev/unsub [[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-