2
2
3
3
import io .prometheus .client .CollectorRegistry ;
4
4
import io .prometheus .client .exporter .common .TextFormat ;
5
- import jakarta . servlet . http .HttpServletRequest ;
6
- import jakarta . servlet . http .HttpServletResponse ;
5
+ import org . eclipse . jetty . http .HttpFields ;
6
+ import org . eclipse . jetty . http .HttpHeader ;
7
7
import org .eclipse .jetty .http .HttpStatus ;
8
+ import org .eclipse .jetty .server .Handler ;
8
9
import org .eclipse .jetty .server .Request ;
9
- import org .eclipse .jetty .server .handler .AbstractHandler ;
10
+ import org .eclipse .jetty .server .Response ;
11
+ import org .eclipse .jetty .util .Callback ;
10
12
11
- import java .io .IOException ;
12
- import java .util . concurrent . ExecutionException ;
13
+ import java .io .OutputStreamWriter ;
14
+ import java .nio . charset . StandardCharsets ;
13
15
import java .util .logging .Level ;
14
16
15
- public class MetricsController extends AbstractHandler {
17
+ public class MetricsController extends Handler . Abstract {
16
18
17
19
private final MetricRegistry metricRegistry = MetricRegistry .getInstance ();
18
20
private final PrometheusExporter exporter ;
@@ -21,28 +23,32 @@ public MetricsController(PrometheusExporter exporter) {
21
23
this .exporter = exporter ;
22
24
}
23
25
24
- @ Override
25
- public void handle (String target , Request request , HttpServletRequest httpServletRequest ,
26
- HttpServletResponse response ) throws IOException {
27
-
28
- if (!target .equals ("/metrics" )) {
29
- response .sendError (HttpServletResponse .SC_NOT_FOUND );
30
- return ;
31
- }
32
26
27
+ @ Override
28
+ public boolean handle (Request request , Response response , Callback callback ) throws Exception {
33
29
try {
34
30
metricRegistry .collectMetrics ().get ();
35
31
36
32
response .setStatus (HttpStatus .OK_200 );
37
- response .setContentType (TextFormat .CONTENT_TYPE_004 );
38
33
39
- TextFormat .write004 (response .getWriter (), CollectorRegistry .defaultRegistry .metricFamilySamples ());
34
+ HttpFields .Mutable responseHeaders = response .getHeaders ();
35
+ responseHeaders .put (HttpHeader .CONTENT_TYPE , TextFormat .CONTENT_TYPE_004 );
40
36
41
- request . setHandled ( true );
42
- } catch (InterruptedException | ExecutionException e ) {
37
+ writeMetricsToResponse ( request , response );
38
+ } catch (Exception e ) {
43
39
exporter .getLogger ().log (Level .WARNING , "Failed to read server statistic: " + e .getMessage ());
44
40
exporter .getLogger ().log (Level .FINE , "Failed to read server statistic: " , e );
45
- response .sendError (HttpStatus .INTERNAL_SERVER_ERROR_500 );
41
+ Response .writeError (request , response , callback , HttpStatus .INTERNAL_SERVER_ERROR_500 , "Failed to read server statistics" );
42
+ }
43
+ callback .succeeded ();
44
+ return true ;
45
+ }
46
+
47
+ private void writeMetricsToResponse (Request request , Response response ) throws Exception {
48
+ try (var out = Response .asBufferedOutputStream (request , response );
49
+ var writer = new OutputStreamWriter (out , StandardCharsets .UTF_8 )) {
50
+ TextFormat .write004 (writer , CollectorRegistry .defaultRegistry .metricFamilySamples ());
51
+ writer .flush ();
46
52
}
47
53
}
48
54
}
0 commit comments