1+ use crate :: RouteRef ;
2+
13use super :: { super :: Concrete , filters} ;
24use linkerd_app_core:: { proxy:: http, svc, Error , Result } ;
35use linkerd_http_route as http_route;
46use linkerd_proxy_client_policy as policy;
57use std:: { fmt:: Debug , hash:: Hash , sync:: Arc } ;
68
9+ mod count_reqs;
10+ mod metrics;
11+
12+ pub use self :: { count_reqs:: RequestCount , metrics:: RouteBackendMetrics } ;
13+
714#[ derive( Debug , PartialEq , Eq , Hash ) ]
815pub ( crate ) struct Backend < T , F > {
16+ pub ( crate ) route_ref : RouteRef ,
917 pub ( crate ) concrete : Concrete < T > ,
1018 pub ( crate ) filters : Arc < [ F ] > ,
1119}
@@ -16,11 +24,17 @@ pub(crate) type Http<T> =
1624pub ( crate ) type Grpc < T > =
1725 MatchedBackend < T , http_route:: grpc:: r#match:: RouteMatch , policy:: grpc:: Filter > ;
1826
27+ #[ derive( Clone , Debug ) ]
28+ pub struct ExtractMetrics {
29+ metrics : RouteBackendMetrics ,
30+ }
31+
1932// === impl Backend ===
2033
2134impl < T : Clone , F > Clone for Backend < T , F > {
2235 fn clone ( & self ) -> Self {
2336 Self {
37+ route_ref : self . route_ref . clone ( ) ,
2438 filters : self . filters . clone ( ) ,
2539 concrete : self . concrete . clone ( ) ,
2640 }
@@ -51,13 +65,16 @@ where
5165 F : Clone + Send + Sync + ' static ,
5266 // Assert that filters can be applied.
5367 Self : filters:: Apply ,
68+ ExtractMetrics : svc:: ExtractParam < RequestCount , Self > ,
5469{
5570 /// Builds a stack that applies per-route-backend policy filters over an
5671 /// inner [`Concrete`] stack.
5772 ///
5873 /// This [`MatchedBackend`] must implement [`filters::Apply`] to apply these
5974 /// filters.
60- pub ( crate ) fn layer < N , S > ( ) -> impl svc:: Layer <
75+ pub ( crate ) fn layer < N , S > (
76+ metrics : RouteBackendMetrics ,
77+ ) -> impl svc:: Layer <
6178 N ,
6279 Service = svc:: ArcNewService <
6380 Self ,
90107 } | concrete,
91108 )
92109 . push ( filters:: NewApplyFilters :: < Self , _ , _ > :: layer ( ) )
110+ . push ( count_reqs:: NewCountRequests :: layer_via ( ExtractMetrics {
111+ metrics : metrics. clone ( ) ,
112+ } ) )
93113 . push ( svc:: ArcNewService :: layer ( ) )
94114 . into_inner ( )
95115 } )
@@ -109,3 +129,23 @@ impl<T> filters::Apply for Grpc<T> {
109129 filters:: apply_grpc ( & self . r#match , & self . params . filters , req)
110130 }
111131}
132+
133+ impl < T > svc:: ExtractParam < RequestCount , Http < T > > for ExtractMetrics {
134+ fn extract_param ( & self , params : & Http < T > ) -> RequestCount {
135+ RequestCount ( self . metrics . http_requests_total (
136+ params. params . concrete . parent_ref . clone ( ) ,
137+ params. params . route_ref . clone ( ) ,
138+ params. params . concrete . backend_ref . clone ( ) ,
139+ ) )
140+ }
141+ }
142+
143+ impl < T > svc:: ExtractParam < RequestCount , Grpc < T > > for ExtractMetrics {
144+ fn extract_param ( & self , params : & Grpc < T > ) -> RequestCount {
145+ RequestCount ( self . metrics . grpc_requests_total (
146+ params. params . concrete . parent_ref . clone ( ) ,
147+ params. params . route_ref . clone ( ) ,
148+ params. params . concrete . backend_ref . clone ( ) ,
149+ ) )
150+ }
151+ }
0 commit comments