grpc-ecosystem / go-grpc-prometheus

Prometheus monitoring for your gRPC Go servers.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

pre-defining gRPC call metrics

vespian opened this issue · comments

Currently, the vector metrics are created on the fly - i.e. once the call is made, the corresponding metric label is registered. So for example, if I have a unary gRPC service "Foo", only after I make a call to "Foo", the metrics with labels grpc_method=Foo grpc_service=FooService will appear in Prometheus' /metrics endpoint.

Would it be possible to add a method/function to pre-warm metrics in the case when one needs a complete set of possible metrics up-front? My use case is integration testing - while checking whether all the metrics are present/registered during integration test, I need to account for all gRPC calls that have been made during that test, which makes it flaky.

Prometheus Go client itself allows calling <metrics_object>.WithLabelValues(...) in order to achieve this.

Thanks in advance for a reply.

Are you looking for .InitializeMetrics?

@brancz Thanks for a reply. Yes, something like that but for a client.

I don’t believe it exists, but I think I’d be a great addition! :)

hi @brancz im looking to implement something to initialise the metrics for the client side and was wondering if you had any suggestions? Im think a function that initialises a particular method could be acceptable? let me know your suggestions!

// preRegisterMethod can be invoked on a client method to pre-populate a client method.
func (m *ClientMetrics) PreRegisterMethod(fullMethod string, methodType grpcType) {
	serviceName, methodName := splitMethodName(fullMethod)

	m.clientStartedCounter.GetMetricWithLabelValues(methodType, serviceName, methodName)
	m.clientStreamMsgReceived.GetMetricWithLabelValues(methodType, serviceName, methodName)
	m.clientStreamMsgSent.GetMetricWithLabelValues(methodType, serviceName, methodName)
	if m.clientHandledHistogramEnabled {
		m.clientHandledHistogram.GetMetricWithLabelValues(methodType, serviceName, methodName)
	}
	for _, code := range allCodes {
		m.clientHandledCounter.GetMetricWithLabelValues(methodType, serviceName, methodName, code.String())
	}
}