Class: Datadog::Profiling::Pprof::StackSample
- Inherits:
-
Converter
- Object
- Converter
- Datadog::Profiling::Pprof::StackSample
show all
- Defined in:
- lib/ddtrace/profiling/pprof/stack_sample.rb
Overview
Builds a profile from a StackSample
NOTE: This class may appear stateless but is in fact stateful; a new instance should be created for every
encoded profile.
Constant Summary
collapse
- SAMPLE_TYPES =
{
cpu_time_ns: [
Datadog::Ext::Profiling::Pprof::VALUE_TYPE_CPU,
Datadog::Ext::Profiling::Pprof::VALUE_UNIT_NANOSECONDS
],
wall_time_ns: [
Datadog::Ext::Profiling::Pprof::VALUE_TYPE_WALL,
Datadog::Ext::Profiling::Pprof::VALUE_UNIT_NANOSECONDS
]
}.freeze
Instance Attribute Summary
Attributes inherited from Converter
#builder
Class Method Summary
collapse
Instance Method Summary
collapse
Methods inherited from Converter
#group_events, #sample_value_index
Constructor Details
Returns a new instance of StackSample.
30
31
32
33
34
35
36
|
# File 'lib/ddtrace/profiling/pprof/stack_sample.rb', line 30
def initialize(*_)
super
@most_recent_trace_samples = {}
@processed_unique_stacks = 0
@processed_with_trace = 0
end
|
Class Method Details
.sample_value_types ⇒ Object
26
27
28
|
# File 'lib/ddtrace/profiling/pprof/stack_sample.rb', line 26
def self.sample_value_types
SAMPLE_TYPES
end
|
Instance Method Details
#add_events!(stack_samples) ⇒ Object
38
39
40
41
|
# File 'lib/ddtrace/profiling/pprof/stack_sample.rb', line 38
def add_events!(stack_samples)
new_samples = build_samples(stack_samples)
builder.samples.concat(new_samples)
end
|
#build_event_values(stack_sample) ⇒ Object
87
88
89
90
91
92
93
|
# File 'lib/ddtrace/profiling/pprof/stack_sample.rb', line 87
def build_event_values(stack_sample)
no_value = Datadog::Ext::Profiling::Pprof::SAMPLE_VALUE_NO_VALUE
values = super(stack_sample)
values[sample_value_index(:cpu_time_ns)] = stack_sample.cpu_time_interval_ns || no_value
values[sample_value_index(:wall_time_ns)] = stack_sample.wall_time_interval_ns || no_value
values
end
|
#build_sample(stack_sample, values) ⇒ Object
74
75
76
77
78
79
80
81
82
83
84
85
|
# File 'lib/ddtrace/profiling/pprof/stack_sample.rb', line 74
def build_sample(stack_sample, values)
locations = builder.build_locations(
stack_sample.frames,
stack_sample.total_frame_count
)
Perftools::Profiles::Sample.new(
location_id: locations.collect { |location| location['id'.freeze] },
value: values,
label: build_sample_labels(stack_sample)
)
end
|
#build_sample_labels(stack_sample) ⇒ Object
#build_samples(stack_samples) ⇒ Object
66
67
68
69
70
71
72
|
# File 'lib/ddtrace/profiling/pprof/stack_sample.rb', line 66
def build_samples(stack_samples)
groups = group_events(stack_samples, &method(:stack_sample_group_key))
groups.collect do |_group_key, group|
@processed_unique_stacks += 1
build_sample(group.sample, group.values)
end
end
|
#debug_statistics ⇒ Object
134
135
136
|
# File 'lib/ddtrace/profiling/pprof/stack_sample.rb', line 134
def debug_statistics
"unique stacks: #{@processed_unique_stacks}, of which had active traces: #{@processed_with_trace}"
end
|
#stack_sample_group_key(stack_sample) ⇒ Object
43
44
45
46
47
48
49
|
# File 'lib/ddtrace/profiling/pprof/stack_sample.rb', line 43
def stack_sample_group_key(stack_sample)
update_most_recent_trace_sample(stack_sample)
stack_sample.hash
end
|
#update_most_recent_trace_sample(stack_sample) ⇒ Object
Track the most recent sample for each trace (identified by root span id)
52
53
54
55
56
57
58
59
60
61
62
63
64
|
# File 'lib/ddtrace/profiling/pprof/stack_sample.rb', line 52
def update_most_recent_trace_sample(stack_sample)
return unless stack_sample.root_span_id && stack_sample.trace_resource
if (most_recent_trace_sample = @most_recent_trace_samples[stack_sample.root_span_id])
if most_recent_trace_sample.timestamp < stack_sample.timestamp
@most_recent_trace_samples[stack_sample.root_span_id] = stack_sample
end
else
@most_recent_trace_samples[stack_sample.root_span_id] = stack_sample
end
end
|