class Roby::CLI::Log::FlamegraphRenderer

Public Class Methods

new(stacks) click to toggle source
# File lib/roby/cli/log/flamegraph_renderer.rb, line 8
def initialize(stacks)
    @stacks = stacks
end

Public Instance Methods

graph_data() click to toggle source
# File lib/roby/cli/log/flamegraph_renderer.rb, line 27
def graph_data
    table = []
    prev = []

    x = 0
    # a 2d array makes collapsing easy
    @stacks.each_with_index do |(stack, duration), pos|
        col = []
        stack.each_with_index do |frame, i|
            if (last_col = prev[i]) && (last_col[0] == frame)
                last_col[1] += duration
                col << nil
            else
                prev[i] = [frame, duration]
                col << prev[i]
            end
        end
        prev = prev[0..col.length-1].to_a
        table << [x, col]
        x += duration
    end

    data = []

    # a 1d array makes rendering easy
    col_num = 0
    table.each do |x, col|
        col.each_with_index do |row, row_num|
            next unless row && row.length == 2
            data << {
                x: x + 1,
                y: row_num + 1,
                width: row[1],
                frame: row[0]
            }
            col_num += row[1]
        end
    end

    data
end
graph_html(embed_resources: false) click to toggle source
# File lib/roby/cli/log/flamegraph_renderer.rb, line 12
                def graph_html(embed_resources: false)
                    body = read('flamegraph.html')
                    body.sub! "/**INCLUDES**/",
                        if embed_resources
                            embed("jquery.min.js","d3.min.js","lodash.min.js")
                    else
                        '<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.0.8/d3.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/1.3.1/lodash.min.js"></script>'
                    end

                    body.sub!("/**DATA**/", ::JSON.generate(graph_data));
                    body
                end

Private Instance Methods

embed(*files) click to toggle source
# File lib/roby/cli/log/flamegraph_renderer.rb, line 71
def embed(*files)
    out = ""
    files.each do |file|
        body = read(file)
        out << "<script src='data:text/javascript;base64," << Base64.encode64(body) << "'></script>"
    end
    out
end
read(file) click to toggle source
# File lib/roby/cli/log/flamegraph_renderer.rb, line 80
def read(file)
    IO.read(::File.expand_path(file, ::File.dirname(__FILE__)))
end