Skip to content

Instantly share code, notes, and snippets.

@cp
Created November 15, 2013 07:35
Show Gist options
  • Save cp/7480568 to your computer and use it in GitHub Desktop.
Save cp/7480568 to your computer and use it in GitHub Desktop.
A simple and dirty parser for Heroku Logplex. Not well tested.
#!/usr/bin/env ruby
# -*- encoding: utf-8 -*-
require 'terminal-table'
require 'json'
#
# USAGE: `ruby log.rb [HEROKU_APP_NAME]`
#
app = ARGV[0]
rows = `heroku logs -a #{app} -s heroku -n 200`.split("\n")
$log = Array.new
rows.each do |row|
title = row.split(" ")[0..1].join(" ")
next unless title.include?("heroku[web") # We only want logplex entries for web dynos for now.
hash = Hash[:title, title]
words = row.split(" ")[2..-1]
words.each do |word|
split_word = word.split("=")
hash.merge!(split_word[0] => split_word[1])
end
$log << hash
end
def get_range(array)
range = array.max - array.min
range.round(2)
end
def get_avg(array)
avg = array.inject{ |sum, el| sum + el }.to_f / array.size
avg.round(2)
end
def memories
memories = Array.new
$log.each do |entry|
next unless entry["sample#memory_total"]
memories << entry["sample#memory_total"][0..-3].to_f
end
memories
end
def load_average
avgs = Hash.new
$log.each do |entry|
next unless entry["sample#load_avg_1m"]
avgs.merge!("1m" => entry["sample#load_avg_1m"])
avgs.merge!("5m" => entry["sample#load_avg_5m"])
avgs.merge!("15m" => entry["sample#load_avg_15m"])
end
avgs
end
rows = []
rows << ['Memory', memories[-1]]
rows << ['Average Memory', get_avg(memories)]
rows << ['Memory Range', get_range(memories)]
rows << ['Load Avg 1m', load_average["1m"]]
rows << ['Load Avg 5m', load_average["5m"]]
rows << ['Load Avg 15m', load_average["15m"]]
rows << ['Data Points', $log.length]
table = Terminal::Table.new(rows: rows, title: app)
puts table
require 'terminal-table'
require 'json'
#
# USAGE: `ruby log.rb [HEROKU_APP_NAME]`
#
app = ARGV[0]
rows = `heroku logs -a #{app}`.split("\n")
LOG = Array.new
rows.each do |row|
title = row.split(" ")[0..1].join(" ")
next unless title.include?("heroku[web") # We only want logplex entries for web dynos for now.
hash = Hash[:title, title]
words = row.split(" ")[2..-1]
words.each do |word|
split_word = word.split("=")
hash.merge!(split_word[0] => split_word[1])
end
LOG << hash
end
def get_range(array)
range = array.max - array.min
range.round(2)
end
def get_avg(array)
avg = array.inject{ |sum, el| sum + el }.to_f / array.size
avg.round(2)
end
def memories
memories = Array.new
LOG.each do |entry|
next unless entry["sample#memory_total"]
memories << entry["sample#memory_total"][0..-3].to_f
end
memories
end
def load_average
avgs = Hash.new
LOG.each do |entry|
next unless entry["sample#load_avg_1m"]
avgs.merge!("1m" => entry["sample#load_avg_1m"])
avgs.merge!("5m" => entry["sample#load_avg_5m"])
avgs.merge!("15m" => entry["sample#load_avg_15m"])
end
avgs
end
rows = []
rows << ['Average Memory', get_avg(memories)]
rows << ['Memory Range', get_range(memories)]
rows << ['Load Avg 1m', load_average["1m"]]
rows << ['Load Avg 5m', load_average["5m"]]
rows << ['Load Avg 15m', load_average["15m"]]
rows << ['Data Points', LOG.length]
table = Terminal::Table.new(rows: rows, title: app)
puts table
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment