Class: Openapm::Middleware

Inherits:
Object
  • Object
show all
Defined in:
lib/openapm/middleware.rb

Instance Method Summary collapse

Constructor Details

#initialize(app) ⇒ Middleware

Returns a new instance of Middleware.



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# File 'lib/openapm/middleware.rb', line 5

def initialize(app)
  @app = app
  @metric_path = "/metrics"
  @registry = Prometheus::Client.registry
  @histogram = Prometheus::Client::Histogram.new(:http_requests_duration_milliseconds,
                                                 docstring: 'Duration of HTTP requests in milliseconds',
                                                 labels: [:program, :path, :method, :status, :environment],
                                                 buckets: Prometheus::Client::Histogram.exponential_buckets(
                                                   start: 0.25,
                                                   factor: 1.5,
                                                   count: 31
                                                 ),
                                                 preset_labels: Openapm.default_labels
  )
  @registry.register(@histogram)

end

Instance Method Details

#call(env) ⇒ Object



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/openapm/middleware.rb', line 23

def call(env)
  return Prometheus::Middleware::Exporter.new(@app, { registry: @registry }).call(env) if env['PATH_INFO'] == @metric_path

  # https://blog.dnsimple.com/2018/03/elapsed-time-with-ruby-the-right-way/
  starting = Process.clock_gettime(Process::CLOCK_MONOTONIC)
  result = @app.call(env)
  result
ensure
  ending = Process.clock_gettime(Process::CLOCK_MONOTONIC)

  if env['PATH_INFO'] != @metric_path
    # Elapsed Time in milliseconds
    elapsed_time = (ending - starting) * 1000

    status = (result && result[0]) || -1
    @histogram.observe(elapsed_time, labels: { path: generate_path(env), method: env['REQUEST_METHOD'], status: status, environment: ENV["RAILS_ENV"] || ENV["RACK_ENV"] })
  end
end