Merge pull request #30085 from stokpop

* pr-30085:
  Polish "Tweak performance for Prometheus scraping endpoint"
  Tweak performance for Prometheus scraping endpoint

Closes gh-30085
pull/30505/head
Moritz Halbritter 3 years ago
commit e84e5174be

@ -42,8 +42,12 @@ import org.springframework.lang.Nullable;
@WebEndpoint(id = "prometheus") @WebEndpoint(id = "prometheus")
public class PrometheusScrapeEndpoint { public class PrometheusScrapeEndpoint {
private static final int METRICS_SCRAPE_CHARS_EXTRA = 1024;
private final CollectorRegistry collectorRegistry; private final CollectorRegistry collectorRegistry;
private volatile int nextMetricsScrapeSize = 16;
public PrometheusScrapeEndpoint(CollectorRegistry collectorRegistry) { public PrometheusScrapeEndpoint(CollectorRegistry collectorRegistry) {
this.collectorRegistry = collectorRegistry; this.collectorRegistry = collectorRegistry;
} }
@ -51,12 +55,16 @@ public class PrometheusScrapeEndpoint {
@ReadOperation(producesFrom = TextOutputFormat.class) @ReadOperation(producesFrom = TextOutputFormat.class)
public WebEndpointResponse<String> scrape(TextOutputFormat format, @Nullable Set<String> includedNames) { public WebEndpointResponse<String> scrape(TextOutputFormat format, @Nullable Set<String> includedNames) {
try { try {
Writer writer = new StringWriter(); Writer writer = new StringWriter(this.nextMetricsScrapeSize);
Enumeration<MetricFamilySamples> samples = (includedNames != null) Enumeration<MetricFamilySamples> samples = (includedNames != null)
? this.collectorRegistry.filteredMetricFamilySamples(includedNames) ? this.collectorRegistry.filteredMetricFamilySamples(includedNames)
: this.collectorRegistry.metricFamilySamples(); : this.collectorRegistry.metricFamilySamples();
format.write(writer, samples); format.write(writer, samples);
return new WebEndpointResponse<>(writer.toString(), format);
String scrapePage = writer.toString();
this.nextMetricsScrapeSize = scrapePage.length() + METRICS_SCRAPE_CHARS_EXTRA;
return new WebEndpointResponse<>(scrapePage, format);
} }
catch (IOException ex) { catch (IOException ex) {
// This actually never happens since StringWriter doesn't throw an IOException // This actually never happens since StringWriter doesn't throw an IOException

Loading…
Cancel
Save