vivarium 0.3.2 → 0.4.0
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.
- checksums.yaml +4 -4
- data/examples/drop_demo.rb +7 -9
- data/lib/vivarium/correlator.rb +1 -19
- data/lib/vivarium/tree_renderer.rb +28 -49
- data/lib/vivarium/version.rb +1 -1
- data/lib/vivarium.rb +55 -41
- metadata +3 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 6549be32807adc904ffe18fbefc055600cf14c85c68b106a3abfd7dce354e8b1
|
|
4
|
+
data.tar.gz: 1f9c961424d4712b2c43ad3df8d81ee679ea2190acaa8ea24e78a4f88b92f452
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: ebe88587a6328a37703899da2f0c8275f9321d7ea34e1af9806dccfaf929a6ee45bce68378356aeb2171708936b74ebb33545ada8a7eace2774aa60783b31b24
|
|
7
|
+
data.tar.gz: f707b190642345628ddf613038942a87cd95585877b45a264e13ffb1c243da0b7576712d6b5e5eb65e336dab06ff95a01f329b383bdb0007aec879629c30d2eb
|
data/examples/drop_demo.rb
CHANGED
|
@@ -14,16 +14,15 @@ require "vivarium"
|
|
|
14
14
|
require "vivarium/correlator"
|
|
15
15
|
require "vivarium/tree_renderer"
|
|
16
16
|
require "vivarium/display_filter"
|
|
17
|
-
require "vivarium_usdt"
|
|
18
17
|
|
|
19
|
-
t0
|
|
20
|
-
pid
|
|
21
|
-
tid
|
|
22
|
-
method_id = 0x0001_0001
|
|
18
|
+
t0 = 1_000_000_000 # base ktime_ns
|
|
19
|
+
pid = Process.pid
|
|
20
|
+
tid = Process.pid
|
|
23
21
|
|
|
24
|
-
# span_start payload:
|
|
25
|
-
span_start_payload =
|
|
26
|
-
|
|
22
|
+
# span_start payload: method_name (128B) + file_name (120B) + lineno (8B)
|
|
23
|
+
span_start_payload = "MyClass#my_method".ljust(Vivarium::SPAN_METHOD_SIZE, "\x00") +
|
|
24
|
+
"drop_demo.rb".ljust(Vivarium::SPAN_FILE_SIZE, "\x00") +
|
|
25
|
+
[10].pack("q<")
|
|
27
26
|
|
|
28
27
|
events = [
|
|
29
28
|
Vivarium::Correlator::RawEvent.new(
|
|
@@ -67,7 +66,6 @@ events = [
|
|
|
67
66
|
|
|
68
67
|
Vivarium::TreeRenderer.new(
|
|
69
68
|
events: events,
|
|
70
|
-
method_table: { method_id => "MyClass#my_method" },
|
|
71
69
|
observer_pid: pid,
|
|
72
70
|
main_tid: tid,
|
|
73
71
|
session_start_iso: "2026-06-02T00:00:00.000Z",
|
data/lib/vivarium/correlator.rb
CHANGED
|
@@ -23,17 +23,15 @@ module Vivarium
|
|
|
23
23
|
|
|
24
24
|
POLL_TIMEOUT_MS = 200
|
|
25
25
|
|
|
26
|
-
def initialize(pin_dir:, observer_pid:, main_tid:,
|
|
26
|
+
def initialize(pin_dir:, observer_pid:, main_tid:, filter: nil, dest: $stdout)
|
|
27
27
|
@pin_dir = pin_dir
|
|
28
28
|
@observer_pid = observer_pid
|
|
29
29
|
@main_tid = main_tid
|
|
30
|
-
@method_id_queue = method_id_queue
|
|
31
30
|
@filter = filter
|
|
32
31
|
@dest = dest
|
|
33
32
|
|
|
34
33
|
@events = []
|
|
35
34
|
@events_mutex = Mutex.new
|
|
36
|
-
@method_table = {}
|
|
37
35
|
@stop_flag = false
|
|
38
36
|
@started = false
|
|
39
37
|
|
|
@@ -66,15 +64,12 @@ module Vivarium
|
|
|
66
64
|
@session_stop_ktime = Vivarium.monotonic_ktime_ns
|
|
67
65
|
|
|
68
66
|
3.times { safe_poll(50) }
|
|
69
|
-
drain_method_id_queue
|
|
70
67
|
|
|
71
68
|
events_snapshot = @events_mutex.synchronize { @events.dup }
|
|
72
|
-
method_table_snapshot = @method_table.dup
|
|
73
69
|
@stopped = true
|
|
74
70
|
|
|
75
71
|
TreeRenderer.new(
|
|
76
72
|
events: events_snapshot,
|
|
77
|
-
method_table: method_table_snapshot,
|
|
78
73
|
observer_pid: @observer_pid,
|
|
79
74
|
main_tid: @main_tid,
|
|
80
75
|
session_start_iso: @session_start_iso,
|
|
@@ -91,7 +86,6 @@ module Vivarium
|
|
|
91
86
|
def run
|
|
92
87
|
until @stop_flag
|
|
93
88
|
safe_poll(POLL_TIMEOUT_MS)
|
|
94
|
-
drain_method_id_queue
|
|
95
89
|
end
|
|
96
90
|
end
|
|
97
91
|
|
|
@@ -126,17 +120,5 @@ module Vivarium
|
|
|
126
120
|
warn "[vivarium correlator] capture error: #{e.class}: #{e.message}"
|
|
127
121
|
end
|
|
128
122
|
|
|
129
|
-
def drain_method_id_queue
|
|
130
|
-
loop do
|
|
131
|
-
msg = begin
|
|
132
|
-
@method_id_queue.pop(true)
|
|
133
|
-
rescue ThreadError
|
|
134
|
-
return
|
|
135
|
-
end
|
|
136
|
-
|
|
137
|
-
method_id, signature = msg
|
|
138
|
-
@method_table[method_id] = signature
|
|
139
|
-
end
|
|
140
|
-
end
|
|
141
123
|
end
|
|
142
124
|
end
|
|
@@ -28,7 +28,7 @@ module Vivarium
|
|
|
28
28
|
UNRESOLVED_METHOD_PREFIX = "<method_id="
|
|
29
29
|
|
|
30
30
|
Span = Struct.new(
|
|
31
|
-
:tid, :
|
|
31
|
+
:tid, :method_name, :file_name, :lineno, :start_ktime, :stop_ktime, :exit_kind,
|
|
32
32
|
:events, :descendant_pids, :synthetic, :raised,
|
|
33
33
|
keyword_init: true
|
|
34
34
|
) do
|
|
@@ -52,11 +52,10 @@ module Vivarium
|
|
|
52
52
|
EventNode = Struct.new(:kind, :name, :target, :offset_ns, :child_proc, keyword_init: true)
|
|
53
53
|
ProcNode = Struct.new(:pid, :comm, :parent_pid, :children, keyword_init: true)
|
|
54
54
|
|
|
55
|
-
def initialize(events:,
|
|
55
|
+
def initialize(events:, observer_pid:, main_tid:,
|
|
56
56
|
session_start_iso:, session_start_ktime:,
|
|
57
57
|
session_stop_iso:, session_stop_ktime:, filter: nil, dest:)
|
|
58
58
|
@events = events
|
|
59
|
-
@method_table = method_table
|
|
60
59
|
@observer_pid = observer_pid
|
|
61
60
|
@main_tid = main_tid
|
|
62
61
|
@session_start_iso = session_start_iso
|
|
@@ -68,7 +67,6 @@ module Vivarium
|
|
|
68
67
|
|
|
69
68
|
@pid_comm = { observer_pid => "ruby" }
|
|
70
69
|
@pid_parent = {}
|
|
71
|
-
@unresolved_method_ids = []
|
|
72
70
|
end
|
|
73
71
|
|
|
74
72
|
def render
|
|
@@ -101,11 +99,11 @@ module Vivarium
|
|
|
101
99
|
events.each do |ev|
|
|
102
100
|
case ev.event_name
|
|
103
101
|
when "span_start"
|
|
104
|
-
|
|
102
|
+
method_name, file_name, lno = read_span_payload(ev.payload)
|
|
105
103
|
span = Span.new(
|
|
106
104
|
tid: ev.tid,
|
|
107
|
-
|
|
108
|
-
|
|
105
|
+
method_name: method_name,
|
|
106
|
+
file_name: file_name,
|
|
109
107
|
lineno: lno,
|
|
110
108
|
start_ktime: ev.ktime_ns,
|
|
111
109
|
stop_ktime: nil,
|
|
@@ -195,8 +193,8 @@ module Vivarium
|
|
|
195
193
|
def synthetic_span(start_ktime, stop_ktime)
|
|
196
194
|
Span.new(
|
|
197
195
|
tid: @main_tid,
|
|
198
|
-
|
|
199
|
-
|
|
196
|
+
method_name: nil,
|
|
197
|
+
file_name: nil,
|
|
200
198
|
lineno: nil,
|
|
201
199
|
start_ktime: start_ktime,
|
|
202
200
|
stop_ktime: stop_ktime,
|
|
@@ -262,9 +260,6 @@ module Vivarium
|
|
|
262
260
|
end
|
|
263
261
|
|
|
264
262
|
def print_warnings
|
|
265
|
-
@unresolved_method_ids.uniq.each do |mid|
|
|
266
|
-
@dest.puts format("# warning method_id=0x%016X unresolved at render time", mid & 0xFFFF_FFFF_FFFF_FFFF)
|
|
267
|
-
end
|
|
268
263
|
end
|
|
269
264
|
|
|
270
265
|
def print_observer_proc(spans)
|
|
@@ -301,25 +296,17 @@ module Vivarium
|
|
|
301
296
|
|
|
302
297
|
def span_file_info(span)
|
|
303
298
|
return "" if span.synthetic
|
|
304
|
-
return ""
|
|
305
|
-
|
|
306
|
-
file_name = Vivarium::Usdt.get_file_name(span.file_id)
|
|
307
|
-
return "" unless file_name
|
|
299
|
+
return "" if span.file_name.nil? || span.file_name.empty?
|
|
308
300
|
|
|
309
301
|
lno = span.lineno && span.lineno > 0 ? ":#{span.lineno}" : ""
|
|
310
|
-
" at=#{File.basename(file_name)}#{lno}"
|
|
302
|
+
" at=#{File.basename(span.file_name)}#{lno}"
|
|
311
303
|
end
|
|
312
304
|
|
|
313
305
|
def span_display_name(span)
|
|
314
306
|
return SYNTHETIC_SPAN_NAME if span.synthetic
|
|
315
|
-
return SYNTHETIC_SPAN_NAME if span.
|
|
316
|
-
|
|
317
|
-
name = @method_table[span.method_id]
|
|
318
|
-
name ||= Vivarium::Usdt.get_method_name(span.method_id)
|
|
319
|
-
return name if name
|
|
307
|
+
return SYNTHETIC_SPAN_NAME if span.method_name.nil? || span.method_name.empty?
|
|
320
308
|
|
|
321
|
-
|
|
322
|
-
format("#{UNRESOLVED_METHOD_PREFIX}0x%016X>", span.method_id & 0xFFFF_FFFF_FFFF_FFFF)
|
|
309
|
+
span.method_name
|
|
323
310
|
end
|
|
324
311
|
|
|
325
312
|
def build_span_children(span)
|
|
@@ -548,28 +535,20 @@ module Vivarium
|
|
|
548
535
|
|
|
549
536
|
def render_raise_target(ev)
|
|
550
537
|
bytes = ev.payload.to_s.b
|
|
551
|
-
return "-" if bytes.
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
if message_id != -1
|
|
564
|
-
msg = Vivarium::Usdt.get_message_name(message_id)
|
|
565
|
-
parts << "message=#{msg.inspect}" if msg
|
|
566
|
-
end
|
|
567
|
-
|
|
568
|
-
if file_id != -1 && (file_name = Vivarium::Usdt.get_file_name(file_id))
|
|
569
|
-
lno = lineno && lineno > 0 ? ":#{lineno}" : ""
|
|
538
|
+
return "-" if bytes.empty?
|
|
539
|
+
|
|
540
|
+
slot = Vivarium::SPAN_RAISE_SLOT_SIZE
|
|
541
|
+
error_name = Vivarium.c_string(bytes[0, slot])
|
|
542
|
+
message = Vivarium.c_string(bytes[slot, slot])
|
|
543
|
+
file_name = Vivarium.c_string(bytes[slot * 2, slot])
|
|
544
|
+
lineno = bytes.bytesize > Vivarium::SPAN_RAISE_LINENO_OFFSET ? bytes[Vivarium::SPAN_RAISE_LINENO_OFFSET, 8].unpack1("q<") : -1
|
|
545
|
+
|
|
546
|
+
parts = ["error=#{error_name.empty? ? '?' : error_name}"]
|
|
547
|
+
parts << "message=#{message.inspect}" unless message.empty?
|
|
548
|
+
unless file_name.empty?
|
|
549
|
+
lno = lineno > 0 ? ":#{lineno}" : ""
|
|
570
550
|
parts << "at=#{File.basename(file_name)}#{lno}"
|
|
571
551
|
end
|
|
572
|
-
|
|
573
552
|
parts.join(" ")
|
|
574
553
|
end
|
|
575
554
|
|
|
@@ -589,12 +568,12 @@ module Vivarium
|
|
|
589
568
|
|
|
590
569
|
def read_span_payload(payload)
|
|
591
570
|
bytes = payload.to_s.b
|
|
592
|
-
return [
|
|
571
|
+
return [nil, nil, -1] if bytes.empty?
|
|
593
572
|
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
lineno
|
|
597
|
-
[
|
|
573
|
+
method_name = Vivarium.c_string(bytes[0, Vivarium::SPAN_METHOD_SIZE])
|
|
574
|
+
file_name = Vivarium.c_string(bytes[Vivarium::SPAN_METHOD_SIZE, Vivarium::SPAN_FILE_SIZE])
|
|
575
|
+
lineno = bytes.bytesize > Vivarium::SPAN_LINENO_OFFSET ? bytes[Vivarium::SPAN_LINENO_OFFSET, 8].unpack1("q<") : -1
|
|
576
|
+
[method_name, file_name, lineno]
|
|
598
577
|
end
|
|
599
578
|
|
|
600
579
|
def read_proc_fork_child_pid(payload)
|
data/lib/vivarium/version.rb
CHANGED
data/lib/vivarium.rb
CHANGED
|
@@ -33,6 +33,15 @@ module Vivarium
|
|
|
33
33
|
EVENT_DROPPED_OFFSET = 288
|
|
34
34
|
EVENTS_RINGBUF_PAGES = 256
|
|
35
35
|
|
|
36
|
+
SPAN_METHOD_SIZE = 128
|
|
37
|
+
SPAN_FILE_SIZE = 120
|
|
38
|
+
SPAN_LINENO_OFFSET = SPAN_METHOD_SIZE + SPAN_FILE_SIZE # 248
|
|
39
|
+
SPAN_FILE_ARG_MAX = SPAN_FILE_SIZE - 1
|
|
40
|
+
|
|
41
|
+
SPAN_RAISE_SLOT_SIZE = 80
|
|
42
|
+
SPAN_RAISE_LINENO_OFFSET = SPAN_RAISE_SLOT_SIZE * 3 # 240
|
|
43
|
+
SPAN_RAISE_FILE_ARG_MAX = SPAN_RAISE_SLOT_SIZE - 1
|
|
44
|
+
|
|
36
45
|
SSL_WRITE_PAYLOAD_DATA_LEN_OFFSET = 0
|
|
37
46
|
SSL_WRITE_PAYLOAD_CAP_LEN_OFFSET = 4
|
|
38
47
|
SSL_WRITE_PAYLOAD_DATA_OFFSET = 8
|
|
@@ -149,6 +158,16 @@ module Vivarium
|
|
|
149
158
|
str[0, nul]
|
|
150
159
|
end
|
|
151
160
|
|
|
161
|
+
def self.tail_fit_string(value, max_bytes, marker: "...")
|
|
162
|
+
str = value.to_s.b
|
|
163
|
+
return str if str.bytesize <= max_bytes
|
|
164
|
+
return str.byteslice(-max_bytes, max_bytes) || "" if max_bytes <= marker.bytesize
|
|
165
|
+
|
|
166
|
+
tail_size = max_bytes - marker.bytesize
|
|
167
|
+
tail = str.byteslice(-tail_size, tail_size) || ""
|
|
168
|
+
"#{marker}#{tail}"
|
|
169
|
+
end
|
|
170
|
+
|
|
152
171
|
def self.event_severity(event_name)
|
|
153
172
|
EVENT_SEVERITY_HIGH.include?(event_name.to_s) ? "high" : "medium"
|
|
154
173
|
end
|
|
@@ -1394,19 +1413,19 @@ module Vivarium
|
|
|
1394
1413
|
return 0;
|
|
1395
1414
|
}
|
|
1396
1415
|
|
|
1397
|
-
u64
|
|
1398
|
-
u64
|
|
1399
|
-
|
|
1400
|
-
bpf_usdt_readarg(1, ctx, &
|
|
1401
|
-
bpf_usdt_readarg(2, ctx, &
|
|
1416
|
+
u64 method_str_ptr = 0;
|
|
1417
|
+
u64 file_str_ptr = 0;
|
|
1418
|
+
s64 lineno = 0;
|
|
1419
|
+
bpf_usdt_readarg(1, ctx, &method_str_ptr);
|
|
1420
|
+
bpf_usdt_readarg(2, ctx, &file_str_ptr);
|
|
1402
1421
|
bpf_usdt_readarg(3, ctx, &lineno);
|
|
1403
1422
|
|
|
1404
1423
|
struct event_t ev = {};
|
|
1405
1424
|
ev.pid = pid;
|
|
1406
1425
|
__builtin_memcpy(ev.event_name, "span_start", 11);
|
|
1407
|
-
|
|
1408
|
-
|
|
1409
|
-
__builtin_memcpy(&ev.payload[
|
|
1426
|
+
bpf_probe_read_user_str(&ev.payload[0], #{SPAN_METHOD_SIZE}, (void*)method_str_ptr);
|
|
1427
|
+
bpf_probe_read_user_str(&ev.payload[#{SPAN_METHOD_SIZE}], #{SPAN_FILE_SIZE}, (void*)file_str_ptr);
|
|
1428
|
+
__builtin_memcpy(&ev.payload[#{SPAN_LINENO_OFFSET}], &lineno, sizeof(lineno));
|
|
1410
1429
|
submit_event(&ev);
|
|
1411
1430
|
return 0;
|
|
1412
1431
|
}
|
|
@@ -1421,19 +1440,19 @@ module Vivarium
|
|
|
1421
1440
|
return 0;
|
|
1422
1441
|
}
|
|
1423
1442
|
|
|
1424
|
-
u64
|
|
1425
|
-
u64
|
|
1426
|
-
|
|
1427
|
-
bpf_usdt_readarg(1, ctx, &
|
|
1428
|
-
bpf_usdt_readarg(2, ctx, &
|
|
1443
|
+
u64 method_str_ptr = 0;
|
|
1444
|
+
u64 file_str_ptr = 0;
|
|
1445
|
+
s64 lineno = 0;
|
|
1446
|
+
bpf_usdt_readarg(1, ctx, &method_str_ptr);
|
|
1447
|
+
bpf_usdt_readarg(2, ctx, &file_str_ptr);
|
|
1429
1448
|
bpf_usdt_readarg(3, ctx, &lineno);
|
|
1430
1449
|
|
|
1431
1450
|
struct event_t ev = {};
|
|
1432
1451
|
ev.pid = pid;
|
|
1433
1452
|
__builtin_memcpy(ev.event_name, "span_stop", 10);
|
|
1434
|
-
|
|
1435
|
-
|
|
1436
|
-
__builtin_memcpy(&ev.payload[
|
|
1453
|
+
bpf_probe_read_user_str(&ev.payload[0], #{SPAN_METHOD_SIZE}, (void*)method_str_ptr);
|
|
1454
|
+
bpf_probe_read_user_str(&ev.payload[#{SPAN_METHOD_SIZE}], #{SPAN_FILE_SIZE}, (void*)file_str_ptr);
|
|
1455
|
+
__builtin_memcpy(&ev.payload[#{SPAN_LINENO_OFFSET}], &lineno, sizeof(lineno));
|
|
1437
1456
|
submit_event(&ev);
|
|
1438
1457
|
return 0;
|
|
1439
1458
|
}
|
|
@@ -1510,22 +1529,22 @@ module Vivarium
|
|
|
1510
1529
|
return 0;
|
|
1511
1530
|
}
|
|
1512
1531
|
|
|
1513
|
-
u64
|
|
1514
|
-
u64
|
|
1515
|
-
u64
|
|
1516
|
-
|
|
1517
|
-
bpf_usdt_readarg(1, ctx, &
|
|
1518
|
-
bpf_usdt_readarg(2, ctx, &
|
|
1519
|
-
bpf_usdt_readarg(3, ctx, &
|
|
1532
|
+
u64 error_str_ptr = 0;
|
|
1533
|
+
u64 message_str_ptr = 0;
|
|
1534
|
+
u64 file_str_ptr = 0;
|
|
1535
|
+
s64 lineno = 0;
|
|
1536
|
+
bpf_usdt_readarg(1, ctx, &error_str_ptr);
|
|
1537
|
+
bpf_usdt_readarg(2, ctx, &message_str_ptr);
|
|
1538
|
+
bpf_usdt_readarg(3, ctx, &file_str_ptr);
|
|
1520
1539
|
bpf_usdt_readarg(4, ctx, &lineno);
|
|
1521
1540
|
|
|
1522
1541
|
struct event_t ev = {};
|
|
1523
1542
|
ev.pid = pid;
|
|
1524
1543
|
__builtin_memcpy(ev.event_name, "span_raise", 11);
|
|
1525
|
-
|
|
1526
|
-
|
|
1527
|
-
|
|
1528
|
-
__builtin_memcpy(&ev.payload[
|
|
1544
|
+
bpf_probe_read_user_str(&ev.payload[0], #{SPAN_RAISE_SLOT_SIZE}, (void*)error_str_ptr);
|
|
1545
|
+
bpf_probe_read_user_str(&ev.payload[#{SPAN_RAISE_SLOT_SIZE}], #{SPAN_RAISE_SLOT_SIZE}, (void*)message_str_ptr);
|
|
1546
|
+
bpf_probe_read_user_str(&ev.payload[#{SPAN_RAISE_SLOT_SIZE * 2}], #{SPAN_RAISE_SLOT_SIZE}, (void*)file_str_ptr);
|
|
1547
|
+
__builtin_memcpy(&ev.payload[#{SPAN_RAISE_LINENO_OFFSET}], &lineno, sizeof(lineno));
|
|
1529
1548
|
submit_event(&ev);
|
|
1530
1549
|
return 0;
|
|
1531
1550
|
}
|
|
@@ -1806,20 +1825,18 @@ module Vivarium
|
|
|
1806
1825
|
pid = Process.pid
|
|
1807
1826
|
store.register_pid(pid)
|
|
1808
1827
|
|
|
1809
|
-
method_id_queue = Thread::Queue.new
|
|
1810
1828
|
main_tid = gettid
|
|
1811
1829
|
|
|
1812
1830
|
correlator = Correlator.new(
|
|
1813
1831
|
pin_dir: pin_dir,
|
|
1814
1832
|
observer_pid: pid,
|
|
1815
1833
|
main_tid: main_tid,
|
|
1816
|
-
method_id_queue: method_id_queue,
|
|
1817
1834
|
filter: filter,
|
|
1818
1835
|
dest: dest
|
|
1819
1836
|
)
|
|
1820
1837
|
correlator.start
|
|
1821
1838
|
|
|
1822
|
-
tracer = build_observe_tracepoint
|
|
1839
|
+
tracer = build_observe_tracepoint
|
|
1823
1840
|
tracer.enable
|
|
1824
1841
|
|
|
1825
1842
|
session = ObservationSession.new(
|
|
@@ -1836,20 +1853,18 @@ module Vivarium
|
|
|
1836
1853
|
pid = Process.pid
|
|
1837
1854
|
store.register_pid(pid)
|
|
1838
1855
|
|
|
1839
|
-
method_id_queue = Thread::Queue.new
|
|
1840
1856
|
main_tid = gettid
|
|
1841
1857
|
|
|
1842
1858
|
correlator = Correlator.new(
|
|
1843
1859
|
pin_dir: pin_dir,
|
|
1844
1860
|
observer_pid: pid,
|
|
1845
1861
|
main_tid: main_tid,
|
|
1846
|
-
method_id_queue: method_id_queue,
|
|
1847
1862
|
filter: filter,
|
|
1848
1863
|
dest: dest
|
|
1849
1864
|
)
|
|
1850
1865
|
correlator.start
|
|
1851
1866
|
|
|
1852
|
-
tracer = build_observe_tracepoint
|
|
1867
|
+
tracer = build_observe_tracepoint
|
|
1853
1868
|
tracer.enable
|
|
1854
1869
|
|
|
1855
1870
|
yield
|
|
@@ -1859,20 +1874,19 @@ module Vivarium
|
|
|
1859
1874
|
correlator&.stop
|
|
1860
1875
|
end
|
|
1861
1876
|
|
|
1862
|
-
def self.build_observe_tracepoint
|
|
1877
|
+
def self.build_observe_tracepoint
|
|
1863
1878
|
allow_classes = SPAN_ALLOWCLASSES
|
|
1864
1879
|
allowlist = SPAN_ALLOWLIST
|
|
1865
1880
|
TracePoint.new(:call, :c_call, :return, :c_return, :raise) do |tp|
|
|
1866
1881
|
if tp.event == :raise
|
|
1867
1882
|
# FIXME: handle threaded events in the future
|
|
1868
|
-
if tp.raised_exception.kind_of?(ThreadError)
|
|
1869
|
-
next
|
|
1870
|
-
end
|
|
1883
|
+
next if tp.raised_exception.kind_of?(ThreadError)
|
|
1871
1884
|
|
|
1885
|
+
file_arg = tail_fit_string(tp.path, SPAN_RAISE_FILE_ARG_MAX)
|
|
1872
1886
|
Vivarium::Usdt.raise(
|
|
1873
1887
|
tp.raised_exception.class.to_s,
|
|
1874
1888
|
tp.raised_exception.message.to_s,
|
|
1875
|
-
file:
|
|
1889
|
+
file: file_arg,
|
|
1876
1890
|
lineno: tp.lineno
|
|
1877
1891
|
)
|
|
1878
1892
|
next
|
|
@@ -1884,12 +1898,12 @@ module Vivarium
|
|
|
1884
1898
|
allow_classes.any? { |klass| tp.defined_class == klass.singleton_class }
|
|
1885
1899
|
next unless is_target
|
|
1886
1900
|
|
|
1901
|
+
file_arg = tail_fit_string(tp.path, SPAN_FILE_ARG_MAX)
|
|
1887
1902
|
case tp.event
|
|
1888
1903
|
when :call, :c_call
|
|
1889
|
-
|
|
1890
|
-
method_id_queue << [method_id, signature]
|
|
1904
|
+
Vivarium::Usdt.start(tp.defined_class.to_s, tp.method_id.to_s, file: file_arg, lineno: tp.lineno)
|
|
1891
1905
|
when :return, :c_return
|
|
1892
|
-
Vivarium::Usdt.stop(tp.defined_class.to_s, tp.method_id.to_s, file:
|
|
1906
|
+
Vivarium::Usdt.stop(tp.defined_class.to_s, tp.method_id.to_s, file: file_arg, lineno: tp.lineno)
|
|
1893
1907
|
end
|
|
1894
1908
|
end
|
|
1895
1909
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: vivarium
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.4.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Uchio Kondo
|
|
@@ -29,14 +29,14 @@ dependencies:
|
|
|
29
29
|
requirements:
|
|
30
30
|
- - "~>"
|
|
31
31
|
- !ruby/object:Gem::Version
|
|
32
|
-
version: 0.
|
|
32
|
+
version: 0.4.0
|
|
33
33
|
type: :runtime
|
|
34
34
|
prerelease: false
|
|
35
35
|
version_requirements: !ruby/object:Gem::Requirement
|
|
36
36
|
requirements:
|
|
37
37
|
- - "~>"
|
|
38
38
|
- !ruby/object:Gem::Version
|
|
39
|
-
version: 0.
|
|
39
|
+
version: 0.4.0
|
|
40
40
|
- !ruby/object:Gem::Dependency
|
|
41
41
|
name: ostruct
|
|
42
42
|
requirement: !ruby/object:Gem::Requirement
|