honeybadger 5.1.0 → 5.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (116) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +722 -713
  3. data/LICENSE +19 -19
  4. data/README.md +57 -57
  5. data/TROUBLESHOOTING.md +3 -3
  6. data/bin/honeybadger +5 -5
  7. data/lib/honeybadger/agent.rb +488 -488
  8. data/lib/honeybadger/backend/base.rb +116 -116
  9. data/lib/honeybadger/backend/debug.rb +22 -22
  10. data/lib/honeybadger/backend/null.rb +29 -29
  11. data/lib/honeybadger/backend/server.rb +62 -62
  12. data/lib/honeybadger/backend/test.rb +46 -46
  13. data/lib/honeybadger/backend.rb +27 -27
  14. data/lib/honeybadger/backtrace.rb +181 -181
  15. data/lib/honeybadger/breadcrumbs/active_support.rb +119 -119
  16. data/lib/honeybadger/breadcrumbs/breadcrumb.rb +53 -53
  17. data/lib/honeybadger/breadcrumbs/collector.rb +82 -82
  18. data/lib/honeybadger/breadcrumbs/logging.rb +55 -51
  19. data/lib/honeybadger/breadcrumbs/ring_buffer.rb +44 -44
  20. data/lib/honeybadger/breadcrumbs.rb +8 -8
  21. data/lib/honeybadger/cli/deploy.rb +43 -43
  22. data/lib/honeybadger/cli/exec.rb +143 -143
  23. data/lib/honeybadger/cli/helpers.rb +28 -28
  24. data/lib/honeybadger/cli/heroku.rb +129 -129
  25. data/lib/honeybadger/cli/install.rb +101 -101
  26. data/lib/honeybadger/cli/main.rb +237 -237
  27. data/lib/honeybadger/cli/notify.rb +67 -67
  28. data/lib/honeybadger/cli/test.rb +267 -267
  29. data/lib/honeybadger/cli.rb +14 -14
  30. data/lib/honeybadger/config/defaults.rb +336 -336
  31. data/lib/honeybadger/config/env.rb +42 -42
  32. data/lib/honeybadger/config/ruby.rb +146 -146
  33. data/lib/honeybadger/config/yaml.rb +76 -76
  34. data/lib/honeybadger/config.rb +416 -413
  35. data/lib/honeybadger/const.rb +20 -20
  36. data/lib/honeybadger/context_manager.rb +55 -55
  37. data/lib/honeybadger/conversions.rb +16 -16
  38. data/lib/honeybadger/init/hanami.rb +19 -0
  39. data/lib/honeybadger/init/rails.rb +38 -38
  40. data/lib/honeybadger/init/rake.rb +66 -66
  41. data/lib/honeybadger/init/ruby.rb +11 -11
  42. data/lib/honeybadger/init/sinatra.rb +57 -51
  43. data/lib/honeybadger/logging.rb +177 -177
  44. data/lib/honeybadger/notice.rb +579 -579
  45. data/lib/honeybadger/plugin.rb +210 -210
  46. data/lib/honeybadger/plugins/breadcrumbs.rb +111 -111
  47. data/lib/honeybadger/plugins/delayed_job/plugin.rb +56 -56
  48. data/lib/honeybadger/plugins/delayed_job.rb +22 -22
  49. data/lib/honeybadger/plugins/faktory.rb +52 -52
  50. data/lib/honeybadger/plugins/lambda.rb +71 -71
  51. data/lib/honeybadger/plugins/local_variables.rb +44 -44
  52. data/lib/honeybadger/plugins/passenger.rb +23 -23
  53. data/lib/honeybadger/plugins/rails.rb +72 -72
  54. data/lib/honeybadger/plugins/resque.rb +72 -72
  55. data/lib/honeybadger/plugins/shoryuken.rb +52 -52
  56. data/lib/honeybadger/plugins/sidekiq.rb +71 -71
  57. data/lib/honeybadger/plugins/sucker_punch.rb +18 -18
  58. data/lib/honeybadger/plugins/thor.rb +32 -32
  59. data/lib/honeybadger/plugins/warden.rb +19 -19
  60. data/lib/honeybadger/rack/error_notifier.rb +92 -92
  61. data/lib/honeybadger/rack/user_feedback.rb +88 -88
  62. data/lib/honeybadger/rack/user_informer.rb +45 -45
  63. data/lib/honeybadger/ruby.rb +2 -2
  64. data/lib/honeybadger/singleton.rb +103 -103
  65. data/lib/honeybadger/tasks.rb +22 -22
  66. data/lib/honeybadger/templates/feedback_form.erb +84 -84
  67. data/lib/honeybadger/util/http.rb +92 -92
  68. data/lib/honeybadger/util/lambda.rb +32 -32
  69. data/lib/honeybadger/util/request_hash.rb +73 -73
  70. data/lib/honeybadger/util/request_payload.rb +41 -41
  71. data/lib/honeybadger/util/revision.rb +39 -39
  72. data/lib/honeybadger/util/sanitizer.rb +214 -214
  73. data/lib/honeybadger/util/sql.rb +34 -34
  74. data/lib/honeybadger/util/stats.rb +50 -50
  75. data/lib/honeybadger/version.rb +4 -4
  76. data/lib/honeybadger/worker.rb +253 -253
  77. data/lib/honeybadger.rb +13 -11
  78. data/resources/ca-bundle.crt +3376 -3376
  79. data/vendor/capistrano-honeybadger/lib/capistrano/honeybadger.rb +5 -5
  80. data/vendor/capistrano-honeybadger/lib/capistrano/tasks/deploy.cap +89 -89
  81. data/vendor/capistrano-honeybadger/lib/honeybadger/capistrano/legacy.rb +47 -47
  82. data/vendor/capistrano-honeybadger/lib/honeybadger/capistrano.rb +2 -2
  83. data/vendor/cli/inifile.rb +628 -628
  84. data/vendor/cli/thor/actions/create_file.rb +103 -103
  85. data/vendor/cli/thor/actions/create_link.rb +59 -59
  86. data/vendor/cli/thor/actions/directory.rb +118 -118
  87. data/vendor/cli/thor/actions/empty_directory.rb +135 -135
  88. data/vendor/cli/thor/actions/file_manipulation.rb +316 -316
  89. data/vendor/cli/thor/actions/inject_into_file.rb +107 -107
  90. data/vendor/cli/thor/actions.rb +319 -319
  91. data/vendor/cli/thor/base.rb +656 -656
  92. data/vendor/cli/thor/command.rb +133 -133
  93. data/vendor/cli/thor/core_ext/hash_with_indifferent_access.rb +77 -77
  94. data/vendor/cli/thor/core_ext/io_binary_read.rb +10 -10
  95. data/vendor/cli/thor/core_ext/ordered_hash.rb +98 -98
  96. data/vendor/cli/thor/error.rb +32 -32
  97. data/vendor/cli/thor/group.rb +281 -281
  98. data/vendor/cli/thor/invocation.rb +178 -178
  99. data/vendor/cli/thor/line_editor/basic.rb +35 -35
  100. data/vendor/cli/thor/line_editor/readline.rb +88 -88
  101. data/vendor/cli/thor/line_editor.rb +17 -17
  102. data/vendor/cli/thor/parser/argument.rb +73 -73
  103. data/vendor/cli/thor/parser/arguments.rb +175 -175
  104. data/vendor/cli/thor/parser/option.rb +125 -125
  105. data/vendor/cli/thor/parser/options.rb +218 -218
  106. data/vendor/cli/thor/parser.rb +4 -4
  107. data/vendor/cli/thor/rake_compat.rb +71 -71
  108. data/vendor/cli/thor/runner.rb +322 -322
  109. data/vendor/cli/thor/shell/basic.rb +421 -421
  110. data/vendor/cli/thor/shell/color.rb +149 -149
  111. data/vendor/cli/thor/shell/html.rb +126 -126
  112. data/vendor/cli/thor/shell.rb +81 -81
  113. data/vendor/cli/thor/util.rb +267 -267
  114. data/vendor/cli/thor/version.rb +3 -3
  115. data/vendor/cli/thor.rb +484 -484
  116. metadata +4 -3
@@ -1,32 +1,32 @@
1
- module Honeybadger
2
- module Util
3
- class Lambda
4
- AWS_ENV_MAP = {
5
- "_HANDLER" => "handler",
6
- "AWS_REGION" => "region",
7
- "AWS_EXECUTION_ENV" => "runtime",
8
- "AWS_LAMBDA_FUNCTION_NAME" => "function",
9
- "AWS_LAMBDA_FUNCTION_MEMORY_SIZE" => "memory",
10
- "AWS_LAMBDA_FUNCTION_VERSION" => "version",
11
- "AWS_LAMBDA_LOG_GROUP_NAME" => "log_group",
12
- "AWS_LAMBDA_LOG_STREAM_NAME" => "log_name"
13
- }.freeze
14
-
15
- class << self
16
- def lambda_execution?
17
- !!ENV["AWS_LAMBDA_FUNCTION_NAME"]
18
- end
19
-
20
- def normalized_data
21
- AWS_ENV_MAP.each_with_object({}) do |(k, v), memo|
22
- memo[v] = ENV[k] if ENV[k]
23
- end
24
- end
25
-
26
- def trace_id
27
- ENV["_X_AMZN_TRACE_ID"]
28
- end
29
- end
30
- end
31
- end
32
- end
1
+ module Honeybadger
2
+ module Util
3
+ class Lambda
4
+ AWS_ENV_MAP = {
5
+ "_HANDLER" => "handler",
6
+ "AWS_REGION" => "region",
7
+ "AWS_EXECUTION_ENV" => "runtime",
8
+ "AWS_LAMBDA_FUNCTION_NAME" => "function",
9
+ "AWS_LAMBDA_FUNCTION_MEMORY_SIZE" => "memory",
10
+ "AWS_LAMBDA_FUNCTION_VERSION" => "version",
11
+ "AWS_LAMBDA_LOG_GROUP_NAME" => "log_group",
12
+ "AWS_LAMBDA_LOG_STREAM_NAME" => "log_name"
13
+ }.freeze
14
+
15
+ class << self
16
+ def lambda_execution?
17
+ !!ENV["AWS_LAMBDA_FUNCTION_NAME"]
18
+ end
19
+
20
+ def normalized_data
21
+ AWS_ENV_MAP.each_with_object({}) do |(k, v), memo|
22
+ memo[v] = ENV[k] if ENV[k]
23
+ end
24
+ end
25
+
26
+ def trace_id
27
+ ENV["_X_AMZN_TRACE_ID"]
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -1,73 +1,73 @@
1
- require 'set'
2
-
3
- module Honeybadger
4
- module Util
5
- # Constructs a request hash from a Rack::Request matching the /v1/notices
6
- # API specification.
7
- module RequestHash
8
- HTTP_HEADER_PREFIX = 'HTTP_'.freeze
9
-
10
- CGI_WHITELIST = %w(
11
- AUTH_TYPE
12
- CONTENT_LENGTH
13
- CONTENT_TYPE
14
- GATEWAY_INTERFACE
15
- HTTPS
16
- REMOTE_ADDR
17
- REMOTE_HOST
18
- REMOTE_IDENT
19
- REMOTE_USER
20
- REQUEST_METHOD
21
- SERVER_NAME
22
- SERVER_PORT
23
- SERVER_PROTOCOL
24
- SERVER_SOFTWARE
25
- ).freeze
26
-
27
- def self.from_env(env)
28
- return {} unless defined?(::Rack::Request)
29
- return {} unless env
30
-
31
- hash, request = {}, ::Rack::Request.new(env.dup)
32
-
33
- hash[:url] = extract_url(request)
34
- hash[:params] = extract_params(request)
35
- hash[:component] = hash[:params]['controller']
36
- hash[:action] = hash[:params]['action']
37
- hash[:session] = extract_session(request)
38
- hash[:cgi_data] = extract_cgi_data(request)
39
-
40
- hash
41
- end
42
-
43
- def self.extract_url(request)
44
- request.env['honeybadger.request.url'] || request.url
45
- rescue => e
46
- "Failed to access URL -- #{e}"
47
- end
48
-
49
- def self.extract_params(request)
50
- (request.env['action_dispatch.request.parameters'] || request.params).to_hash || {}
51
- rescue => e
52
- { error: "Failed to access params -- #{e}" }
53
- end
54
-
55
- def self.extract_session(request)
56
- request.session.to_hash
57
- rescue => e
58
- # Rails raises ArgumentError when `config.secret_token` is missing, and
59
- # ActionDispatch::Session::SessionRestoreError when the session can't be
60
- # restored.
61
- { error: "Failed to access session data -- #{e}" }
62
- end
63
-
64
- def self.extract_cgi_data(request)
65
- request.env.each_with_object({}) do |(k,v), env|
66
- next unless k.is_a?(String)
67
- next unless k.start_with?(HTTP_HEADER_PREFIX) || CGI_WHITELIST.include?(k)
68
- env[k] = v
69
- end
70
- end
71
- end
72
- end
73
- end
1
+ require 'set'
2
+
3
+ module Honeybadger
4
+ module Util
5
+ # Constructs a request hash from a Rack::Request matching the /v1/notices
6
+ # API specification.
7
+ module RequestHash
8
+ HTTP_HEADER_PREFIX = 'HTTP_'.freeze
9
+
10
+ CGI_WHITELIST = %w(
11
+ AUTH_TYPE
12
+ CONTENT_LENGTH
13
+ CONTENT_TYPE
14
+ GATEWAY_INTERFACE
15
+ HTTPS
16
+ REMOTE_ADDR
17
+ REMOTE_HOST
18
+ REMOTE_IDENT
19
+ REMOTE_USER
20
+ REQUEST_METHOD
21
+ SERVER_NAME
22
+ SERVER_PORT
23
+ SERVER_PROTOCOL
24
+ SERVER_SOFTWARE
25
+ ).freeze
26
+
27
+ def self.from_env(env)
28
+ return {} unless defined?(::Rack::Request)
29
+ return {} unless env
30
+
31
+ hash, request = {}, ::Rack::Request.new(env.dup)
32
+
33
+ hash[:url] = extract_url(request)
34
+ hash[:params] = extract_params(request)
35
+ hash[:component] = hash[:params]['controller']
36
+ hash[:action] = hash[:params]['action']
37
+ hash[:session] = extract_session(request)
38
+ hash[:cgi_data] = extract_cgi_data(request)
39
+
40
+ hash
41
+ end
42
+
43
+ def self.extract_url(request)
44
+ request.env['honeybadger.request.url'] || request.url
45
+ rescue => e
46
+ "Failed to access URL -- #{e}"
47
+ end
48
+
49
+ def self.extract_params(request)
50
+ (request.env['action_dispatch.request.parameters'] || request.params).to_hash || {}
51
+ rescue => e
52
+ { error: "Failed to access params -- #{e}" }
53
+ end
54
+
55
+ def self.extract_session(request)
56
+ request.session.to_hash
57
+ rescue => e
58
+ # Rails raises ArgumentError when `config.secret_token` is missing, and
59
+ # ActionDispatch::Session::SessionRestoreError when the session can't be
60
+ # restored.
61
+ { error: "Failed to access session data -- #{e}" }
62
+ end
63
+
64
+ def self.extract_cgi_data(request)
65
+ request.env.each_with_object({}) do |(k,v), env|
66
+ next unless k.is_a?(String)
67
+ next unless k.start_with?(HTTP_HEADER_PREFIX) || CGI_WHITELIST.include?(k)
68
+ env[k] = v
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
@@ -1,41 +1,41 @@
1
- require 'honeybadger/util/sanitizer'
2
-
3
- module Honeybadger
4
- module Util
5
- # Constructs/sanitizes request data for notices
6
- module RequestPayload
7
- # Default values to use for request data.
8
- DEFAULTS = {
9
- url: nil,
10
- component: nil,
11
- action: nil,
12
- params: {}.freeze,
13
- session: {}.freeze,
14
- cgi_data: {}.freeze
15
- }.freeze
16
-
17
- # Allowed keys.
18
- KEYS = DEFAULTS.keys.freeze
19
-
20
- # The cgi_data key where the raw Cookie header is stored.
21
- HTTP_COOKIE_KEY = 'HTTP_COOKIE'.freeze
22
-
23
- def self.build(opts = {})
24
- sanitizer = opts.fetch(:sanitizer) { Sanitizer.new }
25
-
26
- payload = DEFAULTS.dup
27
- KEYS.each do |key|
28
- next unless opts[key]
29
- payload[key] = sanitizer.sanitize(opts[key])
30
- end
31
-
32
- payload[:url] = sanitizer.filter_url(payload[:url]) if payload[:url]
33
- if payload[:cgi_data][HTTP_COOKIE_KEY]
34
- payload[:cgi_data][HTTP_COOKIE_KEY] = sanitizer.filter_cookies(payload[:cgi_data][HTTP_COOKIE_KEY])
35
- end
36
-
37
- payload
38
- end
39
- end
40
- end
41
- end
1
+ require 'honeybadger/util/sanitizer'
2
+
3
+ module Honeybadger
4
+ module Util
5
+ # Constructs/sanitizes request data for notices
6
+ module RequestPayload
7
+ # Default values to use for request data.
8
+ DEFAULTS = {
9
+ url: nil,
10
+ component: nil,
11
+ action: nil,
12
+ params: {}.freeze,
13
+ session: {}.freeze,
14
+ cgi_data: {}.freeze
15
+ }.freeze
16
+
17
+ # Allowed keys.
18
+ KEYS = DEFAULTS.keys.freeze
19
+
20
+ # The cgi_data key where the raw Cookie header is stored.
21
+ HTTP_COOKIE_KEY = 'HTTP_COOKIE'.freeze
22
+
23
+ def self.build(opts = {})
24
+ sanitizer = opts.fetch(:sanitizer) { Sanitizer.new }
25
+
26
+ payload = DEFAULTS.dup
27
+ KEYS.each do |key|
28
+ next unless opts[key]
29
+ payload[key] = sanitizer.sanitize(opts[key])
30
+ end
31
+
32
+ payload[:url] = sanitizer.filter_url(payload[:url]) if payload[:url]
33
+ if payload[:cgi_data][HTTP_COOKIE_KEY]
34
+ payload[:cgi_data][HTTP_COOKIE_KEY] = sanitizer.filter_cookies(payload[:cgi_data][HTTP_COOKIE_KEY])
35
+ end
36
+
37
+ payload
38
+ end
39
+ end
40
+ end
41
+ end
@@ -1,39 +1,39 @@
1
- module Honeybadger
2
- module Util
3
- class Revision
4
- class << self
5
- def detect(root = Dir.pwd)
6
- revision = from_heroku ||
7
- from_capistrano(root) ||
8
- from_git
9
-
10
- revision = revision.to_s.strip
11
- return unless revision =~ /\S/
12
-
13
- revision
14
- end
15
-
16
- private
17
-
18
- # Requires (currently) alpha platform feature `heroku labs:enable
19
- # runtime-dyno-metadata`
20
- #
21
- # See https://devcenter.heroku.com/articles/dyno-metadata
22
- def from_heroku
23
- ENV['HEROKU_SLUG_COMMIT']
24
- end
25
-
26
- def from_capistrano(root)
27
- file = File.join(root, 'REVISION')
28
- return nil unless File.file?(file)
29
- File.read(file) rescue nil
30
- end
31
-
32
- def from_git
33
- return nil unless File.directory?('.git')
34
- `git rev-parse HEAD 2> #{File::NULL}` rescue nil
35
- end
36
- end
37
- end
38
- end
39
- end
1
+ module Honeybadger
2
+ module Util
3
+ class Revision
4
+ class << self
5
+ def detect(root = Dir.pwd)
6
+ revision = from_heroku ||
7
+ from_capistrano(root) ||
8
+ from_git
9
+
10
+ revision = revision.to_s.strip
11
+ return unless revision =~ /\S/
12
+
13
+ revision
14
+ end
15
+
16
+ private
17
+
18
+ # Requires (currently) alpha platform feature `heroku labs:enable
19
+ # runtime-dyno-metadata`
20
+ #
21
+ # See https://devcenter.heroku.com/articles/dyno-metadata
22
+ def from_heroku
23
+ ENV['HEROKU_SLUG_COMMIT']
24
+ end
25
+
26
+ def from_capistrano(root)
27
+ file = File.join(root, 'REVISION')
28
+ return nil unless File.file?(file)
29
+ File.read(file) rescue nil
30
+ end
31
+
32
+ def from_git
33
+ return nil unless File.directory?('.git')
34
+ `git rev-parse HEAD 2> #{File::NULL}` rescue nil
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end