# File lib/chef/resource_reporter.rb, line 90 def initialize(rest_client) if Chef::Config[:enable_reporting] && !Chef::Config[:why_run] @reporting_enabled = true else @reporting_enabled = false end @updated_resources = [] @total_res_count = 0 @pending_update = nil @status = "success" @exception = nil @run_id = nil @rest_client = rest_client @node = nil @error_descriptions = {} @summary_only = true end
# File lib/chef/resource_reporter.rb, line 250 def cookbook_resolution_failed(expanded_run_list, exception) description = Formatters::ErrorMapper.cookbook_resolution_failed(expanded_run_list, exception) @error_descriptions = description.for_json end
# File lib/chef/resource_reporter.rb, line 255 def cookbook_sync_failed(cookbooks, exception) description = Formatters::ErrorMapper.cookbook_sync_failed(cookbooks, exception) @error_descriptions = description.for_json end
# File lib/chef/resource_reporter.rb, line 108 def node_load_completed(node, expanded_run_list_with_versions, config) @node = node if reporting_enabled? begin resource_history_url = "reports/nodes/#{node.name}/runs" server_response = @rest_client.post_rest(resource_history_url, {:action => :begin}) run_uri = URI.parse(server_response["uri"]) @run_id = ::File.basename(run_uri.path) Chef::Log.info("Chef server generated run history id: #{@run_id}") @summary_only = server_response["summary_only"] rescue Timeout::Error, Errno::EINVAL, Errno::ECONNRESET, EOFError, Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError, Net::ProtocolError => e if !e.response || e.response.code.to_s != "404" if Chef::Config[:enable_reporting_url_fatals] Chef::Log.error("Received exception #{"(" + e.response.code + ") " if e.response.code}attempting to generate run history id (URL Path: #{resource_history_url}), and enable_reporting_url_fatals is set, aborting run.") raise else Chef::Log.info("Received exception #{"(" + e.response.code + ") " if e.response.code}attempting to generate run history id (URL Path: #{resource_history_url}), disabling reporting for this run.") end else Chef::Log.debug("Received 404 attempting to generate run history id (URL Path: #{resource_history_url}), assuming feature is not supported on server.") end @reporting_enabled = false end end end
# File lib/chef/resource_reporter.rb, line 183 def post_reporting_data if reporting_enabled? run_data = prepare_run_data resource_history_url = "reports/nodes/#{@node.name}/runs/#{@run_id}" Chef::Log.info("Sending resource update report (run-id: #{@run_id})") Chef::Log.debug run_data.inspect compressed_data = encode_gzip(run_data.to_json) begin #if summary only is enabled send the uncompressed run_data excluding the run_data["resources"] and some additional metrics. if @summary_only run_data = report_summary(run_data, compressed_data) Chef::Log.info("run_data_summary: #{run_data}") @rest_client.post_rest(resource_history_url, run_data) else Chef::Log.debug("Sending compressed run data...") # Since we're posting compressed data we can not directly call # post_rest which expects JSON reporting_url = @rest_client.create_url(resource_history_url) @rest_client.raw_http_request(:POST, reporting_url, {'Content-Encoding' => 'gzip'}, compressed_data) end rescue Net::HTTPServerException => e if e.response.code.to_s == "400" Chef::FileCache.store("failed-reporting-data.json", Chef::JSONCompat.to_json_pretty(run_data), 0640) Chef::Log.error("Failed to post reporting data to server (HTTP 400), saving to #{Chef::FileCache.load("failed-reporting-data.json", false)}") else Chef::Log.error("Failed to post reporting data to server (HTTP #{e.response.code.to_s})") end end else Chef::Log.debug("Server doesn't support resource history, skipping resource report.") end end
# File lib/chef/resource_reporter.rb, line 216 def prepare_run_data run_data = {} run_data["action"] = "end" run_data["resources"] = updated_resources.map do |resource_record| resource_record.for_json end run_data["status"] = @status run_data["run_list"] = @node.run_list.to_json run_data["total_res_count"] = @total_res_count.to_s run_data["data"] = {} if exception exception_data = {} exception_data["class"] = exception.inspect exception_data["message"] = exception.message exception_data["backtrace"] = exception.backtrace.to_json exception_data["description"] = @error_descriptions run_data["data"]["exception"] = exception_data end run_data end
# File lib/chef/resource_reporter.rb, line 238 def report_summary(run_data, compressed_data) run_data["updated_res_count"] = updated_resources.count.to_s run_data["post_size"] = compressed_data.bytesize.to_s run_data["resources"] = [] run_data end
# File lib/chef/resource_reporter.rb, line 260 def reporting_enabled? @reporting_enabled end
# File lib/chef/resource_reporter.rb, line 164 def resource_completed(new_resource) if @pending_update && !nested_resource?(new_resource) @pending_update.finish @updated_resources << @pending_update @pending_update = nil end end
# File lib/chef/resource_reporter.rb, line 134 def resource_current_state_loaded(new_resource, action, current_resource) unless nested_resource?(new_resource) @pending_update = ResourceReport.new_with_current_state(new_resource, action, current_resource) end end
# File lib/chef/resource_reporter.rb, line 154 def resource_failed(new_resource, action, exception) @total_res_count += 1 unless nested_resource?(new_resource) @pending_update ||= ResourceReport.new_for_exception(new_resource, action) @pending_update.exception = exception end description = Formatters::ErrorMapper.resource_failed(new_resource, action, exception) @error_descriptions = description.for_json end
# File lib/chef/resource_reporter.rb, line 145 def resource_skipped(resource, action, conditional) @total_res_count += 1 @pending_update = nil unless nested_resource?(resource) end
# File lib/chef/resource_reporter.rb, line 140 def resource_up_to_date(new_resource, action) @total_res_count += 1 @pending_update = nil unless nested_resource?(new_resource) end
# File lib/chef/resource_reporter.rb, line 150 def resource_updated(new_resource, action) @total_res_count += 1 end
# File lib/chef/resource_reporter.rb, line 172 def run_completed(node) @status = "success" post_reporting_data end
Generated with the Darkfish Rdoc Generator 2.