Ruby logger (#251)
* Add logger for ruby environment * Update readme and example for ruby logger * ruby-env: log load time for user code
This commit is contained in:
committed by
Soam Vasani
parent
fe4015fab2
commit
51c84f3cfc
@@ -9,8 +9,9 @@ The environment works via convention where you create a Ruby method
|
|||||||
called `handler` with a single optional argument, a `Fission::Context`
|
called `handler` with a single optional argument, a `Fission::Context`
|
||||||
object.
|
object.
|
||||||
|
|
||||||
The `Fission::Context` object gives access to the Rack env, and a
|
The `Fission::Context` object gives access to the Rack env, a
|
||||||
request object. Please see `fission/context.rb` for the public api.
|
request object, and a logger. Please see `fission/context.rb` for the
|
||||||
|
public api.
|
||||||
|
|
||||||
The `Fission::Request` object is a subclass of `Rack::Request` and
|
The `Fission::Request` object is a subclass of `Rack::Request` and
|
||||||
provides access to parameters and headers. See `fission/request.rb`
|
provides access to parameters and headers. See `fission/request.rb`
|
||||||
|
|||||||
@@ -1,9 +1,14 @@
|
|||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
require_relative 'request'
|
require_relative 'request'
|
||||||
|
require 'forwardable'
|
||||||
|
|
||||||
module Fission
|
module Fission
|
||||||
class Context
|
class Context
|
||||||
|
extend Forwardable
|
||||||
|
|
||||||
|
def_instance_delegator :request, :logger
|
||||||
|
|
||||||
attr_reader :env
|
attr_reader :env
|
||||||
|
|
||||||
def initialize(env)
|
def initialize(env)
|
||||||
|
|||||||
@@ -5,14 +5,18 @@ require_relative 'context'
|
|||||||
module Fission
|
module Fission
|
||||||
module Handler
|
module Handler
|
||||||
def self.call(env)
|
def self.call(env)
|
||||||
|
context = Context.new(env)
|
||||||
|
|
||||||
response = if method(:handler).arity > 0
|
response = if method(:handler).arity > 0
|
||||||
handler(Context.new(env))
|
handler(context)
|
||||||
else
|
else
|
||||||
handler
|
handler
|
||||||
end
|
end
|
||||||
|
|
||||||
response.is_a?(Array) ? response : Rack::Response.new([response]).finish
|
response.is_a?(Array) ? response : Rack::Response.new([response]).finish
|
||||||
rescue
|
|
||||||
|
rescue => e
|
||||||
|
context.logger.error(%(Function failed - #{e}\n#{e.backtrace.join("\n")}))
|
||||||
Rack::Response.new(['500 Internal Server Error'], 500, {}).finish
|
Rack::Response.new(['500 Internal Server Error'], 500, {}).finish
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,13 +1,21 @@
|
|||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
require 'benchmark'
|
||||||
|
|
||||||
module Fission
|
module Fission
|
||||||
CODE_PATH = '/userfunc/user'
|
CODE_PATH = '/userfunc/user'
|
||||||
|
|
||||||
module Specializer
|
module Specializer
|
||||||
def self.call(env)
|
def self.call(env)
|
||||||
load CODE_PATH
|
request = Request.new(env)
|
||||||
|
|
||||||
|
request.logger.info("Codepath defaulting to #{CODE_PATH}")
|
||||||
|
time = Benchmark.measure { load CODE_PATH }
|
||||||
|
request.logger.info("User code loaded in #{(time.real * 1000).round(3)}ms")
|
||||||
|
|
||||||
Rack::Response.new([], 201).finish
|
Rack::Response.new([], 201).finish
|
||||||
rescue
|
|
||||||
|
rescue => e
|
||||||
|
request.logger.error(%(Specialization failed - #{e}\n#{e.backtrace.join("\n")}))
|
||||||
Rack::Response.new(['500 Internal Server Error'], 500, {}).finish
|
Rack::Response.new(['500 Internal Server Error'], 500, {}).finish
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,12 +1,13 @@
|
|||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
require 'rack'
|
require 'rack'
|
||||||
|
require 'logger'
|
||||||
|
|
||||||
require_relative 'fission/specializer'
|
require_relative 'fission/specializer'
|
||||||
require_relative 'fission/handler'
|
require_relative 'fission/handler'
|
||||||
|
|
||||||
app = Rack::Builder.new do
|
app = Rack::Builder.new do
|
||||||
use Rack::CommonLogger, $stderr
|
use Rack::Logger, Logger::DEBUG
|
||||||
|
|
||||||
map "/specialize" do
|
map "/specialize" do
|
||||||
run Fission::Specializer
|
run Fission::Specializer
|
||||||
|
|||||||
@@ -1,18 +1,19 @@
|
|||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
def handler(context)
|
def handler(context)
|
||||||
request = context.request
|
context.logger.info("Received request")
|
||||||
|
|
||||||
msg = <<~MSG
|
msg = <<~MSG
|
||||||
---ENV---
|
---ENV---
|
||||||
#{request.env.map { |h| h.join('=') }.join("\n") }
|
#{context.request.env.map { |h| h.join('=') }.join("\n") }
|
||||||
|
|
||||||
---HEADERS---
|
---HEADERS---
|
||||||
#{request.headers.map { |h| h.join(': ') }.join("\n") }
|
#{context.request.headers.map { |h| h.join(': ') }.join("\n") }
|
||||||
|
|
||||||
---PARAMS---
|
---PARAMS---
|
||||||
#{request.params.map { |h| h.join('=') }.join("\n") }
|
#{context.request.params.map { |h| h.join('=') }.join("\n") }
|
||||||
|
|
||||||
--BODY--
|
--BODY--
|
||||||
#{request.body.read}
|
#{context.request.body.read}
|
||||||
MSG
|
MSG
|
||||||
|
|
||||||
Rack::Response.new([msg]).finish
|
Rack::Response.new([msg]).finish
|
||||||
|
|||||||
Reference in New Issue
Block a user