Skip to content

Commit f227ba9

Browse files
authored
balancer: Move metrics recorder from BuildOptions to ClientConn (#8027)
1 parent 3e27c17 commit f227ba9

File tree

12 files changed

+34
-26
lines changed

12 files changed

+34
-26
lines changed

balancer/balancer.go

+6-4
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,12 @@ type ClientConn interface {
175175
// Deprecated: Use the Target field in the BuildOptions instead.
176176
Target() string
177177

178+
// MetricsRecorder provides the metrics recorder that balancers can use to
179+
// record metrics. Balancer implementations which do not register metrics on
180+
// metrics registry and record on them can ignore this method. The returned
181+
// MetricsRecorder is guaranteed to never be nil.
182+
MetricsRecorder() estats.MetricsRecorder
183+
178184
// EnforceClientConnEmbedding is included to force implementers to embed
179185
// another implementation of this interface, allowing gRPC to add methods
180186
// without breaking users.
@@ -210,10 +216,6 @@ type BuildOptions struct {
210216
// same resolver.Target as passed to the resolver. See the documentation for
211217
// the resolver.Target type for details about what it contains.
212218
Target resolver.Target
213-
// MetricsRecorder is the metrics recorder that balancers can use to record
214-
// metrics. Balancer implementations which do not register metrics on
215-
// metrics registry and record on them can ignore this field.
216-
MetricsRecorder estats.MetricsRecorder
217219
}
218220

219221
// Builder creates a balancer.

balancer/pickfirst/pickfirst_test.go

+2-3
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ import (
2929
"google.golang.org/grpc/connectivity"
3030
"google.golang.org/grpc/internal/grpctest"
3131
"google.golang.org/grpc/internal/testutils"
32-
"google.golang.org/grpc/internal/testutils/stats"
3332
"google.golang.org/grpc/resolver"
3433
)
3534

@@ -56,7 +55,7 @@ func (s) TestPickFirst_InitialResolverError(t *testing.T) {
5655
ctx, cancel := context.WithTimeout(context.Background(), defaultTestTimeout)
5756
defer cancel()
5857
cc := testutils.NewBalancerClientConn(t)
59-
bal := balancer.Get(Name).Build(cc, balancer.BuildOptions{MetricsRecorder: &stats.NoopMetricsRecorder{}})
58+
bal := balancer.Get(Name).Build(cc, balancer.BuildOptions{})
6059
defer bal.Close()
6160
bal.ResolverError(errors.New("resolution failed: test error"))
6261

@@ -89,7 +88,7 @@ func (s) TestPickFirst_ResolverErrorinTF(t *testing.T) {
8988
ctx, cancel := context.WithTimeout(context.Background(), defaultTestTimeout)
9089
defer cancel()
9190
cc := testutils.NewBalancerClientConn(t)
92-
bal := balancer.Get(Name).Build(cc, balancer.BuildOptions{MetricsRecorder: &stats.NoopMetricsRecorder{}})
91+
bal := balancer.Get(Name).Build(cc, balancer.BuildOptions{})
9392
defer bal.Close()
9493

9594
// After sending a valid update, the LB policy should report CONNECTING.

balancer/pickfirst/pickfirstleaf/pickfirstleaf.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ func (pickfirstBuilder) Build(cc balancer.ClientConn, bo balancer.BuildOptions)
120120
b := &pickfirstBalancer{
121121
cc: cc,
122122
target: bo.Target.String(),
123-
metricsRecorder: bo.MetricsRecorder, // ClientConn will always create a Metrics Recorder.
123+
metricsRecorder: cc.MetricsRecorder(),
124124

125125
subConns: resolver.NewAddressMap(),
126126
state: connectivity.Connecting,

balancer/pickfirst/pickfirstleaf/pickfirstleaf_ext_test.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -1099,7 +1099,7 @@ func (s) TestPickFirstLeaf_InterleavingIPV4Preffered(t *testing.T) {
10991099
ctx, cancel := context.WithTimeout(context.Background(), defaultTestTimeout)
11001100
defer cancel()
11011101
cc := testutils.NewBalancerClientConn(t)
1102-
bal := balancer.Get(pickfirstleaf.Name).Build(cc, balancer.BuildOptions{MetricsRecorder: &stats.NoopMetricsRecorder{}})
1102+
bal := balancer.Get(pickfirstleaf.Name).Build(cc, balancer.BuildOptions{})
11031103
defer bal.Close()
11041104
ccState := balancer.ClientConnState{
11051105
ResolverState: resolver.State{
@@ -1145,7 +1145,7 @@ func (s) TestPickFirstLeaf_InterleavingIPv6Preffered(t *testing.T) {
11451145
ctx, cancel := context.WithTimeout(context.Background(), defaultTestTimeout)
11461146
defer cancel()
11471147
cc := testutils.NewBalancerClientConn(t)
1148-
bal := balancer.Get(pickfirstleaf.Name).Build(cc, balancer.BuildOptions{MetricsRecorder: &stats.NoopMetricsRecorder{}})
1148+
bal := balancer.Get(pickfirstleaf.Name).Build(cc, balancer.BuildOptions{})
11491149
defer bal.Close()
11501150
ccState := balancer.ClientConnState{
11511151
ResolverState: resolver.State{
@@ -1189,7 +1189,7 @@ func (s) TestPickFirstLeaf_InterleavingUnknownPreffered(t *testing.T) {
11891189
ctx, cancel := context.WithTimeout(context.Background(), defaultTestTimeout)
11901190
defer cancel()
11911191
cc := testutils.NewBalancerClientConn(t)
1192-
bal := balancer.Get(pickfirstleaf.Name).Build(cc, balancer.BuildOptions{MetricsRecorder: &stats.NoopMetricsRecorder{}})
1192+
bal := balancer.Get(pickfirstleaf.Name).Build(cc, balancer.BuildOptions{})
11931193
defer bal.Close()
11941194
ccState := balancer.ClientConnState{
11951195
ResolverState: resolver.State{

balancer/pickfirst/pickfirstleaf/pickfirstleaf_test.go

+1-2
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ import (
2929
"google.golang.org/grpc/connectivity"
3030
"google.golang.org/grpc/internal/grpctest"
3131
"google.golang.org/grpc/internal/testutils"
32-
"google.golang.org/grpc/internal/testutils/stats"
3332
"google.golang.org/grpc/resolver"
3433
)
3534

@@ -196,7 +195,7 @@ func (s) TestPickFirstLeaf_TFPickerUpdate(t *testing.T) {
196195
ctx, cancel := context.WithTimeout(context.Background(), defaultTestTimeout)
197196
defer cancel()
198197
cc := testutils.NewBalancerClientConn(t)
199-
bal := pickfirstBuilder{}.Build(cc, balancer.BuildOptions{MetricsRecorder: &stats.NoopMetricsRecorder{}})
198+
bal := pickfirstBuilder{}.Build(cc, balancer.BuildOptions{})
200199
defer bal.Close()
201200
ccState := balancer.ClientConnState{
202201
ResolverState: resolver.State{

balancer/rls/balancer.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ func (rlsBB) Build(cc balancer.ClientConn, opts balancer.BuildOptions) balancer.
140140
updateCh: buffer.NewUnbounded(),
141141
}
142142
lb.logger = internalgrpclog.NewPrefixLogger(logger, fmt.Sprintf("[rls-experimental-lb %p] ", lb))
143-
lb.dataCache = newDataCache(maxCacheSize, lb.logger, opts.MetricsRecorder, opts.Target.String())
143+
lb.dataCache = newDataCache(maxCacheSize, lb.logger, cc.MetricsRecorder(), opts.Target.String())
144144
lb.bg = balancergroup.New(balancergroup.Options{
145145
CC: cc,
146146
BuildOpts: opts,
@@ -539,7 +539,7 @@ func (b *rlsBalancer) sendNewPickerLocked() {
539539
bg: b.bg,
540540
rlsServerTarget: b.lbCfg.lookupService,
541541
grpcTarget: b.bopts.Target.String(),
542-
metricsRecorder: b.bopts.MetricsRecorder,
542+
metricsRecorder: b.cc.MetricsRecorder(),
543543
}
544544
picker.logger = internalgrpclog.NewPrefixLogger(logger, fmt.Sprintf("[rls-picker %p] ", picker))
545545
state := balancer.State{

balancer/weightedroundrobin/balancer.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ func (bb) Build(cc balancer.ClientConn, bOpts balancer.BuildOptions) balancer.Ba
9494
b := &wrrBalancer{
9595
ClientConn: cc,
9696
target: bOpts.Target.String(),
97-
metricsRecorder: bOpts.MetricsRecorder,
97+
metricsRecorder: cc.MetricsRecorder(),
9898
addressWeights: resolver.NewAddressMap(),
9999
endpointToWeight: resolver.NewEndpointMap(),
100100
scToWeight: make(map[balancer.SubConn]*endpointWeight),

balancer_wrapper.go

+5-1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626
"google.golang.org/grpc/balancer"
2727
"google.golang.org/grpc/codes"
2828
"google.golang.org/grpc/connectivity"
29+
"google.golang.org/grpc/experimental/stats"
2930
"google.golang.org/grpc/internal"
3031
"google.golang.org/grpc/internal/balancer/gracefulswitch"
3132
"google.golang.org/grpc/internal/channelz"
@@ -93,7 +94,6 @@ func newCCBalancerWrapper(cc *ClientConn) *ccBalancerWrapper {
9394
CustomUserAgent: cc.dopts.copts.UserAgent,
9495
ChannelzParent: cc.channelz,
9596
Target: cc.parsedTarget,
96-
MetricsRecorder: cc.metricsRecorderList,
9797
},
9898
serializer: grpcsync.NewCallbackSerializer(ctx),
9999
serializerCancel: cancel,
@@ -102,6 +102,10 @@ func newCCBalancerWrapper(cc *ClientConn) *ccBalancerWrapper {
102102
return ccb
103103
}
104104

105+
func (ccb *ccBalancerWrapper) MetricsRecorder() stats.MetricsRecorder {
106+
return ccb.cc.metricsRecorderList
107+
}
108+
105109
// updateClientConnState is invoked by grpc to push a ClientConnState update to
106110
// the underlying balancer. This is always executed from the serializer, so
107111
// it is safe to call into the balancer here.

internal/balancergroup/balancergroup_test.go

-2
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ import (
3333
"google.golang.org/grpc/internal/channelz"
3434
"google.golang.org/grpc/internal/grpctest"
3535
"google.golang.org/grpc/internal/testutils"
36-
"google.golang.org/grpc/internal/testutils/stats"
3736
"google.golang.org/grpc/resolver"
3837
)
3938

@@ -604,7 +603,6 @@ func (s) TestBalancerGracefulSwitch(t *testing.T) {
604603
childPolicyName := t.Name()
605604
stub.Register(childPolicyName, stub.BalancerFuncs{
606605
Init: func(bd *stub.BalancerData) {
607-
bd.BuildOptions.MetricsRecorder = &stats.NoopMetricsRecorder{}
608606
bd.Data = balancer.Get(pickfirst.Name).Build(bd.ClientConn, bd.BuildOptions)
609607
},
610608
Close: func(bd *stub.BalancerData) {

internal/stats/metrics_recorder_list_test.go

+5-5
Original file line numberDiff line numberDiff line change
@@ -110,11 +110,11 @@ func (recordingLoadBalancerBuilder) Name() string {
110110
}
111111

112112
func (recordingLoadBalancerBuilder) Build(cc balancer.ClientConn, bOpts balancer.BuildOptions) balancer.Balancer {
113-
intCountHandle.Record(bOpts.MetricsRecorder, 1, "int counter label val", "int counter optional label val")
114-
floatCountHandle.Record(bOpts.MetricsRecorder, 2, "float counter label val", "float counter optional label val")
115-
intHistoHandle.Record(bOpts.MetricsRecorder, 3, "int histo label val", "int histo optional label val")
116-
floatHistoHandle.Record(bOpts.MetricsRecorder, 4, "float histo label val", "float histo optional label val")
117-
intGaugeHandle.Record(bOpts.MetricsRecorder, 5, "int gauge label val", "int gauge optional label val")
113+
intCountHandle.Record(cc.MetricsRecorder(), 1, "int counter label val", "int counter optional label val")
114+
floatCountHandle.Record(cc.MetricsRecorder(), 2, "float counter label val", "float counter optional label val")
115+
intHistoHandle.Record(cc.MetricsRecorder(), 3, "int histo label val", "int histo optional label val")
116+
floatHistoHandle.Record(cc.MetricsRecorder(), 4, "float histo label val", "float histo optional label val")
117+
intGaugeHandle.Record(cc.MetricsRecorder(), 5, "int gauge label val", "int gauge optional label val")
118118

119119
return &recordingLoadBalancer{
120120
Balancer: balancer.Get(pickfirst.Name).Build(cc, bOpts),

internal/testutils/balancer.go

+8
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,12 @@ import (
2626

2727
"google.golang.org/grpc/balancer"
2828
"google.golang.org/grpc/connectivity"
29+
"google.golang.org/grpc/experimental/stats"
2930
"google.golang.org/grpc/internal"
3031
"google.golang.org/grpc/internal/grpcsync"
3132
"google.golang.org/grpc/resolver"
33+
34+
istats "google.golang.org/grpc/internal/stats"
3235
)
3336

3437
// TestSubConn implements the SubConn interface, to be used in tests.
@@ -155,6 +158,11 @@ func (tcc *BalancerClientConn) NewSubConn(a []resolver.Address, o balancer.NewSu
155158
return sc, nil
156159
}
157160

161+
// MetricsRecorder returns an empty MetricsRecorderList.
162+
func (*BalancerClientConn) MetricsRecorder() stats.MetricsRecorder {
163+
return istats.NewMetricsRecorderList(nil)
164+
}
165+
158166
// RemoveSubConn is a nop; tests should all be updated to use sc.Shutdown()
159167
// instead.
160168
func (tcc *BalancerClientConn) RemoveSubConn(sc balancer.SubConn) {

xds/internal/balancer/clustermanager/clustermanager_test.go

-2
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ import (
3434
"google.golang.org/grpc/internal/grpctest"
3535
"google.golang.org/grpc/internal/hierarchy"
3636
"google.golang.org/grpc/internal/testutils"
37-
"google.golang.org/grpc/internal/testutils/stats"
3837
"google.golang.org/grpc/resolver"
3938
"google.golang.org/grpc/status"
4039
)
@@ -644,7 +643,6 @@ func TestClusterGracefulSwitch(t *testing.T) {
644643
childPolicyName := t.Name()
645644
stub.Register(childPolicyName, stub.BalancerFuncs{
646645
Init: func(bd *stub.BalancerData) {
647-
bd.BuildOptions.MetricsRecorder = &stats.NoopMetricsRecorder{}
648646
bd.Data = balancer.Get(pickfirst.Name).Build(bd.ClientConn, bd.BuildOptions)
649647
},
650648
Close: func(bd *stub.BalancerData) {

0 commit comments

Comments
 (0)