ruby-static-tracing 0.0.13 → 0.0.14

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.
Files changed (30) hide show
  1. checksums.yaml +4 -4
  2. data/ext/ruby-static-tracing/darwin/provider.c +40 -52
  3. data/ext/ruby-static-tracing/darwin/provider.h +2 -3
  4. data/ext/ruby-static-tracing/darwin/ruby_static_tracing.c +4 -5
  5. data/ext/ruby-static-tracing/darwin/tracepoint.c +66 -91
  6. data/ext/ruby-static-tracing/darwin/tracepoint.h +4 -4
  7. data/ext/ruby-static-tracing/extconf.rb +40 -36
  8. data/ext/ruby-static-tracing/include/ruby_static_tracing.h +2 -1
  9. data/ext/ruby-static-tracing/lib/deps-extconf.rb +30 -28
  10. data/ext/ruby-static-tracing/lib/post-extconf.rb +23 -21
  11. data/ext/ruby-static-tracing/linux/provider.c +87 -61
  12. data/ext/ruby-static-tracing/linux/provider.h +16 -4
  13. data/ext/ruby-static-tracing/linux/ruby_static_tracing.c +7 -7
  14. data/ext/ruby-static-tracing/linux/tracepoint.c +86 -96
  15. data/ext/ruby-static-tracing/linux/tracepoint.h +2 -2
  16. data/ext/ruby-static-tracing/linux/types.h +2 -2
  17. data/lib/ruby-static-tracing.rb +11 -3
  18. data/lib/ruby-static-tracing/configuration.rb +11 -0
  19. data/lib/ruby-static-tracing/platform.rb +5 -1
  20. data/lib/ruby-static-tracing/provider.rb +50 -26
  21. data/lib/ruby-static-tracing/tracepoint.rb +19 -9
  22. data/lib/ruby-static-tracing/tracepoints.rb +2 -0
  23. data/lib/ruby-static-tracing/tracer/base.rb +2 -0
  24. data/lib/ruby-static-tracing/tracer/concerns/latency_tracer.rb +2 -0
  25. data/lib/ruby-static-tracing/tracer/helpers.rb +8 -8
  26. data/lib/ruby-static-tracing/tracer/latency.rb +1 -1
  27. data/lib/ruby-static-tracing/tracer/stack.rb +4 -2
  28. data/lib/ruby-static-tracing/tracers.rb +9 -0
  29. data/lib/ruby-static-tracing/version.rb +2 -1
  30. metadata +42 -14
@@ -4,8 +4,8 @@
4
4
  // Include libstapsdt.h to wrap
5
5
  #include <libstapsdt.h> // FIXME use local
6
6
 
7
- #include "types.h"
8
7
  #include "ruby_static_tracing.h"
8
+ #include "types.h"
9
9
 
10
10
  typedef struct {
11
11
  char *name;
@@ -54,11 +54,23 @@ provider_disable(VALUE self);
54
54
  VALUE
55
55
  provider_destroy(VALUE self);
56
56
 
57
+ /*
58
+ * call-seq:
59
+ * provider.path() -> string
60
+ *
61
+ * Get a path to this provider, if the platform supports it
62
+ *
63
+ * Returns string for path, or empty string if failed
64
+ */
65
+ VALUE
66
+ provider_path(VALUE self);
67
+
57
68
  // Allocate a static_tracing_provider_type struct for ruby memory management
58
69
  VALUE
59
70
  static_tracing_provider_alloc(VALUE klass);
60
71
 
61
- SDTProbe_t
62
- *provider_add_tracepoint_internal(VALUE self, const char* name, int argc, Tracepoint_arg_types *args);
72
+ SDTProbe_t *provider_add_tracepoint_internal(VALUE self, const char *name,
73
+ int argc,
74
+ Tracepoint_arg_types *args);
63
75
 
64
- #endif //STATIC_TRACING_PROVIDER_H
76
+ #endif // STATIC_TRACING_PROVIDER_H
@@ -2,8 +2,7 @@
2
2
 
3
3
  VALUE eUSDT, eInternal;
4
4
 
5
- void Init_ruby_static_tracing()
6
- {
5
+ void Init_ruby_static_tracing() {
7
6
  VALUE cStaticTracing, cProvider, cTracepoint;
8
7
 
9
8
  cStaticTracing = rb_const_get(rb_cObject, rb_intern("StaticTracing"));
@@ -15,7 +14,7 @@ void Init_ruby_static_tracing()
15
14
  */
16
15
  cProvider = rb_const_get(cStaticTracing, rb_intern("Provider"));
17
16
 
18
- /*
17
+ /*
19
18
  * Document-class: Statictracing::Tracepoint
20
19
  *
21
20
  * A Tracepoint is a wrapper around an SDTProbe
@@ -36,13 +35,14 @@ void Init_ruby_static_tracing()
36
35
 
37
36
  rb_define_alloc_func(cProvider, static_tracing_provider_alloc);
38
37
  rb_define_method(cProvider, "provider_initialize", provider_initialize, 1);
39
- rb_define_method(cProvider, "enable", provider_enable, 0);
40
- rb_define_method(cProvider, "disable", provider_disable, 0);
38
+ rb_define_method(cProvider, "_enable_provider", provider_enable, 0);
39
+ rb_define_method(cProvider, "_disable_provider", provider_disable, 0);
41
40
  rb_define_method(cProvider, "destroy", provider_destroy, 0);
41
+ rb_define_method(cProvider, "path", provider_path, 0);
42
42
 
43
43
  rb_define_alloc_func(cTracepoint, static_tracing_tracepoint_alloc);
44
- rb_define_method(cTracepoint, "tracepoint_initialize", tracepoint_initialize, 3);
44
+ rb_define_method(cTracepoint, "tracepoint_initialize", tracepoint_initialize,
45
+ 3);
45
46
  rb_define_method(cTracepoint, "_fire_tracepoint", tracepoint_fire, 1);
46
47
  rb_define_method(cTracepoint, "enabled?", tracepoint_enabled, 0);
47
48
  }
48
-
@@ -1,29 +1,23 @@
1
1
  #include "tracepoint.h"
2
2
 
3
- static const rb_data_type_t
4
- static_tracing_tracepoint_type;
3
+ static const rb_data_type_t static_tracing_tracepoint_type;
5
4
 
6
- static const char*
7
- check_name_arg(VALUE provider);
5
+ static const char *check_name_arg(VALUE provider);
8
6
 
9
- static const char*
10
- check_provider_arg(VALUE provider);
7
+ static const char *check_provider_arg(VALUE provider);
11
8
 
12
- static Tracepoint_arg_types
13
- *check_vargs(int *argc, VALUE vargs);
9
+ static Tracepoint_arg_types *check_vargs(int *argc, VALUE vargs);
14
10
 
15
- static Tracepoint_fire_arg
16
- *check_fire_args(int *argc, VALUE vargs);
11
+ static Tracepoint_fire_arg *check_fire_args(int *argc, VALUE vargs);
17
12
 
18
13
  VALUE
19
- tracepoint_initialize(VALUE self, VALUE provider, VALUE name, VALUE vargs)
20
- {
14
+ tracepoint_initialize(VALUE self, VALUE provider, VALUE name, VALUE vargs) {
21
15
  VALUE cStaticTracing, cProvider, cProviderInst;
22
16
  static_tracing_tracepoint_t *tracepoint = NULL;
23
17
  const char *c_name_str = NULL;
24
18
  int argc = 0;
25
19
 
26
- c_name_str = check_name_arg(name);
20
+ c_name_str = check_name_arg(name);
27
21
  check_provider_arg(provider); // FIXME should only accept string
28
22
  Tracepoint_arg_types *args = check_vargs(&argc, vargs);
29
23
 
@@ -33,8 +27,10 @@ tracepoint_initialize(VALUE self, VALUE provider, VALUE name, VALUE vargs)
33
27
  cProviderInst = rb_funcall(cProvider, rb_intern("register"), 1, provider);
34
28
 
35
29
  // Use the provider to register a tracepoint
36
- SDTProbe_t *probe = provider_add_tracepoint_internal(cProviderInst, c_name_str, argc, args);
37
- TypedData_Get_Struct(self, static_tracing_tracepoint_t, &static_tracing_tracepoint_type, tracepoint);
30
+ SDTProbe_t *probe =
31
+ provider_add_tracepoint_internal(cProviderInst, c_name_str, argc, args);
32
+ TypedData_Get_Struct(self, static_tracing_tracepoint_t,
33
+ &static_tracing_tracepoint_type, tracepoint);
38
34
 
39
35
  // Stare the tracepoint handle in our struct
40
36
  tracepoint->sdt_tracepoint = probe;
@@ -44,39 +40,53 @@ tracepoint_initialize(VALUE self, VALUE provider, VALUE name, VALUE vargs)
44
40
  }
45
41
 
46
42
  VALUE
47
- tracepoint_fire(VALUE self, VALUE vargs)
48
- {
43
+ tracepoint_fire(VALUE self, VALUE vargs) {
49
44
  static_tracing_tracepoint_t *res = NULL;
50
- TypedData_Get_Struct(self, static_tracing_tracepoint_t, &static_tracing_tracepoint_type, res);
45
+ TypedData_Get_Struct(self, static_tracing_tracepoint_t,
46
+ &static_tracing_tracepoint_type, res);
51
47
  int argc = 0;
52
48
 
53
49
  Tracepoint_fire_arg *args = check_fire_args(&argc, vargs);
54
- switch(argc)
55
- {
56
- case 0: probeFire(res->sdt_tracepoint); break;
57
- case 1: probeFire(res->sdt_tracepoint, args[0]); break;
58
- case 2: probeFire(res->sdt_tracepoint, args[0], args[1]); break;
59
- case 3: probeFire(res->sdt_tracepoint, args[0], args[1], args[2]); break;
60
- case 4: probeFire(res->sdt_tracepoint, args[0], args[1], args[2], args[3]); break;
61
- case 5: probeFire(res->sdt_tracepoint, args[0], args[1], args[2], args[3], args[4]); break;
62
- case 6: probeFire(res->sdt_tracepoint, args[0], args[1], args[2], args[3], args[4], args[5]); break;
63
- default: probeFire(res->sdt_tracepoint); break;
50
+ switch (argc) {
51
+ case 0:
52
+ probeFire(res->sdt_tracepoint);
53
+ break;
54
+ case 1:
55
+ probeFire(res->sdt_tracepoint, args[0]);
56
+ break;
57
+ case 2:
58
+ probeFire(res->sdt_tracepoint, args[0], args[1]);
59
+ break;
60
+ case 3:
61
+ probeFire(res->sdt_tracepoint, args[0], args[1], args[2]);
62
+ break;
63
+ case 4:
64
+ probeFire(res->sdt_tracepoint, args[0], args[1], args[2], args[3]);
65
+ break;
66
+ case 5:
67
+ probeFire(res->sdt_tracepoint, args[0], args[1], args[2], args[3], args[4]);
68
+ break;
69
+ case 6:
70
+ probeFire(res->sdt_tracepoint, args[0], args[1], args[2], args[3], args[4],
71
+ args[5]);
72
+ break;
73
+ default:
74
+ probeFire(res->sdt_tracepoint);
75
+ break;
64
76
  }
65
77
 
66
78
  return Qnil;
67
79
  }
68
80
 
69
81
  VALUE
70
- tracepoint_enabled(VALUE self)
71
- {
82
+ tracepoint_enabled(VALUE self) {
72
83
  static_tracing_tracepoint_t *res = NULL;
73
- TypedData_Get_Struct(self, static_tracing_tracepoint_t, &static_tracing_tracepoint_type, res);
84
+ TypedData_Get_Struct(self, static_tracing_tracepoint_t,
85
+ &static_tracing_tracepoint_type, res);
74
86
  return probeIsEnabled(res->sdt_tracepoint) == 1 ? Qtrue : Qfalse;
75
87
  }
76
88
 
77
- static const char*
78
- check_name_arg(VALUE name)
79
- {
89
+ static const char *check_name_arg(VALUE name) {
80
90
  const char *c_name_str = NULL;
81
91
 
82
92
  if (TYPE(name) != T_SYMBOL && TYPE(name) != T_STRING) {
@@ -91,9 +101,7 @@ check_name_arg(VALUE name)
91
101
  return c_name_str;
92
102
  }
93
103
 
94
- static const char*
95
- check_provider_arg(VALUE provider)
96
- {
104
+ static const char *check_provider_arg(VALUE provider) {
97
105
  const char *c_provider_str = NULL;
98
106
 
99
107
  if (TYPE(provider) != T_SYMBOL && TYPE(provider) != T_STRING) {
@@ -108,25 +116,22 @@ check_provider_arg(VALUE provider)
108
116
  return c_provider_str;
109
117
  }
110
118
 
111
- static Tracepoint_arg_types
112
- *check_vargs(int *argc, VALUE vargs)
113
- {
114
- if(TYPE(vargs) == T_ARRAY)
115
- {
119
+ static Tracepoint_arg_types *check_vargs(int *argc, VALUE vargs) {
120
+ if (TYPE(vargs) == T_ARRAY) {
116
121
  VALUE rLength = rb_funcall(vargs, rb_intern("length"), 0, Qnil);
117
122
  *argc = NUM2INT(rLength);
118
123
 
119
- if(*argc > 6)
120
- {
121
- printf("ERROR - passed %i args, maximum 6 argument types can be passed", *argc);
124
+ if (*argc > 6) {
125
+ printf("ERROR - passed %i args, maximum 6 argument types can be passed",
126
+ *argc);
122
127
  return NULL;
123
128
  }
124
129
  int i;
125
130
  Tracepoint_arg_types *args = malloc(*argc * sizeof(Tracepoint_arg_types));
126
- for (i = 0; i < *argc; i++)
127
- {
128
- VALUE str = rb_funcall(rb_ary_entry(vargs, i), rb_intern("to_s"), 0, Qnil);
129
- const char* cStr = RSTRING_PTR(str);
131
+ for (i = 0; i < *argc; i++) {
132
+ VALUE str =
133
+ rb_funcall(rb_ary_entry(vargs, i), rb_intern("to_s"), 0, Qnil);
134
+ const char *cStr = RSTRING_PTR(str);
130
135
  if (strcmp(cStr, "Integer")) {
131
136
  args[i] = Integer;
132
137
  } else if (strcmp(cStr, "String")) {
@@ -142,37 +147,32 @@ static Tracepoint_arg_types
142
147
  }
143
148
  }
144
149
 
145
- static Tracepoint_fire_arg
146
- *check_fire_args(int *argc, VALUE vargs)
147
- {
148
- if(TYPE(vargs) == T_ARRAY)
149
- {
150
+ static Tracepoint_fire_arg *check_fire_args(int *argc, VALUE vargs) {
151
+ if (TYPE(vargs) == T_ARRAY) {
150
152
  VALUE rLength = rb_funcall(vargs, rb_intern("length"), 0, Qnil);
151
153
  *argc = NUM2INT(rLength);
152
154
 
153
- if(*argc > 6)
154
- {
155
- printf("ERROR - passed %i args, maximum 6 argument types can be passed", *argc);
155
+ if (*argc > 6) {
156
+ printf("ERROR - passed %i args, maximum 6 argument types can be passed",
157
+ *argc);
156
158
  return NULL;
157
159
  }
158
160
 
159
161
  Tracepoint_fire_arg *args = malloc(*argc * sizeof(Tracepoint_fire_arg));
160
- //printf("SIZE: %i ARGC: %i \n", sizeof(Tracepoint_fire_arg), *argc);
162
+ // printf("SIZE: %i ARGC: %i \n", sizeof(Tracepoint_fire_arg), *argc);
161
163
  int i;
162
- for (i = 0; i < *argc; i++)
163
- {
164
+ for (i = 0; i < *argc; i++) {
164
165
  VALUE val = rb_ary_entry(vargs, i);
165
- switch(TYPE(val))
166
- {
167
- case T_FIXNUM:
168
- args[i].intval = FIX2LONG(val);
169
- break;
170
- case T_STRING:
171
- args[i].strval = RSTRING_PTR(val);
172
- break;
173
- default:
174
- printf("ERROR unsupported type passed for argument %i to fire\n", i);
175
- break;
166
+ switch (TYPE(val)) {
167
+ case T_FIXNUM:
168
+ args[i].intval = FIX2LONG(val);
169
+ break;
170
+ case T_STRING:
171
+ args[i].strval = RSTRING_PTR(val);
172
+ break;
173
+ default:
174
+ printf("ERROR unsupported type passed for argument %i to fire\n", i);
175
+ break;
176
176
  }
177
177
  }
178
178
  return args;
@@ -184,43 +184,33 @@ static Tracepoint_fire_arg
184
184
 
185
185
  // Allocate a static_tracing_tracepoint_type struct for ruby memory management
186
186
  VALUE
187
- static_tracing_tracepoint_alloc(VALUE klass)
188
- {
187
+ static_tracing_tracepoint_alloc(VALUE klass) {
189
188
  static_tracing_tracepoint_t *res;
190
- VALUE obj = TypedData_Make_Struct(klass, static_tracing_tracepoint_t, &static_tracing_tracepoint_type, res);
189
+ VALUE obj = TypedData_Make_Struct(klass, static_tracing_tracepoint_t,
190
+ &static_tracing_tracepoint_type, res);
191
191
  return obj;
192
192
  }
193
193
 
194
- static inline void
195
- static_tracing_tracepoint_mark(void *ptr)
196
- {
197
- /* noop */
194
+ static inline void static_tracing_tracepoint_mark(void *ptr) { /* noop */
198
195
  }
199
196
 
200
- static inline void
201
- static_tracing_tracepoint_free(void *ptr)
202
- {
203
- static_tracing_tracepoint_t *res = (static_tracing_tracepoint_t *) ptr;
204
- //if (res->name) {
197
+ static inline void static_tracing_tracepoint_free(void *ptr) {
198
+ static_tracing_tracepoint_t *res = (static_tracing_tracepoint_t *)ptr;
199
+ // if (res->name) {
205
200
  // free(res->name);
206
201
  // res->name = NULL;
207
202
  //}
208
203
  xfree(res);
209
204
  }
210
205
 
211
- static inline size_t
212
- static_tracing_tracepoint_memsize(const void *ptr)
213
- {
206
+ static inline size_t static_tracing_tracepoint_memsize(const void *ptr) {
214
207
  return sizeof(static_tracing_provider_t);
215
208
  }
216
209
 
217
- static const rb_data_type_t
218
- static_tracing_tracepoint_type = {
219
- "static_tracing_tracepoint",
220
- {
221
- static_tracing_tracepoint_mark,
222
- static_tracing_tracepoint_free,
223
- static_tracing_tracepoint_memsize
224
- },
225
- NULL, NULL, RUBY_TYPED_FREE_IMMEDIATELY
226
- };
210
+ static const rb_data_type_t static_tracing_tracepoint_type = {
211
+ "static_tracing_tracepoint",
212
+ {static_tracing_tracepoint_mark, static_tracing_tracepoint_free,
213
+ static_tracing_tracepoint_memsize},
214
+ NULL,
215
+ NULL,
216
+ RUBY_TYPED_FREE_IMMEDIATELY};
@@ -10,7 +10,7 @@
10
10
 
11
11
  typedef union {
12
12
  unsigned long long intval;
13
- char * strval;
13
+ char *strval;
14
14
  } Tracepoint_fire_arg;
15
15
 
16
16
  typedef struct {
@@ -50,4 +50,4 @@ tracepoint_enabled(VALUE self);
50
50
  VALUE
51
51
  static_tracing_tracepoint_alloc(VALUE klass);
52
52
 
53
- #endif //STATIC_TRACING_TRACEPOINT_H
53
+ #endif // STATIC_TRACING_TRACEPOINT_H
@@ -4,8 +4,8 @@
4
4
  #include <libstapsdt.h>
5
5
 
6
6
  typedef enum TRACEPOINT_ARG_TYPES_ENUM {
7
- Integer = int64, // STAP enum type -8
8
- String = uint64, // STAP enum type 8
7
+ Integer = int64, // STAP enum type -8
8
+ String = uint64, // STAP enum type 8
9
9
  } Tracepoint_arg_types;
10
10
 
11
11
  #endif // STATIC_TRACING_TYPEs_H
@@ -11,7 +11,7 @@ require 'ruby-static-tracing/configuration'
11
11
  require 'ruby-static-tracing/tracer'
12
12
  require 'ruby-static-tracing/tracers'
13
13
 
14
- # FIXME Including StaticTracing should cause every method in a module or class to be registered
14
+ # FIXME: Including StaticTracing should cause every method in a module or class to be registered
15
15
  # Implement this by introspecting all methods on the includor, and wrapping them.
16
16
  module StaticTracing
17
17
  extend self
@@ -24,8 +24,10 @@ module StaticTracing
24
24
 
25
25
  self.logger = Logger.new(STDERR)
26
26
 
27
+ # This will print a message indicating that tracepoints are disabled on this platform
27
28
  def issue_disabled_tracepoints_warning
28
29
  return if defined?(@warning_issued)
30
+
29
31
  @warning_issued = true
30
32
  logger.info("USDT tracepoints are not presently supported supported on #{RUBY_PLATFORM} - all operations will no-op")
31
33
  end
@@ -47,7 +49,7 @@ module StaticTracing
47
49
  # with a wrapped version that has tracing enabled
48
50
  def enable!
49
51
  StaticTracing::Tracers.enable!
50
- StaticTracing::Provider.enable!
52
+ StaticTracing::Provider.enable! # FIXME individually call enable
51
53
  @enabled = true
52
54
  end
53
55
 
@@ -55,14 +57,20 @@ module StaticTracing
55
57
  # no longer wrapping them
56
58
  def disable!
57
59
  StaticTracing::Tracers.disable!
58
- StaticTracing::Provider.disable!
60
+ StaticTracing::Provider.disable! # FIXME dangerous
59
61
  @enabled = false
60
62
  end
61
63
 
64
+ # Toggles between enabling and disabling tracepoints declared through tracers
62
65
  def toggle_tracing!
63
66
  enabled? ? disable! : enable!
64
67
  end
65
68
 
69
+ # Block to configure static tracing, eg:
70
+ #
71
+ # StaticTracing.configure do |config|
72
+ # config.add_tracer(StaticTracing::Tracer::Latency)
73
+ # end
66
74
  def configure
67
75
  yield Configuration.instance
68
76
  end
@@ -2,6 +2,7 @@
2
2
 
3
3
  module StaticTracing
4
4
  class Configuration
5
+ # Modes of operation for tracers
5
6
  module Modes
6
7
  ON = 'ON'
7
8
  OFF = 'OFF'
@@ -20,34 +21,42 @@ module StaticTracing
20
21
 
21
22
  attr_reader :mode, :signal
22
23
 
24
+ # A new configuration instance
23
25
  def initialize
24
26
  @mode = Modes::SIGNAL
25
27
  @signal = Modes::SIGNALS::SIGPROF
26
28
  enable_trap
27
29
  end
28
30
 
31
+ # Sets the mode [ON, OFF, SIGNAL]
32
+ # Default is SIGNAL
29
33
  def mode=(new_mode)
30
34
  handle_old_mode
31
35
  @mode = new_mode
32
36
  handle_new_mode
33
37
  end
34
38
 
39
+ # Sets the SIGNAL to listen to,
40
+ # Default is SIGPROF
35
41
  def signal=(new_signal)
36
42
  disable_trap
37
43
  @signal = new_signal
38
44
  enable_trap
39
45
  end
40
46
 
47
+ # Adds a new tracer globally
41
48
  def add_tracer(tracer)
42
49
  Tracers.add(tracer)
43
50
  end
44
51
 
45
52
  private
46
53
 
54
+ # Clean up trap handlers if mode changed to not need it
47
55
  def handle_old_mode
48
56
  disable_trap if @mode == Modes::SIGNAL
49
57
  end
50
58
 
59
+ # Enable trap handlers if needed
51
60
  def handle_new_mode
52
61
  if @mode == Modes::SIGNAL
53
62
  enable_trap
@@ -58,10 +67,12 @@ module StaticTracing
58
67
  end
59
68
  end
60
69
 
70
+ # Disables trap handler
61
71
  def disable_trap
62
72
  Signal.trap(@signal, 'DEFAULT')
63
73
  end
64
74
 
75
+ # Enables a new trap handler
65
76
  def enable_trap
66
77
  Signal.trap(@signal) { StaticTracing.toggle_tracing! }
67
78
  end