Class: Fluent::ChefAPIInput

Inherits:
Input
  • Object
show all
Defined in:
lib/fluent/plugin/in_chef_api.rb

Defined Under Namespace

Classes: ChefConfig

Instance Method Summary collapse

Constructor Details

#initializeChefAPIInput

Returns a new instance of ChefAPIInput.



15
16
17
18
# File 'lib/fluent/plugin/in_chef_api.rb', line 15

def initialize
  super
  require "chef-api"
end

Instance Method Details

#configure(conf) ⇒ Object



51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/fluent/plugin/in_chef_api.rb', line 51

def configure(conf)
  super
  @config = {}
  if @config_file
    @config = @config.merge(ChefConfig.load_file(@config_file))
  end
  if @chef_server_url
    @config[:endpoint] = @chef_server_url
  end
  if @node_name
    @config[:client] = value
  end
  if @client_key
    @config[:key] = ::File.read(@client_key)
  end
end

#runObject



78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# File 'lib/fluent/plugin/in_chef_api.rb', line 78

def run
  connection = ChefAPI::Connection.new(@config.dup)
  next_run = ::Time.new
  while @running
    if ::Time.new < next_run
      sleep(1)
    else
      begin
        run_once(connection)
      rescue => error
        $log.warn("failed to fetch metrics: #{error.class}: #{error.message}")
        next
      ensure
        next_run = ::Time.new + @check_interval
      end
    end
  end
end

#run_once(connection) ⇒ Object



97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# File 'lib/fluent/plugin/in_chef_api.rb', line 97

def run_once(connection)
  if @chef_environment
    nodes = connection.environments.fetch(@chef_environment).nodes
    data = {"chef_environment" => @chef_environment}
  else
    nodes = connection.nodes
    data = {}
  end
  Engine.emit("#{@tag}.nodes", Engine.now, data.merge({"value" => nodes.count}))
  nodes.each do |node|
    begin
      Engine.emit("#{@tag}.run_list", Engine.now, data.merge({"value" => node.run_list.length, "node" => node.name}))
      ohai_time = node.automatic.fetch("ohai_time").to_i
      Engine.emit("#{@tag}.ohai_time", Engine.now, data.merge({"value" => ohai_time, "node" => node.name}))
      Engine.emit("#{@tag}.behind_seconds", Engine.now, data.merge({"value" => Time.new.to_i - ohai_time, "node" => node.name}))
    rescue => error
      $log.warn("failed to fetch metrics from node: #{node.name}: #{error.class}: #{error.message}")
    end
  end
end

#shutdownObject



73
74
75
76
# File 'lib/fluent/plugin/in_chef_api.rb', line 73

def shutdown
  @running = false
  @thread.join
end

#startObject



68
69
70
71
# File 'lib/fluent/plugin/in_chef_api.rb', line 68

def start
  @running = true
  @thread = ::Thread.new(&method(:run))
end