class Fluent::Plugin::DnsServiceDiscovery

Public Instance Methods

configure(conf) click to toggle source
Calls superclass method
# File lib/fluent/plugin/sd_dns.rb, line 62
def configure(conf)
  super
  @services = fetch_services_from_dns
end
start(queue) click to toggle source
Calls superclass method
# File lib/fluent/plugin/sd_dns.rb, line 67
def start(queue)
  if @interval
    timer_execute(:"sd_dns_refresh", @interval) do
      refresh_service_list(queue)
    end
  else
    refresh_service_list(queue)
  end

  super()
end

Private Instance Methods

fetch_services_from_dns() click to toggle source
# File lib/fluent/plugin/sd_dns.rb, line 113
def fetch_services_from_dns
  service_list = []
  @entry_configs.each { |conf|
    ai_list = begin
                Socket.getaddrinfo(conf.host, conf.port, conf.address_family, Socket::SOCK_STREAM)
              rescue => e
                if @ignore_dns_error
                  @log.warn "failed to get service list from #{conf.host}", error: e
                  next
                else
                  raise
                end
              end
    ai_list.each_with_index { |ai, i|
      name = "#{i}-#{conf.host}"
      service_list << Service.new(:dns, ai[3], ai[1], name, conf.weight, false, conf.username, conf.password, conf.shared_key)
    }
  }
  service_list
end
refresh_service_list(queue) click to toggle source
# File lib/fluent/plugin/sd_dns.rb, line 81
def refresh_service_list(queue)
  old_services = @services
  new_services = begin
                   fetch_services_from_dns
                 rescue => e
                   @log.error("sd_dns: #{e}")
                   return
                 end

  if new_services.nil? || new_services.empty?
    return
  end

  diff = []
  join = new_services - old_services
  # Need service_in first to guarantee that server exist at least one all time.
  join.each do |j|
    diff << ServiceDiscovery.service_in_msg(j)
  end

  drain = old_services - new_services
  drain.each do |d|
    diff << ServiceDiscovery.service_out_msg(d)
  end

  @services = new_services

  diff.each do |a|
    queue.push(a)
  end
end