Skip to content

Commit ac5136b

Browse files
after-the-sunriseTakanori Takase
andauthored
Wrap PrintWriter with BufferedWriter (#540)
* Wrap PrintWriter with BufferedWriter * Microbenchmark for BufferedWriter wrapper Signed-off-by: Takanori Takase <[email protected]> Co-authored-by: Takanori Takase <[email protected]>
1 parent c3dc1f2 commit ac5136b

File tree

3 files changed

+56
-5
lines changed

3 files changed

+56
-5
lines changed

simpleclient_servlet/src/main/java/io/prometheus/client/exporter/MetricsServlet.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import javax.servlet.http.HttpServlet;
88
import javax.servlet.http.HttpServletRequest;
99
import javax.servlet.http.HttpServletResponse;
10+
import java.io.BufferedWriter;
1011
import java.io.IOException;
1112
import java.io.Writer;
1213
import java.util.Arrays;
@@ -43,7 +44,7 @@ protected void doGet(final HttpServletRequest req, final HttpServletResponse res
4344
resp.setStatus(HttpServletResponse.SC_OK);
4445
resp.setContentType(TextFormat.CONTENT_TYPE_004);
4546

46-
Writer writer = resp.getWriter();
47+
Writer writer = new BufferedWriter(resp.getWriter());
4748
try {
4849
TextFormat.write004(writer, registry.filteredMetricFamilySamples(parse(req)));
4950
writer.flush();
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package io.prometheus.client.exporter;
2+
3+
import io.prometheus.client.Gauge;
4+
import org.eclipse.jetty.server.Server;
5+
import org.eclipse.jetty.servlet.ServletContextHandler;
6+
import org.eclipse.jetty.servlet.ServletHolder;
7+
8+
import java.io.InputStream;
9+
import java.net.HttpURLConnection;
10+
import java.net.URL;
11+
import java.util.UUID;
12+
13+
public class ExampleBenchmark {
14+
15+
public static void main(String[] args) throws Exception {
16+
17+
Gauge gauge = Gauge.build().name("labels").help("foo").labelNames("bar").register();
18+
for (int i = 0; i < 10000; i++) {
19+
gauge.labels(UUID.randomUUID().toString()).set(Math.random());
20+
}
21+
22+
ServletContextHandler context = new ServletContextHandler();
23+
context.setContextPath("/");
24+
context.addServlet(new ServletHolder(new MetricsServlet()), "/metrics");
25+
26+
Server server = new Server(0);
27+
server.setHandler(context);
28+
server.start();
29+
Thread.sleep(1000);
30+
31+
byte[] bytes = new byte[8192];
32+
URL url = new URL("http", "localhost", server.getConnectors()[0].getLocalPort(), "/metrics");
33+
34+
long start = System.nanoTime();
35+
for (int i = 0; i < 100; i++) {
36+
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
37+
InputStream in = connection.getInputStream();
38+
try {
39+
while (in.read(bytes) != -1) in.available();
40+
} finally {
41+
in.close();
42+
}
43+
connection.disconnect();
44+
}
45+
System.out.println(String.format("%,3d ns", System.nanoTime() - start));
46+
47+
server.stop();
48+
server.join();
49+
50+
}
51+
52+
}

simpleclient_servlet/src/test/java/io/prometheus/client/exporter/MetricsServletTest.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,8 @@
1212
import java.io.StringWriter;
1313

1414
import static org.assertj.core.api.Assertions.assertThat;
15-
import static org.assertj.core.api.Assertions.assertThatThrownBy;
1615
import static org.assertj.core.api.Assertions.fail;
17-
import static org.mockito.Matchers.anyChar;
16+
import static org.mockito.ArgumentMatchers.any;
1817
import static org.mockito.Matchers.anyInt;
1918
import static org.mockito.Mockito.doThrow;
2019
import static org.mockito.Mockito.mock;
@@ -63,8 +62,7 @@ public void testWriterIsClosedOnException() throws IOException, ServletException
6362
HttpServletResponse resp = mock(HttpServletResponse.class);
6463
PrintWriter writer = mock(PrintWriter.class);
6564
when(resp.getWriter()).thenReturn(writer);
66-
doThrow(new RuntimeException()).when(writer).write(anyChar());
67-
doThrow(new RuntimeException()).when(writer).write(anyInt());
65+
doThrow(new RuntimeException()).when(writer).write(any(char[].class), anyInt(), anyInt());
6866
CollectorRegistry registry = new CollectorRegistry();
6967
Gauge a = Gauge.build("a", "a help").register(registry);
7068

0 commit comments

Comments
 (0)