1
0
Fork 0
mirror of https://github.com/puma/puma.git synced 2022-11-09 13:48:40 -05:00
puma--puma/lib/puma/app/status.rb
Bart 1bec245b63 Change Puma.stats to return a hash instead of a JSON string (#2086)
Having access to the hash allows to produce stats in other ways (such as StatsD) without having to parse JSON of data that is available in memory. An example of this workaround is fa6ba1f507/lib/puma/plugin/statsd.rb (L112-L114)
2019-12-17 12:38:48 +07:00

88 lines
2.2 KiB
Ruby

# frozen_string_literal: true
require 'json'
module Puma
module App
# Check out {#call}'s source code to see what actions this web application
# can respond to.
class Status
OK_STATUS = '{ "status": "ok" }'.freeze
def initialize(cli, token = nil)
@cli = cli
@auth_token = token
end
def call(env)
unless authenticate(env)
return rack_response(403, 'Invalid auth token', 'text/plain')
end
case env['PATH_INFO']
when /\/stop$/
@cli.stop
rack_response(200, OK_STATUS)
when /\/halt$/
@cli.halt
rack_response(200, OK_STATUS)
when /\/restart$/
@cli.restart
rack_response(200, OK_STATUS)
when /\/phased-restart$/
if !@cli.phased_restart
rack_response(404, '{ "error": "phased restart not available" }')
else
rack_response(200, OK_STATUS)
end
when /\/reload-worker-directory$/
if !@cli.send(:reload_worker_directory)
rack_response(404, '{ "error": "reload_worker_directory not available" }')
else
rack_response(200, OK_STATUS)
end
when /\/gc$/
GC.start
rack_response(200, OK_STATUS)
when /\/gc-stats$/
rack_response(200, GC.stat.to_json)
when /\/stats$/
rack_response(200, @cli.stats.to_json)
when /\/thread-backtraces$/
backtraces = []
@cli.thread_status do |name, backtrace|
backtraces << { name: name, backtrace: backtrace }
end
rack_response(200, backtraces.to_json)
else
rack_response 404, "Unsupported action", 'text/plain'
end
end
private
def authenticate(env)
return true unless @auth_token
env['QUERY_STRING'].to_s.split(/&;/).include?("token=#{@auth_token}")
end
def rack_response(status, body, content_type='application/json')
headers = {
'Content-Type' => content_type,
'Content-Length' => body.bytesize.to_s
}
[status, headers, [body]]
end
end
end
end