Class: Chef::Telemeter

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

Instance Method Summary collapse

Constructor Details

#initializeTelemeter

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

#configObject (readonly)

Returns the value of attribute config.



43
44
45
# File 'lib/chef/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/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/telemeter.rb', line 43

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



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

Returns:

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



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_eventObject



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



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