Python as a DTrace consumer – Part 2 walk the aggregate
October 8th, 2011 • Comments Off on Python as a DTrace consumer – Part 2 walk the aggregateYesterday I blogged about how to use Python as a DTrace consumer with the help of ctypes. The examples in there are very rudimentary and only captured the normal output of DTrace – not the aggregates.
The examples in the last post have been altered and now we let DTrace work for a few seconds and then walk the aggregate:
# aggregate data for a few sec...
i = 0
chew = CHEW_FUNC(chew_func)
chew_rec = CHEWREC_FUNC(chewrec_func)
while i < 2:
LIBRARY.dtrace_sleep(handle)
LIBRARY.dtrace_work(handle, None, chew, chew_rec, None)
time.sleep(1)
i += 1
LIBRARY.dtrace_stop(handle)
walk_func = WALK_FUNC(walk)
# sorting instead of dtrace_aggregate_walk
if LIBRARY.dtrace_aggregate_walk_valsorted(handle, walk_func, None) != 0:
txt = LIBRARY.dtrace_errmsg(handle, LIBRARY.dtrace_errno(handle))
raise Exception(c_char_p(txt).value)
The walk function is right now very simple but does work – please note the TODO 🙂
def walk(data, arg):
'''
Aggregate walker.
'''
# TODO: pickup the 16 and 272 from offset in dtrace_aggdesc struct...
tmp = data.contents.dtada_data
name = cast(tmp + 16, c_char_p).value
instance = deref(tmp + 272, c_int).value
print '+--> walking', name, instance
return 0
When run the Python script will output (Would be fun to run this DTrace script with the help of Python – Python as a DTrace consumer tracing Python as DTrace provider :-P):
./dtrace.py +--> In chew: cpu : 0 +--> In out: Hello World +--> walking updatemanagernot 2 +--> walking mixer_applet2 4 +--> walking gnome-netstatus- 135 +--> walking firefox-bin 139 +--> walking gnome-terminal 299 +--> walking python2.7 545 Error 0
Overall this works pretty smoothly – but needs a lot of updating before it is production ready – Still it gives an rough overview that Python can be a simple DTrace consumer while using ctypes. So now Python can be consumer and provider for DTrace *happy days* 🙂
The code (examples) have been updated on github.