timber 2.0.24 → 2.1.0.rc1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.travis.yml +2 -2
- data/CHANGELOG +3 -0
- data/README.md +314 -59
- data/bin/timber +11 -2
- data/lib/timber.rb +2 -7
- data/lib/timber/cli.rb +16 -28
- data/lib/timber/cli/api.rb +80 -14
- data/lib/timber/cli/api/application.rb +30 -0
- data/lib/timber/cli/config_file.rb +66 -0
- data/lib/timber/cli/file_helper.rb +43 -0
- data/lib/timber/cli/installer.rb +58 -0
- data/lib/timber/cli/installers.rb +37 -0
- data/lib/timber/cli/installers/other.rb +47 -0
- data/lib/timber/cli/installers/rails.rb +255 -0
- data/lib/timber/cli/installers/root.rb +189 -0
- data/lib/timber/cli/io.rb +97 -0
- data/lib/timber/cli/io/ansi.rb +22 -0
- data/lib/timber/cli/io/messages.rb +213 -0
- data/lib/timber/cli/os_helper.rb +53 -0
- data/lib/timber/config.rb +97 -43
- data/lib/timber/config/integrations.rb +63 -0
- data/lib/timber/config/integrations/rack.rb +74 -0
- data/lib/timber/context.rb +13 -10
- data/lib/timber/contexts.rb +1 -0
- data/lib/timber/contexts/custom.rb +16 -3
- data/lib/timber/contexts/http.rb +10 -3
- data/lib/timber/contexts/organization.rb +4 -0
- data/lib/timber/contexts/release.rb +46 -0
- data/lib/timber/contexts/runtime.rb +7 -1
- data/lib/timber/contexts/session.rb +8 -1
- data/lib/timber/contexts/system.rb +5 -1
- data/lib/timber/contexts/user.rb +9 -2
- data/lib/timber/current_context.rb +43 -11
- data/lib/timber/events/controller_call.rb +4 -0
- data/lib/timber/events/custom.rb +13 -5
- data/lib/timber/events/exception.rb +4 -0
- data/lib/timber/events/http_client_request.rb +4 -0
- data/lib/timber/events/http_client_response.rb +4 -0
- data/lib/timber/events/http_server_request.rb +5 -0
- data/lib/timber/events/http_server_response.rb +15 -3
- data/lib/timber/events/sql_query.rb +3 -0
- data/lib/timber/events/template_render.rb +3 -0
- data/lib/timber/integration.rb +40 -0
- data/lib/timber/integrations.rb +21 -14
- data/lib/timber/integrations/action_controller.rb +18 -0
- data/lib/timber/integrations/action_controller/log_subscriber.rb +2 -0
- data/lib/timber/integrations/action_controller/log_subscriber/timber_log_subscriber.rb +6 -0
- data/lib/timber/integrations/action_dispatch.rb +23 -0
- data/lib/timber/integrations/action_dispatch/debug_exceptions.rb +2 -0
- data/lib/timber/integrations/action_view.rb +18 -0
- data/lib/timber/integrations/action_view/log_subscriber.rb +2 -0
- data/lib/timber/integrations/action_view/log_subscriber/timber_log_subscriber.rb +10 -0
- data/lib/timber/integrations/active_record.rb +18 -0
- data/lib/timber/integrations/active_record/log_subscriber.rb +2 -0
- data/lib/timber/integrations/active_record/log_subscriber/timber_log_subscriber.rb +8 -0
- data/lib/timber/integrations/rack.rb +12 -2
- data/lib/timber/integrations/rack/exception_event.rb +38 -5
- data/lib/timber/integrations/rack/http_context.rb +4 -6
- data/lib/timber/integrations/rack/http_events.rb +177 -27
- data/lib/timber/integrations/rack/middleware.rb +28 -0
- data/lib/timber/integrations/rack/session_context.rb +5 -6
- data/lib/timber/integrations/rack/user_context.rb +90 -43
- data/lib/timber/integrations/rails.rb +22 -0
- data/lib/timber/integrations/rails/rack_logger.rb +2 -0
- data/lib/timber/integrator.rb +18 -3
- data/lib/timber/log_devices/http.rb +107 -99
- data/lib/timber/log_devices/http/dropping_sized_queue.rb +26 -0
- data/lib/timber/log_devices/http/flushable_sized_queue.rb +42 -0
- data/lib/timber/log_entry.rb +14 -2
- data/lib/timber/logger.rb +51 -36
- data/lib/timber/overrides.rb +2 -0
- data/lib/timber/overrides/active_support_3_tagged_logging.rb +103 -0
- data/lib/timber/overrides/active_support_tagged_logging.rb +53 -90
- data/lib/timber/timer.rb +21 -0
- data/lib/timber/util/hash.rb +1 -1
- data/lib/timber/util/http_event.rb +16 -3
- data/lib/timber/version.rb +1 -1
- data/spec/support/timber.rb +2 -3
- data/spec/timber/cli/installers/rails_spec.rb +160 -0
- data/spec/timber/cli/installers/root_spec.rb +100 -0
- data/spec/timber/config_spec.rb +28 -0
- data/spec/timber/current_context_spec.rb +61 -12
- data/spec/timber/events/custom_spec.rb +13 -2
- data/spec/timber/events/exception_spec.rb +15 -0
- data/spec/timber/events/http_server_request_spec.rb +3 -3
- data/spec/timber/integrations/rack/http_events_spec.rb +101 -0
- data/spec/timber/log_devices/http_spec.rb +20 -4
- data/spec/timber/log_entry_spec.rb +2 -1
- data/spec/timber/logger_spec.rb +8 -8
- metadata +40 -9
- data/benchmarks/rails.rb +0 -122
- data/lib/timber/cli/application.rb +0 -28
- data/lib/timber/cli/install.rb +0 -196
- data/lib/timber/cli/io_helper.rb +0 -65
- data/lib/timber/cli/messages.rb +0 -180
- data/lib/timber/integrations/active_support/tagged_logging.rb +0 -71
@@ -0,0 +1,37 @@
|
|
1
|
+
require "timber/cli/api"
|
2
|
+
require "timber/cli/installers/root"
|
3
|
+
require "timber/cli/io/messages"
|
4
|
+
require "timber/cli/os_helper"
|
5
|
+
|
6
|
+
module Timber
|
7
|
+
class CLI
|
8
|
+
module Installers
|
9
|
+
def self.run(api_key, io)
|
10
|
+
io.puts IO::Messages.header, :green
|
11
|
+
io.puts IO::Messages.separator, :green
|
12
|
+
io.puts IO::Messages.contact, :green
|
13
|
+
io.puts IO::Messages.separator, :green
|
14
|
+
io.puts ""
|
15
|
+
|
16
|
+
if !api_key
|
17
|
+
io.puts IO::Messages.no_api_key_provided
|
18
|
+
|
19
|
+
case io.ask_yes_no("Open the Timber app in your brower now?")
|
20
|
+
when :yes
|
21
|
+
OSHelper.open(IO::Messages::APP_URL)
|
22
|
+
end
|
23
|
+
|
24
|
+
else
|
25
|
+
api = API.new(api_key)
|
26
|
+
api.event(:started)
|
27
|
+
|
28
|
+
io.api = api
|
29
|
+
|
30
|
+
app = api.application!
|
31
|
+
|
32
|
+
Root.new(io, api).run(app)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require "timber/cli/installer"
|
2
|
+
require "timber/cli/io/messages"
|
3
|
+
|
4
|
+
module Timber
|
5
|
+
class CLI
|
6
|
+
module Installers
|
7
|
+
class Other < Installer
|
8
|
+
def run(app)
|
9
|
+
puts ""
|
10
|
+
puts IO::Messages.separator
|
11
|
+
puts ""
|
12
|
+
|
13
|
+
if app.heroku?
|
14
|
+
install_stdout
|
15
|
+
else
|
16
|
+
api_key_storage_preference = get_api_key_storage_preference
|
17
|
+
api_key_code = get_api_key_code(api_key_storage_type)
|
18
|
+
|
19
|
+
install_http(api_key_code)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
def install_stdout
|
25
|
+
puts ""
|
26
|
+
puts IO::Messages.separator
|
27
|
+
puts ""
|
28
|
+
puts "To integrate Timber, we need to instantiate the logger. Your global"
|
29
|
+
puts "logger should be set to something like this:"
|
30
|
+
puts ""
|
31
|
+
puts colorize(" LOGGER = Timber::Logger.new(STDOUT)", :blue)
|
32
|
+
end
|
33
|
+
|
34
|
+
def install_http(api_key_code)
|
35
|
+
puts ""
|
36
|
+
puts IO::Messages.separator
|
37
|
+
puts ""
|
38
|
+
puts "To integrate Timber, we need to instantiate the logger. Your global"
|
39
|
+
puts "logger should be set to something like this:"
|
40
|
+
puts ""
|
41
|
+
puts colorize(" log_device = Timber::LogDevices::HTTP.new(#{api_key_code})", :blue)
|
42
|
+
puts colorize(" LOGGER = Timber::Logger.new(log_device)", :blue)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,255 @@
|
|
1
|
+
begin
|
2
|
+
require "lograge"
|
3
|
+
rescue Exception
|
4
|
+
end
|
5
|
+
|
6
|
+
require "timber/cli/config_file"
|
7
|
+
require "timber/cli/file_helper"
|
8
|
+
require "timber/cli/installer"
|
9
|
+
require "timber/cli/io/messages"
|
10
|
+
|
11
|
+
module Timber
|
12
|
+
class CLI
|
13
|
+
module Installers
|
14
|
+
class Rails < Installer
|
15
|
+
# Runs the installer.
|
16
|
+
def run(app)
|
17
|
+
# Ask all of the questions up front. This allows us to to apply the
|
18
|
+
# changes as a neat task list when done.
|
19
|
+
development_preference = get_development_preference
|
20
|
+
api_key_storage_preference = get_api_key_storage_preference
|
21
|
+
should_logrageify = logrageify?
|
22
|
+
|
23
|
+
io.puts ""
|
24
|
+
io.puts IO::Messages.separator
|
25
|
+
io.puts ""
|
26
|
+
|
27
|
+
# Create the initializer
|
28
|
+
initializer
|
29
|
+
|
30
|
+
if should_logrageify
|
31
|
+
logrageify!
|
32
|
+
end
|
33
|
+
|
34
|
+
environment_file_paths.each do |environment_file_path|
|
35
|
+
environment = File.split(environment_file_path).last.gsub(/\.rb$/, "").to_sym
|
36
|
+
|
37
|
+
case environment
|
38
|
+
when :development
|
39
|
+
setup_development_environment(environment_file_path, development_preference)
|
40
|
+
when :test
|
41
|
+
setup_test_environment(environment_file_path)
|
42
|
+
else
|
43
|
+
setup_other_environment(app, environment_file_path, api_key_storage_preference)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
true
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
def logrageify?
|
52
|
+
if defined?(::Lograge)
|
53
|
+
io.puts ""
|
54
|
+
io.puts IO::Messages.separator
|
55
|
+
io.puts ""
|
56
|
+
io.puts "We noticed you have lograge installed. Would you like to configure "
|
57
|
+
io.puts "Timber to function similarly?"
|
58
|
+
io.puts "(This silences template renders, sql queries, and controller calls."
|
59
|
+
io.puts "You can always do this later in config/initialzers/timber.rb)"
|
60
|
+
io.puts ""
|
61
|
+
io.puts "y) Yes, configure Timber like lograge", :blue
|
62
|
+
io.puts "n) No, use the Rails logging defaults", :blue
|
63
|
+
io.puts ""
|
64
|
+
|
65
|
+
case io.ask_yes_no("Enter your choice:", event_prompt: "Logrageify?")
|
66
|
+
when :yes
|
67
|
+
true
|
68
|
+
when :no
|
69
|
+
false
|
70
|
+
end
|
71
|
+
else
|
72
|
+
false
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def logrageify!
|
77
|
+
task_message = "Logrageifying in #{initializer.path}"
|
78
|
+
io.task(task_message) do
|
79
|
+
initializer.logrageify!
|
80
|
+
end
|
81
|
+
true
|
82
|
+
end
|
83
|
+
|
84
|
+
# Determines the development preference
|
85
|
+
def get_development_preference
|
86
|
+
io.puts ""
|
87
|
+
io.puts IO::Messages.separator
|
88
|
+
io.puts ""
|
89
|
+
io.puts "Would you like to temporarily send development logs to Timber?"
|
90
|
+
io.puts "(Logs will still go to STDOUT, but this provides an easy way to kick the "
|
91
|
+
io.puts "tires. Once you're done testing, you can disable this in "
|
92
|
+
io.puts "#{IO::ANSI.colorize("config/environments/development.rb", :yellow)})"
|
93
|
+
io.puts ""
|
94
|
+
io.puts "y) Yes, send development logs to Timber", :blue
|
95
|
+
io.puts "n) No, just print development logs to STDOUT", :blue
|
96
|
+
io.puts ""
|
97
|
+
|
98
|
+
case io.ask_yes_no("Enter your choice:", event_prompt: "Send dev logs to Timber?")
|
99
|
+
when :yes
|
100
|
+
:send
|
101
|
+
when :no
|
102
|
+
:dont_send
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
def initializer
|
107
|
+
@initializer ||= begin
|
108
|
+
initializer_path = File.join("config", "initializers", "timber.rb")
|
109
|
+
task_message = "Creating #{initializer_path}"
|
110
|
+
io.task(task_message) { ConfigFile.new(initializer_path) }
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
# Wraps the logger in TaggedLogging if it is available. Older versions of Rails
|
115
|
+
# do not include this constant.
|
116
|
+
def config_set_logger_code
|
117
|
+
@config_set_logger_code ||= defined?(::ActiveSupport::TaggedLogging) ?
|
118
|
+
"ActiveSupport::TaggedLogging.new(logger)" : "logger"
|
119
|
+
end
|
120
|
+
|
121
|
+
# Traverses the config/environments directory and returns an array of
|
122
|
+
# symbols representing the various environments.
|
123
|
+
def environment_file_paths
|
124
|
+
path = File.join("config", "environments", "*.rb")
|
125
|
+
Dir[path]
|
126
|
+
end
|
127
|
+
|
128
|
+
def setup_development_environment(environment_file_path, development_preference)
|
129
|
+
if already_configured?(environment_file_path)
|
130
|
+
message = "Installing the Timber::Logger in #{environment_file_path}"
|
131
|
+
io.puts IO::Messages.task_complete(message), :green
|
132
|
+
return true
|
133
|
+
end
|
134
|
+
|
135
|
+
case development_preference
|
136
|
+
when :send
|
137
|
+
extra_comment = <<-NOTE
|
138
|
+
# Note: When you are done testing, simply instantiate the logger like this:
|
139
|
+
#
|
140
|
+
# logger = Timber::Logger.new(STDOUT)
|
141
|
+
#
|
142
|
+
# Be sure to remove the "log_device =" and "logger =" lines below.
|
143
|
+
NOTE
|
144
|
+
extra_comment = extra_comment.rstrip
|
145
|
+
install_http(environment_file_path, :inline, extra_comment: extra_comment)
|
146
|
+
when :dont_send
|
147
|
+
install_stdout(environment_file_path)
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
def setup_test_environment(environment_file_path)
|
152
|
+
if already_configured?(environment_file_path)
|
153
|
+
message = "Installing the Timber::Logger in #{environment_file_path}"
|
154
|
+
io.puts IO::Messages.task_complete(message), :green
|
155
|
+
return true
|
156
|
+
end
|
157
|
+
|
158
|
+
# Tests should not be logged by default.
|
159
|
+
install_nil(environment_file_path)
|
160
|
+
end
|
161
|
+
|
162
|
+
def setup_other_environment(app, environment_file_path, api_key_storage_preference)
|
163
|
+
if already_configured?(environment_file_path)
|
164
|
+
message = "Installing the Timber::Logger in #{environment_file_path}"
|
165
|
+
io.puts IO::Messages.task_complete(message), :green
|
166
|
+
return true
|
167
|
+
end
|
168
|
+
|
169
|
+
if app.heroku?
|
170
|
+
install_stdout(environment_file_path)
|
171
|
+
else
|
172
|
+
install_http(environment_file_path, api_key_storage_preference)
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
def install_nil(environment_file_path)
|
177
|
+
logger_code = <<-CODE
|
178
|
+
# Install the Timber.io logger but silence all logs (log to nil). We install the
|
179
|
+
# logger to ensure the Rails.logger object exposes the proper API.
|
180
|
+
logger = Timber::Logger.new(nil)
|
181
|
+
logger.level = config.log_level
|
182
|
+
config.logger = #{config_set_logger_code}
|
183
|
+
CODE
|
184
|
+
|
185
|
+
install_logger(environment_file_path, logger_code)
|
186
|
+
end
|
187
|
+
|
188
|
+
# Installs the Timber logger using the HTTP transport strategy in the
|
189
|
+
# specified environment file.
|
190
|
+
def install_http(environment_file_path, api_key_storage_type, options = {})
|
191
|
+
api_key_code = get_api_key_code(api_key_storage_type)
|
192
|
+
extra_comment = options[:extra_comment] ? "\n #{options[:extra_comment]}" : nil
|
193
|
+
|
194
|
+
logger_code = <<-CODE
|
195
|
+
# Install the Timber.io logger, send logs over HTTP.#{extra_comment}
|
196
|
+
log_device = Timber::LogDevices::HTTP.new(#{api_key_code})
|
197
|
+
logger = Timber::Logger.new(log_device)
|
198
|
+
logger.level = config.log_level
|
199
|
+
config.logger = #{config_set_logger_code}
|
200
|
+
CODE
|
201
|
+
|
202
|
+
install_logger(environment_file_path, logger_code)
|
203
|
+
end
|
204
|
+
|
205
|
+
# Installs the Timber logger using the STDOUT transport method in the specified
|
206
|
+
# environment file.
|
207
|
+
def install_stdout(environment_file_path)
|
208
|
+
logger_code = <<-CODE
|
209
|
+
# Install the Timber.io logger, send logs over STDOUT. Actual log delivery
|
210
|
+
# to the Timber service is handled external of this application.
|
211
|
+
logger = Timber::Logger.new(STDOUT)
|
212
|
+
logger.level = config.log_level
|
213
|
+
config.logger = #{config_set_logger_code}
|
214
|
+
CODE
|
215
|
+
|
216
|
+
install_logger(environment_file_path, logger_code)
|
217
|
+
end
|
218
|
+
|
219
|
+
# Determines if the environment is already configured.
|
220
|
+
def already_configured?(environment_file_path)
|
221
|
+
environment_file_contents = get_environment_file_contents(environment_file_path)
|
222
|
+
logger_installed?(environment_file_contents)
|
223
|
+
end
|
224
|
+
|
225
|
+
# Convenience method for getting the current environment file contents.
|
226
|
+
def get_environment_file_contents(environment_file_path)
|
227
|
+
FileHelper.read(environment_file_path)
|
228
|
+
end
|
229
|
+
|
230
|
+
# Determines if the Timber logger is already installed in the environment
|
231
|
+
# file contents.
|
232
|
+
def logger_installed?(environment_file_contents)
|
233
|
+
environment_file_contents.include?("Timber::Logger.new")
|
234
|
+
end
|
235
|
+
|
236
|
+
# Installs the Timber logger in the specified environment file with the
|
237
|
+
# provided logger code.
|
238
|
+
def install_logger(environment_file_path, logger_code)
|
239
|
+
current_contents = get_environment_file_contents(environment_file_path)
|
240
|
+
|
241
|
+
task_message = "Installing the Timber::Logger in #{environment_file_path}"
|
242
|
+
io.task(task_message) do
|
243
|
+
if !logger_installed?(current_contents)
|
244
|
+
new_contents = current_contents.sub(/\nend/, "\n\n#{logger_code}\nend")
|
245
|
+
FileHelper.write(environment_file_path, new_contents)
|
246
|
+
api.event(:file_written, path: environment_file_path)
|
247
|
+
end
|
248
|
+
end
|
249
|
+
|
250
|
+
true
|
251
|
+
end
|
252
|
+
end
|
253
|
+
end
|
254
|
+
end
|
255
|
+
end
|
@@ -0,0 +1,189 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
# Attempt to load rails so that we can determine the proper sub-installer to use.
|
4
|
+
begin
|
5
|
+
require "rails"
|
6
|
+
rescue LoadError
|
7
|
+
end
|
8
|
+
|
9
|
+
require "timber/cli/api"
|
10
|
+
require "timber/cli/installer"
|
11
|
+
require "timber/cli/installers/other"
|
12
|
+
require "timber/cli/installers/rails"
|
13
|
+
require "timber/cli/io/messages"
|
14
|
+
require "timber/cli/os_helper"
|
15
|
+
require "timber/log_devices/http"
|
16
|
+
require "timber/logger"
|
17
|
+
|
18
|
+
module Timber
|
19
|
+
class CLI
|
20
|
+
module Installers
|
21
|
+
# The root installer is the primary installer that is instantiated and
|
22
|
+
# run when the installer starts. It is responsible for instantiating
|
23
|
+
# the proper sub installers that install Timber in specific frameworks
|
24
|
+
# and environments.
|
25
|
+
class Root < Installer
|
26
|
+
def run(app)
|
27
|
+
io.puts IO::Messages.application_details(app)
|
28
|
+
io.puts ""
|
29
|
+
|
30
|
+
case io.ask_yes_no("Are the above details correct?", event_prompt: "App details correct?")
|
31
|
+
when :yes
|
32
|
+
install_platform(app)
|
33
|
+
run_sub_installer(app)
|
34
|
+
send_test_messages
|
35
|
+
confirm_log_delivery
|
36
|
+
|
37
|
+
assist_with_git
|
38
|
+
|
39
|
+
api.event(:success)
|
40
|
+
|
41
|
+
collect_feedback
|
42
|
+
|
43
|
+
io.puts ""
|
44
|
+
io.puts IO::Messages.separator
|
45
|
+
io.puts ""
|
46
|
+
io.puts IO::Messages.free_data
|
47
|
+
io.puts ""
|
48
|
+
|
49
|
+
true
|
50
|
+
|
51
|
+
when :no
|
52
|
+
io.puts ""
|
53
|
+
io.puts "Bummer. Head to this URL to update the details:"
|
54
|
+
io.puts ""
|
55
|
+
io.puts " #{IO::Messages.edit_app_url(app)}", :blue
|
56
|
+
io.puts ""
|
57
|
+
io.puts "exiting..."
|
58
|
+
|
59
|
+
false
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
private
|
64
|
+
def install_platform(app)
|
65
|
+
if app.heroku?
|
66
|
+
io.puts ""
|
67
|
+
io.puts IO::Messages.separator
|
68
|
+
io.puts ""
|
69
|
+
io.puts IO::Messages.heroku_install(app)
|
70
|
+
io.puts ""
|
71
|
+
io.ask_to_proceed
|
72
|
+
end
|
73
|
+
|
74
|
+
true
|
75
|
+
end
|
76
|
+
|
77
|
+
def run_sub_installer(app)
|
78
|
+
sub_installer = get_sub_installer
|
79
|
+
sub_installer.run(app)
|
80
|
+
end
|
81
|
+
|
82
|
+
def get_sub_installer
|
83
|
+
if defined?(::Rails)
|
84
|
+
Rails.new(io, api)
|
85
|
+
else
|
86
|
+
Other.new(io, api)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def send_test_messages
|
91
|
+
task_message = "Sending test logs"
|
92
|
+
io.task(task_message) do
|
93
|
+
http_device = LogDevices::HTTP.new(api.api_key)
|
94
|
+
logger = Logger.new(http_device)
|
95
|
+
logger.info("Welcome to Timber!")
|
96
|
+
logger.info("This is a test log to ensure the pipes are working")
|
97
|
+
logger.info("Be sure to commit and deploy your app to start seeing real logs")
|
98
|
+
# Close flushes and waits
|
99
|
+
http_device.close
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
def confirm_log_delivery
|
104
|
+
task_message = "Confirming log delivery"
|
105
|
+
|
106
|
+
io.task(task_message) do
|
107
|
+
api.wait_for_logs do |iteration|
|
108
|
+
io.write IO::Messages.task_start(task_message), :blue
|
109
|
+
io.write IO::Messages.spinner(iteration), :blue
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
def assist_with_git
|
115
|
+
io.puts ""
|
116
|
+
io.puts IO::Messages.separator
|
117
|
+
io.puts ""
|
118
|
+
io.puts "Last step! We need to commit these changes via git:"
|
119
|
+
io.puts ""
|
120
|
+
io.puts IO::Messages.git_commands
|
121
|
+
io.puts ""
|
122
|
+
|
123
|
+
if OSHelper.has_git?
|
124
|
+
case io.ask_yes_no("We can run these commands for you. Shall we?", event_prompt: "Run git commands?")
|
125
|
+
when :yes
|
126
|
+
io.puts ""
|
127
|
+
|
128
|
+
task_message = "Committing changes via git"
|
129
|
+
io.write IO::Messages.task_start(task_message)
|
130
|
+
|
131
|
+
committed = OSHelper.git_commit_changes
|
132
|
+
|
133
|
+
if committed
|
134
|
+
io.puts IO::Messages.task_complete(task_message), :green
|
135
|
+
else
|
136
|
+
io.puts IO::Messages.task_failed(task_message), :red
|
137
|
+
|
138
|
+
io.puts ""
|
139
|
+
io.puts "Bummer, it looks like we couldn't access the git command.", :yellow
|
140
|
+
io.puts "No problem though, just copy and paste the above commands to", :yellow
|
141
|
+
io.puts "run them manually.", :yellow
|
142
|
+
end
|
143
|
+
when :no
|
144
|
+
io.puts ""
|
145
|
+
io.puts "No problem. Just copy and paste the above commands to run them manually."
|
146
|
+
end
|
147
|
+
else
|
148
|
+
io.puts ""
|
149
|
+
io.puts "Finally, commit your changes:"
|
150
|
+
io.puts ""
|
151
|
+
io.puts IO::Messages.git_commands
|
152
|
+
end
|
153
|
+
|
154
|
+
io.puts ""
|
155
|
+
io.puts "=> Reminder: git push and deploy 🚀 to see logs in staging/production", :yellow
|
156
|
+
end
|
157
|
+
|
158
|
+
def collect_feedback
|
159
|
+
io.puts ""
|
160
|
+
io.puts IO::Messages.separator
|
161
|
+
io.puts ""
|
162
|
+
|
163
|
+
rating = io.ask("How would rate this install experience? 1 (bad) - 5 (perfect)", ["1", "2", "3", "4", "5"])
|
164
|
+
|
165
|
+
case rating
|
166
|
+
when "4", "5"
|
167
|
+
api.event(:feedback, rating: rating.to_i)
|
168
|
+
io.puts ""
|
169
|
+
io.puts IO::Messages.we_love_you_too
|
170
|
+
|
171
|
+
when "1", "2", "3"
|
172
|
+
io.puts ""
|
173
|
+
io.puts IO::Messages.bad_experience_message
|
174
|
+
io.puts ""
|
175
|
+
io.puts "Type your comments below (enter sends)"
|
176
|
+
io.puts ""
|
177
|
+
|
178
|
+
comments = io.gets
|
179
|
+
|
180
|
+
api.event(:feedback, rating: rating.to_i, comments: comments)
|
181
|
+
|
182
|
+
io.puts ""
|
183
|
+
io.puts "Thank you! We take feedback seriously and will work to improve this."
|
184
|
+
end
|
185
|
+
end
|
186
|
+
end
|
187
|
+
end
|
188
|
+
end
|
189
|
+
end
|