Project

wtf-tools

0.0
No commit activity in last 3 years
No release in over 3 years
WTF-tools offers some flexible options for your puts-style Ruby debugging needs, and method-level profiling for Ruby on Rails projects.
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Runtime

 Project Readme

wtf-tools

Some tools for debugging and profiling Ruby on Rails projects. Included:

  • data dumper
  • code timing tool
  • method tracker - a kind of middle ground between simple timing and full profiling
  • SQL tracker - detect where exactly given SQL query originated from

User is responsible for requiring gems necessary for rendering output. For example, when :yaml option is used with WTF?, we expect that YAML is already loaded. Library requirements for specific options are documented below.

Usage examples

Data dumping

WTF? my_var                                   # basic
WTF? my_var, other_var, { some: data }, :pp   # more data, option: pretty-print
WTF? :label, records, :bare, :time            # multiple options given
data.wtf(:time).some_method                   # inline call

Supported options

Prefix
  (default)  WTF (my_file_name/method_name:227): 
  :np        no default prefix
  :nl        new line before the record
  :time      with timestamp: [2014-10-28 12:33:11 +0200]

Formatting
  (default)  simple Ruby inspect
  :pp        pretty-print, require 'pp'
  :yaml      YAML format,  require 'yaml'
  :json      JSON format,  require 'json'
  :csv       CSV format,   require 'csv'
  :text      simple Ruby to_s
  :line      modifier, each object in separate line
  :bare      modifier, ActiveRecord with just id attributes: #<MyClass id: 1234>
  :name      like :line, but with names taken from source file

Output control
  :puts      to STDOUT (default)
  :file      to a separate file in configured location
  :error     raise the string containing data as exception

Code timing

class MyClass
  def run_something
    WTF.time {
      # your code
    }
  end
end

Output:

WTF (my_class/run_something:3): 0.001

Method tracking

class MyClass
  def run_something
    WTF.track(self)
    # lots of code
    WTF.track_finish
  end
end

Additionally, extra classes/modules can be given:

WTF.track(self, OtherClass, Helpers)

This will create a CSV file in configured location, containing profiling info. Profiling happens only in the methods of the calling class, and any other given class.

How it works: every method in MyClass and OtherClass is overridden, adding resource measuring code. All calls to those methods from the code between track and track_finish are measured (time and memory). Sum amounts are written as CSV file, sorted by total time used.

Example output:

class,method,count,time,heap_mb
,top,0,0.948,0.0
Overview,some_helper,16408,0.351,0.0
Overview,my_records,28,0.172,0.0
Overview,load_data,1,0.166,0.0 
...

Warning: tracking method calls adds time overhead (somewhere from 10% to 3x, depending on number of times the methods were called).


SQL tracking

class MyClass
  def run_something
    WTF.sql %q{SELECT * FROM `my_records` WHERE `attribute`='value' AND `etc`}
    WTF.sql /^UPDATE `my_records` SET .*?`some_values`=/, size: 10
    # lots of code
  end
end

This will add a WTF?-style dump in the default location, containing stacktrace where given SQL statement was generated. SQL must match exactly as strings.


Configuration

Configure WTF before using the above-mentioned facilities. Rails initializers directory is a good place to put it. Subkeys of output must be lambdas taking one string argument. They are merged into default output options.

WTF.options = {
  files:   "#{Rails.root}/log/wtf",
  output: {
    default: ->(data) { Rails.logger.info(data) },
    redis:   ->(data) { Redis.new.rpush(:wtf, data) },
  }
}

require 'yaml' # to use :yaml option, etc

Requirement: Ruby 2.0, because the technique used involves module prepend-ing, which is not available in Ruby 1.9.


License

This is released under the MIT License.

Sponsors

This gem is sponsored and used by SameSystem

SameSystem