catpm 0.8.2 → 0.8.3
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/README.md +1 -1
- data/lib/catpm/collector.rb +4 -0
- data/lib/catpm/middleware.rb +1 -0
- data/lib/catpm/request_segments.rb +15 -2
- data/lib/catpm/stack_sampler.rb +12 -12
- data/lib/catpm/trace.rb +1 -0
- data/lib/catpm/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 68fffa206b7baa5919309c1d54110c58205fe7b48bf37111724ba00b5ed07ef7
|
|
4
|
+
data.tar.gz: eba9254577cdbc6afa64d1ec352d2bdc55827e1668890dd0dbba2ff16696ac3c
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: d7c6016b9f7f3087638e0b1ab47ecb140bd3eff31b2c0988ab953590c435f162336b29e380cc231a5eb66d95c5ad4c7b93a77399fd513a99f8bcf0e44aface84
|
|
7
|
+
data.tar.gz: 9a923abb3d7f882c76b9665509adea19173368d0395ec1b99b73d6288901bfdff6d0d89336d9081e5f7b5ecea96f6274e59e0cf62d7f17f6be7ddc221bdff18c
|
data/README.md
CHANGED
data/lib/catpm/collector.rb
CHANGED
|
@@ -144,6 +144,8 @@ module Catpm
|
|
|
144
144
|
parent_index: error_parent
|
|
145
145
|
}
|
|
146
146
|
end
|
|
147
|
+
|
|
148
|
+
req_segments.release! # free internal state for GC
|
|
147
149
|
end
|
|
148
150
|
|
|
149
151
|
context = scrub(context)
|
|
@@ -314,6 +316,8 @@ module Catpm
|
|
|
314
316
|
parent_index: error_parent
|
|
315
317
|
}
|
|
316
318
|
end
|
|
319
|
+
|
|
320
|
+
req_segments.release! # free internal state for GC
|
|
317
321
|
end
|
|
318
322
|
|
|
319
323
|
context = scrub(context)
|
data/lib/catpm/middleware.rb
CHANGED
|
@@ -95,12 +95,25 @@ module Catpm
|
|
|
95
95
|
|
|
96
96
|
def sampler_segments
|
|
97
97
|
return [] if @call_tree # call tree mode produces segments via call_tree_segments
|
|
98
|
-
@sampler&.to_segments(tracked_ranges: @tracked_ranges) || []
|
|
98
|
+
result = @sampler&.to_segments(tracked_ranges: @tracked_ranges) || []
|
|
99
|
+
@sampler&.clear_samples! # free raw backtrace data immediately
|
|
100
|
+
result
|
|
99
101
|
end
|
|
100
102
|
|
|
101
103
|
def call_tree_segments
|
|
102
104
|
return [] unless @sampler && @call_tree
|
|
103
|
-
@sampler.to_call_tree(tracked_ranges: @tracked_ranges)
|
|
105
|
+
result = @sampler.to_call_tree(tracked_ranges: @tracked_ranges)
|
|
106
|
+
@sampler.clear_samples! # free raw backtrace data immediately
|
|
107
|
+
result
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
# Release all internal state after Collector has consumed data.
|
|
111
|
+
# Helps GC reclaim memory sooner on small/constrained hosts.
|
|
112
|
+
def release!
|
|
113
|
+
@segments = []
|
|
114
|
+
@summary = {}
|
|
115
|
+
@tracked_ranges = []
|
|
116
|
+
@sampler = nil
|
|
104
117
|
end
|
|
105
118
|
|
|
106
119
|
def overflowed?
|
data/lib/catpm/stack_sampler.rb
CHANGED
|
@@ -4,8 +4,8 @@ module Catpm
|
|
|
4
4
|
class StackSampler
|
|
5
5
|
MS_PER_SECOND = 1000.0
|
|
6
6
|
MIN_SEGMENT_DURATION_MS = 1.0
|
|
7
|
-
CALL_TREE_SAMPLE_INTERVAL = 0.001 # 1ms — higher resolution for call tree reconstruction
|
|
8
7
|
SAMPLING_THREAD_PRIORITY = -1
|
|
8
|
+
HARD_SAMPLE_CAP = 500 # absolute max even when config allows unlimited — prevents heap bloat
|
|
9
9
|
|
|
10
10
|
# Single global thread that samples all active requests.
|
|
11
11
|
# Avoids creating a thread per request.
|
|
@@ -37,14 +37,9 @@ module Catpm
|
|
|
37
37
|
def start_thread
|
|
38
38
|
@stop = false
|
|
39
39
|
@thread = Thread.new do
|
|
40
|
+
interval = Catpm.config.stack_sample_interval
|
|
40
41
|
loop do
|
|
41
42
|
break if @stop
|
|
42
|
-
|
|
43
|
-
interval = if Catpm.config.instrument_call_tree
|
|
44
|
-
[CALL_TREE_SAMPLE_INTERVAL, Catpm.config.stack_sample_interval].min
|
|
45
|
-
else
|
|
46
|
-
Catpm.config.stack_sample_interval
|
|
47
|
-
end
|
|
48
43
|
sleep(interval)
|
|
49
44
|
sample_all
|
|
50
45
|
end
|
|
@@ -80,14 +75,21 @@ module Catpm
|
|
|
80
75
|
|
|
81
76
|
def stop
|
|
82
77
|
self.class.loop.unregister(self)
|
|
78
|
+
@target = nil # release thread reference for GC
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# Free raw backtrace data after segments have been extracted.
|
|
82
|
+
def clear_samples!
|
|
83
|
+
@samples = []
|
|
83
84
|
end
|
|
84
85
|
|
|
85
86
|
# Called by SamplingLoop from the global thread
|
|
86
87
|
def capture(now)
|
|
87
88
|
max = Catpm.config.max_stack_samples_per_request
|
|
88
|
-
|
|
89
|
+
cap = max ? [max, HARD_SAMPLE_CAP].min : HARD_SAMPLE_CAP
|
|
90
|
+
return if @samples.size >= cap
|
|
89
91
|
|
|
90
|
-
locs = @target
|
|
92
|
+
locs = @target&.backtrace_locations
|
|
91
93
|
@samples << [now, locs] if locs
|
|
92
94
|
end
|
|
93
95
|
|
|
@@ -249,9 +251,7 @@ module Catpm
|
|
|
249
251
|
end
|
|
250
252
|
|
|
251
253
|
def call_tree_node_duration(node)
|
|
252
|
-
interval = Catpm.config.
|
|
253
|
-
[CALL_TREE_SAMPLE_INTERVAL, Catpm.config.stack_sample_interval].min :
|
|
254
|
-
Catpm.config.stack_sample_interval
|
|
254
|
+
interval = Catpm.config.stack_sample_interval
|
|
255
255
|
[
|
|
256
256
|
(node[:last_time] - node[:first_time]) * MS_PER_SECOND,
|
|
257
257
|
node[:count] * interval * MS_PER_SECOND
|
data/lib/catpm/trace.rb
CHANGED
data/lib/catpm/version.rb
CHANGED