Class: Chef::Telemeter
- Inherits:
-
Object
- Object
- Chef::Telemeter
- Extended by:
- Forwardable
- Includes:
- Singleton
- Defined in:
- lib/chef/telemeter.rb,
lib/chef/telemeter/sender.rb
Overview
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.
Defined Under Namespace
Classes: Sender
Constant Summary collapse
- DEFAULT_INSTALLATION_GUID =
"00000000-0000-0000-0000-000000000000".freeze
- Log =
rubocop:disable Naming/ConstantName
logger
Instance Attribute Summary collapse
-
#config ⇒ Object
readonly
Returns the value of attribute config.
-
#events_to_send ⇒ Object
readonly
Returns the value of attribute events_to_send.
-
#run_timestamp ⇒ Object
readonly
Returns the value of attribute run_timestamp.
Instance Method Summary collapse
- #capture(name, data = {}, options = {}) ⇒ Object
- #commit ⇒ Object
- #enabled? ⇒ Boolean
-
#initialize ⇒ Telemeter
constructor
A new instance of Telemeter.
- #installation_id ⇒ Object
- #last_event ⇒ Object
- #make_event_payload(name, data, options = {}) ⇒ Object
-
#pending_event_count ⇒ Object
For testing.
- #setup(config) ⇒ Object
- #timed_capture(name, data = {}, options = {}) ⇒ Object
- #timed_run_capture(arguments, &block) ⇒ Object
Constructor Details
#initialize ⇒ Telemeter
Returns a new instance of Telemeter.
64 65 66 67 68 |
# File 'lib/chef/telemeter.rb', line 64 def initialize @config = [] @events_to_send = [] @run_timestamp = Time.now.utc.strftime("%FT%TZ") end |
Instance Attribute Details
#config ⇒ Object (readonly)
Returns the value of attribute config.
43 44 45 |
# File 'lib/chef/telemeter.rb', line 43 def config @config end |
#events_to_send ⇒ Object (readonly)
Returns the value of attribute events_to_send.
43 44 45 |
# File 'lib/chef/telemeter.rb', line 43 def events_to_send @events_to_send end |
#run_timestamp ⇒ Object (readonly)
Returns the value of attribute run_timestamp.
43 44 45 |
# File 'lib/chef/telemeter.rb', line 43 def @run_timestamp end |
Instance Method Details
#capture(name, data = {}, options = {}) ⇒ Object
80 81 82 83 84 85 |
# File 'lib/chef/telemeter.rb', line 80 def capture(name, data = {}, = {}) # 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, ) @events_to_send.unshift payload end |
#commit ⇒ Object
87 88 89 90 91 92 93 |
# 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? ⇒ Boolean
59 60 61 62 |
# File 'lib/chef/telemeter.rb', line 59 def enabled? require_relative "telemetry/decision" config[:enabled] && !Telemetry::Decision.env_opt_out? end |
#installation_id ⇒ Object
112 113 114 115 116 117 118 119 120 |
# 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 ⇒ Object
127 128 129 |
# File 'lib/chef/telemeter.rb', line 127 def last_event @events_to_send.last end |
#make_event_payload(name, data, options = {}) ⇒ Object
95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 |
# File 'lib/chef/telemeter.rb', line 95 def make_event_payload(name, data, = {}) payload = { event: name, properties: { installation_id: installation_id, run_timestamp: , host_platform: host_platform, }, } if [:flatten] payload[:properties].merge! data else payload[:properties][:event_data] = data end payload end |
#pending_event_count ⇒ Object
For testing.
123 124 125 |
# File 'lib/chef/telemeter.rb', line 123 def pending_event_count @events_to_send.length end |
#setup(config) ⇒ Object
45 46 47 48 49 50 51 52 53 54 55 56 57 |
# 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 = {}) ⇒ Object
74 75 76 77 78 |
# File 'lib/chef/telemeter.rb', line 74 def timed_capture(name, data = {}, = {}) time = Benchmark.measure { yield } data[:duration] = time.real capture(name, data, ) end |
#timed_run_capture(arguments, &block) ⇒ Object
70 71 72 |
# File 'lib/chef/telemeter.rb', line 70 def timed_run_capture(arguments, &block) timed_capture(:run, arguments: arguments, &block) end |