class Riemann::Tools::ELBMetrics

Public Instance Methods

base_metrics() click to toggle source
# File bin/riemann-elb-metrics, line 69
def base_metrics
  # get last 60 seconds
  start_time = (Time.now.utc - 60).iso8601
  end_time = Time.now.utc.iso8601

  # The base query that all metrics would get
  metric_base = {
    "Namespace" => "AWS/ELB",
    "StartTime" => start_time,
    "EndTime" => end_time,
    "Period" => 60,
  }

  metric_base
end
standard_metrics() click to toggle source
# File bin/riemann-elb-metrics, line 20
def standard_metrics
  # ELB metric types, from:
  # http://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/CW_Support_For_AWS.html#elb-metricscollected
  metric_options = {
    "Latency" => {
      "Unit" => "Seconds",
      "Statistics" => ["Maximum", "Minimum", "Average" ]
    },
    "RequestCount" => {
      "Unit" => "Count",
      "Statistics" => [ "Sum" ]
    },
    "HealthyHostCount" => {
      "Units" => "Count",
      "Statistics" => [ "Minimum", "Maximum", "Average" ]
    },
    "UnHealthyHostCount" => {
      "Units" => "Count",
      "Statistics" => [ "Minimum", "Maximum", "Average" ]
    },
    "HTTPCode_ELB_4XX" => {
      "Units" => "Count",
      "Statistics" => [ "Sum" ]
    },
    "HTTPCode_ELB_5XX" => {
      "Units" => "Count",
      "Statistics" => [ "Sum" ]
    },
    "HTTPCode_Backend_2XX" => {
      "Units" => "Count",
      "Statistics" => [ "Sum" ]
    },
    "HTTPCode_Backend_3XX" => {
      "Units" => "Count",
      "Statistics" => [ "Sum" ]
    },
    "HTTPCode_Backend_4XX" => {
      "Units" => "Count",
      "Statistics" => [ "Sum" ]
    },
    "HTTPCode_Backend_5XX" => {
      "Units" => "Count",
      "Statistics" => [ "Sum" ]
    }
  }

  metric_options
end
tick() click to toggle source
# File bin/riemann-elb-metrics, line 86
def tick
  if options[:fog_credentials_file]
    Fog.credentials_path = options[:fog_credentials_file]
    Fog.credential = options[:fog_credential].to_sym
    connection = Fog::AWS::CloudWatch.new
  else 
    if options[:aws_access] && options[:aws_secret]
      connection = Fog::AWS::CloudWatch.new({
        :aws_access_key_id => options[:aws_access],
        :aws_secret_access_key => options[:aws_secret],
        :region => options[:aws_region]
      })
    else
      connection = Fog::AWS::CloudWatch.new({
        :use_iam_profile => true,
        :region => options[:aws_region]
      })        
    end
  end

  options[:elbs].each do |lb|

    metric_options = standard_metrics
    metric_base_options = base_metrics

    options[:aws_azs].each do |az|
      metric_options.keys.sort.each do |metric_type|
        merged_options = metric_base_options.merge(metric_options[metric_type])
        merged_options["MetricName"] = metric_type
        if az == "all_az"
          merged_options["Dimensions"] = [ { "Name" => "LoadBalancerName", "Value" => lb } ]
        else
          merged_options["Dimensions"] = [
            { "Name" => "LoadBalancerName", "Value" => lb },
            { "Name" => "AvailabilityZone" , "Value" => az}
          ]
        end

        result = connection.get_metric_statistics(merged_options)

        # "If no response codes in the category 2XX-5XX range are sent to clients within
        # the given time period, values for these metrics will not be recorded in CloudWatch"
        #next if result.body["GetMetricStatisticsResult"]["Datapoints"].empty? && metric_type =~ /[2345]XX/
        #
        if result.body["GetMetricStatisticsResult"]["Datapoints"].empty?
          standard_metrics[metric_type]['Statistics'].each do |stat_type|
            event = event(lb, az, metric_type, stat_type, 0.0)
            report(event)
          end
          next
        end

        # We should only ever have a single data point
        result.body["GetMetricStatisticsResult"]["Datapoints"][0].keys.sort.each do |stat_type|
          next if stat_type == "Unit"
          next if stat_type == "Timestamp"

          unit = result.body["GetMetricStatisticsResult"]["Datapoints"][0]["Unit"]
          metric = result.body["GetMetricStatisticsResult"]["Datapoints"][0][stat_type]
          event = event(lb, az, metric_type, stat_type, metric, unit)
          report(event)
        end
      end
    end
  end
end

Private Instance Methods

event(lb, az, metric_type, stat_type, metric, unit=nil) click to toggle source
# File bin/riemann-elb-metrics, line 154
def event(lb, az, metric_type, stat_type, metric, unit=nil)
  event = {
    host: lb,
    service: "elb.#{az}.#{metric_type}.#{stat_type}",
    ttl: 60,
    description: "#{lb} #{metric_type} #{stat_type} (#{unit})",
    tags: ["elb_metrics"],
    metric: metric
  }
end