15
15
*/
16
16
package org .jitsi .jigasi .rest ;
17
17
18
- import io .prometheus .client .exporter .common .*;
19
18
import jakarta .servlet .*;
20
19
import jakarta .servlet .http .*;
21
- import org .eclipse .jetty .server .*;
20
+ import jakarta .ws .rs .core .*;
21
+ import kotlin .*;
22
+ import org .eclipse .jetty .server .Request ;
22
23
import org .eclipse .jetty .server .handler .*;
23
24
import org .jitsi .jigasi .metrics .*;
24
25
import org .jitsi .jigasi .stats .*;
25
26
26
27
import java .io .*;
28
+ import java .util .*;
29
+ import java .util .stream .*;
27
30
28
31
public class MetricsHandler extends AbstractHandler
29
32
{
@@ -37,27 +40,44 @@ public void handle(String target, Request baseRequest, HttpServletRequest reques
37
40
38
41
Statistics .updateMetrics ();
39
42
40
- String responseBody ;
41
- if (accept != null && accept .startsWith ("application/openmetrics-text" ))
42
- {
43
- responseBody = JigasiMetricsContainer .INSTANCE .getPrometheusMetrics (
44
- TextFormat .CONTENT_TYPE_OPENMETRICS_100 );
45
- response .setContentType (TextFormat .CONTENT_TYPE_OPENMETRICS_100 );
46
- }
47
- else if (accept != null && accept .startsWith ("text/plain" ))
48
- {
49
- responseBody = JigasiMetricsContainer .INSTANCE .getPrometheusMetrics (TextFormat .CONTENT_TYPE_004 );
50
- response .setContentType (TextFormat .CONTENT_TYPE_004 );
51
- }
52
- else
53
- {
54
- responseBody = JigasiMetricsContainer .INSTANCE .getJsonString ();
55
- response .setContentType (RESTUtil .JSON_CONTENT_TYPE_WITH_CHARSET );
56
- }
43
+ Pair <String , String > metricsAndContentType
44
+ = JigasiMetricsContainer .INSTANCE .getMetrics (getMediaTypes (accept ));
45
+ response .setContentType (metricsAndContentType .getSecond ());
57
46
58
47
Writer writer = response .getWriter ();
59
- writer .write (responseBody );
48
+ writer .write (metricsAndContentType . getFirst () );
60
49
response .setStatus (200 );
61
50
}
62
51
}
52
+
53
+ private List <String > getMediaTypes (String accept )
54
+ {
55
+ if (accept == null )
56
+ {
57
+ return Collections .emptyList ();
58
+ }
59
+
60
+ if (accept .startsWith ("Accept: " ))
61
+ {
62
+ accept = accept .substring ("Accept: " .length ());
63
+ }
64
+
65
+ return Arrays .stream (accept .split ("," ))
66
+ .map (String ::trim )
67
+ .map (MediaType ::valueOf )
68
+ .sorted (new MediaTypeComparator ())
69
+ .map (m -> m .getType () + "/" + m .getSubtype ())
70
+ .collect (Collectors .toList ());
71
+ }
72
+
73
+ private static class MediaTypeComparator implements Comparator <MediaType >
74
+ {
75
+ @ Override
76
+ public int compare (MediaType o1 , MediaType o2 )
77
+ {
78
+ double q1 = Double .parseDouble (o1 .getParameters ().getOrDefault ("q" , "1.0" ));
79
+ double q2 = Double .parseDouble (o2 .getParameters ().getOrDefault ("q" , "1.0" ));
80
+ return Double .compare (q1 , q2 );
81
+ }
82
+ }
63
83
}
0 commit comments