plain_apm 0.3.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e496879797c3c3bedfeea9f641b9f113bae2104b6a3c69bb67fdd6cfd8734af6
4
- data.tar.gz: 484e1217d8d459ccf6c3619da23730c2126094136648a6c8fe15f5dbb63962b1
3
+ metadata.gz: 5d7ba5044b9386fbcbfb252e35649da1ad0b7573880510e0588323e24cf0bc11
4
+ data.tar.gz: 0ae2df2fea0bdbfc798be93a739a5b6d9144db045f38905feddd5e0975d852fd
5
5
  SHA512:
6
- metadata.gz: '052286dd61178482ed0c794f0486d28d21914bb250a77b86ec408599a25d6b6198baa844f34678ec6094ad84f3d3ec37ff2a5761ec89286527d19676ed1b7ef5'
7
- data.tar.gz: 51b7cbc86ff0c6c8595ffde40361713f41e206d0d73f63ef0bb8270454a3a62af16e5851a789c2c9c2367cb8ade92e36324d9acaca64bd1784cf81fe486ddf15
6
+ metadata.gz: f8af4f98d0e30a361e8c2aaf5ef6a3e31d5e1c533ea74b5bebcb03fde4069ef70d8ad9e8067d3c2d99bcaac0e1a73a03f847ef0b80c3ee6bea2be89c4829ec35
7
+ data.tar.gz: 007fab263d50573c67f710854ad60a6a3b4392e71599de2b6ed5f287bd63f7814e457c281f9135f130f78446b25af97be1669dcbc8d8ba731f78c16591d094ec
data/Rakefile CHANGED
@@ -4,6 +4,7 @@ require "bundler/gem_tasks"
4
4
  require "appraisal"
5
5
  require "standard/rake"
6
6
  require "rake/testtask"
7
+ require "rake/extensiontask"
7
8
 
8
9
  Rake::TestTask.new(:test) do |t|
9
10
  t.libs << "test"
@@ -11,6 +12,8 @@ Rake::TestTask.new(:test) do |t|
11
12
  t.test_files = FileList["test/**/*_test.rb"]
12
13
  end
13
14
 
15
+ Rake::ExtensionTask.new("object_tracing")
16
+
14
17
  namespace :test do
15
18
  task all: "appraisal:all"
16
19
  end
@@ -0,0 +1,6 @@
1
+ require 'mkmf'
2
+
3
+ have_header('ruby/ruby.h') or missing('ruby/ruby.h')
4
+ have_header('ruby/debug.h') or missing('ruby/debug.h')
5
+
6
+ create_makefile('object_tracing')
@@ -0,0 +1,25 @@
1
+ #include <ruby/ruby.h>
2
+ #include <ruby/debug.h>
3
+
4
+ static __thread uint64_t allocated_objects = 0;
5
+
6
+ static VALUE rb_mPlainApm;
7
+ static VALUE rb_mObjTracing;
8
+
9
+ static VALUE total_thread_allocated_objects(VALUE self) {
10
+ return ULL2NUM(allocated_objects);
11
+ }
12
+
13
+ static void track_thread_allocated_objects(VALUE tpval, void *data) {
14
+ allocated_objects++;
15
+ }
16
+
17
+ void Init_object_tracing(void) {
18
+ rb_mPlainApm = rb_define_module("PlainApm");
19
+ rb_mObjTracing = rb_define_module_under(rb_mPlainApm, "ObjectTracing");
20
+
21
+ rb_define_module_function(rb_mObjTracing, "total_thread_allocated_objects", total_thread_allocated_objects, 0);
22
+
23
+ VALUE tpval = rb_tracepoint_new(0, RUBY_INTERNAL_EVENT_NEWOBJ, track_thread_allocated_objects, NULL);
24
+ rb_tracepoint_enable(tpval);
25
+ }
@@ -72,7 +72,8 @@ module PlainApm
72
72
  Hooks::ActionView,
73
73
  Hooks::ActiveJob,
74
74
  Hooks::ActiveRecord,
75
- Hooks::ErrorReporter
75
+ Hooks::ErrorReporter,
76
+ Hooks::Manual
76
77
  ].map(&:new).each(&:install)
77
78
  end
78
79
 
@@ -0,0 +1,35 @@
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
@@ -0,0 +1,12 @@
1
+ module PlainApm
2
+ module Helpers
3
+ def plain_apm_context(context = {})
4
+ PlainApm::Extensions::Context.context.merge!(context)
5
+ end
6
+
7
+ def plain_apm_instrument(name, context = {}, &block)
8
+ sanitized_name = name.gsub(/\W/, "_").gsub(/(?!^)([A-Z])/) { |m| "_#{m}" }.gsub(/_+/, "_").downcase
9
+ ActiveSupport::Notifications.instrument("#{sanitized_name}.manual.plain_apm", **context, &block)
10
+ end
11
+ end
12
+ end
@@ -20,6 +20,7 @@ module PlainApm
20
20
  "name" => name,
21
21
  "backtrace" => filtered_backtrace,
22
22
  "allocations" => event.allocations,
23
+ "thread_allocations" => event.thread_allocations,
23
24
  "started_at" => event.time,
24
25
  "finished_at" => event.end
25
26
  }
@@ -20,6 +20,7 @@ module PlainApm
20
20
  "name" => name,
21
21
  "backtrace" => filtered_backtrace,
22
22
  "allocations" => event.allocations,
23
+ "thread_allocations" => event.thread_allocations,
23
24
  "started_at" => event.time,
24
25
  "finished_at" => event.end
25
26
  }
@@ -21,7 +21,8 @@ module PlainApm
21
21
  "backtrace" => filtered_backtrace,
22
22
  "started_at" => event.time,
23
23
  "finished_at" => event.end,
24
- "allocations" => event.allocations
24
+ "allocations" => event.allocations,
25
+ "thread_allocations" => event.thread_allocations
25
26
  }
26
27
 
27
28
  case name
@@ -23,6 +23,7 @@ module PlainApm
23
23
  "started_at" => event.time,
24
24
  "finished_at" => event.end,
25
25
  "allocations" => event.allocations,
26
+ "thread_allocations" => event.thread_allocations,
26
27
  "queue_name" => job.queue_name,
27
28
  "job_id" => job.job_id,
28
29
  "job_class" => job.class.name,
@@ -23,7 +23,8 @@ module PlainApm
23
23
  "backtrace" => filtered_backtrace,
24
24
  "started_at" => event.time,
25
25
  "finished_at" => event.end,
26
- "allocations" => event.allocations
26
+ "allocations" => event.allocations,
27
+ "thread_allocations" => event.thread_allocations
27
28
  }
28
29
 
29
30
  case name
@@ -18,7 +18,13 @@ module PlainApm
18
18
  tool, revision = *result
19
19
 
20
20
  Agent.instance.collect(
21
- {"source" => tool, "revision" => revision, "name" => "deploy"}
21
+ {
22
+ "source" => tool,
23
+ "revision" => revision,
24
+ "name" => "deploy",
25
+ "started_at" => Time.now.to_f,
26
+ "finished_at" => Time.now.to_f
27
+ }
22
28
  )
23
29
  end
24
30
 
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PlainApm
4
+ module Hooks
5
+ class Manual < ActiveSupportSubscriber
6
+ NOTIFICATION_PATTERN = /\A[^!]\w+\.manual\.plain_apm\Z/.freeze
7
+
8
+ private
9
+
10
+ def notification_pattern
11
+ NOTIFICATION_PATTERN
12
+ end
13
+
14
+ def payload(event)
15
+ name, source, _ = *event.name.split(".")
16
+
17
+ {
18
+ "source" => source,
19
+ "name" => name,
20
+ "backtrace" => filtered_backtrace,
21
+ "started_at" => event.time,
22
+ "finished_at" => event.end,
23
+ "allocations" => event.allocations,
24
+ "thread_allocations" => event.thread_allocations,
25
+ "payload" => event.payload
26
+ }
27
+ end
28
+ end
29
+ end
30
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PlainApm
4
- VERSION = "0.3.0"
4
+ VERSION = "0.5.0"
5
5
  end
data/lib/plain_apm.rb CHANGED
@@ -5,6 +5,8 @@ require_relative "plain_apm/transport"
5
5
  require_relative "plain_apm/config"
6
6
  require_relative "plain_apm/agent"
7
7
 
8
+ require "object_tracing"
9
+
8
10
  require_relative "plain_apm/hooks/deploy"
9
11
 
10
12
  # Rails extensions
@@ -12,10 +14,11 @@ begin
12
14
  require "rack/body_proxy"
13
15
 
14
16
  require_relative "plain_apm/extensions/context"
15
- require_relative "plain_apm/extensions/context/helpers"
16
17
  require_relative "plain_apm/extensions/context/middleware"
17
18
  require_relative "plain_apm/extensions/context/active_job" if defined?(ActiveSupport)
18
19
  require_relative "plain_apm/extensions/context/railtie" if defined?(Rails::Railtie)
20
+ require_relative "plain_apm/extensions/thread_allocations"
21
+ require_relative "plain_apm/helpers"
19
22
  rescue LoadError
20
23
  nil
21
24
  end
@@ -31,6 +34,7 @@ require_relative "plain_apm/hooks/action_pack"
31
34
  require_relative "plain_apm/hooks/action_view"
32
35
  require_relative "plain_apm/hooks/active_job"
33
36
  require_relative "plain_apm/hooks/active_record"
37
+ require_relative "plain_apm/hooks/manual"
34
38
  require_relative "plain_apm/hooks/error_reporter"
35
39
 
36
40
  module PlainApm
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: plain_apm
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.5.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: 2022-10-07 00:00:00.000000000 Z
11
+ date: 2022-11-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: minitest
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake-compiler
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: rake
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -70,7 +84,8 @@ description: Ruby gem to collect events/metrics and send them to PlainAPM.
70
84
  email:
71
85
  - support@plainapm.com
72
86
  executables: []
73
- extensions: []
87
+ extensions:
88
+ - ext/object_tracing/extconf.rb
74
89
  extra_rdoc_files: []
75
90
  files:
76
91
  - CHANGELOG.md
@@ -78,6 +93,8 @@ files:
78
93
  - LICENSE.txt
79
94
  - README.md
80
95
  - Rakefile
96
+ - ext/object_tracing/extconf.rb
97
+ - ext/object_tracing/object_tracing.c
81
98
  - lib/plain_apm.rb
82
99
  - lib/plain_apm/agent.rb
83
100
  - lib/plain_apm/backoff.rb
@@ -85,12 +102,13 @@ files:
85
102
  - lib/plain_apm/extensions/context.rb
86
103
  - lib/plain_apm/extensions/context/LICENSE.txt
87
104
  - lib/plain_apm/extensions/context/active_job.rb
88
- - lib/plain_apm/extensions/context/helpers.rb
89
105
  - lib/plain_apm/extensions/context/middleware.rb
90
106
  - lib/plain_apm/extensions/context/railtie.rb
91
107
  - lib/plain_apm/extensions/exceptions/active_job.rb
92
108
  - lib/plain_apm/extensions/exceptions/rack.rb
93
109
  - lib/plain_apm/extensions/exceptions/railtie.rb
110
+ - lib/plain_apm/extensions/thread_allocations.rb
111
+ - lib/plain_apm/helpers.rb
94
112
  - lib/plain_apm/hooks/action_mailer.rb
95
113
  - lib/plain_apm/hooks/action_pack.rb
96
114
  - lib/plain_apm/hooks/action_view.rb
@@ -99,6 +117,7 @@ files:
99
117
  - lib/plain_apm/hooks/active_support_subscriber.rb
100
118
  - lib/plain_apm/hooks/deploy.rb
101
119
  - lib/plain_apm/hooks/error_reporter.rb
120
+ - lib/plain_apm/hooks/manual.rb
102
121
  - lib/plain_apm/transport.rb
103
122
  - lib/plain_apm/version.rb
104
123
  homepage: https://plainapm.com
@@ -1,11 +0,0 @@
1
- module PlainApm
2
- module Extensions
3
- module Context
4
- module Helpers
5
- def plain_apm_context(context = {})
6
- PlainApm::Extensions::Context.context.merge!(context)
7
- end
8
- end
9
- end
10
- end
11
- end