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.