bugsnag-maze-runner 9.0.0 → 9.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/download-logs +1 -1
- data/bin/maze-runner +4 -1
- data/bin/purge-projects +1 -1
- data/bin/upload-app +1 -1
- data/lib/features/support/internal_hooks.rb +16 -4
- data/lib/maze/client/appium/bb_client.rb +5 -1
- data/lib/maze/client/appium/bs_client.rb +1 -1
- data/lib/maze/client/selenium/bb_client.rb +1 -1
- data/lib/maze/client/selenium/bs_client.rb +1 -1
- data/lib/maze/driver/appium.rb +1 -1
- data/lib/maze/hooks/appium_hooks.rb +1 -1
- data/lib/maze/hooks/logger_hooks.rb +28 -0
- data/lib/maze/loggers/file_logger.rb +32 -0
- data/lib/maze/loggers/log_util.rb +59 -0
- data/lib/maze/loggers/logger.rb +61 -0
- data/lib/maze/loggers/stdout_logger.rb +34 -0
- data/lib/maze/plugins/logging_scenarios_plugin.rb +19 -0
- data/lib/maze/server.rb +1 -1
- data/lib/maze.rb +1 -1
- metadata +8 -3
- data/lib/maze/logger.rb +0 -117
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2846c608ba08c4cd98faa8907c25e1d56ab36da97a56c28aa02aee8f39adf0b2
|
4
|
+
data.tar.gz: 75e3d297031547a4478c83added87975d5205e973f7777eddfe99718da664d9f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 51b9290030731e65a5f93df77000e17a404b5fab4ca8e728606d2c3f29be4b1846fe36cc2e3fbd034a1d0b100396f735d28bd969da158bc9118f14b14d70a5bf
|
7
|
+
data.tar.gz: 023ae9dee40ce4d5e01d9a7f0bdd926754f1145d0a113ca91862841df5e6186a2884c36acdadcc34139e21f81743f2dc82b9330fabb119c9909343f4f7fa2562
|
data/bin/download-logs
CHANGED
data/bin/maze-runner
CHANGED
@@ -40,7 +40,6 @@ require_relative '../lib/maze/errors'
|
|
40
40
|
require_relative '../lib/maze/generator'
|
41
41
|
require_relative '../lib/maze/helper'
|
42
42
|
require_relative '../lib/maze/http_request'
|
43
|
-
require_relative '../lib/maze/logger'
|
44
43
|
require_relative '../lib/maze/macos_utils'
|
45
44
|
require_relative '../lib/maze/maze_output'
|
46
45
|
require_relative '../lib/maze/metrics_processor'
|
@@ -53,6 +52,8 @@ require_relative '../lib/maze/repeaters/bugsnag_repeater'
|
|
53
52
|
require_relative '../lib/maze/runner'
|
54
53
|
require_relative '../lib/maze/terminating_server'
|
55
54
|
|
55
|
+
require_relative '../lib/maze/loggers/logger'
|
56
|
+
|
56
57
|
require_relative '../lib/maze/servlets/base_servlet'
|
57
58
|
require_relative '../lib/maze/servlets/all_commands_servlet'
|
58
59
|
require_relative '../lib/maze/servlets/command_servlet'
|
@@ -85,6 +86,7 @@ require_relative '../lib/maze/hooks/appium_hooks'
|
|
85
86
|
require_relative '../lib/maze/hooks/browser_hooks'
|
86
87
|
require_relative '../lib/maze/hooks/command_hooks'
|
87
88
|
require_relative '../lib/maze/hooks/error_code_hook'
|
89
|
+
require_relative '../lib/maze/hooks/logger_hooks'
|
88
90
|
|
89
91
|
require_relative '../lib/maze/driver/appium'
|
90
92
|
require_relative '../lib/maze/driver/browser'
|
@@ -93,6 +95,7 @@ require_relative '../lib/maze/plugins/bugsnag_reporting_plugin'
|
|
93
95
|
require_relative '../lib/maze/plugins/error_code_plugin'
|
94
96
|
require_relative '../lib/maze/plugins/global_retry_plugin'
|
95
97
|
require_relative '../lib/maze/plugins/datadog_metrics_plugin'
|
98
|
+
require_relative '../lib/maze/plugins/logging_scenarios_plugin'
|
96
99
|
|
97
100
|
# Require monkey-patches after everything else
|
98
101
|
require_relative '../lib/utils/selenium_money_patch'
|
data/bin/purge-projects
CHANGED
@@ -6,7 +6,7 @@ require 'em/pure_ruby'
|
|
6
6
|
|
7
7
|
require_relative '../lib/maze'
|
8
8
|
require_relative '../lib/maze/client/bb_api_client'
|
9
|
-
require_relative '../lib/maze/logger'
|
9
|
+
require_relative '../lib/maze/loggers/logger'
|
10
10
|
require_relative '../lib/maze/helper'
|
11
11
|
require 'optimist'
|
12
12
|
require 'uri'
|
data/bin/upload-app
CHANGED
@@ -7,7 +7,7 @@ require 'em/pure_ruby'
|
|
7
7
|
require_relative '../lib/maze'
|
8
8
|
require_relative '../lib/maze/client/bs_client_utils'
|
9
9
|
require_relative '../lib/maze/client/bb_client_utils'
|
10
|
-
require_relative '../lib/maze/logger'
|
10
|
+
require_relative '../lib/maze/loggers/logger'
|
11
11
|
require_relative '../lib/maze/helper'
|
12
12
|
require 'optimist'
|
13
13
|
require 'uri'
|
@@ -92,6 +92,9 @@ InstallPlugin do |config|
|
|
92
92
|
# Only add the retry plugin if --retry is not used on the command line
|
93
93
|
config.filters << Maze::Plugins::GlobalRetryPlugin.new(config) if config.options[:retry].zero?
|
94
94
|
|
95
|
+
# Add step logging
|
96
|
+
config.filters << Maze::Plugins::LoggingScenariosPlugin.new(config)
|
97
|
+
|
95
98
|
# TODO: Reporting of test failures as errors deactivated pending PLAT-10963
|
96
99
|
#config.filters << Maze::Plugins::BugsnagReportingPlugin.new(config)
|
97
100
|
end
|
@@ -113,6 +116,9 @@ Before do |scenario|
|
|
113
116
|
|
114
117
|
# Call any blocks registered by the client
|
115
118
|
Maze.hooks.call_before scenario
|
119
|
+
|
120
|
+
# Invoke the logger hook for the scenario
|
121
|
+
Maze::Hooks::LoggerHooks.before scenario
|
116
122
|
end
|
117
123
|
|
118
124
|
# General processing to be run after each scenario
|
@@ -122,6 +128,9 @@ After do |scenario|
|
|
122
128
|
Maze::MacosUtils.capture_screen(scenario)
|
123
129
|
end
|
124
130
|
|
131
|
+
# Invoke the logger hook for the scenario
|
132
|
+
Maze::Hooks::LoggerHooks.after scenario
|
133
|
+
|
125
134
|
# Call any blocks registered by the client
|
126
135
|
Maze.hooks.call_after scenario
|
127
136
|
|
@@ -184,17 +193,17 @@ def output_received_requests(request_type)
|
|
184
193
|
$stdout.puts "--- #{request_type} #{number} of #{count}"
|
185
194
|
|
186
195
|
$logger.info 'Request body:'
|
187
|
-
Maze::LogUtil.log_hash(Logger::Severity::INFO, request[:body])
|
196
|
+
Maze::Loggers::LogUtil.log_hash(Logger::Severity::INFO, request[:body])
|
188
197
|
|
189
198
|
$logger.info 'Request headers:'
|
190
|
-
Maze::LogUtil.log_hash(Logger::Severity::INFO, request[:request].header)
|
199
|
+
Maze::Loggers::LogUtil.log_hash(Logger::Severity::INFO, request[:request].header)
|
191
200
|
|
192
201
|
$logger.info 'Request digests:'
|
193
|
-
Maze::LogUtil.log_hash(Logger::Severity::INFO, request[:digests])
|
202
|
+
Maze::Loggers::LogUtil.log_hash(Logger::Severity::INFO, request[:digests])
|
194
203
|
|
195
204
|
$logger.info "Response body: #{request[:response].body}"
|
196
205
|
$logger.info 'Response headers:'
|
197
|
-
Maze::LogUtil.log_hash(Logger::Severity::INFO, request[:response].header)
|
206
|
+
Maze::Loggers::LogUtil.log_hash(Logger::Severity::INFO, request[:response].header)
|
198
207
|
end
|
199
208
|
end
|
200
209
|
end
|
@@ -226,6 +235,9 @@ end
|
|
226
235
|
|
227
236
|
# After all tests
|
228
237
|
AfterAll do
|
238
|
+
# Ensure the logger output is in the correct location
|
239
|
+
Maze::Hooks::LoggerHooks.after_all
|
240
|
+
|
229
241
|
maze_output = File.join(Dir.pwd, 'maze_output')
|
230
242
|
maze_output_zip = File.join(Dir.pwd, 'maze_output.zip')
|
231
243
|
# zip a folder with files and subfolders
|
@@ -30,6 +30,8 @@ module Maze
|
|
30
30
|
interval = 300
|
31
31
|
elsif error.message.include? 'There are no devices available'
|
32
32
|
interval = 120
|
33
|
+
elsif error.message.include? 'Appium Settings app is not running'
|
34
|
+
interval = 10
|
33
35
|
else
|
34
36
|
# Do not retry in any other case
|
35
37
|
end
|
@@ -73,7 +75,9 @@ module Maze
|
|
73
75
|
}
|
74
76
|
capabilities.deep_merge! BitBarClientUtils.dashboard_capabilities
|
75
77
|
capabilities.deep_merge! BitBarDevices.get_available_device(config.device)
|
78
|
+
capabilities['bitbar:options']['appiumVersion'] = config.appium_version unless config.appium_version.nil?
|
76
79
|
capabilities.deep_merge! JSON.parse(config.capabilities_option)
|
80
|
+
|
77
81
|
capabilities
|
78
82
|
end
|
79
83
|
|
@@ -87,7 +91,7 @@ module Maze
|
|
87
91
|
$logger.info 'Appium session(s) created:'
|
88
92
|
@session_ids.each do |id|
|
89
93
|
link = api_client.get_device_session_ui_link(id)
|
90
|
-
$logger.info Maze::LogUtil.linkify(link, "BitBar session: #{id}") if link
|
94
|
+
$logger.info Maze::Loggers::LogUtil.linkify(link, "BitBar session: #{id}") if link
|
91
95
|
end
|
92
96
|
end
|
93
97
|
|
@@ -68,7 +68,7 @@ module Maze
|
|
68
68
|
def log_run_intro
|
69
69
|
# Log a link to the BrowserStack session search dashboard
|
70
70
|
url = "https://app-automate.browserstack.com/dashboard/v2/search?query=#{Maze.run_uuid}&type=builds"
|
71
|
-
$logger.info Maze::LogUtil.linkify(url, 'BrowserStack session(s)')
|
71
|
+
$logger.info Maze::Loggers::LogUtil.linkify(url, 'BrowserStack session(s)')
|
72
72
|
end
|
73
73
|
|
74
74
|
def log_run_outro
|
@@ -34,7 +34,7 @@ module Maze
|
|
34
34
|
$logger.info 'Selenium session created:'
|
35
35
|
id = Maze.driver.session_id
|
36
36
|
link = api_client.get_device_session_ui_link(id)
|
37
|
-
$logger.info Maze::LogUtil.linkify link, 'BitBar session(s)' if link
|
37
|
+
$logger.info Maze::Loggers::LogUtil.linkify link, 'BitBar session(s)' if link
|
38
38
|
end
|
39
39
|
|
40
40
|
def stop_session
|
@@ -85,7 +85,7 @@ module Maze
|
|
85
85
|
def log_session_info
|
86
86
|
# Log a link to the BrowserStack session search dashboard
|
87
87
|
url = "https://automate.browserstack.com/dashboard/v2/search?query=#{Maze.run_uuid}&type=builds"
|
88
|
-
$logger.info Maze::LogUtil.linkify url, 'BrowserStack session(s)'
|
88
|
+
$logger.info Maze::Loggers::LogUtil.linkify url, 'BrowserStack session(s)'
|
89
89
|
end
|
90
90
|
end
|
91
91
|
end
|
data/lib/maze/driver/appium.rb
CHANGED
@@ -43,7 +43,6 @@ module Maze
|
|
43
43
|
end
|
44
44
|
|
45
45
|
def after_all
|
46
|
-
@client&.log_run_outro
|
47
46
|
if $success
|
48
47
|
Maze::Plugins::DatadogMetricsPlugin.send_increment('appium.test_succeeded')
|
49
48
|
else
|
@@ -57,6 +56,7 @@ module Maze
|
|
57
56
|
|
58
57
|
def at_exit
|
59
58
|
if @client
|
59
|
+
@client.log_run_outro
|
60
60
|
$logger.info 'Stopping the Appium session'
|
61
61
|
@client.stop_session
|
62
62
|
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Maze
|
4
|
+
module Hooks
|
5
|
+
# Hooks for Browser mode use
|
6
|
+
class LoggerHooks
|
7
|
+
class << self
|
8
|
+
def before(scenario)
|
9
|
+
location = "\"# #{scenario.location}\""
|
10
|
+
$logger.trace ''
|
11
|
+
$logger.trace "\n--- Begin Scenario: #{scenario.name} #{location}"
|
12
|
+
end
|
13
|
+
|
14
|
+
def after(scenario)
|
15
|
+
location = "\"# #{scenario.location}\""
|
16
|
+
$logger.trace "--- End Scenario: #{scenario.name} #{location}"
|
17
|
+
$logger.trace ''
|
18
|
+
end
|
19
|
+
|
20
|
+
def after_all
|
21
|
+
if ENV['BUILDKITE']
|
22
|
+
FileUtils.mv("#{Dir.pwd}/#{Maze::Loggers::FileLogger::LOG_LOCATION}", "#{Dir.pwd}/maze_output/maze-runner.log")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'logger'
|
4
|
+
|
5
|
+
module Maze
|
6
|
+
module Loggers
|
7
|
+
# A logger to file, always logging at TRACE level
|
8
|
+
class FileLogger < Logger
|
9
|
+
|
10
|
+
LOG_LOCATION = 'maze-runner.log'
|
11
|
+
|
12
|
+
include Singleton
|
13
|
+
|
14
|
+
attr_accessor :datetime_format
|
15
|
+
|
16
|
+
def initialize
|
17
|
+
# Remove the previous log file if it exists
|
18
|
+
File.delete(LOG_LOCATION) if File.exist?(LOG_LOCATION)
|
19
|
+
|
20
|
+
super(LOG_LOCATION, level: ::Logger::TRACE)
|
21
|
+
|
22
|
+
@datetime_format = '%H:%M:%S'
|
23
|
+
|
24
|
+
@formatter = proc do |severity, time, _name, message|
|
25
|
+
formatted_time = time.strftime(@datetime_format)
|
26
|
+
|
27
|
+
"\e[2m[#{formatted_time}]\e[0m #{severity.rjust(5)}: #{message}\n"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Maze
|
4
|
+
module Loggers
|
5
|
+
# A collection of logging utilities
|
6
|
+
class LogUtil
|
7
|
+
class << self
|
8
|
+
# Logs Hash-based data, accounting for things like file upload requests that are too big to log meaningfully.
|
9
|
+
#
|
10
|
+
# @param severity [Integer] A constant from Logger::Severity
|
11
|
+
# @param data [Hash] The data to log (currently needs to be a Hash)
|
12
|
+
def log_hash(severity, data)
|
13
|
+
return unless data.is_a? Hash
|
14
|
+
|
15
|
+
# Try to pretty print as JSON, if not too big
|
16
|
+
begin
|
17
|
+
json = JSON.pretty_generate data
|
18
|
+
if json.length < 128 * 1024
|
19
|
+
$logger.add severity, json
|
20
|
+
else
|
21
|
+
log_hash_by_field severity, data
|
22
|
+
end
|
23
|
+
rescue Encoding::UndefinedConversionError => error
|
24
|
+
# Just give up, we don't want to risk a further error trying to log garbage
|
25
|
+
Bugsnag.notify error
|
26
|
+
$logger.error 'Unable to log hash as JSON'
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
# Logs a hash field by field,
|
31
|
+
#
|
32
|
+
# @param severity [Integer] A Logger::Severity
|
33
|
+
# @param hash [Hash] The Hash
|
34
|
+
def log_hash_by_field(severity, hash)
|
35
|
+
hash.keys.each do |key|
|
36
|
+
value = hash[key].to_s
|
37
|
+
if value.length < 1024
|
38
|
+
$logger.add severity, " #{key}: #{value}"
|
39
|
+
else
|
40
|
+
$logger.add severity, " #{key} (length): #{value.length}"
|
41
|
+
$logger.add severity, " #{key} (start): #{value[0, 1024]}"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
# Produces a clickable link when logged in Buildkite
|
47
|
+
# @param url [String] Link URL
|
48
|
+
# @param text [String] Link text
|
49
|
+
def linkify(url, text)
|
50
|
+
if ENV['BUILDKITE']
|
51
|
+
"\033]1339;url='#{url}';content='#{text}'\a"
|
52
|
+
else
|
53
|
+
"#{text}: #{url}"
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'bugsnag'
|
4
|
+
require 'logger'
|
5
|
+
require 'singleton'
|
6
|
+
require_relative 'file_logger'
|
7
|
+
require_relative 'log_util'
|
8
|
+
require_relative 'stdout_logger'
|
9
|
+
|
10
|
+
# Monkey patch a 'trace' log level into the standard Logger
|
11
|
+
class Logger
|
12
|
+
remove_const(:SEV_LABEL)
|
13
|
+
SEV_LABEL = {
|
14
|
+
-1 => 'TRACE',
|
15
|
+
0 => 'DEBUG',
|
16
|
+
1 => 'INFO',
|
17
|
+
2 => 'WARN',
|
18
|
+
3 => 'ERROR',
|
19
|
+
4 => 'FATAL',
|
20
|
+
5 => 'ANY'
|
21
|
+
}
|
22
|
+
|
23
|
+
module Severity
|
24
|
+
TRACE=-1
|
25
|
+
end
|
26
|
+
|
27
|
+
def trace(name = nil, &block)
|
28
|
+
add(TRACE, nil, name, &block)
|
29
|
+
end
|
30
|
+
|
31
|
+
def trace?
|
32
|
+
@level <= TRACE
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
module Maze
|
37
|
+
module Loggers
|
38
|
+
class Logger
|
39
|
+
include Singleton
|
40
|
+
|
41
|
+
attr_accessor :stdout_logger, :file_logger
|
42
|
+
|
43
|
+
def initialize
|
44
|
+
@stdout_logger = Maze::Loggers::STDOUTLogger.instance
|
45
|
+
@file_logger = Maze::Loggers::FileLogger.instance
|
46
|
+
end
|
47
|
+
|
48
|
+
# Attempts to forward all method calls to both loggers
|
49
|
+
def method_missing(method, *args, &block)
|
50
|
+
if @stdout_logger.respond_to?(method) && @file_logger.respond_to?(method)
|
51
|
+
@stdout_logger.send(method, *args, &block)
|
52
|
+
@file_logger.send(method, *args, &block)
|
53
|
+
else
|
54
|
+
super
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
$logger = Maze::Loggers::Logger.instance
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'logger'
|
4
|
+
|
5
|
+
module Maze
|
6
|
+
module Loggers
|
7
|
+
# A logger to STDOUT, with level configured according to the environment
|
8
|
+
class STDOUTLogger < Logger
|
9
|
+
include Singleton
|
10
|
+
|
11
|
+
attr_accessor :datetime_format
|
12
|
+
|
13
|
+
def initialize
|
14
|
+
if ENV['TRACE']
|
15
|
+
super(STDOUT, level: ::Logger::TRACE)
|
16
|
+
elsif ENV['DEBUG']
|
17
|
+
super(STDOUT, level: ::Logger::DEBUG)
|
18
|
+
elsif ENV['QUIET']
|
19
|
+
super(STDOUT, level: ::Logger::ERROR)
|
20
|
+
else
|
21
|
+
super(STDOUT, level: ::Logger::INFO)
|
22
|
+
end
|
23
|
+
|
24
|
+
@datetime_format = '%H:%M:%S'
|
25
|
+
|
26
|
+
@formatter = proc do |severity, time, _name, message|
|
27
|
+
formatted_time = time.strftime(@datetime_format)
|
28
|
+
|
29
|
+
"\e[2m[#{formatted_time}]\e[0m #{severity.rjust(5)}: #{message}\n"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'bugsnag'
|
4
|
+
require 'cucumber/core/filter'
|
5
|
+
|
6
|
+
module Maze
|
7
|
+
module Plugins
|
8
|
+
class LoggingScenariosPlugin < Cucumber::Core::Filter.new(:configuration)
|
9
|
+
|
10
|
+
def test_case(test_case)
|
11
|
+
configuration.on_event(:test_step_started) do |event|
|
12
|
+
$logger.trace "Step started: #{event.test_step.to_s}"
|
13
|
+
end
|
14
|
+
|
15
|
+
super
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/maze/server.rb
CHANGED
data/lib/maze.rb
CHANGED
@@ -7,7 +7,7 @@ require_relative 'maze/timers'
|
|
7
7
|
# Glues the various parts of MazeRunner together that need to be accessed globally,
|
8
8
|
# providing an alternative to the proliferation of global variables or singletons.
|
9
9
|
module Maze
|
10
|
-
VERSION = '9.
|
10
|
+
VERSION = '9.1.0'
|
11
11
|
|
12
12
|
class << self
|
13
13
|
attr_accessor :check, :driver, :internal_hooks, :mode, :start_time, :dynamic_retry, :public_address,
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bugsnag-maze-runner
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 9.
|
4
|
+
version: 9.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Steve Kirkland
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-01-
|
11
|
+
date: 2024-01-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cucumber
|
@@ -409,9 +409,13 @@ files:
|
|
409
409
|
- lib/maze/hooks/command_hooks.rb
|
410
410
|
- lib/maze/hooks/error_code_hook.rb
|
411
411
|
- lib/maze/hooks/hooks.rb
|
412
|
+
- lib/maze/hooks/logger_hooks.rb
|
412
413
|
- lib/maze/http_request.rb
|
413
414
|
- lib/maze/interactive_cli.rb
|
414
|
-
- lib/maze/
|
415
|
+
- lib/maze/loggers/file_logger.rb
|
416
|
+
- lib/maze/loggers/log_util.rb
|
417
|
+
- lib/maze/loggers/logger.rb
|
418
|
+
- lib/maze/loggers/stdout_logger.rb
|
415
419
|
- lib/maze/macos_utils.rb
|
416
420
|
- lib/maze/maze_output.rb
|
417
421
|
- lib/maze/metrics_processor.rb
|
@@ -424,6 +428,7 @@ files:
|
|
424
428
|
- lib/maze/plugins/datadog_metrics_plugin.rb
|
425
429
|
- lib/maze/plugins/error_code_plugin.rb
|
426
430
|
- lib/maze/plugins/global_retry_plugin.rb
|
431
|
+
- lib/maze/plugins/logging_scenarios_plugin.rb
|
427
432
|
- lib/maze/proxy.rb
|
428
433
|
- lib/maze/repeaters/aspecto_repeater.rb
|
429
434
|
- lib/maze/repeaters/bugsnag_repeater.rb
|
data/lib/maze/logger.rb
DELETED
@@ -1,117 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'bugsnag'
|
4
|
-
require 'logger'
|
5
|
-
require 'singleton'
|
6
|
-
|
7
|
-
# Monkey patch a 'trace' log level into the standard Logger
|
8
|
-
class Logger
|
9
|
-
remove_const(:SEV_LABEL)
|
10
|
-
SEV_LABEL = {
|
11
|
-
-1 => 'TRACE',
|
12
|
-
0 => 'DEBUG',
|
13
|
-
1 => 'INFO',
|
14
|
-
2 => 'WARN',
|
15
|
-
3 => 'ERROR',
|
16
|
-
4 => 'FATAL',
|
17
|
-
5 => 'ANY'
|
18
|
-
}
|
19
|
-
|
20
|
-
module Severity
|
21
|
-
TRACE=-1
|
22
|
-
end
|
23
|
-
|
24
|
-
def trace(name = nil, &block)
|
25
|
-
add(TRACE, nil, name, &block)
|
26
|
-
end
|
27
|
-
|
28
|
-
def trace?
|
29
|
-
@level <= TRACE
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
# Logger classes
|
34
|
-
module Maze
|
35
|
-
# A logger, with level configured according to the environment
|
36
|
-
class Logger < Logger
|
37
|
-
include Singleton
|
38
|
-
|
39
|
-
attr_accessor :datetime_format
|
40
|
-
|
41
|
-
def initialize
|
42
|
-
if ENV['TRACE']
|
43
|
-
super(STDOUT, level: Logger::TRACE)
|
44
|
-
elsif ENV['DEBUG']
|
45
|
-
super(STDOUT, level: Logger::DEBUG)
|
46
|
-
elsif ENV['QUIET']
|
47
|
-
super(STDOUT, level: Logger::ERROR)
|
48
|
-
else
|
49
|
-
super(STDOUT, level: Logger::INFO)
|
50
|
-
end
|
51
|
-
|
52
|
-
@datetime_format = '%H:%M:%S'
|
53
|
-
|
54
|
-
@formatter = proc do |severity, time, _name, message|
|
55
|
-
formatted_time = time.strftime(@datetime_format)
|
56
|
-
|
57
|
-
"\e[2m[#{formatted_time}]\e[0m #{severity.rjust(5)}: #{message}\n"
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
$logger = Maze::Logger.instance
|
63
|
-
|
64
|
-
# A collection of logging utilities
|
65
|
-
class LogUtil
|
66
|
-
class << self
|
67
|
-
# Logs Hash-based data, accounting for things like file upload requests that are too big to log meaningfully.
|
68
|
-
#
|
69
|
-
# @param severity [Integer] A constant from Logger::Severity
|
70
|
-
# @param data [Hash] The data to log (currently needs to be a Hash)
|
71
|
-
def log_hash(severity, data)
|
72
|
-
return unless data.is_a? Hash
|
73
|
-
|
74
|
-
# Try to pretty print as JSON, if not too big
|
75
|
-
begin
|
76
|
-
json = JSON.pretty_generate data
|
77
|
-
if json.length < 128 * 1024
|
78
|
-
$logger.add severity, json
|
79
|
-
else
|
80
|
-
log_hash_by_field severity, data
|
81
|
-
end
|
82
|
-
rescue Encoding::UndefinedConversionError => error
|
83
|
-
# Just give up, we don't want to risk a further error trying to log garbage
|
84
|
-
Bugsnag.notify error
|
85
|
-
$logger.error 'Unable to log hash as JSON'
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
# Logs a hash field by field,
|
90
|
-
#
|
91
|
-
# @param severity [Integer] A Logger::Severity
|
92
|
-
# @param hash [Hash] The Hash
|
93
|
-
def log_hash_by_field(severity, hash)
|
94
|
-
hash.keys.each do |key|
|
95
|
-
value = hash[key].to_s
|
96
|
-
if value.length < 1024
|
97
|
-
$logger.add severity, " #{key}: #{value}"
|
98
|
-
else
|
99
|
-
$logger.add severity, " #{key} (length): #{value.length}"
|
100
|
-
$logger.add severity, " #{key} (start): #{value[0, 1024]}"
|
101
|
-
end
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
# Produces a clickable link when logged in Buildkite
|
106
|
-
# @param url [String] Link URL
|
107
|
-
# @param text [String] Link text
|
108
|
-
def linkify(url, text)
|
109
|
-
if ENV['BUILDKITE']
|
110
|
-
"\033]1339;url='#{url}';content='#{text}'\a"
|
111
|
-
else
|
112
|
-
"#{text}: #{url}"
|
113
|
-
end
|
114
|
-
end
|
115
|
-
end
|
116
|
-
end
|
117
|
-
end
|