diff --git a/loadtest/cmd/attacker/main.go b/loadtest/cmd/attacker/main.go index 0dd1ba5..97d13d3 100644 --- a/loadtest/cmd/attacker/main.go +++ b/loadtest/cmd/attacker/main.go @@ -6,13 +6,14 @@ import ( "flag" "fmt" "io" - "log" + "log/slog" "net/http" "os" "os/signal" "syscall" "time" + "github.com/kitagry/slogdriver" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" "github.com/prometheus/client_golang/prometheus/promhttp" @@ -75,12 +76,15 @@ func main() { flag.DurationVar(&connectTimeout, "connect_timeout", 5*time.Second, "Connecting timeout") flag.Parse() - log.Printf("minimatch load-testing (rps: %.2f, frontend: %s, match_timeout: %s, redis: %s, connect_timeout: %s)", - rps, frontendAddr, matchTimeout, redisAddr, connectTimeout) + logger := initLogger() + + logger.Info(fmt.Sprintf("minimatch load-testing (rps: %.2f, frontend: %s, match_timeout: %s, redis: %s, connect_timeout: %s)", + rps, frontendAddr, matchTimeout, redisAddr, connectTimeout)) redis, err := newRedisClient(redisAddr) if err != nil { - log.Fatalf("failed to create redis client: %+v", err) + logger.Error(fmt.Sprintf("failed to create redis client: %+v", err), "error", err) + os.Exit(1) } ctx, shutdown := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM) @@ -90,13 +94,13 @@ func main() { http.Handle("/metrics", promhttp.Handler()) go func() { addr := ":2112" - log.Printf("prometheus endpoint (/metrics) is listening on %s...", addr) + logger.Info(fmt.Sprintf("prometheus endpoint (/metrics) is listening on %s...", addr)) server := &http.Server{ Addr: addr, ReadHeaderTimeout: 10 * time.Second, // https://app.deepsource.com/directory/analyzers/go/issues/GO-S2114 } if err := server.ListenAndServe(); err != nil { - log.Printf("failed to serve prometheus endpoint: %+v", err) + logger.Error(fmt.Sprintf("failed to serve prometheus endpoint: %+v", err), "error", err) } }() @@ -106,18 +110,18 @@ func main() { for { select { case <-ctx.Done(): - log.Printf("shutting down attacker...") + logger.Info("shutting down attacker...") return case <-ticker.C: - go createAndWatchTicket(context.Background(), frontendAddr, redis, matchTimeout, connectTimeout) + go createAndWatchTicket(context.Background(), frontendAddr, redis, matchTimeout, connectTimeout, logger) } } } -func createAndWatchTicket(ctx context.Context, omFrontendAddr string, redis rueidis.Client, matchTimeout, connectTimeout time.Duration) { +func createAndWatchTicket(ctx context.Context, omFrontendAddr string, redis rueidis.Client, matchTimeout, connectTimeout time.Duration, logger *slog.Logger) { frontendClient, closer, err := newOMFrontendClient(omFrontendAddr) if err != nil { - log.Printf("failed to create frontend client: %+v", err) + logger.Error(fmt.Sprintf("failed to create frontend client: %+v", err), "error", err) return } defer closer.Close() @@ -126,15 +130,21 @@ func createAndWatchTicket(ctx context.Context, omFrontendAddr string, redis ruei SearchFields: &pb.SearchFields{}, }}) if err != nil { - log.Printf("failed to create ticket: %+v", err) + logger.Error(fmt.Sprintf("failed to create ticket: %+v", err), "error", err) return } as, err := watchTickets(ctx, frontendClient, ticket, matchTimeout) - if err != nil && !errors.Is(err, errWatchTicketTimeout) { - log.Printf("failed to watch tickets: %+v", err) + if err != nil { + if !errors.Is(err, errWatchTicketTimeout) { + logger.Error(fmt.Sprintf("failed to watch tickets: %+v", err), "error", err) + } + return } - if err := waitConnection(ctx, redis, as, ticket, connectTimeout); err != nil && !errors.Is(err, errWatchAssignmentTimeout) { - log.Printf("failed to wait connection: %+v", err) + if err := waitConnection(ctx, redis, as, ticket, connectTimeout); err != nil { + if !errors.Is(err, errWatchAssignmentTimeout) { + logger.Error(fmt.Sprintf("failed to wait connection: %+v", err)) + } + return } } @@ -145,8 +155,7 @@ func watchTickets(ctx context.Context, omFrontend pb.FrontendServiceClient, tick stream, err := omFrontend.WatchAssignments(ctx, &pb.WatchAssignmentsRequest{TicketId: ticket.Id}) if err != nil { - log.Printf("failed to open watch assignments stream: %+v", err) - return nil, err + return nil, fmt.Errorf("failed to watch assignments: %w", err) } respCh := make(chan *pb.Assignment) @@ -159,6 +168,9 @@ func watchTickets(ctx context.Context, omFrontend pb.FrontendServiceClient, tick default: resp, err := stream.Recv() if err != nil { + if errors.Is(err, io.EOF) { + return + } if errors.Is(err, context.Canceled) && ctx.Err() != nil { return } @@ -264,3 +276,14 @@ func newRedisClient(addr string) (rueidis.Client, error) { func redisKeyAssignment(as *pb.Assignment) string { return fmt.Sprintf("attacker:as:%s", as.Connection) } + +func initLogger() *slog.Logger { + _, onK8s := os.LookupEnv("KUBERNETES_SERVICE_HOST") + _, onCloudRun := os.LookupEnv("K_CONFIGURATION") + if onK8s || onCloudRun { + return slogdriver.New(os.Stdout, slogdriver.HandlerOptions{ + Level: slogdriver.LevelDefault, + }) + } + return slog.Default() +} diff --git a/loadtest/cmd/backend/main.go b/loadtest/cmd/backend/main.go index eb74b57..70dd494 100644 --- a/loadtest/cmd/backend/main.go +++ b/loadtest/cmd/backend/main.go @@ -4,7 +4,7 @@ import ( "context" "errors" "fmt" - "log" + "log/slog" "net/http" "os" "os/signal" @@ -14,6 +14,7 @@ import ( cache "github.com/Code-Hex/go-generics-cache" "github.com/bojand/hri" "github.com/kelseyhightower/envconfig" + "github.com/kitagry/slogdriver" "github.com/prometheus/client_golang/prometheus/promhttp" "github.com/redis/rueidis" "github.com/redis/rueidis/rueidislock" @@ -54,25 +55,31 @@ var matchProfile = &pb.MatchProfile{ func main() { var conf config envconfig.MustProcess("", &conf) + logger := initLogger() meterProvider, err := newMeterProvider() if err != nil { - log.Fatalf("failed to create meter provider: %+v", err) + logger.Error(fmt.Sprintf("failed to create meter provider: %+v", err), "error", err) + os.Exit(1) } otel.SetMeterProvider(meterProvider) - startPrometheus() + startPrometheus(logger) redisStore, err := newRedisStateStore(&conf) if err != nil { - log.Fatalf("failed to create redis store: %+v", err) + logger.Error(fmt.Sprintf("failed to create redis store: %+v", err), "error", err) + os.Exit(1) } ticketCache := cache.New[string, *pb.Ticket]() store := statestore.NewBackendStoreWithTicketCache(redisStore, ticketCache, statestore.WithTicketCacheTTL(conf.TicketCacheTTL)) - assigner, err := newAssigner(&conf, meterProvider) - backend, err := minimatch.NewBackend(store, assigner, minimatch.WithTicketValidationBeforeAssign(conf.TicketValidationEnabled)) + assigner, err := newAssigner(&conf, meterProvider, logger) + backend, err := minimatch.NewBackend(store, assigner, + minimatch.WithTicketValidationBeforeAssign(conf.TicketValidationEnabled), + minimatch.WithBackendLogger(logger)) if err != nil { - log.Fatalf("failed to create backend: %+v", err) + logger.Error(fmt.Sprintf("failed to create backend: %+v", err), "error", err) + os.Exit(1) } backend.AddMatchFunction(matchProfile, minimatch.MatchFunctionSimple1vs1) @@ -80,20 +87,20 @@ func main() { defer shutdown() if err := backend.Start(ctx, conf.TickRate); err != nil { if !errors.Is(err, context.Canceled) { - log.Fatalf("failed to start backend: %+v", err) + logger.Error(fmt.Sprintf("failed to start backend: %+v", err), "error", err) } } } -func newAssigner(conf *config, provider metric.MeterProvider) (minimatch.Assigner, error) { - var assigner minimatch.Assigner = minimatch.AssignerFunc(dummyAssign) +func newAssigner(conf *config, provider metric.MeterProvider, logger *slog.Logger) (minimatch.Assigner, error) { + var assigner minimatch.Assigner = &dummyAssigner{logger: logger} if conf.OverlappingCheckRedisAddr != "" { - log.Printf("with overlapping match checker (redis: %s)", conf.OverlappingCheckRedisAddr) + logger.Info(fmt.Sprintf("with overlapping match checker (redis: %s)", conf.OverlappingCheckRedisAddr)) rc, err := rueidis.NewClient(rueidis.ClientOption{InitAddress: []string{conf.OverlappingCheckRedisAddr}, DisableCache: true}) if err != nil { return nil, fmt.Errorf("failed to create redis client: %w", err) } - as, err := newAssignerWithOverlappingChecker("loadtest:", rc, assigner, provider) + as, err := newAssignerWithOverlappingChecker("loadtest:", rc, assigner, provider, logger) if err != nil { return nil, fmt.Errorf("failed to create assigner with overlapping checker: %w", err) } @@ -145,12 +152,16 @@ func newRedisStateStore(conf *config) (statestore.BackendStore, error) { // Assigner assigns a GameServer to a match. // For example, it could call Agones' Allocate service. // For the sake of simplicity, a dummy GameServer name is assigned here. -func dummyAssign(ctx context.Context, matches []*pb.Match) ([]*pb.AssignmentGroup, error) { +type dummyAssigner struct { + logger *slog.Logger +} + +func (a *dummyAssigner) Assign(ctx context.Context, matches []*pb.Match) ([]*pb.AssignmentGroup, error) { var asgs []*pb.AssignmentGroup for _, match := range matches { tids := ticketIDs(match) conn := hri.Random() - log.Printf("assign '%s' to tickets: %v", conn, tids) + a.logger.Debug(fmt.Sprintf("assign '%s' to tickets: %v", conn, tids)) asgs = append(asgs, &pb.AssignmentGroup{ TicketIds: tids, Assignment: &pb.Assignment{Connection: conn}, @@ -178,17 +189,17 @@ func newMeterProvider() (metric.MeterProvider, error) { return provider, nil } -func startPrometheus() { +func startPrometheus(logger *slog.Logger) { http.Handle("/metrics", promhttp.Handler()) go func() { addr := ":2112" - log.Printf("prometheus endpoint (/metrics) is listening on %s...", addr) + logger.Info(fmt.Sprintf("prometheus endpoint (/metrics) is listening on %s...", addr)) server := &http.Server{ Addr: addr, ReadHeaderTimeout: 10 * time.Second, // https://app.deepsource.com/directory/analyzers/go/issues/GO-S2114 } if err := server.ListenAndServe(); err != nil { - log.Printf("failed to serve prometheus endpoint: %+v", err) + logger.Error(fmt.Sprintf("failed to serve prometheus endpoint: %+v", err), "error", err) } }() } @@ -198,13 +209,13 @@ type assignerWithOverlappingChecker struct { redisKeyPrefix string redisClient rueidis.Client assigner minimatch.Assigner + logger *slog.Logger - validAssigns metric.Int64Counter overlappingWithin metric.Int64Counter overlappingInter metric.Int64Counter } -func newAssignerWithOverlappingChecker(redisKeyPrefix string, redisClient rueidis.Client, assigner minimatch.Assigner, provider metric.MeterProvider) (*assignerWithOverlappingChecker, error) { +func newAssignerWithOverlappingChecker(redisKeyPrefix string, redisClient rueidis.Client, assigner minimatch.Assigner, provider metric.MeterProvider, logger *slog.Logger) (*assignerWithOverlappingChecker, error) { meter := provider.Meter("github.com/castaneai/minimatch/loadtest") overlappingWithIn, err := meter.Int64Counter("minimatch.loadtest.overlapping_tickets_within_backend", metric.WithDescription("Number of times the same Ticket is assigned to multiple Matches within a single backend")) @@ -220,6 +231,7 @@ func newAssignerWithOverlappingChecker(redisKeyPrefix string, redisClient rueidi redisKeyPrefix: redisKeyPrefix, redisClient: redisClient, assigner: assigner, + logger: logger, overlappingWithin: overlappingWithIn, overlappingInter: overlappingInter, }, nil @@ -245,8 +257,19 @@ func (a *assignerWithOverlappingChecker) Assign(ctx context.Context, matches []* a.overlappingInter.Add(ctx, 1) continue } - log.Printf("failed to check overlapping with redis: %+v", err) + a.logger.Error(fmt.Sprintf("failed to check overlapping with redis: %+v", err), "error", err) } } return a.assigner.Assign(ctx, matches) } + +func initLogger() *slog.Logger { + _, onK8s := os.LookupEnv("KUBERNETES_SERVICE_HOST") + _, onCloudRun := os.LookupEnv("K_CONFIGURATION") + if onK8s || onCloudRun { + return slogdriver.New(os.Stdout, slogdriver.HandlerOptions{ + Level: slogdriver.LevelDefault, + }) + } + return slog.Default() +} diff --git a/loadtest/cmd/frontend/main.go b/loadtest/cmd/frontend/main.go index e93d6f6..ce06bf5 100644 --- a/loadtest/cmd/frontend/main.go +++ b/loadtest/cmd/frontend/main.go @@ -4,7 +4,7 @@ import ( "context" "errors" "fmt" - "log" + "log/slog" "net" "net/http" "os" @@ -16,6 +16,7 @@ import ( "connectrpc.com/otelconnect" cache "github.com/Code-Hex/go-generics-cache" "github.com/kelseyhightower/envconfig" + "github.com/kitagry/slogdriver" "github.com/prometheus/client_golang/prometheus/promhttp" "github.com/redis/rueidis" "github.com/redis/rueidis/rueidislock" @@ -54,28 +55,31 @@ type config struct { func main() { var conf config envconfig.MustProcess("", &conf) + logger := initLogger() - startPrometheus() + startPrometheus(logger) redisStore, err := newRedisStateStore(&conf) if err != nil { - log.Fatalf("failed to create redis store: %+v", err) + logger.Error(fmt.Sprintf("failed to create redis store: %+v", err), "error", err) + return } ticketCache := cache.New[string, *pb.Ticket]() store := statestore.NewFrontendStoreWithTicketCache(redisStore, ticketCache, statestore.WithTicketCacheTTL(conf.TicketCacheTTL)) if conf.UseGRPC { - startFrontendWithGRPC(&conf, store) + startFrontendWithGRPC(&conf, store, logger) } else { - startFrontendWithConnectRPC(&conf, store) + startFrontendWithConnectRPC(&conf, store, logger) } } -func startFrontendWithConnectRPC(conf *config, store statestore.FrontendStore) { +func startFrontendWithConnectRPC(conf *config, store statestore.FrontendStore, logger *slog.Logger) { otelInterceptor, err := otelconnect.NewInterceptor(otelconnect.WithoutServerPeerAttributes()) if err != nil { - log.Fatalf("failed to create otelconnect interceptor: %+v", err) + logger.Error(fmt.Sprintf("failed to create otelconnect interceptor: %+v", err), "error", err) + return } mux := http.NewServeMux() @@ -90,7 +94,7 @@ func startFrontendWithConnectRPC(conf *config, store statestore.FrontendStore) { defer cancel() eg := new(errgroup.Group) eg.Go(func() error { - log.Printf("frontend service (Connect RPC) is listening on %s...", addr) + logger.Info(fmt.Sprintf("frontend service (Connect RPC) is listening on %s...", addr)) if err := server.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) { return err } @@ -99,17 +103,17 @@ func startFrontendWithConnectRPC(conf *config, store statestore.FrontendStore) { // wait for stop signal <-ctx.Done() - log.Printf("shutting down frontend service...") + logger.Info("shutting down frontend service...") // shutdown gracefully if err := server.Shutdown(context.Background()); err != nil { - log.Printf("failed to shutdown frontend service: %+v", err) + logger.Error(fmt.Sprintf("failed to shutdown frontend service: %+v", err), "error", err) } if err := eg.Wait(); err != nil { - log.Fatalf("failed to serve frontend server: %+v", err) + logger.Error(fmt.Sprintf("failed to serve frontend server: %+v", err), "error", err) } } -func startFrontendWithGRPC(conf *config, store statestore.FrontendStore) { +func startFrontendWithGRPC(conf *config, store statestore.FrontendStore, logger *slog.Logger) { serverOpts := []grpc.ServerOption{ grpc.KeepaliveParams(keepalive.ServerParameters{ MaxConnectionIdle: 3 * time.Second, @@ -124,7 +128,8 @@ func startFrontendWithGRPC(conf *config, store statestore.FrontendStore) { addr := fmt.Sprintf(":%s", conf.Port) lis, err := net.Listen("tcp", addr) if err != nil { - log.Fatalf("failed to listen gRPC server via %s: %+v", addr, err) + logger.Error(fmt.Sprintf("failed to listen gRPC server via %s: %+v", addr, err), "error", err) + return } // start frontend server @@ -132,17 +137,17 @@ func startFrontendWithGRPC(conf *config, store statestore.FrontendStore) { defer cancel() eg := new(errgroup.Group) eg.Go(func() error { - log.Printf("frontend service (gRPC) is listening on %s...", addr) + logger.Info(fmt.Sprintf("frontend service (gRPC) is listening on %s...", addr)) return sv.Serve(lis) }) // wait for stop signal <-ctx.Done() - log.Printf("shutting down frontend service...") + logger.Info("shutting down frontend service...") // shutdown gracefully sv.GracefulStop() if err := eg.Wait(); err != nil { - log.Fatalf("failed to serve gRPC server: %+v", err) + logger.Error(fmt.Sprintf("failed to serve gRPC server: %+v", err), "error", err) } } @@ -196,23 +201,35 @@ func newMeterProvider() (*metric.MeterProvider, error) { return provider, nil } -func startPrometheus() { +func startPrometheus(logger *slog.Logger) { meterProvider, err := newMeterProvider() if err != nil { - log.Fatalf("failed to create meter provider: %+v", err) + logger.Error(fmt.Sprintf("failed to create meter provider: %+v", err), "error", err) + return } otel.SetMeterProvider(meterProvider) http.Handle("/metrics", promhttp.Handler()) go func() { addr := ":2112" - log.Printf("prometheus endpoint (/metrics) is listening on %s...", addr) + logger.Info(fmt.Sprintf("prometheus endpoint (/metrics) is listening on %s...", addr)) server := &http.Server{ Addr: addr, ReadHeaderTimeout: 10 * time.Second, // https://app.deepsource.com/directory/analyzers/go/issues/GO-S2114 } if err := server.ListenAndServe(); err != nil { - log.Printf("failed to serve prometheus endpoint: %+v", err) + logger.Error(fmt.Sprintf("failed to serve prometheus endpoint: %+v", err), "error", err) } }() } + +func initLogger() *slog.Logger { + _, onK8s := os.LookupEnv("KUBERNETES_SERVICE_HOST") + _, onCloudRun := os.LookupEnv("K_CONFIGURATION") + if onK8s || onCloudRun { + return slogdriver.New(os.Stdout, slogdriver.HandlerOptions{ + Level: slogdriver.LevelDefault, + }) + } + return slog.Default() +} diff --git a/loadtest/go.mod b/loadtest/go.mod index b7516ff..188a0f9 100644 --- a/loadtest/go.mod +++ b/loadtest/go.mod @@ -34,9 +34,11 @@ require ( github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/google/uuid v1.6.0 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.2 // indirect + github.com/kitagry/slogdriver v0.2.0 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/prometheus/client_model v0.5.0 // indirect github.com/prometheus/common v0.44.0 // indirect @@ -44,6 +46,7 @@ require ( github.com/rs/xid v1.5.0 // indirect github.com/sethvargo/go-retry v0.2.4 // indirect github.com/yuin/gopher-lua v1.1.1 // indirect + go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/otel/sdk v1.31.0 // indirect go.opentelemetry.io/otel/trace v1.32.0 // indirect golang.org/x/exp v0.0.0-20220328175248-053ad81199eb // indirect diff --git a/loadtest/go.sum b/loadtest/go.sum index cdca2b0..8d15b67 100644 --- a/loadtest/go.sum +++ b/loadtest/go.sum @@ -1,7 +1,9 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= connectrpc.com/connect v1.17.0 h1:W0ZqMhtVzn9Zhn2yATuUokDLO5N+gIuBWMOnsQrfmZk= connectrpc.com/connect v1.17.0/go.mod h1:0292hj1rnx8oFrStN7cB4jjVBeqs+Yx5yDIC2prWDO8= connectrpc.com/otelconnect v0.7.1 h1:scO5pOb0i4yUE66CnNrHeK1x51yq0bE0ehPg6WvzXJY= connectrpc.com/otelconnect v0.7.1/go.mod h1:dh3bFgHBTb2bkqGCeVVOtHJreSns7uu9wwL2Tbz17ms= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/Code-Hex/go-generics-cache v1.3.1 h1:i8rLwyhoyhaerr7JpjtYjJZUcCbWOdiYO3fZXLiEC4g= github.com/Code-Hex/go-generics-cache v1.3.1/go.mod h1:qxcC9kRVrct9rHeiYpFWSoW1vxyillCVzX13KZG8dl4= github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a/go.mod h1:SGnFV6hVsYE877CKEZ6tDNTjaSXYUk6QqoIK6PrAtcc= @@ -13,39 +15,72 @@ github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bojand/hri v1.1.0 h1:OIv6AtbPjYv9A7qjUqylU11mbcP610JWsWCwvpc3w3U= github.com/bojand/hri v1.1.0/go.mod h1:qwGosuHpNn1S0nyw/mExN0+WZrDf4bQyWjhWh51y3VY= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v1.2.2 h1:1+mZ9upx1Dh6FmUTFR1naJ77miKiXgALjWOZ3NVFPmY= github.com/golang/glog v1.2.2/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.2 h1:dygLcbEBA+t/P7ck6a8AkXv6juQ4cK0RHBoh32jxhHM= github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.2/go.mod h1:Ap9RLCIJVtgQg1/BBgVEfypOAySvvlcpcVQkSzJCH4Y= github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8= github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= +github.com/kitagry/slogdriver v0.2.0 h1:OvAAJxszJHBhUKpox6BbWHVMNdjr58d09k7F4CElgU8= +github.com/kitagry/slogdriver v0.2.0/go.mod h1:B++A36yHxSPBuCDAe37Rh2kaOvSqwwQb/nYwcIB60rY= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/onsi/gomega v1.31.1 h1:KYppCUK+bUgAZwHOu7EXVBKyQA6ILvOESHkn/tgoqvo= github.com/onsi/gomega v1.31.1/go.mod h1:y40C95dwAD1Nz36SsEnxvfFe8FFfNxzI5eJ0EYGyAy0= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q= github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= @@ -60,10 +95,18 @@ github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/sethvargo/go-retry v0.2.4 h1:T+jHEQy/zKJf5s95UkguisicE0zuF9y7+/vgz08Ocec= github.com/sethvargo/go-retry v0.2.4/go.mod h1:1afjQuvh7s4gflMObvjLPaWgluLLyhA1wmVZ6KLpICw= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/gopher-lua v1.1.1 h1:kYKnWBjvbNP4XLT3+bPEwAXJx262OhaHDWDVOPjL46M= github.com/yuin/gopher-lua v1.1.1/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw= +go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.57.0 h1:qtFISDHKolvIxzSs0gIaiPUPR0Cucb0F2coHC7ZLdps= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.57.0/go.mod h1:Y+Pop1Q6hCOnETWTW4NROK/q1hv50hM7yDaUTjG8lp8= go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= @@ -78,27 +121,78 @@ go.opentelemetry.io/otel/sdk/metric v1.31.0 h1:i9hxxLJF/9kkvfHppyLL55aW7iIJz4Jjx go.opentelemetry.io/otel/sdk/metric v1.31.0/go.mod h1:CRInTMVvNhUKgSAMbKyTMxqOBC0zgyxzW55lZzX43Y8= go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20220328175248-053ad81199eb h1:pC9Okm6BVmxEw76PUu0XUbOTQ92JX11hfvqTjAV3qxM= golang.org/x/exp v0.0.0-20220328175248-053ad81199eb/go.mod h1:lgLbSvA5ygNOMpwM/9anMpWVlVJ7Z+cHWq/eFuinpGE= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190204203706-41f3e6584952/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 h1:hjSy6tcFQZ171igDaN5QHOw2n6vx40juYbC/x67CEhc= google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:qpvKtACPCQhAdu3PyQgV4l3LMXZEtft7y8QcarRsp9I= google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 h1:XVhgTWWV3kGQlwJHR3upFWZeTsei6Oks1apkZSeonIE= google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.68.0 h1:aHQeeJbo8zAkAa3pRzrVjZlbz6uSfeOXlJNQM0RAbz0= google.golang.org/grpc v1.68.0/go.mod h1:fmSPC5AsjSBCK54MyHRx48kpOti1/jRfOlwEWywNjWA= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= open-match.dev/open-match v1.8.1 h1:Tp5fxeUVBugt091zFxMJim6TalE9sFDB2mNGw5zRWQQ= open-match.dev/open-match v1.8.1/go.mod h1:FjKE1hS+BGFMxVUQvPLqXWMUjjFysYrPESdEfEpDxvM=