TestRLSDefaultTargetPickMetric tests RLS Metrics in the case an RLS Balancer falls back to the default target for an RPC. This should emit a "grpc.lb.rls.default_target_picks" with certain labels and cache metrics with certain labels.
(t *testing.T)
| 168 | // "grpc.lb.rls.default_target_picks" with certain labels and cache metrics with |
| 169 | // certain labels. |
| 170 | func (s) TestRLSDefaultTargetPickMetric(t *testing.T) { |
| 171 | // Overwrite the uuid random number generator to be deterministic. |
| 172 | uuid.SetRand(rand.New(rand.NewSource(1))) |
| 173 | defer uuid.SetRand(nil) |
| 174 | |
| 175 | rlsServer, _ := rlstest.SetupFakeRLSServer(t, nil) |
| 176 | // Build RLS service config with a default target. |
| 177 | rlsConfig := buildBasicRLSConfigWithChildPolicy(t, t.Name(), rlsServer.Address) |
| 178 | backend := &stubserver.StubServer{ |
| 179 | EmptyCallF: func(context.Context, *testpb.Empty) (*testpb.Empty, error) { |
| 180 | return &testpb.Empty{}, nil |
| 181 | }, |
| 182 | } |
| 183 | if err := backend.StartServer(); err != nil { |
| 184 | t.Fatalf("Failed to start backend: %v", err) |
| 185 | } |
| 186 | t.Logf("Started TestService backend at: %q", backend.Address) |
| 187 | defer backend.Stop() |
| 188 | rlsConfig.RouteLookupConfig.DefaultTarget = backend.Address |
| 189 | |
| 190 | r := startManualResolverWithConfig(t, rlsConfig) |
| 191 | reader := metric.NewManualReader() |
| 192 | provider := metric.NewMeterProvider(metric.WithReader(reader)) |
| 193 | mo := opentelemetry.MetricsOptions{ |
| 194 | MeterProvider: provider, |
| 195 | Metrics: opentelemetry.DefaultMetrics().Add("grpc.lb.rls.cache_entries", "grpc.lb.rls.cache_size", "grpc.lb.rls.default_target_picks", "grpc.lb.rls.target_picks", "grpc.lb.rls.failed_picks"), |
| 196 | OptionalLabels: []string{"grpc.client.call.custom"}, |
| 197 | } |
| 198 | grpcTarget := r.Scheme() + ":///" |
| 199 | cc, err := grpc.NewClient(grpcTarget, grpc.WithResolvers(r), grpc.WithTransportCredentials(insecure.NewCredentials()), opentelemetry.DialOption(opentelemetry.Options{MetricsOptions: mo})) |
| 200 | if err != nil { |
| 201 | t.Fatalf("Failed to dial local test server: %v", err) |
| 202 | } |
| 203 | defer cc.Close() |
| 204 | |
| 205 | wantMetrics := []metricdata.Metrics{ |
| 206 | { |
| 207 | Name: "grpc.lb.rls.default_target_picks", |
| 208 | Description: "EXPERIMENTAL. Number of LB picks sent to the default target.", |
| 209 | Unit: "{pick}", |
| 210 | Data: metricdata.Sum[int64]{ |
| 211 | DataPoints: []metricdata.DataPoint[int64]{ |
| 212 | { |
| 213 | Attributes: attribute.NewSet(attribute.String("grpc.target", grpcTarget), attribute.String("grpc.lb.rls.server_target", rlsServer.Address), attribute.String("grpc.lb.rls.data_plane_target", backend.Address), attribute.String("grpc.lb.pick_result", "complete"), attribute.String("grpc.client.call.custom", "default-target-pick-custom")), |
| 214 | Value: 1, |
| 215 | }, |
| 216 | }, |
| 217 | Temporality: metricdata.CumulativeTemporality, |
| 218 | IsMonotonic: true, |
| 219 | }, |
| 220 | }, |
| 221 | // Receives a RLS Response with target information, so a single cache |
| 222 | // entry with a certain size. |
| 223 | { |
| 224 | Name: "grpc.lb.rls.cache_entries", |
| 225 | Description: "EXPERIMENTAL. Number of entries in the RLS cache.", |
| 226 | Unit: "{entry}", |
| 227 | Data: metricdata.Gauge[int64]{ |
nothing calls this directly
no test coverage detected