raygun-apm 0.0.3-x86-mingw32

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: d581b35cb0ea1db8f45a7e85895152011b2b14898d248f5bc97df6201288b28e
4
+ data.tar.gz: d2333c339ac11e69f182850d48125d5328c4a116dac6a75f8ff683073ac3acce
5
+ SHA512:
6
+ metadata.gz: 38c48ca7279a6d24c5f3b00c26d09229a12722083c565afeba09cd3b39d12303304dca5eabd0c8489a21fb3cec5fbb2fa519d330dc2afc3ca414d575f48377a0
7
+ data.tar.gz: 1cd04c11a203c0b223ba42c271ae89b37ca8411c2038c659e769f6c4926bd93179be9252c5c4e3890ef2e668251c58636b0efaa1ae472499e5ebab4f31543128
data/Gemfile ADDED
@@ -0,0 +1,8 @@
1
+ source "https://rubygems.org"
2
+
3
+ git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
4
+
5
+ # Specify your gem's dependencies in raygun-apm.gemspec
6
+ gemspec
7
+
8
+ gem 'irb'
data/Gemfile.lock ADDED
@@ -0,0 +1,34 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ raygun-apm (0.0.3)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ benchmark_driver (0.14.17)
10
+ debase-ruby_core_source (0.10.6)
11
+ irb (1.0.0)
12
+ minitest (5.11.3)
13
+ rake (12.3.3)
14
+ rake-compiler (1.0.8)
15
+ rake
16
+ rake-compiler-dock (0.7.2)
17
+
18
+ PLATFORMS
19
+ ruby
20
+ x64-mingw32
21
+
22
+ DEPENDENCIES
23
+ benchmark_driver (~> 0.14.17)
24
+ bundler (~> 1.16)
25
+ debase-ruby_core_source (~> 0.10.6)
26
+ irb
27
+ minitest (~> 5.0)
28
+ rake (~> 12.0)
29
+ rake-compiler (~> 1.0.8)
30
+ rake-compiler-dock (~> 0.7.2)
31
+ raygun-apm!
32
+
33
+ BUNDLED WITH
34
+ 1.17.2
data/README.md ADDED
File without changes
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "raygun/apm"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,41 @@
1
+ # encoding: utf-8
2
+
3
+ require 'mkmf'
4
+ require 'debase/ruby_core_source'
5
+
6
+ headers = proc do
7
+ have_header('ruby.h') &&
8
+ have_header('ruby/debug.h') &&
9
+ have_header("vm_core.h")
10
+ end
11
+
12
+ dir_config('raygun')
13
+ append_cflags '-pedantic'
14
+ append_cflags '-Wall'
15
+ append_cflags '-Werror=switch'
16
+ append_cflags '-std=c99'
17
+ if ENV['DEBUG']
18
+ have_library 'ssp'
19
+ have_func '__stack_chk_guard'
20
+ have_func '__stack_chk_fail'
21
+ append_cflags '-ggdb3'
22
+ # Needed reduced -On levels for SSP to do its job.
23
+ # Used to be -O0 but switched to -Og since -O0 disables
24
+ # some optimizations that debug tools need.
25
+ # https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
26
+ append_cflags '-Og'
27
+ append_cflags '-fstack-protector-all'
28
+ else
29
+ append_cflags '-O3'
30
+ end
31
+
32
+ unless create_header
33
+ STDERR.print("extconf.h creation failed\n")
34
+ exit(1)
35
+ end
36
+
37
+ unless Debase::RubyCoreSource.create_makefile_with_core(headers, 'raygun_ext')
38
+ STDERR.print("Makefile creation failed\n")
39
+ STDERR.print("One or more ruby headers not found\n")
40
+ exit(1)
41
+ end
@@ -0,0 +1,195 @@
1
+ module Raygun
2
+ module Apm
3
+ class Blacklist
4
+ # From https://ruby-doc.org/core-2.6.3/ , to automate
5
+ DEFAULT_RUBY = %w{
6
+ ARGF
7
+ ArgumentError
8
+ Array
9
+ BasicObject
10
+ Binding
11
+ Class
12
+ ClosedQueueError
13
+ Comparable
14
+ Complex
15
+ ConditionVariable
16
+ Continuation
17
+ Data
18
+ Dir
19
+ ENV
20
+ EOFError
21
+ Encoding
22
+ Encoding::CompatibilityError
23
+ Encoding::Converter
24
+ Encoding::ConverterNotFoundError
25
+ Encoding::InvalidByteSequenceError
26
+ Encoding::UndefinedConversionError
27
+ EncodingError
28
+ Enumerable
29
+ Enumerator
30
+ Enumerator::ArithmeticSequence
31
+ Enumerator::Chain
32
+ Enumerator::Generator
33
+ Enumerator::Lazy
34
+ Enumerator::Yielder
35
+ Errno
36
+ Exception
37
+ FalseClass
38
+ Fiber
39
+ FiberError
40
+ File
41
+ File::Constants
42
+ File::Stat
43
+ FileTest
44
+ Float
45
+ FloatDomainError
46
+ FrozenError
47
+ GC
48
+ GC::Profiler
49
+ Hash
50
+ IO
51
+ IO::EAGAINWaitReadable
52
+ IO::EAGAINWaitWritable
53
+ IO::EINPROGRESSWaitReadable
54
+ IO::EINPROGRESSWaitWritable
55
+ IO::EWOULDBLOCKWaitReadable
56
+ IO::EWOULDBLOCKWaitWritable
57
+ IO::WaitReadable
58
+ IO::WaitWritable
59
+ IOError
60
+ IndexError
61
+ Integer
62
+ Interrupt
63
+ Kernel
64
+ KeyError
65
+ LoadError
66
+ LocalJumpError
67
+ Marshal
68
+ MatchData
69
+ Math
70
+ Math::DomainError
71
+ Method
72
+ Module
73
+ Mutex
74
+ NameError
75
+ NilClass
76
+ NoMemoryError
77
+ NoMethodError
78
+ NotImplementedError
79
+ Numeric
80
+ Object
81
+ ObjectSpace
82
+ ObjectSpace::WeakMap
83
+ Proc
84
+ Process
85
+ Process::GID
86
+ Process::Status
87
+ Process::Sys
88
+ Process::UID
89
+ Queue
90
+ Random
91
+ Random::Formatter
92
+ Range
93
+ RangeError
94
+ Rational
95
+ Regexp
96
+ RegexpError
97
+ RubyVM
98
+ RubyVM::AbstractSyntaxTree
99
+ RubyVM::AbstractSyntaxTree::Node
100
+ RubyVM::InstructionSequence
101
+ RubyVM::MJIT
102
+ RuntimeError
103
+ ScriptError
104
+ SecurityError
105
+ Set
106
+ Signal
107
+ SignalException
108
+ SizedQueue
109
+ StandardError
110
+ StopIteration
111
+ String
112
+ Struct
113
+ Symbol
114
+ SyntaxError
115
+ SystemCallError
116
+ SystemExit
117
+ SystemStackError
118
+ Thread
119
+ Thread::Backtrace
120
+ Thread::Backtrace::Location
121
+ ThreadError
122
+ ThreadGroup
123
+ Time
124
+ TracePoint
125
+ TrueClass
126
+ TypeError
127
+ UnboundMethod
128
+ UncaughtThrowError
129
+ UnicodeNormalize
130
+ Warning
131
+ ZeroDivisionError
132
+ }
133
+
134
+ # from https://api.rubyonrails.org/ , to automate
135
+ DEFAULT_RAILS = %w{
136
+ #<Class:
137
+ #<Module:
138
+ #<ActiveRecord:
139
+ #<ActiveModel:
140
+ Benchmark
141
+ BigDecimal
142
+ Concurrent
143
+ Date
144
+ DateAndTime
145
+ DateTime
146
+ Delegator
147
+ Digest
148
+ ERB
149
+ SecureRandom
150
+ URI
151
+ AbstractController
152
+ ActionCable
153
+ ActionController
154
+ ActionDispatch
155
+ ActionMailbox
156
+ ActionMailer
157
+ ActionText
158
+ ActionView
159
+ ActiveJob
160
+ ActiveModel
161
+ ActiveRecord
162
+ ActiveStorage
163
+ ActiveSupport
164
+ Arel
165
+ Mail
166
+ Mime
167
+ Rails
168
+ Rack
169
+ I18n
170
+ Bootsnap
171
+ Sprockets
172
+ Turbolinks
173
+ Pathname
174
+ MonitorMixin
175
+ Logger
176
+ Sprockets
177
+ ActionDispatch
178
+ ActiveSupport
179
+ ActionView
180
+ ApplicationHelper
181
+ SQLite3
182
+ Mysql2
183
+ Erubi
184
+ ApplicationController
185
+ }
186
+ def self.resolve_entries
187
+ if Gem.loaded_specs.has_key?('rails')
188
+ DEFAULT_RUBY + DEFAULT_RAILS
189
+ else
190
+ DEFAULT_RUBY
191
+ end
192
+ end
193
+ end
194
+ end
195
+ end
@@ -0,0 +1,77 @@
1
+ module Raygun
2
+ module Apm
3
+ class Config
4
+ LOGLEVELS = {
5
+ "None" => Tracer::LOG_NONE,
6
+ "Info" => Tracer::LOG_INFO,
7
+ "Warning" => Tracer::LOG_WARNING,
8
+ "Error" => Tracer::LOG_ERROR,
9
+ "Verbose" => Tracer::LOG_VERBOSE,
10
+ "Debug" => Tracer::LOG_DEBUG,
11
+ "Everything" => Tracer::LOG_EVERYTHING
12
+ }
13
+ attr_accessor :env
14
+ def initialize(env=ENV)
15
+ @env = env
16
+ end
17
+
18
+ def self.cast_to_boolean(x)
19
+ case x
20
+ when true, 'true', 'True', 1, '1' then true
21
+ else
22
+ false
23
+ end
24
+ end
25
+
26
+ def self.config_var(attr, opts={})
27
+ define_method attr.downcase do
28
+ val = if x = env[attr]
29
+ if opts[:as] == Integer
30
+ Integer(x)
31
+ elsif opts[:as] == String
32
+ x.to_s
33
+ elsif opts[:as] == :boolean
34
+ self.class.cast_to_boolean(x)
35
+ end
36
+ else
37
+ opts[:default]
38
+ end
39
+ end
40
+ end
41
+
42
+ # Initial constants for ProtonAgentTail.exe
43
+ UDP_SINK_HOST = '127.0.0.1'
44
+ UDP_SINK_MULTICAST_HOST = '239.100.15.215'
45
+ UDP_SINK_PORT = 2799
46
+
47
+ ## Enumerate all PROTON_ constants
48
+ config_var 'PROTON_DEBUG_LOGLEVEL', as: String, default: 'None'
49
+ config_var 'PROTON_USER_OVERRIDES_FILE', as: String
50
+ config_var 'PROTON_STARTUP_PERIOD', as: Integer, default: 0
51
+ config_var 'PROTON_NETWORK_MODE', as: String, default: 'Udp'
52
+ config_var 'PROTON_FILE_IPC_FOLDER', as: String
53
+ config_var 'PROTON_USE_MULTICAST', as: String, default: 'False'
54
+ config_var 'PROTON_BATCH_IDLE_COUNTER', as: Integer, default: 500
55
+
56
+ ## ruby specific extras
57
+ config_var 'PROTON_RB_TRACE_BLOCKS', as: :boolean, default: false
58
+ config_var 'PROTON_EMIT_ARGUMENTS', as: :boolean, default: false
59
+
60
+ def udp_host
61
+ if proton_use_multicast == 'True'
62
+ UDP_SINK_MULTICAST_HOST
63
+ else
64
+ UDP_SINK_HOST
65
+ end
66
+ end
67
+
68
+ def udp_port
69
+ UDP_SINK_PORT
70
+ end
71
+
72
+ def loglevel
73
+ LOGLEVELS[proton_debug_loglevel] || raise(ArgumentError, "invalid log level")
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,24 @@
1
+ module Raygun
2
+ module Apm
3
+ class Event
4
+ def inspect
5
+ "#<#{self.class.name}:#{self.object_id}> length:#{self.length} pid:#{self[:pid]} tid:#{self[:tid]} timestamp:#{self[:timestamp]}"
6
+ end
7
+ class ThreadStarted < Event
8
+ def inspect
9
+ super + " "
10
+ end
11
+ end
12
+ class Begin < Event
13
+ def inspect
14
+ super + " function_id:#{self[:function_id]} instance_id:#{self[:instance_id]}"
15
+ end
16
+ end
17
+ class Methodinfo < Event
18
+ def inspect
19
+ super + " function_id:#{self[:function_id]} class_name:#{self[:class_name]} method_name:#{self[:method_name]}"
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,98 @@
1
+ module Raygun
2
+ module Apm
3
+ class Middleware
4
+ def initialize(app)
5
+ @app = app
6
+ @tracer = Raygun::Apm::Tracer.new
7
+ @tracer.udp_sink!
8
+ @tracer.process_started
9
+ ObjectSpace.define_finalizer(self, self.class.finalize(@tracer))
10
+
11
+ @http_in_subscriber = ActiveSupport::Notifications.subscribe('process_action.action_controller') do |*args|
12
+ http_in_handler(args)
13
+ end
14
+ @sql_subscriber = ActiveSupport::Notifications.subscribe('sql.active_record') do |*args|
15
+ sql_handler(args)
16
+ end
17
+
18
+ # If any kamikaze errors on init, shutdown the tracer
19
+ rescue Raygun::Apm::FatalError => e
20
+ kamikaze_handler(e)
21
+ end
22
+
23
+ def call(env)
24
+ @status, @headers, @response = instrument(env)
25
+ [@status, @headers, @response]
26
+ end
27
+
28
+ def instrument(env)
29
+ res = nil
30
+ # Can be nil if we had a kamikaze error
31
+ @tracer.start_trace if @tracer
32
+ res = @app.call(env)
33
+ # Can be nil if we had a kamikaze error
34
+ @tracer.end_trace if @tracer
35
+ res
36
+ rescue Raygun::APM::FatalError => e
37
+ kamikaze_handler(e)
38
+ end
39
+
40
+ def kamikaze_handler(exception)
41
+ warn "Raygun APM shutting down due to error - %s", e.message
42
+ # Kill extended event subcriptions
43
+ ActiveSupport::Notifications.unsubscribe(@http_in_subscriber)
44
+ ActiveSupport::Notifications.unsubscribe(@sql_subscriber)
45
+ # Shutdown the tracepoint if enabled to reduce any overhead and stall emission
46
+ @tracer.tracepoint.stop if @tracer.tracepoint.enabled?
47
+ # Let the GC clean up the sink thread through the finalizer below
48
+ @tracer = nil
49
+ end
50
+
51
+ def http_in_handler(args)
52
+ notification = ActiveSupport::Notifications::Event.new *args
53
+ if notification.payload[:exception]
54
+ # XXX notify?
55
+ return
56
+ end
57
+ req = Rack::Request.new notification.payload[:headers].env
58
+ event = Raygun::Apm::Event::HttpIn.new
59
+ event[:url] = req.url
60
+ event[:verb] = req.request_method
61
+ event[:status] = notification.payload[:status]
62
+ # XXX constant milliseconds to microseconds
63
+ event[:duration] = notification.duration * 1000
64
+ @tracer.emit(event)
65
+ rescue => e
66
+ # XXX report
67
+ end
68
+
69
+ def sql_handler(args)
70
+ notification = ActiveSupport::Notifications::Event.new *args
71
+ connection = if notification.payload[:connection]
72
+ notification.payload[:connection]
73
+ else
74
+ ObjectSpace._id2ref(notification.payload[:connection_id])
75
+ end
76
+ event = Raygun::Apm::Event::Sql.new
77
+ event[:query] = notification.payload[:sql]
78
+
79
+ # XXX this is hacky
80
+ if config = connection.instance_variable_get('@config')
81
+ event[:provider] = config[:adapter]
82
+ event[:host] = config[:host]
83
+ event[:database] = config[:database]
84
+ end
85
+
86
+ # XXX constant milliseconds to microseconds
87
+ event[:duration] = notification.duration * 1000
88
+ @tracer.emit(event)
89
+ rescue => e
90
+ # XXX report
91
+ end
92
+
93
+ def self.finalize(tracer)
94
+ proc {tracer.process_ended}
95
+ end
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,58 @@
1
+ require 'raygun/apm/blacklist'
2
+ module Raygun
3
+ module Apm
4
+ class Tracer
5
+ attr_accessor :config
6
+
7
+ def initialize(env=ENV)
8
+ @config = Config.new(env)
9
+ @blacklist = if @config.proton_user_overrides_file && File.exists?(@config.proton_user_overrides_file)
10
+ File.readlines(@config.proton_user_overrides_file)
11
+ else
12
+ []
13
+ end
14
+ @blacklist.each do |line|
15
+ line.strip!
16
+ if line.start_with?('#')
17
+ # comment
18
+ elsif line.start_with?('+')
19
+ add_whitelist line[1..-1]
20
+ elsif line.start_with?('-')
21
+ add_blacklist line[1..-1]
22
+ elsif line.size > 0
23
+ add_blacklist line
24
+ end
25
+ end
26
+ Raygun::Apm::Blacklist.resolve_entries.each do |line|
27
+ add_blacklist line
28
+ end
29
+ install_tracepoint(
30
+ startup_period: config.proton_startup_period,
31
+ trace_blocks: config.proton_rb_trace_blocks,
32
+ emit_arguments: config.proton_emit_arguments,
33
+ loglevel: config.loglevel
34
+ )
35
+ ObjectSpace.define_finalizer(self, proc{ tracepoint.disable })
36
+ # Any fails here is kamikaze for the tracer
37
+ rescue => e
38
+ # XXX works for the middleware wrapped case, not for standalone - revisit
39
+ raise Raygun::Apm::FatalError, "Raygun APM tracer could not be initialized: #{e.message}"
40
+ end
41
+
42
+ def udp_sink!
43
+ require "socket"
44
+ sock = UDPSocket.new
45
+ self.udp_sink(
46
+ socket: sock,
47
+ host: config.udp_host,
48
+ port: config.udp_port
49
+ )
50
+ # Any fails here is kamikaze for the tracer
51
+ rescue => e
52
+ # XXX works for the middleware wrapped case, not for standalone - revisit
53
+ raise Raygun::Apm::FatalError, "Raygun APM UDP sink could not be initialized: #{e.message}"
54
+ end
55
+
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,5 @@
1
+ module Raygun
2
+ module Apm
3
+ VERSION = "0.0.3"
4
+ end
5
+ end
data/lib/raygun/apm.rb ADDED
@@ -0,0 +1,16 @@
1
+ require "raygun/apm/version"
2
+ begin
3
+ RUBY_VERSION =~ /(\d+\.\d+)/
4
+ require "raygun#{$1}/raygun_extension"
5
+ rescue LoadError
6
+ require "raygun/raygun_ext"
7
+ end
8
+ require "raygun/apm/config"
9
+ require "raygun/apm/tracer"
10
+ require "raygun/apm/event"
11
+
12
+ module Raygun
13
+ module Apm
14
+ # Your code goes here...
15
+ end
16
+ end
Binary file
@@ -0,0 +1,32 @@
1
+
2
+ require File.expand_path('../lib/raygun/apm/version', __FILE__)
3
+
4
+ Gem::Specification.new do |spec|
5
+ spec.name = "raygun-apm"
6
+ spec.version = Raygun::Apm::VERSION
7
+ spec.authors = ["Erkki Eilonen"]
8
+ spec.email = ["erkki@bearmetal.eu"]
9
+
10
+ spec.summary = %q{Raygun application performance monitoring}
11
+ #spec.description = %q{TODO: Write a longer description or delete this line.}
12
+ #spec.homepage = "TODO: Put your gem's website or public repo URL here."
13
+
14
+ # Specify which files should be added to the gem when it is released.
15
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
16
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features|vendor|tools|ext)/}) || f.match(%r{Rakefile|.git}) }
17
+ spec.bindir = "exe"
18
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
19
+ spec.require_paths = ["lib", "ext"]
20
+
21
+ spec.platform = Gem::Platform::RUBY
22
+ spec.extensions = ["ext/raygun/extconf.rb"]
23
+ spec.required_ruby_version = '>= 2.4.0'
24
+
25
+ spec.add_development_dependency "debase-ruby_core_source", "~> 0.10.6"
26
+ spec.add_development_dependency "bundler", "~> 1.16"
27
+ spec.add_development_dependency "rake", "~> 12.0"
28
+ spec.add_development_dependency "minitest", "~> 5.0"
29
+ spec.add_development_dependency "rake-compiler", "~> 1.0.8"
30
+ spec.add_development_dependency "rake-compiler-dock", "~> 0.7.2"
31
+ spec.add_development_dependency "benchmark_driver", "~> 0.14.17"
32
+ end
metadata ADDED
@@ -0,0 +1,160 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: raygun-apm
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.3
5
+ platform: x86-mingw32
6
+ authors:
7
+ - Erkki Eilonen
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2019-10-23 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: debase-ruby_core_source
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.10.6
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.10.6
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.16'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.16'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '12.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '12.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: minitest
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '5.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '5.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake-compiler
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 1.0.8
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 1.0.8
83
+ - !ruby/object:Gem::Dependency
84
+ name: rake-compiler-dock
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 0.7.2
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 0.7.2
97
+ - !ruby/object:Gem::Dependency
98
+ name: benchmark_driver
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 0.14.17
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 0.14.17
111
+ description:
112
+ email:
113
+ - erkki@bearmetal.eu
114
+ executables: []
115
+ extensions: []
116
+ extra_rdoc_files: []
117
+ files:
118
+ - Gemfile
119
+ - Gemfile.lock
120
+ - README.md
121
+ - bin/console
122
+ - bin/setup
123
+ - ext/raygun/extconf.rb
124
+ - lib/raygun/apm.rb
125
+ - lib/raygun/apm/blacklist.rb
126
+ - lib/raygun/apm/config.rb
127
+ - lib/raygun/apm/event.rb
128
+ - lib/raygun/apm/middleware.rb
129
+ - lib/raygun/apm/tracer.rb
130
+ - lib/raygun/apm/version.rb
131
+ - lib/raygun/raygun_ext.so
132
+ - raygun-apm.gemspec
133
+ homepage:
134
+ licenses: []
135
+ metadata: {}
136
+ post_install_message:
137
+ rdoc_options: []
138
+ require_paths:
139
+ - lib
140
+ - ext
141
+ required_ruby_version: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '2.6'
146
+ - - "<"
147
+ - !ruby/object:Gem::Version
148
+ version: 2.7.dev
149
+ required_rubygems_version: !ruby/object:Gem::Requirement
150
+ requirements:
151
+ - - ">="
152
+ - !ruby/object:Gem::Version
153
+ version: '0'
154
+ requirements: []
155
+ rubyforge_project:
156
+ rubygems_version: 2.7.9
157
+ signing_key:
158
+ specification_version: 4
159
+ summary: Raygun application performance monitoring
160
+ test_files: []