Ver Fonte

setup auth-management-server; add to tilt (#3269)

Co-authored-by: David Townley <davidtownley@davids-air.lan>
Co-authored-by: David Townley <davidtownley@Davids-MacBook-Air.local>
d-g-town há 2 anos atrás
pai
commit
aebd91e854
8 ficheiros alterados com 244 adições e 39 exclusões
  1. 2 1
      Tiltfile
  2. 14 0
      api/authmanagement/api_token.go
  3. 83 0
      api/authmanagement/server.go
  4. 54 0
      api/server/server.go
  5. 64 15
      cmd/app/main.go
  6. 9 8
      go.mod
  7. 17 15
      go.sum
  8. 1 0
      go.work.sum

+ 2 - 1
Tiltfile

@@ -58,6 +58,7 @@ local_resource(
     "internal",
     "pkg",
     "vendor",
+    "cmd",
   ],
   resource_deps=["postgresql"],
   labels=["z_binaries"]
@@ -81,7 +82,7 @@ docker_build_with_restart(
     context=".",
     dockerfile="zarf/docker/Dockerfile.server.tilt",
     # entrypoint='dlv --listen=:40000 --api-version=2 --headless=true --log=true exec /porter/bin/app',
-    entrypoint='/app/migrate && /app/porter',
+    entrypoint='/app/migrate && /app/porter --auth',
     build_args={},
     only=[
         "bin",

+ 14 - 0
api/authmanagement/api_token.go

@@ -0,0 +1,14 @@
+package authmanagement
+
+import (
+	"context"
+	"errors"
+
+	"github.com/bufbuild/connect-go"
+	porterv1 "github.com/porter-dev/api-contracts/generated/go/porter/v1"
+)
+
+// APIToken returns an encoded token for programmatic access to the Porter UI
+func (a AuthManagementService) APIToken(ctx context.Context, req *connect.Request[porterv1.APITokenRequest]) (*connect.Response[porterv1.APITokenResponse], error) {
+	return nil, connect.NewError(connect.CodeUnimplemented, errors.New("porter.v1.AuthManagementService.APIToken is not implemented"))
+}

+ 83 - 0
api/authmanagement/server.go

@@ -0,0 +1,83 @@
+package authmanagement
+
+import (
+	"context"
+	"fmt"
+	"net/http"
+	"time"
+
+	"github.com/joeshaw/envdecode"
+
+	"github.com/bufbuild/connect-go"
+	otelconnect "github.com/bufbuild/connect-opentelemetry-go"
+	"github.com/porter-dev/api-contracts/generated/go/porter/v1/porterv1connect"
+	"golang.org/x/net/http2"
+	"golang.org/x/net/http2/h2c"
+)
+
+// Config contains all configuration options for the AuthManagementService
+type Config struct {
+	// Port is the port that the AuthManagementService listens on
+	Port int `env:"AUTH_MANAGEMENT_SERVICE_PORT,default=8090"`
+	// TokenGeneratorSecret is the secret used to generate JWT tokens
+	TokenGeneratorSecret string `env:"TOKEN_GENERATOR_SECRET,default=secret"`
+}
+
+// AuthManagementService stores the service config and implements the gRPC server's interface
+type AuthManagementService struct {
+	Config Config
+}
+
+// NewService loads the authmanagement.Config from the environment and returns an initialized AuthManagementService
+func NewService() (AuthManagementService, error) {
+	var server AuthManagementService
+
+	var config Config
+	if err := envdecode.StrictDecode(&config); err != nil {
+		return server, fmt.Errorf("Failed to decode server conf: %s", err)
+	}
+
+	server.Config = config
+
+	return server, nil
+}
+
+// ListenAndServe starts the AuthManagementService
+func (a AuthManagementService) ListenAndServe(ctx context.Context) error {
+	ctx, cancel := context.WithCancel(ctx)
+	defer cancel()
+
+	mux := http.NewServeMux()
+
+	mux.Handle(porterv1connect.NewAuthManagementServiceHandler(a,
+		connect.WithInterceptors(
+			otelconnect.NewInterceptor(otelconnect.WithTrustRemote()),
+		),
+	))
+
+	srv := &http.Server{
+		Addr:        fmt.Sprintf("0.0.0.0:%d", a.Config.Port),
+		ReadTimeout: 5 * time.Second,
+
+		// TODO: remove this. Use h2c so we can serve HTTP/2 without TLS.
+		Handler: h2c.NewHandler(mux, &http2.Server{}),
+	}
+	defer srv.Shutdown(ctx) // nolint:errcheck
+
+	errChan := make(chan error)
+
+	go func() {
+		err := srv.ListenAndServe()
+		if err != nil {
+			errChan <- err
+		}
+	}()
+
+	select {
+	case err := <-errChan:
+		return err
+	case <-ctx.Done():
+	}
+
+	return nil
+}

+ 54 - 0
api/server/server.go

@@ -0,0 +1,54 @@
+package server
+
+import (
+	"context"
+	"fmt"
+	"net/http"
+
+	"github.com/go-chi/chi/v5"
+	"github.com/porter-dev/porter/api/server/shared/config/env"
+)
+
+// PorterAPIServer contains the routing and configuration options for starting the PorterAPIServer
+type PorterAPIServer struct {
+	// Port is the port that PorterAPIServer listens on
+	Port int
+	// Router is the router that handles requests
+	Router *chi.Mux
+	// ServerConf is the server configuration
+	ServerConf *env.ServerConf
+}
+
+// ListenAndServe starts the Porter API server
+func (p PorterAPIServer) ListenAndServe(ctx context.Context) error {
+	ctx, cancel := context.WithCancel(ctx)
+	defer cancel()
+
+	address := fmt.Sprintf(":%d", p.Port)
+
+	srv := &http.Server{
+		Addr:         address,
+		Handler:      p.Router,
+		ReadTimeout:  p.ServerConf.TimeoutRead,
+		WriteTimeout: p.ServerConf.TimeoutWrite,
+		IdleTimeout:  p.ServerConf.TimeoutIdle,
+	}
+	defer srv.Shutdown(ctx) // nolint:errcheck
+
+	errChan := make(chan error)
+
+	go func() {
+		err := srv.ListenAndServe()
+		if err != nil {
+			errChan <- err
+		}
+	}()
+
+	select {
+	case err := <-errChan:
+		return err
+	case <-ctx.Done():
+	}
+
+	return nil
+}

+ 64 - 15
cmd/app/main.go

@@ -10,6 +10,14 @@ import (
 	"log"
 	"net/http"
 	"os"
+	"os/signal"
+	"syscall"
+
+	"github.com/porter-dev/porter/api/server"
+
+	"github.com/porter-dev/porter/api/authmanagement"
+
+	"golang.org/x/sync/errgroup"
 
 	"github.com/porter-dev/porter/internal/telemetry"
 
@@ -24,8 +32,13 @@ import (
 var Version string = "dev-ce"
 
 func main() {
-	var versionFlag bool
+	g, ctx := errgroup.WithContext(context.Background())
+	ctx, cancel := context.WithCancel(ctx)
+	defer cancel()
+
+	var versionFlag, authServiceFlag bool
 	flag.BoolVar(&versionFlag, "version", false, "print version and exit")
+	flag.BoolVar(&authServiceFlag, "auth", false, "run auth service in addition to porter api")
 	flag.Parse()
 
 	// Exit safely when version is used
@@ -48,30 +61,66 @@ func main() {
 	}
 	config.Logger.Info().Msg("Initialed data")
 
+	tracer, err := telemetry.InitTracer(ctx, config.TelemetryConfig)
+	if err != nil {
+		config.Logger.Fatal().Err(err).Msg("Error initializing telemetry")
+	}
+	defer tracer.Shutdown()
+
 	config.Logger.Info().Msg("Creating API router")
 	appRouter := router.NewAPIRouter(config)
 	config.Logger.Info().Msg("Created API router")
 
-	address := fmt.Sprintf(":%d", config.ServerConf.Port)
+	p := server.PorterAPIServer{
+		Port:       config.ServerConf.Port,
+		Router:     appRouter,
+		ServerConf: config.ServerConf,
+	}
+
+	g.Go(func() error {
+		config.Logger.Info().Msgf("Starting PorterAPI server on port %d", config.ServerConf.Port)
+		if err := p.ListenAndServe(ctx); err != nil && err != http.ErrServerClosed {
+			return fmt.Errorf("PorterAPI server failed: %s", err.Error())
+		}
+		config.Logger.Info().Msg("Shutting down PorterAPI server")
+		return nil
+	})
 
-	config.Logger.Info().Msgf("Starting server %v", address)
+	if authServiceFlag {
+		g.Go(func() error {
+			a, err := authmanagement.NewService()
+			if err != nil {
+				return fmt.Errorf("failed to initialize AuthManagement server: %s", err.Error())
+			}
 
-	s := &http.Server{
-		Addr:         address,
-		Handler:      appRouter,
-		ReadTimeout:  config.ServerConf.TimeoutRead,
-		WriteTimeout: config.ServerConf.TimeoutWrite,
-		IdleTimeout:  config.ServerConf.TimeoutIdle,
+			config.Logger.Info().Msgf("Starting AuthManagement server on port %d", a.Config.Port)
+			if err := a.ListenAndServe(ctx); err != nil && err != http.ErrServerClosed {
+				return fmt.Errorf("AuthManagement server failed: %s", err.Error())
+			}
+			config.Logger.Info().Msg("Shutting down AuthManagement server")
+			return nil
+		})
 	}
 
-	// ignore error so that telemetry is not required
-	tracer, err := telemetry.InitTracer(context.Background(), config.TelemetryConfig)
-	if err == nil {
-		defer tracer.Shutdown()
+	termFunc := func() error {
+		termChan := make(chan os.Signal, 1)
+		signal.Notify(termChan, syscall.SIGINT, syscall.SIGTERM)
+
+		select {
+		case <-termChan:
+			config.Logger.Info().Msg("Process shutdown signal received")
+			cancel()
+			return nil
+		case <-ctx.Done():
+			return nil
+		}
 	}
 
-	if err := s.ListenAndServe(); err != nil && err != http.ErrServerClosed {
-		config.Logger.Fatal().Err(err).Msg("Server startup failed")
+	g.Go(termFunc)
+
+	err = g.Wait()
+	if err != nil {
+		config.Logger.Fatal().Err(err).Msg("Received server error")
 	}
 }
 

+ 9 - 8
go.mod

@@ -71,18 +71,19 @@ require (
 	github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/containerregistry/armcontainerregistry v0.5.0
 	github.com/briandowns/spinner v1.18.1
 	github.com/bufbuild/connect-go v1.5.2
+	github.com/bufbuild/connect-opentelemetry-go v0.1.0
 	github.com/glebarez/sqlite v1.6.0
 	github.com/go-chi/chi/v5 v5.0.8
 	github.com/honeycombio/otel-launcher-go v0.2.0
 	github.com/nats-io/nats.go v1.24.0
 	github.com/open-policy-agent/opa v0.44.0
-	github.com/porter-dev/api-contracts v0.0.70
+	github.com/porter-dev/api-contracts v0.0.72
 	github.com/riandyrn/otelchi v0.5.1
 	github.com/santhosh-tekuri/jsonschema/v5 v5.0.1
 	github.com/stefanmcshane/helm v0.0.0-20221213002717-88a4a2c6e77d
 	github.com/xanzy/go-gitlab v0.68.0
 	go.opentelemetry.io/otel v1.14.0
-	go.opentelemetry.io/otel/sdk v1.13.0
+	go.opentelemetry.io/otel/sdk v1.14.0
 	go.opentelemetry.io/otel/trace v1.14.0
 	go.uber.org/goleak v1.2.0
 	gopkg.in/segmentio/analytics-go.v3 v3.1.0
@@ -144,15 +145,15 @@ require (
 	github.com/remyoudompheng/bigfft v0.0.0-20220927061507-ef77025ab5aa // indirect
 	github.com/rogpeppe/go-internal v1.9.0 // indirect
 	github.com/sethvargo/go-envconfig v0.8.2 // indirect
-	github.com/shirou/gopsutil/v3 v3.22.12 // indirect
+	github.com/shirou/gopsutil/v3 v3.23.1 // indirect
 	github.com/tchap/go-patricia/v2 v2.3.1 // indirect
 	github.com/tklauser/go-sysconf v0.3.11 // indirect
 	github.com/tklauser/numcpus v0.6.0 // indirect
 	github.com/yashtewari/glob-intersection v0.1.0 // indirect
 	github.com/yusufpapurcu/wmi v1.2.2 // indirect
 	go.opentelemetry.io/contrib v1.0.0 // indirect
-	go.opentelemetry.io/contrib/instrumentation/host v0.38.0 // indirect
-	go.opentelemetry.io/contrib/instrumentation/runtime v0.38.0 // indirect
+	go.opentelemetry.io/contrib/instrumentation/host v0.40.0 // indirect
+	go.opentelemetry.io/contrib/instrumentation/runtime v0.40.0 // indirect
 	go.opentelemetry.io/contrib/propagators/b3 v1.13.0 // indirect
 	go.opentelemetry.io/contrib/propagators/ot v1.13.0 // indirect
 	go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.12.0 // indirect
@@ -162,8 +163,8 @@ require (
 	go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.12.0 // indirect
 	go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.12.0 // indirect
 	go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.12.0 // indirect
-	go.opentelemetry.io/otel/metric v0.35.0 // indirect
-	go.opentelemetry.io/otel/sdk/metric v0.35.0 // indirect
+	go.opentelemetry.io/otel/metric v0.37.0 // indirect
+	go.opentelemetry.io/otel/sdk/metric v0.37.0 // indirect
 	go.opentelemetry.io/proto/otlp v0.19.0 // indirect
 	go.uber.org/atomic v1.10.0 // indirect
 	go.uber.org/multierr v1.9.0 // indirect
@@ -326,7 +327,7 @@ require (
 	go.opencensus.io v0.24.0 // indirect
 	go.starlark.net v0.0.0-20220328144851-d1966c6b9fcd // indirect
 	golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect
-	golang.org/x/sync v0.1.0 // indirect
+	golang.org/x/sync v0.1.0
 	golang.org/x/sys v0.5.0 // indirect
 	golang.org/x/term v0.5.0 // indirect
 	golang.org/x/text v0.7.0 // indirect

+ 17 - 15
go.sum

@@ -301,6 +301,8 @@ github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR
 github.com/bshuster-repo/logrus-logstash-hook v1.0.0 h1:e+C0SB5R1pu//O4MQ3f9cFuPGoOVeF2fE4Og9otCc70=
 github.com/bufbuild/connect-go v1.5.2 h1:G4EZd5gF1U1ZhhbVJXplbuUnfKpBZ5j5izqIwu2g2W8=
 github.com/bufbuild/connect-go v1.5.2/go.mod h1:GmMJYR6orFqD0Y6ZgX8pwQ8j9baizDrIQMm1/a6LnHk=
+github.com/bufbuild/connect-opentelemetry-go v0.1.0 h1:UA3mWNBDpie9iObZCB/RTUbHp/J8tSg3rwA6B38U2Cg=
+github.com/bufbuild/connect-opentelemetry-go v0.1.0/go.mod h1:D/pbarAjos2MS7DVhwCJksyOtoEmfBbfQasta2aJkKI=
 github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s=
 github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=
 github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd h1:rFt+Y/IK1aEZkEHchZRSq9OQbsSzIT/OrI8YFFmRIng=
@@ -1490,8 +1492,8 @@ github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77
 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 github.com/polyfloyd/go-errorlint v0.0.0-20210722154253-910bb7978349/go.mod h1:wi9BfjxjF/bwiZ701TzmfKu6UKC357IOAtNr0Td0Lvw=
-github.com/porter-dev/api-contracts v0.0.70 h1:7Qj+wCehQDhAQyqoTNDeJXlKXYPzPenceR98ygTz2oo=
-github.com/porter-dev/api-contracts v0.0.70/go.mod h1:qr2L58mJLr5DUGV5OPw3REiSrQvJq6TgkKyEWP95dyU=
+github.com/porter-dev/api-contracts v0.0.72 h1:jNCwEsZNIDgecrLfET6oT2sZFFVxfbHQKpK+A4eWSGs=
+github.com/porter-dev/api-contracts v0.0.72/go.mod h1:qr2L58mJLr5DUGV5OPw3REiSrQvJq6TgkKyEWP95dyU=
 github.com/porter-dev/switchboard v0.0.0-20221019155755-67ff2bf04935 h1:hfb3nt3AJXIBbevu6ARTg9SdOkMP6WLbKBiG5hT5rcc=
 github.com/porter-dev/switchboard v0.0.0-20221019155755-67ff2bf04935/go.mod h1:xSPzqSFMQ6OSbp42fhCi4AbGbQbsm6nRvOkrblFeXU4=
 github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
@@ -1618,8 +1620,8 @@ github.com/sethvargo/go-envconfig v0.8.2 h1:DDUVuG21RMgeB/bn4leclUI/837y6cQCD4w8
 github.com/sethvargo/go-envconfig v0.8.2/go.mod h1:Iz1Gy1Sf3T64TQlJSvee81qDhf7YIlt8GMUX6yyNFs0=
 github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c/go.mod h1:/PevMnwAxekIXwN8qQyfc5gl2NlkB3CQlkizAbOkeBs=
 github.com/shirou/gopsutil/v3 v3.21.10/go.mod h1:t75NhzCZ/dYyPQjyQmrAYP6c8+LCdFANeBMdLPCNnew=
-github.com/shirou/gopsutil/v3 v3.22.12 h1:oG0ns6poeUSxf78JtOsfygNWuEHYYz8hnnNg7P04TJs=
-github.com/shirou/gopsutil/v3 v3.22.12/go.mod h1:Xd7P1kwZcp5VW52+9XsirIKd/BROzbb2wdX3Kqlz9uI=
+github.com/shirou/gopsutil/v3 v3.23.1 h1:a9KKO+kGLKEvcPIs4W62v0nu3sciVDOOOPUD0Hz7z/4=
+github.com/shirou/gopsutil/v3 v3.23.1/go.mod h1:NN6mnm5/0k8jw4cBfCnJtr5L7ErOTg18tMNpgFkn0hA=
 github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4=
 github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
 github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8=
@@ -1847,11 +1849,11 @@ go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
 go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc=
 go.opentelemetry.io/contrib v1.0.0 h1:khwDCxdSspjOLmFnvMuSHd/5rPzbTx0+l6aURwtQdfE=
 go.opentelemetry.io/contrib v1.0.0/go.mod h1:EH4yDYeNoaTqn/8yCWQmfNB78VHfGX2Jt2bvnvzBlGM=
-go.opentelemetry.io/contrib/instrumentation/host v0.38.0 h1:UAL4VwsGD8I87v0PUnlNvNoDK9biur6BavY6hZyHRtE=
-go.opentelemetry.io/contrib/instrumentation/host v0.38.0/go.mod h1:tVaeBxRJPU0PrChJnlb4kWolV8jgzNLonwFoa1j8JAM=
+go.opentelemetry.io/contrib/instrumentation/host v0.40.0 h1:cZurGyTXSgUrXHLjcwh+hVXBv98xMIigZFF5tJ/8La0=
+go.opentelemetry.io/contrib/instrumentation/host v0.40.0/go.mod h1:7HKwySOL83pJ4FP3SJnjA8cOK4MxE2qHtq9ErpNqTks=
 go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4=
-go.opentelemetry.io/contrib/instrumentation/runtime v0.38.0 h1:uTd4XAyfZ51V5w+ZOCFPiNgzVN2Yp3ibNYKvZ7hWViM=
-go.opentelemetry.io/contrib/instrumentation/runtime v0.38.0/go.mod h1:LYI0Tb+eGfyp/IRpjSSERc3rv/3FT/IjqUeNNTZdJRQ=
+go.opentelemetry.io/contrib/instrumentation/runtime v0.40.0 h1:Qf1GuR3QFxTNqDhfuw9XuJMkOOyRUwWP9NdFakk3RXM=
+go.opentelemetry.io/contrib/instrumentation/runtime v0.40.0/go.mod h1:zmll4G8j5zRZeFURG6t/N7SOl7M5kUHQfV5UVqTaQFI=
 go.opentelemetry.io/contrib/propagators/b3 v1.13.0 h1:f17PBmZK60RoHvOpJVqEka8oS2EXjpjHquESD/8zZ50=
 go.opentelemetry.io/contrib/propagators/b3 v1.13.0/go.mod h1:zy2hz1TpGUoJzSwlBchVGvVAFQS8s2pglKLbrAFZ+Sc=
 go.opentelemetry.io/contrib/propagators/ot v1.13.0 h1:tHWNd0WRS6w9keZoZg9aF3zYohdaBacQfojPYZJgATQ=
@@ -1876,17 +1878,17 @@ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.12.0/go.mod h
 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.12.0 h1:L23MzcHDznr05xOM1Ng1F98L0nVd7hm/S7y2jW9IRB4=
 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.12.0/go.mod h1:C+onYX2j5QH653b3wGJwowYr8jLMjBJw35QcaCQQK0U=
 go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU=
-go.opentelemetry.io/otel/metric v0.35.0 h1:aPT5jk/w7F9zW51L7WgRqNKDElBdyRLGuBtI5MX34e8=
-go.opentelemetry.io/otel/metric v0.35.0/go.mod h1:qAcbhaTRFU6uG8QM7dDo7XvFsWcugziq/5YI065TokQ=
+go.opentelemetry.io/otel/metric v0.37.0 h1:pHDQuLQOZwYD+Km0eb657A25NaRzy0a+eLyKfDXedEs=
+go.opentelemetry.io/otel/metric v0.37.0/go.mod h1:DmdaHfGt54iV6UKxsV9slj2bBRJcKC1B1uvDLIioc1s=
 go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw=
 go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc=
 go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs=
-go.opentelemetry.io/otel/sdk v1.13.0 h1:BHib5g8MvdqS65yo2vV1s6Le42Hm6rrw08qU6yz5JaM=
-go.opentelemetry.io/otel/sdk v1.13.0/go.mod h1:YLKPx5+6Vx/o1TCUYYs+bpymtkmazOMT6zoRrC7AQ7I=
+go.opentelemetry.io/otel/sdk v1.14.0 h1:PDCppFRDq8A1jL9v6KMI6dYesaq+DFcDZvjsoGvxGzY=
+go.opentelemetry.io/otel/sdk v1.14.0/go.mod h1:bwIC5TjrNG6QDCHNWvW4HLHtUQ4I+VQDsnjhvyZCALM=
 go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE=
 go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE=
-go.opentelemetry.io/otel/sdk/metric v0.35.0 h1:gryV4W5GzpOhKK48/lZb8ldyWIs3DRugSVlQZmCwELA=
-go.opentelemetry.io/otel/sdk/metric v0.35.0/go.mod h1:eDyp1GxSiwV98kr7w4pzrszQh/eze9MqBqPd2bCPmyE=
+go.opentelemetry.io/otel/sdk/metric v0.37.0 h1:haYBBtZZxiI3ROwSmkZnI+d0+AVzBWeviuYQDeBWosU=
+go.opentelemetry.io/otel/sdk/metric v0.37.0/go.mod h1:mO2WV1AZKKwhwHTV3AKOoIEb9LbUaENZDuGUQd+j4A0=
 go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw=
 go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk=
 go.opentelemetry.io/otel/trace v1.14.0 h1:wp2Mmvj41tDsyAJXiWDWpfNsOiIyd38fy85pyKcFq/M=
@@ -2231,7 +2233,7 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc
 golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU=
 golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=

+ 1 - 0
go.work.sum

@@ -148,6 +148,7 @@ golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE=
 golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg=
 golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
 google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg=
 google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=