1
1
package io .prometheus .client .filter ;
2
2
3
+ import io .prometheus .client .Counter ;
3
4
import io .prometheus .client .Histogram ;
4
5
5
6
import javax .servlet .Filter ;
9
10
import javax .servlet .ServletRequest ;
10
11
import javax .servlet .ServletResponse ;
11
12
import javax .servlet .http .HttpServletRequest ;
13
+ import javax .servlet .http .HttpServletResponse ;
12
14
import java .io .IOException ;
13
15
14
16
/**
15
17
* The MetricsFilter class exists to provide a high-level filter that enables tunable collection of metrics for Servlet
16
18
* performance.
17
19
*
18
- * <p>The Histogram name itself is required, and configured with a {@code metric-name} init parameter.
20
+ * <p>The metric name itself is required, and configured with a {@code metric-name} init parameter.
19
21
*
20
22
* <p>The help parameter, configured with the {@code help} init parameter, is not required but strongly recommended.
21
23
*
26
28
* <p>The Histogram buckets can be configured with a {@code buckets} init parameter whose value is a comma-separated list
27
29
* of valid {@code double} values.
28
30
*
31
+ * <p>HTTP statuses will be aggregated via Counter. The name for this counter will be derived from the {@code metric-name} init parameter.
32
+ *
29
33
* <pre>{@code
30
34
* <filter>
31
35
* <filter-name>prometheusFilter</filter-name>
34
38
* <param-name>metric-name</param-name>
35
39
* <param-value>webapp_metrics_filter</param-value>
36
40
* </init-param>
37
- * <init-param>
41
+ * <init-param>
38
42
* <param-name>help</param-name>
39
43
* <param-value>The time taken fulfilling servlet requests</param-value>
40
44
* </init-param>
@@ -56,8 +60,10 @@ public class MetricsFilter implements Filter {
56
60
static final String HELP_PARAM = "help" ;
57
61
static final String METRIC_NAME_PARAM = "metric-name" ;
58
62
static final String BUCKET_CONFIG_PARAM = "buckets" ;
63
+ static final String UNKNOWN_HTTP_STATUS_CODE = "" ;
59
64
60
65
private Histogram histogram = null ;
66
+ private Counter statusCounter = null ;
61
67
62
68
// Package-level for testing purposes.
63
69
int pathComponents = 1 ;
@@ -149,6 +155,10 @@ public void init(FilterConfig filterConfig) throws ServletException {
149
155
.help (help )
150
156
.name (metricName )
151
157
.register ();
158
+
159
+ statusCounter = Counter .build (metricName + "_status_total" , "HTTP status codes of " + help )
160
+ .labelNames ("path" , "method" , "status" )
161
+ .register ();
152
162
}
153
163
154
164
@ Override
@@ -162,17 +172,28 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo
162
172
163
173
String path = request .getRequestURI ();
164
174
175
+ String components = getComponents (path );
176
+ String method = request .getMethod ();
165
177
Histogram .Timer timer = histogram
166
- .labels (getComponents ( path ), request . getMethod () )
178
+ .labels (components , method )
167
179
.startTimer ();
168
180
169
181
try {
170
182
filterChain .doFilter (servletRequest , servletResponse );
171
183
} finally {
172
184
timer .observeDuration ();
185
+ statusCounter .labels (components , method , getStatusCode (servletResponse )).inc ();
173
186
}
174
187
}
175
188
189
+ private String getStatusCode (ServletResponse servletResponse ) {
190
+ if (!(servletResponse instanceof HttpServletResponse )) {
191
+ return UNKNOWN_HTTP_STATUS_CODE ;
192
+ }
193
+
194
+ return Integer .toString (((HttpServletResponse ) servletResponse ).getStatus ());
195
+ }
196
+
176
197
@ Override
177
198
public void destroy () {
178
199
}
0 commit comments