Introducing: Ruby Minstrel - a method instrumenter
Posted Mon, 15 Nov 2010
Sometimes I'm trying to debug a ruby library or application, and I end up monkeypatching things just to see what arguments are being passed as a away of sanity checking configuration or correctness. Other times I want to profile the time spent only in a certain class, or method, etc. At a basic level, I'm looking for a simple ltrace equivalent in ruby.
Enter minstrel. There may be projects out there already that do this, but I don't know of one, so it got written tonight.
My standard path of debugging (without other options) is to sanity check my code and then dive into the code for whatever app/library I am using. It often requires root access to modify ruby libs on the system, which sucks for one-off debugging. Writing up monkeypatches guessing at methods that I should inspect is error prone and sucky. Monkeypatching for debugging is common for me and is about as efficient/productive as using LD_PRELOAD to hack in my own method calls. (see liboverride). It sucks.
Minstrel is something better than a bag of the usual hope+monkeypatch+time combination. For example. Let's use minstrel to debug why mcollective's 'mc-ping' is failing:
snack(~) % /usr/sbin/mc-ping connect failed: Connection refused - connect(2) will retry in 5Ok, connection refused. To what? Yes, I could use strace or tcpdump to debug this particular issue. But that's not the point, here. After looking at the mcollective code for a few minutes I came up with a few classes I want to instrument.
snack(~) % % RUBY_INSTRUMENT="MCollective::Connector::Stomp,Stomp::Connection,TCPSocket" minstrel /usr/sbin/mc-ping Wrap of TCPSocket successful Wrap of Stomp::Connection successful Wrap of MCollective::Connector::Stomp successful enter MCollective::Connector::Stomp#connect() enter Stomp::Connection#socket() class_enter TCPSocket#open(["localhost", 6163]) class_exit_exception TCPSocket#open(["localhost", 6163]) connect failed: Connection refused - connect(2) will retry in 5Voila.