plain_apm 0.7.1 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/plain_apm/agent.rb +0 -1
- data/lib/plain_apm/event_attributes.rb +14 -21
- data/lib/plain_apm/extensions/context/active_job.rb +0 -6
- data/lib/plain_apm/extensions/context/middleware.rb +7 -3
- data/lib/plain_apm/extensions/context/rack.rb +47 -0
- data/lib/plain_apm/extensions/context/railtie.rb +12 -6
- data/lib/plain_apm/extensions/exceptions/rack.rb +1 -1
- data/lib/plain_apm/extensions/exceptions/railtie.rb +5 -3
- data/lib/plain_apm/extensions/thread_allocations/active_support_event.rb +31 -0
- data/lib/plain_apm/extensions/thread_allocations/railtie.rb +15 -0
- data/lib/plain_apm/helpers.rb +1 -0
- data/lib/plain_apm/hooks/action_view.rb +1 -1
- data/lib/plain_apm/hooks/active_record.rb +2 -0
- data/lib/plain_apm/hooks/active_support_subscriber.rb +17 -10
- data/lib/plain_apm/hooks/deploy.rb +5 -1
- data/lib/plain_apm/hooks/error_reporter.rb +10 -7
- data/lib/plain_apm/version.rb +1 -1
- data/lib/plain_apm.rb +34 -22
- metadata +21 -21
- data/Rakefile +0 -21
- data/lib/plain_apm/backoff.rb +0 -40
- data/lib/plain_apm/extensions/thread_allocations.rb +0 -35
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3acddaa717f06d06714c34402f068f3f196cfa3f0408b5567a3e488f77305793
|
4
|
+
data.tar.gz: cac965341db100f19bc3199d629ddfd3bff4fd7e9f5695a9c4c11baf69ba7c50
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0e2919a1a3f001220ad564e982c9097b016b791296f71e2f8cadc3dda8f1abdd5a9a85aae650e239c3dbea638f6b385ef33943fd7c4e56419b340f8bb756046f
|
7
|
+
data.tar.gz: a7f2f65d4cf5ff3a673d54e3f196fbe79c60268104c9b531127fc87aad56de262d06a3c1858f19e0a27fff6b3fc66bd2117614081ad64c1cce030faf1d7fd97d
|
data/lib/plain_apm/agent.rb
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
require "time"
|
2
|
+
require "socket"
|
3
|
+
|
1
4
|
module PlainApm
|
2
5
|
module EventAttributes
|
3
6
|
SOURCES_WITH_EXTRA_ATTRIBUTES = %w[
|
@@ -69,11 +72,11 @@ module PlainApm
|
|
69
72
|
"source" => source,
|
70
73
|
"name" => name,
|
71
74
|
"allocations" => event.allocations,
|
72
|
-
"thread_allocations" => event.thread_allocations,
|
73
75
|
"event_time" => event.time,
|
74
76
|
"duration" => event.duration
|
75
77
|
}
|
76
78
|
|
79
|
+
attrs["thread_allocations"] = event.thread_allocations if event.respond_to?(:thread_allocations)
|
77
80
|
attrs["source_location"] = loc if !loc.nil?
|
78
81
|
|
79
82
|
attrs.merge!(trace_attributes(source))
|
@@ -84,33 +87,23 @@ module PlainApm
|
|
84
87
|
private
|
85
88
|
|
86
89
|
def trace_attributes(source)
|
87
|
-
|
88
|
-
|
89
|
-
if add_extra_attributes?(source)
|
90
|
-
attrs.merge!(process_attributes, context_attributes)
|
91
|
-
else
|
92
|
-
attrs.merge!(context_attributes.slice(:trace_id))
|
93
|
-
end
|
94
|
-
|
95
|
-
attrs
|
96
|
-
end
|
97
|
-
|
98
|
-
def add_extra_attributes?(source)
|
99
|
-
SOURCES_WITH_EXTRA_ATTRIBUTES.include?(source)
|
90
|
+
process_attributes.merge(context_attributes)
|
100
91
|
end
|
101
92
|
|
102
|
-
def
|
93
|
+
def process_attributes
|
103
94
|
{
|
95
|
+
"thread_id" => Thread.current.object_id,
|
96
|
+
"collected_at" => Time.now.iso8601(9),
|
104
97
|
"version" => PlainApm::VERSION
|
105
|
-
}
|
98
|
+
}.merge(
|
99
|
+
host_attributes
|
100
|
+
)
|
106
101
|
end
|
107
102
|
|
108
|
-
def
|
109
|
-
{
|
110
|
-
"collected_at" => Time.now.iso8601(9),
|
103
|
+
def host_attributes
|
104
|
+
@host_attributes ||= {
|
111
105
|
"hostname" => Socket.gethostname,
|
112
|
-
"pid" => Process.pid
|
113
|
-
"thread_id" => Thread.current.object_id
|
106
|
+
"pid" => Process.pid
|
114
107
|
}
|
115
108
|
end
|
116
109
|
|
@@ -11,7 +11,7 @@ require "securerandom"
|
|
11
11
|
module PlainApm
|
12
12
|
module Extensions
|
13
13
|
module Context
|
14
|
-
class
|
14
|
+
class Rack
|
15
15
|
def initialize(app)
|
16
16
|
@app = app
|
17
17
|
end
|
@@ -21,8 +21,12 @@ module PlainApm
|
|
21
21
|
|
22
22
|
status, headers, body = @app.call(env)
|
23
23
|
|
24
|
-
body = Rack::BodyProxy
|
25
|
-
|
24
|
+
body = if defined?(Rack::BodyProxy)
|
25
|
+
Rack::BodyProxy.new(body) do
|
26
|
+
Context.clear!
|
27
|
+
end
|
28
|
+
else
|
29
|
+
body
|
26
30
|
end
|
27
31
|
|
28
32
|
processed = true
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "securerandom"
|
4
|
+
|
5
|
+
##
|
6
|
+
# This code is inspired by request_store gem by Steve Klabnik:
|
7
|
+
#
|
8
|
+
# https://github.com/steveklabnik/request_store/
|
9
|
+
#
|
10
|
+
# See LICENSE.txt in the current directory for the license.
|
11
|
+
module PlainApm
|
12
|
+
module Extensions
|
13
|
+
module Context
|
14
|
+
class Rack
|
15
|
+
def initialize(app)
|
16
|
+
@app = app
|
17
|
+
end
|
18
|
+
|
19
|
+
def call(env)
|
20
|
+
Context.trace_id = trace_id(env)
|
21
|
+
|
22
|
+
status, headers, body = @app.call(env)
|
23
|
+
|
24
|
+
body = Rack::BodyProxy.new(body) do
|
25
|
+
Context.clear!
|
26
|
+
end
|
27
|
+
|
28
|
+
processed = true
|
29
|
+
|
30
|
+
[status, headers, body]
|
31
|
+
ensure
|
32
|
+
Context.clear! if !processed
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def trace_id(env)
|
38
|
+
request_id(env) || SecureRandom.uuid
|
39
|
+
end
|
40
|
+
|
41
|
+
def request_id(env)
|
42
|
+
env["action_dispatch.request_id"] || env["HTTP_X_REQUEST_ID"]
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -9,12 +9,18 @@
|
|
9
9
|
module PlainApm
|
10
10
|
module Extensions
|
11
11
|
module Context
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
12
|
+
if defined?(Rails::Railtie)
|
13
|
+
class Railtie < Rails::Railtie
|
14
|
+
initializer "plain_apm.initialize_context" do |app|
|
15
|
+
ActiveSupport.on_load(:active_job) do |klass|
|
16
|
+
klass.prepend(PlainApm::Extensions::Context::ActiveJob)
|
17
|
+
end
|
18
|
+
|
19
|
+
if defined?(ActionDispatch::RequestId)
|
20
|
+
app.config.middleware.insert_after ActionDispatch::RequestId, PlainApm::Extensions::Context::Rack
|
21
|
+
else
|
22
|
+
app.config.middleware.insert_after Rack::MethodOverride, PlainApm::Extensions::Context::Rack
|
23
|
+
end
|
18
24
|
end
|
19
25
|
end
|
20
26
|
end
|
@@ -3,9 +3,11 @@
|
|
3
3
|
module PlainApm
|
4
4
|
module Extensions
|
5
5
|
module Exceptions
|
6
|
-
|
7
|
-
|
8
|
-
|
6
|
+
if defined?(Rails::Railtie)
|
7
|
+
class Railtie < Rails::Railtie
|
8
|
+
initializer "plain_apm.insert_exceptions_middleware" do |app|
|
9
|
+
app.config.middleware.insert(0, PlainApm::Extensions::Exceptions::Rack)
|
10
|
+
end
|
9
11
|
end
|
10
12
|
end
|
11
13
|
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module PlainApm
|
2
|
+
module Extensions
|
3
|
+
module ThreadAllocations
|
4
|
+
module ActiveSupportEvent
|
5
|
+
def start!
|
6
|
+
super
|
7
|
+
@thread_allocation_count_start = now_thread_allocations
|
8
|
+
end
|
9
|
+
|
10
|
+
def finish!
|
11
|
+
super
|
12
|
+
@thread_allocation_count_finish = now_thread_allocations
|
13
|
+
end
|
14
|
+
|
15
|
+
def thread_allocations
|
16
|
+
@thread_allocation_count_finish - @thread_allocation_count_start
|
17
|
+
end
|
18
|
+
|
19
|
+
if defined?(PlainApm::ObjectTracing)
|
20
|
+
def now_thread_allocations
|
21
|
+
PlainApm::ObjectTracing.total_thread_allocated_objects
|
22
|
+
end
|
23
|
+
else
|
24
|
+
def now_thread_allocations
|
25
|
+
0
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module PlainApm
|
2
|
+
module Extensions
|
3
|
+
module ThreadAllocations
|
4
|
+
if defined?(Rails::Railtie)
|
5
|
+
class Railtie < Rails::Railtie
|
6
|
+
initializer "plain_apm.thread_allocations_in_active_support_events" do
|
7
|
+
ActiveSupport::Notifications::Event.prepend(
|
8
|
+
PlainApm::Extensions::ThreadAllocations::ActiveSupportEvent
|
9
|
+
)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/lib/plain_apm/helpers.rb
CHANGED
@@ -6,6 +6,7 @@ module PlainApm
|
|
6
6
|
|
7
7
|
def plain_apm_instrument(name, context = {}, &block)
|
8
8
|
sanitized_name = name.gsub(/\W/, "_").gsub(/(?!^)([A-Z])/) { |m| "_#{m}" }.squeeze("_").downcase
|
9
|
+
return unless defined?(ActiveSupport::Notifications)
|
9
10
|
ActiveSupport::Notifications.instrument("#{sanitized_name}.manual_plain_apm", **context, &block)
|
10
11
|
end
|
11
12
|
end
|
@@ -6,29 +6,36 @@ module PlainApm
|
|
6
6
|
include EventAttributes
|
7
7
|
|
8
8
|
def install
|
9
|
-
|
10
|
-
require "active_support/notifications"
|
11
|
-
rescue LoadError
|
12
|
-
return
|
13
|
-
end
|
9
|
+
return unless defined?(::ActiveSupport::Notifications)
|
14
10
|
|
15
11
|
asn = ::ActiveSupport::Notifications
|
16
12
|
|
17
|
-
# Rails
|
18
|
-
|
19
|
-
|
13
|
+
# Rails 6.0 has a slightly different arity check in the subscriber
|
14
|
+
# constructor, so we need to use a proc, method(:collect) won't work.
|
15
|
+
# https://github.com/rails/rails/blob/28bb76d3efc39b2ef663dfe2346f7c2621343cd6/activesupport/lib/active_support/notifications/fanout.rb#L93-L100
|
16
|
+
# vs
|
17
|
+
# https://github.com/rails/rails/blob/7c70791470fc517deb7c640bead9f1b47efb5539/activesupport/lib/active_support/notifications/fanout.rb#L132-L139
|
18
|
+
subscriber = proc { |event| collect(event) }
|
19
|
+
|
20
|
+
# #monotonic_subscribe got added in Rails >= 6.1
|
21
|
+
@subscription = if asn.respond_to?(:monotonic_subscribe)
|
22
|
+
asn.monotonic_subscribe(notification_pattern, subscriber)
|
20
23
|
else
|
21
|
-
asn.subscribe(notification_pattern,
|
24
|
+
asn.subscribe(notification_pattern, subscriber)
|
22
25
|
end
|
23
26
|
end
|
24
27
|
|
28
|
+
def uninstall
|
29
|
+
::ActiveSupport::Notifications.unsubscribe(@subscription) if @subscription
|
30
|
+
end
|
31
|
+
|
25
32
|
def collect(event)
|
26
33
|
# id / transaction_id is by instrumenter and thread
|
27
34
|
payload = payload(event)
|
28
35
|
|
29
36
|
return if payload.nil?
|
30
37
|
|
31
|
-
|
38
|
+
::PlainApm.agent.collect(payload)
|
32
39
|
end
|
33
40
|
|
34
41
|
private
|
@@ -14,12 +14,16 @@ module PlainApm
|
|
14
14
|
collect
|
15
15
|
end
|
16
16
|
|
17
|
+
def uninstall
|
18
|
+
# NOOP
|
19
|
+
end
|
20
|
+
|
17
21
|
def collect
|
18
22
|
result = git_revision || hg_revision || return
|
19
23
|
|
20
24
|
_, attrs = attributes_from_deploy(*result)
|
21
25
|
|
22
|
-
|
26
|
+
::PlainApm.agent.collect(attrs)
|
23
27
|
end
|
24
28
|
|
25
29
|
private
|
@@ -5,12 +5,7 @@ module PlainApm
|
|
5
5
|
include EventAttributes
|
6
6
|
|
7
7
|
def install
|
8
|
-
|
9
|
-
require "active_support/error_reporter"
|
10
|
-
require "active_support/lazy_load_hooks"
|
11
|
-
rescue LoadError
|
12
|
-
return
|
13
|
-
end
|
8
|
+
return unless defined?(Rails) && Rails.respond_to?(:error)
|
14
9
|
|
15
10
|
# Install the hook when the app is up. This might miss errors that
|
16
11
|
# happen before that, but that's OK.
|
@@ -19,6 +14,14 @@ module PlainApm
|
|
19
14
|
end
|
20
15
|
end
|
21
16
|
|
17
|
+
def uninstall
|
18
|
+
return unless defined?(Rails) && Rails.respond_to?(:error)
|
19
|
+
|
20
|
+
# There's no unsubscribe
|
21
|
+
subscribers = Rails.error.instance_variable_get(:@subscribers)
|
22
|
+
subscribers&.delete(self)
|
23
|
+
end
|
24
|
+
|
22
25
|
def collect(e, handled:, severity:, context: {})
|
23
26
|
source, event = attributes_from_exception(e, context)
|
24
27
|
|
@@ -27,7 +30,7 @@ module PlainApm
|
|
27
30
|
event["source"] = source
|
28
31
|
event["name"] = "error_reporter"
|
29
32
|
|
30
|
-
PlainApm
|
33
|
+
::PlainApm.agent.collect(event)
|
31
34
|
end
|
32
35
|
|
33
36
|
alias_method :report, :collect
|
data/lib/plain_apm/version.rb
CHANGED
data/lib/plain_apm.rb
CHANGED
@@ -8,27 +8,11 @@ require_relative "plain_apm/event_attributes"
|
|
8
8
|
|
9
9
|
require "object_tracing"
|
10
10
|
|
11
|
+
# Deployment reporting.
|
11
12
|
require_relative "plain_apm/hooks/deploy"
|
12
13
|
|
13
|
-
# Rails
|
14
|
-
|
15
|
-
require "rack/body_proxy"
|
16
|
-
|
17
|
-
require_relative "plain_apm/extensions/context"
|
18
|
-
require_relative "plain_apm/extensions/context/middleware"
|
19
|
-
require_relative "plain_apm/extensions/context/active_job" if defined?(ActiveSupport)
|
20
|
-
require_relative "plain_apm/extensions/context/railtie" if defined?(Rails::Railtie)
|
21
|
-
require_relative "plain_apm/extensions/thread_allocations"
|
22
|
-
require_relative "plain_apm/helpers"
|
23
|
-
rescue LoadError
|
24
|
-
nil
|
25
|
-
end
|
26
|
-
|
27
|
-
# Rack exceptions
|
28
|
-
require_relative "plain_apm/extensions/exceptions/rack"
|
29
|
-
require_relative "plain_apm/extensions/exceptions/railtie" if defined?(Rails::Railtie)
|
30
|
-
|
31
|
-
# Rails instrumentation
|
14
|
+
# Rails instrumentation. The hooks won't install unless
|
15
|
+
# ActiveSupport::Notifications is loaded.
|
32
16
|
require_relative "plain_apm/hooks/active_support_subscriber"
|
33
17
|
require_relative "plain_apm/hooks/action_mailer"
|
34
18
|
require_relative "plain_apm/hooks/action_pack"
|
@@ -39,12 +23,40 @@ require_relative "plain_apm/hooks/active_support"
|
|
39
23
|
require_relative "plain_apm/hooks/manual"
|
40
24
|
require_relative "plain_apm/hooks/error_reporter"
|
41
25
|
|
26
|
+
# Per thread context for request IDs / job IDs.
|
27
|
+
require_relative "plain_apm/extensions/context"
|
28
|
+
require_relative "plain_apm/extensions/context/rack"
|
29
|
+
require_relative "plain_apm/extensions/context/active_job"
|
30
|
+
require_relative "plain_apm/extensions/context/railtie"
|
31
|
+
|
32
|
+
# Per thread allocations in ASN events
|
33
|
+
require_relative "plain_apm/extensions/thread_allocations/active_support_event"
|
34
|
+
require_relative "plain_apm/extensions/thread_allocations/railtie"
|
35
|
+
|
36
|
+
# Helpers du jour.
|
37
|
+
require_relative "plain_apm/helpers"
|
38
|
+
|
39
|
+
# Rack exceptions. Activate the middleware if in Rails.
|
40
|
+
require_relative "plain_apm/extensions/exceptions/rack"
|
41
|
+
require_relative "plain_apm/extensions/exceptions/railtie"
|
42
|
+
|
42
43
|
module PlainApm
|
43
|
-
|
44
|
+
# Allow swapping out the Agent for a synchronous, in-memory implementation in
|
45
|
+
# the tests.
|
46
|
+
def self.agent=(agent)
|
47
|
+
@@agent = agent
|
48
|
+
end
|
49
|
+
|
50
|
+
def self.agent
|
51
|
+
@@agent ||= Agent.instance
|
52
|
+
end
|
53
|
+
|
54
|
+
# after_initialize allows reading settings from ENV on app start.
|
55
|
+
if defined?(Rails::Railtie)
|
44
56
|
class Railtie < Rails::Railtie
|
45
|
-
config.after_initialize { PlainApm
|
57
|
+
config.after_initialize { PlainApm.agent.start }
|
46
58
|
end
|
47
59
|
else
|
48
|
-
|
60
|
+
PlainApm.agent.start
|
49
61
|
end
|
50
62
|
end
|
metadata
CHANGED
@@ -1,71 +1,71 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: plain_apm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- PlainAPM Team
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-02-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: minitest
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '0'
|
19
|
+
version: '5.0'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '0'
|
26
|
+
version: '5.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: standard
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '1.16'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '1.16'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: appraisal
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '2.4'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - "
|
52
|
+
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
54
|
+
version: '2.4'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rake-compiler
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- - "
|
59
|
+
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
61
|
+
version: '1.2'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- - "
|
66
|
+
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '
|
68
|
+
version: '1.2'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rake
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -92,23 +92,23 @@ files:
|
|
92
92
|
- Gemfile
|
93
93
|
- LICENSE.txt
|
94
94
|
- README.md
|
95
|
-
- Rakefile
|
96
95
|
- ext/object_tracing/extconf.rb
|
97
96
|
- ext/object_tracing/object_tracing.c
|
98
97
|
- lib/plain_apm.rb
|
99
98
|
- lib/plain_apm/agent.rb
|
100
|
-
- lib/plain_apm/backoff.rb
|
101
99
|
- lib/plain_apm/config.rb
|
102
100
|
- lib/plain_apm/event_attributes.rb
|
103
101
|
- lib/plain_apm/extensions/context.rb
|
104
102
|
- lib/plain_apm/extensions/context/LICENSE.txt
|
105
103
|
- lib/plain_apm/extensions/context/active_job.rb
|
106
104
|
- lib/plain_apm/extensions/context/middleware.rb
|
105
|
+
- lib/plain_apm/extensions/context/rack.rb
|
107
106
|
- lib/plain_apm/extensions/context/railtie.rb
|
108
107
|
- lib/plain_apm/extensions/exceptions/active_job.rb
|
109
108
|
- lib/plain_apm/extensions/exceptions/rack.rb
|
110
109
|
- lib/plain_apm/extensions/exceptions/railtie.rb
|
111
|
-
- lib/plain_apm/extensions/thread_allocations.rb
|
110
|
+
- lib/plain_apm/extensions/thread_allocations/active_support_event.rb
|
111
|
+
- lib/plain_apm/extensions/thread_allocations/railtie.rb
|
112
112
|
- lib/plain_apm/helpers.rb
|
113
113
|
- lib/plain_apm/hooks/action_mailer.rb
|
114
114
|
- lib/plain_apm/hooks/action_pack.rb
|
data/Rakefile
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "bundler/gem_tasks"
|
4
|
-
require "appraisal"
|
5
|
-
require "standard/rake"
|
6
|
-
require "rake/testtask"
|
7
|
-
require "rake/extensiontask"
|
8
|
-
|
9
|
-
Rake::TestTask.new(:test) do |t|
|
10
|
-
t.libs << "test"
|
11
|
-
t.libs << "lib"
|
12
|
-
t.test_files = FileList["test/**/*_test.rb"]
|
13
|
-
end
|
14
|
-
|
15
|
-
Rake::ExtensionTask.new("object_tracing")
|
16
|
-
|
17
|
-
namespace :test do
|
18
|
-
task all: "appraisal:all"
|
19
|
-
end
|
20
|
-
|
21
|
-
task default: :test
|
data/lib/plain_apm/backoff.rb
DELETED
@@ -1,40 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module PlainApm
|
4
|
-
class Backoff
|
5
|
-
##
|
6
|
-
# Exponential backoff with jitter.
|
7
|
-
|
8
|
-
DEFAULT_BASE_SECONDS = 1.5
|
9
|
-
DEFAULT_MAX_RETRIES = 10 # sum_0^10 1.5 ** k ~ 170s
|
10
|
-
DEFAULT_JITTER_MULTIPLIER = 0.2 # % of the current retry interval
|
11
|
-
|
12
|
-
##
|
13
|
-
# @param base_seconds [Integer] base of the exponential retry.
|
14
|
-
# @param max_retries [Integer] maximum retries to perform.
|
15
|
-
# @param jitter_multiplier [Float] % of the current retry interval to use for jitter.
|
16
|
-
def initialize(base_seconds: nil, max_retries: nil, jitter_multiplier: nil)
|
17
|
-
@base_seconds = base_seconds || DEFAULT_BASE_SECONDS
|
18
|
-
@max_retries = max_retries || DEFAULT_MAX_RETRIES
|
19
|
-
@jitter_multiplier = jitter_multiplier || DEFAULT_JITTER_MULTIPLIER
|
20
|
-
end
|
21
|
-
|
22
|
-
##
|
23
|
-
# @param retries [Integer] Number of current retry attempts.
|
24
|
-
#
|
25
|
-
# @return [Integer|nil] Amount of time slept, or nil if out of retries.
|
26
|
-
def delay_time(retries:)
|
27
|
-
return if retries >= max_retries
|
28
|
-
|
29
|
-
base_interval = (base_seconds**retries)
|
30
|
-
jitter_interval = base_interval * jitter_multiplier
|
31
|
-
|
32
|
-
# The random factor is never -1, but that shouldn't be an issue.
|
33
|
-
base_interval + jitter_interval * (1.0 - 2.0 * rand)
|
34
|
-
end
|
35
|
-
|
36
|
-
private
|
37
|
-
|
38
|
-
attr_reader :base_seconds, :max_retries, :jitter_multiplier
|
39
|
-
end
|
40
|
-
end
|
@@ -1,35 +0,0 @@
|
|
1
|
-
module PlainApm
|
2
|
-
module Extensions
|
3
|
-
module ThreadAllocations
|
4
|
-
def start!
|
5
|
-
super
|
6
|
-
@thread_allocation_count_start = now_thread_allocations
|
7
|
-
end
|
8
|
-
|
9
|
-
def finish!
|
10
|
-
super
|
11
|
-
@thread_allocation_count_finish = now_thread_allocations
|
12
|
-
end
|
13
|
-
|
14
|
-
def thread_allocations
|
15
|
-
@thread_allocation_count_finish - @thread_allocation_count_start
|
16
|
-
end
|
17
|
-
|
18
|
-
private
|
19
|
-
|
20
|
-
if defined?(PlainApm::ObjectTracing)
|
21
|
-
def now_thread_allocations
|
22
|
-
PlainApm::ObjectTracing.total_thread_allocated_objects
|
23
|
-
end
|
24
|
-
else
|
25
|
-
def now_thread_allocations
|
26
|
-
0
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
if defined?(ActiveSupport)
|
32
|
-
ActiveSupport::Notifications::Event.prepend(PlainApm::Extensions::ThreadAllocations)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|