Skip to content

Commit

Permalink
Tweak performance for Prometheus scraping endpoint
Browse files Browse the repository at this point in the history
Reduce the number of times capacity growth is needed inside the StringWriter.
A typical default SpringBoot Prometheus page has more than 11k characters.
Best performance results when no capacity growth is needed at all, so base
it on previous metrics page size plus some room for possible extra metric info.

See gh-30085
  • Loading branch information
stokpop authored and mhalbritter committed Mar 9, 2022
1 parent a71d9f5 commit e2ebb56
Showing 1 changed file with 10 additions and 2 deletions.
Expand Up @@ -42,21 +42,29 @@
@WebEndpoint(id = "prometheus")
public class PrometheusScrapeEndpoint {

private static final int METRICS_SCRAPE_CHARS_EXTRA = 1024;

private final CollectorRegistry collectorRegistry;

private volatile int nextMetricsScrapeSize = 16;

public PrometheusScrapeEndpoint(CollectorRegistry collectorRegistry) {
this.collectorRegistry = collectorRegistry;
}

@ReadOperation(producesFrom = TextOutputFormat.class)
public WebEndpointResponse<String> scrape(TextOutputFormat format, @Nullable Set<String> includedNames) {
try {
Writer writer = new StringWriter();
Writer writer = new StringWriter(nextMetricsScrapeSize);
Enumeration<MetricFamilySamples> samples = (includedNames != null)
? this.collectorRegistry.filteredMetricFamilySamples(includedNames)
: this.collectorRegistry.metricFamilySamples();
format.write(writer, samples);
return new WebEndpointResponse<>(writer.toString(), format);

String scrapePage = writer.toString();
nextMetricsScrapeSize = scrapePage.length() + METRICS_SCRAPE_CHARS_EXTRA;

return new WebEndpointResponse<>(scrapePage, format);
}
catch (IOException ex) {
// This actually never happens since StringWriter doesn't throw an IOException
Expand Down

0 comments on commit e2ebb56

Please sign in to comment.