Sha256: e73b7e66d46e8d8fa06b98e63fd5eb10c0b313085c61996f1f4c6d1e36e90ebc

Contents?: true

Size: 1.32 KB

Versions: 2

Compression:

Stored size: 1.32 KB

Contents

# frozen_string_literal: true

require 'fileutils'
require 'forwardable'

module MemprofilerPprof
  class FileFlusher
    extend Forwardable

    def initialize(collector, pattern: 'tmp/profiles/mem-%{pid}-%{isotime}.pprof', interval: 30, logger: nil)
      @logger = logger
      @pattern = pattern
      @profile_counter = 0
      @block_flusher = BlockFlusher.new(collector, interval: interval, logger: logger, on_flush: method(:on_flush))
    end

    def_delegators :@block_flusher, :start!, :stop!, :run
    attr_accessor :pattern

    private

    def on_flush(profile_data)
      fname = template_string(@pattern)
      dirname = File.dirname(fname)
      FileUtils.mkdir_p dirname
      # Need to explicitly specify the encoding, because some applications might do exotic
      # things to File#default_external/#default_internal that would attempt to convert
      # our protobuf to UTF-8.
      File.write(template_string(@pattern), profile_data.pprof_data, encoding: 'ASCII-8BIT')
      @profile_counter += 1
    rescue => e
      @logger&.error("FileFlusher: failed to flush profiling data: #{e.inspect}")
    end

    def template_string(tmpl)
      vars = {
        pid: Process.pid,
        isotime: Time.now.iso8601,
        unixtime: Time.now.to_i,
        index: @profile_counter,
      }
      sprintf(tmpl, vars)
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
ruby_memprofiler_pprof-0.0.3 lib/ruby_memprofiler_pprof/file_flusher.rb
ruby_memprofiler_pprof-0.0.1 lib/ruby_memprofiler_pprof/file_flusher.rb