Skip to content

Instantly share code, notes, and snippets.

@fake-or-dead
Last active August 31, 2015 21:18
Show Gist options
  • Save fake-or-dead/1b43ad34f3214b1271e8 to your computer and use it in GitHub Desktop.
Save fake-or-dead/1b43ad34f3214b1271e8 to your computer and use it in GitHub Desktop.
dynos, apis = {}, {}
dyno, method, api, connect, service = '','','','',''
File.open('sample.log', "r") do |file|
file.each_line do |line|
# regular from this http://rubular.com/r/uwuiKelesS
target_api = /(method=GET path=\/api\/users\/\d+\/(count_pending_messages|get_messages|get_friends_progress|get_friends_score))|(method=(GET|POST) path=\/api\/users\/\d+ )/
next unless line.match(target_api)
line.split(': ')[1].split(' ').each do |methods|
k,v = methods.split('=')
case k
when 'dyno'
dyno = v
when 'method'
method = v
when 'path'
api = v.gsub(/\/\d+/, '/{user_id}')
when 'connect'
connect = v.gsub(/ms/, '').to_i
when 'service'
service = v.gsub(/ms/, '').to_i
end
end
# summarize log here
api_call = "#{method} #{api}"
apis["#{api_call}"] ||= {}
apis["#{api_call}"][:call] ||= 0
apis["#{api_call}"][:call] = apis["#{api_call}"][:call] + 1
apis["#{api_call}"][:dynos] ||= {}
apis["#{api_call}"][:dynos][dyno] ||= 0
apis["#{api_call}"][:dynos][dyno] = apis["#{api_call}"][:dynos][dyno] + 1
apis["#{api_call}"][:response_time] ||= {}
apis["#{api_call}"][:response_time][:raw] ||= []
apis["#{api_call}"][:response_time][:raw] << connect + service
end
# response time mean, median, mode
apis.each do |k, v|
v[:dynos][:max] = v[:dynos].max_by{|k,v| v}
v[:response_time][:raw].sort!
# Mean
v[:response_time][:mean] = v[:response_time][:raw].inject(&:+) / v[:response_time][:raw].length
# Median
v[:response_time][:median] = v[:response_time][:raw][(v[:response_time][:raw].length / 2) + (v[:response_time][:raw].length % 2) - 1]
# Mode
v[:response_time][:mode] = v[:response_time][:raw].detect{ |mode| v[:response_time][:raw].count(mode) > 1 }
end
end
# results
apis.each do |k, v|
puts "========================================================"
puts k
puts "Api Calls: #{v[:call]}"
puts "Most responded dynos: #{v[:dynos][:max][0]}"
puts "--- Reponse Time ---"
puts "Mean: #{v[:response_time][:mean]}ms \t Median: #{v[:response_time][:median]}ms \t Mode: #{v[:response_time][:mode]}ms"
puts "========================================================"
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment