Class: Fluent::Plugin::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.



20
21
22
# File 'lib/fluent/plugin/in_chef_api.rb', line 20

def initialize
  super
end

Instance Method Details

#configure(conf) ⇒ Object



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/fluent/plugin/in_chef_api.rb', line 55

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

#emit_node_metrics(node, data) ⇒ Object



119
120
121
122
123
124
125
126
127
128
129
130
# File 'lib/fluent/plugin/in_chef_api.rb', line 119

def emit_node_metrics(node, data)
  begin
    router.emit("#{@tag}.run_list", Engine.now, data.merge({"value" => node.run_list.length, "node" => node.name}))
    if node.automatic["ohai_time"]
      ohai_time = node.automatic["ohai_time"].to_i
      router.emit("#{@tag}.ohai_time", Engine.now, data.merge({"value" => ohai_time, "node" => node.name}))
      router.emit("#{@tag}.behind_seconds", Engine.now, data.merge({"value" => Time.new.to_i - ohai_time, "node" => node.name}))
    end
  rescue => error
    log.warn("failed to fetch metrics from node: #{node.name}", error: error)
  end
end

#runObject



78
79
80
81
82
83
84
85
86
87
88
# File 'lib/fluent/plugin/in_chef_api.rb', line 78

def run
  super
  @connection = ChefAPI::Connection.new(@chef_config.dup)
  timer_execute(:chef_api_input, @check_interval) do
    if @monitor_multi
      run_once(connection)
    else
      run_once_single(connection)
    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
117
# File 'lib/fluent/plugin/in_chef_api.rb', line 97

def run_once(connection)
  data = @default_values.dup
  if @chef_environment
    nodes = connection.environments.fetch(@chef_environment).nodes
  else
    nodes = connection.nodes
  end
  router.emit("#{@tag}.nodes", Engine.now, data.merge({"value" => nodes.count}))
  begin
    nodes.instance_eval do
      if Hash === @collection
        @collection = Hash[@collection.to_a.shuffle]
      end
    end
  rescue => error
    log.warn("failed to shuffle nodes", error: error)
  end
  nodes.each do |node|
    emit_node_metrics(node, data)
  end
end

#run_once_single(connection) ⇒ Object



90
91
92
93
94
95
# File 'lib/fluent/plugin/in_chef_api.rb', line 90

def run_once_single(connection)
  data = @default_values.dup
  if node = connection.nodes.fetch(connection.client)
    emit_node_metrics(node, data)
  end
end

#startObject



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

def start
  thread_create(:chef_api, &method(:run))
  super
end