diff --git a/prometheus-metrics-exporter-common/src/main/java/io/prometheus/metrics/exporter/common/PrometheusScrapeHandler.java b/prometheus-metrics-exporter-common/src/main/java/io/prometheus/metrics/exporter/common/PrometheusScrapeHandler.java index 440110b33..fc88390cf 100644 --- a/prometheus-metrics-exporter-common/src/main/java/io/prometheus/metrics/exporter/common/PrometheusScrapeHandler.java +++ b/prometheus-metrics-exporter-common/src/main/java/io/prometheus/metrics/exporter/common/PrometheusScrapeHandler.java @@ -87,7 +87,7 @@ public void handleRequest(PrometheusHttpExchange exchange) throws IOException { // The HTTPServer implementation will throw an Exception if we close the output stream // without sending a response body, so let's not close the output stream in case of a HEAD // response. - response.sendHeadersAndGetBody(200, -1); + try (OutputStream unused = response.sendHeadersAndGetBody(200, -1)) {} } else { try (OutputStream outputStream = response.sendHeadersAndGetBody(200, contentLength)) { responseBuffer.writeTo(outputStream); @@ -154,29 +154,34 @@ private boolean writeDebugResponse( } else { response.setHeader("Content-Type", "text/plain; charset=utf-8"); int responseStatus = supportedFormats.contains(debugParam) ? 200 : 500; - OutputStream body = response.sendHeadersAndGetBody(responseStatus, 0); - switch (debugParam) { - case "openmetrics": - expositionFormats.getOpenMetricsTextFormatWriter().write(body, snapshots, escapingScheme); - break; - case "text": - expositionFormats.getPrometheusTextFormatWriter().write(body, snapshots, escapingScheme); - break; - case "prometheus-protobuf": - String debugString = - expositionFormats - .getPrometheusProtobufWriter() - .toDebugString(snapshots, escapingScheme); - body.write(debugString.getBytes(StandardCharsets.UTF_8)); - break; - default: - body.write( - ("debug=" - + debugParam - + ": Unsupported query parameter. Valid values are 'openmetrics', " - + "'text', and 'prometheus-protobuf'.") - .getBytes(StandardCharsets.UTF_8)); - break; + try (OutputStream body = response.sendHeadersAndGetBody(responseStatus, 0)) { + switch (debugParam) { + case "openmetrics": + expositionFormats + .getOpenMetricsTextFormatWriter() + .write(body, snapshots, escapingScheme); + break; + case "text": + expositionFormats + .getPrometheusTextFormatWriter() + .write(body, snapshots, escapingScheme); + break; + case "prometheus-protobuf": + String debugString = + expositionFormats + .getPrometheusProtobufWriter() + .toDebugString(snapshots, escapingScheme); + body.write(debugString.getBytes(StandardCharsets.UTF_8)); + break; + default: + body.write( + ("debug=" + + debugParam + + ": Unsupported query parameter. Valid values are 'openmetrics', " + + "'text', and 'prometheus-protobuf'.") + .getBytes(StandardCharsets.UTF_8)); + break; + } } return true; } diff --git a/prometheus-metrics-exporter-httpserver/src/main/java/io/prometheus/metrics/exporter/httpserver/HttpExchangeAdapter.java b/prometheus-metrics-exporter-httpserver/src/main/java/io/prometheus/metrics/exporter/httpserver/HttpExchangeAdapter.java index 3e0322309..0fffb794c 100644 --- a/prometheus-metrics-exporter-httpserver/src/main/java/io/prometheus/metrics/exporter/httpserver/HttpExchangeAdapter.java +++ b/prometheus-metrics-exporter-httpserver/src/main/java/io/prometheus/metrics/exporter/httpserver/HttpExchangeAdapter.java @@ -103,7 +103,7 @@ public void handleException(RuntimeException e) { private void sendErrorResponseWithStackTrace(Exception requestHandlerException) { if (!responseSent) { responseSent = true; - try { + try (OutputStream errorStream = httpExchange.getResponseBody()) { StringWriter stringWriter = new StringWriter(); PrintWriter printWriter = new PrintWriter(stringWriter); printWriter.write("An Exception occurred while scraping metrics: "); @@ -111,7 +111,7 @@ private void sendErrorResponseWithStackTrace(Exception requestHandlerException) byte[] stackTrace = stringWriter.toString().getBytes(StandardCharsets.UTF_8); httpExchange.getResponseHeaders().set("Content-Type", "text/plain; charset=utf-8"); httpExchange.sendResponseHeaders(500, stackTrace.length); - httpExchange.getResponseBody().write(stackTrace); + errorStream.write(stackTrace); } catch (Exception errorWriterException) { // We want to avoid logging so that we don't mess with application logs when the HTTPServer // is used in a Java agent.