Logging
Enabling gRPC Logging
To enable logging for this library, set the logger for the underlying gRPC
library. The logger
that you set may be a Ruby stdlib Logger
as
shown below, or a Google::Cloud::Logging::Logger
that will write logs to Stackdriver
Logging
. See grpc/logconfig.rb
and the gRPC spec_helper.rb
for additional information.
Configuring a Ruby stdlib logger:
require "logger" require "grpc" module MyLogger LOGGER = Logger . new $stderr , level : Logger :: WARN def logger LOGGER end end # Define a gRPC module-level logger method before grpc/logconfig.rb loads. module GRPC extend MyLogger end
Adding gRPC interceptors
gRPC accepts Ruby-language interceptors that allow you to insert your own custom logging into a client's RPC calls. (gRPC interceptors are also useful for auth, metrics, tracing and similar use cases.)
This library performs RPCs using the following gapic clients from the underlying google-cloud-pubsub-v1 library:
-
Google::Cloud::PubSub::V1::IAMPolicy::Client
-
Google::Cloud::PubSub::V1::Publisher::Client
-
Google::Cloud::PubSub::V1::SchemaService::Client
-
Google::Cloud::PubSub::V1::Subscriber::Client
To add a gRPC interceptor to one or more of these clients, first implement your logic as a subclass of GRPC::ClientInterceptor
. The example below logs all four
types of gRPC calls (unary, client streaming, server streaming, and bi-directional streaming.) It also demonstrates how
to set a metadata field.
require "grpc" require "logger" require "securerandom" class MyInterceptor < grpc :: clientinterceptor = "" attr_reader = "" :name = "" def = "" initialize = "" name = "" @name = "name" end = "" def = "" request_response ( request :, = "" call :, = "" method :, = "" metadata :) = "" logger . info = "" "[ #{ name } ]="" sending="" unary="" request/response="" to="" #{ method } " = "" metadata [ "request_id" ]= "generate_request_id" yield = "" end = "" def = "" client_streamer ( requests :, = "" call :, = "" method :, = "" metadata :) = "" logger . info = "" "[ #{ name } ]="" sending="" client="" streamer="" to="" #{ method } " = "" metadata [ "request_id" ]= "generate_request_id" yield = "" end = "" def = "" server_streamer ( request :, = "" call :, = "" method :, = "" metadata :) = "" logger . info = "" "[ #{ name } ]="" sending="" server="" streamer="" to="" #{ method } " = "" metadata [ "request_id" ]= "generate_request_id" yield = "" end = "" def = "" bidi_streamer ( requests :, = "" call :, = "" method :, = "" metadata :) = "" logger . info = "" "[ #{ name } ]="" sending="" bidi="" streamer="" to="" #{ method } " = "" metadata [ "request_id" ]= "generate_request_id" yield = "" end = "" private = "" def = "" logger = "" @logger = "" ||= "Logger.new(STDOUT)" end = "" def = "" generate_request_id = "" securerandom . uuid = "" end = "" end = "" >
Next, use the block yielded by a Client.configure
method to add an instance of your class to the interceptors
configuration of one or more of the generated clients listed above.
Note that the Google::Cloud::PubSub::V1
configurations must be performed beforethe Google::Cloud::PubSub
client
is instantiated.
require "google/cloud/pubsub" Google :: Cloud :: PubSub :: V1 :: Publisher :: Client . configure do | config | config . interceptors = [ MyInterceptor . new ( "MyPublisherInterceptor" ) ] end Google :: Cloud :: PubSub :: V1 :: Subscriber :: Client . configure do | config | config . interceptors = [ MyInterceptor . new ( "MySubscriberInterceptor" ) ] end pubsub = Google :: Cloud :: PubSub . new