Module: StackServiceBase

Defined in:
lib/version.rb,
lib/stack-service-base.rb

Defined Under Namespace

Classes: Base

Class Method Summary collapse

Class Method Details

.rack_setup(app) ⇒ Object



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/stack-service-base.rb', line 7

def rack_setup app
  # skip if called within Rspec task
  # TODO: warn if called not within Rspec task but with a wrong app class
  return unless app.respond_to? :use

  app.instance_eval do
    if OTEL_ENABLED
      otel_initialize
    end

    RackHelpers.rack_setup app

    if ENV.fetch('PROMETHEUS_METRICS_EXPORT', 'true') == 'true'
      require 'stack-service-base/prometheus'

      # use Rack::Deflater
      use Prometheus::Middleware::Collector
      use Prometheus::Middleware::Exporter
    end

    if defined? Sequel
      require 'stack-service-base/database'

      Sequel::Database.after_initialize { _1.loggers << LOGGER }

      attempts= 10
      sleep_interval= 1

      mod = Module.new do
        define_method(:connect) do |*args, **opts, &blk|
          tries = attempts
          begin
            super(*args, **opts, &blk)
          rescue Sequel::DatabaseConnectionError, Sequel::DatabaseError => e
            if (tries -= 1) > 0
              LOGGER.warn "DB connect failed (#{e.message}), retrying in #{sleep_interval}s… (#{tries} left)"
              sleep sleep_interval
              retry
            end
            raise
          end
        end
      end

      Sequel.singleton_class.prepend(mod)
      # ---
      #
      require_relative 'stack-service-base/fiber_pool'
    end
  end
end