class Gruf::Prometheus::Client::Collector

Prometheus instrumentor for gRPC clients

Constants

RESPONSE_CODE_OK

Public Instance Methods

completed(request_context:, result:) click to toggle source

@param [Gruf::Controller::RequestContext] request_context @param [Gruf::Interceptors::Timer::Result] result

# File lib/gruf/prometheus/client/collector.rb, line 41
def completed(request_context:, result:)
  push(
    grpc_client_completed: 1,
    custom_labels: custom_labels(request_context: request_context, result: result)
  )
end
completed_latency_seconds(request_context:, result:) click to toggle source

@param [Gruf::Outbound::RequestContext] request_context @param [Gruf::Interceptors::Timer::Result] result

# File lib/gruf/prometheus/client/collector.rb, line 52
def completed_latency_seconds(request_context:, result:)
  push(
    grpc_client_completed_latency_seconds: result.elapsed.to_f,
    custom_labels: custom_labels(request_context: request_context, result: result)
  )
end
started_total(request_context:) click to toggle source

@param [Gruf::Outbound::RequestContext] request_context

# File lib/gruf/prometheus/client/collector.rb, line 30
def started_total(request_context:)
  push(
    grpc_client_started_total: 1,
    custom_labels: custom_labels(request_context: request_context)
  )
end

Private Instance Methods

custom_labels(request_context:, result: nil) click to toggle source

@param [Gruf::Outbound::RequestContext] request_context @param [Gruf::Interceptors::Timer::Result|NilClass] result @return [Hash]

# File lib/gruf/prometheus/client/collector.rb, line 66
def custom_labels(request_context:, result: nil)
  labels = {
    grpc_service: format_service_name(request_context.method.to_s),
    grpc_method: request_context.method_name,
    grpc_type: determine_type(request_context)
  }
  if result
    labels[:grpc_code] = result.successful? ? RESPONSE_CODE_OK : result.message_class_name.split('::').last
  end
  labels
end
determine_type(request_context) click to toggle source

@param [Gruf::Outbound::RequestContext] request_context @return [String]

# File lib/gruf/prometheus/client/collector.rb, line 92
def determine_type(request_context)
  case request_context.type.to_sym
  when :client_streamer
    Gruf::Prometheus::RequestTypes::CLIENT_STREAM
  when :server_streamer
    Gruf::Prometheus::RequestTypes::SERVER_STREAM
  when :bidi_streamer
    Gruf::Prometheus::RequestTypes::BIDI_STREAM
  else
    Gruf::Prometheus::RequestTypes::UNARY
  end
end
format_service_name(name) click to toggle source

Format the service name as `path.to.Service` (from `/path.to.Service/MethodName`)

@param [String] name @return [String]

# File lib/gruf/prometheus/client/collector.rb, line 84
def format_service_name(name)
  name.split('/').reject(&:empty?).first
end