Writing custom report processors

Create and use report processors to generate insightful information or alerts from Puppet reports. You can write your own report processor in Ruby and include it in a Puppet module. Puppet uses the processor to send report data to the service in the format you defined.

A report processor must follow these rules:

  • The processor name must be a valid Ruby symbol that starts with a letter and contains only alphanumeric characters.
  • The processor must be in its own Ruby file, <PROCESSOR_NAME>.rb, and stored inside the Puppet module directory lib/puppet/reports/
  • The processor code must start with require 'puppet'
  • The processor code must call the method Puppet::Reports.register_report(:NAME) This method takes the name of the report as a symbol, and a mandatory block of code with no arguments that contains:
    • A Markdown-formatted string describing the processor, passed to the desc(<DESCRIPTION>) method.
    • An implementation of a method named process that contains the report processor's main functionality.

Puppet lets the process method access a self object, which will be a Puppet::Transaction::Report object describing a Puppet run.

The processor can access report data by calling accessor methods on self, and it can forward that data to any service you configure in the report processor. It can also call self.to_yaml to dump the entire report to YAML. Note that the YAML output isn't a safe, well-defined data format — it's a serialized object.

Example report processor

To use this report processor, include it in the comma-separated list of processors in the Puppet primary server's reports setting in puppet.conf: reports = store,myreport.

# Located in /etc/puppetlabs/puppet/modules/myreport/lib/puppet/reports/myreport.rb.
require 'puppet'
# If necessary, require any other Ruby libraries for this report here.

Puppet::Reports.register_report(:myreport) do
  desc "Process reports via the fictional my_cool_cmdb API."

  # Declare and configure any settings here. We'll pretend this connects to our API.
  my_api = MY_COOL_CMD

  # Define and configure the report processor.
  def process
    # Do something that sets up the API we're sending the report to here.
    # For instance, let's check on the node's status using the report object (self):
    if self.status != nil then
      status = self.status
    else
      status = 'undefined'
    end

    # Next, let's do something if the status equals 'failed'.
    if status == 'failed' then
      # Finally, dump the report object to YAML and post it using the API object:
      my_api.post(self.to_yaml)
    end
  end
end
To use this report processor, include it in the comma-separated list of processors in the Puppet primary server's reports setting in puppet.conf:
reports = store,myreport

For more examples using this API, see the built-in reports' source code or one of these custom reports created by a member of the Puppet community:

These community reports aren't provided or supported by Puppet, Inc.