diff --git a/README.md b/README.md index 48cf524..6e38606 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,8 @@ gem install codetracer_pure_ruby_recorder After installing, load the tracer: ```ruby -require 'codetracer_ruby_recorder' +require 'codetracer_ruby_recorder' # native implementation +# require 'codetracer_pure_ruby_recorder' # pure Ruby implementation recorder = RubyRecorder.new recorder.enable_tracing diff --git a/examples/selective_tracing_pure.rb b/examples/selective_tracing_pure.rb new file mode 100644 index 0000000..b8fb153 --- /dev/null +++ b/examples/selective_tracing_pure.rb @@ -0,0 +1,18 @@ +#!/usr/bin/env ruby + +# Load the pure Ruby tracer library if RubyRecorder is not already defined +unless defined?(RubyRecorder) + lib_base = File.expand_path('../gems/pure-ruby-tracer/lib/codetracer_pure_ruby_recorder', __dir__) + require lib_base +end + +recorder = RubyRecorder.new + +puts 'start trace' +recorder.disable_tracing +puts 'this will not be traced' +recorder.enable_tracing +puts 'this will be traced' +recorder.disable_tracing +puts 'tracing disabled' +recorder.flush_trace(Dir.pwd) diff --git a/gems/pure-ruby-tracer/lib/codetracer_pure_ruby_recorder.rb b/gems/pure-ruby-tracer/lib/codetracer_pure_ruby_recorder.rb new file mode 100644 index 0000000..115e0bf --- /dev/null +++ b/gems/pure-ruby-tracer/lib/codetracer_pure_ruby_recorder.rb @@ -0,0 +1,43 @@ +require_relative 'trace' + +# Ruby implementation of the RubyRecorder API used by the native tracer. +# Provides basic tracing controls and serialization using the pure Ruby tracer. +class RubyRecorder + def initialize(debug: ENV['CODETRACER_RUBY_RECORDER_DEBUG'] == '1') + @record = $codetracer_record + @tracer = Tracer.new(@record, debug: debug) + setup_defaults + end + + # Enable tracing of Ruby code execution. + def enable_tracing + @tracer.activate + end + + # Disable tracing without discarding collected data. + def disable_tracing + @tracer.deactivate + end + + # Serialize the trace to +out_dir+. + def flush_trace(out_dir) + @tracer.stop_tracing + @record.serialize('', out_dir) + end + + # Record a custom event at +path+ and +line+ with +content+. + def record_event(path, line, content) + @tracer.record_event(["#{path}:#{line}"], content) + end + + private + + def setup_defaults + @record.register_call('', 1, '', []) + @tracer.ignore('lib/ruby') + @tracer.ignore('trace.rb') + @tracer.ignore('recorder.rb') + @tracer.ignore('