From 0e340a83b90b09a4f09326f5361176ed1c1c7978 Mon Sep 17 00:00:00 2001 From: Takanori Takase Date: Thu, 12 Mar 2020 21:01:29 +0900 Subject: [PATCH 1/4] Wrap PrintWriter with BufferedWriter Signed-off-by: Takanori Takase --- .../java/io/prometheus/client/exporter/MetricsServlet.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/simpleclient_servlet/src/main/java/io/prometheus/client/exporter/MetricsServlet.java b/simpleclient_servlet/src/main/java/io/prometheus/client/exporter/MetricsServlet.java index db579e424..81c5453be 100644 --- a/simpleclient_servlet/src/main/java/io/prometheus/client/exporter/MetricsServlet.java +++ b/simpleclient_servlet/src/main/java/io/prometheus/client/exporter/MetricsServlet.java @@ -7,6 +7,7 @@ import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import java.io.BufferedWriter; import java.io.IOException; import java.io.Writer; import java.util.Arrays; @@ -43,7 +44,7 @@ protected void doGet(final HttpServletRequest req, final HttpServletResponse res resp.setStatus(HttpServletResponse.SC_OK); resp.setContentType(TextFormat.CONTENT_TYPE_004); - Writer writer = resp.getWriter(); + Writer writer = new BufferedWriter(resp.getWriter()); try { TextFormat.write004(writer, registry.filteredMetricFamilySamples(parse(req))); writer.flush(); From 67cd94863bb2595dae90c048b4dd9a3481c29385 Mon Sep 17 00:00:00 2001 From: Takanori Takase Date: Thu, 12 Mar 2020 21:11:10 +0900 Subject: [PATCH 2/4] Microbenchmark for BufferedWriter wrapper Signed-off-by: Takanori Takase --- .../client/exporter/ExampleBenchmark.java | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 simpleclient_servlet/src/test/java/io/prometheus/client/exporter/ExampleBenchmark.java diff --git a/simpleclient_servlet/src/test/java/io/prometheus/client/exporter/ExampleBenchmark.java b/simpleclient_servlet/src/test/java/io/prometheus/client/exporter/ExampleBenchmark.java new file mode 100644 index 000000000..436382944 --- /dev/null +++ b/simpleclient_servlet/src/test/java/io/prometheus/client/exporter/ExampleBenchmark.java @@ -0,0 +1,52 @@ +package io.prometheus.client.exporter; + +import io.prometheus.client.Gauge; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.servlet.ServletContextHandler; +import org.eclipse.jetty.servlet.ServletHolder; + +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.UUID; + +public class ExampleBenchmark { + + public static void main(String[] args) throws Exception { + + Gauge gauge = Gauge.build().name("labels").help("foo").labelNames("bar").register(); + for (int i = 0; i < 10000; i++) { + gauge.labels(UUID.randomUUID().toString()).set(Math.random()); + } + + ServletContextHandler context = new ServletContextHandler(); + context.setContextPath("/"); + context.addServlet(new ServletHolder(new MetricsServlet()), "/metrics"); + + Server server = new Server(1234); + server.setHandler(context); + server.start(); + Thread.sleep(1000); + + byte[] bytes = new byte[8192]; + URL url = new URL("http://localhost:1234/metrics"); + + long start = System.nanoTime(); + for (int i = 0; i < 100; i++) { + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + InputStream in = connection.getInputStream(); + try { + while (in.read(bytes) != -1) in.available(); + } finally { + in.close(); + } + connection.disconnect(); + } + System.out.println(String.format("%,3d ns", System.nanoTime() - start)); + + server.stop(); + server.join(); + + } + +} From 87918da29423b6488598257a29227f08faddfbf5 Mon Sep 17 00:00:00 2001 From: Takanori Takase Date: Sat, 14 Mar 2020 22:06:34 +0900 Subject: [PATCH 3/4] Fixed unit test for PR #540. Signed-off-by: Takanori Takase --- .../io/prometheus/client/exporter/MetricsServletTest.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/simpleclient_servlet/src/test/java/io/prometheus/client/exporter/MetricsServletTest.java b/simpleclient_servlet/src/test/java/io/prometheus/client/exporter/MetricsServletTest.java index 43f3c7d59..2fccbc502 100644 --- a/simpleclient_servlet/src/test/java/io/prometheus/client/exporter/MetricsServletTest.java +++ b/simpleclient_servlet/src/test/java/io/prometheus/client/exporter/MetricsServletTest.java @@ -12,9 +12,8 @@ import java.io.StringWriter; import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.assertj.core.api.Assertions.fail; -import static org.mockito.Matchers.anyChar; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.Matchers.anyInt; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; @@ -63,8 +62,7 @@ public void testWriterIsClosedOnException() throws IOException, ServletException HttpServletResponse resp = mock(HttpServletResponse.class); PrintWriter writer = mock(PrintWriter.class); when(resp.getWriter()).thenReturn(writer); - doThrow(new RuntimeException()).when(writer).write(anyChar()); - doThrow(new RuntimeException()).when(writer).write(anyInt()); + doThrow(new RuntimeException()).when(writer).write(any(char[].class), anyInt(), anyInt()); CollectorRegistry registry = new CollectorRegistry(); Gauge a = Gauge.build("a", "a help").register(registry); From 3f8eab337e038ced3e7d9afb4753c133bd13bf9b Mon Sep 17 00:00:00 2001 From: Takanori Takase Date: Sun, 15 Mar 2020 00:17:24 +0900 Subject: [PATCH 4/4] Bind test port to 0. Signed-off-by: Takanori Takase --- .../java/io/prometheus/client/exporter/ExampleBenchmark.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/simpleclient_servlet/src/test/java/io/prometheus/client/exporter/ExampleBenchmark.java b/simpleclient_servlet/src/test/java/io/prometheus/client/exporter/ExampleBenchmark.java index 436382944..066da1499 100644 --- a/simpleclient_servlet/src/test/java/io/prometheus/client/exporter/ExampleBenchmark.java +++ b/simpleclient_servlet/src/test/java/io/prometheus/client/exporter/ExampleBenchmark.java @@ -23,13 +23,13 @@ public static void main(String[] args) throws Exception { context.setContextPath("/"); context.addServlet(new ServletHolder(new MetricsServlet()), "/metrics"); - Server server = new Server(1234); + Server server = new Server(0); server.setHandler(context); server.start(); Thread.sleep(1000); byte[] bytes = new byte[8192]; - URL url = new URL("http://localhost:1234/metrics"); + URL url = new URL("http", "localhost", server.getConnectors()[0].getLocalPort(), "/metrics"); long start = System.nanoTime(); for (int i = 0; i < 100; i++) {