class Object
Constants
- CommandDeactivateNode
- CommandStoreReport
Public Instance Methods
# File lib/puppet/reports/puppetdb.rb, line 173 def build_events_list(events) profile("Build events list (count: #{events.count})", [:puppetdb, :events_list, :build]) do events.map { |event| event_to_hash(event) } end end
@return Array @api private
# File lib/puppet/reports/puppetdb.rb, line 104 def build_logs_list profile("Build logs list (count: #{logs.count})", [:puppetdb, :logs_list, :build]) do logs.map do |log| { 'file' => log.file, 'line' => log.line, 'level' => log.level, 'message' => log.message, 'source' => log.source, 'tags' => [*log.tags], 'time' => Puppet::Util::Puppetdb.to_wire_time(log.time), } end end end
@return Array[Hash} @api private
# File lib/puppet/reports/puppetdb.rb, line 123 def build_metrics_list profile("Build metrics list (count: #{metrics.count})", [:puppetdb, :metrics_list, :build]) do metrics_list = [] metrics.each do |name, data| metric_hashes = data.values.map {|x| {"category" => data.name, "name" => x.first, "value" => x.last}} metrics_list.concat(metric_hashes) end metrics_list end end
@return Array @api private
# File lib/puppet/reports/puppetdb.rb, line 90 def build_resources_list profile("Build resources list (count: #{resource_statuses.count})", [:puppetdb, :resources_list, :build]) do resources = resource_statuses.values.map { |resource| resource_status_to_hash(resource) } if ! config.include_unchanged_resources? resources.select{ |resource| (! resource["events"].empty?) or resource["skipped"] } else resources end end end
Helper method for accessing the puppetdb configuration
@api private
# File lib/puppet/reports/puppetdb.rb, line 203 def config Puppet::Util::Puppetdb.config end
Convert an instance of `Puppet::Transaction::Event` to a hash suitable for sending over the wire to PuppetDB
@return Hash[<String, Object>] @api private
# File lib/puppet/reports/puppetdb.rb, line 160 def event_to_hash(event) corrective_change = defined?(event.corrective_change) ? event.corrective_change : nil { "status" => event.status, "timestamp" => Puppet::Util::Puppetdb.to_wire_time(event.time), "property" => event.property, "new_value" => event.desired_value, "old_value" => event.previous_value, "corrective_change" => corrective_change, "message" => event.message, } end
@return TrueClass @api private
# File lib/puppet/reports/puppetdb.rb, line 84 def has_enforcement_event?(resource) resource["events"].any? { |event| event["status"] != 'noop' } end
@return TrueClass @api private
# File lib/puppet/reports/puppetdb.rb, line 78 def has_noop_event?(resource) resource["events"].any? { |event| event["status"] == 'noop' } end
# File lib/puppet/face/node/status.rb, line 74 def headers { "Accept" => "application/json", "Content-Type" => "application/x-www-form-urlencoded; charset=UTF-8", } end
Process the report by formatting it into a PuppetDB
'store report' command and submitting it.
@return [void]
# File lib/puppet/reports/puppetdb.rb, line 20 def process profile("report#process", [:puppetdb, :report, :process]) do submit_command(self.host, report_to_hash, CommandStoreReport, 8) end nil end
# File lib/puppet/functions/puppetdb_query.rb, line 7 def puppetdb_query(query) Puppet::Util::Puppetdb.query_puppetdb(query) end
Convert `self` (an instance of `Puppet::Transaction::Report`) to a hash suitable for sending over the wire to PuppetDB
@return Hash[<String, Object>] @api private
# File lib/puppet/reports/puppetdb.rb, line 33 def report_to_hash profile("Convert report to wire format hash", [:puppetdb, :report, :convert_to_wire_format_hash]) do if environment.nil? raise Puppet::Error, "Environment is nil, unable to submit report. This may be due a bug with Puppet. Ensure you are running the latest revision, see PUP-2508 for more details." end resources = build_resources_list is_noop = (defined?(noop) && (not noop.nil?)) ? noop : resources.any? { |rs| has_noop_event?(rs) } && resources.none? { |rs| has_enforcement_event?(rs) } defaulted_catalog_uuid = defined?(catalog_uuid) ? catalog_uuid : transaction_uuid defaulted_code_id = defined?(code_id) ? code_id : nil defaulted_cached_catalog_status = defined?(cached_catalog_status) ? cached_catalog_status : nil defaulted_noop_pending = defined?(noop_pending) ? noop_pending : nil defaulted_corrective_change = defined?(corrective_change) ? corrective_change : nil { "certname" => host, "puppet_version" => puppet_version, "report_format" => report_format, "configuration_version" => configuration_version.to_s, "producer_timestamp" => Puppet::Util::Puppetdb.to_wire_time(Time.now), "start_time" => Puppet::Util::Puppetdb.to_wire_time(time), "end_time" => Puppet::Util::Puppetdb.to_wire_time(time + run_duration), "environment" => environment, "transaction_uuid" => transaction_uuid, "status" => status, "noop" => is_noop, "noop_pending" => defaulted_noop_pending, "corrective_change" => defaulted_corrective_change, "logs" => build_logs_list, "metrics" => build_metrics_list, "resources" => resources, "catalog_uuid" => defaulted_catalog_uuid, "code_id" => defaulted_code_id, "cached_catalog_status" => defaulted_cached_catalog_status, "producer" => Puppet[:node_name_value] } end end
Convert an instance of `Puppet::Resource::Status` to a hash suitable for sending over the wire to PuppetDB
@return Hash[<String, Object>] @api private
# File lib/puppet/reports/puppetdb.rb, line 185 def resource_status_to_hash(resource_status) defaulted_corrective_change = defined?(resource_status.corrective_change) ? resource_status.corrective_change : nil { "skipped" => resource_status.skipped, "timestamp" => Puppet::Util::Puppetdb.to_wire_time(resource_status.time), "resource_type" => resource_status.resource_type, "resource_title" => resource_status.title.to_s, "file" => resource_status.file, "line" => resource_status.line, "containment_path" => resource_status.containment_path, "corrective_change" => defaulted_corrective_change, "events" => build_events_list(resource_status.events), } end
@return Number @api private
# File lib/puppet/reports/puppetdb.rb, line 138 def run_duration # TODO: this is wrong in puppet. I am consistently seeing reports where # start-time + this value is less than the timestamp on the individual # resource events. Not sure what the best short-term fix is yet; the long # term fix is obviously to make the correct data available in puppet. # I've filed a ticket against puppet here: # http://projects.puppetlabs.com/issues/16480 # # NOTE: failed reports have an empty metrics hash. Just send 0 for run time, # since we don't have access to any better information. if metrics["time"] and metrics["time"]["total"] metrics["time"]["total"] else 0 end end