1

I want to capture metrics (number of calls, 95th percentile) about calls made from my backend service to other third party services. I am using WebClient to make these http calls. I couldn't find a specific property to enable WebClient Histogram metrics.

I have added MetricsWebClientFilterFunction to generate the metrics. Here is the logic -

WebClient webClient = WebClient.builder() .baseUrl(SERVICE_URL) .filter(new MetricsWebClientFilterFunction(meterRegistry, new DefaultWebClientExchangeTagsProvider(), "webClientCalls", AutoTimer.ENABLED)) .build();

Its generating only count and sum metrics. How can I generate histogram metrics for WebClient calls?

Here is the output in /actuator/prometheus endpoint -

webClientCalls_seconds_count{clientName="service_url",method="GET",outcome="SUCCESS",status="200",uri="/hello",} 1.0 webClientCalls_seconds_sum{clientName="service_url",method="GET",outcome="SUCCESS",status="200",uri="/hello",} 2.301044994

webClientCalls_seconds_max{clientName="service_url",method="GET",outcome="SUCCESS",status="200",uri="/hello",} 0.0

spachip
  • 33
  • 3

1 Answers1

0

Just implement AutoTimer interface and override apply method.

public final class AutoTimerHistogram implements AutoTimer {
  @Override
  public void apply(Timer.Builder builder) {
    builder
        .serviceLevelObjectives(
            Duration.ofMillis(100),
            Duration.ofMillis(500),
            Duration.ofMillis(800),
            Duration.ofMillis(1000),
            Duration.ofMillis(1200))
        .minimumExpectedValue(Duration.ofMillis(100))
        .maximumExpectedValue(Duration.ofMillis(10000));
  }
}

After that add it to your MetricsWebClientFilterFunction

    MetricsWebClientFilterFunction metricsFilter =
        new MetricsWebClientFilterFunction(
            meterRegistry,
            new DefaultWebClientExchangeTagsProvider(),
            "custom.web.client",
            autoTimerHistogram);
# TYPE custom_web_client_seconds histogram
custom_web_client_seconds_bucket{clientName="login.microsoftonline.com",method="POST",outcome="SUCCESS",status="200",uri="/common/oauth2/v2.0/token",le="0.1",} 0.0
custom_web_client_seconds_bucket{clientName="login.microsoftonline.com",method="POST",outcome="SUCCESS",status="200",uri="/common/oauth2/v2.0/token",le="0.5",} 0.0
custom_web_client_seconds_bucket{clientName="login.microsoftonline.com",method="POST",outcome="SUCCESS",status="200",uri="/common/oauth2/v2.0/token",le="0.8",} 1.0
custom_web_client_seconds_bucket{clientName="login.microsoftonline.com",method="POST",outcome="SUCCESS",status="200",uri="/common/oauth2/v2.0/token",le="1.0",} 1.0
custom_web_client_seconds_bucket{clientName="login.microsoftonline.com",method="POST",outcome="SUCCESS",status="200",uri="/common/oauth2/v2.0/token",le="1.2",} 1.0
custom_web_client_seconds_bucket{clientName="login.microsoftonline.com",method="POST",outcome="SUCCESS",status="200",uri="/common/oauth2/v2.0/token",le="+Inf",} 1.0
custom_web_client_seconds_count{clientName="login.microsoftonline.com",method="POST",outcome="SUCCESS",status="200",uri="/common/oauth2/v2.0/token",} 1.0
custom_web_client_seconds_sum{clientName="login.microsoftonline.com",method="POST",outcome="SUCCESS",status="200",uri="/common/oauth2/v2.0/token",} 0.646656087

Grkajac
  • 1
  • 3