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
     |