scout_apm 2.0.0.pre8 → 2.0.0
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.
- checksums.yaml +4 -4
 - data/CHANGELOG.markdown +11 -5
 - data/LICENSE.md +29 -5
 - data/lib/scout_apm/agent.rb +7 -5
 - data/lib/scout_apm/background_worker.rb +9 -6
 - data/lib/scout_apm/config.rb +87 -7
 - data/lib/scout_apm/instant/assets/xmlhttp_instrumentation.html +7 -33
 - data/lib/scout_apm/instant/middleware.rb +8 -3
 - data/lib/scout_apm/instant_reporting.rb +2 -2
 - data/lib/scout_apm/instruments/mongoid.rb +6 -5
 - data/lib/scout_apm/tracked_request.rb +10 -2
 - data/lib/scout_apm/version.rb +1 -1
 - metadata +5 -6
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA1:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: a0a32ed17d0fae5e86bf5e64cfe7f25dfe9d1a77
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 0e910af3eebdef26c093df1f522795aea983d890
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: f125f45638df4302321104e62d147725636ce4a31ea69d4ee9ca6b5730fb9673ac4ea3cca1e2cf58ff5874ac4c90ccce2eb737b940ca3780a4741fa531763784
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 78eeec2d2700d0d02c937be30abc4322820935e89bd178a6d31114b86ea2e5d040b57578eccd7043e9c1386b4f2b6ffa1e26c94d52ae8d1c7afbbdf624cdbc1a
         
     | 
    
        data/CHANGELOG.markdown
    CHANGED
    
    | 
         @@ -1,14 +1,20 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            # 2.0.0
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
     | 
    
         
            -
            * Reporting object allocation metrics and mem delta  
     | 
| 
       4 
     | 
    
         
            -
            * Collecting  
     | 
| 
       5 
     | 
    
         
            -
            * Collecting additional fields for slow transactions:
         
     | 
| 
      
 3 
     | 
    
         
            +
            * Reporting object allocation & mem delta metrics and mem delta for requests and jobs.
         
     | 
| 
      
 4 
     | 
    
         
            +
            * Collecting additional fields for transactions:
         
     | 
| 
       6 
5 
     | 
    
         
             
              * hostname
         
     | 
| 
       7 
6 
     | 
    
         
             
              * seconds_since_startup (larger memory increases and other other odd behavior more common when close to startup)
         
     | 
| 
       8 
     | 
    
         
            -
            * Initial support for instant traces
         
     | 
| 
       9 
     | 
    
         
            -
            * Collect 95th percentiles
         
     | 
| 
       10 
7 
     | 
    
         
             
            * Remove unused & old references to Stackprof
         
     | 
| 
       11 
8 
     | 
    
         
             
            * Fixing exception on load if no config file is provided
         
     | 
| 
      
 9 
     | 
    
         
            +
            * DevTrace BETA
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
            # 1.6.8
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
            * Don't wait on a sleeping thread during shutdown
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
            # 1.6.7
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
            * Mongoid bugfixes
         
     | 
| 
       12 
18 
     | 
    
         | 
| 
       13 
19 
     | 
    
         
             
            # 1.6.6
         
     | 
| 
       14 
20 
     | 
    
         | 
    
        data/LICENSE.md
    CHANGED
    
    | 
         @@ -1,9 +1,33 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
             
     | 
| 
      
 1 
     | 
    
         
            +
            # Scout Software Agent License 
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
     | 
    
         
            -
             
     | 
| 
      
 3 
     | 
    
         
            +
            Subject to and conditioned upon your continued compliance with the terms and conditions of this license, Zimuth, Inc. grants you a non-exclusive, non-sublicensable and non-transferable, limited license to install, use and run one copy of this software on each of your and your affiliate’s computers.  This license also grants you the limited right to distribute verbatim copies of this software and documentation to third parties provided the software and documentation will (a) remain the exclusive property of Zimuth; (b) be subject to the terms and conditions of this license; and (c) include a complete and unaltered copy of this license and all other copyright or other intellectual property rights notices contained in the original.
         
     | 
| 
       4 
4 
     | 
    
         | 
| 
       5 
     | 
    
         
            -
             
     | 
| 
      
 5 
     | 
    
         
            +
            The software includes the open-source components listed below. Any use of the open-source components by you shall be governed by, and subject to, the terms and conditions of the applicable open-source licenses.
         
     | 
| 
       6 
6 
     | 
    
         | 
| 
       7 
     | 
    
         
            -
             
     | 
| 
      
 7 
     | 
    
         
            +
            Except as this license expressly permits, you may not:
         
     | 
| 
       8 
8 
     | 
    
         | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
      
 9 
     | 
    
         
            +
            * copy the software, in whole or in part; 
         
     | 
| 
      
 10 
     | 
    
         
            +
            * modify, correct, adapt, translate, enhance or otherwise prepare derivative works or improvements of the software; 
         
     | 
| 
      
 11 
     | 
    
         
            +
            * sell, sublicense, assign, distribute, publish, transfer or otherwise make available the software to any person or entity; 
         
     | 
| 
      
 12 
     | 
    
         
            +
            * remove, delete, efface, alter, obscure, translate, combine, supplement or otherwise change any trademarks, terms of the documentation, warranties, disclaimers, or intellectual property rights, or other symbols, notices, marks or serial numbers on or relating to any copy of the software or documentation; or
         
     | 
| 
      
 13 
     | 
    
         
            +
            use the software in any manner or for any purpose that infringes, misappropriates or otherwise violates any intellectual property right or other right of any person or entity, or that violates any applicable law;
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
            By using the software, you acknowledge and agree that:
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
            * the software and documentation are licensed, not sold, to you by Zimuth and you do not and will not have or acquire under or in connection with this license any ownership interest in the software or documentation, or in any related intellectual property rights; and
         
     | 
| 
      
 18 
     | 
    
         
            +
            * Zimuth will remain the sole and exclusive owner of all right, title and interest in and to the software and documentation, including all related intellectual property rights, subject only to the rights of third parties in open-source components and the limited license granted to you under this license; and
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
            Except for the limited rights and licenses expressly granted to you under this agreement, nothing in this license grants, by implication, waiver, estoppel or otherwise, to you or any third party any intellectual property rights or other right, title, or interest in or to any of the software or documentation.
         
     | 
| 
      
 21 
     | 
    
         
            +
             
         
     | 
| 
      
 22 
     | 
    
         
            +
            This license shall be automatically terminated and revoked if you exceed the scope or violate any terms and conditions of this license. 
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
            ALL LICENSED SOFTWARE, DOCUMENTATION AND OTHER PRODUCTS, INFORMATION, MATERIALS AND SERVICES PROVIDED BY ZIMUTH ARE PROVIDED HERE “AS IS.” ZIMUTH DISCLAIMS ALL WARRANTIES, WHETHER EXPRESS, IMPLIED, STATUTORY OR OTHER (INCLUDING ALL WARRANTIES ARISING FROM COURSE OF DEALING, USAGE OR TRADE PRACTICE), AND SPECIFICALLY DISCLAIMS ALL IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. WITHOUT LIMITING THE FOREGOING, ZIMUTH MAKES NO WARRANTY OF ANY KIND THAT THE LICENSED SOFTWARE OR DOCUMENTATION, OR ANY OTHER LICENSOR OR THIRD-PARTY GOODS, SERVICES, TECHNOLOGIES OR MATERIALS, WILL MEET YOUR REQUIREMENTS, OPERATE WITHOUT INTERRUPTION, ACHIEVE ANY INTENDED RESULT, BE COMPATIBLE OR WORK WITH ANY OTHER GOODS, SERVICES, TECHNOLOGIES OR MATERIALS (INCLUDING ANY SOFTWARE, HARDWARE, SYSTEM OR NETWORK) EXCEPT IF AND TO THE EXTENT EXPRESSLY SET FORTH IN THE DOCUMENTATION, OR BE SECURE, ACCURATE, COMPLETE, FREE OF HARMFUL CODE OR ERROR FREE. ALL OPEN-SOURCE COMPONENTS AND OTHER THIRD-PARTY MATERIALS ARE PROVIDED “AS IS” AND ANY REPRESENTATION OR WARRANTY OF OR CONCERNING ANY OF THEM IS STRICTLY BETWEEN LICENSEE AND THE THIRD-PARTY OWNER OR DISTRIBUTOR OF SUCH OPEN-SOURCE COMPONENTS AND THIRD-PARTY MATERIALS.
         
     | 
| 
      
 25 
     | 
    
         
            +
             
         
     | 
| 
      
 26 
     | 
    
         
            +
            IN NO EVENT WILL ZIMUTH BE LIABLE UNDER OR IN CONNECTION WITH THIS LICENSE OR ITS SUBJECT MATTER UNDER ANY LEGAL OR EQUITABLE THEORY, INCLUDING BREACH OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY AND OTHERWISE, FOR ANY CONSEQUENTIAL, INCIDENTAL, INDIRECT, EXEMPLARY, SPECIAL, ENHANCED OR PUNITIVE DAMAGES, IN EACH CASE REGARDLESS OF WHETHER SUCH PERSONS WERE ADVISED OF THE POSSIBILITY OF SUCH LOSSES OR DAMAGES OR SUCH LOSSES OR DAMAGES WERE OTHERWISE FORESEEABLE, AND NOTWITHSTANDING THE FAILURE OF ANY AGREED OR OTHER REMEDY OF ITS ESSENTIAL PURPOSE.
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
            ## OPEN SOURCE COMPONENTS
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
            This product includes `rusage`, which inherits the Artistic License 2.0 from proc/wait3.
         
     | 
| 
      
 31 
     | 
    
         
            +
            See http://www.rubydoc.info/gems/rusage/0.2.0.
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
                Copyright Daniel J. Berger and Ben Sandofsky.
         
     | 
    
        data/lib/scout_apm/agent.rb
    CHANGED
    
    | 
         @@ -198,15 +198,17 @@ module ScoutApm 
     | 
|
| 
       198 
198 
     | 
    
         
             
                def shutdown
         
     | 
| 
       199 
199 
     | 
    
         
             
                  logger.info "Shutting down ScoutApm"
         
     | 
| 
       200 
200 
     | 
    
         
             
                  return if !started?
         
     | 
| 
      
 201 
     | 
    
         
            +
             
     | 
| 
       201 
202 
     | 
    
         
             
                  if @background_worker
         
     | 
| 
      
 203 
     | 
    
         
            +
                    logger.info("Stopping background worker")
         
     | 
| 
       202 
204 
     | 
    
         
             
                    @background_worker.stop
         
     | 
| 
       203 
205 
     | 
    
         
             
                    store.write_to_layaway(layaway, :force)
         
     | 
| 
       204 
206 
     | 
    
         
             
                  end
         
     | 
| 
       205 
207 
     | 
    
         | 
| 
       206 
     | 
    
         
            -
                   
     | 
| 
       207 
     | 
    
         
            -
                  if  
     | 
| 
       208 
     | 
    
         
            -
                     
     | 
| 
       209 
     | 
    
         
            -
                    @background_worker_thread.join 
     | 
| 
      
 208 
     | 
    
         
            +
                  logger.debug "Joining background worker thread"
         
     | 
| 
      
 209 
     | 
    
         
            +
                  if @background_worker_thread
         
     | 
| 
      
 210 
     | 
    
         
            +
                    @background_worker_thread.wakeup
         
     | 
| 
      
 211 
     | 
    
         
            +
                    @background_worker_thread.join
         
     | 
| 
       210 
212 
     | 
    
         
             
                  end
         
     | 
| 
       211 
213 
     | 
    
         
             
                end
         
     | 
| 
       212 
214 
     | 
    
         | 
| 
         @@ -260,7 +262,7 @@ module ScoutApm 
     | 
|
| 
       260 
262 
     | 
    
         
             
                # If we want to skip the app_server_check, then we must load it.
         
     | 
| 
       261 
263 
     | 
    
         
             
                def should_load_instruments?(options={})
         
     | 
| 
       262 
264 
     | 
    
         
             
                  return true if options[:skip_app_server_check]
         
     | 
| 
       263 
     | 
    
         
            -
                  return true if config.value(' 
     | 
| 
      
 265 
     | 
    
         
            +
                  return true if config.value('dev_trace')
         
     | 
| 
       264 
266 
     | 
    
         
             
                  return false if !apm_enabled?
         
     | 
| 
       265 
267 
     | 
    
         
             
                  environment.app_server_integration.found? || !background_job_missing?
         
     | 
| 
       266 
268 
     | 
    
         
             
                end
         
     | 
| 
         @@ -12,6 +12,7 @@ module ScoutApm 
     | 
|
| 
       12 
12 
     | 
    
         
             
                end
         
     | 
| 
       13 
13 
     | 
    
         | 
| 
       14 
14 
     | 
    
         
             
                def stop
         
     | 
| 
      
 15 
     | 
    
         
            +
                  ScoutApm::Agent.instance.logger.debug "Background Worker: stop requested"
         
     | 
| 
       15 
16 
     | 
    
         
             
                  @keep_running = false
         
     | 
| 
       16 
17 
     | 
    
         
             
                end
         
     | 
| 
       17 
18 
     | 
    
         | 
| 
         @@ -25,31 +26,33 @@ module ScoutApm 
     | 
|
| 
       25 
26 
     | 
    
         
             
                  @task = block
         
     | 
| 
       26 
27 
     | 
    
         | 
| 
       27 
28 
     | 
    
         
             
                  begin
         
     | 
| 
       28 
     | 
    
         
            -
                    ScoutApm::Agent.instance.logger.debug "Starting Background Worker, running every #{period} seconds"
         
     | 
| 
      
 29 
     | 
    
         
            +
                    ScoutApm::Agent.instance.logger.debug "Background Worker: Starting Background Worker, running every #{period} seconds"
         
     | 
| 
       29 
30 
     | 
    
         | 
| 
       30 
31 
     | 
    
         
             
                    # The first run should be 1 period of time from now
         
     | 
| 
       31 
32 
     | 
    
         
             
                    next_time = Time.now + period
         
     | 
| 
       32 
33 
     | 
    
         | 
| 
       33 
34 
     | 
    
         
             
                    loop do
         
     | 
| 
      
 35 
     | 
    
         
            +
                      # Bail out if @keep_running is false
         
     | 
| 
      
 36 
     | 
    
         
            +
                      unless @keep_running
         
     | 
| 
      
 37 
     | 
    
         
            +
                        ScoutApm::Agent.instance.logger.debug "Background Worker: breaking from loop"
         
     | 
| 
      
 38 
     | 
    
         
            +
                        break
         
     | 
| 
      
 39 
     | 
    
         
            +
                      end
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
       34 
41 
     | 
    
         
             
                      now = Time.now
         
     | 
| 
       35 
42 
     | 
    
         | 
| 
       36 
43 
     | 
    
         
             
                      # Sleep the correct amount of time to reach next_time
         
     | 
| 
       37 
     | 
    
         
            -
                      while now < next_time
         
     | 
| 
      
 44 
     | 
    
         
            +
                      while now < next_time && @keep_running
         
     | 
| 
       38 
45 
     | 
    
         
             
                        sleep_time = next_time - now
         
     | 
| 
       39 
46 
     | 
    
         
             
                        sleep(sleep_time) if sleep_time > 0
         
     | 
| 
       40 
47 
     | 
    
         
             
                        now = Time.now
         
     | 
| 
       41 
48 
     | 
    
         
             
                      end
         
     | 
| 
       42 
49 
     | 
    
         | 
| 
       43 
     | 
    
         
            -
                      # Bail out if @keep_running is false
         
     | 
| 
       44 
     | 
    
         
            -
                      break unless @keep_running
         
     | 
| 
       45 
     | 
    
         
            -
             
     | 
| 
       46 
50 
     | 
    
         
             
                      @task.call
         
     | 
| 
       47 
51 
     | 
    
         | 
| 
       48 
52 
     | 
    
         
             
                      # Adjust the next time to run forward by @periods until it is in the future
         
     | 
| 
       49 
53 
     | 
    
         
             
                      while next_time <= now
         
     | 
| 
       50 
54 
     | 
    
         
             
                        next_time += period
         
     | 
| 
       51 
55 
     | 
    
         
             
                      end
         
     | 
| 
       52 
     | 
    
         
            -
             
     | 
| 
       53 
56 
     | 
    
         
             
                    end
         
     | 
| 
       54 
57 
     | 
    
         
             
                  rescue
         
     | 
| 
       55 
58 
     | 
    
         
             
                    ScoutApm::Agent.instance.logger.debug "Background Worker Exception!"
         
     | 
    
        data/lib/scout_apm/config.rb
    CHANGED
    
    | 
         @@ -16,6 +16,8 @@ require 'scout_apm/environment' 
     | 
|
| 
       16 
16 
     | 
    
         
             
            # name             - override the name reported to APM. This is the name that shows in the Web UI
         
     | 
| 
       17 
17 
     | 
    
         
             
            # uri_reporting    - 'path' or 'full_path' default is 'full_path', which reports URL params as well as the path.
         
     | 
| 
       18 
18 
     | 
    
         
             
            # report_format    - 'json' or 'marshal'. Marshal is legacy and will be removed.
         
     | 
| 
      
 19 
     | 
    
         
            +
            # dev_trace        - true or false. Enables always-on tracing in development environmen only
         
     | 
| 
      
 20 
     | 
    
         
            +
            # enable_background_jobs - true or false
         
     | 
| 
       19 
21 
     | 
    
         
             
            #
         
     | 
| 
       20 
22 
     | 
    
         
             
            # Any of these config settings can be set with an environment variable prefixed
         
     | 
| 
       21 
23 
     | 
    
         
             
            # by SCOUT_ and uppercasing the key: SCOUT_LOG_LEVEL for instance.
         
     | 
| 
         @@ -27,12 +29,77 @@ require 'scout_apm/environment' 
     | 
|
| 
       27 
29 
     | 
    
         | 
| 
       28 
30 
     | 
    
         
             
            module ScoutApm
         
     | 
| 
       29 
31 
     | 
    
         
             
              class Config
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
                ################################################################################
         
     | 
| 
      
 34 
     | 
    
         
            +
                # Coersions
         
     | 
| 
      
 35 
     | 
    
         
            +
                #
         
     | 
| 
      
 36 
     | 
    
         
            +
                # Since we get values from environment variables, which are always strings,
         
     | 
| 
      
 37 
     | 
    
         
            +
                # we need to be able to coerce them into the correct data type.  For
         
     | 
| 
      
 38 
     | 
    
         
            +
                # instance, setting "SCOUT_ENABLE=false" should be interpreted as being the
         
     | 
| 
      
 39 
     | 
    
         
            +
                # boolean false, not a string that is present & true.
         
     | 
| 
      
 40 
     | 
    
         
            +
                #
         
     | 
| 
      
 41 
     | 
    
         
            +
                # Similarly, this will help parsing YAML configurations if the user has a
         
     | 
| 
      
 42 
     | 
    
         
            +
                # key like:
         
     | 
| 
      
 43 
     | 
    
         
            +
                #   monitor: "false"
         
     | 
| 
      
 44 
     | 
    
         
            +
                ################################################################################
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
                # Any boolean is passed through
         
     | 
| 
      
 47 
     | 
    
         
            +
                # A string is false iff it is 0 length, is "f", or "false" - otherwise true
         
     | 
| 
      
 48 
     | 
    
         
            +
                # An number is false if it is exactly 0
         
     | 
| 
      
 49 
     | 
    
         
            +
                # Other types are false
         
     | 
| 
      
 50 
     | 
    
         
            +
                class BooleanCoercion
         
     | 
| 
      
 51 
     | 
    
         
            +
                  def coerce(val)
         
     | 
| 
      
 52 
     | 
    
         
            +
                    case val
         
     | 
| 
      
 53 
     | 
    
         
            +
                    when NilClass
         
     | 
| 
      
 54 
     | 
    
         
            +
                      false
         
     | 
| 
      
 55 
     | 
    
         
            +
                    when TrueClass
         
     | 
| 
      
 56 
     | 
    
         
            +
                      val
         
     | 
| 
      
 57 
     | 
    
         
            +
                    when FalseClass
         
     | 
| 
      
 58 
     | 
    
         
            +
                      val
         
     | 
| 
      
 59 
     | 
    
         
            +
                    when String
         
     | 
| 
      
 60 
     | 
    
         
            +
                      coerce_string(val)
         
     | 
| 
      
 61 
     | 
    
         
            +
                    when Numeric
         
     | 
| 
      
 62 
     | 
    
         
            +
                      val != 0
         
     | 
| 
      
 63 
     | 
    
         
            +
                    else
         
     | 
| 
      
 64 
     | 
    
         
            +
                      false
         
     | 
| 
      
 65 
     | 
    
         
            +
                    end
         
     | 
| 
      
 66 
     | 
    
         
            +
                  end
         
     | 
| 
      
 67 
     | 
    
         
            +
             
     | 
| 
      
 68 
     | 
    
         
            +
                  def coerce_string(val)
         
     | 
| 
      
 69 
     | 
    
         
            +
                    val = val.downcase.strip
         
     | 
| 
      
 70 
     | 
    
         
            +
                    return false if val.length == 0
         
     | 
| 
      
 71 
     | 
    
         
            +
                    return false if val == "f"
         
     | 
| 
      
 72 
     | 
    
         
            +
                    return false if val == "false"
         
     | 
| 
      
 73 
     | 
    
         
            +
             
     | 
| 
      
 74 
     | 
    
         
            +
                    true
         
     | 
| 
      
 75 
     | 
    
         
            +
                  end
         
     | 
| 
      
 76 
     | 
    
         
            +
                end
         
     | 
| 
      
 77 
     | 
    
         
            +
             
     | 
| 
      
 78 
     | 
    
         
            +
                # Simply returns the passed in value, without change
         
     | 
| 
      
 79 
     | 
    
         
            +
                class NullCoercion
         
     | 
| 
      
 80 
     | 
    
         
            +
                  def coerce(val)
         
     | 
| 
      
 81 
     | 
    
         
            +
                    val
         
     | 
| 
      
 82 
     | 
    
         
            +
                  end
         
     | 
| 
      
 83 
     | 
    
         
            +
                end
         
     | 
| 
      
 84 
     | 
    
         
            +
             
     | 
| 
      
 85 
     | 
    
         
            +
                SETTING_COERCIONS = {
         
     | 
| 
      
 86 
     | 
    
         
            +
                  "monitor"                => BooleanCoercion.new,
         
     | 
| 
      
 87 
     | 
    
         
            +
                  "enable_background_jobs" => BooleanCoercion.new,
         
     | 
| 
      
 88 
     | 
    
         
            +
                  "dev_trace"              => BooleanCoercion.new,
         
     | 
| 
      
 89 
     | 
    
         
            +
                }
         
     | 
| 
      
 90 
     | 
    
         
            +
             
     | 
| 
      
 91 
     | 
    
         
            +
             
     | 
| 
      
 92 
     | 
    
         
            +
                ################################################################################
         
     | 
| 
      
 93 
     | 
    
         
            +
                # Configuration layers & reading
         
     | 
| 
      
 94 
     | 
    
         
            +
                ################################################################################
         
     | 
| 
      
 95 
     | 
    
         
            +
             
     | 
| 
       30 
96 
     | 
    
         
             
                # Load up a config instance without attempting to load a file.
         
     | 
| 
       31 
97 
     | 
    
         
             
                # Useful for bootstrapping.
         
     | 
| 
       32 
98 
     | 
    
         
             
                def self.without_file
         
     | 
| 
       33 
99 
     | 
    
         
             
                  overlays = [
         
     | 
| 
       34 
100 
     | 
    
         
             
                    ConfigEnvironment.new,
         
     | 
| 
       35 
101 
     | 
    
         
             
                    ConfigDefaults.new,
         
     | 
| 
      
 102 
     | 
    
         
            +
                    ConfigNull.new,
         
     | 
| 
       36 
103 
     | 
    
         
             
                  ]
         
     | 
| 
       37 
104 
     | 
    
         
             
                  new(overlays)
         
     | 
| 
       38 
105 
     | 
    
         
             
                end
         
     | 
| 
         @@ -45,6 +112,7 @@ module ScoutApm 
     | 
|
| 
       45 
112 
     | 
    
         
             
                    ConfigEnvironment.new,
         
     | 
| 
       46 
113 
     | 
    
         
             
                    ConfigFile.new(file_path, config[:file]),
         
     | 
| 
       47 
114 
     | 
    
         
             
                    ConfigDefaults.new,
         
     | 
| 
      
 115 
     | 
    
         
            +
                    ConfigNull.new,
         
     | 
| 
       48 
116 
     | 
    
         
             
                  ]
         
     | 
| 
       49 
117 
     | 
    
         
             
                  new(overlays)
         
     | 
| 
       50 
118 
     | 
    
         
             
                end
         
     | 
| 
         @@ -54,13 +122,10 @@ module ScoutApm 
     | 
|
| 
       54 
122 
     | 
    
         
             
                end
         
     | 
| 
       55 
123 
     | 
    
         | 
| 
       56 
124 
     | 
    
         
             
                def value(key)
         
     | 
| 
       57 
     | 
    
         
            -
                  @overlays. 
     | 
| 
       58 
     | 
    
         
            -
                    if overlay.has_key?(key)
         
     | 
| 
       59 
     | 
    
         
            -
                      return overlay.value(key)
         
     | 
| 
       60 
     | 
    
         
            -
                    end
         
     | 
| 
       61 
     | 
    
         
            -
                  end
         
     | 
| 
      
 125 
     | 
    
         
            +
                  raw_value = @overlays.detect{ |overlay| overlay.has_key?(key) }.value(key)
         
     | 
| 
       62 
126 
     | 
    
         | 
| 
       63 
     | 
    
         
            -
                   
     | 
| 
      
 127 
     | 
    
         
            +
                  coercion = SETTING_COERCIONS[key] || NullCoercion.new
         
     | 
| 
      
 128 
     | 
    
         
            +
                  coercion.coerce(raw_value)
         
     | 
| 
       64 
129 
     | 
    
         
             
                end
         
     | 
| 
       65 
130 
     | 
    
         | 
| 
       66 
131 
     | 
    
         
             
                class ConfigDefaults
         
     | 
| 
         @@ -73,7 +138,7 @@ module ScoutApm 
     | 
|
| 
       73 
138 
     | 
    
         
             
                    'disabled_instruments'   => [],
         
     | 
| 
       74 
139 
     | 
    
         
             
                    'enable_background_jobs' => true,
         
     | 
| 
       75 
140 
     | 
    
         
             
                    'ignore_traces' => [],
         
     | 
| 
       76 
     | 
    
         
            -
                    ' 
     | 
| 
      
 141 
     | 
    
         
            +
                    'dev_trace' => false, # false for now so code can live in main branch
         
     | 
| 
       77 
142 
     | 
    
         
             
                  }.freeze
         
     | 
| 
       78 
143 
     | 
    
         | 
| 
       79 
144 
     | 
    
         
             
                  def value(key)
         
     | 
| 
         @@ -85,6 +150,20 @@ module ScoutApm 
     | 
|
| 
       85 
150 
     | 
    
         
             
                  end
         
     | 
| 
       86 
151 
     | 
    
         
             
                end
         
     | 
| 
       87 
152 
     | 
    
         | 
| 
      
 153 
     | 
    
         
            +
             
     | 
| 
      
 154 
     | 
    
         
            +
                # Good News: It has every config value you could want
         
     | 
| 
      
 155 
     | 
    
         
            +
                # Bad News: The content of that config value is always nil
         
     | 
| 
      
 156 
     | 
    
         
            +
                # Used for the null-object pattern
         
     | 
| 
      
 157 
     | 
    
         
            +
                class ConfigNull
         
     | 
| 
      
 158 
     | 
    
         
            +
                  def value(*)
         
     | 
| 
      
 159 
     | 
    
         
            +
                    nil
         
     | 
| 
      
 160 
     | 
    
         
            +
                  end
         
     | 
| 
      
 161 
     | 
    
         
            +
             
     | 
| 
      
 162 
     | 
    
         
            +
                  def has_key?(*)
         
     | 
| 
      
 163 
     | 
    
         
            +
                    true
         
     | 
| 
      
 164 
     | 
    
         
            +
                  end
         
     | 
| 
      
 165 
     | 
    
         
            +
                end
         
     | 
| 
      
 166 
     | 
    
         
            +
             
     | 
| 
       88 
167 
     | 
    
         
             
                class ConfigEnvironment
         
     | 
| 
       89 
168 
     | 
    
         
             
                  def value(key)
         
     | 
| 
       90 
169 
     | 
    
         
             
                    val = ENV[key_to_env_key(key)]
         
     | 
| 
         @@ -165,6 +244,7 @@ module ScoutApm 
     | 
|
| 
       165 
244 
     | 
    
         
             
                  def app_environment
         
     | 
| 
       166 
245 
     | 
    
         
             
                    @config[:environment] || ScoutApm::Environment.instance.env
         
     | 
| 
       167 
246 
     | 
    
         
             
                  end
         
     | 
| 
      
 247 
     | 
    
         
            +
             
     | 
| 
       168 
248 
     | 
    
         
             
                  def logger
         
     | 
| 
       169 
249 
     | 
    
         
             
                    if ScoutApm::Agent.instance.logger
         
     | 
| 
       170 
250 
     | 
    
         
             
                      return ScoutApm::Agent.instance.logger
         
     | 
| 
         @@ -1,35 +1,9 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            <!-- Added by Scout DevTrace -->
         
     | 
| 
       1 
2 
     | 
    
         
             
            <script language="JavaScript">
         
     | 
| 
       2 
     | 
    
         
            -
            (function() {
         
     | 
| 
       3 
     | 
    
         
            -
             
     | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
     | 
    
         
            -
             
     | 
| 
       6 
     | 
    
         
            -
             
     | 
| 
       7 
     | 
    
         
            -
                 
     | 
| 
       8 
     | 
    
         
            -
                return open.apply(this, arguments);
         
     | 
| 
       9 
     | 
    
         
            -
              }
         
     | 
| 
       10 
     | 
    
         
            -
              function sendReplacement(data) {
         
     | 
| 
       11 
     | 
    
         
            -
                if (this.onload) {
         
     | 
| 
       12 
     | 
    
         
            -
                  this._onload = this.onload;
         
     | 
| 
       13 
     | 
    
         
            -
                }
         
     | 
| 
       14 
     | 
    
         
            -
                this.onload = onLoadReplacement;
         
     | 
| 
       15 
     | 
    
         
            -
                return send.apply(this, arguments);
         
     | 
| 
       16 
     | 
    
         
            -
              }
         
     | 
| 
       17 
     | 
    
         
            -
              function onLoadReplacement() {
         
     | 
| 
       18 
     | 
    
         
            -
                try {
         
     | 
| 
       19 
     | 
    
         
            -
                  traceText = this.getResponseHeader("X-scoutapminstant");
         
     | 
| 
       20 
     | 
    
         
            -
                  if(traceText){
         
     | 
| 
       21 
     | 
    
         
            -
                    //console.info("Got an AJAX instrumentation with "+traceText.length.toString()+" characters.")
         
     | 
| 
       22 
     | 
    
         
            -
                    setTimeout(function(){ window.scoutInstant("addTrace",traceText) },0);
         
     | 
| 
       23 
     | 
    
         
            -
                  }
         
     | 
| 
       24 
     | 
    
         
            -
                } catch(e){
         
     | 
| 
       25 
     | 
    
         
            -
                  console.debug("Problem getting X-scoutapminstant header");
         
     | 
| 
       26 
     | 
    
         
            -
                  console.debug(e);
         
     | 
| 
       27 
     | 
    
         
            -
                }
         
     | 
| 
       28 
     | 
    
         
            -
                if (this._onload) {
         
     | 
| 
       29 
     | 
    
         
            -
                  return this._onload.apply(this, arguments);
         
     | 
| 
       30 
     | 
    
         
            -
                }
         
     | 
| 
       31 
     | 
    
         
            -
              }
         
     | 
| 
       32 
     | 
    
         
            -
              window.XMLHttpRequest.prototype.open = openReplacement;
         
     | 
| 
       33 
     | 
    
         
            -
              window.XMLHttpRequest.prototype.send = sendReplacement;
         
     | 
| 
       34 
     | 
    
         
            -
            })();
         
     | 
| 
      
 3 
     | 
    
         
            +
              (function(){var open=window.XMLHttpRequest.prototype.open;var send=window.XMLHttpRequest.prototype.send;function openReplacement(method,url,async,user,password){this._url=url;return open.apply(this,arguments);}
         
     | 
| 
      
 4 
     | 
    
         
            +
                function sendReplacement(data){if(this.onload){this._onload=this.onload;}
         
     | 
| 
      
 5 
     | 
    
         
            +
                  this.onload=onLoadReplacement;return send.apply(this,arguments);}
         
     | 
| 
      
 6 
     | 
    
         
            +
                function onLoadReplacement(){if(this._url.startsWith(window.location.protocol+"//"+window.location.host)||!this._url.startsWith("http")){try{traceText=this.getResponseHeader("X-scoutapminstant");if(traceText){setTimeout(function(){window.scoutInstant("addTrace",traceText)},0);}}catch(e){console.debug("Problem getting X-scoutapminstant header");}}
         
     | 
| 
      
 7 
     | 
    
         
            +
                  if(this._onload){return this._onload.apply(this,arguments);}}
         
     | 
| 
      
 8 
     | 
    
         
            +
                window.XMLHttpRequest.prototype.open=openReplacement;window.XMLHttpRequest.prototype.send=sendReplacement;})();
         
     | 
| 
       35 
9 
     | 
    
         
             
            </script>
         
     | 
| 
         @@ -47,17 +47,22 @@ module ScoutApm 
     | 
|
| 
       47 
47 
     | 
    
         
             
                  def call(env)
         
     | 
| 
       48 
48 
     | 
    
         
             
                    status, headers, response = @app.call(env)
         
     | 
| 
       49 
49 
     | 
    
         | 
| 
       50 
     | 
    
         
            -
                    if ScoutApm::Agent.instance.config.value(' 
     | 
| 
      
 50 
     | 
    
         
            +
                    if ScoutApm::Agent.instance.config.value('dev_trace')
         
     | 
| 
       51 
51 
     | 
    
         
             
                      if response.respond_to?(:body)
         
     | 
| 
       52 
52 
     | 
    
         
             
                        req = ScoutApm::RequestManager.lookup
         
     | 
| 
       53 
53 
     | 
    
         
             
                        slow_converter = LayerConverters::SlowRequestConverter.new(req)
         
     | 
| 
       54 
54 
     | 
    
         
             
                        trace = slow_converter.call
         
     | 
| 
       55 
55 
     | 
    
         
             
                        if trace
         
     | 
| 
      
 56 
     | 
    
         
            +
                          metadata = {
         
     | 
| 
      
 57 
     | 
    
         
            +
                              :app_root      => ScoutApm::Environment.instance.root.to_s,
         
     | 
| 
      
 58 
     | 
    
         
            +
                              :unique_id     => env['action_dispatch.request_id'], # note, this is a different unique_id than what "normal" payloads use
         
     | 
| 
      
 59 
     | 
    
         
            +
                              :agent_version => ScoutApm::VERSION,
         
     | 
| 
      
 60 
     | 
    
         
            +
                              :platform      => "ruby",
         
     | 
| 
      
 61 
     | 
    
         
            +
                          }
         
     | 
| 
       56 
62 
     | 
    
         
             
                          hash = ScoutApm::Serializers::PayloadSerializerToJson.rearrange_slow_transaction(trace)
         
     | 
| 
       57 
     | 
    
         
            -
                          hash.merge!( 
     | 
| 
      
 63 
     | 
    
         
            +
                          hash.merge!(metadata:metadata)
         
     | 
| 
       58 
64 
     | 
    
         
             
                          payload = ScoutApm::Serializers::PayloadSerializerToJson.jsonify_hash(hash)
         
     | 
| 
       59 
65 
     | 
    
         | 
| 
       60 
     | 
    
         
            -
             
     | 
| 
       61 
66 
     | 
    
         
             
                          if env['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest'
         
     | 
| 
       62 
67 
     | 
    
         
             
                            # Add the payload as a header if it's an AJAX call
         
     | 
| 
       63 
68 
     | 
    
         
             
                            headers['X-scoutapminstant'] = payload
         
     | 
| 
         @@ -31,10 +31,10 @@ module ScoutApm 
     | 
|
| 
       31 
31 
     | 
    
         
             
                    payload = ScoutApm::Serializers::PayloadSerializer.serialize(metadata, metrics, traces, jobs, slow_jobs)
         
     | 
| 
       32 
32 
     | 
    
         | 
| 
       33 
33 
     | 
    
         
             
                    # Hand it off to the reporter for POST to our servers
         
     | 
| 
       34 
     | 
    
         
            -
                    reporter = Reporter.new(:instant_trace,  
     | 
| 
      
 34 
     | 
    
         
            +
                    reporter = Reporter.new(:instant_trace, Agent.instance.config, Agent.instance.logger, @instant_key)
         
     | 
| 
       35 
35 
     | 
    
         
             
                    reporter.report(payload, {'Content-Type' => 'application/json'} )
         
     | 
| 
       36 
36 
     | 
    
         
             
                  end
         
     | 
| 
       37 
37 
     | 
    
         
             
                end
         
     | 
| 
       38 
38 
     | 
    
         | 
| 
       39 
39 
     | 
    
         
             
              end
         
     | 
| 
       40 
     | 
    
         
            -
            end
         
     | 
| 
      
 40 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -17,7 +17,7 @@ module ScoutApm 
     | 
|
| 
       17 
17 
     | 
    
         | 
| 
       18 
18 
     | 
    
         
             
                    # Mongoid versions that use Moped should instrument Moped.
         
     | 
| 
       19 
19 
     | 
    
         
             
                    if defined?(::Mongoid) and !defined?(::Moped)
         
     | 
| 
       20 
     | 
    
         
            -
                      ScoutApm::Agent.instance.logger.info "Instrumenting Mongoid"
         
     | 
| 
      
 20 
     | 
    
         
            +
                      ScoutApm::Agent.instance.logger.info "Instrumenting Mongoid 2.x"
         
     | 
| 
       21 
21 
     | 
    
         | 
| 
       22 
22 
     | 
    
         
             
                      ### OLD (2.x) mongoids
         
     | 
| 
       23 
23 
     | 
    
         
             
                      if defined?(::Mongoid::Collection)
         
     | 
| 
         @@ -33,6 +33,7 @@ module ScoutApm 
     | 
|
| 
       33 
33 
     | 
    
         | 
| 
       34 
34 
     | 
    
         
             
                      ### 5.x Mongoid
         
     | 
| 
       35 
35 
     | 
    
         
             
                      if mongoid_v5? && defined?(::Mongoid::Contextual::Mongo)
         
     | 
| 
      
 36 
     | 
    
         
            +
                        ScoutApm::Agent.instance.logger.info "Instrumenting Mongoid 5.x"
         
     | 
| 
       36 
37 
     | 
    
         
             
                        # All the public methods from Mongoid::Contextual::Mongo.
         
     | 
| 
       37 
38 
     | 
    
         
             
                        # TODO: Geo and MapReduce support (?). They are in other Contextual::* classes
         
     | 
| 
       38 
39 
     | 
    
         
             
                        methods = [
         
     | 
| 
         @@ -46,8 +47,8 @@ module ScoutApm 
     | 
|
| 
       46 
47 
     | 
    
         | 
| 
       47 
48 
     | 
    
         
             
                        methods.each do |method|
         
     | 
| 
       48 
49 
     | 
    
         
             
                          if ::Mongoid::Contextual::Mongo.method_defined?(method)
         
     | 
| 
       49 
     | 
    
         
            -
                            with_scout_instruments = %Q 
     | 
| 
       50 
     | 
    
         
            -
                            def #{method}_with_scout_instruments(*args)
         
     | 
| 
      
 50 
     | 
    
         
            +
                            with_scout_instruments = %Q[
         
     | 
| 
      
 51 
     | 
    
         
            +
                            def #{method}_with_scout_instruments(*args, &block)
         
     | 
| 
       51 
52 
     | 
    
         | 
| 
       52 
53 
     | 
    
         
             
                              req = ScoutApm::RequestManager.lookup
         
     | 
| 
       53 
54 
     | 
    
         
             
                              *db, collection = view.collection.namespace.split(".")
         
     | 
| 
         @@ -60,7 +61,7 @@ module ScoutApm 
     | 
|
| 
       60 
61 
     | 
    
         | 
| 
       61 
62 
     | 
    
         
             
                              req.start_layer( layer )
         
     | 
| 
       62 
63 
     | 
    
         
             
                              begin
         
     | 
| 
       63 
     | 
    
         
            -
                                #{method}_without_scout_instruments
         
     | 
| 
      
 64 
     | 
    
         
            +
                                #{method}_without_scout_instruments(*args, &block)
         
     | 
| 
       64 
65 
     | 
    
         
             
                              ensure
         
     | 
| 
       65 
66 
     | 
    
         
             
                                req.stop_layer
         
     | 
| 
       66 
67 
     | 
    
         
             
                              end
         
     | 
| 
         @@ -68,7 +69,7 @@ module ScoutApm 
     | 
|
| 
       68 
69 
     | 
    
         | 
| 
       69 
70 
     | 
    
         
             
                            alias_method :#{method}_without_scout_instruments, :#{method}
         
     | 
| 
       70 
71 
     | 
    
         
             
                            alias_method :#{method}, :#{method}_with_scout_instruments
         
     | 
| 
       71 
     | 
    
         
            -
                             
     | 
| 
      
 72 
     | 
    
         
            +
                            ]
         
     | 
| 
       72 
73 
     | 
    
         | 
| 
       73 
74 
     | 
    
         
             
                            ::Mongoid::Contextual::Mongo.class_eval(with_scout_instruments)
         
     | 
| 
       74 
75 
     | 
    
         
             
                          end
         
     | 
| 
         @@ -39,7 +39,8 @@ module ScoutApm 
     | 
|
| 
       39 
39 
     | 
    
         
             
                # this is set in the controller instumentation (ActionControllerRails3Rails4 according)
         
     | 
| 
       40 
40 
     | 
    
         
             
                attr_accessor :instant_key
         
     | 
| 
       41 
41 
     | 
    
         | 
| 
       42 
     | 
    
         
            -
                 
     | 
| 
      
 42 
     | 
    
         
            +
                # Whereas the instant_key gets set per-request in reponse to a URL param, dev_trace is set in the config file
         
     | 
| 
      
 43 
     | 
    
         
            +
                attr_accessor :dev_trace
         
     | 
| 
       43 
44 
     | 
    
         | 
| 
       44 
45 
     | 
    
         
             
                def initialize(store)
         
     | 
| 
       45 
46 
     | 
    
         
             
                  @store = store #this is passed in so we can use a real store (normal operation) or fake store (instant mode only)
         
     | 
| 
         @@ -52,6 +53,7 @@ module ScoutApm 
     | 
|
| 
       52 
53 
     | 
    
         
             
                  @error = false
         
     | 
| 
       53 
54 
     | 
    
         
             
                  @instant_key = nil
         
     | 
| 
       54 
55 
     | 
    
         
             
                  @mem_start = mem_usage
         
     | 
| 
      
 56 
     | 
    
         
            +
                  @dev_trace =  ScoutApm::Agent.instance.config.value('dev_trace') && Rails.env.development?
         
     | 
| 
       55 
57 
     | 
    
         
             
                end
         
     | 
| 
       56 
58 
     | 
    
         | 
| 
       57 
59 
     | 
    
         
             
                def start_layer(layer)
         
     | 
| 
         @@ -118,7 +120,7 @@ module ScoutApm 
     | 
|
| 
       118 
120 
     | 
    
         
             
                  return false unless (web? || job?)
         
     | 
| 
       119 
121 
     | 
    
         | 
| 
       120 
122 
     | 
    
         
             
                  # Capture any individually slow layer.
         
     | 
| 
       121 
     | 
    
         
            -
                  return true if layer.total_exclusive_time >  
     | 
| 
      
 123 
     | 
    
         
            +
                  return true if layer.total_exclusive_time > backtrace_threshold
         
     | 
| 
       122 
124 
     | 
    
         | 
| 
       123 
125 
     | 
    
         
             
                  # Capture any layer that we've seen many times. Captures n+1 problems
         
     | 
| 
       124 
126 
     | 
    
         
             
                  return true if @call_set[layer.name].capture_backtrace?
         
     | 
| 
         @@ -308,5 +310,11 @@ module ScoutApm 
     | 
|
| 
       308 
310 
     | 
    
         
             
                def ignoring_children?
         
     | 
| 
       309 
311 
     | 
    
         
             
                  @ignoring_children
         
     | 
| 
       310 
312 
     | 
    
         
             
                end
         
     | 
| 
      
 313 
     | 
    
         
            +
             
     | 
| 
      
 314 
     | 
    
         
            +
                # Grab backtraces more aggressively when running in dev trace mode
         
     | 
| 
      
 315 
     | 
    
         
            +
                def backtrace_threshold
         
     | 
| 
      
 316 
     | 
    
         
            +
                  dev_trace ? 0.05 : 0.5 # the minimum threshold in seconds to record the backtrace for a metric.
         
     | 
| 
      
 317 
     | 
    
         
            +
                end
         
     | 
| 
      
 318 
     | 
    
         
            +
             
     | 
| 
       311 
319 
     | 
    
         
             
              end
         
     | 
| 
       312 
320 
     | 
    
         
             
            end
         
     | 
    
        data/lib/scout_apm/version.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: scout_apm
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 2.0.0 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 2.0.0
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Derek Haynes
         
     | 
| 
         @@ -9,7 +9,7 @@ authors: 
     | 
|
| 
       9 
9 
     | 
    
         
             
            autorequire: 
         
     | 
| 
       10 
10 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       11 
11 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       12 
     | 
    
         
            -
            date: 2016- 
     | 
| 
      
 12 
     | 
    
         
            +
            date: 2016-08-08 00:00:00.000000000 Z
         
     | 
| 
       13 
13 
     | 
    
         
             
            dependencies:
         
     | 
| 
       14 
14 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       15 
15 
     | 
    
         
             
              name: rusage
         
     | 
| 
         @@ -252,12 +252,12 @@ required_ruby_version: !ruby/object:Gem::Requirement 
     | 
|
| 
       252 
252 
     | 
    
         
             
                  version: '0'
         
     | 
| 
       253 
253 
     | 
    
         
             
            required_rubygems_version: !ruby/object:Gem::Requirement
         
     | 
| 
       254 
254 
     | 
    
         
             
              requirements:
         
     | 
| 
       255 
     | 
    
         
            -
              - - " 
     | 
| 
      
 255 
     | 
    
         
            +
              - - ">="
         
     | 
| 
       256 
256 
     | 
    
         
             
                - !ruby/object:Gem::Version
         
     | 
| 
       257 
     | 
    
         
            -
                  version:  
     | 
| 
      
 257 
     | 
    
         
            +
                  version: '0'
         
     | 
| 
       258 
258 
     | 
    
         
             
            requirements: []
         
     | 
| 
       259 
259 
     | 
    
         
             
            rubyforge_project: scout_apm
         
     | 
| 
       260 
     | 
    
         
            -
            rubygems_version: 2.6 
     | 
| 
      
 260 
     | 
    
         
            +
            rubygems_version: 2.4.6
         
     | 
| 
       261 
261 
     | 
    
         
             
            signing_key: 
         
     | 
| 
       262 
262 
     | 
    
         
             
            specification_version: 4
         
     | 
| 
       263 
263 
     | 
    
         
             
            summary: Ruby application performance monitoring
         
     | 
| 
         @@ -278,4 +278,3 @@ test_files: 
     | 
|
| 
       278 
278 
     | 
    
         
             
            - test/unit/slow_request_policy_test.rb
         
     | 
| 
       279 
279 
     | 
    
         
             
            - test/unit/sql_sanitizer_test.rb
         
     | 
| 
       280 
280 
     | 
    
         
             
            - test/unit/utils/active_record_metric_name_test.rb
         
     | 
| 
       281 
     | 
    
         
            -
            has_rdoc: 
         
     |