Sha256: be65da7f8a993804dd8dd52d91b80099ed2ad59816326a7f5081b60fd18f0198

Contents?: true

Size: 1.66 KB

Versions: 25

Compression:

Stored size: 1.66 KB

Contents

module Routemaster
  module Middleware
    class Metrics
      INTERACTION_KEY = 'api_client'.freeze

      def initialize(app, client: nil, source_peer: nil)
        @app    = app
        @client = client
        @source_peer = source_peer
      end

      def call(request_env)
        return @app.call(request_env) unless can_log?

        increment_req_count(request_tags(request_env))

        record_latency(request_tags(request_env)) do
          begin
            @app.call(request_env).on_complete do |response_env|
              increment_response_count(response_tags(response_env))
            end
          rescue Routemaster::Errors::BaseError => e
            increment_response_count(response_tags(e.env))
            raise e
          end
        end
      end

      private

      attr_reader :client, :source_peer

      def increment_req_count(tags)
        client.increment("#{INTERACTION_KEY}.request.count", tags: tags)
      end

      def increment_response_count(tags)
        client.increment("#{INTERACTION_KEY}.response.count", tags: tags)
      end

      def record_latency(tags, &block)
        client.time("#{INTERACTION_KEY}.latency", tags: tags) do
          block.call
        end
      end

      def can_log?
        client && source_peer
      end

      def destination_peer(env)
        env.url.host
      end

      def peers_tags(env)
        [
          "source:#{source_peer}",
          "destination:#{destination_peer(env)}"
        ]
      end

      def request_tags(env)
        peers_tags(env).concat(["verb:#{env.method}"])
      end

      def response_tags(env)
        peers_tags(env).concat(["status:#{env.status}"])
      end
    end
  end
end

Version data entries

25 entries across 25 versions & 1 rubygems

Version Path
routemaster-drain-3.6.2 lib/routemaster/middleware/metrics.rb
routemaster-drain-3.6.1 lib/routemaster/middleware/metrics.rb
routemaster-drain-3.6.0 lib/routemaster/middleware/metrics.rb
routemaster-drain-3.5.1 lib/routemaster/middleware/metrics.rb
routemaster-drain-3.5.0 lib/routemaster/middleware/metrics.rb
routemaster-drain-3.4.0 lib/routemaster/middleware/metrics.rb
routemaster-drain-3.3.0 lib/routemaster/middleware/metrics.rb
routemaster-drain-3.2.0 lib/routemaster/middleware/metrics.rb
routemaster-drain-3.1.0 lib/routemaster/middleware/metrics.rb
routemaster-drain-3.0.3 lib/routemaster/middleware/metrics.rb
routemaster-drain-3.0.2 lib/routemaster/middleware/metrics.rb
routemaster-drain-3.0.1 lib/routemaster/middleware/metrics.rb
routemaster-drain-3.0.0 lib/routemaster/middleware/metrics.rb
routemaster-drain-2.5.4 lib/routemaster/middleware/metrics.rb
routemaster-drain-2.5.3 lib/routemaster/middleware/metrics.rb
routemaster-drain-2.5.2 lib/routemaster/middleware/metrics.rb
routemaster-drain-2.5.1 lib/routemaster/middleware/metrics.rb
routemaster-drain-2.5.0 lib/routemaster/middleware/metrics.rb
routemaster-drain-2.4.4 lib/routemaster/middleware/metrics.rb
routemaster-drain-2.4.3 lib/routemaster/middleware/metrics.rb