Skip to content

Commit d4f32a2

Browse files
committed
Get all the http servers working with OM.
Signed-off-by: Brian Brazil <brian.brazil@robustperception.io>
1 parent 99e209d commit d4f32a2

File tree

8 files changed

+68
-11
lines changed

8 files changed

+68
-11
lines changed

simpleclient_common/src/main/java/io/prometheus/client/exporter/common/TextFormat.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,7 @@ public static void writeOpenMetrics100(Writer writer, Enumeration<Collector.Metr
218218
writer.write('\n');
219219
}
220220
}
221+
writer.write("# EOF\n");
221222
}
222223

223224
private static String omTypeString(Collector.Type t) {

simpleclient_httpserver/src/test/java/io/prometheus/client/exporter/TestHTTPServer.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,17 @@ String requestWithCompression(String context, String suffix) throws IOException
6565
return s.hasNext() ? s.next() : "";
6666
}
6767

68+
String requestWithAccept(String accept) throws IOException {
69+
String url = "http://localhost:" + s.server.getAddress().getPort();
70+
URLConnection connection = new URL(url).openConnection();
71+
connection.setDoOutput(true);
72+
connection.setDoInput(true);
73+
connection.setRequestProperty("Accept", accept);
74+
Scanner s = new Scanner(connection.getInputStream(), "UTF-8").useDelimiter("\\A");
75+
return s.hasNext() ? s.next() : "";
76+
}
77+
78+
@Test
6879
@Test(expected = IllegalArgumentException.class)
6980
public void testRefuseUsingUnbound() throws IOException {
7081
CollectorRegistry registry = new CollectorRegistry();
@@ -120,6 +131,12 @@ public void testGzipCompression() throws IOException {
120131
assertThat(response).contains("c 0.0");
121132
}
122133

134+
@Test
135+
public void testOpenMetrics() throws IOException {
136+
String response = requestWithAccept("application/openmetrics-text; version=0.0.1,text/plain;version=0.0.4;q=0.5,*/*;q=0.1");
137+
assertThat(response).contains("# EOF");
138+
}
139+
123140
@Test
124141
public void testHealth() throws IOException {
125142
String response = request("/-/healthy", "");

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,12 @@ public MetricsServlet(CollectorRegistry registry) {
4242
protected void doGet(final HttpServletRequest req, final HttpServletResponse resp)
4343
throws ServletException, IOException {
4444
resp.setStatus(HttpServletResponse.SC_OK);
45-
resp.setContentType(TextFormat.CONTENT_TYPE_004);
45+
String contentType = TextFormat.chooseContentType(req.getHeader("Accept"));
46+
resp.setContentType(contentType);
4647

4748
Writer writer = new BufferedWriter(resp.getWriter());
4849
try {
49-
TextFormat.write004(writer, registry.filteredMetricFamilySamples(parse(req)));
50+
TextFormat.writeFormat(contentType, writer, registry.filteredMetricFamilySamples(parse(req)));
5051
writer.flush();
5152
} finally {
5253
writer.close();

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,4 +74,23 @@ public void testWriterIsClosedOnException() throws IOException, ServletException
7474

7575
verify(writer).close();
7676
}
77+
78+
@Test
79+
public void testOpenMetricsNegotiated() throws IOException, ServletException {
80+
CollectorRegistry registry = new CollectorRegistry();
81+
Gauge.build("a", "a help").register(registry);
82+
83+
HttpServletRequest req = mock(HttpServletRequest.class);
84+
when(req.getHeader("Accept")).thenReturn("application/openmetrics-text; version=0.0.1,text/plain;version=0.0.4;q=0.5,*/*;q=0.1");
85+
HttpServletResponse resp = mock(HttpServletResponse.class);
86+
StringWriter stringWriter = new StringWriter();
87+
PrintWriter writer = new PrintWriter(stringWriter);
88+
when(resp.getWriter()).thenReturn(writer);
89+
90+
new MetricsServlet(registry).doGet(req, resp);
91+
92+
assertThat(stringWriter.toString()).contains("a 0.0");
93+
assertThat(stringWriter.toString()).contains("# EOF");
94+
}
95+
7796
}

simpleclient_spring_boot/src/main/java/io/prometheus/client/spring/boot/PrometheusEndpoint.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,13 @@ class PrometheusEndpoint extends AbstractEndpoint<String> {
2323

2424
@Override
2525
public String invoke() {
26-
return writeRegistry(Collections.<String>emptySet());
26+
return writeRegistry(Collections.<String>emptySet(), "");
2727
}
2828

29-
public String writeRegistry(Set<String> metricsToInclude) {
29+
public String writeRegistry(Set<String> metricsToInclude, String contentType) {
3030
try {
3131
Writer writer = new StringWriter();
32-
TextFormat.write004(writer, collectorRegistry.filteredMetricFamilySamples(metricsToInclude));
32+
TextFormat.writeFormat(contentType, writer, collectorRegistry.filteredMetricFamilySamples(metricsToInclude));
3333
return writer.toString();
3434
} catch (IOException e) {
3535
// This actually never happens since StringWriter::write() doesn't throw any IOException

simpleclient_spring_boot/src/main/java/io/prometheus/client/spring/boot/PrometheusMvcEndpoint.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter;
55
import org.springframework.boot.context.properties.ConfigurationProperties;
66
import org.springframework.http.ResponseEntity;
7+
import org.springframework.web.bind.annotation.RequestHeader;
78
import org.springframework.web.bind.annotation.RequestMapping;
89
import org.springframework.web.bind.annotation.RequestMethod;
910
import org.springframework.web.bind.annotation.RequestParam;
@@ -29,16 +30,18 @@ public PrometheusMvcEndpoint(PrometheusEndpoint delegate) {
2930
)
3031
@ResponseBody
3132
public ResponseEntity value(
32-
@RequestParam(value = "name[]", required = false, defaultValue = "") Set<String> name) {
33+
@RequestParam(value = "name[]", required = false, defaultValue = "") Set<String> name,
34+
@RequestHeader(value = "Accept", required = false, defaultValue = "") String accept) {
3335
if (!getDelegate().isEnabled()) {
3436
// Shouldn't happen - MVC endpoint shouldn't be registered when delegate's
3537
// disabled
3638
return getDisabledResponse();
3739
}
3840

39-
String result = delgate.writeRegistry(name);
41+
String contentType = TextFormat.chooseContentType(accept);
42+
String result = delgate.writeRegistry(name, contentType);
4043
return ResponseEntity.ok()
41-
.header(CONTENT_TYPE, TextFormat.CONTENT_TYPE_004)
44+
.header(CONTENT_TYPE, contentType)
4245
.body(result);
4346
}
4447
}

simpleclient_spring_boot/src/test/java/io/prometheus/client/spring/boot/PrometheusMvcEndpointTest.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import org.springframework.test.context.junit4.SpringRunner;
1818

1919
import static org.junit.Assert.assertEquals;
20+
import static org.junit.Assert.assertTrue;
2021
import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT;
2122

2223
@RunWith(SpringRunner.class)
@@ -50,6 +51,19 @@ public void testAcceptPlainText() throws Exception {
5051
assertEquals(HttpStatus.OK, metricsResponse.getStatusCode());
5152
}
5253

54+
@Test
55+
public void testAcceptOpenMetrics() throws Exception {
56+
57+
HttpHeaders headers = new HttpHeaders();
58+
headers.set("Accept", "application/openmetrics-text; version=0.0.1,text/plain;version=0.0.4;q=0.5,*/*;q=0.1");
59+
60+
ResponseEntity<String> metricsResponse = template.exchange(getBaseUrl() + "/prometheus", HttpMethod.GET, new HttpEntity(headers), String.class);
61+
62+
assertEquals(HttpStatus.OK, metricsResponse.getStatusCode());
63+
assertEquals(StringUtils.deleteWhitespace(TextFormat.CONTENT_TYPE_OPENMETRICS_100), metricsResponse.getHeaders().getContentType().toString().toLowerCase());
64+
assertTrue(metricsResponse.getBody().contains("# EOF"));
65+
}
66+
5367
@Test
5468
public void testNameParamIsNotNull() {
5569
ResponseEntity metricsResponse = template.exchange(getBaseUrl() + "/prometheus?name[]=foo_bar", HttpMethod.GET, getEntity(), String.class);
@@ -68,4 +82,4 @@ public HttpEntity getEntity() {
6882
private String getBaseUrl() {
6983
return "http://localhost:" + localServerPort;
7084
}
71-
}
85+
}

simpleclient_vertx/src/main/java/io/prometheus/client/vertx/MetricsHandler.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,10 +73,12 @@ public MetricsHandler(CollectorRegistry registry) {
7373
public void handle(RoutingContext ctx) {
7474
try {
7575
final BufferWriter writer = new BufferWriter();
76-
TextFormat.write004(writer, registry.filteredMetricFamilySamples(parse(ctx.request())));
76+
String contentType = TextFormat.chooseContentType(ctx.request().headers().get("Accept"));
77+
78+
TextFormat.writeFormat(contentType, writer, registry.filteredMetricFamilySamples(parse(ctx.request())));
7779
ctx.response()
7880
.setStatusCode(200)
79-
.putHeader("Content-Type", TextFormat.CONTENT_TYPE_004)
81+
.putHeader("Content-Type", contentType)
8082
.end(writer.getBuffer());
8183
} catch (IOException e) {
8284
ctx.fail(e);

0 commit comments

Comments
 (0)