class Chef::Telemeter

This definites the Telemeter interface. Implementation thoughts for when we unstub it:

a main 'timed_capture', and it would be good to see ordering within nested calls.

Constants

DEFAULT_INSTALLATION_GUID
Log

Attributes

config[R]
events_to_send[R]
run_timestamp[R]

Public Class Methods

new() click to toggle source
# File lib/chef/telemeter.rb, line 64
def initialize
  @config = []
  @events_to_send = []
  @run_timestamp =  Time.now.utc.strftime("%FT%TZ")
end

Public Instance Methods

capture(name, data = {}, options = {}) click to toggle source
# File lib/chef/telemeter.rb, line 80
def capture(name, data = {}, options = {})
  # Adding it to the head of the list will ensure that the
  # sequence of events is preserved when we send the final payload
  payload = make_event_payload(name, data, options)
  @events_to_send.unshift payload
end
commit() click to toggle source
# File lib/chef/telemeter.rb, line 87
def commit
  if enabled?
    session = convert_events_to_session
    write_session(session)
  end
  @events_to_send = []
end
enabled?() click to toggle source
# File lib/chef/telemeter.rb, line 59
def enabled?
  require_relative "telemetry/decision"
  config[:enabled] && !Telemetry::Decision.env_opt_out?
end
installation_id() click to toggle source
# File lib/chef/telemeter.rb, line 112
def installation_id
  @installation_id ||=
    begin
      File.read(config[:installation_identifier_file]).chomp
    rescue
      Telemeter::Log.info "could not read #{config[:installation_identifier_file]} - using default id"
      DEFAULT_INSTALLATION_GUID
    end
end
last_event() click to toggle source
# File lib/chef/telemeter.rb, line 127
def last_event
  @events_to_send.last
end
make_event_payload(name, data, options = {}) click to toggle source
# File lib/chef/telemeter.rb, line 95
def make_event_payload(name, data, options = {})
  payload = {
    event: name,
    properties: {
      installation_id: installation_id,
      run_timestamp: run_timestamp,
      host_platform: host_platform,
    },
  }
  if options[:flatten]
    payload[:properties].merge! data
  else
    payload[:properties][:event_data] = data
  end
  payload
end
pending_event_count() click to toggle source

For testing.

# File lib/chef/telemeter.rb, line 123
def pending_event_count
  @events_to_send.length
end
setup(config) click to toggle source
# File lib/chef/telemeter.rb, line 45
def setup(config)
  # TODO validate required & correct keys
  # :payload_dir #required
  # :session_file # required
  # :installation_identifier_file # required
  # :enabled  # false, not required
  # :dev_mode # false, not required
  config[:dev_mode] ||= false
  config[:enabled] ||= false
  require_relative "telemeter/sender"
  @config = config
  Sender.start_upload_thread(config)
end
timed_capture(name, data = {}, options = {}) { || ... } click to toggle source
# File lib/chef/telemeter.rb, line 74
def timed_capture(name, data = {}, options = {})
  time = Benchmark.measure { yield }
  data[:duration] = time.real
  capture(name, data, options)
end
timed_run_capture(arguments, &block) click to toggle source
# File lib/chef/telemeter.rb, line 70
def timed_run_capture(arguments, &block)
  timed_capture(:run, arguments: arguments, &block)
end

Private Instance Methods

convert_events_to_session() click to toggle source
# File lib/chef/telemeter.rb, line 142
def convert_events_to_session
  YAML.dump("version" => Telemetry::VERSION,
            "entries" => @events_to_send)
end
host_platform() click to toggle source
# File lib/chef/telemeter.rb, line 133
def host_platform
  @host_platform ||= case RUBY_PLATFORM
                     when /mswin|mingw|windows/
                       "windows"
                     else
                       RUBY_PLATFORM.split("-")[1]
                     end
end
next_filename() click to toggle source
# File lib/chef/telemeter.rb, line 151
def next_filename
  id = 0
  filename = ""
  loop do
    id += 1
    filename = File.join(config[:payload_dir], "telemetry-payload-#{id}.yml")
    break unless File.exist?(filename)
  end
  filename
end
write_session(session) click to toggle source
# File lib/chef/telemeter.rb, line 147
def write_session(session)
  File.write(next_filename, convert_events_to_session)
end