ruby-static-tracing 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +5 -5
  2. data/ext/ruby-static-tracing/darwin/provider.c +128 -0
  3. data/ext/ruby-static-tracing/darwin/provider.h +62 -0
  4. data/ext/ruby-static-tracing/darwin/ruby_static_tracing.c +48 -0
  5. data/ext/ruby-static-tracing/darwin/tracepoint.c +231 -0
  6. data/ext/ruby-static-tracing/darwin/tracepoint.h +52 -0
  7. data/ext/ruby-static-tracing/extconf.rb +45 -5
  8. data/ext/ruby-static-tracing/{linux → include}/ruby_static_tracing.h +3 -6
  9. data/ext/ruby-static-tracing/lib/deps-extconf.rb +47 -0
  10. data/ext/ruby-static-tracing/lib/libstapsdt/example/demo.c +42 -0
  11. data/ext/ruby-static-tracing/lib/libstapsdt/src/dynamic-symbols.c +41 -0
  12. data/ext/ruby-static-tracing/lib/libstapsdt/src/dynamic-symbols.h +34 -0
  13. data/ext/ruby-static-tracing/lib/libstapsdt/src/errors.c +30 -0
  14. data/ext/ruby-static-tracing/lib/libstapsdt/src/errors.h +8 -0
  15. data/ext/ruby-static-tracing/lib/libstapsdt/src/hash-table.c +27 -0
  16. data/ext/ruby-static-tracing/lib/libstapsdt/src/hash-table.h +3 -0
  17. data/ext/ruby-static-tracing/lib/libstapsdt/src/libstapsdt.c +208 -0
  18. data/ext/ruby-static-tracing/lib/libstapsdt/src/libstapsdt.h +66 -0
  19. data/ext/ruby-static-tracing/lib/libstapsdt/src/sdtnote.c +176 -0
  20. data/ext/ruby-static-tracing/lib/libstapsdt/src/sdtnote.h +46 -0
  21. data/ext/ruby-static-tracing/lib/libstapsdt/src/section.c +30 -0
  22. data/ext/ruby-static-tracing/lib/libstapsdt/src/section.h +21 -0
  23. data/ext/ruby-static-tracing/lib/libstapsdt/src/shared-lib.c +563 -0
  24. data/ext/ruby-static-tracing/lib/libstapsdt/src/shared-lib.h +46 -0
  25. data/ext/ruby-static-tracing/lib/libstapsdt/src/string-table.c +67 -0
  26. data/ext/ruby-static-tracing/lib/libstapsdt/src/string-table.h +28 -0
  27. data/ext/ruby-static-tracing/lib/libstapsdt/src/util.c +12 -0
  28. data/ext/ruby-static-tracing/lib/libstapsdt/src/util.h +6 -0
  29. data/ext/ruby-static-tracing/lib/libstapsdt/tests/test-errors.c +77 -0
  30. data/ext/ruby-static-tracing/lib/libstapsdt/tests/test-memory-leaks.c +25 -0
  31. data/ext/ruby-static-tracing/lib/post-extconf.rb +37 -0
  32. data/ext/ruby-static-tracing/linux/provider.c +1 -1
  33. data/ext/ruby-static-tracing/linux/provider.h +2 -7
  34. data/ext/ruby-static-tracing/linux/ruby_static_tracing.c +4 -3
  35. data/ext/ruby-static-tracing/linux/tracepoint.c +0 -1
  36. data/ext/ruby-static-tracing/linux/tracepoint.h +1 -5
  37. data/ext/ruby-static-tracing/linux/types.h +11 -0
  38. data/lib/ruby-static-tracing.rb +5 -7
  39. data/lib/ruby-static-tracing/platform.rb +48 -0
  40. data/lib/ruby-static-tracing/provider.rb +18 -1
  41. data/lib/ruby-static-tracing/tracepoint.rb +15 -3
  42. data/lib/ruby-static-tracing/tracepoints.rb +36 -0
  43. data/lib/ruby-static-tracing/tracers.rb +1 -0
  44. data/lib/ruby-static-tracing/tracers/base.rb +68 -0
  45. data/lib/ruby-static-tracing/tracers/helpers.rb +17 -0
  46. data/lib/ruby-static-tracing/tracers/latency_tracer.rb +13 -60
  47. data/lib/ruby-static-tracing/tracers/stack_tracer.rb +19 -0
  48. data/lib/ruby-static-tracing/version.rb +1 -1
  49. metadata +41 -5
@@ -16,6 +16,22 @@ module StaticTracing
16
16
  end
17
17
  end
18
18
 
19
+ def enable!
20
+ providers.values.each do |provider|
21
+ provider.enable
22
+ end
23
+ end
24
+
25
+ def disable!
26
+ providers.values.each do |provider|
27
+ provider.disable
28
+ end
29
+ end
30
+
31
+ def clean
32
+ @providers = {}
33
+ end
34
+
19
35
  private
20
36
 
21
37
  def providers
@@ -26,7 +42,8 @@ module StaticTracing
26
42
  attr_reader :namespace
27
43
 
28
44
  def initialize(namespace)
29
- if StaticTracing::Platform.linux?
45
+ if StaticTracing::Platform.linux? ||
46
+ StaticTracing::Platform.darwin?
30
47
  provider_initialize(namespace)
31
48
  else
32
49
  StaticTracing.issue_disabled_tracepoints_warning
@@ -3,7 +3,17 @@
3
3
  module StaticTracing
4
4
  class Tracepoint #:nodoc:
5
5
 
6
- class InvalidArgumentError < StandardError; end
6
+ class InvalidArgumentError < StandardError
7
+ def initialize(argument, expected_type)
8
+ error_message = <<~ERROR_MESSAGE
9
+
10
+ We expected the fire arguments to match with the ones specified on the creation of the Tracepoint
11
+
12
+ You passed #{argument} => #{argument.class} and we expected the argument to be type #{expected_type}
13
+ ERROR_MESSAGE
14
+ super(error_message)
15
+ end
16
+ end
7
17
  class InvalidArgType < StandardError; end
8
18
 
9
19
  VALID_ARGS_TYPES = [Integer, String]
@@ -16,7 +26,8 @@ module StaticTracing
16
26
  validate_args(args)
17
27
  @args = args
18
28
 
19
- if StaticTracing::Platform.linux?
29
+ if StaticTracing::Platform.linux? ||
30
+ StaticTracing::Platform.darwin?
20
31
  tracepoint_initialize(provider, name, args)
21
32
  else
22
33
  StaticTracing.issue_disabled_tracepoints_warning
@@ -25,8 +36,9 @@ module StaticTracing
25
36
 
26
37
  def fire(*values)
27
38
  values.each_with_index do |arg, i|
28
- raise InvalidArgumentError unless arg.is_a?(args[i])
39
+ raise InvalidArgumentError.new(arg, args[i]) unless arg.is_a?(args[i])
29
40
  end
41
+ _fire_tracepoint(values)
30
42
  end
31
43
 
32
44
  def enabled?
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module StaticTracing
4
+ class Tracepoints
5
+ class ProviderMissingError < StandardError; end
6
+ class TracepointMissingError < StandardError; end
7
+
8
+ class << self
9
+ def add(provider, name, data_types)
10
+ tracepoints[provider][name.to_s] ||= begin
11
+ StaticTracing::Tracepoint.new(provider, name.to_s, *data_types)
12
+ end
13
+ end
14
+
15
+ def get(provider, name)
16
+ tracepoints
17
+ .fetch(provider) { raise_error(ProviderMissingError) }
18
+ .fetch(name) { raise_error(TracepointMissingError) }
19
+ end
20
+
21
+ def clean
22
+ @tracepoints ||= Hash.new { |hash, key| hash[key] = {} }
23
+ end
24
+
25
+ private
26
+
27
+ def tracepoints
28
+ @tracepoints ||= Hash.new { |hash, key| hash[key] = {} }
29
+ end
30
+
31
+ def raise_error(error)
32
+ raise error
33
+ end
34
+ end
35
+ end
36
+ end
@@ -1,3 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative 'tracers/latency_tracer'
4
+ require_relative 'tracers/stack_tracer'
@@ -0,0 +1,68 @@
1
+ require 'unmixer'
2
+ using Unmixer
3
+
4
+ require 'ruby-static-tracing/tracers/helpers'
5
+
6
+ module StaticTracing
7
+ module Tracers
8
+ class Base
9
+ class << self
10
+ include Tracers::Helpers
11
+
12
+ def register(klass, *method_names, provider: nil)
13
+ provider ||= underscore(klass.name)
14
+ method_overrides = function_wrapper.new(provider, @wrapping_function, @data_types)
15
+ modified_classes[klass] ||= method_overrides
16
+ modified_classes[klass].add_override(method_names.flatten)
17
+ end
18
+
19
+ def enable!
20
+ modified_classes.each do |klass, wrapped_methods|
21
+ klass.prepend(wrapped_methods)
22
+ end
23
+ end
24
+
25
+ def disable!
26
+ modified_classes.each do |klass, wrapped_methods|
27
+ klass.instance_eval { unprepend(wrapped_methods) }
28
+ end
29
+ end
30
+
31
+ private
32
+
33
+ def function_wrapper
34
+ Class.new(Module) do
35
+ def initialize(provider, wrapping_function, data_types)
36
+ @provider = provider
37
+ @wrapping_function = wrapping_function
38
+ @data_types = data_types
39
+ end
40
+
41
+ def add_override(methods)
42
+ methods.each do |method|
43
+ Tracepoints.add(@provider, method, @data_types)
44
+ define_method(method.to_s, @wrapping_function)
45
+ end
46
+ end
47
+ end
48
+ end
49
+
50
+ def modified_classes
51
+ @modified_classes ||= {}
52
+ end
53
+
54
+ def set_tracepoint_data_types(*args)
55
+ @data_types = *args
56
+ end
57
+
58
+ def tracepoint_data_types
59
+ @data_types
60
+ end
61
+
62
+ def set_wrapping_function(callable)
63
+ @wrapping_function = callable
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,17 @@
1
+ module StaticTracing
2
+ module Tracers
3
+ module Helpers
4
+ extend self
5
+
6
+ def underscore(class_name)
7
+ class_name.gsub(/::/, '_').
8
+ gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
9
+ gsub(/([a-z\d])([A-Z])/,'\1_\2').
10
+ tr("-", "_").
11
+ downcase
12
+ end
13
+ end
14
+ end
15
+ end
16
+
17
+
@@ -1,67 +1,20 @@
1
1
  # frozen_string_literal: true
2
- require 'unmixer'
3
-
4
- using Unmixer
2
+ require 'ruby-static-tracing/tracers/base'
5
3
 
6
4
  module StaticTracing
7
5
  module Tracers
8
- class LatencyTracer
9
- class LatencyModuleGenerator < Module
10
- def initialize(provider, methods)
11
- methods.each do |method|
12
- define_method(method) do |*args, &block|
13
- start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC, :nanosecond)
14
- result = super(*args, &block)
15
- duration = Process.clock_gettime(Process::CLOCK_MONOTONIC, :nanosecond) - start_time
16
- LatencyTracer.fire_tracepoint(provider, method, duration)
17
- result
18
- end
19
- end
20
- end
21
- end
22
-
23
- class << self
24
- def register(klass, method_names, provider: nil)
25
- provider ||= underscore(klass.name)
26
- latency_module = LatencyModuleGenerator.new(provider, Array(method_names))
27
- modified_classes[klass] = latency_module
28
- end
29
-
30
- def enable!
31
- modified_classes.each do |klass, latency_module|
32
- klass.prepend latency_module
33
- end
34
- end
35
-
36
- def disable!
37
- modified_classes.each do |klass, latency_module|
38
- klass.instance_eval { unprepend latency_module }
39
- end
40
- end
41
-
42
- def fire_tracepoint(provider, name, duration)
43
- return
44
- tracepoint(provider, name).fire(name, duration)
45
- end
46
-
47
- private
48
-
49
- def tracepoint(provider, name)
50
- @tracepoints[name] ||= StaticTracing::Tracepoint.new(provider, name, String, Interger)
51
- end
52
-
53
- def modified_classes
54
- @modified_classes ||= {}
55
- end
56
-
57
- def underscore(class_name)
58
- class_name.gsub(/::/, '_').
59
- gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
60
- gsub(/([a-z\d])([A-Z])/,'\1_\2').
61
- tr("-", "_").
62
- downcase
63
- end
64
- end
6
+ class LatencyTracer < Base
7
+ set_wrapping_function -> (*args, &block) {
8
+ start_time = StaticTracing.nsec
9
+ result = super(*args, &block)
10
+ duration = StaticTracing.nsec - start_time
11
+ method_name = __method__.to_s
12
+ provider = Tracers::Helpers.underscore(self.class.name)
13
+ Tracepoints.get(provider, method_name).fire(method_name, duration)
14
+ result
15
+ }
16
+
17
+ set_tracepoint_data_types(String, Integer)
65
18
  end
66
19
  end
67
20
  end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ruby-static-tracing/tracers/base'
4
+
5
+ module StaticTracing
6
+ module Tracers
7
+ class StackTracer < Base
8
+ set_wrapping_function -> (*args, &block) {
9
+ current_stack = self.send(:caller).join("\n")
10
+ method_name = __method__.to_s
11
+ provider = Tracers::Helpers.underscore(self.class.name)
12
+ Tracepoints.get(provider, method_name).fire(method_name, current_stack)
13
+ super(*args, &block)
14
+ }
15
+
16
+ set_tracepoint_data_types(String, String)
17
+ end
18
+ end
19
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module StaticTracing
4
- VERSION = '0.0.2'
4
+ VERSION = '0.0.3'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-static-tracing
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dale Hamel
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-04-04 00:00:00.000000000 Z
11
+ date: 2019-04-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake-compiler
@@ -85,30 +85,66 @@ description: " A Ruby C extension that enables defining static tracepoints\n
85
85
  email: dale.hamel@srvthe.net
86
86
  executables: []
87
87
  extensions:
88
+ - ext/ruby-static-tracing/lib/deps-extconf.rb
88
89
  - ext/ruby-static-tracing/extconf.rb
90
+ - ext/ruby-static-tracing/lib/post-extconf.rb
89
91
  extra_rdoc_files: []
90
92
  files:
93
+ - ext/ruby-static-tracing/darwin/provider.c
94
+ - ext/ruby-static-tracing/darwin/provider.h
95
+ - ext/ruby-static-tracing/darwin/ruby_static_tracing.c
96
+ - ext/ruby-static-tracing/darwin/tracepoint.c
97
+ - ext/ruby-static-tracing/darwin/tracepoint.h
91
98
  - ext/ruby-static-tracing/extconf.rb
99
+ - ext/ruby-static-tracing/include/ruby_static_tracing.h
100
+ - ext/ruby-static-tracing/lib/deps-extconf.rb
101
+ - ext/ruby-static-tracing/lib/libstapsdt/example/demo.c
102
+ - ext/ruby-static-tracing/lib/libstapsdt/src/dynamic-symbols.c
103
+ - ext/ruby-static-tracing/lib/libstapsdt/src/dynamic-symbols.h
104
+ - ext/ruby-static-tracing/lib/libstapsdt/src/errors.c
105
+ - ext/ruby-static-tracing/lib/libstapsdt/src/errors.h
106
+ - ext/ruby-static-tracing/lib/libstapsdt/src/hash-table.c
107
+ - ext/ruby-static-tracing/lib/libstapsdt/src/hash-table.h
108
+ - ext/ruby-static-tracing/lib/libstapsdt/src/libstapsdt.c
109
+ - ext/ruby-static-tracing/lib/libstapsdt/src/libstapsdt.h
110
+ - ext/ruby-static-tracing/lib/libstapsdt/src/sdtnote.c
111
+ - ext/ruby-static-tracing/lib/libstapsdt/src/sdtnote.h
112
+ - ext/ruby-static-tracing/lib/libstapsdt/src/section.c
113
+ - ext/ruby-static-tracing/lib/libstapsdt/src/section.h
114
+ - ext/ruby-static-tracing/lib/libstapsdt/src/shared-lib.c
115
+ - ext/ruby-static-tracing/lib/libstapsdt/src/shared-lib.h
116
+ - ext/ruby-static-tracing/lib/libstapsdt/src/string-table.c
117
+ - ext/ruby-static-tracing/lib/libstapsdt/src/string-table.h
118
+ - ext/ruby-static-tracing/lib/libstapsdt/src/util.c
119
+ - ext/ruby-static-tracing/lib/libstapsdt/src/util.h
120
+ - ext/ruby-static-tracing/lib/libstapsdt/tests/test-errors.c
121
+ - ext/ruby-static-tracing/lib/libstapsdt/tests/test-memory-leaks.c
122
+ - ext/ruby-static-tracing/lib/post-extconf.rb
92
123
  - ext/ruby-static-tracing/linux/provider.c
93
124
  - ext/ruby-static-tracing/linux/provider.h
94
125
  - ext/ruby-static-tracing/linux/ruby_static_tracing.c
95
- - ext/ruby-static-tracing/linux/ruby_static_tracing.h
96
126
  - ext/ruby-static-tracing/linux/tracepoint.c
97
127
  - ext/ruby-static-tracing/linux/tracepoint.h
128
+ - ext/ruby-static-tracing/linux/types.h
98
129
  - lib/ruby-static-tracing.rb
99
130
  - lib/ruby-static-tracing/configuration.rb
100
131
  - lib/ruby-static-tracing/platform.rb
101
132
  - lib/ruby-static-tracing/provider.rb
102
133
  - lib/ruby-static-tracing/tracepoint.rb
134
+ - lib/ruby-static-tracing/tracepoints.rb
103
135
  - lib/ruby-static-tracing/tracers.rb
136
+ - lib/ruby-static-tracing/tracers/base.rb
104
137
  - lib/ruby-static-tracing/tracers/concerns/latency_tracer.rb
138
+ - lib/ruby-static-tracing/tracers/helpers.rb
105
139
  - lib/ruby-static-tracing/tracers/latency_tracer.rb
140
+ - lib/ruby-static-tracing/tracers/stack_tracer.rb
106
141
  - lib/ruby-static-tracing/version.rb
107
142
  homepage: https://github.com/dalehamel/ruby-static-tracing
108
143
  licenses:
109
144
  - MIT
110
145
  metadata: {}
111
- post_install_message:
146
+ post_install_message: "\n WARNING: you will need a new kernel (4.14+) that supports
147
+ eBPF.\n\n You should use the newest possible version of bpftrace\n "
112
148
  rdoc_options: []
113
149
  require_paths:
114
150
  - lib
@@ -124,7 +160,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
124
160
  version: '0'
125
161
  requirements: []
126
162
  rubyforge_project:
127
- rubygems_version: 2.6.8
163
+ rubygems_version: 2.7.6.2
128
164
  signing_key:
129
165
  specification_version: 4
130
166
  summary: USDT tracing for Ruby