Class: ChefCore::Telemeter

Inherits:
Object
  • Object
show all
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

Instance Method Summary collapse

Constructor Details

#initializeTelemeter

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

#configObject (readonly)

Returns the value of attribute config.



43
44
45
# File 'lib/chef_core/telemeter.rb', line 43

def config
  @config
end

#events_to_sendObject (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_timestampObject (readonly)

Returns the value of attribute run_timestamp.



43
44
45
# File 'lib/chef_core/telemeter.rb', line 43

def run_timestamp
  @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 = {}, 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

#commitObject



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

Returns:

  • (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_idObject



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_eventObject



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, 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_countObject

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 = {}, options = {})
  time = Benchmark.measure { yield }
  data[:duration] = time.real
  capture(name, data, options)
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