@@ -22,13 +22,14 @@ use std::thread;
2222use crate :: handlers:: airplane;
2323use crate :: handlers:: http:: cluster:: { self , init_cluster_metrics_schedular} ;
2424use crate :: handlers:: http:: middleware:: { DisAllowRootUser , RouteExt } ;
25- use crate :: handlers:: http:: { base_path, prism_base_path} ;
25+ use crate :: handlers:: http:: { base_path, prism_base_path, resource_check } ;
2626use crate :: handlers:: http:: { logstream, MAX_EVENT_PAYLOAD_SIZE } ;
2727use crate :: handlers:: http:: { rbac, role} ;
2828use crate :: hottier:: HotTierManager ;
2929use crate :: rbac:: role:: Action ;
3030use crate :: sync:: sync_start;
3131use crate :: { analytics, migration, storage, sync} ;
32+ use actix_web:: middleware:: from_fn;
3233use actix_web:: web:: { resource, ServiceConfig } ;
3334use actix_web:: { web, Scope } ;
3435use actix_web_prometheus:: PrometheusMetrics ;
@@ -53,7 +54,10 @@ impl ParseableServer for QueryServer {
5354 . service (
5455 web:: scope ( & base_path ( ) )
5556 . service ( Server :: get_correlation_webscope ( ) )
56- . service ( Server :: get_query_factory ( ) )
57+ . service (
58+ Server :: get_query_factory ( )
59+ . wrap ( from_fn ( resource_check:: check_resource_utilization_middleware) )
60+ )
5761 . service ( Server :: get_liveness_factory ( ) )
5862 . service ( Server :: get_readiness_factory ( ) )
5963 . service ( Server :: get_about_factory ( ) )
@@ -66,7 +70,10 @@ impl ParseableServer for QueryServer {
6670 . service ( Server :: get_oauth_webscope ( oidc_client) )
6771 . service ( Self :: get_user_role_webscope ( ) )
6872 . service ( Server :: get_roles_webscope ( ) )
69- . service ( Server :: get_counts_webscope ( ) )
73+ . service (
74+ Server :: get_counts_webscope ( )
75+ . wrap ( from_fn ( resource_check:: check_resource_utilization_middleware) )
76+ )
7077 . service ( Server :: get_metrics_webscope ( ) )
7178 . service ( Server :: get_alerts_webscope ( ) )
7279 . service ( Self :: get_cluster_web_scope ( ) ) ,
@@ -143,13 +150,19 @@ impl ParseableServer for QueryServer {
143150 let ( cancel_tx, cancel_rx) = oneshot:: channel ( ) ;
144151 thread:: spawn ( || sync:: handler ( cancel_rx) ) ;
145152
153+ // Start resource monitor
154+ let ( resource_shutdown_tx, resource_shutdown_rx) = oneshot:: channel ( ) ;
155+ resource_check:: spawn_resource_monitor ( resource_shutdown_rx) ;
156+
146157 tokio:: spawn ( airplane:: server ( ) ) ;
147158
148159 let result = self
149160 . start ( shutdown_rx, prometheus. clone ( ) , PARSEABLE . options . openid ( ) )
150161 . await ?;
151162 // Cancel sync jobs
152163 cancel_tx. send ( ( ) ) . expect ( "Cancellation should not fail" ) ;
164+ // Shutdown resource monitor
165+ let _ = resource_shutdown_tx. send ( ( ) ) ;
153166 if let Err ( join_err) = startup_sync_handle. await {
154167 tracing:: warn!( "startup sync task panicked: {join_err}" ) ;
155168 }
0 commit comments