class Pf2::Reporter::FirefoxProfilerSer2
Generates Firefox Profiler’s “processed profile format” github.com/firefox-devtools/profiler/blob/main/docs-developer/processed-profile-format.md
Public Class Methods
Source
# File lib/pf2/reporter/firefox_profiler_ser2.rb, line 304 def deep_camelize_keys(value) deep_transform_keys(value) do |key| snake_to_camel(key.to_s).to_sym end end
Source
# File lib/pf2/reporter/firefox_profiler_ser2.rb, line 293 def deep_transform_keys(value, &block) case value when Array value.map {|v| deep_transform_keys(v, &block) } when Hash Hash[value.map {|k, v| [yield(k), deep_transform_keys(v, &block)] }] else value end end
Source
# File lib/pf2/reporter/firefox_profiler_ser2.rb, line 12 def initialize(profile) @profile = profile end
Source
# File lib/pf2/reporter/firefox_profiler_ser2.rb, line 286 def snake_to_camel(s) return "isJS" if s == "is_js" return "relevantForJS" if s == "relevant_for_js" return "innerWindowID" if s == "inner_window_id" s.split('_').inject([]) {|buffer, p| buffer.push(buffer.size == 0 ? p : p.capitalize) }.join end
Public Instance Methods
Source
# File lib/pf2/reporter/firefox_profiler_ser2.rb, line 20 def emit grouped_threads = @profile[:samples].group_by {|s| s[:ruby_thread_id] } thread_reports = grouped_threads.map do |thread_id, samples| ThreadReport.new(@profile, thread_id, samples).emit end report = { meta: { interval: 10, # ms; TODO: replace with actual interval start_time: 0, process_type: 0, product: 'ruby', stackwalk: 0, version: 28, preprocessed_profile_version: 47, symbolicated: true, categories: [ { name: "Logs", color: "grey", subcategories: ["Unused"], }, { name: "Ruby", color: "red", subcategories: ["Code"], }, { name: "Native", color: "blue", subcategories: ["Code"], }, { name: "Native", color: "lightblue", subcategories: ["Code"], }, ], marker_schema: [], }, libs: [], counters: [], threads: thread_reports, } JSON.generate(FirefoxProfilerSer2.deep_camelize_keys(report)) end
Source
# File lib/pf2/reporter/firefox_profiler_ser2.rb, line 16 def inspect "#<#{self.class.name} (#{@profile[:samples].length} samples)>" end