Sha256: d4a7851cedd1223bd9e40a39e82bb36afb62c3b375dee3b963812a81e0ed5d8e

Contents?: true

Size: 1.07 KB

Versions: 1

Compression:

Stored size: 1.07 KB

Contents

# frozen_string_literal: true

module Salestation
  class Web < Module
    class StatsdMiddleware
      EXTRA_TAGS_ENV_KEY = 'salestation.statsd.tags'

      DURATION_PRECISION = 6

      def initialize(app, statsd, metric:)
        @app = app
        @statsd = statsd
        @metric = metric
      end

      def call(env)
        start = system_monotonic_time

        status, header, body = @app.call env

        method = env['REQUEST_METHOD']
        path =
          if route = env['sinatra.route']
            route.split(' ').last
          else
            'unknown-route'
          end

        tags = [
          "path:#{ path }",
          "method:#{ method }",
          "status:#{ status }"
        ] + env.fetch(EXTRA_TAGS_ENV_KEY, [])

        @statsd.timing(@metric, duration(from: start), tags: tags)

        [status, header, body]
      end

      private

      def duration(from:)
        (system_monotonic_time - from).round(DURATION_PRECISION)
      end

      def system_monotonic_time
        Process.clock_gettime(Process::CLOCK_MONOTONIC)
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
salestation-3.5.0 lib/salestation/web/statsd_middleware.rb