@@ -27,21 +27,25 @@ type UserHttpServer<M> =
2727
2828#[ derive( Clone ) ]
2929struct Metrics {
30- handle : PrometheusHandle ,
30+ handle : Option < PrometheusHandle > ,
31+ }
32+
33+ impl Metrics {
34+ fn render ( & self ) -> String {
35+ self . handle . as_ref ( ) . map ( |h| h. render ( ) ) . unwrap_or_default ( )
36+ }
3137}
3238
3339struct AppState < M : MakeNamespace , C > {
3440 namespaces : NamespaceStore < M > ,
3541 user_http_server : UserHttpServer < M > ,
3642 connector : C ,
37- metrics : PrometheusHandle ,
43+ metrics : Metrics ,
3844}
3945
4046impl < M : MakeNamespace , C > FromRef < Arc < AppState < M , C > > > for Metrics {
4147 fn from_ref ( input : & Arc < AppState < M , C > > ) -> Self {
42- Metrics {
43- handle : input. metrics . clone ( ) ,
44- }
48+ input. metrics . clone ( )
4549 }
4650}
4751
@@ -50,13 +54,20 @@ pub async fn run<M, A, C>(
5054 user_http_server : UserHttpServer < M > ,
5155 namespaces : NamespaceStore < M > ,
5256 connector : C ,
57+ disable_metrics : bool ,
5358) -> anyhow:: Result < ( ) >
5459where
5560 A : crate :: net:: Accept ,
5661 M : MakeNamespace ,
5762 C : Connector ,
5863{
5964 use axum:: routing:: { get, post} ;
65+ let metrics = Metrics {
66+ handle : ( !disable_metrics)
67+ . then ( || PrometheusBuilder :: new ( ) . install_recorder ( ) )
68+ . transpose ( )
69+ . unwrap ( ) ,
70+ } ;
6071 let router = axum:: Router :: new ( )
6172 . route ( "/" , get ( handle_get_index) )
6273 . route (
7990 namespaces,
8091 connector,
8192 user_http_server,
82- metrics : PrometheusBuilder :: new ( ) . install_recorder ( ) . unwrap ( ) ,
93+ metrics,
8394 } ) ) ;
8495
8596 hyper:: server:: Server :: builder ( acceptor)
@@ -94,7 +105,7 @@ async fn handle_get_index() -> &'static str {
94105}
95106
96107async fn handle_metrics ( State ( metrics) : State < Metrics > ) -> String {
97- metrics. handle . render ( )
108+ metrics. render ( )
98109}
99110
100111async fn handle_get_config < M : MakeNamespace , C : Connector > (
0 commit comments