ddtrace 0.12.1 → 0.13.0.beta1
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/.env +11 -21
- data/.rubocop.yml +1 -4
- data/Appraisals +75 -439
- data/CHANGELOG.md +16 -19
- data/Rakefile +89 -259
- data/circle.yml +69 -0
- data/ddtrace.gemspec +6 -6
- data/docker-compose.yml +37 -222
- data/docs/GettingStarted.md +260 -19
- data/gemfiles/contrib.gemfile +5 -0
- data/gemfiles/contrib_old.gemfile +4 -1
- data/gemfiles/rails30_postgres.gemfile +0 -1
- data/gemfiles/rails30_postgres_sidekiq.gemfile +0 -1
- data/gemfiles/rails32_mysql2.gemfile +0 -1
- data/gemfiles/rails32_postgres.gemfile +0 -1
- data/gemfiles/rails32_postgres_redis.gemfile +0 -1
- data/gemfiles/rails32_postgres_sidekiq.gemfile +0 -1
- data/gemfiles/rails5_mysql2.gemfile +1 -1
- data/gemfiles/rails5_postgres.gemfile +1 -1
- data/gemfiles/rails5_postgres_redis.gemfile +1 -1
- data/gemfiles/rails5_postgres_sidekiq.gemfile +1 -1
- data/lib/ddtrace.rb +6 -0
- data/lib/ddtrace/configuration.rb +2 -2
- data/lib/ddtrace/contrib/active_model_serializers/event.rb +57 -0
- data/lib/ddtrace/contrib/active_model_serializers/events.rb +30 -0
- data/lib/ddtrace/contrib/active_model_serializers/events/render.rb +32 -0
- data/lib/ddtrace/contrib/active_model_serializers/events/serialize.rb +35 -0
- data/lib/ddtrace/contrib/active_model_serializers/patcher.rb +62 -0
- data/lib/ddtrace/contrib/active_record/event.rb +30 -0
- data/lib/ddtrace/contrib/active_record/events.rb +30 -0
- data/lib/ddtrace/contrib/active_record/events/instantiation.rb +51 -0
- data/lib/ddtrace/contrib/active_record/events/sql.rb +48 -0
- data/lib/ddtrace/contrib/active_record/patcher.rb +3 -73
- data/lib/ddtrace/contrib/active_record/utils.rb +1 -15
- data/lib/ddtrace/contrib/active_support/notifications/event.rb +62 -0
- data/lib/ddtrace/contrib/aws/instrumentation.rb +2 -2
- data/lib/ddtrace/contrib/elasticsearch/patcher.rb +2 -2
- data/lib/ddtrace/contrib/elasticsearch/quantize.rb +8 -40
- data/lib/ddtrace/contrib/excon/middleware.rb +140 -0
- data/lib/ddtrace/contrib/excon/patcher.rb +50 -0
- data/lib/ddtrace/contrib/grpc/datadog_interceptor.rb +65 -0
- data/lib/ddtrace/contrib/grpc/datadog_interceptor/client.rb +49 -0
- data/lib/ddtrace/contrib/grpc/datadog_interceptor/server.rb +66 -0
- data/lib/ddtrace/contrib/grpc/intercept_with_datadog.rb +49 -0
- data/lib/ddtrace/contrib/grpc/patcher.rb +62 -0
- data/lib/ddtrace/contrib/http/patcher.rb +16 -18
- data/lib/ddtrace/contrib/racecar/event.rb +61 -0
- data/lib/ddtrace/contrib/racecar/events.rb +30 -0
- data/lib/ddtrace/contrib/racecar/events/batch.rb +27 -0
- data/lib/ddtrace/contrib/racecar/events/message.rb +27 -0
- data/lib/ddtrace/contrib/racecar/patcher.rb +6 -52
- data/lib/ddtrace/contrib/rack/middlewares.rb +65 -11
- data/lib/ddtrace/contrib/rack/patcher.rb +16 -0
- data/lib/ddtrace/contrib/rack/request_queue.rb +34 -0
- data/lib/ddtrace/contrib/rails/action_view.rb +65 -0
- data/lib/ddtrace/contrib/rails/active_support.rb +8 -9
- data/lib/ddtrace/contrib/rails/core_extensions.rb +115 -74
- data/lib/ddtrace/contrib/rake/instrumentation.rb +70 -0
- data/lib/ddtrace/contrib/rake/patcher.rb +53 -0
- data/lib/ddtrace/contrib/sequel/database.rb +58 -0
- data/lib/ddtrace/contrib/sequel/dataset.rb +59 -0
- data/lib/ddtrace/contrib/sequel/patcher.rb +56 -0
- data/lib/ddtrace/contrib/sequel/utils.rb +28 -0
- data/lib/ddtrace/ext/distributed.rb +5 -0
- data/lib/ddtrace/ext/grpc.rb +7 -0
- data/lib/ddtrace/ext/http.rb +35 -5
- data/lib/ddtrace/propagation/grpc_propagator.rb +54 -0
- data/lib/ddtrace/quantization/hash.rb +89 -0
- data/lib/ddtrace/tracer.rb +1 -4
- data/lib/ddtrace/utils.rb +4 -10
- data/lib/ddtrace/utils/database.rb +21 -0
- data/lib/ddtrace/version.rb +3 -3
- metadata +38 -13
- data/.circleci/config.yml +0 -456
- data/.circleci/images/primary/Dockerfile-1.9.3 +0 -69
- data/.circleci/images/primary/Dockerfile-2.0.0 +0 -69
- data/.circleci/images/primary/Dockerfile-2.1.10 +0 -69
- data/.circleci/images/primary/Dockerfile-2.2.10 +0 -69
- data/.circleci/images/primary/Dockerfile-2.3.7 +0 -73
- data/.circleci/images/primary/Dockerfile-2.4.4 +0 -73
- data/lib/ddtrace/contrib/rails/action_controller_patch.rb +0 -77
| @@ -17,6 +17,7 @@ module Datadog | |
| 17 17 |  | 
| 18 18 | 
             
                    def self.start_trace_cache(payload)
         | 
| 19 19 | 
             
                      tracer = Datadog.configuration[:rails][:tracer]
         | 
| 20 | 
            +
                      tracing_context = payload.fetch(:tracing_context)
         | 
| 20 21 |  | 
| 21 22 | 
             
                      # In most of the cases Rails ``fetch()`` and ``read()`` calls are nested.
         | 
| 22 23 | 
             
                      # This check ensures that two reads are not nested since they don't provide
         | 
| @@ -24,16 +25,14 @@ module Datadog | |
| 24 25 | 
             
                      # NOTE: the ``finish_trace_cache()`` is fired but it already has a safe-guard
         | 
| 25 26 | 
             
                      # to avoid any kind of issue.
         | 
| 26 27 | 
             
                      current_span = tracer.active_span
         | 
| 27 | 
            -
                      return if  | 
| 28 | 
            -
                                current_span.try( | 
| 29 | 
            -
                                 | 
| 30 | 
            -
             | 
| 31 | 
            -
                      tracing_context = payload.fetch(:tracing_context)
         | 
| 28 | 
            +
                      return if current_span.try('name') == 'rails.cache' &&
         | 
| 29 | 
            +
                                current_span.try('resource') == 'GET' &&
         | 
| 30 | 
            +
                                payload[:action] == 'GET'
         | 
| 32 31 |  | 
| 33 32 | 
             
                      # create a new ``Span`` and add it to the tracing context
         | 
| 34 33 | 
             
                      service = Datadog.configuration[:rails][:cache_service]
         | 
| 35 34 | 
             
                      type = Datadog::Ext::CACHE::TYPE
         | 
| 36 | 
            -
                      span = tracer.trace('rails.cache' | 
| 35 | 
            +
                      span = tracer.trace('rails.cache', service: service, span_type: type)
         | 
| 37 36 | 
             
                      span.resource = payload.fetch(:action)
         | 
| 38 37 | 
             
                      tracing_context[:dd_cache_span] = span
         | 
| 39 38 | 
             
                    rescue StandardError => e
         | 
| @@ -49,12 +48,12 @@ module Datadog | |
| 49 48 | 
             
                      begin
         | 
| 50 49 | 
             
                        # discard parameters from the cache_store configuration
         | 
| 51 50 | 
             
                        store, = *Array.wrap(::Rails.configuration.cache_store).flatten
         | 
| 52 | 
            -
                        span.set_tag('rails.cache.backend' | 
| 51 | 
            +
                        span.set_tag('rails.cache.backend', store)
         | 
| 53 52 | 
             
                        cache_key = Datadog::Utils.truncate(payload.fetch(:key), Ext::CACHE::MAX_KEY_SIZE)
         | 
| 54 | 
            -
                        span.set_tag('rails.cache.key' | 
| 53 | 
            +
                        span.set_tag('rails.cache.key', cache_key)
         | 
| 55 54 | 
             
                        span.set_error(payload[:exception]) if payload[:exception]
         | 
| 56 55 | 
             
                      ensure
         | 
| 57 | 
            -
                        span.finish
         | 
| 56 | 
            +
                        span.finish()
         | 
| 58 57 | 
             
                      end
         | 
| 59 58 | 
             
                    rescue StandardError => e
         | 
| 60 59 | 
             
                      Datadog::Tracer.log.debug(e.message)
         | 
| @@ -6,11 +6,6 @@ module Datadog | |
| 6 6 | 
             
              module RailsRendererPatcher
         | 
| 7 7 | 
             
                include Datadog::Patcher
         | 
| 8 8 |  | 
| 9 | 
            -
                SPAN_NAME_RENDER_PARTIAL = 'rails.render_partial'.freeze
         | 
| 10 | 
            -
                SPAN_NAME_RENDER_TEMPLATE = 'rails.render_template'.freeze
         | 
| 11 | 
            -
                TAG_LAYOUT = 'rails.layout'.freeze
         | 
| 12 | 
            -
                TAG_TEMPLATE_NAME = 'rails.template_name'.freeze
         | 
| 13 | 
            -
             | 
| 14 9 | 
             
                module_function
         | 
| 15 10 |  | 
| 16 11 | 
             
                def patch_renderer
         | 
| @@ -29,22 +24,25 @@ module Datadog | |
| 29 24 | 
             
                end
         | 
| 30 25 |  | 
| 31 26 | 
             
                def patch_template_renderer(klass)
         | 
| 32 | 
            -
                  # rubocop:disable Metrics/BlockLength
         | 
| 33 27 | 
             
                  do_once(:patch_template_renderer) do
         | 
| 34 28 | 
             
                    klass.class_eval do
         | 
| 35 29 | 
             
                      def render_with_datadog(*args, &block)
         | 
| 36 | 
            -
                        #  | 
| 37 | 
            -
                        # | 
| 38 | 
            -
                         | 
| 39 | 
            -
             | 
| 40 | 
            -
                         | 
| 41 | 
            -
                           | 
| 42 | 
            -
                            Datadog::RailsRendererPatcher::SPAN_NAME_RENDER_TEMPLATE,
         | 
| 43 | 
            -
                            span_type: Datadog::Ext::HTTP::TEMPLATE
         | 
| 44 | 
            -
                          ) do |span|
         | 
| 45 | 
            -
                            with_datadog_span(span) { render_without_datadog(*args, &block) }
         | 
| 46 | 
            -
                          end
         | 
| 30 | 
            +
                        # create a tracing context and start the rendering span
         | 
| 31 | 
            +
                        # NOTE: Rails < 3.1 compatibility: preserve the tracing
         | 
| 32 | 
            +
                        # context when a partial is rendered
         | 
| 33 | 
            +
                        @tracing_context ||= {}
         | 
| 34 | 
            +
                        if @tracing_context.empty?
         | 
| 35 | 
            +
                          Datadog::Contrib::Rails::ActionView.start_render_template(tracing_context: @tracing_context)
         | 
| 47 36 | 
             
                        end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                        render_without_datadog(*args, &block)
         | 
| 39 | 
            +
                      rescue Exception => e
         | 
| 40 | 
            +
                        # attach the exception to the tracing context if any
         | 
| 41 | 
            +
                        @tracing_context[:exception] = e
         | 
| 42 | 
            +
                        raise e
         | 
| 43 | 
            +
                      ensure
         | 
| 44 | 
            +
                        # ensure that the template `Span` is finished even during exceptions
         | 
| 45 | 
            +
                        Datadog::Contrib::Rails::ActionView.finish_render_template(tracing_context: @tracing_context)
         | 
| 48 46 | 
             
                      end
         | 
| 49 47 |  | 
| 50 48 | 
             
                      def render_template_with_datadog(*args)
         | 
| @@ -62,19 +60,8 @@ module Datadog | |
| 62 60 | 
             
                                   else
         | 
| 63 61 | 
             
                                     layout_name.try(:[], 'virtual_path')
         | 
| 64 62 | 
             
                                   end
         | 
| 65 | 
            -
                           | 
| 66 | 
            -
             | 
| 67 | 
            -
                              Datadog::RailsRendererPatcher::TAG_TEMPLATE_NAME,
         | 
| 68 | 
            -
                              template_name
         | 
| 69 | 
            -
                            )
         | 
| 70 | 
            -
                          end
         | 
| 71 | 
            -
             | 
| 72 | 
            -
                          if layout
         | 
| 73 | 
            -
                            active_datadog_span.set_tag(
         | 
| 74 | 
            -
                              Datadog::RailsRendererPatcher::TAG_LAYOUT,
         | 
| 75 | 
            -
                              layout
         | 
| 76 | 
            -
                            )
         | 
| 77 | 
            -
                          end
         | 
| 63 | 
            +
                          @tracing_context[:template_name] = template_name
         | 
| 64 | 
            +
                          @tracing_context[:layout] = layout
         | 
| 78 65 | 
             
                        rescue StandardError => e
         | 
| 79 66 | 
             
                          Datadog::Tracer.log.debug(e.message)
         | 
| 80 67 | 
             
                        end
         | 
| @@ -83,21 +70,6 @@ module Datadog | |
| 83 70 | 
             
                        render_template_without_datadog(*args)
         | 
| 84 71 | 
             
                      end
         | 
| 85 72 |  | 
| 86 | 
            -
                      private
         | 
| 87 | 
            -
             | 
| 88 | 
            -
                      attr_accessor :active_datadog_span
         | 
| 89 | 
            -
             | 
| 90 | 
            -
                      def datadog_tracer
         | 
| 91 | 
            -
                        Datadog.configuration[:rails][:tracer]
         | 
| 92 | 
            -
                      end
         | 
| 93 | 
            -
             | 
| 94 | 
            -
                      def with_datadog_span(span)
         | 
| 95 | 
            -
                        self.active_datadog_span = span
         | 
| 96 | 
            -
                        yield
         | 
| 97 | 
            -
                      ensure
         | 
| 98 | 
            -
                        self.active_datadog_span = nil
         | 
| 99 | 
            -
                      end
         | 
| 100 | 
            -
             | 
| 101 73 | 
             
                      # method aliasing to patch the class
         | 
| 102 74 | 
             
                      alias_method :render_without_datadog, :render
         | 
| 103 75 | 
             
                      alias_method :render, :render_with_datadog
         | 
| @@ -118,23 +90,30 @@ module Datadog | |
| 118 90 | 
             
                  do_once(:patch_partial_renderer) do
         | 
| 119 91 | 
             
                    klass.class_eval do
         | 
| 120 92 | 
             
                      def render_with_datadog(*args, &block)
         | 
| 121 | 
            -
                         | 
| 122 | 
            -
             | 
| 123 | 
            -
             | 
| 124 | 
            -
                         | 
| 125 | 
            -
             | 
| 126 | 
            -
                         | 
| 93 | 
            +
                        # Create a tracing context and start the rendering span
         | 
| 94 | 
            +
                        tracing_context = {}
         | 
| 95 | 
            +
                        Datadog::Contrib::Rails::ActionView.start_render_partial(tracing_context: tracing_context)
         | 
| 96 | 
            +
                        tracing_contexts[current_span_id] = tracing_context
         | 
| 97 | 
            +
             | 
| 98 | 
            +
                        render_without_datadog(*args)
         | 
| 99 | 
            +
                      rescue Exception => e
         | 
| 100 | 
            +
                        # attach the exception to the tracing context if any
         | 
| 101 | 
            +
                        tracing_contexts[current_span_id][:exception] = e
         | 
| 102 | 
            +
                        raise e
         | 
| 103 | 
            +
                      ensure
         | 
| 104 | 
            +
                        # Ensure that the template `Span` is finished even during exceptions
         | 
| 105 | 
            +
                        # Remove the existing tracing context (to avoid leaks)
         | 
| 106 | 
            +
                        tracing_contexts.delete(current_span_id)
         | 
| 107 | 
            +
             | 
| 108 | 
            +
                        # Then finish the span associated with the context
         | 
| 109 | 
            +
                        Datadog::Contrib::Rails::ActionView.finish_render_partial(tracing_context: tracing_context)
         | 
| 127 110 | 
             
                      end
         | 
| 128 111 |  | 
| 129 112 | 
             
                      def render_partial_with_datadog(*args)
         | 
| 130 113 | 
             
                        begin
         | 
| 114 | 
            +
                          # update the tracing context with computed values before the rendering
         | 
| 131 115 | 
             
                          template_name = Datadog::Contrib::Rails::Utils.normalize_template_name(@template.try('identifier'))
         | 
| 132 | 
            -
                           | 
| 133 | 
            -
                            active_datadog_span.set_tag(
         | 
| 134 | 
            -
                              Datadog::RailsRendererPatcher::TAG_TEMPLATE_NAME,
         | 
| 135 | 
            -
                              template_name
         | 
| 136 | 
            -
                            )
         | 
| 137 | 
            -
                          end
         | 
| 116 | 
            +
                          tracing_contexts[current_span_id][:template_name] = template_name
         | 
| 138 117 | 
             
                        rescue StandardError => e
         | 
| 139 118 | 
             
                          Datadog::Tracer.log.debug(e.message)
         | 
| 140 119 | 
             
                        end
         | 
| @@ -143,19 +122,15 @@ module Datadog | |
| 143 122 | 
             
                        render_partial_without_datadog(*args)
         | 
| 144 123 | 
             
                      end
         | 
| 145 124 |  | 
| 146 | 
            -
                       | 
| 147 | 
            -
             | 
| 148 | 
            -
                       | 
| 149 | 
            -
             | 
| 150 | 
            -
             | 
| 151 | 
            -
                        Datadog.configuration[:rails][:tracer]
         | 
| 125 | 
            +
                      # Table of tracing contexts, one per partial/span, keyed by span_id
         | 
| 126 | 
            +
                      # because there will be multiple concurrent contexts, depending on how
         | 
| 127 | 
            +
                      # many partials are nested within one another.
         | 
| 128 | 
            +
                      def tracing_contexts
         | 
| 129 | 
            +
                        @tracing_contexts ||= {}
         | 
| 152 130 | 
             
                      end
         | 
| 153 131 |  | 
| 154 | 
            -
                      def  | 
| 155 | 
            -
                         | 
| 156 | 
            -
                        yield
         | 
| 157 | 
            -
                      ensure
         | 
| 158 | 
            -
                        self.active_datadog_span = nil
         | 
| 132 | 
            +
                      def current_span_id
         | 
| 133 | 
            +
                        Datadog.configuration[:rails][:tracer].call_context.current_span.span_id
         | 
| 159 134 | 
             
                      end
         | 
| 160 135 |  | 
| 161 136 | 
             
                      # method aliasing to patch the class
         | 
| @@ -182,9 +157,79 @@ module Datadog | |
| 182 157 |  | 
| 183 158 | 
             
                def patch_process_action
         | 
| 184 159 | 
             
                  do_once(:patch_process_action) do
         | 
| 185 | 
            -
                     | 
| 160 | 
            +
                    if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.0.0')
         | 
| 161 | 
            +
                      # Patch Rails controller base class
         | 
| 162 | 
            +
                      ::ActionController::Metal.send(:prepend, ActionControllerPatch)
         | 
| 163 | 
            +
                    else
         | 
| 164 | 
            +
                      # Rewrite module that gets composed into the Rails controller base class
         | 
| 165 | 
            +
                      ::ActionController::Instrumentation.class_eval do
         | 
| 166 | 
            +
                        def process_action_with_datadog(*args)
         | 
| 167 | 
            +
                          # mutable payload with a tracing context that is used in two different
         | 
| 168 | 
            +
                          # signals; it propagates the request span so that it can be finished
         | 
| 169 | 
            +
                          # no matter what
         | 
| 170 | 
            +
                          payload = {
         | 
| 171 | 
            +
                            controller: self.class,
         | 
| 172 | 
            +
                            action: action_name,
         | 
| 173 | 
            +
                            headers: {
         | 
| 174 | 
            +
                              # The exception this controller was given in the request,
         | 
| 175 | 
            +
                              # which is typical if the controller is configured to handle exceptions.
         | 
| 176 | 
            +
                              request_exception: request.headers['action_dispatch.exception']
         | 
| 177 | 
            +
                            },
         | 
| 178 | 
            +
                            tracing_context: {}
         | 
| 179 | 
            +
                          }
         | 
| 180 | 
            +
             | 
| 181 | 
            +
                          begin
         | 
| 182 | 
            +
                            # process and catch request exceptions
         | 
| 183 | 
            +
                            Datadog::Contrib::Rails::ActionController.start_processing(payload)
         | 
| 184 | 
            +
                            result = process_action_without_datadog(*args)
         | 
| 185 | 
            +
                            payload[:status] = response.status
         | 
| 186 | 
            +
                            result
         | 
| 187 | 
            +
                          rescue Exception => e
         | 
| 188 | 
            +
                            payload[:exception] = [e.class.name, e.message]
         | 
| 189 | 
            +
                            payload[:exception_object] = e
         | 
| 190 | 
            +
                            raise e
         | 
| 191 | 
            +
                          end
         | 
| 192 | 
            +
                        ensure
         | 
| 193 | 
            +
                          Datadog::Contrib::Rails::ActionController.finish_processing(payload)
         | 
| 194 | 
            +
                        end
         | 
| 186 195 |  | 
| 187 | 
            -
             | 
| 196 | 
            +
                        alias_method :process_action_without_datadog, :process_action
         | 
| 197 | 
            +
                        alias_method :process_action, :process_action_with_datadog
         | 
| 198 | 
            +
                      end
         | 
| 199 | 
            +
                    end
         | 
| 200 | 
            +
                  end
         | 
| 201 | 
            +
                end
         | 
| 202 | 
            +
             | 
| 203 | 
            +
                # ActionController patch for Ruby 2.0+
         | 
| 204 | 
            +
                module ActionControllerPatch
         | 
| 205 | 
            +
                  def process_action(*args)
         | 
| 206 | 
            +
                    # mutable payload with a tracing context that is used in two different
         | 
| 207 | 
            +
                    # signals; it propagates the request span so that it can be finished
         | 
| 208 | 
            +
                    # no matter what
         | 
| 209 | 
            +
                    payload = {
         | 
| 210 | 
            +
                      controller: self.class,
         | 
| 211 | 
            +
                      action: action_name,
         | 
| 212 | 
            +
                      headers: {
         | 
| 213 | 
            +
                        # The exception this controller was given in the request,
         | 
| 214 | 
            +
                        # which is typical if the controller is configured to handle exceptions.
         | 
| 215 | 
            +
                        request_exception: request.headers['action_dispatch.exception']
         | 
| 216 | 
            +
                      },
         | 
| 217 | 
            +
                      tracing_context: {}
         | 
| 218 | 
            +
                    }
         | 
| 219 | 
            +
             | 
| 220 | 
            +
                    begin
         | 
| 221 | 
            +
                      # process and catch request exceptions
         | 
| 222 | 
            +
                      Datadog::Contrib::Rails::ActionController.start_processing(payload)
         | 
| 223 | 
            +
                      result = super(*args)
         | 
| 224 | 
            +
                      payload[:status] = response.status
         | 
| 225 | 
            +
                      result
         | 
| 226 | 
            +
                    rescue Exception => e
         | 
| 227 | 
            +
                      payload[:exception] = [e.class.name, e.message]
         | 
| 228 | 
            +
                      payload[:exception_object] = e
         | 
| 229 | 
            +
                      raise e
         | 
| 230 | 
            +
                    end
         | 
| 231 | 
            +
                  ensure
         | 
| 232 | 
            +
                    Datadog::Contrib::Rails::ActionController.finish_processing(payload)
         | 
| 188 233 | 
             
                  end
         | 
| 189 234 | 
             
                end
         | 
| 190 235 | 
             
              end
         | 
| @@ -225,7 +270,6 @@ module Datadog | |
| 225 270 | 
             
                  do_once(:patch_cache_store_read) do
         | 
| 226 271 | 
             
                    cache_store_class(:read).class_eval do
         | 
| 227 272 | 
             
                      alias_method :read_without_datadog, :read
         | 
| 228 | 
            -
             | 
| 229 273 | 
             
                      def read(*args, &block)
         | 
| 230 274 | 
             
                        payload = {
         | 
| 231 275 | 
             
                          action: 'GET',
         | 
| @@ -253,7 +297,6 @@ module Datadog | |
| 253 297 | 
             
                  do_once(:patch_cache_store_fetch) do
         | 
| 254 298 | 
             
                    cache_store_class(:fetch).class_eval do
         | 
| 255 299 | 
             
                      alias_method :fetch_without_datadog, :fetch
         | 
| 256 | 
            -
             | 
| 257 300 | 
             
                      def fetch(*args, &block)
         | 
| 258 301 | 
             
                        payload = {
         | 
| 259 302 | 
             
                          action: 'GET',
         | 
| @@ -281,7 +324,6 @@ module Datadog | |
| 281 324 | 
             
                  do_once(:patch_cache_store_write) do
         | 
| 282 325 | 
             
                    cache_store_class(:write).class_eval do
         | 
| 283 326 | 
             
                      alias_method :write_without_datadog, :write
         | 
| 284 | 
            -
             | 
| 285 327 | 
             
                      def write(*args, &block)
         | 
| 286 328 | 
             
                        payload = {
         | 
| 287 329 | 
             
                          action: 'SET',
         | 
| @@ -309,7 +351,6 @@ module Datadog | |
| 309 351 | 
             
                  do_once(:patch_cache_store_delete) do
         | 
| 310 352 | 
             
                    cache_store_class(:delete).class_eval do
         | 
| 311 353 | 
             
                      alias_method :delete_without_datadog, :delete
         | 
| 312 | 
            -
             | 
| 313 354 | 
             
                      def delete(*args, &block)
         | 
| 314 355 | 
             
                        payload = {
         | 
| 315 356 | 
             
                          action: 'DELETE',
         | 
| @@ -0,0 +1,70 @@ | |
| 1 | 
            +
            module Datadog
         | 
| 2 | 
            +
              module Contrib
         | 
| 3 | 
            +
                module Rake
         | 
| 4 | 
            +
                  # Instrumentation for Rake tasks
         | 
| 5 | 
            +
                  module Instrumentation
         | 
| 6 | 
            +
                    SPAN_NAME_INVOKE = 'rake.invoke'.freeze
         | 
| 7 | 
            +
                    SPAN_NAME_EXECUTE = 'rake.execute'.freeze
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                    def self.included(base)
         | 
| 10 | 
            +
                      base.send(:prepend, InstanceMethods)
         | 
| 11 | 
            +
                    end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                    # Instance methods for Rake instrumentation
         | 
| 14 | 
            +
                    module InstanceMethods
         | 
| 15 | 
            +
                      def invoke(*args)
         | 
| 16 | 
            +
                        return super unless enabled?
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                        tracer.trace(SPAN_NAME_INVOKE) do |span|
         | 
| 19 | 
            +
                          super
         | 
| 20 | 
            +
                          annotate_invoke!(span, args)
         | 
| 21 | 
            +
                        end
         | 
| 22 | 
            +
                      end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                      def execute(args = nil)
         | 
| 25 | 
            +
                        return super unless enabled?
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                        tracer.trace(SPAN_NAME_EXECUTE) do |span|
         | 
| 28 | 
            +
                          super
         | 
| 29 | 
            +
                          annotate_execute!(span, args)
         | 
| 30 | 
            +
                        end
         | 
| 31 | 
            +
                      end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                      private
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                      def annotate_invoke!(span, args)
         | 
| 36 | 
            +
                        span.resource = name
         | 
| 37 | 
            +
                        span.set_tag('rake.task.arg_names', arg_names)
         | 
| 38 | 
            +
                        span.set_tag('rake.invoke.args', quantize_args(args)) unless args.nil?
         | 
| 39 | 
            +
                      rescue StandardError => e
         | 
| 40 | 
            +
                        Datadog::Tracer.log.debug("Error while tracing Rake invoke: #{e.message}")
         | 
| 41 | 
            +
                      end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                      def annotate_execute!(span, args)
         | 
| 44 | 
            +
                        span.resource = name
         | 
| 45 | 
            +
                        span.set_tag('rake.execute.args', quantize_args(args.to_hash)) unless args.nil?
         | 
| 46 | 
            +
                      rescue StandardError => e
         | 
| 47 | 
            +
                        Datadog::Tracer.log.debug("Error while tracing Rake execute: #{e.message}")
         | 
| 48 | 
            +
                      end
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                      def quantize_args(args)
         | 
| 51 | 
            +
                        quantize_options = Datadog.configuration[:rake][:quantize][:args]
         | 
| 52 | 
            +
                        Datadog::Quantization::Hash.format(args, quantize_options)
         | 
| 53 | 
            +
                      end
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                      def enabled?
         | 
| 56 | 
            +
                        configuration[:enabled] == true
         | 
| 57 | 
            +
                      end
         | 
| 58 | 
            +
             | 
| 59 | 
            +
                      def tracer
         | 
| 60 | 
            +
                        configuration[:tracer]
         | 
| 61 | 
            +
                      end
         | 
| 62 | 
            +
             | 
| 63 | 
            +
                      def configuration
         | 
| 64 | 
            +
                        Datadog.configuration[:rake]
         | 
| 65 | 
            +
                      end
         | 
| 66 | 
            +
                    end
         | 
| 67 | 
            +
                  end
         | 
| 68 | 
            +
                end
         | 
| 69 | 
            +
              end
         | 
| 70 | 
            +
            end
         | 
| @@ -0,0 +1,53 @@ | |
| 1 | 
            +
            require 'ddtrace/ext/app_types'
         | 
| 2 | 
            +
            require 'ddtrace/contrib/rake/instrumentation'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            module Datadog
         | 
| 5 | 
            +
              module Contrib
         | 
| 6 | 
            +
                module Rake
         | 
| 7 | 
            +
                  # Patcher for Rake instrumentation
         | 
| 8 | 
            +
                  module Patcher
         | 
| 9 | 
            +
                    include Base
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                    register_as :rake
         | 
| 12 | 
            +
                    option :service_name, default: 'rake'
         | 
| 13 | 
            +
                    option :tracer, default: Datadog.tracer
         | 
| 14 | 
            +
                    option :enabled, default: true
         | 
| 15 | 
            +
                    option :quantize, default: {}
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                    module_function
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                    def patch
         | 
| 20 | 
            +
                      return patched? if patched? || !compatible?
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                      patch_rake
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                      # Set service info
         | 
| 25 | 
            +
                      configuration[:tracer].set_service_info(
         | 
| 26 | 
            +
                        configuration[:service_name],
         | 
| 27 | 
            +
                        'rake',
         | 
| 28 | 
            +
                        Ext::AppTypes::WORKER
         | 
| 29 | 
            +
                      )
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                      @patched = true
         | 
| 32 | 
            +
                    end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                    def patched?
         | 
| 35 | 
            +
                      return @patched if defined?(@patched)
         | 
| 36 | 
            +
                      @patched = false
         | 
| 37 | 
            +
                    end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                    def patch_rake
         | 
| 40 | 
            +
                      ::Rake::Task.send(:include, Instrumentation)
         | 
| 41 | 
            +
                    end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                    def compatible?
         | 
| 44 | 
            +
                      RUBY_VERSION >= '2.0.0' && defined?(::Rake)
         | 
| 45 | 
            +
                    end
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                    def configuration
         | 
| 48 | 
            +
                      Datadog.configuration[:rake]
         | 
| 49 | 
            +
                    end
         | 
| 50 | 
            +
                  end
         | 
| 51 | 
            +
                end
         | 
| 52 | 
            +
              end
         | 
| 53 | 
            +
            end
         | 
| @@ -0,0 +1,58 @@ | |
| 1 | 
            +
            require 'ddtrace/ext/sql'
         | 
| 2 | 
            +
            require 'ddtrace/ext/app_types'
         | 
| 3 | 
            +
            require 'ddtrace/contrib/sequel/utils'
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            module Datadog
         | 
| 6 | 
            +
              module Contrib
         | 
| 7 | 
            +
                module Sequel
         | 
| 8 | 
            +
                  # Adds instrumentation to Sequel::Database
         | 
| 9 | 
            +
                  module Database
         | 
| 10 | 
            +
                    def self.included(base)
         | 
| 11 | 
            +
                      base.send(:prepend, InstanceMethods)
         | 
| 12 | 
            +
                    end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                    # Instance methods for instrumenting Sequel::Database
         | 
| 15 | 
            +
                    module InstanceMethods
         | 
| 16 | 
            +
                      def run(sql, options = ::Sequel::OPTS)
         | 
| 17 | 
            +
                        opts = parse_opts(sql, options)
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                        response = nil
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                        datadog_pin.tracer.trace('sequel.query') do |span|
         | 
| 22 | 
            +
                          span.service = datadog_pin.service
         | 
| 23 | 
            +
                          span.resource = opts[:query]
         | 
| 24 | 
            +
                          span.span_type = Datadog::Ext::SQL::TYPE
         | 
| 25 | 
            +
                          span.set_tag('sequel.db.vendor', adapter_name)
         | 
| 26 | 
            +
                          response = super(sql, options)
         | 
| 27 | 
            +
                        end
         | 
| 28 | 
            +
                        response
         | 
| 29 | 
            +
                      end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                      def datadog_pin
         | 
| 32 | 
            +
                        @pin ||= Datadog::Pin.new(
         | 
| 33 | 
            +
                          Datadog.configuration[:sequel][:service_name] || adapter_name,
         | 
| 34 | 
            +
                          app: Patcher::APP,
         | 
| 35 | 
            +
                          app_type: Datadog::Ext::AppTypes::DB,
         | 
| 36 | 
            +
                          tracer: Datadog.configuration[:sequel][:tracer] || Datadog.tracer
         | 
| 37 | 
            +
                        )
         | 
| 38 | 
            +
                      end
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                      private
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                      def adapter_name
         | 
| 43 | 
            +
                        Utils.adapter_name(self)
         | 
| 44 | 
            +
                      end
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                      def parse_opts(sql, opts)
         | 
| 47 | 
            +
                        db_opts = if ::Sequel::VERSION < '3.41.0' && self.class.to_s !~ /Dataset$/
         | 
| 48 | 
            +
                                    @opts
         | 
| 49 | 
            +
                                  elsif instance_variable_defined?(:@pool) && @pool
         | 
| 50 | 
            +
                                    @pool.db.opts
         | 
| 51 | 
            +
                                  end
         | 
| 52 | 
            +
                        Utils.parse_opts(sql, opts, db_opts)
         | 
| 53 | 
            +
                      end
         | 
| 54 | 
            +
                    end
         | 
| 55 | 
            +
                  end
         | 
| 56 | 
            +
                end
         | 
| 57 | 
            +
              end
         | 
| 58 | 
            +
            end
         |