rubyrun 0.9.6 → 0.9.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/bin/Rakefile +84 -5
- data/bin/rubyrun_native_test__.rb +1 -0
- data/doc/README +26 -0
- data/{docs/rubyrun-0.9.6.htm → doc/rubyrun-0.9.7.htm} +743 -686
- data/{docs/rubyrun-0.9.6.pdf → doc/rubyrun-0.9.7.pdf} +0 -0
- data/{docs/rubyrun-0.9.6_files → doc/rubyrun-0.9.7_files}/colorschememapping.xml +0 -0
- data/{docs/rubyrun-0.9.6_files → doc/rubyrun-0.9.7_files}/filelist.xml +1 -1
- data/{docs/rubyrun-0.9.6_files → doc/rubyrun-0.9.7_files}/header.htm +7 -8
- data/{docs/rubyrun-0.9.6_files → doc/rubyrun-0.9.7_files}/image001.jpg +0 -0
- data/{docs/rubyrun-0.9.6_files → doc/rubyrun-0.9.7_files}/image002.jpg +0 -0
- data/{docs/rubyrun-0.9.6_files → doc/rubyrun-0.9.7_files}/image003.jpg +0 -0
- data/{docs/rubyrun-0.9.6_files → doc/rubyrun-0.9.7_files}/image004.jpg +0 -0
- data/{docs/rubyrun-0.9.6_files → doc/rubyrun-0.9.7_files}/image005.jpg +0 -0
- data/{docs/rubyrun-0.9.6_files → doc/rubyrun-0.9.7_files}/image006.jpg +0 -0
- data/{docs/rubyrun-0.9.6_files → doc/rubyrun-0.9.7_files}/image007.jpg +0 -0
- data/{docs/rubyrun-0.9.6_files → doc/rubyrun-0.9.7_files}/image008.jpg +0 -0
- data/{docs/rubyrun-0.9.6_files → doc/rubyrun-0.9.7_files}/image009.jpg +0 -0
- data/{docs/rubyrun-0.9.6_files → doc/rubyrun-0.9.7_files}/image010.jpg +0 -0
- data/{docs/rubyrun-0.9.6_files → doc/rubyrun-0.9.7_files}/image011.jpg +0 -0
- data/{docs/rubyrun-0.9.6_files → doc/rubyrun-0.9.7_files}/image012.jpg +0 -0
- data/{docs/rubyrun-0.9.6_files → doc/rubyrun-0.9.7_files}/image013.jpg +0 -0
- data/{docs/rubyrun-0.9.6_files → doc/rubyrun-0.9.7_files}/image014.jpg +0 -0
- data/{docs/rubyrun-0.9.6_files → doc/rubyrun-0.9.7_files}/image015.jpg +0 -0
- data/{docs/rubyrun-0.9.6_files → doc/rubyrun-0.9.7_files}/image016.jpg +0 -0
- data/{docs/rubyrun-0.9.6_files → doc/rubyrun-0.9.7_files}/image017.png +0 -0
- data/{docs/rubyrun-0.9.6_files → doc/rubyrun-0.9.7_files}/image018.jpg +0 -0
- data/{docs/rubyrun-0.9.6_files → doc/rubyrun-0.9.7_files}/image019.jpg +0 -0
- data/{docs/rubyrun-0.9.6_files → doc/rubyrun-0.9.7_files}/image020.jpg +0 -0
- data/{docs/rubyrun-0.9.6_files → doc/rubyrun-0.9.7_files}/image021.jpg +0 -0
- data/{docs/rubyrun-0.9.6_files → doc/rubyrun-0.9.7_files}/image022.png +0 -0
- data/{docs/rubyrun-0.9.6_files → doc/rubyrun-0.9.7_files}/themedata.thmx +0 -0
- data/etc/rubyrun_opts.yml +2 -2
- data/lib/rubyrun/rubyrun_boot__.rb +6 -1
- data/lib/rubyrun/rubyrun_commander__.rb +8 -6
- data/lib/rubyrun/rubyrun_globals.rb +1 -0
- data/lib/rubyrun/rubyrun_initializer__.rb +14 -56
- data/lib/rubyrun/rubyrun_instrumentor__.rb +14 -12
- data/lib/rubyrun/rubyrun_monitor__.rb +1 -1
- data/lib/rubyrun/rubyrun_report__.rb +1 -1
- data/lib/rubyrun/rubyrun_rss__.rb +19 -7
- metadata +52 -50
- data/README +0 -77
| Binary file | 
| 
            File without changes
         | 
| @@ -10,7 +10,7 @@ xmlns="http://www.w3.org/TR/REC-html40"> | |
| 10 10 | 
             
            <meta name=ProgId content=Word.Document>
         | 
| 11 11 | 
             
            <meta name=Generator content="Microsoft Word 12">
         | 
| 12 12 | 
             
            <meta name=Originator content="Microsoft Word 12">
         | 
| 13 | 
            -
            <link id=Main-File rel=Main-File href="../rubyrun-0.9. | 
| 13 | 
            +
            <link id=Main-File rel=Main-File href="../rubyrun-0.9.7.htm">
         | 
| 14 14 | 
             
            <o:SmartTagType namespaceuri="urn:schemas-microsoft-com:office:smarttags"
         | 
| 15 15 | 
             
             name="PlaceType"/>
         | 
| 16 16 | 
             
            <o:SmartTagType namespaceuri="urn:schemas-microsoft-com:office:smarttags"
         | 
| @@ -105,16 +105,15 @@ style='mso-bidi-font-weight:normal'><!--[if gte vml 1]><v:shapetype id="_x0000_t | |
| 105 105 | 
             
            style='font-size:10.0pt;font-family:"Arial","sans-serif"'><span
         | 
| 106 106 | 
             
            style='mso-tab-count:1'>������������������������������������������������� </span></span>Installation
         | 
| 107 107 | 
             
            and User Guide<span style='font-size:10.0pt;font-family:"Arial","sans-serif"'><span
         | 
| 108 | 
            -
            style='mso-tab-count:1' | 
| 108 | 
            +
            style='mso-tab-count:1'>������������������������������� </span></span>Page <!--[if supportFields]><span
         | 
| 109 109 | 
             
            style='mso-element:field-begin'></span><span
         | 
| 110 110 | 
             
            style='mso-spacerun:yes'>�</span>PAGE <span style='mso-element:field-separator'></span><![endif]--><span
         | 
| 111 | 
            -
            style='mso-no-proof:yes'> | 
| 112 | 
            -
             | 
| 111 | 
            +
            style='mso-no-proof:yes'>5</span><!--[if supportFields]><span style='mso-element:
         | 
| 112 | 
            +
            field-end'></span><![endif]--> of <!--[if supportFields]><span
         | 
| 113 113 | 
             
            style='mso-element:field-begin'></span><span
         | 
| 114 114 | 
             
            style='mso-spacerun:yes'>�</span>NUMPAGES <span style='mso-element:field-separator'></span><![endif]--><span
         | 
| 115 | 
            -
            style='mso-no-proof:yes'> | 
| 116 | 
            -
             | 
| 117 | 
            -
            normal'><o:p></o:p></b></p>
         | 
| 115 | 
            +
            style='mso-no-proof:yes'>5</span><!--[if supportFields]><span style='mso-element:
         | 
| 116 | 
            +
            field-end'></span><![endif]--><b style='mso-bidi-font-weight:normal'><o:p></o:p></b></p>
         | 
| 118 117 |  | 
| 119 118 | 
             
            </div>
         | 
| 120 119 |  | 
| @@ -126,7 +125,7 @@ style='mso-bidi-font-weight:normal'><!--[if gte vml 1]><v:shape id="_x0000_i1040 | |
| 126 125 | 
             
             <v:imagedata src="image022.png" o:title="rubysophic_logo"/>
         | 
| 127 126 | 
             
            </v:shape><![endif]--><span style='mso-tab-count:2'>������������������������������������������������������������������ </span></b><span
         | 
| 128 127 | 
             
            style='font-size:10.0pt;font-family:"Arial","sans-serif"'>Ruby<i
         | 
| 129 | 
            -
            style='mso-bidi-font-style:normal'>Run</i><sup>CE</sup> 0.9. | 
| 128 | 
            +
            style='mso-bidi-font-style:normal'>Run</i><sup>CE</sup> 0.9.7 Installation and
         | 
| 130 129 | 
             
            User Guide<o:p></o:p></span></p>
         | 
| 131 130 |  | 
| 132 131 | 
             
            <p class=MsoHeader><o:p> </o:p></p>
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
    
        data/etc/rubyrun_opts.yml
    CHANGED
    
    | @@ -82,7 +82,7 @@ DB_ADAPTER_HASH: {ActiveRecord::ConnectionAdapters::MysqlAdapter: [execute]} | |
| 82 82 | 
             
            #  	TRACE_HASH: {}		#=> Stop tracing
         | 
| 83 83 | 
             
            #  	TRACE_HASH: {Class1: [method1, method2], Class2: [method3, method4]}
         | 
| 84 84 | 
             
            #					#=> Trace only these instrumented methods  
         | 
| 85 | 
            -
            TRACE_HASH: {}
         | 
| 85 | 
            +
            TRACE_HASH: {*: []}
         | 
| 86 86 |  | 
| 87 87 | 
             
            #  Only applies when TRACE_HASH is not an empty hash.
         | 
| 88 88 | 
             
            #  Use DEBUG_ARGS to inspect arguments that were passed in method calls.
         | 
| @@ -123,7 +123,7 @@ REPORT_SHIFT_AGE: 60 | |
| 123 123 | 
             
            #  Examples:
         | 
| 124 124 | 
             
            # 	OUTPUT: [perf_summary]
         | 
| 125 125 | 
             
            # 	OUTPUT: [perf_summary, txn_log]
         | 
| 126 | 
            -
            OUTPUT: [perf_summary | 
| 126 | 
            +
            OUTPUT: [perf_summary]
         | 
| 127 127 |  | 
| 128 128 | 
             
            #  Set the location of the RSS channel and item files
         | 
| 129 129 | 
             
            #  Leave this to blank results in [application directory]/public/rubyrun_rss being used
         | 
| @@ -76,4 +76,9 @@ end | |
| 76 76 | 
             
            # 2. Start the monitor timer thread
         | 
| 77 77 | 
             
            instrument_thread_new
         | 
| 78 78 | 
             
            start_thread_monitor
         | 
| 79 | 
            -
            puts ' | 
| 79 | 
            +
            puts '=> [RubyRun] RubyRun successfully started.'
         | 
| 80 | 
            +
            puts "=> [RubyRun] To find documenation, open #{__FILE__.gsub('\\','/').split('/')[0..-4].join('/') + '/' + RUBYRUN_DOC_DIR}"
         | 
| 81 | 
            +
            puts "=> [RubyRun] To re-config, use #{$rubyrun_config_filename}"
         | 
| 82 | 
            +
            puts "=> [RubyRun] To subscribe to Rails report, use http://#{Socket.gethostname}:[port]/rubyrun_rss/perf_summary.xml"
         | 
| 83 | 
            +
            puts "=> [RubyRun] To view trace, open #{$rubyrun_report_folder}"
         | 
| 84 | 
            +
            puts "=> [RubyRun] Trace is currently off. To turn on trace, use TRACE_HASH: {*: []} in #{$rubyrun_config_filename}." if $rubyrun_trace_hash.empty? 
         | 
| @@ -19,7 +19,7 @@ module RubyRunCommander__ | |
| 19 19 | 
             
              # display the last line # and function of the threads
         | 
| 20 20 | 
             
              def dump_thread_status
         | 
| 21 21 | 
             
                (unsupport_function; return) unless $rubyrun_native
         | 
| 22 | 
            -
                $rubyrun_thread_status_reporter = RubyRunHTMLWriter.new($rubyrun_report_folder + '/' +  | 
| 22 | 
            +
                $rubyrun_thread_status_reporter = RubyRunHTMLWriter.new($rubyrun_report_folder + '/' + $rubyrun_file_basename + '_' + $rubyrun_startup_id + '_thread_status.html', nil, shift_age = 10, shift_size = 4096000) unless $rubyrun_thread_status_reporter
         | 
| 23 23 | 
             
                start_time = Time.now
         | 
| 24 24 | 
             
                th_data_hash = RubyRunNative__.get_all_top_stacks
         | 
| 25 25 | 
             
                odd_row ||= true
         | 
| @@ -51,10 +51,12 @@ module RubyRunCommander__ | |
| 51 51 | 
             
                }
         | 
| 52 52 | 
             
                @rubyrun_req_count ||= 0
         | 
| 53 53 | 
             
                @rubyrun_req_count += buffer.length
         | 
| 54 | 
            -
                if $rubyrun_config['OUTPUT'].include?(RUBYRUN_OUTPUT_PERF_SUMMARY) | 
| 54 | 
            +
                if $rubyrun_config['OUTPUT'].include?(RUBYRUN_OUTPUT_PERF_SUMMARY)
         | 
| 55 55 | 
             
                  create_rss_channels if (!$rubyrun_perf_summary_rss && $rubyrun_rails_env)
         | 
| 56 | 
            -
                   | 
| 57 | 
            -
             | 
| 56 | 
            +
                  if dump_all_reports
         | 
| 57 | 
            +
                    add_perf_summary_rss_item(@rubyrun_req_count)
         | 
| 58 | 
            +
                    @rubyrun_req_count = 0
         | 
| 59 | 
            +
                  end
         | 
| 58 60 | 
             
                end
         | 
| 59 61 | 
             
                if $rubyrun_config['OUTPUT'].include?(RUBYRUN_OUTPUT_TXN_LOG)
         | 
| 60 62 | 
             
                  create_csv_files unless $rubyrun_txn_log_reporter
         | 
| @@ -72,7 +74,7 @@ module RubyRunCommander__ | |
| 72 74 | 
             
              def kill_threads(monitor_thr)
         | 
| 73 75 | 
             
                (unsupport_function; return) unless $rubyrun_native
         | 
| 74 76 | 
             
                if !$rubyrun_thread_dump_reporter
         | 
| 75 | 
            -
                  $rubyrun_thread_dump_reporter = Logger.new($rubyrun_report_folder + '/' +  | 
| 77 | 
            +
                  $rubyrun_thread_dump_reporter = Logger.new($rubyrun_report_folder + '/' + $rubyrun_file_basename + '_' + $rubyrun_startup_id + '_thread_dump.txt', shift_age = 10, shift_size = 4096000)
         | 
| 76 78 | 
             
                  $rubyrun_thread_dump_reporter.level = Logger::INFO
         | 
| 77 79 | 
             
                  class << $rubyrun_thread_dump_reporter
         | 
| 78 80 | 
             
                    include RubyRunUtils__
         | 
| @@ -102,7 +104,7 @@ module RubyRunCommander__ | |
| 102 104 | 
             
              # The snapshot is taken after a gc call is made
         | 
| 103 105 | 
             
              def dump_object_map
         | 
| 104 106 | 
             
                start_time = Time.now
         | 
| 105 | 
            -
                $rubyrun_obj_map_reporter = RubyRunHTMLWriter.new($rubyrun_report_folder + '/' +  | 
| 107 | 
            +
                $rubyrun_obj_map_reporter = RubyRunHTMLWriter.new($rubyrun_report_folder + '/' + $rubyrun_file_basename + '_' + $rubyrun_startup_id + '_object_map.html', nil, shift_age = 10, shift_size = 4096000) unless $rubyrun_obj_map_reporter
         | 
| 106 108 | 
             
                object_map = Hash.new
         | 
| 107 109 | 
             
                ttl_object = 0
         | 
| 108 110 | 
             
                ObjectSpace.garbage_collect
         | 
| @@ -22,6 +22,7 @@ module RubyRunGlobals | |
| 22 22 | 
             
                "*" => ['method_added', 'initialize', 'singleton_method_added', 'send', 'caller']}
         | 
| 23 23 | 
             
              RUBYRUN_WORKING_DIR_NAME = 'rubyrun'
         | 
| 24 24 | 
             
              RUBYRUN_ETC_DIR = 'etc'
         | 
| 25 | 
            +
              RUBYRUN_DOC_DIR = 'doc'
         | 
| 25 26 | 
             
              RUBYRUN_LOG = '/log'
         | 
| 26 27 | 
             
              RUBYRUN_REPORT = '/report'
         | 
| 27 28 | 
             
              RUBYRUN_SIGNATURE = '/signatures'
         | 
| @@ -20,6 +20,7 @@ | |
| 20 20 | 
             
            module RubyRunInitializer__
         | 
| 21 21 |  | 
| 22 22 | 
             
              require 'logger'
         | 
| 23 | 
            +
              require 'socket'
         | 
| 23 24 | 
             
              require 'yaml'
         | 
| 24 25 | 
             
              require 'digest/md5'
         | 
| 25 26 | 
             
              require 'ftools'
         | 
| @@ -31,7 +32,6 @@ module RubyRunInitializer__ | |
| 31 32 |  | 
| 32 33 | 
             
              # 1. Get all directories, logs and properties set up correctly
         | 
| 33 34 | 
             
              # 2. Scan files in APP_PATHS to create an initial INCLUDE_HASH
         | 
| 34 | 
            -
              # and an EXCLUDE_HASH
         | 
| 35 35 | 
             
              def init_rubyrun
         | 
| 36 36 | 
             
                ready_rubyrun_env
         | 
| 37 37 | 
             
                discover_targets
         | 
| @@ -55,18 +55,14 @@ module RubyRunInitializer__ | |
| 55 55 | 
             
                *rubyrun_folders = $rubyrun_working_dir + RUBYRUN_LOG, $rubyrun_working_dir + RUBYRUN_REPORT, $rubyrun_working_dir + RUBYRUN_SIGNATURE
         | 
| 56 56 | 
             
                make_folder(rubyrun_folders)
         | 
| 57 57 | 
             
                $rubyrun_log_folder, $rubyrun_report_folder, $rubyrun_signature_folder = *rubyrun_folders
         | 
| 58 | 
            -
                 | 
| 59 | 
            -
             | 
| 60 | 
            -
             | 
| 61 | 
            -
                else
         | 
| 62 | 
            -
                  $rubyrun_startup_id_type = RUBYRUN_STARTUP_ID_TYPE_PROCESS
         | 
| 63 | 
            -
                  $rubyrun_startup_id = $$.to_s
         | 
| 64 | 
            -
                end
         | 
| 58 | 
            +
                $rubyrun_startup_id = ARGV.join.slice(/.*-p([\d]+).*/,1)
         | 
| 59 | 
            +
                $rubyrun_startup_id ? $rubyrun_startup_id_type = RUBYRUN_STARTUP_ID_TYPE_PORT : ($rubyrun_startup_id = $$.to_s; $rubyrun_startup_id_type = RUBYRUN_STARTUP_ID_TYPE_PROCESS)    
         | 
| 60 | 
            +
                $rubyrun_file_basename = File.basename($0, ".*")
         | 
| 65 61 | 
             
                ready_logfile
         | 
| 66 62 | 
             
                system_wide_opts = $rubyrun_working_dir + RUBYRUN_OPTS_FILE
         | 
| 67 63 | 
             
                app_wide_opts = Dir.getwd + '/' + RUBYRUN_OPTS_FILE
         | 
| 68 64 | 
             
                File.exists?(app_wide_opts) ? load_config_props(app_wide_opts) : load_config_props(system_wide_opts)
         | 
| 69 | 
            -
                $rubyrun_tracer = RubyRunHTMLWriter.new($rubyrun_report_folder + '/' +  | 
| 65 | 
            +
                $rubyrun_tracer = RubyRunHTMLWriter.new($rubyrun_report_folder + '/' + $rubyrun_file_basename + '_' + $rubyrun_startup_id + '_trace.html', METHOD_TRACE_HEADER, shift_age = 10, shift_size = 4096000) unless $rubyrun_trace_hash.empty?
         | 
| 70 66 | 
             
              end
         | 
| 71 67 |  | 
| 72 68 | 
             
              # Create the working directory, which will be 'rubyrun' under the current directory
         | 
| @@ -109,7 +105,7 @@ module RubyRunInitializer__ | |
| 109 105 |  | 
| 110 106 | 
             
              # Initialize rubyrun logger and create its own log format
         | 
| 111 107 | 
             
              def ready_logfile
         | 
| 112 | 
            -
                $rubyrun_logger = Logger.new($rubyrun_log_folder + '/' +  | 
| 108 | 
            +
                $rubyrun_logger = Logger.new($rubyrun_log_folder + '/' + $rubyrun_file_basename + '_' + $rubyrun_startup_id + '.log', shift_age = 10, shift_size = 4096000)
         | 
| 113 109 | 
             
                $rubyrun_logger.level = Logger::INFO
         | 
| 114 110 | 
             
                class << $rubyrun_logger
         | 
| 115 111 | 
             
                  include RubyRunUtils__
         | 
| @@ -137,13 +133,14 @@ module RubyRunInitializer__ | |
| 137 133 | 
             
              # Create new log device in case the log stream is closed.
         | 
| 138 134 | 
             
              # This happens only in Mongrel cluster scenario
         | 
| 139 135 | 
             
              def create_log_device
         | 
| 140 | 
            -
                Logger::LogDevice.new($rubyrun_log_folder + '/' +  | 
| 136 | 
            +
                Logger::LogDevice.new($rubyrun_log_folder + '/' + $rubyrun_file_basename + '_' + $rubyrun_startup_id + '.log', :shift_age => 10, :shift_size => 4096000)    
         | 
| 141 137 | 
             
              end
         | 
| 142 138 |  | 
| 143 139 | 
             
              # Property file is a yml file.
         | 
| 144 140 | 
             
              # Load the properties into $config hash
         | 
| 145 141 | 
             
              def load_config_props(config_file)
         | 
| 146 142 | 
             
                begin
         | 
| 143 | 
            +
                  $rubyrun_config_filename = config_file
         | 
| 147 144 | 
             
                  $rubyrun_config = YAML.load_file(config_file)
         | 
| 148 145 | 
             
                  $rubyrun_logger.info "Properties found in #{config_file}:"
         | 
| 149 146 | 
             
                  RUBYRUN_PROP_DEFAULTS.each {|prop, def_value|
         | 
| @@ -212,17 +209,16 @@ module RubyRunInitializer__ | |
| 212 209 | 
             
              def identify_candidates
         | 
| 213 210 | 
             
                $rubyrun_config['APP_PATHS'].each {|element|
         | 
| 214 211 | 
             
                  element = Dir.getwd if element == '.'
         | 
| 212 | 
            +
                  print "=> [RubyRun] Preparing RubyRun for #{element}..."
         | 
| 215 213 | 
             
                  expand_folder(element)
         | 
| 214 | 
            +
                  puts "finished"
         | 
| 216 215 | 
             
                }
         | 
| 217 216 | 
             
                unless $rubyrun_file_date_hash.empty?
         | 
| 218 217 | 
             
                  dir_signature = generate_hash($rubyrun_file_date_hash)
         | 
| 219 | 
            -
                  exclude_array = []
         | 
| 220 218 | 
             
                  if directory_changed?(dir_signature)
         | 
| 221 219 | 
             
                    $rubyrun_file_date_hash.each {|f, date|
         | 
| 222 | 
            -
             | 
| 223 | 
            -
                    scan_super(f).each {|name| exclude_array << name}        
         | 
| 220 | 
            +
                      scan_module_class(f)
         | 
| 224 221 | 
             
                    }
         | 
| 225 | 
            -
                    $rubyrun_exclude_hash['*'] = exclude_array.uniq if exclude_array.length > 0
         | 
| 226 222 | 
             
                    serialize_scan_history(dir_signature) 
         | 
| 227 223 | 
             
                  end
         | 
| 228 224 | 
             
                end
         | 
| @@ -266,19 +262,16 @@ module RubyRunInitializer__ | |
| 266 262 | 
             
                  Digest::MD5.hexdigest(hash.to_s)
         | 
| 267 263 | 
             
              end
         | 
| 268 264 |  | 
| 269 | 
            -
              # Use Marshal to serialize scan results (the include  | 
| 265 | 
            +
              # Use Marshal to serialize scan results (the include hash)
         | 
| 270 266 | 
             
              def serialize_scan_history(dir_signature)
         | 
| 271 267 | 
             
                  File.open(get_include_hash_file, 'w') {|f| Marshal.dump($rubyrun_include_hash, f)}
         | 
| 272 | 
            -
                  File.open(get_exclude_hash_file, 'w') {|f| Marshal.dump($rubyrun_exclude_hash, f)}
         | 
| 273 268 | 
             
                  File.open(get_dir_hash_file, 'w') {|f| Marshal.dump(dir_signature, f)}
         | 
| 274 269 | 
             
              end      
         | 
| 275 270 |  | 
| 276 | 
            -
              # Use Marshal to de-serialize the include  | 
| 271 | 
            +
              # Use Marshal to de-serialize the include hash 
         | 
| 277 272 | 
             
              def deserialize_scan_history
         | 
| 278 273 | 
             
                  f = get_include_hash_file
         | 
| 279 274 | 
             
                  $rubyrun_include_hash = File.exists?(f) ? File.open(f) {|f| Marshal.load(f)} : {}
         | 
| 280 | 
            -
                  f = get_exclude_hash_file
         | 
| 281 | 
            -
                  $rubyrun_exclude_hash = File.exists?(f) ? File.open(f) {|f| Marshal.load(f)} : {}
         | 
| 282 275 | 
             
              end
         | 
| 283 276 |  | 
| 284 277 | 
             
              # Regular expression that detects the class or module names of a given file
         | 
| @@ -290,46 +283,11 @@ module RubyRunInitializer__ | |
| 290 283 | 
             
                  } 
         | 
| 291 284 | 
             
              end
         | 
| 292 285 |  | 
| 293 | 
            -
              # Line up all the method names in a file by line #
         | 
| 294 | 
            -
              # Line up all the line numbers that contain the keyworkd super
         | 
| 295 | 
            -
              # Collate the two arrays to determine which method has super in it
         | 
| 296 | 
            -
              # Put these method names in EXCLUDE_HASH and skip instrumentation
         | 
| 297 | 
            -
              def scan_super(path)
         | 
| 298 | 
            -
                $rubyrun_logger.info "Method(s) to be excluded from instrumentation in #{path}:"
         | 
| 299 | 
            -
                method_name_array, method_lineno_array, super_array, exclude_array = [],[],[],[]
         | 
| 300 | 
            -
                open(path) {|f|
         | 
| 301 | 
            -
                  f.readlines.each_with_index {|code, lineno|
         | 
| 302 | 
            -
                    code.scan(/^\s*def\s+(.*)\(+.*\)+/m)
         | 
| 303 | 
            -
                    (method_name_array << $1; method_lineno_array << lineno) if $1
         | 
| 304 | 
            -
                    code.scan(/^\s*(super)/m)
         | 
| 305 | 
            -
                    super_array << lineno if $1
         | 
| 306 | 
            -
                  }
         | 
| 307 | 
            -
                }        
         | 
| 308 | 
            -
                method_name_array.reverse!
         | 
| 309 | 
            -
                method_lineno_array.reverse!
         | 
| 310 | 
            -
                super_array.each {|lineno|
         | 
| 311 | 
            -
                  method_lineno_array.each_with_index {|linenum, i|
         | 
| 312 | 
            -
                    unless lineno < linenum 
         | 
| 313 | 
            -
                      $rubyrun_logger.info "\t #{method_name_array[i]}"
         | 
| 314 | 
            -
                      m = method_name_array[i].split('.')
         | 
| 315 | 
            -
                      exclude_array << (m.length > 1 ? m[1] : m[0])  
         | 
| 316 | 
            -
                      break
         | 
| 317 | 
            -
                    end
         | 
| 318 | 
            -
                  }
         | 
| 319 | 
            -
                }
         | 
| 320 | 
            -
                exclude_array
         | 
| 321 | 
            -
              end
         | 
| 322 | 
            -
              
         | 
| 323 286 | 
             
              # Return the target file name that stores the serialized INCLUDE_HASH
         | 
| 324 287 | 
             
              def get_include_hash_file
         | 
| 325 288 | 
             
                  $rubyrun_signature_folder + '/' + RUBYRUN_INCLUDE_HASH_FILE
         | 
| 326 289 | 
             
              end
         | 
| 327 | 
            -
             | 
| 328 | 
            -
              # return the target file name that stores the serialized EXCLUDE_HASH
         | 
| 329 | 
            -
              def get_exclude_hash_file
         | 
| 330 | 
            -
                  $rubyrun_signature_folder + '/' + RUBYRUN_EXCLUDE_HASH_FILE
         | 
| 331 | 
            -
              end
         | 
| 332 | 
            -
                
         | 
| 290 | 
            +
                 
         | 
| 333 291 | 
             
              # Return the target file name that stores the serialized directory contents digest
         | 
| 334 292 | 
             
              # This file has to be application dependent, and we use the current directory of the 
         | 
| 335 293 | 
             
              # running process to represent the application directory.
         | 
| @@ -139,15 +139,16 @@ module RubyRunInstrumentor__ | |
| 139 139 | 
             
              # 5. All these must be done in the context of the class
         | 
| 140 140 | 
             
              def insert_code_to_instance_method(klass, mid)
         | 
| 141 141 | 
             
                klass.class_eval {
         | 
| 142 | 
            -
                   | 
| 143 | 
            -
                   | 
| 142 | 
            +
                  alias_name = "#{RubyRunGlobals::RUBYRUN_PREFIX}_#{rand.to_s.split('.')[1]}_#{mid.id2name}" 
         | 
| 143 | 
            +
                  alias_method alias_name, mid.id2name
         | 
| 144 | 
            +
                  eval <<-BODY1
         | 
| 144 145 | 
             
                    def #{mid.id2name} (*args, &blk)
         | 
| 145 | 
            -
                      RubyRunInstrumentor__.collect_method_data(self, #{klass}, '#{mid}', *args) {self.send("#{ | 
| 146 | 
            +
                      RubyRunInstrumentor__.collect_method_data(self, #{klass}, '#{mid}', *args) {self.send("#{alias_name}", *args, &blk)} 
         | 
| 146 147 | 
             
                    end
         | 
| 147 | 
            -
                   | 
| 148 | 
            -
                  if klass.private_instance_methods(false).include?( | 
| 148 | 
            +
                  BODY1
         | 
| 149 | 
            +
                  if klass.private_instance_methods(false).include?(alias_name)
         | 
| 149 150 | 
             
                    private mid
         | 
| 150 | 
            -
                  elsif klass.protected_instance_methods(false).include?( | 
| 151 | 
            +
                  elsif klass.protected_instance_methods(false).include?(alias_name)
         | 
| 151 152 | 
             
                    protected mid
         | 
| 152 153 | 
             
                  end
         | 
| 153 154 | 
             
                }
         | 
| @@ -156,15 +157,16 @@ module RubyRunInstrumentor__ | |
| 156 157 | 
             
              # Same as insert_code_to_instance_method
         | 
| 157 158 | 
             
              def insert_code_to_singleton_method(klass, mid)
         | 
| 158 159 | 
             
                (class << klass; self; end).class_eval {
         | 
| 159 | 
            -
                   | 
| 160 | 
            -
                   | 
| 160 | 
            +
                  alias_name = "#{RubyRunGlobals::RUBYRUN_PREFIX}_#{rand.to_s.split('.')[1]}_#{mid.id2name}" 
         | 
| 161 | 
            +
                  alias_method alias_name, mid.id2name
         | 
| 162 | 
            +
                  eval <<-BODY2
         | 
| 161 163 | 
             
                    def #{mid.id2name} (*args, &blk)
         | 
| 162 | 
            -
                      RubyRunInstrumentor__.collect_method_data(self, #{klass}, '#{mid}', *args) {self.send("#{ | 
| 164 | 
            +
                      RubyRunInstrumentor__.collect_method_data(self, #{klass}, '#{mid}', *args) {self.send("#{alias_name}", *args, &blk)} 
         | 
| 163 165 | 
             
                    end
         | 
| 164 | 
            -
                   | 
| 165 | 
            -
                  if self.private_instance_methods(false).include?( | 
| 166 | 
            +
                  BODY2
         | 
| 167 | 
            +
                  if self.private_instance_methods(false).include?(alias_name)   
         | 
| 166 168 | 
             
                    private mid
         | 
| 167 | 
            -
                  elsif self.protected_instance_methods(false).include?( | 
| 169 | 
            +
                  elsif self.protected_instance_methods(false).include?(alias_name)
         | 
| 168 170 | 
             
                    protected mid
         | 
| 169 171 | 
             
                  end
         | 
| 170 172 | 
             
                }
         | 
| @@ -84,7 +84,7 @@ module RubyRunMonitor__ | |
| 84 84 | 
             
                        dump_object_map if object_map?
         | 
| 85 85 | 
             
                        kill_threads($rubyrun_monitor_thr) if soft_kill? || hard_kill?
         | 
| 86 86 | 
             
                      rescue Exception => e
         | 
| 87 | 
            -
                        $ | 
| 87 | 
            +
                        $rubyrun_logger.error e.to_s + "\n" + e.backtrace.join("\n")
         | 
| 88 88 | 
             
                        exit(-1)
         | 
| 89 89 | 
             
                      end
         | 
| 90 90 | 
             
                    }
         | 
| @@ -103,7 +103,7 @@ module RubyRunReport__ | |
| 103 103 |  | 
| 104 104 | 
             
              # Create the CSV files 
         | 
| 105 105 | 
             
              def create_csv_files
         | 
| 106 | 
            -
                $rubyrun_txn_log_reporter = Logger.new("#{$rubyrun_report_folder}/#{ | 
| 106 | 
            +
                $rubyrun_txn_log_reporter = Logger.new("#{$rubyrun_report_folder}/#{$rubyrun_file_basename}_#{$rubyrun_startup_id}_txn_log.csv", shift_age = 10, shift_size = 4096000)   
         | 
| 107 107 | 
             
                $rubyrun_txn_log_reporter.info "#\n# Format: [URL],[thread ID],[timestamp],[response time],[action time],[database IO time],[view time],[dispatch delay time],[uncaptured time]\n#"
         | 
| 108 108 | 
             
              end
         | 
| 109 109 |  | 
| @@ -41,7 +41,6 @@ class RubyRunRSS | |
| 41 41 | 
             
                @apps_name = Rails::Configuration.new.root_path.split('/').last
         | 
| 42 42 | 
             
                @rss_xml_destination = "#{@directory}/#{@rss_filename}"
         | 
| 43 43 | 
             
                create_channel_content unless File::exists?(@rss_xml_destination)
         | 
| 44 | 
            -
                @rss = load_rss_content
         | 
| 45 44 | 
             
              end
         | 
| 46 45 |  | 
| 47 46 | 
             
              # Create the RSS channel
         | 
| @@ -70,16 +69,29 @@ class RubyRunRSS | |
| 70 69 | 
             
                item.title = sprintf(title, "#{$rubyrun_startup_id_type} #{$rubyrun_startup_id}",Time.now.strftime("%H:%M:%S"))
         | 
| 71 70 | 
             
                item.description = sprintf(description, @apps_name, "#{$rubyrun_startup_id_type} #{$rubyrun_startup_id}", Time.now.strftime("%H:%M:%S"))
         | 
| 72 71 | 
             
                item.link = "http://#{$rubyrun_host_with_port}/#{RUBYRUN_RSS_FOLDER}/#{filename}"
         | 
| 73 | 
            -
                 | 
| 74 | 
            -
                 | 
| 75 | 
            -
                remove_old_item( | 
| 76 | 
            -
                 | 
| 72 | 
            +
                acquire_lock
         | 
| 73 | 
            +
                rss = load_rss_content    
         | 
| 74 | 
            +
                remove_old_item(rss) if rss.items.length == $rubyrun_report_shift_age
         | 
| 75 | 
            +
                rss.items << item
         | 
| 77 76 | 
             
                File.open(@rss_xml_destination,"w") do |f|
         | 
| 78 | 
            -
                  f.write( | 
| 79 | 
            -
                end | 
| 77 | 
            +
                  f.write(rss)
         | 
| 78 | 
            +
                end
         | 
| 79 | 
            +
                release_lock
         | 
| 80 80 | 
             
              end
         | 
| 81 81 |  | 
| 82 82 | 
             
              private
         | 
| 83 | 
            +
             | 
| 84 | 
            +
              # Acquire a lock so that only one Ruby process can write to the RSS XML file
         | 
| 85 | 
            +
              def acquire_lock
         | 
| 86 | 
            +
                @lock_file = File.new(File.join(@directory,'lock'),'w')
         | 
| 87 | 
            +
                @lock_file.flock(File::LOCK_EX)
         | 
| 88 | 
            +
              end
         | 
| 89 | 
            +
             | 
| 90 | 
            +
              # Release a lock after writing the RSS XML file content
         | 
| 91 | 
            +
              def release_lock
         | 
| 92 | 
            +
                @lock_file.flock(File::LOCK_UN)
         | 
| 93 | 
            +
                @lock_file.close
         | 
| 94 | 
            +
              end
         | 
| 83 95 |  | 
| 84 96 | 
             
              # Load the existing RSS XML file. Create a new channel if the channel is blank
         | 
| 85 97 | 
             
              def load_rss_content
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification 
         | 
| 2 2 | 
             
            name: rubyrun
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version 
         | 
| 4 | 
            -
              version: 0.9. | 
| 4 | 
            +
              version: 0.9.7
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors: 
         | 
| 7 7 | 
             
            - RubySophic Inc
         | 
| @@ -9,7 +9,7 @@ autorequire: | |
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 11 |  | 
| 12 | 
            -
            date: 2008- | 
| 12 | 
            +
            date: 2008-10-22 00:00:00 -07:00
         | 
| 13 13 | 
             
            default_executable: 
         | 
| 14 14 | 
             
            dependencies: []
         | 
| 15 15 |  | 
| @@ -18,67 +18,67 @@ email: info@rubysophic.com | |
| 18 18 | 
             
            executables: []
         | 
| 19 19 |  | 
| 20 20 | 
             
            extensions: 
         | 
| 21 | 
            -
            - ext/extconf.rb
         | 
| 22 21 | 
             
            - bin/Rakefile
         | 
| 23 | 
            -
            extra_rdoc_files:  | 
| 24 | 
            -
             | 
| 22 | 
            +
            extra_rdoc_files: 
         | 
| 23 | 
            +
            - doc/README
         | 
| 25 24 | 
             
            files: 
         | 
| 26 | 
            -
            - README
         | 
| 25 | 
            +
            - doc/README
         | 
| 27 26 | 
             
            - LICENSE
         | 
| 28 27 | 
             
            - lib/rubyrun
         | 
| 29 | 
            -
            - lib/rubyrun/ | 
| 30 | 
            -
            - lib/rubyrun/ | 
| 31 | 
            -
            - lib/rubyrun/ | 
| 28 | 
            +
            - lib/rubyrun/rubyrun_instrumentor__.rb
         | 
| 29 | 
            +
            - lib/rubyrun/rubyrun_tracer__.rb
         | 
| 30 | 
            +
            - lib/rubyrun/rubyrun_initializer__.rb
         | 
| 31 | 
            +
            - lib/rubyrun/rubyrun_rss__.rb
         | 
| 32 32 | 
             
            - lib/rubyrun/rubyrun_commander__.rb
         | 
| 33 | 
            -
            - lib/rubyrun/rubyrun_dad__.rb
         | 
| 34 | 
            -
            - lib/rubyrun/rubyrun_globals.rb
         | 
| 35 33 | 
             
            - lib/rubyrun/rubyrun_html_writer__.rb
         | 
| 36 34 | 
             
            - lib/rubyrun/rubyrun_html__.rb
         | 
| 37 | 
            -
            - lib/rubyrun/rubyrun_initializer__.rb
         | 
| 38 | 
            -
            - lib/rubyrun/rubyrun_instrumentor__.rb
         | 
| 39 35 | 
             
            - lib/rubyrun/rubyrun_monitor__.rb
         | 
| 40 | 
            -
            - lib/rubyrun/rubyrun_report__.rb
         | 
| 41 | 
            -
            - lib/rubyrun/rubyrun_rss__.rb
         | 
| 42 | 
            -
            - lib/rubyrun/rubyrun_tracer__.rb
         | 
| 43 36 | 
             
            - lib/rubyrun/rubyrun_utils__.rb
         | 
| 37 | 
            +
            - lib/rubyrun/rubyrun_globals.rb
         | 
| 38 | 
            +
            - lib/rubyrun/rubyrun.rb
         | 
| 39 | 
            +
            - lib/rubyrun/rubyrun_dad__.rb
         | 
| 40 | 
            +
            - lib/rubyrun/rubyrun_boot__.rb
         | 
| 41 | 
            +
            - lib/rubyrun/rubyrun_buffer_mgr__.rb
         | 
| 42 | 
            +
            - lib/rubyrun/rubyrun_report__.rb
         | 
| 43 | 
            +
            - bin/rubyrun_native_test__.rb
         | 
| 44 44 | 
             
            - bin/Rakefile
         | 
| 45 | 
            +
            - ext/rubyrunnative__x86-mswin32.so
         | 
| 45 46 | 
             
            - ext/extconf.rb
         | 
| 46 | 
            -
            - ext/rubyrunnative__.c
         | 
| 47 | 
            -
            - ext/rubyrunnative__.def
         | 
| 48 | 
            -
            - ext/rubyrunnative__.h
         | 
| 49 47 | 
             
            - ext/rubyrunnative__ppc-darwin.bundle
         | 
| 48 | 
            +
            - ext/rubyrunnative__.def
         | 
| 50 49 | 
             
            - ext/rubyrunnative__x86-darwin.bundle
         | 
| 51 50 | 
             
            - ext/rubyrunnative__x86-linux.so
         | 
| 52 | 
            -
            - ext/ | 
| 53 | 
            -
            -  | 
| 54 | 
            -
            -  | 
| 55 | 
            -
            -  | 
| 56 | 
            -
            -  | 
| 57 | 
            -
            -  | 
| 58 | 
            -
            -  | 
| 59 | 
            -
            -  | 
| 60 | 
            -
            -  | 
| 61 | 
            -
            -  | 
| 62 | 
            -
            -  | 
| 63 | 
            -
            -  | 
| 64 | 
            -
            -  | 
| 65 | 
            -
            -  | 
| 66 | 
            -
            -  | 
| 67 | 
            -
            -  | 
| 68 | 
            -
            -  | 
| 69 | 
            -
            -  | 
| 70 | 
            -
            -  | 
| 71 | 
            -
            -  | 
| 72 | 
            -
            -  | 
| 73 | 
            -
            -  | 
| 74 | 
            -
            -  | 
| 75 | 
            -
            -  | 
| 76 | 
            -
            -  | 
| 77 | 
            -
            -  | 
| 78 | 
            -
            -  | 
| 79 | 
            -
            -  | 
| 80 | 
            -
            -  | 
| 81 | 
            -
            -  | 
| 51 | 
            +
            - ext/rubyrunnative__.c
         | 
| 52 | 
            +
            - ext/rubyrunnative__.h
         | 
| 53 | 
            +
            - doc/rubyrun-0.9.7.htm
         | 
| 54 | 
            +
            - doc/rubyrun-0.9.7.pdf
         | 
| 55 | 
            +
            - doc/rubyrun-0.9.7_files
         | 
| 56 | 
            +
            - doc/rubyrun-0.9.7_files/image014.jpg
         | 
| 57 | 
            +
            - doc/rubyrun-0.9.7_files/themedata.thmx
         | 
| 58 | 
            +
            - doc/rubyrun-0.9.7_files/image016.jpg
         | 
| 59 | 
            +
            - doc/rubyrun-0.9.7_files/image008.jpg
         | 
| 60 | 
            +
            - doc/rubyrun-0.9.7_files/image001.jpg
         | 
| 61 | 
            +
            - doc/rubyrun-0.9.7_files/image019.jpg
         | 
| 62 | 
            +
            - doc/rubyrun-0.9.7_files/header.htm
         | 
| 63 | 
            +
            - doc/rubyrun-0.9.7_files/image020.jpg
         | 
| 64 | 
            +
            - doc/rubyrun-0.9.7_files/image021.jpg
         | 
| 65 | 
            +
            - doc/rubyrun-0.9.7_files/image010.jpg
         | 
| 66 | 
            +
            - doc/rubyrun-0.9.7_files/image012.jpg
         | 
| 67 | 
            +
            - doc/rubyrun-0.9.7_files/image007.jpg
         | 
| 68 | 
            +
            - doc/rubyrun-0.9.7_files/image009.jpg
         | 
| 69 | 
            +
            - doc/rubyrun-0.9.7_files/image005.jpg
         | 
| 70 | 
            +
            - doc/rubyrun-0.9.7_files/colorschememapping.xml
         | 
| 71 | 
            +
            - doc/rubyrun-0.9.7_files/image006.jpg
         | 
| 72 | 
            +
            - doc/rubyrun-0.9.7_files/image013.jpg
         | 
| 73 | 
            +
            - doc/rubyrun-0.9.7_files/image003.jpg
         | 
| 74 | 
            +
            - doc/rubyrun-0.9.7_files/image022.png
         | 
| 75 | 
            +
            - doc/rubyrun-0.9.7_files/image018.jpg
         | 
| 76 | 
            +
            - doc/rubyrun-0.9.7_files/image004.jpg
         | 
| 77 | 
            +
            - doc/rubyrun-0.9.7_files/image011.jpg
         | 
| 78 | 
            +
            - doc/rubyrun-0.9.7_files/image017.png
         | 
| 79 | 
            +
            - doc/rubyrun-0.9.7_files/image002.jpg
         | 
| 80 | 
            +
            - doc/rubyrun-0.9.7_files/filelist.xml
         | 
| 81 | 
            +
            - doc/rubyrun-0.9.7_files/image015.jpg
         | 
| 82 82 | 
             
            - etc/rubyrun_opts.yml
         | 
| 83 83 | 
             
            has_rdoc: true
         | 
| 84 84 | 
             
            homepage: http://www.rubysophic.com
         | 
| @@ -88,6 +88,8 @@ rdoc_options: | |
| 88 88 | 
             
            - RubyRun Community Edition
         | 
| 89 89 | 
             
            - --line-numbers
         | 
| 90 90 | 
             
            - --inline-source
         | 
| 91 | 
            +
            - --main
         | 
| 92 | 
            +
            - doc/README
         | 
| 91 93 | 
             
            require_paths: 
         | 
| 92 94 | 
             
            - .
         | 
| 93 95 | 
             
            - lib
         | 
| @@ -107,7 +109,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 107 109 | 
             
            requirements: []
         | 
| 108 110 |  | 
| 109 111 | 
             
            rubyforge_project: rubyrunce
         | 
| 110 | 
            -
            rubygems_version: 1. | 
| 112 | 
            +
            rubygems_version: 1.2.0
         | 
| 111 113 | 
             
            signing_key: 
         | 
| 112 114 | 
             
            specification_version: 2
         | 
| 113 115 | 
             
            summary: RubyRun Community Edition is an application performance diagnostic solution for Ruby developers
         |