class Riemann::Tools::Marathon

Public Class Methods

new() click to toggle source
# File bin/riemann-marathon, line 18
def initialize
  options[:interval] = 60
  options[:ttl] = 120
end

Public Instance Methods

apps_url() click to toggle source
# File bin/riemann-marathon, line 50
def apps_url
  path_prefix = options[:path_prefix]
  path_prefix[0] = '' if path_prefix[0]=='/'
  path_prefix[path_prefix.length-1] = '' if path_prefix[path_prefix.length-1]=='/'
  "http://#{options[:marathon_host]}:#{options[:marathon_port]}#{path_prefix.length>0?'/':''}#{path_prefix}/v2/apps"
end
health_url() click to toggle source
# File bin/riemann-marathon, line 43
def health_url
  path_prefix = options[:path_prefix]
  path_prefix[0] = '' if path_prefix[0]=='/'
  path_prefix[path_prefix.length-1] = '' if path_prefix[path_prefix.length-1]=='/'
  "http://#{options[:marathon_host]}:#{options[:marathon_port]}#{path_prefix.length>0?'/':''}#{path_prefix}/metrics"
end
safe_get(uri) click to toggle source

Handles HTTP connections and GET requests safely

# File bin/riemann-marathon, line 24
def safe_get(uri)
    # Handle connection timeouts
    response = nil
    begin
      connection = Faraday.new(uri)
      response = connection.get do |req|
        req.options[:timeout] = options[:read_timeout]
        req.options[:open_timeout] = options[:open_timeout]
      end
    rescue => e
      report(:host => uri.host,
        :service => "marathon health",
        :state => "critical",
        :description => "HTTP connection error: #{e.class} - #{e.message}"
      )
    end
    response
end
tick() click to toggle source
# File bin/riemann-marathon, line 57
def tick
  tick_health
  tick_apps
end
tick_apps() click to toggle source
# File bin/riemann-marathon, line 110
def tick_apps
  uri = URI(apps_url)
  response = safe_get(uri)

  return if response.nil?

  if response.status != 200
      report(:host => uri.host,
        :service => "marathon health",
        :state => "critical",
        :description => "HTTP connection error: #{response.status} - #{response.body}"
      )
  else
    # Assuming that a 200 will give json
    json = JSON.parse(response.body)
    state = "ok"

    report(:host => uri.host,
           :service => "marathon health",
           :state => state)

    json["apps"].each do |app|
      app.each_pair do |k, v|
        if v.is_a? Numeric
          report(:host => uri.host,
                 :service => "marathon apps#{app["id"]}/#{k}",
                 :metric => v,
                 :ttl => 120
          )
        end
      end
    end
  end
end
tick_health() click to toggle source
# File bin/riemann-marathon, line 62
def tick_health
  uri = URI(health_url)
  response = safe_get(uri)

  return if response.nil?

  if response.status != 200
      report(:host => uri.host,
        :service => "marathon health",
        :state => "critical",
        :description => "HTTP connection error: #{response.status} - #{response.body}"
      )
  else
    # Assuming that a 200 will give json
    json = JSON.parse(response.body)
    state = "ok"

    report(:host => uri.host,
           :service => "marathon health",
           :state => state)

    json.each_pair do |t, d|
      if d.respond_to? :each_pair
        d.each_pair do |service, counters|
          report(:host => uri.host,
                 :service => "marathon_metric #{t} #{service}",
                 :metric => 1,
                 :tags => ["metric_name"],
                 :ttl => 600
          )
          if counters.respond_to? :each_pair
            counters.each_pair do |k, v|
              if v.is_a? Numeric
                report(:host => uri.host,
                       :service => "marathon #{service} #{k}",
                       :metric => v,
                       :tags => ["metric", "#{t}"],
                       :ttl => 600
                )
              end
            end
          end
        end
      end
    end
  end
end