Class: ChefCore::Telemeter
- Inherits:
-
Object
- Object
- ChefCore::Telemeter
- Extended by:
- Forwardable
- Includes:
- Singleton
- Defined in:
- lib/chef_core/telemeter.rb,
lib/chef_core/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
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 |
# File 'lib/chef_core/telemeter.rb', line 64 def initialize @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_core/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_core/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_core/telemeter.rb', line 43 def @run_timestamp end |
Instance Method Details
#capture(name, data = {}, options = {}) ⇒ Object
79 80 81 82 83 84 |
# File 'lib/chef_core/telemeter.rb', line 79 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
86 87 88 89 90 91 92 |
# 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? ⇒ Boolean
59 60 61 62 |
# File 'lib/chef_core/telemeter.rb', line 59 def enabled? require "telemetry/decision" config[:enabled] && !Telemetry::Decision.env_opt_out? end |
#installation_id ⇒ Object
111 112 113 114 115 116 117 118 119 |
# 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 ⇒ Object
126 127 128 |
# File 'lib/chef_core/telemeter.rb', line 126 def last_event @events_to_send.last end |
#make_event_payload(name, data, options = {}) ⇒ Object
94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
# File 'lib/chef_core/telemeter.rb', line 94 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.
122 123 124 |
# File 'lib/chef_core/telemeter.rb', line 122 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_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 = {}) ⇒ Object
73 74 75 76 77 |
# File 'lib/chef_core/telemeter.rb', line 73 def timed_capture(name, data = {}, = {}) time = Benchmark.measure { yield } data[:duration] = time.real capture(name, data, ) end |
#timed_run_capture(arguments, &block) ⇒ Object
69 70 71 |
# File 'lib/chef_core/telemeter.rb', line 69 def timed_run_capture(arguments, &block) timed_capture(:run, arguments: arguments, &block) end |