truex-skylight 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (122) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +277 -0
  3. data/CLA.md +9 -0
  4. data/CONTRIBUTING.md +1 -0
  5. data/LICENSE.md +79 -0
  6. data/README.md +4 -0
  7. data/bin/skylight +3 -0
  8. data/ext/extconf.rb +186 -0
  9. data/ext/libskylight.yml +6 -0
  10. data/ext/skylight_memprof.c +115 -0
  11. data/ext/skylight_native.c +416 -0
  12. data/ext/skylight_native.h +20 -0
  13. data/lib/skylight.rb +2 -0
  14. data/lib/skylight/api.rb +79 -0
  15. data/lib/skylight/cli.rb +146 -0
  16. data/lib/skylight/compat.rb +47 -0
  17. data/lib/skylight/config.rb +498 -0
  18. data/lib/skylight/core.rb +122 -0
  19. data/lib/skylight/data/cacert.pem +3894 -0
  20. data/lib/skylight/formatters/http.rb +17 -0
  21. data/lib/skylight/gc.rb +107 -0
  22. data/lib/skylight/helpers.rb +137 -0
  23. data/lib/skylight/instrumenter.rb +290 -0
  24. data/lib/skylight/middleware.rb +75 -0
  25. data/lib/skylight/native.rb +69 -0
  26. data/lib/skylight/normalizers.rb +133 -0
  27. data/lib/skylight/normalizers/action_controller/process_action.rb +35 -0
  28. data/lib/skylight/normalizers/action_controller/send_file.rb +76 -0
  29. data/lib/skylight/normalizers/action_view/render_collection.rb +18 -0
  30. data/lib/skylight/normalizers/action_view/render_partial.rb +18 -0
  31. data/lib/skylight/normalizers/action_view/render_template.rb +18 -0
  32. data/lib/skylight/normalizers/active_record/sql.rb +79 -0
  33. data/lib/skylight/normalizers/active_support/cache.rb +50 -0
  34. data/lib/skylight/normalizers/active_support/cache_clear.rb +16 -0
  35. data/lib/skylight/normalizers/active_support/cache_decrement.rb +16 -0
  36. data/lib/skylight/normalizers/active_support/cache_delete.rb +16 -0
  37. data/lib/skylight/normalizers/active_support/cache_exist.rb +16 -0
  38. data/lib/skylight/normalizers/active_support/cache_fetch_hit.rb +16 -0
  39. data/lib/skylight/normalizers/active_support/cache_generate.rb +16 -0
  40. data/lib/skylight/normalizers/active_support/cache_increment.rb +16 -0
  41. data/lib/skylight/normalizers/active_support/cache_read.rb +16 -0
  42. data/lib/skylight/normalizers/active_support/cache_read_multi.rb +16 -0
  43. data/lib/skylight/normalizers/active_support/cache_write.rb +16 -0
  44. data/lib/skylight/normalizers/default.rb +21 -0
  45. data/lib/skylight/normalizers/moped/query.rb +141 -0
  46. data/lib/skylight/probes.rb +91 -0
  47. data/lib/skylight/probes/excon.rb +25 -0
  48. data/lib/skylight/probes/excon/middleware.rb +65 -0
  49. data/lib/skylight/probes/net_http.rb +44 -0
  50. data/lib/skylight/probes/redis.rb +30 -0
  51. data/lib/skylight/probes/sequel.rb +30 -0
  52. data/lib/skylight/probes/sinatra.rb +74 -0
  53. data/lib/skylight/probes/tilt.rb +27 -0
  54. data/lib/skylight/railtie.rb +122 -0
  55. data/lib/skylight/sinatra.rb +4 -0
  56. data/lib/skylight/subscriber.rb +92 -0
  57. data/lib/skylight/trace.rb +191 -0
  58. data/lib/skylight/util.rb +16 -0
  59. data/lib/skylight/util/allocation_free.rb +17 -0
  60. data/lib/skylight/util/clock.rb +53 -0
  61. data/lib/skylight/util/gzip.rb +15 -0
  62. data/lib/skylight/util/hostname.rb +17 -0
  63. data/lib/skylight/util/http.rb +218 -0
  64. data/lib/skylight/util/inflector.rb +110 -0
  65. data/lib/skylight/util/logging.rb +87 -0
  66. data/lib/skylight/util/multi_io.rb +21 -0
  67. data/lib/skylight/util/native_ext_fetcher.rb +205 -0
  68. data/lib/skylight/util/platform.rb +67 -0
  69. data/lib/skylight/util/ssl.rb +50 -0
  70. data/lib/skylight/vendor/active_support/notifications.rb +207 -0
  71. data/lib/skylight/vendor/active_support/notifications/fanout.rb +159 -0
  72. data/lib/skylight/vendor/active_support/notifications/instrumenter.rb +72 -0
  73. data/lib/skylight/vendor/active_support/per_thread_registry.rb +52 -0
  74. data/lib/skylight/vendor/cli/highline.rb +1034 -0
  75. data/lib/skylight/vendor/cli/highline/color_scheme.rb +134 -0
  76. data/lib/skylight/vendor/cli/highline/compatibility.rb +16 -0
  77. data/lib/skylight/vendor/cli/highline/import.rb +41 -0
  78. data/lib/skylight/vendor/cli/highline/menu.rb +381 -0
  79. data/lib/skylight/vendor/cli/highline/question.rb +481 -0
  80. data/lib/skylight/vendor/cli/highline/simulate.rb +48 -0
  81. data/lib/skylight/vendor/cli/highline/string_extensions.rb +111 -0
  82. data/lib/skylight/vendor/cli/highline/style.rb +181 -0
  83. data/lib/skylight/vendor/cli/highline/system_extensions.rb +242 -0
  84. data/lib/skylight/vendor/cli/thor.rb +473 -0
  85. data/lib/skylight/vendor/cli/thor/actions.rb +318 -0
  86. data/lib/skylight/vendor/cli/thor/actions/create_file.rb +105 -0
  87. data/lib/skylight/vendor/cli/thor/actions/create_link.rb +60 -0
  88. data/lib/skylight/vendor/cli/thor/actions/directory.rb +119 -0
  89. data/lib/skylight/vendor/cli/thor/actions/empty_directory.rb +137 -0
  90. data/lib/skylight/vendor/cli/thor/actions/file_manipulation.rb +314 -0
  91. data/lib/skylight/vendor/cli/thor/actions/inject_into_file.rb +109 -0
  92. data/lib/skylight/vendor/cli/thor/base.rb +652 -0
  93. data/lib/skylight/vendor/cli/thor/command.rb +136 -0
  94. data/lib/skylight/vendor/cli/thor/core_ext/hash_with_indifferent_access.rb +80 -0
  95. data/lib/skylight/vendor/cli/thor/core_ext/io_binary_read.rb +12 -0
  96. data/lib/skylight/vendor/cli/thor/core_ext/ordered_hash.rb +100 -0
  97. data/lib/skylight/vendor/cli/thor/error.rb +28 -0
  98. data/lib/skylight/vendor/cli/thor/group.rb +282 -0
  99. data/lib/skylight/vendor/cli/thor/invocation.rb +172 -0
  100. data/lib/skylight/vendor/cli/thor/parser.rb +4 -0
  101. data/lib/skylight/vendor/cli/thor/parser/argument.rb +74 -0
  102. data/lib/skylight/vendor/cli/thor/parser/arguments.rb +171 -0
  103. data/lib/skylight/vendor/cli/thor/parser/option.rb +121 -0
  104. data/lib/skylight/vendor/cli/thor/parser/options.rb +218 -0
  105. data/lib/skylight/vendor/cli/thor/rake_compat.rb +72 -0
  106. data/lib/skylight/vendor/cli/thor/runner.rb +322 -0
  107. data/lib/skylight/vendor/cli/thor/shell.rb +88 -0
  108. data/lib/skylight/vendor/cli/thor/shell/basic.rb +393 -0
  109. data/lib/skylight/vendor/cli/thor/shell/color.rb +148 -0
  110. data/lib/skylight/vendor/cli/thor/shell/html.rb +127 -0
  111. data/lib/skylight/vendor/cli/thor/util.rb +270 -0
  112. data/lib/skylight/vendor/cli/thor/version.rb +3 -0
  113. data/lib/skylight/vendor/thread_safe.rb +126 -0
  114. data/lib/skylight/vendor/thread_safe/non_concurrent_cache_backend.rb +133 -0
  115. data/lib/skylight/vendor/thread_safe/synchronized_cache_backend.rb +76 -0
  116. data/lib/skylight/version.rb +4 -0
  117. data/lib/skylight/vm/gc.rb +70 -0
  118. data/lib/sql_lexer.rb +6 -0
  119. data/lib/sql_lexer/lexer.rb +579 -0
  120. data/lib/sql_lexer/string_scanner.rb +11 -0
  121. data/lib/sql_lexer/version.rb +3 -0
  122. metadata +179 -0
@@ -0,0 +1,6 @@
1
+ ---
2
+ version: "0.5.0-fbaa3ed"
3
+ checksums:
4
+ x86-linux: "926a77991c02dfb399de5bc08a39d989803f63eb4992183285e9e663df6e3c7b"
5
+ x86_64-linux: "d44821e2955758d84db1f50b2c2bd0025252f67ab3d42b57e241a8a3f492dbbc"
6
+ x86_64-darwin: "35ac0581f439ffb66a0563f74bce957cd6ec718143a21af9f82fb5e2c43bb80e"
@@ -0,0 +1,115 @@
1
+ #include <ruby.h>
2
+ #include <skylight_native.h>
3
+
4
+ #ifdef RUBY_INTERNAL_EVENT_NEWOBJ
5
+
6
+ typedef struct {
7
+ uint64_t allocations;
8
+ } sky_allocations_t;
9
+
10
+ #ifdef HAVE_FAST_TLS
11
+
12
+ // Use the __thread directive
13
+ static __thread sky_allocations_t sky_allocations;
14
+
15
+ static inline sky_allocations_t* get_allocations() {
16
+ return &sky_allocations;
17
+ }
18
+
19
+ #else
20
+
21
+ #include <pthread.h>
22
+
23
+ // Use pthread thread locals
24
+ static pthread_key_t ALLOCATIONS_KEY;
25
+
26
+ static pthread_once_t KEY_INIT_ONCE = PTHREAD_ONCE_INIT;
27
+
28
+ static void init_allocations_key() {
29
+ pthread_key_create(&ALLOCATIONS_KEY, free);
30
+ }
31
+
32
+ static sky_allocations_t* get_allocations() {
33
+ sky_allocations_t* ret;
34
+
35
+ // Initialize the TLS key
36
+ pthread_once(&KEY_INIT_ONCE, init_allocations_key);
37
+
38
+ ret = (sky_allocations_t*) pthread_getspecific(ALLOCATIONS_KEY);
39
+
40
+ if (ret == 0) {
41
+ ret = (sky_allocations_t*) malloc(sizeof(sky_allocations_t));
42
+ pthread_setspecific(ALLOCATIONS_KEY, (void*) ret);
43
+ }
44
+
45
+ return ret;
46
+ }
47
+
48
+ #endif
49
+
50
+ static void sky_increment_allocation(rb_event_flag_t flag, VALUE data, VALUE self, ID mid, VALUE klass) {
51
+ UNUSED(flag);
52
+ UNUSED(data);
53
+ UNUSED(self);
54
+ UNUSED(mid);
55
+ UNUSED(klass);
56
+
57
+ get_allocations()->allocations++;
58
+ }
59
+
60
+ void sky_activate_memprof(void) {
61
+ rb_add_event_hook(sky_increment_allocation, RUBY_INTERNAL_EVENT_NEWOBJ, Qnil);
62
+ }
63
+
64
+ void sky_deactivate_memprof(void) {
65
+ rb_remove_event_hook(sky_increment_allocation);
66
+ }
67
+
68
+ uint64_t sky_allocation_count(void) {
69
+ return get_allocations()->allocations;
70
+ }
71
+
72
+ uint64_t sky_consume_allocations() {
73
+ uint64_t ret = get_allocations()->allocations;
74
+ sky_clear_allocation_count();
75
+ return ret;
76
+ }
77
+
78
+ void sky_clear_allocation_count(void) {
79
+ get_allocations()->allocations = 0;
80
+ }
81
+
82
+ int sky_have_memprof(void) {
83
+ return 1;
84
+ }
85
+
86
+ #else
87
+ /*
88
+ *
89
+ * ===== No memory profiling ======
90
+ *
91
+ */
92
+
93
+ void sky_activate_memprof(void) {
94
+ }
95
+
96
+ void sky_deactivate_memprof(void) {
97
+ }
98
+
99
+ uint64_t sky_allocation_count(void) {
100
+ return 0;
101
+ }
102
+
103
+ uint64_t sky_consume_allocations() {
104
+ return 0;
105
+ }
106
+
107
+ void sky_clear_allocation_count(void) {
108
+ }
109
+
110
+ int sky_have_memprof(void) {
111
+ return 0;
112
+ }
113
+
114
+
115
+ #endif
@@ -0,0 +1,416 @@
1
+ #include <dlfcn.h>
2
+ #include <ruby.h>
3
+ #include <skylight_dlopen.h>
4
+ #include <skylight_native.h>
5
+
6
+ #ifdef HAVE_RUBY_ENCODING_H
7
+ #include <ruby/encoding.h>
8
+ #endif
9
+
10
+ #define TO_S(VAL) \
11
+ RSTRING_PTR(rb_funcall(VAL, rb_intern("to_s"), 0))
12
+
13
+ #define CHECK_TYPE(VAL, T) \
14
+ do { \
15
+ if (TYPE(VAL) != T) { \
16
+ rb_raise(rb_eArgError, "expected " #VAL " to be " #T " but was '%s' (%s [%i])", \
17
+ TO_S(VAL), rb_obj_classname(VAL), TYPE(VAL)); \
18
+ return Qnil; \
19
+ } \
20
+ } while(0)
21
+
22
+ #define CHECK_NUMERIC(VAL) \
23
+ do { \
24
+ if (TYPE(VAL) != T_BIGNUM && \
25
+ TYPE(VAL) != T_FIXNUM) { \
26
+ rb_raise(rb_eArgError, "expected " #VAL " to be numeric but was '%s' (%s [%i])", \
27
+ TO_S(VAL), rb_obj_classname(VAL), TYPE(VAL)); \
28
+ return Qnil; \
29
+ } \
30
+ } while(0) \
31
+
32
+ static inline VALUE
33
+ BUF2STR(sky_buf_t buf) {
34
+ VALUE str = rb_str_new(buf.data, buf.len);
35
+ rb_enc_associate(str, rb_utf8_encoding());
36
+ return str;
37
+ }
38
+
39
+ static inline sky_buf_t
40
+ STR2BUF(VALUE str) {
41
+ return (sky_buf_t) {
42
+ .data = RSTRING_PTR(str),
43
+ .len = RSTRING_LEN(str),
44
+ };
45
+ }
46
+
47
+ #define CHECK_FFI(success, message) \
48
+ do { \
49
+ if ((success) < 0 ) { \
50
+ rb_raise(rb_eRuntimeError, message); \
51
+ return Qnil; \
52
+ } \
53
+ } while(0)
54
+
55
+ #define My_Struct(name, Type, msg) \
56
+ Get_Struct(name, self, Type, msg); \
57
+
58
+ #define Transfer_My_Struct(name, Type, msg) \
59
+ My_Struct(name, Type, msg); \
60
+ DATA_PTR(self) = NULL; \
61
+
62
+ #define Transfer_Struct(name, obj, Type, msg) \
63
+ Get_Struct(name, obj, Type, msg); \
64
+ DATA_PTR(obj) = NULL; \
65
+
66
+ #define Get_Struct(name, obj, Type, msg) \
67
+ Data_Get_Struct(obj, Type, name); \
68
+ if (name == NULL) { \
69
+ rb_raise(rb_eRuntimeError, "%s", msg); \
70
+ }
71
+
72
+ /**
73
+ * Ruby GVL helpers
74
+ */
75
+
76
+ #if defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL) && \
77
+ defined(HAVE_RUBY_THREAD_H)
78
+
79
+ // Ruby 2.0+
80
+ #include <ruby/thread.h>
81
+ typedef void* (*blocking_fn_t)(void*);
82
+ #define WITHOUT_GVL(fn, a) \
83
+ rb_thread_call_without_gvl((blocking_fn_t)(fn), (a), 0, 0)
84
+
85
+ // Ruby 1.9
86
+ #elif defined(HAVE_RB_THREAD_BLOCKING_REGION)
87
+
88
+ typedef VALUE (*blocking_fn_t)(void*);
89
+ #define WITHOUT_GVL(fn, a) \
90
+ rb_thread_blocking_region((blocking_fn_t)(fn), (a), 0, 0)
91
+
92
+
93
+ #endif
94
+
95
+
96
+ /**
97
+ * Ruby types defined here
98
+ */
99
+
100
+ VALUE rb_mSkylight;
101
+ VALUE rb_mUtil;
102
+ VALUE rb_cClock;
103
+ VALUE rb_cTrace;
104
+ VALUE rb_cInstrumenter;
105
+
106
+ static const char* no_instrumenter_msg =
107
+ "Instrumenter not currently running";
108
+
109
+ static const char* consumed_trace_msg =
110
+ "Trace objects cannot be used once it has been submitted to the instrumenter";
111
+
112
+ static VALUE
113
+ load_libskylight(VALUE klass, VALUE path) {
114
+ int res;
115
+
116
+ UNUSED(klass);
117
+ CHECK_TYPE(path, T_STRING);
118
+
119
+ // Already loaded
120
+ if (sky_hrtime != 0) {
121
+ return Qnil;
122
+ }
123
+
124
+ res = sky_load_libskylight(StringValueCStr(path));
125
+
126
+ if (res < 0) {
127
+ rb_raise(rb_eRuntimeError, "[SKYLIGHT] dlerror; msg=%s", dlerror());
128
+ return Qnil;
129
+ }
130
+
131
+ return Qnil;
132
+ }
133
+
134
+ /*
135
+ *
136
+ * class Skylight::Util::Clock
137
+ *
138
+ */
139
+
140
+ static VALUE
141
+ clock_high_res_time(VALUE self) {
142
+ UNUSED(self);
143
+ return ULL2NUM(sky_hrtime());
144
+ }
145
+
146
+ /*
147
+ *
148
+ * class Skylight::Instrumenter
149
+ *
150
+ */
151
+
152
+ static VALUE
153
+ instrumenter_new(VALUE klass, VALUE rb_env) {
154
+ sky_instrumenter_t* instrumenter;
155
+ sky_buf_t env[256];
156
+ int i, envc;
157
+
158
+ UNUSED(klass);
159
+ CHECK_TYPE(rb_env, T_ARRAY);
160
+
161
+ if (RARRAY_LEN(rb_env) >= 256) {
162
+ rb_raise(rb_eArgError, "environment array too long");
163
+ return Qnil;
164
+ }
165
+
166
+ envc = (int) RARRAY_LEN(rb_env);
167
+
168
+ for (i = 0; i < envc; ++i) {
169
+ VALUE val = rb_ary_entry(rb_env, i);
170
+
171
+ // Make sure it is a string
172
+ CHECK_TYPE(val, T_STRING);
173
+
174
+ env[i] = STR2BUF(val);
175
+ }
176
+
177
+ CHECK_FFI(
178
+ sky_instrumenter_new(env, envc, &instrumenter),
179
+ "failed to initialize instrumenter");
180
+
181
+ return Data_Wrap_Struct(rb_cInstrumenter, NULL, sky_instrumenter_free, instrumenter);
182
+ }
183
+
184
+ static void*
185
+ instrumenter_start_nogvl(sky_instrumenter_t* instrumenter) {
186
+ /*
187
+ * Cannot use CHECK_FFI in here
188
+ */
189
+
190
+ if (sky_instrumenter_start(instrumenter) == 0) {
191
+ sky_activate_memprof();
192
+
193
+ return (void*) Qtrue;
194
+ }
195
+ else {
196
+ return (void*) Qfalse;
197
+ }
198
+ }
199
+
200
+ static VALUE
201
+ instrumenter_start(VALUE self) {
202
+ sky_instrumenter_t* instrumenter;
203
+
204
+ My_Struct(instrumenter, sky_instrumenter_t, no_instrumenter_msg);
205
+
206
+ return (VALUE) WITHOUT_GVL(instrumenter_start_nogvl, instrumenter);
207
+ }
208
+
209
+ static VALUE
210
+ instrumenter_stop(VALUE self) {
211
+ sky_instrumenter_t* instrumenter;
212
+
213
+ My_Struct(instrumenter, sky_instrumenter_t, no_instrumenter_msg);
214
+
215
+ CHECK_FFI(
216
+ sky_instrumenter_stop(instrumenter),
217
+ "native Instrumenter#stop failed");
218
+
219
+ sky_deactivate_memprof();
220
+
221
+ return Qnil;
222
+ }
223
+
224
+ static VALUE
225
+ instrumenter_submit_trace(VALUE self, VALUE rb_trace) {
226
+ sky_instrumenter_t* instrumenter;
227
+ sky_trace_t* trace;
228
+
229
+ My_Struct(instrumenter, sky_instrumenter_t, no_instrumenter_msg);
230
+ Transfer_Struct(trace, rb_trace, sky_trace_t, consumed_trace_msg);
231
+
232
+ CHECK_FFI(
233
+ sky_instrumenter_submit_trace(instrumenter, trace),
234
+ "native Instrumenter#submit_trace failed");
235
+
236
+ return Qnil;
237
+ }
238
+
239
+ /*
240
+ *
241
+ * class Skylight::Trace
242
+ *
243
+ */
244
+
245
+ static VALUE
246
+ trace_new(VALUE klass, VALUE start, VALUE uuid, VALUE endpoint) {
247
+ sky_trace_t* trace;
248
+
249
+ UNUSED(klass);
250
+ CHECK_NUMERIC(start);
251
+ CHECK_TYPE(uuid, T_STRING);
252
+ CHECK_TYPE(endpoint, T_STRING);
253
+
254
+ CHECK_FFI(
255
+ sky_trace_new(NUM2ULL(start), STR2BUF(uuid), STR2BUF(endpoint), &trace),
256
+ "native Trace#new failed");
257
+
258
+ sky_clear_allocation_count();
259
+
260
+ return Data_Wrap_Struct(rb_cTrace, NULL, sky_trace_free, trace);
261
+ }
262
+
263
+ static VALUE
264
+ trace_get_started_at(VALUE self) {
265
+ uint64_t start;
266
+ sky_trace_t* trace;
267
+
268
+ My_Struct(trace, sky_trace_t, consumed_trace_msg);
269
+
270
+ CHECK_FFI(
271
+ sky_trace_start(trace, &start),
272
+ "native Trace#started_at failed");
273
+
274
+ return ULL2NUM(start);
275
+ }
276
+
277
+ static VALUE
278
+ trace_get_endpoint(VALUE self) {
279
+ sky_trace_t* trace;
280
+ sky_buf_t endpoint;
281
+
282
+ My_Struct(trace, sky_trace_t, consumed_trace_msg);
283
+
284
+ CHECK_FFI(
285
+ sky_trace_endpoint(trace, &endpoint),
286
+ "native Trace#endpoint failed");
287
+
288
+ return BUF2STR(endpoint);
289
+ }
290
+
291
+ static VALUE
292
+ trace_set_endpoint(VALUE self, VALUE endpoint) {
293
+ sky_trace_t* trace;
294
+
295
+ CHECK_TYPE(endpoint, T_STRING);
296
+ My_Struct(trace, sky_trace_t, consumed_trace_msg);
297
+
298
+ CHECK_FFI(
299
+ sky_trace_set_endpoint(trace, STR2BUF(endpoint)),
300
+ "native Trace#set_endpoint failed");
301
+
302
+ return Qnil;
303
+ }
304
+
305
+ static VALUE
306
+ trace_get_uuid(VALUE self) {
307
+ sky_trace_t* trace;
308
+ sky_buf_t uuid;
309
+
310
+ My_Struct(trace, sky_trace_t, consumed_trace_msg);
311
+
312
+ CHECK_FFI(
313
+ sky_trace_uuid(trace, &uuid),
314
+ "native Trace#uuid failed");
315
+
316
+ return BUF2STR(uuid);
317
+ }
318
+
319
+ static VALUE
320
+ trace_start_span(VALUE self, VALUE time, VALUE category) {
321
+ sky_trace_t* trace;
322
+ uint32_t span;
323
+
324
+ My_Struct(trace, sky_trace_t, consumed_trace_msg);
325
+
326
+ CHECK_NUMERIC(time);
327
+ CHECK_TYPE(category, T_STRING);
328
+
329
+ CHECK_FFI(
330
+ sky_trace_instrument(trace, NUM2ULL(time), STR2BUF(category), &span),
331
+ "native Trace#start_span failed");
332
+
333
+ if (sky_have_memprof()) {
334
+ sky_trace_span_add_uint_annotation(trace, span, 2, sky_consume_allocations());
335
+ }
336
+
337
+ return UINT2NUM(span);
338
+ }
339
+
340
+ static VALUE
341
+ trace_stop_span(VALUE self, VALUE span, VALUE time) {
342
+ sky_trace_t* trace;
343
+
344
+ My_Struct(trace, sky_trace_t, consumed_trace_msg);
345
+
346
+ CHECK_NUMERIC(time);
347
+ CHECK_TYPE(span, T_FIXNUM);
348
+
349
+ if (sky_have_memprof()) {
350
+ sky_trace_span_add_uint_annotation(trace, FIX2UINT(span), 1, sky_consume_allocations());
351
+ }
352
+
353
+ CHECK_FFI(
354
+ sky_trace_span_done(trace, FIX2UINT(span), NUM2ULL(time)),
355
+ "native Trace#stop_span failed");
356
+
357
+ return Qnil;
358
+ }
359
+
360
+ static VALUE
361
+ trace_span_set_title(VALUE self, VALUE span, VALUE title) {
362
+ sky_trace_t* trace;
363
+
364
+ My_Struct(trace, sky_trace_t, consumed_trace_msg);
365
+
366
+ CHECK_TYPE(span, T_FIXNUM);
367
+ CHECK_TYPE(title, T_STRING);
368
+
369
+ CHECK_FFI(
370
+ sky_trace_span_set_title(trace, FIX2UINT(span), STR2BUF(title)),
371
+ "native Trace#span_set_title failed");
372
+
373
+ return Qnil;
374
+ }
375
+
376
+ static VALUE
377
+ trace_span_set_description(VALUE self, VALUE span, VALUE desc) {
378
+ sky_trace_t* trace;
379
+
380
+ My_Struct(trace, sky_trace_t, consumed_trace_msg);
381
+
382
+ CHECK_TYPE(span, T_FIXNUM);
383
+ CHECK_TYPE(desc, T_STRING);
384
+
385
+ CHECK_FFI(
386
+ sky_trace_span_set_desc(trace, FIX2UINT(span), STR2BUF(desc)),
387
+ "native Trace#span_set_description failed");
388
+
389
+ return Qnil;
390
+ }
391
+
392
+ void Init_skylight_native() {
393
+ rb_mSkylight = rb_define_module("Skylight");
394
+ rb_define_singleton_method(rb_mSkylight, "load_libskylight", load_libskylight, 1);
395
+
396
+ rb_mUtil = rb_define_module_under(rb_mSkylight, "Util");
397
+ rb_cClock = rb_define_class_under(rb_mUtil, "Clock", rb_cObject);
398
+ rb_define_method(rb_cClock, "native_hrtime", clock_high_res_time, 0);
399
+
400
+ rb_cTrace = rb_define_class_under(rb_mSkylight, "Trace", rb_cObject);
401
+ rb_define_singleton_method(rb_cTrace, "native_new", trace_new, 3);
402
+ rb_define_method(rb_cTrace, "native_get_started_at", trace_get_started_at, 0);
403
+ rb_define_method(rb_cTrace, "native_get_endpoint", trace_get_endpoint, 0);
404
+ rb_define_method(rb_cTrace, "native_set_endpoint", trace_set_endpoint, 1);
405
+ rb_define_method(rb_cTrace, "native_get_uuid", trace_get_uuid, 0);
406
+ rb_define_method(rb_cTrace, "native_start_span", trace_start_span, 2);
407
+ rb_define_method(rb_cTrace, "native_stop_span", trace_stop_span, 2);
408
+ rb_define_method(rb_cTrace, "native_span_set_title", trace_span_set_title, 2);
409
+ rb_define_method(rb_cTrace, "native_span_set_description", trace_span_set_description, 2);
410
+
411
+ rb_cInstrumenter = rb_define_class_under(rb_mSkylight, "Instrumenter", rb_cObject);
412
+ rb_define_singleton_method(rb_cInstrumenter, "native_new", instrumenter_new, 1);
413
+ rb_define_method(rb_cInstrumenter, "native_start", instrumenter_start, 0);
414
+ rb_define_method(rb_cInstrumenter, "native_stop", instrumenter_stop, 0);
415
+ rb_define_method(rb_cInstrumenter, "native_submit_trace", instrumenter_submit_trace, 1);
416
+ }