sentry-raven 3.1.1 → 3.1.2
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/.craft.yml +9 -5
- data/.scripts/bump-version.rb +5 -0
- data/CHANGELOG.md +11 -0
- data/Gemfile +5 -1
- data/Makefile +3 -0
- data/README.md +19 -7
- data/lib/raven/base.rb +1 -0
- data/lib/raven/configuration.rb +0 -1
- data/lib/raven/event.rb +5 -1
- data/lib/raven/instance.rb +7 -1
- data/lib/raven/integrations/delayed_job.rb +1 -1
- data/lib/raven/integrations/rack.rb +2 -14
- data/lib/raven/transports/http.rb +2 -1
- data/lib/raven/utils/request_id.rb +16 -0
- data/lib/raven/version.rb +1 -1
- data/sentry-raven.gemspec +7 -0
- metadata +10 -148
- data/.github/ISSUE_TEMPLATE/bug_report.md +0 -32
- data/.github/pull_request_template.md +0 -16
- data/.github/workflows/test.yml +0 -92
- data/.github/workflows/zeus_upload.yml +0 -32
- data/.gitignore +0 -16
- data/.gitmodules +0 -0
- data/.rspec +0 -1
- data/.rubocop.yml +0 -112
- data/.scripts/bump-version.sh +0 -9
- data/CONTRIBUTING.md +0 -71
- data/sentry-ruby/.gitignore +0 -11
- data/sentry-ruby/.rspec +0 -3
- data/sentry-ruby/.travis.yml +0 -6
- data/sentry-ruby/CODE_OF_CONDUCT.md +0 -74
- data/sentry-ruby/Gemfile +0 -9
- data/sentry-ruby/LICENSE.txt +0 -21
- data/sentry-ruby/README.md +0 -44
- data/sentry-ruby/Rakefile +0 -6
- data/sentry-ruby/bin/console +0 -14
- data/sentry-ruby/bin/setup +0 -8
- data/sentry-ruby/examples/rails-6.0/.browserslistrc +0 -1
- data/sentry-ruby/examples/rails-6.0/.gitignore +0 -35
- data/sentry-ruby/examples/rails-6.0/Gemfile +0 -58
- data/sentry-ruby/examples/rails-6.0/README.md +0 -23
- data/sentry-ruby/examples/rails-6.0/Rakefile +0 -6
- data/sentry-ruby/examples/rails-6.0/app/assets/config/manifest.js +0 -2
- data/sentry-ruby/examples/rails-6.0/app/assets/images/.keep +0 -0
- data/sentry-ruby/examples/rails-6.0/app/assets/stylesheets/application.css +0 -15
- data/sentry-ruby/examples/rails-6.0/app/channels/application_cable/channel.rb +0 -4
- data/sentry-ruby/examples/rails-6.0/app/channels/application_cable/connection.rb +0 -4
- data/sentry-ruby/examples/rails-6.0/app/controllers/application_controller.rb +0 -2
- data/sentry-ruby/examples/rails-6.0/app/controllers/concerns/.keep +0 -0
- data/sentry-ruby/examples/rails-6.0/app/controllers/welcome_controller.rb +0 -23
- data/sentry-ruby/examples/rails-6.0/app/helpers/application_helper.rb +0 -2
- data/sentry-ruby/examples/rails-6.0/app/javascript/channels/consumer.js +0 -6
- data/sentry-ruby/examples/rails-6.0/app/javascript/channels/index.js +0 -5
- data/sentry-ruby/examples/rails-6.0/app/javascript/packs/application.js +0 -17
- data/sentry-ruby/examples/rails-6.0/app/jobs/application_job.rb +0 -7
- data/sentry-ruby/examples/rails-6.0/app/mailers/application_mailer.rb +0 -4
- data/sentry-ruby/examples/rails-6.0/app/models/application_record.rb +0 -3
- data/sentry-ruby/examples/rails-6.0/app/models/concerns/.keep +0 -0
- data/sentry-ruby/examples/rails-6.0/app/views/layouts/application.html.erb +0 -15
- data/sentry-ruby/examples/rails-6.0/app/views/layouts/mailer.html.erb +0 -13
- data/sentry-ruby/examples/rails-6.0/app/views/layouts/mailer.text.erb +0 -1
- data/sentry-ruby/examples/rails-6.0/app/views/welcome/report_demo.html.erb +0 -22
- data/sentry-ruby/examples/rails-6.0/app/views/welcome/view_error.html.erb +0 -1
- data/sentry-ruby/examples/rails-6.0/app/workers/error_worker.rb +0 -7
- data/sentry-ruby/examples/rails-6.0/babel.config.js +0 -72
- data/sentry-ruby/examples/rails-6.0/bin/bundle +0 -114
- data/sentry-ruby/examples/rails-6.0/bin/rails +0 -9
- data/sentry-ruby/examples/rails-6.0/bin/rake +0 -9
- data/sentry-ruby/examples/rails-6.0/bin/setup +0 -36
- data/sentry-ruby/examples/rails-6.0/bin/spring +0 -17
- data/sentry-ruby/examples/rails-6.0/bin/webpack +0 -18
- data/sentry-ruby/examples/rails-6.0/bin/webpack-dev-server +0 -18
- data/sentry-ruby/examples/rails-6.0/bin/yarn +0 -11
- data/sentry-ruby/examples/rails-6.0/config.ru +0 -5
- data/sentry-ruby/examples/rails-6.0/config/application.rb +0 -28
- data/sentry-ruby/examples/rails-6.0/config/boot.rb +0 -4
- data/sentry-ruby/examples/rails-6.0/config/cable.yml +0 -10
- data/sentry-ruby/examples/rails-6.0/config/credentials.yml.enc +0 -1
- data/sentry-ruby/examples/rails-6.0/config/database.yml +0 -25
- data/sentry-ruby/examples/rails-6.0/config/environment.rb +0 -5
- data/sentry-ruby/examples/rails-6.0/config/environments/development.rb +0 -62
- data/sentry-ruby/examples/rails-6.0/config/environments/production.rb +0 -112
- data/sentry-ruby/examples/rails-6.0/config/environments/test.rb +0 -48
- data/sentry-ruby/examples/rails-6.0/config/initializers/application_controller_renderer.rb +0 -8
- data/sentry-ruby/examples/rails-6.0/config/initializers/assets.rb +0 -14
- data/sentry-ruby/examples/rails-6.0/config/initializers/backtrace_silencers.rb +0 -7
- data/sentry-ruby/examples/rails-6.0/config/initializers/content_security_policy.rb +0 -30
- data/sentry-ruby/examples/rails-6.0/config/initializers/cookies_serializer.rb +0 -5
- data/sentry-ruby/examples/rails-6.0/config/initializers/filter_parameter_logging.rb +0 -4
- data/sentry-ruby/examples/rails-6.0/config/initializers/inflections.rb +0 -16
- data/sentry-ruby/examples/rails-6.0/config/initializers/mime_types.rb +0 -4
- data/sentry-ruby/examples/rails-6.0/config/initializers/wrap_parameters.rb +0 -14
- data/sentry-ruby/examples/rails-6.0/config/locales/en.yml +0 -33
- data/sentry-ruby/examples/rails-6.0/config/puma.rb +0 -38
- data/sentry-ruby/examples/rails-6.0/config/routes.rb +0 -10
- data/sentry-ruby/examples/rails-6.0/config/spring.rb +0 -6
- data/sentry-ruby/examples/rails-6.0/config/storage.yml +0 -34
- data/sentry-ruby/examples/rails-6.0/config/webpack/development.js +0 -5
- data/sentry-ruby/examples/rails-6.0/config/webpack/environment.js +0 -3
- data/sentry-ruby/examples/rails-6.0/config/webpack/production.js +0 -5
- data/sentry-ruby/examples/rails-6.0/config/webpack/test.js +0 -5
- data/sentry-ruby/examples/rails-6.0/config/webpacker.yml +0 -96
- data/sentry-ruby/examples/rails-6.0/db/seeds.rb +0 -7
- data/sentry-ruby/examples/rails-6.0/lib/assets/.keep +0 -0
- data/sentry-ruby/examples/rails-6.0/lib/tasks/.keep +0 -0
- data/sentry-ruby/examples/rails-6.0/package.json +0 -15
- data/sentry-ruby/examples/rails-6.0/postcss.config.js +0 -12
- data/sentry-ruby/examples/rails-6.0/public/404.html +0 -67
- data/sentry-ruby/examples/rails-6.0/public/422.html +0 -67
- data/sentry-ruby/examples/rails-6.0/public/500.html +0 -66
- data/sentry-ruby/examples/rails-6.0/public/apple-touch-icon-precomposed.png +0 -0
- data/sentry-ruby/examples/rails-6.0/public/apple-touch-icon.png +0 -0
- data/sentry-ruby/examples/rails-6.0/public/favicon.ico +0 -0
- data/sentry-ruby/examples/rails-6.0/public/robots.txt +0 -1
- data/sentry-ruby/examples/rails-6.0/storage/.keep +0 -0
- data/sentry-ruby/examples/rails-6.0/test/application_system_test_case.rb +0 -5
- data/sentry-ruby/examples/rails-6.0/test/channels/application_cable/connection_test.rb +0 -11
- data/sentry-ruby/examples/rails-6.0/test/controllers/.keep +0 -0
- data/sentry-ruby/examples/rails-6.0/test/fixtures/.keep +0 -0
- data/sentry-ruby/examples/rails-6.0/test/fixtures/files/.keep +0 -0
- data/sentry-ruby/examples/rails-6.0/test/helpers/.keep +0 -0
- data/sentry-ruby/examples/rails-6.0/test/integration/.keep +0 -0
- data/sentry-ruby/examples/rails-6.0/test/mailers/.keep +0 -0
- data/sentry-ruby/examples/rails-6.0/test/models/.keep +0 -0
- data/sentry-ruby/examples/rails-6.0/test/system/.keep +0 -0
- data/sentry-ruby/examples/rails-6.0/test/test_helper.rb +0 -13
- data/sentry-ruby/examples/rails-6.0/vendor/.keep +0 -0
- data/sentry-ruby/examples/rails-6.0/yarn.lock +0 -7508
- data/sentry-ruby/lib/sentry.rb +0 -16
- data/sentry-ruby/lib/sentry/backtrace.rb +0 -128
- data/sentry-ruby/lib/sentry/client.rb +0 -162
- data/sentry-ruby/lib/sentry/client/state.rb +0 -40
- data/sentry-ruby/lib/sentry/configuration.rb +0 -533
- data/sentry-ruby/lib/sentry/event.rb +0 -209
- data/sentry-ruby/lib/sentry/interface.rb +0 -31
- data/sentry-ruby/lib/sentry/interfaces/exception.rb +0 -15
- data/sentry-ruby/lib/sentry/interfaces/http.rb +0 -16
- data/sentry-ruby/lib/sentry/interfaces/message.rb +0 -18
- data/sentry-ruby/lib/sentry/interfaces/single_exception.rb +0 -14
- data/sentry-ruby/lib/sentry/interfaces/stack_trace.rb +0 -69
- data/sentry-ruby/lib/sentry/linecache.rb +0 -44
- data/sentry-ruby/lib/sentry/logger.rb +0 -20
- data/sentry-ruby/lib/sentry/transports.rb +0 -19
- data/sentry-ruby/lib/sentry/transports/dummy.rb +0 -16
- data/sentry-ruby/lib/sentry/transports/http.rb +0 -66
- data/sentry-ruby/lib/sentry/transports/stdout.rb +0 -20
- data/sentry-ruby/lib/sentry/utils/deep_merge.rb +0 -22
- data/sentry-ruby/lib/sentry/utils/exception_cause_chain.rb +0 -20
- data/sentry-ruby/lib/sentry/version.rb +0 -3
- data/sentry-ruby/sentry-ruby.gemspec +0 -26
- data/sentry-ruby/spec/sentry/backtrace_spec.rb +0 -38
- data/sentry-ruby/spec/sentry/client_spec.rb +0 -443
- data/sentry-ruby/spec/sentry/configuration_spec.rb +0 -400
- data/sentry-ruby/spec/sentry/event_spec.rb +0 -238
- data/sentry-ruby/spec/sentry/interface_spec.rb +0 -38
- data/sentry-ruby/spec/sentry/interfaces/stack_trace_spec.rb +0 -11
- data/sentry-ruby/spec/sentry/linecache_spec.rb +0 -40
- data/sentry-ruby/spec/sentry/transports/http_spec.rb +0 -57
- data/sentry-ruby/spec/sentry/transports/stdout_spec.rb +0 -11
- data/sentry-ruby/spec/sentry_spec.rb +0 -9
- data/sentry-ruby/spec/spec_helper.rb +0 -49
- data/sentry-ruby/spec/support/linecache.txt +0 -6
@@ -1,209 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'socket'
|
4
|
-
require 'securerandom'
|
5
|
-
require 'sentry/interface'
|
6
|
-
require 'sentry/backtrace'
|
7
|
-
require 'sentry/utils/deep_merge'
|
8
|
-
|
9
|
-
module Sentry
|
10
|
-
class Event
|
11
|
-
# See Sentry server default limits at
|
12
|
-
# https://github.com/getsentry/sentry/blob/master/src/sentry/conf/server.py
|
13
|
-
MAX_MESSAGE_SIZE_IN_BYTES = 1024 * 8
|
14
|
-
REQUIRED_OPTION_KEYS = [:configuration].freeze
|
15
|
-
|
16
|
-
SDK = { "name" => "sentry-ruby", "version" => Sentry::VERSION }.freeze
|
17
|
-
|
18
|
-
attr_accessor :id, :logger, :transaction, :server_name, :release, :modules,
|
19
|
-
:extra, :tags, :context, :configuration, :checksum,
|
20
|
-
:fingerprint, :environment, :server_os, :runtime,
|
21
|
-
:breadcrumbs, :user, :backtrace, :platform, :sdk
|
22
|
-
alias event_id id
|
23
|
-
|
24
|
-
attr_reader :level, :timestamp, :time_spent
|
25
|
-
|
26
|
-
def initialize(
|
27
|
-
configuration:,
|
28
|
-
message: nil,
|
29
|
-
user: {}, extra: {}, tags: {},
|
30
|
-
backtrace: [], level: :error, checksum: nil, fingerprint: [],
|
31
|
-
server_name: nil, release: nil, environment: nil
|
32
|
-
)
|
33
|
-
# this needs to go first because some setters rely on configuration
|
34
|
-
self.configuration = configuration
|
35
|
-
|
36
|
-
# Set some simple default values
|
37
|
-
self.id = SecureRandom.uuid.delete("-")
|
38
|
-
self.timestamp = Time.now.utc
|
39
|
-
self.level = level
|
40
|
-
self.platform = :ruby
|
41
|
-
self.sdk = SDK
|
42
|
-
|
43
|
-
# Set some attributes with empty hashes to allow merging
|
44
|
-
@interfaces = {}
|
45
|
-
|
46
|
-
self.user = user || {}
|
47
|
-
self.extra = extra || {}
|
48
|
-
self.tags = configuration.tags.merge(tags || {})
|
49
|
-
|
50
|
-
self.message = message
|
51
|
-
self.server_os = {} # TODO: contexts
|
52
|
-
self.runtime = {} # TODO: contexts
|
53
|
-
|
54
|
-
self.checksum = checksum
|
55
|
-
self.fingerprint = fingerprint
|
56
|
-
|
57
|
-
self.server_name = server_name
|
58
|
-
self.environment = environment
|
59
|
-
self.release = release
|
60
|
-
|
61
|
-
# Allow attributes to be set on the event at initialization
|
62
|
-
yield self if block_given?
|
63
|
-
# options.each_pair { |key, val| public_send("#{key}=", val) unless val.nil? }
|
64
|
-
|
65
|
-
if !backtrace.empty?
|
66
|
-
interface(:stacktrace) do |int|
|
67
|
-
int.frames = stacktrace_interface_from(backtrace)
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
set_core_attributes_from_configuration
|
72
|
-
end
|
73
|
-
|
74
|
-
def message
|
75
|
-
@interfaces[:logentry]&.unformatted_message
|
76
|
-
end
|
77
|
-
|
78
|
-
def message=(message)
|
79
|
-
unless message.is_a?(String)
|
80
|
-
configuration.logger.debug("You're passing a non-string message")
|
81
|
-
message = message.to_s
|
82
|
-
end
|
83
|
-
|
84
|
-
interface(:message) do |int|
|
85
|
-
int.message = message.byteslice(0...MAX_MESSAGE_SIZE_IN_BYTES) # Messages limited to 10kb
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
def timestamp=(time)
|
90
|
-
@timestamp = time.is_a?(Time) ? time.strftime('%Y-%m-%dT%H:%M:%S') : time
|
91
|
-
end
|
92
|
-
|
93
|
-
def time_spent=(time)
|
94
|
-
@time_spent = time.is_a?(Float) ? (time * 1000).to_i : time
|
95
|
-
end
|
96
|
-
|
97
|
-
def level=(new_level) # needed to meet the Sentry spec
|
98
|
-
@level = new_level.to_s == "warn" ? :warning : new_level
|
99
|
-
end
|
100
|
-
|
101
|
-
def interface(name, value = nil, &block)
|
102
|
-
int = Interface.registered[name]
|
103
|
-
raise(Error, "Unknown interface: #{name}") unless int
|
104
|
-
|
105
|
-
@interfaces[int.sentry_alias] = int.new(value, &block) if value || block
|
106
|
-
@interfaces[int.sentry_alias]
|
107
|
-
end
|
108
|
-
|
109
|
-
def [](key)
|
110
|
-
interface(key)
|
111
|
-
end
|
112
|
-
|
113
|
-
def []=(key, value)
|
114
|
-
interface(key, value)
|
115
|
-
end
|
116
|
-
|
117
|
-
def to_hash
|
118
|
-
data = [:checksum, :environment, :event_id, :extra, :fingerprint, :level,
|
119
|
-
:logger, :message, :modules, :platform, :release, :sdk, :server_name,
|
120
|
-
:tags, :time_spent, :timestamp, :transaction, :user].each_with_object({}) do |att, memo|
|
121
|
-
memo[att] = public_send(att) if public_send(att)
|
122
|
-
end
|
123
|
-
|
124
|
-
# TODO-v4: Fix this
|
125
|
-
# data[:breadcrumbs] = @breadcrumbs.to_hash unless @breadcrumbs.empty?
|
126
|
-
|
127
|
-
@interfaces.each_pair do |name, int_data|
|
128
|
-
data[name.to_sym] = int_data.to_hash
|
129
|
-
end
|
130
|
-
data
|
131
|
-
end
|
132
|
-
|
133
|
-
def to_json_compatible
|
134
|
-
JSON.parse(JSON.generate(to_hash))
|
135
|
-
end
|
136
|
-
|
137
|
-
def add_exception_interface(exc)
|
138
|
-
interface(:exception) do |exc_int|
|
139
|
-
exceptions = Sentry::Utils::ExceptionCauseChain.exception_to_array(exc).reverse
|
140
|
-
backtraces = Set.new
|
141
|
-
exc_int.values = exceptions.map do |e|
|
142
|
-
SingleExceptionInterface.new do |int|
|
143
|
-
int.type = e.class.to_s
|
144
|
-
int.value = e.to_s
|
145
|
-
int.module = e.class.to_s.split('::')[0...-1].join('::')
|
146
|
-
|
147
|
-
int.stacktrace =
|
148
|
-
if e.backtrace && !backtraces.include?(e.backtrace.object_id)
|
149
|
-
backtraces << e.backtrace.object_id
|
150
|
-
StacktraceInterface.new do |stacktrace|
|
151
|
-
stacktrace.frames = stacktrace_interface_from(e.backtrace)
|
152
|
-
end
|
153
|
-
end
|
154
|
-
end
|
155
|
-
end
|
156
|
-
end
|
157
|
-
end
|
158
|
-
|
159
|
-
def stacktrace_interface_from(backtrace)
|
160
|
-
Backtrace.parse(backtrace, configuration: configuration).lines.reverse.each_with_object([]) do |line, memo|
|
161
|
-
frame = StacktraceInterface::Frame.new(configuration: configuration)
|
162
|
-
frame.abs_path = line.file if line.file
|
163
|
-
frame.function = line.method if line.method
|
164
|
-
frame.lineno = line.number
|
165
|
-
frame.in_app = line.in_app
|
166
|
-
frame.module = line.module_name if line.module_name
|
167
|
-
|
168
|
-
if configuration[:context_lines] && frame.abs_path
|
169
|
-
frame.pre_context, frame.context_line, frame.post_context = \
|
170
|
-
configuration.linecache.get_file_context(frame.abs_path, frame.lineno, configuration[:context_lines])
|
171
|
-
end
|
172
|
-
|
173
|
-
memo << frame if frame.filename
|
174
|
-
end
|
175
|
-
end
|
176
|
-
|
177
|
-
private
|
178
|
-
|
179
|
-
def set_core_attributes_from_configuration
|
180
|
-
self.server_name ||= configuration.server_name
|
181
|
-
self.release ||= configuration.release
|
182
|
-
self.modules = list_gem_specs if configuration.send_modules
|
183
|
-
self.environment ||= configuration.current_environment
|
184
|
-
end
|
185
|
-
|
186
|
-
def add_rack_context
|
187
|
-
interface :http do |int|
|
188
|
-
int.from_rack(context.rack_env)
|
189
|
-
end
|
190
|
-
context.user[:ip_address] = calculate_real_ip_from_rack
|
191
|
-
end
|
192
|
-
|
193
|
-
# When behind a proxy (or if the user is using a proxy), we can't use
|
194
|
-
# REMOTE_ADDR to determine the Event IP, and must use other headers instead.
|
195
|
-
def calculate_real_ip_from_rack
|
196
|
-
Utils::RealIp.new(
|
197
|
-
:remote_addr => context.rack_env["REMOTE_ADDR"],
|
198
|
-
:client_ip => context.rack_env["HTTP_CLIENT_IP"],
|
199
|
-
:real_ip => context.rack_env["HTTP_X_REAL_IP"],
|
200
|
-
:forwarded_for => context.rack_env["HTTP_X_FORWARDED_FOR"]
|
201
|
-
).calculate_ip
|
202
|
-
end
|
203
|
-
|
204
|
-
def list_gem_specs
|
205
|
-
# Older versions of Rubygems don't support iterating over all specs
|
206
|
-
Hash[Gem::Specification.map { |spec| [spec.name, spec.version.to_s] }] if Gem::Specification.respond_to?(:map)
|
207
|
-
end
|
208
|
-
end
|
209
|
-
end
|
@@ -1,31 +0,0 @@
|
|
1
|
-
module Sentry
|
2
|
-
class Interface
|
3
|
-
def initialize(attributes = nil)
|
4
|
-
attributes&.each do |attr, value|
|
5
|
-
public_send "#{attr}=", value
|
6
|
-
end
|
7
|
-
|
8
|
-
yield self if block_given?
|
9
|
-
end
|
10
|
-
|
11
|
-
def self.inherited(klass)
|
12
|
-
name = klass.name.split("::").last.downcase.gsub("interface", "")
|
13
|
-
registered[name.to_sym] = klass
|
14
|
-
super
|
15
|
-
end
|
16
|
-
|
17
|
-
def self.registered
|
18
|
-
@@registered ||= {} # rubocop:disable Style/ClassVars
|
19
|
-
end
|
20
|
-
|
21
|
-
def to_hash
|
22
|
-
Hash[instance_variables.map { |name| [name[1..-1].to_sym, instance_variable_get(name)] }]
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
require "sentry/interfaces/exception"
|
28
|
-
require "sentry/interfaces/http"
|
29
|
-
require "sentry/interfaces/message"
|
30
|
-
require "sentry/interfaces/single_exception"
|
31
|
-
require "sentry/interfaces/stack_trace"
|
@@ -1,15 +0,0 @@
|
|
1
|
-
module Sentry
|
2
|
-
class ExceptionInterface < Interface
|
3
|
-
attr_accessor :values
|
4
|
-
|
5
|
-
def self.sentry_alias
|
6
|
-
:exception
|
7
|
-
end
|
8
|
-
|
9
|
-
def to_hash(*args)
|
10
|
-
data = super(*args)
|
11
|
-
data[:values] = data[:values].map(&:to_hash) if data[:values]
|
12
|
-
data
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
@@ -1,16 +0,0 @@
|
|
1
|
-
module Sentry
|
2
|
-
class HttpInterface < Interface
|
3
|
-
attr_accessor :url, :method, :data, :query_string, :cookies, :headers, :env
|
4
|
-
|
5
|
-
def initialize(*arguments)
|
6
|
-
self.headers = {}
|
7
|
-
self.env = {}
|
8
|
-
self.cookies = nil
|
9
|
-
super(*arguments)
|
10
|
-
end
|
11
|
-
|
12
|
-
def self.sentry_alias
|
13
|
-
:request
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
@@ -1,18 +0,0 @@
|
|
1
|
-
module Sentry
|
2
|
-
class MessageInterface < Interface
|
3
|
-
attr_accessor :message, :params
|
4
|
-
|
5
|
-
def initialize(*arguments)
|
6
|
-
self.params = []
|
7
|
-
super(*arguments)
|
8
|
-
end
|
9
|
-
|
10
|
-
def unformatted_message
|
11
|
-
Array(params).empty? ? message : message % params
|
12
|
-
end
|
13
|
-
|
14
|
-
def self.sentry_alias
|
15
|
-
:logentry
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
@@ -1,14 +0,0 @@
|
|
1
|
-
module Sentry
|
2
|
-
class SingleExceptionInterface < Interface
|
3
|
-
attr_accessor :type
|
4
|
-
attr_accessor :value
|
5
|
-
attr_accessor :module
|
6
|
-
attr_accessor :stacktrace
|
7
|
-
|
8
|
-
def to_hash(*args)
|
9
|
-
data = super(*args)
|
10
|
-
data[:stacktrace] = data[:stacktrace].to_hash if data[:stacktrace]
|
11
|
-
data
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
@@ -1,69 +0,0 @@
|
|
1
|
-
module Sentry
|
2
|
-
class StacktraceInterface < Interface
|
3
|
-
attr_accessor :frames
|
4
|
-
|
5
|
-
def initialize(*arguments)
|
6
|
-
super(*arguments)
|
7
|
-
end
|
8
|
-
|
9
|
-
def self.sentry_alias
|
10
|
-
:stacktrace
|
11
|
-
end
|
12
|
-
|
13
|
-
def to_hash(*args)
|
14
|
-
data = super(*args)
|
15
|
-
data[:frames] = data[:frames].map(&:to_hash)
|
16
|
-
data
|
17
|
-
end
|
18
|
-
|
19
|
-
# Not actually an interface, but I want to use the same style
|
20
|
-
class Frame < Interface
|
21
|
-
attr_accessor :abs_path, :context_line, :function, :in_app,
|
22
|
-
:lineno, :module, :pre_context, :post_context, :vars, :configuration
|
23
|
-
|
24
|
-
def initialize(*arguments)
|
25
|
-
super(*arguments)
|
26
|
-
end
|
27
|
-
|
28
|
-
def filename
|
29
|
-
return if abs_path.nil?
|
30
|
-
return @filename if instance_variable_defined?(:@filename)
|
31
|
-
|
32
|
-
prefix =
|
33
|
-
if under_project_root? && in_app
|
34
|
-
project_root
|
35
|
-
elsif under_project_root?
|
36
|
-
longest_load_path || project_root
|
37
|
-
else
|
38
|
-
longest_load_path
|
39
|
-
end
|
40
|
-
|
41
|
-
@filename = prefix ? abs_path[prefix.to_s.chomp(File::SEPARATOR).length + 1..-1] : abs_path
|
42
|
-
end
|
43
|
-
|
44
|
-
def to_hash(*args)
|
45
|
-
data = super(*args)
|
46
|
-
data[:filename] = filename
|
47
|
-
data.delete(:vars) unless vars && !vars.empty?
|
48
|
-
data.delete(:pre_context) unless pre_context && !pre_context.empty?
|
49
|
-
data.delete(:post_context) unless post_context && !post_context.empty?
|
50
|
-
data.delete(:context_line) unless context_line && !context_line.empty?
|
51
|
-
data
|
52
|
-
end
|
53
|
-
|
54
|
-
private
|
55
|
-
|
56
|
-
def under_project_root?
|
57
|
-
project_root && abs_path.start_with?(project_root)
|
58
|
-
end
|
59
|
-
|
60
|
-
def project_root
|
61
|
-
@project_root ||= configuration.project_root&.to_s
|
62
|
-
end
|
63
|
-
|
64
|
-
def longest_load_path
|
65
|
-
$LOAD_PATH.select { |path| abs_path.start_with?(path.to_s) }.max_by(&:size)
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
@@ -1,44 +0,0 @@
|
|
1
|
-
module Sentry
|
2
|
-
class LineCache
|
3
|
-
def initialize
|
4
|
-
@cache = {}
|
5
|
-
end
|
6
|
-
|
7
|
-
# Any linecache you provide to Sentry must implement this method.
|
8
|
-
# Returns an Array of Strings representing the lines in the source
|
9
|
-
# file. The number of lines retrieved is (2 * context) + 1, the middle
|
10
|
-
# line should be the line requested by lineno. See specs for more information.
|
11
|
-
def get_file_context(filename, lineno, context)
|
12
|
-
return nil, nil, nil unless valid_path?(filename)
|
13
|
-
|
14
|
-
lines = Array.new(2 * context + 1) do |i|
|
15
|
-
getline(filename, lineno - context + i)
|
16
|
-
end
|
17
|
-
[lines[0..(context - 1)], lines[context], lines[(context + 1)..-1]]
|
18
|
-
end
|
19
|
-
|
20
|
-
private
|
21
|
-
|
22
|
-
def valid_path?(path)
|
23
|
-
lines = getlines(path)
|
24
|
-
!lines.nil?
|
25
|
-
end
|
26
|
-
|
27
|
-
def getlines(path)
|
28
|
-
@cache[path] ||= begin
|
29
|
-
IO.readlines(path)
|
30
|
-
rescue
|
31
|
-
nil
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
def getline(path, n)
|
36
|
-
return nil if n < 1
|
37
|
-
|
38
|
-
lines = getlines(path)
|
39
|
-
return nil if lines.nil?
|
40
|
-
|
41
|
-
lines[n - 1]
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
@@ -1,20 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'logger'
|
4
|
-
|
5
|
-
module Sentry
|
6
|
-
class Logger < ::Logger
|
7
|
-
LOG_PREFIX = "** [Sentry] "
|
8
|
-
PROGNAME = "sentry"
|
9
|
-
|
10
|
-
def initialize(*)
|
11
|
-
super
|
12
|
-
@level = ::Logger::INFO
|
13
|
-
original_formatter = ::Logger::Formatter.new
|
14
|
-
@default_formatter = proc do |severity, datetime, _progname, msg|
|
15
|
-
msg = "#{LOG_PREFIX}#{msg}"
|
16
|
-
original_formatter.call(severity, datetime, PROGNAME, msg)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|