module CwEc2Cm

Constants

VERSION
WHENEVER_ID

Public Class Methods

push_metrics() click to toggle source
# File lib/cw_ec2_cm.rb, line 22
def push_metrics
  metadata_endpoint = 'http://169.254.169.254/latest/meta-data/'
  instance_id = Net::HTTP.get( URI.parse( metadata_endpoint + 'instance-id' ) )

  metric_data = []

  # disk usage
  df_fields = %w(fstype source size used avail pcent target)
  metric_time = Time.now
  df_data = `df -l -k --output=#{df_fields.join(',')}`.lines.collect do |l|
    line_array = l.split
    while line_array.size > df_fields.size do
      line_array.last << ' ' << line_array.pop
    end
    {}.tap do |line_data|
      df_fields.each_with_index do |fld, idx|
        line_data[fld] = line_array[idx]
      end
      line_data['pcent'].gsub!('%', '')
    end
  end
  df_data.shift #strip header line
  df_data.reject!{|fs| /tmpfs/ =~ fs['fstype']} #strip tmpfs mounts

  if worst_fs = df_data.max_by{ |fs| fs['pcent'].to_f }
    metric_data << {
      "MetricName" => "FSUsagePercent",
      "Dimensions" => [{ "Name" => "InstanceId", "Value" => instance_id }],
      "Timestamp" => metric_time,
      "Value" => worst_fs['pcent'].to_f,
      "Unit" => "Percent" # accepts Seconds, Microseconds, Milliseconds, Bytes, Kilobytes, Megabytes, Gigabytes, Terabytes, Bits, Kilobits, Megabits, Gigabits, Terabits, Percent, Count, Bytes/Second, Kilobytes/Second, Megabytes/Second, Gigabytes/Second, Terabytes/Second, Bits/Second, Kilobits/Second, Megabits/Second, Gigabits/Second, Terabits/Second, Count/Second, None
    }
  end

  # mem usage
  meminfo = {}
  metric_time = Time.now
  `cat /proc/meminfo`.each_line do |l|
    line_array = l.split
    line_array[0].gsub!(':', '')
    meminfo[line_array[0]] = line_array[1].to_f * 1024
  end
  mem_total = meminfo['MemTotal']
  mem_free = meminfo['MemFree'] + meminfo['Cached'] + meminfo['Buffers']
  mem_used = mem_total - mem_free
  mem_percent = (mem_used/mem_total*100).ceil
  metric_data << {
    "MetricName" => "MemUsagePercent",
    "Dimensions" => [{ "Name" => "InstanceId", "Value" => instance_id }],
    "Timestamp" => metric_time,
    "Value" => mem_percent,
    "Unit" => "Percent" # accepts Seconds, Microseconds, Milliseconds, Bytes, Kilobytes, Megabytes, Gigabytes, Terabytes, Bits, Kilobits, Megabits, Gigabits, Terabits, Percent, Count, Bytes/Second, Kilobytes/Second, Megabytes/Second, Gigabytes/Second, Terabytes/Second, Bits/Second, Kilobits/Second, Megabits/Second, Gigabits/Second, Terabits/Second, Count/Second, None
  }
  metric_data << {
    "MetricName" => "MemFree",
    "Dimensions" => [{ "Name" => "InstanceId", "Value" => instance_id }],
    "Timestamp" => metric_time,
    "Value" => mem_free/1024/1024,
    "Unit" => "Megabytes" # accepts Seconds, Microseconds, Milliseconds, Bytes, Kilobytes, Megabytes, Gigabytes, Terabytes, Bits, Kilobits, Megabits, Gigabits, Terabits, Percent, Count, Bytes/Second, Kilobytes/Second, Megabytes/Second, Gigabytes/Second, Terabytes/Second, Bits/Second, Kilobits/Second, Megabits/Second, Gigabits/Second, Terabits/Second, Count/Second, None
  }

  Tempfile.open('cw-ec2-cm-metrics') do |f|
    f.write(JSON.dump(metric_data))
    f.close
    `aws cloudwatch put-metric-data --namespace EC2Custom --metric-data file://#{f.path}`
  end
end
update_crontab(update_cmd) click to toggle source
# File lib/cw_ec2_cm.rb, line 8
  def update_crontab(update_cmd)
    Tempfile.open(WHENEVER_ID) do |f|
      push_cmd = `which cw-ec2-cm-push`
      f.write <<-SCHEDULE
        every 1.minute do
          command '#{push_cmd}'
        end      
      SCHEDULE
      f.close
      system('whenever', '--load-file', f.path, update_cmd, WHENEVER_ID)
    end
  end

Private Instance Methods

push_metrics() click to toggle source
# File lib/cw_ec2_cm.rb, line 22
def push_metrics
  metadata_endpoint = 'http://169.254.169.254/latest/meta-data/'
  instance_id = Net::HTTP.get( URI.parse( metadata_endpoint + 'instance-id' ) )

  metric_data = []

  # disk usage
  df_fields = %w(fstype source size used avail pcent target)
  metric_time = Time.now
  df_data = `df -l -k --output=#{df_fields.join(',')}`.lines.collect do |l|
    line_array = l.split
    while line_array.size > df_fields.size do
      line_array.last << ' ' << line_array.pop
    end
    {}.tap do |line_data|
      df_fields.each_with_index do |fld, idx|
        line_data[fld] = line_array[idx]
      end
      line_data['pcent'].gsub!('%', '')
    end
  end
  df_data.shift #strip header line
  df_data.reject!{|fs| /tmpfs/ =~ fs['fstype']} #strip tmpfs mounts

  if worst_fs = df_data.max_by{ |fs| fs['pcent'].to_f }
    metric_data << {
      "MetricName" => "FSUsagePercent",
      "Dimensions" => [{ "Name" => "InstanceId", "Value" => instance_id }],
      "Timestamp" => metric_time,
      "Value" => worst_fs['pcent'].to_f,
      "Unit" => "Percent" # accepts Seconds, Microseconds, Milliseconds, Bytes, Kilobytes, Megabytes, Gigabytes, Terabytes, Bits, Kilobits, Megabits, Gigabits, Terabits, Percent, Count, Bytes/Second, Kilobytes/Second, Megabytes/Second, Gigabytes/Second, Terabytes/Second, Bits/Second, Kilobits/Second, Megabits/Second, Gigabits/Second, Terabits/Second, Count/Second, None
    }
  end

  # mem usage
  meminfo = {}
  metric_time = Time.now
  `cat /proc/meminfo`.each_line do |l|
    line_array = l.split
    line_array[0].gsub!(':', '')
    meminfo[line_array[0]] = line_array[1].to_f * 1024
  end
  mem_total = meminfo['MemTotal']
  mem_free = meminfo['MemFree'] + meminfo['Cached'] + meminfo['Buffers']
  mem_used = mem_total - mem_free
  mem_percent = (mem_used/mem_total*100).ceil
  metric_data << {
    "MetricName" => "MemUsagePercent",
    "Dimensions" => [{ "Name" => "InstanceId", "Value" => instance_id }],
    "Timestamp" => metric_time,
    "Value" => mem_percent,
    "Unit" => "Percent" # accepts Seconds, Microseconds, Milliseconds, Bytes, Kilobytes, Megabytes, Gigabytes, Terabytes, Bits, Kilobits, Megabits, Gigabits, Terabits, Percent, Count, Bytes/Second, Kilobytes/Second, Megabytes/Second, Gigabytes/Second, Terabytes/Second, Bits/Second, Kilobits/Second, Megabits/Second, Gigabits/Second, Terabits/Second, Count/Second, None
  }
  metric_data << {
    "MetricName" => "MemFree",
    "Dimensions" => [{ "Name" => "InstanceId", "Value" => instance_id }],
    "Timestamp" => metric_time,
    "Value" => mem_free/1024/1024,
    "Unit" => "Megabytes" # accepts Seconds, Microseconds, Milliseconds, Bytes, Kilobytes, Megabytes, Gigabytes, Terabytes, Bits, Kilobits, Megabits, Gigabits, Terabits, Percent, Count, Bytes/Second, Kilobytes/Second, Megabytes/Second, Gigabytes/Second, Terabytes/Second, Bits/Second, Kilobits/Second, Megabits/Second, Gigabits/Second, Terabits/Second, Count/Second, None
  }

  Tempfile.open('cw-ec2-cm-metrics') do |f|
    f.write(JSON.dump(metric_data))
    f.close
    `aws cloudwatch put-metric-data --namespace EC2Custom --metric-data file://#{f.path}`
  end
end
update_crontab(update_cmd) click to toggle source
# File lib/cw_ec2_cm.rb, line 8
  def update_crontab(update_cmd)
    Tempfile.open(WHENEVER_ID) do |f|
      push_cmd = `which cw-ec2-cm-push`
      f.write <<-SCHEDULE
        every 1.minute do
          command '#{push_cmd}'
        end      
      SCHEDULE
      f.close
      system('whenever', '--load-file', f.path, update_cmd, WHENEVER_ID)
    end
  end