@@ -28,8 +28,10 @@ import (
2828	"time" 
2929	"unsafe" 
3030
31+ 	"github.com/google/uuid" 
3132	"google.golang.org/grpc/balancer" 
3233	"google.golang.org/grpc/connectivity" 
34+ 	estats "google.golang.org/grpc/experimental/stats" 
3335	"google.golang.org/grpc/grpclog" 
3436	"google.golang.org/grpc/internal" 
3537	"google.golang.org/grpc/internal/backoff" 
7779	clientConnUpdateHook  =  func () {}
7880	dataCachePurgeHook    =  func () {}
7981	resetBackoffHook      =  func () {}
82+ 
83+ 	cacheEntriesMetric  =  estats .RegisterInt64Gauge (estats.MetricDescriptor {
84+ 		Name :        "grpc.lb.rls.cache_entries" ,
85+ 		Description : "EXPERIMENTAL. Number of entries in the RLS cache." ,
86+ 		Unit :        "entry" ,
87+ 		Labels :      []string {"grpc.target" , "grpc.lb.rls.server_target" , "grpc.lb.rls.instance_uuid" },
88+ 		Default :     false ,
89+ 	})
90+ 	cacheSizeMetric  =  estats .RegisterInt64Gauge (estats.MetricDescriptor {
91+ 		Name :        "grpc.lb.rls.cache_size" ,
92+ 		Description : "EXPERIMENTAL. The current size of the RLS cache." ,
93+ 		Unit :        "By" ,
94+ 		Labels :      []string {"grpc.target" , "grpc.lb.rls.server_target" , "grpc.lb.rls.instance_uuid" },
95+ 		Default :     false ,
96+ 	})
97+ 	defaultTargetPicksMetric  =  estats .RegisterInt64Count (estats.MetricDescriptor {
98+ 		Name :        "grpc.lb.rls.default_target_picks" ,
99+ 		Description : "EXPERIMENTAL. Number of LB picks sent to the default target." ,
100+ 		Unit :        "pick" ,
101+ 		Labels :      []string {"grpc.target" , "grpc.lb.rls.server_target" , "grpc.lb.rls.instance_uuid" , "grpc.lb.pick_result" },
102+ 		Default :     false ,
103+ 	})
104+ 	targetPicksMetric  =  estats .RegisterInt64Count (estats.MetricDescriptor {
105+ 		Name :        "grpc.lb.rls.target_picks" ,
106+ 		Description : "EXPERIMENTAL. Number of LB picks sent to each RLS target. Note that if the default target is also returned by the RLS server, RPCs sent to that target from the cache will be counted in this metric, not in grpc.rls.default_target_picks." ,
107+ 		Unit :        "pick" ,
108+ 		Labels :      []string {"grpc.target" , "grpc.lb.rls.server_target" , "grpc.lb.rls.instance_uuid" , "grpc.lb.pick_result" },
109+ 		Default :     false ,
110+ 	})
111+ 	failedPicksMetric  =  estats .RegisterInt64Count (estats.MetricDescriptor {
112+ 		Name :        "grpc.lb.rls.failed_picks" ,
113+ 		Description : "EXPERIMENTAL. Number of LB picks failed due to either a failed RLS request or the RLS channel being throttled." ,
114+ 		Unit :        "pick" ,
115+ 		Labels :      []string {"grpc.target" , "grpc.lb.rls.server_target" },
116+ 		Default :     false ,
117+ 	})
80118)
81119
82120func  init () {
@@ -95,6 +133,7 @@ func (rlsBB) Build(cc balancer.ClientConn, opts balancer.BuildOptions) balancer.
95133		done :               grpcsync .NewEvent (),
96134		cc :                 cc ,
97135		bopts :              opts ,
136+ 		uuid :               uuid .New ().String (),
98137		purgeTicker :        dataCachePurgeTicker (),
99138		dataCachePurgeHook : dataCachePurgeHook ,
100139		lbCfg :              & lbConfig {},
@@ -122,6 +161,7 @@ type rlsBalancer struct {
122161	done                * grpcsync.Event  // Fires when Close() is done. 
123162	cc                  balancer.ClientConn 
124163	bopts               balancer.BuildOptions 
164+ 	uuid                string 
125165	purgeTicker         * time.Ticker 
126166	dataCachePurgeHook  func ()
127167	logger              * internalgrpclog.PrefixLogger 
@@ -240,7 +280,16 @@ func (b *rlsBalancer) purgeDataCache(doneCh chan struct{}) {
240280		case  <- b .purgeTicker .C :
241281			b .cacheMu .Lock ()
242282			updatePicker  :=  b .dataCache .evictExpiredEntries ()
283+ 
284+ 			b .stateMu .Lock ()
285+ 			rlsLookupService  :=  b .lbCfg .lookupService 
286+ 			b .stateMu .Unlock ()
287+ 			cacheSize  :=  b .dataCache .currentSize 
288+ 			cacheEntries  :=  int64 (len (b .dataCache .entries ))
243289			b .cacheMu .Unlock ()
290+ 			grpcTarget  :=  b .bopts .Target .String ()
291+ 			cacheSizeMetric .Record (b .bopts .MetricsRecorder , cacheSize , grpcTarget , rlsLookupService , b .uuid )
292+ 			cacheEntriesMetric .Record (b .bopts .MetricsRecorder , cacheEntries , grpcTarget , rlsLookupService , b .uuid )
244293			if  updatePicker  {
245294				b .sendNewPicker ()
246295			}
@@ -304,7 +353,12 @@ func (b *rlsBalancer) UpdateClientConnState(ccs balancer.ClientConnState) error
304353		// `stateMu` if we are to hold both locks at the same time. 
305354		b .cacheMu .Lock ()
306355		b .dataCache .resize (newCfg .cacheSizeBytes )
356+ 		dataCacheSize  :=  b .dataCache .currentSize 
357+ 		dataCacheEntries  :=  int64 (len (b .dataCache .entries ))
307358		b .cacheMu .Unlock ()
359+ 		grpcTarget  :=  b .bopts .Target .String ()
360+ 		cacheSizeMetric .Record (b .bopts .MetricsRecorder , dataCacheSize , grpcTarget , newCfg .lookupService , b .uuid )
361+ 		cacheEntriesMetric .Record (b .bopts .MetricsRecorder , dataCacheEntries , grpcTarget , newCfg .lookupService , b .uuid )
308362	}
309363	return  nil 
310364}
@@ -490,15 +544,17 @@ func (b *rlsBalancer) sendNewPickerLocked() {
490544	if  b .defaultPolicy  !=  nil  {
491545		b .defaultPolicy .acquireRef ()
492546	}
547+ 
493548	picker  :=  & rlsPicker {
494- 		kbm :           b .lbCfg .kbMap ,
495- 		origEndpoint :  b .bopts .Target .Endpoint (),
496- 		lb :            b ,
497- 		defaultPolicy : b .defaultPolicy ,
498- 		ctrlCh :        b .ctrlCh ,
499- 		maxAge :        b .lbCfg .maxAge ,
500- 		staleAge :      b .lbCfg .staleAge ,
501- 		bg :            b .bg ,
549+ 		kbm :             b .lbCfg .kbMap ,
550+ 		origEndpoint :    b .bopts .Target .Endpoint (),
551+ 		lb :              b ,
552+ 		defaultPolicy :   b .defaultPolicy ,
553+ 		ctrlCh :          b .ctrlCh ,
554+ 		maxAge :          b .lbCfg .maxAge ,
555+ 		staleAge :        b .lbCfg .staleAge ,
556+ 		bg :              b .bg ,
557+ 		rlsServerTarget : b .lbCfg .lookupService ,
502558	}
503559	picker .logger  =  internalgrpclog .NewPrefixLogger (logger , fmt .Sprintf ("[rls-picker %p] " , picker ))
504560	state  :=  balancer.State {
0 commit comments