Skip to content

Commit 31532b9

Browse files
committed
Added logic to track response size
1 parent 8bcae99 commit 31532b9

File tree

4 files changed

+34
-5
lines changed

4 files changed

+34
-5
lines changed

ice-rest-catalog/src/main/java/com/altinity/ice/rest/catalog/internal/metrics/HttpMetrics.java

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ public class HttpMetrics {
2525
private final Counter responsesTotal;
2626
private final Histogram requestDuration;
2727
private final Gauge requestsInFlight;
28+
private final Counter responseSizeBytes;
2829

2930
public static HttpMetrics getInstance() {
3031
if (instance == null) {
@@ -65,20 +66,31 @@ private HttpMetrics() {
6566
.name(HTTP_REQUESTS_IN_FLIGHT_NAME)
6667
.help(HTTP_REQUESTS_IN_FLIGHT_HELP)
6768
.register();
69+
70+
this.responseSizeBytes =
71+
Counter.builder()
72+
.name(HTTP_RESPONSE_SIZE_BYTES_NAME)
73+
.help(HTTP_RESPONSE_SIZE_BYTES_HELP)
74+
.labelNames(HTTP_REQUEST_LABELS)
75+
.register();
6876
}
6977

7078
public void recordRequestStart(String method, String route) {
7179
requestsTotal.labelValues(method, route).inc();
7280
requestsInFlight.inc();
7381
}
7482

75-
public void recordRequestEnd(String method, String route, int statusCode, long startTimeNanos) {
83+
public void recordRequestEnd(
84+
String method, String route, int statusCode, long startTimeNanos, long responseSize) {
7685
requestsInFlight.dec();
7786

7887
double durationSeconds =
7988
(System.nanoTime() - startTimeNanos) / (double) TimeUnit.SECONDS.toNanos(1);
8089
requestDuration.labelValues(method, route).observe(durationSeconds);
8190
responsesTotal.labelValues(method, route, Integer.toString(statusCode)).inc();
91+
if (responseSize > 0) {
92+
responseSizeBytes.labelValues(method, route).inc(responseSize);
93+
}
8294
}
8395

8496
public RequestTimer startRequest(String method, String route) {
@@ -91,6 +103,7 @@ public static class RequestTimer implements AutoCloseable {
91103
private final String route;
92104
private final long startTimeNanos;
93105
private int statusCode = 200;
106+
private long responseSize = 0;
94107

95108
RequestTimer(HttpMetrics metrics, String method, String route) {
96109
this.metrics = metrics;
@@ -105,9 +118,14 @@ public void setStatusCode(int statusCode) {
105118
this.statusCode = statusCode;
106119
}
107120

121+
/** Set the response size in bytes before closing. */
122+
public void setResponseSize(long responseSize) {
123+
this.responseSize = responseSize;
124+
}
125+
108126
@Override
109127
public void close() {
110-
metrics.recordRequestEnd(method, route, statusCode, startTimeNanos);
128+
metrics.recordRequestEnd(method, route, statusCode, startTimeNanos, responseSize);
111129
}
112130
}
113131
}

ice-rest-catalog/src/main/java/com/altinity/ice/rest/catalog/internal/metrics/IcebergMetricNames.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,9 @@ private IcebergMetricNames() {}
188188
public static final String HTTP_REQUESTS_IN_FLIGHT_HELP =
189189
"Number of HTTP requests currently being processed";
190190

191+
public static final String HTTP_RESPONSE_SIZE_BYTES_NAME = "iceberg_http_response_size_bytes";
192+
public static final String HTTP_RESPONSE_SIZE_BYTES_HELP = "HTTP response size in bytes";
193+
191194
/** HTTP request duration buckets (in seconds) - suitable for REST API calls. */
192195
public static final double[] HTTP_DURATION_BUCKETS = {
193196
0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10

ice-rest-catalog/src/main/java/com/altinity/ice/rest/catalog/internal/rest/RESTCatalogServlet.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,9 @@ protected void handle(HttpServletRequest request, HttpServletResponse response)
9797
.withType("BadRequestException")
9898
.withMessage(String.format("No route for %s %s", method, path))
9999
.build();
100-
RESTObjectMapper.mapper().writeValue(response.getWriter(), res);
100+
byte[] responseBytes = RESTObjectMapper.mapper().writeValueAsBytes(res);
101+
timer.setResponseSize(responseBytes.length);
102+
response.getOutputStream().write(responseBytes);
101103
}
102104
return;
103105
}
@@ -152,15 +154,19 @@ protected void handle(HttpServletRequest request, HttpServletResponse response)
152154
timer.setStatusCode(error.code());
153155
response.setStatus(error.code());
154156
response.setHeader(HttpHeaders.CONTENT_TYPE, ContentType.APPLICATION_JSON.getMimeType());
155-
RESTObjectMapper.mapper().writeValue(response.getWriter(), error);
157+
byte[] errorBytes = RESTObjectMapper.mapper().writeValueAsBytes(error);
158+
timer.setResponseSize(errorBytes.length);
159+
response.getOutputStream().write(errorBytes);
156160
return;
157161
}
158162

159163
timer.setStatusCode(HttpServletResponse.SC_OK);
160164
response.setStatus(HttpServletResponse.SC_OK);
161165
response.setHeader(HttpHeaders.CONTENT_TYPE, ContentType.APPLICATION_JSON.getMimeType());
162166
if (responseBody != null) {
163-
RESTObjectMapper.mapper().writeValue(response.getWriter(), responseBody);
167+
byte[] responseBytes = RESTObjectMapper.mapper().writeValueAsBytes(responseBody);
168+
timer.setResponseSize(responseBytes.length);
169+
response.getOutputStream().write(responseBytes);
164170
}
165171
}
166172
}

ice/src/main/resources/logback.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
<logger name="org.eclipse.jetty" level="WARN"/>
1515
<!-- hide "Unable to load metrics class: 'org.apache.iceberg.hadoop.HadoopMetricsContext', falling back to null metrics" -->
1616
<logger name="org.apache.iceberg.aws.s3.S3FileIO" level="ERROR"/>
17+
<!-- hide "Unclosed input stream" warnings from Iceberg's S3InputStream finalizer -->
18+
<logger name="org.apache.iceberg.aws.s3.S3InputStream" level="ERROR"/>
1719
<logger name="org.apache.iceberg.BaseMetastoreTableOperations" level="WARN"/>
1820
<logger name="io.grpc.internal" level="ERROR"/>
1921

0 commit comments

Comments
 (0)