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:
S. Brent Faulkner
2017-07-07 18:05:11 -07:00
committed by Soam Vasani
parent fe4015fab2
commit 51c84f3cfc
6 changed files with 32 additions and 12 deletions
+3 -2
View File
@@ -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`
+5
View File
@@ -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)
+6 -2
View File
@@ -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
+10 -2
View File
@@ -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
+2 -1
View File
@@ -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
+6 -5
View File
@@ -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