Skip to content

Commit ae9b65c

Browse files
authored
Migrate from thin to puma for the web server (#25)
* Migrate from thin to puma to allow Rack 3.0 to be used.
1 parent e9d3059 commit ae9b65c

File tree

15 files changed

+93
-72
lines changed

15 files changed

+93
-72
lines changed

bc-prometheus-ruby.gemspec

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ Gem::Specification.new do |spec|
3535

3636
spec.add_runtime_dependency 'bigcommerce-multitrap', '~> 0.1'
3737
spec.add_runtime_dependency 'prometheus_exporter', '~> 0.7'
38+
spec.add_runtime_dependency 'puma', '> 5'
39+
spec.add_runtime_dependency 'rack', '>= 3.0'
3840
spec.add_runtime_dependency 'rake', '>= 10.0'
39-
spec.add_runtime_dependency 'thin', '~> 1.7'
4041
end

lib/bigcommerce/prometheus.rb

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@
2222
require 'prometheus_exporter/client'
2323
require 'prometheus_exporter/middleware'
2424
require 'prometheus_exporter/instrumentation'
25-
require 'thin'
25+
require 'puma'
26+
require 'rack'
2627

2728
require_relative 'prometheus/version'
2829
require_relative 'prometheus/loggable'
@@ -42,14 +43,14 @@
4243
require_relative 'prometheus/integrations/puma'
4344
require_relative 'prometheus/integrations/resque'
4445

45-
require_relative 'prometheus/servers/thin/server'
46-
require_relative 'prometheus/servers/thin/rack_app'
47-
require_relative 'prometheus/servers/thin/server_metrics'
48-
require_relative 'prometheus/servers/thin/controllers/base_controller'
49-
require_relative 'prometheus/servers/thin/controllers/error_controller'
50-
require_relative 'prometheus/servers/thin/controllers/metrics_controller'
51-
require_relative 'prometheus/servers/thin/controllers/not_found_controller'
52-
require_relative 'prometheus/servers/thin/controllers/send_metrics_controller'
46+
require_relative 'prometheus/servers/puma/server'
47+
require_relative 'prometheus/servers/puma/rack_app'
48+
require_relative 'prometheus/servers/puma/server_metrics'
49+
require_relative 'prometheus/servers/puma/controllers/base_controller'
50+
require_relative 'prometheus/servers/puma/controllers/error_controller'
51+
require_relative 'prometheus/servers/puma/controllers/metrics_controller'
52+
require_relative 'prometheus/servers/puma/controllers/not_found_controller'
53+
require_relative 'prometheus/servers/puma/controllers/send_metrics_controller'
5354

5455
module Bigcommerce
5556
##

lib/bigcommerce/prometheus/server.rb

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ def initialize(host: nil, port: nil, timeout: nil, prefix: nil, logger: nil, thr
3535
@prefix = (prefix || ::PrometheusExporter::DEFAULT_PREFIX).to_s
3636
@process_name = ::Bigcommerce::Prometheus.process_name
3737
@logger = logger || ::Bigcommerce::Prometheus.logger
38-
@server = ::Bigcommerce::Prometheus::Servers::Thin::Server.new(
38+
@server = ::Bigcommerce::Prometheus::Servers::Puma::Server.new(
3939
port: @port,
4040
timeout: @timeout,
4141
logger: @logger,
@@ -52,12 +52,10 @@ def initialize(host: nil, port: nil, timeout: nil, prefix: nil, logger: nil, thr
5252
def start
5353
@logger.info "[bigcommerce-prometheus][#{@process_name}] Starting prometheus exporter on port #{@host}:#{@port}"
5454

55-
@run_thread = ::Thread.start do
56-
@server.start
57-
end
55+
@run_thread = @server.run
5856
@running = true
5957

60-
@logger.info "[bigcommerce-prometheus][#{@process_name}] Prometheus exporter started on #{@host}:#{@port} with #{@server.threadpool_size} threads"
58+
@logger.info "[bigcommerce-prometheus][#{@process_name}] Prometheus exporter started on #{@host}:#{@port} with #{@server.max_threads} threads"
6159

6260
@server
6361
rescue ::StandardError => e
@@ -81,7 +79,7 @@ def start_until_stopped
8179
# Stop the server
8280
#
8381
def stop
84-
@server.stop!
82+
@server.stop
8583
@run_thread.kill
8684
@running = false
8785
$stdout.puts "[bigcommerce-prometheus][#{@process_name}] Prometheus exporter cleanly shut down"

lib/bigcommerce/prometheus/servers/thin/controllers/base_controller.rb renamed to lib/bigcommerce/prometheus/servers/puma/controllers/base_controller.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,16 @@
1818
module Bigcommerce
1919
module Prometheus
2020
module Servers
21-
module Thin
21+
module Puma
2222
module Controllers
2323
##
24-
# Base thin controller for prometheus metrics
24+
# Base puma controller for prometheus metrics
2525
#
2626
class BaseController
2727
##
2828
# @param [Rack::Request] request
2929
# @param [Rack::Response] response
30-
# @param [Bigcommerce::Prometheus::Servers::Thin::ServerMetrics]
30+
# @param [Bigcommerce::Prometheus::Servers::Puma::ServerMetrics]
3131
# @param [PrometheusExporter::Server::Collector] collector
3232
# @param [Logger] logger
3333
#

lib/bigcommerce/prometheus/servers/thin/controllers/error_controller.rb renamed to lib/bigcommerce/prometheus/servers/puma/controllers/error_controller.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
module Bigcommerce
1919
module Prometheus
2020
module Servers
21-
module Thin
21+
module Puma
2222
module Controllers
2323
##
2424
# Handle 500s

lib/bigcommerce/prometheus/servers/thin/controllers/metrics_controller.rb renamed to lib/bigcommerce/prometheus/servers/puma/controllers/metrics_controller.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
module Bigcommerce
2323
module Prometheus
2424
module Servers
25-
module Thin
25+
module Puma
2626
module Controllers
2727
##
2828
# GET /metrics

lib/bigcommerce/prometheus/servers/thin/controllers/not_found_controller.rb renamed to lib/bigcommerce/prometheus/servers/puma/controllers/not_found_controller.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
module Bigcommerce
1919
module Prometheus
2020
module Servers
21-
module Thin
21+
module Puma
2222
module Controllers
2323
##
2424
# Handle invalid requests to server

lib/bigcommerce/prometheus/servers/thin/controllers/send_metrics_controller.rb renamed to lib/bigcommerce/prometheus/servers/puma/controllers/send_metrics_controller.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
module Bigcommerce
1919
module Prometheus
2020
module Servers
21-
module Thin
21+
module Puma
2222
module Controllers
2323
##
2424
# POST /send-metrics

lib/bigcommerce/prometheus/servers/thin/rack_app.rb renamed to lib/bigcommerce/prometheus/servers/puma/rack_app.rb

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@
1818
module Bigcommerce
1919
module Prometheus
2020
module Servers
21-
module Thin
21+
module Puma
2222
##
23-
# Handles metrics requests as a Rack App on the Thin server
23+
# Handles metrics requests as a Rack App on the Puma server
2424
#
2525
class RackApp
2626
##
@@ -29,7 +29,7 @@ def initialize(collector: nil, timeout: nil, logger: nil)
2929
@timeout = timeout || ::Bigcommerce::Prometheus.server_timeout
3030
@collector = collector || ::PrometheusExporter::Server::Collector.new
3131
@logger = logger || ::Bigcommerce::Prometheus.logger
32-
@server_metrics = ::Bigcommerce::Prometheus::Servers::Thin::ServerMetrics.new(logger: @logger)
32+
@server_metrics = ::Bigcommerce::Prometheus::Servers::Puma::ServerMetrics.new(logger: @logger)
3333
end
3434

3535
def call(env)
@@ -39,7 +39,7 @@ def call(env)
3939
handle(controller: controller, request: request, response: response)
4040
rescue StandardError => e
4141
@logger.error "Error: #{e.message}"
42-
handle(controller: ::Bigcommerce::Prometheus::Servers::Thin::Controllers::ErrorController, request: request, response: response)
42+
handle(controller: ::Bigcommerce::Prometheus::Servers::Puma::Controllers::ErrorController, request: request, response: response)
4343
end
4444

4545
##
@@ -60,11 +60,11 @@ def add_type_collector(collector)
6060
#
6161
def route(request)
6262
if request.fullpath == '/metrics' && request.request_method.to_s.downcase == 'get'
63-
Bigcommerce::Prometheus::Servers::Thin::Controllers::MetricsController
63+
Bigcommerce::Prometheus::Servers::Puma::Controllers::MetricsController
6464
elsif request.fullpath == '/send-metrics' && request.request_method.to_s.downcase == 'post'
65-
Bigcommerce::Prometheus::Servers::Thin::Controllers::SendMetricsController
65+
Bigcommerce::Prometheus::Servers::Puma::Controllers::SendMetricsController
6666
else
67-
Bigcommerce::Prometheus::Servers::Thin::Controllers::NotFoundController
67+
Bigcommerce::Prometheus::Servers::Puma::Controllers::NotFoundController
6868
end
6969
end
7070

lib/bigcommerce/prometheus/servers/thin/server.rb renamed to lib/bigcommerce/prometheus/servers/puma/server.rb

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,21 +18,21 @@
1818
module Bigcommerce
1919
module Prometheus
2020
module Servers
21-
module Thin
21+
module Puma
2222
##
23-
# Thin adapter for server
23+
# Puma adapter for server
2424
#
25-
class Server < ::Thin::Server
25+
class Server < ::Puma::Server
2626
def initialize(port: nil, host: nil, timeout: nil, logger: nil, thread_pool_size: nil)
2727
@port = port || ::Bigcommerce::Prometheus.server_port
2828
@host = host || ::Bigcommerce::Prometheus.server_host
2929
@timeout = timeout || ::Bigcommerce::Prometheus.server_timeout
3030
@logger = logger || ::Bigcommerce::Prometheus.logger
31-
@rack_app = ::Bigcommerce::Prometheus::Servers::Thin::RackApp.new(timeout: timeout, logger: logger)
32-
super(@host, @port, @rack_app)
33-
::Thin::Logging.logger = @logger
31+
@rack_app = ::Bigcommerce::Prometheus::Servers::Puma::RackApp.new(timeout: timeout, logger: logger)
32+
thread_pool_size = (thread_pool_size || ::Bigcommerce::Prometheus.server_thread_pool_size).to_i
33+
super(@rack_app, nil, max_threads: thread_pool_size)
34+
add_tcp_listener(@host, @port)
3435
@logger.info "[bigcommerce-prometheus] Prometheus server started on #{@host}:#{@port}"
35-
self.threadpool_size = (thread_pool_size || ::Bigcommerce::Prometheus.server_thread_pool_size).to_i
3636
end
3737

3838
##

0 commit comments

Comments
 (0)