class ChefCore::Telemeter
This definites the Telemeter
interface. Implementation thoughts for when we unstub it:
-
let's track the call sequence; most of our calls will be nested inside
a main 'timed_capture', and it would be good to see ordering within nested calls.
Constants
- DEFAULT_INSTALLATION_GUID
Attributes
config[R]
events_to_send[R]
run_timestamp[R]
Public Class Methods
new()
click to toggle source
# File lib/chef_core/telemeter.rb, line 64 def initialize @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_core/telemeter.rb, line 79 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_core/telemeter.rb, line 86 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_core/telemeter.rb, line 59 def enabled? require "telemetry/decision" config[:enabled] && !Telemetry::Decision.env_opt_out? end
installation_id()
click to toggle source
# File lib/chef_core/telemeter.rb, line 111 def installation_id @installation_id ||= begin File.read(config[:installation_identifier_file]).chomp rescue ChefCore::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_core/telemeter.rb, line 126 def last_event @events_to_send.last end
make_event_payload(name, data, options = {})
click to toggle source
# File lib/chef_core/telemeter.rb, line 94 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_core/telemeter.rb, line 122 def pending_event_count @events_to_send.length end
setup(config)
click to toggle source
# File lib/chef_core/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 "chef_core/telemeter/sender" @config = config Sender.start_upload_thread(config) end
timed_capture(name, data = {}, options = {}) { || ... }
click to toggle source
# File lib/chef_core/telemeter.rb, line 73 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_core/telemeter.rb, line 69 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_core/telemeter.rb, line 141 def convert_events_to_session YAML.dump({ "version" => ChefCore::VERSION, "entries" => @events_to_send }) end
host_platform()
click to toggle source
# File lib/chef_core/telemeter.rb, line 132 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_core/telemeter.rb, line 150 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_core/telemeter.rb, line 146 def write_session(session) File.write(next_filename, convert_events_to_session) end