Sha256: dca01f6281e672f9c6cc13c35b8ef510731f92ead92c5939019570087ccd73c6

Contents?: true

Size: 1.76 KB

Versions: 20

Compression:

Stored size: 1.76 KB

Contents

require "skylight/formatters/http"

module Skylight
  module Probes
    module Excon
      # Middleware for Excon that instruments requests
      class Middleware < ::Excon::Middleware::Base
        def initialize(*)
          @requests = {}.compare_by_identity
          super
        end

        # TODO: Review the following:
        # - Consider whether a LIFO queue would be sufficient
        # - Check that errors can't be called without a request

        def request_call(datum)
          begin_instrumentation(datum)
          super
        end

        def response_call(datum)
          super
        ensure
          end_instrumentation(datum)
        end

        def error_call(datum)
          super
        ensure
          end_instrumentation(datum)
        end

        private

        def begin_instrumentation(datum)
          method = datum[:method].to_s
          scheme = datum[:scheme]
          host = datum[:host]

          # TODO: Maybe don't show other default ports like 443
          port = datum[:port] == 80 ? nil : datum[:port]
          path = datum[:path]
          query = datum[:query]

          opts = Formatters::HTTP.build_opts(method, scheme, host, port, path, query)

          @requests[datum] = Skylight.instrument(opts)
        rescue Exception => e
          Skylight.error "failed to begin instrumentation for Excon; msg=%s", e.message
        end

        def end_instrumentation(datum)
          if (request = @requests.delete(datum))
            meta = {}
            meta[:exception_object] = datum[:error] if datum[:error].is_a?(Exception)
            Skylight.done(request, meta)
          end
        rescue Exception => e
          Skylight.error "failed to end instrumentation for Excon; msg=%s", e.message
        end
      end
    end
  end
end

Version data entries

20 entries across 20 versions & 1 rubygems

Version Path
skylight-6.1.0.beta lib/skylight/probes/excon/middleware.rb
skylight-6.0.4 lib/skylight/probes/excon/middleware.rb
skylight-6.0.3 lib/skylight/probes/excon/middleware.rb
skylight-5.3.5 lib/skylight/probes/excon/middleware.rb
skylight-6.0.2 lib/skylight/probes/excon/middleware.rb
skylight-6.0.1 lib/skylight/probes/excon/middleware.rb
skylight-6.0.0 lib/skylight/probes/excon/middleware.rb
skylight-6.0.0.beta2 lib/skylight/probes/excon/middleware.rb
skylight-6.0.0.beta lib/skylight/probes/excon/middleware.rb
skylight-5.3.4 lib/skylight/probes/excon/middleware.rb
skylight-5.3.3 lib/skylight/probes/excon/middleware.rb
skylight-5.3.2 lib/skylight/probes/excon/middleware.rb
skylight-5.3.1 lib/skylight/probes/excon/middleware.rb
skylight-5.3.0 lib/skylight/probes/excon/middleware.rb
skylight-5.2.0 lib/skylight/probes/excon/middleware.rb
skylight-5.2.0.beta2 lib/skylight/probes/excon/middleware.rb
skylight-5.2.0.beta lib/skylight/probes/excon/middleware.rb
skylight-5.1.1 lib/skylight/probes/excon/middleware.rb
skylight-5.1.0.beta3 lib/skylight/probes/excon/middleware.rb
skylight-5.1.0.beta2 lib/skylight/probes/excon/middleware.rb