Class: ChefApply::Telemeter::Sender

Inherits:
Object
  • Object
show all
Defined in:
lib/chef_apply/telemeter/sender.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(session_files) ⇒ Sender

Returns a new instance of Sender.



46
47
48
# File 'lib/chef_apply/telemeter/sender.rb', line 46

def initialize(session_files)
  @session_files = session_files
end

Instance Attribute Details

#session_filesObject (readonly)

Returns the value of attribute session_files.



27
28
29
# File 'lib/chef_apply/telemeter/sender.rb', line 27

def session_files
  @session_files
end

Class Method Details

.find_session_filesObject



38
39
40
41
42
43
44
# File 'lib/chef_apply/telemeter/sender.rb', line 38

def self.find_session_files
  ChefApply::Log.info("Looking for telemetry data to submit")
  session_search = File.join(ChefApply::Config.telemetry_path, "telemetry-payload-*.yml")
  session_files = Dir.glob(session_search)
  ChefApply::Log.info("Found #{session_files.length} sessions to submit")
  session_files
end

.start_upload_threadObject



29
30
31
32
33
34
35
36
# File 'lib/chef_apply/telemeter/sender.rb', line 29

def self.start_upload_thread
  # Find the files before we spawn the thread - otherwise
  # we may accidentally pick up the current run's session file if it
  # finishes before the thread scans for new files
  session_files = Sender.find_session_files
  sender = Sender.new(session_files)
  Thread.new { sender.run }
end

Instance Method Details

#process_session(path) ⇒ Object



71
72
73
74
75
# File 'lib/chef_apply/telemeter/sender.rb', line 71

def process_session(path)
  ChefApply::Log.info("Processing telemetry entries from #{path}")
  content = load_and_clear_session(path)
  submit_session(content)
end

#runObject



50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/chef_apply/telemeter/sender.rb', line 50

def run
  if ChefApply::Telemeter.enabled?
    ChefApply::Log.info("Telemetry enabled, beginning upload of previous session(s)")
    # dev mode telemetry gets sent to a different location
    if ChefApply::Config.telemetry.dev
      ENV["CHEF_TELEMETRY_ENDPOINT"] ||= "https://telemetry-acceptance.chef.io"
    end
    session_files.each { |path| process_session(path) }
  else
    # If telemetry is not enabled, just clean up and return. Even though
    # the telemetry gem will not send if disabled, log output saying that we're submitting
    # it when it has been disabled can be alarming.
    ChefApply::Log.info("Telemetry disabled, clearing any existing session captures without sending them.")
    session_files.each { |path| FileUtils.rm_rf(path) }
  end
  FileUtils.rm_rf(ChefApply::Config.telemetry_session_file)
  ChefApply::Log.info("Terminating, nothing more to do.")
rescue => e
  ChefApply::Log.fatal "Sender thread aborted: '#{e}' failed at  #{e.backtrace[0]}"
end

#submit_entry(telemetry, entry, sequence, total) ⇒ Object



96
97
98
99
100
101
102
103
104
# File 'lib/chef_apply/telemeter/sender.rb', line 96

def submit_entry(telemetry, entry, sequence, total)
  ChefApply::Log.info("Submitting telemetry entry #{sequence}/#{total}: #{entry} ")
  telemetry.deliver(entry)
  ChefApply::Log.info("Entry #{sequence}/#{total} submitted.")
rescue => e
  # No error handling in telemetry lib, so at least track the failrue
  ChefApply::Log.error("Failed to send entry #{sequence}/#{total}: #{e}")
  ChefApply::Log.error("Backtrace: #{e.backtrace} ")
end

#submit_session(content) ⇒ Object



77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# File 'lib/chef_apply/telemeter/sender.rb', line 77

def submit_session(content)
  # Each file contains the actions taken within a single run of the chef tool.
  # Each run is one session, so we'll first remove remove the session file
  # to force creating a new one.
  FileUtils.rm_rf(ChefApply::Config.telemetry_session_file)
  # We'll use the version captured in the sesion file
  entries = content["entries"]
  cli_version = content["version"]
  total = entries.length
  telemetry = Telemetry.new(product: "chef-workstation",
                            origin: "command-line",
                            product_version: cli_version,
                            install_context: "omnibus")
  total = entries.length
  entries.each_with_index do |entry, x|
    submit_entry(telemetry, entry, x + 1, total)
  end
end