diff --git a/app.go b/app.go index a70b21f15..3d5c21670 100644 --- a/app.go +++ b/app.go @@ -12,9 +12,11 @@ import ( "strings" "time" + "flamingo.me/opentelemetry" + "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" + "flamingo.me/dingo" "github.com/spf13/cobra" - "go.opencensus.io/plugin/ochttp" "flamingo.me/flamingo/v3/core/runtime" "flamingo.me/flamingo/v3/core/zap" @@ -22,7 +24,6 @@ import ( "flamingo.me/flamingo/v3/framework/cmd" "flamingo.me/flamingo/v3/framework/config" "flamingo.me/flamingo/v3/framework/flamingo" - "flamingo.me/flamingo/v3/framework/opencensus" "flamingo.me/flamingo/v3/framework/web" ) @@ -331,7 +332,7 @@ type servemodule struct { server *http.Server eventRouter flamingo.EventRouter logger flamingo.Logger - configuredSampler *opencensus.ConfiguredURLPrefixSampler + configuredSampler *opentelemetry.ConfiguredURLPrefixSampler certFile, keyFile string publicEndpoint bool } @@ -341,10 +342,10 @@ func (a *servemodule) Inject( router *web.Router, eventRouter flamingo.EventRouter, logger flamingo.Logger, - configuredSampler *opencensus.ConfiguredURLPrefixSampler, + configuredSampler *opentelemetry.ConfiguredURLPrefixSampler, cfg *struct { Port int `inject:"config:core.serve.port"` - PublicEndpoint bool `inject:"config:flamingo.opencensus.publicEndpoint,optional"` + PublicEndpoint bool `inject:"config:flamingo.opentelemetry.publicEndpoint,optional"` }, ) { a.router = router @@ -376,7 +377,13 @@ func serveProvider(a *servemodule, logger flamingo.Logger) *cobra.Command { Use: "serve", Short: "Default serve command - starts on Port 3322", Run: func(cmd *cobra.Command, args []string) { - a.server.Handler = &ochttp.Handler{IsPublicEndpoint: a.publicEndpoint, Handler: a.router.Handler(), GetStartOptions: a.configuredSampler.GetStartOptions()} + options := []otelhttp.Option{ + otelhttp.WithFilter(a.configuredSampler.GetFilterOption()), + } + if a.publicEndpoint { + options = append(options, otelhttp.WithPublicEndpoint()) + } + a.server.Handler = otelhttp.NewHandler(a.router.Handler(), "server", options...) err := a.listenAndServe() if err != nil { diff --git a/core/cache/cache.go b/core/cache/cache.go index d8b0713c6..975f62390 100644 --- a/core/cache/cache.go +++ b/core/cache/cache.go @@ -3,7 +3,7 @@ package cache import ( "time" - "go.opencensus.io/trace" + "go.opentelemetry.io/otel/trace" ) type ( diff --git a/core/cache/httpFrontend.go b/core/cache/httpFrontend.go index b4e861780..82acf2cdd 100644 --- a/core/cache/httpFrontend.go +++ b/core/cache/httpFrontend.go @@ -9,10 +9,10 @@ import ( "net/http" "time" - "go.opencensus.io/trace" - "golang.org/x/sync/singleflight" - "flamingo.me/flamingo/v3/framework/flamingo" + "github.com/golang/groupcache/singleflight" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/trace" ) type ( @@ -79,8 +79,8 @@ func (hf *HTTPFrontend) Get(ctx context.Context, key string, loader HTTPLoader) return nil, errors.New("NO backend in Cache") } - ctx, span := trace.StartSpan(ctx, "flamingo/cache/httpFrontend/Get") - span.Annotate(nil, key) + ctx, span := otel.Tracer("flamingo.me/opentelemetry").Start(ctx, "flamingo/cache/httpFrontend/Get") + span.AddEvent(key) defer span.End() if entry, ok := hf.backend.Get(key); ok { @@ -111,16 +111,16 @@ func (hf *HTTPFrontend) Get(ctx context.Context, key string, loader HTTPLoader) } func (hf *HTTPFrontend) load(ctx context.Context, key string, loader HTTPLoader, keepExistingEntry bool) (cachedResponse, error) { - oldSpan := trace.FromContext(ctx) - newContext := trace.NewContext(context.Background(), oldSpan) + oldSpan := trace.SpanFromContext(ctx) + newContext := trace.ContextWithSpan(context.Background(), oldSpan) - newContextWithSpan, span := trace.StartSpan(newContext, "flamingo/cache/httpFrontend/load") - span.Annotate(nil, key) + newContextWithSpan, span := otel.Tracer("flamingo.me/opentelemetry").Start(newContext, "flamingo/cache/httpFrontend/load") + span.AddEvent(key) defer span.End() - data, err, _ := hf.Do(key, func() (res interface{}, resultErr error) { - ctx, fetchRoutineSpan := trace.StartSpan(newContextWithSpan, "flamingo/cache/httpFrontend/fetchRoutine") - fetchRoutineSpan.Annotate(nil, key) + data, err := hf.Do(key, func() (res interface{}, resultErr error) { + ctx, fetchRoutineSpan := otel.Tracer("flamingo.me/opentelemetry").Start(newContextWithSpan, "flamingo/cache/httpFrontend/fetchRoutine") + fetchRoutineSpan.AddEvent(key) defer fetchRoutineSpan.End() defer func() { @@ -198,8 +198,8 @@ func (hf *HTTPFrontend) load(ctx context.Context, key string, loader HTTPLoader, }) } - span.AddAttributes(trace.StringAttribute("parenttrace", response.span.TraceID.String())) - span.AddAttributes(trace.StringAttribute("parentspan", response.span.SpanID.String())) + span.SetAttributes(attribute.String("parenttrace", response.span.TraceID().String())) + span.SetAttributes(attribute.String("parentspan", response.span.SpanID().String())) return cached, err } diff --git a/core/cache/stringFrontend.go b/core/cache/stringFrontend.go index f1361977a..12b6290c2 100644 --- a/core/cache/stringFrontend.go +++ b/core/cache/stringFrontend.go @@ -3,7 +3,7 @@ package cache import ( "time" - "go.opencensus.io/trace" + "go.opentelemetry.io/otel/trace" "golang.org/x/sync/singleflight" ) diff --git a/core/gotemplate/engine.go b/core/gotemplate/engine.go index 351a4eb5d..4ed210463 100644 --- a/core/gotemplate/engine.go +++ b/core/gotemplate/engine.go @@ -15,7 +15,6 @@ import ( "time" "flamingo.me/flamingo/v3/framework/flamingo" - "go.opencensus.io/trace" ) const pathSeparatorString = string(os.PathSeparator) @@ -60,7 +59,7 @@ func (e *engine) Inject( } func (e *engine) Render(ctx context.Context, name string, data interface{}) (io.Reader, error) { - ctx, span := trace.StartSpan(ctx, "gotemplate/Render") + ctx, span := otel.Tracer("flamingo.me/opentelemetry").Start(ctx, "gotemplate/Render") defer span.End() lock.Lock() @@ -73,7 +72,7 @@ func (e *engine) Render(ctx context.Context, name string, data interface{}) (io. } lock.Unlock() - _, span = trace.StartSpan(ctx, "gotemplate/Execute") + _, span = otel.Tracer("flamingo.me/opentelemetry").Start(ctx, "gotemplate/Execute") buf := &bytes.Buffer{} if _, ok := e.templates[name+".html"]; !ok { @@ -98,7 +97,7 @@ func (e *engine) Render(ctx context.Context, name string, data interface{}) (io. } func (e *engine) loadTemplates(ctx context.Context) error { - ctx, span := trace.StartSpan(ctx, "gotemplate/loadTemplates") + ctx, span := otel.Tracer("flamingo.me/opentelemetry").Start(ctx, "gotemplate/loadTemplates") defer span.End() e.templates = make(map[string]*template.Template, 0) diff --git a/core/oauth/interfaces/callback_controller.go b/core/oauth/interfaces/callback_controller.go index c2280d39b..13b3517ce 100644 --- a/core/oauth/interfaces/callback_controller.go +++ b/core/oauth/interfaces/callback_controller.go @@ -9,10 +9,8 @@ import ( "flamingo.me/flamingo/v3/core/oauth/application" "flamingo.me/flamingo/v3/core/oauth/domain" "flamingo.me/flamingo/v3/framework/flamingo" - "flamingo.me/flamingo/v3/framework/opencensus" "flamingo.me/flamingo/v3/framework/web" - "go.opencensus.io/stats" - "go.opencensus.io/stats/view" + "go.opentelemetry.io/otel/metric" ) type ( @@ -33,16 +31,21 @@ type ( var ( // loginFailedCount counts the failed login attempts - loginFailedCount = stats.Int64("flamingo/oauth/login_failed", "Count of failed login attempts", stats.UnitDimensionless) + loginFailedCount metric.Int64Counter // loginSucceededCount counts the successful login attempts - loginSucceededCount = stats.Int64("flamingo/oauth/login_succeeded", "Count of succeeded login attempts", stats.UnitDimensionless) + loginSucceededCount metric.Int64Counter ) func init() { - if err := opencensus.View("flamingo/oauth/login_failed", loginFailedCount, view.Count()); err != nil { + var err error + loginFailedCount, err = otel.Meter("flamingo.me/opentelemetry").Int64Counter("flamingo/oauth/login_failed", + metric.WithDescription("Count of failed login attempts")) + if err != nil { panic(err) } - if err := opencensus.View("flamingo/oauth/login_succeeded", loginSucceededCount, view.Count()); err != nil { + loginSucceededCount, err = otel.Meter("flamingo.me/opentelemetry").Int64Counter("flamingo/oauth/login_succeeded", + metric.WithDescription("Count of succeeded login attempts")) + if err != nil { panic(err) } } @@ -73,7 +76,7 @@ func (cc *CallbackController) Get(ctx context.Context, request *web.Request) web cc.logger.Error(fmt.Sprintf("Invalid State - expected: %v got: %v", state, request.Request().URL.Query().Get("state"))) } - stats.Record(ctx, loginFailedCount.M(1)) + loginFailedCount.Add(ctx, 1) return cc.responder.ServerError(errors.New("invalid state")) } @@ -86,30 +89,30 @@ func (cc *CallbackController) Get(ctx context.Context, request *web.Request) web if code == "" && errCode == "" { err := errors.New("missing both code and error get parameter") cc.logger.Error("core.auth.callback Missing parameter", err) - stats.Record(ctx, loginFailedCount.M(1)) + loginFailedCount.Add(ctx, 1) return cc.responder.ServerError(err) } else if code != "" { oauth2Token, err := cc.authManager.OAuth2Config(ctx, request).Exchange(cc.authManager.OAuthCtx(ctx), code) if err != nil { cc.logger.Error("core.auth.callback Error OAuth2Config Exchange", err) - stats.Record(ctx, loginFailedCount.M(1)) + loginFailedCount.Add(ctx, 1) return cc.responder.ServerError(fmt.Errorf("core.auth.callback error in OAuth2Config Exchange: %w", err)) } err = cc.authManager.StoreTokenDetails(ctx, request.Session(), oauth2Token) if err != nil { cc.logger.Error("core.auth.callback Error", err) - stats.Record(ctx, loginFailedCount.M(1)) + loginFailedCount.Add(ctx, 1) return cc.responder.ServerError(fmt.Errorf("core.auth.StoreTokenDetails error %w", err)) } cc.eventPublisher.PublishLoginEvent(ctx, &domain.LoginEvent{Session: request.Session()}) cc.logger.Debug("successful logged in and saved tokens", oauth2Token) cc.logger.Debugf("Token expiry %v", oauth2Token.Expiry) request.Session().AddFlash("successful logged in") - stats.Record(ctx, loginSucceededCount.M(1)) + loginSucceededCount.Add(ctx, 1) } else if errCode != "" { cc.logger.Error("core.auth.callback Error parameter", errCode) - stats.Record(ctx, loginFailedCount.M(1)) + loginFailedCount.Add(ctx, 1) } if redirect, ok := request.Session().Load("auth.redirect"); ok { diff --git a/core/requesttask/filter.go b/core/requesttask/filter.go index 59c2cbf3a..4f2ab43f1 100644 --- a/core/requesttask/filter.go +++ b/core/requesttask/filter.go @@ -7,7 +7,6 @@ import ( "sync" "flamingo.me/flamingo/v3/framework/web" - "go.opencensus.io/trace" ) type ( @@ -31,7 +30,7 @@ func TryDo(ctx context.Context, r *web.Request, task func(ctx context.Context, r wg.Add(1) go func() { - ctx, span := trace.StartSpan(ctx, "requestTask") + ctx, span := otel.Tracer("flamingo.me/opentelemetry").Start(ctx, "requestTask") task(ctx, r) span.End() wg.Done() diff --git a/core/zap/logger.go b/core/zap/logger.go index 709996b75..45177fe09 100644 --- a/core/zap/logger.go +++ b/core/zap/logger.go @@ -4,27 +4,29 @@ import ( "context" "fmt" - "go.opencensus.io/stats" - "go.opencensus.io/stats/view" - "go.opencensus.io/tag" - "go.opencensus.io/trace" - "go.uber.org/zap" - "go.uber.org/zap/zapcore" + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/attribute" "flamingo.me/flamingo/v3/framework/flamingo" - "flamingo.me/flamingo/v3/framework/opencensus" "flamingo.me/flamingo/v3/framework/web" + "go.opentelemetry.io/otel/metric" + "go.opentelemetry.io/otel/trace" + "go.uber.org/zap" + "go.uber.org/zap/zapcore" ) type Option func(*Logger) var ( - logCount = stats.Int64("flamingo/zap/logs", "Count of logs", stats.UnitDimensionless) - keyLevel, _ = tag.NewKey("level") + logCount metric.Int64Counter + keyLevel attribute.Key = "level" ) func init() { - if err := opencensus.View("flamingo/zap/logs", logCount, view.Count(), keyLevel); err != nil { + var err error + logCount, err = otel.Meter("flamingo.me/opentelemetry").Int64Counter("flamingo/zap/logs", + metric.WithDescription("Count of logs")) + if err != nil { panic(err) } } @@ -61,10 +63,10 @@ func NewLogger(logger *zap.Logger, options ...Option) *Logger { // referer: referer from request // request: received payload from request func (l *Logger) WithContext(ctx context.Context) flamingo.Logger { - span := trace.FromContext(ctx) + span := trace.SpanFromContext(ctx) fields := map[flamingo.LogKey]interface{}{ - flamingo.LogKeyTraceID: span.SpanContext().TraceID.String(), - flamingo.LogKeySpanID: span.SpanContext().SpanID.String(), + flamingo.LogKeyTraceID: span.SpanContext().TraceID().String(), + flamingo.LogKeySpanID: span.SpanContext().SpanID().String(), } req := web.RequestFromContext(ctx) @@ -90,8 +92,7 @@ func (l *Logger) record(level string) { return } - ctx, _ := tag.New(context.Background(), tag.Upsert(opencensus.KeyArea, l.configArea), tag.Upsert(keyLevel, level)) - stats.Record(ctx, logCount.M(1)) + logCount.Add(context.Background(), 1, metric.WithAttributes(attribute.String(web.AreaKey.Key(), l.configArea), keyLevel.String(level))) } // Debug logs a message at debug level diff --git a/framework/prefixrouter/front_router.go b/framework/prefixrouter/front_router.go index ed60b4c96..bb2879955 100644 --- a/framework/prefixrouter/front_router.go +++ b/framework/prefixrouter/front_router.go @@ -7,26 +7,19 @@ import ( "strings" "time" - "go.opencensus.io/stats" - "go.opencensus.io/stats/view" - "go.opencensus.io/tag" - "go.opencensus.io/trace" - - "flamingo.me/flamingo/v3/framework/opencensus" + "flamingo.me/flamingo/v3/framework/web" + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/baggage" + "go.opentelemetry.io/otel/metric" ) -var rt = stats.Int64("flamingo/prefixrouter/requesttimes", "prefixrouter request times", stats.UnitMilliseconds) +var rtHistogram metric.Int64Histogram func init() { - if err := view.Register( - &view.View{ - Name: "flamingo/prefixrouter/requests", - Description: "request times", - Aggregation: view.Distribution(10, 100, 500, 1000, 2500, 5000, 10000), - Measure: rt, - TagKeys: []tag.Key{opencensus.KeyArea}, - }, - ); err != nil { + var err error + rtHistogram, err = otel.Meter("flamingo.me/opentelemetry").Int64Histogram("flamingo/prefixrouter/requesttimes", + metric.WithDescription("prefixrouter request times"), metric.WithUnit("ms")) + if err != nil { panic(err) } } @@ -94,15 +87,21 @@ func (fr *FrontRouter) SetPrimaryHandlers(handlers []OptionalHandler) { // ServeHTTP gets Router for Request and lets it handle it func (fr *FrontRouter) ServeHTTP(w http.ResponseWriter, req *http.Request) { - r, _ := tag.New(req.Context(), tag.Insert(opencensus.KeyArea, "-")) - req = req.WithContext(r) + areaBaggage, _ := baggage.NewMember(web.AreaKey.Key(), "-") + bagg := baggage.FromContext(req.Context()) + afterDeletionBagg := bagg.DeleteMember(areaBaggage.Key()) + if afterDeletionBagg.Len() == bagg.Len() { + bagg, _ = bagg.SetMember(areaBaggage) + } + c := baggage.ContextWithBaggage(req.Context(), bagg) + req = req.WithContext(c) start := time.Now() defer func() { - stats.Record(req.Context(), rt.M(time.Since(start).Nanoseconds()/1000000)) + rtHistogram.Record(req.Context(), time.Since(start).Nanoseconds()/1000000) }() - ctx, span := trace.StartSpan(req.Context(), "prefixrouter/ServeHTTP") + ctx, span := otel.Tracer("flamingo.me/opentelemetry").Start(req.Context(), "prefixrouter/ServeHTTP") req = req.WithContext(ctx) defer span.End() @@ -132,8 +131,11 @@ func (fr *FrontRouter) ServeHTTP(w http.ResponseWriter, req *http.Request) { prefix := longest(matchedPrefixes) router := fr.router[prefix] - r, _ := tag.New(req.Context(), tag.Upsert(opencensus.KeyArea, router.area)) - req = req.WithContext(r) + bagg := baggage.FromContext(req.Context()) + areaBaggage, _ := baggage.NewMember(web.AreaKey.Key(), router.area) + bagg, _ = bagg.SetMember(areaBaggage) + c := baggage.ContextWithBaggage(req.Context(), bagg) + req = req.WithContext(c) var err error req.URL, err = url.Parse(path[len(prefix)-len(host):]) @@ -159,8 +161,12 @@ func (fr *FrontRouter) ServeHTTP(w http.ResponseWriter, req *http.Request) { if len(matchedPrefixes) > 0 { prefix := longest(matchedPrefixes) router := fr.router[prefix] - r, _ := tag.New(req.Context(), tag.Upsert(opencensus.KeyArea, router.area)) - req = req.WithContext(r) + + bagg := baggage.FromContext(req.Context()) + areaBaggage, _ := baggage.NewMember(web.AreaKey.Key(), router.area) + bagg, _ = bagg.SetMember(areaBaggage) + c := baggage.ContextWithBaggage(req.Context(), bagg) + req = req.WithContext(c) var err error req.URL, err = url.Parse(path[len(prefix):]) diff --git a/framework/prefixrouter/module.go b/framework/prefixrouter/module.go index 51b8ae214..28608a0fa 100644 --- a/framework/prefixrouter/module.go +++ b/framework/prefixrouter/module.go @@ -10,13 +10,14 @@ import ( "strings" "time" + "flamingo.me/opentelemetry" + "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" + "flamingo.me/dingo" "flamingo.me/flamingo/v3/framework/config" "flamingo.me/flamingo/v3/framework/flamingo" - "flamingo.me/flamingo/v3/framework/opencensus" "flamingo.me/flamingo/v3/framework/web" "github.com/spf13/cobra" - "go.opencensus.io/plugin/ochttp" ) // Module for core/prefix_router @@ -34,7 +35,7 @@ func (m *Module) Inject( logger flamingo.Logger, config *struct { EnableRootRedirectHandler bool `inject:"config:flamingo.prefixrouter.rootRedirectHandler.enabled,optional"` - PublicEndpoint bool `inject:"config:flamingo.opencensus.publicEndpoint,optional"` + PublicEndpoint bool `inject:"config:flamingo.opentelemetry.publicEndpoint,optional"` }, ) { m.eventRouter = eventRouter @@ -76,7 +77,7 @@ type serveCmdConfig struct { FallbackHandlers []OptionalHandler `inject:"fallback,optional"` // Optional Register a FallbackHandlers which is passed to the FrontendRouter } -func (m *Module) serveCmd(area *config.Area, defaultmux *http.ServeMux, configuredURLPrefixSampler *opencensus.ConfiguredURLPrefixSampler, config *serveCmdConfig) *cobra.Command { +func (m *Module) serveCmd(area *config.Area, defaultmux *http.ServeMux, configuredURLPrefixSampler *opentelemetry.ConfiguredURLPrefixSampler, config *serveCmdConfig) *cobra.Command { var addr string cmd := &cobra.Command{ @@ -96,7 +97,7 @@ func (m *Module) serve( root *config.Area, defaultRouter *http.ServeMux, addr *string, - configuredURLPrefixSampler *opencensus.ConfiguredURLPrefixSampler, + configuredURLPrefixSampler *opentelemetry.ConfiguredURLPrefixSampler, primaryHandlers []OptionalHandler, fallbackHandlers []OptionalHandler, ) func(cmd *cobra.Command, args []string) { @@ -161,13 +162,17 @@ func (m *Module) serve( } } + options := []otelhttp.Option{ + otelhttp.WithFilter(opentelemetry.URLPrefixSampler(whitelist, blacklist, + configuredURLPrefixSampler.AllowParentTrace)), + } + if m.publicEndpoint { + options = append(options, otelhttp.WithPublicEndpoint()) + } + m.server = &http.Server{ - Addr: *addr, - Handler: &ochttp.Handler{ - IsPublicEndpoint: m.publicEndpoint, - Handler: frontRouter, - GetStartOptions: opencensus.URLPrefixSampler(whitelist, blacklist, configuredURLPrefixSampler.AllowParentTrace), - }, + Addr: *addr, + Handler: otelhttp.NewHandler(frontRouter, "server", options...), } e := m.listenAndServe() diff --git a/framework/web/context.go b/framework/web/context.go index 48917b664..3e97a062b 100644 --- a/framework/web/context.go +++ b/framework/web/context.go @@ -3,12 +3,12 @@ package web import ( "context" - "go.opencensus.io/trace" + "go.opentelemetry.io/otel/trace" ) // RunWithDetachedContext returns a context which is detached from the original deadlines, timeouts & co func RunWithDetachedContext(origCtx context.Context, fnc func(ctx context.Context)) { - origCtx, span := trace.StartSpan(origCtx, "flamingo/detachedContext") + origCtx, span := otel.Tracer("flamingo.me/opentelemetry").Start(origCtx, "flamingo/detachedContext") defer span.End() request := RequestFromContext(origCtx) @@ -17,7 +17,7 @@ func RunWithDetachedContext(origCtx context.Context, fnc func(ctx context.Contex session = request.Session() } - ctx := ContextWithRequest(trace.NewContext(context.Background(), span), request) + ctx := ContextWithRequest(trace.ContextWithSpan(context.Background(), span), request) ctx = ContextWithSession(ctx, session) fnc(ctx) diff --git a/framework/web/filter/request_metrics_filter.go b/framework/web/filter/request_metrics_filter.go index 9f2182fc4..139c703bc 100644 --- a/framework/web/filter/request_metrics_filter.go +++ b/framework/web/filter/request_metrics_filter.go @@ -5,11 +5,11 @@ import ( "net/http" "strconv" - "flamingo.me/flamingo/v3/framework/opencensus" + "go.opentelemetry.io/otel/attribute" + + "go.opentelemetry.io/otel/metric" + "flamingo.me/flamingo/v3/framework/web" - "go.opencensus.io/stats" - "go.opencensus.io/stats/view" - "go.opencensus.io/tag" ) type ( @@ -28,18 +28,24 @@ type ( ) var ( - // responseMeasure counts different HTTP responses - responseMeasure = stats.Int64("flamingo/response/bytes", "Count of http responses by status code", stats.UnitBytes) - + // responseBytesCount counts the total number of bytes served by the application + responseBytesCount metric.Int64Counter + // responseCount count the number of responses served by the application + responsesCount metric.Int64Counter // keyHTTPStatus defines response http status code - keyHTTPStatus, _ = tag.NewKey("status_code") + keyHTTPStatus attribute.Key = "status_code" ) func init() { - if err := opencensus.View("flamingo/response/bytes_count", responseMeasure, view.Count(), keyHTTPStatus); err != nil { + var err error + responseBytesCount, err = otel.Meter("flamingo.me/opentelemetry").Int64Counter("flamingo/response/bytes_count", + metric.WithDescription("Count of responses number of bytes"), metric.WithUnit("By")) + if err != nil { panic(err) } - if err := opencensus.View("flamingo/response/bytes_sum", responseMeasure, view.Sum(), keyHTTPStatus); err != nil { + responsesCount, err = otel.Meter("flamingo.me/opentelemetry").Int64Counter("flamingo/response/count", + metric.WithDescription("Count of number of responses")) + if err != nil { panic(err) } } @@ -73,8 +79,9 @@ func (r responseMetrics) Apply(ctx context.Context, rw http.ResponseWriter) erro err = r.result.Apply(ctx, responseWriter) } - c, _ := tag.New(ctx, tag.Upsert(keyHTTPStatus, strconv.Itoa(responseWriter.status/100)+"xx")) - stats.Record(c, responseMeasure.M(responseWriter.bytes)) + statusAttribute := keyHTTPStatus.String(strconv.Itoa(responseWriter.status/100) + "xx") + responseBytesCount.Add(ctx, responseWriter.bytes, metric.WithAttributes(statusAttribute)) + responsesCount.Add(ctx, 1, metric.WithAttributes(statusAttribute)) return err } diff --git a/framework/web/handler.go b/framework/web/handler.go index 99cdf48b8..ea423c3b2 100644 --- a/framework/web/handler.go +++ b/framework/web/handler.go @@ -10,14 +10,13 @@ import ( "strings" "time" - "github.com/gorilla/securecookie" - "go.opencensus.io/stats" - "go.opencensus.io/stats/view" - "go.opencensus.io/tag" - "go.opencensus.io/trace" + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/baggage" + "go.opentelemetry.io/otel/codes" + "go.opentelemetry.io/otel/metric" "flamingo.me/flamingo/v3/framework/flamingo" - "flamingo.me/flamingo/v3/framework/opencensus" + "github.com/gorilla/securecookie" ) type ( @@ -41,16 +40,20 @@ type ( ) var ( - rt = stats.Int64("flamingo/router/controller", "controller request times", stats.UnitMilliseconds) // ControllerKey exposes the current controller/handler key - ControllerKey, _ = tag.NewKey("controller") + ControllerKey, _ = baggage.NewKeyProperty("controller") + AreaKey, _ = baggage.NewKeyProperty("area") // RouterError defines error value for issues appearing during routing process RouterError contextKeyType = "error" + rtHistogram metric.Int64Histogram ) func init() { - if err := opencensus.View("flamingo/router/controller", rt, view.Distribution(100, 500, 1000, 2500, 5000, 10000), ControllerKey); err != nil { + var err error + rtHistogram, err = otel.Meter("flamingo.me/opentelemetry").Int64Histogram("flamingo/router/controller", + metric.WithDescription("controller request times"), metric.WithUnit("ms")) + if err != nil { panic(err) } } @@ -103,8 +106,7 @@ func panicToError(p interface{}) error { func (h *handler) ServeHTTP(rw http.ResponseWriter, httpRequest *http.Request) { httpRequest.URL.Path = strings.TrimPrefix(httpRequest.URL.Path, h.prefix) - - ctx, span := trace.StartSpan(httpRequest.Context(), "router/ServeHTTP") + ctx, span := otel.Tracer("flamingo.me/opentelemetry").Start(httpRequest.Context(), "router/ServeHTTP") defer span.End() session, err := h.sessionStore.LoadByRequest(ctx, httpRequest) @@ -116,15 +118,23 @@ func (h *handler) ServeHTTP(rw http.ResponseWriter, httpRequest *http.Request) { } } - _, span = trace.StartSpan(ctx, "router/matchRequest") + _, span = otel.Tracer("flamingo.me/opentelemetry").Start(ctx, "router/matchRequest") controller, params, handler := h.routerRegistry.matchRequest(httpRequest) if handler != nil { - ctx, _ = tag.New(ctx, tag.Upsert(ControllerKey, handler.GetHandlerName()), tag.Insert(opencensus.KeyArea, "-")) + bagg := baggage.FromContext(ctx) + ctrBaggage, _ := baggage.NewMember(ControllerKey.Key(), handler.GetHandlerName()) + areaBaggage, _ := baggage.NewMember(AreaKey.Key(), "-") + bagg, _ = bagg.SetMember(ctrBaggage) + afterDeletionBagg := bagg.DeleteMember(areaBaggage.Key()) + if afterDeletionBagg.Len() == bagg.Len() { + bagg, _ = bagg.SetMember(areaBaggage) + } + ctx = baggage.ContextWithBaggage(ctx, bagg) httpRequest = httpRequest.WithContext(ctx) start := time.Now() defer func() { - stats.Record(ctx, rt.M(time.Since(start).Nanoseconds()/1000000)) + rtHistogram.Record(ctx, time.Since(start).Nanoseconds()/1000000) }() } @@ -146,19 +156,19 @@ func (h *handler) ServeHTTP(rw http.ResponseWriter, httpRequest *http.Request) { span.End() // router/matchRequest - ctx, span = trace.StartSpan(ctx, "router/request") + ctx, span = otel.Tracer("flamingo.me/opentelemetry").Start(ctx, "router/request") defer span.End() chain := &FilterChain{ filters: h.filter, final: func(ctx context.Context, r *Request, rw http.ResponseWriter) (response Result) { - ctx, span := trace.StartSpan(ctx, "router/controller") + ctx, span := otel.Tracer("flamingo.me/opentelemetry").Start(ctx, "router/controller") defer span.End() defer func() { if err := panicToError(recover()); err != nil { response = h.routerRegistry.handler[FlamingoError].any(context.WithValue(ctx, RouterError, err), r) - span.SetStatus(trace.Status{Code: trace.StatusCodeAborted, Message: "controller panic"}) + span.SetStatus(codes.Error, "controller panic") } }() @@ -171,7 +181,7 @@ func (h *handler) ServeHTTP(rw http.ResponseWriter, httpRequest *http.Request) { } else { err := fmt.Errorf("action for method %q not found and no \"any\" fallback", req.Request().Method) response = h.routerRegistry.handler[FlamingoNotfound].any(context.WithValue(ctx, RouterError, err), r) - span.SetStatus(trace.Status{Code: trace.StatusCodeNotFound, Message: "action not found"}) + span.SetStatus(codes.Error, "action not found") } return h.responder.completeResult(response) @@ -188,7 +198,7 @@ func (h *handler) ServeHTTP(rw http.ResponseWriter, httpRequest *http.Request) { var finalErr error if result != nil { - ctx, span := trace.StartSpan(ctx, "router/responseApply") + ctx, span := otel.Tracer("flamingo.me/opentelemetry").Start(ctx, "router/responseApply") func() { //catch panic in Apply only diff --git a/framework/web/router.go b/framework/web/router.go index c069eb754..dd0777752 100644 --- a/framework/web/router.go +++ b/framework/web/router.go @@ -12,7 +12,6 @@ import ( "flamingo.me/flamingo/v3/framework/config" "flamingo.me/flamingo/v3/framework/flamingo" - "go.opencensus.io/trace" ) type ( @@ -267,8 +266,8 @@ func dataParams(params map[interface{}]interface{}) RequestParams { // Data calls a flamingo data controller func (r *Router) Data(ctx context.Context, handler string, params map[interface{}]interface{}) interface{} { - ctx, span := trace.StartSpan(ctx, "flamingo/router/data") - span.Annotate(nil, handler) + ctx, span := otel.Tracer("flamingo.me/opentelemetry").Start(ctx, "flamingo/router/data") + span.AddEvent(handler) defer span.End() req := RequestFromContext(ctx) diff --git a/framework/web/sessionstore.go b/framework/web/sessionstore.go index 96a67e389..f30264511 100644 --- a/framework/web/sessionstore.go +++ b/framework/web/sessionstore.go @@ -6,11 +6,13 @@ import ( "io" "net/http" + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/attribute" + "flamingo.me/flamingo/v3/framework/flamingo" "github.com/gorilla/securecookie" "github.com/gorilla/sessions" "github.com/zemirco/memorystore" - "go.opencensus.io/trace" ) // SessionStore handles flamingo's session loading and storing. @@ -50,13 +52,11 @@ func (s *SessionStore) LoadByRequest(ctx context.Context, req *http.Request) (*S return EmptySession(), nil } - var span *trace.Span - - _, span = trace.StartSpan(ctx, "flamingo/web/session/load") + _, span := otel.Tracer("flamingo.me/opentelemetry").Start(ctx, "flamingo/web/session/load") defer span.End() gs, err := s.sessionStore.New(req, s.sessionName) - span.AddAttributes(trace.StringAttribute(string(flamingo.LogKeySession), hashID(gs.ID))) + span.SetAttributes(attribute.String(string(flamingo.LogKeySession), hashID(gs.ID))) return &Session{s: gs, sessionSaveMode: s.sessionSaveMode}, err } @@ -136,7 +136,7 @@ func (s *SessionStore) Save(ctx context.Context, session *Session) (http.Header, session.dirty = nil } - _, span := trace.StartSpan(ctx, "flamingo/web/session/save") + _, span := otel.Tracer("flamingo.me/opentelemetry").Start(ctx, "flamingo/web/session/save") defer span.End() rw := headerResponseWriter(make(http.Header)) if err := s.sessionStore.Save(s.requestFromID(session.s.ID), rw, gs); err != nil { diff --git a/go.mod b/go.mod index 11cd22770..7371ce61b 100644 --- a/go.mod +++ b/go.mod @@ -8,11 +8,13 @@ require ( contrib.go.opencensus.io/exporter/zipkin v0.1.2 cuelang.org/go v0.0.15 flamingo.me/dingo v0.2.10 + flamingo.me/opentelemetry v0.1.0 github.com/coreos/go-oidc/v3 v3.6.0 github.com/ghodss/yaml v1.0.0 github.com/gofrs/uuid v4.3.1+incompatible github.com/golang-jwt/jwt/v4 v4.5.0 - github.com/google/go-cmp v0.5.9 + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da + github.com/google/go-cmp v0.6.0 github.com/gorilla/securecookie v1.1.1 github.com/gorilla/sessions v1.2.1 github.com/hashicorp/golang-lru/v2 v2.0.6 @@ -27,6 +29,10 @@ require ( github.com/stretchr/testify v1.8.4 github.com/zemirco/memorystore v0.0.0-20160308183530-ecd57e5134f6 go.opencensus.io v0.24.0 + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 + go.opentelemetry.io/otel v1.21.0 + go.opentelemetry.io/otel/metric v1.21.0 + go.opentelemetry.io/otel/trace v1.21.0 go.uber.org/automaxprocs v1.5.3 go.uber.org/zap v1.25.0 golang.org/x/oauth2 v0.11.0 @@ -35,40 +41,58 @@ require ( require ( github.com/beorn7/perks v1.0.1 // indirect + github.com/cenkalti/backoff/v4 v4.2.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cockroachdb/apd v1.1.0 // indirect - github.com/cockroachdb/apd/v2 v2.0.1 // indirect + github.com/cockroachdb/apd/v2 v2.0.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect github.com/go-jose/go-jose/v3 v3.0.0 // indirect github.com/go-kit/log v0.2.1 // indirect github.com/go-logfmt/logfmt v0.5.1 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/go-logr/logr v1.3.0 // indirect + github.com/go-logr/stdr v1.2.2 // indirect github.com/golang/protobuf v1.5.3 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect github.com/hashicorp/logutils v1.0.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/kardianos/osext v0.0.0-20170510131534-ae77be60afb1 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mpvl/unique v0.0.0-20150818121801-cbe035fff7de // indirect github.com/pelletier/go-toml v1.9.4 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.13.0 // indirect - github.com/prometheus/client_model v0.2.0 // indirect - github.com/prometheus/common v0.37.0 // indirect - github.com/prometheus/procfs v0.8.0 // indirect + github.com/prometheus/client_golang v1.17.0 // indirect + github.com/prometheus/client_model v0.5.0 // indirect + github.com/prometheus/common v0.44.0 // indirect + github.com/prometheus/procfs v0.12.0 // indirect github.com/prometheus/statsd_exporter v0.22.7 // indirect github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24 // indirect github.com/stretchr/objx v0.5.0 // indirect github.com/uber/jaeger-client-go v2.25.0+incompatible // indirect + go.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 // indirect + go.opentelemetry.io/otel/bridge/opencensus v0.42.0 // indirect + go.opentelemetry.io/otel/exporters/jaeger v1.17.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.20.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.20.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.20.0 // indirect + go.opentelemetry.io/otel/exporters/prometheus v0.42.0 // indirect + go.opentelemetry.io/otel/exporters/zipkin v1.19.0 // indirect + go.opentelemetry.io/otel/sdk v1.20.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.19.0 // indirect + go.opentelemetry.io/proto/otlp v1.0.0 // indirect go.uber.org/multierr v1.10.0 // indirect - golang.org/x/crypto v0.12.0 // indirect - golang.org/x/net v0.14.0 // indirect - golang.org/x/sys v0.11.0 // indirect - golang.org/x/text v0.12.0 // indirect - golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f // indirect + golang.org/x/crypto v0.14.0 // indirect + golang.org/x/net v0.17.0 // indirect + golang.org/x/sys v0.14.0 // indirect + golang.org/x/text v0.13.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect google.golang.org/api v0.84.0 // indirect google.golang.org/appengine v1.6.7 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect + google.golang.org/grpc v1.59.0 // indirect google.golang.org/protobuf v1.31.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index 84a997c18..f80eddb79 100644 --- a/go.sum +++ b/go.sum @@ -60,6 +60,8 @@ cuelang.org/go v0.0.15/go.mod h1:gehQASsTv+lFZknWIG0hANGVSBiHD7HyKWmAdEZL3No= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= flamingo.me/dingo v0.2.10 h1:FAOsDtKHA+0KmAIdJYzsFNMMOCOMdVX4uAL8JPo6Z8M= flamingo.me/dingo v0.2.10/go.mod h1:5motgtzS2t26y20nndTLH7tslkBMg4GivTTn+ICQkl8= +flamingo.me/opentelemetry v0.1.0 h1:1pUhrkKAqDiQ+FjjrZPw2xHxu2tY1EbkIC2k7y9PFu4= +flamingo.me/opentelemetry v0.1.0/go.mod h1:c+TtE5ysocPGFXHRGUzqJjOkIbGJdLK+A1l+ZiUQoYs= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= @@ -79,6 +81,8 @@ 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/bsm/ginkgo/v2 v2.7.0 h1:ItPMPH90RbmZJt5GtkcNvIRuGEdwlBItdNVoyzaNQao= github.com/bsm/gomega v1.26.0 h1:LhQm+AFcgV2M0WyKroMASzAzCAJVpAxQXv4SaI9a69Y= +github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= +github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -100,8 +104,9 @@ github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= -github.com/cockroachdb/apd/v2 v2.0.1 h1:y1Rh3tEU89D+7Tgbw+lp52T6p/GJLpDmNvr10UWqLTE= github.com/cockroachdb/apd/v2 v2.0.1/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw= +github.com/cockroachdb/apd/v2 v2.0.2 h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E= +github.com/cockroachdb/apd/v2 v2.0.2/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw= github.com/coreos/go-oidc/v3 v3.6.0 h1:AKVxfYw1Gmkn/w96z0DbT/B/xFnzTd3MkZvWLjF4n/o= github.com/coreos/go-oidc/v3 v3.6.0/go.mod h1:ZpHUsHBucTUj6WOkrP4E20UPynbLZzhTQ1XKCXkxyPc= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= @@ -125,6 +130,8 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.m github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= @@ -144,6 +151,11 @@ github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= +github.com/go-logr/logr v1.3.0/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/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/gofrs/uuid v4.3.1+incompatible h1:0/KbAdpx3UXAx1kEOWHJeOkpbgRFGHVgv+CFIY7dBJI= github.com/gofrs/uuid v4.3.1+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= @@ -153,6 +165,7 @@ github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7a github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -204,8 +217,8 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +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/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= @@ -242,10 +255,10 @@ github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+ github.com/gorilla/sessions v1.2.1 h1:DHd3rPN5lE3Ts3D8rKkQ8x/0kqfeNmBAaiSi+o7FsgI= github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru/v2 v2.0.5 h1:wW7h1TG88eUIJ2i69gaE3uNVtEPIagzhGvHgwfx2Vm4= -github.com/hashicorp/golang-lru/v2 v2.0.5/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hashicorp/golang-lru/v2 v2.0.6 h1:3xi/Cafd1NaoEnS/yDssIiuVeDVywU0QdFGl3aQaQHM= github.com/hashicorp/golang-lru/v2 v2.0.6/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hashicorp/logutils v1.0.0 h1:dLEQVugN8vlakKOUE3ihGLTZJRB4j+M2cdTm/ORI65Y= @@ -271,19 +284,20 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/leekchan/accounting v0.3.1 h1:6cIBKG9QngR6tuVV+mWjzcxsJDnoegrc70Ntb3MFqYM= github.com/leekchan/accounting v0.3.1/go.mod h1:3timm6YPhY3YDaGxl0q3eaflX0eoSx3FXn7ckHe4tO0= -github.com/lib/pq v1.0.0 h1:X5PMW56eZitiTeO7tKzZxFCSpbFZJtkMMooicw2us9A= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= -github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +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/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= @@ -321,27 +335,31 @@ github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_golang v1.13.0 h1:b71QUfeo5M8gq2+evJdTPfZhYMAU0uKPkyPJ7TPsloU= github.com/prometheus/client_golang v1.13.0/go.mod h1:vTeo+zgvILHsnnj/39Ou/1fPN5nJFOEMgftOUOmlvYQ= +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-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/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.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.35.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= -github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= +github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= +github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= +github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= +github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= github.com/prometheus/statsd_exporter v0.22.7 h1:7Pji/i2GuhK6Lu7DHrtTkFmNBCudCPT1pX2CziuyQR0= github.com/prometheus/statsd_exporter v0.22.7/go.mod h1:N/TevpjkIh9ccs6nuzY3jQn9dFqnUakOjnEuMPJJJnI= github.com/rbcervilla/redisstore/v9 v9.0.0 h1:wOPbBaydbdxzi1gTafDftCI/Z7vnsXw0QDPCuhiMG0g= @@ -351,6 +369,7 @@ github.com/redis/go-redis/v9 v9.0.5 h1:CuQcn5HIEeK7BgElubPP8CGtE0KakrnbBSTLjathl github.com/redis/go-redis/v9 v9.0.5/go.mod h1:WqMKv5vnQbRuZstUwxQI195wHy+t4PuXDOjzMvcuQHk= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/testscript v1.1.0/go.mod h1:lzMlnW8LS56mcdJoQYkrlzqOoTFCOemzt5LusJ93bDM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24 h1:pntxY8Ary0t43dCZ5dqY4YTJCObLY1kIXl0uzMv+7DE= @@ -402,10 +421,40 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= 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/net/http/otelhttp v0.46.1 h1:aFJWCqJMNjENlcleuuOkGAPH82y0yULBScfXcIEdS24= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1/go.mod h1:sEGXWArGqc3tVa+ekntsN65DmVbVeW+7lTKTjZF3/Fo= +go.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 h1:2JydY5UiDpqvj2p7sO9bgHuhTy4hgTZ0ymehdq/Ob0Q= +go.opentelemetry.io/contrib/instrumentation/runtime v0.45.0/go.mod h1:ch3a5QxOqVWxas4CzjCFFOOQe+7HgAXC/N1oVxS9DK4= +go.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc= +go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo= +go.opentelemetry.io/otel/bridge/opencensus v0.42.0 h1:QvC+bcZkWMphWPiVqRQygMj6M0/3TOuJEO+erRA7kI8= +go.opentelemetry.io/otel/bridge/opencensus v0.42.0/go.mod h1:XJojP7g5DqYdiyArix/H9i1XzPPlIUc9dGLKtF9copI= +go.opentelemetry.io/otel/exporters/jaeger v1.17.0 h1:D7UpUy2Xc2wsi1Ras6V40q806WM07rqoCWzXu7Sqy+4= +go.opentelemetry.io/otel/exporters/jaeger v1.17.0/go.mod h1:nPCqOnEH9rNLKqH/+rrUjiMzHJdV1BlpKcTwRTyKkKI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.20.0 h1:DeFD0VgTZ+Cj6hxravYYZE2W4GlneVH81iAOPjZkzk8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.20.0/go.mod h1:GijYcYmNpX1KazD5JmWGsi4P7dDTTTnfv1UbGn84MnU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.20.0 h1:gvmNvqrPYovvyRmCSygkUDyL8lC5Tl845MLEwqpxhEU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.20.0/go.mod h1:vNUq47TGFioo+ffTSnKNdob241vePmtNZnAODKapKd0= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.20.0 h1:CsBiKCiQPdSjS+MlRiqeTI9JDDpSuk0Hb6QTRfwer8k= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.20.0/go.mod h1:CMJYNAfooOwSZSAmAeMUV1M+TXld3BiK++z9fqIm2xk= +go.opentelemetry.io/otel/exporters/prometheus v0.42.0 h1:jwV9iQdvp38fxXi8ZC+lNpxjK16MRcZlpDYvbuO1FiA= +go.opentelemetry.io/otel/exporters/prometheus v0.42.0/go.mod h1:f3bYiqNqhoPxkvI2LrXqQVC546K7BuRDL/kKuxkujhA= +go.opentelemetry.io/otel/exporters/zipkin v1.19.0 h1:EGY0h5mGliP9o/nIkVuLI0vRiQqmsYOcbwCuotksO1o= +go.opentelemetry.io/otel/exporters/zipkin v1.19.0/go.mod h1:JQgTGJP11yi3o4GHzIWYodhPisxANdqxF1eHwDSnJrI= +go.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4= +go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM= +go.opentelemetry.io/otel/sdk v1.20.0 h1:5Jf6imeFZlZtKv9Qbo6qt2ZkmWtdWx/wzcCbNUlAWGM= +go.opentelemetry.io/otel/sdk v1.20.0/go.mod h1:rmkSx1cZCm/tn16iWDn1GQbLtsW/LvsdEEFzCSRM6V0= +go.opentelemetry.io/otel/sdk/metric v1.19.0 h1:EJoTO5qysMsYCa+w4UghwFV/ptQgqSL/8Ni+hx+8i1k= +go.opentelemetry.io/otel/sdk/metric v1.19.0/go.mod h1:XjG0jQyFJrv2PbMvwND7LwCEhsJzCzV5210euduKcKY= +go.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc= +go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= +go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= go.uber.org/automaxprocs v1.5.3 h1:kWazyxZUrS3Gs4qUpbwo5kEIMGe/DAvi5Z4tl2NW4j8= go.uber.org/automaxprocs v1.5.3/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0= -go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ= go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.25.0 h1:4Hvk6GtkucQ790dqmj7l1eEnRdKm3k3ZUrUMS2d5+5c= @@ -417,8 +466,8 @@ golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= -golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -499,8 +548,8 @@ golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= -golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -605,8 +654,8 @@ golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= +golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -618,8 +667,8 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= -golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -680,8 +729,9 @@ golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f h1:uF6paiQQebLeSXkrTqHqz0MXhXXS1KgF41eUdBNvxK0= golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -803,6 +853,11 @@ google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d h1:VBu5YqKPv6XiJ199exd8Br+Aetz+o08F+PLMnwJQHAY= +google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d h1:DoPTO70H+bcDXcd39vOqb2viZxgqeBeSGtZ55yZU4/Q= +google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= @@ -834,7 +889,8 @@ google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ5 google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.57.0 h1:kfzNeI/klCGD2YPMUlaGNT3pxvYfga7smW3Vth8Zsiw= +google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= +google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= 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= @@ -856,8 +912,8 @@ google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqw gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=