Skip to content

Commit

Permalink
Merge branch 'skimhub-master'
Browse files Browse the repository at this point in the history
  • Loading branch information
Rylon committed Nov 14, 2014
2 parents 80c915f + 8d426d5 commit f690270
Show file tree
Hide file tree
Showing 3 changed files with 84 additions and 2 deletions.
11 changes: 10 additions & 1 deletion lib/capify-ec2.rb
@@ -1,9 +1,14 @@
#!/usr/bin/env ruby
# -*- coding: utf-8 -*-

require 'rubygems'
require 'fog'
require 'colored'
require 'net/http'
require 'net/https'
require File.expand_path(File.dirname(__FILE__) + '/capify-ec2/server')
require File.expand_path(File.dirname(__FILE__) + '/capify-ec2/cloudwatch')


class CapifyEc2

Expand Down Expand Up @@ -85,12 +90,14 @@ def aws_session_token
@ec2_config[:aws_session_token] || Fog.credentials[:aws_session_token] || ENV['AWS_SESSION_TOKEN'] || nil
end

def display_instances
def display_instances(graph: false)
unless desired_instances and desired_instances.any?
puts "[Capify-EC2] No instances were found using your 'ec2.yml' configuration.".red.bold
return
end

cw = CapifyCloudwatch.new(aws_access_key_id, aws_secret_access_key) if graph

# Set minimum widths for the variable length instance attributes.
column_widths = { :name_min => 4, :type_min => 4, :dns_min => 5, :roles_min => @ec2_config[:aws_roles_tag].length, :stages_min => @ec2_config[:aws_stages_tag].length, :options_min => @ec2_config[:aws_options_tag].length }

Expand Down Expand Up @@ -122,6 +129,7 @@ def display_instances
status_output << @ec2_config[:aws_stages_tag] .ljust( column_widths[:stages] ).bold if stages_present
status_output << @ec2_config[:aws_roles_tag] .ljust( column_widths[:roles] ).bold if roles_present
status_output << @ec2_config[:aws_options_tag].ljust( column_widths[:options] ).bold if options_present
status_output << 'CPU' .ljust( 16 ).bold if graph
puts status_output.join(" ")

desired_instances.each_with_index do |instance, i|
Expand All @@ -135,6 +143,7 @@ def display_instances
status_output << (instance.tags[@ec2_config[:aws_stages_tag]] || '').ljust( column_widths[:stages] ).yellow if stages_present
status_output << (instance.tags[@ec2_config[:aws_roles_tag]] || '').ljust( column_widths[:roles] ).yellow if roles_present
status_output << (instance.tags[@ec2_config[:aws_options_tag]] || '').ljust( column_widths[:options] ).yellow if options_present
status_output << cw.get_metric(instance.id, "CPUUtilization").ljust(16) if graph
puts status_output.join(" ")
end
end
Expand Down
6 changes: 5 additions & 1 deletion lib/capify-ec2/capistrano.rb
Expand Up @@ -14,6 +14,11 @@ def capify_ec2
capify_ec2.display_instances
end

desc "As status but with CPU usage graphs (slower due to Cloudwatch requests)"
task :graph do
capify_ec2.display_instances(graph: true)
end

desc "Prints out all ec2 load balancers"
task :elbs do
capify_ec2.display_elbs
Expand Down Expand Up @@ -322,5 +327,4 @@ def pluralise(n, singular, plural=nil)
"#{singular}s"
end
end

end
69 changes: 69 additions & 0 deletions lib/capify-ec2/cloudwatch.rb
@@ -0,0 +1,69 @@
#!/usr/bin/env ruby
# -*- coding: utf-8 -*-

require 'fog'

class CapifyCloudwatch
# Threshold => color
# Color is applied if metric exceeds the threshold, KEEP IN ORDER
Colors = {
0 => :green,
70 => :yellow,
90 => :red
}

def initialize(key_id, secret)
@ticks = %w[ ]
@cw = Fog::AWS::CloudWatch.new(:aws_access_key_id => key_id,
:aws_secret_access_key => secret)
end

def get_metric(instance_id, metric, hours = 1)
range = hours * (60 * 60)
time = Time.new
start = DateTime.parse((time - range).to_s)
finish = DateTime.parse(time.to_s)

dimensions = [{
"Name" => "InstanceId",
"Value" => instance_id
}]

result = @cw.get_metric_statistics({'Namespace' => 'AWS/EC2',
'MetricName' => metric,
'Period' => 120,
'Statistics' => ['Average'],
'StartTime' => start,
'EndTime' => finish,
'Dimensions' => dimensions})

dp = result.body.fetch("GetMetricStatisticsResult", {})["Datapoints"]

if dp
return get_spark_line(dp.map {|x| x["Average"]})
end
return ""
end

def colorize_output(output, value)
colored = output
Colors.each do |threshold, color|
if value >= threshold
colored = output.send(color)
end
end
colored
end

def get_spark_line(values)
scale = @ticks.length - 1

if values and values.count > 0
final = values.last.round
bar = values.map { |x| @ticks[(x / 100.0 * scale).floor] }.join
return colorize_output(bar.rjust(13, @ticks.first) + " #{final}%", final)
else
""
end
end
end

0 comments on commit f690270

Please sign in to comment.