Packages
snakepit
0.10.0
0.13.0
0.12.0
0.11.1
0.11.0
0.10.1
0.10.0
0.9.1
0.9.0
0.8.9
0.8.8
0.8.7
0.8.6
0.8.5
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.7
0.7.6
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.11
0.6.10
0.6.9
0.6.8
0.6.7
0.6.6
0.6.5
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
0.5.1
0.5.0
0.4.3
0.4.2
0.4.1
0.4.0
0.3.3
0.3.2
0.3.1
0.3.0
0.2.1
0.2.0
0.1.2
0.1.1
0.1.0
High-performance pooler and session manager for external language integrations. Supports Python, Node.js, Ruby, and more with gRPC streaming, session management, and production-ready process cleanup.
Current section
Files
Jump to
Current section
Files
lib/snakepit/grpc/interceptors/server_logger.ex
defmodule Snakepit.GRPC.Interceptors.ServerLogger do
@moduledoc false
@behaviour GRPC.Server.Interceptor
alias Snakepit.Logger, as: SLog
require Logger
@impl true
def init(opts) do
Keyword.validate!(opts, level: :info)
end
@impl true
def call(req, stream, next, opts) do
if logging_enabled?() do
level = Keyword.fetch!(opts, :level)
Logger.metadata(request_id: Logger.metadata()[:request_id] || stream.request_id)
Logger.log(level, "Handled by #{inspect(stream.server)}.#{elem(stream.rpc, 0)}")
start = System.monotonic_time()
result = next.(req, stream)
stop = System.monotonic_time()
status = elem(result, 0)
diff = System.convert_time_unit(stop - start, :native, :microsecond)
Logger.log(level, "Response #{inspect(status)} in #{formatted_diff(diff)}")
result
else
next.(req, stream)
end
end
defp logging_enabled? do
case Application.get_env(:snakepit, :grpc_request_logging, :auto) do
true -> true
false -> false
:auto -> SLog.should_log?(:debug, :grpc)
_ -> SLog.should_log?(:debug, :grpc)
end
end
defp formatted_diff(diff) when diff > 1000 do
[diff |> div(1000) |> Integer.to_string(), "ms"]
end
defp formatted_diff(diff), do: [Integer.to_string(diff), "us"]
end