class Gruf::Prometheus::Server::Collector

Prometheus instrumentor for gRPC servers

Constants

RESPONSE_CODE_OK

Public Instance Methods

handled_latency_seconds(request:, result:) click to toggle source

@param [Gruf::Controller::Request] request @param [Gruf::Interceptors::Timer::Result] result

# File lib/gruf/prometheus/server/collector.rb, line 52
def handled_latency_seconds(request:, result:)
  push(
    grpc_server_handled_latency_seconds: result.elapsed.to_f,
    custom_labels: custom_labels(request: request, result: result)
  )
end
handled_total(request:, result:) click to toggle source

@param [Gruf::Controller::Request] request @param [Gruf::Interceptors::Timer::Result] result:party

# File lib/gruf/prometheus/server/collector.rb, line 41
def handled_total(request:, result:)
  push(
    grpc_server_handled_total: 1,
    custom_labels: custom_labels(request: request, result: result)
  )
end
started_total(request:) click to toggle source

@param [Gruf::Controller::Request] request

# File lib/gruf/prometheus/server/collector.rb, line 30
def started_total(request:)
  push(
    grpc_server_started_total: 1,
    custom_labels: custom_labels(request: request)
  )
end

Private Instance Methods

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

@param [Gruf::Controller::Request] request @param [Gruf::Interceptors::Timer::Result|NilClass] result @return [Hash]

# File lib/gruf/prometheus/server/collector.rb, line 66
def custom_labels(request:, result: nil)
  labels = {
    grpc_service: format_grpc_service_name(request.service.name.to_s),
    grpc_method: format_grpc_method_name(request.method_key.to_s),
    grpc_type: determine_type(request)
  }
  if result
    labels[:grpc_code] = result.successful? ? RESPONSE_CODE_OK : result.message_class_name.split('::').last
  end
  labels
end
determine_type(request) click to toggle source

@param [Gruf::Controller::Request] request @return [String]

# File lib/gruf/prometheus/server/collector.rb, line 108
def determine_type(request)
  if request.client_streamer?
    Gruf::Prometheus::RequestTypes::CLIENT_STREAM
  elsif request.server_streamer?
    Gruf::Prometheus::RequestTypes::SERVER_STREAM
  elsif request.bidi_streamer?
    Gruf::Prometheus::RequestTypes::BIDI_STREAM
  else
    Gruf::Prometheus::RequestTypes::UNARY
  end
end
format_grpc_method_name(name) click to toggle source

Format the method name as `MethodName` (from method_name)

@param [String] name @return [String]

# File lib/gruf/prometheus/server/collector.rb, line 100
def format_grpc_method_name(name)
  name.split('_').map(&:capitalize).join
end
format_grpc_service_name(name) click to toggle source

Format the service name as `path.to.Service` (from Path::To::Service)

@param [String] name @return [String]

# File lib/gruf/prometheus/server/collector.rb, line 84
def format_grpc_service_name(name)
  parts = name.split('::')
  return '' unless parts.any?

  svc = parts.pop.to_s
  parts.map!(&:downcase)
  parts << svc
  parts.join('.')
end