Sha256: b14031b56edcf06588a6be4d9f3373327505474954d726f6b4afcac5671c4150

Contents?: true

Size: 1.9 KB

Versions: 19

Compression:

Stored size: 1.9 KB

Contents

# encoding: utf-8
# This file is distributed under New Relic's license terms.
# See https://github.com/newrelic/rpm/blob/master/LICENSE for complete details.

module ::Excon
  module Middleware
    class NewRelicCrossAppTracing
      TRACE_DATA_IVAR = :@newrelic_trace_data

      def initialize(stack)
        @stack = stack
      end

      def request_call(datum)
        begin
          # Only instrument this request if we haven't already done so, because
          # we can get request_call multiple times for requests marked as
          # :idempotent in the options, but there will be only a single
          # accompanying response_call/error_call.
          if datum[:connection] && !datum[:connection].instance_variable_get(TRACE_DATA_IVAR)
            wrapped_request = ::NewRelic::Agent::HTTPClients::ExconHTTPRequest.new(datum)
            t0, segment = ::NewRelic::Agent::CrossAppTracing.start_trace(wrapped_request)
            datum[:connection].instance_variable_set(TRACE_DATA_IVAR, [t0, segment, wrapped_request])
          end
        rescue => e
          NewRelic::Agent.logger.debug(e)
        end
        @stack.request_call(datum)
      end

      def response_call(datum)
        finish_trace(datum)
        @stack.response_call(datum)
      end

      def error_call(datum)
        finish_trace(datum)
        @stack.error_call(datum)
      end

      def finish_trace(datum)
        trace_data = datum[:connection] && datum[:connection].instance_variable_get(TRACE_DATA_IVAR)
        if trace_data
          datum[:connection].instance_variable_set(TRACE_DATA_IVAR, nil)
          t0, segment, wrapped_request = trace_data
          if datum[:response]
            wrapped_response = ::NewRelic::Agent::HTTPClients::ExconHTTPResponse.new(datum[:response])
          end
          ::NewRelic::Agent::CrossAppTracing.finish_trace(t0, segment, wrapped_request, wrapped_response)
        end
      end
    end
  end
end

Version data entries

19 entries across 19 versions & 1 rubygems

Version Path
newrelic_rpm-3.9.0.229 lib/new_relic/agent/instrumentation/excon/middleware.rb
newrelic_rpm-3.8.1.221 lib/new_relic/agent/instrumentation/excon/middleware.rb
newrelic_rpm-3.8.0.218 lib/new_relic/agent/instrumentation/excon/middleware.rb
newrelic_rpm-3.7.3.204 lib/new_relic/agent/instrumentation/excon/middleware.rb
newrelic_rpm-3.7.3.199 lib/new_relic/agent/instrumentation/excon/middleware.rb
newrelic_rpm-3.7.2.195 lib/new_relic/agent/instrumentation/excon/middleware.rb
newrelic_rpm-3.7.2.192 lib/new_relic/agent/instrumentation/excon/middleware.rb
newrelic_rpm-3.7.2.190.beta lib/new_relic/agent/instrumentation/excon/middleware.rb
newrelic_rpm-3.7.1.188 lib/new_relic/agent/instrumentation/excon/middleware.rb
newrelic_rpm-3.7.1.182 lib/new_relic/agent/instrumentation/excon/middleware.rb
newrelic_rpm-3.7.1.180 lib/new_relic/agent/instrumentation/excon/middleware.rb
newrelic_rpm-3.7.0.177 lib/new_relic/agent/instrumentation/excon/middleware.rb
newrelic_rpm-3.7.0.174.beta lib/new_relic/agent/instrumentation/excon/middleware.rb
newrelic_rpm-3.6.9.171 lib/new_relic/agent/instrumentation/excon/middleware.rb
newrelic_rpm-3.6.8.168 lib/new_relic/agent/instrumentation/excon/middleware.rb
newrelic_rpm-3.6.8.164 lib/new_relic/agent/instrumentation/excon/middleware.rb
newrelic_rpm-3.6.7.159 lib/new_relic/agent/instrumentation/excon/middleware.rb
newrelic_rpm-3.6.7.159.beta lib/new_relic/agent/instrumentation/excon/middleware.rb
newrelic_rpm-3.6.7.152 lib/new_relic/agent/instrumentation/excon/middleware.rb