sentry-ruby 4.1.4 → 4.1.5.pre.beta.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. metadata +23 -59
  4. data/.craft.yml +0 -19
  5. data/.gitignore +0 -11
  6. data/.rspec +0 -3
  7. data/.travis.yml +0 -6
  8. data/CHANGELOG.md +0 -120
  9. data/CODE_OF_CONDUCT.md +0 -74
  10. data/Gemfile +0 -16
  11. data/Rakefile +0 -8
  12. data/bin/console +0 -14
  13. data/bin/setup +0 -8
  14. data/lib/sentry-ruby.rb +0 -190
  15. data/lib/sentry/background_worker.rb +0 -37
  16. data/lib/sentry/backtrace.rb +0 -126
  17. data/lib/sentry/benchmarks/benchmark_transport.rb +0 -14
  18. data/lib/sentry/breadcrumb.rb +0 -25
  19. data/lib/sentry/breadcrumb/sentry_logger.rb +0 -87
  20. data/lib/sentry/breadcrumb_buffer.rb +0 -47
  21. data/lib/sentry/client.rb +0 -96
  22. data/lib/sentry/configuration.rb +0 -396
  23. data/lib/sentry/core_ext/object/deep_dup.rb +0 -57
  24. data/lib/sentry/core_ext/object/duplicable.rb +0 -153
  25. data/lib/sentry/dsn.rb +0 -48
  26. data/lib/sentry/event.rb +0 -171
  27. data/lib/sentry/hub.rb +0 -143
  28. data/lib/sentry/integrable.rb +0 -24
  29. data/lib/sentry/interface.rb +0 -22
  30. data/lib/sentry/interfaces/exception.rb +0 -11
  31. data/lib/sentry/interfaces/request.rb +0 -113
  32. data/lib/sentry/interfaces/single_exception.rb +0 -14
  33. data/lib/sentry/interfaces/stacktrace.rb +0 -90
  34. data/lib/sentry/linecache.rb +0 -44
  35. data/lib/sentry/logger.rb +0 -20
  36. data/lib/sentry/rack.rb +0 -4
  37. data/lib/sentry/rack/capture_exceptions.rb +0 -68
  38. data/lib/sentry/rack/deprecations.rb +0 -19
  39. data/lib/sentry/rake.rb +0 -17
  40. data/lib/sentry/scope.rb +0 -210
  41. data/lib/sentry/span.rb +0 -133
  42. data/lib/sentry/transaction.rb +0 -157
  43. data/lib/sentry/transaction_event.rb +0 -29
  44. data/lib/sentry/transport.rb +0 -88
  45. data/lib/sentry/transport/configuration.rb +0 -21
  46. data/lib/sentry/transport/dummy_transport.rb +0 -14
  47. data/lib/sentry/transport/http_transport.rb +0 -62
  48. data/lib/sentry/utils/argument_checking_helper.rb +0 -11
  49. data/lib/sentry/utils/exception_cause_chain.rb +0 -20
  50. data/lib/sentry/utils/real_ip.rb +0 -70
  51. data/lib/sentry/utils/request_id.rb +0 -16
  52. data/lib/sentry/version.rb +0 -3
  53. data/sentry-ruby.gemspec +0 -27
@@ -1,29 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Sentry
4
- class TransactionEvent < Event
5
- ATTRIBUTES = %i(
6
- event_id level timestamp start_timestamp
7
- release environment server_name modules
8
- user tags contexts extra
9
- transaction platform sdk type
10
- )
11
-
12
- attr_accessor(*ATTRIBUTES)
13
- attr_accessor :spans
14
-
15
- def start_timestamp=(time)
16
- @start_timestamp = time.is_a?(Time) ? time.to_f : time
17
- end
18
-
19
- def type
20
- "transaction"
21
- end
22
-
23
- def to_hash
24
- data = super
25
- data[:spans] = @spans.map(&:to_hash) if @spans
26
- data
27
- end
28
- end
29
- end
@@ -1,88 +0,0 @@
1
- require "json"
2
- require "base64"
3
-
4
- module Sentry
5
- class Transport
6
- PROTOCOL_VERSION = '5'
7
- USER_AGENT = "sentry-ruby/#{Sentry::VERSION}"
8
-
9
- attr_accessor :configuration
10
-
11
- def initialize(configuration)
12
- @configuration = configuration
13
- @transport_configuration = configuration.transport
14
- @dsn = configuration.dsn
15
- end
16
-
17
- def send_data(data, options = {})
18
- raise NotImplementedError
19
- end
20
-
21
- def send_event(event)
22
- unless configuration.sending_allowed?
23
- configuration.logger.debug(LOGGER_PROGNAME) { "Event not sent: #{configuration.error_messages}" }
24
- return
25
- end
26
-
27
- encoded_data = prepare_encoded_event(event)
28
-
29
- return nil unless encoded_data
30
-
31
- send_data(encoded_data)
32
-
33
- event
34
- rescue => e
35
- failed_for_exception(e, event)
36
- nil
37
- end
38
-
39
- def generate_auth_header
40
- now = Sentry.utc_now.to_i
41
- fields = {
42
- 'sentry_version' => PROTOCOL_VERSION,
43
- 'sentry_client' => USER_AGENT,
44
- 'sentry_timestamp' => now,
45
- 'sentry_key' => @dsn.public_key
46
- }
47
- fields['sentry_secret'] = @dsn.secret_key if @dsn.secret_key
48
- 'Sentry ' + fields.map { |key, value| "#{key}=#{value}" }.join(', ')
49
- end
50
-
51
- def encode(event_hash)
52
- event_id = event_hash[:event_id] || event_hash['event_id']
53
- event_type = event_hash[:type] || event_hash['type']
54
-
55
- envelope = <<~ENVELOPE
56
- {"event_id":"#{event_id}","dsn":"#{configuration.dsn.to_s}","sdk":#{Sentry.sdk_meta.to_json},"sent_at":"#{Sentry.utc_now.iso8601}"}
57
- {"type":"#{event_type}","content_type":"application/json"}
58
- #{JSON.generate(event_hash)}
59
- ENVELOPE
60
-
61
- envelope
62
- end
63
-
64
- private
65
-
66
- def prepare_encoded_event(event)
67
- # Convert to hash
68
- event_hash = event.to_hash
69
-
70
- event_id = event_hash[:event_id] || event_hash["event_id"]
71
- event_type = event_hash[:type] || event_hash["type"]
72
- configuration.logger.info(LOGGER_PROGNAME) { "Sending #{event_type} #{event_id} to Sentry" }
73
- encode(event_hash)
74
- end
75
-
76
- def failed_for_exception(e, event)
77
- configuration.logger.warn(LOGGER_PROGNAME) { "Unable to record event with remote Sentry server (#{e.class} - #{e.message}):\n#{e.backtrace[0..10].join("\n")}" }
78
- log_not_sending(event)
79
- end
80
-
81
- def log_not_sending(event)
82
- configuration.logger.warn(LOGGER_PROGNAME) { "Failed to submit event. Unreported Event: #{Event.get_log_message(event.to_hash)}" }
83
- end
84
- end
85
- end
86
-
87
- require "sentry/transport/dummy_transport"
88
- require "sentry/transport/http_transport"
@@ -1,21 +0,0 @@
1
- module Sentry
2
- class Transport
3
- class Configuration
4
- attr_accessor :timeout, :open_timeout, :proxy, :ssl, :ssl_ca_file, :ssl_verification, :http_adapter, :faraday_builder, :transport_class
5
-
6
- def initialize
7
- @ssl_verification = true
8
- @open_timeout = 1
9
- @timeout = 2
10
- end
11
-
12
- def transport_class=(klass)
13
- unless klass.is_a?(Class)
14
- raise Sentry::Error.new("config.transport.transport_class must a class. got: #{klass.class}")
15
- end
16
-
17
- @transport_class = klass
18
- end
19
- end
20
- end
21
- end
@@ -1,14 +0,0 @@
1
- module Sentry
2
- class DummyTransport < Transport
3
- attr_accessor :events
4
-
5
- def initialize(*)
6
- super
7
- @events = []
8
- end
9
-
10
- def send_event(event)
11
- @events << event
12
- end
13
- end
14
- end
@@ -1,62 +0,0 @@
1
- require 'faraday'
2
-
3
- module Sentry
4
- class HTTPTransport < Transport
5
- CONTENT_TYPE = 'application/json'
6
- attr_reader :conn, :adapter
7
-
8
- def initialize(*args)
9
- super
10
- @adapter = @transport_configuration.http_adapter || Faraday.default_adapter
11
- @conn = set_conn
12
- @endpoint = @dsn.envelope_endpoint
13
- end
14
-
15
- def send_data(data)
16
- conn.post @endpoint do |req|
17
- req.headers['Content-Type'] = CONTENT_TYPE
18
- req.headers['X-Sentry-Auth'] = generate_auth_header
19
- req.body = data
20
- end
21
- rescue Faraday::Error => e
22
- error_info = e.message
23
-
24
- if e.response
25
- error_info += "\nbody: #{e.response[:body]}"
26
- error_info += " Error in headers is: #{e.response[:headers]['x-sentry-error']}" if e.response[:headers]['x-sentry-error']
27
- end
28
-
29
- raise Sentry::Error, error_info
30
- end
31
-
32
- private
33
-
34
- def set_conn
35
- server = @dsn.server
36
-
37
- configuration.logger.debug(LOGGER_PROGNAME) { "Sentry HTTP Transport connecting to #{server}" }
38
-
39
- Faraday.new(server, :ssl => ssl_configuration, :proxy => @transport_configuration.proxy) do |builder|
40
- @transport_configuration.faraday_builder&.call(builder)
41
- builder.response :raise_error
42
- builder.options.merge! faraday_opts
43
- builder.headers[:user_agent] = "sentry-ruby/#{Sentry::VERSION}"
44
- builder.adapter(*adapter)
45
- end
46
- end
47
-
48
- # TODO: deprecate and replace where possible w/Faraday Builder
49
- def faraday_opts
50
- [:timeout, :open_timeout].each_with_object({}) do |opt, memo|
51
- memo[opt] = @transport_configuration.public_send(opt) if @transport_configuration.public_send(opt)
52
- end
53
- end
54
-
55
- def ssl_configuration
56
- (@transport_configuration.ssl || {}).merge(
57
- :verify => @transport_configuration.ssl_verification,
58
- :ca_file => @transport_configuration.ssl_ca_file
59
- )
60
- end
61
- end
62
- end
@@ -1,11 +0,0 @@
1
- module Sentry
2
- module ArgumentCheckingHelper
3
- private
4
-
5
- def check_argument_type!(argument, expected_type)
6
- unless argument.is_a?(expected_type)
7
- raise ArgumentError, "expect the argument to be a #{expected_type}, got #{argument.class} (#{argument.inspect})"
8
- end
9
- end
10
- end
11
- end
@@ -1,20 +0,0 @@
1
- module Sentry
2
- module Utils
3
- module ExceptionCauseChain
4
- def self.exception_to_array(exception)
5
- if exception.respond_to?(:cause) && exception.cause
6
- exceptions = [exception]
7
- while exception.cause
8
- exception = exception.cause
9
- break if exceptions.any? { |e| e.object_id == exception.object_id }
10
-
11
- exceptions << exception
12
- end
13
- exceptions
14
- else
15
- [exception]
16
- end
17
- end
18
- end
19
- end
20
- end
@@ -1,70 +0,0 @@
1
- require 'ipaddr'
2
-
3
- # Based on ActionDispatch::RemoteIp. All security-related precautions from that
4
- # middleware have been removed, because the Event IP just needs to be accurate,
5
- # and spoofing an IP here only makes data inaccurate, not insecure. Don't re-use
6
- # this module if you have to *trust* the IP address.
7
- module Sentry
8
- module Utils
9
- class RealIp
10
- LOCAL_ADDRESSES = [
11
- "127.0.0.1", # localhost IPv4
12
- "::1", # localhost IPv6
13
- "fc00::/7", # private IPv6 range fc00::/7
14
- "10.0.0.0/8", # private IPv4 range 10.x.x.x
15
- "172.16.0.0/12", # private IPv4 range 172.16.0.0 .. 172.31.255.255
16
- "192.168.0.0/16" # private IPv4 range 192.168.x.x
17
- ].map { |proxy| IPAddr.new(proxy) }
18
-
19
- attr_reader :ip
20
-
21
- def initialize(
22
- remote_addr: nil,
23
- client_ip: nil,
24
- real_ip: nil,
25
- forwarded_for: nil
26
- )
27
- @remote_addr = remote_addr
28
- @client_ip = client_ip
29
- @real_ip = real_ip
30
- @forwarded_for = forwarded_for
31
- end
32
-
33
- def calculate_ip
34
- # CGI environment variable set by Rack
35
- remote_addr = ips_from(@remote_addr).last
36
-
37
- # Could be a CSV list and/or repeated headers that were concatenated.
38
- client_ips = ips_from(@client_ip)
39
- real_ips = ips_from(@real_ip)
40
- forwarded_ips = ips_from(@forwarded_for)
41
-
42
- ips = [client_ips, real_ips, forwarded_ips, remote_addr].flatten.compact
43
-
44
- # If every single IP option is in the trusted list, just return REMOTE_ADDR
45
- @ip = filter_local_addresses(ips).first || remote_addr
46
- end
47
-
48
- protected
49
-
50
- def ips_from(header)
51
- # Split the comma-separated list into an array of strings
52
- ips = header ? header.strip.split(/[,\s]+/) : []
53
- ips.select do |ip|
54
- begin
55
- # Only return IPs that are valid according to the IPAddr#new method
56
- range = IPAddr.new(ip).to_range
57
- # we want to make sure nobody is sneaking a netmask in
58
- range.begin == range.end
59
- rescue ArgumentError
60
- nil
61
- end
62
- end
63
- end
64
-
65
- def filter_local_addresses(ips)
66
- ips.reject { |ip| LOCAL_ADDRESSES.any? { |proxy| proxy === ip } }
67
- end
68
- end
69
- end
70
- end
@@ -1,16 +0,0 @@
1
- module Sentry
2
- module Utils
3
- module RequestId
4
- REQUEST_ID_HEADERS = %w(action_dispatch.request_id HTTP_X_REQUEST_ID).freeze
5
-
6
- # Request ID based on ActionDispatch::RequestId
7
- def self.read_from(env)
8
- REQUEST_ID_HEADERS.each do |key|
9
- request_id = env[key]
10
- return request_id if request_id
11
- end
12
- nil
13
- end
14
- end
15
- end
16
- end
@@ -1,3 +0,0 @@
1
- module Sentry
2
- VERSION = "4.1.4"
3
- end
@@ -1,27 +0,0 @@
1
- require_relative "lib/sentry/version"
2
-
3
- Gem::Specification.new do |spec|
4
- spec.name = "sentry-ruby"
5
- spec.version = Sentry::VERSION
6
- spec.authors = ["Sentry Team"]
7
- spec.description = spec.summary = "A gem that provides a client interface for the Sentry error logger"
8
- spec.email = "accounts@sentry.io"
9
- spec.license = 'Apache-2.0'
10
- spec.homepage = "https://github.com/getsentry/raven-ruby"
11
-
12
- spec.platform = Gem::Platform::RUBY
13
- spec.required_ruby_version = '>= 2.4'
14
- spec.extra_rdoc_files = ["README.md", "LICENSE.txt"]
15
- spec.files = `git ls-files | grep -Ev '^(spec|benchmarks|examples)'`.split("\n")
16
-
17
- spec.metadata["homepage_uri"] = spec.homepage
18
- spec.metadata["source_code_uri"] = spec.homepage
19
- spec.metadata["changelog_uri"] = "#{spec.homepage}/blob/master/CHANGELOG.md"
20
-
21
- spec.bindir = "exe"
22
- spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
23
- spec.require_paths = ["lib"]
24
-
25
- spec.add_dependency "faraday", ">= 1.0"
26
- spec.add_dependency "concurrent-ruby", '~> 1.0', '>= 1.0.2'
27
- end