Javatar
Javatar

Reputation: 665

measure requests per second with micrometer, spring boot and prometheus

I'm updating a microservice to spring boot 2 and migrating metrics from dropwizard to micrometer. We are using prometheus to store metrics and grafana to display them. I want to measure requests per second to all URLs. Micrometer documentation states that:

Timers are intended for measuring short-duration latencies, and the frequency of such events.

So timers seem to be the way to do the job:

                Timer.Sample sample = log ? Timer.start(registry)
                //...code which executes request...
                List<Tag> tags = Arrays.asList(
                        Tag.of("status", status),
                        Tag.of("uri", uri),
                        Tag.of("method", request.getMethod()));
                Timer timer = Timer.builder(TIMER_REST)
                        .tags(tags)
                        .publishPercentiles(0.95, 0.99)
                       .distributionStatisticExpiry(Duration.ofSeconds(30))
                        .register(registry);
                sample.stop(timer);

but it doesn't produce any rate per second, instead we have metrics similar to:

# TYPE timer_rest_seconds summary
timer_rest_seconds{method="GET",status="200",uri="/test",quantile="0.95",} 0.620756992
timer_rest_seconds{method="GET",status="200",uri="/test",quantile="0.99",} 0.620756992
timer_rest_seconds_count{method="GET",status="200",uri="/test",} 7.0
timer_rest_seconds_sum{method="GET",status="200",uri="/test",} 3.656080641
# HELP timer_rest_seconds_max  
# TYPE timer_rest_seconds_max gauge
timer_rest_seconds_max{method="GET",status="200",uri="/test",} 0.605290436

what would be the proper way to solve this? Should the rate per second be calculated via prometheus queries or returned via spring actuator endpoint?

Upvotes: 8

Views: 15923

Answers (1)

Kert Kukk
Kert Kukk

Reputation: 715

Prometheus provides a functional query language called PromQL (Prometheus Query Language) that lets the user select and aggregate time series data in real time. You can use rate() function:

The following example expression returns the per-second rate of HTTP requests as measured over the last 5 minutes, per time series in the range vector:

rate(http_requests_total{job="api-server"}[5m])

Upvotes: 6

Related Questions