class Upfluence::HTTP::Server

Constants

DEFAULT_OPTIONS

Public Class Methods

new(options = {}, &block) click to toggle source
# File lib/upfluence/http/server.rb, line 36
def initialize(options = {}, &block)
  @options = DEFAULT_OPTIONS.dup.merge(options)
  opts = @options
  base_handler = nil

  if opts[:base_handler_klass]
    base_handler = opts[:base_handler_klass].new(@options[:interfaces])
  end

  @builder = Builder.new do
    use Middleware::Logger
    use Middleware::Prometheus
    use Middleware::ApplicationHeaders, base_handler
    use Middleware::HandleException
    use Upfluence.error_logger.middleware
    use Rack::ContentLength
    use Rack::Chunked
    use Rack::Lint if Upfluence.env.development?
    use Rack::TempfileReaper
    use Rack::ETag
    use Middleware::CORS if Upfluence.env.development?

    map '/healthcheck' do
      run(opts[:healthcheck_endpoint] || Endpoint::Healthcheck.new)
    end

    if opts[:base_processor_klass] && base_handler
      map '/base' do
        run_thrift(opts[:base_processor_klass], base_handler)
      end
    end

    map('/debug') { run(Endpoint::Profiler.new) } if opts[:debug]

    instance_eval(&block)
  end

  @handler = Rack::Handler.get(@options[:server])
end

Public Instance Methods

serve() click to toggle source
# File lib/upfluence/http/server.rb, line 76
def serve
  ENV['RACK_ENV'] = Upfluence.env.to_s

  Thread.new { run_prometheus_exporter } if @options[:push_gateway_url]

  @handler.run(@builder, @options) do |server|
    server.threaded = @options[:threaded] if server.respond_to? :threaded=

    if server.respond_to?(:threadpool_size=) && @options[:threadpool_size]
      server.threadpool_size = @options[:threadpool_size]
    end
  end
end

Private Instance Methods

run_prometheus_exporter() click to toggle source
# File lib/upfluence/http/server.rb, line 92
def run_prometheus_exporter
  push = Prometheus::Client::Push.new(
    @options[:app_name],
    @options[:unit_name],
    @options[:push_gateway_url]
  )

  loop do
    sleep @options[:push_gateway_interval]

    begin
      push.replace Prometheus::Client.registry
    rescue => e
      Upfluence.error_logger.notify(e)
    end
  end
end