lib/common_methods.rb (53 lines of code) (raw):

# This script calculates the minimum, maximum and 95th percentile of methods # called by more than 10% of all Rails actions taking place in the past 24 # hours. The idea of this script is to find commonly used slow methods. require_relative 'config' rows = CLIENT.query(%q{ SELECT percentile("duration", 95) FROM "rails_method_calls" WHERE time > now() - 24h AND "action" =~ /.+/ GROUP BY "action", "method"; }) actions_per_method = Hash.new do |hash, key| hash[key] = [] end methods_per_action = Hash.new do |hash, key| hash[key] = {} end rows.each do |row| action = row['tags']['action'] method = row['tags']['method'] time = row['values'][0]['percentile'] actions_per_method[method] << action methods_per_action[action][method] = time end total_actions = methods_per_action.length rows = [] actions_per_method.each do |method, actions| percent = (actions.length.to_f / total_actions) * 100.0 if percent >= 10 timings = actions.map do |action| methods_per_action[action][method] end timings = timings.sort average = timings.inject(:+) / timings.length min = timings[0] max = timings[-1] next if average < 100 rows << [method, actions.length, average.round(2), min.round(2), max.round(2)] end end longest = rows.map { |row| row[0].length }.sort.last headers = [ 'Method'.ljust(longest, ' '), 'Actions', '95th Percentile', 'Minimum', 'Maximum' ] puts headers.join(' ') rows.sort { |a, b| b[2] <=> a[2] }.each do |columns| cells = columns.map.with_index do |col, index| padding = headers[index].length col.to_s.ljust(padding, ' ') end puts cells.join(' ') end