From b14b59b0c4ff880827f102c08c43b1de2989367f Mon Sep 17 00:00:00 2001 From: Michael Hegel Date: Wed, 30 Nov 2022 21:58:55 +0100 Subject: [PATCH 001/134] feat: added ignoring of certain requests --- net/http/roundtripware/circuitbreaker.go | 41 +++++---- net/http/roundtripware/circuitbreaker_test.go | 92 ++++++++++++++++--- 2 files changed, 99 insertions(+), 34 deletions(-) diff --git a/net/http/roundtripware/circuitbreaker.go b/net/http/roundtripware/circuitbreaker.go index 6066fe1..82ae6d1 100644 --- a/net/http/roundtripware/circuitbreaker.go +++ b/net/http/roundtripware/circuitbreaker.go @@ -51,7 +51,7 @@ type CircuitBreakerSettings struct { type CircuitBreakerOptions struct { Counter syncint64.Counter - IsSuccessful func(err error, req *http.Request, resp *http.Response) error + IsSuccessful func(err error, req *http.Request, resp *http.Response) (e error, ignore bool) CopyReqBody bool CopyRespBody bool } @@ -60,8 +60,8 @@ func NewDefaultCircuitBreakerOptions() *CircuitBreakerOptions { return &CircuitBreakerOptions{ Counter: nil, - IsSuccessful: func(err error, req *http.Request, resp *http.Response) error { - return err + IsSuccessful: func(err error, req *http.Request, resp *http.Response) (e error, ignore bool) { + return err, false }, CopyReqBody: false, CopyRespBody: false, @@ -91,7 +91,7 @@ func CircuitBreakerWithMetric( } func CircuitBreakerWithIsSuccessful( - isSuccessful func(err error, req *http.Request, resp *http.Response) error, + isSuccessful func(err error, req *http.Request, resp *http.Response) (e error, ignore bool), copyReqBody bool, copyRespBody bool, ) CircuitBreakerOption { @@ -122,7 +122,7 @@ func CircuitBreaker(set *CircuitBreakerSettings, opts ...CircuitBreakerOption) R ReadyToTrip: set.ReadyToTrip, OnStateChange: set.OnStateChange, } - circuitBreaker := gobreaker.NewCircuitBreaker(cbrSettings) + circuitBreaker := gobreaker.NewTwoStepCircuitBreaker(cbrSettings) return func(l *zap.Logger, next Handler) Handler { return func(r *http.Request) (*http.Response, error) { @@ -139,9 +139,15 @@ func CircuitBreaker(set *CircuitBreakerSettings, opts ...CircuitBreakerOption) R defer reqCopy.Body.Close() } - // call the next handler enclosed in the circuit breaker. - resp, err := circuitBreaker.Execute(func() (interface{}, error) { - resp, err := next(r) + // check whether the circuit breaker is closed (an error is returned if not) + done, err := circuitBreaker.Allow() + + var resp *http.Response + // wrap the error in case it was produced because of the circuit breaker being (half-)open + if errors.Is(gobreaker.ErrTooManyRequests, err) || errors.Is(gobreaker.ErrOpenState, err) { + err = keelerrors.NewWrappedError(ErrCircuitBreaker, err) + } else if err == nil { + resp, err = next(r) // clone the response and the body if wanted respCopy, errCopy := copyResponse(resp, o.CopyRespBody) @@ -153,8 +159,12 @@ func CircuitBreaker(set *CircuitBreakerSettings, opts ...CircuitBreakerOption) R defer respCopy.Body.Close() } - return resp, o.IsSuccessful(err, reqCopy, respCopy) - }) + var ignore bool + err, ignore = o.IsSuccessful(err, reqCopy, respCopy) + if !ignore { + done(err == nil) + } + } // detect and log a state change toState := circuitBreaker.State() @@ -165,11 +175,6 @@ func CircuitBreaker(set *CircuitBreakerSettings, opts ...CircuitBreakerOption) R ) } - // wrap the error in case it was produced because of the circuit breaker being (half-)open - if errors.Is(gobreaker.ErrTooManyRequests, err) || errors.Is(gobreaker.ErrOpenState, err) { - err = keelerrors.NewWrappedError(ErrCircuitBreaker, err) - } - attributes := []attribute.KeyValue{ attribute.String("current_state", toState.String()), attribute.String("previous_state", fromState.String()), @@ -188,11 +193,7 @@ func CircuitBreaker(set *CircuitBreakerSettings, opts ...CircuitBreakerOption) R o.Counter.Add(r.Context(), 1, attributes...) } - if res, ok := resp.(*http.Response); ok { - return res, nil - } else { - return nil, errors.New("result is no *http.Response") - } + return resp, nil } } } diff --git a/net/http/roundtripware/circuitbreaker_test.go b/net/http/roundtripware/circuitbreaker_test.go index 784a881..f5bc285 100644 --- a/net/http/roundtripware/circuitbreaker_test.go +++ b/net/http/roundtripware/circuitbreaker_test.go @@ -61,17 +61,37 @@ func TestCircuitBreaker(t *testing.T) { keelhttp.HTTPClientWithRoundTripware(l, roundtripware.CircuitBreaker(cbSettings, roundtripware.CircuitBreakerWithIsSuccessful( - func(err error, req *http.Request, resp *http.Response) error { + func(err error, req *http.Request, resp *http.Response) (error, bool) { if resp.StatusCode >= http.StatusInternalServerError { - return errors.New("invalid status code") + return errors.New("invalid status code"), false } - return nil + return nil, false }, true, true, ), ), ), ) + { + client := keelhttp.NewHTTPClient( + keelhttp.HTTPClientWithRoundTripware(l, + roundtripware.CircuitBreaker( + &roundtripware.CircuitBreakerSettings{ + Name: "my little circuit breakerâ„¢", + MaxRequests: 1, + Interval: time.Minute, + Timeout: 30 * time.Second, + ReadyToTrip: func(counts gobreaker.Counts) bool { + return counts.ConsecutiveFailures > 3 + }, + }, + ), + ), + ) + + _ = client + } + // do requests to trigger the circuit breaker for i := 0; i <= 3; i++ { req, err := http.NewRequestWithContext(context.Background(), http.MethodGet, svr.URL, nil) @@ -130,7 +150,7 @@ func TestCircuitBreakerCopyBodies(t *testing.T) { keelhttp.HTTPClientWithRoundTripware(l, roundtripware.CircuitBreaker(cbSettings, roundtripware.CircuitBreakerWithIsSuccessful( - func(err error, req *http.Request, resp *http.Response) error { + func(err error, req *http.Request, resp *http.Response) (error, bool) { // read the bodies _, errRead := io.ReadAll(req.Body) require.NoError(t, errRead) @@ -141,7 +161,7 @@ func TestCircuitBreakerCopyBodies(t *testing.T) { // also try to close one of the bodies (should also be handled by the RoundTripware) req.Body.Close() - return err + return err, false }, true, true, ), ), @@ -187,14 +207,14 @@ func TestCircuitBreakerReadFromNotCopiedBodies(t *testing.T) { keelhttp.HTTPClientWithRoundTripware(l, roundtripware.CircuitBreaker(cbSettings, roundtripware.CircuitBreakerWithIsSuccessful( - func(err error, req *http.Request, resp *http.Response) error { + func(err error, req *http.Request, resp *http.Response) (error, bool) { // read the bodies _, errRead := io.ReadAll(req.Body) if errRead != nil { - return errRead + return errRead, false } - return err + return err, false }, false, true, ), ), @@ -215,14 +235,14 @@ func TestCircuitBreakerReadFromNotCopiedBodies(t *testing.T) { keelhttp.HTTPClientWithRoundTripware(l, roundtripware.CircuitBreaker(cbSettings, roundtripware.CircuitBreakerWithIsSuccessful( - func(err error, req *http.Request, resp *http.Response) error { + func(err error, req *http.Request, resp *http.Response) (error, bool) { // read the bodies _, errRead := io.ReadAll(resp.Body) if errRead != nil { - return errRead + return errRead, false } - return err + return err, false }, true, false, ), ), @@ -263,11 +283,11 @@ func TestCircuitBreakerInterval(t *testing.T) { }, }, roundtripware.CircuitBreakerWithIsSuccessful( - func(err error, req *http.Request, resp *http.Response) error { + func(err error, req *http.Request, resp *http.Response) (error, bool) { if resp.StatusCode >= http.StatusInternalServerError { - return errors.New("invalid status code") + return errors.New("invalid status code"), false } - return nil + return nil, false }, true, true, ), ), @@ -309,3 +329,47 @@ func TestCircuitBreakerInterval(t *testing.T) { } require.ErrorIs(t, err, roundtripware.ErrCircuitBreaker) } + +func TestCircuitBreakerIgnore(t *testing.T) { + // create logger + l := zaptest.NewLogger(t) + + // create http server with handler + svr := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + // always return an invalid status code + w.WriteHeader(http.StatusInternalServerError) + })) + defer svr.Close() + + // create http client + client := keelhttp.NewHTTPClient( + keelhttp.HTTPClientWithRoundTripware(l, + roundtripware.CircuitBreaker(cbSettings, + roundtripware.CircuitBreakerWithIsSuccessful( + func(err error, req *http.Request, resp *http.Response) (error, bool) { + if req.Method == http.MethodGet { + return errors.New("some ignored error"), true + } + if resp.StatusCode >= http.StatusInternalServerError { + return errors.New("invalid status code"), false + } + return nil, false + }, true, true, + ), + ), + ), + ) + + // send 4 requests (lower than the maximum amount of allowed consecutive failures), but they are ignored + // -> circuit breaker should remain open + for i := 0; i < 5; i++ { + req, err := http.NewRequestWithContext(context.Background(), http.MethodGet, svr.URL, nil) + require.NoError(t, err) + resp, err := client.Do(req) + if err == nil { + defer resp.Body.Close() + } + require.NotErrorIs(t, err, roundtripware.ErrCircuitBreaker) + require.Error(t, err) + } +} From 13c5374b3a49fbcaca4f4d4942fba5981d0c1372 Mon Sep 17 00:00:00 2001 From: Michael Hegel Date: Thu, 1 Dec 2022 15:29:29 +0100 Subject: [PATCH 002/134] feat: added timeout test --- net/http/roundtripware/circuitbreaker.go | 19 +++--- net/http/roundtripware/circuitbreaker_test.go | 59 ++++++++++++++++--- 2 files changed, 62 insertions(+), 16 deletions(-) diff --git a/net/http/roundtripware/circuitbreaker.go b/net/http/roundtripware/circuitbreaker.go index 82ae6d1..77c4b9b 100644 --- a/net/http/roundtripware/circuitbreaker.go +++ b/net/http/roundtripware/circuitbreaker.go @@ -149,14 +149,17 @@ func CircuitBreaker(set *CircuitBreakerSettings, opts ...CircuitBreakerOption) R } else if err == nil { resp, err = next(r) - // clone the response and the body if wanted - respCopy, errCopy := copyResponse(resp, o.CopyRespBody) - if errCopy != nil { - l.Error("unable to copy response", log.FError(errCopy)) - return nil, errCopy - } else if o.CopyRespBody && respCopy.Body != nil { - // make sure the body is closed again - since it is a NopCloser it does not make a difference though - defer respCopy.Body.Close() + var respCopy *http.Response + if resp != nil { + // clone the response and the body if wanted + respCopy, errCopy := copyResponse(resp, o.CopyRespBody) + if errCopy != nil { + l.Error("unable to copy response", log.FError(errCopy)) + return nil, errCopy + } else if o.CopyRespBody && respCopy.Body != nil { + // make sure the body is closed again - since it is a NopCloser it does not make a difference though + defer respCopy.Body.Close() + } } var ignore bool diff --git a/net/http/roundtripware/circuitbreaker_test.go b/net/http/roundtripware/circuitbreaker_test.go index f5bc285..fa97563 100644 --- a/net/http/roundtripware/circuitbreaker_test.go +++ b/net/http/roundtripware/circuitbreaker_test.go @@ -52,7 +52,6 @@ func TestCircuitBreaker(t *testing.T) { if i < 5 { w.WriteHeader(http.StatusInternalServerError) } - w.WriteHeader(http.StatusOK) })) defer svr.Close() @@ -66,7 +65,7 @@ func TestCircuitBreaker(t *testing.T) { return errors.New("invalid status code"), false } return nil, false - }, true, true, + }, false, false, ), ), ), @@ -141,7 +140,6 @@ func TestCircuitBreakerCopyBodies(t *testing.T) { if err != nil { panic(err) } - w.WriteHeader(http.StatusOK) })) defer svr.Close() @@ -198,7 +196,6 @@ func TestCircuitBreakerReadFromNotCopiedBodies(t *testing.T) { if err != nil { panic(err) } - w.WriteHeader(http.StatusOK) })) defer svr.Close() @@ -288,7 +285,7 @@ func TestCircuitBreakerInterval(t *testing.T) { return errors.New("invalid status code"), false } return nil, false - }, true, true, + }, false, false, ), ), ), @@ -354,15 +351,15 @@ func TestCircuitBreakerIgnore(t *testing.T) { return errors.New("invalid status code"), false } return nil, false - }, true, true, + }, false, false, ), ), ), ) - // send 4 requests (lower than the maximum amount of allowed consecutive failures), but they are ignored + // send 4 requests (higher than the maximum amount of allowed consecutive failures), but they are ignored // -> circuit breaker should remain open - for i := 0; i < 5; i++ { + for i := 0; i < 4; i++ { req, err := http.NewRequestWithContext(context.Background(), http.MethodGet, svr.URL, nil) require.NoError(t, err) resp, err := client.Do(req) @@ -373,3 +370,49 @@ func TestCircuitBreakerIgnore(t *testing.T) { require.Error(t, err) } } + +func TestCircuitBreakerTimeout(t *testing.T) { + // create logger + l := zaptest.NewLogger(t) + + // create http server with handler + svr := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + time.Sleep(250 * time.Millisecond) + })) + defer svr.Close() + + // create http client + client := keelhttp.NewHTTPClient( + keelhttp.HTTPClientWithRoundTripware(l, + roundtripware.CircuitBreaker(cbSettings), + ), + ) + + // send 4 requests (more than the maximum amount of allowed consecutive failures) + // -> circuit breaker should change to open state + for i := 0; i < 4; i++ { + ctx, cancel := context.WithTimeout(context.Background(), 200*time.Millisecond) + defer cancel() + + req, err := http.NewRequestWithContext(ctx, http.MethodGet, svr.URL, nil) + require.NoError(t, err) + resp, err := client.Do(req) + if err == nil { + defer resp.Body.Close() + } + require.NotErrorIs(t, err, roundtripware.ErrCircuitBreaker) + require.ErrorIs(t, err, context.DeadlineExceeded) + } + + // send another request with a bigger timeout + // this should be blocked by the circuit breaker though + ctx, cancel := context.WithTimeout(context.Background(), 500*time.Millisecond) + defer cancel() + req, err := http.NewRequestWithContext(ctx, http.MethodGet, svr.URL, nil) + require.NoError(t, err) + resp, err := client.Do(req) + if err == nil { + defer resp.Body.Close() + } + require.ErrorIs(t, err, roundtripware.ErrCircuitBreaker) +} From 8f946bc5b02f19817f1e165a3f85cf3cd83fa1dd Mon Sep 17 00:00:00 2001 From: Michael Hegel Date: Fri, 9 Dec 2022 16:02:11 +0100 Subject: [PATCH 003/134] feat: handling unexpected circuit breaker errors --- net/http/roundtripware/circuitbreaker.go | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/net/http/roundtripware/circuitbreaker.go b/net/http/roundtripware/circuitbreaker.go index 77c4b9b..726f085 100644 --- a/net/http/roundtripware/circuitbreaker.go +++ b/net/http/roundtripware/circuitbreaker.go @@ -146,13 +146,19 @@ func CircuitBreaker(set *CircuitBreakerSettings, opts ...CircuitBreakerOption) R // wrap the error in case it was produced because of the circuit breaker being (half-)open if errors.Is(gobreaker.ErrTooManyRequests, err) || errors.Is(gobreaker.ErrOpenState, err) { err = keelerrors.NewWrappedError(ErrCircuitBreaker, err) - } else if err == nil { + } else if err != nil { + l.Error("unexpected error in circuit breaker", + log.FError(err), + zap.String("from", fromState.String()), + ) + } else { + //continue with the middleware chain resp, err = next(r) var respCopy *http.Response if resp != nil { // clone the response and the body if wanted - respCopy, errCopy := copyResponse(resp, o.CopyRespBody) + respCopy, errCopy = copyResponse(resp, o.CopyRespBody) if errCopy != nil { l.Error("unable to copy response", log.FError(errCopy)) return nil, errCopy @@ -173,8 +179,8 @@ func CircuitBreaker(set *CircuitBreakerSettings, opts ...CircuitBreakerOption) R toState := circuitBreaker.State() if fromState != toState { l.Warn("state change occurred", - zap.String("from", fromState.String()), - zap.String("to", toState.String()), + zap.String("state_from", fromState.String()), + zap.String("state_to", toState.String()), ) } From eea4aa4ab7a12f22288b814bdcc3834ed3dd7003 Mon Sep 17 00:00:00 2001 From: Michael Hegel Date: Fri, 9 Dec 2022 17:24:26 +0100 Subject: [PATCH 004/134] feat: introduced ErrIgnoreSuccessfulness --- net/http/roundtripware/circuitbreaker.go | 21 +++++------ net/http/roundtripware/circuitbreaker_test.go | 36 +++++++++---------- 2 files changed, 29 insertions(+), 28 deletions(-) diff --git a/net/http/roundtripware/circuitbreaker.go b/net/http/roundtripware/circuitbreaker.go index 726f085..5d67860 100644 --- a/net/http/roundtripware/circuitbreaker.go +++ b/net/http/roundtripware/circuitbreaker.go @@ -20,6 +20,9 @@ var ( // RoundTripware. It wraps the two gobreaker errors (ErrTooManyRequests & ErrOpenState) so only one comparison is // needed ErrCircuitBreaker = errors.New("circuit breaker triggered") + + // ErrIgnoreSuccessfulness + ErrIgnoreSuccessfulness = errors.New("ignored successfulness") ) // CircuitBreakerSettings is a copy of the gobreaker.Settings, except that the IsSuccessful function is omitted since we @@ -51,7 +54,7 @@ type CircuitBreakerSettings struct { type CircuitBreakerOptions struct { Counter syncint64.Counter - IsSuccessful func(err error, req *http.Request, resp *http.Response) (e error, ignore bool) + IsSuccessful func(err error, req *http.Request, resp *http.Response) error CopyReqBody bool CopyRespBody bool } @@ -60,8 +63,8 @@ func NewDefaultCircuitBreakerOptions() *CircuitBreakerOptions { return &CircuitBreakerOptions{ Counter: nil, - IsSuccessful: func(err error, req *http.Request, resp *http.Response) (e error, ignore bool) { - return err, false + IsSuccessful: func(err error, req *http.Request, resp *http.Response) error { + return err }, CopyReqBody: false, CopyRespBody: false, @@ -91,7 +94,7 @@ func CircuitBreakerWithMetric( } func CircuitBreakerWithIsSuccessful( - isSuccessful func(err error, req *http.Request, resp *http.Response) (e error, ignore bool), + isSuccessful func(err error, req *http.Request, resp *http.Response) (e error), copyReqBody bool, copyRespBody bool, ) CircuitBreakerOption { @@ -144,15 +147,15 @@ func CircuitBreaker(set *CircuitBreakerSettings, opts ...CircuitBreakerOption) R var resp *http.Response // wrap the error in case it was produced because of the circuit breaker being (half-)open - if errors.Is(gobreaker.ErrTooManyRequests, err) || errors.Is(gobreaker.ErrOpenState, err) { + if errors.Is(err, gobreaker.ErrTooManyRequests) || errors.Is(err, gobreaker.ErrOpenState) { err = keelerrors.NewWrappedError(ErrCircuitBreaker, err) } else if err != nil { l.Error("unexpected error in circuit breaker", log.FError(err), - zap.String("from", fromState.String()), + zap.String("state", fromState.String()), ) } else { - //continue with the middleware chain + // continue with the middleware chain resp, err = next(r) var respCopy *http.Response @@ -168,9 +171,7 @@ func CircuitBreaker(set *CircuitBreakerSettings, opts ...CircuitBreakerOption) R } } - var ignore bool - err, ignore = o.IsSuccessful(err, reqCopy, respCopy) - if !ignore { + if err = o.IsSuccessful(err, reqCopy, respCopy); !errors.Is(err, ErrIgnoreSuccessfulness) { done(err == nil) } } diff --git a/net/http/roundtripware/circuitbreaker_test.go b/net/http/roundtripware/circuitbreaker_test.go index fa97563..627abda 100644 --- a/net/http/roundtripware/circuitbreaker_test.go +++ b/net/http/roundtripware/circuitbreaker_test.go @@ -60,11 +60,11 @@ func TestCircuitBreaker(t *testing.T) { keelhttp.HTTPClientWithRoundTripware(l, roundtripware.CircuitBreaker(cbSettings, roundtripware.CircuitBreakerWithIsSuccessful( - func(err error, req *http.Request, resp *http.Response) (error, bool) { + func(err error, req *http.Request, resp *http.Response) error { if resp.StatusCode >= http.StatusInternalServerError { - return errors.New("invalid status code"), false + return errors.New("invalid status code") } - return nil, false + return nil }, false, false, ), ), @@ -148,7 +148,7 @@ func TestCircuitBreakerCopyBodies(t *testing.T) { keelhttp.HTTPClientWithRoundTripware(l, roundtripware.CircuitBreaker(cbSettings, roundtripware.CircuitBreakerWithIsSuccessful( - func(err error, req *http.Request, resp *http.Response) (error, bool) { + func(err error, req *http.Request, resp *http.Response) error { // read the bodies _, errRead := io.ReadAll(req.Body) require.NoError(t, errRead) @@ -159,7 +159,7 @@ func TestCircuitBreakerCopyBodies(t *testing.T) { // also try to close one of the bodies (should also be handled by the RoundTripware) req.Body.Close() - return err, false + return err }, true, true, ), ), @@ -204,14 +204,14 @@ func TestCircuitBreakerReadFromNotCopiedBodies(t *testing.T) { keelhttp.HTTPClientWithRoundTripware(l, roundtripware.CircuitBreaker(cbSettings, roundtripware.CircuitBreakerWithIsSuccessful( - func(err error, req *http.Request, resp *http.Response) (error, bool) { + func(err error, req *http.Request, resp *http.Response) error { // read the bodies _, errRead := io.ReadAll(req.Body) if errRead != nil { - return errRead, false + return errRead } - return err, false + return err }, false, true, ), ), @@ -232,14 +232,14 @@ func TestCircuitBreakerReadFromNotCopiedBodies(t *testing.T) { keelhttp.HTTPClientWithRoundTripware(l, roundtripware.CircuitBreaker(cbSettings, roundtripware.CircuitBreakerWithIsSuccessful( - func(err error, req *http.Request, resp *http.Response) (error, bool) { + func(err error, req *http.Request, resp *http.Response) error { // read the bodies _, errRead := io.ReadAll(resp.Body) if errRead != nil { - return errRead, false + return errRead } - return err, false + return err }, true, false, ), ), @@ -280,11 +280,11 @@ func TestCircuitBreakerInterval(t *testing.T) { }, }, roundtripware.CircuitBreakerWithIsSuccessful( - func(err error, req *http.Request, resp *http.Response) (error, bool) { + func(err error, req *http.Request, resp *http.Response) error { if resp.StatusCode >= http.StatusInternalServerError { - return errors.New("invalid status code"), false + return errors.New("invalid status code") } - return nil, false + return nil }, false, false, ), ), @@ -343,14 +343,14 @@ func TestCircuitBreakerIgnore(t *testing.T) { keelhttp.HTTPClientWithRoundTripware(l, roundtripware.CircuitBreaker(cbSettings, roundtripware.CircuitBreakerWithIsSuccessful( - func(err error, req *http.Request, resp *http.Response) (error, bool) { + func(err error, req *http.Request, resp *http.Response) error { if req.Method == http.MethodGet { - return errors.New("some ignored error"), true + return roundtripware.ErrIgnoreSuccessfulness } if resp.StatusCode >= http.StatusInternalServerError { - return errors.New("invalid status code"), false + return errors.New("invalid status code") } - return nil, false + return nil }, false, false, ), ), From d8da15892851bdcff41657588f1e389dd5dc2147 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Mar 2023 22:57:46 +0000 Subject: [PATCH 005/134] chore(deps): bump actions/setup-go from 3 to 4 Bumps [actions/setup-go](https://github.com/actions/setup-go) from 3 to 4. - [Release notes](https://github.com/actions/setup-go/releases) - [Commits](https://github.com/actions/setup-go/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/setup-go dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/pull-requests.yml | 4 ++-- .github/workflows/releases.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/pull-requests.yml b/.github/workflows/pull-requests.yml index af48aa2..6bb1ed4 100644 --- a/.github/workflows/pull-requests.yml +++ b/.github/workflows/pull-requests.yml @@ -22,7 +22,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - uses: actions/setup-go@v3 + - uses: actions/setup-go@v4 with: cache: true check-latest: true @@ -35,7 +35,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - uses: actions/setup-go@v3 + - uses: actions/setup-go@v4 with: cache: true check-latest: true diff --git a/.github/workflows/releases.yml b/.github/workflows/releases.yml index 9f72302..bf00794 100644 --- a/.github/workflows/releases.yml +++ b/.github/workflows/releases.yml @@ -18,7 +18,7 @@ jobs: with: fetch-depth: 0 - run: git fetch --force --tags - - uses: actions/setup-go@v3 + - uses: actions/setup-go@v4 with: cache: true check-latest: true From 6f5d8f9253720a9743bb5f15d955c123529f8754 Mon Sep 17 00:00:00 2001 From: franklin Date: Thu, 1 Jun 2023 11:43:51 +0200 Subject: [PATCH 006/134] feat: add nats config js opts --- net/stream/jetstream/stream.go | 35 ++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/net/stream/jetstream/stream.go b/net/stream/jetstream/stream.go index 4608029..37048fd 100644 --- a/net/stream/jetstream/stream.go +++ b/net/stream/jetstream/stream.go @@ -20,7 +20,9 @@ type ( name string info *nats.StreamInfo config *nats.StreamConfig + configJSOptions []nats.JSOpt namespace string + jsOptions []nats.JSOpt natsOptions []nats.Option reconnectMaxRetries int reconnectTimeout time.Duration @@ -59,22 +61,30 @@ func WithReconnectMaxRetries(v int) Option { } } -func WithConfig(v *nats.StreamConfig) Option { +func WithConfig(v *nats.StreamConfig, opts ...nats.JSOpt) Option { return func(o *Stream) { o.config = v + o.configJSOptions = append(o.configJSOptions, opts...) + } +} + +// WithJSOptions option +func WithJSOptions(v ...nats.JSOpt) Option { + return func(o *Stream) { + o.jsOptions = append(o.jsOptions, v...) } } // WithNatsOptions option func WithNatsOptions(v ...nats.Option) Option { return func(o *Stream) { - o.natsOptions = v + o.natsOptions = append(o.natsOptions, v...) } } func PublisherWithPubOpts(v ...nats.PubOpt) PublisherOption { return func(o *Publisher) { - o.pubOpts = v + o.pubOpts = append(o.pubOpts, v...) } } @@ -98,7 +108,7 @@ func SubscriberWithNamespace(v string) SubscriberOption { func SubscriberWithSubOpts(v ...nats.SubOpt) SubscriberOption { return func(o *Subscriber) { - o.opts = v + o.opts = append(o.opts, v...) } } @@ -118,9 +128,14 @@ func (s *Stream) connect() error { // create jet stream js, err := conn.JetStream( - nats.PublishAsyncErrHandler(func(js nats.JetStream, msg *nats.Msg, err error) { - s.l.Error("nats async publish error", log.FError(err)) - }), + append( + []nats.JSOpt{ + nats.PublishAsyncErrHandler(func(js nats.JetStream, msg *nats.Msg, err error) { + s.l.Error("nats async publish error", log.FError(err)) + }), + }, + s.jsOptions..., + )..., ) if err != nil { return err @@ -130,8 +145,8 @@ func (s *Stream) connect() error { // create / update stream if config exists if s.config != nil { s.config.Name = s.Name() - if _, err = js.StreamInfo(s.Name()); errors.Is(err, nats.ErrStreamNotFound) { - if info, err := js.AddStream(s.config); err != nil { + if _, err = js.StreamInfo(s.Name(), s.configJSOptions...); errors.Is(err, nats.ErrStreamNotFound) { + if info, err := js.AddStream(s.config, s.configJSOptions...); err != nil { return errors.Wrap(err, "failed to add stream") } else if err != nil { return errors.Wrap(err, "failed to retrieve stream info") @@ -140,7 +155,7 @@ func (s *Stream) connect() error { } } else if err != nil { return errors.Wrap(err, "failed get stream info") - } else if info, err := js.UpdateStream(s.config); err != nil { + } else if info, err := js.UpdateStream(s.config, s.configJSOptions...); err != nil { return errors.Wrap(err, "failed to update stream") } else { s.info = info From 8366985ca3fca48a9eeb7da44052ddaea64d5cf1 Mon Sep 17 00:00:00 2001 From: franklin Date: Thu, 1 Jun 2023 11:44:14 +0200 Subject: [PATCH 007/134] feat: add referer --- log/fields_http.go | 7 +++++++ log/with.go | 11 +++++++++++ 2 files changed, 18 insertions(+) diff --git a/log/fields_http.go b/log/fields_http.go index 04e7923..d49704b 100644 --- a/log/fields_http.go +++ b/log/fields_http.go @@ -48,6 +48,9 @@ const ( // HTTPTrackingIDKey represents the HTTP tracking id if known (e.g. from X-Tracking-ID). HTTPTrackingIDKey = "http_tracking_id" + + // HTTPRefererKey identifies the address of the web page (i.e., the URI or IRI), from which the resource has been requested. + HTTPRefererKey = "http_referer" ) func FHTTPServerName(id string) zap.Field { @@ -98,6 +101,10 @@ func FHTTPUserAgent(userAgent string) zap.Field { return zap.String(HTTPUserAgentKey, userAgent) } +func FHTTPReferer(host string) zap.Field { + return zap.String(HTTPRefererKey, host) +} + func FHTTPHost(host string) zap.Field { return zap.String(HTTPHostKey, host) } diff --git a/log/with.go b/log/with.go index 1322792..d95886f 100644 --- a/log/with.go +++ b/log/with.go @@ -77,6 +77,16 @@ func WithHTTPRequestID(l *zap.Logger, r *http.Request) *zap.Logger { } } +func WithHTTPReferer(l *zap.Logger, r *http.Request) *zap.Logger { + if value := r.Header.Get("X-Referer"); value != "" { + return With(l, FHTTPReferer(value)) + } else if value := r.Referer(); value != "" { + return With(l, FHTTPHost(value)) + } else { + return l + } +} + func WithHTTPHost(l *zap.Logger, r *http.Request) *zap.Logger { if value := r.Header.Get("X-Forwarded-Host"); value != "" { return With(l, FHTTPHost(value)) @@ -120,6 +130,7 @@ func WithHTTPClientIP(l *zap.Logger, r *http.Request) *zap.Logger { func WithHTTPRequest(l *zap.Logger, r *http.Request) *zap.Logger { l = WithHTTPHost(l, r) + l = WithHTTPReferer(l, r) l = WithHTTPRequestID(l, r) l = WithHTTPSessionID(l, r) l = WithHTTPTrackingID(l, r) From d00ec8daf9f9646591d085422d9c0e4523d05f94 Mon Sep 17 00:00:00 2001 From: franklin Date: Thu, 1 Jun 2023 11:47:54 +0200 Subject: [PATCH 008/134] feat: remove obsolete cache flag --- .github/workflows/pull-requests.yml | 2 -- .github/workflows/releases.yml | 1 - 2 files changed, 3 deletions(-) diff --git a/.github/workflows/pull-requests.yml b/.github/workflows/pull-requests.yml index 6bb1ed4..ddccd1c 100644 --- a/.github/workflows/pull-requests.yml +++ b/.github/workflows/pull-requests.yml @@ -24,7 +24,6 @@ jobs: - uses: actions/checkout@v3 - uses: actions/setup-go@v4 with: - cache: true check-latest: true go-version-file: 'go.mod' - uses: golangci/golangci-lint-action@v3 @@ -37,7 +36,6 @@ jobs: - uses: actions/checkout@v3 - uses: actions/setup-go@v4 with: - cache: true check-latest: true go-version-file: 'go.mod' - run: go test -v ./... diff --git a/.github/workflows/releases.yml b/.github/workflows/releases.yml index bf00794..99be72d 100644 --- a/.github/workflows/releases.yml +++ b/.github/workflows/releases.yml @@ -20,7 +20,6 @@ jobs: - run: git fetch --force --tags - uses: actions/setup-go@v4 with: - cache: true check-latest: true go-version-file: 'go.mod' - uses: goreleaser/goreleaser-action@v4 From 764037311e78307c5a7c5a797b2245a7fb343a49 Mon Sep 17 00:00:00 2001 From: franklin Date: Thu, 6 Jul 2023 11:27:57 +0200 Subject: [PATCH 009/134] feat: add referrer --- errors/wrappederror_test.go | 75 ++++++++++++++ net/http/context/referrer.go | 19 ++++ net/http/header.go | 2 + net/http/middleware/referrer.go | 67 +++++++++++++ net/http/roundtripware/referrer.go | 51 ++++++++++ net/http/roundtripware/referrer_test.go | 125 ++++++++++++++++++++++++ 6 files changed, 339 insertions(+) create mode 100644 errors/wrappederror_test.go create mode 100644 net/http/context/referrer.go create mode 100644 net/http/middleware/referrer.go create mode 100644 net/http/roundtripware/referrer.go create mode 100644 net/http/roundtripware/referrer_test.go diff --git a/errors/wrappederror_test.go b/errors/wrappederror_test.go new file mode 100644 index 0000000..05f06b0 --- /dev/null +++ b/errors/wrappederror_test.go @@ -0,0 +1,75 @@ +package keelerrors_test + +import ( + "fmt" + "testing" + + keelerrors "github.com/foomo/keel/errors" + "github.com/pkg/errors" + "github.com/stretchr/testify/assert" +) + +func ExampleNewWrappedError() { + parentErr := errors.New("parent") + childErr := errors.New("child") + wrappedErr := keelerrors.NewWrappedError(parentErr, childErr) + fmt.Println(parentErr) + fmt.Println(childErr) + fmt.Println(wrappedErr) + // Output: + // parent + // child + // parent: child +} + +func TestNewWrappedError(t *testing.T) { + parentErr := errors.New("parent") + childErr := errors.New("child") + assert.Error(t, keelerrors.NewWrappedError(parentErr, childErr)) +} + +func TestWrapped(t *testing.T) { + parentErr := errors.New("parent") + childErr := errors.New("child") + assert.Error(t, keelerrors.NewWrappedError(parentErr, childErr)) +} + +func Test_wrappedError_As(t *testing.T) { + type ( + Parent struct { + error + } + Child struct { + error + } + ) + parentErr := &Parent{error: errors.New("parent")} + childErr := &Child{error: errors.New("parent")} + wrappedErr := keelerrors.NewWrappedError(parentErr, childErr) + + var ( + p *Parent + c *Child + ) + if assert.ErrorAs(t, wrappedErr, &p) { + assert.EqualError(t, p, parentErr.Error()) + } + if assert.ErrorAs(t, wrappedErr, &c) { + assert.EqualError(t, c, childErr.Error()) + } +} + +func Test_wrappedError_Error(t *testing.T) { + parentErr := errors.New("parent") + childErr := errors.New("child") + wrappedErr := keelerrors.NewWrappedError(parentErr, childErr) + assert.Equal(t, wrappedErr.Error(), "parent: child") +} + +func Test_wrappedError_Is(t *testing.T) { + parentErr := errors.New("parent") + childErr := errors.New("child") + wrappedErr := keelerrors.NewWrappedError(parentErr, childErr) + assert.ErrorIs(t, wrappedErr, parentErr) + assert.ErrorIs(t, wrappedErr, childErr) +} diff --git a/net/http/context/referrer.go b/net/http/context/referrer.go new file mode 100644 index 0000000..cba2266 --- /dev/null +++ b/net/http/context/referrer.go @@ -0,0 +1,19 @@ +package context + +import ( + "context" +) + +const ContextKeyReferrer contextKey = "referrer" + +func GetReferrer(ctx context.Context) (string, bool) { + if value, ok := ctx.Value(ContextKeyReferrer).(string); ok { + return value, true + } else { + return "", false + } +} + +func SetReferrer(ctx context.Context, referer string) context.Context { + return context.WithValue(ctx, ContextKeyReferrer, referer) +} diff --git a/net/http/header.go b/net/http/header.go index 1524c12..7d48c1f 100644 --- a/net/http/header.go +++ b/net/http/header.go @@ -15,6 +15,7 @@ const ( HeaderLastModified = "Last-Modified" HeaderLocation = "Location" HeaderUpgrade = "Upgrade" + HeaderReferrer = "Referer" HeaderVary = "Vary" HeaderWWWAuthenticate = "WWW-Authenticate" HeaderXForwardedHost = "X-Forwarded-Host" @@ -36,6 +37,7 @@ const ( HeaderServer = "Server" HeaderTrueClientIP = "True-Client-Ip" HeaderOrigin = "Origin" + HeaderXReferrer = "X-Referrer" HeaderUserAgent = "User-Agent" // Cloudflare diff --git a/net/http/middleware/referrer.go b/net/http/middleware/referrer.go new file mode 100644 index 0000000..a42b2c3 --- /dev/null +++ b/net/http/middleware/referrer.go @@ -0,0 +1,67 @@ +package middleware + +import ( + "net/http" + + "github.com/foomo/keel/net/http/context" + "go.uber.org/zap" +) + +type ( + RefererOptions struct { + RequestHeader []string + SetContext bool + } + RefererOption func(*RefererOptions) +) + +// GetDefaultRefererOptions returns the default options +func GetDefaultRefererOptions() RefererOptions { + return RefererOptions{ + RequestHeader: []string{"X-Referer", "X-Referrer", "Referer", "Referrer"}, + SetContext: true, + } +} + +// RefererWithRequestHeader middleware option +func RefererWithRequestHeader(v ...string) RefererOption { + return func(o *RefererOptions) { + o.RequestHeader = append(o.RequestHeader, v...) + } +} + +// RefererWithSetContext middleware option +func RefererWithSetContext(v bool) RefererOption { + return func(o *RefererOptions) { + o.SetContext = v + } +} + +// Referer middleware +func Referer(opts ...RefererOption) Middleware { + options := GetDefaultRefererOptions() + for _, opt := range opts { + if opt != nil { + opt(&options) + } + } + return RefererWithOptions(options) +} + +// RefererWithOptions middleware +func RefererWithOptions(opts RefererOptions) Middleware { + return func(l *zap.Logger, name string, next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + var referer string + for _, value := range opts.RequestHeader { + if referer = r.Header.Get(value); referer != "" { + break + } + } + if referer != "" && opts.SetContext { + r = r.WithContext(context.SetReferrer(r.Context(), referer)) + } + next.ServeHTTP(w, r) + }) + } +} diff --git a/net/http/roundtripware/referrer.go b/net/http/roundtripware/referrer.go new file mode 100644 index 0000000..a644a50 --- /dev/null +++ b/net/http/roundtripware/referrer.go @@ -0,0 +1,51 @@ +package roundtripware + +import ( + "net/http" + + "go.uber.org/zap" + + keelhttpcontext "github.com/foomo/keel/net/http/context" +) + +type ( + ReferrerOptions struct { + Header string + } + ReferrerOption func(*ReferrerOptions) + ReferrerGenerator func() string +) + +// GetDefaultReferrerOptions returns the default options +func GetDefaultReferrerOptions() ReferrerOptions { + return ReferrerOptions{ + Header: "X-Referrer", + } +} + +// ReferrerWithHeader middleware option +func ReferrerWithHeader(v string) ReferrerOption { + return func(o *ReferrerOptions) { + o.Header = v + } +} + +// Referrer returns a RoundTripper which prints out the request & response object +func Referrer(opts ...ReferrerOption) RoundTripware { + o := GetDefaultReferrerOptions() + for _, opt := range opts { + if opt != nil { + opt(&o) + } + } + return func(l *zap.Logger, next Handler) Handler { + return func(r *http.Request) (*http.Response, error) { + if value := r.Header.Get(o.Header); value == "" { + if value, ok := keelhttpcontext.GetReferrer(r.Context()); ok && value != "" { + r.Header.Set(o.Header, value) + } + } + return next(r) + } + } +} diff --git a/net/http/roundtripware/referrer_test.go b/net/http/roundtripware/referrer_test.go new file mode 100644 index 0000000..79aeaaf --- /dev/null +++ b/net/http/roundtripware/referrer_test.go @@ -0,0 +1,125 @@ +package roundtripware_test + +import ( + "context" + "net/http" + "net/http/httptest" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.uber.org/zap/zaptest" + + keelhttp "github.com/foomo/keel/net/http" + keelhttpcontext "github.com/foomo/keel/net/http/context" + "github.com/foomo/keel/net/http/roundtripware" +) + +func TestReferrer(t *testing.T) { + var testReferrer string + + // create logger + l := zaptest.NewLogger(t) + + // create http server with handler + svr := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + testReferrer = r.Header.Get(keelhttp.HeaderXReferrer) + assert.Empty(t, testReferrer) + w.WriteHeader(http.StatusOK) + })) + defer svr.Close() + + // create http client + client := keelhttp.NewHTTPClient( + keelhttp.HTTPClientWithRoundTripware(l, + roundtripware.Referrer(), + ), + ) + + // create request + req, err := http.NewRequestWithContext(context.Background(), http.MethodGet, svr.URL, nil) + require.NoError(t, err) + + // do request + resp, err := client.Do(req) + require.NoError(t, err) + defer resp.Body.Close() + + // validate + assert.Equal(t, testReferrer, req.Header.Get(keelhttp.HeaderXReferrer)) +} + +func TestReferrer_Context(t *testing.T) { + testReferrer := "https://foomo.org/" + + // create logger + l := zaptest.NewLogger(t) + + // create http server with handler + svr := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + assert.Equal(t, testReferrer, r.Header.Get(keelhttp.HeaderXReferrer)) + w.WriteHeader(http.StatusOK) + })) + defer svr.Close() + + // create http client + client := keelhttp.NewHTTPClient( + keelhttp.HTTPClientWithRoundTripware(l, + roundtripware.Referrer(), + ), + ) + + // set request id on context + ctx := keelhttpcontext.SetReferrer(context.Background(), testReferrer) + + // create request + req, err := http.NewRequestWithContext(ctx, http.MethodGet, svr.URL, nil) + require.NoError(t, err) + + // do request + resp, err := client.Do(req) + require.NoError(t, err) + defer resp.Body.Close() + + // validate + assert.Equal(t, testReferrer, req.Header.Get(keelhttp.HeaderXReferrer)) +} + +func TestReferrer_WithHeader(t *testing.T) { + testReferrer := "https://foomo.org/" + testHeader := "X-Custom-Header" + + // create logger + l := zaptest.NewLogger(t) + + // create http server with handler + svr := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + assert.Equal(t, testReferrer, r.Header.Get(testHeader)) + w.WriteHeader(http.StatusOK) + })) + defer svr.Close() + + // create http client + client := keelhttp.NewHTTPClient( + keelhttp.HTTPClientWithRoundTripware(l, + roundtripware.Referrer( + roundtripware.ReferrerWithHeader(testHeader), + ), + ), + ) + + // set request id on context + ctx := keelhttpcontext.SetReferrer(context.Background(), testReferrer) + + // create request + req, err := http.NewRequestWithContext(ctx, http.MethodGet, svr.URL, nil) + require.NoError(t, err) + + // do request + resp, err := client.Do(req) + require.NoError(t, err) + defer resp.Body.Close() + + // validate + assert.Equal(t, testReferrer, req.Header.Get(testHeader)) +} From 6ded5a13660d4137ff235a67c02fbe36d9a62802 Mon Sep 17 00:00:00 2001 From: franklin Date: Thu, 6 Jul 2023 11:28:06 +0200 Subject: [PATCH 010/134] chore: disable depguard --- .golangci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.golangci.yml b/.golangci.yml index 2aecc72..2117810 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -59,7 +59,7 @@ linters: #- contextcheck # check the function whether to use a non-inherited context [fast: false, auto-fix: false] #- cyclop # checks function and package cyclomatic complexity [fast: false, auto-fix: false] - decorder # check declaration order and count of types, constants, variables and functions [fast: true, auto-fix: false] - - depguard # Go linter that checks if package imports are in a list of acceptable packages [fast: true, auto-fix: false] + #- depguard # Go linter that checks if package imports are in a list of acceptable packages [fast: true, auto-fix: false] - dogsled # Checks assignments with too many blank identifiers (e.g. x, _, _, _, := f()) [fast: true, auto-fix: false] #- dupl # Tool for code clone detection [fast: true, auto-fix: false] - durationcheck # check for two durations multiplied together [fast: false, auto-fix: false] From ca17d23ff175487e63dcd89cbdefab1f8f4bc891 Mon Sep 17 00:00:00 2001 From: franklin Date: Thu, 6 Jul 2023 11:28:22 +0200 Subject: [PATCH 011/134] chore: use new Unwrap() []error --- errors/wrappederror.go | 23 +++++------------------ 1 file changed, 5 insertions(+), 18 deletions(-) diff --git a/errors/wrappederror.go b/errors/wrappederror.go index 12ec753..9b1aa8d 100644 --- a/errors/wrappederror.go +++ b/errors/wrappederror.go @@ -1,12 +1,11 @@ package keelerrors -import "errors" - type wrappedError struct { err error cause error } +// NewWrappedError returns a new wrapped error func NewWrappedError(err, cause error) error { return &wrappedError{ err: err, @@ -14,22 +13,10 @@ func NewWrappedError(err, cause error) error { } } -func (e *wrappedError) As(target interface{}) bool { - return errors.As(e.err, target) || errors.As(e.cause, target) -} - -func (e *wrappedError) Is(target error) bool { - return errors.Is(e.err, target) || errors.Is(e.cause, target) -} - -func (e *wrappedError) Cause() error { - return e.cause -} - -func (e *wrappedError) Unwrap() error { - return e.err -} - func (e *wrappedError) Error() string { return e.err.Error() + ": " + e.cause.Error() } + +func (e *wrappedError) Unwrap() []error { + return []error{e.err, e.cause} +} From 4a9813155a53ebc42d78d4c9136b08c8fc48894f Mon Sep 17 00:00:00 2001 From: franklin Date: Thu, 6 Jul 2023 11:28:51 +0200 Subject: [PATCH 012/134] chore: set go 1.20 --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 4435ff9..a6432b5 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/foomo/keel -go 1.19 +go 1.20 require ( github.com/avast/retry-go v3.0.0+incompatible From c300d9082d4e25af7ef22f4ffb4a647bb53e09a9 Mon Sep 17 00:00:00 2001 From: franklin Date: Fri, 7 Jul 2023 07:34:26 +0200 Subject: [PATCH 013/134] revert: set go 1.19 --- Makefile | 4 ++-- go.mod | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 14ac590..5fc9f6f 100644 --- a/Makefile +++ b/Makefile @@ -25,13 +25,13 @@ lint.fix: .PHONY: gomod ## Run go mod tidy -gomod: +tidy: go mod tidy cd example && go mod tidy .PHONY: gomod.outdated ## Show outdated direct dependencies -gomod.outdated: +outdated: go list -u -m -json all | go-mod-outdated -update -direct ## Show help text diff --git a/go.mod b/go.mod index a6432b5..4435ff9 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/foomo/keel -go 1.20 +go 1.19 require ( github.com/avast/retry-go v3.0.0+incompatible From b134b98d3880c6788c4857747b1a0276d8eb071c Mon Sep 17 00:00:00 2001 From: franklin Date: Fri, 7 Jul 2023 08:12:43 +0200 Subject: [PATCH 014/134] chore: set go 1.20 --- example/go.mod | 2 +- go.mod | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/example/go.mod b/example/go.mod index aa10afc..bffc123 100644 --- a/example/go.mod +++ b/example/go.mod @@ -1,6 +1,6 @@ module github.com/foomo/keel/example -go 1.19 +go 1.20 require ( github.com/davecgh/go-spew v1.1.1 diff --git a/go.mod b/go.mod index 4435ff9..a6432b5 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/foomo/keel -go 1.19 +go 1.20 require ( github.com/avast/retry-go v3.0.0+incompatible From 80dc2187e6ae3e4358b069fe6e10a7c94cb840c3 Mon Sep 17 00:00:00 2001 From: franklin Date: Fri, 7 Jul 2023 08:31:14 +0200 Subject: [PATCH 015/134] refactor: use referer --- net/http/context/referrer.go | 10 ++-- net/http/header.go | 3 +- net/http/middleware/referrer.go | 4 +- net/http/roundtripware/referer.go | 50 ++++++++++++++++++ .../{referrer_test.go => referer_test.go} | 38 +++++++------- net/http/roundtripware/referrer.go | 51 ------------------- 6 files changed, 77 insertions(+), 79 deletions(-) create mode 100644 net/http/roundtripware/referer.go rename net/http/roundtripware/{referrer_test.go => referer_test.go} (70%) delete mode 100644 net/http/roundtripware/referrer.go diff --git a/net/http/context/referrer.go b/net/http/context/referrer.go index cba2266..2c04a55 100644 --- a/net/http/context/referrer.go +++ b/net/http/context/referrer.go @@ -4,16 +4,16 @@ import ( "context" ) -const ContextKeyReferrer contextKey = "referrer" +const ContextKeyReferer contextKey = "referer" -func GetReferrer(ctx context.Context) (string, bool) { - if value, ok := ctx.Value(ContextKeyReferrer).(string); ok { +func GetReferer(ctx context.Context) (string, bool) { + if value, ok := ctx.Value(ContextKeyReferer).(string); ok { return value, true } else { return "", false } } -func SetReferrer(ctx context.Context, referer string) context.Context { - return context.WithValue(ctx, ContextKeyReferrer, referer) +func SetReferer(ctx context.Context, referer string) context.Context { + return context.WithValue(ctx, ContextKeyReferer, referer) } diff --git a/net/http/header.go b/net/http/header.go index 7d48c1f..2f8235f 100644 --- a/net/http/header.go +++ b/net/http/header.go @@ -15,7 +15,6 @@ const ( HeaderLastModified = "Last-Modified" HeaderLocation = "Location" HeaderUpgrade = "Upgrade" - HeaderReferrer = "Referer" HeaderVary = "Vary" HeaderWWWAuthenticate = "WWW-Authenticate" HeaderXForwardedHost = "X-Forwarded-Host" @@ -37,7 +36,7 @@ const ( HeaderServer = "Server" HeaderTrueClientIP = "True-Client-Ip" HeaderOrigin = "Origin" - HeaderXReferrer = "X-Referrer" + HeaderXReferer = "X-Referer" HeaderUserAgent = "User-Agent" // Cloudflare diff --git a/net/http/middleware/referrer.go b/net/http/middleware/referrer.go index a42b2c3..c9b1448 100644 --- a/net/http/middleware/referrer.go +++ b/net/http/middleware/referrer.go @@ -18,7 +18,7 @@ type ( // GetDefaultRefererOptions returns the default options func GetDefaultRefererOptions() RefererOptions { return RefererOptions{ - RequestHeader: []string{"X-Referer", "X-Referrer", "Referer", "Referrer"}, + RequestHeader: []string{"X-Referer", "Referer"}, SetContext: true, } } @@ -59,7 +59,7 @@ func RefererWithOptions(opts RefererOptions) Middleware { } } if referer != "" && opts.SetContext { - r = r.WithContext(context.SetReferrer(r.Context(), referer)) + r = r.WithContext(context.SetReferer(r.Context(), referer)) } next.ServeHTTP(w, r) }) diff --git a/net/http/roundtripware/referer.go b/net/http/roundtripware/referer.go new file mode 100644 index 0000000..42d43fe --- /dev/null +++ b/net/http/roundtripware/referer.go @@ -0,0 +1,50 @@ +package roundtripware + +import ( + "net/http" + + "go.uber.org/zap" + + keelhttpcontext "github.com/foomo/keel/net/http/context" +) + +type ( + RefererOptions struct { + Header string + } + RefererOption func(*RefererOptions) +) + +// GetDefaultRefererOptions returns the default options +func GetDefaultRefererOptions() RefererOptions { + return RefererOptions{ + Header: "X-Referer", + } +} + +// RefererWithHeader middleware option +func RefererWithHeader(v string) RefererOption { + return func(o *RefererOptions) { + o.Header = v + } +} + +// Referer returns a RoundTripper which prints out the request & response object +func Referer(opts ...RefererOption) RoundTripware { + o := GetDefaultRefererOptions() + for _, opt := range opts { + if opt != nil { + opt(&o) + } + } + return func(l *zap.Logger, next Handler) Handler { + return func(r *http.Request) (*http.Response, error) { + if value := r.Header.Get(o.Header); value == "" { + if value, ok := keelhttpcontext.GetReferer(r.Context()); ok && value != "" { + r.Header.Set(o.Header, value) + } + } + return next(r) + } + } +} diff --git a/net/http/roundtripware/referrer_test.go b/net/http/roundtripware/referer_test.go similarity index 70% rename from net/http/roundtripware/referrer_test.go rename to net/http/roundtripware/referer_test.go index 79aeaaf..0c91cdd 100644 --- a/net/http/roundtripware/referrer_test.go +++ b/net/http/roundtripware/referer_test.go @@ -15,16 +15,16 @@ import ( "github.com/foomo/keel/net/http/roundtripware" ) -func TestReferrer(t *testing.T) { - var testReferrer string +func TestReferer(t *testing.T) { + var testReferer string // create logger l := zaptest.NewLogger(t) // create http server with handler svr := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - testReferrer = r.Header.Get(keelhttp.HeaderXReferrer) - assert.Empty(t, testReferrer) + testReferer = r.Header.Get(keelhttp.HeaderXReferer) + assert.Empty(t, testReferer) w.WriteHeader(http.StatusOK) })) defer svr.Close() @@ -32,7 +32,7 @@ func TestReferrer(t *testing.T) { // create http client client := keelhttp.NewHTTPClient( keelhttp.HTTPClientWithRoundTripware(l, - roundtripware.Referrer(), + roundtripware.Referer(), ), ) @@ -46,18 +46,18 @@ func TestReferrer(t *testing.T) { defer resp.Body.Close() // validate - assert.Equal(t, testReferrer, req.Header.Get(keelhttp.HeaderXReferrer)) + assert.Equal(t, testReferer, req.Header.Get(keelhttp.HeaderXReferer)) } -func TestReferrer_Context(t *testing.T) { - testReferrer := "https://foomo.org/" +func TestReferer_Context(t *testing.T) { + testReferer := "https://foomo.org/" // create logger l := zaptest.NewLogger(t) // create http server with handler svr := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - assert.Equal(t, testReferrer, r.Header.Get(keelhttp.HeaderXReferrer)) + assert.Equal(t, testReferer, r.Header.Get(keelhttp.HeaderXReferer)) w.WriteHeader(http.StatusOK) })) defer svr.Close() @@ -65,12 +65,12 @@ func TestReferrer_Context(t *testing.T) { // create http client client := keelhttp.NewHTTPClient( keelhttp.HTTPClientWithRoundTripware(l, - roundtripware.Referrer(), + roundtripware.Referer(), ), ) // set request id on context - ctx := keelhttpcontext.SetReferrer(context.Background(), testReferrer) + ctx := keelhttpcontext.SetReferer(context.Background(), testReferer) // create request req, err := http.NewRequestWithContext(ctx, http.MethodGet, svr.URL, nil) @@ -82,11 +82,11 @@ func TestReferrer_Context(t *testing.T) { defer resp.Body.Close() // validate - assert.Equal(t, testReferrer, req.Header.Get(keelhttp.HeaderXReferrer)) + assert.Equal(t, testReferer, req.Header.Get(keelhttp.HeaderXReferer)) } -func TestReferrer_WithHeader(t *testing.T) { - testReferrer := "https://foomo.org/" +func TestReferer_WithHeader(t *testing.T) { + testReferer := "https://foomo.org/" testHeader := "X-Custom-Header" // create logger @@ -94,7 +94,7 @@ func TestReferrer_WithHeader(t *testing.T) { // create http server with handler svr := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - assert.Equal(t, testReferrer, r.Header.Get(testHeader)) + assert.Equal(t, testReferer, r.Header.Get(testHeader)) w.WriteHeader(http.StatusOK) })) defer svr.Close() @@ -102,14 +102,14 @@ func TestReferrer_WithHeader(t *testing.T) { // create http client client := keelhttp.NewHTTPClient( keelhttp.HTTPClientWithRoundTripware(l, - roundtripware.Referrer( - roundtripware.ReferrerWithHeader(testHeader), + roundtripware.Referer( + roundtripware.RefererWithHeader(testHeader), ), ), ) // set request id on context - ctx := keelhttpcontext.SetReferrer(context.Background(), testReferrer) + ctx := keelhttpcontext.SetReferer(context.Background(), testReferer) // create request req, err := http.NewRequestWithContext(ctx, http.MethodGet, svr.URL, nil) @@ -121,5 +121,5 @@ func TestReferrer_WithHeader(t *testing.T) { defer resp.Body.Close() // validate - assert.Equal(t, testReferrer, req.Header.Get(testHeader)) + assert.Equal(t, testReferer, req.Header.Get(testHeader)) } diff --git a/net/http/roundtripware/referrer.go b/net/http/roundtripware/referrer.go deleted file mode 100644 index a644a50..0000000 --- a/net/http/roundtripware/referrer.go +++ /dev/null @@ -1,51 +0,0 @@ -package roundtripware - -import ( - "net/http" - - "go.uber.org/zap" - - keelhttpcontext "github.com/foomo/keel/net/http/context" -) - -type ( - ReferrerOptions struct { - Header string - } - ReferrerOption func(*ReferrerOptions) - ReferrerGenerator func() string -) - -// GetDefaultReferrerOptions returns the default options -func GetDefaultReferrerOptions() ReferrerOptions { - return ReferrerOptions{ - Header: "X-Referrer", - } -} - -// ReferrerWithHeader middleware option -func ReferrerWithHeader(v string) ReferrerOption { - return func(o *ReferrerOptions) { - o.Header = v - } -} - -// Referrer returns a RoundTripper which prints out the request & response object -func Referrer(opts ...ReferrerOption) RoundTripware { - o := GetDefaultReferrerOptions() - for _, opt := range opts { - if opt != nil { - opt(&o) - } - } - return func(l *zap.Logger, next Handler) Handler { - return func(r *http.Request) (*http.Response, error) { - if value := r.Header.Get(o.Header); value == "" { - if value, ok := keelhttpcontext.GetReferrer(r.Context()); ok && value != "" { - r.Header.Set(o.Header, value) - } - } - return next(r) - } - } -} From 57b07298f6b2d606dd9eedfbc869865ff111a85f Mon Sep 17 00:00:00 2001 From: franklin Date: Mon, 10 Jul 2023 08:53:20 +0200 Subject: [PATCH 016/134] wip: add gotsrpc errors --- go.mod | 8 ++++---- go.sum | 17 ++++++++--------- integration/gotsrpc/net/middleware/telemetry.go | 13 ++++++++++++- 3 files changed, 24 insertions(+), 14 deletions(-) diff --git a/go.mod b/go.mod index a6432b5..fdaeb8f 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.20 require ( github.com/avast/retry-go v3.0.0+incompatible - github.com/foomo/gotsrpc/v2 v2.6.2 + github.com/foomo/gotsrpc/v2 v2.7.1-0.20230710064745-092c92a2fd86 github.com/go-logr/logr v1.2.3 github.com/golang-jwt/jwt v3.2.2+incompatible github.com/google/uuid v1.3.0 @@ -115,7 +115,7 @@ require ( github.com/subosito/gotenv v1.4.2 // indirect github.com/tklauser/go-sysconf v0.3.10 // indirect github.com/tklauser/numcpus v0.4.0 // indirect - github.com/ugorji/go/codec v1.2.7 // indirect + github.com/ugorji/go/codec v1.2.11 // indirect github.com/xdg-go/pbkdf2 v1.0.0 // indirect github.com/xdg-go/scram v1.1.1 // indirect github.com/xdg-go/stringprep v1.0.3 // indirect @@ -131,13 +131,13 @@ require ( go.opentelemetry.io/proto/otlp v0.16.0 // indirect go.uber.org/atomic v1.9.0 // indirect go.uber.org/multierr v1.8.0 // indirect - golang.org/x/mod v0.8.0 // indirect + golang.org/x/mod v0.9.0 // indirect golang.org/x/net v0.8.0 // indirect golang.org/x/oauth2 v0.4.0 // indirect golang.org/x/sys v0.6.0 // indirect golang.org/x/text v0.8.0 // indirect golang.org/x/time v0.1.0 // indirect - golang.org/x/tools v0.6.0 // indirect + golang.org/x/tools v0.7.0 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect google.golang.org/api v0.107.0 // indirect google.golang.org/appengine v1.6.7 // indirect diff --git a/go.sum b/go.sum index 2a0fe4d..9947259 100644 --- a/go.sum +++ b/go.sum @@ -121,8 +121,8 @@ github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/felixge/httpsnoop v1.0.2 h1:+nS9g82KMXccJ/wp0zyRW9ZBHFETmMGtkk+2CTTrW4o= github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/foomo/gotsrpc/v2 v2.6.2 h1:T4oJJCfnXW862ORBxKHTcg3d6oxFDfjFm2pIylkRFSA= -github.com/foomo/gotsrpc/v2 v2.6.2/go.mod h1:O9YjG1jCyseJLroaQQ24NLsuteCHL6wikIItXiv2I8w= +github.com/foomo/gotsrpc/v2 v2.7.1-0.20230710064745-092c92a2fd86 h1:g1j/myDQfjEPKOuDZi7uotQ6/TsGDyjnFVZ7pN7uNsE= +github.com/foomo/gotsrpc/v2 v2.7.1-0.20230710064745-092c92a2fd86/go.mod h1:n5SiKVNCZ7Tob6wcROWT5Sx1i/W42+ErpTbNqT3etM8= github.com/foomo/opentelemetry-go-contrib/instrumentation/net/http/otelhttp v0.32.1-0.20220517120905-10e2553b9bac h1:z8UXpHe2Hb9IzRawoeT49eUcxgGUY6g8Emj8TpUWl+4= github.com/foomo/opentelemetry-go-contrib/instrumentation/net/http/otelhttp v0.32.1-0.20220517120905-10e2553b9bac/go.mod h1:5eCOqeGphOyz6TsY3ZDNjE33SM/TFAK3RGuCL2naTgY= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= @@ -490,9 +490,8 @@ github.com/tklauser/go-sysconf v0.3.10/go.mod h1:C8XykCvCb+Gn0oNCWPIlcb0RuglQTYa github.com/tklauser/numcpus v0.4.0 h1:E53Dm1HjH1/R2/aoCtXtPgzmElmn51aOkhCFSuZq//o= github.com/tklauser/numcpus v0.4.0/go.mod h1:1+UI3pD8NW14VMwdgJNJ1ESk2UnwhAnz5hMwiKKqXCQ= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= -github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M= -github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0= -github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= +github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= +github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs= @@ -642,8 +641,8 @@ golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs= +golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= 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-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -872,8 +871,8 @@ golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= -golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= +golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/integration/gotsrpc/net/middleware/telemetry.go b/integration/gotsrpc/net/middleware/telemetry.go index 79a004a..5082045 100644 --- a/integration/gotsrpc/net/middleware/telemetry.go +++ b/integration/gotsrpc/net/middleware/telemetry.go @@ -2,6 +2,7 @@ package keelgotsrpcmiddleware import ( "net/http" + "strconv" "time" "github.com/foomo/gotsrpc/v2" @@ -20,6 +21,9 @@ const ( defaultGOTSRPCServiceLabel = "gotsrpc_service" defaultGOTSRPCPackageLabel = "gotsrpc_package" defaultGOTSRPCPackageOperation = "gotsrpc_operation" + defaultGOTSRPCError = "gotsrpc_error" + defaultGOTSRPCErrorCode = "gotsrpc_error_code" + defaultGOTSRPCErrorMessage = "gotsrpc_error_message" ) var ( @@ -27,7 +31,7 @@ var ( Name: "gotsrpc_request_duration_seconds", Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001}, Help: "Specifies the duration of gotsrpc request in seconds", - }, []string{defaultGOTSRPCFunctionLabel, defaultGOTSRPCServiceLabel, defaultGOTSRPCPackageLabel, defaultGOTSRPCPackageOperation}) + }, []string{defaultGOTSRPCFunctionLabel, defaultGOTSRPCServiceLabel, defaultGOTSRPCPackageLabel, defaultGOTSRPCPackageOperation, defaultGOTSRPCError}) ) // Telemetry middleware @@ -41,6 +45,12 @@ func Telemetry() middleware.Middleware { labeler.Add(attribute.String(defaultGOTSRPCFunctionLabel, stats.Func)) labeler.Add(attribute.String(defaultGOTSRPCServiceLabel, stats.Service)) labeler.Add(attribute.String(defaultGOTSRPCPackageLabel, stats.Package)) + if stats.ErrorCode != 0 { + labeler.Add(attribute.Int(defaultGOTSRPCErrorCode, stats.ErrorCode)) + } + if stats.ErrorMessage != "" { + labeler.Add(attribute.String(defaultGOTSRPCErrorMessage, stats.ErrorMessage)) + } observe := func(operation string, duration time.Duration) { gotsrpcRequestDurationSummary.WithLabelValues( @@ -48,6 +58,7 @@ func Telemetry() middleware.Middleware { stats.Service, stats.Package, operation, + strconv.FormatBool(stats.ErrorCode != 0), ).Observe(duration.Seconds()) } From 004b0cc8db455be6ff4eedf23351cfc964153a6f Mon Sep 17 00:00:00 2001 From: franklin Date: Mon, 10 Jul 2023 09:04:15 +0200 Subject: [PATCH 017/134] wip: bump gotsrpc --- go.mod | 2 +- go.sum | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index fdaeb8f..c7b65a2 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.20 require ( github.com/avast/retry-go v3.0.0+incompatible - github.com/foomo/gotsrpc/v2 v2.7.1-0.20230710064745-092c92a2fd86 + github.com/foomo/gotsrpc/v2 v2.7.1-0.20230710070331-3d520949b454 github.com/go-logr/logr v1.2.3 github.com/golang-jwt/jwt v3.2.2+incompatible github.com/google/uuid v1.3.0 diff --git a/go.sum b/go.sum index 9947259..212cb1a 100644 --- a/go.sum +++ b/go.sum @@ -123,6 +123,8 @@ github.com/felixge/httpsnoop v1.0.2 h1:+nS9g82KMXccJ/wp0zyRW9ZBHFETmMGtkk+2CTTrW github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/foomo/gotsrpc/v2 v2.7.1-0.20230710064745-092c92a2fd86 h1:g1j/myDQfjEPKOuDZi7uotQ6/TsGDyjnFVZ7pN7uNsE= github.com/foomo/gotsrpc/v2 v2.7.1-0.20230710064745-092c92a2fd86/go.mod h1:n5SiKVNCZ7Tob6wcROWT5Sx1i/W42+ErpTbNqT3etM8= +github.com/foomo/gotsrpc/v2 v2.7.1-0.20230710070331-3d520949b454 h1:VXL2V7Gi6MhEgHRqo6E+ycAdP7HHaNBBdfhzfd/isLY= +github.com/foomo/gotsrpc/v2 v2.7.1-0.20230710070331-3d520949b454/go.mod h1:n5SiKVNCZ7Tob6wcROWT5Sx1i/W42+ErpTbNqT3etM8= github.com/foomo/opentelemetry-go-contrib/instrumentation/net/http/otelhttp v0.32.1-0.20220517120905-10e2553b9bac h1:z8UXpHe2Hb9IzRawoeT49eUcxgGUY6g8Emj8TpUWl+4= github.com/foomo/opentelemetry-go-contrib/instrumentation/net/http/otelhttp v0.32.1-0.20220517120905-10e2553b9bac/go.mod h1:5eCOqeGphOyz6TsY3ZDNjE33SM/TFAK3RGuCL2naTgY= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= @@ -219,6 +221,7 @@ github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/ 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= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= From a2df70a504be994d4b61c99d148141b285127c21 Mon Sep 17 00:00:00 2001 From: franklin Date: Mon, 10 Jul 2023 09:37:35 +0200 Subject: [PATCH 018/134] wip: switch to middleware labaler --- .../gotsrpc/net/middleware/telemetry.go | 47 +++++++++---------- 1 file changed, 23 insertions(+), 24 deletions(-) diff --git a/integration/gotsrpc/net/middleware/telemetry.go b/integration/gotsrpc/net/middleware/telemetry.go index 5082045..1a89579 100644 --- a/integration/gotsrpc/net/middleware/telemetry.go +++ b/integration/gotsrpc/net/middleware/telemetry.go @@ -8,8 +8,6 @@ import ( "github.com/foomo/gotsrpc/v2" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" - "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" - "go.opentelemetry.io/otel/attribute" "go.uber.org/zap" "github.com/foomo/keel/net/http/middleware" @@ -40,32 +38,33 @@ func Telemetry() middleware.Middleware { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { *r = *gotsrpc.RequestWithStatsContext(r) next.ServeHTTP(w, r) - if labeler, ok := otelhttp.LabelerFromContext(r.Context()); ok { - if stats, ok := gotsrpc.GetStatsForRequest(r); ok { - labeler.Add(attribute.String(defaultGOTSRPCFunctionLabel, stats.Func)) - labeler.Add(attribute.String(defaultGOTSRPCServiceLabel, stats.Service)) - labeler.Add(attribute.String(defaultGOTSRPCPackageLabel, stats.Package)) - if stats.ErrorCode != 0 { - labeler.Add(attribute.Int(defaultGOTSRPCErrorCode, stats.ErrorCode)) - } + if stats, ok := gotsrpc.GetStatsForRequest(r); ok { + _, labeler := middleware.LoggerLabelerFromContext(r.Context()) + labeler.Add( + zap.String(defaultGOTSRPCFunctionLabel, stats.Func), + zap.String(defaultGOTSRPCServiceLabel, stats.Service), + zap.String(defaultGOTSRPCPackageLabel, stats.Package), + ) + if stats.ErrorCode != 0 { + labeler.Add(zap.Int(defaultGOTSRPCErrorCode, stats.ErrorCode)) if stats.ErrorMessage != "" { - labeler.Add(attribute.String(defaultGOTSRPCErrorMessage, stats.ErrorMessage)) - } - - observe := func(operation string, duration time.Duration) { - gotsrpcRequestDurationSummary.WithLabelValues( - stats.Func, - stats.Service, - stats.Package, - operation, - strconv.FormatBool(stats.ErrorCode != 0), - ).Observe(duration.Seconds()) + labeler.Add(zap.String(defaultGOTSRPCErrorMessage, stats.ErrorMessage)) } + } - observe("marshalling", stats.Marshalling) - observe("unmarshalling", stats.Unmarshalling) - observe("execution", stats.Execution) + observe := func(operation string, duration time.Duration) { + gotsrpcRequestDurationSummary.WithLabelValues( + stats.Func, + stats.Service, + stats.Package, + operation, + strconv.FormatBool(stats.ErrorCode != 0), + ).Observe(duration.Seconds()) } + + observe("marshalling", stats.Marshalling) + observe("unmarshalling", stats.Unmarshalling) + observe("execution", stats.Execution) } }) } From 95e880216d27d79611e689972df4f6ace47c8c00 Mon Sep 17 00:00:00 2001 From: franklin Date: Mon, 10 Jul 2023 09:38:09 +0200 Subject: [PATCH 019/134] wip: switch to middleware labeler --- integration/gotsrpc/net/middleware/telemetry.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/integration/gotsrpc/net/middleware/telemetry.go b/integration/gotsrpc/net/middleware/telemetry.go index 1a89579..8fed1c4 100644 --- a/integration/gotsrpc/net/middleware/telemetry.go +++ b/integration/gotsrpc/net/middleware/telemetry.go @@ -37,9 +37,9 @@ func Telemetry() middleware.Middleware { return func(l *zap.Logger, name string, next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { *r = *gotsrpc.RequestWithStatsContext(r) - next.ServeHTTP(w, r) + ctx, labeler := middleware.LoggerLabelerFromContext(r.Context()) + next.ServeHTTP(w, r.WithContext(ctx)) if stats, ok := gotsrpc.GetStatsForRequest(r); ok { - _, labeler := middleware.LoggerLabelerFromContext(r.Context()) labeler.Add( zap.String(defaultGOTSRPCFunctionLabel, stats.Func), zap.String(defaultGOTSRPCServiceLabel, stats.Service), From fd37e0deee4b61f62b6da7c1dda6489a3188382b Mon Sep 17 00:00:00 2001 From: franklin Date: Mon, 10 Jul 2023 09:45:00 +0200 Subject: [PATCH 020/134] feat: always inject labeler --- .../gotsrpc/net/middleware/telemetry.go | 8 +++- net/http/middleware/logger.go | 28 ++++--------- net/http/middleware/logger_test.go | 39 ------------------- 3 files changed, 14 insertions(+), 61 deletions(-) diff --git a/integration/gotsrpc/net/middleware/telemetry.go b/integration/gotsrpc/net/middleware/telemetry.go index 8fed1c4..17c927a 100644 --- a/integration/gotsrpc/net/middleware/telemetry.go +++ b/integration/gotsrpc/net/middleware/telemetry.go @@ -37,8 +37,12 @@ func Telemetry() middleware.Middleware { return func(l *zap.Logger, name string, next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { *r = *gotsrpc.RequestWithStatsContext(r) - ctx, labeler := middleware.LoggerLabelerFromContext(r.Context()) - next.ServeHTTP(w, r.WithContext(ctx)) + + // retrieve or inject labeler + r, labeler := middleware.LoggerLabelerFromRequest(r) + + next.ServeHTTP(w, r) + if stats, ok := gotsrpc.GetStatsForRequest(r); ok { labeler.Add( zap.String(defaultGOTSRPCFunctionLabel, stats.Func), diff --git a/net/http/middleware/logger.go b/net/http/middleware/logger.go index aaea0ab..380ce05 100644 --- a/net/http/middleware/logger.go +++ b/net/http/middleware/logger.go @@ -15,10 +15,9 @@ const loggerLabelerContextKey log.LabelerContextKey = "github.com/foomo/keel/net type ( LoggerOptions struct { - Message string - MinWarnCode int - MinErrorCode int - InjectLabeler bool + Message string + MinWarnCode int + MinErrorCode int } LoggerOption func(*LoggerOptions) ) @@ -26,10 +25,9 @@ type ( // GetDefaultLoggerOptions returns the default options func GetDefaultLoggerOptions() LoggerOptions { return LoggerOptions{ - Message: "handled http request", - MinWarnCode: 400, - MinErrorCode: 500, - InjectLabeler: false, + Message: "handled http request", + MinWarnCode: 400, + MinErrorCode: 500, } } @@ -65,13 +63,6 @@ func LoggerWithMinErrorCode(v int) LoggerOption { } } -// LoggerWithInjectLabeler middleware option -func LoggerWithInjectLabeler(v bool) LoggerOption { - return func(o *LoggerOptions) { - o.InjectLabeler = v - } -} - // LoggerWithOptions middleware func LoggerWithOptions(opts LoggerOptions) Middleware { return func(l *zap.Logger, name string, next http.Handler) http.Handler { @@ -83,11 +74,8 @@ func LoggerWithOptions(opts LoggerOptions) Middleware { l := log.WithHTTPRequest(l, r) - var labeler *log.Labeler - - if opts.InjectLabeler { - r, labeler = LoggerLabelerFromRequest(r) - } + // retrieve or inject labeler + r, labeler := LoggerLabelerFromRequest(r) next.ServeHTTP(wr, r) diff --git a/net/http/middleware/logger_test.go b/net/http/middleware/logger_test.go index faf7d3b..da47b2f 100644 --- a/net/http/middleware/logger_test.go +++ b/net/http/middleware/logger_test.go @@ -7,7 +7,6 @@ import ( "github.com/foomo/keel/log" "github.com/foomo/keel/net/http/middleware" keeltest "github.com/foomo/keel/test" - "go.uber.org/zap" ) func ExampleLogger() { @@ -38,41 +37,3 @@ func ExampleLogger() { // Output: ok } - -func ExampleLoggerWithInjectLabeler() { - svr := keeltest.NewServer() - - // get logger - l := svr.Logger() - - // create demo service - svs := http.NewServeMux() - svs.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { - w.WriteHeader(http.StatusOK) - _, _ = w.Write([]byte("ok")) - fmt.Println("ok") - }) - - svr.AddService( - keeltest.NewServiceHTTP(l, "demo", svs, - func(l *zap.Logger, s string, next http.Handler) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - r, labeler := middleware.LoggerLabelerFromRequest(r) - labeler.Add(zap.String("injected", "message")) - next.ServeHTTP(w, r) - }) - }, - middleware.Logger( - middleware.LoggerWithInjectLabeler(true), - ), - ), - ) - - svr.Start() - - resp, err := http.Get(svr.GetService("demo").URL() + "/") //nolint:noctx - log.Must(l, err) - defer resp.Body.Close() - - // Output: ok -} From da9e516c94969d790772d0913373c5ba1bc92092 Mon Sep 17 00:00:00 2001 From: franklin Date: Mon, 10 Jul 2023 09:58:09 +0200 Subject: [PATCH 021/134] feat: change labeler signiture --- .../gotsrpc/net/middleware/telemetry.go | 23 +++++------ log/labeler.go | 6 +-- net/http/middleware/logger.go | 37 +++++++++++------ net/http/middleware/logger_test.go | 40 +++++++++++++++++++ 4 files changed, 79 insertions(+), 27 deletions(-) diff --git a/integration/gotsrpc/net/middleware/telemetry.go b/integration/gotsrpc/net/middleware/telemetry.go index 17c927a..d3c5b83 100644 --- a/integration/gotsrpc/net/middleware/telemetry.go +++ b/integration/gotsrpc/net/middleware/telemetry.go @@ -38,21 +38,20 @@ func Telemetry() middleware.Middleware { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { *r = *gotsrpc.RequestWithStatsContext(r) - // retrieve or inject labeler - r, labeler := middleware.LoggerLabelerFromRequest(r) - next.ServeHTTP(w, r) if stats, ok := gotsrpc.GetStatsForRequest(r); ok { - labeler.Add( - zap.String(defaultGOTSRPCFunctionLabel, stats.Func), - zap.String(defaultGOTSRPCServiceLabel, stats.Service), - zap.String(defaultGOTSRPCPackageLabel, stats.Package), - ) - if stats.ErrorCode != 0 { - labeler.Add(zap.Int(defaultGOTSRPCErrorCode, stats.ErrorCode)) - if stats.ErrorMessage != "" { - labeler.Add(zap.String(defaultGOTSRPCErrorMessage, stats.ErrorMessage)) + if labeler, ok := middleware.LoggerLabelerFromRequest(r); ok { + labeler.Add( + zap.String(defaultGOTSRPCFunctionLabel, stats.Func), + zap.String(defaultGOTSRPCServiceLabel, stats.Service), + zap.String(defaultGOTSRPCPackageLabel, stats.Package), + ) + if stats.ErrorCode != 0 { + labeler.Add(zap.Int(defaultGOTSRPCErrorCode, stats.ErrorCode)) + if stats.ErrorMessage != "" { + labeler.Add(zap.String(defaultGOTSRPCErrorMessage, stats.ErrorMessage)) + } } } diff --git a/log/labeler.go b/log/labeler.go index 0f98b6c..3532bb8 100644 --- a/log/labeler.go +++ b/log/labeler.go @@ -35,9 +35,9 @@ func InjectLabeler(ctx context.Context, key LabelerContextKey) (context.Context, return context.WithValue(ctx, key, l), l } -func LabelerFromContext(ctx context.Context, key LabelerContextKey) (context.Context, *Labeler) { +func LabelerFromContext(ctx context.Context, key LabelerContextKey) (*Labeler, bool) { if l, ok := ctx.Value(key).(*Labeler); ok { - return ctx, l + return l, true } - return InjectLabeler(ctx, key) + return nil, false } diff --git a/net/http/middleware/logger.go b/net/http/middleware/logger.go index 380ce05..8a59c39 100644 --- a/net/http/middleware/logger.go +++ b/net/http/middleware/logger.go @@ -15,9 +15,10 @@ const loggerLabelerContextKey log.LabelerContextKey = "github.com/foomo/keel/net type ( LoggerOptions struct { - Message string - MinWarnCode int - MinErrorCode int + Message string + MinWarnCode int + MinErrorCode int + InjectLabeler bool } LoggerOption func(*LoggerOptions) ) @@ -25,9 +26,10 @@ type ( // GetDefaultLoggerOptions returns the default options func GetDefaultLoggerOptions() LoggerOptions { return LoggerOptions{ - Message: "handled http request", - MinWarnCode: 400, - MinErrorCode: 500, + Message: "handled http request", + MinWarnCode: 400, + MinErrorCode: 500, + InjectLabeler: true, } } @@ -63,6 +65,13 @@ func LoggerWithMinErrorCode(v int) LoggerOption { } } +// LoggerWithInjectLabeler middleware option +func LoggerWithInjectLabeler(v bool) LoggerOption { + return func(o *LoggerOptions) { + o.InjectLabeler = v + } +} + // LoggerWithOptions middleware func LoggerWithOptions(opts LoggerOptions) Middleware { return func(l *zap.Logger, name string, next http.Handler) http.Handler { @@ -74,8 +83,13 @@ func LoggerWithOptions(opts LoggerOptions) Middleware { l := log.WithHTTPRequest(l, r) - // retrieve or inject labeler - r, labeler := LoggerLabelerFromRequest(r) + var labeler *log.Labeler + + if labeler == nil && opts.InjectLabeler { + var labelerCtx context.Context + labelerCtx, labeler = log.InjectLabeler(r.Context(), loggerLabelerContextKey) + r = r.WithContext(labelerCtx) + } next.ServeHTTP(wr, r) @@ -101,11 +115,10 @@ func LoggerWithOptions(opts LoggerOptions) Middleware { } } -func LoggerLabelerFromContext(ctx context.Context) (context.Context, *log.Labeler) { +func LoggerLabelerFromContext(ctx context.Context) (*log.Labeler, bool) { return log.LabelerFromContext(ctx, loggerLabelerContextKey) } -func LoggerLabelerFromRequest(r *http.Request) (*http.Request, *log.Labeler) { - ctx, l := log.LabelerFromContext(r.Context(), loggerLabelerContextKey) - return r.WithContext(ctx), l +func LoggerLabelerFromRequest(r *http.Request) (*log.Labeler, bool) { + return log.LabelerFromContext(r.Context(), loggerLabelerContextKey) } diff --git a/net/http/middleware/logger_test.go b/net/http/middleware/logger_test.go index da47b2f..b86c473 100644 --- a/net/http/middleware/logger_test.go +++ b/net/http/middleware/logger_test.go @@ -7,6 +7,7 @@ import ( "github.com/foomo/keel/log" "github.com/foomo/keel/net/http/middleware" keeltest "github.com/foomo/keel/test" + "go.uber.org/zap" ) func ExampleLogger() { @@ -37,3 +38,42 @@ func ExampleLogger() { // Output: ok } + +func ExampleLoggerWithInjectLabeler() { + svr := keeltest.NewServer() + + // get logger + l := svr.Logger() + + // create demo service + svs := http.NewServeMux() + svs.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusOK) + _, _ = w.Write([]byte("ok")) + fmt.Println("ok") + }) + + svr.AddService( + keeltest.NewServiceHTTP(l, "demo", svs, + func(l *zap.Logger, s string, next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if labeler, ok := middleware.LoggerLabelerFromRequest(r); ok { + labeler.Add(zap.String("injected", "message")) + } + next.ServeHTTP(w, r) + }) + }, + middleware.Logger( + middleware.LoggerWithInjectLabeler(true), + ), + ), + ) + + svr.Start() + + resp, err := http.Get(svr.GetService("demo").URL() + "/") //nolint:noctx + log.Must(l, err) + defer resp.Body.Close() + + // Output: ok +} From 91f39d3f2624d6570aa79559f4aca579d2923d09 Mon Sep 17 00:00:00 2001 From: franklin Date: Mon, 10 Jul 2023 11:04:36 +0200 Subject: [PATCH 022/134] refactor: move labeler into separate package --- go.sum | 3 --- .../gotsrpc/net/middleware/telemetry.go | 3 ++- net/http/log/labeler.go | 27 +++++++++++++++++++ net/http/middleware/logger.go | 16 ++--------- net/http/middleware/logger_test.go | 3 ++- utils/net/http/errors.go | 13 ++++----- 6 files changed, 40 insertions(+), 25 deletions(-) create mode 100644 net/http/log/labeler.go diff --git a/go.sum b/go.sum index 212cb1a..658c799 100644 --- a/go.sum +++ b/go.sum @@ -121,8 +121,6 @@ github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/felixge/httpsnoop v1.0.2 h1:+nS9g82KMXccJ/wp0zyRW9ZBHFETmMGtkk+2CTTrW4o= github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/foomo/gotsrpc/v2 v2.7.1-0.20230710064745-092c92a2fd86 h1:g1j/myDQfjEPKOuDZi7uotQ6/TsGDyjnFVZ7pN7uNsE= -github.com/foomo/gotsrpc/v2 v2.7.1-0.20230710064745-092c92a2fd86/go.mod h1:n5SiKVNCZ7Tob6wcROWT5Sx1i/W42+ErpTbNqT3etM8= github.com/foomo/gotsrpc/v2 v2.7.1-0.20230710070331-3d520949b454 h1:VXL2V7Gi6MhEgHRqo6E+ycAdP7HHaNBBdfhzfd/isLY= github.com/foomo/gotsrpc/v2 v2.7.1-0.20230710070331-3d520949b454/go.mod h1:n5SiKVNCZ7Tob6wcROWT5Sx1i/W42+ErpTbNqT3etM8= github.com/foomo/opentelemetry-go-contrib/instrumentation/net/http/otelhttp v0.32.1-0.20220517120905-10e2553b9bac h1:z8UXpHe2Hb9IzRawoeT49eUcxgGUY6g8Emj8TpUWl+4= @@ -221,7 +219,6 @@ github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/ 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= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= diff --git a/integration/gotsrpc/net/middleware/telemetry.go b/integration/gotsrpc/net/middleware/telemetry.go index d3c5b83..528d1f8 100644 --- a/integration/gotsrpc/net/middleware/telemetry.go +++ b/integration/gotsrpc/net/middleware/telemetry.go @@ -6,6 +6,7 @@ import ( "time" "github.com/foomo/gotsrpc/v2" + httplog "github.com/foomo/keel/net/http/log" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" "go.uber.org/zap" @@ -41,7 +42,7 @@ func Telemetry() middleware.Middleware { next.ServeHTTP(w, r) if stats, ok := gotsrpc.GetStatsForRequest(r); ok { - if labeler, ok := middleware.LoggerLabelerFromRequest(r); ok { + if labeler, ok := httplog.LabelerFromRequest(r); ok { labeler.Add( zap.String(defaultGOTSRPCFunctionLabel, stats.Func), zap.String(defaultGOTSRPCServiceLabel, stats.Service), diff --git a/net/http/log/labeler.go b/net/http/log/labeler.go new file mode 100644 index 0000000..fe545f9 --- /dev/null +++ b/net/http/log/labeler.go @@ -0,0 +1,27 @@ +package log + +import ( + "context" + "net/http" + + "github.com/foomo/keel/log" +) + +const loggerLabelerContextKey log.LabelerContextKey = "github.com/foomo/keel/net/log.Labeler" + +func LabelerFromContext(ctx context.Context) (*log.Labeler, bool) { + return log.LabelerFromContext(ctx, loggerLabelerContextKey) +} + +func LabelerFromRequest(r *http.Request) (*log.Labeler, bool) { + return log.LabelerFromContext(r.Context(), loggerLabelerContextKey) +} + +func InjectLabelerIntoContext(ctx context.Context) (context.Context, *log.Labeler) { + return log.InjectLabeler(ctx, loggerLabelerContextKey) +} + +func InjectLabelerIntoRequest(r *http.Request) (*http.Request, *log.Labeler) { + ctx, labeler := InjectLabelerIntoContext(r.Context()) + return r.WithContext(ctx), labeler +} diff --git a/net/http/middleware/logger.go b/net/http/middleware/logger.go index 8a59c39..7908f7a 100644 --- a/net/http/middleware/logger.go +++ b/net/http/middleware/logger.go @@ -1,18 +1,16 @@ package middleware import ( - "context" "net/http" "time" + httplog "github.com/foomo/keel/net/http/log" "go.uber.org/zap" "github.com/foomo/keel/log" keeltime "github.com/foomo/keel/time" ) -const loggerLabelerContextKey log.LabelerContextKey = "github.com/foomo/keel/net/middleware.Logger" - type ( LoggerOptions struct { Message string @@ -86,9 +84,7 @@ func LoggerWithOptions(opts LoggerOptions) Middleware { var labeler *log.Labeler if labeler == nil && opts.InjectLabeler { - var labelerCtx context.Context - labelerCtx, labeler = log.InjectLabeler(r.Context(), loggerLabelerContextKey) - r = r.WithContext(labelerCtx) + r, labeler = httplog.InjectLabelerIntoRequest(r) } next.ServeHTTP(wr, r) @@ -114,11 +110,3 @@ func LoggerWithOptions(opts LoggerOptions) Middleware { }) } } - -func LoggerLabelerFromContext(ctx context.Context) (*log.Labeler, bool) { - return log.LabelerFromContext(ctx, loggerLabelerContextKey) -} - -func LoggerLabelerFromRequest(r *http.Request) (*log.Labeler, bool) { - return log.LabelerFromContext(r.Context(), loggerLabelerContextKey) -} diff --git a/net/http/middleware/logger_test.go b/net/http/middleware/logger_test.go index b86c473..78dd46c 100644 --- a/net/http/middleware/logger_test.go +++ b/net/http/middleware/logger_test.go @@ -5,6 +5,7 @@ import ( "net/http" "github.com/foomo/keel/log" + httplog "github.com/foomo/keel/net/http/log" "github.com/foomo/keel/net/http/middleware" keeltest "github.com/foomo/keel/test" "go.uber.org/zap" @@ -57,7 +58,7 @@ func ExampleLoggerWithInjectLabeler() { keeltest.NewServiceHTTP(l, "demo", svs, func(l *zap.Logger, s string, next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if labeler, ok := middleware.LoggerLabelerFromRequest(r); ok { + if labeler, ok := httplog.LabelerFromRequest(r); ok { labeler.Add(zap.String("injected", "message")) } next.ServeHTTP(w, r) diff --git a/utils/net/http/errors.go b/utils/net/http/errors.go index 4a001eb..2b83194 100644 --- a/utils/net/http/errors.go +++ b/utils/net/http/errors.go @@ -3,8 +3,7 @@ package httputils import ( "net/http" - "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" - "go.opentelemetry.io/otel/attribute" + httplog "github.com/foomo/keel/net/http/log" "go.uber.org/zap" "github.com/foomo/keel/log" @@ -43,11 +42,13 @@ func NotFoundServerError(l *zap.Logger, w http.ResponseWriter, r *http.Request, // ServerError http response func ServerError(l *zap.Logger, w http.ResponseWriter, r *http.Request, code int, err error) { if err != nil { - l = log.WithError(l, err) - if labeler, ok := otelhttp.LabelerFromContext(r.Context()); ok { - labeler.Add(attribute.Bool("error", true)) + if labeler, ok := httplog.LabelerFromRequest(r); ok { + labeler.Add(log.FErrorType(err), log.FError(err)) + } else { + l = log.WithError(l, err) + l = log.WithHTTPRequest(l, r) + l.Error("http server error", log.FHTTPStatusCode(code)) } - log.WithHTTPRequest(l, r).Error("http server error", log.FHTTPStatusCode(code)) // w.Header().Set(keelhttp.HeaderXError, err.Error()) TODO make configurable with better value http.Error(w, http.StatusText(code), code) } From b68e55a5be9f3c527bd75cb6fe7d783917e89eae Mon Sep 17 00:00:00 2001 From: franklin Date: Mon, 10 Jul 2023 11:18:51 +0200 Subject: [PATCH 023/134] fix: referer field --- log/with.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/log/with.go b/log/with.go index d95886f..7dd231a 100644 --- a/log/with.go +++ b/log/with.go @@ -81,7 +81,7 @@ func WithHTTPReferer(l *zap.Logger, r *http.Request) *zap.Logger { if value := r.Header.Get("X-Referer"); value != "" { return With(l, FHTTPReferer(value)) } else if value := r.Referer(); value != "" { - return With(l, FHTTPHost(value)) + return With(l, FHTTPReferer(value)) } else { return l } From 0de6d14415cc002364433c9dc7fdff4369a94dd3 Mon Sep 17 00:00:00 2001 From: franklin Date: Mon, 10 Jul 2023 12:22:16 +0200 Subject: [PATCH 024/134] feat: wrap server error --- utils/net/http/errors.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/utils/net/http/errors.go b/utils/net/http/errors.go index 2b83194..0bcb462 100644 --- a/utils/net/http/errors.go +++ b/utils/net/http/errors.go @@ -4,6 +4,7 @@ import ( "net/http" httplog "github.com/foomo/keel/net/http/log" + "github.com/pkg/errors" "go.uber.org/zap" "github.com/foomo/keel/log" @@ -43,7 +44,7 @@ func NotFoundServerError(l *zap.Logger, w http.ResponseWriter, r *http.Request, func ServerError(l *zap.Logger, w http.ResponseWriter, r *http.Request, code int, err error) { if err != nil { if labeler, ok := httplog.LabelerFromRequest(r); ok { - labeler.Add(log.FErrorType(err), log.FError(err)) + labeler.Add(log.FErrorType(err), log.FError(errors.Wrap(err, "http server error"))) } else { l = log.WithError(l, err) l = log.WithHTTPRequest(l, r) From f9a39f6c37120262c0b7ec6cc5abf5d73233a098 Mon Sep 17 00:00:00 2001 From: franklin Date: Tue, 11 Jul 2023 07:48:17 +0200 Subject: [PATCH 025/134] feat: add label --- net/http/middleware/telemetry.go | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/net/http/middleware/telemetry.go b/net/http/middleware/telemetry.go index d29238f..3a05dbd 100644 --- a/net/http/middleware/telemetry.go +++ b/net/http/middleware/telemetry.go @@ -3,6 +3,8 @@ package middleware import ( "net/http" + "github.com/foomo/keel/log" + httplog "github.com/foomo/keel/net/http/log" "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/metric" @@ -10,6 +12,7 @@ import ( "go.opentelemetry.io/otel/metric/instrument" "go.opentelemetry.io/otel/propagation" semconv "go.opentelemetry.io/otel/semconv/v1.10.0" + "go.opentelemetry.io/otel/trace" "go.uber.org/zap" ) @@ -84,13 +87,20 @@ func TelemetryWithOptions(opts TelemetryOptions) Middleware { otel.GetTextMapPropagator().Inject(r.Context(), propagation.HeaderCarrier(w.Header())) } + if labeler, ok := httplog.LabelerFromRequest(r); ok { + if spanCtx := trace.SpanContextFromContext(r.Context()); spanCtx.IsValid() { + labeler.Add(log.FTraceID(spanCtx.TraceID().String())) + } + } + // wrap response write to get access to status & size wr := WrapResponseWriter(w) next.ServeHTTP(wr, r) - labeler, _ := otelhttp.LabelerFromContext(r.Context()) - c.Add(r.Context(), 1, append(labeler.Get(), semconv.HTTPStatusCodeKey.Int(wr.StatusCode()))...) + if labeler, ok := otelhttp.LabelerFromContext(r.Context()); ok { + c.Add(r.Context(), 1, append(labeler.Get(), semconv.HTTPStatusCodeKey.Int(wr.StatusCode()))...) + } }), name, opts.OtelOpts...) } } From bcd4cd656c1b375d099dd213cb6e9fedc19d3a1f Mon Sep 17 00:00:00 2001 From: franklin Date: Tue, 11 Jul 2023 08:24:03 +0200 Subject: [PATCH 026/134] feat: update gotsrpc --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index c7b65a2..65d0410 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.20 require ( github.com/avast/retry-go v3.0.0+incompatible - github.com/foomo/gotsrpc/v2 v2.7.1-0.20230710070331-3d520949b454 + github.com/foomo/gotsrpc/v2 v2.7.1 github.com/go-logr/logr v1.2.3 github.com/golang-jwt/jwt v3.2.2+incompatible github.com/google/uuid v1.3.0 diff --git a/go.sum b/go.sum index 658c799..a9af41a 100644 --- a/go.sum +++ b/go.sum @@ -121,8 +121,8 @@ github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/felixge/httpsnoop v1.0.2 h1:+nS9g82KMXccJ/wp0zyRW9ZBHFETmMGtkk+2CTTrW4o= github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/foomo/gotsrpc/v2 v2.7.1-0.20230710070331-3d520949b454 h1:VXL2V7Gi6MhEgHRqo6E+ycAdP7HHaNBBdfhzfd/isLY= -github.com/foomo/gotsrpc/v2 v2.7.1-0.20230710070331-3d520949b454/go.mod h1:n5SiKVNCZ7Tob6wcROWT5Sx1i/W42+ErpTbNqT3etM8= +github.com/foomo/gotsrpc/v2 v2.7.1 h1:uY1lamAGrUbQK/AsQW1LcJ8HztDli5mTkdRQH7pkbv8= +github.com/foomo/gotsrpc/v2 v2.7.1/go.mod h1:n5SiKVNCZ7Tob6wcROWT5Sx1i/W42+ErpTbNqT3etM8= github.com/foomo/opentelemetry-go-contrib/instrumentation/net/http/otelhttp v0.32.1-0.20220517120905-10e2553b9bac h1:z8UXpHe2Hb9IzRawoeT49eUcxgGUY6g8Emj8TpUWl+4= github.com/foomo/opentelemetry-go-contrib/instrumentation/net/http/otelhttp v0.32.1-0.20220517120905-10e2553b9bac/go.mod h1:5eCOqeGphOyz6TsY3ZDNjE33SM/TFAK3RGuCL2naTgY= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= From f3ad71470dbe2093dbda1cf2a9118c1fff5ad892 Mon Sep 17 00:00:00 2001 From: franklin Date: Tue, 11 Jul 2023 08:31:44 +0200 Subject: [PATCH 027/134] revert: put back metrics --- .../gotsrpc/net/middleware/telemetry.go | 38 +++++++++++-------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/integration/gotsrpc/net/middleware/telemetry.go b/integration/gotsrpc/net/middleware/telemetry.go index 528d1f8..ebe0eb0 100644 --- a/integration/gotsrpc/net/middleware/telemetry.go +++ b/integration/gotsrpc/net/middleware/telemetry.go @@ -2,13 +2,14 @@ package keelgotsrpcmiddleware import ( "net/http" - "strconv" "time" "github.com/foomo/gotsrpc/v2" httplog "github.com/foomo/keel/net/http/log" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" + "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" + "go.opentelemetry.io/otel/attribute" "go.uber.org/zap" "github.com/foomo/keel/net/http/middleware" @@ -42,33 +43,40 @@ func Telemetry() middleware.Middleware { next.ServeHTTP(w, r) if stats, ok := gotsrpc.GetStatsForRequest(r); ok { - if labeler, ok := httplog.LabelerFromRequest(r); ok { - labeler.Add( - zap.String(defaultGOTSRPCFunctionLabel, stats.Func), - zap.String(defaultGOTSRPCServiceLabel, stats.Service), - zap.String(defaultGOTSRPCPackageLabel, stats.Package), - ) - if stats.ErrorCode != 0 { - labeler.Add(zap.Int(defaultGOTSRPCErrorCode, stats.ErrorCode)) - if stats.ErrorMessage != "" { - labeler.Add(zap.String(defaultGOTSRPCErrorMessage, stats.ErrorMessage)) - } - } + // enricht otel http metrics + if labeler, ok := otelhttp.LabelerFromContext(r.Context()); ok { + labeler.Add(attribute.String(defaultGOTSRPCFunctionLabel, stats.Func)) + labeler.Add(attribute.String(defaultGOTSRPCServiceLabel, stats.Service)) + labeler.Add(attribute.String(defaultGOTSRPCPackageLabel, stats.Package)) } + // create custom metics observe := func(operation string, duration time.Duration) { gotsrpcRequestDurationSummary.WithLabelValues( stats.Func, stats.Service, stats.Package, operation, - strconv.FormatBool(stats.ErrorCode != 0), ).Observe(duration.Seconds()) } - observe("marshalling", stats.Marshalling) observe("unmarshalling", stats.Unmarshalling) observe("execution", stats.Execution) + + // enrich logger + if labeler, ok := httplog.LabelerFromRequest(r); ok { + labeler.Add( + zap.String(defaultGOTSRPCFunctionLabel, stats.Func), + zap.String(defaultGOTSRPCServiceLabel, stats.Service), + zap.String(defaultGOTSRPCPackageLabel, stats.Package), + ) + if stats.ErrorCode != 0 { + labeler.Add(zap.Int(defaultGOTSRPCErrorCode, stats.ErrorCode)) + if stats.ErrorMessage != "" { + labeler.Add(zap.String(defaultGOTSRPCErrorMessage, stats.ErrorMessage)) + } + } + } } }) } From de72176a05f5a606178f3d65796c6a66ac0982c4 Mon Sep 17 00:00:00 2001 From: franklin Date: Tue, 11 Jul 2023 08:38:13 +0200 Subject: [PATCH 028/134] fix: label num --- integration/gotsrpc/net/middleware/telemetry.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/integration/gotsrpc/net/middleware/telemetry.go b/integration/gotsrpc/net/middleware/telemetry.go index ebe0eb0..8136218 100644 --- a/integration/gotsrpc/net/middleware/telemetry.go +++ b/integration/gotsrpc/net/middleware/telemetry.go @@ -2,6 +2,7 @@ package keelgotsrpcmiddleware import ( "net/http" + "strconv" "time" "github.com/foomo/gotsrpc/v2" @@ -57,6 +58,7 @@ func Telemetry() middleware.Middleware { stats.Service, stats.Package, operation, + strconv.FormatBool(stats.ErrorCode != 0), ).Observe(duration.Seconds()) } observe("marshalling", stats.Marshalling) From e1aa3e0a1bc570cd534fd6f1a8bc2598659245c0 Mon Sep 17 00:00:00 2001 From: franklin Date: Tue, 8 Aug 2023 17:34:42 +0200 Subject: [PATCH 029/134] feat: add pprof http service --- servicehttppprof.go | 17 ++++++++++++++ servicehttppprof_pprof.go | 49 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 servicehttppprof.go create mode 100644 servicehttppprof_pprof.go diff --git a/servicehttppprof.go b/servicehttppprof.go new file mode 100644 index 0000000..e6dccb9 --- /dev/null +++ b/servicehttppprof.go @@ -0,0 +1,17 @@ +//go:build !pprof + +package keel + +import ( + keelconfig "github.com/foomo/keel/config" + "github.com/foomo/keel/log" +) + +// WithPProfService option with default value +func WithPProfService(enabled bool) Option { + return func(inst *Server) { + if keelconfig.GetBool(inst.Config(), "service.pprof.enabled", enabled)() { + log.Logger().Debug("build your binary with the `-tag pprof` to enable this service") + } + } +} diff --git a/servicehttppprof_pprof.go b/servicehttppprof_pprof.go new file mode 100644 index 0000000..430ed4b --- /dev/null +++ b/servicehttppprof_pprof.go @@ -0,0 +1,49 @@ +//go:build pprof +// +build pprof + +package keel + +import ( + "net/http" + "net/http/pprof" + + keelconfig "github.com/foomo/keel/config" + "github.com/foomo/keel/log" + "go.uber.org/zap" +) + +const ( + DefaultServiceHTTPPProfName = "pprof" + DefaultServiceHTTPPProfAddr = "localhost:6060" + DefaultServiceHTTPPProfPath = "/debug/pprof" +) + +func NewServiceHTTPPProf(l *zap.Logger, name, addr, path string) *ServiceHTTP { + handler := http.NewServeMux() + handler.HandleFunc(path+"/", pprof.Index) + handler.HandleFunc(path+"/cmdline", pprof.Cmdline) + handler.HandleFunc(path+"/profile", pprof.Profile) + handler.HandleFunc(path+"/symbol", pprof.Symbol) + handler.HandleFunc(path+"/trace", pprof.Trace) + return NewServiceHTTP(l, name, addr, handler) +} + +func NewDefaultServiceHTTPPProf() *ServiceHTTP { + return NewServiceHTTPPProf( + log.Logger(), + DefaultServiceHTTPPProfName, + DefaultServiceHTTPPProfAddr, + DefaultServiceHTTPPProfPath, + ) +} + +// WithPProfService option with default value +func WithPProfService(enabled bool) Option { + return func(inst *Server) { + if keelconfig.GetBool(inst.Config(), "service.pprof.enabled", enabled)() { + service := NewDefaultServiceHTTPPProf() + inst.initServices = append(inst.initServices, service) + inst.AddAlwaysHealthzers(service) + } + } +} From 7e2f6de992da89c2afa603b94622bbd22bd98e27 Mon Sep 17 00:00:00 2001 From: franklin Date: Wed, 9 Aug 2023 07:09:59 +0200 Subject: [PATCH 030/134] fix: omit race condition --- servicehttp.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/servicehttp.go b/servicehttp.go index e798576..a1e3cc4 100644 --- a/servicehttp.go +++ b/servicehttp.go @@ -5,6 +5,7 @@ import ( "net" "net/http" "strings" + "sync/atomic" "github.com/pkg/errors" "go.uber.org/zap" @@ -15,7 +16,7 @@ import ( // ServiceHTTP struct type ServiceHTTP struct { - running bool + running atomic.Bool server *http.Server name string l *zap.Logger @@ -44,7 +45,7 @@ func (s *ServiceHTTP) Name() string { } func (s *ServiceHTTP) Healthz() error { - if !s.running { + if !s.running.Load() { return ErrServiceNotRunning } return nil @@ -62,9 +63,9 @@ func (s *ServiceHTTP) Start(ctx context.Context) error { s.l.Info("starting http service", fields...) s.server.BaseContext = func(_ net.Listener) context.Context { return ctx } s.server.RegisterOnShutdown(func() { - s.running = false + s.running.Store(false) }) - s.running = true + s.running.Store(true) if err := s.server.ListenAndServe(); !errors.Is(err, http.ErrServerClosed) { log.WithError(s.l, err).Error("service error") return err From 8f6a82328719dc5a7567cf6b7bc0d5abd2c40590 Mon Sep 17 00:00:00 2001 From: franklin Date: Wed, 9 Aug 2023 07:51:35 +0200 Subject: [PATCH 031/134] fix: omit race condition --- server.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/server.go b/server.go index 08b834a..b38c095 100644 --- a/server.go +++ b/server.go @@ -6,6 +6,7 @@ import ( "net/http" "os" "os/signal" + "sync/atomic" "syscall" "time" @@ -37,7 +38,7 @@ type Server struct { traceProvider trace.TracerProvider shutdownSignals []os.Signal shutdownTimeout time.Duration - running bool + running atomic.Bool closers []interface{} probes map[HealthzType][]interface{} ctx context.Context @@ -306,7 +307,7 @@ func (s *Server) IsCanceled() bool { // Healthz returns true if the server is running func (s *Server) Healthz() error { - if !s.running { + if !s.running.Load() { return ErrServerNotRunning } return nil @@ -332,9 +333,9 @@ func (s *Server) Run() { // set running defer func() { - s.running = false + s.running.Store(false) }() - s.running = true + s.running.Store(true) // wait for shutdown if err := s.g.Wait(); err != nil && !errors.Is(err, context.Canceled) { From 53cf0474592da830e6411bb7607a2eff79a1a7a4 Mon Sep 17 00:00:00 2001 From: franklin Date: Wed, 9 Aug 2023 10:11:47 +0200 Subject: [PATCH 032/134] refactor: add working pprof service --- example/services/main.go | 7 ++++++- option.go | 12 ++++++++++++ servicehttppprof.go | 36 +++++++++++++++++++++++++++++------- servicehttppprof_pprof.go | 12 ------------ 4 files changed, 47 insertions(+), 20 deletions(-) diff --git a/example/services/main.go b/example/services/main.go index 2860b7a..0e1e00e 100644 --- a/example/services/main.go +++ b/example/services/main.go @@ -11,6 +11,7 @@ func main() { // you can override the below config by settings env vars _ = os.Setenv("SERVICE_ZAP_ENABLED", "true") _ = os.Setenv("SERVICE_VIPER_ENABLED", "true") + _ = os.Setenv("SERVICE_PPROF_ENABLED", "true") _ = os.Setenv("SERVICE_PROMETHEUS_ENABLED", "true") svr := keel.NewServer( @@ -23,6 +24,9 @@ func main() { // add prometheus service listening on 0.0.0.0:9200 // allows you to collect prometheus metrics: GET 0.0.0.0:9200/metrics keel.WithHTTPPrometheusService(false), + // add go pprof service listening on 0.0.0.0:6060 + // allows you to use go tool pprof: GET 0.0.0.0:6060/debug/pprof + keel.WithHTTPPProfService(false), ) l := svr.Logger() @@ -30,6 +34,7 @@ func main() { // alternatively you can add them manually // svr.AddServices(keel.NewDefaultServiceHTTPZap()) // svr.AddServices(keel.NewDefaultServiceHTTPViper()) + // svr.AddServices(keel.NewDefaultServiceHTTPPProf()) // svr.AddServices(keel.NewDefaultServiceHTTPPrometheus()) // create demo service @@ -40,7 +45,7 @@ func main() { }) svr.AddService( - keel.NewServiceHTTP(l, "demo", "localhost:8080", svs), + keel.NewServiceHTTP(l, "demo", ":8080", svs), ) svr.Run() diff --git a/option.go b/option.go index a078a50..e6b82a1 100644 --- a/option.go +++ b/option.go @@ -156,6 +156,18 @@ func WithHTTPPrometheusService(enabled bool) Option { } } +// WithHTTPPProfService option with default value +func WithHTTPPProfService(enabled bool) Option { + return func(inst *Server) { + if config.GetBool(inst.Config(), "service.pprof.enabled", enabled)() { + service := NewDefaultServiceHTTPPProf() + inst.initServices = append(inst.initServices, service) + inst.AddAlwaysHealthzers(service) + } + } +} + +// WithHTTPHealthzService option with default value func WithHTTPHealthzService(enabled bool) Option { return func(inst *Server) { if config.GetBool(inst.Config(), "service.healthz.enabled", enabled)() { diff --git a/servicehttppprof.go b/servicehttppprof.go index e6dccb9..cb10cc3 100644 --- a/servicehttppprof.go +++ b/servicehttppprof.go @@ -3,15 +3,37 @@ package keel import ( - keelconfig "github.com/foomo/keel/config" + "net/http" + "github.com/foomo/keel/log" + "go.uber.org/zap" +) + +const ( + DefaultServiceHTTPPProfName = "pprof" + DefaultServiceHTTPPProfAddr = "localhost:6060" + DefaultServiceHTTPPProfPath = "/debug/pprof" ) -// WithPProfService option with default value -func WithPProfService(enabled bool) Option { - return func(inst *Server) { - if keelconfig.GetBool(inst.Config(), "service.pprof.enabled", enabled)() { - log.Logger().Debug("build your binary with the `-tag pprof` to enable this service") - } +func NewServiceHTTPPProf(l *zap.Logger, name, addr, path string) *ServiceHTTP { + route := func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusNotImplemented) + _, _ = w.Write([]byte("To enable pprof, you need to build your binary with the `-tags=pprof` flag")) } + handler := http.NewServeMux() + handler.HandleFunc(path+"/", route) + handler.HandleFunc(path+"/cmdline", route) + handler.HandleFunc(path+"/profile", route) + handler.HandleFunc(path+"/symbol", route) + handler.HandleFunc(path+"/trace", route) + return NewServiceHTTP(l, name, addr, handler) +} + +func NewDefaultServiceHTTPPProf() *ServiceHTTP { + return NewServiceHTTPPProf( + log.Logger(), + DefaultServiceHTTPPProfName, + DefaultServiceHTTPPProfAddr, + DefaultServiceHTTPPProfPath, + ) } diff --git a/servicehttppprof_pprof.go b/servicehttppprof_pprof.go index 430ed4b..2092e63 100644 --- a/servicehttppprof_pprof.go +++ b/servicehttppprof_pprof.go @@ -7,7 +7,6 @@ import ( "net/http" "net/http/pprof" - keelconfig "github.com/foomo/keel/config" "github.com/foomo/keel/log" "go.uber.org/zap" ) @@ -36,14 +35,3 @@ func NewDefaultServiceHTTPPProf() *ServiceHTTP { DefaultServiceHTTPPProfPath, ) } - -// WithPProfService option with default value -func WithPProfService(enabled bool) Option { - return func(inst *Server) { - if keelconfig.GetBool(inst.Config(), "service.pprof.enabled", enabled)() { - service := NewDefaultServiceHTTPPProf() - inst.initServices = append(inst.initServices, service) - inst.AddAlwaysHealthzers(service) - } - } -} From 1588db7e9ffe85d662156015aa802229a095a23b Mon Sep 17 00:00:00 2001 From: franklin Date: Fri, 11 Aug 2023 08:58:46 +0200 Subject: [PATCH 033/134] wip: update otel --- example/go.mod | 139 +-- example/go.sum | 389 +++---- example/persistence/mongo/main.go | 7 +- example/telemetry/main.go | 50 +- go.mod | 150 +-- go.sum | 1304 ++++++++++++++++++---- integration/temporal/metrics.go | 33 +- net/http/middleware/telemetry.go | 14 +- net/http/roundtripware/circuitbreaker.go | 12 +- net/http/roundtripware/metric.go | 7 +- persistence/mongo/persistor.go | 15 +- telemetry/meter.go | 79 +- telemetry/tracer.go | 3 + test/server.go | 4 +- 14 files changed, 1539 insertions(+), 667 deletions(-) diff --git a/example/go.mod b/example/go.mod index bffc123..2b39f6e 100644 --- a/example/go.mod +++ b/example/go.mod @@ -7,42 +7,43 @@ require ( github.com/foomo/keel v0.0.0 github.com/golang-jwt/jwt v3.2.2+incompatible github.com/google/uuid v1.3.0 - github.com/nats-io/nats.go v1.24.0 + github.com/nats-io/nats.go v1.28.0 github.com/pkg/errors v0.9.1 - go.mongodb.org/mongo-driver v1.11.3 - go.opentelemetry.io/otel v1.7.0 - go.opentelemetry.io/otel/metric v0.30.0 - go.uber.org/zap v1.24.0 + go.mongodb.org/mongo-driver v1.12.1 + go.opentelemetry.io/otel v1.16.0 + go.opentelemetry.io/otel/metric v1.16.0 + go.uber.org/zap v1.25.0 ) require ( - cloud.google.com/go v0.107.0 // indirect - cloud.google.com/go/compute v1.15.1 // indirect + cloud.google.com/go v0.110.0 // indirect + cloud.google.com/go/compute v1.19.0 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect cloud.google.com/go/firestore v1.9.0 // indirect - cloud.google.com/go/longrunning v0.3.0 // indirect + cloud.google.com/go/longrunning v0.4.1 // indirect github.com/armon/go-metrics v0.4.0 // indirect github.com/avast/retry-go v3.0.0+incompatible // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/cenkalti/backoff/v4 v4.1.3 // indirect + github.com/cenkalti/backoff/v4 v4.2.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/coreos/go-semver v0.3.0 // indirect github.com/coreos/go-systemd/v22 v22.3.2 // indirect github.com/fatih/color v1.13.0 // indirect - github.com/felixge/httpsnoop v1.0.2 // indirect + github.com/felixge/httpsnoop v1.0.3 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect - github.com/go-logr/logr v1.2.3 // indirect + github.com/go-logr/logr v1.2.4 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.2 // indirect - github.com/golang/snappy v0.0.3 // indirect + github.com/golang/protobuf v1.5.3 // indirect + github.com/golang/snappy v0.0.4 // indirect github.com/google/go-cmp v0.5.9 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.1 // indirect - github.com/googleapis/gax-go/v2 v2.7.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 // indirect - github.com/hashicorp/consul/api v1.18.0 // indirect + github.com/google/s2a-go v0.1.3 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect + github.com/googleapis/gax-go/v2 v2.8.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3 // indirect + github.com/hashicorp/consul/api v1.20.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-hclog v1.2.0 // indirect github.com/hashicorp/go-immutable-radix v1.3.1 // indirect @@ -51,13 +52,13 @@ require ( github.com/hashicorp/hcl v1.0.0 // indirect github.com/hashicorp/serf v0.10.1 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.14.4 // indirect - github.com/lib/pq v1.10.7 // indirect + github.com/klauspost/compress v1.16.5 // indirect + github.com/lib/pq v1.10.9 // indirect github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/mattn/go-colorable v0.1.12 // indirect - github.com/mattn/go-isatty v0.0.14 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect + github.com/mattn/go-isatty v0.0.16 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/minio/highwayhash v1.0.2 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect @@ -65,67 +66,69 @@ require ( github.com/modern-go/reflect2 v1.0.2 // indirect github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe // indirect github.com/nats-io/jwt/v2 v2.3.0 // indirect - github.com/nats-io/nkeys v0.3.0 // indirect + github.com/nats-io/nkeys v0.4.4 // indirect github.com/nats-io/nuid v1.0.1 // indirect - github.com/pelletier/go-toml/v2 v2.0.6 // indirect + github.com/pelletier/go-toml/v2 v2.0.8 // indirect github.com/philhofer/fwd v1.1.2 // indirect github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect - github.com/prometheus/client_golang v1.14.0 // indirect - github.com/prometheus/client_model v0.3.0 // indirect - github.com/prometheus/common v0.37.0 // indirect - github.com/prometheus/procfs v0.8.0 // indirect - github.com/sagikazarmark/crypt v0.9.0 // indirect - github.com/shirou/gopsutil/v3 v3.22.3 // indirect + github.com/prometheus/client_golang v1.16.0 // indirect + github.com/prometheus/client_model v0.4.0 // indirect + github.com/prometheus/common v0.42.0 // indirect + github.com/prometheus/procfs v0.10.1 // indirect + github.com/sagikazarmark/crypt v0.10.0 // indirect + github.com/shirou/gopsutil/v3 v3.23.4 // indirect + github.com/shoenig/go-m1cpu v0.1.5 // indirect github.com/sony/gobreaker v0.5.0 // indirect - github.com/spf13/afero v1.9.3 // indirect - github.com/spf13/cast v1.5.0 // indirect + github.com/spf13/afero v1.9.5 // indirect + github.com/spf13/cast v1.5.1 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect - github.com/spf13/viper v1.15.0 // indirect + github.com/spf13/viper v1.16.0 // indirect github.com/subosito/gotenv v1.4.2 // indirect github.com/tinylib/msgp v1.1.8 // indirect - github.com/tklauser/go-sysconf v0.3.10 // indirect - github.com/tklauser/numcpus v0.4.0 // indirect + github.com/tklauser/go-sysconf v0.3.11 // indirect + github.com/tklauser/numcpus v0.6.0 // indirect github.com/xdg-go/pbkdf2 v1.0.0 // indirect - github.com/xdg-go/scram v1.1.1 // indirect - github.com/xdg-go/stringprep v1.0.3 // indirect + github.com/xdg-go/scram v1.1.2 // indirect + github.com/xdg-go/stringprep v1.0.4 // indirect github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - go.etcd.io/etcd/api/v3 v3.5.6 // indirect - go.etcd.io/etcd/client/pkg/v3 v3.5.6 // indirect - go.etcd.io/etcd/client/v2 v2.305.6 // indirect - go.etcd.io/etcd/client/v3 v3.5.6 // indirect + go.etcd.io/etcd/api/v3 v3.5.9 // indirect + go.etcd.io/etcd/client/pkg/v3 v3.5.9 // indirect + go.etcd.io/etcd/client/v2 v2.305.7 // indirect + go.etcd.io/etcd/client/v3 v3.5.9 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/contrib/instrumentation/go.mongodb.org/mongo-driver/mongo/otelmongo v0.32.0 // indirect - go.opentelemetry.io/contrib/instrumentation/host v0.32.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.32.0 // indirect - go.opentelemetry.io/contrib/instrumentation/runtime v0.32.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.7.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.7.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.7.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.7.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.30.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.30.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.7.0 // indirect - go.opentelemetry.io/otel/sdk v1.7.0 // indirect - go.opentelemetry.io/otel/sdk/metric v0.30.0 // indirect - go.opentelemetry.io/otel/trace v1.7.0 // indirect - go.opentelemetry.io/proto/otlp v0.16.0 // indirect - go.uber.org/atomic v1.9.0 // indirect - go.uber.org/multierr v1.8.0 // indirect - golang.org/x/crypto v0.7.0 // indirect - golang.org/x/net v0.8.0 // indirect - golang.org/x/oauth2 v0.4.0 // indirect - golang.org/x/sync v0.1.0 // indirect - golang.org/x/sys v0.6.0 // indirect - golang.org/x/text v0.8.0 // indirect - golang.org/x/time v0.1.0 // indirect + go.opentelemetry.io/contrib/instrumentation/go.mongodb.org/mongo-driver/mongo/otelmongo v0.42.0 // indirect + go.opentelemetry.io/contrib/instrumentation/host v0.42.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.42.0 // indirect + go.opentelemetry.io/contrib/instrumentation/runtime v0.42.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.16.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.16.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.16.0 // indirect + go.opentelemetry.io/otel/exporters/prometheus v0.39.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.39.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 // indirect + go.opentelemetry.io/otel/sdk v1.16.0 // indirect + go.opentelemetry.io/otel/sdk/metric v0.39.0 // indirect + go.opentelemetry.io/otel/trace v1.16.0 // indirect + go.opentelemetry.io/proto/otlp v0.19.0 // indirect + go.uber.org/multierr v1.10.0 // indirect + golang.org/x/crypto v0.12.0 // indirect + golang.org/x/net v0.10.0 // indirect + golang.org/x/oauth2 v0.7.0 // indirect + golang.org/x/sync v0.3.0 // indirect + golang.org/x/sys v0.11.0 // indirect + golang.org/x/text v0.12.0 // indirect + golang.org/x/time v0.3.0 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect - google.golang.org/api v0.107.0 // indirect + google.golang.org/api v0.122.0 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f // indirect - google.golang.org/grpc v1.53.0 // indirect - google.golang.org/protobuf v1.28.1 // indirect + google.golang.org/genproto v0.0.0-20230525234025-438c736192d0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20230525234020-1aefcd67740a // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc // indirect + google.golang.org/grpc v1.55.0 // indirect + google.golang.org/protobuf v1.30.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/example/go.sum b/example/go.sum index 0b6b508..9b8eab9 100644 --- a/example/go.sum +++ b/example/go.sum @@ -17,24 +17,24 @@ cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHOb cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.107.0 h1:qkj22L7bgkl6vIeZDlOY2po43Mx/TIa2Wsa7VR+PEww= -cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= +cloud.google.com/go v0.110.0 h1:Zc8gqp3+a9/Eyph2KDmcGaPtbKRIoqq4YTlL4NMD0Ys= +cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.15.1 h1:7UGq3QknM33pw5xATlpzeoomNxsacIVvTqTTvbfajmE= -cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63rR+SXhcpA= +cloud.google.com/go/compute v1.19.0 h1:+9zda3WGgW1ZSTlVppLCYFIr48Pa35q1uG2N1itbCEQ= +cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/firestore v1.9.0 h1:IBlRyxgGySXu5VuW0RgGFlTtLukSnNkpDiEOMkQkmpA= cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= -cloud.google.com/go/longrunning v0.3.0 h1:NjljC+FYPV3uh5/OwWT6pVU+doBqMg2x/rZlE+CamDs= -cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= +cloud.google.com/go/longrunning v0.4.1 h1:v+yFJOfKC3yZdY6ZUI933pIYdhyhV8S3NpWrXWmg7jM= +cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= @@ -54,7 +54,6 @@ github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuy github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= @@ -65,18 +64,16 @@ github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgI github.com/avast/retry-go v3.0.0+incompatible h1:4SOWQ7Qs+oroOTQOYnAHqelpCO0biHSxpiH9JdtuBj0= github.com/avast/retry-go v3.0.0+incompatible/go.mod h1:XtSnn+n/sHqQIpZ10K1qAevBhOOCWBLXXy3hyiqqBrY= github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= -github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= 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/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4= -github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +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= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= @@ -92,34 +89,29 @@ github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XP github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= 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/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= 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/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/felixge/httpsnoop v1.0.2 h1:+nS9g82KMXccJ/wp0zyRW9ZBHFETmMGtkk+2CTTrW4o= -github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= +github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk= +github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= @@ -128,15 +120,11 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -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.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= -github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= +github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= 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-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= @@ -149,8 +137,8 @@ github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69 github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= +github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= 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= @@ -178,11 +166,12 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -198,7 +187,6 @@ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 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.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -216,31 +204,30 @@ github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/s2a-go v0.1.3 h1:FAgZmpLl/SXurPEZyCMPBIiiYeTbqfjlbdnCNTAkbGE= +github.com/google/s2a-go v0.1.3/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.2.1 h1:RY7tHKZcRlk788d5WSo/e83gOyyy742E8GSs771ySpg= -github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k= +github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.7.0 h1:IcsPKeInNvYi7eqSaDjiZqDDKu5rsmunY0Y1YupQSSQ= -github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= +github.com/googleapis/gax-go/v2 v2.8.0 h1:UBtEZqx1bjXtOQ5BVTkuYghXrr3N4V123VKJK67vJZc= +github.com/googleapis/gax-go/v2 v2.8.0/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 h1:BZHcxBETFHIdVyhyEfOvn/RdU/QGdLI4y34qQGjGWO0= github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= -github.com/hashicorp/consul/api v1.18.0 h1:R7PPNzTCeN6VuQNDwwhZWJvzCtGSrNpJqfb22h3yH9g= -github.com/hashicorp/consul/api v1.18.0/go.mod h1:owRRGJ9M5xReDC5nfT8FTJrNAPbT4NM6p/k+d03q2v4= -github.com/hashicorp/consul/sdk v0.13.0 h1:lce3nFlpv8humJL8rNrrGHYSKc3q+Kxfeg3Ii1m6ZWU= -github.com/hashicorp/consul/sdk v0.13.0/go.mod h1:0hs/l5fOVhJy/VdcoaNqUSi2AUs95eF5WKtv+EYIQqE= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3 h1:lLT7ZLSzGLI08vc9cpd+tYmNWjdKDqyr/2L+f6U12Fk= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= +github.com/hashicorp/consul/api v1.20.0 h1:9IHTjNVSZ7MIwjlW3N3a7iGiykCMDpxZu8jsxFJh0yc= +github.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo= +github.com/hashicorp/consul/sdk v0.13.1 h1:EygWVWWMczTzXGpO93awkHFzfUka6hLYJ0qhETd+6lY= github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-hclog v1.2.0 h1:La19f8d7WIlm4ogzNHB0JGqs5AUDAZ2UfCY4sJXcJdM= github.com/hashicorp/go-hclog v1.2.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= @@ -256,14 +243,11 @@ github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5O github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc= -github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE= -github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI= -github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= 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 v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= @@ -278,36 +262,28 @@ github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.14.4 h1:eijASRJcobkVtSt81Olfh7JX43osYLwy5krOJo6YEu4= -github.com/klauspost/compress v1.14.4/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.16.5 h1:IFV2oUNUzZaz+XyusxpLzpzS8Pt5rh0Z16For/djlyI= +github.com/klauspost/compress v1.16.5/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= 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/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +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/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw= -github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= @@ -323,22 +299,21 @@ github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= +github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= 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/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g= github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -351,21 +326,21 @@ github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjY github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe h1:iruDEfMl2E6fbMZ9s0scYfZQ84/6SPL6zC8ACM2oIL0= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nats-io/jwt/v2 v2.3.0 h1:z2mA1a7tIf5ShggOFlR1oBPgd6hGqcDYsISxZByUzdI= github.com/nats-io/jwt/v2 v2.3.0/go.mod h1:0tqz9Hlu6bCBFLWAASKhE5vUA4c24L9KPUUgvwumE/k= github.com/nats-io/nats-server/v2 v2.7.3 h1:P0NgsnbTxrPMMPZ1/rLXWjS5bbPpRMCcPwlMd4nBDK4= -github.com/nats-io/nats.go v1.24.0 h1:CRiD8L5GOQu/DcfkmgBcTTIQORMwizF+rPk6T0RaHVQ= -github.com/nats-io/nats.go v1.24.0/go.mod h1:dVQF+BK3SzUZpwyzHedXsvH3EO38aVKuOPkkHlv5hXA= -github.com/nats-io/nkeys v0.3.0 h1:cgM5tL53EvYRU+2YLXIK0G2mJtK12Ft9oeooSZMA2G8= +github.com/nats-io/nats.go v1.28.0 h1:Th4G6zdsz2d0OqXdfzKLClo6bOfoI/b1kInhRtFIy5c= +github.com/nats-io/nats.go v1.28.0/go.mod h1:XpbWUlOElGwTYbMR7imivs7jJj9GtK7ypv321Wp6pjc= github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4= +github.com/nats-io/nkeys v0.4.4 h1:xvBJ8d69TznjcQl9t6//Q5xXuVhyYiSos6RPtvQNTwA= +github.com/nats-io/nkeys v0.4.4/go.mod h1:XUkxdLPTufzlihbamfzQ7mw/VGx6ObUs+0bN5sNvt64= github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU= -github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= +github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= +github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= github.com/philhofer/fwd v1.1.2 h1:bnDivRJ1EWPjUIRXV5KfORO897HTbpFAQddBdE8t7Gw= github.com/philhofer/fwd v1.1.2/go.mod h1:qkPdfjR2SIEbspLqpe1tO4n5yICnr2DY7mqEx2tUTP0= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -382,60 +357,52 @@ github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:Om github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= -github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= +github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= +github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= 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/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= -github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= +github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= +github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= -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.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= -github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= +github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM= +github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= 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.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -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.10.1 h1:kYK1Va/YMlutzCGazswoHKo//tZVlFpKYh+PymziUAg= +github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= 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.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= +github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sagikazarmark/crypt v0.9.0 h1:fipzMFW34hFUEc4D7fsLQFtE7yElkpgyS2zruedRdZk= -github.com/sagikazarmark/crypt v0.9.0/go.mod h1:RnH7sEhxfdnPm1z+XMgSLjWTEIjyK4z2dw6+4vHTMuo= +github.com/sagikazarmark/crypt v0.10.0 h1:96E1qrToLBU6fGzo+PRRz7KGOc9FkYFiPnR3/zf8Smg= +github.com/sagikazarmark/crypt v0.10.0/go.mod h1:gwTNHQVoOS3xp9Xvz5LLR+1AauC5M6880z5NWzdhOyQ= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/shirou/gopsutil/v3 v3.22.3 h1:UebRzEomgMpv61e3hgD1tGooqX5trFbdU/ehphbHd00= -github.com/shirou/gopsutil/v3 v3.22.3/go.mod h1:D01hZJ4pVHPpCTZ3m3T2+wDF2YAGfd+H4ifUguaQzHM= +github.com/shirou/gopsutil/v3 v3.23.4 h1:hZwmDxZs7Ewt75DV81r4pFMqbq+di2cbt9FsQBqLD2o= +github.com/shirou/gopsutil/v3 v3.23.4/go.mod h1:ZcGxyfzAMRevhUR2+cfhXDH6gQdFYE/t8j1nsU4mPI8= +github.com/shoenig/go-m1cpu v0.1.5 h1:LF57Z/Fpb/WdGLjt2HZilNnmZOxg/q2bSKTQhgbrLrQ= +github.com/shoenig/go-m1cpu v0.1.5/go.mod h1:Wwvst4LR89UxjeFtLRMrpgRiyY4xPsejnVZym39dbAQ= +github.com/shoenig/test v0.6.3 h1:GVXWJFk9PiOjN0KoJ7VrJGH6uLPnqxR7/fe3HUPfE0c= +github.com/shoenig/test v0.6.3/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sony/gobreaker v0.5.0 h1:dRCvqm0P490vZPmy7ppEk2qCnCieBooFJ+YoXGYB+yg= github.com/sony/gobreaker v0.5.0/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.9.3 h1:41FoI0fD7OR7mGcKE/aOiLkGreyf8ifIOQmJANWogMk= -github.com/spf13/afero v1.9.3/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= -github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= -github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= +github.com/spf13/afero v1.9.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM= +github.com/spf13/afero v1.9.5/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= +github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= +github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.15.0 h1:js3yy885G8xwJa6iOISGFwd+qlUo5AvyXb7CiihdtiU= -github.com/spf13/viper v1.15.0/go.mod h1:fFcTBJxvhhzSJiZy8n+PeW6t8l+KeT/uTARa0jHOQLA= +github.com/spf13/viper v1.16.0 h1:rGGH0XDZhdUOryiDWjmIvUSWpbNqisK8Wk0Vyefw8hc= +github.com/spf13/viper v1.16.0/go.mod h1:yg78JgCJcbrQOvV9YLXgkLaZqUidkY9K+Dd1FofRzQg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= @@ -445,52 +412,48 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 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.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= -github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= github.com/tinylib/msgp v1.1.8 h1:FCXC1xanKO4I8plpHGH2P7koL/RzZs12l/+r7vakfm0= github.com/tinylib/msgp v1.1.8/go.mod h1:qkpG+2ldGg4xRFmx+jfTvZPxfGFhi64BcnL9vkCm/Tw= -github.com/tklauser/go-sysconf v0.3.10 h1:IJ1AZGZRWbY8T5Vfk04D9WOA5WSejdflXxP03OUqALw= -github.com/tklauser/go-sysconf v0.3.10/go.mod h1:C8XykCvCb+Gn0oNCWPIlcb0RuglQTYaQ2hGm7jmxEFk= -github.com/tklauser/numcpus v0.4.0 h1:E53Dm1HjH1/R2/aoCtXtPgzmElmn51aOkhCFSuZq//o= -github.com/tklauser/numcpus v0.4.0/go.mod h1:1+UI3pD8NW14VMwdgJNJ1ESk2UnwhAnz5hMwiKKqXCQ= +github.com/tklauser/go-sysconf v0.3.11 h1:89WgdJhk5SNwJfu+GKyYveZ4IaJ7xAkecBo+KdJV0CM= +github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI= +github.com/tklauser/numcpus v0.6.0 h1:kebhY2Qt+3U6RNK7UqpYNA+tJ23IBEGKkB7JQBfDYms= +github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= -github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs= -github.com/xdg-go/scram v1.1.1 h1:VOMT+81stJgXW3CpHyqHN3AXDYIMsx56mEFrB37Mb/E= -github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g= -github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM= -github.com/xdg-go/stringprep v1.0.3 h1:kdwGpVNwPFtjs98xCGkHjQtGKh86rDcRZN17QEMCOIs= -github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8= +github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= +github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= +github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= +github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -go.etcd.io/etcd/api/v3 v3.5.6 h1:Cy2qx3npLcYqTKqGJzMypnMv2tiRyifZJ17BlWIWA7A= -go.etcd.io/etcd/api/v3 v3.5.6/go.mod h1:KFtNaxGDw4Yx/BA4iPPwevUTAuqcsPxzyX8PHydchN8= -go.etcd.io/etcd/client/pkg/v3 v3.5.6 h1:TXQWYceBKqLp4sa87rcPs11SXxUA/mHwH975v+BDvLU= -go.etcd.io/etcd/client/pkg/v3 v3.5.6/go.mod h1:ggrwbk069qxpKPq8/FKkQ3Xq9y39kbFR4LnKszpRXeQ= -go.etcd.io/etcd/client/v2 v2.305.6 h1:fIDR0p4KMjw01MJMfUIDWdQbjo06PD6CeYM5z4EHLi0= -go.etcd.io/etcd/client/v2 v2.305.6/go.mod h1:BHha8XJGe8vCIBfWBpbBLVZ4QjOIlfoouvOwydu63E0= -go.etcd.io/etcd/client/v3 v3.5.6 h1:coLs69PWCXE9G4FKquzNaSHrRyMCAXwF+IX1tAPVO8E= -go.etcd.io/etcd/client/v3 v3.5.6/go.mod h1:f6GRinRMCsFVv9Ht42EyY7nfsVGwrNO0WEoS2pRKzQk= -go.mongodb.org/mongo-driver v1.9.0/go.mod h1:0sQWfOeY63QTntERDJJ/0SuKK0T1uVSgKCuAROlKEPY= -go.mongodb.org/mongo-driver v1.11.3 h1:Ql6K6qYHEzB6xvu4+AU0BoRoqf9vFPcc4o7MUIdPW8Y= -go.mongodb.org/mongo-driver v1.11.3/go.mod h1:PTSz5yu21bkT/wXpkS7WR5f0ddqw5quethTUn9WM+2g= +go.etcd.io/etcd/api/v3 v3.5.9 h1:4wSsluwyTbGGmyjJktOf3wFQoTBIURXHnq9n/G/JQHs= +go.etcd.io/etcd/api/v3 v3.5.9/go.mod h1:uyAal843mC8uUVSLWz6eHa/d971iDGnCRpmKd2Z+X8k= +go.etcd.io/etcd/client/pkg/v3 v3.5.9 h1:oidDC4+YEuSIQbsR94rY9gur91UPL6DnxDCIYd2IGsE= +go.etcd.io/etcd/client/pkg/v3 v3.5.9/go.mod h1:y+CzeSmkMpWN2Jyu1npecjB9BBnABxGM4pN8cGuJeL4= +go.etcd.io/etcd/client/v2 v2.305.7 h1:AELPkjNR3/igjbO7CjyF1fPuVPjrblliiKj+Y6xSGOU= +go.etcd.io/etcd/client/v2 v2.305.7/go.mod h1:GQGT5Z3TBuAQGvgPfhR7VPySu/SudxmEkRq9BgzFU6s= +go.etcd.io/etcd/client/v3 v3.5.9 h1:r5xghnU7CwbUxD/fbUtRyJGaYNfDun8sp/gTr1hew6E= +go.etcd.io/etcd/client/v3 v3.5.9/go.mod h1:i/Eo5LrZ5IKqpbtpPDuaUnDOUv471oDg8cjQaUr2MbA= +go.mongodb.org/mongo-driver v1.12.1 h1:nLkghSU8fQNaK7oUmDhQFsnrtcoNy7Z6LVFKsEecqgE= +go.mongodb.org/mongo-driver v1.12.1/go.mod h1:/rGBTebI3XYboVmgz+Wv3Bcbl3aD0QF9zl6kDDw18rQ= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -499,52 +462,46 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= 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/go.mongodb.org/mongo-driver/mongo/otelmongo v0.32.0 h1:gNKQHn+q326vsi+kOskx9FCz9Jkz2fvxlf1y46dTN14= -go.opentelemetry.io/contrib/instrumentation/go.mongodb.org/mongo-driver/mongo/otelmongo v0.32.0/go.mod h1:9WqBmOJ4AOChNHtnRBSCGlKN4PQf1coLTCK57fyXE/s= -go.opentelemetry.io/contrib/instrumentation/host v0.32.0 h1:rgDeaor0XDeUaUCGj0VJIRdQYwsYANlnIh4yMgnaZvo= -go.opentelemetry.io/contrib/instrumentation/host v0.32.0/go.mod h1:GavGOmrtAjm+/J0WkNWzDC9rCAKQaD2d9JUzG225sgc= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.32.0 h1:mac9BKRqwaX6zxHPDe3pvmWpwuuIM0vuXv2juCnQevE= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.32.0/go.mod h1:5eCOqeGphOyz6TsY3ZDNjE33SM/TFAK3RGuCL2naTgY= -go.opentelemetry.io/contrib/instrumentation/runtime v0.32.0 h1:eMQf85EgNd2YWEikRJwEy4ADOiwlIum4rcHcssB4Qzk= -go.opentelemetry.io/contrib/instrumentation/runtime v0.32.0/go.mod h1:qtaLlIO4HC4DfedkYTOrvS2u7nA3N/v8w9mehrBD4O8= -go.opentelemetry.io/otel v1.7.0 h1:Z2lA3Tdch0iDcrhJXDIlC94XE+bxok1F9B+4Lz/lGsM= -go.opentelemetry.io/otel v1.7.0/go.mod h1:5BdUoMIz5WEs0vt0CUEMtSSaTSHBBVwrhnz7+nrD5xk= -go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.7.0 h1:7Yxsak1q4XrJ5y7XBnNwqWx9amMZvoidCctv62XOQ6Y= -go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.7.0/go.mod h1:M1hVZHNxcbkAlcvrOMlpQ4YOO3Awf+4N2dxkZL3xm04= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.7.0 h1:cMDtmgJ5FpRvqx9x2Aq+Mm0O6K/zcUkH73SFz20TuBw= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.7.0/go.mod h1:ceUgdyfNv4h4gLxHR0WNfDiiVmZFodZhZSbOLhpxqXE= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.7.0 h1:MFAyzUPrTwLOwCi+cltN0ZVyy4phU41lwH+lyMyQTS4= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.7.0/go.mod h1:E+/KKhwOSw8yoPxSSuUHG6vKppkvhN+S1Jc7Nib3k3o= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.7.0 h1:pLP0MH4MAqeTEV0g/4flxw9O8Is48uAIauAnjznbW50= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.7.0/go.mod h1:aFXT9Ng2seM9eizF+LfKiyPBGy8xIZKwhusC1gIu3hA= -go.opentelemetry.io/otel/exporters/prometheus v0.30.0 h1:YXo5ZY5nofaEYMCMTTMaRH2cLDZB8+0UGuk5RwMfIo0= -go.opentelemetry.io/otel/exporters/prometheus v0.30.0/go.mod h1:qN5feW+0/d661KDtJuATEmHtw5bKBK7NSvNEP927zSs= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.30.0 h1:2glg1ZFVVZf47zFuX0iwBPPid4tqzBYYWTVVu0pc+us= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.30.0/go.mod h1:LGFXSl/Js7uN7mDcrzCcHVj48JOtoYDjm4oUI4dLif0= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.7.0 h1:8hPcgCg0rUJiKE6VWahRvjgLUrNl7rW2hffUEPKXVEM= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.7.0/go.mod h1:K4GDXPY6TjUiwbOh+DkKaEdCF8y+lvMoM6SeAPyfCCM= -go.opentelemetry.io/otel/metric v0.30.0 h1:Hs8eQZ8aQgs0U49diZoaS6Uaxw3+bBE3lcMUKBFIk3c= -go.opentelemetry.io/otel/metric v0.30.0/go.mod h1:/ShZ7+TS4dHzDFmfi1kSXMhMVubNoP0oIaBp70J6UXU= -go.opentelemetry.io/otel/sdk v1.7.0 h1:4OmStpcKVOfvDOgCt7UriAPtKolwIhxpnSNI/yK+1B0= -go.opentelemetry.io/otel/sdk v1.7.0/go.mod h1:uTEOTwaqIVuTGiJN7ii13Ibp75wJmYUDe374q6cZwUU= -go.opentelemetry.io/otel/sdk/metric v0.30.0 h1:XTqQ4y3erR2Oj8xSAOL5ovO5011ch2ELg51z4fVkpME= -go.opentelemetry.io/otel/sdk/metric v0.30.0/go.mod h1:8AKFRi5HyvTR0RRty3paN1aMC9HMT+NzcEhw/BLkLX8= -go.opentelemetry.io/otel/trace v1.7.0 h1:O37Iogk1lEkMRXewVtZ1BBTVn5JEp8GrJvP92bJqC6o= -go.opentelemetry.io/otel/trace v1.7.0/go.mod h1:fzLSB9nqR2eXzxPXb2JW9IKE+ScyXA48yyE4TNvoHqU= +go.opentelemetry.io/contrib/instrumentation/go.mongodb.org/mongo-driver/mongo/otelmongo v0.42.0 h1:PL1iPuCLd14uZf2CZmN3mEGF9KurGs9IBt6UvO4owJk= +go.opentelemetry.io/contrib/instrumentation/go.mongodb.org/mongo-driver/mongo/otelmongo v0.42.0/go.mod h1:r8zTHTSZ9+o69VyAtF9ZaFJPDJdOSG950GEV6uiA99U= +go.opentelemetry.io/contrib/instrumentation/host v0.42.0 h1:/GMlvboQJd4LWxNX/oGYLv06J5a/M/flauLruM/3U2g= +go.opentelemetry.io/contrib/instrumentation/host v0.42.0/go.mod h1:w6v1mVemRjTTdfejACjf+LgVA6zKtHOWmdAIf3icx7A= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.42.0 h1:pginetY7+onl4qN1vl0xW/V/v6OBZ0vVdH+esuJgvmM= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.42.0/go.mod h1:XiYsayHc36K3EByOO6nbAXnAWbrUxdjUROCEeeROOH8= +go.opentelemetry.io/contrib/instrumentation/runtime v0.42.0 h1:EbmAUG9hEAMXyfWEasIt2kmh/WmXUznUksChApTgBGc= +go.opentelemetry.io/contrib/instrumentation/runtime v0.42.0/go.mod h1:rD9feqRYP24P14t5kmhNMqsqm1jvKmpx2H2rKVw52V8= +go.opentelemetry.io/otel v1.16.0 h1:Z7GVAX/UkAXPKsy94IU+i6thsQS4nb7LviLpnaNeW8s= +go.opentelemetry.io/otel v1.16.0/go.mod h1:vl0h9NUa1D5s1nv3A5vZOYWn8av4K8Ml6JDeHrT/bx4= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0 h1:t4ZwRPU+emrcvM2e9DHd0Fsf0JTPVcbfa/BhTDF03d0= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0/go.mod h1:vLarbg68dH2Wa77g71zmKQqlQ8+8Rq3GRG31uc0WcWI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.16.0 h1:cbsD4cUcviQGXdw8+bo5x2wazq10SKz8hEbtCRPcU78= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.16.0/go.mod h1:JgXSGah17croqhJfhByOLVY719k1emAXC8MVhCIJlRs= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.16.0 h1:TVQp/bboR4mhZSav+MdgXB8FaRho1RC8UwVn3T0vjVc= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.16.0/go.mod h1:I33vtIe0sR96wfrUcilIzLoA3mLHhRmz9S9Te0S3gDo= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.16.0 h1:iqjq9LAB8aK++sKVcELezzn655JnBNdsDhghU4G/So8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.16.0/go.mod h1:hGXzO5bhhSHZnKvrDaXB82Y9DRFour0Nz/KrBh7reWw= +go.opentelemetry.io/otel/exporters/prometheus v0.39.0 h1:whAaiHxOatgtKd+w0dOi//1KUxj3KoPINZdtDaDj3IA= +go.opentelemetry.io/otel/exporters/prometheus v0.39.0/go.mod h1:4jo5Q4CROlCpSPsXLhymi+LYrDXd2ObU5wbKayfZs7Y= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.39.0 h1:fl2WmyenEf6LYYlfHAtCUEDyGcpwJNqD4dHGO7PVm4w= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.39.0/go.mod h1:csyQxQ0UHHKVA8KApS7eUO/klMO5sd/av5CNZNU4O6w= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc= +go.opentelemetry.io/otel/metric v1.16.0 h1:RbrpwVG1Hfv85LgnZ7+txXioPDoh6EdbZHo26Q3hqOo= +go.opentelemetry.io/otel/metric v1.16.0/go.mod h1:QE47cpOmkwipPiefDwo2wDzwJrlfxxNYodqc4xnGCo4= +go.opentelemetry.io/otel/sdk v1.16.0 h1:Z1Ok1YsijYL0CSJpHt4cS3wDDh7p572grzNrBMiMWgE= +go.opentelemetry.io/otel/sdk v1.16.0/go.mod h1:tMsIuKXuuIWPBAOrH+eHtvhTL+SntFtXF9QD68aP6p4= +go.opentelemetry.io/otel/sdk/metric v0.39.0 h1:Kun8i1eYf48kHH83RucG93ffz0zGV1sh46FAScOTuDI= +go.opentelemetry.io/otel/sdk/metric v0.39.0/go.mod h1:piDIRgjcK7u0HCL5pCA4e74qpK/jk3NiUoAHATVAmiI= +go.opentelemetry.io/otel/trace v1.16.0 h1:8JRpaObFoW0pxuVPapkgH8UhHQj+bJW8jJsCZEu5MQs= +go.opentelemetry.io/otel/trace v1.16.0/go.mod h1:Yt9vYq1SdNz3xdjZZK7wcXv1qv2pwLkqr2QVwea0ef0= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.opentelemetry.io/proto/otlp v0.16.0 h1:WHzDWdXUvbc5bG2ObdrGfaNpQz7ft7QN9HHmJlbiB1E= -go.opentelemetry.io/proto/otlp v0.16.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= -go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= -go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8= -go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= -go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= +go.opentelemetry.io/proto/otlp v0.19.0 h1:IVN6GR+mhC4s5yfcTbmzHYODqvWAp3ZedA2SJPI1Nnw= +go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= +go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= +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= +go.uber.org/zap v1.25.0/go.mod h1:JIAUzQIH94IC4fOJQm7gMmBJP5k7wQfdcnYdPoEXJYk= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -552,14 +509,14 @@ golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= 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.0.0-20201216223049-8b5274cf687f/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A= -golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +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/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= @@ -583,7 +540,6 @@ golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRu golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= @@ -594,7 +550,6 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -634,15 +589,11 @@ golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= -golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= 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= @@ -652,11 +603,9 @@ golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.4.0 h1:NF0gk8LVPg1Ml7SSbGyySuoxdsXitj7TvgvuRxIMc/M= -golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec= +golang.org/x/oauth2 v0.7.0 h1:qe6s0zUXlPX80/dITx3440hWZ7GwMwgDDyrSGTPJG/g= +golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= 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= @@ -669,8 +618,9 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -694,7 +644,6 @@ golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -708,8 +657,6 @@ golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -718,31 +665,25 @@ golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/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.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/sys v0.7.0/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/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/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= @@ -755,14 +696,16 @@ 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.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +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/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= -golang.org/x/time v0.1.0 h1:xYY+Bajn2a7VBmTM5GikTmnK8ZuX8YgnQCqZpbBNtmA= -golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= +golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 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= @@ -772,7 +715,6 @@ golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3 golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= @@ -814,8 +756,6 @@ golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -843,8 +783,8 @@ google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz513 google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.107.0 h1:I2SlFjD8ZWabaIFOfeEDg3pf0BHJDh6iYQ1ic3Yu/UU= -google.golang.org/api v0.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.122.0 h1:zDobeejm3E7pEG1mNHvdxvjs5XJoCMzyNH+CmwL94Es= +google.golang.org/api v0.122.0/go.mod h1:gcitW0lvnyWjSp9nKxAbdHKIZ6vF4aajGueeslZOyms= 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/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -890,10 +830,13 @@ google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f h1:BWUVssLB0HVOSY78gIdvk1dTVYtT1y8SBWtPYuTJ/6w= -google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230525234025-438c736192d0 h1:x1vNwUhVOcsYoKyEGCZBH694SBmmBjA2EfauFVEI2+M= +google.golang.org/genproto v0.0.0-20230525234025-438c736192d0/go.mod h1:9ExIQyXL5hZrHzQceCwuSYwZZ5QZBazOcprJ5rgs3lY= +google.golang.org/genproto/googleapis/api v0.0.0-20230525234020-1aefcd67740a h1:HiYVD+FGJkTo+9zj1gqz0anapsa1JxjiSrN+BJKyUmE= +google.golang.org/genproto/googleapis/api v0.0.0-20230525234020-1aefcd67740a/go.mod h1:ts19tUU+Z0ZShN1y3aPyq2+O3d5FUNNgT6FtOzmrNn8= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc h1:XSJ8Vk1SWuNr8S18z1NZSziL0CPIXLCCMDOEFtHBOFc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -912,13 +855,11 @@ google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k= google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.53.0 h1:LAv2ds7cmFV/XTS3XG1NneeENYrXGmorPxsBbptIjNc= -google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc v1.55.0 h1:3Oj82/tFSCeUrRTg/5E/7d/W5A1tj6Ky1ABAuZuv5ag= +google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= 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= @@ -932,14 +873,13 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= +google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= 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/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= @@ -948,12 +888,8 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/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= @@ -966,4 +902,3 @@ honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/example/persistence/mongo/main.go b/example/persistence/mongo/main.go index 8ecdf80..f7e2359 100644 --- a/example/persistence/mongo/main.go +++ b/example/persistence/mongo/main.go @@ -26,8 +26,9 @@ func main() { l := svr.Logger() cDateTime := &store.DateTimeCodec{} - rb := bson.NewRegistryBuilder() - rb.RegisterCodec(store.TDateTime, cDateTime) + rb := bson.NewRegistry() + rb.RegisterTypeEncoder(store.TDateTime, cDateTime) + rb.RegisterTypeDecoder(store.TDateTime, cDateTime) // create persistor persistor, err := keelmongo.New( @@ -36,7 +37,7 @@ func main() { // enable telemetry (enabled by default) keelmongo.WithOtelEnabled(true), keelmongo.WithClientOptions( - options.Client().SetRegistry(rb.Build()), + options.Client().SetRegistry(rb), ), ) // use log must helper to exit on error diff --git a/example/telemetry/main.go b/example/telemetry/main.go index fa4f37d..4879728 100644 --- a/example/telemetry/main.go +++ b/example/telemetry/main.go @@ -3,15 +3,25 @@ package main import ( "math/rand" "net/http" - - "go.opentelemetry.io/otel/attribute" - "go.opentelemetry.io/otel/metric/instrument" + "time" "github.com/foomo/keel" "github.com/foomo/keel/log" "github.com/foomo/keel/net/http/middleware" + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/metric" + "go.opentelemetry.io/otel/trace" ) +var metricRequestLatency = promauto.NewHistogram(prometheus.HistogramOpts{ + Namespace: "demo", + Name: "request_latency_seconds", + Help: "Request Latency", + Buckets: prometheus.ExponentialBuckets(.0001, 2, 50), +}) + func main() { // Run this example with the following env vars: // @@ -45,47 +55,61 @@ func main() { svs := http.NewServeMux() { // counter - counter, err := meter.SyncInt64().Counter( + counter, err := meter.Int64Counter( "a.counter", - instrument.WithDescription("Count things"), + metric.WithDescription("Count things"), ) log.Must(l, err, "failed to create counter meter") svs.HandleFunc("/count", func(w http.ResponseWriter, r *http.Request) { - counter.Add(r.Context(), 1, attribute.String("key", "value")) + counter.Add(r.Context(), 1, metric.WithAttributes(attribute.String("key", "value"))) w.WriteHeader(http.StatusOK) _, _ = w.Write([]byte("OK!")) }) } { // up down - upDown, err := meter.SyncInt64().UpDownCounter( + upDown, err := meter.Int64UpDownCounter( "a.updown", - instrument.WithDescription("Up down values"), + metric.WithDescription("Up down values"), ) log.Must(l, err, "failed to create up down meter") svs.HandleFunc("/up", func(w http.ResponseWriter, r *http.Request) { - upDown.Add(r.Context(), 1, attribute.String("key", "value")) + upDown.Add(r.Context(), 1, metric.WithAttributes(attribute.String("key", "value"))) w.WriteHeader(http.StatusOK) _, _ = w.Write([]byte("OK!")) }) svs.HandleFunc("/down", func(w http.ResponseWriter, r *http.Request) { - upDown.Add(r.Context(), -1, attribute.String("key", "value")) + upDown.Add(r.Context(), -1, metric.WithAttributes(attribute.String("key", "value"))) w.WriteHeader(http.StatusOK) _, _ = w.Write([]byte("OK!")) }) } { // histogram - histogram, err := meter.SyncInt64().Histogram( + histogram, err := meter.Int64Histogram( "a.histogram", - instrument.WithDescription("Up down values"), + metric.WithDescription("Up down values"), + metric.WithUnit("ms"), ) log.Must(l, err, "failed to create up down meter") svs.HandleFunc("/histogram", func(w http.ResponseWriter, r *http.Request) { - histogram.Record(r.Context(), int64(rand.Int()), attribute.String("key", "value")) + start := time.Now() + time.Sleep(time.Second) + traceID := trace.SpanContextFromContext(r.Context()) + histogram.Record(r.Context(), int64(rand.Int()), + metric.WithAttributes( + attribute.String("key", "value"), + attribute.String("traceID", traceID.TraceID().String()), + ), + ) + + metricRequestLatency.(prometheus.ExemplarObserver).ObserveWithExemplar( + time.Since(start).Seconds(), prometheus.Labels{"traceID": traceID.TraceID().String()}, + ) + w.WriteHeader(http.StatusOK) _, _ = w.Write([]byte("OK!")) }) diff --git a/go.mod b/go.mod index 65d0410..fd4550c 100644 --- a/go.mod +++ b/go.mod @@ -4,76 +4,77 @@ go 1.20 require ( github.com/avast/retry-go v3.0.0+incompatible - github.com/foomo/gotsrpc/v2 v2.7.1 - github.com/go-logr/logr v1.2.3 + github.com/foomo/gotsrpc/v2 v2.7.2 + github.com/go-logr/logr v1.2.4 github.com/golang-jwt/jwt v3.2.2+incompatible github.com/google/uuid v1.3.0 - github.com/lib/pq v1.10.7 + github.com/lib/pq v1.10.9 github.com/mitchellh/mapstructure v1.5.0 - github.com/nats-io/nats.go v1.24.0 + github.com/nats-io/nats.go v1.28.0 github.com/pkg/errors v0.9.1 - github.com/prometheus/client_golang v1.14.0 + github.com/prometheus/client_golang v1.16.0 github.com/sony/gobreaker v0.5.0 - github.com/spf13/viper v1.15.0 - github.com/stretchr/testify v1.8.2 + github.com/spf13/viper v1.16.0 + github.com/stretchr/testify v1.8.4 github.com/tidwall/pretty v1.2.1 github.com/tinylib/msgp v1.1.8 - go.mongodb.org/mongo-driver v1.11.3 - go.opentelemetry.io/contrib/instrumentation/go.mongodb.org/mongo-driver/mongo/otelmongo v0.32.0 - go.opentelemetry.io/contrib/instrumentation/host v0.32.0 - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.32.0 - go.opentelemetry.io/contrib/instrumentation/runtime v0.32.0 - go.opentelemetry.io/otel v1.7.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.7.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.7.0 - go.opentelemetry.io/otel/exporters/prometheus v0.30.0 - go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.30.0 - go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.7.0 - go.opentelemetry.io/otel/metric v0.30.0 - go.opentelemetry.io/otel/sdk v1.7.0 - go.opentelemetry.io/otel/sdk/metric v0.30.0 - go.opentelemetry.io/otel/trace v1.7.0 - go.temporal.io/api v1.8.0 - go.temporal.io/sdk v1.15.0 - go.temporal.io/sdk/contrib/opentelemetry v0.1.0 - go.uber.org/zap v1.24.0 - golang.org/x/crypto v0.7.0 - golang.org/x/sync v0.1.0 + go.mongodb.org/mongo-driver v1.12.1 + go.opentelemetry.io/contrib/instrumentation/go.mongodb.org/mongo-driver/mongo/otelmongo v0.42.0 + go.opentelemetry.io/contrib/instrumentation/host v0.42.0 + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.42.0 + go.opentelemetry.io/contrib/instrumentation/runtime v0.42.0 + go.opentelemetry.io/otel v1.16.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.16.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.16.0 + go.opentelemetry.io/otel/exporters/prometheus v0.39.0 + go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.39.0 + go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 + go.opentelemetry.io/otel/metric v1.16.0 + go.opentelemetry.io/otel/sdk v1.16.0 + go.opentelemetry.io/otel/sdk/metric v0.39.0 + go.opentelemetry.io/otel/trace v1.16.0 + go.temporal.io/api v1.23.0 + go.temporal.io/sdk v1.24.0 + go.temporal.io/sdk/contrib/opentelemetry v0.2.0 + go.uber.org/zap v1.25.0 + golang.org/x/crypto v0.12.0 + golang.org/x/sync v0.3.0 ) require ( - cloud.google.com/go v0.107.0 // indirect - cloud.google.com/go/compute v1.15.1 // indirect + cloud.google.com/go v0.110.0 // indirect + cloud.google.com/go/compute v1.19.0 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect cloud.google.com/go/firestore v1.9.0 // indirect - cloud.google.com/go/longrunning v0.3.0 // indirect + cloud.google.com/go/longrunning v0.4.1 // indirect github.com/armon/go-metrics v0.4.0 // indirect github.com/benbjohnson/clock v1.3.0 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/cenkalti/backoff/v4 v4.1.3 // indirect + github.com/cenkalti/backoff/v4 v4.2.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/coreos/go-semver v0.3.0 // indirect github.com/coreos/go-systemd/v22 v22.3.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/facebookgo/clock v0.0.0-20150410010913-600d898af40a // indirect github.com/fatih/color v1.13.0 // indirect - github.com/felixge/httpsnoop v1.0.2 // indirect + github.com/felixge/httpsnoop v1.0.3 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/gogo/googleapis v1.4.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/gogo/status v1.1.0 // indirect + github.com/gogo/status v1.1.1 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/mock v1.6.0 // indirect - github.com/golang/protobuf v1.5.2 // indirect - github.com/golang/snappy v0.0.3 // indirect + github.com/golang/protobuf v1.5.3 // indirect + github.com/golang/snappy v0.0.4 // indirect github.com/google/go-cmp v0.5.9 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.1 // indirect - github.com/googleapis/gax-go/v2 v2.7.0 // indirect + github.com/google/s2a-go v0.1.3 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect + github.com/googleapis/gax-go/v2 v2.8.0 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 // indirect - github.com/hashicorp/consul/api v1.18.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3 // indirect + github.com/hashicorp/consul/api v1.20.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-hclog v1.2.0 // indirect github.com/hashicorp/go-immutable-radix v1.3.1 // indirect @@ -83,67 +84,70 @@ require ( github.com/hashicorp/serf v0.10.1 // indirect github.com/iancoleman/strcase v0.2.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.14.4 // indirect + github.com/klauspost/compress v1.16.5 // indirect github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/mattn/go-colorable v0.1.12 // indirect - github.com/mattn/go-isatty v0.0.14 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect + github.com/mattn/go-isatty v0.0.16 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe // indirect github.com/nats-io/nats-server/v2 v2.7.3 // indirect - github.com/nats-io/nkeys v0.3.0 // indirect + github.com/nats-io/nkeys v0.4.4 // indirect github.com/nats-io/nuid v1.0.1 // indirect github.com/pborman/uuid v1.2.1 // indirect - github.com/pelletier/go-toml/v2 v2.0.6 // indirect + github.com/pelletier/go-toml/v2 v2.0.8 // indirect github.com/philhofer/fwd v1.1.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect - github.com/prometheus/client_model v0.3.0 // indirect - github.com/prometheus/common v0.37.0 // indirect - github.com/prometheus/procfs v0.8.0 // indirect + github.com/prometheus/client_model v0.4.0 // indirect + github.com/prometheus/common v0.42.0 // indirect + github.com/prometheus/procfs v0.10.1 // indirect github.com/robfig/cron v1.2.0 // indirect - github.com/sagikazarmark/crypt v0.9.0 // indirect - github.com/shirou/gopsutil/v3 v3.22.3 // indirect - github.com/spf13/afero v1.9.3 // indirect - github.com/spf13/cast v1.5.0 // indirect + github.com/sagikazarmark/crypt v0.10.0 // indirect + github.com/shirou/gopsutil/v3 v3.23.4 // indirect + github.com/shoenig/go-m1cpu v0.1.5 // indirect + github.com/spf13/afero v1.9.5 // indirect + github.com/spf13/cast v1.5.1 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/stretchr/objx v0.5.0 // indirect github.com/subosito/gotenv v1.4.2 // indirect - github.com/tklauser/go-sysconf v0.3.10 // indirect - github.com/tklauser/numcpus v0.4.0 // indirect + github.com/tklauser/go-sysconf v0.3.11 // indirect + github.com/tklauser/numcpus v0.6.0 // indirect github.com/ugorji/go/codec v1.2.11 // indirect github.com/xdg-go/pbkdf2 v1.0.0 // indirect - github.com/xdg-go/scram v1.1.1 // indirect - github.com/xdg-go/stringprep v1.0.3 // indirect + github.com/xdg-go/scram v1.1.2 // indirect + github.com/xdg-go/stringprep v1.0.4 // indirect github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - go.etcd.io/etcd/api/v3 v3.5.6 // indirect - go.etcd.io/etcd/client/pkg/v3 v3.5.6 // indirect - go.etcd.io/etcd/client/v2 v2.305.6 // indirect - go.etcd.io/etcd/client/v3 v3.5.6 // indirect + go.etcd.io/etcd/api/v3 v3.5.9 // indirect + go.etcd.io/etcd/client/pkg/v3 v3.5.9 // indirect + go.etcd.io/etcd/client/v2 v2.305.7 // indirect + go.etcd.io/etcd/client/v3 v3.5.9 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.7.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.7.0 // indirect - go.opentelemetry.io/proto/otlp v0.16.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.16.0 // indirect + go.opentelemetry.io/proto/otlp v0.19.0 // indirect go.uber.org/atomic v1.9.0 // indirect - go.uber.org/multierr v1.8.0 // indirect + go.uber.org/multierr v1.10.0 // indirect golang.org/x/mod v0.9.0 // indirect - golang.org/x/net v0.8.0 // indirect - golang.org/x/oauth2 v0.4.0 // indirect - golang.org/x/sys v0.6.0 // indirect - golang.org/x/text v0.8.0 // indirect - golang.org/x/time v0.1.0 // indirect + golang.org/x/net v0.10.0 // indirect + golang.org/x/oauth2 v0.7.0 // indirect + golang.org/x/sys v0.11.0 // indirect + golang.org/x/text v0.12.0 // indirect + golang.org/x/time v0.3.0 // indirect golang.org/x/tools v0.7.0 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect - google.golang.org/api v0.107.0 // indirect + google.golang.org/api v0.122.0 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f // indirect - google.golang.org/grpc v1.53.0 // indirect - google.golang.org/protobuf v1.28.1 // indirect + google.golang.org/genproto v0.0.0-20230525234025-438c736192d0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20230525234020-1aefcd67740a // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc // indirect + google.golang.org/grpc v1.55.0 // indirect + google.golang.org/protobuf v1.30.0 // indirect gopkg.in/ini.v1 v1.67.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 a9af41a..145192e 100644 --- a/go.sum +++ b/go.sum @@ -17,45 +17,606 @@ cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHOb cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.107.0 h1:qkj22L7bgkl6vIeZDlOY2po43Mx/TIa2Wsa7VR+PEww= +cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= +cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= +cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= +cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= +cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= +cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= +cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= +cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= +cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= +cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= +cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= +cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= +cloud.google.com/go v0.110.0 h1:Zc8gqp3+a9/Eyph2KDmcGaPtbKRIoqq4YTlL4NMD0Ys= +cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= +cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4= +cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= +cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E= +cloud.google.com/go/accesscontextmanager v1.3.0/go.mod h1:TgCBehyr5gNMz7ZaH9xubp+CE8dkrszb4oK9CWyvD4o= +cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE= +cloud.google.com/go/accesscontextmanager v1.6.0/go.mod h1:8XCvZWfYw3K/ji0iVnp+6pu7huxoQTLmxAbVjbloTtM= +cloud.google.com/go/accesscontextmanager v1.7.0/go.mod h1:CEGLewx8dwa33aDAZQujl7Dx+uYhS0eay198wB/VumQ= +cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= +cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= +cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg= +cloud.google.com/go/aiplatform v1.35.0/go.mod h1:7MFT/vCaOyZT/4IIFfxH4ErVg/4ku6lKv3w0+tFTgXQ= +cloud.google.com/go/aiplatform v1.36.1/go.mod h1:WTm12vJRPARNvJ+v6P52RDHCNe4AhvjcIZ/9/RRHy/k= +cloud.google.com/go/aiplatform v1.37.0/go.mod h1:IU2Cv29Lv9oCn/9LkFiiuKfwrRTq+QQMbW+hPCxJGZw= +cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= +cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= +cloud.google.com/go/analytics v0.17.0/go.mod h1:WXFa3WSym4IZ+JiKmavYdJwGG/CvpqiqczmL59bTD9M= +cloud.google.com/go/analytics v0.18.0/go.mod h1:ZkeHGQlcIPkw0R/GW+boWHhCOR43xz9RN/jn7WcqfIE= +cloud.google.com/go/analytics v0.19.0/go.mod h1:k8liqf5/HCnOUkbawNtrWWc+UAzyDlW89doe8TtoDsE= +cloud.google.com/go/apigateway v1.3.0/go.mod h1:89Z8Bhpmxu6AmUxuVRg/ECRGReEdiP3vQtk4Z1J9rJk= +cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc= +cloud.google.com/go/apigateway v1.5.0/go.mod h1:GpnZR3Q4rR7LVu5951qfXPJCHquZt02jf7xQx7kpqN8= +cloud.google.com/go/apigeeconnect v1.3.0/go.mod h1:G/AwXFAKo0gIXkPTVfZDd2qA1TxBXJ3MgMRBQkIi9jc= +cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04= +cloud.google.com/go/apigeeconnect v1.5.0/go.mod h1:KFaCqvBRU6idyhSNyn3vlHXc8VMDJdRmwDF6JyFRqZ8= +cloud.google.com/go/apigeeregistry v0.4.0/go.mod h1:EUG4PGcsZvxOXAdyEghIdXwAEi/4MEaoqLMLDMIwKXY= +cloud.google.com/go/apigeeregistry v0.5.0/go.mod h1:YR5+s0BVNZfVOUkMa5pAR2xGd0A473vA5M7j247o1wM= +cloud.google.com/go/apigeeregistry v0.6.0/go.mod h1:BFNzW7yQVLZ3yj0TKcwzb8n25CFBri51GVGOEUcgQsc= +cloud.google.com/go/apikeys v0.4.0/go.mod h1:XATS/yqZbaBK0HOssf+ALHp8jAlNHUgyfprvNcBIszU= +cloud.google.com/go/apikeys v0.5.0/go.mod h1:5aQfwY4D+ewMMWScd3hm2en3hCj+BROlyrt3ytS7KLI= +cloud.google.com/go/apikeys v0.6.0/go.mod h1:kbpXu5upyiAlGkKrJgQl8A0rKNNJ7dQ377pdroRSSi8= +cloud.google.com/go/appengine v1.4.0/go.mod h1:CS2NhuBuDXM9f+qscZ6V86m1MIIqPj3WC/UoEuR1Sno= +cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak= +cloud.google.com/go/appengine v1.6.0/go.mod h1:hg6i0J/BD2cKmDJbaFSYHFyZkgBEfQrDg/X0V5fJn84= +cloud.google.com/go/appengine v1.7.0/go.mod h1:eZqpbHFCqRGa2aCdope7eC0SWLV1j0neb/QnMJVWx6A= +cloud.google.com/go/appengine v1.7.1/go.mod h1:IHLToyb/3fKutRysUlFO0BPt5j7RiQ45nrzEJmKTo6E= +cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= +cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= +cloud.google.com/go/area120 v0.7.0/go.mod h1:a3+8EUD1SX5RUcCs3MY5YasiO1z6yLiNLRiFrykbynY= +cloud.google.com/go/area120 v0.7.1/go.mod h1:j84i4E1RboTWjKtZVWXPqvK5VHQFJRF2c1Nm69pWm9k= +cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= +cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= +cloud.google.com/go/artifactregistry v1.8.0/go.mod h1:w3GQXkJX8hiKN0v+at4b0qotwijQbYUqF2GWkZzAhC0= +cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc= +cloud.google.com/go/artifactregistry v1.11.1/go.mod h1:lLYghw+Itq9SONbCa1YWBoWs1nOucMH0pwXN1rOBZFI= +cloud.google.com/go/artifactregistry v1.11.2/go.mod h1:nLZns771ZGAwVLzTX/7Al6R9ehma4WUEhZGWV6CeQNQ= +cloud.google.com/go/artifactregistry v1.12.0/go.mod h1:o6P3MIvtzTOnmvGagO9v/rOjjA0HmhJ+/6KAXrmYDCI= +cloud.google.com/go/artifactregistry v1.13.0/go.mod h1:uy/LNfoOIivepGhooAUpL1i30Hgee3Cu0l4VTWHUC08= +cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= +cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= +cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= +cloud.google.com/go/asset v1.9.0/go.mod h1:83MOE6jEJBMqFKadM9NLRcs80Gdw76qGuHn8m3h8oHQ= +cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY= +cloud.google.com/go/asset v1.11.1/go.mod h1:fSwLhbRvC9p9CXQHJ3BgFeQNM4c9x10lqlrdEUYXlJo= +cloud.google.com/go/asset v1.12.0/go.mod h1:h9/sFOa4eDIyKmH6QMpm4eUK3pDojWnUhTgJlk762Hg= +cloud.google.com/go/asset v1.13.0/go.mod h1:WQAMyYek/b7NBpYq/K4KJWcRqzoalEsxz/t/dTk4THw= +cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= +cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= +cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= +cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo= +cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= +cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E= +cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= +cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= +cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8= +cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM= +cloud.google.com/go/automl v1.12.0/go.mod h1:tWDcHDp86aMIuHmyvjuKeeHEGq76lD7ZqfGLN6B0NuU= +cloud.google.com/go/baremetalsolution v0.3.0/go.mod h1:XOrocE+pvK1xFfleEnShBlNAXf+j5blPPxrhjKgnIFc= +cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI= +cloud.google.com/go/baremetalsolution v0.5.0/go.mod h1:dXGxEkmR9BMwxhzBhV0AioD0ULBmuLZI8CdwalUxuss= +cloud.google.com/go/batch v0.3.0/go.mod h1:TR18ZoAekj1GuirsUsR1ZTKN3FC/4UDnScjT8NXImFE= +cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE= +cloud.google.com/go/batch v0.7.0/go.mod h1:vLZN95s6teRUqRQ4s3RLDsH8PvboqBK+rn1oevL159g= +cloud.google.com/go/beyondcorp v0.2.0/go.mod h1:TB7Bd+EEtcw9PCPQhCJtJGjk/7TC6ckmnSFS+xwTfm4= +cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8= +cloud.google.com/go/beyondcorp v0.4.0/go.mod h1:3ApA0mbhHx6YImmuubf5pyW8srKnCEPON32/5hj+RmM= +cloud.google.com/go/beyondcorp v0.5.0/go.mod h1:uFqj9X+dSfrheVp7ssLTaRHd2EHqSL4QZmH4e8WXGGU= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.15.1 h1:7UGq3QknM33pw5xATlpzeoomNxsacIVvTqTTvbfajmE= +cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= +cloud.google.com/go/bigquery v1.43.0/go.mod h1:ZMQcXHsl+xmU1z36G2jNGZmKp9zNY5BUua5wDgmNCfw= +cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc= +cloud.google.com/go/bigquery v1.47.0/go.mod h1:sA9XOgy0A8vQK9+MWhEQTY6Tix87M/ZurWFIxmF9I/E= +cloud.google.com/go/bigquery v1.48.0/go.mod h1:QAwSz+ipNgfL5jxiaK7weyOhzdoAy1zFm0Nf1fysJac= +cloud.google.com/go/bigquery v1.49.0/go.mod h1:Sv8hMmTFFYBlt/ftw2uN6dFdQPzBlREY9yBh7Oy7/4Q= +cloud.google.com/go/bigquery v1.50.0/go.mod h1:YrleYEh2pSEbgTBZYMJ5SuSr0ML3ypjRB1zgf7pvQLU= +cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= +cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= +cloud.google.com/go/billing v1.6.0/go.mod h1:WoXzguj+BeHXPbKfNWkqVtDdzORazmCjraY+vrxcyvI= +cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y= +cloud.google.com/go/billing v1.12.0/go.mod h1:yKrZio/eu+okO/2McZEbch17O5CB5NpZhhXG6Z766ss= +cloud.google.com/go/billing v1.13.0/go.mod h1:7kB2W9Xf98hP9Sr12KfECgfGclsH3CQR0R08tnRlRbc= +cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= +cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= +cloud.google.com/go/binaryauthorization v1.3.0/go.mod h1:lRZbKgjDIIQvzYQS1p99A7/U1JqvqeZg0wiI5tp6tg0= +cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk= +cloud.google.com/go/binaryauthorization v1.5.0/go.mod h1:OSe4OU1nN/VswXKRBmciKpo9LulY41gch5c68htf3/Q= +cloud.google.com/go/certificatemanager v1.3.0/go.mod h1:n6twGDvcUBFu9uBgt4eYvvf3sQ6My8jADcOVwHmzadg= +cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590= +cloud.google.com/go/certificatemanager v1.6.0/go.mod h1:3Hh64rCKjRAX8dXgRAyOcY5vQ/fE1sh8o+Mdd6KPgY8= +cloud.google.com/go/channel v1.8.0/go.mod h1:W5SwCXDJsq/rg3tn3oG0LOxpAo6IMxNa09ngphpSlnk= +cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk= +cloud.google.com/go/channel v1.11.0/go.mod h1:IdtI0uWGqhEeatSB62VOoJ8FSUhJ9/+iGkJVqp74CGE= +cloud.google.com/go/channel v1.12.0/go.mod h1:VkxCGKASi4Cq7TbXxlaBezonAYpp1GCnKMY6tnMQnLU= +cloud.google.com/go/cloudbuild v1.3.0/go.mod h1:WequR4ULxlqvMsjDEEEFnOG5ZSRSgWOywXYDb1vPE6U= +cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA= +cloud.google.com/go/cloudbuild v1.6.0/go.mod h1:UIbc/w9QCbH12xX+ezUsgblrWv+Cv4Tw83GiSMHOn9M= +cloud.google.com/go/cloudbuild v1.7.0/go.mod h1:zb5tWh2XI6lR9zQmsm1VRA+7OCuve5d8S+zJUul8KTg= +cloud.google.com/go/cloudbuild v1.9.0/go.mod h1:qK1d7s4QlO0VwfYn5YuClDGg2hfmLZEb4wQGAbIgL1s= +cloud.google.com/go/clouddms v1.3.0/go.mod h1:oK6XsCDdW4Ib3jCCBugx+gVjevp2TMXFtgxvPSee3OM= +cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk= +cloud.google.com/go/clouddms v1.5.0/go.mod h1:QSxQnhikCLUw13iAbffF2CZxAER3xDGNHjsTAkQJcQA= +cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= +cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= +cloud.google.com/go/cloudtasks v1.7.0/go.mod h1:ImsfdYWwlWNJbdgPIIGJWC+gemEGTBK/SunNQQNCAb4= +cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI= +cloud.google.com/go/cloudtasks v1.9.0/go.mod h1:w+EyLsVkLWHcOaqNEyvcKAsWp9p29dL6uL9Nst1cI7Y= +cloud.google.com/go/cloudtasks v1.10.0/go.mod h1:NDSoTLkZ3+vExFEWu2UJV1arUyzVDAiZtdWcsUyNwBs= +cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= +cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= +cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= +cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= +cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= +cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= +cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= +cloud.google.com/go/compute v1.12.0/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= +cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= +cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE= +cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63rR+SXhcpA= +cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= +cloud.google.com/go/compute v1.19.0 h1:+9zda3WGgW1ZSTlVppLCYFIr48Pa35q1uG2N1itbCEQ= +cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU= +cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= +cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= +cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= +cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY= +cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= +cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w= +cloud.google.com/go/container v1.6.0/go.mod h1:Xazp7GjJSeUYo688S+6J5V+n/t+G5sKBTFkKNudGRxg= +cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo= +cloud.google.com/go/container v1.13.1/go.mod h1:6wgbMPeQRw9rSnKBCAJXnds3Pzj03C4JHamr8asWKy4= +cloud.google.com/go/container v1.14.0/go.mod h1:3AoJMPhHfLDxLvrlVWaK57IXzaPnLaZq63WX59aQBfM= +cloud.google.com/go/container v1.15.0/go.mod h1:ft+9S0WGjAyjDggg5S06DXj+fHJICWg8L7isCQe9pQA= +cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= +cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= +cloud.google.com/go/containeranalysis v0.7.0/go.mod h1:9aUL+/vZ55P2CXfuZjS4UjQ9AgXoSw8Ts6lemfmxBxI= +cloud.google.com/go/containeranalysis v0.9.0/go.mod h1:orbOANbwk5Ejoom+s+DUCTTJ7IBdBQJDcSylAx/on9s= +cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= +cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= +cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= +cloud.google.com/go/datacatalog v1.7.0/go.mod h1:9mEl4AuDYWw81UGc41HonIHH7/sn52H0/tc8f8ZbZIE= +cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM= +cloud.google.com/go/datacatalog v1.8.1/go.mod h1:RJ58z4rMp3gvETA465Vg+ag8BGgBdnRPEMMSTr5Uv+M= +cloud.google.com/go/datacatalog v1.12.0/go.mod h1:CWae8rFkfp6LzLumKOnmVh4+Zle4A3NXLzVJ1d1mRm0= +cloud.google.com/go/datacatalog v1.13.0/go.mod h1:E4Rj9a5ZtAxcQJlEBTLgMTphfP11/lNaAshpoBgemX8= +cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= +cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= +cloud.google.com/go/dataflow v0.8.0/go.mod h1:Rcf5YgTKPtQyYz8bLYhFoIV/vP39eL7fWNcSOyFfLJE= +cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= +cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= +cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0= +cloud.google.com/go/dataform v0.6.0/go.mod h1:QPflImQy33e29VuapFdf19oPbE4aYTJxr31OAPV+ulA= +cloud.google.com/go/dataform v0.7.0/go.mod h1:7NulqnVozfHvWUBpMDfKMUESr+85aJsC/2O0o3jWPDE= +cloud.google.com/go/datafusion v1.4.0/go.mod h1:1Zb6VN+W6ALo85cXnM1IKiPw+yQMKMhB9TsTSRDo/38= +cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w= +cloud.google.com/go/datafusion v1.6.0/go.mod h1:WBsMF8F1RhSXvVM8rCV3AeyWVxcC2xY6vith3iw3S+8= +cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= +cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= +cloud.google.com/go/datalabeling v0.7.0/go.mod h1:WPQb1y08RJbmpM3ww0CSUAGweL0SxByuW2E+FU+wXcM= +cloud.google.com/go/dataplex v1.3.0/go.mod h1:hQuRtDg+fCiFgC8j0zV222HvzFQdRd+SVX8gdmFcZzA= +cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A= +cloud.google.com/go/dataplex v1.5.2/go.mod h1:cVMgQHsmfRoI5KFYq4JtIBEUbYwc3c7tXmIDhRmNNVQ= +cloud.google.com/go/dataplex v1.6.0/go.mod h1:bMsomC/aEJOSpHXdFKFGQ1b0TDPIeL28nJObeO1ppRs= +cloud.google.com/go/dataproc v1.7.0/go.mod h1:CKAlMjII9H90RXaMpSxQ8EU6dQx6iAYNPcYPOkSbi8s= +cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI= +cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4= +cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= +cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= +cloud.google.com/go/dataqna v0.7.0/go.mod h1:Lx9OcIIeqCrw1a6KdO3/5KMP1wAmTc0slZWwP12Qq3c= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM= +cloud.google.com/go/datastore v1.11.0/go.mod h1:TvGxBIHCS50u8jzG+AW/ppf87v1of8nwzFNgEZU1D3c= +cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= +cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= +cloud.google.com/go/datastream v1.4.0/go.mod h1:h9dpzScPhDTs5noEMQVWP8Wx8AFBRyS0s8KWPx/9r0g= +cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4= +cloud.google.com/go/datastream v1.6.0/go.mod h1:6LQSuswqLa7S4rPAOZFVjHIG3wJIjZcZrw8JDEDJuIs= +cloud.google.com/go/datastream v1.7.0/go.mod h1:uxVRMm2elUSPuh65IbZpzJNMbuzkcvu5CjMqVIUHrww= +cloud.google.com/go/deploy v1.4.0/go.mod h1:5Xghikd4VrmMLNaF6FiRFDlHb59VM59YoDQnOUdsH/c= +cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s= +cloud.google.com/go/deploy v1.6.0/go.mod h1:f9PTHehG/DjCom3QH0cntOVRm93uGBDt2vKzAPwpXQI= +cloud.google.com/go/deploy v1.8.0/go.mod h1:z3myEJnA/2wnB4sgjqdMfgxCA0EqC3RBTNcVPs93mtQ= +cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= +cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= +cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= +cloud.google.com/go/dialogflow v1.18.0/go.mod h1:trO7Zu5YdyEuR+BhSNOqJezyFQ3aUzz0njv7sMx/iek= +cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0= +cloud.google.com/go/dialogflow v1.29.0/go.mod h1:b+2bzMe+k1s9V+F2jbJwpHPzrnIyHihAdRFMtn2WXuM= +cloud.google.com/go/dialogflow v1.31.0/go.mod h1:cuoUccuL1Z+HADhyIA7dci3N5zUssgpBJmCzI6fNRB4= +cloud.google.com/go/dialogflow v1.32.0/go.mod h1:jG9TRJl8CKrDhMEcvfcfFkkpp8ZhgPz3sBGmAUYJ2qE= +cloud.google.com/go/dlp v1.6.0/go.mod h1:9eyB2xIhpU0sVwUixfBubDoRwP+GjeUoxxeueZmqvmM= +cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q= +cloud.google.com/go/dlp v1.9.0/go.mod h1:qdgmqgTyReTz5/YNSSuueR8pl7hO0o9bQ39ZhtgkWp4= +cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= +cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= +cloud.google.com/go/documentai v1.9.0/go.mod h1:FS5485S8R00U10GhgBC0aNGrJxBP8ZVpEeJ7PQDZd6k= +cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4= +cloud.google.com/go/documentai v1.16.0/go.mod h1:o0o0DLTEZ+YnJZ+J4wNfTxmDVyrkzFvttBXXtYRMHkM= +cloud.google.com/go/documentai v1.18.0/go.mod h1:F6CK6iUH8J81FehpskRmhLq/3VlwQvb7TvwOceQ2tbs= +cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= +cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= +cloud.google.com/go/domains v0.8.0/go.mod h1:M9i3MMDzGFXsydri9/vW+EWz9sWb4I6WyHqdlAk0idE= +cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= +cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= +cloud.google.com/go/edgecontainer v0.3.0/go.mod h1:FLDpP4nykgwwIfcLt6zInhprzw0lEi2P1fjO6Ie0qbc= +cloud.google.com/go/edgecontainer v1.0.0/go.mod h1:cttArqZpBB2q58W/upSG++ooo6EsblxDIolxa3jSjbY= +cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= +cloud.google.com/go/essentialcontacts v1.3.0/go.mod h1:r+OnHa5jfj90qIfZDO/VztSFqbQan7HV75p8sA+mdGI= +cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8= +cloud.google.com/go/essentialcontacts v1.5.0/go.mod h1:ay29Z4zODTuwliK7SnX8E86aUF2CTzdNtvv42niCX0M= +cloud.google.com/go/eventarc v1.7.0/go.mod h1:6ctpF3zTnaQCxUjHUdcfgcA1A2T309+omHZth7gDfmc= +cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw= +cloud.google.com/go/eventarc v1.10.0/go.mod h1:u3R35tmZ9HvswGRBnF48IlYgYeBcPUCjkr4BTdem2Kw= +cloud.google.com/go/eventarc v1.11.0/go.mod h1:PyUjsUKPWoRBCHeOxZd/lbOOjahV41icXyUY5kSTvVY= +cloud.google.com/go/filestore v1.3.0/go.mod h1:+qbvHGvXU1HaKX2nD0WEPo92TP/8AQuCVEBXNY9z0+w= +cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI= +cloud.google.com/go/filestore v1.5.0/go.mod h1:FqBXDWBp4YLHqRnVGveOkHDf8svj9r5+mUDLupOWEDs= +cloud.google.com/go/filestore v1.6.0/go.mod h1:di5unNuss/qfZTw2U9nhFqo8/ZDSc466dre85Kydllg= cloud.google.com/go/firestore v1.9.0 h1:IBlRyxgGySXu5VuW0RgGFlTtLukSnNkpDiEOMkQkmpA= cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= -cloud.google.com/go/longrunning v0.3.0 h1:NjljC+FYPV3uh5/OwWT6pVU+doBqMg2x/rZlE+CamDs= +cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= +cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= +cloud.google.com/go/functions v1.8.0/go.mod h1:RTZ4/HsQjIqIYP9a9YPbU+QFoQsAlYgrwOXJWHn1POY= +cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08= +cloud.google.com/go/functions v1.10.0/go.mod h1:0D3hEOe3DbEvCXtYOZHQZmD+SzYsi1YbI7dGvHfldXw= +cloud.google.com/go/functions v1.12.0/go.mod h1:AXWGrF3e2C/5ehvwYo/GH6O5s09tOPksiKhz+hH8WkA= +cloud.google.com/go/functions v1.13.0/go.mod h1:EU4O007sQm6Ef/PwRsI8N2umygGqPBS/IZQKBQBcJ3c= +cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= +cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= +cloud.google.com/go/gaming v1.7.0/go.mod h1:LrB8U7MHdGgFG851iHAfqUdLcKBdQ55hzXy9xBJz0+w= +cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM= +cloud.google.com/go/gaming v1.9.0/go.mod h1:Fc7kEmCObylSWLO334NcO+O9QMDyz+TKC4v1D7X+Bc0= +cloud.google.com/go/gkebackup v0.2.0/go.mod h1:XKvv/4LfG829/B8B7xRkk8zRrOEbKtEam6yNfuQNH60= +cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo= +cloud.google.com/go/gkebackup v0.4.0/go.mod h1:byAyBGUwYGEEww7xsbnUTBHIYcOPy/PgUWUtOeRm9Vg= +cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= +cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= +cloud.google.com/go/gkeconnect v0.7.0/go.mod h1:SNfmVqPkaEi3bF/B3CNZOAYPYdg7sU+obZ+QTky2Myw= +cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= +cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= +cloud.google.com/go/gkehub v0.11.0/go.mod h1:JOWHlmN+GHyIbuWQPl47/C2RFhnFKH38jH9Ascu3n0E= +cloud.google.com/go/gkehub v0.12.0/go.mod h1:djiIwwzTTBrF5NaXCGv3mf7klpEMcST17VBTVVDcuaw= +cloud.google.com/go/gkemulticloud v0.3.0/go.mod h1:7orzy7O0S+5kq95e4Hpn7RysVA7dPs8W/GgfUtsPbrA= +cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI= +cloud.google.com/go/gkemulticloud v0.5.0/go.mod h1:W0JDkiyi3Tqh0TJr//y19wyb1yf8llHVto2Htf2Ja3Y= +cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= +cloud.google.com/go/gsuiteaddons v1.3.0/go.mod h1:EUNK/J1lZEZO8yPtykKxLXI6JSVN2rg9bN8SXOa0bgM= +cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o= +cloud.google.com/go/gsuiteaddons v1.5.0/go.mod h1:TFCClYLd64Eaa12sFVmUyG62tk4mdIsI7pAnSXRkcFo= +cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= +cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= +cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= +cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc= +cloud.google.com/go/iam v0.7.0/go.mod h1:H5Br8wRaDGNc8XP3keLc4unfUUZeyH3Sfl9XpQEYOeg= +cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= +cloud.google.com/go/iam v0.11.0/go.mod h1:9PiLDanza5D+oWFZiH1uG+RnRCfEGKoyl6yo4cgWZGY= +cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY= +cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= +cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc= +cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= +cloud.google.com/go/iap v1.6.0/go.mod h1:NSuvI9C/j7UdjGjIde7t7HBz+QTwBcapPE07+sSRcLk= +cloud.google.com/go/iap v1.7.0/go.mod h1:beqQx56T9O1G1yNPph+spKpNibDlYIiIixiqsQXxLIo= +cloud.google.com/go/iap v1.7.1/go.mod h1:WapEwPc7ZxGt2jFGB/C/bm+hP0Y6NXzOYGjpPnmMS74= +cloud.google.com/go/ids v1.1.0/go.mod h1:WIuwCaYVOzHIj2OhN9HAwvW+DBdmUAdcWlFxRl+KubM= +cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY= +cloud.google.com/go/ids v1.3.0/go.mod h1:JBdTYwANikFKaDP6LtW5JAi4gubs57SVNQjemdt6xV4= +cloud.google.com/go/iot v1.3.0/go.mod h1:r7RGh2B61+B8oz0AGE+J72AhA0G7tdXItODWsaA2oLs= +cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g= +cloud.google.com/go/iot v1.5.0/go.mod h1:mpz5259PDl3XJthEmh9+ap0affn/MqNSP4My77Qql9o= +cloud.google.com/go/iot v1.6.0/go.mod h1:IqdAsmE2cTYYNO1Fvjfzo9po179rAtJeVGUvkLN3rLE= +cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= +cloud.google.com/go/kms v1.5.0/go.mod h1:QJS2YY0eJGBg3mnDfuaCyLauWwBJiHRboYxJ++1xJNg= +cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0= +cloud.google.com/go/kms v1.8.0/go.mod h1:4xFEhYFqvW+4VMELtZyxomGSYtSQKzM178ylFW4jMAg= +cloud.google.com/go/kms v1.9.0/go.mod h1:qb1tPTgfF9RQP8e1wq4cLFErVuTJv7UsSC915J8dh3w= +cloud.google.com/go/kms v1.10.0/go.mod h1:ng3KTUtQQU9bPX3+QGLsflZIHlkbn8amFAMY63m8d24= +cloud.google.com/go/kms v1.10.1/go.mod h1:rIWk/TryCkR59GMC3YtHtXeLzd634lBbKenvyySAyYI= +cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= +cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= +cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE= +cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8= +cloud.google.com/go/language v1.9.0/go.mod h1:Ns15WooPM5Ad/5no/0n81yUetis74g3zrbeJBE+ptUY= +cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= +cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= +cloud.google.com/go/lifesciences v0.8.0/go.mod h1:lFxiEOMqII6XggGbOnKiyZ7IBwoIqA84ClvoezaA/bo= +cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw= +cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M= +cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE= cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= +cloud.google.com/go/longrunning v0.4.1 h1:v+yFJOfKC3yZdY6ZUI933pIYdhyhV8S3NpWrXWmg7jM= +cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= +cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE= +cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= +cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA= +cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI= +cloud.google.com/go/maps v0.6.0/go.mod h1:o6DAMMfb+aINHz/p/jbcY+mYeXBoZoxTfdSQ8VAJaCw= +cloud.google.com/go/maps v0.7.0/go.mod h1:3GnvVl3cqeSvgMcpRlQidXsPYuDGQ8naBis7MVzpXsY= +cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= +cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= +cloud.google.com/go/mediatranslation v0.7.0/go.mod h1:LCnB/gZr90ONOIQLgSXagp8XUW1ODs2UmUMvcgMfI2I= +cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= +cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= +cloud.google.com/go/memcache v1.6.0/go.mod h1:XS5xB0eQZdHtTuTF9Hf8eJkKtR3pVRCcvJwtm68T3rA= +cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY= +cloud.google.com/go/memcache v1.9.0/go.mod h1:8oEyzXCu+zo9RzlEaEjHl4KkgjlNDaXbCQeQWlzNFJM= +cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= +cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= +cloud.google.com/go/metastore v1.7.0/go.mod h1:s45D0B4IlsINu87/AsWiEVYbLaIMeUSoxlKKDqBGFS8= +cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI= +cloud.google.com/go/metastore v1.10.0/go.mod h1:fPEnH3g4JJAk+gMRnrAnoqyv2lpUCqJPWOodSaf45Eo= +cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhIsnmlA53dvEk= +cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= +cloud.google.com/go/monitoring v1.12.0/go.mod h1:yx8Jj2fZNEkL/GYZyTLS4ZtZEZN8WtDEiEqG4kLK50w= +cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw= +cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= +cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= +cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM= +cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8= +cloud.google.com/go/networkconnectivity v1.10.0/go.mod h1:UP4O4sWXJG13AqrTdQCD9TnLGEbtNRqjuaaA7bNjF5E= +cloud.google.com/go/networkconnectivity v1.11.0/go.mod h1:iWmDD4QF16VCDLXUqvyspJjIEtBR/4zq5hwnY2X3scM= +cloud.google.com/go/networkmanagement v1.4.0/go.mod h1:Q9mdLLRn60AsOrPc8rs8iNV6OHXaGcDdsIQe1ohekq8= +cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4= +cloud.google.com/go/networkmanagement v1.6.0/go.mod h1:5pKPqyXjB/sgtvB5xqOemumoQNB7y95Q7S+4rjSOPYY= +cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= +cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= +cloud.google.com/go/networksecurity v0.7.0/go.mod h1:mAnzoxx/8TBSyXEeESMy9OOYwo1v+gZ5eMRnsT5bC8k= +cloud.google.com/go/networksecurity v0.8.0/go.mod h1:B78DkqsxFG5zRSVuwYFRZ9Xz8IcQ5iECsNrPn74hKHU= +cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= +cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= +cloud.google.com/go/notebooks v1.4.0/go.mod h1:4QPMngcwmgb6uw7Po99B2xv5ufVoIQ7nOGDyL4P8AgA= +cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0= +cloud.google.com/go/notebooks v1.7.0/go.mod h1:PVlaDGfJgj1fl1S3dUwhFMXFgfYGhYQt2164xOMONmE= +cloud.google.com/go/notebooks v1.8.0/go.mod h1:Lq6dYKOYOWUCTvw5t2q1gp1lAp0zxAxRycayS0iJcqQ= +cloud.google.com/go/optimization v1.1.0/go.mod h1:5po+wfvX5AQlPznyVEZjGJTMr4+CAkJf2XSTQOOl9l4= +cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs= +cloud.google.com/go/optimization v1.3.1/go.mod h1:IvUSefKiwd1a5p0RgHDbWCIbDFgKuEdB+fPPuP0IDLI= +cloud.google.com/go/orchestration v1.3.0/go.mod h1:Sj5tq/JpWiB//X/q3Ngwdl5K7B7Y0KZ7bfv0wL6fqVA= +cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk= +cloud.google.com/go/orchestration v1.6.0/go.mod h1:M62Bevp7pkxStDfFfTuCOaXgaaqRAga1yKyoMtEoWPQ= +cloud.google.com/go/orgpolicy v1.4.0/go.mod h1:xrSLIV4RePWmP9P3tBl8S93lTmlAxjm06NSm2UTmKvE= +cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc= +cloud.google.com/go/orgpolicy v1.10.0/go.mod h1:w1fo8b7rRqlXlIJbVhOMPrwVljyuW5mqssvBtU18ONc= +cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= +cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= +cloud.google.com/go/osconfig v1.9.0/go.mod h1:Yx+IeIZJ3bdWmzbQU4fxNl8xsZ4amB+dygAwFPlvnNo= +cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw= +cloud.google.com/go/osconfig v1.11.0/go.mod h1:aDICxrur2ogRd9zY5ytBLV89KEgT2MKB2L/n6x1ooPw= +cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= +cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= +cloud.google.com/go/oslogin v1.6.0/go.mod h1:zOJ1O3+dTU8WPlGEkFSh7qeHPPSoxrcMbbK1Nm2iX70= +cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo= +cloud.google.com/go/oslogin v1.9.0/go.mod h1:HNavntnH8nzrn8JCTT5fj18FuJLFJc4NaZJtBnQtKFs= +cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= +cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= +cloud.google.com/go/phishingprotection v0.7.0/go.mod h1:8qJI4QKHoda/sb/7/YmMQ2omRLSLYSu9bU0EKCNI+Lk= +cloud.google.com/go/policytroubleshooter v1.3.0/go.mod h1:qy0+VwANja+kKrjlQuOzmlvscn4RNsAc0e15GGqfMxg= +cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE= +cloud.google.com/go/policytroubleshooter v1.5.0/go.mod h1:Rz1WfV+1oIpPdN2VvvuboLVRsB1Hclg3CKQ53j9l8vw= +cloud.google.com/go/policytroubleshooter v1.6.0/go.mod h1:zYqaPTsmfvpjm5ULxAyD/lINQxJ0DDsnWOP/GZ7xzBc= +cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= +cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= +cloud.google.com/go/privatecatalog v0.7.0/go.mod h1:2s5ssIFO69F5csTXcwBP7NPFTZvps26xGzvQ2PQaBYg= +cloud.google.com/go/privatecatalog v0.8.0/go.mod h1:nQ6pfaegeDAq/Q5lrfCQzQLhubPiZhSaNhIgfJlnIXs= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/pubsub v1.26.0/go.mod h1:QgBH3U/jdJy/ftjPhTkyXNj543Tin1pRYcdcPRnFIRI= +cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0= +cloud.google.com/go/pubsub v1.28.0/go.mod h1:vuXFpwaVoIPQMGXqRyUQigu/AX1S3IWugR9xznmcXX8= +cloud.google.com/go/pubsub v1.30.0/go.mod h1:qWi1OPS0B+b5L+Sg6Gmc9zD1Y+HaM0MdUr7LsupY1P4= +cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg= +cloud.google.com/go/pubsublite v1.6.0/go.mod h1:1eFCS0U11xlOuMFV/0iBqw3zP12kddMeCbj/F3FSj9k= +cloud.google.com/go/pubsublite v1.7.0/go.mod h1:8hVMwRXfDfvGm3fahVbtDbiLePT3gpoiJYJY+vxWxVM= +cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= +cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= +cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= +cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= +cloud.google.com/go/recaptchaenterprise/v2 v2.4.0/go.mod h1:Am3LHfOuBstrLrNCBrlI5sbwx9LBg3te2N6hGvHn2mE= +cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U= +cloud.google.com/go/recaptchaenterprise/v2 v2.6.0/go.mod h1:RPauz9jeLtB3JVzg6nCbe12qNoaa8pXc4d/YukAmcnA= +cloud.google.com/go/recaptchaenterprise/v2 v2.7.0/go.mod h1:19wVj/fs5RtYtynAPJdDTb69oW0vNHYDBTbB4NvMD9c= +cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= +cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= +cloud.google.com/go/recommendationengine v0.7.0/go.mod h1:1reUcE3GIu6MeBz/h5xZJqNLuuVjNg1lmWMPyjatzac= +cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= +cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= +cloud.google.com/go/recommender v1.7.0/go.mod h1:XLHs/W+T8olwlGOgfQenXBTbIseGclClff6lhFVe9Bs= +cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70= +cloud.google.com/go/recommender v1.9.0/go.mod h1:PnSsnZY7q+VL1uax2JWkt/UegHssxjUVVCrX52CuEmQ= +cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= +cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= +cloud.google.com/go/redis v1.9.0/go.mod h1:HMYQuajvb2D0LvMgZmLDZW8V5aOC/WxstZHiy4g8OiA= +cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM= +cloud.google.com/go/redis v1.11.0/go.mod h1:/X6eicana+BWcUda5PpwZC48o37SiFVTFSs0fWAJ7uQ= +cloud.google.com/go/resourcemanager v1.3.0/go.mod h1:bAtrTjZQFJkiWTPDb1WBjzvc6/kifjj4QBYuKCCoqKA= +cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0= +cloud.google.com/go/resourcemanager v1.5.0/go.mod h1:eQoXNAiAvCf5PXxWxXjhKQoTMaUSNrEfg+6qdf/wots= +cloud.google.com/go/resourcemanager v1.6.0/go.mod h1:YcpXGRs8fDzcUl1Xw8uOVmI8JEadvhRIkoXXUNVYcVo= +cloud.google.com/go/resourcemanager v1.7.0/go.mod h1:HlD3m6+bwhzj9XCouqmeiGuni95NTrExfhoSrkC/3EI= +cloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU= +cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg= +cloud.google.com/go/resourcesettings v1.5.0/go.mod h1:+xJF7QSG6undsQDfsCJyqWXyBwUoJLhetkRMDRnIoXA= +cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= +cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= +cloud.google.com/go/retail v1.10.0/go.mod h1:2gDk9HsL4HMS4oZwz6daui2/jmKvqShXKQuB2RZ+cCc= +cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y= +cloud.google.com/go/retail v1.12.0/go.mod h1:UMkelN/0Z8XvKymXFbD4EhFJlYKRx1FGhQkVPU5kF14= +cloud.google.com/go/run v0.2.0/go.mod h1:CNtKsTA1sDcnqqIFR3Pb5Tq0usWxJJvsWOCPldRU3Do= +cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo= +cloud.google.com/go/run v0.8.0/go.mod h1:VniEnuBwqjigv0A7ONfQUaEItaiCRVujlMqerPPiktM= +cloud.google.com/go/run v0.9.0/go.mod h1:Wwu+/vvg8Y+JUApMwEDfVfhetv30hCG4ZwDR/IXl2Qg= +cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= +cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= +cloud.google.com/go/scheduler v1.6.0/go.mod h1:SgeKVM7MIwPn3BqtcBntpLyrIJftQISRrYB5ZtT+KOk= +cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44= +cloud.google.com/go/scheduler v1.8.0/go.mod h1:TCET+Y5Gp1YgHT8py4nlg2Sew8nUHMqcpousDgXJVQc= +cloud.google.com/go/scheduler v1.9.0/go.mod h1:yexg5t+KSmqu+njTIh3b7oYPheFtBWGcbVUYF1GGMIc= +cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= +cloud.google.com/go/secretmanager v1.8.0/go.mod h1:hnVgi/bN5MYHd3Gt0SPuTPPp5ENina1/LxM+2W9U9J4= +cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4= +cloud.google.com/go/secretmanager v1.10.0/go.mod h1:MfnrdvKMPNra9aZtQFvBcvRU54hbPD8/HayQdlUgJpU= +cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= +cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= +cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= +cloud.google.com/go/security v1.9.0/go.mod h1:6Ta1bO8LXI89nZnmnsZGp9lVoVWXqsVbIq/t9dzI+2Q= +cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA= +cloud.google.com/go/security v1.12.0/go.mod h1:rV6EhrpbNHrrxqlvW0BWAIawFWq3X90SduMJdFwtLB8= +cloud.google.com/go/security v1.13.0/go.mod h1:Q1Nvxl1PAgmeW0y3HTt54JYIvUdtcpYKVfIB8AOMZ+0= +cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= +cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= +cloud.google.com/go/securitycenter v1.15.0/go.mod h1:PeKJ0t8MoFmmXLXWm41JidyzI3PJjd8sXWaVqg43WWk= +cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk= +cloud.google.com/go/securitycenter v1.18.1/go.mod h1:0/25gAzCM/9OL9vVx4ChPeM/+DlfGQJDwBy/UC8AKK0= +cloud.google.com/go/securitycenter v1.19.0/go.mod h1:LVLmSg8ZkkyaNy4u7HCIshAngSQ8EcIRREP3xBnyfag= +cloud.google.com/go/servicecontrol v1.4.0/go.mod h1:o0hUSJ1TXJAmi/7fLJAedOovnujSEvjKCAFNXPQ1RaU= +cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s= +cloud.google.com/go/servicecontrol v1.10.0/go.mod h1:pQvyvSRh7YzUF2efw7H87V92mxU8FnFDawMClGCNuAA= +cloud.google.com/go/servicecontrol v1.11.0/go.mod h1:kFmTzYzTUIuZs0ycVqRHNaNhgR+UMUpw9n02l/pY+mc= +cloud.google.com/go/servicecontrol v1.11.1/go.mod h1:aSnNNlwEFBY+PWGQ2DoM0JJ/QUXqV5/ZD9DOLB7SnUk= +cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= +cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= +cloud.google.com/go/servicedirectory v1.6.0/go.mod h1:pUlbnWsLH9c13yGkxCmfumWEPjsRs1RlmJ4pqiNjVL4= +cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U= +cloud.google.com/go/servicedirectory v1.8.0/go.mod h1:srXodfhY1GFIPvltunswqXpVxFPpZjf8nkKQT7XcXaY= +cloud.google.com/go/servicedirectory v1.9.0/go.mod h1:29je5JjiygNYlmsGz8k6o+OZ8vd4f//bQLtvzkPPT/s= +cloud.google.com/go/servicemanagement v1.4.0/go.mod h1:d8t8MDbezI7Z2R1O/wu8oTggo3BI2GKYbdG4y/SJTco= +cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo= +cloud.google.com/go/servicemanagement v1.6.0/go.mod h1:aWns7EeeCOtGEX4OvZUWCCJONRZeFKiptqKf1D0l/Jc= +cloud.google.com/go/servicemanagement v1.8.0/go.mod h1:MSS2TDlIEQD/fzsSGfCdJItQveu9NXnUniTrq/L8LK4= +cloud.google.com/go/serviceusage v1.3.0/go.mod h1:Hya1cozXM4SeSKTAgGXgj97GlqUvF5JaoXacR1JTP/E= +cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU= +cloud.google.com/go/serviceusage v1.5.0/go.mod h1:w8U1JvqUqwJNPEOTQjrMHkw3IaIFLoLsPLvsE3xueec= +cloud.google.com/go/serviceusage v1.6.0/go.mod h1:R5wwQcbOWsyuOfbP9tGdAnCAc6B9DRwPG1xtWMDeuPA= +cloud.google.com/go/shell v1.3.0/go.mod h1:VZ9HmRjZBsjLGXusm7K5Q5lzzByZmJHf1d0IWHEN5X4= +cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw= +cloud.google.com/go/shell v1.6.0/go.mod h1:oHO8QACS90luWgxP3N9iZVuEiSF84zNyLytb+qE2f9A= +cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos= +cloud.google.com/go/spanner v1.44.0/go.mod h1:G8XIgYdOK+Fbcpbs7p2fiprDw4CaZX63whnSMLVBxjk= +cloud.google.com/go/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M= +cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= +cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= +cloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0= +cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco= +cloud.google.com/go/speech v1.14.1/go.mod h1:gEosVRPJ9waG7zqqnsHpYTOoAS4KouMRLDFMekpJ0J0= +cloud.google.com/go/speech v1.15.0/go.mod h1:y6oH7GhqCaZANH7+Oe0BhgIogsNInLlz542tg3VqeYI= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= +cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= +cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= +cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= +cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y= +cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= +cloud.google.com/go/storagetransfer v1.5.0/go.mod h1:dxNzUopWy7RQevYFHewchb29POFv3/AaBgnhqzqiK0w= +cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I= +cloud.google.com/go/storagetransfer v1.7.0/go.mod h1:8Giuj1QNb1kfLAiWM1bN6dHzfdlDAVC9rv9abHot2W4= +cloud.google.com/go/storagetransfer v1.8.0/go.mod h1:JpegsHHU1eXg7lMHkvf+KE5XDJ7EQu0GwNJbbVGanEw= +cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= +cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= +cloud.google.com/go/talent v1.3.0/go.mod h1:CmcxwJ/PKfRgd1pBjQgU6W3YBwiewmUzQYH5HHmSCmM= +cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA= +cloud.google.com/go/talent v1.5.0/go.mod h1:G+ODMj9bsasAEJkQSzO2uHQWXHHXUomArjWQQYkqK6c= +cloud.google.com/go/texttospeech v1.4.0/go.mod h1:FX8HQHA6sEpJ7rCMSfXuzBcysDAuWusNNNvN9FELDd8= +cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4= +cloud.google.com/go/texttospeech v1.6.0/go.mod h1:YmwmFT8pj1aBblQOI3TfKmwibnsfvhIBzPXcW4EBovc= +cloud.google.com/go/tpu v1.3.0/go.mod h1:aJIManG0o20tfDQlRIej44FcwGGl/cD0oiRyMKG19IQ= +cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg= +cloud.google.com/go/tpu v1.5.0/go.mod h1:8zVo1rYDFuW2l4yZVY0R0fb/v44xLh3llq7RuV61fPM= +cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg6N0G28= +cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= +cloud.google.com/go/trace v1.8.0/go.mod h1:zH7vcsbAhklH8hWFig58HvxcxyQbaIqMarMg9hn5ECA= +cloud.google.com/go/trace v1.9.0/go.mod h1:lOQqpE5IaWY0Ixg7/r2SjixMuc6lfTFeO4QGM4dQWOk= +cloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs= +cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= +cloud.google.com/go/translate v1.5.0/go.mod h1:29YDSYveqqpA1CQFD7NQuP49xymq17RXNaUDdc0mNu0= +cloud.google.com/go/translate v1.6.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= +cloud.google.com/go/translate v1.7.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= +cloud.google.com/go/video v1.8.0/go.mod h1:sTzKFc0bUSByE8Yoh8X0mn8bMymItVGPfTuUBUyRgxk= +cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw= +cloud.google.com/go/video v1.12.0/go.mod h1:MLQew95eTuaNDEGriQdcYn0dTwf9oWiA4uYebxM5kdg= +cloud.google.com/go/video v1.13.0/go.mod h1:ulzkYlYgCp15N2AokzKjy7MQ9ejuynOJdf1tR5lGthk= +cloud.google.com/go/video v1.14.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= +cloud.google.com/go/video v1.15.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= +cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= +cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= +cloud.google.com/go/videointelligence v1.8.0/go.mod h1:dIcCn4gVDdS7yte/w+koiXn5dWVplOZkE+xwG9FgK+M= +cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU= +cloud.google.com/go/videointelligence v1.10.0/go.mod h1:LHZngX1liVtUhZvi2uNS0VQuOzNi2TkY1OakiuoUOjU= +cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= +cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= +cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= +cloud.google.com/go/vision/v2 v2.4.0/go.mod h1:VtI579ll9RpVTrdKdkMzckdnwMyX2JILb+MhPqRbPsY= +cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E= +cloud.google.com/go/vision/v2 v2.6.0/go.mod h1:158Hes0MvOS9Z/bDMSFpjwsUrZ5fPrdwuyyvKSGAGMY= +cloud.google.com/go/vision/v2 v2.7.0/go.mod h1:H89VysHy21avemp6xcf9b9JvZHVehWbET0uT/bcuY/0= +cloud.google.com/go/vmmigration v1.2.0/go.mod h1:IRf0o7myyWFSmVR1ItrBSFLFD/rJkfDCUTO4vLlJvsE= +cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g= +cloud.google.com/go/vmmigration v1.5.0/go.mod h1:E4YQ8q7/4W9gobHjQg4JJSgXXSgY21nA5r8swQV+Xxc= +cloud.google.com/go/vmmigration v1.6.0/go.mod h1:bopQ/g4z+8qXzichC7GW1w2MjbErL54rk3/C843CjfY= +cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208= +cloud.google.com/go/vmwareengine v0.2.2/go.mod h1:sKdctNJxb3KLZkE/6Oui94iw/xs9PRNC2wnNLXsHvH8= +cloud.google.com/go/vmwareengine v0.3.0/go.mod h1:wvoyMvNWdIzxMYSpH/R7y2h5h3WFkx6d+1TIsP39WGY= +cloud.google.com/go/vpcaccess v1.4.0/go.mod h1:aQHVbTWDYUR1EbTApSVvMq1EnT57ppDmQzZ3imqIk4w= +cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8= +cloud.google.com/go/vpcaccess v1.6.0/go.mod h1:wX2ILaNhe7TlVa4vC5xce1bCnqE3AeH27RV31lnmZes= +cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= +cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= +cloud.google.com/go/webrisk v1.6.0/go.mod h1:65sW9V9rOosnc9ZY7A7jsy1zoHS5W9IAXv6dGqhMQMc= +cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A= +cloud.google.com/go/webrisk v1.8.0/go.mod h1:oJPDuamzHXgUc+b8SiHRcVInZQuybnvEW72PqTc7sSg= +cloud.google.com/go/websecurityscanner v1.3.0/go.mod h1:uImdKm2wyeXQevQJXeh8Uun/Ym1VqworNDlBXQevGMo= +cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ= +cloud.google.com/go/websecurityscanner v1.5.0/go.mod h1:Y6xdCPy81yi0SQnDY1xdNTNpfY1oAgXUlcfN3B3eSng= +cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= +cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= +cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M= +cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA= +cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= +git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc= 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/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= +github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= +github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= +github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/apache/arrow/go/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0= +github.com/apache/arrow/go/v11 v11.0.0/go.mod h1:Eg5OsL5H+e299f7u5ssuXsuHQVEGC4xei5aX110hRiI= +github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-metrics v0.4.0 h1:yCQqn7dwca4ITXb+CbubHmedzaQYHhNhrEXLYUeEe8Q= @@ -71,12 +632,15 @@ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+Ce 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/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4= -github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +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/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= @@ -89,11 +653,15 @@ github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGX github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20230310173818-32f1caf87195/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI= @@ -102,6 +670,7 @@ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ3 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= 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= @@ -112,42 +681,53 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= 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/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34= +github.com/envoyproxy/go-control-plane v0.11.0/go.mod h1:VnHyVMpzcLvCFt9yUz1UnCwHLhwx1WguiVDV7pTG/tI= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo= +github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w= +github.com/envoyproxy/protoc-gen-validate v0.10.0/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= github.com/facebookgo/clock v0.0.0-20150410010913-600d898af40a h1:yDWHCSQ40h88yih2JAcL6Ls/kVkSE8GFACTGVnMPruw= github.com/facebookgo/clock v0.0.0-20150410010913-600d898af40a/go.mod h1:7Ga40egUymuWXxAe151lTNnCv97MddSOVsjpPPkityA= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/felixge/httpsnoop v1.0.2 h1:+nS9g82KMXccJ/wp0zyRW9ZBHFETmMGtkk+2CTTrW4o= -github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/foomo/gotsrpc/v2 v2.7.1 h1:uY1lamAGrUbQK/AsQW1LcJ8HztDli5mTkdRQH7pkbv8= -github.com/foomo/gotsrpc/v2 v2.7.1/go.mod h1:n5SiKVNCZ7Tob6wcROWT5Sx1i/W42+ErpTbNqT3etM8= -github.com/foomo/opentelemetry-go-contrib/instrumentation/net/http/otelhttp v0.32.1-0.20220517120905-10e2553b9bac h1:z8UXpHe2Hb9IzRawoeT49eUcxgGUY6g8Emj8TpUWl+4= -github.com/foomo/opentelemetry-go-contrib/instrumentation/net/http/otelhttp v0.32.1-0.20220517120905-10e2553b9bac/go.mod h1:5eCOqeGphOyz6TsY3ZDNjE33SM/TFAK3RGuCL2naTgY= -github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= +github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk= +github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/foomo/gotsrpc/v2 v2.7.2 h1:a94V/a8LSssq+aRN3Fv1lJPjWoyMilOvRq+yEaDTHVM= +github.com/foomo/gotsrpc/v2 v2.7.2/go.mod h1:n5SiKVNCZ7Tob6wcROWT5Sx1i/W42+ErpTbNqT3etM8= +github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= +github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= +github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= +github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -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.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= -github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= +github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= 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-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= +github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= @@ -156,13 +736,16 @@ github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7a github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/gogo/status v1.1.0 h1:+eIkrewn5q6b30y+g/BJINVVdi2xH7je5MPJ3ZPK3JA= github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= +github.com/gogo/status v1.1.1 h1:DuHXlSFHNKqTQ+/ACf5Vs6r4X/dH2EgIzR9Vr+H65kg= +github.com/gogo/status v1.1.1/go.mod h1:jpG3dM5QPcqu19Hg8lkUhBFBa3TcLs1DG7+2Jqci7oU= github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= +github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= +github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= 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= @@ -175,6 +758,7 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -192,14 +776,18 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= +github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= 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= @@ -213,12 +801,15 @@ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 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/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= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= @@ -229,35 +820,53 @@ github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/s2a-go v0.1.3 h1:FAgZmpLl/SXurPEZyCMPBIiiYeTbqfjlbdnCNTAkbGE= +github.com/google/s2a-go v0.1.3/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.2.1 h1:RY7tHKZcRlk788d5WSo/e83gOyyy742E8GSs771ySpg= +github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k= +github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.7.0 h1:IcsPKeInNvYi7eqSaDjiZqDDKu5rsmunY0Y1YupQSSQ= +github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= +github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= +github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= +github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= +github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= +github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= +github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= +github.com/googleapis/gax-go/v2 v2.8.0 h1:UBtEZqx1bjXtOQ5BVTkuYghXrr3N4V123VKJK67vJZc= +github.com/googleapis/gax-go/v2 v2.8.0/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= +github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 h1:BZHcxBETFHIdVyhyEfOvn/RdU/QGdLI4y34qQGjGWO0= github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= -github.com/hashicorp/consul/api v1.18.0 h1:R7PPNzTCeN6VuQNDwwhZWJvzCtGSrNpJqfb22h3yH9g= -github.com/hashicorp/consul/api v1.18.0/go.mod h1:owRRGJ9M5xReDC5nfT8FTJrNAPbT4NM6p/k+d03q2v4= -github.com/hashicorp/consul/sdk v0.13.0 h1:lce3nFlpv8humJL8rNrrGHYSKc3q+Kxfeg3Ii1m6ZWU= -github.com/hashicorp/consul/sdk v0.13.0/go.mod h1:0hs/l5fOVhJy/VdcoaNqUSi2AUs95eF5WKtv+EYIQqE= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3 h1:lLT7ZLSzGLI08vc9cpd+tYmNWjdKDqyr/2L+f6U12Fk= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= +github.com/hashicorp/consul/api v1.20.0 h1:9IHTjNVSZ7MIwjlW3N3a7iGiykCMDpxZu8jsxFJh0yc= +github.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo= +github.com/hashicorp/consul/sdk v0.13.1 h1:EygWVWWMczTzXGpO93awkHFzfUka6hLYJ0qhETd+6lY= github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-hclog v1.2.0 h1:La19f8d7WIlm4ogzNHB0JGqs5AUDAZ2UfCY4sJXcJdM= github.com/hashicorp/go-hclog v1.2.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= @@ -273,14 +882,11 @@ github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5O github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc= -github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE= -github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI= -github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= 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 v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= @@ -297,38 +903,42 @@ github.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHL github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.14.4 h1:eijASRJcobkVtSt81Olfh7JX43osYLwy5krOJo6YEu4= -github.com/klauspost/compress v1.14.4/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= +github.com/klauspost/compress v1.16.5 h1:IFV2oUNUzZaz+XyusxpLzpzS8Pt5rh0Z16For/djlyI= +github.com/klauspost/compress v1.16.5/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= 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/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +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/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw= -github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= +github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= +github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= +github.com/lyft/protoc-gen-star/v2 v2.0.1/go.mod h1:RcCdONR2ScXaYnQC5tUzxzlpA3WVYF7/opLeUgcQs/o= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= @@ -342,21 +952,23 @@ github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= +github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= 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/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -369,17 +981,15 @@ github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjY github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe h1:iruDEfMl2E6fbMZ9s0scYfZQ84/6SPL6zC8ACM2oIL0= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nats-io/jwt/v2 v2.2.1-0.20220113022732-58e87895b296 h1:vU9tpM3apjYlLLeY23zRWJ9Zktr5jp+mloR942LEOpY= github.com/nats-io/nats-server/v2 v2.7.3 h1:P0NgsnbTxrPMMPZ1/rLXWjS5bbPpRMCcPwlMd4nBDK4= github.com/nats-io/nats-server/v2 v2.7.3/go.mod h1:eJUrA5gm0ch6sJTEv85xmXIgQWsB0OyjkTsKXvlHbYc= -github.com/nats-io/nats.go v1.24.0 h1:CRiD8L5GOQu/DcfkmgBcTTIQORMwizF+rPk6T0RaHVQ= -github.com/nats-io/nats.go v1.24.0/go.mod h1:dVQF+BK3SzUZpwyzHedXsvH3EO38aVKuOPkkHlv5hXA= -github.com/nats-io/nkeys v0.3.0 h1:cgM5tL53EvYRU+2YLXIK0G2mJtK12Ft9oeooSZMA2G8= -github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4= +github.com/nats-io/nats.go v1.28.0 h1:Th4G6zdsz2d0OqXdfzKLClo6bOfoI/b1kInhRtFIy5c= +github.com/nats-io/nats.go v1.28.0/go.mod h1:XpbWUlOElGwTYbMR7imivs7jJj9GtK7ypv321Wp6pjc= +github.com/nats-io/nkeys v0.4.4 h1:xvBJ8d69TznjcQl9t6//Q5xXuVhyYiSos6RPtvQNTwA= +github.com/nats-io/nkeys v0.4.4/go.mod h1:XUkxdLPTufzlihbamfzQ7mw/VGx6ObUs+0bN5sNvt64= github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= @@ -387,14 +997,20 @@ github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0Mw github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pborman/uuid v1.2.1 h1:+ZZIw58t/ozdjRaXh/3awHfmWRbzYxJoAdNJxe/3pvw= github.com/pborman/uuid v1.2.1/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU= -github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= +github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= +github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= github.com/philhofer/fwd v1.1.2 h1:bnDivRJ1EWPjUIRXV5KfORO897HTbpFAQddBdE8t7Gw= github.com/philhofer/fwd v1.1.2/go.mod h1:qkPdfjR2SIEbspLqpe1tO4n5yICnr2DY7mqEx2tUTP0= +github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= +github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= +github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= +github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -405,62 +1021,63 @@ github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:Om github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= -github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= +github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= +github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= 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/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= +github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= +github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= -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.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= -github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= +github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM= +github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= 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.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -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.10.1 h1:kYK1Va/YMlutzCGazswoHKo//tZVlFpKYh+PymziUAg= +github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= +github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/robfig/cron v1.2.0 h1:ZjScXvvxeQ63Dbyxy76Fj3AT3Ut0aKsyd2/tl3DTMuQ= github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k= 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.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= +github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sagikazarmark/crypt v0.9.0 h1:fipzMFW34hFUEc4D7fsLQFtE7yElkpgyS2zruedRdZk= -github.com/sagikazarmark/crypt v0.9.0/go.mod h1:RnH7sEhxfdnPm1z+XMgSLjWTEIjyK4z2dw6+4vHTMuo= +github.com/sagikazarmark/crypt v0.10.0 h1:96E1qrToLBU6fGzo+PRRz7KGOc9FkYFiPnR3/zf8Smg= +github.com/sagikazarmark/crypt v0.10.0/go.mod h1:gwTNHQVoOS3xp9Xvz5LLR+1AauC5M6880z5NWzdhOyQ= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/shirou/gopsutil/v3 v3.22.3 h1:UebRzEomgMpv61e3hgD1tGooqX5trFbdU/ehphbHd00= -github.com/shirou/gopsutil/v3 v3.22.3/go.mod h1:D01hZJ4pVHPpCTZ3m3T2+wDF2YAGfd+H4ifUguaQzHM= +github.com/shirou/gopsutil/v3 v3.23.4 h1:hZwmDxZs7Ewt75DV81r4pFMqbq+di2cbt9FsQBqLD2o= +github.com/shirou/gopsutil/v3 v3.23.4/go.mod h1:ZcGxyfzAMRevhUR2+cfhXDH6gQdFYE/t8j1nsU4mPI8= +github.com/shoenig/go-m1cpu v0.1.5 h1:LF57Z/Fpb/WdGLjt2HZilNnmZOxg/q2bSKTQhgbrLrQ= +github.com/shoenig/go-m1cpu v0.1.5/go.mod h1:Wwvst4LR89UxjeFtLRMrpgRiyY4xPsejnVZym39dbAQ= +github.com/shoenig/test v0.6.3 h1:GVXWJFk9PiOjN0KoJ7VrJGH6uLPnqxR7/fe3HUPfE0c= +github.com/shoenig/test v0.6.3/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sony/gobreaker v0.5.0 h1:dRCvqm0P490vZPmy7ppEk2qCnCieBooFJ+YoXGYB+yg= github.com/sony/gobreaker v0.5.0/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.9.3 h1:41FoI0fD7OR7mGcKE/aOiLkGreyf8ifIOQmJANWogMk= -github.com/spf13/afero v1.9.3/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= -github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= -github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= +github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= +github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= +github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= +github.com/spf13/afero v1.9.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM= +github.com/spf13/afero v1.9.5/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= +github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= +github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.15.0 h1:js3yy885G8xwJa6iOISGFwd+qlUo5AvyXb7CiihdtiU= -github.com/spf13/viper v1.15.0/go.mod h1:fFcTBJxvhhzSJiZy8n+PeW6t8l+KeT/uTARa0jHOQLA= +github.com/spf13/viper v1.16.0 h1:rGGH0XDZhdUOryiDWjmIvUSWpbNqisK8Wk0Vyefw8hc= +github.com/spf13/viper v1.16.0/go.mod h1:yg78JgCJcbrQOvV9YLXgkLaZqUidkY9K+Dd1FofRzQg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.3.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= @@ -476,30 +1093,29 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ 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.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= -github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tinylib/msgp v1.1.8 h1:FCXC1xanKO4I8plpHGH2P7koL/RzZs12l/+r7vakfm0= github.com/tinylib/msgp v1.1.8/go.mod h1:qkpG+2ldGg4xRFmx+jfTvZPxfGFhi64BcnL9vkCm/Tw= -github.com/tklauser/go-sysconf v0.3.10 h1:IJ1AZGZRWbY8T5Vfk04D9WOA5WSejdflXxP03OUqALw= -github.com/tklauser/go-sysconf v0.3.10/go.mod h1:C8XykCvCb+Gn0oNCWPIlcb0RuglQTYaQ2hGm7jmxEFk= -github.com/tklauser/numcpus v0.4.0 h1:E53Dm1HjH1/R2/aoCtXtPgzmElmn51aOkhCFSuZq//o= -github.com/tklauser/numcpus v0.4.0/go.mod h1:1+UI3pD8NW14VMwdgJNJ1ESk2UnwhAnz5hMwiKKqXCQ= +github.com/tklauser/go-sysconf v0.3.11 h1:89WgdJhk5SNwJfu+GKyYveZ4IaJ7xAkecBo+KdJV0CM= +github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI= +github.com/tklauser/numcpus v0.6.0 h1:kebhY2Qt+3U6RNK7UqpYNA+tJ23IBEGKkB7JQBfDYms= +github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= -github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs= -github.com/xdg-go/scram v1.1.1 h1:VOMT+81stJgXW3CpHyqHN3AXDYIMsx56mEFrB37Mb/E= -github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g= -github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM= -github.com/xdg-go/stringprep v1.0.3 h1:kdwGpVNwPFtjs98xCGkHjQtGKh86rDcRZN17QEMCOIs= -github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8= +github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= +github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= +github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= +github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -511,110 +1127,129 @@ github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1 github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -go.etcd.io/etcd/api/v3 v3.5.6 h1:Cy2qx3npLcYqTKqGJzMypnMv2tiRyifZJ17BlWIWA7A= -go.etcd.io/etcd/api/v3 v3.5.6/go.mod h1:KFtNaxGDw4Yx/BA4iPPwevUTAuqcsPxzyX8PHydchN8= -go.etcd.io/etcd/client/pkg/v3 v3.5.6 h1:TXQWYceBKqLp4sa87rcPs11SXxUA/mHwH975v+BDvLU= -go.etcd.io/etcd/client/pkg/v3 v3.5.6/go.mod h1:ggrwbk069qxpKPq8/FKkQ3Xq9y39kbFR4LnKszpRXeQ= -go.etcd.io/etcd/client/v2 v2.305.6 h1:fIDR0p4KMjw01MJMfUIDWdQbjo06PD6CeYM5z4EHLi0= -go.etcd.io/etcd/client/v2 v2.305.6/go.mod h1:BHha8XJGe8vCIBfWBpbBLVZ4QjOIlfoouvOwydu63E0= -go.etcd.io/etcd/client/v3 v3.5.6 h1:coLs69PWCXE9G4FKquzNaSHrRyMCAXwF+IX1tAPVO8E= -go.etcd.io/etcd/client/v3 v3.5.6/go.mod h1:f6GRinRMCsFVv9Ht42EyY7nfsVGwrNO0WEoS2pRKzQk= -go.mongodb.org/mongo-driver v1.9.0/go.mod h1:0sQWfOeY63QTntERDJJ/0SuKK0T1uVSgKCuAROlKEPY= -go.mongodb.org/mongo-driver v1.11.3 h1:Ql6K6qYHEzB6xvu4+AU0BoRoqf9vFPcc4o7MUIdPW8Y= -go.mongodb.org/mongo-driver v1.11.3/go.mod h1:PTSz5yu21bkT/wXpkS7WR5f0ddqw5quethTUn9WM+2g= +github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= +github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= +go.etcd.io/etcd/api/v3 v3.5.9 h1:4wSsluwyTbGGmyjJktOf3wFQoTBIURXHnq9n/G/JQHs= +go.etcd.io/etcd/api/v3 v3.5.9/go.mod h1:uyAal843mC8uUVSLWz6eHa/d971iDGnCRpmKd2Z+X8k= +go.etcd.io/etcd/client/pkg/v3 v3.5.9 h1:oidDC4+YEuSIQbsR94rY9gur91UPL6DnxDCIYd2IGsE= +go.etcd.io/etcd/client/pkg/v3 v3.5.9/go.mod h1:y+CzeSmkMpWN2Jyu1npecjB9BBnABxGM4pN8cGuJeL4= +go.etcd.io/etcd/client/v2 v2.305.7 h1:AELPkjNR3/igjbO7CjyF1fPuVPjrblliiKj+Y6xSGOU= +go.etcd.io/etcd/client/v2 v2.305.7/go.mod h1:GQGT5Z3TBuAQGvgPfhR7VPySu/SudxmEkRq9BgzFU6s= +go.etcd.io/etcd/client/v3 v3.5.9 h1:r5xghnU7CwbUxD/fbUtRyJGaYNfDun8sp/gTr1hew6E= +go.etcd.io/etcd/client/v3 v3.5.9/go.mod h1:i/Eo5LrZ5IKqpbtpPDuaUnDOUv471oDg8cjQaUr2MbA= +go.mongodb.org/mongo-driver v1.12.1 h1:nLkghSU8fQNaK7oUmDhQFsnrtcoNy7Z6LVFKsEecqgE= +go.mongodb.org/mongo-driver v1.12.1/go.mod h1:/rGBTebI3XYboVmgz+Wv3Bcbl3aD0QF9zl6kDDw18rQ= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= 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/go.mongodb.org/mongo-driver/mongo/otelmongo v0.32.0 h1:gNKQHn+q326vsi+kOskx9FCz9Jkz2fvxlf1y46dTN14= -go.opentelemetry.io/contrib/instrumentation/go.mongodb.org/mongo-driver/mongo/otelmongo v0.32.0/go.mod h1:9WqBmOJ4AOChNHtnRBSCGlKN4PQf1coLTCK57fyXE/s= -go.opentelemetry.io/contrib/instrumentation/host v0.32.0 h1:rgDeaor0XDeUaUCGj0VJIRdQYwsYANlnIh4yMgnaZvo= -go.opentelemetry.io/contrib/instrumentation/host v0.32.0/go.mod h1:GavGOmrtAjm+/J0WkNWzDC9rCAKQaD2d9JUzG225sgc= -go.opentelemetry.io/contrib/instrumentation/runtime v0.32.0 h1:eMQf85EgNd2YWEikRJwEy4ADOiwlIum4rcHcssB4Qzk= -go.opentelemetry.io/contrib/instrumentation/runtime v0.32.0/go.mod h1:qtaLlIO4HC4DfedkYTOrvS2u7nA3N/v8w9mehrBD4O8= +go.opentelemetry.io/contrib/instrumentation/go.mongodb.org/mongo-driver/mongo/otelmongo v0.42.0 h1:PL1iPuCLd14uZf2CZmN3mEGF9KurGs9IBt6UvO4owJk= +go.opentelemetry.io/contrib/instrumentation/go.mongodb.org/mongo-driver/mongo/otelmongo v0.42.0/go.mod h1:r8zTHTSZ9+o69VyAtF9ZaFJPDJdOSG950GEV6uiA99U= +go.opentelemetry.io/contrib/instrumentation/host v0.42.0 h1:/GMlvboQJd4LWxNX/oGYLv06J5a/M/flauLruM/3U2g= +go.opentelemetry.io/contrib/instrumentation/host v0.42.0/go.mod h1:w6v1mVemRjTTdfejACjf+LgVA6zKtHOWmdAIf3icx7A= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.42.0 h1:pginetY7+onl4qN1vl0xW/V/v6OBZ0vVdH+esuJgvmM= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.42.0/go.mod h1:XiYsayHc36K3EByOO6nbAXnAWbrUxdjUROCEeeROOH8= +go.opentelemetry.io/contrib/instrumentation/runtime v0.42.0 h1:EbmAUG9hEAMXyfWEasIt2kmh/WmXUznUksChApTgBGc= +go.opentelemetry.io/contrib/instrumentation/runtime v0.42.0/go.mod h1:rD9feqRYP24P14t5kmhNMqsqm1jvKmpx2H2rKVw52V8= go.opentelemetry.io/otel v1.2.0/go.mod h1:aT17Fk0Z1Nor9e0uisf98LrntPGMnk4frBO9+dkf69I= -go.opentelemetry.io/otel v1.7.0 h1:Z2lA3Tdch0iDcrhJXDIlC94XE+bxok1F9B+4Lz/lGsM= -go.opentelemetry.io/otel v1.7.0/go.mod h1:5BdUoMIz5WEs0vt0CUEMtSSaTSHBBVwrhnz7+nrD5xk= -go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.7.0 h1:7Yxsak1q4XrJ5y7XBnNwqWx9amMZvoidCctv62XOQ6Y= -go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.7.0/go.mod h1:M1hVZHNxcbkAlcvrOMlpQ4YOO3Awf+4N2dxkZL3xm04= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.7.0 h1:cMDtmgJ5FpRvqx9x2Aq+Mm0O6K/zcUkH73SFz20TuBw= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.7.0/go.mod h1:ceUgdyfNv4h4gLxHR0WNfDiiVmZFodZhZSbOLhpxqXE= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.7.0 h1:MFAyzUPrTwLOwCi+cltN0ZVyy4phU41lwH+lyMyQTS4= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.7.0/go.mod h1:E+/KKhwOSw8yoPxSSuUHG6vKppkvhN+S1Jc7Nib3k3o= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.7.0 h1:pLP0MH4MAqeTEV0g/4flxw9O8Is48uAIauAnjznbW50= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.7.0/go.mod h1:aFXT9Ng2seM9eizF+LfKiyPBGy8xIZKwhusC1gIu3hA= -go.opentelemetry.io/otel/exporters/prometheus v0.30.0 h1:YXo5ZY5nofaEYMCMTTMaRH2cLDZB8+0UGuk5RwMfIo0= -go.opentelemetry.io/otel/exporters/prometheus v0.30.0/go.mod h1:qN5feW+0/d661KDtJuATEmHtw5bKBK7NSvNEP927zSs= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.30.0 h1:2glg1ZFVVZf47zFuX0iwBPPid4tqzBYYWTVVu0pc+us= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.30.0/go.mod h1:LGFXSl/Js7uN7mDcrzCcHVj48JOtoYDjm4oUI4dLif0= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.7.0 h1:8hPcgCg0rUJiKE6VWahRvjgLUrNl7rW2hffUEPKXVEM= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.7.0/go.mod h1:K4GDXPY6TjUiwbOh+DkKaEdCF8y+lvMoM6SeAPyfCCM= -go.opentelemetry.io/otel/metric v0.30.0 h1:Hs8eQZ8aQgs0U49diZoaS6Uaxw3+bBE3lcMUKBFIk3c= -go.opentelemetry.io/otel/metric v0.30.0/go.mod h1:/ShZ7+TS4dHzDFmfi1kSXMhMVubNoP0oIaBp70J6UXU= +go.opentelemetry.io/otel v1.16.0 h1:Z7GVAX/UkAXPKsy94IU+i6thsQS4nb7LviLpnaNeW8s= +go.opentelemetry.io/otel v1.16.0/go.mod h1:vl0h9NUa1D5s1nv3A5vZOYWn8av4K8Ml6JDeHrT/bx4= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0 h1:t4ZwRPU+emrcvM2e9DHd0Fsf0JTPVcbfa/BhTDF03d0= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0/go.mod h1:vLarbg68dH2Wa77g71zmKQqlQ8+8Rq3GRG31uc0WcWI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.16.0 h1:cbsD4cUcviQGXdw8+bo5x2wazq10SKz8hEbtCRPcU78= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.16.0/go.mod h1:JgXSGah17croqhJfhByOLVY719k1emAXC8MVhCIJlRs= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.16.0 h1:TVQp/bboR4mhZSav+MdgXB8FaRho1RC8UwVn3T0vjVc= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.16.0/go.mod h1:I33vtIe0sR96wfrUcilIzLoA3mLHhRmz9S9Te0S3gDo= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.16.0 h1:iqjq9LAB8aK++sKVcELezzn655JnBNdsDhghU4G/So8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.16.0/go.mod h1:hGXzO5bhhSHZnKvrDaXB82Y9DRFour0Nz/KrBh7reWw= +go.opentelemetry.io/otel/exporters/prometheus v0.39.0 h1:whAaiHxOatgtKd+w0dOi//1KUxj3KoPINZdtDaDj3IA= +go.opentelemetry.io/otel/exporters/prometheus v0.39.0/go.mod h1:4jo5Q4CROlCpSPsXLhymi+LYrDXd2ObU5wbKayfZs7Y= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.39.0 h1:fl2WmyenEf6LYYlfHAtCUEDyGcpwJNqD4dHGO7PVm4w= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.39.0/go.mod h1:csyQxQ0UHHKVA8KApS7eUO/klMO5sd/av5CNZNU4O6w= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc= +go.opentelemetry.io/otel/metric v1.16.0 h1:RbrpwVG1Hfv85LgnZ7+txXioPDoh6EdbZHo26Q3hqOo= +go.opentelemetry.io/otel/metric v1.16.0/go.mod h1:QE47cpOmkwipPiefDwo2wDzwJrlfxxNYodqc4xnGCo4= go.opentelemetry.io/otel/sdk v1.2.0/go.mod h1:jNN8QtpvbsKhgaC6V5lHiejMoKD+V8uadoSafgHPx1U= -go.opentelemetry.io/otel/sdk v1.7.0 h1:4OmStpcKVOfvDOgCt7UriAPtKolwIhxpnSNI/yK+1B0= -go.opentelemetry.io/otel/sdk v1.7.0/go.mod h1:uTEOTwaqIVuTGiJN7ii13Ibp75wJmYUDe374q6cZwUU= -go.opentelemetry.io/otel/sdk/metric v0.30.0 h1:XTqQ4y3erR2Oj8xSAOL5ovO5011ch2ELg51z4fVkpME= -go.opentelemetry.io/otel/sdk/metric v0.30.0/go.mod h1:8AKFRi5HyvTR0RRty3paN1aMC9HMT+NzcEhw/BLkLX8= +go.opentelemetry.io/otel/sdk v1.16.0 h1:Z1Ok1YsijYL0CSJpHt4cS3wDDh7p572grzNrBMiMWgE= +go.opentelemetry.io/otel/sdk v1.16.0/go.mod h1:tMsIuKXuuIWPBAOrH+eHtvhTL+SntFtXF9QD68aP6p4= +go.opentelemetry.io/otel/sdk/metric v0.39.0 h1:Kun8i1eYf48kHH83RucG93ffz0zGV1sh46FAScOTuDI= +go.opentelemetry.io/otel/sdk/metric v0.39.0/go.mod h1:piDIRgjcK7u0HCL5pCA4e74qpK/jk3NiUoAHATVAmiI= go.opentelemetry.io/otel/trace v1.2.0/go.mod h1:N5FLswTubnxKxOJHM7XZC074qpeEdLy3CgAVsdMucK0= -go.opentelemetry.io/otel/trace v1.7.0 h1:O37Iogk1lEkMRXewVtZ1BBTVn5JEp8GrJvP92bJqC6o= -go.opentelemetry.io/otel/trace v1.7.0/go.mod h1:fzLSB9nqR2eXzxPXb2JW9IKE+ScyXA48yyE4TNvoHqU= +go.opentelemetry.io/otel/trace v1.16.0 h1:8JRpaObFoW0pxuVPapkgH8UhHQj+bJW8jJsCZEu5MQs= +go.opentelemetry.io/otel/trace v1.16.0/go.mod h1:Yt9vYq1SdNz3xdjZZK7wcXv1qv2pwLkqr2QVwea0ef0= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.opentelemetry.io/proto/otlp v0.16.0 h1:WHzDWdXUvbc5bG2ObdrGfaNpQz7ft7QN9HHmJlbiB1E= -go.opentelemetry.io/proto/otlp v0.16.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= +go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= +go.opentelemetry.io/proto/otlp v0.19.0 h1:IVN6GR+mhC4s5yfcTbmzHYODqvWAp3ZedA2SJPI1Nnw= +go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.temporal.io/api v1.5.0/go.mod h1:BqKxEJJYdxb5dqf0ODfzfMxh8UEQ5L3zKS51FiIYYkA= -go.temporal.io/api v1.8.0 h1:FzAMmBeLs6BEMFyHeJ9M9GAv6McFuH/GjnliBCdQ/Zw= -go.temporal.io/api v1.8.0/go.mod h1:7m1ZOVUFi/54a5IMzMeELnvDy5sJwRfz11zi3Jrww8w= +go.temporal.io/api v1.21.0/go.mod h1:xlsUEakkN2vU2/WV7e5NqMG4N93nfuNfvbXdaXUpU8w= +go.temporal.io/api v1.23.0 h1:4y9mTQjEHsE0Du0WJ2ExJUcP/1/a+B/UefzIDm4ALTE= +go.temporal.io/api v1.23.0/go.mod h1:AcJd1+rc1j0zte+ZBIkOHGHjntR/17LnZWFz+gMFHQ0= go.temporal.io/sdk v1.12.0/go.mod h1:lSp3lH1lI0TyOsus0arnO3FYvjVXBZGi/G7DjnAnm6o= -go.temporal.io/sdk v1.15.0 h1:1ZJEBNqLHAN0H64NpD4pydriYF9qhUIaimSVONm3ZKs= -go.temporal.io/sdk v1.15.0/go.mod h1:peqnjALtNpJMKRplWEubefPhDXdAtRTnebsLSFypSts= -go.temporal.io/sdk/contrib/opentelemetry v0.1.0 h1:AdQUf0qWIAZLU2+hIR7AGO5YzO1im/xAVRgrCuXnHv4= -go.temporal.io/sdk/contrib/opentelemetry v0.1.0/go.mod h1:TrPfwtdvlwR3vqJFyPyl+WcNUrAUcAkJHVi3PK/iPYk= +go.temporal.io/sdk v1.24.0 h1:mAk5VFR+z4s8QVzRx3iIpRnHcEO3m10CYNjnRXrhVq4= +go.temporal.io/sdk v1.24.0/go.mod h1:S7vWxU01lGcCny0sWx03bkkYw4VtVrpzeqBTn2A6y+E= +go.temporal.io/sdk/contrib/opentelemetry v0.2.0 h1:RnkifCSdsr9X7vJOFjqWQ0Ik+Jod3poIuvSfyTCb208= +go.temporal.io/sdk/contrib/opentelemetry v0.2.0/go.mod h1:YxR7u+g+eR7lCZHtd0amxPWwlWkZKm6uivLTjLG/NjA= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= -go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8= -go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= +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.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= -go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= +go.uber.org/zap v1.25.0 h1:4Hvk6GtkucQ790dqmj7l1eEnRdKm3k3ZUrUMS2d5+5c= +go.uber.org/zap v1.25.0/go.mod h1:JIAUzQIH94IC4fOJQm7gMmBJP5k7wQfdcnYdPoEXJYk= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= 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.0.0-20201216223049-8b5274cf687f/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A= -golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +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/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/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= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= +golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= 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-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -638,9 +1273,11 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= +golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -677,21 +1314,37 @@ golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210913180222-943fd674d43e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220531201128-c960675eff93/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +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.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= -golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= +golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= +golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= 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= @@ -701,11 +1354,27 @@ golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.4.0 h1:NF0gk8LVPg1Ml7SSbGyySuoxdsXitj7TvgvuRxIMc/M= +golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec= +golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= +golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= +golang.org/x/oauth2 v0.7.0 h1:qe6s0zUXlPX80/dITx3440hWZ7GwMwgDDyrSGTPJG/g= +golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= 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= @@ -717,9 +1386,13 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= +golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -742,7 +1415,6 @@ golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -756,8 +1428,6 @@ golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -766,36 +1436,66 @@ golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210910150752-751e447fb3d0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 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-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/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.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= +golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/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/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/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= +golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -805,17 +1505,27 @@ 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.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= +golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +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/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= golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.1.0 h1:xYY+Bajn2a7VBmTM5GikTmnK8ZuX8YgnQCqZpbBNtmA= +golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= +golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 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-20190206041539-40960b6deb8e/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-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -823,13 +1533,13 @@ golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3 golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -859,6 +1569,7 @@ golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= @@ -867,18 +1578,33 @@ golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= +golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 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-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= +gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= +gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= +gonum.org/v1/gonum v0.11.0/go.mod h1:fSG4YDCxxUZQJ7rKsQrj0gMOg00Il0Z96/qMA4bVQhA= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= +gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= +gonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo= 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= @@ -898,8 +1624,46 @@ google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz513 google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.107.0 h1:I2SlFjD8ZWabaIFOfeEDg3pf0BHJDh6iYQ1ic3Yu/UU= +google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= +google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= +google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= +google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= +google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= +google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= +google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= +google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= +google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= +google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= +google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= +google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= +google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= +google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.99.0/go.mod h1:1YOf74vkVndF7pG6hIHuINsM7eWwpVTAfNMNiL91A08= +google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= +google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= +google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0= +google.golang.org/api v0.106.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= google.golang.org/api v0.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= +google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0fdw0= +google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= +google.golang.org/api v0.122.0 h1:zDobeejm3E7pEG1mNHvdxvjs5XJoCMzyNH+CmwL94Es= +google.golang.org/api v0.122.0/go.mod h1:gcitW0lvnyWjSp9nKxAbdHKIZ6vF4aajGueeslZOyms= 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/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -946,13 +1710,109 @@ google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= +google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220602131408-e326c6e8e9c8/go.mod h1:yKyY4AMRwFiC8yMMNaMi+RkCnjZJt9LoWuvhXjMs+To= -google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f h1:BWUVssLB0HVOSY78gIdvk1dTVYtT1y8SBWtPYuTJ/6w= +google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220329172620-7be39ac1afc7/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/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-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= +google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= +google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= +google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= +google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221024153911-1573dae28c9c/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= +google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= +google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo= +google.golang.org/genproto v0.0.0-20221109142239-94d6d90a7d66/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221114212237-e4508ebdbee1/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221117204609-8f9c96812029/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221201204527-e3fa12d562f3/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE= +google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230112194545-e10362b5ecf9/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230113154510-dbe35b8444a5/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230123190316-2c411cf9d197/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230124163310-31e0e69b6fc2/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230125152338-dcaf20b6aeaa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230127162408-596548ed4efa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230209215440-0dfe4f8abfcc/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230216225411-c8e22ba71e44/go.mod h1:8B0gmkoRebU8ukX6HP+4wrVQUY1+6PkQ44BSyIlflHA= +google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= +google.golang.org/genproto v0.0.0-20230223222841-637eb2293923/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= +google.golang.org/genproto v0.0.0-20230303212802-e74f57abe488/go.mod h1:TvhZT5f700eVlTNwND1xoEZQeWTB2RY/65kplwl/bFA= +google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= +google.golang.org/genproto v0.0.0-20230320184635-7606e756e683/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= +google.golang.org/genproto v0.0.0-20230323212658-478b75c54725/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230330154414-c0448cd141ea/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230525154841-bd750badd5c6/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= +google.golang.org/genproto v0.0.0-20230525234025-438c736192d0 h1:x1vNwUhVOcsYoKyEGCZBH694SBmmBjA2EfauFVEI2+M= +google.golang.org/genproto v0.0.0-20230525234025-438c736192d0/go.mod h1:9ExIQyXL5hZrHzQceCwuSYwZZ5QZBazOcprJ5rgs3lY= +google.golang.org/genproto/googleapis/api v0.0.0-20230525234020-1aefcd67740a h1:HiYVD+FGJkTo+9zj1gqz0anapsa1JxjiSrN+BJKyUmE= +google.golang.org/genproto/googleapis/api v0.0.0-20230525234020-1aefcd67740a/go.mod h1:ts19tUU+Z0ZShN1y3aPyq2+O3d5FUNNgT6FtOzmrNn8= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234015-3fc162c6f38a/go.mod h1:xURIpW9ES5+/GZhnV6beoEtxQrnkRGIfP5VQG2tCBLc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc h1:XSJ8Vk1SWuNr8S18z1NZSziL0CPIXLCCMDOEFtHBOFc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= @@ -972,15 +1832,31 @@ google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k= +google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +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.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.53.0 h1:LAv2ds7cmFV/XTS3XG1NneeENYrXGmorPxsBbptIjNc= +google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww= +google.golang.org/grpc v1.52.0/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY= google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= +google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= +google.golang.org/grpc v1.55.0 h1:3Oj82/tFSCeUrRTg/5E/7d/W5A1tj6Ky1ABAuZuv5ag= +google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= +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= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -995,14 +1871,17 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= +google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= 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/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= @@ -1011,8 +1890,6 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= @@ -1026,7 +1903,42 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= +lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.36.2/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.36.3/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/ccgo/v3 v3.0.0-20220428102840-41399a37e894/go.mod h1:eI31LL8EwEBKPpNpA4bU1/i+sKOwOrQy8D87zWUcRZc= +modernc.org/ccgo/v3 v3.0.0-20220430103911-bc99d88307be/go.mod h1:bwdAnOoaIt8Ax9YdWGjxWsdkPcZyRPHqrOvJxaKAKGw= +modernc.org/ccgo/v3 v3.16.4/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= +modernc.org/ccgo/v3 v3.16.6/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= +modernc.org/ccgo/v3 v3.16.8/go.mod h1:zNjwkizS+fIFDrDjIAgBSCLkWbJuHF+ar3QRn+Z9aws= +modernc.org/ccgo/v3 v3.16.9/go.mod h1:zNMzC9A9xeNUepy6KuZBbugn3c0Mc9TeiJO4lgvkJDo= +modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= +modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= +modernc.org/libc v0.0.0-20220428101251-2d5f3daf273b/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= +modernc.org/libc v1.16.0/go.mod h1:N4LD6DBE9cf+Dzf9buBlzVJndKr/iJHG97vGLHYnb5A= +modernc.org/libc v1.16.1/go.mod h1:JjJE0eu4yeK7tab2n4S1w8tlWd9MxXLRzheaRnAKymU= +modernc.org/libc v1.16.17/go.mod h1:hYIV5VZczAmGZAnG15Vdngn5HSF5cSkbvfz2B7GRuVU= +modernc.org/libc v1.16.19/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= +modernc.org/libc v1.17.0/go.mod h1:XsgLldpP4aWlPlsjqKRdHPqCxCjISdHfM/yeWC5GyW0= +modernc.org/libc v1.17.1/go.mod h1:FZ23b+8LjxZs7XtFMbSzL/EhPxNbfZbErxEHc7cbD9s= +modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/memory v1.1.1/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= +modernc.org/memory v1.2.0/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= +modernc.org/memory v1.2.1/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/sqlite v1.18.1/go.mod h1:6ho+Gow7oX5V+OiOQ6Tr4xeqbx13UZ6t+Fw9IRUG4d4= +modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= +modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= +modernc.org/tcl v1.13.1/go.mod h1:XOLfOwzhkljL4itZkK6T72ckMgvj0BDsnKNdZVUOecw= +modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/integration/temporal/metrics.go b/integration/temporal/metrics.go index cf28f4e..846ca44 100644 --- a/integration/temporal/metrics.go +++ b/integration/temporal/metrics.go @@ -7,8 +7,6 @@ import ( "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/metric/instrument/asyncfloat64" - "go.opentelemetry.io/otel/metric/instrument/syncint64" "go.temporal.io/sdk/client" ) @@ -30,16 +28,16 @@ func (m metricsHandler) WithTags(tags map[string]string) client.MetricsHandler { } type counter struct { - inst syncint64.Counter + inst metric.Int64Counter attr []attribute.KeyValue } func (c *counter) Inc(v int64) { - c.inst.Add(context.Background(), v, c.attr...) + c.inst.Add(context.Background(), v, metric.WithAttributes(c.attr...)) } func (m metricsHandler) Counter(name string) client.MetricsCounter { - c, err := m.meter.SyncInt64().Counter(name) + c, err := m.meter.Int64Counter(name) if err != nil { otel.Handle(err) } @@ -50,36 +48,43 @@ func (m metricsHandler) Counter(name string) client.MetricsCounter { } type gauge struct { - inst asyncfloat64.Gauge - attr []attribute.KeyValue + inst metric.Float64ObservableGauge + value float64 } func (c *gauge) Update(v float64) { - c.inst.Observe(context.TODO(), v, c.attr...) + c.value = v } func (m metricsHandler) Gauge(name string) client.MetricsGauge { - c, err := m.meter.AsyncFloat64().Gauge(name) + c, err := m.meter.Float64ObservableGauge(name) if err != nil { otel.Handle(err) } - return &gauge{ + inst := &gauge{ inst: c, - attr: m.attr, } + _, err = m.meter.RegisterCallback(func(ctx context.Context, o metric.Observer) error { + o.ObserveFloat64(c, inst.value, metric.WithAttributes(m.attr...)) + return nil + }) + if err != nil { + otel.Handle(err) + } + return inst } type timer struct { - inst syncint64.Histogram + inst metric.Int64Histogram attr []attribute.KeyValue } func (c *timer) Record(v time.Duration) { - c.inst.Record(context.TODO(), v.Milliseconds(), c.attr...) + c.inst.Record(context.TODO(), v.Milliseconds(), metric.WithAttributes(c.attr...)) } func (m metricsHandler) Timer(name string) client.MetricsTimer { - c, err := m.meter.SyncInt64().Histogram(name) + c, err := m.meter.Int64Histogram(name) if err != nil { otel.Handle(err) } diff --git a/net/http/middleware/telemetry.go b/net/http/middleware/telemetry.go index 3a05dbd..738ec2e 100644 --- a/net/http/middleware/telemetry.go +++ b/net/http/middleware/telemetry.go @@ -8,8 +8,6 @@ import ( "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/metric/global" - "go.opentelemetry.io/otel/metric/instrument" "go.opentelemetry.io/otel/propagation" semconv "go.opentelemetry.io/otel/semconv/v1.10.0" "go.opentelemetry.io/otel/trace" @@ -70,13 +68,13 @@ func TelemetryWithOptions(opts TelemetryOptions) Middleware { name = opts.Name } // TODO remove once https://github.com/open-telemetry/opentelemetry-go-contrib/pull/771 is merged - m := global.MeterProvider().Meter( + m := otel.Meter( "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp", - metric.WithInstrumentationVersion(otelhttp.SemVersion()), + metric.WithInstrumentationVersion(otelhttp.Version()), ) - c, err := m.SyncInt64().Counter( - otelhttp.RequestCount, - instrument.WithDescription("counts number of requests withs specific status code"), + c, err := m.Int64Counter( + "foo_"+otelhttp.RequestCount, + metric.WithDescription("counts number of requests withs specific status code"), ) if err != nil { otel.Handle(err) @@ -99,7 +97,7 @@ func TelemetryWithOptions(opts TelemetryOptions) Middleware { next.ServeHTTP(wr, r) if labeler, ok := otelhttp.LabelerFromContext(r.Context()); ok { - c.Add(r.Context(), 1, append(labeler.Get(), semconv.HTTPStatusCodeKey.Int(wr.StatusCode()))...) + c.Add(r.Context(), 1, metric.WithAttributes(append(labeler.Get(), semconv.HTTPStatusCodeKey.Int(wr.StatusCode()))...)) } }), name, opts.OtelOpts...) } diff --git a/net/http/roundtripware/circuitbreaker.go b/net/http/roundtripware/circuitbreaker.go index 3c31c5d..12b2878 100644 --- a/net/http/roundtripware/circuitbreaker.go +++ b/net/http/roundtripware/circuitbreaker.go @@ -10,8 +10,6 @@ import ( "github.com/sony/gobreaker" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/metric/instrument" - "go.opentelemetry.io/otel/metric/instrument/syncint64" "go.uber.org/zap" ) @@ -49,7 +47,7 @@ type CircuitBreakerSettings struct { } type CircuitBreakerOptions struct { - Counter syncint64.Counter + Counter metric.Int64Counter IsSuccessful func(err error, req *http.Request, resp *http.Response) error CopyReqBody bool @@ -77,9 +75,9 @@ func CircuitBreakerWithMetric( meterDescription string, ) CircuitBreakerOption { // intitialize the success counter - counter, err := meter.SyncInt64().Counter( + counter, err := meter.Int64Counter( meterName, - instrument.WithDescription(meterDescription), + metric.WithDescription(meterDescription), ) if err != nil { panic(err) @@ -186,14 +184,14 @@ func CircuitBreaker(set *CircuitBreakerSettings, opts ...CircuitBreakerOption) R if err != nil { if o.Counter != nil { attributes := append(attributes, attribute.Bool("error", true)) - o.Counter.Add(r.Context(), 1, attributes...) + o.Counter.Add(r.Context(), 1, metric.WithAttributes(attributes...)) } return nil, err } if o.Counter != nil { attributes := append(attributes, attribute.Bool("error", false)) - o.Counter.Add(r.Context(), 1, attributes...) + o.Counter.Add(r.Context(), 1, metric.WithAttributes(attributes...)) } if res, ok := resp.(*http.Response); ok { diff --git a/net/http/roundtripware/metric.go b/net/http/roundtripware/metric.go index d446432..f25b08e 100644 --- a/net/http/roundtripware/metric.go +++ b/net/http/roundtripware/metric.go @@ -6,15 +6,14 @@ import ( "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/metric/instrument" "go.uber.org/zap" ) // Metric returns a RoundTripper which prints out the request & response object func Metric(meter metric.Meter, name, description string) RoundTripware { - histogram, err := meter.SyncFloat64().Histogram( + histogram, err := meter.Float64Histogram( name, - instrument.WithDescription(description), + metric.WithDescription(description), ) if err != nil { panic(err) @@ -37,7 +36,7 @@ func Metric(meter metric.Meter, name, description string) RoundTripware { attributes = append(labeler.Get(), attribute.Int("status_code", resp.StatusCode)) } - histogram.Record(ctx, duration.Seconds(), attributes...) + histogram.Record(ctx, duration.Seconds(), metric.WithAttributes(attributes...)) return resp, err } diff --git a/persistence/mongo/persistor.go b/persistence/mongo/persistor.go index 076d599..bfd227a 100644 --- a/persistence/mongo/persistor.go +++ b/persistence/mongo/persistor.go @@ -30,6 +30,10 @@ type ( Option func(o *Options) ) +// ------------------------------------------------------------------------------------------------ +// ~ Options +// ------------------------------------------------------------------------------------------------ + func WithOtelEnabled(v bool) Option { return func(o *Options) { o.OtelEnabled = v @@ -44,13 +48,13 @@ func WithOtelOptions(v ...otelmongo.Option) Option { func WithClientOptions(v *options.ClientOptions) Option { return func(o *Options) { - o.ClientOptions = options.MergeClientOptions(o.ClientOptions, v) + o.ClientOptions = v } } func WithDatabaseOptions(v *options.DatabaseOptions) Option { return func(o *Options) { - o.DatabaseOptions = options.MergeDatabaseOptions(o.DatabaseOptions, v) + o.DatabaseOptions = v } } @@ -62,12 +66,15 @@ func DefaultOptions() Options { }, ClientOptions: options.Client(). SetReadConcern(readconcern.Majority()). - SetWriteConcern(writeconcern.New(writeconcern.WMajority())), + SetWriteConcern(writeconcern.Majority()), DatabaseOptions: nil, } } -// New ... +// ------------------------------------------------------------------------------------------------ +// ~ Constructor +// ------------------------------------------------------------------------------------------------ + func New(ctx context.Context, uri string, opts ...Option) (*Persistor, error) { o := DefaultOptions() diff --git a/telemetry/meter.go b/telemetry/meter.go index d343a14..f950b00 100644 --- a/telemetry/meter.go +++ b/telemetry/meter.go @@ -2,23 +2,19 @@ package telemetry import ( "context" + "encoding/json" "log" + "os" - "github.com/prometheus/client_golang/prometheus" - otelprometheus "go.opentelemetry.io/otel/exporters/prometheus" + "github.com/foomo/keel/env" + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/exporters/prometheus" "go.opentelemetry.io/otel/exporters/stdout/stdoutmetric" "go.opentelemetry.io/otel/metric" - otelglobal "go.opentelemetry.io/otel/metric/global" - "go.opentelemetry.io/otel/metric/nonrecording" - "go.opentelemetry.io/otel/sdk/metric/aggregator/histogram" - otelcontroller "go.opentelemetry.io/otel/sdk/metric/controller/basic" - otelaggregation "go.opentelemetry.io/otel/sdk/metric/export/aggregation" - otelprocessor "go.opentelemetry.io/otel/sdk/metric/processor/basic" - otelselector "go.opentelemetry.io/otel/sdk/metric/selector/simple" + "go.opentelemetry.io/otel/metric/noop" + sdkmetric "go.opentelemetry.io/otel/sdk/metric" otelresource "go.opentelemetry.io/otel/sdk/resource" - semconv "go.opentelemetry.io/otel/semconv/v1.10.0" - - "github.com/foomo/keel/env" + semconv "go.opentelemetry.io/otel/semconv/v1.20.0" ) var ( @@ -27,18 +23,23 @@ var ( ) func Meter() metric.Meter { - return otelglobal.Meter("") + return otel.Meter("") } func NewNoopMeterProvider() (metric.MeterProvider, error) { - controller := nonrecording.NewNoopMeterProvider() - otelglobal.SetMeterProvider(controller) - return controller, nil + provider := noop.NewMeterProvider() + otel.SetMeterProvider(provider) + return provider, nil } func NewStdOutMeterProvider(ctx context.Context, opts ...stdoutmetric.Option) (metric.MeterProvider, error) { if env.GetBool("OTEL_EXPORTER_STDOUT_PRETTY_PRINT", true) { - opts = append(opts, stdoutmetric.WithPrettyPrint()) + enc := json.NewEncoder(os.Stdout) + enc.SetIndent("", " ") + opts = append(opts, stdoutmetric.WithEncoder(enc)) + } + if !env.GetBool("OTEL_EXPORTER_STDOUT_TIMESTAMP", true) { + opts = append(opts, stdoutmetric.WithoutTimestamps()) } exporter, err := stdoutmetric.New(opts...) @@ -50,48 +51,30 @@ func NewStdOutMeterProvider(ctx context.Context, opts ...stdoutmetric.Option) (m semconv.ServiceNameKey.String(env.Get("OTEL_SERVICE_NAME", ServiceName)), ) - controller := otelcontroller.New( - otelprocessor.NewFactory( - otelselector.NewWithInexpensiveDistribution(), - exporter, - ), - otelcontroller.WithExporter(exporter), - otelcontroller.WithResource(resource), + provider := sdkmetric.NewMeterProvider( + sdkmetric.WithReader(sdkmetric.NewPeriodicReader(exporter)), + sdkmetric.WithResource(resource), ) - if err = controller.Start(ctx); err != nil { - return nil, err - } - - otelglobal.SetMeterProvider(controller) - return controller, nil + otel.SetMeterProvider(provider) + return provider, nil } func NewPrometheusMeterProvider() (metric.MeterProvider, error) { - config := otelprometheus.Config{ - Registerer: prometheus.DefaultRegisterer, - Gatherer: prometheus.DefaultGatherer, + exporter, err := prometheus.New() + if err != nil { + return nil, err } resource := otelresource.NewSchemaless( semconv.ServiceNameKey.String(env.Get("OTEL_SERVICE_NAME", ServiceName)), ) - controller := otelcontroller.New( - otelprocessor.NewFactory( - otelselector.NewWithHistogramDistribution( - histogram.WithExplicitBoundaries(DefaultHistogramBuckets)), - otelaggregation.CumulativeTemporalitySelector(), - otelprocessor.WithMemory(true), - ), - otelcontroller.WithResource(resource), + provider := sdkmetric.NewMeterProvider( + sdkmetric.WithReader(exporter), + sdkmetric.WithResource(resource), ) - _, err := otelprometheus.New(config, controller) - if err != nil { - return nil, err - } - - otelglobal.SetMeterProvider(controller) - return controller, nil + otel.SetMeterProvider(provider) + return provider, nil } diff --git a/telemetry/tracer.go b/telemetry/tracer.go index 1d75e4d..9b86772 100644 --- a/telemetry/tracer.go +++ b/telemetry/tracer.go @@ -34,6 +34,9 @@ func NewStdOutTraceProvider(ctx context.Context) (trace.TracerProvider, error) { if env.GetBool("OTEL_EXPORTER_STDOUT_PRETTY_PRINT", true) { exportOpts = append(exportOpts, stdouttrace.WithPrettyPrint()) } + if !env.GetBool("OTEL_EXPORTER_STDOUT_TIMESTAMPS", true) { + exportOpts = append(exportOpts, stdouttrace.WithoutTimestamps()) + } exporter, err := stdouttrace.New(exportOpts...) if err != nil { diff --git a/test/server.go b/test/server.go index 6a83b12..c0200d4 100644 --- a/test/server.go +++ b/test/server.go @@ -5,7 +5,7 @@ import ( "github.com/spf13/viper" "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/metric/nonrecording" + "go.opentelemetry.io/otel/metric/noop" "go.opentelemetry.io/otel/trace" "go.uber.org/zap" @@ -34,7 +34,7 @@ func NewServer(opts ...Option) *Server { } { - inst.meterProvider = nonrecording.NewNoopMeterProvider() + inst.meterProvider = noop.NewMeterProvider() inst.meter = inst.meterProvider.Meter("github.com/foomo/keel") traceProfiver, err := telemetry.NewNoopTraceProvider() log.Must(inst.l, err, "failed to create noop trace provider") From e629ee098402979bd6150c222055f8e1610ce9ec Mon Sep 17 00:00:00 2001 From: franklin Date: Fri, 11 Aug 2023 09:55:34 +0200 Subject: [PATCH 034/134] feat: update deps and setup --- .gitignore | 74 +- .golangci.yml | 68 +- .goreleaser.yml | 32 + .husky/applypatch-msg | 3 + .husky/commit-msg | 3 + .husky/fsmonitor-watchman | 3 + .husky/post-update | 3 + .husky/pre-applypatch | 3 + .husky/pre-commit | 3 + .husky/pre-merge-commit | 3 + .husky/pre-push | 3 + .husky/pre-rebase | 3 + .husky/pre-receive | 3 + .husky/prepare-commit-msg | 3 + .husky/push-to-checkout | 3 + .husky/sendemail-validate | 3 + .husky/update | 3 + CODE_OF_CONDUCT.md | 128 +++ Makefile | 52 +- example/go.mod | 137 --- example/go.sum | 969 ------------------ {example => examples}/config/main.go | 0 {example => examples}/errors/main.go | 0 {example => examples}/graceful/main.go | 0 .../healthz/handler/handler.go | 0 {example => examples}/healthz/main.go | 2 +- {example => examples}/logging/main.go | 0 .../middlewares/basicauth/main.go | 0 .../middlewares/cors/main.go | 0 .../middlewares/jwtfromcookie/main.go | 0 .../middlewares/jwtfromtoken/main.go | 0 .../middlewares/logger/main.go | 0 .../middlewares/recover/main.go | 0 .../middlewares/requestid/main.go | 0 .../middlewares/responsetime/main.go | 0 .../middlewares/sessionid/main.go | 0 .../middlewares/skip/main.go | 0 .../middlewares/telemetry/main.go | 0 .../middlewares/tokenauthfromcookie/main.go | 0 .../middlewares/tokenauthfromheader/main.go | 0 .../persistence/mongo/main.go | 4 +- .../persistence/mongo/repository/dummy.go | 2 +- .../persistence/mongo/store/codec.go | 0 .../persistence/mongo/store/datetime.go | 0 .../persistence/mongo/store/dummy.go | 0 .../persistence/mongo/store/entity.go | 0 .../mongo/store/entitywithtimestamps.go | 0 .../mongo/store/entitywithversions.go | 0 .../persistence/postgres/main.go | 2 +- .../persistence/postgres/repository/dummy.go | 0 {example => examples}/remoteconfig/main.go | 0 .../roundtripwares/logger/client.go | 0 .../roundtripwares/logger/main.go | 0 .../roundtripwares/logger/server.go | 0 .../roundtripwares/requestid/main.go | 0 .../roundtripwares/retry/client.go | 0 .../roundtripwares/retry/main.go | 0 .../roundtripwares/retry/server.go | 0 {example => examples}/serviceenabler/main.go | 0 {example => examples}/services/main.go | 0 .../stream/jetstream/main.go | 0 .../stream/jetstreamraw/main.go | 0 {example => examples}/telemetry/main.go | 0 go.mod | 78 +- go.sum | 204 ++-- persistence/mongo/collection.go | 16 +- 66 files changed, 406 insertions(+), 1404 deletions(-) create mode 100755 .husky/applypatch-msg create mode 100755 .husky/commit-msg create mode 100755 .husky/fsmonitor-watchman create mode 100755 .husky/post-update create mode 100755 .husky/pre-applypatch create mode 100755 .husky/pre-commit create mode 100755 .husky/pre-merge-commit create mode 100755 .husky/pre-push create mode 100755 .husky/pre-rebase create mode 100755 .husky/pre-receive create mode 100755 .husky/prepare-commit-msg create mode 100755 .husky/push-to-checkout create mode 100755 .husky/sendemail-validate create mode 100755 .husky/update create mode 100644 CODE_OF_CONDUCT.md delete mode 100644 example/go.mod delete mode 100644 example/go.sum rename {example => examples}/config/main.go (100%) rename {example => examples}/errors/main.go (100%) rename {example => examples}/graceful/main.go (100%) rename {example => examples}/healthz/handler/handler.go (100%) rename {example => examples}/healthz/main.go (97%) rename {example => examples}/logging/main.go (100%) rename {example => examples}/middlewares/basicauth/main.go (100%) rename {example => examples}/middlewares/cors/main.go (100%) rename {example => examples}/middlewares/jwtfromcookie/main.go (100%) rename {example => examples}/middlewares/jwtfromtoken/main.go (100%) rename {example => examples}/middlewares/logger/main.go (100%) rename {example => examples}/middlewares/recover/main.go (100%) rename {example => examples}/middlewares/requestid/main.go (100%) rename {example => examples}/middlewares/responsetime/main.go (100%) rename {example => examples}/middlewares/sessionid/main.go (100%) rename {example => examples}/middlewares/skip/main.go (100%) rename {example => examples}/middlewares/telemetry/main.go (100%) rename {example => examples}/middlewares/tokenauthfromcookie/main.go (100%) rename {example => examples}/middlewares/tokenauthfromheader/main.go (100%) rename {example => examples}/persistence/mongo/main.go (97%) rename {example => examples}/persistence/mongo/repository/dummy.go (95%) rename {example => examples}/persistence/mongo/store/codec.go (100%) rename {example => examples}/persistence/mongo/store/datetime.go (100%) rename {example => examples}/persistence/mongo/store/dummy.go (100%) rename {example => examples}/persistence/mongo/store/entity.go (100%) rename {example => examples}/persistence/mongo/store/entitywithtimestamps.go (100%) rename {example => examples}/persistence/mongo/store/entitywithversions.go (100%) rename {example => examples}/persistence/postgres/main.go (94%) rename {example => examples}/persistence/postgres/repository/dummy.go (100%) rename {example => examples}/remoteconfig/main.go (100%) rename {example => examples}/roundtripwares/logger/client.go (100%) rename {example => examples}/roundtripwares/logger/main.go (100%) rename {example => examples}/roundtripwares/logger/server.go (100%) rename {example => examples}/roundtripwares/requestid/main.go (100%) rename {example => examples}/roundtripwares/retry/client.go (100%) rename {example => examples}/roundtripwares/retry/main.go (100%) rename {example => examples}/roundtripwares/retry/server.go (100%) rename {example => examples}/serviceenabler/main.go (100%) rename {example => examples}/services/main.go (100%) rename {example => examples}/stream/jetstream/main.go (100%) rename {example => examples}/stream/jetstreamraw/main.go (100%) rename {example => examples}/telemetry/main.go (100%) diff --git a/.gitignore b/.gitignore index b1e259c..f14e605 100644 --- a/.gitignore +++ b/.gitignore @@ -1,64 +1,12 @@ -# Created by https://www.toptal.com/developers/gitignore/api/jetbrains,go,visualstudiocode,macos -# Edit at https://www.toptal.com/developers/gitignore?templates=jetbrains,go,visualstudiocode,macos - -### macOS ### -# General -.DS_Store -.AppleDouble -.LSOverride - -# Icon must end with two \r -Icon - -# Thumbnails -._* - -# Files that might appear in the root of a volume -.DocumentRevisions-V100 -.fseventsd -.Spotlight-V100 -.TemporaryItems -.Trashes -.VolumeIcon.icns -.com.apple.timemachine.donotpresent - -# Directories potentially created on remote AFP share -.AppleDB -.AppleDesktop -Network Trash Folder -Temporary Items -.apdisk - -### Go ### -# Binaries for programs and plugins -*.exe -*.exe~ -*.dll -*.so -*.dylib - -# Test binary, built with `go test -c` -*.test - -# Output of the go coverage tool, specifically when used with LiteIDE -*.out - -# Dependency directories (remove the comment below to include it) -# vendor/ - -### Go Patch ### -/vendor/ -/Godeps/ - -### JetBrains ### -# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider -# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 -.idea/ - -### VisualStudioCode ### -.vscode/ - -# End of https://www.toptal.com/developers/gitignore/api/jetbrains,go,visualstudiocode,macos - -/tmp/ +.* *.log +!.github/ +!.husky/ +!.editorconfig +!.gitignore +!.golangci.yml +!.goreleaser.yml +!.husky.yaml +/coverage.out +/coverage.html +/tmp/ diff --git a/.golangci.yml b/.golangci.yml index 2117810..edc3188 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -1,17 +1,15 @@ run: - go: "1.19" - timeout: 3m - skip-dirs: - - tmp + timeout: 5m linters-settings: - gci: - sections: - - prefix(github.com/foomo/keel) + # https://golangci-lint.run/usage/linters/#revive revive: rules: - name: indent-error-flow disabled: true + - name: exported + disabled: true + # https://golangci-lint.run/usage/linters/#gocritic gocritic: enabled-tags: - diagnostic @@ -42,60 +40,27 @@ linters-settings: linters: enable: # Enabled by default linters: - - errcheck # Errcheck is a program for checking for unchecked errors in go programs. These unchecked errors can be critical bugs in some cases [fast: false, auto-fix: false] - - gosimple # (megacheck): Linter for Go source code that specializes in simplifying code [fast: false, auto-fix: false] - - govet # (vet, vetshadow): Vet examines Go source code and reports suspicious constructs, such as Printf calls whose arguments do not align with the format string [fast: false, auto-fix: false] - - ineffassign # Detects when assignments to existing variables are not used [fast: true, auto-fix: false] - - staticcheck # (megacheck): It's a set of rules from staticcheck. It's not the same thing as the staticcheck binary. The author of staticcheck doesn't support or approve the use of staticcheck as a library inside golangci-lint. [fast: false, auto-fix: false] - - typecheck # Like the front-end of a Go compiler, parses and type-checks Go code [fast: false, auto-fix: false] - - unused # (megacheck): Checks Go code for unused constants, variables, functions and types [fast: false, auto-fix: false] + - errcheck + - gosimple + - govet + - ineffassign + - staticcheck # Disabled by default linters: - - asasalint # check for pass []any as any in variadic func(...any) [fast: false, auto-fix: false] - asciicheck # Simple linter to check that your code does not contain non-ASCII identifiers [fast: true, auto-fix: false] - bidichk # Checks for dangerous unicode character sequences [fast: true, auto-fix: false] - - bodyclose # checks whether HTTP response body is closed successfully [fast: false, auto-fix: false] - #- containedctx # containedctx is a linter that detects struct contained context.Context field [fast: true, auto-fix: false] - #- contextcheck # check the function whether to use a non-inherited context [fast: false, auto-fix: false] - #- cyclop # checks function and package cyclomatic complexity [fast: false, auto-fix: false] - - decorder # check declaration order and count of types, constants, variables and functions [fast: true, auto-fix: false] - #- depguard # Go linter that checks if package imports are in a list of acceptable packages [fast: true, auto-fix: false] - - dogsled # Checks assignments with too many blank identifiers (e.g. x, _, _, _, := f()) [fast: true, auto-fix: false] #- dupl # Tool for code clone detection [fast: true, auto-fix: false] - - durationcheck # check for two durations multiplied together [fast: false, auto-fix: false] - - errchkjson # Checks types passed to the json encoding functions. Reports unsupported types and optionally reports occasions, where the check for the returned error can be omitted. [fast: false, auto-fix: false] - - errname # Checks that sentinel errors are prefixed with the `Err` and error types are suffixed with the `Error`. [fast: false, auto-fix: false] - - errorlint # errorlint is a linter for that can be used to find code that will cause problems with the error wrapping scheme introduced in Go 1.13. [fast: false, auto-fix: false] - - execinquery # execinquery is a linter about query string checker in Query function which reads your Go src files and warning it finds [fast: false, auto-fix: false] - - exhaustive # check exhaustiveness of enum switch statements [fast: false, auto-fix: false] - #- exhaustruct # Checks if all structure fields are initialized [fast: false, auto-fix: false] - - exportloopref # checks for pointers to enclosing loop variables [fast: false, auto-fix: false] - - forbidigo # Forbids identifiers [fast: true, auto-fix: false] - forcetypeassert # finds forced type assertions [fast: true, auto-fix: false] - #- funlen # Tool for detection of long functions [fast: true, auto-fix: false] - #- gci # Gci controls golang package import order and makes it always deterministic. [fast: true, auto-fix: false] - #- gochecknoglobals # check that no global variables exist [fast: true, auto-fix: false] #- gochecknoinits # Checks that no init functions are present in Go code [fast: true, auto-fix: false] - #- gocognit # Computes and checks the cognitive complexity of functions [fast: true, auto-fix: false] - goconst # Finds repeated strings that could be replaced by a constant [fast: true, auto-fix: false] - gocritic # Provides diagnostics that check for bugs, performance and style issues. [fast: false, auto-fix: false] - #- gocyclo # Computes and checks the cyclomatic complexity of functions [fast: true, auto-fix: false] - #- godot # Check if comments end in a period [fast: true, auto-fix: true] - #- godox # Tool for detection of FIXME, TODO and other comment keywords [fast: true, auto-fix: false] - # - goerr113 # Golang linter to check the errors handling expressions [fast: false, auto-fix: false] - - gofmt # Gofmt checks whether code was gofmt-ed. By default this tool runs with -s option to check for code simplification [fast: true, auto-fix: true] - #- gofumpt # Gofumpt checks whether code was gofumpt-ed. [fast: true, auto-fix: true] - - goheader # Checks is file header matches to pattern [fast: true, auto-fix: false] - goimports # In addition to fixing imports, goimports also formats your code in the same style as gofmt. [fast: true, auto-fix: true] - #- gomnd # An analyzer to detect magic numbers. [fast: true, auto-fix: false] #- gomoddirectives # Manage the use of 'replace', 'retract', and 'excludes' directives in go.mod. [fast: true, auto-fix: false] - gomodguard # Allow and block list linter for direct Go module dependencies. This is different from depguard where there are different block types for example version constraints and module recommendations. [fast: true, auto-fix: false] - goprintffuncname # Checks that printf-like functions are named with `f` at the end [fast: true, auto-fix: false] - gosec # (gas): Inspects source code for security problems [fast: false, auto-fix: false] - grouper # An analyzer to analyze expression groups. [fast: true, auto-fix: false] - importas # Enforces consistent import aliases [fast: false, auto-fix: false] - #- ireturn # Accept Interfaces, Return Concrete Types [fast: false, auto-fix: false] - #- lll # Reports long lines [fast: true, auto-fix: false] - maintidx # maintidx measures the maintainability index of each function. [fast: true, auto-fix: false] - makezero # Finds slice declarations with non-zero initial length [fast: false, auto-fix: false] - misspell # Finds commonly misspelled English words in comments [fast: true, auto-fix: true] @@ -103,30 +68,21 @@ linters: #- nestif # Reports deeply nested if statements [fast: true, auto-fix: false] - nilerr # Finds the code that returns nil even if it checks that the error is not nil. [fast: false, auto-fix: false] - nilnil # Checks that there is no simultaneous return of `nil` error and an invalid value. [fast: false, auto-fix: false] - #- nlreturn # nlreturn checks for a new line before return and branch statements to increase code clarity [fast: true, auto-fix: false] - noctx # noctx finds sending http request without context.Context [fast: false, auto-fix: false] - nolintlint # Reports ill-formed or insufficient nolint directives [fast: true, auto-fix: false] - nonamedreturns # Reports all named returns [fast: false, auto-fix: false] - nosprintfhostport # Checks for misuse of Sprintf to construct a host with port in a URL. [fast: true, auto-fix: false] - #- paralleltest # paralleltest detects missing usage of t.Parallel() method in your Go test [fast: false, auto-fix: false] - prealloc # Finds slice declarations that could potentially be pre-allocated [fast: true, auto-fix: false] - predeclared # find code that shadows one of Go's predeclared identifiers [fast: true, auto-fix: false] - promlinter # Check Prometheus metrics naming via promlint [fast: true, auto-fix: false] - revive # Fast, configurable, extensible, flexible, and beautiful linter for Go. Drop-in replacement of golint. [fast: false, auto-fix: false] - - rowserrcheck # checks whether Err of rows is checked successfully [fast: false, auto-fix: false] - - sqlclosecheck # Checks that sql.Rows and sql.Stmt are closed. [fast: false, auto-fix: false] - - stylecheck # Stylecheck is a replacement for golint [fast: false, auto-fix: false] - tagliatelle # Checks the struct tags. [fast: true, auto-fix: false] - - tenv # tenv is analyzer that detects using os.Setenv instead of t.Setenv since Go1.17 [fast: false, auto-fix: false] - testpackage # linter that makes you use a separate _test package [fast: true, auto-fix: false] - thelper # thelper detects golang test helpers without t.Helper() call and checks the consistency of test helpers [fast: false, auto-fix: false] - - tparallel # tparallel detects inappropriate usage of t.Parallel() method in your Go test codes [fast: false, auto-fix: false] - unconvert # Remove unnecessary type conversions [fast: false, auto-fix: false] - unparam # Reports unused function parameters [fast: false, auto-fix: false] - usestdlibvars # A linter that detect the possibility to use variables/constants from the Go standard library. [fast: true, auto-fix: false] - #- varnamelen # checks that the length of a variable's name matches its scope [fast: false, auto-fix: false] - wastedassign # wastedassign finds wasted assignment statements. [fast: false, auto-fix: false] - whitespace # Tool for detection of leading and trailing whitespace [fast: true, auto-fix: true] - #- wrapcheck # Checks that errors returned from external packages are wrapped [fast: false, auto-fix: false] - #- wsl # Whitespace Linter - Forces you to use empty lines! [fast: true, auto-fix: false] - + disable: + - unused diff --git a/.goreleaser.yml b/.goreleaser.yml index 2bb7412..65027d3 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -1,2 +1,34 @@ builds: - skip: true + +changelog: + filters: + exclude: + - "^wip" + - "^test" + - "^docs" + - "^chore" + - "^style" + - "go mod tidy" + - "merge conflict" + - "Merge pull request" + - "Merge remote-tracking branch" + - "Merge branch" + groups: + - title: Features + regexp: '^.*?feat(\([[:word:]]+\))??!?:.+$' + order: 0 + - title: Dependency updates + regexp: '^.*?(feat|fix)\(deps\)!?:.+$' + order: 100 + - title: "Bug fixes" + regexp: '^.*?fix(\([[:word:]]+\))??!?:.+$' + order: 150 + - title: "Security" + regexp: '^.*?sec(\([[:word:]]+\))??!?:.+$' + order: 200 + - title: "Performace" + regexp: '^.*?perf(\([[:word:]]+\))??!?:.+$' + order: 250 + - title: Other + order: 999 diff --git a/.husky/applypatch-msg b/.husky/applypatch-msg new file mode 100755 index 0000000..32d0649 --- /dev/null +++ b/.husky/applypatch-msg @@ -0,0 +1,3 @@ +#!/bin/sh + +husky hook $(basename "$0") $* diff --git a/.husky/commit-msg b/.husky/commit-msg new file mode 100755 index 0000000..32d0649 --- /dev/null +++ b/.husky/commit-msg @@ -0,0 +1,3 @@ +#!/bin/sh + +husky hook $(basename "$0") $* diff --git a/.husky/fsmonitor-watchman b/.husky/fsmonitor-watchman new file mode 100755 index 0000000..32d0649 --- /dev/null +++ b/.husky/fsmonitor-watchman @@ -0,0 +1,3 @@ +#!/bin/sh + +husky hook $(basename "$0") $* diff --git a/.husky/post-update b/.husky/post-update new file mode 100755 index 0000000..32d0649 --- /dev/null +++ b/.husky/post-update @@ -0,0 +1,3 @@ +#!/bin/sh + +husky hook $(basename "$0") $* diff --git a/.husky/pre-applypatch b/.husky/pre-applypatch new file mode 100755 index 0000000..32d0649 --- /dev/null +++ b/.husky/pre-applypatch @@ -0,0 +1,3 @@ +#!/bin/sh + +husky hook $(basename "$0") $* diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 0000000..32d0649 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,3 @@ +#!/bin/sh + +husky hook $(basename "$0") $* diff --git a/.husky/pre-merge-commit b/.husky/pre-merge-commit new file mode 100755 index 0000000..32d0649 --- /dev/null +++ b/.husky/pre-merge-commit @@ -0,0 +1,3 @@ +#!/bin/sh + +husky hook $(basename "$0") $* diff --git a/.husky/pre-push b/.husky/pre-push new file mode 100755 index 0000000..32d0649 --- /dev/null +++ b/.husky/pre-push @@ -0,0 +1,3 @@ +#!/bin/sh + +husky hook $(basename "$0") $* diff --git a/.husky/pre-rebase b/.husky/pre-rebase new file mode 100755 index 0000000..32d0649 --- /dev/null +++ b/.husky/pre-rebase @@ -0,0 +1,3 @@ +#!/bin/sh + +husky hook $(basename "$0") $* diff --git a/.husky/pre-receive b/.husky/pre-receive new file mode 100755 index 0000000..32d0649 --- /dev/null +++ b/.husky/pre-receive @@ -0,0 +1,3 @@ +#!/bin/sh + +husky hook $(basename "$0") $* diff --git a/.husky/prepare-commit-msg b/.husky/prepare-commit-msg new file mode 100755 index 0000000..32d0649 --- /dev/null +++ b/.husky/prepare-commit-msg @@ -0,0 +1,3 @@ +#!/bin/sh + +husky hook $(basename "$0") $* diff --git a/.husky/push-to-checkout b/.husky/push-to-checkout new file mode 100755 index 0000000..32d0649 --- /dev/null +++ b/.husky/push-to-checkout @@ -0,0 +1,3 @@ +#!/bin/sh + +husky hook $(basename "$0") $* diff --git a/.husky/sendemail-validate b/.husky/sendemail-validate new file mode 100755 index 0000000..32d0649 --- /dev/null +++ b/.husky/sendemail-validate @@ -0,0 +1,3 @@ +#!/bin/sh + +husky hook $(basename "$0") $* diff --git a/.husky/update b/.husky/update new file mode 100755 index 0000000..32d0649 --- /dev/null +++ b/.husky/update @@ -0,0 +1,3 @@ +#!/bin/sh + +husky hook $(basename "$0") $* diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..34aabf4 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,128 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, religion, or sexual identity +and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +* Focusing on what is best not just for us as individuals, but for the + overall community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or + advances of any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email + address, without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +info@bestbytes.de. +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series +of actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or +permanent ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within +the community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.0, available at +https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. + +Community Impact Guidelines were inspired by [Mozilla's code of conduct +enforcement ladder](https://github.com/mozilla/diversity). + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see the FAQ at +https://www.contributor-covenant.org/faq. Translations are available at +https://www.contributor-covenant.org/translations. diff --git a/Makefile b/Makefile index 5fc9f6f..a2ace4a 100644 --- a/Makefile +++ b/Makefile @@ -1,38 +1,62 @@ .DEFAULT_GOAL:=help +-include .makerc + +# --- Targets ----------------------------------------------------------------- + +# This allows us to accept extra arguments +%: .husky + @: + +.PHONY: .husky +# Configure git hooks for husky +.husky: + @if ! command -v husky &> /dev/null; then \ + echo "ERROR: missing executeable 'husky', please run:"; \ + echo "\n$ go install github.com/go-courier/husky/cmd/husky@latest\n"; \ + fi + @git config core.hooksPath .husky ## === Tasks === +.PHONY: doc +## Run tests +doc: + @open "http://localhost:6060/pkg/github.com/foomo/keel/" + @godoc -http=localhost:6060 -play + .PHONY: test ## Run tests test: - go test -v ./... + @go test -v ./... + +.PHONY: test.cover +## Run tests with coverage +test.cover: + @go test -v -coverprofile=coverage.out ./... + @go tool cover -func=coverage.out + @go tool cover -html=coverage.out .PHONY: lint ## Run linter -lint: files=$(shell find . -type f -name go.mod) -lint: dirs=$(foreach file,$(files),$(dir $(file)) ) lint: - @for dir in $(dirs); do cd $$dir && pwd && golangci-lint run; done + @golangci-lint run .PHONY: lint.fix ## Fix lint violations -lint.fix: files=$(shell find . -type f -name go.mod) -lint.fix: dirs=$(foreach file,$(files),$(dir $(file)) ) lint.fix: - @for dir in $(dirs); do cd $$dir && golangci-lint run --fix; done - -## === Utils === + @golangci-lint run --fix -.PHONY: gomod +.PHONY: tidy ## Run go mod tidy tidy: - go mod tidy - cd example && go mod tidy + @go mod tidy -.PHONY: gomod.outdated +.PHONY: outdated ## Show outdated direct dependencies outdated: - go list -u -m -json all | go-mod-outdated -update -direct + @go list -u -m -json all | go-mod-outdated -update -direct + +## === Utils === ## Show help text help: diff --git a/example/go.mod b/example/go.mod deleted file mode 100644 index bffc123..0000000 --- a/example/go.mod +++ /dev/null @@ -1,137 +0,0 @@ -module github.com/foomo/keel/example - -go 1.20 - -require ( - github.com/davecgh/go-spew v1.1.1 - github.com/foomo/keel v0.0.0 - github.com/golang-jwt/jwt v3.2.2+incompatible - github.com/google/uuid v1.3.0 - github.com/nats-io/nats.go v1.24.0 - github.com/pkg/errors v0.9.1 - go.mongodb.org/mongo-driver v1.11.3 - go.opentelemetry.io/otel v1.7.0 - go.opentelemetry.io/otel/metric v0.30.0 - go.uber.org/zap v1.24.0 -) - -require ( - cloud.google.com/go v0.107.0 // indirect - cloud.google.com/go/compute v1.15.1 // indirect - cloud.google.com/go/compute/metadata v0.2.3 // indirect - cloud.google.com/go/firestore v1.9.0 // indirect - cloud.google.com/go/longrunning v0.3.0 // indirect - github.com/armon/go-metrics v0.4.0 // indirect - github.com/avast/retry-go v3.0.0+incompatible // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/cenkalti/backoff/v4 v4.1.3 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/coreos/go-semver v0.3.0 // indirect - github.com/coreos/go-systemd/v22 v22.3.2 // indirect - github.com/fatih/color v1.13.0 // indirect - github.com/felixge/httpsnoop v1.0.2 // indirect - github.com/fsnotify/fsnotify v1.6.0 // indirect - github.com/go-logr/logr v1.2.3 // indirect - github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-ole/go-ole v1.2.6 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.2 // indirect - github.com/golang/snappy v0.0.3 // indirect - github.com/google/go-cmp v0.5.9 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.1 // indirect - github.com/googleapis/gax-go/v2 v2.7.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 // indirect - github.com/hashicorp/consul/api v1.18.0 // indirect - github.com/hashicorp/go-cleanhttp v0.5.2 // indirect - github.com/hashicorp/go-hclog v1.2.0 // indirect - github.com/hashicorp/go-immutable-radix v1.3.1 // indirect - github.com/hashicorp/go-rootcerts v1.0.2 // indirect - github.com/hashicorp/golang-lru v0.5.4 // indirect - github.com/hashicorp/hcl v1.0.0 // indirect - github.com/hashicorp/serf v0.10.1 // indirect - github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.14.4 // indirect - github.com/lib/pq v1.10.7 // indirect - github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect - github.com/magiconair/properties v1.8.7 // indirect - github.com/mattn/go-colorable v0.1.12 // indirect - github.com/mattn/go-isatty v0.0.14 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect - github.com/minio/highwayhash v1.0.2 // indirect - github.com/mitchellh/go-homedir v1.1.0 // indirect - github.com/mitchellh/mapstructure v1.5.0 // indirect - github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe // indirect - github.com/nats-io/jwt/v2 v2.3.0 // indirect - github.com/nats-io/nkeys v0.3.0 // indirect - github.com/nats-io/nuid v1.0.1 // indirect - github.com/pelletier/go-toml/v2 v2.0.6 // indirect - github.com/philhofer/fwd v1.1.2 // indirect - github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect - github.com/prometheus/client_golang v1.14.0 // indirect - github.com/prometheus/client_model v0.3.0 // indirect - github.com/prometheus/common v0.37.0 // indirect - github.com/prometheus/procfs v0.8.0 // indirect - github.com/sagikazarmark/crypt v0.9.0 // indirect - github.com/shirou/gopsutil/v3 v3.22.3 // indirect - github.com/sony/gobreaker v0.5.0 // indirect - github.com/spf13/afero v1.9.3 // indirect - github.com/spf13/cast v1.5.0 // indirect - github.com/spf13/jwalterweatherman v1.1.0 // indirect - github.com/spf13/pflag v1.0.5 // indirect - github.com/spf13/viper v1.15.0 // indirect - github.com/subosito/gotenv v1.4.2 // indirect - github.com/tinylib/msgp v1.1.8 // indirect - github.com/tklauser/go-sysconf v0.3.10 // indirect - github.com/tklauser/numcpus v0.4.0 // indirect - github.com/xdg-go/pbkdf2 v1.0.0 // indirect - github.com/xdg-go/scram v1.1.1 // indirect - github.com/xdg-go/stringprep v1.0.3 // indirect - github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect - github.com/yusufpapurcu/wmi v1.2.2 // indirect - go.etcd.io/etcd/api/v3 v3.5.6 // indirect - go.etcd.io/etcd/client/pkg/v3 v3.5.6 // indirect - go.etcd.io/etcd/client/v2 v2.305.6 // indirect - go.etcd.io/etcd/client/v3 v3.5.6 // indirect - go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/contrib/instrumentation/go.mongodb.org/mongo-driver/mongo/otelmongo v0.32.0 // indirect - go.opentelemetry.io/contrib/instrumentation/host v0.32.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.32.0 // indirect - go.opentelemetry.io/contrib/instrumentation/runtime v0.32.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.7.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.7.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.7.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.7.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.30.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.30.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.7.0 // indirect - go.opentelemetry.io/otel/sdk v1.7.0 // indirect - go.opentelemetry.io/otel/sdk/metric v0.30.0 // indirect - go.opentelemetry.io/otel/trace v1.7.0 // indirect - go.opentelemetry.io/proto/otlp v0.16.0 // indirect - go.uber.org/atomic v1.9.0 // indirect - go.uber.org/multierr v1.8.0 // indirect - golang.org/x/crypto v0.7.0 // indirect - golang.org/x/net v0.8.0 // indirect - golang.org/x/oauth2 v0.4.0 // indirect - golang.org/x/sync v0.1.0 // indirect - golang.org/x/sys v0.6.0 // indirect - golang.org/x/text v0.8.0 // indirect - golang.org/x/time v0.1.0 // indirect - golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect - google.golang.org/api v0.107.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f // indirect - google.golang.org/grpc v1.53.0 // indirect - google.golang.org/protobuf v1.28.1 // indirect - gopkg.in/ini.v1 v1.67.0 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect -) - -replace ( - github.com/foomo/keel => ../ - // TODO remove once https://github.com/spf13/viper/pull/1371 is merged - github.com/spf13/viper v1.12.0 => github.com/franklinkim/viper v1.12.1-0.20220611111410-2d69ce7c2fe8 -) diff --git a/example/go.sum b/example/go.sum deleted file mode 100644 index 0b6b508..0000000 --- a/example/go.sum +++ /dev/null @@ -1,969 +0,0 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.107.0 h1:qkj22L7bgkl6vIeZDlOY2po43Mx/TIa2Wsa7VR+PEww= -cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.15.1 h1:7UGq3QknM33pw5xATlpzeoomNxsacIVvTqTTvbfajmE= -cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63rR+SXhcpA= -cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.9.0 h1:IBlRyxgGySXu5VuW0RgGFlTtLukSnNkpDiEOMkQkmpA= -cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= -cloud.google.com/go/longrunning v0.3.0 h1:NjljC+FYPV3uh5/OwWT6pVU+doBqMg2x/rZlE+CamDs= -cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -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/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-metrics v0.4.0 h1:yCQqn7dwca4ITXb+CbubHmedzaQYHhNhrEXLYUeEe8Q= -github.com/armon/go-metrics v0.4.0/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/avast/retry-go v3.0.0+incompatible h1:4SOWQ7Qs+oroOTQOYnAHqelpCO0biHSxpiH9JdtuBj0= -github.com/avast/retry-go v3.0.0+incompatible/go.mod h1:XtSnn+n/sHqQIpZ10K1qAevBhOOCWBLXXy3hyiqqBrY= -github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= -github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -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/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4= -github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= -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= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= -github.com/cespare/xxhash/v2 v2.2.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/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= -github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= -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/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -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/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -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/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/felixge/httpsnoop v1.0.2 h1:+nS9g82KMXccJ/wp0zyRW9ZBHFETmMGtkk+2CTTrW4o= -github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= -github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -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.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= -github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -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-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= -github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= -github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= -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= -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/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -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.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -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.4.1/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.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/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.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -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.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/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= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.2.1 h1:RY7tHKZcRlk788d5WSo/e83gOyyy742E8GSs771ySpg= -github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.7.0 h1:IcsPKeInNvYi7eqSaDjiZqDDKu5rsmunY0Y1YupQSSQ= -github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 h1:BZHcxBETFHIdVyhyEfOvn/RdU/QGdLI4y34qQGjGWO0= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= -github.com/hashicorp/consul/api v1.18.0 h1:R7PPNzTCeN6VuQNDwwhZWJvzCtGSrNpJqfb22h3yH9g= -github.com/hashicorp/consul/api v1.18.0/go.mod h1:owRRGJ9M5xReDC5nfT8FTJrNAPbT4NM6p/k+d03q2v4= -github.com/hashicorp/consul/sdk v0.13.0 h1:lce3nFlpv8humJL8rNrrGHYSKc3q+Kxfeg3Ii1m6ZWU= -github.com/hashicorp/consul/sdk v0.13.0/go.mod h1:0hs/l5fOVhJy/VdcoaNqUSi2AUs95eF5WKtv+EYIQqE= -github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= -github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-hclog v1.2.0 h1:La19f8d7WIlm4ogzNHB0JGqs5AUDAZ2UfCY4sJXcJdM= -github.com/hashicorp/go-hclog v1.2.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= -github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI= -github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= -github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= -github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= -github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc= -github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE= -github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI= -github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -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 v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= -github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= -github.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM= -github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= -github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY= -github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.14.4 h1:eijASRJcobkVtSt81Olfh7JX43osYLwy5krOJo6YEu4= -github.com/klauspost/compress v1.14.4/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -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/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= -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/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw= -github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= -github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= -github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= -github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -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/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= -github.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY= -github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g= -github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= -github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= -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= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe h1:iruDEfMl2E6fbMZ9s0scYfZQ84/6SPL6zC8ACM2oIL0= -github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/nats-io/jwt/v2 v2.3.0 h1:z2mA1a7tIf5ShggOFlR1oBPgd6hGqcDYsISxZByUzdI= -github.com/nats-io/jwt/v2 v2.3.0/go.mod h1:0tqz9Hlu6bCBFLWAASKhE5vUA4c24L9KPUUgvwumE/k= -github.com/nats-io/nats-server/v2 v2.7.3 h1:P0NgsnbTxrPMMPZ1/rLXWjS5bbPpRMCcPwlMd4nBDK4= -github.com/nats-io/nats.go v1.24.0 h1:CRiD8L5GOQu/DcfkmgBcTTIQORMwizF+rPk6T0RaHVQ= -github.com/nats-io/nats.go v1.24.0/go.mod h1:dVQF+BK3SzUZpwyzHedXsvH3EO38aVKuOPkkHlv5hXA= -github.com/nats-io/nkeys v0.3.0 h1:cgM5tL53EvYRU+2YLXIK0G2mJtK12Ft9oeooSZMA2G8= -github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4= -github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= -github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU= -github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= -github.com/philhofer/fwd v1.1.2 h1:bnDivRJ1EWPjUIRXV5KfORO897HTbpFAQddBdE8t7Gw= -github.com/philhofer/fwd v1.1.2/go.mod h1:qkPdfjR2SIEbspLqpe1tO4n5yICnr2DY7mqEx2tUTP0= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= -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/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= -github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= -github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= -github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= -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/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= -github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= -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.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= -github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= -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.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -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/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.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sagikazarmark/crypt v0.9.0 h1:fipzMFW34hFUEc4D7fsLQFtE7yElkpgyS2zruedRdZk= -github.com/sagikazarmark/crypt v0.9.0/go.mod h1:RnH7sEhxfdnPm1z+XMgSLjWTEIjyK4z2dw6+4vHTMuo= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/shirou/gopsutil/v3 v3.22.3 h1:UebRzEomgMpv61e3hgD1tGooqX5trFbdU/ehphbHd00= -github.com/shirou/gopsutil/v3 v3.22.3/go.mod h1:D01hZJ4pVHPpCTZ3m3T2+wDF2YAGfd+H4ifUguaQzHM= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sony/gobreaker v0.5.0 h1:dRCvqm0P490vZPmy7ppEk2qCnCieBooFJ+YoXGYB+yg= -github.com/sony/gobreaker v0.5.0/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.9.3 h1:41FoI0fD7OR7mGcKE/aOiLkGreyf8ifIOQmJANWogMk= -github.com/spf13/afero v1.9.3/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= -github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= -github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= -github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.15.0 h1:js3yy885G8xwJa6iOISGFwd+qlUo5AvyXb7CiihdtiU= -github.com/spf13/viper v1.15.0/go.mod h1:fFcTBJxvhhzSJiZy8n+PeW6t8l+KeT/uTARa0jHOQLA= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/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 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -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.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= -github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= -github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= -github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= -github.com/tinylib/msgp v1.1.8 h1:FCXC1xanKO4I8plpHGH2P7koL/RzZs12l/+r7vakfm0= -github.com/tinylib/msgp v1.1.8/go.mod h1:qkpG+2ldGg4xRFmx+jfTvZPxfGFhi64BcnL9vkCm/Tw= -github.com/tklauser/go-sysconf v0.3.10 h1:IJ1AZGZRWbY8T5Vfk04D9WOA5WSejdflXxP03OUqALw= -github.com/tklauser/go-sysconf v0.3.10/go.mod h1:C8XykCvCb+Gn0oNCWPIlcb0RuglQTYaQ2hGm7jmxEFk= -github.com/tklauser/numcpus v0.4.0 h1:E53Dm1HjH1/R2/aoCtXtPgzmElmn51aOkhCFSuZq//o= -github.com/tklauser/numcpus v0.4.0/go.mod h1:1+UI3pD8NW14VMwdgJNJ1ESk2UnwhAnz5hMwiKKqXCQ= -github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= -github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= -github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= -github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs= -github.com/xdg-go/scram v1.1.1 h1:VOMT+81stJgXW3CpHyqHN3AXDYIMsx56mEFrB37Mb/E= -github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g= -github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM= -github.com/xdg-go/stringprep v1.0.3 h1:kdwGpVNwPFtjs98xCGkHjQtGKh86rDcRZN17QEMCOIs= -github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8= -github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA= -github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= -github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -go.etcd.io/etcd/api/v3 v3.5.6 h1:Cy2qx3npLcYqTKqGJzMypnMv2tiRyifZJ17BlWIWA7A= -go.etcd.io/etcd/api/v3 v3.5.6/go.mod h1:KFtNaxGDw4Yx/BA4iPPwevUTAuqcsPxzyX8PHydchN8= -go.etcd.io/etcd/client/pkg/v3 v3.5.6 h1:TXQWYceBKqLp4sa87rcPs11SXxUA/mHwH975v+BDvLU= -go.etcd.io/etcd/client/pkg/v3 v3.5.6/go.mod h1:ggrwbk069qxpKPq8/FKkQ3Xq9y39kbFR4LnKszpRXeQ= -go.etcd.io/etcd/client/v2 v2.305.6 h1:fIDR0p4KMjw01MJMfUIDWdQbjo06PD6CeYM5z4EHLi0= -go.etcd.io/etcd/client/v2 v2.305.6/go.mod h1:BHha8XJGe8vCIBfWBpbBLVZ4QjOIlfoouvOwydu63E0= -go.etcd.io/etcd/client/v3 v3.5.6 h1:coLs69PWCXE9G4FKquzNaSHrRyMCAXwF+IX1tAPVO8E= -go.etcd.io/etcd/client/v3 v3.5.6/go.mod h1:f6GRinRMCsFVv9Ht42EyY7nfsVGwrNO0WEoS2pRKzQk= -go.mongodb.org/mongo-driver v1.9.0/go.mod h1:0sQWfOeY63QTntERDJJ/0SuKK0T1uVSgKCuAROlKEPY= -go.mongodb.org/mongo-driver v1.11.3 h1:Ql6K6qYHEzB6xvu4+AU0BoRoqf9vFPcc4o7MUIdPW8Y= -go.mongodb.org/mongo-driver v1.11.3/go.mod h1:PTSz5yu21bkT/wXpkS7WR5f0ddqw5quethTUn9WM+2g= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -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/go.mongodb.org/mongo-driver/mongo/otelmongo v0.32.0 h1:gNKQHn+q326vsi+kOskx9FCz9Jkz2fvxlf1y46dTN14= -go.opentelemetry.io/contrib/instrumentation/go.mongodb.org/mongo-driver/mongo/otelmongo v0.32.0/go.mod h1:9WqBmOJ4AOChNHtnRBSCGlKN4PQf1coLTCK57fyXE/s= -go.opentelemetry.io/contrib/instrumentation/host v0.32.0 h1:rgDeaor0XDeUaUCGj0VJIRdQYwsYANlnIh4yMgnaZvo= -go.opentelemetry.io/contrib/instrumentation/host v0.32.0/go.mod h1:GavGOmrtAjm+/J0WkNWzDC9rCAKQaD2d9JUzG225sgc= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.32.0 h1:mac9BKRqwaX6zxHPDe3pvmWpwuuIM0vuXv2juCnQevE= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.32.0/go.mod h1:5eCOqeGphOyz6TsY3ZDNjE33SM/TFAK3RGuCL2naTgY= -go.opentelemetry.io/contrib/instrumentation/runtime v0.32.0 h1:eMQf85EgNd2YWEikRJwEy4ADOiwlIum4rcHcssB4Qzk= -go.opentelemetry.io/contrib/instrumentation/runtime v0.32.0/go.mod h1:qtaLlIO4HC4DfedkYTOrvS2u7nA3N/v8w9mehrBD4O8= -go.opentelemetry.io/otel v1.7.0 h1:Z2lA3Tdch0iDcrhJXDIlC94XE+bxok1F9B+4Lz/lGsM= -go.opentelemetry.io/otel v1.7.0/go.mod h1:5BdUoMIz5WEs0vt0CUEMtSSaTSHBBVwrhnz7+nrD5xk= -go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.7.0 h1:7Yxsak1q4XrJ5y7XBnNwqWx9amMZvoidCctv62XOQ6Y= -go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.7.0/go.mod h1:M1hVZHNxcbkAlcvrOMlpQ4YOO3Awf+4N2dxkZL3xm04= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.7.0 h1:cMDtmgJ5FpRvqx9x2Aq+Mm0O6K/zcUkH73SFz20TuBw= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.7.0/go.mod h1:ceUgdyfNv4h4gLxHR0WNfDiiVmZFodZhZSbOLhpxqXE= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.7.0 h1:MFAyzUPrTwLOwCi+cltN0ZVyy4phU41lwH+lyMyQTS4= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.7.0/go.mod h1:E+/KKhwOSw8yoPxSSuUHG6vKppkvhN+S1Jc7Nib3k3o= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.7.0 h1:pLP0MH4MAqeTEV0g/4flxw9O8Is48uAIauAnjznbW50= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.7.0/go.mod h1:aFXT9Ng2seM9eizF+LfKiyPBGy8xIZKwhusC1gIu3hA= -go.opentelemetry.io/otel/exporters/prometheus v0.30.0 h1:YXo5ZY5nofaEYMCMTTMaRH2cLDZB8+0UGuk5RwMfIo0= -go.opentelemetry.io/otel/exporters/prometheus v0.30.0/go.mod h1:qN5feW+0/d661KDtJuATEmHtw5bKBK7NSvNEP927zSs= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.30.0 h1:2glg1ZFVVZf47zFuX0iwBPPid4tqzBYYWTVVu0pc+us= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.30.0/go.mod h1:LGFXSl/Js7uN7mDcrzCcHVj48JOtoYDjm4oUI4dLif0= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.7.0 h1:8hPcgCg0rUJiKE6VWahRvjgLUrNl7rW2hffUEPKXVEM= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.7.0/go.mod h1:K4GDXPY6TjUiwbOh+DkKaEdCF8y+lvMoM6SeAPyfCCM= -go.opentelemetry.io/otel/metric v0.30.0 h1:Hs8eQZ8aQgs0U49diZoaS6Uaxw3+bBE3lcMUKBFIk3c= -go.opentelemetry.io/otel/metric v0.30.0/go.mod h1:/ShZ7+TS4dHzDFmfi1kSXMhMVubNoP0oIaBp70J6UXU= -go.opentelemetry.io/otel/sdk v1.7.0 h1:4OmStpcKVOfvDOgCt7UriAPtKolwIhxpnSNI/yK+1B0= -go.opentelemetry.io/otel/sdk v1.7.0/go.mod h1:uTEOTwaqIVuTGiJN7ii13Ibp75wJmYUDe374q6cZwUU= -go.opentelemetry.io/otel/sdk/metric v0.30.0 h1:XTqQ4y3erR2Oj8xSAOL5ovO5011ch2ELg51z4fVkpME= -go.opentelemetry.io/otel/sdk/metric v0.30.0/go.mod h1:8AKFRi5HyvTR0RRty3paN1aMC9HMT+NzcEhw/BLkLX8= -go.opentelemetry.io/otel/trace v1.7.0 h1:O37Iogk1lEkMRXewVtZ1BBTVn5JEp8GrJvP92bJqC6o= -go.opentelemetry.io/otel/trace v1.7.0/go.mod h1:fzLSB9nqR2eXzxPXb2JW9IKE+ScyXA48yyE4TNvoHqU= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.opentelemetry.io/proto/otlp v0.16.0 h1:WHzDWdXUvbc5bG2ObdrGfaNpQz7ft7QN9HHmJlbiB1E= -go.opentelemetry.io/proto/otlp v0.16.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= -go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= -go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8= -go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= -go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= -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.0.0-20201216223049-8b5274cf687f/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A= -golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -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= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -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-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -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-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/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-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= -golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -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= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.4.0 h1:NF0gk8LVPg1Ml7SSbGyySuoxdsXitj7TvgvuRxIMc/M= -golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec= -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-20190227155943-e225da77a7e6/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.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190130150945-aca44879d564/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-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= -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/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -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.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -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= -golang.org/x/time v0.1.0 h1:xYY+Bajn2a7VBmTM5GikTmnK8ZuX8YgnQCqZpbBNtmA= -golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -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-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -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-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -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= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.107.0 h1:I2SlFjD8ZWabaIFOfeEDg3pf0BHJDh6iYQ1ic3Yu/UU= -google.golang.org/api v0.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= -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/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f h1:BWUVssLB0HVOSY78gIdvk1dTVYtT1y8SBWtPYuTJ/6w= -google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -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.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k= -google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.53.0 h1:LAv2ds7cmFV/XTS3XG1NneeENYrXGmorPxsBbptIjNc= -google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= -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.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -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/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= -gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/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-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/example/config/main.go b/examples/config/main.go similarity index 100% rename from example/config/main.go rename to examples/config/main.go diff --git a/example/errors/main.go b/examples/errors/main.go similarity index 100% rename from example/errors/main.go rename to examples/errors/main.go diff --git a/example/graceful/main.go b/examples/graceful/main.go similarity index 100% rename from example/graceful/main.go rename to examples/graceful/main.go diff --git a/example/healthz/handler/handler.go b/examples/healthz/handler/handler.go similarity index 100% rename from example/healthz/handler/handler.go rename to examples/healthz/handler/handler.go diff --git a/example/healthz/main.go b/examples/healthz/main.go similarity index 97% rename from example/healthz/main.go rename to examples/healthz/main.go index dacbbe3..cbf5ce8 100644 --- a/example/healthz/main.go +++ b/examples/healthz/main.go @@ -7,7 +7,7 @@ import ( "time" "github.com/foomo/keel" - "github.com/foomo/keel/example/healthz/handler" + "github.com/foomo/keel/examples/healthz/handler" ) // See k8s for probe documentation diff --git a/example/logging/main.go b/examples/logging/main.go similarity index 100% rename from example/logging/main.go rename to examples/logging/main.go diff --git a/example/middlewares/basicauth/main.go b/examples/middlewares/basicauth/main.go similarity index 100% rename from example/middlewares/basicauth/main.go rename to examples/middlewares/basicauth/main.go diff --git a/example/middlewares/cors/main.go b/examples/middlewares/cors/main.go similarity index 100% rename from example/middlewares/cors/main.go rename to examples/middlewares/cors/main.go diff --git a/example/middlewares/jwtfromcookie/main.go b/examples/middlewares/jwtfromcookie/main.go similarity index 100% rename from example/middlewares/jwtfromcookie/main.go rename to examples/middlewares/jwtfromcookie/main.go diff --git a/example/middlewares/jwtfromtoken/main.go b/examples/middlewares/jwtfromtoken/main.go similarity index 100% rename from example/middlewares/jwtfromtoken/main.go rename to examples/middlewares/jwtfromtoken/main.go diff --git a/example/middlewares/logger/main.go b/examples/middlewares/logger/main.go similarity index 100% rename from example/middlewares/logger/main.go rename to examples/middlewares/logger/main.go diff --git a/example/middlewares/recover/main.go b/examples/middlewares/recover/main.go similarity index 100% rename from example/middlewares/recover/main.go rename to examples/middlewares/recover/main.go diff --git a/example/middlewares/requestid/main.go b/examples/middlewares/requestid/main.go similarity index 100% rename from example/middlewares/requestid/main.go rename to examples/middlewares/requestid/main.go diff --git a/example/middlewares/responsetime/main.go b/examples/middlewares/responsetime/main.go similarity index 100% rename from example/middlewares/responsetime/main.go rename to examples/middlewares/responsetime/main.go diff --git a/example/middlewares/sessionid/main.go b/examples/middlewares/sessionid/main.go similarity index 100% rename from example/middlewares/sessionid/main.go rename to examples/middlewares/sessionid/main.go diff --git a/example/middlewares/skip/main.go b/examples/middlewares/skip/main.go similarity index 100% rename from example/middlewares/skip/main.go rename to examples/middlewares/skip/main.go diff --git a/example/middlewares/telemetry/main.go b/examples/middlewares/telemetry/main.go similarity index 100% rename from example/middlewares/telemetry/main.go rename to examples/middlewares/telemetry/main.go diff --git a/example/middlewares/tokenauthfromcookie/main.go b/examples/middlewares/tokenauthfromcookie/main.go similarity index 100% rename from example/middlewares/tokenauthfromcookie/main.go rename to examples/middlewares/tokenauthfromcookie/main.go diff --git a/example/middlewares/tokenauthfromheader/main.go b/examples/middlewares/tokenauthfromheader/main.go similarity index 100% rename from example/middlewares/tokenauthfromheader/main.go rename to examples/middlewares/tokenauthfromheader/main.go diff --git a/example/persistence/mongo/main.go b/examples/persistence/mongo/main.go similarity index 97% rename from example/persistence/mongo/main.go rename to examples/persistence/mongo/main.go index 8ecdf80..b798b5d 100644 --- a/example/persistence/mongo/main.go +++ b/examples/persistence/mongo/main.go @@ -12,8 +12,8 @@ import ( "go.mongodb.org/mongo-driver/mongo/options" "github.com/foomo/keel" - "github.com/foomo/keel/example/persistence/mongo/repository" - "github.com/foomo/keel/example/persistence/mongo/store" + "github.com/foomo/keel/examples/persistence/mongo/repository" + "github.com/foomo/keel/examples/persistence/mongo/store" "github.com/foomo/keel/log" keelmongo "github.com/foomo/keel/persistence/mongo" ) diff --git a/example/persistence/mongo/repository/dummy.go b/examples/persistence/mongo/repository/dummy.go similarity index 95% rename from example/persistence/mongo/repository/dummy.go rename to examples/persistence/mongo/repository/dummy.go index ca10ac0..3b60e7e 100644 --- a/example/persistence/mongo/repository/dummy.go +++ b/examples/persistence/mongo/repository/dummy.go @@ -5,7 +5,7 @@ import ( "go.mongodb.org/mongo-driver/mongo/options" - "github.com/foomo/keel/example/persistence/mongo/store" + "github.com/foomo/keel/examples/persistence/mongo/store" keelmongo "github.com/foomo/keel/persistence/mongo" ) diff --git a/example/persistence/mongo/store/codec.go b/examples/persistence/mongo/store/codec.go similarity index 100% rename from example/persistence/mongo/store/codec.go rename to examples/persistence/mongo/store/codec.go diff --git a/example/persistence/mongo/store/datetime.go b/examples/persistence/mongo/store/datetime.go similarity index 100% rename from example/persistence/mongo/store/datetime.go rename to examples/persistence/mongo/store/datetime.go diff --git a/example/persistence/mongo/store/dummy.go b/examples/persistence/mongo/store/dummy.go similarity index 100% rename from example/persistence/mongo/store/dummy.go rename to examples/persistence/mongo/store/dummy.go diff --git a/example/persistence/mongo/store/entity.go b/examples/persistence/mongo/store/entity.go similarity index 100% rename from example/persistence/mongo/store/entity.go rename to examples/persistence/mongo/store/entity.go diff --git a/example/persistence/mongo/store/entitywithtimestamps.go b/examples/persistence/mongo/store/entitywithtimestamps.go similarity index 100% rename from example/persistence/mongo/store/entitywithtimestamps.go rename to examples/persistence/mongo/store/entitywithtimestamps.go diff --git a/example/persistence/mongo/store/entitywithversions.go b/examples/persistence/mongo/store/entitywithversions.go similarity index 100% rename from example/persistence/mongo/store/entitywithversions.go rename to examples/persistence/mongo/store/entitywithversions.go diff --git a/example/persistence/postgres/main.go b/examples/persistence/postgres/main.go similarity index 94% rename from example/persistence/postgres/main.go rename to examples/persistence/postgres/main.go index eab72c8..ba18908 100644 --- a/example/persistence/postgres/main.go +++ b/examples/persistence/postgres/main.go @@ -4,7 +4,7 @@ import ( "github.com/davecgh/go-spew/spew" "github.com/foomo/keel" - "github.com/foomo/keel/example/persistence/postgres/repository" + "github.com/foomo/keel/examples/persistence/postgres/repository" "github.com/foomo/keel/log" keelpostgres "github.com/foomo/keel/persistence/postgres" ) diff --git a/example/persistence/postgres/repository/dummy.go b/examples/persistence/postgres/repository/dummy.go similarity index 100% rename from example/persistence/postgres/repository/dummy.go rename to examples/persistence/postgres/repository/dummy.go diff --git a/example/remoteconfig/main.go b/examples/remoteconfig/main.go similarity index 100% rename from example/remoteconfig/main.go rename to examples/remoteconfig/main.go diff --git a/example/roundtripwares/logger/client.go b/examples/roundtripwares/logger/client.go similarity index 100% rename from example/roundtripwares/logger/client.go rename to examples/roundtripwares/logger/client.go diff --git a/example/roundtripwares/logger/main.go b/examples/roundtripwares/logger/main.go similarity index 100% rename from example/roundtripwares/logger/main.go rename to examples/roundtripwares/logger/main.go diff --git a/example/roundtripwares/logger/server.go b/examples/roundtripwares/logger/server.go similarity index 100% rename from example/roundtripwares/logger/server.go rename to examples/roundtripwares/logger/server.go diff --git a/example/roundtripwares/requestid/main.go b/examples/roundtripwares/requestid/main.go similarity index 100% rename from example/roundtripwares/requestid/main.go rename to examples/roundtripwares/requestid/main.go diff --git a/example/roundtripwares/retry/client.go b/examples/roundtripwares/retry/client.go similarity index 100% rename from example/roundtripwares/retry/client.go rename to examples/roundtripwares/retry/client.go diff --git a/example/roundtripwares/retry/main.go b/examples/roundtripwares/retry/main.go similarity index 100% rename from example/roundtripwares/retry/main.go rename to examples/roundtripwares/retry/main.go diff --git a/example/roundtripwares/retry/server.go b/examples/roundtripwares/retry/server.go similarity index 100% rename from example/roundtripwares/retry/server.go rename to examples/roundtripwares/retry/server.go diff --git a/example/serviceenabler/main.go b/examples/serviceenabler/main.go similarity index 100% rename from example/serviceenabler/main.go rename to examples/serviceenabler/main.go diff --git a/example/services/main.go b/examples/services/main.go similarity index 100% rename from example/services/main.go rename to examples/services/main.go diff --git a/example/stream/jetstream/main.go b/examples/stream/jetstream/main.go similarity index 100% rename from example/stream/jetstream/main.go rename to examples/stream/jetstream/main.go diff --git a/example/stream/jetstreamraw/main.go b/examples/stream/jetstreamraw/main.go similarity index 100% rename from example/stream/jetstreamraw/main.go rename to examples/stream/jetstreamraw/main.go diff --git a/example/telemetry/main.go b/examples/telemetry/main.go similarity index 100% rename from example/telemetry/main.go rename to examples/telemetry/main.go diff --git a/go.mod b/go.mod index 65d0410..aa296e2 100644 --- a/go.mod +++ b/go.mod @@ -4,21 +4,22 @@ go 1.20 require ( github.com/avast/retry-go v3.0.0+incompatible - github.com/foomo/gotsrpc/v2 v2.7.1 - github.com/go-logr/logr v1.2.3 + github.com/davecgh/go-spew v1.1.1 + github.com/foomo/gotsrpc/v2 v2.7.2 + github.com/go-logr/logr v1.2.4 github.com/golang-jwt/jwt v3.2.2+incompatible github.com/google/uuid v1.3.0 - github.com/lib/pq v1.10.7 + github.com/lib/pq v1.10.9 github.com/mitchellh/mapstructure v1.5.0 github.com/nats-io/nats.go v1.24.0 github.com/pkg/errors v0.9.1 - github.com/prometheus/client_golang v1.14.0 + github.com/prometheus/client_golang v1.16.0 github.com/sony/gobreaker v0.5.0 - github.com/spf13/viper v1.15.0 - github.com/stretchr/testify v1.8.2 + github.com/spf13/viper v1.16.0 + github.com/stretchr/testify v1.8.4 github.com/tidwall/pretty v1.2.1 github.com/tinylib/msgp v1.1.8 - go.mongodb.org/mongo-driver v1.11.3 + go.mongodb.org/mongo-driver v1.11.9 go.opentelemetry.io/contrib/instrumentation/go.mongodb.org/mongo-driver/mongo/otelmongo v0.32.0 go.opentelemetry.io/contrib/instrumentation/host v0.32.0 go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.32.0 @@ -36,17 +37,17 @@ require ( go.temporal.io/api v1.8.0 go.temporal.io/sdk v1.15.0 go.temporal.io/sdk/contrib/opentelemetry v0.1.0 - go.uber.org/zap v1.24.0 - golang.org/x/crypto v0.7.0 - golang.org/x/sync v0.1.0 + go.uber.org/zap v1.25.0 + golang.org/x/crypto v0.12.0 + golang.org/x/sync v0.3.0 ) require ( - cloud.google.com/go v0.107.0 // indirect - cloud.google.com/go/compute v1.15.1 // indirect + cloud.google.com/go v0.110.0 // indirect + cloud.google.com/go/compute v1.19.0 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect cloud.google.com/go/firestore v1.9.0 // indirect - cloud.google.com/go/longrunning v0.3.0 // indirect + cloud.google.com/go/longrunning v0.4.1 // indirect github.com/armon/go-metrics v0.4.0 // indirect github.com/benbjohnson/clock v1.3.0 // indirect github.com/beorn7/perks v1.0.1 // indirect @@ -54,7 +55,6 @@ require ( github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/coreos/go-semver v0.3.0 // indirect github.com/coreos/go-systemd/v22 v22.3.2 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect github.com/facebookgo/clock v0.0.0-20150410010913-600d898af40a // indirect github.com/fatih/color v1.13.0 // indirect github.com/felixge/httpsnoop v1.0.2 // indirect @@ -66,14 +66,15 @@ require ( github.com/gogo/status v1.1.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/mock v1.6.0 // indirect - github.com/golang/protobuf v1.5.2 // indirect + github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.3 // indirect github.com/google/go-cmp v0.5.9 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.1 // indirect - github.com/googleapis/gax-go/v2 v2.7.0 // indirect + github.com/google/s2a-go v0.1.3 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect + github.com/googleapis/gax-go/v2 v2.8.0 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 // indirect - github.com/hashicorp/consul/api v1.18.0 // indirect + github.com/hashicorp/consul/api v1.20.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-hclog v1.2.0 // indirect github.com/hashicorp/go-immutable-radix v1.3.1 // indirect @@ -88,27 +89,28 @@ require ( github.com/magiconair/properties v1.8.7 // indirect github.com/mattn/go-colorable v0.1.12 // indirect github.com/mattn/go-isatty v0.0.14 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe // indirect + github.com/nats-io/jwt/v2 v2.3.0 // indirect github.com/nats-io/nats-server/v2 v2.7.3 // indirect github.com/nats-io/nkeys v0.3.0 // indirect github.com/nats-io/nuid v1.0.1 // indirect github.com/pborman/uuid v1.2.1 // indirect - github.com/pelletier/go-toml/v2 v2.0.6 // indirect + github.com/pelletier/go-toml/v2 v2.0.8 // indirect github.com/philhofer/fwd v1.1.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect github.com/prometheus/client_model v0.3.0 // indirect - github.com/prometheus/common v0.37.0 // indirect - github.com/prometheus/procfs v0.8.0 // indirect + github.com/prometheus/common v0.42.0 // indirect + github.com/prometheus/procfs v0.10.1 // indirect github.com/robfig/cron v1.2.0 // indirect - github.com/sagikazarmark/crypt v0.9.0 // indirect + github.com/sagikazarmark/crypt v0.10.0 // indirect github.com/shirou/gopsutil/v3 v3.22.3 // indirect - github.com/spf13/afero v1.9.3 // indirect - github.com/spf13/cast v1.5.0 // indirect + github.com/spf13/afero v1.9.5 // indirect + github.com/spf13/cast v1.5.1 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/stretchr/objx v0.5.0 // indirect @@ -121,29 +123,29 @@ require ( github.com/xdg-go/stringprep v1.0.3 // indirect github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - go.etcd.io/etcd/api/v3 v3.5.6 // indirect - go.etcd.io/etcd/client/pkg/v3 v3.5.6 // indirect - go.etcd.io/etcd/client/v2 v2.305.6 // indirect - go.etcd.io/etcd/client/v3 v3.5.6 // indirect + go.etcd.io/etcd/api/v3 v3.5.9 // indirect + go.etcd.io/etcd/client/pkg/v3 v3.5.9 // indirect + go.etcd.io/etcd/client/v2 v2.305.7 // indirect + go.etcd.io/etcd/client/v3 v3.5.9 // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.7.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.7.0 // indirect go.opentelemetry.io/proto/otlp v0.16.0 // indirect go.uber.org/atomic v1.9.0 // indirect - go.uber.org/multierr v1.8.0 // indirect + go.uber.org/multierr v1.10.0 // indirect golang.org/x/mod v0.9.0 // indirect - golang.org/x/net v0.8.0 // indirect - golang.org/x/oauth2 v0.4.0 // indirect - golang.org/x/sys v0.6.0 // indirect - golang.org/x/text v0.8.0 // indirect + golang.org/x/net v0.10.0 // indirect + golang.org/x/oauth2 v0.7.0 // indirect + golang.org/x/sys v0.11.0 // indirect + golang.org/x/text v0.12.0 // indirect golang.org/x/time v0.1.0 // indirect golang.org/x/tools v0.7.0 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect - google.golang.org/api v0.107.0 // indirect + google.golang.org/api v0.122.0 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f // indirect - google.golang.org/grpc v1.53.0 // indirect - google.golang.org/protobuf v1.28.1 // indirect + google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect + google.golang.org/grpc v1.55.0 // indirect + google.golang.org/protobuf v1.30.0 // indirect gopkg.in/ini.v1 v1.67.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 a9af41a..18f8eef 100644 --- a/go.sum +++ b/go.sum @@ -17,24 +17,24 @@ cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHOb cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.107.0 h1:qkj22L7bgkl6vIeZDlOY2po43Mx/TIa2Wsa7VR+PEww= -cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= +cloud.google.com/go v0.110.0 h1:Zc8gqp3+a9/Eyph2KDmcGaPtbKRIoqq4YTlL4NMD0Ys= +cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.15.1 h1:7UGq3QknM33pw5xATlpzeoomNxsacIVvTqTTvbfajmE= -cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63rR+SXhcpA= +cloud.google.com/go/compute v1.19.0 h1:+9zda3WGgW1ZSTlVppLCYFIr48Pa35q1uG2N1itbCEQ= +cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/firestore v1.9.0 h1:IBlRyxgGySXu5VuW0RgGFlTtLukSnNkpDiEOMkQkmpA= cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= -cloud.google.com/go/longrunning v0.3.0 h1:NjljC+FYPV3uh5/OwWT6pVU+doBqMg2x/rZlE+CamDs= -cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= +cloud.google.com/go/longrunning v0.4.1 h1:v+yFJOfKC3yZdY6ZUI933pIYdhyhV8S3NpWrXWmg7jM= +cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= @@ -102,13 +102,11 @@ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ3 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= 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/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= 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= @@ -121,11 +119,11 @@ github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/felixge/httpsnoop v1.0.2 h1:+nS9g82KMXccJ/wp0zyRW9ZBHFETmMGtkk+2CTTrW4o= github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/foomo/gotsrpc/v2 v2.7.1 h1:uY1lamAGrUbQK/AsQW1LcJ8HztDli5mTkdRQH7pkbv8= -github.com/foomo/gotsrpc/v2 v2.7.1/go.mod h1:n5SiKVNCZ7Tob6wcROWT5Sx1i/W42+ErpTbNqT3etM8= +github.com/foomo/gotsrpc/v2 v2.7.2 h1:a94V/a8LSssq+aRN3Fv1lJPjWoyMilOvRq+yEaDTHVM= +github.com/foomo/gotsrpc/v2 v2.7.2/go.mod h1:n5SiKVNCZ7Tob6wcROWT5Sx1i/W42+ErpTbNqT3etM8= github.com/foomo/opentelemetry-go-contrib/instrumentation/net/http/otelhttp v0.32.1-0.20220517120905-10e2553b9bac h1:z8UXpHe2Hb9IzRawoeT49eUcxgGUY6g8Emj8TpUWl+4= github.com/foomo/opentelemetry-go-contrib/instrumentation/net/http/otelhttp v0.32.1-0.20220517120905-10e2553b9bac/go.mod h1:5eCOqeGphOyz6TsY3ZDNjE33SM/TFAK3RGuCL2naTgY= -github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= +github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= @@ -135,14 +133,13 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2 github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -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.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= +github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= 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-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= @@ -161,8 +158,8 @@ github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= +github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= 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= @@ -192,8 +189,9 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -230,34 +228,32 @@ github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/s2a-go v0.1.3 h1:FAgZmpLl/SXurPEZyCMPBIiiYeTbqfjlbdnCNTAkbGE= +github.com/google/s2a-go v0.1.3/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.2.1 h1:RY7tHKZcRlk788d5WSo/e83gOyyy742E8GSs771ySpg= -github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k= +github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.7.0 h1:IcsPKeInNvYi7eqSaDjiZqDDKu5rsmunY0Y1YupQSSQ= -github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= +github.com/googleapis/gax-go/v2 v2.8.0 h1:UBtEZqx1bjXtOQ5BVTkuYghXrr3N4V123VKJK67vJZc= +github.com/googleapis/gax-go/v2 v2.8.0/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 h1:BZHcxBETFHIdVyhyEfOvn/RdU/QGdLI4y34qQGjGWO0= github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= -github.com/hashicorp/consul/api v1.18.0 h1:R7PPNzTCeN6VuQNDwwhZWJvzCtGSrNpJqfb22h3yH9g= -github.com/hashicorp/consul/api v1.18.0/go.mod h1:owRRGJ9M5xReDC5nfT8FTJrNAPbT4NM6p/k+d03q2v4= -github.com/hashicorp/consul/sdk v0.13.0 h1:lce3nFlpv8humJL8rNrrGHYSKc3q+Kxfeg3Ii1m6ZWU= -github.com/hashicorp/consul/sdk v0.13.0/go.mod h1:0hs/l5fOVhJy/VdcoaNqUSi2AUs95eF5WKtv+EYIQqE= +github.com/hashicorp/consul/api v1.20.0 h1:9IHTjNVSZ7MIwjlW3N3a7iGiykCMDpxZu8jsxFJh0yc= +github.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo= +github.com/hashicorp/consul/sdk v0.13.1 h1:EygWVWWMczTzXGpO93awkHFzfUka6hLYJ0qhETd+6lY= github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-hclog v1.2.0 h1:La19f8d7WIlm4ogzNHB0JGqs5AUDAZ2UfCY4sJXcJdM= github.com/hashicorp/go-hclog v1.2.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= @@ -273,14 +269,11 @@ github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5O github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc= -github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE= -github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI= -github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= 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 v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= @@ -318,15 +311,13 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxv github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +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/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw= -github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= @@ -344,19 +335,17 @@ github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOA github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -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/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -370,7 +359,8 @@ github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe h1:iruDEfMl2E6f github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/nats-io/jwt/v2 v2.2.1-0.20220113022732-58e87895b296 h1:vU9tpM3apjYlLLeY23zRWJ9Zktr5jp+mloR942LEOpY= +github.com/nats-io/jwt/v2 v2.3.0 h1:z2mA1a7tIf5ShggOFlR1oBPgd6hGqcDYsISxZByUzdI= +github.com/nats-io/jwt/v2 v2.3.0/go.mod h1:0tqz9Hlu6bCBFLWAASKhE5vUA4c24L9KPUUgvwumE/k= github.com/nats-io/nats-server/v2 v2.7.3 h1:P0NgsnbTxrPMMPZ1/rLXWjS5bbPpRMCcPwlMd4nBDK4= github.com/nats-io/nats-server/v2 v2.7.3/go.mod h1:eJUrA5gm0ch6sJTEv85xmXIgQWsB0OyjkTsKXvlHbYc= github.com/nats-io/nats.go v1.24.0 h1:CRiD8L5GOQu/DcfkmgBcTTIQORMwizF+rPk6T0RaHVQ= @@ -379,7 +369,6 @@ github.com/nats-io/nkeys v0.3.0 h1:cgM5tL53EvYRU+2YLXIK0G2mJtK12Ft9oeooSZMA2G8= github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4= github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= @@ -387,8 +376,8 @@ github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0Mw github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pborman/uuid v1.2.1 h1:+ZZIw58t/ozdjRaXh/3awHfmWRbzYxJoAdNJxe/3pvw= github.com/pborman/uuid v1.2.1/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU= -github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= +github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= +github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= github.com/philhofer/fwd v1.1.2 h1:bnDivRJ1EWPjUIRXV5KfORO897HTbpFAQddBdE8t7Gw= github.com/philhofer/fwd v1.1.2/go.mod h1:qkPdfjR2SIEbspLqpe1tO4n5yICnr2DY7mqEx2tUTP0= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -407,10 +396,9 @@ github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5Fsn github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= -github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= +github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= +github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= 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= @@ -422,25 +410,24 @@ github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8b 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.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= -github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= +github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM= +github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= 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.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= 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.10.1 h1:kYK1Va/YMlutzCGazswoHKo//tZVlFpKYh+PymziUAg= +github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= github.com/robfig/cron v1.2.0 h1:ZjScXvvxeQ63Dbyxy76Fj3AT3Ut0aKsyd2/tl3DTMuQ= github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k= 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.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= +github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sagikazarmark/crypt v0.9.0 h1:fipzMFW34hFUEc4D7fsLQFtE7yElkpgyS2zruedRdZk= -github.com/sagikazarmark/crypt v0.9.0/go.mod h1:RnH7sEhxfdnPm1z+XMgSLjWTEIjyK4z2dw6+4vHTMuo= +github.com/sagikazarmark/crypt v0.10.0 h1:96E1qrToLBU6fGzo+PRRz7KGOc9FkYFiPnR3/zf8Smg= +github.com/sagikazarmark/crypt v0.10.0/go.mod h1:gwTNHQVoOS3xp9Xvz5LLR+1AauC5M6880z5NWzdhOyQ= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/shirou/gopsutil/v3 v3.22.3 h1:UebRzEomgMpv61e3hgD1tGooqX5trFbdU/ehphbHd00= @@ -451,16 +438,16 @@ github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrf github.com/sony/gobreaker v0.5.0 h1:dRCvqm0P490vZPmy7ppEk2qCnCieBooFJ+YoXGYB+yg= github.com/sony/gobreaker v0.5.0/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.9.3 h1:41FoI0fD7OR7mGcKE/aOiLkGreyf8ifIOQmJANWogMk= -github.com/spf13/afero v1.9.3/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= -github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= -github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= +github.com/spf13/afero v1.9.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM= +github.com/spf13/afero v1.9.5/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= +github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= +github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.15.0 h1:js3yy885G8xwJa6iOISGFwd+qlUo5AvyXb7CiihdtiU= -github.com/spf13/viper v1.15.0/go.mod h1:fFcTBJxvhhzSJiZy8n+PeW6t8l+KeT/uTARa0jHOQLA= +github.com/spf13/viper v1.16.0 h1:rGGH0XDZhdUOryiDWjmIvUSWpbNqisK8Wk0Vyefw8hc= +github.com/spf13/viper v1.16.0/go.mod h1:yg78JgCJcbrQOvV9YLXgkLaZqUidkY9K+Dd1FofRzQg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.3.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= @@ -476,8 +463,9 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ 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.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= @@ -511,17 +499,17 @@ github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1 github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -go.etcd.io/etcd/api/v3 v3.5.6 h1:Cy2qx3npLcYqTKqGJzMypnMv2tiRyifZJ17BlWIWA7A= -go.etcd.io/etcd/api/v3 v3.5.6/go.mod h1:KFtNaxGDw4Yx/BA4iPPwevUTAuqcsPxzyX8PHydchN8= -go.etcd.io/etcd/client/pkg/v3 v3.5.6 h1:TXQWYceBKqLp4sa87rcPs11SXxUA/mHwH975v+BDvLU= -go.etcd.io/etcd/client/pkg/v3 v3.5.6/go.mod h1:ggrwbk069qxpKPq8/FKkQ3Xq9y39kbFR4LnKszpRXeQ= -go.etcd.io/etcd/client/v2 v2.305.6 h1:fIDR0p4KMjw01MJMfUIDWdQbjo06PD6CeYM5z4EHLi0= -go.etcd.io/etcd/client/v2 v2.305.6/go.mod h1:BHha8XJGe8vCIBfWBpbBLVZ4QjOIlfoouvOwydu63E0= -go.etcd.io/etcd/client/v3 v3.5.6 h1:coLs69PWCXE9G4FKquzNaSHrRyMCAXwF+IX1tAPVO8E= -go.etcd.io/etcd/client/v3 v3.5.6/go.mod h1:f6GRinRMCsFVv9Ht42EyY7nfsVGwrNO0WEoS2pRKzQk= +go.etcd.io/etcd/api/v3 v3.5.9 h1:4wSsluwyTbGGmyjJktOf3wFQoTBIURXHnq9n/G/JQHs= +go.etcd.io/etcd/api/v3 v3.5.9/go.mod h1:uyAal843mC8uUVSLWz6eHa/d971iDGnCRpmKd2Z+X8k= +go.etcd.io/etcd/client/pkg/v3 v3.5.9 h1:oidDC4+YEuSIQbsR94rY9gur91UPL6DnxDCIYd2IGsE= +go.etcd.io/etcd/client/pkg/v3 v3.5.9/go.mod h1:y+CzeSmkMpWN2Jyu1npecjB9BBnABxGM4pN8cGuJeL4= +go.etcd.io/etcd/client/v2 v2.305.7 h1:AELPkjNR3/igjbO7CjyF1fPuVPjrblliiKj+Y6xSGOU= +go.etcd.io/etcd/client/v2 v2.305.7/go.mod h1:GQGT5Z3TBuAQGvgPfhR7VPySu/SudxmEkRq9BgzFU6s= +go.etcd.io/etcd/client/v3 v3.5.9 h1:r5xghnU7CwbUxD/fbUtRyJGaYNfDun8sp/gTr1hew6E= +go.etcd.io/etcd/client/v3 v3.5.9/go.mod h1:i/Eo5LrZ5IKqpbtpPDuaUnDOUv471oDg8cjQaUr2MbA= go.mongodb.org/mongo-driver v1.9.0/go.mod h1:0sQWfOeY63QTntERDJJ/0SuKK0T1uVSgKCuAROlKEPY= -go.mongodb.org/mongo-driver v1.11.3 h1:Ql6K6qYHEzB6xvu4+AU0BoRoqf9vFPcc4o7MUIdPW8Y= -go.mongodb.org/mongo-driver v1.11.3/go.mod h1:PTSz5yu21bkT/wXpkS7WR5f0ddqw5quethTUn9WM+2g= +go.mongodb.org/mongo-driver v1.11.9 h1:JY1e2WLxwNuwdBAPgQxjf4BWweUGP86lF55n89cGZVA= +go.mongodb.org/mongo-driver v1.11.9/go.mod h1:P8+TlbZtPFgjUrmnIF41z97iDnSMswJJu6cztZSlCTg= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -575,19 +563,16 @@ go.temporal.io/sdk v1.15.0/go.mod h1:peqnjALtNpJMKRplWEubefPhDXdAtRTnebsLSFypSts go.temporal.io/sdk/contrib/opentelemetry v0.1.0 h1:AdQUf0qWIAZLU2+hIR7AGO5YzO1im/xAVRgrCuXnHv4= go.temporal.io/sdk/contrib/opentelemetry v0.1.0/go.mod h1:TrPfwtdvlwR3vqJFyPyl+WcNUrAUcAkJHVi3PK/iPYk= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8= -go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= +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.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= -go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= +go.uber.org/zap v1.25.0 h1:4Hvk6GtkucQ790dqmj7l1eEnRdKm3k3ZUrUMS2d5+5c= +go.uber.org/zap v1.25.0/go.mod h1:JIAUzQIH94IC4fOJQm7gMmBJP5k7wQfdcnYdPoEXJYk= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -599,10 +584,11 @@ golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f/go.mod h1:jdWPYTVW3xRLrWP golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A= -golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +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/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= @@ -684,14 +670,11 @@ golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20210913180222-943fd674d43e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220531201128-c960675eff93/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= -golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= 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= @@ -703,9 +686,8 @@ golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.4.0 h1:NF0gk8LVPg1Ml7SSbGyySuoxdsXitj7TvgvuRxIMc/M= -golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec= +golang.org/x/oauth2 v0.7.0 h1:qe6s0zUXlPX80/dITx3440hWZ7GwMwgDDyrSGTPJG/g= +golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= 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= @@ -718,8 +700,9 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -770,7 +753,6 @@ golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -780,18 +762,16 @@ golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210910150752-751e447fb3d0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= -golang.org/x/sys v0.6.0/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/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= 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= @@ -805,9 +785,10 @@ 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.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +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/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= @@ -866,7 +847,6 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= @@ -898,8 +878,8 @@ google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz513 google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.107.0 h1:I2SlFjD8ZWabaIFOfeEDg3pf0BHJDh6iYQ1ic3Yu/UU= -google.golang.org/api v0.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.122.0 h1:zDobeejm3E7pEG1mNHvdxvjs5XJoCMzyNH+CmwL94Es= +google.golang.org/api v0.122.0/go.mod h1:gcitW0lvnyWjSp9nKxAbdHKIZ6vF4aajGueeslZOyms= 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/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -947,12 +927,11 @@ google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20220602131408-e326c6e8e9c8/go.mod h1:yKyY4AMRwFiC8yMMNaMi+RkCnjZJt9LoWuvhXjMs+To= -google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f h1:BWUVssLB0HVOSY78gIdvk1dTVYtT1y8SBWtPYuTJ/6w= -google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 h1:KpwkzHKEF7B9Zxg18WzOa7djJ+Ha5DzthMyZYQfEn2A= +google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= @@ -972,15 +951,14 @@ google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k= google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +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.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.53.0 h1:LAv2ds7cmFV/XTS3XG1NneeENYrXGmorPxsBbptIjNc= -google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= +google.golang.org/grpc v1.55.0 h1:3Oj82/tFSCeUrRTg/5E/7d/W5A1tj6Ky1ABAuZuv5ag= +google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= 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= @@ -995,14 +973,14 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= +google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= 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/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/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/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= @@ -1011,7 +989,6 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= @@ -1029,4 +1006,3 @@ honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/persistence/mongo/collection.go b/persistence/mongo/collection.go index 29b582b..a933575 100644 --- a/persistence/mongo/collection.go +++ b/persistence/mongo/collection.go @@ -189,8 +189,8 @@ func (c *Collection) Upsert(ctx context.Context, id string, entity Entity) error return c.Insert(ctx, entity) } else if err := c.collection.FindOneAndUpdate( ctx, - bson.D{{Key: "id", Value: id}, {Key: "version", Value: currentVersion}}, - bson.D{{Key: "$set", Value: entity}}, + bson.D{bson.E{Key: "id", Value: id}, bson.E{Key: "version", Value: currentVersion}}, + bson.D{bson.E{Key: "$set", Value: entity}}, options.FindOneAndUpdate().SetUpsert(false), ).Err(); errors.Is(err, mongo.ErrNoDocuments) { return keelerrors.NewWrappedError(keelpersistence.ErrDirtyWrite, err) @@ -199,8 +199,8 @@ func (c *Collection) Upsert(ctx context.Context, id string, entity Entity) error } } else if _, err := c.collection.UpdateOne( ctx, - bson.D{{Key: "id", Value: id}}, - bson.D{{Key: "$set", Value: entity}}, + bson.D{bson.E{Key: "id", Value: id}}, + bson.D{bson.E{Key: "$set", Value: entity}}, options.Update().SetUpsert(true), ); err != nil { return err @@ -242,16 +242,16 @@ func (c *Collection) UpsertMany(ctx context.Context, entities []Entity) error { versionUpserts++ operations = append(operations, mongo.NewUpdateOneModel(). - SetFilter(bson.D{{Key: "id", Value: entity.GetID()}, {Key: "version", Value: currentVersion}}). - SetUpdate(bson.D{{Key: "$set", Value: entity}}). + SetFilter(bson.D{bson.E{Key: "id", Value: entity.GetID()}, bson.E{Key: "version", Value: currentVersion}}). + SetUpdate(bson.D{bson.E{Key: "$set", Value: entity}}). SetUpsert(false), ) } } else { operations = append(operations, mongo.NewUpdateOneModel(). - SetFilter(bson.D{{Key: "id", Value: entity.GetID()}}). - SetUpdate(bson.D{{Key: "$set", Value: entity}}). + SetFilter(bson.D{bson.E{Key: "id", Value: entity.GetID()}}). + SetUpdate(bson.D{bson.E{Key: "$set", Value: entity}}). SetUpsert(true), ) } From e1414f514b2cf910387caa13ef6b49c4ebe462b4 Mon Sep 17 00:00:00 2001 From: franklin Date: Fri, 11 Aug 2023 10:43:34 +0200 Subject: [PATCH 035/134] feat: add exemplar option and remove duplicate gotsrpc metrics from http --- .../gotsrpc/net/middleware/telemetry.go | 63 +++++++++++++++---- 1 file changed, 50 insertions(+), 13 deletions(-) diff --git a/integration/gotsrpc/net/middleware/telemetry.go b/integration/gotsrpc/net/middleware/telemetry.go index 8136218..1be56bb 100644 --- a/integration/gotsrpc/net/middleware/telemetry.go +++ b/integration/gotsrpc/net/middleware/telemetry.go @@ -9,8 +9,7 @@ import ( httplog "github.com/foomo/keel/net/http/log" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" - "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" - "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/trace" "go.uber.org/zap" "github.com/foomo/keel/net/http/middleware" @@ -24,19 +23,53 @@ const ( defaultGOTSRPCPackageOperation = "gotsrpc_operation" defaultGOTSRPCError = "gotsrpc_error" defaultGOTSRPCErrorCode = "gotsrpc_error_code" + defaultGOTSRPCErrorType = "gotsrpc_error_type" defaultGOTSRPCErrorMessage = "gotsrpc_error_message" ) +type ( + TelemetryOptions struct { + Exemplars bool + } + TelemetryOption func(*TelemetryOptions) +) + var ( gotsrpcRequestDurationSummary = promauto.NewSummaryVec(prometheus.SummaryOpts{ - Name: "gotsrpc_request_duration_seconds", + Namespace: "gotsrpc", + Name: "request_duration_seconds", Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001}, Help: "Specifies the duration of gotsrpc request in seconds", }, []string{defaultGOTSRPCFunctionLabel, defaultGOTSRPCServiceLabel, defaultGOTSRPCPackageLabel, defaultGOTSRPCPackageOperation, defaultGOTSRPCError}) ) +// DefaultTelemetryOptions returns the default options +func DefaultTelemetryOptions() TelemetryOptions { + return TelemetryOptions{ + Exemplars: false, + } +} + +// TelemetryWithExemplars middleware option +func TelemetryWithExemplars(v bool) TelemetryOption { + return func(o *TelemetryOptions) { + o.Exemplars = v + } +} + // Telemetry middleware -func Telemetry() middleware.Middleware { +func Telemetry(opts ...TelemetryOption) middleware.Middleware { + options := DefaultTelemetryOptions() + for _, opt := range opts { + if opt != nil { + opt(&options) + } + } + return TelemetryWithOptions(options) +} + +// TelemetryWithOptions middleware +func TelemetryWithOptions(opts TelemetryOptions) middleware.Middleware { return func(l *zap.Logger, name string, next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { *r = *gotsrpc.RequestWithStatsContext(r) @@ -44,22 +77,23 @@ func Telemetry() middleware.Middleware { next.ServeHTTP(w, r) if stats, ok := gotsrpc.GetStatsForRequest(r); ok { - // enricht otel http metrics - if labeler, ok := otelhttp.LabelerFromContext(r.Context()); ok { - labeler.Add(attribute.String(defaultGOTSRPCFunctionLabel, stats.Func)) - labeler.Add(attribute.String(defaultGOTSRPCServiceLabel, stats.Service)) - labeler.Add(attribute.String(defaultGOTSRPCPackageLabel, stats.Package)) - } - // create custom metics observe := func(operation string, duration time.Duration) { - gotsrpcRequestDurationSummary.WithLabelValues( + observer := gotsrpcRequestDurationSummary.WithLabelValues( stats.Func, stats.Service, stats.Package, operation, strconv.FormatBool(stats.ErrorCode != 0), - ).Observe(duration.Seconds()) + ) + spanCtx := trace.SpanContextFromContext(r.Context()) + if v, ok := observer.(prometheus.ExemplarObserver); ok && opts.Exemplars && spanCtx.HasTraceID() { + v.ObserveWithExemplar(duration.Seconds(), prometheus.Labels{ + "TraceID": spanCtx.TraceID().String(), + }) + } else { + observer.Observe(duration.Seconds()) + } } observe("marshalling", stats.Marshalling) observe("unmarshalling", stats.Unmarshalling) @@ -72,6 +106,9 @@ func Telemetry() middleware.Middleware { zap.String(defaultGOTSRPCServiceLabel, stats.Service), zap.String(defaultGOTSRPCPackageLabel, stats.Package), ) + if stats.ErrorType != "" { + labeler.Add(zap.String(defaultGOTSRPCErrorType, stats.ErrorType)) + } if stats.ErrorCode != 0 { labeler.Add(zap.Int(defaultGOTSRPCErrorCode, stats.ErrorCode)) if stats.ErrorMessage != "" { From 05c88d9b3649f150ceb1cfcec680ab632cfed315 Mon Sep 17 00:00:00 2001 From: franklin Date: Fri, 11 Aug 2023 10:57:43 +0200 Subject: [PATCH 036/134] fix: remove duplicate counter --- net/http/middleware/telemetry.go | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/net/http/middleware/telemetry.go b/net/http/middleware/telemetry.go index 3a05dbd..09c6fee 100644 --- a/net/http/middleware/telemetry.go +++ b/net/http/middleware/telemetry.go @@ -7,11 +7,7 @@ import ( httplog "github.com/foomo/keel/net/http/log" "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" "go.opentelemetry.io/otel" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/metric/global" - "go.opentelemetry.io/otel/metric/instrument" "go.opentelemetry.io/otel/propagation" - semconv "go.opentelemetry.io/otel/semconv/v1.10.0" "go.opentelemetry.io/otel/trace" "go.uber.org/zap" ) @@ -69,18 +65,6 @@ func TelemetryWithOptions(opts TelemetryOptions) Middleware { if opts.Name != "" { name = opts.Name } - // TODO remove once https://github.com/open-telemetry/opentelemetry-go-contrib/pull/771 is merged - m := global.MeterProvider().Meter( - "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp", - metric.WithInstrumentationVersion(otelhttp.SemVersion()), - ) - c, err := m.SyncInt64().Counter( - otelhttp.RequestCount, - instrument.WithDescription("counts number of requests withs specific status code"), - ) - if err != nil { - otel.Handle(err) - } return otelhttp.NewHandler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if opts.InjectPropagationHeader { @@ -97,10 +81,6 @@ func TelemetryWithOptions(opts TelemetryOptions) Middleware { wr := WrapResponseWriter(w) next.ServeHTTP(wr, r) - - if labeler, ok := otelhttp.LabelerFromContext(r.Context()); ok { - c.Add(r.Context(), 1, append(labeler.Get(), semconv.HTTPStatusCodeKey.Int(wr.StatusCode()))...) - } }), name, opts.OtelOpts...) } } From fe85d0988d1dfc9b35c101962642253a63f99f2c Mon Sep 17 00:00:00 2001 From: franklin Date: Fri, 11 Aug 2023 11:04:48 +0200 Subject: [PATCH 037/134] chore: update gh actions --- .../workflows/{releases.yml => release.yml} | 5 ++- .../workflows/{pull-requests.yml => test.yml} | 33 ++++++++----------- 2 files changed, 17 insertions(+), 21 deletions(-) rename .github/workflows/{releases.yml => release.yml} (96%) rename .github/workflows/{pull-requests.yml => test.yml} (52%) diff --git a/.github/workflows/releases.yml b/.github/workflows/release.yml similarity index 96% rename from .github/workflows/releases.yml rename to .github/workflows/release.yml index 99be72d..4222c9b 100644 --- a/.github/workflows/releases.yml +++ b/.github/workflows/release.yml @@ -1,4 +1,4 @@ -name: Releases +name: Release Tag on: push: @@ -17,11 +17,14 @@ jobs: - uses: actions/checkout@v3 with: fetch-depth: 0 + - run: git fetch --force --tags + - uses: actions/setup-go@v4 with: check-latest: true go-version-file: 'go.mod' + - uses: goreleaser/goreleaser-action@v4 with: version: latest diff --git a/.github/workflows/pull-requests.yml b/.github/workflows/test.yml similarity index 52% rename from .github/workflows/pull-requests.yml rename to .github/workflows/test.yml index ddccd1c..11838f7 100644 --- a/.github/workflows/pull-requests.yml +++ b/.github/workflows/test.yml @@ -1,42 +1,35 @@ -name: Pull Requests +name: Test Branch on: - # Triggers the workflow on push or pull request events but only for the main branch push: branches: [ main ] pull_request: branches: [ main ] - # Allows you to run this workflow manually from the Actions tab + merge_group: + branches: [ main ] workflow_dispatch: -concurrency: - group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} - cancel-in-progress: true - env: GOFLAGS: -mod=readonly GOPROXY: https://proxy.golang.org +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + jobs: - lint: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - uses: actions/setup-go@v4 - with: - check-latest: true - go-version-file: 'go.mod' - - uses: golangci/golangci-lint-action@v3 - - uses: golangci/golangci-lint-action@v3 - with: - working-directory: example test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 + - uses: actions/setup-go@v4 with: check-latest: true go-version-file: 'go.mod' - - run: go test -v ./... + + - uses: golangci/golangci-lint-action@v3 + + - name: Run tests + run: go test -v ./... From 290ce5d7dc52b304cd5ae08a797e32f93e94568d Mon Sep 17 00:00:00 2001 From: franklin Date: Fri, 11 Aug 2023 14:59:05 +0200 Subject: [PATCH 038/134] wip: debug --- integration/gotsrpc/net/middleware/telemetry.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/integration/gotsrpc/net/middleware/telemetry.go b/integration/gotsrpc/net/middleware/telemetry.go index 1be56bb..046b7f1 100644 --- a/integration/gotsrpc/net/middleware/telemetry.go +++ b/integration/gotsrpc/net/middleware/telemetry.go @@ -92,6 +92,15 @@ func TelemetryWithOptions(opts TelemetryOptions) middleware.Middleware { "TraceID": spanCtx.TraceID().String(), }) } else { + if !ok { + l.Info("=> not ok") + } + if !opts.Exemplars { + l.Info("=> no exemplars") + } + if !spanCtx.HasTraceID() { + l.Info("=> no trace id") + } observer.Observe(duration.Seconds()) } } From 3aa5ffcef4e8023fb657e1d5af1d1b2a2e020416 Mon Sep 17 00:00:00 2001 From: franklin Date: Fri, 11 Aug 2023 16:34:44 +0200 Subject: [PATCH 039/134] wip: add histogram --- .../gotsrpc/net/middleware/telemetry.go | 117 +++++++++++++----- 1 file changed, 86 insertions(+), 31 deletions(-) diff --git a/integration/gotsrpc/net/middleware/telemetry.go b/integration/gotsrpc/net/middleware/telemetry.go index 046b7f1..70fc515 100644 --- a/integration/gotsrpc/net/middleware/telemetry.go +++ b/integration/gotsrpc/net/middleware/telemetry.go @@ -29,24 +29,49 @@ const ( type ( TelemetryOptions struct { - Exemplars bool + Exemplars bool + Execution bool + Marshalling bool + Unmarshalling bool } TelemetryOption func(*TelemetryOptions) ) var ( + gotsrpcRequestDurationHistogram = promauto.NewHistogramVec(prometheus.HistogramOpts{ + Namespace: "gotsrpc", + Name: "request_duration_seconds", + Help: "Specifies the duration of gotsrpc request in seconds", + ConstLabels: nil, + Buckets: []float64{0.05, 0.1, 0.5, 1, 3, 5, 10}, + }, []string{ + defaultGOTSRPCFunctionLabel, + defaultGOTSRPCServiceLabel, + defaultGOTSRPCPackageLabel, + defaultGOTSRPCPackageOperation, + defaultGOTSRPCError, + }) gotsrpcRequestDurationSummary = promauto.NewSummaryVec(prometheus.SummaryOpts{ Namespace: "gotsrpc", Name: "request_duration_seconds", Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001}, Help: "Specifies the duration of gotsrpc request in seconds", - }, []string{defaultGOTSRPCFunctionLabel, defaultGOTSRPCServiceLabel, defaultGOTSRPCPackageLabel, defaultGOTSRPCPackageOperation, defaultGOTSRPCError}) + }, []string{ + defaultGOTSRPCFunctionLabel, + defaultGOTSRPCServiceLabel, + defaultGOTSRPCPackageLabel, + defaultGOTSRPCPackageOperation, + defaultGOTSRPCError, + }) ) // DefaultTelemetryOptions returns the default options func DefaultTelemetryOptions() TelemetryOptions { return TelemetryOptions{ - Exemplars: false, + Exemplars: false, + Execution: true, + Marshalling: false, + Unmarshalling: false, } } @@ -57,6 +82,27 @@ func TelemetryWithExemplars(v bool) TelemetryOption { } } +// TelemetryWithExecution middleware option +func TelemetryWithExecution(v bool) TelemetryOption { + return func(o *TelemetryOptions) { + o.Execution = v + } +} + +// TelemetryWithMarshalling middleware option +func TelemetryWithMarshalling(v bool) TelemetryOption { + return func(o *TelemetryOptions) { + o.Marshalling = v + } +} + +// TelemetryWithUnmarshalling middleware option +func TelemetryWithUnmarshalling(v bool) TelemetryOption { + return func(o *TelemetryOptions) { + o.Unmarshalling = v + } +} + // Telemetry middleware func Telemetry(opts ...TelemetryOption) middleware.Middleware { options := DefaultTelemetryOptions() @@ -70,6 +116,32 @@ func Telemetry(opts ...TelemetryOption) middleware.Middleware { // TelemetryWithOptions middleware func TelemetryWithOptions(opts TelemetryOptions) middleware.Middleware { + observe := func(r *http.Request, observer prometheus.ObserverVec, stats *gotsrpc.CallStats, operation string) { + observer.WithLabelValues( + stats.Func, + stats.Service, + stats.Package, + operation, + strconv.FormatBool(stats.ErrorCode != 0), + ) + var duration time.Duration + switch operation { + case "marshalling": + duration = stats.Marshalling + case "unmarshalling": + duration = stats.Unmarshalling + case "execution": + duration = stats.Execution + } + spanCtx := trace.SpanContextFromContext(r.Context()) + if v, ok := observer.(prometheus.ExemplarObserver); ok && opts.Exemplars && spanCtx.HasTraceID() { + v.ObserveWithExemplar(duration.Seconds(), prometheus.Labels{ + "TraceID": spanCtx.TraceID().String(), + }) + } else if v, ok := observer.(prometheus.Observer); ok { + v.Observe(duration.Seconds()) + } + } return func(l *zap.Logger, name string, next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { *r = *gotsrpc.RequestWithStatsContext(r) @@ -78,35 +150,18 @@ func TelemetryWithOptions(opts TelemetryOptions) middleware.Middleware { if stats, ok := gotsrpc.GetStatsForRequest(r); ok { // create custom metics - observe := func(operation string, duration time.Duration) { - observer := gotsrpcRequestDurationSummary.WithLabelValues( - stats.Func, - stats.Service, - stats.Package, - operation, - strconv.FormatBool(stats.ErrorCode != 0), - ) - spanCtx := trace.SpanContextFromContext(r.Context()) - if v, ok := observer.(prometheus.ExemplarObserver); ok && opts.Exemplars && spanCtx.HasTraceID() { - v.ObserveWithExemplar(duration.Seconds(), prometheus.Labels{ - "TraceID": spanCtx.TraceID().String(), - }) - } else { - if !ok { - l.Info("=> not ok") - } - if !opts.Exemplars { - l.Info("=> no exemplars") - } - if !spanCtx.HasTraceID() { - l.Info("=> no trace id") - } - observer.Observe(duration.Seconds()) - } + if opts.Marshalling { + observe(r, gotsrpcRequestDurationSummary, stats, "marshalling") + observe(r, gotsrpcRequestDurationHistogram, stats, "marshalling") + } + if opts.Unmarshalling { + observe(r, gotsrpcRequestDurationSummary, stats, "unmarshalling") + observe(r, gotsrpcRequestDurationHistogram, stats, "unmarshalling") + } + if opts.Execution { + observe(r, gotsrpcRequestDurationSummary, stats, "execution") + observe(r, gotsrpcRequestDurationHistogram, stats, "execution") } - observe("marshalling", stats.Marshalling) - observe("unmarshalling", stats.Unmarshalling) - observe("execution", stats.Execution) // enrich logger if labeler, ok := httplog.LabelerFromRequest(r); ok { From f914ed01797f4da07ddffa5313684eab7a6f0e26 Mon Sep 17 00:00:00 2001 From: franklin Date: Fri, 11 Aug 2023 16:47:30 +0200 Subject: [PATCH 040/134] wip: update name --- integration/gotsrpc/net/middleware/telemetry.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/integration/gotsrpc/net/middleware/telemetry.go b/integration/gotsrpc/net/middleware/telemetry.go index 70fc515..ff301fd 100644 --- a/integration/gotsrpc/net/middleware/telemetry.go +++ b/integration/gotsrpc/net/middleware/telemetry.go @@ -40,8 +40,8 @@ type ( var ( gotsrpcRequestDurationHistogram = promauto.NewHistogramVec(prometheus.HistogramOpts{ Namespace: "gotsrpc", - Name: "request_duration_seconds", - Help: "Specifies the duration of gotsrpc request in seconds", + Name: "process_duration_seconds", + Help: "Specifies the duration of the gotsrpc process in seconds", ConstLabels: nil, Buckets: []float64{0.05, 0.1, 0.5, 1, 3, 5, 10}, }, []string{ @@ -51,11 +51,12 @@ var ( defaultGOTSRPCPackageOperation, defaultGOTSRPCError, }) + // Deprecated: use gotsrpc_process_duration_seconds gotsrpcRequestDurationSummary = promauto.NewSummaryVec(prometheus.SummaryOpts{ Namespace: "gotsrpc", Name: "request_duration_seconds", Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001}, - Help: "Specifies the duration of gotsrpc request in seconds", + Help: "Specifies the duration of gotsrpc request in seconds summary", }, []string{ defaultGOTSRPCFunctionLabel, defaultGOTSRPCServiceLabel, From 68b15e73b5b0cf114e1b1cc35ab264405e50094c Mon Sep 17 00:00:00 2001 From: franklin Date: Fri, 11 Aug 2023 16:55:43 +0200 Subject: [PATCH 041/134] wip: debug --- .../gotsrpc/net/middleware/telemetry.go | 26 ++++++++++++++----- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/integration/gotsrpc/net/middleware/telemetry.go b/integration/gotsrpc/net/middleware/telemetry.go index ff301fd..db6257e 100644 --- a/integration/gotsrpc/net/middleware/telemetry.go +++ b/integration/gotsrpc/net/middleware/telemetry.go @@ -117,7 +117,7 @@ func Telemetry(opts ...TelemetryOption) middleware.Middleware { // TelemetryWithOptions middleware func TelemetryWithOptions(opts TelemetryOptions) middleware.Middleware { - observe := func(r *http.Request, observer prometheus.ObserverVec, stats *gotsrpc.CallStats, operation string) { + observe := func(l *zap.Logger, r *http.Request, observer prometheus.ObserverVec, stats *gotsrpc.CallStats, operation string) { observer.WithLabelValues( stats.Func, stats.Service, @@ -140,6 +140,18 @@ func TelemetryWithOptions(opts TelemetryOptions) middleware.Middleware { "TraceID": spanCtx.TraceID().String(), }) } else if v, ok := observer.(prometheus.Observer); ok { + if !ok { + l.Info("==> not ok") + } + if !opts.Exemplars { + l.Info("==> not exemplar") + } + if !spanCtx.HasSpanID() { + l.Info("==> not traceID") + } + if !spanCtx.IsSampled() { + l.Info("==> not sampled") + } v.Observe(duration.Seconds()) } } @@ -152,16 +164,16 @@ func TelemetryWithOptions(opts TelemetryOptions) middleware.Middleware { if stats, ok := gotsrpc.GetStatsForRequest(r); ok { // create custom metics if opts.Marshalling { - observe(r, gotsrpcRequestDurationSummary, stats, "marshalling") - observe(r, gotsrpcRequestDurationHistogram, stats, "marshalling") + observe(l, r, gotsrpcRequestDurationSummary, stats, "marshalling") + observe(l, r, gotsrpcRequestDurationHistogram, stats, "marshalling") } if opts.Unmarshalling { - observe(r, gotsrpcRequestDurationSummary, stats, "unmarshalling") - observe(r, gotsrpcRequestDurationHistogram, stats, "unmarshalling") + observe(l, r, gotsrpcRequestDurationSummary, stats, "unmarshalling") + observe(l, r, gotsrpcRequestDurationHistogram, stats, "unmarshalling") } if opts.Execution { - observe(r, gotsrpcRequestDurationSummary, stats, "execution") - observe(r, gotsrpcRequestDurationHistogram, stats, "execution") + observe(l, r, gotsrpcRequestDurationSummary, stats, "execution") + observe(l, r, gotsrpcRequestDurationHistogram, stats, "execution") } // enrich logger From 571938de0116a88b1489d40aae73d9332e4ffdc2 Mon Sep 17 00:00:00 2001 From: franklin Date: Fri, 11 Aug 2023 17:08:26 +0200 Subject: [PATCH 042/134] wip: debug --- integration/gotsrpc/net/middleware/telemetry.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/integration/gotsrpc/net/middleware/telemetry.go b/integration/gotsrpc/net/middleware/telemetry.go index db6257e..c843713 100644 --- a/integration/gotsrpc/net/middleware/telemetry.go +++ b/integration/gotsrpc/net/middleware/telemetry.go @@ -137,9 +137,9 @@ func TelemetryWithOptions(opts TelemetryOptions) middleware.Middleware { spanCtx := trace.SpanContextFromContext(r.Context()) if v, ok := observer.(prometheus.ExemplarObserver); ok && opts.Exemplars && spanCtx.HasTraceID() { v.ObserveWithExemplar(duration.Seconds(), prometheus.Labels{ - "TraceID": spanCtx.TraceID().String(), + "traceID": spanCtx.TraceID().String(), }) - } else if v, ok := observer.(prometheus.Observer); ok { + } else if v, ok2 := observer.(prometheus.Observer); ok2 { if !ok { l.Info("==> not ok") } From 282e97318a3f565bd06f8b7df61473e855bb2b1a Mon Sep 17 00:00:00 2001 From: franklin Date: Fri, 11 Aug 2023 17:12:51 +0200 Subject: [PATCH 043/134] wip: debug --- integration/gotsrpc/net/middleware/telemetry.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/integration/gotsrpc/net/middleware/telemetry.go b/integration/gotsrpc/net/middleware/telemetry.go index c843713..2ea8f9b 100644 --- a/integration/gotsrpc/net/middleware/telemetry.go +++ b/integration/gotsrpc/net/middleware/telemetry.go @@ -136,6 +136,7 @@ func TelemetryWithOptions(opts TelemetryOptions) middleware.Middleware { } spanCtx := trace.SpanContextFromContext(r.Context()) if v, ok := observer.(prometheus.ExemplarObserver); ok && opts.Exemplars && spanCtx.HasTraceID() { + l.Info("==> exemplar") v.ObserveWithExemplar(duration.Seconds(), prometheus.Labels{ "traceID": spanCtx.TraceID().String(), }) @@ -183,14 +184,14 @@ func TelemetryWithOptions(opts TelemetryOptions) middleware.Middleware { zap.String(defaultGOTSRPCServiceLabel, stats.Service), zap.String(defaultGOTSRPCPackageLabel, stats.Package), ) + if stats.ErrorCode != 0 { + labeler.Add(zap.Int(defaultGOTSRPCErrorCode, stats.ErrorCode)) + } if stats.ErrorType != "" { labeler.Add(zap.String(defaultGOTSRPCErrorType, stats.ErrorType)) } - if stats.ErrorCode != 0 { - labeler.Add(zap.Int(defaultGOTSRPCErrorCode, stats.ErrorCode)) - if stats.ErrorMessage != "" { - labeler.Add(zap.String(defaultGOTSRPCErrorMessage, stats.ErrorMessage)) - } + if stats.ErrorMessage != "" { + labeler.Add(zap.String(defaultGOTSRPCErrorMessage, stats.ErrorMessage)) } } } From 61e7a1b619c201ba7498256111d6d6bc5759e785 Mon Sep 17 00:00:00 2001 From: franklin Date: Fri, 11 Aug 2023 17:18:39 +0200 Subject: [PATCH 044/134] wip: debug --- integration/gotsrpc/net/middleware/telemetry.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integration/gotsrpc/net/middleware/telemetry.go b/integration/gotsrpc/net/middleware/telemetry.go index 2ea8f9b..a49c994 100644 --- a/integration/gotsrpc/net/middleware/telemetry.go +++ b/integration/gotsrpc/net/middleware/telemetry.go @@ -147,7 +147,7 @@ func TelemetryWithOptions(opts TelemetryOptions) middleware.Middleware { if !opts.Exemplars { l.Info("==> not exemplar") } - if !spanCtx.HasSpanID() { + if !spanCtx.HasTraceID() { l.Info("==> not traceID") } if !spanCtx.IsSampled() { From 5d8eca9eab2d5d4c8d07f0fdf3b8b60ef3af5ad7 Mon Sep 17 00:00:00 2001 From: franklin Date: Fri, 11 Aug 2023 17:23:29 +0200 Subject: [PATCH 045/134] wip: debug --- integration/gotsrpc/net/middleware/telemetry.go | 1 + 1 file changed, 1 insertion(+) diff --git a/integration/gotsrpc/net/middleware/telemetry.go b/integration/gotsrpc/net/middleware/telemetry.go index a49c994..5de7cf2 100644 --- a/integration/gotsrpc/net/middleware/telemetry.go +++ b/integration/gotsrpc/net/middleware/telemetry.go @@ -141,6 +141,7 @@ func TelemetryWithOptions(opts TelemetryOptions) middleware.Middleware { "traceID": spanCtx.TraceID().String(), }) } else if v, ok2 := observer.(prometheus.Observer); ok2 { + l.Info("==> no exemplar") if !ok { l.Info("==> not ok") } From bdcbadf0778cbcee0174ea39e57a0ebd31c2df2c Mon Sep 17 00:00:00 2001 From: franklin Date: Fri, 11 Aug 2023 17:27:33 +0200 Subject: [PATCH 046/134] wip: debug --- integration/gotsrpc/net/middleware/telemetry.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/integration/gotsrpc/net/middleware/telemetry.go b/integration/gotsrpc/net/middleware/telemetry.go index 5de7cf2..13a46c7 100644 --- a/integration/gotsrpc/net/middleware/telemetry.go +++ b/integration/gotsrpc/net/middleware/telemetry.go @@ -155,6 +155,8 @@ func TelemetryWithOptions(opts TelemetryOptions) middleware.Middleware { l.Info("==> not sampled") } v.Observe(duration.Seconds()) + } else { + l.Info("======> nothing") } } return func(l *zap.Logger, name string, next http.Handler) http.Handler { From 5f01366d8c2696f8ff75f71d92a5575634e1b712 Mon Sep 17 00:00:00 2001 From: franklin Date: Fri, 11 Aug 2023 17:33:53 +0200 Subject: [PATCH 047/134] wip: debug --- .../gotsrpc/net/middleware/telemetry.go | 34 ++++++++----------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/integration/gotsrpc/net/middleware/telemetry.go b/integration/gotsrpc/net/middleware/telemetry.go index 13a46c7..9195bd9 100644 --- a/integration/gotsrpc/net/middleware/telemetry.go +++ b/integration/gotsrpc/net/middleware/telemetry.go @@ -117,8 +117,8 @@ func Telemetry(opts ...TelemetryOption) middleware.Middleware { // TelemetryWithOptions middleware func TelemetryWithOptions(opts TelemetryOptions) middleware.Middleware { - observe := func(l *zap.Logger, r *http.Request, observer prometheus.ObserverVec, stats *gotsrpc.CallStats, operation string) { - observer.WithLabelValues( + observe := func(l *zap.Logger, r *http.Request, metric prometheus.ObserverVec, stats *gotsrpc.CallStats, operation string) { + observer := metric.WithLabelValues( stats.Func, stats.Service, stats.Package, @@ -140,24 +140,20 @@ func TelemetryWithOptions(opts TelemetryOptions) middleware.Middleware { v.ObserveWithExemplar(duration.Seconds(), prometheus.Labels{ "traceID": spanCtx.TraceID().String(), }) - } else if v, ok2 := observer.(prometheus.Observer); ok2 { - l.Info("==> no exemplar") - if !ok { - l.Info("==> not ok") - } - if !opts.Exemplars { - l.Info("==> not exemplar") - } - if !spanCtx.HasTraceID() { - l.Info("==> not traceID") - } - if !spanCtx.IsSampled() { - l.Info("==> not sampled") - } - v.Observe(duration.Seconds()) - } else { - l.Info("======> nothing") + return + } + + l.Info("==> no exemplar") + if !opts.Exemplars { + l.Info("==> not exemplar") + } + if !spanCtx.HasTraceID() { + l.Info("==> not traceID") + } + if !spanCtx.IsSampled() { + l.Info("==> not sampled") } + observer.Observe(duration.Seconds()) } return func(l *zap.Logger, name string, next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { From 20c71407db3624ca06fb42c39c955830a5745483 Mon Sep 17 00:00:00 2001 From: franklin Date: Fri, 11 Aug 2023 17:43:16 +0200 Subject: [PATCH 048/134] wip: cleanup --- .../gotsrpc/net/middleware/telemetry.go | 30 ++++++------------- 1 file changed, 9 insertions(+), 21 deletions(-) diff --git a/integration/gotsrpc/net/middleware/telemetry.go b/integration/gotsrpc/net/middleware/telemetry.go index 9195bd9..9327fe2 100644 --- a/integration/gotsrpc/net/middleware/telemetry.go +++ b/integration/gotsrpc/net/middleware/telemetry.go @@ -117,7 +117,7 @@ func Telemetry(opts ...TelemetryOption) middleware.Middleware { // TelemetryWithOptions middleware func TelemetryWithOptions(opts TelemetryOptions) middleware.Middleware { - observe := func(l *zap.Logger, r *http.Request, metric prometheus.ObserverVec, stats *gotsrpc.CallStats, operation string) { + observe := func(r *http.Request, metric prometheus.ObserverVec, stats *gotsrpc.CallStats, operation string) { observer := metric.WithLabelValues( stats.Func, stats.Service, @@ -135,24 +135,12 @@ func TelemetryWithOptions(opts TelemetryOptions) middleware.Middleware { duration = stats.Execution } spanCtx := trace.SpanContextFromContext(r.Context()) - if v, ok := observer.(prometheus.ExemplarObserver); ok && opts.Exemplars && spanCtx.HasTraceID() { - l.Info("==> exemplar") - v.ObserveWithExemplar(duration.Seconds(), prometheus.Labels{ + if exemplarObserver, ok := observer.(prometheus.ExemplarObserver); ok && opts.Exemplars && spanCtx.HasTraceID() && spanCtx.IsSampled() { + exemplarObserver.ObserveWithExemplar(duration.Seconds(), prometheus.Labels{ "traceID": spanCtx.TraceID().String(), }) return } - - l.Info("==> no exemplar") - if !opts.Exemplars { - l.Info("==> not exemplar") - } - if !spanCtx.HasTraceID() { - l.Info("==> not traceID") - } - if !spanCtx.IsSampled() { - l.Info("==> not sampled") - } observer.Observe(duration.Seconds()) } return func(l *zap.Logger, name string, next http.Handler) http.Handler { @@ -164,16 +152,16 @@ func TelemetryWithOptions(opts TelemetryOptions) middleware.Middleware { if stats, ok := gotsrpc.GetStatsForRequest(r); ok { // create custom metics if opts.Marshalling { - observe(l, r, gotsrpcRequestDurationSummary, stats, "marshalling") - observe(l, r, gotsrpcRequestDurationHistogram, stats, "marshalling") + observe(r, gotsrpcRequestDurationSummary, stats, "marshalling") + observe(r, gotsrpcRequestDurationHistogram, stats, "marshalling") } if opts.Unmarshalling { - observe(l, r, gotsrpcRequestDurationSummary, stats, "unmarshalling") - observe(l, r, gotsrpcRequestDurationHistogram, stats, "unmarshalling") + observe(r, gotsrpcRequestDurationSummary, stats, "unmarshalling") + observe(r, gotsrpcRequestDurationHistogram, stats, "unmarshalling") } if opts.Execution { - observe(l, r, gotsrpcRequestDurationSummary, stats, "execution") - observe(l, r, gotsrpcRequestDurationHistogram, stats, "execution") + observe(r, gotsrpcRequestDurationSummary, stats, "execution") + observe(r, gotsrpcRequestDurationHistogram, stats, "execution") } // enrich logger From 1aa6976b4e0eb86ca5165e7502934a992dd5a7ea Mon Sep 17 00:00:00 2001 From: franklin Date: Sat, 12 Aug 2023 22:14:57 +0200 Subject: [PATCH 049/134] feat: add span attributes --- .../gotsrpc/net/middleware/telemetry.go | 36 ++++++++++++++----- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/integration/gotsrpc/net/middleware/telemetry.go b/integration/gotsrpc/net/middleware/telemetry.go index 9327fe2..092e571 100644 --- a/integration/gotsrpc/net/middleware/telemetry.go +++ b/integration/gotsrpc/net/middleware/telemetry.go @@ -9,6 +9,7 @@ import ( httplog "github.com/foomo/keel/net/http/log" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" + "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/trace" "go.uber.org/zap" @@ -117,7 +118,7 @@ func Telemetry(opts ...TelemetryOption) middleware.Middleware { // TelemetryWithOptions middleware func TelemetryWithOptions(opts TelemetryOptions) middleware.Middleware { - observe := func(r *http.Request, metric prometheus.ObserverVec, stats *gotsrpc.CallStats, operation string) { + observe := func(spanCtx trace.SpanContext, metric prometheus.ObserverVec, stats *gotsrpc.CallStats, operation string) { observer := metric.WithLabelValues( stats.Func, stats.Service, @@ -134,7 +135,6 @@ func TelemetryWithOptions(opts TelemetryOptions) middleware.Middleware { case "execution": duration = stats.Execution } - spanCtx := trace.SpanContextFromContext(r.Context()) if exemplarObserver, ok := observer.(prometheus.ExemplarObserver); ok && opts.Exemplars && spanCtx.HasTraceID() && spanCtx.IsSampled() { exemplarObserver.ObserveWithExemplar(duration.Seconds(), prometheus.Labels{ "traceID": spanCtx.TraceID().String(), @@ -149,19 +149,39 @@ func TelemetryWithOptions(opts TelemetryOptions) middleware.Middleware { next.ServeHTTP(w, r) + span := trace.SpanFromContext(r.Context()) + if stats, ok := gotsrpc.GetStatsForRequest(r); ok { + span.SetAttributes( + attribute.String("gotsrpc.func", stats.Func), + attribute.String("gotsrpc.service", stats.Service), + attribute.String("gotsrpc.package", stats.Package), + attribute.Float64("gotsrcp.execution.marshalling", stats.Marshalling.Seconds()), + attribute.Float64("gotsrcp.execution.unmarshalling", stats.Unmarshalling.Seconds()), + attribute.Float64("gotsrcp.execution.execution", stats.Unmarshalling.Seconds()), + ) + if stats.ErrorCode != 0 { + span.SetAttributes(attribute.Int("gotsrpc.error.code", stats.ErrorCode)) + } + if stats.ErrorType != "" { + span.SetAttributes(attribute.String("gotsrpc.error.type", stats.ErrorType)) + } + if stats.ErrorMessage != "" { + span.SetAttributes(attribute.String("gotsrpc.error.message", stats.ErrorMessage)) + } + // create custom metics if opts.Marshalling { - observe(r, gotsrpcRequestDurationSummary, stats, "marshalling") - observe(r, gotsrpcRequestDurationHistogram, stats, "marshalling") + observe(span.SpanContext(), gotsrpcRequestDurationSummary, stats, "marshalling") + observe(span.SpanContext(), gotsrpcRequestDurationHistogram, stats, "marshalling") } if opts.Unmarshalling { - observe(r, gotsrpcRequestDurationSummary, stats, "unmarshalling") - observe(r, gotsrpcRequestDurationHistogram, stats, "unmarshalling") + observe(span.SpanContext(), gotsrpcRequestDurationSummary, stats, "unmarshalling") + observe(span.SpanContext(), gotsrpcRequestDurationHistogram, stats, "unmarshalling") } if opts.Execution { - observe(r, gotsrpcRequestDurationSummary, stats, "execution") - observe(r, gotsrpcRequestDurationHistogram, stats, "execution") + observe(span.SpanContext(), gotsrpcRequestDurationSummary, stats, "execution") + observe(span.SpanContext(), gotsrpcRequestDurationHistogram, stats, "execution") } // enrich logger From 7f51f7c232e65d22ffb71261f87595037d588b63 Mon Sep 17 00:00:00 2001 From: franklin Date: Sat, 12 Aug 2023 22:18:53 +0200 Subject: [PATCH 050/134] fix: typo --- integration/gotsrpc/net/middleware/telemetry.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/integration/gotsrpc/net/middleware/telemetry.go b/integration/gotsrpc/net/middleware/telemetry.go index 092e571..c596562 100644 --- a/integration/gotsrpc/net/middleware/telemetry.go +++ b/integration/gotsrpc/net/middleware/telemetry.go @@ -156,9 +156,9 @@ func TelemetryWithOptions(opts TelemetryOptions) middleware.Middleware { attribute.String("gotsrpc.func", stats.Func), attribute.String("gotsrpc.service", stats.Service), attribute.String("gotsrpc.package", stats.Package), - attribute.Float64("gotsrcp.execution.marshalling", stats.Marshalling.Seconds()), - attribute.Float64("gotsrcp.execution.unmarshalling", stats.Unmarshalling.Seconds()), - attribute.Float64("gotsrcp.execution.execution", stats.Unmarshalling.Seconds()), + attribute.Float64("gotsrpc.execution.marshalling", stats.Marshalling.Seconds()), + attribute.Float64("gotsrpc.execution.unmarshalling", stats.Unmarshalling.Seconds()), + attribute.Float64("gotsrpc.execution.execution", stats.Unmarshalling.Seconds()), ) if stats.ErrorCode != 0 { span.SetAttributes(attribute.Int("gotsrpc.error.code", stats.ErrorCode)) From 773e7eea7987ae919b314f993dfb6d8d610bddc0 Mon Sep 17 00:00:00 2001 From: franklin Date: Sat, 12 Aug 2023 22:33:37 +0200 Subject: [PATCH 051/134] feat: add span --- integration/gotsrpc/net/middleware/telemetry.go | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/integration/gotsrpc/net/middleware/telemetry.go b/integration/gotsrpc/net/middleware/telemetry.go index c596562..c00879c 100644 --- a/integration/gotsrpc/net/middleware/telemetry.go +++ b/integration/gotsrpc/net/middleware/telemetry.go @@ -1,15 +1,18 @@ package keelgotsrpcmiddleware import ( + "fmt" "net/http" "strconv" "time" "github.com/foomo/gotsrpc/v2" httplog "github.com/foomo/keel/net/http/log" + "github.com/foomo/keel/telemetry" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/codes" "go.opentelemetry.io/otel/trace" "go.uber.org/zap" @@ -145,22 +148,23 @@ func TelemetryWithOptions(opts TelemetryOptions) middleware.Middleware { } return func(l *zap.Logger, name string, next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - *r = *gotsrpc.RequestWithStatsContext(r) + ctx, span := telemetry.Start(r.Context(), "gotsrpc") + *r = *gotsrpc.RequestWithStatsContext(r.WithContext(ctx)) next.ServeHTTP(w, r) - span := trace.SpanFromContext(r.Context()) - if stats, ok := gotsrpc.GetStatsForRequest(r); ok { + span.SetName(fmt.Sprintf("gotsrpc: %s.%s", stats.Service, stats.Func)) span.SetAttributes( attribute.String("gotsrpc.func", stats.Func), attribute.String("gotsrpc.service", stats.Service), attribute.String("gotsrpc.package", stats.Package), attribute.Float64("gotsrpc.execution.marshalling", stats.Marshalling.Seconds()), attribute.Float64("gotsrpc.execution.unmarshalling", stats.Unmarshalling.Seconds()), - attribute.Float64("gotsrpc.execution.execution", stats.Unmarshalling.Seconds()), + attribute.Float64("gotsrpc.execution.execution", stats.Execution.Seconds()), ) if stats.ErrorCode != 0 { + span.SetStatus(codes.Error, fmt.Sprintf("%s: %s", stats.ErrorType, stats.ErrorMessage)) span.SetAttributes(attribute.Int("gotsrpc.error.code", stats.ErrorCode)) } if stats.ErrorType != "" { @@ -202,6 +206,7 @@ func TelemetryWithOptions(opts TelemetryOptions) middleware.Middleware { } } } + telemetry.End(span, nil) }) } } From 3b38ea311b09320b191a2744cf058d350b4f318b Mon Sep 17 00:00:00 2001 From: franklin Date: Mon, 14 Aug 2023 08:08:21 +0200 Subject: [PATCH 052/134] feat: add span id --- log/fields_trace.go | 5 +++++ log/with.go | 4 ++-- net/http/middleware/telemetry.go | 3 ++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/log/fields_trace.go b/log/fields_trace.go index 0691d04..3c527af 100644 --- a/log/fields_trace.go +++ b/log/fields_trace.go @@ -5,9 +5,14 @@ import ( ) const ( + SpanID = "span_id" TraceID = "trace_id" ) +func FSpanID(traceID string) zap.Field { + return zap.String(SpanID, traceID) +} + func FTraceID(traceID string) zap.Field { return zap.String(TraceID, traceID) } diff --git a/log/with.go b/log/with.go index 7dd231a..ed236ef 100644 --- a/log/with.go +++ b/log/with.go @@ -29,8 +29,8 @@ func WithServiceName(l *zap.Logger, name string) *zap.Logger { } func WithTraceID(l *zap.Logger, ctx context.Context) *zap.Logger { - if spanCtx := trace.SpanContextFromContext(ctx); spanCtx.IsValid() { - l = With(l, FTraceID(spanCtx.TraceID().String())) + if spanCtx := trace.SpanContextFromContext(ctx); spanCtx.IsValid() && spanCtx.IsSampled() { + l = With(l, FTraceID(spanCtx.TraceID().String()), FSpanID(spanCtx.SpanID().String())) } return l } diff --git a/net/http/middleware/telemetry.go b/net/http/middleware/telemetry.go index 09c6fee..d293a79 100644 --- a/net/http/middleware/telemetry.go +++ b/net/http/middleware/telemetry.go @@ -72,8 +72,9 @@ func TelemetryWithOptions(opts TelemetryOptions) Middleware { } if labeler, ok := httplog.LabelerFromRequest(r); ok { - if spanCtx := trace.SpanContextFromContext(r.Context()); spanCtx.IsValid() { + if spanCtx := trace.SpanContextFromContext(r.Context()); spanCtx.IsValid() && spanCtx.IsSampled() { labeler.Add(log.FTraceID(spanCtx.TraceID().String())) + labeler.Add(log.FSpanID(spanCtx.SpanID().String())) } } From 0430bd9d06f9857e21ddc55f8c31f90a74eecd2c Mon Sep 17 00:00:00 2001 From: franklin Date: Mon, 14 Aug 2023 08:09:07 +0200 Subject: [PATCH 053/134] feat: aadd parent based --- telemetry/tracer.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/telemetry/tracer.go b/telemetry/tracer.go index 1d75e4d..e250ed0 100644 --- a/telemetry/tracer.go +++ b/telemetry/tracer.go @@ -83,7 +83,11 @@ func newTracerProvider(e sdktrace.SpanExporter) (trace.TracerProvider, error) { tracerProvider := sdktrace.NewTracerProvider( sdktrace.WithBatcher(e), sdktrace.WithResource(resource), - sdktrace.WithSampler(sdktrace.TraceIDRatioBased(env.GetFloat64("OTEL_TRACE_RATIO", 1))), + sdktrace.WithSampler( + sdktrace.ParentBased( + sdktrace.TraceIDRatioBased(env.GetFloat64("OTEL_TRACE_RATIO", 1)), + ), + ), ) otel.SetTracerProvider(tracerProvider) From 64c913b1c6de1fbbd9f65a217a0c1a017cb85e78 Mon Sep 17 00:00:00 2001 From: franklin Date: Mon, 14 Aug 2023 08:09:28 +0200 Subject: [PATCH 054/134] feat: use ms --- integration/gotsrpc/net/middleware/telemetry.go | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/integration/gotsrpc/net/middleware/telemetry.go b/integration/gotsrpc/net/middleware/telemetry.go index c00879c..128d54c 100644 --- a/integration/gotsrpc/net/middleware/telemetry.go +++ b/integration/gotsrpc/net/middleware/telemetry.go @@ -148,20 +148,18 @@ func TelemetryWithOptions(opts TelemetryOptions) middleware.Middleware { } return func(l *zap.Logger, name string, next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - ctx, span := telemetry.Start(r.Context(), "gotsrpc") + ctx, span := telemetry.Start(r.Context(), "GOTSRPC") *r = *gotsrpc.RequestWithStatsContext(r.WithContext(ctx)) next.ServeHTTP(w, r) if stats, ok := gotsrpc.GetStatsForRequest(r); ok { - span.SetName(fmt.Sprintf("gotsrpc: %s.%s", stats.Service, stats.Func)) span.SetAttributes( attribute.String("gotsrpc.func", stats.Func), attribute.String("gotsrpc.service", stats.Service), attribute.String("gotsrpc.package", stats.Package), - attribute.Float64("gotsrpc.execution.marshalling", stats.Marshalling.Seconds()), - attribute.Float64("gotsrpc.execution.unmarshalling", stats.Unmarshalling.Seconds()), - attribute.Float64("gotsrpc.execution.execution", stats.Execution.Seconds()), + attribute.Int64("gotsrpc.marshalling", stats.Marshalling.Milliseconds()), + attribute.Int64("gotsrpc.unmarshalling", stats.Unmarshalling.Milliseconds()), ) if stats.ErrorCode != 0 { span.SetStatus(codes.Error, fmt.Sprintf("%s: %s", stats.ErrorType, stats.ErrorMessage)) From 782df33078a4b34503903e04d4734e9f57361058 Mon Sep 17 00:00:00 2001 From: franklin Date: Mon, 14 Aug 2023 08:20:52 +0200 Subject: [PATCH 055/134] feat: change span names --- integration/gotsrpc/net/middleware/telemetry.go | 1 + net/http/middleware/telemetry.go | 9 +++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/integration/gotsrpc/net/middleware/telemetry.go b/integration/gotsrpc/net/middleware/telemetry.go index 128d54c..c4278c9 100644 --- a/integration/gotsrpc/net/middleware/telemetry.go +++ b/integration/gotsrpc/net/middleware/telemetry.go @@ -154,6 +154,7 @@ func TelemetryWithOptions(opts TelemetryOptions) middleware.Middleware { next.ServeHTTP(w, r) if stats, ok := gotsrpc.GetStatsForRequest(r); ok { + span.SetName(fmt.Sprintf("GOTSRPC %s.%s", stats.Package, stats.Service)) span.SetAttributes( attribute.String("gotsrpc.func", stats.Func), attribute.String("gotsrpc.service", stats.Service), diff --git a/net/http/middleware/telemetry.go b/net/http/middleware/telemetry.go index d293a79..b643893 100644 --- a/net/http/middleware/telemetry.go +++ b/net/http/middleware/telemetry.go @@ -1,6 +1,7 @@ package middleware import ( + "fmt" "net/http" "github.com/foomo/keel/log" @@ -24,7 +25,11 @@ type ( // GetDefaultTelemetryOptions returns the default options func GetDefaultTelemetryOptions() TelemetryOptions { return TelemetryOptions{ - OtelOpts: []otelhttp.Option{}, + OtelOpts: []otelhttp.Option{ + otelhttp.WithSpanNameFormatter(func(operation string, r *http.Request) string { + return fmt.Sprintf("HTTP %s", operation) + }), + }, InjectPropagationHeader: true, } } @@ -55,7 +60,7 @@ func TelemetryWithInjectPropagationHeader(v bool) TelemetryOption { // TelemetryWithOtelOpts middleware options func TelemetryWithOtelOpts(v ...otelhttp.Option) TelemetryOption { return func(o *TelemetryOptions) { - o.OtelOpts = v + o.OtelOpts = append(o.OtelOpts, v...) } } From dd8b12577e393e71da090d54c232068038e8a9c7 Mon Sep 17 00:00:00 2001 From: franklin Date: Mon, 14 Aug 2023 08:42:30 +0200 Subject: [PATCH 056/134] feat: allow payload attribute --- .../gotsrpc/net/middleware/telemetry.go | 72 +++++++++++++------ 1 file changed, 51 insertions(+), 21 deletions(-) diff --git a/integration/gotsrpc/net/middleware/telemetry.go b/integration/gotsrpc/net/middleware/telemetry.go index c4278c9..b1421cf 100644 --- a/integration/gotsrpc/net/middleware/telemetry.go +++ b/integration/gotsrpc/net/middleware/telemetry.go @@ -1,7 +1,9 @@ package keelgotsrpcmiddleware import ( + "bytes" "fmt" + "io" "net/http" "strconv" "time" @@ -11,6 +13,7 @@ import ( "github.com/foomo/keel/telemetry" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" + "go.mongodb.org/mongo-driver/bson" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/codes" "go.opentelemetry.io/otel/trace" @@ -33,10 +36,11 @@ const ( type ( TelemetryOptions struct { - Exemplars bool - Execution bool - Marshalling bool - Unmarshalling bool + Exemplars bool + ObserveExecution bool + ObserveMarshalling bool + ObserveUnmarshalling bool + PayloadAttributeDisabled bool } TelemetryOption func(*TelemetryOptions) ) @@ -73,10 +77,11 @@ var ( // DefaultTelemetryOptions returns the default options func DefaultTelemetryOptions() TelemetryOptions { return TelemetryOptions{ - Exemplars: false, - Execution: true, - Marshalling: false, - Unmarshalling: false, + Exemplars: false, + ObserveExecution: true, + ObserveMarshalling: false, + ObserveUnmarshalling: false, + PayloadAttributeDisabled: true, } } @@ -87,24 +92,31 @@ func TelemetryWithExemplars(v bool) TelemetryOption { } } -// TelemetryWithExecution middleware option -func TelemetryWithExecution(v bool) TelemetryOption { +// TelemetryWithObserveExecution middleware option +func TelemetryWithObserveExecution(v bool) TelemetryOption { return func(o *TelemetryOptions) { - o.Execution = v + o.ObserveExecution = v } } -// TelemetryWithMarshalling middleware option -func TelemetryWithMarshalling(v bool) TelemetryOption { +// TelemetryWithObserveMarshalling middleware option +func TelemetryWithObserveMarshalling(v bool) TelemetryOption { return func(o *TelemetryOptions) { - o.Marshalling = v + o.ObserveMarshalling = v } } -// TelemetryWithUnmarshalling middleware option -func TelemetryWithUnmarshalling(v bool) TelemetryOption { +// TelemetryWithObserveUnmarshalling middleware option +func TelemetryWithObserveUnmarshalling(v bool) TelemetryOption { return func(o *TelemetryOptions) { - o.Unmarshalling = v + o.ObserveUnmarshalling = v + } +} + +// TelemetryWithPayloadAttributeDisabled middleware option +func TelemetryWithPayloadAttributeDisabled(v bool) TelemetryOption { + return func(o *TelemetryOptions) { + o.PayloadAttributeDisabled = v } } @@ -146,6 +158,21 @@ func TelemetryWithOptions(opts TelemetryOptions) middleware.Middleware { } observer.Observe(duration.Seconds()) } + sanitizePayload := func(r *http.Request) string { + if r.Method != http.MethodPost { + return "" + } + bodyBytes, _ := io.ReadAll(r.Body) + if err := r.Body.Close(); err != nil { + return "" + } + r.Body = io.NopCloser(bytes.NewBuffer(bodyBytes)) + b, err := bson.MarshalExtJSON(bodyBytes, false, false) + if err != nil { + return "" + } + return string(b) + } return func(l *zap.Logger, name string, next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { ctx, span := telemetry.Start(r.Context(), "GOTSRPC") @@ -154,7 +181,7 @@ func TelemetryWithOptions(opts TelemetryOptions) middleware.Middleware { next.ServeHTTP(w, r) if stats, ok := gotsrpc.GetStatsForRequest(r); ok { - span.SetName(fmt.Sprintf("GOTSRPC %s.%s", stats.Package, stats.Service)) + span.SetName(fmt.Sprintf("GOTSRPC %s.%s", stats.Service, stats.Func)) span.SetAttributes( attribute.String("gotsrpc.func", stats.Func), attribute.String("gotsrpc.service", stats.Service), @@ -162,6 +189,9 @@ func TelemetryWithOptions(opts TelemetryOptions) middleware.Middleware { attribute.Int64("gotsrpc.marshalling", stats.Marshalling.Milliseconds()), attribute.Int64("gotsrpc.unmarshalling", stats.Unmarshalling.Milliseconds()), ) + if !opts.PayloadAttributeDisabled { + span.SetAttributes(attribute.String("gotsprc.payload", sanitizePayload(r))) + } if stats.ErrorCode != 0 { span.SetStatus(codes.Error, fmt.Sprintf("%s: %s", stats.ErrorType, stats.ErrorMessage)) span.SetAttributes(attribute.Int("gotsrpc.error.code", stats.ErrorCode)) @@ -174,15 +204,15 @@ func TelemetryWithOptions(opts TelemetryOptions) middleware.Middleware { } // create custom metics - if opts.Marshalling { + if opts.ObserveMarshalling { observe(span.SpanContext(), gotsrpcRequestDurationSummary, stats, "marshalling") observe(span.SpanContext(), gotsrpcRequestDurationHistogram, stats, "marshalling") } - if opts.Unmarshalling { + if opts.ObserveUnmarshalling { observe(span.SpanContext(), gotsrpcRequestDurationSummary, stats, "unmarshalling") observe(span.SpanContext(), gotsrpcRequestDurationHistogram, stats, "unmarshalling") } - if opts.Execution { + if opts.ObserveExecution { observe(span.SpanContext(), gotsrpcRequestDurationSummary, stats, "execution") observe(span.SpanContext(), gotsrpcRequestDurationHistogram, stats, "execution") } From c5040533e707e1cc3fb5845589e8e980e62124f6 Mon Sep 17 00:00:00 2001 From: franklin Date: Mon, 14 Aug 2023 08:47:25 +0200 Subject: [PATCH 057/134] feat: handle error --- integration/gotsrpc/net/middleware/telemetry.go | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/integration/gotsrpc/net/middleware/telemetry.go b/integration/gotsrpc/net/middleware/telemetry.go index b1421cf..7165248 100644 --- a/integration/gotsrpc/net/middleware/telemetry.go +++ b/integration/gotsrpc/net/middleware/telemetry.go @@ -158,21 +158,26 @@ func TelemetryWithOptions(opts TelemetryOptions) middleware.Middleware { } observer.Observe(duration.Seconds()) } + sanitizePayload := func(r *http.Request) string { if r.Method != http.MethodPost { return "" } - bodyBytes, _ := io.ReadAll(r.Body) + body, err := io.ReadAll(r.Body) + if err != nil { + return "" + } if err := r.Body.Close(); err != nil { return "" } - r.Body = io.NopCloser(bytes.NewBuffer(bodyBytes)) - b, err := bson.MarshalExtJSON(bodyBytes, false, false) + r.Body = io.NopCloser(bytes.NewBuffer(body)) + b, err := bson.MarshalExtJSON(body, false, false) if err != nil { return "" } return string(b) } + return func(l *zap.Logger, name string, next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { ctx, span := telemetry.Start(r.Context(), "GOTSRPC") From 7edfbfd18636cca4e0c187f4ed0956155ac33d54 Mon Sep 17 00:00:00 2001 From: franklin Date: Mon, 14 Aug 2023 08:56:33 +0200 Subject: [PATCH 058/134] feat: pretty print --- integration/gotsrpc/net/middleware/telemetry.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/integration/gotsrpc/net/middleware/telemetry.go b/integration/gotsrpc/net/middleware/telemetry.go index 7165248..4140bda 100644 --- a/integration/gotsrpc/net/middleware/telemetry.go +++ b/integration/gotsrpc/net/middleware/telemetry.go @@ -2,6 +2,7 @@ package keelgotsrpcmiddleware import ( "bytes" + "encoding/json" "fmt" "io" "net/http" @@ -13,7 +14,6 @@ import ( "github.com/foomo/keel/telemetry" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" - "go.mongodb.org/mongo-driver/bson" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/codes" "go.opentelemetry.io/otel/trace" @@ -171,11 +171,11 @@ func TelemetryWithOptions(opts TelemetryOptions) middleware.Middleware { return "" } r.Body = io.NopCloser(bytes.NewBuffer(body)) - b, err := bson.MarshalExtJSON(body, false, false) - if err != nil { + var out bytes.Buffer + if err = json.Indent(&out, body, "", " "); err != nil { return "" } - return string(b) + return out.String() } return func(l *zap.Logger, name string, next http.Handler) http.Handler { From 0a682498d4b302a78d8582111cbe118d2782f6b6 Mon Sep 17 00:00:00 2001 From: franklin Date: Mon, 14 Aug 2023 08:59:45 +0200 Subject: [PATCH 059/134] feat: read first --- integration/gotsrpc/net/middleware/telemetry.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/integration/gotsrpc/net/middleware/telemetry.go b/integration/gotsrpc/net/middleware/telemetry.go index 4140bda..fb192d3 100644 --- a/integration/gotsrpc/net/middleware/telemetry.go +++ b/integration/gotsrpc/net/middleware/telemetry.go @@ -183,6 +183,10 @@ func TelemetryWithOptions(opts TelemetryOptions) middleware.Middleware { ctx, span := telemetry.Start(r.Context(), "GOTSRPC") *r = *gotsrpc.RequestWithStatsContext(r.WithContext(ctx)) + if !opts.PayloadAttributeDisabled { + span.SetAttributes(attribute.String("gotsprc.payload", sanitizePayload(r))) + } + next.ServeHTTP(w, r) if stats, ok := gotsrpc.GetStatsForRequest(r); ok { @@ -194,9 +198,6 @@ func TelemetryWithOptions(opts TelemetryOptions) middleware.Middleware { attribute.Int64("gotsrpc.marshalling", stats.Marshalling.Milliseconds()), attribute.Int64("gotsrpc.unmarshalling", stats.Unmarshalling.Milliseconds()), ) - if !opts.PayloadAttributeDisabled { - span.SetAttributes(attribute.String("gotsprc.payload", sanitizePayload(r))) - } if stats.ErrorCode != 0 { span.SetStatus(codes.Error, fmt.Sprintf("%s: %s", stats.ErrorType, stats.ErrorMessage)) span.SetAttributes(attribute.Int("gotsrpc.error.code", stats.ErrorCode)) From ab382f801afb912e31c3defae40c0a52aac0ec03 Mon Sep 17 00:00:00 2001 From: franklin Date: Mon, 14 Aug 2023 13:21:49 +0200 Subject: [PATCH 060/134] feat: add env configuration --- integration/gotsrpc/net/middleware/telemetry.go | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/integration/gotsrpc/net/middleware/telemetry.go b/integration/gotsrpc/net/middleware/telemetry.go index fb192d3..754b53b 100644 --- a/integration/gotsrpc/net/middleware/telemetry.go +++ b/integration/gotsrpc/net/middleware/telemetry.go @@ -10,6 +10,7 @@ import ( "time" "github.com/foomo/gotsrpc/v2" + "github.com/foomo/keel/env" httplog "github.com/foomo/keel/net/http/log" "github.com/foomo/keel/telemetry" "github.com/prometheus/client_golang/prometheus" @@ -36,7 +37,7 @@ const ( type ( TelemetryOptions struct { - Exemplars bool + ExemplarsDisabled bool ObserveExecution bool ObserveMarshalling bool ObserveUnmarshalling bool @@ -77,18 +78,18 @@ var ( // DefaultTelemetryOptions returns the default options func DefaultTelemetryOptions() TelemetryOptions { return TelemetryOptions{ - Exemplars: false, ObserveExecution: true, ObserveMarshalling: false, ObserveUnmarshalling: false, - PayloadAttributeDisabled: true, + PayloadAttributeDisabled: env.GetBool("OTEL_GOTSRPC_PAYLOAD_ATTRIBUTE_DISABLED", true), + ExemplarsDisabled: env.GetBool("OTEL_GOTSRPC_EXEMPLARS_DISABLED", false), } } -// TelemetryWithExemplars middleware option -func TelemetryWithExemplars(v bool) TelemetryOption { +// TelemetryWithExemplarsDisabled middleware option +func TelemetryWithExemplarsDisabled(v bool) TelemetryOption { return func(o *TelemetryOptions) { - o.Exemplars = v + o.ExemplarsDisabled = v } } @@ -150,7 +151,7 @@ func TelemetryWithOptions(opts TelemetryOptions) middleware.Middleware { case "execution": duration = stats.Execution } - if exemplarObserver, ok := observer.(prometheus.ExemplarObserver); ok && opts.Exemplars && spanCtx.HasTraceID() && spanCtx.IsSampled() { + if exemplarObserver, ok := observer.(prometheus.ExemplarObserver); ok && opts.ExemplarsDisabled && spanCtx.HasTraceID() && spanCtx.IsSampled() { exemplarObserver.ObserveWithExemplar(duration.Seconds(), prometheus.Labels{ "traceID": spanCtx.TraceID().String(), }) From ba1a11b1ff76f4ebb5aff6d62c3aee7faac52302 Mon Sep 17 00:00:00 2001 From: Michael Hegel Date: Thu, 31 Aug 2023 14:44:52 +0200 Subject: [PATCH 061/134] return orignal response and error instead of result of IsSuccessful --- net/http/roundtripware/circuitbreaker.go | 20 +++++++----- net/http/roundtripware/circuitbreaker_test.go | 31 +++++++++++-------- 2 files changed, 31 insertions(+), 20 deletions(-) diff --git a/net/http/roundtripware/circuitbreaker.go b/net/http/roundtripware/circuitbreaker.go index f8d7d62..e060c61 100644 --- a/net/http/roundtripware/circuitbreaker.go +++ b/net/http/roundtripware/circuitbreaker.go @@ -176,8 +176,17 @@ func CircuitBreaker(set *CircuitBreakerSettings, opts ...CircuitBreakerOption) R } } - if err = o.IsSuccessful(err, reqCopy, respCopy); !errors.Is(err, ErrIgnoreSuccessfulness) { - done(err == nil) + if errSuccess := o.IsSuccessful(err, reqCopy, respCopy); errors.Is(errSuccess, errNoBody) { + l.Error("encountered read from not previously copied request/response body", + zap.Bool("copy_request", o.CopyReqBody), + zap.Bool("copy_response", o.CopyRespBody), + ) + // we actually want to return an error instead of the original request and error since the user + // should be made aware that there is a misconfiguration + resp = nil + err = errSuccess + } else if !errors.Is(errSuccess, ErrIgnoreSuccessfulness) { + done(errSuccess == nil) } } @@ -200,15 +209,12 @@ func CircuitBreaker(set *CircuitBreakerSettings, opts ...CircuitBreakerOption) R attributes := append(attributes, attribute.Bool("error", true)) o.Counter.Add(r.Context(), 1, attributes...) } - return nil, err - } - - if o.Counter != nil { + } else if o.Counter != nil { attributes := append(attributes, attribute.Bool("error", false)) o.Counter.Add(r.Context(), 1, attributes...) } - return resp, nil + return resp, err } } } diff --git a/net/http/roundtripware/circuitbreaker_test.go b/net/http/roundtripware/circuitbreaker_test.go index 627abda..758810f 100644 --- a/net/http/roundtripware/circuitbreaker_test.go +++ b/net/http/roundtripware/circuitbreaker_test.go @@ -3,6 +3,7 @@ package roundtripware_test import ( "context" "errors" + "fmt" "io" "net/http" "net/http/httptest" @@ -23,7 +24,7 @@ var cbSettings = &roundtripware.CircuitBreakerSettings{ // MaxRequests is the maximum number of requests allowed to pass through // when the CircuitBreaker is half-open. // If MaxRequests is 0, the CircuitBreaker allows only 1 request. - MaxRequests: 1, + MaxRequests: 2, // Interval is the cyclic period of the closed state // for the CircuitBreaker to clear the internal Counts. // If Interval is less than or equal to 0, the CircuitBreaker doesn't clear internal Counts during the closed state. @@ -39,6 +40,9 @@ var cbSettings = &roundtripware.CircuitBreakerSettings{ ReadyToTrip: func(counts gobreaker.Counts) bool { return counts.ConsecutiveFailures > 3 }, + OnStateChange: func(name string, from gobreaker.State, to gobreaker.State) { + fmt.Printf("\n\nstate changed from %s to %s\n\n", from, to) + }, } func TestCircuitBreaker(t *testing.T) { @@ -96,7 +100,7 @@ func TestCircuitBreaker(t *testing.T) { req, err := http.NewRequestWithContext(context.Background(), http.MethodGet, svr.URL, nil) require.NoError(t, err) resp, err := client.Do(req) - if err == nil { + if resp != nil { defer resp.Body.Close() } require.NotErrorIs(t, err, roundtripware.ErrCircuitBreaker) @@ -118,7 +122,7 @@ func TestCircuitBreaker(t *testing.T) { req, err = http.NewRequestWithContext(context.Background(), http.MethodGet, svr.URL, nil) require.NoError(t, err) resp, err = client.Do(req) - if err == nil { + if resp != nil { defer resp.Body.Close() } require.NoError(t, err) @@ -170,7 +174,7 @@ func TestCircuitBreakerCopyBodies(t *testing.T) { req, err := http.NewRequestWithContext(context.Background(), http.MethodGet, svr.URL, strings.NewReader(requestData)) require.NoError(t, err) resp, err := client.Do(req) - if err == nil { + if resp != nil { defer resp.Body.Close() } require.NoError(t, err) @@ -222,7 +226,7 @@ func TestCircuitBreakerReadFromNotCopiedBodies(t *testing.T) { req, err := http.NewRequestWithContext(context.Background(), http.MethodGet, svr.URL, strings.NewReader(requestData)) require.NoError(t, err) resp, err := client.Do(req) - if err == nil { + if resp != nil { defer resp.Body.Close() } require.Error(t, err) @@ -250,7 +254,7 @@ func TestCircuitBreakerReadFromNotCopiedBodies(t *testing.T) { req, err = http.NewRequestWithContext(context.Background(), http.MethodGet, svr.URL, strings.NewReader(requestData)) require.NoError(t, err) resp, err = client.Do(req) - if err == nil { + if resp != nil { defer resp.Body.Close() } require.Error(t, err) @@ -296,7 +300,7 @@ func TestCircuitBreakerInterval(t *testing.T) { req, err := http.NewRequestWithContext(context.Background(), http.MethodGet, svr.URL, nil) require.NoError(t, err) resp, err := client.Do(req) - if err == nil { + if resp != nil { defer resp.Body.Close() } require.NotErrorIs(t, err, roundtripware.ErrCircuitBreaker) @@ -311,7 +315,7 @@ func TestCircuitBreakerInterval(t *testing.T) { req, err := http.NewRequestWithContext(context.Background(), http.MethodGet, svr.URL, nil) require.NoError(t, err) resp, err := client.Do(req) - if err == nil { + if resp != nil { defer resp.Body.Close() } require.NotErrorIs(t, err, roundtripware.ErrCircuitBreaker) @@ -321,7 +325,7 @@ func TestCircuitBreakerInterval(t *testing.T) { req, err := http.NewRequestWithContext(context.Background(), http.MethodGet, svr.URL, nil) require.NoError(t, err) resp, err := client.Do(req) - if err == nil { + if resp != nil { defer resp.Body.Close() } require.ErrorIs(t, err, roundtripware.ErrCircuitBreaker) @@ -363,11 +367,12 @@ func TestCircuitBreakerIgnore(t *testing.T) { req, err := http.NewRequestWithContext(context.Background(), http.MethodGet, svr.URL, nil) require.NoError(t, err) resp, err := client.Do(req) - if err == nil { + if resp != nil { defer resp.Body.Close() } require.NotErrorIs(t, err, roundtripware.ErrCircuitBreaker) - require.Error(t, err) + require.NoError(t, err) + require.NotNil(t, resp) } } @@ -397,7 +402,7 @@ func TestCircuitBreakerTimeout(t *testing.T) { req, err := http.NewRequestWithContext(ctx, http.MethodGet, svr.URL, nil) require.NoError(t, err) resp, err := client.Do(req) - if err == nil { + if resp != nil { defer resp.Body.Close() } require.NotErrorIs(t, err, roundtripware.ErrCircuitBreaker) @@ -411,7 +416,7 @@ func TestCircuitBreakerTimeout(t *testing.T) { req, err := http.NewRequestWithContext(ctx, http.MethodGet, svr.URL, nil) require.NoError(t, err) resp, err := client.Do(req) - if err == nil { + if resp != nil { defer resp.Body.Close() } require.ErrorIs(t, err, roundtripware.ErrCircuitBreaker) From f12379252f79c8e3f96a0ef9bba19e2dc14fd896 Mon Sep 17 00:00:00 2001 From: Michael Hegel Date: Thu, 31 Aug 2023 14:54:29 +0200 Subject: [PATCH 062/134] improved handling of disallowed reads from body --- net/http/roundtripware/circuitbreaker.go | 9 +++++++-- net/http/roundtripware/circuitbreaker_test.go | 2 ++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/net/http/roundtripware/circuitbreaker.go b/net/http/roundtripware/circuitbreaker.go index e060c61..c0e6363 100644 --- a/net/http/roundtripware/circuitbreaker.go +++ b/net/http/roundtripware/circuitbreaker.go @@ -21,8 +21,13 @@ var ( // needed ErrCircuitBreaker = errors.New("circuit breaker triggered") - // ErrIgnoreSuccessfulness + // ErrIgnoreSuccessfulness can be returned by the IsSuccessful callback in order for the RoundTripware to ignore the + // result of the function ErrIgnoreSuccessfulness = errors.New("ignored successfulness") + + // ErrReadFromActualBody when it is attempted to read from a body in the IsSuccessful callback that has not + // previously been copied. + ErrReadFromActualBody = errors.New("read from actual body") ) // CircuitBreakerSettings is a copy of the gobreaker.Settings, except that the IsSuccessful function is omitted since we @@ -184,7 +189,7 @@ func CircuitBreaker(set *CircuitBreakerSettings, opts ...CircuitBreakerOption) R // we actually want to return an error instead of the original request and error since the user // should be made aware that there is a misconfiguration resp = nil - err = errSuccess + err = ErrReadFromActualBody } else if !errors.Is(errSuccess, ErrIgnoreSuccessfulness) { done(errSuccess == nil) } diff --git a/net/http/roundtripware/circuitbreaker_test.go b/net/http/roundtripware/circuitbreaker_test.go index 758810f..13b4a0f 100644 --- a/net/http/roundtripware/circuitbreaker_test.go +++ b/net/http/roundtripware/circuitbreaker_test.go @@ -230,6 +230,7 @@ func TestCircuitBreakerReadFromNotCopiedBodies(t *testing.T) { defer resp.Body.Close() } require.Error(t, err) + require.ErrorIs(t, err, roundtripware.ErrReadFromActualBody) // same thing for the response client = keelhttp.NewHTTPClient( @@ -258,6 +259,7 @@ func TestCircuitBreakerReadFromNotCopiedBodies(t *testing.T) { defer resp.Body.Close() } require.Error(t, err) + require.ErrorIs(t, err, roundtripware.ErrReadFromActualBody) } func TestCircuitBreakerInterval(t *testing.T) { From a7b43abf437fde20752fb757a33368d66b56880d Mon Sep 17 00:00:00 2001 From: Michael Hegel Date: Mon, 4 Sep 2023 17:08:15 +0200 Subject: [PATCH 063/134] improved circuitbreaker roundtripware flow Co-authored-by: Kevin Franklin Kim --- net/http/roundtripware/circuitbreaker.go | 105 ++++++++++++----------- 1 file changed, 53 insertions(+), 52 deletions(-) diff --git a/net/http/roundtripware/circuitbreaker.go b/net/http/roundtripware/circuitbreaker.go index c0e6363..8f7d0a7 100644 --- a/net/http/roundtripware/circuitbreaker.go +++ b/net/http/roundtripware/circuitbreaker.go @@ -133,7 +133,7 @@ func CircuitBreaker(set *CircuitBreakerSettings, opts ...CircuitBreakerOption) R circuitBreaker := gobreaker.NewTwoStepCircuitBreaker(cbrSettings) return func(l *zap.Logger, next Handler) Handler { - return func(r *http.Request) (*http.Response, error) { + return func(r *http.Request) (resp *http.Response, err error) { if r == nil { return nil, errors.New("request is nil") } @@ -141,6 +141,32 @@ func CircuitBreaker(set *CircuitBreakerSettings, opts ...CircuitBreakerOption) R // we need to detect the state change by ourselves, because the context does not allow us to hand in a context fromState := circuitBreaker.State() + defer func() { + // detect and log a state change + toState := circuitBreaker.State() + if fromState != toState { + l.Warn("state change occurred", + zap.String("state_from", fromState.String()), + zap.String("state_to", toState.String()), + ) + } + + attributes := []attribute.KeyValue{ + attribute.String("current_state", toState.String()), + attribute.String("previous_state", fromState.String()), + attribute.Bool("state_change", fromState != toState), + } + if err != nil { + if o.Counter != nil { + attributes := append(attributes, attribute.Bool("error", true)) + o.Counter.Add(r.Context(), 1, attributes...) + } + } else if o.Counter != nil { + attributes := append(attributes, attribute.Bool("error", false)) + o.Counter.Add(r.Context(), 1, attributes...) + } + }() + // clone the request and the body if wanted var errCopy error reqCopy, errCopy := copyRequest(r, o.CopyReqBody) @@ -155,71 +181,46 @@ func CircuitBreaker(set *CircuitBreakerSettings, opts ...CircuitBreakerOption) R // check whether the circuit breaker is closed (an error is returned if not) done, err := circuitBreaker.Allow() - var resp *http.Response // wrap the error in case it was produced because of the circuit breaker being (half-)open if errors.Is(err, gobreaker.ErrTooManyRequests) || errors.Is(err, gobreaker.ErrOpenState) { - err = keelerrors.NewWrappedError(ErrCircuitBreaker, err) + return nil, keelerrors.NewWrappedError(ErrCircuitBreaker, err) } else if err != nil { l.Error("unexpected error in circuit breaker", log.FError(err), zap.String("state", fromState.String()), ) - } else { - // continue with the middleware chain - resp, err = next(r) //nolint:bodyclose - - var respCopy *http.Response - if resp != nil { - // clone the response and the body if wanted - respCopy, errCopy = copyResponse(resp, o.CopyRespBody) - if errCopy != nil { - l.Error("unable to copy response", log.FError(errCopy)) - return nil, errCopy - } else if o.CopyRespBody && respCopy.Body != nil { - // make sure the body is closed again - since it is a NopCloser it does not make a difference though - defer respCopy.Body.Close() - } - } + return nil, err + } - if errSuccess := o.IsSuccessful(err, reqCopy, respCopy); errors.Is(errSuccess, errNoBody) { - l.Error("encountered read from not previously copied request/response body", - zap.Bool("copy_request", o.CopyReqBody), - zap.Bool("copy_response", o.CopyRespBody), - ) - // we actually want to return an error instead of the original request and error since the user - // should be made aware that there is a misconfiguration - resp = nil - err = ErrReadFromActualBody - } else if !errors.Is(errSuccess, ErrIgnoreSuccessfulness) { - done(errSuccess == nil) + // continue with the middleware chain + resp, err = next(r) //nolint:bodyclose + + var respCopy *http.Response + if resp != nil { + // clone the response and the body if wanted + respCopy, errCopy = copyResponse(resp, o.CopyRespBody) + if errCopy != nil { + l.Error("unable to copy response", log.FError(errCopy)) + return nil, errCopy + } else if o.CopyRespBody && respCopy.Body != nil { + // make sure the body is closed again - since it is a NopCloser it does not make a difference though + defer respCopy.Body.Close() } } - // detect and log a state change - toState := circuitBreaker.State() - if fromState != toState { - l.Warn("state change occurred", - zap.String("state_from", fromState.String()), - zap.String("state_to", toState.String()), + if errSuccess := o.IsSuccessful(err, reqCopy, respCopy); errors.Is(errSuccess, errNoBody) { + l.Error("encountered read from not previously copied request/response body", + zap.Bool("copy_request", o.CopyReqBody), + zap.Bool("copy_response", o.CopyRespBody), ) + // we actually want to return an error instead of the original request and error since the user + // should be made aware that there is a misconfiguration + return nil, ErrReadFromActualBody + } else if !errors.Is(errSuccess, ErrIgnoreSuccessfulness) { + done(errSuccess == nil) } - attributes := []attribute.KeyValue{ - attribute.String("current_state", toState.String()), - attribute.String("previous_state", fromState.String()), - attribute.Bool("state_change", fromState != toState), - } - if err != nil { - if o.Counter != nil { - attributes := append(attributes, attribute.Bool("error", true)) - o.Counter.Add(r.Context(), 1, attributes...) - } - } else if o.Counter != nil { - attributes := append(attributes, attribute.Bool("error", false)) - o.Counter.Add(r.Context(), 1, attributes...) - } - - return resp, err + return resp, nil } } } From 07f0c394d542ca4637c5b58a099a845d18ee9b14 Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Fri, 8 Sep 2023 12:14:56 +0200 Subject: [PATCH 064/134] feat: add GoRoutine service moves all services into the service package --- README.md | 3 +- errors.go | 3 +- examples/config/main.go | 3 +- examples/graceful/main.go | 3 +- examples/healthz/main.go | 6 +- examples/logging/main.go | 3 +- examples/middlewares/basicauth/main.go | 3 +- examples/middlewares/cors/main.go | 3 +- examples/middlewares/jwtfromcookie/main.go | 3 +- examples/middlewares/jwtfromtoken/main.go | 3 +- examples/middlewares/logger/main.go | 3 +- examples/middlewares/recover/main.go | 3 +- examples/middlewares/requestid/main.go | 3 +- examples/middlewares/responsetime/main.go | 3 +- examples/middlewares/sessionid/main.go | 3 +- examples/middlewares/skip/main.go | 5 +- examples/middlewares/telemetry/main.go | 3 +- .../middlewares/tokenauthfromcookie/main.go | 3 +- .../middlewares/tokenauthfromheader/main.go | 3 +- examples/remoteconfig/main.go | 3 +- examples/roundtripwares/logger/server.go | 3 +- examples/roundtripwares/requestid/main.go | 3 +- examples/roundtripwares/retry/server.go | 3 +- examples/serviceenabler/main.go | 5 +- examples/services/main.go | 14 - examples/stream/jetstream/main.go | 3 +- examples/stream/jetstreamraw/main.go | 3 +- examples/telemetry/main.go | 13 +- go.mod | 1 + go.sum | 2 + healthz/docs.go | 1 + healthzer.go => healthz/healthzer.go | 6 +- healthztype.go => healthz/type.go | 24 +- closer.go => interfaces/closer.go | 10 +- interfaces/doc.go | 1 + pinger.go => interfaces/pinger.go | 2 +- shutdowner.go => interfaces/shutdowner.go | 2 +- stopper.go => interfaces/stopper.go | 2 +- unsubscriber.go => interfaces/unsubscriber.go | 2 +- log/fields_keel.go | 11 + log/fields_service.go | 6 + log/with.go | 12 + option.go | 31 +- server.go | 97 ++-- server_docs.go | 435 ++++++++++++++++++ server_test.go | 9 +- service/errors.go | 10 + service/goroutine.go | 94 ++++ service/goroutine_test.go | 47 ++ service/helper_test.go | 14 + servicehttp.go => service/http.go | 44 +- service/http_test.go | 39 ++ .../httphealthz.go | 56 +-- servicehttppprof.go => service/httppprof.go | 22 +- .../httppprof_pprof.go | 20 +- service/httpprometheus.go | 37 ++ servicehttpviper.go => service/httpviper.go | 22 +- servicehttpzap.go => service/httpzap.go | 22 +- servicehttpprometheus.go | 37 -- telemetry/nonrecording/instruments.go | 162 +++++++ telemetry/nonrecording/meter.go | 50 ++ 61 files changed, 1186 insertions(+), 256 deletions(-) create mode 100644 healthz/docs.go rename healthzer.go => healthz/healthzer.go (87%) rename healthztype.go => healthz/type.go (70%) rename closer.go => interfaces/closer.go (82%) create mode 100644 interfaces/doc.go rename pinger.go => interfaces/pinger.go (91%) rename shutdowner.go => interfaces/shutdowner.go (95%) rename stopper.go => interfaces/stopper.go (94%) rename unsubscriber.go => interfaces/unsubscriber.go (95%) create mode 100644 log/fields_keel.go create mode 100644 server_docs.go create mode 100644 service/errors.go create mode 100644 service/goroutine.go create mode 100644 service/goroutine_test.go create mode 100644 service/helper_test.go rename servicehttp.go => service/http.go (52%) create mode 100644 service/http_test.go rename servicehttphealthz.go => service/httphealthz.go (67%) rename servicehttppprof.go => service/httppprof.go (56%) rename servicehttppprof_pprof.go => service/httppprof_pprof.go (54%) create mode 100644 service/httpprometheus.go rename servicehttpviper.go => service/httpviper.go (67%) rename servicehttpzap.go => service/httpzap.go (84%) delete mode 100644 servicehttpprometheus.go create mode 100644 telemetry/nonrecording/instruments.go create mode 100644 telemetry/nonrecording/meter.go diff --git a/README.md b/README.md index 02690fe..f69b1a9 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,7 @@ import ( "net/http" "github.com/foomo/keel" + "github.com/foomo/keel/service" ) func main() { @@ -39,7 +40,7 @@ func main() { svs := newService() svr.AddService( - keel.NewServiceHTTP(l, "demo", ":8080", svs), + service.NewHTTP(l, "demo", "localhost:8080", svs), ) svr.Run() diff --git a/errors.go b/errors.go index f9d28eb..02d3e6f 100644 --- a/errors.go +++ b/errors.go @@ -5,6 +5,5 @@ import ( ) var ( - ErrServerNotRunning = errors.New("server not running") - ErrServiceNotRunning = errors.New("service not running") + ErrServerNotRunning = errors.New("server not running") ) diff --git a/examples/config/main.go b/examples/config/main.go index bf89a65..19e1f86 100644 --- a/examples/config/main.go +++ b/examples/config/main.go @@ -7,6 +7,7 @@ import ( "time" "github.com/davecgh/go-spew/spew" + "github.com/foomo/keel/service" "github.com/foomo/keel" "github.com/foomo/keel/config" @@ -85,7 +86,7 @@ func main() { }) svr.AddService( - keel.NewServiceHTTP(l, "demo", "localhost:8081", svs), + service.NewHTTP(l, "demo", "localhost:8081", svs), ) svr.Run() diff --git a/examples/graceful/main.go b/examples/graceful/main.go index 7d030d6..4286086 100644 --- a/examples/graceful/main.go +++ b/examples/graceful/main.go @@ -6,6 +6,7 @@ import ( "sync" "time" + "github.com/foomo/keel/service" "go.uber.org/zap" "github.com/foomo/keel" @@ -32,7 +33,7 @@ func main() { }) svr.AddService( - keel.NewServiceHTTP(l, "demo", "localhost:8080", svs), + service.NewHTTP(l, "demo", "localhost:8080", svs), ) svr.Run() diff --git a/examples/healthz/main.go b/examples/healthz/main.go index cbf5ce8..8c5588e 100644 --- a/examples/healthz/main.go +++ b/examples/healthz/main.go @@ -8,6 +8,8 @@ import ( "github.com/foomo/keel" "github.com/foomo/keel/examples/healthz/handler" + "github.com/foomo/keel/healthz" + "github.com/foomo/keel/service" ) // See k8s for probe documentation @@ -46,7 +48,7 @@ func main() { svr.AddReadinessHealthzers(rh) // add inline probe e.g. in case you start go routines - svr.AddAlwaysHealthzers(keel.NewHealthzerFn(func(ctx context.Context) error { + svr.AddAlwaysHealthzers(healthz.NewHealthzerFn(func(ctx context.Context) error { l.Info("healther fn") return nil })) @@ -69,7 +71,7 @@ func main() { // add services svr.AddService( - keel.NewServiceHTTP(l, "demo", "localhost:8080", svs), + service.NewHTTP(l, "demo", "localhost:8080", svs), ) // start serer diff --git a/examples/logging/main.go b/examples/logging/main.go index 8ef5df5..00027fa 100644 --- a/examples/logging/main.go +++ b/examples/logging/main.go @@ -7,6 +7,7 @@ import ( "github.com/foomo/keel" "github.com/foomo/keel/log" + "github.com/foomo/keel/service" ) type CustomError struct { @@ -46,7 +47,7 @@ func main() { }) svr.AddService( - keel.NewServiceHTTP(l, "demo", "localhost:8080", svs), + service.NewHTTP(l, "demo", "localhost:8080", svs), ) svr.Run() diff --git a/examples/middlewares/basicauth/main.go b/examples/middlewares/basicauth/main.go index 4497761..f231b07 100644 --- a/examples/middlewares/basicauth/main.go +++ b/examples/middlewares/basicauth/main.go @@ -6,6 +6,7 @@ import ( "github.com/foomo/keel" "github.com/foomo/keel/log" "github.com/foomo/keel/net/http/middleware" + "github.com/foomo/keel/service" httputils "github.com/foomo/keel/utils/net/http" ) @@ -29,7 +30,7 @@ func main() { log.Must(l, err, "failed to hash password") svr.AddService( - keel.NewServiceHTTP(l, "demo", "localhost:8080", svs, + service.NewHTTP(l, "demo", "localhost:8080", svs, middleware.BasicAuth( username, passwordHash, diff --git a/examples/middlewares/cors/main.go b/examples/middlewares/cors/main.go index 1ab29b7..f54aad5 100644 --- a/examples/middlewares/cors/main.go +++ b/examples/middlewares/cors/main.go @@ -6,6 +6,7 @@ import ( "github.com/foomo/keel" keelhttp "github.com/foomo/keel/net/http" "github.com/foomo/keel/net/http/middleware" + "github.com/foomo/keel/service" ) func main() { @@ -22,7 +23,7 @@ func main() { }) svr.AddService( - keel.NewServiceHTTP(l, "demo", "localhost:8080", svs, + service.NewHTTP(l, "demo", "localhost:8080", svs, middleware.CORS( middleware.CORSWithAllowOrigins("example.com"), middleware.CORSWithAllowMethods(http.MethodGet, http.MethodPost), diff --git a/examples/middlewares/jwtfromcookie/main.go b/examples/middlewares/jwtfromcookie/main.go index a224541..2443648 100644 --- a/examples/middlewares/jwtfromcookie/main.go +++ b/examples/middlewares/jwtfromcookie/main.go @@ -6,6 +6,7 @@ import ( "net/http" "strings" + "github.com/foomo/keel/service" jwt2 "github.com/golang-jwt/jwt" "go.uber.org/zap" @@ -75,7 +76,7 @@ func main() { }) svr.AddService( - keel.NewServiceHTTP(l, "demo", "localhost:8080", svs, + service.NewHTTP(l, "demo", "localhost:8080", svs, middleware.Skip( middleware.JWT( jwtInst, diff --git a/examples/middlewares/jwtfromtoken/main.go b/examples/middlewares/jwtfromtoken/main.go index 0876339..915e530 100644 --- a/examples/middlewares/jwtfromtoken/main.go +++ b/examples/middlewares/jwtfromtoken/main.go @@ -5,6 +5,7 @@ import ( "crypto/rsa" "net/http" + "github.com/foomo/keel/service" jwt2 "github.com/golang-jwt/jwt" "github.com/foomo/keel" @@ -66,7 +67,7 @@ func main() { }) svr.AddService( - keel.NewServiceHTTP(l, "demo", "localhost:8080", svs, + service.NewHTTP(l, "demo", "localhost:8080", svs, middleware.Skip( middleware.JWT( jwtInst, diff --git a/examples/middlewares/logger/main.go b/examples/middlewares/logger/main.go index 99d3c39..3d702f1 100644 --- a/examples/middlewares/logger/main.go +++ b/examples/middlewares/logger/main.go @@ -6,6 +6,7 @@ import ( "github.com/foomo/keel" keelhttp "github.com/foomo/keel/net/http" "github.com/foomo/keel/net/http/middleware" + "github.com/foomo/keel/service" ) func main() { @@ -22,7 +23,7 @@ func main() { }) svr.AddService( - keel.NewServiceHTTP(l, "demo", "localhost:8080", svs, + service.NewHTTP(l, "demo", "localhost:8080", svs, middleware.Logger(), ), ) diff --git a/examples/middlewares/recover/main.go b/examples/middlewares/recover/main.go index 8e9a5db..1931772 100644 --- a/examples/middlewares/recover/main.go +++ b/examples/middlewares/recover/main.go @@ -5,6 +5,7 @@ import ( "github.com/foomo/keel" "github.com/foomo/keel/net/http/middleware" + "github.com/foomo/keel/service" ) func main() { @@ -23,7 +24,7 @@ func main() { }) svr.AddService( - keel.NewServiceHTTP(l, "demo", "localhost:8080", svs, + service.NewHTTP(l, "demo", "localhost:8080", svs, middleware.Recover( middleware.RecoverWithDisablePrintStack(true), ), diff --git a/examples/middlewares/requestid/main.go b/examples/middlewares/requestid/main.go index ae058e3..c2cf576 100644 --- a/examples/middlewares/requestid/main.go +++ b/examples/middlewares/requestid/main.go @@ -6,6 +6,7 @@ import ( "github.com/foomo/keel" keelhttp "github.com/foomo/keel/net/http" "github.com/foomo/keel/net/http/middleware" + "github.com/foomo/keel/service" ) func main() { @@ -27,7 +28,7 @@ func main() { }) svr.AddService( - keel.NewServiceHTTP(l, "demo", "localhost:8080", svs, + service.NewHTTP(l, "demo", "localhost:8080", svs, middleware.RequestID( middleware.RequestIDWithSetResponseHeader(true), middleware.RequestIDWithGenerator(requestIDGenerator), diff --git a/examples/middlewares/responsetime/main.go b/examples/middlewares/responsetime/main.go index 70c72de..44a60f3 100644 --- a/examples/middlewares/responsetime/main.go +++ b/examples/middlewares/responsetime/main.go @@ -6,6 +6,7 @@ import ( "github.com/foomo/keel" "github.com/foomo/keel/net/http/middleware" + "github.com/foomo/keel/service" ) func main() { @@ -27,7 +28,7 @@ func main() { }) svr.AddService( - keel.NewServiceHTTP(l, "demo", "localhost:8080", svs, + service.NewHTTP(l, "demo", "localhost:8080", svs, middleware.ResponseTime( // automatically set cookie if not exists middleware.ResponseTimeWithMaxDuration(time.Millisecond*500), diff --git a/examples/middlewares/sessionid/main.go b/examples/middlewares/sessionid/main.go index 49cb4a2..984f53e 100644 --- a/examples/middlewares/sessionid/main.go +++ b/examples/middlewares/sessionid/main.go @@ -8,6 +8,7 @@ import ( keelhttp "github.com/foomo/keel/net/http" "github.com/foomo/keel/net/http/cookie" "github.com/foomo/keel/net/http/middleware" + "github.com/foomo/keel/service" ) func main() { @@ -44,7 +45,7 @@ func main() { }) svr.AddService( - keel.NewServiceHTTP(l, "demo", "localhost:8080", svs, + service.NewHTTP(l, "demo", "localhost:8080", svs, middleware.SessionID( // automatically set cookie if not exists middleware.SessionIDWithSetCookie(true), diff --git a/examples/middlewares/skip/main.go b/examples/middlewares/skip/main.go index 9402df8..4d03e13 100644 --- a/examples/middlewares/skip/main.go +++ b/examples/middlewares/skip/main.go @@ -3,6 +3,7 @@ package main import ( "net/http" + "github.com/foomo/keel/service" "go.uber.org/zap" "github.com/foomo/keel" @@ -28,7 +29,7 @@ func main() { svr.AddServices( // with URI blacklist - keel.NewServiceHTTP(l, "demo", "localhost:8080", svs, + service.NewHTTP(l, "demo", "localhost:8080", svs, middleware.Skip( func(l *zap.Logger, name string, next http.Handler) http.Handler { return http.NotFoundHandler() @@ -38,7 +39,7 @@ func main() { ), // with URI whitelist - keel.NewServiceHTTP(l, "demo", ":8081", svs, + service.NewHTTP(l, "demo", "localhost:8081", svs, middleware.Skip( func(l *zap.Logger, name string, next http.Handler) http.Handler { return http.NotFoundHandler() diff --git a/examples/middlewares/telemetry/main.go b/examples/middlewares/telemetry/main.go index 14f90b4..d43e2ec 100644 --- a/examples/middlewares/telemetry/main.go +++ b/examples/middlewares/telemetry/main.go @@ -5,6 +5,7 @@ import ( "github.com/foomo/keel" "github.com/foomo/keel/net/http/middleware" + "github.com/foomo/keel/service" ) func main() { @@ -23,7 +24,7 @@ func main() { }) svr.AddService( - keel.NewServiceHTTP(l, "demo", "localhost:8080", svs, + service.NewHTTP(l, "demo", "localhost:8080", svs, middleware.Telemetry( middleware.TelemetryWithInjectPropagationHeader(true), ), diff --git a/examples/middlewares/tokenauthfromcookie/main.go b/examples/middlewares/tokenauthfromcookie/main.go index 1020c56..eb1bdc0 100644 --- a/examples/middlewares/tokenauthfromcookie/main.go +++ b/examples/middlewares/tokenauthfromcookie/main.go @@ -5,6 +5,7 @@ import ( "github.com/foomo/keel" "github.com/foomo/keel/net/http/middleware" + "github.com/foomo/keel/service" ) func main() { @@ -26,7 +27,7 @@ func main() { tokenProvider := middleware.CookieTokenProvider("keel-token") svr.AddService( - keel.NewServiceHTTP(l, "demo", "localhost:8080", svs, + service.NewHTTP(l, "demo", "localhost:8080", svs, middleware.TokenAuth( token, middleware.TokenAuthWithTokenProvider(tokenProvider), diff --git a/examples/middlewares/tokenauthfromheader/main.go b/examples/middlewares/tokenauthfromheader/main.go index 1e14572..b3e8717 100644 --- a/examples/middlewares/tokenauthfromheader/main.go +++ b/examples/middlewares/tokenauthfromheader/main.go @@ -5,6 +5,7 @@ import ( "github.com/foomo/keel" "github.com/foomo/keel/net/http/middleware" + "github.com/foomo/keel/service" ) func main() { @@ -29,7 +30,7 @@ func main() { ) svr.AddService( - keel.NewServiceHTTP(l, "demo", "localhost:8080", svs, + service.NewHTTP(l, "demo", "localhost:8080", svs, middleware.TokenAuth( token, middleware.TokenAuthWithTokenProvider(tokenProvider), diff --git a/examples/remoteconfig/main.go b/examples/remoteconfig/main.go index 6cdddc9..3e5b43b 100644 --- a/examples/remoteconfig/main.go +++ b/examples/remoteconfig/main.go @@ -6,6 +6,7 @@ import ( "github.com/foomo/keel" "github.com/foomo/keel/config" + "github.com/foomo/keel/service" ) func main() { @@ -42,7 +43,7 @@ func main() { // curl localhost:8080 svr.AddService( - keel.NewServiceHTTP(l, "demo", "localhost:8080", http.HandlerFunc( + service.NewHTTP(l, "demo", "localhost:8080", http.HandlerFunc( func(w http.ResponseWriter, r *http.Request) { fmt.Println("current foo:", fooFn()) //nolint:forbidigo }), diff --git a/examples/roundtripwares/logger/server.go b/examples/roundtripwares/logger/server.go index 676f4b2..5262ee0 100644 --- a/examples/roundtripwares/logger/server.go +++ b/examples/roundtripwares/logger/server.go @@ -4,6 +4,7 @@ import ( "net/http" "github.com/foomo/keel" + "github.com/foomo/keel/service" ) func server() { @@ -26,7 +27,7 @@ func server() { }) svr.AddService( - keel.NewServiceHTTP(l, "demo", "localhost:8080", svs), + service.NewHTTP(l, "demo", "localhost:8080", svs), ) svr.Run() diff --git a/examples/roundtripwares/requestid/main.go b/examples/roundtripwares/requestid/main.go index a928892..7fea6d8 100644 --- a/examples/roundtripwares/requestid/main.go +++ b/examples/roundtripwares/requestid/main.go @@ -8,6 +8,7 @@ import ( keelhttp "github.com/foomo/keel/net/http" "github.com/foomo/keel/net/http/middleware" "github.com/foomo/keel/net/http/roundtripware" + "github.com/foomo/keel/service" httputils "github.com/foomo/keel/utils/net/http" ) @@ -52,7 +53,7 @@ func main() { }) svr.AddService( - keel.NewServiceHTTP(l, "demo", "localhost:8080", svs, + service.NewHTTP(l, "demo", "localhost:8080", svs, // add middleware middleware.RequestID(), // add middleware diff --git a/examples/roundtripwares/retry/server.go b/examples/roundtripwares/retry/server.go index 70a270d..8133f94 100644 --- a/examples/roundtripwares/retry/server.go +++ b/examples/roundtripwares/retry/server.go @@ -4,6 +4,7 @@ import ( "net/http" "github.com/foomo/keel" + "github.com/foomo/keel/service" ) func server() { @@ -27,7 +28,7 @@ func server() { }) svr.AddService( - keel.NewServiceHTTP(l, "demo", "localhost:8080", svs), + service.NewHTTP(l, "demo", "localhost:8080", svs), ) svr.Run() diff --git a/examples/serviceenabler/main.go b/examples/serviceenabler/main.go index 289941e..592685d 100644 --- a/examples/serviceenabler/main.go +++ b/examples/serviceenabler/main.go @@ -5,6 +5,7 @@ import ( "github.com/foomo/keel" "github.com/foomo/keel/config" + "github.com/foomo/keel/service" ) func main() { @@ -23,7 +24,7 @@ func main() { }) svr.AddServices( - keel.NewServiceHTTP(l, "demo", "localhost:8080", + service.NewHTTP(l, "demo", "localhost:8080", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { c.Set("service.enabled", !enabled()) w.WriteHeader(http.StatusOK) @@ -32,7 +33,7 @@ func main() { ), keel.NewServiceEnabler(l, "service-enabler", func() keel.Service { - return keel.NewServiceHTTP(l, "service", "localhost:8081", svs) + return service.NewHTTP(l, "service", "localhost:8081", svs) }, enabled, ), diff --git a/examples/services/main.go b/examples/services/main.go index 0e1e00e..6448678 100644 --- a/examples/services/main.go +++ b/examples/services/main.go @@ -1,7 +1,6 @@ package main import ( - "net/http" "os" "github.com/foomo/keel" @@ -29,24 +28,11 @@ func main() { keel.WithHTTPPProfService(false), ) - l := svr.Logger() - // alternatively you can add them manually // svr.AddServices(keel.NewDefaultServiceHTTPZap()) // svr.AddServices(keel.NewDefaultServiceHTTPViper()) // svr.AddServices(keel.NewDefaultServiceHTTPPProf()) // svr.AddServices(keel.NewDefaultServiceHTTPPrometheus()) - // create demo service - svs := http.NewServeMux() - svs.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { - w.WriteHeader(http.StatusOK) - _, _ = w.Write([]byte("OK")) - }) - - svr.AddService( - keel.NewServiceHTTP(l, "demo", ":8080", svs), - ) - svr.Run() } diff --git a/examples/stream/jetstream/main.go b/examples/stream/jetstream/main.go index 40e6e1f..b7f88a8 100644 --- a/examples/stream/jetstream/main.go +++ b/examples/stream/jetstream/main.go @@ -5,6 +5,7 @@ import ( "net/http" "time" + "github.com/foomo/keel/service" "github.com/nats-io/nats.go" "github.com/pkg/errors" "go.uber.org/zap" @@ -89,7 +90,7 @@ func main() { svr.AddClosers(subscription, stream) svr.AddService( - keel.NewServiceHTTP(l, "demo", "localhost:8080", svs), + service.NewHTTP(l, "demo", "localhost:8080", svs), ) svr.Run() diff --git a/examples/stream/jetstreamraw/main.go b/examples/stream/jetstreamraw/main.go index 710a89c..b46a635 100644 --- a/examples/stream/jetstreamraw/main.go +++ b/examples/stream/jetstreamraw/main.go @@ -4,6 +4,7 @@ import ( "net/http" "time" + "github.com/foomo/keel/service" "github.com/nats-io/nats.go" "github.com/foomo/keel" @@ -73,7 +74,7 @@ func main() { svr.AddClosers(subscription, stream.Conn()) svr.AddService( - keel.NewServiceHTTP(l, "demo", "localhost:8080", svs), + service.NewHTTP(l, "demo", "localhost:8080", svs), ) svr.Run() diff --git a/examples/telemetry/main.go b/examples/telemetry/main.go index fa4f37d..2b04bbf 100644 --- a/examples/telemetry/main.go +++ b/examples/telemetry/main.go @@ -4,6 +4,9 @@ import ( "math/rand" "net/http" + "github.com/foomo/keel/service" + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/metric/instrument" @@ -58,6 +61,14 @@ func main() { }) } + promauto.NewCounter(prometheus.CounterOpts{ + Namespace: "foo", + Subsystem: "", + Name: "bar", + Help: "blubb", + ConstLabels: nil, + }) + { // up down upDown, err := meter.SyncInt64().UpDownCounter( "a.updown", @@ -92,7 +103,7 @@ func main() { } svr.AddService( - keel.NewServiceHTTP(l, "demo", "localhost:8080", svs, + service.NewHTTP(l, "demo", "localhost:8080", svs, middleware.Telemetry(), middleware.Recover(), ), diff --git a/go.mod b/go.mod index aa296e2..5f156ac 100644 --- a/go.mod +++ b/go.mod @@ -5,6 +5,7 @@ go 1.20 require ( github.com/avast/retry-go v3.0.0+incompatible github.com/davecgh/go-spew v1.1.1 + github.com/fbiville/markdown-table-formatter v0.3.0 github.com/foomo/gotsrpc/v2 v2.7.2 github.com/go-logr/logr v1.2.4 github.com/golang-jwt/jwt v3.2.2+incompatible diff --git a/go.sum b/go.sum index 18f8eef..4a0c14f 100644 --- a/go.sum +++ b/go.sum @@ -117,6 +117,8 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/fbiville/markdown-table-formatter v0.3.0 h1:PIm1UNgJrFs8q1htGTw+wnnNYvwXQMMMIKNZop2SSho= +github.com/fbiville/markdown-table-formatter v0.3.0/go.mod h1:q89TDtSEVDdTaufgSbfHpNVdPU/bmfvqNkrC5HagmLY= github.com/felixge/httpsnoop v1.0.2 h1:+nS9g82KMXccJ/wp0zyRW9ZBHFETmMGtkk+2CTTrW4o= github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/foomo/gotsrpc/v2 v2.7.2 h1:a94V/a8LSssq+aRN3Fv1lJPjWoyMilOvRq+yEaDTHVM= diff --git a/healthz/docs.go b/healthz/docs.go new file mode 100644 index 0000000..59c42b6 --- /dev/null +++ b/healthz/docs.go @@ -0,0 +1 @@ +package healthz diff --git a/healthzer.go b/healthz/healthzer.go similarity index 87% rename from healthzer.go rename to healthz/healthzer.go index 3156353..5ed08cf 100644 --- a/healthzer.go +++ b/healthz/healthzer.go @@ -1,4 +1,4 @@ -package keel +package healthz import "context" @@ -16,6 +16,10 @@ func (h healther) Healthz(ctx context.Context) error { return h.handle(ctx) } +func (h healther) Close(ctx context.Context) error { + return h.handle(ctx) +} + // BoolHealthzer interface type BoolHealthzer interface { Healthz() bool diff --git a/healthztype.go b/healthz/type.go similarity index 70% rename from healthztype.go rename to healthz/type.go index 848edc0..e5c45ba 100644 --- a/healthztype.go +++ b/healthz/type.go @@ -1,31 +1,31 @@ -package keel +package healthz -// HealthzType type +// Type type // https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/ -type HealthzType string +type Type string const ( - // HealthzTypeAlways will run on any checks - HealthzTypeAlways HealthzType = "always" - // HealthzTypeStartup will run on /healthz/startup checks + // TypeAlways will run on any checks + TypeAlways Type = "always" + // TypeStartup will run on /healthz/startup checks // > The kubelet uses startup probes to know when a container application has started. If such a probe is configured, // > it disables liveness and readiness checks until it succeeds, making sure those probes don't interfere with the // > application startup. This can be used to adopt liveness checks on slow starting containers, avoiding them getting // > killed by the kubelet before they are up and running. - HealthzTypeStartup HealthzType = "startup" - // HealthzTypeReadiness will run on /healthz/readiness checks + TypeStartup Type = "startup" + // TypeReadiness will run on /healthz/readiness checks // > The kubelet uses readiness probes to know when a container is ready to start accepting traffic. // > A Pod is considered ready when all of its containers are ready. One use of this signal is to control // > which Pods are used as backends for Services. When a Pod is not ready, it is removed from Service load balancers. - HealthzTypeReadiness HealthzType = "readiness" - // HealthzTypeLiveness will run on /healthz/liveness checks + TypeReadiness Type = "readiness" + // TypeLiveness will run on /healthz/liveness checks // > The kubelet uses liveness probes to know when to restart a container. For example, liveness probes could catch // > a deadlock, where an application is running, but unable to make progress. Restarting a container in such a state // > can help to make the application more available despite bugs. - HealthzTypeLiveness HealthzType = "liveness" + TypeLiveness Type = "liveness" ) // String interface -func (t HealthzType) String() string { +func (t Type) String() string { return string(t) } diff --git a/closer.go b/interfaces/closer.go similarity index 82% rename from closer.go rename to interfaces/closer.go index 9de714d..fe62a5b 100644 --- a/closer.go +++ b/interfaces/closer.go @@ -1,6 +1,8 @@ -package keel +package interfaces -import "context" +import ( + "context" +) type closer struct { handle func(context.Context) error @@ -12,10 +14,6 @@ func NewCloserFn(handle func(context.Context) error) closer { } } -func (h healther) Close(ctx context.Context) error { - return h.handle(ctx) -} - // Closer interface type Closer interface { Close() diff --git a/interfaces/doc.go b/interfaces/doc.go new file mode 100644 index 0000000..08badf2 --- /dev/null +++ b/interfaces/doc.go @@ -0,0 +1 @@ +package interfaces diff --git a/pinger.go b/interfaces/pinger.go similarity index 91% rename from pinger.go rename to interfaces/pinger.go index 5d97f09..7cd2b7c 100644 --- a/pinger.go +++ b/interfaces/pinger.go @@ -1,4 +1,4 @@ -package keel +package interfaces import "context" diff --git a/shutdowner.go b/interfaces/shutdowner.go similarity index 95% rename from shutdowner.go rename to interfaces/shutdowner.go index 08538d7..b587b86 100644 --- a/shutdowner.go +++ b/interfaces/shutdowner.go @@ -1,4 +1,4 @@ -package keel +package interfaces import "context" diff --git a/stopper.go b/interfaces/stopper.go similarity index 94% rename from stopper.go rename to interfaces/stopper.go index 93b49f3..6ada3d7 100644 --- a/stopper.go +++ b/interfaces/stopper.go @@ -1,4 +1,4 @@ -package keel +package interfaces import "context" diff --git a/unsubscriber.go b/interfaces/unsubscriber.go similarity index 95% rename from unsubscriber.go rename to interfaces/unsubscriber.go index 2d235f8..6395664 100644 --- a/unsubscriber.go +++ b/interfaces/unsubscriber.go @@ -1,4 +1,4 @@ -package keel +package interfaces import "context" diff --git a/log/fields_keel.go b/log/fields_keel.go new file mode 100644 index 0000000..81352ee --- /dev/null +++ b/log/fields_keel.go @@ -0,0 +1,11 @@ +package log + +import ( + "go.opentelemetry.io/otel/attribute" +) + +const ( + KeelServiceTypeKey = attribute.Key("keel.service.type") + KeelServiceNameKey = attribute.Key("keel.service.name") + KeelServiceInstKey = attribute.Key("keel.service.inst") +) diff --git a/log/fields_service.go b/log/fields_service.go index 3c20e7b..0496e91 100644 --- a/log/fields_service.go +++ b/log/fields_service.go @@ -15,6 +15,8 @@ func FPeerService(name string) zap.Field { } const ( + ServiceTypeKey = "service_type" + // ServiceNameKey represents the NameKey of the service. ServiceNameKey = "service_name" @@ -35,6 +37,10 @@ const ( ServiceVersionKey = "service_version" ) +func FServiceType(name string) zap.Field { + return zap.String(ServiceTypeKey, name) +} + func FServiceName(name string) zap.Field { return zap.String(ServiceNameKey, name) } diff --git a/log/with.go b/log/with.go index ed236ef..cf23441 100644 --- a/log/with.go +++ b/log/with.go @@ -7,6 +7,7 @@ import ( "net/http" "strings" + "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/trace" "go.uber.org/zap" @@ -20,6 +21,17 @@ func With(l *zap.Logger, fields ...zap.Field) *zap.Logger { return l.With(fields...) } +func WithAttributes(l *zap.Logger, attrs ...attribute.KeyValue) *zap.Logger { + if l == nil { + l = Logger() + } + fields := make([]zap.Field, len(attrs)) + for i, attr := range attrs { + fields[i] = zap.Any(strings.ReplaceAll(string(attr.Key), ".", "_"), attr.Value.AsInterface()) + } + return l.With(fields...) +} + func WithError(l *zap.Logger, err error) *zap.Logger { return With(l, FErrorType(err), FError(err)) } diff --git a/option.go b/option.go index e6b82a1..0d634e3 100644 --- a/option.go +++ b/option.go @@ -5,6 +5,7 @@ import ( "os" "time" + "github.com/foomo/keel/service" "github.com/spf13/viper" "go.uber.org/zap" @@ -72,9 +73,9 @@ func WithShutdownTimeout(shutdownTimeout time.Duration) Option { func WithHTTPZapService(enabled bool) Option { return func(inst *Server) { if config.GetBool(inst.Config(), "service.zap.enabled", enabled)() { - service := NewDefaultServiceHTTPZap() - inst.initServices = append(inst.initServices, service) - inst.AddAlwaysHealthzers(service) + svs := service.NewDefaultHTTPZap() + inst.initServices = append(inst.initServices, svs) + inst.AddAlwaysHealthzers(svs) } } } @@ -83,9 +84,9 @@ func WithHTTPZapService(enabled bool) Option { func WithHTTPViperService(enabled bool) Option { return func(inst *Server) { if config.GetBool(inst.Config(), "service.viper.enabled", enabled)() { - service := NewDefaultServiceHTTPViper() - inst.initServices = append(inst.initServices, service) - inst.AddAlwaysHealthzers(service) + svs := service.NewDefaultHTTPViper() + inst.initServices = append(inst.initServices, svs) + inst.AddAlwaysHealthzers(svs) } } } @@ -149,9 +150,9 @@ func WithPrometheusMeter(enabled bool) Option { func WithHTTPPrometheusService(enabled bool) Option { return func(inst *Server) { if config.GetBool(inst.Config(), "service.prometheus.enabled", enabled)() { - service := NewDefaultServiceHTTPPrometheus() - inst.initServices = append(inst.initServices, service) - inst.AddAlwaysHealthzers(service) + svs := service.NewDefaultHTTPPrometheus() + inst.initServices = append(inst.initServices, svs) + inst.AddAlwaysHealthzers(svs) } } } @@ -160,9 +161,9 @@ func WithHTTPPrometheusService(enabled bool) Option { func WithHTTPPProfService(enabled bool) Option { return func(inst *Server) { if config.GetBool(inst.Config(), "service.pprof.enabled", enabled)() { - service := NewDefaultServiceHTTPPProf() - inst.initServices = append(inst.initServices, service) - inst.AddAlwaysHealthzers(service) + svs := service.NewDefaultHTTPPProf() + inst.initServices = append(inst.initServices, svs) + inst.AddAlwaysHealthzers(svs) } } } @@ -171,9 +172,9 @@ func WithHTTPPProfService(enabled bool) Option { func WithHTTPHealthzService(enabled bool) Option { return func(inst *Server) { if config.GetBool(inst.Config(), "service.healthz.enabled", enabled)() { - service := NewDefaultServiceHTTPProbes(inst.probes) - inst.initServices = append(inst.initServices, service) - inst.AddAlwaysHealthzers(service) + svs := service.NewDefaultHTTPProbes(inst.probes) + inst.initServices = append(inst.initServices, svs) + inst.AddAlwaysHealthzers(svs) } } } diff --git a/server.go b/server.go index b38c095..b0cd2fb 100644 --- a/server.go +++ b/server.go @@ -1,3 +1,6 @@ +//go:build !docs +// +build !docs + package keel import ( @@ -10,6 +13,8 @@ import ( "syscall" "time" + "github.com/foomo/keel/healthz" + "github.com/foomo/keel/interfaces" "github.com/go-logr/logr" "github.com/pkg/errors" "github.com/spf13/viper" @@ -40,7 +45,7 @@ type Server struct { shutdownTimeout time.Duration running atomic.Bool closers []interface{} - probes map[HealthzType][]interface{} + probes map[healthz.Type][]interface{} ctx context.Context ctxCancel context.Context ctxCancelFn context.CancelFunc @@ -54,7 +59,7 @@ func NewServer(opts ...Option) *Server { inst := &Server{ shutdownTimeout: 30 * time.Second, shutdownSignals: []os.Signal{os.Interrupt, syscall.SIGTERM}, - probes: map[HealthzType][]interface{}{}, + probes: map[healthz.Type][]interface{}{}, ctx: context.Background(), c: config.Config(), l: log.Logger(), @@ -83,51 +88,51 @@ func NewServer(opts ...Option) *Server { for _, closer := range closers { l := inst.l.With(log.FName(fmt.Sprintf("%T", closer))) switch c := closer.(type) { - case Closer: + case interfaces.Closer: c.Close() - case ErrorCloser: + case interfaces.ErrorCloser: if err := c.Close(); err != nil { log.WithError(l, err).Error("failed to gracefully stop ErrorCloser") } - case CloserWithContext: + case interfaces.CloserWithContext: c.Close(timeoutCtx) - case ErrorCloserWithContext: + case interfaces.ErrorCloserWithContext: if err := c.Close(timeoutCtx); err != nil { log.WithError(l, err).Error("failed to gracefully stop ErrorCloserWithContext") } - case Shutdowner: + case interfaces.Shutdowner: c.Shutdown() - case ErrorShutdowner: + case interfaces.ErrorShutdowner: if err := c.Shutdown(); err != nil { log.WithError(l, err).Error("failed to gracefully stop ErrorShutdowner") } - case ShutdownerWithContext: + case interfaces.ShutdownerWithContext: c.Shutdown(timeoutCtx) - case ErrorShutdownerWithContext: + case interfaces.ErrorShutdownerWithContext: if err := c.Shutdown(timeoutCtx); err != nil { log.WithError(l, err).Error("failed to gracefully stop ErrorShutdownerWithContext") } - case Stopper: + case interfaces.Stopper: c.Stop() - case ErrorStopper: + case interfaces.ErrorStopper: if err := c.Stop(); err != nil { log.WithError(l, err).Error("failed to gracefully stop ErrorStopper") } - case StopperWithContext: + case interfaces.StopperWithContext: c.Stop(timeoutCtx) - case ErrorStopperWithContext: + case interfaces.ErrorStopperWithContext: if err := c.Stop(timeoutCtx); err != nil { log.WithError(l, err).Error("failed to gracefully stop ErrorStopperWithContext") } - case Unsubscriber: + case interfaces.Unsubscriber: c.Unsubscribe() - case ErrorUnsubscriber: + case interfaces.ErrorUnsubscriber: if err := c.Unsubscribe(); err != nil { log.WithError(l, err).Error("failed to gracefully stop ErrorUnsubscriber") } - case UnsubscriberWithContext: + case interfaces.UnsubscriberWithContext: c.Unsubscribe(timeoutCtx) - case ErrorUnsubscriberWithContext: + case interfaces.ErrorUnsubscriberWithContext: if err := c.Unsubscribe(timeoutCtx); err != nil { log.WithError(l, err).Error("failed to gracefully stop ErrorUnsubscriberWithContext") } @@ -229,22 +234,22 @@ func (s *Server) AddCloser(closer interface{}) { } } switch closer.(type) { - case Closer, - ErrorCloser, - CloserWithContext, - ErrorCloserWithContext, - Shutdowner, - ErrorShutdowner, - ShutdownerWithContext, - ErrorShutdownerWithContext, - Stopper, - ErrorStopper, - StopperWithContext, - ErrorStopperWithContext, - Unsubscriber, - ErrorUnsubscriber, - UnsubscriberWithContext, - ErrorUnsubscriberWithContext: + case interfaces.Closer, + interfaces.ErrorCloser, + interfaces.CloserWithContext, + interfaces.ErrorCloserWithContext, + interfaces.Shutdowner, + interfaces.ErrorShutdowner, + interfaces.ShutdownerWithContext, + interfaces.ErrorShutdownerWithContext, + interfaces.Stopper, + interfaces.ErrorStopper, + interfaces.StopperWithContext, + interfaces.ErrorStopperWithContext, + interfaces.Unsubscriber, + interfaces.ErrorUnsubscriber, + interfaces.UnsubscriberWithContext, + interfaces.ErrorUnsubscriberWithContext: s.closers = append(s.closers, closer) default: s.l.Warn("unable to add closer", log.FValue(fmt.Sprintf("%T", closer))) @@ -259,14 +264,14 @@ func (s *Server) AddClosers(closers ...interface{}) { } // AddHealthzer adds a probe to be called on healthz checks -func (s *Server) AddHealthzer(typ HealthzType, probe interface{}) { +func (s *Server) AddHealthzer(typ healthz.Type, probe interface{}) { switch probe.(type) { - case BoolHealthzer, - BoolHealthzerWithContext, - ErrorHealthzer, - ErrorHealthzWithContext, - ErrorPinger, - ErrorPingerWithContext: + case healthz.BoolHealthzer, + healthz.BoolHealthzerWithContext, + healthz.ErrorHealthzer, + healthz.ErrorHealthzWithContext, + interfaces.ErrorPinger, + interfaces.ErrorPingerWithContext: s.probes[typ] = append(s.probes[typ], probe) default: s.l.Debug("not a healthz probe", log.FValue(fmt.Sprintf("%T", probe))) @@ -274,7 +279,7 @@ func (s *Server) AddHealthzer(typ HealthzType, probe interface{}) { } // AddHealthzers adds the given probes to be called on healthz checks -func (s *Server) AddHealthzers(typ HealthzType, probes ...interface{}) { +func (s *Server) AddHealthzers(typ healthz.Type, probes ...interface{}) { for _, probe := range probes { s.AddHealthzer(typ, probe) } @@ -282,22 +287,22 @@ func (s *Server) AddHealthzers(typ HealthzType, probes ...interface{}) { // AddAlwaysHealthzers adds the probes to be called on any healthz checks func (s *Server) AddAlwaysHealthzers(probes ...interface{}) { - s.AddHealthzers(HealthzTypeAlways, probes...) + s.AddHealthzers(healthz.TypeAlways, probes...) } // AddStartupHealthzers adds the startup probes to be called on healthz checks func (s *Server) AddStartupHealthzers(probes ...interface{}) { - s.AddHealthzers(HealthzTypeStartup, probes...) + s.AddHealthzers(healthz.TypeStartup, probes...) } // AddLivenessHealthzers adds the liveness probes to be called on healthz checks func (s *Server) AddLivenessHealthzers(probes ...interface{}) { - s.AddHealthzers(HealthzTypeLiveness, probes...) + s.AddHealthzers(healthz.TypeLiveness, probes...) } // AddReadinessHealthzers adds the readiness probes to be called on healthz checks func (s *Server) AddReadinessHealthzers(probes ...interface{}) { - s.AddHealthzers(HealthzTypeReadiness, probes...) + s.AddHealthzers(healthz.TypeReadiness, probes...) } // IsCanceled returns true if the internal errgroup has been canceled diff --git a/server_docs.go b/server_docs.go new file mode 100644 index 0000000..0fba72c --- /dev/null +++ b/server_docs.go @@ -0,0 +1,435 @@ +//go:build docs +// +build docs + +package keel + +import ( + "context" + "fmt" + "os" + "reflect" + "sort" + "time" + + markdowntable "github.com/fbiville/markdown-table-formatter/pkg/markdown" + "github.com/foomo/keel/config" + "github.com/foomo/keel/healthz" + "github.com/foomo/keel/interfaces" + "github.com/foomo/keel/log" + "github.com/foomo/keel/service" + "github.com/foomo/keel/telemetry/nonrecording" + "github.com/pkg/errors" + "github.com/prometheus/client_golang/prometheus" + "github.com/spf13/viper" + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/metric" + otelglobal "go.opentelemetry.io/otel/metric/global" + "go.opentelemetry.io/otel/trace" + "go.uber.org/zap" +) + +// Server struct +type Server struct { + services []Service + initServices []Service + meter metric.Meter + meterProvider metric.MeterProvider + tracer trace.Tracer + traceProvider trace.TracerProvider + shutdownSignals []os.Signal + shutdownTimeout time.Duration + closers []interface{} + probes map[healthz.Type][]interface{} + ctx context.Context + gCtx context.Context + l *zap.Logger + c *viper.Viper +} + +func NewServer(opts ...Option) *Server { + inst := &Server{ + probes: map[healthz.Type][]interface{}{}, + meterProvider: nonrecording.NewNoopMeterProvider(), + traceProvider: trace.NewNoopTracerProvider(), + ctx: context.Background(), + c: config.Config(), + l: log.Logger(), + } + + inst.meter = inst.meterProvider.Meter("") + otelglobal.SetMeterProvider(inst.meterProvider) + inst.tracer = inst.traceProvider.Tracer("") + otel.SetTracerProvider(inst.traceProvider) + + // add probe + inst.AddAlwaysHealthzers(inst) + + return inst +} + +// Logger returns server logger +func (s *Server) Logger() *zap.Logger { + return s.l +} + +// Meter returns the implementation meter +func (s *Server) Meter() metric.Meter { + return s.meter +} + +// Tracer returns the implementation tracer +func (s *Server) Tracer() trace.Tracer { + return s.tracer +} + +// Config returns server config +func (s *Server) Config() *viper.Viper { + return s.c +} + +// Context returns server context +func (s *Server) Context() context.Context { + return s.ctx +} + +// CancelContext returns server's cancel context +func (s *Server) CancelContext() context.Context { + return s.ctx +} + +// AddService add a single service +func (s *Server) AddService(service Service) { + for _, value := range s.services { + if value == service { + return + } + } + s.services = append(s.services, service) + s.AddAlwaysHealthzers(service) + s.AddCloser(service) +} + +// AddServices adds multiple service +func (s *Server) AddServices(services ...Service) { + for _, service := range services { + s.AddService(service) + } +} + +// AddCloser adds a closer to be called on shutdown +func (s *Server) AddCloser(closer interface{}) { + for _, value := range s.closers { + if value == closer { + return + } + } + switch closer.(type) { + case interfaces.Closer, + interfaces.ErrorCloser, + interfaces.CloserWithContext, + interfaces.ErrorCloserWithContext, + interfaces.Shutdowner, + interfaces.ErrorShutdowner, + interfaces.ShutdownerWithContext, + interfaces.ErrorShutdownerWithContext, + interfaces.Stopper, + interfaces.ErrorStopper, + interfaces.StopperWithContext, + interfaces.ErrorStopperWithContext, + interfaces.Unsubscriber, + interfaces.ErrorUnsubscriber, + interfaces.UnsubscriberWithContext, + interfaces.ErrorUnsubscriberWithContext: + s.closers = append(s.closers, closer) + default: + s.l.Warn("unable to add closer", log.FValue(fmt.Sprintf("%T", closer))) + } +} + +// AddClosers adds the given closers to be called on shutdown +func (s *Server) AddClosers(closers ...interface{}) { + for _, closer := range closers { + s.AddCloser(closer) + } +} + +// AddHealthzer adds a probe to be called on healthz checks +func (s *Server) AddHealthzer(typ healthz.Type, probe interface{}) { + switch probe.(type) { + case healthz.BoolHealthzer, + healthz.BoolHealthzerWithContext, + healthz.ErrorHealthzer, + healthz.ErrorHealthzWithContext, + interfaces.ErrorPinger, + interfaces.ErrorPingerWithContext: + s.probes[typ] = append(s.probes[typ], probe) + default: + s.l.Debug("not a healthz probe", log.FValue(fmt.Sprintf("%T", probe))) + } +} + +// AddHealthzers adds the given probes to be called on healthz checks +func (s *Server) AddHealthzers(typ healthz.Type, probes ...interface{}) { + for _, probe := range probes { + s.AddHealthzer(typ, probe) + } +} + +// AddAlwaysHealthzers adds the probes to be called on any healthz checks +func (s *Server) AddAlwaysHealthzers(probes ...interface{}) { + s.AddHealthzers(healthz.TypeAlways, probes...) +} + +// AddStartupHealthzers adds the startup probes to be called on healthz checks +func (s *Server) AddStartupHealthzers(probes ...interface{}) { + s.AddHealthzers(healthz.TypeStartup, probes...) +} + +// AddLivenessHealthzers adds the liveness probes to be called on healthz checks +func (s *Server) AddLivenessHealthzers(probes ...interface{}) { + s.AddHealthzers(healthz.TypeLiveness, probes...) +} + +// AddReadinessHealthzers adds the readiness probes to be called on healthz checks +func (s *Server) AddReadinessHealthzers(probes ...interface{}) { + s.AddHealthzers(healthz.TypeReadiness, probes...) +} + +// IsCanceled returns true if the internal errgroup has been canceled +func (s *Server) IsCanceled() bool { + return errors.Is(s.gCtx.Err(), context.Canceled) +} + +// Healthz returns true if the server is running +func (s *Server) Healthz() error { + return nil +} + +// Run runs the server +func (s *Server) Run() { + // add init services to closers + for _, initService := range s.initServices { + s.AddClosers(initService) + } + + md := &MD{} + + { + var rows [][]string + for _, key := range s.Config().AllKeys() { + rows = append(rows, []string{ + code(key), + code(s.Config().GetString(key)), + }) + } + if len(rows) > 0 { + md.Println("## Config") + md.Println("") + md.Println("List of all registered config variabled with their defaults.") + md.Println("") + md.Table([]string{"Key", "Default"}, rows) + md.Println("") + } + } + + { + var rows [][]string + for _, value := range s.initServices { + if v, ok := value.(*service.HTTP); ok { + t := reflect.TypeOf(v) + rows = append(rows, []string{ + code(v.Name()), + code(t.String()), + stringer(v), + }) + } + } + if len(rows) > 0 { + md.Println("## Init Services") + md.Println("") + md.Println("List of all registerd init services that are being immediately started.") + md.Println("") + md.Table([]string{"Name", "Type", "Address"}, rows) + md.Println("") + } + } + + { + var rows [][]string + for _, value := range s.services { + if v, ok := value.(*service.HTTP); ok { + t := reflect.TypeOf(v) + rows = append(rows, []string{ + code(v.Name()), + code(t.String()), + stringer(v), + }) + } + } + if len(rows) > 0 { + md.Println("## Services") + md.Println("") + md.Println("List of all registered services that are being started.") + md.Println("") + md.Table([]string{"Name", "Type", "Description"}, rows) + md.Println("") + } + } + + { + var rows [][]string + for k, probes := range s.probes { + for _, probe := range probes { + t := reflect.TypeOf(probe) + rows = append(rows, []string{ + code(k.String()), + code(t.String()), + }) + } + } + if len(rows) > 0 { + md.Println("## Health probes") + md.Println("") + md.Println("List of all registered healthz probes that are being called during startup and runntime.") + md.Println("") + md.Table([]string{"Name", "Type"}, rows) + md.Println("") + } + } + + { + var rows [][]string + for _, value := range s.closers { + t := reflect.TypeOf(value) + var closer string + switch value.(type) { + case interfaces.Closer: + closer = "Closer" + case interfaces.ErrorCloser: + closer = "ErrorCloser" + case interfaces.CloserWithContext: + closer = "CloserWithContext" + case interfaces.ErrorCloserWithContext: + closer = "ErrorCloserWithContext" + case interfaces.Shutdowner: + closer = "Shutdowner" + case interfaces.ErrorShutdowner: + closer = "ErrorShutdowner" + case interfaces.ShutdownerWithContext: + closer = "ShutdownerWithContext" + case interfaces.ErrorShutdownerWithContext: + closer = "ErrorShutdownerWithContext" + case interfaces.Stopper: + closer = "Stopper" + case interfaces.ErrorStopper: + closer = "ErrorStopper" + case interfaces.StopperWithContext: + closer = "StopperWithContext" + case interfaces.ErrorStopperWithContext: + closer = "ErrorStopperWithContext" + case interfaces.Unsubscriber: + closer = "Unsubscriber" + case interfaces.ErrorUnsubscriber: + closer = "ErrorUnsubscriber" + case interfaces.UnsubscriberWithContext: + closer = "UnsubscriberWithContext" + case interfaces.ErrorUnsubscriberWithContext: + closer = "ErrorUnsubscriberWithContext" + } + rows = append(rows, []string{ + code(t.String()), + code(closer), + }) + } + if len(rows) > 0 { + md.Println("## Closers") + md.Println("") + md.Println("List of all registered closers that are being called during graceful shutdown.") + md.Println("") + md.Table([]string{"Name", "Type"}, rows) + md.Println("") + } + } + + { + var rows [][]string + s.meter.AsyncFloat64() + + var names []string + values := map[string]nonrecording.Metric{} + for _, value := range nonrecording.Metrics() { + names = append(names, value.Name) + values[value.Name] = value + } + + gatherer, _ := prometheus.DefaultRegisterer.(*prometheus.Registry).Gather() + for _, value := range gatherer { + names = append(names, value.GetName()) + values[value.GetName()] = nonrecording.Metric{ + Name: value.GetName(), + Type: value.GetType().String(), + Help: value.GetHelp(), + } + } + sort.Strings(names) + for _, name := range names { + value := values[name] + rows = append(rows, []string{ + code(value.Name), + value.Type, + value.Help, + }) + } + if len(rows) > 0 { + md.Println("## Metrics") + md.Println("") + md.Println("List of all registered metrics than are being exposed.") + md.Println("") + md.Table([]string{"Name", "Type", "Description"}, rows) + md.Println("") + } + } + + fmt.Print(md.String()) +} + +type MD struct { + value string +} + +func (s *MD) Println(a ...any) { + s.value += fmt.Sprintln(a...) +} + +func (s *MD) Print(a ...any) { + s.value += fmt.Sprint(a...) +} + +func (s *MD) String() string { + return s.value +} + +func (s *MD) Table(headers []string, rows [][]string) { + table, err := markdowntable.NewTableFormatterBuilder(). + WithPrettyPrint(). + Build(headers...). + Format(rows) + if err != nil { + panic(err) + } + s.Print(table) +} + +func code(v string) string { + if v == "" { + return "" + } + return "`" + v + "`" +} + +func stringer(v any) string { + if i, ok := v.(fmt.Stringer); ok { + return i.String() + } + return "" +} diff --git a/server_test.go b/server_test.go index c998dbe..55d48b4 100644 --- a/server_test.go +++ b/server_test.go @@ -10,6 +10,7 @@ import ( "testing" "time" + "github.com/foomo/keel/service" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/suite" "go.uber.org/zap" @@ -74,7 +75,7 @@ func (s *KeelTestSuite) TearDownSuite() {} func (s *KeelTestSuite) TestServiceHTTP() { s.svr.AddServices( - keel.NewServiceHTTP(s.l, "test", ":55000", s.mux), + service.NewHTTP(s.l, "test", ":55000", s.mux), ) s.runServer() @@ -86,8 +87,8 @@ func (s *KeelTestSuite) TestServiceHTTP() { func (s *KeelTestSuite) TestServiceHTTPZap() { s.svr.AddServices( - keel.NewServiceHTTPZap(s.l, "zap", ":9100", "/log"), - keel.NewServiceHTTP(s.l, "test", ":55000", s.mux), + service.NewHTTPZap(s.l, "zap", ":9100", "/log"), + service.NewHTTP(s.l, "test", ":55000", s.mux), ) s.runServer() @@ -141,7 +142,7 @@ func (s *KeelTestSuite) TestServiceHTTPZap() { func (s *KeelTestSuite) TestGraceful() { s.svr.AddServices( - keel.NewServiceHTTP(s.l, "test", ":55000", s.mux), + service.NewHTTP(s.l, "test", ":55000", s.mux), ) s.runServer() diff --git a/service/errors.go b/service/errors.go new file mode 100644 index 0000000..53f93a8 --- /dev/null +++ b/service/errors.go @@ -0,0 +1,10 @@ +package service + +import ( + "github.com/pkg/errors" +) + +var ( + ErrServiceNotRunning = errors.New("service not running") + ErrServiceShutdown = errors.New("service shutdown") +) diff --git a/service/goroutine.go b/service/goroutine.go new file mode 100644 index 0000000..b4c9b78 --- /dev/null +++ b/service/goroutine.go @@ -0,0 +1,94 @@ +package service + +import ( + "context" + "fmt" + "sync/atomic" + + "go.uber.org/zap" + "golang.org/x/sync/errgroup" + + "github.com/foomo/keel/log" +) + +// GoRoutine struct +type ( + GoRoutine struct { + running atomic.Bool + handler GoRoutineFn + cancel context.CancelCauseFunc + parallel int + name string + wg errgroup.Group + l *zap.Logger + } + GoRoutineOption func(*GoRoutine) + GoRoutineFn func(ctx context.Context, l *zap.Logger) error +) + +func NewGoRoutine(l *zap.Logger, name string, handler GoRoutineFn) *GoRoutine { + if l == nil { + l = log.Logger() + } + // enrich the log + l = log.WithAttributes(l, + log.KeelServiceTypeKey.String("goroutine"), + log.KeelServiceNameKey.String(name), + ) + + return &GoRoutine{ + handler: handler, + name: name, + parallel: 1, + l: l, + } +} + +// ------------------------------------------------------------------------------------------------ +// ~ Options +// ------------------------------------------------------------------------------------------------ + +func GoRoutineWithPralllel(v int) GoRoutineOption { + return func(o *GoRoutine) { + o.parallel = v + } +} + +// ------------------------------------------------------------------------------------------------ +// ~ Public methods +// ------------------------------------------------------------------------------------------------ + +func (s *GoRoutine) Name() string { + return s.name +} + +func (s *GoRoutine) Healthz() error { + if !s.running.Load() { + return ErrServiceNotRunning + } + return nil +} + +func (s *GoRoutine) String() string { + return fmt.Sprintf("parallel: `%d`", s.parallel) +} + +func (s *GoRoutine) Start(ctx context.Context) error { + s.l.Info("starting keel service") + ctx, cancel := context.WithCancelCause(ctx) + s.cancel = cancel + for i := 0; i < s.parallel; i++ { + i := i + l := log.WithAttributes(s.l, log.KeelServiceInstKey.Int(i)) + s.wg.Go(func() error { + return s.handler(ctx, l) + }) + } + return s.wg.Wait() +} + +func (s *GoRoutine) Close(ctx context.Context) error { + s.l.Info("stopping keel service") + s.cancel(ErrServiceShutdown) + return s.wg.Wait() +} diff --git a/service/goroutine_test.go b/service/goroutine_test.go new file mode 100644 index 0000000..29df2f9 --- /dev/null +++ b/service/goroutine_test.go @@ -0,0 +1,47 @@ +package service_test + +import ( + "context" + "time" + + "github.com/foomo/keel" + "github.com/foomo/keel/service" + "github.com/pkg/errors" + "go.uber.org/zap" +) + +func ExampleNewGoRoutine() { + shutdown(3 * time.Second) + + svr := keel.NewServer( + keel.WithLogger(zap.NewExample()), + ) + + svr.AddService( + service.NewGoRoutine(svr.Logger(), "demo", func(ctx context.Context, l *zap.Logger) error { + for { + if err := ctx.Err(); errors.Is(context.Cause(ctx), service.ErrServiceShutdown) { + l.Info("context has been canceled du to graceful shutdow") + return nil + } else if err != nil { + return errors.Wrap(err, "unexpected context error") + } + l.Info("ping") + time.Sleep(time.Second) + } + }), + ) + + svr.Run() + + // Output: + // {"level":"info","msg":"starting keel server"} + // {"level":"info","msg":"starting keel service","keel_service_type":"goroutine","keel_service_name":"demo"} + // {"level":"info","msg":"ping","keel_service_type":"goroutine","keel_service_name":"demo","keel_service_inst":0} + // {"level":"info","msg":"ping","keel_service_type":"goroutine","keel_service_name":"demo","keel_service_inst":0} + // {"level":"info","msg":"ping","keel_service_type":"goroutine","keel_service_name":"demo","keel_service_inst":0} + // {"level":"debug","msg":"keel graceful shutdown"} + // {"level":"info","msg":"stopping keel service","keel_service_type":"goroutine","keel_service_name":"demo"} + // {"level":"info","msg":"context has been canceled du to graceful shutdow","keel_service_type":"goroutine","keel_service_name":"demo","keel_service_inst":0} + // {"level":"info","msg":"keel server stopped"} +} diff --git a/service/helper_test.go b/service/helper_test.go new file mode 100644 index 0000000..5e93805 --- /dev/null +++ b/service/helper_test.go @@ -0,0 +1,14 @@ +package service_test + +import ( + "syscall" + "time" +) + +// shutdown example after the given time +func shutdown(duration time.Duration) { + go func() { + time.Sleep(duration) + _ = syscall.Kill(syscall.Getpid(), syscall.SIGINT) + }() +} diff --git a/servicehttp.go b/service/http.go similarity index 52% rename from servicehttp.go rename to service/http.go index a1e3cc4..62f6fe5 100644 --- a/servicehttp.go +++ b/service/http.go @@ -1,7 +1,8 @@ -package keel +package service import ( "context" + "fmt" "net" "net/http" "strings" @@ -14,22 +15,25 @@ import ( "github.com/foomo/keel/net/http/middleware" ) -// ServiceHTTP struct -type ServiceHTTP struct { +// HTTP struct +type HTTP struct { running atomic.Bool server *http.Server name string l *zap.Logger } -func NewServiceHTTP(l *zap.Logger, name, addr string, handler http.Handler, middlewares ...middleware.Middleware) *ServiceHTTP { +func NewHTTP(l *zap.Logger, name, addr string, handler http.Handler, middlewares ...middleware.Middleware) *HTTP { if l == nil { l = log.Logger() } // enrich the log - l = log.WithHTTPServerName(l, name) + l = log.WithAttributes(l, + log.KeelServiceTypeKey.String("http"), + log.KeelServiceNameKey.String(name), + ) - return &ServiceHTTP{ + return &HTTP{ server: &http.Server{ Addr: addr, ErrorLog: zap.NewStdLog(l), @@ -40,18 +44,22 @@ func NewServiceHTTP(l *zap.Logger, name, addr string, handler http.Handler, midd } } -func (s *ServiceHTTP) Name() string { +func (s *HTTP) Name() string { return s.name } -func (s *ServiceHTTP) Healthz() error { +func (s *HTTP) Healthz() error { if !s.running.Load() { return ErrServiceNotRunning } return nil } -func (s *ServiceHTTP) Start(ctx context.Context) error { +func (s *HTTP) String() string { + return fmt.Sprintf("address: `%s`", s.server.Addr) +} + +func (s *HTTP) Start(ctx context.Context) error { var fields []zap.Field if value := strings.Split(s.server.Addr, ":"); len(value) == 2 { ip, port := value[0], value[1] @@ -60,20 +68,24 @@ func (s *ServiceHTTP) Start(ctx context.Context) error { } fields = append(fields, log.FNetHostIP(ip), log.FNetHostPort(port)) } - s.l.Info("starting http service", fields...) + s.l.Info("starting keel service", fields...) s.server.BaseContext = func(_ net.Listener) context.Context { return ctx } s.server.RegisterOnShutdown(func() { s.running.Store(false) }) s.running.Store(true) - if err := s.server.ListenAndServe(); !errors.Is(err, http.ErrServerClosed) { - log.WithError(s.l, err).Error("service error") - return err + if err := s.server.ListenAndServe(); errors.Is(err, http.ErrServerClosed) { + return nil + } else if err != nil { + return errors.Wrap(err, "failed to start service") } return nil } -func (s *ServiceHTTP) Close(ctx context.Context) error { - s.l.Info("stopping http service") - return s.server.Shutdown(ctx) +func (s *HTTP) Close(ctx context.Context) error { + s.l.Info("stopping keel service") + if err := s.server.Shutdown(ctx); err != nil { + return errors.Wrap(err, "failed to stop service") + } + return nil } diff --git a/service/http_test.go b/service/http_test.go new file mode 100644 index 0000000..9f7e01c --- /dev/null +++ b/service/http_test.go @@ -0,0 +1,39 @@ +package service_test + +import ( + "net/http" + "time" + + "github.com/foomo/keel" + "github.com/foomo/keel/service" + "go.uber.org/zap" +) + +func ExampleNewHTTP() { + shutdown(3 * time.Second) + + svr := keel.NewServer( + keel.WithLogger(zap.NewExample()), + ) + + l := svr.Logger() + // create demo service + svs := http.NewServeMux() + svs.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusOK) + _, _ = w.Write([]byte("OK")) + }) + + svr.AddService( + service.NewHTTP(l, "demo", "localhost:8080", svs), + ) + + svr.Run() + + // Output: + // {"level":"info","msg":"starting keel server"} + // {"level":"info","msg":"starting keel service","keel_service_type":"http","keel_service_name":"demo","net_host_ip":"localhost","net_host_port":"8080"} + // {"level":"debug","msg":"keel graceful shutdown"} + // {"level":"info","msg":"stopping keel service","keel_service_type":"http","keel_service_name":"demo"} + // {"level":"info","msg":"keel server stopped"} +} diff --git a/servicehttphealthz.go b/service/httphealthz.go similarity index 67% rename from servicehttphealthz.go rename to service/httphealthz.go index 1bdfe96..6b3629e 100644 --- a/servicehttphealthz.go +++ b/service/httphealthz.go @@ -1,19 +1,21 @@ -package keel +package service import ( "context" "errors" "net/http" + "github.com/foomo/keel/healthz" + "github.com/foomo/keel/interfaces" "go.uber.org/zap" "github.com/foomo/keel/log" ) const ( - DefaultServiceHTTPHealthzName = "healthz" - DefaultServiceHTTPHealthzAddr = ":9400" - DefaultServiceHTTPHealthzPath = "/healthz" + DefaultHTTPHealthzName = "healthz" + DefaultHTTPHealthzAddr = ":9400" + DefaultHTTPHealthzPath = "/healthz" ) var ( @@ -24,7 +26,7 @@ var ( ErrStartupProbeFailed = errors.New("startup probe failed") ) -func NewServiceHTTPHealthz(l *zap.Logger, name, addr, path string, probes map[HealthzType][]interface{}) *ServiceHTTP { +func NewHealthz(l *zap.Logger, name, addr, path string, probes map[healthz.Type][]interface{}) *HTTP { handler := http.NewServeMux() unavailable := func(l *zap.Logger, w http.ResponseWriter, r *http.Request, err error) { @@ -36,17 +38,17 @@ func NewServiceHTTPHealthz(l *zap.Logger, name, addr, path string, probes map[He call := func(ctx context.Context, probe interface{}) (bool, error) { switch h := probe.(type) { - case BoolHealthzer: + case healthz.BoolHealthzer: return h.Healthz(), nil - case BoolHealthzerWithContext: + case healthz.BoolHealthzerWithContext: return h.Healthz(ctx), nil - case ErrorHealthzer: + case healthz.ErrorHealthzer: return true, h.Healthz() - case ErrorHealthzWithContext: + case healthz.ErrorHealthzWithContext: return true, h.Healthz(ctx) - case ErrorPinger: + case interfaces.ErrorPinger: return true, h.Ping() - case ErrorPingerWithContext: + case interfaces.ErrorPingerWithContext: return true, h.Ping(ctx) default: return false, ErrUnhandledHealthzProbe @@ -55,7 +57,7 @@ func NewServiceHTTPHealthz(l *zap.Logger, name, addr, path string, probes map[He handler.HandleFunc(path, func(w http.ResponseWriter, r *http.Request) { for typ, values := range probes { - if typ == HealthzTypeStartup { + if typ == healthz.TypeStartup { continue } for _, p := range values { @@ -72,12 +74,12 @@ func NewServiceHTTPHealthz(l *zap.Logger, name, addr, path string, probes map[He _, _ = w.Write([]byte("OK")) }) - handler.HandleFunc(path+"/"+HealthzTypeLiveness.String(), func(w http.ResponseWriter, r *http.Request) { + handler.HandleFunc(path+"/"+healthz.TypeLiveness.String(), func(w http.ResponseWriter, r *http.Request) { var ps []interface{} - if p, ok := probes[HealthzTypeAlways]; ok { + if p, ok := probes[healthz.TypeAlways]; ok { ps = append(ps, p...) } - if p, ok := probes[HealthzTypeLiveness]; ok { + if p, ok := probes[healthz.TypeLiveness]; ok { ps = append(ps, p...) } for _, p := range ps { @@ -93,12 +95,12 @@ func NewServiceHTTPHealthz(l *zap.Logger, name, addr, path string, probes map[He _, _ = w.Write([]byte("OK")) }) - handler.HandleFunc(path+"/"+HealthzTypeReadiness.String(), func(w http.ResponseWriter, r *http.Request) { + handler.HandleFunc(path+"/"+healthz.TypeReadiness.String(), func(w http.ResponseWriter, r *http.Request) { var ps []interface{} - if p, ok := probes[HealthzTypeAlways]; ok { + if p, ok := probes[healthz.TypeAlways]; ok { ps = append(ps, p...) } - if p, ok := probes[HealthzTypeReadiness]; ok { + if p, ok := probes[healthz.TypeReadiness]; ok { ps = append(ps, p...) } for _, p := range ps { @@ -114,12 +116,12 @@ func NewServiceHTTPHealthz(l *zap.Logger, name, addr, path string, probes map[He _, _ = w.Write([]byte("OK")) }) - handler.HandleFunc(path+"/"+HealthzTypeStartup.String(), func(w http.ResponseWriter, r *http.Request) { + handler.HandleFunc(path+"/"+healthz.TypeStartup.String(), func(w http.ResponseWriter, r *http.Request) { var ps []interface{} - if p, ok := probes[HealthzTypeAlways]; ok { + if p, ok := probes[healthz.TypeAlways]; ok { ps = append(ps, p...) } - if p, ok := probes[HealthzTypeStartup]; ok { + if p, ok := probes[healthz.TypeStartup]; ok { ps = append(ps, p...) } for _, p := range ps { @@ -134,15 +136,15 @@ func NewServiceHTTPHealthz(l *zap.Logger, name, addr, path string, probes map[He w.WriteHeader(http.StatusOK) _, _ = w.Write([]byte("OK")) }) - return NewServiceHTTP(l, name, addr, handler) + return NewHTTP(l, name, addr, handler) } -func NewDefaultServiceHTTPProbes(probes map[HealthzType][]interface{}) *ServiceHTTP { - return NewServiceHTTPHealthz( +func NewDefaultHTTPProbes(probes map[healthz.Type][]interface{}) *HTTP { + return NewHealthz( log.Logger(), - DefaultServiceHTTPHealthzName, - DefaultServiceHTTPHealthzAddr, - DefaultServiceHTTPHealthzPath, + DefaultHTTPHealthzName, + DefaultHTTPHealthzAddr, + DefaultHTTPHealthzPath, probes, ) } diff --git a/servicehttppprof.go b/service/httppprof.go similarity index 56% rename from servicehttppprof.go rename to service/httppprof.go index cb10cc3..7855d96 100644 --- a/servicehttppprof.go +++ b/service/httppprof.go @@ -1,6 +1,6 @@ //go:build !pprof -package keel +package service import ( "net/http" @@ -10,12 +10,12 @@ import ( ) const ( - DefaultServiceHTTPPProfName = "pprof" - DefaultServiceHTTPPProfAddr = "localhost:6060" - DefaultServiceHTTPPProfPath = "/debug/pprof" + DefaultHTTPPProfName = "pprof" + DefaultHTTPPProfAddr = "localhost:6060" + DefaultHTTPPProfPath = "/debug/pprof" ) -func NewServiceHTTPPProf(l *zap.Logger, name, addr, path string) *ServiceHTTP { +func NewHTTPPProf(l *zap.Logger, name, addr, path string) *HTTP { route := func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusNotImplemented) _, _ = w.Write([]byte("To enable pprof, you need to build your binary with the `-tags=pprof` flag")) @@ -26,14 +26,14 @@ func NewServiceHTTPPProf(l *zap.Logger, name, addr, path string) *ServiceHTTP { handler.HandleFunc(path+"/profile", route) handler.HandleFunc(path+"/symbol", route) handler.HandleFunc(path+"/trace", route) - return NewServiceHTTP(l, name, addr, handler) + return NewHTTP(l, name, addr, handler) } -func NewDefaultServiceHTTPPProf() *ServiceHTTP { - return NewServiceHTTPPProf( +func NewDefaultHTTPPProf() *HTTP { + return NewHTTPPProf( log.Logger(), - DefaultServiceHTTPPProfName, - DefaultServiceHTTPPProfAddr, - DefaultServiceHTTPPProfPath, + DefaultHTTPPProfName, + DefaultHTTPPProfAddr, + DefaultHTTPPProfPath, ) } diff --git a/servicehttppprof_pprof.go b/service/httppprof_pprof.go similarity index 54% rename from servicehttppprof_pprof.go rename to service/httppprof_pprof.go index 2092e63..ca020c4 100644 --- a/servicehttppprof_pprof.go +++ b/service/httppprof_pprof.go @@ -1,7 +1,7 @@ //go:build pprof // +build pprof -package keel +package service import ( "net/http" @@ -12,12 +12,12 @@ import ( ) const ( - DefaultServiceHTTPPProfName = "pprof" - DefaultServiceHTTPPProfAddr = "localhost:6060" - DefaultServiceHTTPPProfPath = "/debug/pprof" + DefaultHTTPPProfName = "pprof" + DefaultHTTPPProfAddr = "localhost:6060" + DefaultHTTPPProfPath = "/debug/pprof" ) -func NewServiceHTTPPProf(l *zap.Logger, name, addr, path string) *ServiceHTTP { +func NewHTTPPProf(l *zap.Logger, name, addr, path string) *ServiceHTTP { handler := http.NewServeMux() handler.HandleFunc(path+"/", pprof.Index) handler.HandleFunc(path+"/cmdline", pprof.Cmdline) @@ -27,11 +27,11 @@ func NewServiceHTTPPProf(l *zap.Logger, name, addr, path string) *ServiceHTTP { return NewServiceHTTP(l, name, addr, handler) } -func NewDefaultServiceHTTPPProf() *ServiceHTTP { - return NewServiceHTTPPProf( +func NewDefaultHTTPPProf() *ServiceHTTP { + return NewHTTPPProf( log.Logger(), - DefaultServiceHTTPPProfName, - DefaultServiceHTTPPProfAddr, - DefaultServiceHTTPPProfPath, + DefaultHTTPPProfName, + DefaultHTTPPProfAddr, + DefaultHTTPPProfPath, ) } diff --git a/service/httpprometheus.go b/service/httpprometheus.go new file mode 100644 index 0000000..94be252 --- /dev/null +++ b/service/httpprometheus.go @@ -0,0 +1,37 @@ +package service + +import ( + "net/http" + + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promhttp" + "go.uber.org/zap" + + "github.com/foomo/keel/log" +) + +const ( + DefaultHTTPPrometheusName = "prometheus" + DefaultHTTPPrometheusAddr = ":9200" + DefaultHTTPPrometheusPath = "/metrics" +) + +func NewHTTPPrometheus(l *zap.Logger, name, addr, path string) *HTTP { + handler := http.NewServeMux() + handler.Handle(path, promhttp.HandlerFor( + prometheus.DefaultGatherer, + promhttp.HandlerOpts{ + EnableOpenMetrics: true, + }, + )) + return NewHTTP(l, name, addr, handler) +} + +func NewDefaultHTTPPrometheus() *HTTP { + return NewHTTPPrometheus( + log.Logger(), + DefaultHTTPPrometheusName, + DefaultHTTPPrometheusAddr, + DefaultHTTPPrometheusPath, + ) +} diff --git a/servicehttpviper.go b/service/httpviper.go similarity index 67% rename from servicehttpviper.go rename to service/httpviper.go index 2e34025..47639d0 100644 --- a/servicehttpviper.go +++ b/service/httpviper.go @@ -1,4 +1,4 @@ -package keel +package service import ( "encoding/json" @@ -12,12 +12,12 @@ import ( ) const ( - DefaultServiceHTTPViperName = "viper" - DefaultServiceHTTPViperAddr = "localhost:9300" - DefaultServiceHTTPViperPath = "/config" + DefaultHTTPViperName = "viper" + DefaultHTTPViperAddr = "localhost:9300" + DefaultHTTPViperPath = "/config" ) -func NewServiceHTTPViper(l *zap.Logger, c *viper.Viper, name, addr, path string) *ServiceHTTP { +func NewHTTPViper(l *zap.Logger, c *viper.Viper, name, addr, path string) *HTTP { handler := http.NewServeMux() handler.HandleFunc(path, func(w http.ResponseWriter, r *http.Request) { type payload struct { @@ -44,15 +44,15 @@ func NewServiceHTTPViper(l *zap.Logger, c *viper.Viper, name, addr, path string) http.Error(w, http.StatusText(http.StatusMethodNotAllowed), http.StatusMethodNotAllowed) } }) - return NewServiceHTTP(l, name, addr, handler) + return NewHTTP(l, name, addr, handler) } -func NewDefaultServiceHTTPViper() *ServiceHTTP { - return NewServiceHTTPViper( +func NewDefaultHTTPViper() *HTTP { + return NewHTTPViper( log.Logger(), config.Config(), - DefaultServiceHTTPViperName, - DefaultServiceHTTPViperAddr, - DefaultServiceHTTPViperPath, + DefaultHTTPViperName, + DefaultHTTPViperAddr, + DefaultHTTPViperPath, ) } diff --git a/servicehttpzap.go b/service/httpzap.go similarity index 84% rename from servicehttpzap.go rename to service/httpzap.go index 384189a..4969682 100644 --- a/servicehttpzap.go +++ b/service/httpzap.go @@ -1,4 +1,4 @@ -package keel +package service import ( "encoding/json" @@ -12,12 +12,12 @@ import ( ) const ( - DefaultServiceHTTPZapName = "zap" - DefaultServiceHTTPZapAddr = "localhost:9100" - DefaultServiceHTTPZapPath = "/log" + DefaultHTTPZapName = "zap" + DefaultHTTPZapAddr = "localhost:9100" + DefaultHTTPZapPath = "/log" ) -func NewServiceHTTPZap(l *zap.Logger, name, addr, path string) *ServiceHTTP { +func NewHTTPZap(l *zap.Logger, name, addr, path string) *HTTP { handler := http.NewServeMux() handler.HandleFunc(path, func(w http.ResponseWriter, r *http.Request) { type errorResponse struct { @@ -91,14 +91,14 @@ func NewServiceHTTPZap(l *zap.Logger, name, addr, path string) *ServiceHTTP { }) } }) - return NewServiceHTTP(l, name, addr, handler) + return NewHTTP(l, name, addr, handler) } -func NewDefaultServiceHTTPZap() *ServiceHTTP { - return NewServiceHTTPZap( +func NewDefaultHTTPZap() *HTTP { + return NewHTTPZap( log.Logger(), - DefaultServiceHTTPZapName, - DefaultServiceHTTPZapAddr, - DefaultServiceHTTPZapPath, + DefaultHTTPZapName, + DefaultHTTPZapAddr, + DefaultHTTPZapPath, ) } diff --git a/servicehttpprometheus.go b/servicehttpprometheus.go deleted file mode 100644 index 9636205..0000000 --- a/servicehttpprometheus.go +++ /dev/null @@ -1,37 +0,0 @@ -package keel - -import ( - "net/http" - - "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/client_golang/prometheus/promhttp" - "go.uber.org/zap" - - "github.com/foomo/keel/log" -) - -const ( - DefaultServiceHTTPPrometheusName = "prometheus" - DefaultServiceHTTPPrometheusAddr = ":9200" - DefaultServiceHTTPPrometheusPath = "/metrics" -) - -func NewServiceHTTPPrometheus(l *zap.Logger, name, addr, path string) *ServiceHTTP { - handler := http.NewServeMux() - handler.Handle(path, promhttp.HandlerFor( - prometheus.DefaultGatherer, - promhttp.HandlerOpts{ - EnableOpenMetrics: true, - }, - )) - return NewServiceHTTP(l, name, addr, handler) -} - -func NewDefaultServiceHTTPPrometheus() *ServiceHTTP { - return NewServiceHTTPPrometheus( - log.Logger(), - DefaultServiceHTTPPrometheusName, - DefaultServiceHTTPPrometheusAddr, - DefaultServiceHTTPPrometheusPath, - ) -} diff --git a/telemetry/nonrecording/instruments.go b/telemetry/nonrecording/instruments.go new file mode 100644 index 0000000..d11c927 --- /dev/null +++ b/telemetry/nonrecording/instruments.go @@ -0,0 +1,162 @@ +// Copyright The OpenTelemetry Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package nonrecording + +import ( + "context" + "strings" + + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/metric/instrument" + "go.opentelemetry.io/otel/metric/instrument/asyncfloat64" + "go.opentelemetry.io/otel/metric/instrument/asyncint64" + "go.opentelemetry.io/otel/metric/instrument/syncfloat64" + "go.opentelemetry.io/otel/metric/instrument/syncint64" +) + +type Metric struct { + Name string + Type string + Help string +} + +var metrics []Metric + +func Metrics() []Metric { + return metrics +} + +type nonrecordingAsyncFloat64Instrument struct { + instrument.Asynchronous +} + +var ( + _ asyncfloat64.InstrumentProvider = nonrecordingAsyncFloat64Instrument{} + _ asyncfloat64.Counter = nonrecordingAsyncFloat64Instrument{} + _ asyncfloat64.UpDownCounter = nonrecordingAsyncFloat64Instrument{} + _ asyncfloat64.Gauge = nonrecordingAsyncFloat64Instrument{} +) + +func (n nonrecordingAsyncFloat64Instrument) Counter(name string, opts ...instrument.Option) (asyncfloat64.Counter, error) { + metrics = append(metrics, Metric{Name: strings.ReplaceAll(name, ".", "_"), Type: "COUNTER", Help: instrument.NewConfig(opts...).Description()}) + return n, nil +} + +func (n nonrecordingAsyncFloat64Instrument) UpDownCounter(name string, opts ...instrument.Option) (asyncfloat64.UpDownCounter, error) { + metrics = append(metrics, Metric{Name: strings.ReplaceAll(name, ".", "_"), Type: "UPDOWNCOUNTER", Help: instrument.NewConfig(opts...).Description()}) + return n, nil +} + +func (n nonrecordingAsyncFloat64Instrument) Gauge(name string, opts ...instrument.Option) (asyncfloat64.Gauge, error) { + metrics = append(metrics, Metric{Name: strings.ReplaceAll(name, ".", "_"), Type: "GAUGE", Help: instrument.NewConfig(opts...).Description()}) + return n, nil +} + +func (nonrecordingAsyncFloat64Instrument) Observe(context.Context, float64, ...attribute.KeyValue) { +} + +type nonrecordingAsyncInt64Instrument struct { + instrument.Asynchronous +} + +var ( + _ asyncint64.InstrumentProvider = nonrecordingAsyncInt64Instrument{} + _ asyncint64.Counter = nonrecordingAsyncInt64Instrument{} + _ asyncint64.UpDownCounter = nonrecordingAsyncInt64Instrument{} + _ asyncint64.Gauge = nonrecordingAsyncInt64Instrument{} +) + +func (n nonrecordingAsyncInt64Instrument) Counter(name string, opts ...instrument.Option) (asyncint64.Counter, error) { + metrics = append(metrics, Metric{Name: strings.ReplaceAll(name, ".", "_"), Type: "COUNTER", Help: instrument.NewConfig(opts...).Description()}) + return n, nil +} + +func (n nonrecordingAsyncInt64Instrument) UpDownCounter(name string, opts ...instrument.Option) (asyncint64.UpDownCounter, error) { + metrics = append(metrics, Metric{Name: strings.ReplaceAll(name, ".", "_"), Type: "UPDOWNCOUNTER", Help: instrument.NewConfig(opts...).Description()}) + return n, nil +} + +func (n nonrecordingAsyncInt64Instrument) Gauge(name string, opts ...instrument.Option) (asyncint64.Gauge, error) { + metrics = append(metrics, Metric{Name: strings.ReplaceAll(name, ".", "_"), Type: "GAUGE", Help: instrument.NewConfig(opts...).Description()}) + return n, nil +} + +func (nonrecordingAsyncInt64Instrument) Observe(context.Context, int64, ...attribute.KeyValue) { +} + +type nonrecordingSyncFloat64Instrument struct { + instrument.Synchronous +} + +var ( + _ syncfloat64.InstrumentProvider = nonrecordingSyncFloat64Instrument{} + _ syncfloat64.Counter = nonrecordingSyncFloat64Instrument{} + _ syncfloat64.UpDownCounter = nonrecordingSyncFloat64Instrument{} + _ syncfloat64.Histogram = nonrecordingSyncFloat64Instrument{} +) + +func (n nonrecordingSyncFloat64Instrument) Counter(name string, opts ...instrument.Option) (syncfloat64.Counter, error) { + metrics = append(metrics, Metric{Name: strings.ReplaceAll(name, ".", "_"), Type: "COUNTER", Help: instrument.NewConfig(opts...).Description()}) + return n, nil +} + +func (n nonrecordingSyncFloat64Instrument) UpDownCounter(name string, opts ...instrument.Option) (syncfloat64.UpDownCounter, error) { + metrics = append(metrics, Metric{Name: strings.ReplaceAll(name, ".", "_"), Type: "UPDOWNCOUNTER", Help: instrument.NewConfig(opts...).Description()}) + return n, nil +} + +func (n nonrecordingSyncFloat64Instrument) Histogram(name string, opts ...instrument.Option) (syncfloat64.Histogram, error) { + metrics = append(metrics, Metric{Name: strings.ReplaceAll(name, ".", "_"), Type: "HISTOGRAM", Help: instrument.NewConfig(opts...).Description()}) + return n, nil +} + +func (nonrecordingSyncFloat64Instrument) Add(context.Context, float64, ...attribute.KeyValue) { + +} + +func (nonrecordingSyncFloat64Instrument) Record(context.Context, float64, ...attribute.KeyValue) { + +} + +type nonrecordingSyncInt64Instrument struct { + instrument.Synchronous +} + +var ( + _ syncint64.InstrumentProvider = nonrecordingSyncInt64Instrument{} + _ syncint64.Counter = nonrecordingSyncInt64Instrument{} + _ syncint64.UpDownCounter = nonrecordingSyncInt64Instrument{} + _ syncint64.Histogram = nonrecordingSyncInt64Instrument{} +) + +func (n nonrecordingSyncInt64Instrument) Counter(name string, opts ...instrument.Option) (syncint64.Counter, error) { + metrics = append(metrics, Metric{Name: strings.ReplaceAll(name, ".", "_"), Type: "COUNTER", Help: instrument.NewConfig(opts...).Description()}) + return n, nil +} + +func (n nonrecordingSyncInt64Instrument) UpDownCounter(name string, opts ...instrument.Option) (syncint64.UpDownCounter, error) { + metrics = append(metrics, Metric{Name: strings.ReplaceAll(name, ".", "_"), Type: "UPDOWNCOUNTER", Help: instrument.NewConfig(opts...).Description()}) + return n, nil +} + +func (n nonrecordingSyncInt64Instrument) Histogram(name string, opts ...instrument.Option) (syncint64.Histogram, error) { + metrics = append(metrics, Metric{Name: strings.ReplaceAll(name, ".", "_"), Type: "HISTOGRAM", Help: instrument.NewConfig(opts...).Description()}) + return n, nil +} + +func (nonrecordingSyncInt64Instrument) Add(context.Context, int64, ...attribute.KeyValue) { +} +func (nonrecordingSyncInt64Instrument) Record(context.Context, int64, ...attribute.KeyValue) { +} diff --git a/telemetry/nonrecording/meter.go b/telemetry/nonrecording/meter.go new file mode 100644 index 0000000..15c9582 --- /dev/null +++ b/telemetry/nonrecording/meter.go @@ -0,0 +1,50 @@ +package nonrecording + +import ( + "context" + + "go.opentelemetry.io/otel/metric" + "go.opentelemetry.io/otel/metric/instrument" + "go.opentelemetry.io/otel/metric/instrument/asyncfloat64" + "go.opentelemetry.io/otel/metric/instrument/asyncint64" + "go.opentelemetry.io/otel/metric/instrument/syncfloat64" + "go.opentelemetry.io/otel/metric/instrument/syncint64" +) + +// NewNoopMeterProvider creates a MeterProvider that does not record any metrics. +func NewNoopMeterProvider() metric.MeterProvider { + return noopMeterProvider{} +} + +type noopMeterProvider struct{} + +var _ metric.MeterProvider = noopMeterProvider{} + +func (noopMeterProvider) Meter(instrumentationName string, opts ...metric.MeterOption) metric.Meter { + return noopMeter{} +} + +// NewNoopMeter creates a Meter that does not record any metrics. +func NewNoopMeter() metric.Meter { + return noopMeter{} +} + +type noopMeter struct{} + +var _ metric.Meter = noopMeter{} + +func (noopMeter) AsyncInt64() asyncint64.InstrumentProvider { + return nonrecordingAsyncInt64Instrument{} +} +func (noopMeter) AsyncFloat64() asyncfloat64.InstrumentProvider { + return nonrecordingAsyncFloat64Instrument{} +} +func (noopMeter) SyncInt64() syncint64.InstrumentProvider { + return nonrecordingSyncInt64Instrument{} +} +func (noopMeter) SyncFloat64() syncfloat64.InstrumentProvider { + return nonrecordingSyncFloat64Instrument{} +} +func (noopMeter) RegisterCallback([]instrument.Asynchronous, func(context.Context)) error { + return nil +} From 9473fa3dcbb133da78b213bb5e8c5d6c5fb4b9b6 Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Fri, 8 Sep 2023 12:17:44 +0200 Subject: [PATCH 065/134] chore: update github workflow --- .github/workflows/release.yml | 10 ++++------ .github/workflows/test.yml | 25 +++++++++++++------------ .gitignore | 3 +-- .golangci.yml | 3 ++- .goreleaser.yml | 31 +------------------------------ .husky.yaml | 2 -- Makefile | 9 +-------- 7 files changed, 22 insertions(+), 61 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 4222c9b..07d1f3a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -6,15 +6,14 @@ on: - v*.*.* workflow_dispatch: -env: - GOFLAGS: -mod=readonly - GOPROXY: https://proxy.golang.org +permissions: + contents: write jobs: release: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 @@ -22,8 +21,7 @@ jobs: - uses: actions/setup-go@v4 with: - check-latest: true - go-version-file: 'go.mod' + go-version-file: 'stable' - uses: goreleaser/goreleaser-action@v4 with: diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 11838f7..39cb066 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -4,15 +4,8 @@ on: push: branches: [ main ] pull_request: - branches: [ main ] - merge_group: - branches: [ main ] workflow_dispatch: -env: - GOFLAGS: -mod=readonly - GOPROXY: https://proxy.golang.org - concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} cancel-in-progress: true @@ -21,15 +14,23 @@ jobs: test: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: actions/setup-go@v4 with: - check-latest: true - go-version-file: 'go.mod' + go-version-file: 'stable' + + - uses: gotesttools/gotestfmt-action@v2 + with: + token: ${{ secrets.GITHUB_TOKEN }} - uses: golangci/golangci-lint-action@v3 + with: + version: latest - - name: Run tests - run: go test -v ./... + - run: make test + + - uses: coverallsapp/github-action@v2 + with: + file: coverage.out diff --git a/.gitignore b/.gitignore index f14e605..5c03997 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ .* *.log +*.out !.github/ !.husky/ !.editorconfig @@ -7,6 +8,4 @@ !.golangci.yml !.goreleaser.yml !.husky.yaml -/coverage.out -/coverage.html /tmp/ diff --git a/.golangci.yml b/.golangci.yml index edc3188..f86e30c 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -1,5 +1,6 @@ run: - timeout: 5m + skip-dirs: + - tmp linters-settings: # https://golangci-lint.run/usage/linters/#revive diff --git a/.goreleaser.yml b/.goreleaser.yml index 65027d3..fbb8188 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -2,33 +2,4 @@ builds: - skip: true changelog: - filters: - exclude: - - "^wip" - - "^test" - - "^docs" - - "^chore" - - "^style" - - "go mod tidy" - - "merge conflict" - - "Merge pull request" - - "Merge remote-tracking branch" - - "Merge branch" - groups: - - title: Features - regexp: '^.*?feat(\([[:word:]]+\))??!?:.+$' - order: 0 - - title: Dependency updates - regexp: '^.*?(feat|fix)\(deps\)!?:.+$' - order: 100 - - title: "Bug fixes" - regexp: '^.*?fix(\([[:word:]]+\))??!?:.+$' - order: 150 - - title: "Security" - regexp: '^.*?sec(\([[:word:]]+\))??!?:.+$' - order: 200 - - title: "Performace" - regexp: '^.*?perf(\([[:word:]]+\))??!?:.+$' - order: 250 - - title: Other - order: 999 + use: github-native diff --git a/.husky.yaml b/.husky.yaml index fb2448e..2bbd935 100644 --- a/.husky.yaml +++ b/.husky.yaml @@ -9,9 +9,7 @@ hooks: lint-staged: '*.go': - goimports -l -w - - gofmt -l -w lint-commit: - email: '^(.+@bestbytes.com)$' types: '^(feat|fix|build|chore|docs|perf|refactor|revert|style|test|wip)$' header: '^(?P\w+)(\((?P[\w/.-]+)\))?(?P!)?:( +)?(?P
.+)' diff --git a/Makefile b/Makefile index a2ace4a..08b42e1 100644 --- a/Makefile +++ b/Makefile @@ -27,14 +27,7 @@ doc: .PHONY: test ## Run tests test: - @go test -v ./... - -.PHONY: test.cover -## Run tests with coverage -test.cover: - @go test -v -coverprofile=coverage.out ./... - @go tool cover -func=coverage.out - @go tool cover -html=coverage.out + @go test -coverprofile=coverage.out -race -json ./... | gotestfmt .PHONY: lint ## Run linter From 93d7b46f1c2f94406c5d9f8a2ba1a0cec2087930 Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Fri, 8 Sep 2023 12:20:58 +0200 Subject: [PATCH 066/134] chore: fix config --- .github/workflows/release.yml | 2 +- .github/workflows/test.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 07d1f3a..b0990b7 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -21,7 +21,7 @@ jobs: - uses: actions/setup-go@v4 with: - go-version-file: 'stable' + go-version: 'stable' - uses: goreleaser/goreleaser-action@v4 with: diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 39cb066..f39d14b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -18,7 +18,7 @@ jobs: - uses: actions/setup-go@v4 with: - go-version-file: 'stable' + go-version: 'stable' - uses: gotesttools/gotestfmt-action@v2 with: From a789e0fa579a6cfc740c4ef7fe1f9f7a62bb37b5 Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Fri, 8 Sep 2023 12:23:25 +0200 Subject: [PATCH 067/134] chore: add timeout --- .github/workflows/test.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index f39d14b..b1c0152 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -27,6 +27,7 @@ jobs: - uses: golangci/golangci-lint-action@v3 with: version: latest + args: --timeout=5m - run: make test From 58b482d8acf5fcd13bebf9d6dbf61cda196b5778 Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Fri, 8 Sep 2023 12:28:36 +0200 Subject: [PATCH 068/134] docs: update readme --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f69b1a9..a5341aa 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,9 @@ # keel +[![Build Status](https://github.com/foomo/keel/actions/workflows/test.yml/badge.svg?branch=main&event=push)](https://github.com/foomo/keel/actions/workflows/test.yml) [![Go Report Card](https://goreportcard.com/badge/github.com/foomo/keel)](https://goreportcard.com/report/github.com/foomo/keel) -[![godoc](https://godoc.org/github.com/foomo/keel?status.svg)](https://godoc.org/github.com/foomo/keel) -[![GitHub Super-Linter](https://github.com/foomo/keel/workflows/CI/badge.svg)](https://github.com/marketplace/actions/super-linter) +[![Coverage Status](https://coveralls.io/repos/github/foomo/keel/badge.svg?branch=main&)](https://coveralls.io/github/foomo/keel?branch=main) +[![GoDoc](https://godoc.org/github.com/foomo/keel?status.svg)](https://godoc.org/github.com/foomo/keel) > Opinionated way to run services. From 2823a97bad2406937e3820be0ebbfcaf7c432fe3 Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Fri, 8 Sep 2023 15:49:23 +0200 Subject: [PATCH 069/134] refactor: expose docs through interface --- .golangci.yml | 2 +- config/config.go | 82 ++++---- interfaces/documenter.go | 6 + markdown/markdown.go | 38 ++++ markdown/utils.go | 19 ++ option.go | 11 + server.go | 214 ++++++++++++++++++- server_docs.go | 435 --------------------------------------- service/httpdocs.go | 49 +++++ service/httpdocs_test.go | 113 ++++++++++ 10 files changed, 480 insertions(+), 489 deletions(-) create mode 100644 interfaces/documenter.go create mode 100644 markdown/markdown.go create mode 100644 markdown/utils.go delete mode 100644 server_docs.go create mode 100644 service/httpdocs.go create mode 100644 service/httpdocs_test.go diff --git a/.golangci.yml b/.golangci.yml index f86e30c..f3f5ee7 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -62,7 +62,7 @@ linters: - gosec # (gas): Inspects source code for security problems [fast: false, auto-fix: false] - grouper # An analyzer to analyze expression groups. [fast: true, auto-fix: false] - importas # Enforces consistent import aliases [fast: false, auto-fix: false] - - maintidx # maintidx measures the maintainability index of each function. [fast: true, auto-fix: false] + #- maintidx # maintidx measures the maintainability index of each function. [fast: true, auto-fix: false] - makezero # Finds slice declarations with non-zero initial length [fast: false, auto-fix: false] - misspell # Finds commonly misspelled English words in comments [fast: true, auto-fix: true] - nakedret # Finds naked returns in functions greater than a specified function length [fast: true, auto-fix: false] diff --git a/config/config.go b/config/config.go index 7c4b26a..8444bfc 100644 --- a/config/config.go +++ b/config/config.go @@ -11,7 +11,9 @@ import ( // config holds the global configuration var ( - config *viper.Viper + config *viper.Viper + requiredKeys []string + defaults = map[string]interface{}{} ) // Init sets up the configuration @@ -28,15 +30,13 @@ func Config() *viper.Viper { } func GetBool(c *viper.Viper, key string, fallback bool) func() bool { - c = ensure(c) - c.SetDefault(key, fallback) + setDefault(c, key, fallback) return func() bool { return c.GetBool(key) } } -func MustGetBool(c *viper.Viper, key string, fallback bool) func() bool { - c = ensure(c) +func MustGetBool(c *viper.Viper, key string) func() bool { must(c, key) return func() bool { return c.GetBool(key) @@ -58,15 +58,13 @@ func MustGetInt(c *viper.Viper, key string) func() int { } func GetInt32(c *viper.Viper, key string, fallback int32) func() int32 { - c = ensure(c) - c.SetDefault(key, fallback) + setDefault(c, key, fallback) return func() int32 { return c.GetInt32(key) } } func MustGetInt32(c *viper.Viper, key string) func() int32 { - c = ensure(c) must(c, key) return func() int32 { return c.GetInt32(key) @@ -74,15 +72,13 @@ func MustGetInt32(c *viper.Viper, key string) func() int32 { } func GetInt64(c *viper.Viper, key string, fallback int64) func() int64 { - c = ensure(c) - c.SetDefault(key, fallback) + setDefault(c, key, fallback) return func() int64 { return c.GetInt64(key) } } func MustGetInt64(c *viper.Viper, key string) func() int64 { - c = ensure(c) must(c, key) return func() int64 { return c.GetInt64(key) @@ -90,15 +86,13 @@ func MustGetInt64(c *viper.Viper, key string) func() int64 { } func GetUint(c *viper.Viper, key string, fallback uint) func() uint { - c = ensure(c) - c.SetDefault(key, fallback) + setDefault(c, key, fallback) return func() uint { return c.GetUint(key) } } func MustGetUint(c *viper.Viper, key string) func() uint { - c = ensure(c) must(c, key) return func() uint { return c.GetUint(key) @@ -106,15 +100,13 @@ func MustGetUint(c *viper.Viper, key string) func() uint { } func GetUint32(c *viper.Viper, key string, fallback uint32) func() uint32 { - c = ensure(c) - c.SetDefault(key, fallback) + setDefault(c, key, fallback) return func() uint32 { return c.GetUint32(key) } } func MustGetUint32(c *viper.Viper, key string) func() uint32 { - c = ensure(c) must(c, key) return func() uint32 { return c.GetUint32(key) @@ -122,15 +114,13 @@ func MustGetUint32(c *viper.Viper, key string) func() uint32 { } func GetUint64(c *viper.Viper, key string, fallback uint64) func() uint64 { - c = ensure(c) - c.SetDefault(key, fallback) + setDefault(c, key, fallback) return func() uint64 { return c.GetUint64(key) } } func MustGetUint64(c *viper.Viper, key string) func() uint64 { - c = ensure(c) must(c, key) return func() uint64 { return c.GetUint64(key) @@ -138,15 +128,13 @@ func MustGetUint64(c *viper.Viper, key string) func() uint64 { } func GetFloat64(c *viper.Viper, key string, fallback float64) func() float64 { - c = ensure(c) - c.SetDefault(key, fallback) + setDefault(c, key, fallback) return func() float64 { return c.GetFloat64(key) } } func MustGetFloat64(c *viper.Viper, key string) func() float64 { - c = ensure(c) must(c, key) return func() float64 { return c.GetFloat64(key) @@ -154,15 +142,13 @@ func MustGetFloat64(c *viper.Viper, key string) func() float64 { } func GetString(c *viper.Viper, key, fallback string) func() string { - c = ensure(c) - c.SetDefault(key, fallback) + setDefault(c, key, fallback) return func() string { return c.GetString(key) } } func MustGetString(c *viper.Viper, key string) func() string { - c = ensure(c) must(c, key) return func() string { return c.GetString(key) @@ -170,15 +156,13 @@ func MustGetString(c *viper.Viper, key string) func() string { } func GetTime(c *viper.Viper, key string, fallback time.Time) func() time.Time { - c = ensure(c) - c.SetDefault(key, fallback) + setDefault(c, key, fallback) return func() time.Time { return c.GetTime(key) } } func MustGetTime(c *viper.Viper, key string) func() time.Time { - c = ensure(c) must(c, key) return func() time.Time { return c.GetTime(key) @@ -186,15 +170,13 @@ func MustGetTime(c *viper.Viper, key string) func() time.Time { } func GetDuration(c *viper.Viper, key string, fallback time.Duration) func() time.Duration { - c = ensure(c) - c.SetDefault(key, fallback) + setDefault(c, key, fallback) return func() time.Duration { return c.GetDuration(key) } } func MustGetDuration(c *viper.Viper, key string) func() time.Duration { - c = ensure(c) must(c, key) return func() time.Duration { return c.GetDuration(key) @@ -202,15 +184,13 @@ func MustGetDuration(c *viper.Viper, key string) func() time.Duration { } func GetIntSlice(c *viper.Viper, key string, fallback []int) func() []int { - c = ensure(c) - c.SetDefault(key, fallback) + setDefault(c, key, fallback) return func() []int { return c.GetIntSlice(key) } } func MustGetIntSlice(c *viper.Viper, key string) func() []int { - c = ensure(c) must(c, key) return func() []int { return c.GetIntSlice(key) @@ -218,15 +198,13 @@ func MustGetIntSlice(c *viper.Viper, key string) func() []int { } func GetStringSlice(c *viper.Viper, key string, fallback []string) func() []string { - c = ensure(c) - c.SetDefault(key, fallback) + setDefault(c, key, fallback) return func() []string { return c.GetStringSlice(key) } } func MustGetStringSlice(c *viper.Viper, key string) func() []string { - c = ensure(c) must(c, key) return func() []string { return c.GetStringSlice(key) @@ -234,15 +212,13 @@ func MustGetStringSlice(c *viper.Viper, key string) func() []string { } func GetStringMap(c *viper.Viper, key string, fallback map[string]interface{}) func() map[string]interface{} { - c = ensure(c) - c.SetDefault(key, fallback) + setDefault(c, key, fallback) return func() map[string]interface{} { return c.GetStringMap(key) } } func MustGetStringMap(c *viper.Viper, key string) func() map[string]interface{} { - c = ensure(c) must(c, key) return func() map[string]interface{} { return c.GetStringMap(key) @@ -250,15 +226,13 @@ func MustGetStringMap(c *viper.Viper, key string) func() map[string]interface{} } func GetStringMapString(c *viper.Viper, key string, fallback map[string]string) func() map[string]string { - c = ensure(c) - c.SetDefault(key, fallback) + setDefault(c, key, fallback) return func() map[string]string { return c.GetStringMapString(key) } } func MustGetStringMapString(c *viper.Viper, key string) func() map[string]string { - c = ensure(c) must(c, key) return func() map[string]string { return c.GetStringMapString(key) @@ -266,15 +240,13 @@ func MustGetStringMapString(c *viper.Viper, key string) func() map[string]string } func GetStringMapStringSlice(c *viper.Viper, key string, fallback map[string][]string) func() map[string][]string { - c = ensure(c) - c.SetDefault(key, fallback) + setDefault(c, key, fallback) return func() map[string][]string { return c.GetStringMapStringSlice(key) } } func MustGetStringMapStringSlice(c *viper.Viper, key string) func() map[string][]string { - c = ensure(c) must(c, key) return func() map[string][]string { return c.GetStringMapStringSlice(key) @@ -316,6 +288,14 @@ func GetStruct(c *viper.Viper, key string, fallback interface{}) (func(v interfa }, nil } +func RequiredKeys() []string { + return requiredKeys +} + +func Defaults() map[string]interface{} { + return defaults +} + func ensure(c *viper.Viper) *viper.Viper { if c == nil { c = config @@ -324,6 +304,8 @@ func ensure(c *viper.Viper) *viper.Viper { } func must(c *viper.Viper, key string) { + c = ensure(c) + requiredKeys = append(requiredKeys, key) if !c.IsSet(key) { panic(fmt.Sprintf("missing required config key: %s", key)) } @@ -339,3 +321,9 @@ func decode(input, output interface{}) error { } return decoder.Decode(input) } + +func setDefault(c *viper.Viper, key string, fallback any) { + c = ensure(c) + c.SetDefault(key, fallback) + defaults[key] = fallback +} diff --git a/interfaces/documenter.go b/interfaces/documenter.go new file mode 100644 index 0000000..1747c4f --- /dev/null +++ b/interfaces/documenter.go @@ -0,0 +1,6 @@ +package interfaces + +// Documenter interface +type Documenter interface { + Docs() string +} diff --git a/markdown/markdown.go b/markdown/markdown.go new file mode 100644 index 0000000..f84f060 --- /dev/null +++ b/markdown/markdown.go @@ -0,0 +1,38 @@ +package markdown + +import ( + "fmt" + + markdowntable "github.com/fbiville/markdown-table-formatter/pkg/markdown" +) + +type Markdown struct { + value string +} + +func (s *Markdown) Println(a ...any) { + s.value += fmt.Sprintln(a...) +} +func (s *Markdown) Printf(format string, a ...any) { + s.Println(fmt.Sprintf(format, a...)) +} + +func (s *Markdown) Print(a ...any) { + s.value += fmt.Sprint(a...) +} + +func (s *Markdown) String() string { + return s.value +} + +func (s *Markdown) Table(headers []string, rows [][]string) { + table, err := markdowntable.NewTableFormatterBuilder(). + WithAlphabeticalSortIn(markdowntable.ASCENDING_ORDER). + WithPrettyPrint(). + Build(headers...). + Format(rows) + if err != nil { + panic(err) + } + s.Print(table) +} diff --git a/markdown/utils.go b/markdown/utils.go new file mode 100644 index 0000000..f174346 --- /dev/null +++ b/markdown/utils.go @@ -0,0 +1,19 @@ +package markdown + +import ( + "fmt" +) + +func Code(v string) string { + if v == "" { + return "" + } + return "`" + v + "`" +} + +func String(v any) string { + if i, ok := v.(fmt.Stringer); ok { + return i.String() + } + return "" +} diff --git a/option.go b/option.go index 0d634e3..da11e02 100644 --- a/option.go +++ b/option.go @@ -178,3 +178,14 @@ func WithHTTPHealthzService(enabled bool) Option { } } } + +// WithHTTPDocsService option with default value +func WithHTTPDocsService(enabled bool) Option { + return func(inst *Server) { + if config.GetBool(inst.Config(), "service.docs.enabled", enabled)() { + svs := service.NewDefaultHTTPDocs(inst.documenter) + inst.initServices = append(inst.initServices, svs) + inst.AddAlwaysHealthzers(svs) + } + } +} diff --git a/server.go b/server.go index b0cd2fb..b14e629 100644 --- a/server.go +++ b/server.go @@ -1,6 +1,3 @@ -//go:build !docs -// +build !docs - package keel import ( @@ -9,14 +6,19 @@ import ( "net/http" "os" "os/signal" + "reflect" "sync/atomic" "syscall" "time" "github.com/foomo/keel/healthz" "github.com/foomo/keel/interfaces" + "github.com/foomo/keel/markdown" + "github.com/foomo/keel/service" + "github.com/foomo/keel/telemetry/nonrecording" "github.com/go-logr/logr" "github.com/pkg/errors" + "github.com/prometheus/client_golang/prometheus" "github.com/spf13/viper" otelhost "go.opentelemetry.io/contrib/instrumentation/host" otelruntime "go.opentelemetry.io/contrib/instrumentation/runtime" @@ -46,6 +48,7 @@ type Server struct { running atomic.Bool closers []interface{} probes map[healthz.Type][]interface{} + documenter map[string]interfaces.Documenter ctx context.Context ctxCancel context.Context ctxCancelFn context.CancelFunc @@ -60,6 +63,7 @@ func NewServer(opts ...Option) *Server { shutdownTimeout: 30 * time.Second, shutdownSignals: []os.Signal{os.Interrupt, syscall.SIGTERM}, probes: map[healthz.Type][]interface{}{}, + documenter: map[string]interfaces.Documenter{}, ctx: context.Background(), c: config.Config(), l: log.Logger(), @@ -170,6 +174,7 @@ func NewServer(opts ...Option) *Server { // add probe inst.AddAlwaysHealthzers(inst) + inst.AddDocumenter("Server", inst) // start init services inst.startService(inst.initServices...) @@ -263,6 +268,11 @@ func (s *Server) AddClosers(closers ...interface{}) { } } +// AddDocumenter adds a dcoumenter to beadded to the exposed docs +func (s *Server) AddDocumenter(name string, documenter interfaces.Documenter) { + s.documenter[name] = documenter +} + // AddHealthzer adds a probe to be called on healthz checks func (s *Server) AddHealthzer(typ healthz.Type, probe interface{}) { switch probe.(type) { @@ -350,12 +360,204 @@ func (s *Server) Run() { s.l.Info("keel server stopped") } +func (s *Server) Docs() string { + md := &markdown.Markdown{} + + { + var rows [][]string + keys := s.Config().AllKeys() + defaults := config.Defaults() + for _, key := range keys { + var fallback interface{} + if v, ok := defaults[key]; ok { + fallback = v + } + rows = append(rows, []string{ + markdown.Code(key), + "", + markdown.Code(fmt.Sprintf("%v", fallback)), + }) + } + for _, key := range config.RequiredKeys() { + rows = append(rows, []string{ + markdown.Code(key), + markdown.Code("true"), + "", + }) + } + if len(rows) > 0 { + md.Println("## Config") + md.Println("") + md.Println("List of all registered config variabled with their defaults.") + md.Println("") + md.Table([]string{"Key", "Default", "Required"}, rows) + md.Println("") + } + } + + { + var rows [][]string + for _, value := range s.initServices { + if v, ok := value.(*service.HTTP); ok { + t := reflect.TypeOf(v) + rows = append(rows, []string{ + markdown.Code(v.Name()), + markdown.Code(t.String()), + markdown.String(v), + }) + } + } + if len(rows) > 0 { + md.Println("## Init Services") + md.Println("") + md.Println("List of all registered init services that are being immediately started.") + md.Println("") + md.Table([]string{"Name", "Type", "Address"}, rows) + md.Println("") + } + } + + { + var rows [][]string + for _, value := range s.services { + if v, ok := value.(*service.HTTP); ok { + t := reflect.TypeOf(v) + rows = append(rows, []string{ + markdown.Code(v.Name()), + markdown.Code(t.String()), + markdown.String(v), + }) + } + } + if len(rows) > 0 { + md.Println("## Services") + md.Println("") + md.Println("List of all registered services that are being started.") + md.Println("") + md.Table([]string{"Name", "Type", "Description"}, rows) + md.Println("") + } + } + + { + var rows [][]string + for k, probes := range s.probes { + for _, probe := range probes { + t := reflect.TypeOf(probe) + rows = append(rows, []string{ + markdown.Code(k.String()), + markdown.Code(t.String()), + }) + } + } + if len(rows) > 0 { + md.Println("## Health probes") + md.Println("") + md.Println("List of all registered healthz probes that are being called during startup and runntime.") + md.Println("") + md.Table([]string{"Name", "Type"}, rows) + md.Println("") + } + } + + { + var rows [][]string + for _, value := range s.closers { + t := reflect.TypeOf(value) + var closer string + switch value.(type) { + case interfaces.Closer: + closer = "Closer" + case interfaces.ErrorCloser: + closer = "ErrorCloser" + case interfaces.CloserWithContext: + closer = "CloserWithContext" + case interfaces.ErrorCloserWithContext: + closer = "ErrorCloserWithContext" + case interfaces.Shutdowner: + closer = "Shutdowner" + case interfaces.ErrorShutdowner: + closer = "ErrorShutdowner" + case interfaces.ShutdownerWithContext: + closer = "ShutdownerWithContext" + case interfaces.ErrorShutdownerWithContext: + closer = "ErrorShutdownerWithContext" + case interfaces.Stopper: + closer = "Stopper" + case interfaces.ErrorStopper: + closer = "ErrorStopper" + case interfaces.StopperWithContext: + closer = "StopperWithContext" + case interfaces.ErrorStopperWithContext: + closer = "ErrorStopperWithContext" + case interfaces.Unsubscriber: + closer = "Unsubscriber" + case interfaces.ErrorUnsubscriber: + closer = "ErrorUnsubscriber" + case interfaces.UnsubscriberWithContext: + closer = "UnsubscriberWithContext" + case interfaces.ErrorUnsubscriberWithContext: + closer = "ErrorUnsubscriberWithContext" + } + rows = append(rows, []string{ + markdown.Code(t.String()), + markdown.Code(closer), + }) + } + if len(rows) > 0 { + md.Println("## Closers") + md.Println("") + md.Println("List of all registered closers that are being called during graceful shutdown.") + md.Println("") + md.Table([]string{"Name", "Type"}, rows) + md.Println("") + } + } + + { + var rows [][]string + s.meter.AsyncFloat64() + + values := nonrecording.Metrics() + + gatherer, _ := prometheus.DefaultRegisterer.(*prometheus.Registry).Gather() + for _, value := range gatherer { + values = append(values, nonrecording.Metric{ + Name: value.GetName(), + Type: value.GetType().String(), + Help: value.GetHelp(), + }) + } + for _, value := range values { + rows = append(rows, []string{ + markdown.Code(value.Name), + value.Type, + value.Help, + }) + } + if len(rows) > 0 { + md.Println("## Metrics") + md.Println("") + md.Println("List of all registered metrics than are being exposed.") + md.Println("") + md.Table([]string{"Name", "Type", "Description"}, rows) + md.Println("") + } + } + + return md.String() +} + +// ------------------------------------------------------------------------------------------------ +// ~ Private methods +// ------------------------------------------------------------------------------------------------ + // startService starts the given services func (s *Server) startService(services ...Service) { - for _, service := range services { - service := service + for _, value := range services { + value := value s.g.Go(func() error { - if err := service.Start(s.ctx); errors.Is(err, http.ErrServerClosed) { + if err := value.Start(s.ctx); errors.Is(err, http.ErrServerClosed) { log.WithError(s.l, err).Debug("server has closed") } else if err != nil { log.WithError(s.l, err).Error("failed to start service") diff --git a/server_docs.go b/server_docs.go deleted file mode 100644 index 0fba72c..0000000 --- a/server_docs.go +++ /dev/null @@ -1,435 +0,0 @@ -//go:build docs -// +build docs - -package keel - -import ( - "context" - "fmt" - "os" - "reflect" - "sort" - "time" - - markdowntable "github.com/fbiville/markdown-table-formatter/pkg/markdown" - "github.com/foomo/keel/config" - "github.com/foomo/keel/healthz" - "github.com/foomo/keel/interfaces" - "github.com/foomo/keel/log" - "github.com/foomo/keel/service" - "github.com/foomo/keel/telemetry/nonrecording" - "github.com/pkg/errors" - "github.com/prometheus/client_golang/prometheus" - "github.com/spf13/viper" - "go.opentelemetry.io/otel" - "go.opentelemetry.io/otel/metric" - otelglobal "go.opentelemetry.io/otel/metric/global" - "go.opentelemetry.io/otel/trace" - "go.uber.org/zap" -) - -// Server struct -type Server struct { - services []Service - initServices []Service - meter metric.Meter - meterProvider metric.MeterProvider - tracer trace.Tracer - traceProvider trace.TracerProvider - shutdownSignals []os.Signal - shutdownTimeout time.Duration - closers []interface{} - probes map[healthz.Type][]interface{} - ctx context.Context - gCtx context.Context - l *zap.Logger - c *viper.Viper -} - -func NewServer(opts ...Option) *Server { - inst := &Server{ - probes: map[healthz.Type][]interface{}{}, - meterProvider: nonrecording.NewNoopMeterProvider(), - traceProvider: trace.NewNoopTracerProvider(), - ctx: context.Background(), - c: config.Config(), - l: log.Logger(), - } - - inst.meter = inst.meterProvider.Meter("") - otelglobal.SetMeterProvider(inst.meterProvider) - inst.tracer = inst.traceProvider.Tracer("") - otel.SetTracerProvider(inst.traceProvider) - - // add probe - inst.AddAlwaysHealthzers(inst) - - return inst -} - -// Logger returns server logger -func (s *Server) Logger() *zap.Logger { - return s.l -} - -// Meter returns the implementation meter -func (s *Server) Meter() metric.Meter { - return s.meter -} - -// Tracer returns the implementation tracer -func (s *Server) Tracer() trace.Tracer { - return s.tracer -} - -// Config returns server config -func (s *Server) Config() *viper.Viper { - return s.c -} - -// Context returns server context -func (s *Server) Context() context.Context { - return s.ctx -} - -// CancelContext returns server's cancel context -func (s *Server) CancelContext() context.Context { - return s.ctx -} - -// AddService add a single service -func (s *Server) AddService(service Service) { - for _, value := range s.services { - if value == service { - return - } - } - s.services = append(s.services, service) - s.AddAlwaysHealthzers(service) - s.AddCloser(service) -} - -// AddServices adds multiple service -func (s *Server) AddServices(services ...Service) { - for _, service := range services { - s.AddService(service) - } -} - -// AddCloser adds a closer to be called on shutdown -func (s *Server) AddCloser(closer interface{}) { - for _, value := range s.closers { - if value == closer { - return - } - } - switch closer.(type) { - case interfaces.Closer, - interfaces.ErrorCloser, - interfaces.CloserWithContext, - interfaces.ErrorCloserWithContext, - interfaces.Shutdowner, - interfaces.ErrorShutdowner, - interfaces.ShutdownerWithContext, - interfaces.ErrorShutdownerWithContext, - interfaces.Stopper, - interfaces.ErrorStopper, - interfaces.StopperWithContext, - interfaces.ErrorStopperWithContext, - interfaces.Unsubscriber, - interfaces.ErrorUnsubscriber, - interfaces.UnsubscriberWithContext, - interfaces.ErrorUnsubscriberWithContext: - s.closers = append(s.closers, closer) - default: - s.l.Warn("unable to add closer", log.FValue(fmt.Sprintf("%T", closer))) - } -} - -// AddClosers adds the given closers to be called on shutdown -func (s *Server) AddClosers(closers ...interface{}) { - for _, closer := range closers { - s.AddCloser(closer) - } -} - -// AddHealthzer adds a probe to be called on healthz checks -func (s *Server) AddHealthzer(typ healthz.Type, probe interface{}) { - switch probe.(type) { - case healthz.BoolHealthzer, - healthz.BoolHealthzerWithContext, - healthz.ErrorHealthzer, - healthz.ErrorHealthzWithContext, - interfaces.ErrorPinger, - interfaces.ErrorPingerWithContext: - s.probes[typ] = append(s.probes[typ], probe) - default: - s.l.Debug("not a healthz probe", log.FValue(fmt.Sprintf("%T", probe))) - } -} - -// AddHealthzers adds the given probes to be called on healthz checks -func (s *Server) AddHealthzers(typ healthz.Type, probes ...interface{}) { - for _, probe := range probes { - s.AddHealthzer(typ, probe) - } -} - -// AddAlwaysHealthzers adds the probes to be called on any healthz checks -func (s *Server) AddAlwaysHealthzers(probes ...interface{}) { - s.AddHealthzers(healthz.TypeAlways, probes...) -} - -// AddStartupHealthzers adds the startup probes to be called on healthz checks -func (s *Server) AddStartupHealthzers(probes ...interface{}) { - s.AddHealthzers(healthz.TypeStartup, probes...) -} - -// AddLivenessHealthzers adds the liveness probes to be called on healthz checks -func (s *Server) AddLivenessHealthzers(probes ...interface{}) { - s.AddHealthzers(healthz.TypeLiveness, probes...) -} - -// AddReadinessHealthzers adds the readiness probes to be called on healthz checks -func (s *Server) AddReadinessHealthzers(probes ...interface{}) { - s.AddHealthzers(healthz.TypeReadiness, probes...) -} - -// IsCanceled returns true if the internal errgroup has been canceled -func (s *Server) IsCanceled() bool { - return errors.Is(s.gCtx.Err(), context.Canceled) -} - -// Healthz returns true if the server is running -func (s *Server) Healthz() error { - return nil -} - -// Run runs the server -func (s *Server) Run() { - // add init services to closers - for _, initService := range s.initServices { - s.AddClosers(initService) - } - - md := &MD{} - - { - var rows [][]string - for _, key := range s.Config().AllKeys() { - rows = append(rows, []string{ - code(key), - code(s.Config().GetString(key)), - }) - } - if len(rows) > 0 { - md.Println("## Config") - md.Println("") - md.Println("List of all registered config variabled with their defaults.") - md.Println("") - md.Table([]string{"Key", "Default"}, rows) - md.Println("") - } - } - - { - var rows [][]string - for _, value := range s.initServices { - if v, ok := value.(*service.HTTP); ok { - t := reflect.TypeOf(v) - rows = append(rows, []string{ - code(v.Name()), - code(t.String()), - stringer(v), - }) - } - } - if len(rows) > 0 { - md.Println("## Init Services") - md.Println("") - md.Println("List of all registerd init services that are being immediately started.") - md.Println("") - md.Table([]string{"Name", "Type", "Address"}, rows) - md.Println("") - } - } - - { - var rows [][]string - for _, value := range s.services { - if v, ok := value.(*service.HTTP); ok { - t := reflect.TypeOf(v) - rows = append(rows, []string{ - code(v.Name()), - code(t.String()), - stringer(v), - }) - } - } - if len(rows) > 0 { - md.Println("## Services") - md.Println("") - md.Println("List of all registered services that are being started.") - md.Println("") - md.Table([]string{"Name", "Type", "Description"}, rows) - md.Println("") - } - } - - { - var rows [][]string - for k, probes := range s.probes { - for _, probe := range probes { - t := reflect.TypeOf(probe) - rows = append(rows, []string{ - code(k.String()), - code(t.String()), - }) - } - } - if len(rows) > 0 { - md.Println("## Health probes") - md.Println("") - md.Println("List of all registered healthz probes that are being called during startup and runntime.") - md.Println("") - md.Table([]string{"Name", "Type"}, rows) - md.Println("") - } - } - - { - var rows [][]string - for _, value := range s.closers { - t := reflect.TypeOf(value) - var closer string - switch value.(type) { - case interfaces.Closer: - closer = "Closer" - case interfaces.ErrorCloser: - closer = "ErrorCloser" - case interfaces.CloserWithContext: - closer = "CloserWithContext" - case interfaces.ErrorCloserWithContext: - closer = "ErrorCloserWithContext" - case interfaces.Shutdowner: - closer = "Shutdowner" - case interfaces.ErrorShutdowner: - closer = "ErrorShutdowner" - case interfaces.ShutdownerWithContext: - closer = "ShutdownerWithContext" - case interfaces.ErrorShutdownerWithContext: - closer = "ErrorShutdownerWithContext" - case interfaces.Stopper: - closer = "Stopper" - case interfaces.ErrorStopper: - closer = "ErrorStopper" - case interfaces.StopperWithContext: - closer = "StopperWithContext" - case interfaces.ErrorStopperWithContext: - closer = "ErrorStopperWithContext" - case interfaces.Unsubscriber: - closer = "Unsubscriber" - case interfaces.ErrorUnsubscriber: - closer = "ErrorUnsubscriber" - case interfaces.UnsubscriberWithContext: - closer = "UnsubscriberWithContext" - case interfaces.ErrorUnsubscriberWithContext: - closer = "ErrorUnsubscriberWithContext" - } - rows = append(rows, []string{ - code(t.String()), - code(closer), - }) - } - if len(rows) > 0 { - md.Println("## Closers") - md.Println("") - md.Println("List of all registered closers that are being called during graceful shutdown.") - md.Println("") - md.Table([]string{"Name", "Type"}, rows) - md.Println("") - } - } - - { - var rows [][]string - s.meter.AsyncFloat64() - - var names []string - values := map[string]nonrecording.Metric{} - for _, value := range nonrecording.Metrics() { - names = append(names, value.Name) - values[value.Name] = value - } - - gatherer, _ := prometheus.DefaultRegisterer.(*prometheus.Registry).Gather() - for _, value := range gatherer { - names = append(names, value.GetName()) - values[value.GetName()] = nonrecording.Metric{ - Name: value.GetName(), - Type: value.GetType().String(), - Help: value.GetHelp(), - } - } - sort.Strings(names) - for _, name := range names { - value := values[name] - rows = append(rows, []string{ - code(value.Name), - value.Type, - value.Help, - }) - } - if len(rows) > 0 { - md.Println("## Metrics") - md.Println("") - md.Println("List of all registered metrics than are being exposed.") - md.Println("") - md.Table([]string{"Name", "Type", "Description"}, rows) - md.Println("") - } - } - - fmt.Print(md.String()) -} - -type MD struct { - value string -} - -func (s *MD) Println(a ...any) { - s.value += fmt.Sprintln(a...) -} - -func (s *MD) Print(a ...any) { - s.value += fmt.Sprint(a...) -} - -func (s *MD) String() string { - return s.value -} - -func (s *MD) Table(headers []string, rows [][]string) { - table, err := markdowntable.NewTableFormatterBuilder(). - WithPrettyPrint(). - Build(headers...). - Format(rows) - if err != nil { - panic(err) - } - s.Print(table) -} - -func code(v string) string { - if v == "" { - return "" - } - return "`" + v + "`" -} - -func stringer(v any) string { - if i, ok := v.(fmt.Stringer); ok { - return i.String() - } - return "" -} diff --git a/service/httpdocs.go b/service/httpdocs.go new file mode 100644 index 0000000..51390b1 --- /dev/null +++ b/service/httpdocs.go @@ -0,0 +1,49 @@ +package service + +import ( + "net/http" + + "github.com/foomo/keel/interfaces" + "github.com/foomo/keel/markdown" + "go.uber.org/zap" + + "github.com/foomo/keel/log" +) + +const ( + DefaultHTTPDocsName = "docs" + DefaultHTTPDocsAddr = "localhost:9001" + DefaultHTTPDocsPath = "/docs" +) + +func NewHTTPDocs(l *zap.Logger, name, addr, path string, documenters map[string]interfaces.Documenter) *HTTP { + handler := http.NewServeMux() + handler.HandleFunc(path, func(w http.ResponseWriter, r *http.Request) { + l.Info("ping ") + switch r.Method { + case http.MethodGet: + w.WriteHeader(http.StatusOK) + w.Header().Add("Content-Type", "text/markdown") + md := &markdown.Markdown{} + for name, documenter := range documenters { + md.Printf("# %s", name) + md.Println("") + md.Print(documenter.Docs()) + } + _, _ = w.Write([]byte(md.String())) + default: + http.Error(w, http.StatusText(http.StatusMethodNotAllowed), http.StatusMethodNotAllowed) + } + }) + return NewHTTP(l, name, addr, handler) +} + +func NewDefaultHTTPDocs(documenter map[string]interfaces.Documenter) *HTTP { + return NewHTTPDocs( + log.Logger(), + DefaultHTTPDocsName, + DefaultHTTPDocsAddr, + DefaultHTTPDocsPath, + documenter, + ) +} diff --git a/service/httpdocs_test.go b/service/httpdocs_test.go new file mode 100644 index 0000000..c1b243c --- /dev/null +++ b/service/httpdocs_test.go @@ -0,0 +1,113 @@ +package service_test + +import ( + "fmt" + "io" + "net/http" + "os" + "time" + + "github.com/foomo/keel" + "github.com/foomo/keel/config" + "go.uber.org/zap" +) + +func ExampleNewHTTPDocs() { + shutdown(3 * time.Second) + + // define vars so it does not panic + _ = os.Setenv("EXAMPLE_REQUIRED_BOOL", "true") + _ = os.Setenv("EXAMPLE_REQUIRED_STRING", "foo") + + svr := keel.NewServer( + keel.WithLogger(zap.NewExample()), + keel.WithHTTPDocsService(true), + ) + + c := svr.Config() + // config with fallback + _ = config.GetBool(c, "example.bool", false)() + _ = config.GetString(c, "example.string", "fallback")() + // required configs + _ = config.MustGetBool(c, "example.required.bool")() + _ = config.MustGetString(c, "example.required.string")() + + { + resp, _ := http.Get("http://localhost:9001/docs") //nolint:noctx + defer resp.Body.Close() //nolint:govet + b, _ := io.ReadAll(resp.Body) + fmt.Print(string(b)) + } + + svr.Run() + + // Output: + // # Server + // + // ## Config + // + // List of all registered config variabled with their defaults. + // + // | Key | Default | Required | + // | ------------------------- | ------- | ---------- | + // | `example.bool` | | `false` | + // | `example.required.bool` | `true` | | + // | `example.required.string` | `true` | | + // | `example.string` | | `fallback` | + // | `service.docs.enabled` | | `true` | + // + // ## Init Services + // + // List of all registered init services that are being immediately started. + // + // | Name | Type | Address | + // | ------ | --------------- | ------------------------- | + // | `docs` | `*service.HTTP` | address: `localhost:9001` | + // + // ## Health probes + // + // List of all registered healthz probes that are being called during startup and runntime. + // + // | Name | Type | + // | -------- | --------------- | + // | `always` | `*keel.Server` | + // | `always` | `*service.HTTP` | + // + // ## Metrics + // + // List of all registered metrics than are being exposed. + // + // | Name | Type | Description | + // | ---------------------------------- | ------- | ------------------------------------------------------------------ | + // | `go_gc_duration_seconds` | SUMMARY | A summary of the pause duration of garbage collection cycles. | + // | `go_goroutines` | GAUGE | Number of goroutines that currently exist. | + // | `go_info` | GAUGE | Information about the Go environment. | + // | `go_memstats_alloc_bytes_total` | COUNTER | Total number of bytes allocated, even if freed. | + // | `go_memstats_alloc_bytes` | GAUGE | Number of bytes allocated and still in use. | + // | `go_memstats_buck_hash_sys_bytes` | GAUGE | Number of bytes used by the profiling bucket hash table. | + // | `go_memstats_frees_total` | COUNTER | Total number of frees. | + // | `go_memstats_gc_sys_bytes` | GAUGE | Number of bytes used for garbage collection system metadata. | + // | `go_memstats_heap_alloc_bytes` | GAUGE | Number of heap bytes allocated and still in use. | + // | `go_memstats_heap_idle_bytes` | GAUGE | Number of heap bytes waiting to be used. | + // | `go_memstats_heap_inuse_bytes` | GAUGE | Number of heap bytes that are in use. | + // | `go_memstats_heap_objects` | GAUGE | Number of allocated objects. | + // | `go_memstats_heap_released_bytes` | GAUGE | Number of heap bytes released to OS. | + // | `go_memstats_heap_sys_bytes` | GAUGE | Number of heap bytes obtained from system. | + // | `go_memstats_last_gc_time_seconds` | GAUGE | Number of seconds since 1970 of last garbage collection. | + // | `go_memstats_lookups_total` | COUNTER | Total number of pointer lookups. | + // | `go_memstats_mallocs_total` | COUNTER | Total number of mallocs. | + // | `go_memstats_mcache_inuse_bytes` | GAUGE | Number of bytes in use by mcache structures. | + // | `go_memstats_mcache_sys_bytes` | GAUGE | Number of bytes used for mcache structures obtained from system. | + // | `go_memstats_mspan_inuse_bytes` | GAUGE | Number of bytes in use by mspan structures. | + // | `go_memstats_mspan_sys_bytes` | GAUGE | Number of bytes used for mspan structures obtained from system. | + // | `go_memstats_next_gc_bytes` | GAUGE | Number of heap bytes when next garbage collection will take place. | + // | `go_memstats_other_sys_bytes` | GAUGE | Number of bytes used for other system allocations. | + // | `go_memstats_stack_inuse_bytes` | GAUGE | Number of bytes in use by the stack allocator. | + // | `go_memstats_stack_sys_bytes` | GAUGE | Number of bytes obtained from system for stack allocator. | + // | `go_memstats_sys_bytes` | GAUGE | Number of bytes obtained from system. | + // | `go_threads` | GAUGE | Number of OS threads created. | + // + // {"level":"info","msg":"starting keel server"} + // {"level":"debug","msg":"keel graceful shutdown"} + // {"level":"info","msg":"keel server stopped"} +} From 4aaeb5cce0fc3b6f888733a232a78e859f3c5228 Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Fri, 8 Sep 2023 17:14:48 +0200 Subject: [PATCH 070/134] feat: extend docs --- option.go | 12 ++++---- server.go | 26 ++++++++++------ service/goroutine.go | 24 ++++++++++----- service/goroutine_test.go | 2 +- service/helper_test.go | 10 +++++-- service/http.go | 2 +- service/http_test.go | 24 ++++++++------- service/httpdocs.go | 7 ++--- service/httpdocs_test.go | 62 ++++++++++++++++++++++++++++----------- service/httphealthz.go | 4 +-- service/httppprof.go | 5 ++-- service/httpprometheus.go | 6 ++-- service/httpviper.go | 5 ++-- service/httpzap.go | 4 +-- 14 files changed, 121 insertions(+), 72 deletions(-) diff --git a/option.go b/option.go index da11e02..9a4e002 100644 --- a/option.go +++ b/option.go @@ -73,7 +73,7 @@ func WithShutdownTimeout(shutdownTimeout time.Duration) Option { func WithHTTPZapService(enabled bool) Option { return func(inst *Server) { if config.GetBool(inst.Config(), "service.zap.enabled", enabled)() { - svs := service.NewDefaultHTTPZap() + svs := service.NewDefaultHTTPZap(inst.Logger()) inst.initServices = append(inst.initServices, svs) inst.AddAlwaysHealthzers(svs) } @@ -84,7 +84,7 @@ func WithHTTPZapService(enabled bool) Option { func WithHTTPViperService(enabled bool) Option { return func(inst *Server) { if config.GetBool(inst.Config(), "service.viper.enabled", enabled)() { - svs := service.NewDefaultHTTPViper() + svs := service.NewDefaultHTTPViper(inst.Logger()) inst.initServices = append(inst.initServices, svs) inst.AddAlwaysHealthzers(svs) } @@ -150,7 +150,7 @@ func WithPrometheusMeter(enabled bool) Option { func WithHTTPPrometheusService(enabled bool) Option { return func(inst *Server) { if config.GetBool(inst.Config(), "service.prometheus.enabled", enabled)() { - svs := service.NewDefaultHTTPPrometheus() + svs := service.NewDefaultHTTPPrometheus(inst.Logger()) inst.initServices = append(inst.initServices, svs) inst.AddAlwaysHealthzers(svs) } @@ -161,7 +161,7 @@ func WithHTTPPrometheusService(enabled bool) Option { func WithHTTPPProfService(enabled bool) Option { return func(inst *Server) { if config.GetBool(inst.Config(), "service.pprof.enabled", enabled)() { - svs := service.NewDefaultHTTPPProf() + svs := service.NewDefaultHTTPPProf(inst.Logger()) inst.initServices = append(inst.initServices, svs) inst.AddAlwaysHealthzers(svs) } @@ -172,7 +172,7 @@ func WithHTTPPProfService(enabled bool) Option { func WithHTTPHealthzService(enabled bool) Option { return func(inst *Server) { if config.GetBool(inst.Config(), "service.healthz.enabled", enabled)() { - svs := service.NewDefaultHTTPProbes(inst.probes) + svs := service.NewDefaultHTTPProbes(inst.Logger(), inst.probes) inst.initServices = append(inst.initServices, svs) inst.AddAlwaysHealthzers(svs) } @@ -183,7 +183,7 @@ func WithHTTPHealthzService(enabled bool) Option { func WithHTTPDocsService(enabled bool) Option { return func(inst *Server) { if config.GetBool(inst.Config(), "service.docs.enabled", enabled)() { - svs := service.NewDefaultHTTPDocs(inst.documenter) + svs := service.NewDefaultHTTPDocs(inst.Logger(), inst.documenter) inst.initServices = append(inst.initServices, svs) inst.AddAlwaysHealthzers(svs) } diff --git a/server.go b/server.go index b14e629..8e78b74 100644 --- a/server.go +++ b/server.go @@ -7,6 +7,7 @@ import ( "os" "os/signal" "reflect" + "sync" "sync/atomic" "syscall" "time" @@ -47,6 +48,7 @@ type Server struct { shutdownTimeout time.Duration running atomic.Bool closers []interface{} + closersLock sync.Mutex probes map[healthz.Type][]interface{} documenter map[string]interfaces.Documenter ctx context.Context @@ -87,6 +89,8 @@ func NewServer(opts ...Option) *Server { defer timeoutCancel() // append internal closers + inst.closersLock.Lock() + defer inst.closersLock.Unlock() closers := append(inst.closers, inst.traceProvider, inst.meterProvider) //nolint:gocritic for _, closer := range closers { @@ -233,6 +237,8 @@ func (s *Server) AddServices(services ...Service) { // AddCloser adds a closer to be called on shutdown func (s *Server) AddCloser(closer interface{}) { + s.closersLock.Lock() + defer s.closersLock.Unlock() for _, value := range s.closers { if value == closer { return @@ -360,6 +366,7 @@ func (s *Server) Run() { s.l.Info("keel server stopped") } +// Docs returns the self-documenting string func (s *Server) Docs() string { md := &markdown.Markdown{} @@ -420,14 +427,12 @@ func (s *Server) Docs() string { { var rows [][]string for _, value := range s.services { - if v, ok := value.(*service.HTTP); ok { - t := reflect.TypeOf(v) - rows = append(rows, []string{ - markdown.Code(v.Name()), - markdown.Code(t.String()), - markdown.String(v), - }) - } + t := reflect.TypeOf(value) + rows = append(rows, []string{ + markdown.Code(value.Name()), + markdown.Code(t.String()), + markdown.String(value), + }) } if len(rows) > 0 { md.Println("## Services") @@ -447,6 +452,7 @@ func (s *Server) Docs() string { rows = append(rows, []string{ markdown.Code(k.String()), markdown.Code(t.String()), + markdown.String(probe), }) } } @@ -455,13 +461,15 @@ func (s *Server) Docs() string { md.Println("") md.Println("List of all registered healthz probes that are being called during startup and runntime.") md.Println("") - md.Table([]string{"Name", "Type"}, rows) + md.Table([]string{"Name", "Type", "Description"}, rows) md.Println("") } } { var rows [][]string + s.closersLock.Lock() + defer s.closersLock.Unlock() for _, value := range s.closers { t := reflect.TypeOf(value) var closer string diff --git a/service/goroutine.go b/service/goroutine.go index b4c9b78..74c625e 100644 --- a/service/goroutine.go +++ b/service/goroutine.go @@ -3,6 +3,7 @@ package service import ( "context" "fmt" + "sync" "sync/atomic" "go.uber.org/zap" @@ -14,13 +15,14 @@ import ( // GoRoutine struct type ( GoRoutine struct { - running atomic.Bool - handler GoRoutineFn - cancel context.CancelCauseFunc - parallel int - name string - wg errgroup.Group - l *zap.Logger + running atomic.Bool + handler GoRoutineFn + cancel context.CancelCauseFunc + cancelLock sync.Mutex + parallel int + name string + wg errgroup.Group + l *zap.Logger } GoRoutineOption func(*GoRoutine) GoRoutineFn func(ctx context.Context, l *zap.Logger) error @@ -76,7 +78,9 @@ func (s *GoRoutine) String() string { func (s *GoRoutine) Start(ctx context.Context) error { s.l.Info("starting keel service") ctx, cancel := context.WithCancelCause(ctx) + s.cancelLock.Lock() s.cancel = cancel + s.cancelLock.Unlock() for i := 0; i < s.parallel; i++ { i := i l := log.WithAttributes(s.l, log.KeelServiceInstKey.Int(i)) @@ -84,11 +88,17 @@ func (s *GoRoutine) Start(ctx context.Context) error { return s.handler(ctx, l) }) } + s.running.Store(true) + defer func() { + s.running.Store(false) + }() return s.wg.Wait() } func (s *GoRoutine) Close(ctx context.Context) error { s.l.Info("stopping keel service") + s.cancelLock.Lock() s.cancel(ErrServiceShutdown) + s.cancelLock.Unlock() return s.wg.Wait() } diff --git a/service/goroutine_test.go b/service/goroutine_test.go index 29df2f9..339b9c4 100644 --- a/service/goroutine_test.go +++ b/service/goroutine_test.go @@ -11,7 +11,7 @@ import ( ) func ExampleNewGoRoutine() { - shutdown(3 * time.Second) + shutdownAfter(3 * time.Second) svr := keel.NewServer( keel.WithLogger(zap.NewExample()), diff --git a/service/helper_test.go b/service/helper_test.go index 5e93805..af3aaf4 100644 --- a/service/helper_test.go +++ b/service/helper_test.go @@ -6,9 +6,15 @@ import ( ) // shutdown example after the given time -func shutdown(duration time.Duration) { +func shutdownAfter(duration time.Duration) { go func() { time.Sleep(duration) - _ = syscall.Kill(syscall.Getpid(), syscall.SIGINT) + shutdown() }() } + +func shutdown() { + if err := syscall.Kill(syscall.Getpid(), syscall.SIGINT); err != nil { + panic(err) + } +} diff --git a/service/http.go b/service/http.go index 62f6fe5..e955f6e 100644 --- a/service/http.go +++ b/service/http.go @@ -56,7 +56,7 @@ func (s *HTTP) Healthz() error { } func (s *HTTP) String() string { - return fmt.Sprintf("address: `%s`", s.server.Addr) + return fmt.Sprintf("`%T` on `%s`", s.server.Handler, s.server.Addr) } func (s *HTTP) Start(ctx context.Context) error { diff --git a/service/http_test.go b/service/http_test.go index 9f7e01c..8146d33 100644 --- a/service/http_test.go +++ b/service/http_test.go @@ -1,8 +1,8 @@ package service_test import ( + "io" "net/http" - "time" "github.com/foomo/keel" "github.com/foomo/keel/service" @@ -10,29 +10,33 @@ import ( ) func ExampleNewHTTP() { - shutdown(3 * time.Second) - svr := keel.NewServer( keel.WithLogger(zap.NewExample()), ) l := svr.Logger() - // create demo service - svs := http.NewServeMux() - svs.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { - w.WriteHeader(http.StatusOK) - _, _ = w.Write([]byte("OK")) - }) svr.AddService( - service.NewHTTP(l, "demo", "localhost:8080", svs), + service.NewHTTP(l, "demo", "localhost:8080", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusOK) + _, _ = w.Write([]byte("OK")) + })), ) + go func() { + resp, _ := http.Get("http://localhost:8080") //nolint:noctx + defer resp.Body.Close() //nolint:govet + b, _ := io.ReadAll(resp.Body) + l.Info(string(b)) + shutdown() + }() + svr.Run() // Output: // {"level":"info","msg":"starting keel server"} // {"level":"info","msg":"starting keel service","keel_service_type":"http","keel_service_name":"demo","net_host_ip":"localhost","net_host_port":"8080"} + // {"level":"info","msg":"OK"} // {"level":"debug","msg":"keel graceful shutdown"} // {"level":"info","msg":"stopping keel service","keel_service_type":"http","keel_service_name":"demo"} // {"level":"info","msg":"keel server stopped"} diff --git a/service/httpdocs.go b/service/httpdocs.go index 51390b1..2024bec 100644 --- a/service/httpdocs.go +++ b/service/httpdocs.go @@ -6,8 +6,6 @@ import ( "github.com/foomo/keel/interfaces" "github.com/foomo/keel/markdown" "go.uber.org/zap" - - "github.com/foomo/keel/log" ) const ( @@ -19,7 +17,6 @@ const ( func NewHTTPDocs(l *zap.Logger, name, addr, path string, documenters map[string]interfaces.Documenter) *HTTP { handler := http.NewServeMux() handler.HandleFunc(path, func(w http.ResponseWriter, r *http.Request) { - l.Info("ping ") switch r.Method { case http.MethodGet: w.WriteHeader(http.StatusOK) @@ -38,9 +35,9 @@ func NewHTTPDocs(l *zap.Logger, name, addr, path string, documenters map[string] return NewHTTP(l, name, addr, handler) } -func NewDefaultHTTPDocs(documenter map[string]interfaces.Documenter) *HTTP { +func NewDefaultHTTPDocs(l *zap.Logger, documenter map[string]interfaces.Documenter) *HTTP { return NewHTTPDocs( - log.Logger(), + l, DefaultHTTPDocsName, DefaultHTTPDocsAddr, DefaultHTTPDocsPath, diff --git a/service/httpdocs_test.go b/service/httpdocs_test.go index c1b243c..5d619ac 100644 --- a/service/httpdocs_test.go +++ b/service/httpdocs_test.go @@ -1,29 +1,30 @@ package service_test import ( + "context" "fmt" "io" "net/http" "os" - "time" "github.com/foomo/keel" "github.com/foomo/keel/config" + "github.com/foomo/keel/service" "go.uber.org/zap" ) func ExampleNewHTTPDocs() { - shutdown(3 * time.Second) - // define vars so it does not panic _ = os.Setenv("EXAMPLE_REQUIRED_BOOL", "true") _ = os.Setenv("EXAMPLE_REQUIRED_STRING", "foo") svr := keel.NewServer( - keel.WithLogger(zap.NewExample()), + keel.WithLogger(zap.NewNop()), keel.WithHTTPDocsService(true), ) + l := svr.Logger() + c := svr.Config() // config with fallback _ = config.GetBool(c, "example.bool", false)() @@ -32,12 +33,22 @@ func ExampleNewHTTPDocs() { _ = config.MustGetBool(c, "example.required.bool")() _ = config.MustGetString(c, "example.required.string")() - { + svr.AddService(service.NewHTTP(l, "demp-http", "localhost:8080", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusOK) + _, _ = w.Write([]byte("OK")) + }))) + + svr.AddService(service.NewGoRoutine(l, "demo-goroutine", func(ctx context.Context, l *zap.Logger) error { + return nil + })) + + go func() { resp, _ := http.Get("http://localhost:9001/docs") //nolint:noctx defer resp.Body.Close() //nolint:govet b, _ := io.ReadAll(resp.Body) fmt.Print(string(b)) - } + shutdown() + }() svr.Run() @@ -60,18 +71,39 @@ func ExampleNewHTTPDocs() { // // List of all registered init services that are being immediately started. // - // | Name | Type | Address | - // | ------ | --------------- | ------------------------- | - // | `docs` | `*service.HTTP` | address: `localhost:9001` | + // | Name | Type | Address | + // | ------ | --------------- | ------------------------------------ | + // | `docs` | `*service.HTTP` | `*http.ServeMux` on `localhost:9001` | + // + // ## Services + // + // List of all registered services that are being started. + // + // | Name | Type | Description | + // | ---------------- | -------------------- | -------------------------------------- | + // | `demo-goroutine` | `*service.GoRoutine` | parallel: `1` | + // | `demp-http` | `*service.HTTP` | `http.HandlerFunc` on `localhost:8080` | // // ## Health probes // // List of all registered healthz probes that are being called during startup and runntime. // - // | Name | Type | - // | -------- | --------------- | - // | `always` | `*keel.Server` | - // | `always` | `*service.HTTP` | + // | Name | Type | Description | + // | -------- | -------------------- | -------------------------------------- | + // | `always` | `*keel.Server` | | + // | `always` | `*service.GoRoutine` | parallel: `1` | + // | `always` | `*service.HTTP` | `*http.ServeMux` on `localhost:9001` | + // | `always` | `*service.HTTP` | `http.HandlerFunc` on `localhost:8080` | + // + // ## Closers + // + // List of all registered closers that are being called during graceful shutdown. + // + // | Name | Type | + // | -------------------- | ------------------------ | + // | `*service.GoRoutine` | `ErrorCloserWithContext` | + // | `*service.HTTP` | `ErrorCloserWithContext` | + // | `*service.HTTP` | `ErrorCloserWithContext` | // // ## Metrics // @@ -106,8 +138,4 @@ func ExampleNewHTTPDocs() { // | `go_memstats_stack_sys_bytes` | GAUGE | Number of bytes obtained from system for stack allocator. | // | `go_memstats_sys_bytes` | GAUGE | Number of bytes obtained from system. | // | `go_threads` | GAUGE | Number of OS threads created. | - // - // {"level":"info","msg":"starting keel server"} - // {"level":"debug","msg":"keel graceful shutdown"} - // {"level":"info","msg":"keel server stopped"} } diff --git a/service/httphealthz.go b/service/httphealthz.go index 6b3629e..09c5606 100644 --- a/service/httphealthz.go +++ b/service/httphealthz.go @@ -139,9 +139,9 @@ func NewHealthz(l *zap.Logger, name, addr, path string, probes map[healthz.Type] return NewHTTP(l, name, addr, handler) } -func NewDefaultHTTPProbes(probes map[healthz.Type][]interface{}) *HTTP { +func NewDefaultHTTPProbes(l *zap.Logger, probes map[healthz.Type][]interface{}) *HTTP { return NewHealthz( - log.Logger(), + l, DefaultHTTPHealthzName, DefaultHTTPHealthzAddr, DefaultHTTPHealthzPath, diff --git a/service/httppprof.go b/service/httppprof.go index 7855d96..2ff264f 100644 --- a/service/httppprof.go +++ b/service/httppprof.go @@ -5,7 +5,6 @@ package service import ( "net/http" - "github.com/foomo/keel/log" "go.uber.org/zap" ) @@ -29,9 +28,9 @@ func NewHTTPPProf(l *zap.Logger, name, addr, path string) *HTTP { return NewHTTP(l, name, addr, handler) } -func NewDefaultHTTPPProf() *HTTP { +func NewDefaultHTTPPProf(l *zap.Logger) *HTTP { return NewHTTPPProf( - log.Logger(), + l, DefaultHTTPPProfName, DefaultHTTPPProfAddr, DefaultHTTPPProfPath, diff --git a/service/httpprometheus.go b/service/httpprometheus.go index 94be252..53000b5 100644 --- a/service/httpprometheus.go +++ b/service/httpprometheus.go @@ -6,8 +6,6 @@ import ( "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" "go.uber.org/zap" - - "github.com/foomo/keel/log" ) const ( @@ -27,9 +25,9 @@ func NewHTTPPrometheus(l *zap.Logger, name, addr, path string) *HTTP { return NewHTTP(l, name, addr, handler) } -func NewDefaultHTTPPrometheus() *HTTP { +func NewDefaultHTTPPrometheus(l *zap.Logger) *HTTP { return NewHTTPPrometheus( - log.Logger(), + l, DefaultHTTPPrometheusName, DefaultHTTPPrometheusAddr, DefaultHTTPPrometheusPath, diff --git a/service/httpviper.go b/service/httpviper.go index 47639d0..3959371 100644 --- a/service/httpviper.go +++ b/service/httpviper.go @@ -8,7 +8,6 @@ import ( "go.uber.org/zap" "github.com/foomo/keel/config" - "github.com/foomo/keel/log" ) const ( @@ -47,9 +46,9 @@ func NewHTTPViper(l *zap.Logger, c *viper.Viper, name, addr, path string) *HTTP return NewHTTP(l, name, addr, handler) } -func NewDefaultHTTPViper() *HTTP { +func NewDefaultHTTPViper(l *zap.Logger) *HTTP { return NewHTTPViper( - log.Logger(), + l, config.Config(), DefaultHTTPViperName, DefaultHTTPViperAddr, diff --git a/service/httpzap.go b/service/httpzap.go index 4969682..f3caca2 100644 --- a/service/httpzap.go +++ b/service/httpzap.go @@ -94,9 +94,9 @@ func NewHTTPZap(l *zap.Logger, name, addr, path string) *HTTP { return NewHTTP(l, name, addr, handler) } -func NewDefaultHTTPZap() *HTTP { +func NewDefaultHTTPZap(l *zap.Logger) *HTTP { return NewHTTPZap( - log.Logger(), + l, DefaultHTTPZapName, DefaultHTTPZapAddr, DefaultHTTPZapPath, From 06a78a9e59ba7cbc165a6f13ad79a6f0a5419d8c Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Fri, 8 Sep 2023 17:34:52 +0200 Subject: [PATCH 071/134] feat: add config types --- config/config.go | 82 +++++++++++++++++++++++----------------- server.go | 18 +++++---- service/httpdocs.go | 2 +- service/httpdocs_test.go | 36 +++++++++--------- 4 files changed, 77 insertions(+), 61 deletions(-) diff --git a/config/config.go b/config/config.go index 8444bfc..195d670 100644 --- a/config/config.go +++ b/config/config.go @@ -14,6 +14,7 @@ var ( config *viper.Viper requiredKeys []string defaults = map[string]interface{}{} + types = map[string]string{} ) // Init sets up the configuration @@ -30,224 +31,224 @@ func Config() *viper.Viper { } func GetBool(c *viper.Viper, key string, fallback bool) func() bool { - setDefault(c, key, fallback) + setDefault(c, key, "bool", fallback) return func() bool { return c.GetBool(key) } } func MustGetBool(c *viper.Viper, key string) func() bool { - must(c, key) + must(c, key, "bool") return func() bool { return c.GetBool(key) } } func GetInt(c *viper.Viper, key string, fallback int) func() int { - c.SetDefault(key, fallback) + setDefault(c, key, "int", fallback) return func() int { return c.GetInt(key) } } func MustGetInt(c *viper.Viper, key string) func() int { - must(c, key) + must(c, key, "int") return func() int { return c.GetInt(key) } } func GetInt32(c *viper.Viper, key string, fallback int32) func() int32 { - setDefault(c, key, fallback) + setDefault(c, key, "int32", fallback) return func() int32 { return c.GetInt32(key) } } func MustGetInt32(c *viper.Viper, key string) func() int32 { - must(c, key) + must(c, key, "int32") return func() int32 { return c.GetInt32(key) } } func GetInt64(c *viper.Viper, key string, fallback int64) func() int64 { - setDefault(c, key, fallback) + setDefault(c, key, "int64", fallback) return func() int64 { return c.GetInt64(key) } } func MustGetInt64(c *viper.Viper, key string) func() int64 { - must(c, key) + must(c, key, "int64") return func() int64 { return c.GetInt64(key) } } func GetUint(c *viper.Viper, key string, fallback uint) func() uint { - setDefault(c, key, fallback) + setDefault(c, key, "uint", fallback) return func() uint { return c.GetUint(key) } } func MustGetUint(c *viper.Viper, key string) func() uint { - must(c, key) + must(c, key, "uint") return func() uint { return c.GetUint(key) } } func GetUint32(c *viper.Viper, key string, fallback uint32) func() uint32 { - setDefault(c, key, fallback) + setDefault(c, key, "uint32", fallback) return func() uint32 { return c.GetUint32(key) } } func MustGetUint32(c *viper.Viper, key string) func() uint32 { - must(c, key) + must(c, key, "uint32") return func() uint32 { return c.GetUint32(key) } } func GetUint64(c *viper.Viper, key string, fallback uint64) func() uint64 { - setDefault(c, key, fallback) + setDefault(c, key, "uint64", fallback) return func() uint64 { return c.GetUint64(key) } } func MustGetUint64(c *viper.Viper, key string) func() uint64 { - must(c, key) + must(c, key, "uint64") return func() uint64 { return c.GetUint64(key) } } func GetFloat64(c *viper.Viper, key string, fallback float64) func() float64 { - setDefault(c, key, fallback) + setDefault(c, key, "float64", fallback) return func() float64 { return c.GetFloat64(key) } } func MustGetFloat64(c *viper.Viper, key string) func() float64 { - must(c, key) + must(c, key, "float64") return func() float64 { return c.GetFloat64(key) } } func GetString(c *viper.Viper, key, fallback string) func() string { - setDefault(c, key, fallback) + setDefault(c, key, "string", fallback) return func() string { return c.GetString(key) } } func MustGetString(c *viper.Viper, key string) func() string { - must(c, key) + must(c, key, "string") return func() string { return c.GetString(key) } } func GetTime(c *viper.Viper, key string, fallback time.Time) func() time.Time { - setDefault(c, key, fallback) + setDefault(c, key, "time.Time", fallback) return func() time.Time { return c.GetTime(key) } } func MustGetTime(c *viper.Viper, key string) func() time.Time { - must(c, key) + must(c, key, "time.Time") return func() time.Time { return c.GetTime(key) } } func GetDuration(c *viper.Viper, key string, fallback time.Duration) func() time.Duration { - setDefault(c, key, fallback) + setDefault(c, key, "time.Duration", fallback) return func() time.Duration { return c.GetDuration(key) } } func MustGetDuration(c *viper.Viper, key string) func() time.Duration { - must(c, key) + must(c, key, "time.Duration") return func() time.Duration { return c.GetDuration(key) } } func GetIntSlice(c *viper.Viper, key string, fallback []int) func() []int { - setDefault(c, key, fallback) + setDefault(c, key, "[]int", fallback) return func() []int { return c.GetIntSlice(key) } } func MustGetIntSlice(c *viper.Viper, key string) func() []int { - must(c, key) + must(c, key, "[]int") return func() []int { return c.GetIntSlice(key) } } func GetStringSlice(c *viper.Viper, key string, fallback []string) func() []string { - setDefault(c, key, fallback) + setDefault(c, key, "[]string", fallback) return func() []string { return c.GetStringSlice(key) } } func MustGetStringSlice(c *viper.Viper, key string) func() []string { - must(c, key) + must(c, key, "[]string") return func() []string { return c.GetStringSlice(key) } } func GetStringMap(c *viper.Viper, key string, fallback map[string]interface{}) func() map[string]interface{} { - setDefault(c, key, fallback) + setDefault(c, key, "map[string]interface{}", fallback) return func() map[string]interface{} { return c.GetStringMap(key) } } func MustGetStringMap(c *viper.Viper, key string) func() map[string]interface{} { - must(c, key) + must(c, key, "map[string]interface{}") return func() map[string]interface{} { return c.GetStringMap(key) } } func GetStringMapString(c *viper.Viper, key string, fallback map[string]string) func() map[string]string { - setDefault(c, key, fallback) + setDefault(c, key, "map[string]string", fallback) return func() map[string]string { return c.GetStringMapString(key) } } func MustGetStringMapString(c *viper.Viper, key string) func() map[string]string { - must(c, key) + must(c, key, "map[string]string") return func() map[string]string { return c.GetStringMapString(key) } } func GetStringMapStringSlice(c *viper.Viper, key string, fallback map[string][]string) func() map[string][]string { - setDefault(c, key, fallback) + setDefault(c, key, "map[string][]string", fallback) return func() map[string][]string { return c.GetStringMapStringSlice(key) } } func MustGetStringMapStringSlice(c *viper.Viper, key string) func() map[string][]string { - must(c, key) + must(c, key, "map[string][]string") return func() map[string][]string { return c.GetStringMapStringSlice(key) } @@ -296,6 +297,17 @@ func Defaults() map[string]interface{} { return defaults } +func Types() map[string]string { + return types +} + +func TypeOf(key string) string { + if v, ok := types[key]; ok { + return v + } + return "" +} + func ensure(c *viper.Viper) *viper.Viper { if c == nil { c = config @@ -303,8 +315,9 @@ func ensure(c *viper.Viper) *viper.Viper { return c } -func must(c *viper.Viper, key string) { +func must(c *viper.Viper, key, typeof string) { c = ensure(c) + types[key] = typeof requiredKeys = append(requiredKeys, key) if !c.IsSet(key) { panic(fmt.Sprintf("missing required config key: %s", key)) @@ -322,8 +335,9 @@ func decode(input, output interface{}) error { return decoder.Decode(input) } -func setDefault(c *viper.Viper, key string, fallback any) { +func setDefault(c *viper.Viper, key, typeof string, fallback any) { c = ensure(c) c.SetDefault(key, fallback) defaults[key] = fallback + types[key] = typeof } diff --git a/server.go b/server.go index 8e78b74..896ef30 100644 --- a/server.go +++ b/server.go @@ -178,7 +178,7 @@ func NewServer(opts ...Option) *Server { // add probe inst.AddAlwaysHealthzers(inst) - inst.AddDocumenter("Server", inst) + inst.AddDocumenter("Keel Server", inst) // start init services inst.startService(inst.initServices...) @@ -381,6 +381,7 @@ func (s *Server) Docs() string { } rows = append(rows, []string{ markdown.Code(key), + markdown.Code(config.TypeOf(key)), "", markdown.Code(fmt.Sprintf("%v", fallback)), }) @@ -388,16 +389,17 @@ func (s *Server) Docs() string { for _, key := range config.RequiredKeys() { rows = append(rows, []string{ markdown.Code(key), + markdown.Code(config.TypeOf(key)), markdown.Code("true"), "", }) } if len(rows) > 0 { - md.Println("## Config") + md.Println("### Config") md.Println("") md.Println("List of all registered config variabled with their defaults.") md.Println("") - md.Table([]string{"Key", "Default", "Required"}, rows) + md.Table([]string{"Key", "Type", "Required", "Default"}, rows) md.Println("") } } @@ -415,7 +417,7 @@ func (s *Server) Docs() string { } } if len(rows) > 0 { - md.Println("## Init Services") + md.Println("### Init Services") md.Println("") md.Println("List of all registered init services that are being immediately started.") md.Println("") @@ -435,7 +437,7 @@ func (s *Server) Docs() string { }) } if len(rows) > 0 { - md.Println("## Services") + md.Println("### Services") md.Println("") md.Println("List of all registered services that are being started.") md.Println("") @@ -457,7 +459,7 @@ func (s *Server) Docs() string { } } if len(rows) > 0 { - md.Println("## Health probes") + md.Println("### Health probes") md.Println("") md.Println("List of all registered healthz probes that are being called during startup and runntime.") md.Println("") @@ -513,7 +515,7 @@ func (s *Server) Docs() string { }) } if len(rows) > 0 { - md.Println("## Closers") + md.Println("### Closers") md.Println("") md.Println("List of all registered closers that are being called during graceful shutdown.") md.Println("") @@ -544,7 +546,7 @@ func (s *Server) Docs() string { }) } if len(rows) > 0 { - md.Println("## Metrics") + md.Println("### Metrics") md.Println("") md.Println("List of all registered metrics than are being exposed.") md.Println("") diff --git a/service/httpdocs.go b/service/httpdocs.go index 2024bec..44892d3 100644 --- a/service/httpdocs.go +++ b/service/httpdocs.go @@ -23,7 +23,7 @@ func NewHTTPDocs(l *zap.Logger, name, addr, path string, documenters map[string] w.Header().Add("Content-Type", "text/markdown") md := &markdown.Markdown{} for name, documenter := range documenters { - md.Printf("# %s", name) + md.Printf("## %s", name) md.Println("") md.Print(documenter.Docs()) } diff --git a/service/httpdocs_test.go b/service/httpdocs_test.go index 5d619ac..89cf4dc 100644 --- a/service/httpdocs_test.go +++ b/service/httpdocs_test.go @@ -27,11 +27,11 @@ func ExampleNewHTTPDocs() { c := svr.Config() // config with fallback - _ = config.GetBool(c, "example.bool", false)() - _ = config.GetString(c, "example.string", "fallback")() + _ = config.GetBool(c, "example.bool", false) + _ = config.GetString(c, "example.string", "fallback") // required configs - _ = config.MustGetBool(c, "example.required.bool")() - _ = config.MustGetString(c, "example.required.string")() + _ = config.MustGetBool(c, "example.required.bool") + _ = config.MustGetString(c, "example.required.string") svr.AddService(service.NewHTTP(l, "demp-http", "localhost:8080", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) @@ -53,21 +53,21 @@ func ExampleNewHTTPDocs() { svr.Run() // Output: - // # Server + // ## Keel Server // - // ## Config + // ### Config // // List of all registered config variabled with their defaults. // - // | Key | Default | Required | - // | ------------------------- | ------- | ---------- | - // | `example.bool` | | `false` | - // | `example.required.bool` | `true` | | - // | `example.required.string` | `true` | | - // | `example.string` | | `fallback` | - // | `service.docs.enabled` | | `true` | + // | Key | Type | Required | Default | + // | ------------------------- | -------- | -------- | ---------- | + // | `example.bool` | `bool` | | `false` | + // | `example.required.bool` | `bool` | `true` | | + // | `example.required.string` | `string` | `true` | | + // | `example.string` | `string` | | `fallback` | + // | `service.docs.enabled` | `bool` | | `true` | // - // ## Init Services + // ### Init Services // // List of all registered init services that are being immediately started. // @@ -75,7 +75,7 @@ func ExampleNewHTTPDocs() { // | ------ | --------------- | ------------------------------------ | // | `docs` | `*service.HTTP` | `*http.ServeMux` on `localhost:9001` | // - // ## Services + // ### Services // // List of all registered services that are being started. // @@ -84,7 +84,7 @@ func ExampleNewHTTPDocs() { // | `demo-goroutine` | `*service.GoRoutine` | parallel: `1` | // | `demp-http` | `*service.HTTP` | `http.HandlerFunc` on `localhost:8080` | // - // ## Health probes + // ### Health probes // // List of all registered healthz probes that are being called during startup and runntime. // @@ -95,7 +95,7 @@ func ExampleNewHTTPDocs() { // | `always` | `*service.HTTP` | `*http.ServeMux` on `localhost:9001` | // | `always` | `*service.HTTP` | `http.HandlerFunc` on `localhost:8080` | // - // ## Closers + // ### Closers // // List of all registered closers that are being called during graceful shutdown. // @@ -105,7 +105,7 @@ func ExampleNewHTTPDocs() { // | `*service.HTTP` | `ErrorCloserWithContext` | // | `*service.HTTP` | `ErrorCloserWithContext` | // - // ## Metrics + // ### Metrics // // List of all registered metrics than are being exposed. // From 0e16c2925436df2aa26c22d74f6a06fb95697582 Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Fri, 8 Sep 2023 17:36:48 +0200 Subject: [PATCH 072/134] feat: add gh output --- service/httpdocs_test.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/service/httpdocs_test.go b/service/httpdocs_test.go index 89cf4dc..55d9660 100644 --- a/service/httpdocs_test.go +++ b/service/httpdocs_test.go @@ -138,4 +138,11 @@ func ExampleNewHTTPDocs() { // | `go_memstats_stack_sys_bytes` | GAUGE | Number of bytes obtained from system for stack allocator. | // | `go_memstats_sys_bytes` | GAUGE | Number of bytes obtained from system. | // | `go_threads` | GAUGE | Number of OS threads created. | + // | `process_cpu_seconds_total` | COUNTER | Total user and system CPU time spent in seconds. | + // | `process_max_fds` | GAUGE | Maximum number of open file descriptors. | + // | `process_open_fds` | GAUGE | Number of open file descriptors. | + // | `process_resident_memory_bytes` | GAUGE | Resident memory size in bytes. | + // | `process_start_time_seconds` | GAUGE | Start time of the process since unix epoch in seconds. | + // | `process_virtual_memory_bytes` | GAUGE | Virtual memory size in bytes. | + // | `process_virtual_memory_max_bytes` | GAUGE | Maximum amount of virtual memory available in bytes. | } From 36a26d875d005cbe5224b7a353e605f00bf058ae Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Fri, 8 Sep 2023 17:56:24 +0200 Subject: [PATCH 073/134] feat: add names --- markdown/utils.go | 9 +++++++++ server.go | 7 +++++-- service/httpdocs_test.go | 22 +++++++++++----------- 3 files changed, 25 insertions(+), 13 deletions(-) diff --git a/markdown/utils.go b/markdown/utils.go index f174346..bea89ff 100644 --- a/markdown/utils.go +++ b/markdown/utils.go @@ -11,6 +11,15 @@ func Code(v string) string { return "`" + v + "`" } +func Name(v any) string { + if i, ok := v.(interface { + Name() string + }); ok { + return i.Name() + } + return "" +} + func String(v any) string { if i, ok := v.(fmt.Stringer); ok { return i.String() diff --git a/server.go b/server.go index 896ef30..54d5b3e 100644 --- a/server.go +++ b/server.go @@ -452,6 +452,7 @@ func (s *Server) Docs() string { for _, probe := range probes { t := reflect.TypeOf(probe) rows = append(rows, []string{ + markdown.Code(markdown.Name(probe)), markdown.Code(k.String()), markdown.Code(t.String()), markdown.String(probe), @@ -463,7 +464,7 @@ func (s *Server) Docs() string { md.Println("") md.Println("List of all registered healthz probes that are being called during startup and runntime.") md.Println("") - md.Table([]string{"Name", "Type", "Description"}, rows) + md.Table([]string{"Name", "Probe", "Type", "Description"}, rows) md.Println("") } } @@ -510,8 +511,10 @@ func (s *Server) Docs() string { closer = "ErrorUnsubscriberWithContext" } rows = append(rows, []string{ + markdown.Code(markdown.Name(value)), markdown.Code(t.String()), markdown.Code(closer), + markdown.String(value), }) } if len(rows) > 0 { @@ -519,7 +522,7 @@ func (s *Server) Docs() string { md.Println("") md.Println("List of all registered closers that are being called during graceful shutdown.") md.Println("") - md.Table([]string{"Name", "Type"}, rows) + md.Table([]string{"Name", "Type", "Closer", "Description"}, rows) md.Println("") } } diff --git a/service/httpdocs_test.go b/service/httpdocs_test.go index 55d9660..013e6a7 100644 --- a/service/httpdocs_test.go +++ b/service/httpdocs_test.go @@ -88,22 +88,22 @@ func ExampleNewHTTPDocs() { // // List of all registered healthz probes that are being called during startup and runntime. // - // | Name | Type | Description | - // | -------- | -------------------- | -------------------------------------- | - // | `always` | `*keel.Server` | | - // | `always` | `*service.GoRoutine` | parallel: `1` | - // | `always` | `*service.HTTP` | `*http.ServeMux` on `localhost:9001` | - // | `always` | `*service.HTTP` | `http.HandlerFunc` on `localhost:8080` | + // | Name | Probe | Type | Description | + // | ---------------- | -------- | -------------------- | -------------------------------------- | + // | | `always` | `*keel.Server` | | + // | `demo-goroutine` | `always` | `*service.GoRoutine` | parallel: `1` | + // | `demp-http` | `always` | `*service.HTTP` | `http.HandlerFunc` on `localhost:8080` | + // | `docs` | `always` | `*service.HTTP` | `*http.ServeMux` on `localhost:9001` | // // ### Closers // // List of all registered closers that are being called during graceful shutdown. // - // | Name | Type | - // | -------------------- | ------------------------ | - // | `*service.GoRoutine` | `ErrorCloserWithContext` | - // | `*service.HTTP` | `ErrorCloserWithContext` | - // | `*service.HTTP` | `ErrorCloserWithContext` | + // | Name | Type | Closer | Description | + // | ---------------- | -------------------- | ------------------------ | -------------------------------------- | + // | `demo-goroutine` | `*service.GoRoutine` | `ErrorCloserWithContext` | parallel: `1` | + // | `demp-http` | `*service.HTTP` | `ErrorCloserWithContext` | `http.HandlerFunc` on `localhost:8080` | + // | `docs` | `*service.HTTP` | `ErrorCloserWithContext` | `*http.ServeMux` on `localhost:9001` | // // ### Metrics // From 9983e267e2fcd96fa864eedd82f21e5579bd332a Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Fri, 8 Sep 2023 22:24:31 +0200 Subject: [PATCH 074/134] feat: add mongo and refactor readme --- closer.go | 29 ++ config/readme.go | 71 ++++ config/remote.go | 12 + env/env.go | 55 ++- env/readme.go | 43 +++ healthz.go | 20 + interfaces/closer.go | 10 - interfaces/documenter.go | 6 - interfaces/namer.go | 6 + interfaces/readmer.go | 6 + markdown/markdown.go | 1 + metrics/readme.go | 40 ++ option.go | 8 +- persistence/mongo/collection.go | 17 + persistence/mongo/readme.go | 37 ++ server.go | 349 ++++++++---------- service/{httpdocs.go => httpreadme.go} | 28 +- .../{httpdocs_test.go => httpreadme_test.go} | 95 ++++- 18 files changed, 576 insertions(+), 257 deletions(-) create mode 100644 closer.go create mode 100644 config/readme.go create mode 100644 env/readme.go create mode 100644 healthz.go delete mode 100644 interfaces/documenter.go create mode 100644 interfaces/namer.go create mode 100644 interfaces/readmer.go create mode 100644 metrics/readme.go create mode 100644 persistence/mongo/readme.go rename service/{httpdocs.go => httpreadme.go} (53%) rename service/{httpdocs_test.go => httpreadme_test.go} (65%) diff --git a/closer.go b/closer.go new file mode 100644 index 0000000..fe583bd --- /dev/null +++ b/closer.go @@ -0,0 +1,29 @@ +package keel + +import ( + "github.com/foomo/keel/interfaces" +) + +func IsCloser(v any) bool { + switch v.(type) { + case interfaces.Closer, + interfaces.ErrorCloser, + interfaces.CloserWithContext, + interfaces.ErrorCloserWithContext, + interfaces.Shutdowner, + interfaces.ErrorShutdowner, + interfaces.ShutdownerWithContext, + interfaces.ErrorShutdownerWithContext, + interfaces.Stopper, + interfaces.ErrorStopper, + interfaces.StopperWithContext, + interfaces.ErrorStopperWithContext, + interfaces.Unsubscriber, + interfaces.ErrorUnsubscriber, + interfaces.UnsubscriberWithContext, + interfaces.ErrorUnsubscriberWithContext: + return true + default: + return false + } +} diff --git a/config/readme.go b/config/readme.go new file mode 100644 index 0000000..22bbc12 --- /dev/null +++ b/config/readme.go @@ -0,0 +1,71 @@ +package config + +import ( + "fmt" + + "github.com/foomo/keel/markdown" +) + +func Readme() string { + var configRows [][]string + var remoteRows [][]string + c := Config() + md := &markdown.Markdown{} + + { + keys := c.AllKeys() + for _, key := range keys { + var fallback interface{} + if v, ok := defaults[key]; ok { + fallback = v + } + configRows = append(configRows, []string{ + markdown.Code(key), + markdown.Code(TypeOf(key)), + "", + markdown.Code(fmt.Sprintf("%v", fallback)), + }) + } + + for _, key := range requiredKeys { + configRows = append(configRows, []string{ + markdown.Code(key), + markdown.Code(TypeOf(key)), + markdown.Code("true"), + "", + }) + } + } + + { + for _, remote := range remotes { + remoteRows = append(remoteRows, []string{ + markdown.Code(remote.provider), + markdown.Code(remote.path), + }) + } + } + + if len(configRows) > 0 || len(remoteRows) > 0 { + md.Println("### Config") + md.Println("") + } + + if len(configRows) > 0 { + md.Println("List of all registered config variabled with their defaults.") + md.Println("") + md.Table([]string{"Key", "Type", "Required", "Default"}, configRows) + md.Println("") + } + + if len(remoteRows) > 0 { + md.Println("#### Remotes") + md.Println("") + md.Println("List of remote config providers that are being watched.") + md.Println("") + md.Table([]string{"Provider", "Path"}, remoteRows) + md.Println("") + } + + return md.String() +} diff --git a/config/remote.go b/config/remote.go index 462c13c..ab85c67 100644 --- a/config/remote.go +++ b/config/remote.go @@ -6,6 +6,12 @@ import ( _ "github.com/spf13/viper/remote" ) +var remotes []struct { + provider string + endpoint string + path string +} + func WithRemoteConfig(c *viper.Viper, provider, endpoint string, path string) error { if err := c.AddRemoteProvider(provider, endpoint, path); err != nil { return err @@ -19,5 +25,11 @@ func WithRemoteConfig(c *viper.Viper, provider, endpoint string, path string) er return errors.Wrap(err, "failed to watch remote config") } + remotes = append(remotes, struct { + provider string + endpoint string + path string + }{provider: provider, endpoint: endpoint, path: path}) + return nil } diff --git a/env/env.go b/env/env.go index 1fabba3..31b5c93 100644 --- a/env/env.go +++ b/env/env.go @@ -3,10 +3,17 @@ package env import ( "fmt" "os" + "slices" "strconv" "strings" ) +var ( + defaults = map[string]interface{}{} + requiredKeys []string + types = map[string]string{} +) + // Exists return true if env var is defined func Exists(key string) bool { _, ok := os.LookupEnv(key) @@ -15,13 +22,20 @@ func Exists(key string) bool { // MustExists panics if not exists func MustExists(key string) { - if _, ok := os.LookupEnv(key); !ok { - panic(fmt.Sprintf("required environment variable %s does not exist", key)) + if !Exists(key) { + panic(fmt.Sprintf("required environment variable `%s` does not exist", key)) + } + if !slices.Contains(requiredKeys, key) { + requiredKeys = append(requiredKeys, key) } } // Get env var or fallback func Get(key, fallback string) string { + defaults[key] = fallback + if _, ok := types[key]; !ok { + types[key] = "string" + } if v, ok := os.LookupEnv(key); ok { return v } @@ -36,6 +50,9 @@ func MustGet(key string) string { // GetInt env var or fallback as int func GetInt(key string, fallback int) int { + if _, ok := types[key]; !ok { + types[key] = "int" + } if value, err := strconv.Atoi(Get(key, "")); err == nil { return value } @@ -50,6 +67,9 @@ func MustGetInt(key string) int { // GetInt64 env var or fallback as int64 func GetInt64(key string, fallback int64) int64 { + if _, ok := types[key]; !ok { + types[key] = "int64" + } if value, err := strconv.ParseInt(Get(key, ""), 10, 64); err == nil { return value } @@ -64,6 +84,9 @@ func MustGetInt64(key string) int64 { // GetFloat64 env var or fallback as float64 func GetFloat64(key string, fallback float64) float64 { + if _, ok := types[key]; !ok { + types[key] = "float64" + } if value, err := strconv.ParseFloat(Get(key, ""), 64); err == nil { return value } @@ -78,6 +101,9 @@ func MustGetFloat64(key string) float64 { // GetBool env var or fallback as bool func GetBool(key string, fallback bool) bool { + if _, ok := types[key]; !ok { + types[key] = "bool" + } if val, err := strconv.ParseBool(Get(key, "")); err == nil { return val } @@ -92,6 +118,9 @@ func MustGetBool(key string) bool { // GetStringSlice env var or fallback as []string func GetStringSlice(key string, fallback []string) []string { + if _, ok := types[key]; !ok { + types[key] = "[]string" + } if v := Get(key, ""); v != "" { return strings.Split(v, ",") } @@ -106,6 +135,9 @@ func MustGetStringSlice(key string) []string { // GetIntSlice env var or fallback as []string func GetIntSlice(key string, fallback []int) []int { + if _, ok := types[key]; !ok { + types[key] = "[]int" + } if v := Get(key, ""); v != "" { elements := strings.Split(v, ",") ret := make([]int, len(elements)) @@ -125,3 +157,22 @@ func MustGetGetIntSlice(key string) []int { MustExists(key) return GetIntSlice(key, nil) } + +func RequiredKeys() []string { + return requiredKeys +} + +func Defaults() map[string]interface{} { + return defaults +} + +func Types() map[string]string { + return types +} + +func TypeOf(key string) string { + if v, ok := types[key]; ok { + return v + } + return "" +} diff --git a/env/readme.go b/env/readme.go new file mode 100644 index 0000000..909d1bf --- /dev/null +++ b/env/readme.go @@ -0,0 +1,43 @@ +package env + +import ( + "fmt" + + "github.com/foomo/keel/markdown" +) + +func Readme() string { + var rows [][]string + md := &markdown.Markdown{} + + { + for key, fallback := range defaults { + rows = append(rows, []string{ + markdown.Code(key), + markdown.Code(TypeOf(key)), + "", + markdown.Code(fmt.Sprintf("%v", fallback)), + }) + } + + for _, key := range requiredKeys { + rows = append(rows, []string{ + markdown.Code(key), + markdown.Code(TypeOf(key)), + markdown.Code("true"), + "", + }) + } + } + + if len(rows) > 0 { + md.Println("### Env") + md.Println("") + md.Println("List of all accessed environment variables.") + md.Println("") + md.Table([]string{"Key", "Type", "Required", "Default"}, rows) + md.Println("") + } + + return md.String() +} diff --git a/healthz.go b/healthz.go new file mode 100644 index 0000000..7b43776 --- /dev/null +++ b/healthz.go @@ -0,0 +1,20 @@ +package keel + +import ( + "github.com/foomo/keel/healthz" + "github.com/foomo/keel/interfaces" +) + +func IsHealthz(v any) bool { + switch v.(type) { + case healthz.BoolHealthzer, + healthz.BoolHealthzerWithContext, + healthz.ErrorHealthzer, + healthz.ErrorHealthzWithContext, + interfaces.ErrorPinger, + interfaces.ErrorPingerWithContext: + return true + default: + return false + } +} diff --git a/interfaces/closer.go b/interfaces/closer.go index fe62a5b..abbc719 100644 --- a/interfaces/closer.go +++ b/interfaces/closer.go @@ -4,16 +4,6 @@ import ( "context" ) -type closer struct { - handle func(context.Context) error -} - -func NewCloserFn(handle func(context.Context) error) closer { - return closer{ - handle: handle, - } -} - // Closer interface type Closer interface { Close() diff --git a/interfaces/documenter.go b/interfaces/documenter.go deleted file mode 100644 index 1747c4f..0000000 --- a/interfaces/documenter.go +++ /dev/null @@ -1,6 +0,0 @@ -package interfaces - -// Documenter interface -type Documenter interface { - Docs() string -} diff --git a/interfaces/namer.go b/interfaces/namer.go new file mode 100644 index 0000000..65250a1 --- /dev/null +++ b/interfaces/namer.go @@ -0,0 +1,6 @@ +package interfaces + +// Namer interface +type Namer interface { + Name() string +} diff --git a/interfaces/readmer.go b/interfaces/readmer.go new file mode 100644 index 0000000..64e9a42 --- /dev/null +++ b/interfaces/readmer.go @@ -0,0 +1,6 @@ +package interfaces + +// Readmer interface +type Readmer interface { + Readme() string +} diff --git a/markdown/markdown.go b/markdown/markdown.go index f84f060..fd9aa1b 100644 --- a/markdown/markdown.go +++ b/markdown/markdown.go @@ -13,6 +13,7 @@ type Markdown struct { func (s *Markdown) Println(a ...any) { s.value += fmt.Sprintln(a...) } + func (s *Markdown) Printf(format string, a ...any) { s.Println(fmt.Sprintf(format, a...)) } diff --git a/metrics/readme.go b/metrics/readme.go new file mode 100644 index 0000000..bb64f91 --- /dev/null +++ b/metrics/readme.go @@ -0,0 +1,40 @@ +package metrics + +import ( + "github.com/foomo/keel/markdown" + "github.com/foomo/keel/telemetry/nonrecording" + "github.com/prometheus/client_golang/prometheus" +) + +func Readme() string { + md := markdown.Markdown{} + values := nonrecording.Metrics() + + gatherer, _ := prometheus.DefaultRegisterer.(*prometheus.Registry).Gather() + for _, value := range gatherer { + values = append(values, nonrecording.Metric{ + Name: value.GetName(), + Type: value.GetType().String(), + Help: value.GetHelp(), + }) + } + + rows := make([][]string, 0, len(values)) + for _, value := range values { + rows = append(rows, []string{ + markdown.Code(value.Name), + value.Type, + value.Help, + }) + } + if len(rows) > 0 { + md.Println("### Metrics") + md.Println("") + md.Println("List of all registered metrics than are being exposed.") + md.Println("") + md.Table([]string{"Name", "Type", "Description"}, rows) + md.Println("") + } + + return md.String() +} diff --git a/option.go b/option.go index 9a4e002..cde3b8b 100644 --- a/option.go +++ b/option.go @@ -179,11 +179,11 @@ func WithHTTPHealthzService(enabled bool) Option { } } -// WithHTTPDocsService option with default value -func WithHTTPDocsService(enabled bool) Option { +// WithHTTPReadmeService option with default value +func WithHTTPReadmeService(enabled bool) Option { return func(inst *Server) { - if config.GetBool(inst.Config(), "service.docs.enabled", enabled)() { - svs := service.NewDefaultHTTPDocs(inst.Logger(), inst.documenter) + if config.GetBool(inst.Config(), "service.readme.enabled", enabled)() { + svs := service.NewDefaultHTTPReadme(inst.Logger(), &inst.readmers) inst.initServices = append(inst.initServices, svs) inst.AddAlwaysHealthzers(svs) } diff --git a/persistence/mongo/collection.go b/persistence/mongo/collection.go index a933575..4b39597 100644 --- a/persistence/mongo/collection.go +++ b/persistence/mongo/collection.go @@ -2,6 +2,7 @@ package keelmongo import ( "context" + "slices" "time" keelerrors "github.com/foomo/keel/errors" @@ -113,6 +114,11 @@ func CollectionWithIndexesCommitQuorumVotingMembers(v context.Context) Collectio // ~ Constructor // ------------------------------------------------------------------------------------------------ +var ( + dbs = map[string][]string{} + indices = map[string]map[string][]string{} +) + func NewCollection(db *mongo.Database, name string, opts ...CollectionOption) (*Collection, error) { o := DefaultCollectionOptions() for _, opt := range opts { @@ -120,11 +126,22 @@ func NewCollection(db *mongo.Database, name string, opts ...CollectionOption) (* } col := db.Collection(name, o.CollectionOptions) + if !slices.Contains(dbs[db.Name()], name) { + dbs[db.Name()] = append(dbs[db.Name()], name) + } if len(o.Indexes) > 0 { if _, err := col.Indexes().CreateMany(o.IndexesContext, o.Indexes, o.CreateIndexesOptions); err != nil { return nil, err } + if _, ok := indices[db.Name()]; !ok { + indices[db.Name()] = map[string][]string{} + } + for _, index := range o.Indexes { + if index.Options.Name != nil { + indices[db.Name()][name] = append(indices[db.Name()][name], *index.Options.Name) + } + } } return &Collection{ diff --git a/persistence/mongo/readme.go b/persistence/mongo/readme.go new file mode 100644 index 0000000..6ad2580 --- /dev/null +++ b/persistence/mongo/readme.go @@ -0,0 +1,37 @@ +package keelmongo + +import ( + "strings" + + "github.com/foomo/keel/markdown" +) + +func Readme() string { + var rows [][]string + md := &markdown.Markdown{} + + for db, collections := range dbs { + for _, collection := range collections { + var i string + if v, ok := indices[db][collection]; ok { + i += strings.Join(v, "`, `") + } + rows = append(rows, []string{ + markdown.Code(db), + markdown.Code(collection), + markdown.Code(i), + }) + } + } + + if len(rows) > 0 { + md.Println("### Mongo") + md.Println("") + md.Println("List of all used mongo collections including the configured indices options.") + md.Println("") + md.Table([]string{"Database", "Collection", "Indices"}, rows) + md.Println("") + } + + return md.String() +} diff --git a/server.go b/server.go index 54d5b3e..d616d9b 100644 --- a/server.go +++ b/server.go @@ -7,6 +7,7 @@ import ( "os" "os/signal" "reflect" + "slices" "sync" "sync/atomic" "syscall" @@ -15,11 +16,11 @@ import ( "github.com/foomo/keel/healthz" "github.com/foomo/keel/interfaces" "github.com/foomo/keel/markdown" + "github.com/foomo/keel/metrics" + keelmongo "github.com/foomo/keel/persistence/mongo" "github.com/foomo/keel/service" - "github.com/foomo/keel/telemetry/nonrecording" "github.com/go-logr/logr" "github.com/pkg/errors" - "github.com/prometheus/client_golang/prometheus" "github.com/spf13/viper" otelhost "go.opentelemetry.io/contrib/instrumentation/host" otelruntime "go.opentelemetry.io/contrib/instrumentation/runtime" @@ -49,8 +50,8 @@ type Server struct { running atomic.Bool closers []interface{} closersLock sync.Mutex + readmers []interfaces.Readmer probes map[healthz.Type][]interface{} - documenter map[string]interfaces.Documenter ctx context.Context ctxCancel context.Context ctxCancelFn context.CancelFunc @@ -64,8 +65,8 @@ func NewServer(opts ...Option) *Server { inst := &Server{ shutdownTimeout: 30 * time.Second, shutdownSignals: []os.Signal{os.Interrupt, syscall.SIGTERM}, + readmers: []interfaces.Readmer{}, probes: map[healthz.Type][]interface{}{}, - documenter: map[string]interfaces.Documenter{}, ctx: context.Background(), c: config.Config(), l: log.Logger(), @@ -178,7 +179,7 @@ func NewServer(opts ...Option) *Server { // add probe inst.AddAlwaysHealthzers(inst) - inst.AddDocumenter("Keel Server", inst) + inst.AddReadmer(inst) // start init services inst.startService(inst.initServices...) @@ -218,20 +219,17 @@ func (s *Server) CancelContext() context.Context { // AddService add a single service func (s *Server) AddService(service Service) { - for _, value := range s.services { - if value == service { - return - } + if !slices.Contains(s.services, service) { + s.services = append(s.services, service) + s.AddAlwaysHealthzers(service) + s.AddCloser(service) } - s.services = append(s.services, service) - s.AddAlwaysHealthzers(service) - s.AddCloser(service) } // AddServices adds multiple service func (s *Server) AddServices(services ...Service) { - for _, service := range services { - s.AddService(service) + for _, value := range services { + s.AddService(value) } } @@ -244,25 +242,9 @@ func (s *Server) AddCloser(closer interface{}) { return } } - switch closer.(type) { - case interfaces.Closer, - interfaces.ErrorCloser, - interfaces.CloserWithContext, - interfaces.ErrorCloserWithContext, - interfaces.Shutdowner, - interfaces.ErrorShutdowner, - interfaces.ShutdownerWithContext, - interfaces.ErrorShutdownerWithContext, - interfaces.Stopper, - interfaces.ErrorStopper, - interfaces.StopperWithContext, - interfaces.ErrorStopperWithContext, - interfaces.Unsubscriber, - interfaces.ErrorUnsubscriber, - interfaces.UnsubscriberWithContext, - interfaces.ErrorUnsubscriberWithContext: + if IsCloser(closer) { s.closers = append(s.closers, closer) - default: + } else { s.l.Warn("unable to add closer", log.FValue(fmt.Sprintf("%T", closer))) } } @@ -274,22 +256,25 @@ func (s *Server) AddClosers(closers ...interface{}) { } } -// AddDocumenter adds a dcoumenter to beadded to the exposed docs -func (s *Server) AddDocumenter(name string, documenter interfaces.Documenter) { - s.documenter[name] = documenter +// AddReadmer adds a readmer to be added to the exposed readme +func (s *Server) AddReadmer(readmer interfaces.Readmer) { + if !slices.Contains(s.readmers, readmer) { + s.readmers = append(s.readmers, readmer) + } +} + +// AddReadmers adds readmers to be added to the exposed readme +func (s *Server) AddReadmers(readmers ...interfaces.Readmer) { + for _, readmer := range readmers { + s.AddCloser(readmer) + } } // AddHealthzer adds a probe to be called on healthz checks func (s *Server) AddHealthzer(typ healthz.Type, probe interface{}) { - switch probe.(type) { - case healthz.BoolHealthzer, - healthz.BoolHealthzerWithContext, - healthz.ErrorHealthzer, - healthz.ErrorHealthzWithContext, - interfaces.ErrorPinger, - interfaces.ErrorPingerWithContext: + if IsHealthz(probe) { s.probes[typ] = append(s.probes[typ], probe) - default: + } else { s.l.Debug("not a healthz probe", log.FValue(fmt.Sprintf("%T", probe))) } } @@ -366,44 +351,132 @@ func (s *Server) Run() { s.l.Info("keel server stopped") } -// Docs returns the self-documenting string -func (s *Server) Docs() string { +// Readme returns the self-documenting string +func (s *Server) Readme() string { md := &markdown.Markdown{} - { - var rows [][]string - keys := s.Config().AllKeys() - defaults := config.Defaults() - for _, key := range keys { - var fallback interface{} - if v, ok := defaults[key]; ok { - fallback = v + md.Print(env.Readme()) + md.Print(config.Readme()) + md.Println(s.readmeServices()) + md.Println(s.readmeHealthz()) + md.Print(s.readmeCloser()) + md.Print(keelmongo.Readme()) + md.Print(metrics.Readme()) + + return md.String() +} + +// ------------------------------------------------------------------------------------------------ +// ~ Private methods +// ------------------------------------------------------------------------------------------------ + +// startService starts the given services +func (s *Server) startService(services ...Service) { + for _, value := range services { + value := value + s.g.Go(func() error { + if err := value.Start(s.ctx); errors.Is(err, http.ErrServerClosed) { + log.WithError(s.l, err).Debug("server has closed") + } else if err != nil { + log.WithError(s.l, err).Error("failed to start service") + return err } - rows = append(rows, []string{ - markdown.Code(key), - markdown.Code(config.TypeOf(key)), - "", - markdown.Code(fmt.Sprintf("%v", fallback)), - }) + return nil + }) + } +} + +func (s *Server) readmeCloser() string { + md := &markdown.Markdown{} + rows := make([][]string, 0, len(s.closers)) + s.closersLock.Lock() + defer s.closersLock.Unlock() + for _, value := range s.closers { + t := reflect.TypeOf(value) + var closer string + switch value.(type) { + case interfaces.Closer: + closer = "Closer" + case interfaces.ErrorCloser: + closer = "ErrorCloser" + case interfaces.CloserWithContext: + closer = "CloserWithContext" + case interfaces.ErrorCloserWithContext: + closer = "ErrorCloserWithContext" + case interfaces.Shutdowner: + closer = "Shutdowner" + case interfaces.ErrorShutdowner: + closer = "ErrorShutdowner" + case interfaces.ShutdownerWithContext: + closer = "ShutdownerWithContext" + case interfaces.ErrorShutdownerWithContext: + closer = "ErrorShutdownerWithContext" + case interfaces.Stopper: + closer = "Stopper" + case interfaces.ErrorStopper: + closer = "ErrorStopper" + case interfaces.StopperWithContext: + closer = "StopperWithContext" + case interfaces.ErrorStopperWithContext: + closer = "ErrorStopperWithContext" + case interfaces.Unsubscriber: + closer = "Unsubscriber" + case interfaces.ErrorUnsubscriber: + closer = "ErrorUnsubscriber" + case interfaces.UnsubscriberWithContext: + closer = "UnsubscriberWithContext" + case interfaces.ErrorUnsubscriberWithContext: + closer = "ErrorUnsubscriberWithContext" } - for _, key := range config.RequiredKeys() { + rows = append(rows, []string{ + markdown.Code(markdown.Name(value)), + markdown.Code(t.String()), + markdown.Code(closer), + markdown.String(value), + }) + } + if len(rows) > 0 { + md.Println("### Closers") + md.Println("") + md.Println("List of all registered closers that are being called during graceful shutdown.") + md.Println("") + md.Table([]string{"Name", "Type", "Closer", "Description"}, rows) + md.Println("") + } + + return md.String() +} + +func (s *Server) readmeHealthz() string { + var rows [][]string + md := &markdown.Markdown{} + + for k, probes := range s.probes { + for _, probe := range probes { + t := reflect.TypeOf(probe) rows = append(rows, []string{ - markdown.Code(key), - markdown.Code(config.TypeOf(key)), - markdown.Code("true"), - "", + markdown.Code(markdown.Name(probe)), + markdown.Code(k.String()), + markdown.Code(t.String()), + markdown.String(probe), }) } - if len(rows) > 0 { - md.Println("### Config") - md.Println("") - md.Println("List of all registered config variabled with their defaults.") - md.Println("") - md.Table([]string{"Key", "Type", "Required", "Default"}, rows) - md.Println("") - } + } + if len(rows) > 0 { + md.Println("### Health probes") + md.Println("") + md.Println("List of all registered healthz probes that are being called during startup and runntime.") + md.Println("") + md.Table([]string{"Name", "Probe", "Type", "Description"}, rows) + md.Println("") } + return md.String() +} + +func (s *Server) readmeServices() string { + md := &markdown.Markdown{} + { var rows [][]string for _, value := range s.initServices { @@ -446,137 +519,5 @@ func (s *Server) Docs() string { } } - { - var rows [][]string - for k, probes := range s.probes { - for _, probe := range probes { - t := reflect.TypeOf(probe) - rows = append(rows, []string{ - markdown.Code(markdown.Name(probe)), - markdown.Code(k.String()), - markdown.Code(t.String()), - markdown.String(probe), - }) - } - } - if len(rows) > 0 { - md.Println("### Health probes") - md.Println("") - md.Println("List of all registered healthz probes that are being called during startup and runntime.") - md.Println("") - md.Table([]string{"Name", "Probe", "Type", "Description"}, rows) - md.Println("") - } - } - - { - var rows [][]string - s.closersLock.Lock() - defer s.closersLock.Unlock() - for _, value := range s.closers { - t := reflect.TypeOf(value) - var closer string - switch value.(type) { - case interfaces.Closer: - closer = "Closer" - case interfaces.ErrorCloser: - closer = "ErrorCloser" - case interfaces.CloserWithContext: - closer = "CloserWithContext" - case interfaces.ErrorCloserWithContext: - closer = "ErrorCloserWithContext" - case interfaces.Shutdowner: - closer = "Shutdowner" - case interfaces.ErrorShutdowner: - closer = "ErrorShutdowner" - case interfaces.ShutdownerWithContext: - closer = "ShutdownerWithContext" - case interfaces.ErrorShutdownerWithContext: - closer = "ErrorShutdownerWithContext" - case interfaces.Stopper: - closer = "Stopper" - case interfaces.ErrorStopper: - closer = "ErrorStopper" - case interfaces.StopperWithContext: - closer = "StopperWithContext" - case interfaces.ErrorStopperWithContext: - closer = "ErrorStopperWithContext" - case interfaces.Unsubscriber: - closer = "Unsubscriber" - case interfaces.ErrorUnsubscriber: - closer = "ErrorUnsubscriber" - case interfaces.UnsubscriberWithContext: - closer = "UnsubscriberWithContext" - case interfaces.ErrorUnsubscriberWithContext: - closer = "ErrorUnsubscriberWithContext" - } - rows = append(rows, []string{ - markdown.Code(markdown.Name(value)), - markdown.Code(t.String()), - markdown.Code(closer), - markdown.String(value), - }) - } - if len(rows) > 0 { - md.Println("### Closers") - md.Println("") - md.Println("List of all registered closers that are being called during graceful shutdown.") - md.Println("") - md.Table([]string{"Name", "Type", "Closer", "Description"}, rows) - md.Println("") - } - } - - { - var rows [][]string - s.meter.AsyncFloat64() - - values := nonrecording.Metrics() - - gatherer, _ := prometheus.DefaultRegisterer.(*prometheus.Registry).Gather() - for _, value := range gatherer { - values = append(values, nonrecording.Metric{ - Name: value.GetName(), - Type: value.GetType().String(), - Help: value.GetHelp(), - }) - } - for _, value := range values { - rows = append(rows, []string{ - markdown.Code(value.Name), - value.Type, - value.Help, - }) - } - if len(rows) > 0 { - md.Println("### Metrics") - md.Println("") - md.Println("List of all registered metrics than are being exposed.") - md.Println("") - md.Table([]string{"Name", "Type", "Description"}, rows) - md.Println("") - } - } - return md.String() } - -// ------------------------------------------------------------------------------------------------ -// ~ Private methods -// ------------------------------------------------------------------------------------------------ - -// startService starts the given services -func (s *Server) startService(services ...Service) { - for _, value := range services { - value := value - s.g.Go(func() error { - if err := value.Start(s.ctx); errors.Is(err, http.ErrServerClosed) { - log.WithError(s.l, err).Debug("server has closed") - } else if err != nil { - log.WithError(s.l, err).Error("failed to start service") - return err - } - return nil - }) - } -} diff --git a/service/httpdocs.go b/service/httpreadme.go similarity index 53% rename from service/httpdocs.go rename to service/httpreadme.go index 44892d3..3cb5026 100644 --- a/service/httpdocs.go +++ b/service/httpreadme.go @@ -9,23 +9,21 @@ import ( ) const ( - DefaultHTTPDocsName = "docs" - DefaultHTTPDocsAddr = "localhost:9001" - DefaultHTTPDocsPath = "/docs" + DefaultHTTPReadmeName = "readme" + DefaultHTTPReadmeAddr = "localhost:9001" + DefaultHTTPReadmePath = "/readme" ) -func NewHTTPDocs(l *zap.Logger, name, addr, path string, documenters map[string]interfaces.Documenter) *HTTP { +func NewHTTPReadme(l *zap.Logger, name, addr, path string, readmers *[]interfaces.Readmer) *HTTP { handler := http.NewServeMux() handler.HandleFunc(path, func(w http.ResponseWriter, r *http.Request) { switch r.Method { case http.MethodGet: - w.WriteHeader(http.StatusOK) w.Header().Add("Content-Type", "text/markdown") + w.WriteHeader(http.StatusOK) md := &markdown.Markdown{} - for name, documenter := range documenters { - md.Printf("## %s", name) - md.Println("") - md.Print(documenter.Docs()) + for _, readmer := range *readmers { + md.Print(readmer.Readme()) } _, _ = w.Write([]byte(md.String())) default: @@ -35,12 +33,12 @@ func NewHTTPDocs(l *zap.Logger, name, addr, path string, documenters map[string] return NewHTTP(l, name, addr, handler) } -func NewDefaultHTTPDocs(l *zap.Logger, documenter map[string]interfaces.Documenter) *HTTP { - return NewHTTPDocs( +func NewDefaultHTTPReadme(l *zap.Logger, readmers *[]interfaces.Readmer) *HTTP { + return NewHTTPReadme( l, - DefaultHTTPDocsName, - DefaultHTTPDocsAddr, - DefaultHTTPDocsPath, - documenter, + DefaultHTTPReadmeName, + DefaultHTTPReadmeAddr, + DefaultHTTPReadmePath, + readmers, ) } diff --git a/service/httpdocs_test.go b/service/httpreadme_test.go similarity index 65% rename from service/httpdocs_test.go rename to service/httpreadme_test.go index 013e6a7..c7a6236 100644 --- a/service/httpdocs_test.go +++ b/service/httpreadme_test.go @@ -6,23 +6,34 @@ import ( "io" "net/http" "os" + "time" "github.com/foomo/keel" "github.com/foomo/keel/config" + "github.com/foomo/keel/env" + "github.com/foomo/keel/examples/persistence/mongo/store" + "github.com/foomo/keel/log" + keelmongo "github.com/foomo/keel/persistence/mongo" "github.com/foomo/keel/service" "go.uber.org/zap" ) -func ExampleNewHTTPDocs() { +func ExampleNewHTTPReadme() { // define vars so it does not panic _ = os.Setenv("EXAMPLE_REQUIRED_BOOL", "true") _ = os.Setenv("EXAMPLE_REQUIRED_STRING", "foo") svr := keel.NewServer( keel.WithLogger(zap.NewNop()), - keel.WithHTTPDocsService(true), + keel.WithHTTPReadmeService(true), ) + // access some env vars + _ = env.Get("EXAMPLE_STRING", "demo") + _ = env.GetBool("EXAMPLE_BOOL", false) + _ = env.MustGet("EXAMPLE_REQUIRED_STRING") + _ = env.MustGetBool("EXAMPLE_REQUIRED_BOOL") + l := svr.Logger() c := svr.Config() @@ -33,18 +44,40 @@ func ExampleNewHTTPDocs() { _ = config.MustGetBool(c, "example.required.bool") _ = config.MustGetString(c, "example.required.string") + // create persistor + persistor, err := keelmongo.New(svr.Context(), "mongodb://localhost:27017/dummy") + log.Must(l, err, "failed to create persistor") + + // ensure to add the persistor to the closers + svr.AddClosers(persistor) + + // create repositories + _, err = persistor.Collection( + "dummy", + // define indexes but beware of changes on large dbs + keelmongo.CollectionWithIndexes( + store.EntityIndex, + store.EntityWithVersionsIndex, + ), + // define max time for index creation + keelmongo.CollectionWithIndexesMaxTime(time.Minute), + ) + log.Must(l, err, "failed to create collection") + + // add http service svr.AddService(service.NewHTTP(l, "demp-http", "localhost:8080", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) _, _ = w.Write([]byte("OK")) }))) + // add go routine service svr.AddService(service.NewGoRoutine(l, "demo-goroutine", func(ctx context.Context, l *zap.Logger) error { return nil })) go func() { - resp, _ := http.Get("http://localhost:9001/docs") //nolint:noctx - defer resp.Body.Close() //nolint:govet + resp, _ := http.Get("http://localhost:9001/readme") //nolint:noctx + defer resp.Body.Close() //nolint:govet b, _ := io.ReadAll(resp.Body) fmt.Print(string(b)) shutdown() @@ -53,7 +86,26 @@ func ExampleNewHTTPDocs() { svr.Run() // Output: - // ## Keel Server + // ### Env + // + // List of all accessed environment variables. + // + // | Key | Type | Required | Default | + // | --------------------------------------- | -------- | -------- | ------- | + // | `EXAMPLE_BOOL` | `bool` | | | + // | `EXAMPLE_REQUIRED_BOOL` | `bool` | | | + // | `EXAMPLE_REQUIRED_BOOL` | `bool` | `true` | | + // | `EXAMPLE_REQUIRED_STRING` | `string` | | | + // | `EXAMPLE_REQUIRED_STRING` | `string` | `true` | | + // | `EXAMPLE_STRING` | `string` | | `demo` | + // | `LOG_DISABLE_CALLER` | `bool` | | | + // | `LOG_DISABLE_STACKTRACE` | `bool` | | | + // | `LOG_ENCODING` | `string` | | `json` | + // | `LOG_LEVEL` | `string` | | `info` | + // | `LOG_MODE` | `string` | | `prod` | + // | `OTEL_ENABLED` | `bool` | | | + // | `OTEL_MONGO_COMMAND_ATTRIBUTE_DISABLED` | `bool` | | | + // | `OTEL_MONGO_ENABLED` | `bool` | | | // // ### Config // @@ -65,15 +117,15 @@ func ExampleNewHTTPDocs() { // | `example.required.bool` | `bool` | `true` | | // | `example.required.string` | `string` | `true` | | // | `example.string` | `string` | | `fallback` | - // | `service.docs.enabled` | `bool` | | `true` | + // | `service.readme.enabled` | `bool` | | `true` | // // ### Init Services // // List of all registered init services that are being immediately started. // - // | Name | Type | Address | - // | ------ | --------------- | ------------------------------------ | - // | `docs` | `*service.HTTP` | `*http.ServeMux` on `localhost:9001` | + // | Name | Type | Address | + // | -------- | --------------- | ------------------------------------ | + // | `readme` | `*service.HTTP` | `*http.ServeMux` on `localhost:9001` | // // ### Services // @@ -84,6 +136,7 @@ func ExampleNewHTTPDocs() { // | `demo-goroutine` | `*service.GoRoutine` | parallel: `1` | // | `demp-http` | `*service.HTTP` | `http.HandlerFunc` on `localhost:8080` | // + // // ### Health probes // // List of all registered healthz probes that are being called during startup and runntime. @@ -93,17 +146,27 @@ func ExampleNewHTTPDocs() { // | | `always` | `*keel.Server` | | // | `demo-goroutine` | `always` | `*service.GoRoutine` | parallel: `1` | // | `demp-http` | `always` | `*service.HTTP` | `http.HandlerFunc` on `localhost:8080` | - // | `docs` | `always` | `*service.HTTP` | `*http.ServeMux` on `localhost:9001` | + // | `readme` | `always` | `*service.HTTP` | `*http.ServeMux` on `localhost:9001` | + // // // ### Closers // // List of all registered closers that are being called during graceful shutdown. // - // | Name | Type | Closer | Description | - // | ---------------- | -------------------- | ------------------------ | -------------------------------------- | - // | `demo-goroutine` | `*service.GoRoutine` | `ErrorCloserWithContext` | parallel: `1` | - // | `demp-http` | `*service.HTTP` | `ErrorCloserWithContext` | `http.HandlerFunc` on `localhost:8080` | - // | `docs` | `*service.HTTP` | `ErrorCloserWithContext` | `*http.ServeMux` on `localhost:9001` | + // | Name | Type | Closer | Description | + // | ---------------- | ---------------------- | ------------------------ | -------------------------------------- | + // | | `*keelmongo.Persistor` | `ErrorCloserWithContext` | | + // | `demo-goroutine` | `*service.GoRoutine` | `ErrorCloserWithContext` | parallel: `1` | + // | `demp-http` | `*service.HTTP` | `ErrorCloserWithContext` | `http.HandlerFunc` on `localhost:8080` | + // | `readme` | `*service.HTTP` | `ErrorCloserWithContext` | `*http.ServeMux` on `localhost:9001` | + // + // ### Mongo + // + // List of all used mongo collections. + // + // | Database | Collection | Indices | + // | -------- | ---------- | ------------------------ | + // | `dummy` | `dummy` | `id_1`, `id_1_version_1` | // // ### Metrics // @@ -137,7 +200,7 @@ func ExampleNewHTTPDocs() { // | `go_memstats_stack_inuse_bytes` | GAUGE | Number of bytes in use by the stack allocator. | // | `go_memstats_stack_sys_bytes` | GAUGE | Number of bytes obtained from system for stack allocator. | // | `go_memstats_sys_bytes` | GAUGE | Number of bytes obtained from system. | - // | `go_threads` | GAUGE | Number of OS threads created. | + // | `go_threads` | GAUGE | Number of OS threads created. |// // | `process_cpu_seconds_total` | COUNTER | Total user and system CPU time spent in seconds. | // | `process_max_fds` | GAUGE | Maximum number of open file descriptors. | // | `process_open_fds` | GAUGE | Number of open file descriptors. | From c9641539713932e48d786e41e4af3782c9e6b052 Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Mon, 11 Sep 2023 10:37:04 +0200 Subject: [PATCH 075/134] feat: add nats readmer --- interfaces/readmer.go | 14 ++++++++ markdown/markdown.go | 1 + net/stream/jetstream/readme.go | 62 +++++++++++++++++++++++++++++++++ net/stream/jetstream/stream.go | 29 +++++++++++++++ persistence/mongo/collection.go | 5 --- persistence/mongo/readme.go | 5 +++ server.go | 18 +++++----- service/goroutine.go | 10 ++++-- service/goroutine_test.go | 2 ++ service/httpreadme_test.go | 24 ------------- 10 files changed, 129 insertions(+), 41 deletions(-) create mode 100644 net/stream/jetstream/readme.go diff --git a/interfaces/readmer.go b/interfaces/readmer.go index 64e9a42..a16ba1f 100644 --- a/interfaces/readmer.go +++ b/interfaces/readmer.go @@ -4,3 +4,17 @@ package interfaces type Readmer interface { Readme() string } + +type ReadmeHandler struct { + Value func() string +} + +func (r ReadmeHandler) Readme() string { + return r.Value() +} + +func ReadmeFunc(v func() string) ReadmeHandler { + return ReadmeHandler{ + Value: v, + } +} diff --git a/markdown/markdown.go b/markdown/markdown.go index fd9aa1b..f195964 100644 --- a/markdown/markdown.go +++ b/markdown/markdown.go @@ -6,6 +6,7 @@ import ( markdowntable "github.com/fbiville/markdown-table-formatter/pkg/markdown" ) +// Markdown output helper type Markdown struct { value string } diff --git a/net/stream/jetstream/readme.go b/net/stream/jetstream/readme.go new file mode 100644 index 0000000..75140d9 --- /dev/null +++ b/net/stream/jetstream/readme.go @@ -0,0 +1,62 @@ +package jetstream + +import ( + "github.com/foomo/keel/markdown" +) + +type ( + publisher struct { + Namespace string + Stream string + Subject string + } + subscriber struct { + Namespace string + Stream string + Subject string + } +) + +var ( + publishers []publisher + subscribers []subscriber +) + +func Readme() string { + if len(publishers) == 0 && len(subscribers) == 0 { + return "" + } + + var rows [][]string + md := &markdown.Markdown{} + md.Println("### NATS") + md.Println("") + md.Println("List of all registered nats publishers & subscribers.") + md.Println("") + + if len(publishers) > 0 { + for _, value := range publishers { + rows = append(rows, []string{ + markdown.Code(value.Namespace), + markdown.Code(value.Stream), + markdown.Code(value.Subject), + markdown.Code("publish"), + }) + } + } + + if len(subscribers) > 0 { + for _, value := range subscribers { + rows = append(rows, []string{ + markdown.Code(value.Namespace), + markdown.Code(value.Stream), + markdown.Code(value.Subject), + markdown.Code("subscribe"), + }) + } + } + + md.Table([]string{"Namespace", "Stream", "Subject", "Type"}, rows) + + return md.String() +} diff --git a/net/stream/jetstream/stream.go b/net/stream/jetstream/stream.go index 37048fd..129d330 100644 --- a/net/stream/jetstream/stream.go +++ b/net/stream/jetstream/stream.go @@ -2,6 +2,7 @@ package jetstream import ( "encoding/json" + "slices" "time" "github.com/nats-io/nats.go" @@ -280,6 +281,20 @@ func (s *Stream) Publisher(subject string, opts ...PublisherOption) *Publisher { opt(pub) } } + + { // append to recoreded publishers + value := publisher{ + Stream: s.name, + Namespace: s.namespace, + Subject: subject, + } + if !slices.ContainsFunc(publishers, func(p publisher) bool { + return p.Stream == value.Stream && p.Namespace == value.Namespace && p.Subject == value.Subject + }) { + publishers = append(publishers, value) + } + } + return pub } @@ -295,6 +310,20 @@ func (s *Stream) Subscriber(subject string, opts ...SubscriberOption) *Subscribe opt(sub) } } + + { // append to recoreded publishers + value := subscriber{ + Stream: s.name, + Namespace: s.namespace, + Subject: subject, + } + if !slices.ContainsFunc(subscribers, func(p subscriber) bool { + return p.Stream == value.Stream && p.Namespace == value.Namespace && p.Subject == value.Subject + }) { + subscribers = append(subscribers, value) + } + } + return sub } diff --git a/persistence/mongo/collection.go b/persistence/mongo/collection.go index 4b39597..c50a21c 100644 --- a/persistence/mongo/collection.go +++ b/persistence/mongo/collection.go @@ -114,11 +114,6 @@ func CollectionWithIndexesCommitQuorumVotingMembers(v context.Context) Collectio // ~ Constructor // ------------------------------------------------------------------------------------------------ -var ( - dbs = map[string][]string{} - indices = map[string]map[string][]string{} -) - func NewCollection(db *mongo.Database, name string, opts ...CollectionOption) (*Collection, error) { o := DefaultCollectionOptions() for _, opt := range opts { diff --git a/persistence/mongo/readme.go b/persistence/mongo/readme.go index 6ad2580..21a51f9 100644 --- a/persistence/mongo/readme.go +++ b/persistence/mongo/readme.go @@ -6,6 +6,11 @@ import ( "github.com/foomo/keel/markdown" ) +var ( + dbs = map[string][]string{} + indices = map[string]map[string][]string{} +) + func Readme() string { var rows [][]string md := &markdown.Markdown{} diff --git a/server.go b/server.go index d616d9b..d87be31 100644 --- a/server.go +++ b/server.go @@ -17,7 +17,6 @@ import ( "github.com/foomo/keel/interfaces" "github.com/foomo/keel/markdown" "github.com/foomo/keel/metrics" - keelmongo "github.com/foomo/keel/persistence/mongo" "github.com/foomo/keel/service" "github.com/go-logr/logr" "github.com/pkg/errors" @@ -179,7 +178,12 @@ func NewServer(opts ...Option) *Server { // add probe inst.AddAlwaysHealthzers(inst) - inst.AddReadmer(inst) + inst.AddReadmers( + interfaces.ReadmeFunc(env.Readme), + interfaces.ReadmeFunc(config.Readme), + inst, + interfaces.ReadmeFunc(metrics.Readme), + ) // start init services inst.startService(inst.initServices...) @@ -258,15 +262,13 @@ func (s *Server) AddClosers(closers ...interface{}) { // AddReadmer adds a readmer to be added to the exposed readme func (s *Server) AddReadmer(readmer interfaces.Readmer) { - if !slices.Contains(s.readmers, readmer) { - s.readmers = append(s.readmers, readmer) - } + s.readmers = append(s.readmers, readmer) } // AddReadmers adds readmers to be added to the exposed readme func (s *Server) AddReadmers(readmers ...interfaces.Readmer) { for _, readmer := range readmers { - s.AddCloser(readmer) + s.AddReadmer(readmer) } } @@ -355,13 +357,9 @@ func (s *Server) Run() { func (s *Server) Readme() string { md := &markdown.Markdown{} - md.Print(env.Readme()) - md.Print(config.Readme()) md.Println(s.readmeServices()) md.Println(s.readmeHealthz()) md.Print(s.readmeCloser()) - md.Print(keelmongo.Readme()) - md.Print(metrics.Readme()) return md.String() } diff --git a/service/goroutine.go b/service/goroutine.go index 74c625e..ef895b7 100644 --- a/service/goroutine.go +++ b/service/goroutine.go @@ -28,7 +28,7 @@ type ( GoRoutineFn func(ctx context.Context, l *zap.Logger) error ) -func NewGoRoutine(l *zap.Logger, name string, handler GoRoutineFn) *GoRoutine { +func NewGoRoutine(l *zap.Logger, name string, handler GoRoutineFn, opts ...GoRoutineOption) *GoRoutine { if l == nil { l = log.Logger() } @@ -38,12 +38,18 @@ func NewGoRoutine(l *zap.Logger, name string, handler GoRoutineFn) *GoRoutine { log.KeelServiceNameKey.String(name), ) - return &GoRoutine{ + inst := &GoRoutine{ handler: handler, name: name, parallel: 1, l: l, } + + for _, opt := range opts { + opt(inst) + } + + return inst } // ------------------------------------------------------------------------------------------------ diff --git a/service/goroutine_test.go b/service/goroutine_test.go index 339b9c4..656a955 100644 --- a/service/goroutine_test.go +++ b/service/goroutine_test.go @@ -20,12 +20,14 @@ func ExampleNewGoRoutine() { svr.AddService( service.NewGoRoutine(svr.Logger(), "demo", func(ctx context.Context, l *zap.Logger) error { for { + // handle graceful shutdowns if err := ctx.Err(); errors.Is(context.Cause(ctx), service.ErrServiceShutdown) { l.Info("context has been canceled du to graceful shutdow") return nil } else if err != nil { return errors.Wrap(err, "unexpected context error") } + l.Info("ping") time.Sleep(time.Second) } diff --git a/service/httpreadme_test.go b/service/httpreadme_test.go index c7a6236..e94f9e5 100644 --- a/service/httpreadme_test.go +++ b/service/httpreadme_test.go @@ -6,14 +6,10 @@ import ( "io" "net/http" "os" - "time" "github.com/foomo/keel" "github.com/foomo/keel/config" "github.com/foomo/keel/env" - "github.com/foomo/keel/examples/persistence/mongo/store" - "github.com/foomo/keel/log" - keelmongo "github.com/foomo/keel/persistence/mongo" "github.com/foomo/keel/service" "go.uber.org/zap" ) @@ -44,26 +40,6 @@ func ExampleNewHTTPReadme() { _ = config.MustGetBool(c, "example.required.bool") _ = config.MustGetString(c, "example.required.string") - // create persistor - persistor, err := keelmongo.New(svr.Context(), "mongodb://localhost:27017/dummy") - log.Must(l, err, "failed to create persistor") - - // ensure to add the persistor to the closers - svr.AddClosers(persistor) - - // create repositories - _, err = persistor.Collection( - "dummy", - // define indexes but beware of changes on large dbs - keelmongo.CollectionWithIndexes( - store.EntityIndex, - store.EntityWithVersionsIndex, - ), - // define max time for index creation - keelmongo.CollectionWithIndexesMaxTime(time.Minute), - ) - log.Must(l, err, "failed to create collection") - // add http service svr.AddService(service.NewHTTP(l, "demp-http", "localhost:8080", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) From 12a745215f7f7fba11999289335c4893830e1ab8 Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Mon, 11 Sep 2023 10:40:36 +0200 Subject: [PATCH 076/134] fix: race condition --- server.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server.go b/server.go index d87be31..4546260 100644 --- a/server.go +++ b/server.go @@ -386,8 +386,8 @@ func (s *Server) startService(services ...Service) { func (s *Server) readmeCloser() string { md := &markdown.Markdown{} - rows := make([][]string, 0, len(s.closers)) s.closersLock.Lock() + rows := make([][]string, 0, len(s.closers)) defer s.closersLock.Unlock() for _, value := range s.closers { t := reflect.TypeOf(value) From a6c7c7e00972c557a0a951f3b5e6d36fa57e80bc Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Mon, 11 Sep 2023 10:42:23 +0200 Subject: [PATCH 077/134] feat: update test --- service/httpreadme_test.go | 50 +++++++++++++++----------------------- 1 file changed, 19 insertions(+), 31 deletions(-) diff --git a/service/httpreadme_test.go b/service/httpreadme_test.go index e94f9e5..dc5ec12 100644 --- a/service/httpreadme_test.go +++ b/service/httpreadme_test.go @@ -66,22 +66,19 @@ func ExampleNewHTTPReadme() { // // List of all accessed environment variables. // - // | Key | Type | Required | Default | - // | --------------------------------------- | -------- | -------- | ------- | - // | `EXAMPLE_BOOL` | `bool` | | | - // | `EXAMPLE_REQUIRED_BOOL` | `bool` | | | - // | `EXAMPLE_REQUIRED_BOOL` | `bool` | `true` | | - // | `EXAMPLE_REQUIRED_STRING` | `string` | | | - // | `EXAMPLE_REQUIRED_STRING` | `string` | `true` | | - // | `EXAMPLE_STRING` | `string` | | `demo` | - // | `LOG_DISABLE_CALLER` | `bool` | | | - // | `LOG_DISABLE_STACKTRACE` | `bool` | | | - // | `LOG_ENCODING` | `string` | | `json` | - // | `LOG_LEVEL` | `string` | | `info` | - // | `LOG_MODE` | `string` | | `prod` | - // | `OTEL_ENABLED` | `bool` | | | - // | `OTEL_MONGO_COMMAND_ATTRIBUTE_DISABLED` | `bool` | | | - // | `OTEL_MONGO_ENABLED` | `bool` | | | + // | Key | Type | Required | Default | + // | ------------------------- | -------- | -------- | ------- | + // | `EXAMPLE_BOOL` | `bool` | | | + // | `EXAMPLE_REQUIRED_BOOL` | `bool` | | | + // | `EXAMPLE_REQUIRED_BOOL` | `bool` | `true` | | + // | `EXAMPLE_REQUIRED_STRING` | `string` | | | + // | `EXAMPLE_REQUIRED_STRING` | `string` | `true` | | + // | `EXAMPLE_STRING` | `string` | | `demo` | + // | `LOG_DISABLE_CALLER` | `bool` | | | + // | `LOG_DISABLE_STACKTRACE` | `bool` | | | + // | `LOG_ENCODING` | `string` | | `json` | + // | `LOG_LEVEL` | `string` | | `info` | + // | `LOG_MODE` | `string` | | `prod` | // // ### Config // @@ -129,20 +126,11 @@ func ExampleNewHTTPReadme() { // // List of all registered closers that are being called during graceful shutdown. // - // | Name | Type | Closer | Description | - // | ---------------- | ---------------------- | ------------------------ | -------------------------------------- | - // | | `*keelmongo.Persistor` | `ErrorCloserWithContext` | | - // | `demo-goroutine` | `*service.GoRoutine` | `ErrorCloserWithContext` | parallel: `1` | - // | `demp-http` | `*service.HTTP` | `ErrorCloserWithContext` | `http.HandlerFunc` on `localhost:8080` | - // | `readme` | `*service.HTTP` | `ErrorCloserWithContext` | `*http.ServeMux` on `localhost:9001` | - // - // ### Mongo - // - // List of all used mongo collections. - // - // | Database | Collection | Indices | - // | -------- | ---------- | ------------------------ | - // | `dummy` | `dummy` | `id_1`, `id_1_version_1` | + // | Name | Type | Closer | Description | + // | ---------------- | -------------------- | ------------------------ | -------------------------------------- | + // | `demo-goroutine` | `*service.GoRoutine` | `ErrorCloserWithContext` | parallel: `1` | + // | `demp-http` | `*service.HTTP` | `ErrorCloserWithContext` | `http.HandlerFunc` on `localhost:8080` | + // | `readme` | `*service.HTTP` | `ErrorCloserWithContext` | `*http.ServeMux` on `localhost:9001` | // // ### Metrics // @@ -176,7 +164,7 @@ func ExampleNewHTTPReadme() { // | `go_memstats_stack_inuse_bytes` | GAUGE | Number of bytes in use by the stack allocator. | // | `go_memstats_stack_sys_bytes` | GAUGE | Number of bytes obtained from system for stack allocator. | // | `go_memstats_sys_bytes` | GAUGE | Number of bytes obtained from system. | - // | `go_threads` | GAUGE | Number of OS threads created. |// + // | `go_threads` | GAUGE | Number of OS threads created. | // | `process_cpu_seconds_total` | COUNTER | Total user and system CPU time spent in seconds. | // | `process_max_fds` | GAUGE | Maximum number of open file descriptors. | // | `process_open_fds` | GAUGE | Number of open file descriptors. | From 6108728c77b20eced2331ec804610b67cbcc8aa6 Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Mon, 11 Sep 2023 10:50:24 +0200 Subject: [PATCH 078/134] style: remove ws --- server.go | 8 +++----- service/httpreadme_test.go | 4 +--- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/server.go b/server.go index 4546260..8b3a0e0 100644 --- a/server.go +++ b/server.go @@ -439,7 +439,6 @@ func (s *Server) readmeCloser() string { md.Println("List of all registered closers that are being called during graceful shutdown.") md.Println("") md.Table([]string{"Name", "Type", "Closer", "Description"}, rows) - md.Println("") } return md.String() @@ -466,7 +465,6 @@ func (s *Server) readmeHealthz() string { md.Println("List of all registered healthz probes that are being called during startup and runntime.") md.Println("") md.Table([]string{"Name", "Probe", "Type", "Description"}, rows) - md.Println("") } return md.String() @@ -493,10 +491,11 @@ func (s *Server) readmeServices() string { md.Println("List of all registered init services that are being immediately started.") md.Println("") md.Table([]string{"Name", "Type", "Address"}, rows) - md.Println("") } } + md.Println("") + { var rows [][]string for _, value := range s.services { @@ -508,12 +507,11 @@ func (s *Server) readmeServices() string { }) } if len(rows) > 0 { - md.Println("### Services") + md.Println("### Runtime Services") md.Println("") md.Println("List of all registered services that are being started.") md.Println("") md.Table([]string{"Name", "Type", "Description"}, rows) - md.Println("") } } diff --git a/service/httpreadme_test.go b/service/httpreadme_test.go index dc5ec12..5321971 100644 --- a/service/httpreadme_test.go +++ b/service/httpreadme_test.go @@ -100,7 +100,7 @@ func ExampleNewHTTPReadme() { // | -------- | --------------- | ------------------------------------ | // | `readme` | `*service.HTTP` | `*http.ServeMux` on `localhost:9001` | // - // ### Services + // ### Runtime Services // // List of all registered services that are being started. // @@ -109,7 +109,6 @@ func ExampleNewHTTPReadme() { // | `demo-goroutine` | `*service.GoRoutine` | parallel: `1` | // | `demp-http` | `*service.HTTP` | `http.HandlerFunc` on `localhost:8080` | // - // // ### Health probes // // List of all registered healthz probes that are being called during startup and runntime. @@ -121,7 +120,6 @@ func ExampleNewHTTPReadme() { // | `demp-http` | `always` | `*service.HTTP` | `http.HandlerFunc` on `localhost:8080` | // | `readme` | `always` | `*service.HTTP` | `*http.ServeMux` on `localhost:9001` | // - // // ### Closers // // List of all registered closers that are being called during graceful shutdown. From f5b8bbbda33115e3629627a015ca7d4bc4da946e Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Mon, 11 Sep 2023 10:54:43 +0200 Subject: [PATCH 079/134] style: remove ws --- server.go | 1 + 1 file changed, 1 insertion(+) diff --git a/server.go b/server.go index 8b3a0e0..d6f0a97 100644 --- a/server.go +++ b/server.go @@ -439,6 +439,7 @@ func (s *Server) readmeCloser() string { md.Println("List of all registered closers that are being called during graceful shutdown.") md.Println("") md.Table([]string{"Name", "Type", "Closer", "Description"}, rows) + md.Println("") } return md.String() From 7537cbcc1a04a75f9eb48b732b0af4d0fa54886f Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Mon, 11 Sep 2023 11:52:26 +0200 Subject: [PATCH 080/134] style: fix typo --- config/readme.go | 2 +- server.go | 2 +- service/httpreadme_test.go | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/config/readme.go b/config/readme.go index 22bbc12..bbcad9f 100644 --- a/config/readme.go +++ b/config/readme.go @@ -52,7 +52,7 @@ func Readme() string { } if len(configRows) > 0 { - md.Println("List of all registered config variabled with their defaults.") + md.Println("List of all registered config variables with their defaults.") md.Println("") md.Table([]string{"Key", "Type", "Required", "Default"}, configRows) md.Println("") diff --git a/server.go b/server.go index d6f0a97..284a7c7 100644 --- a/server.go +++ b/server.go @@ -463,7 +463,7 @@ func (s *Server) readmeHealthz() string { if len(rows) > 0 { md.Println("### Health probes") md.Println("") - md.Println("List of all registered healthz probes that are being called during startup and runntime.") + md.Println("List of all registered healthz probes that are being called during startup and runtime.") md.Println("") md.Table([]string{"Name", "Probe", "Type", "Description"}, rows) } diff --git a/service/httpreadme_test.go b/service/httpreadme_test.go index 5321971..7326c63 100644 --- a/service/httpreadme_test.go +++ b/service/httpreadme_test.go @@ -82,7 +82,7 @@ func ExampleNewHTTPReadme() { // // ### Config // - // List of all registered config variabled with their defaults. + // List of all registered config variables with their defaults. // // | Key | Type | Required | Default | // | ------------------------- | -------- | -------- | ---------- | @@ -111,7 +111,7 @@ func ExampleNewHTTPReadme() { // // ### Health probes // - // List of all registered healthz probes that are being called during startup and runntime. + // List of all registered healthz probes that are being called during startup and runtime. // // | Name | Probe | Type | Description | // | ---------------- | -------- | -------------------- | -------------------------------------- | From 03bc5bc50a119f24faa73bca56e3960363a21a19 Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Mon, 11 Sep 2023 13:52:24 +0200 Subject: [PATCH 081/134] feat: fix metrics readme --- metrics/readme.go | 26 ++--- service/httpreadme_test.go | 18 +++ telemetry/nonrecording/instruments.go | 162 -------------------------- telemetry/nonrecording/meter.go | 50 -------- 4 files changed, 27 insertions(+), 229 deletions(-) delete mode 100644 telemetry/nonrecording/instruments.go delete mode 100644 telemetry/nonrecording/meter.go diff --git a/metrics/readme.go b/metrics/readme.go index bb64f91..bd49412 100644 --- a/metrics/readme.go +++ b/metrics/readme.go @@ -2,31 +2,23 @@ package metrics import ( "github.com/foomo/keel/markdown" - "github.com/foomo/keel/telemetry/nonrecording" "github.com/prometheus/client_golang/prometheus" ) func Readme() string { md := markdown.Markdown{} - values := nonrecording.Metrics() + var rows [][]string - gatherer, _ := prometheus.DefaultRegisterer.(*prometheus.Registry).Gather() - for _, value := range gatherer { - values = append(values, nonrecording.Metric{ - Name: value.GetName(), - Type: value.GetType().String(), - Help: value.GetHelp(), - }) + if gatherer, err := prometheus.DefaultGatherer.Gather(); err == nil { + for _, value := range gatherer { + rows = append(rows, []string{ + value.GetName(), + value.GetType().String(), + value.GetHelp(), + }) + } } - rows := make([][]string, 0, len(values)) - for _, value := range values { - rows = append(rows, []string{ - markdown.Code(value.Name), - value.Type, - value.Help, - }) - } if len(rows) > 0 { md.Println("### Metrics") md.Println("") diff --git a/service/httpreadme_test.go b/service/httpreadme_test.go index 7326c63..3da0c69 100644 --- a/service/httpreadme_test.go +++ b/service/httpreadme_test.go @@ -11,6 +11,9 @@ import ( "github.com/foomo/keel/config" "github.com/foomo/keel/env" "github.com/foomo/keel/service" + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" + "go.opentelemetry.io/otel/metric/instrument" "go.uber.org/zap" ) @@ -21,6 +24,7 @@ func ExampleNewHTTPReadme() { svr := keel.NewServer( keel.WithLogger(zap.NewNop()), + keel.WithPrometheusMeter(true), keel.WithHTTPReadmeService(true), ) @@ -40,6 +44,18 @@ func ExampleNewHTTPReadme() { _ = config.MustGetBool(c, "example.required.bool") _ = config.MustGetString(c, "example.required.string") + m := svr.Meter() + + // add metrics + fooBarCounter := promauto.NewCounter(prometheus.CounterOpts{ + Name: "foo_bar_total", + Help: "Foo bar metrics", + }) + fooBazCounter, _ := m.SyncInt64().Counter("foo_baz_total", instrument.WithDescription("Foo baz metrics")) + + fooBarCounter.Add(1) + fooBazCounter.Add(svr.Context(), 1) + // add http service svr.AddService(service.NewHTTP(l, "demp-http", "localhost:8080", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) @@ -136,6 +152,8 @@ func ExampleNewHTTPReadme() { // // | Name | Type | Description | // | ---------------------------------- | ------- | ------------------------------------------------------------------ | + // | foo_bar_total | COUNTER | Foo bar metrics | + // | foo_baz_total | COUNTER | Foo baz metrics | // | `go_gc_duration_seconds` | SUMMARY | A summary of the pause duration of garbage collection cycles. | // | `go_goroutines` | GAUGE | Number of goroutines that currently exist. | // | `go_info` | GAUGE | Information about the Go environment. | diff --git a/telemetry/nonrecording/instruments.go b/telemetry/nonrecording/instruments.go deleted file mode 100644 index d11c927..0000000 --- a/telemetry/nonrecording/instruments.go +++ /dev/null @@ -1,162 +0,0 @@ -// Copyright The OpenTelemetry Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package nonrecording - -import ( - "context" - "strings" - - "go.opentelemetry.io/otel/attribute" - "go.opentelemetry.io/otel/metric/instrument" - "go.opentelemetry.io/otel/metric/instrument/asyncfloat64" - "go.opentelemetry.io/otel/metric/instrument/asyncint64" - "go.opentelemetry.io/otel/metric/instrument/syncfloat64" - "go.opentelemetry.io/otel/metric/instrument/syncint64" -) - -type Metric struct { - Name string - Type string - Help string -} - -var metrics []Metric - -func Metrics() []Metric { - return metrics -} - -type nonrecordingAsyncFloat64Instrument struct { - instrument.Asynchronous -} - -var ( - _ asyncfloat64.InstrumentProvider = nonrecordingAsyncFloat64Instrument{} - _ asyncfloat64.Counter = nonrecordingAsyncFloat64Instrument{} - _ asyncfloat64.UpDownCounter = nonrecordingAsyncFloat64Instrument{} - _ asyncfloat64.Gauge = nonrecordingAsyncFloat64Instrument{} -) - -func (n nonrecordingAsyncFloat64Instrument) Counter(name string, opts ...instrument.Option) (asyncfloat64.Counter, error) { - metrics = append(metrics, Metric{Name: strings.ReplaceAll(name, ".", "_"), Type: "COUNTER", Help: instrument.NewConfig(opts...).Description()}) - return n, nil -} - -func (n nonrecordingAsyncFloat64Instrument) UpDownCounter(name string, opts ...instrument.Option) (asyncfloat64.UpDownCounter, error) { - metrics = append(metrics, Metric{Name: strings.ReplaceAll(name, ".", "_"), Type: "UPDOWNCOUNTER", Help: instrument.NewConfig(opts...).Description()}) - return n, nil -} - -func (n nonrecordingAsyncFloat64Instrument) Gauge(name string, opts ...instrument.Option) (asyncfloat64.Gauge, error) { - metrics = append(metrics, Metric{Name: strings.ReplaceAll(name, ".", "_"), Type: "GAUGE", Help: instrument.NewConfig(opts...).Description()}) - return n, nil -} - -func (nonrecordingAsyncFloat64Instrument) Observe(context.Context, float64, ...attribute.KeyValue) { -} - -type nonrecordingAsyncInt64Instrument struct { - instrument.Asynchronous -} - -var ( - _ asyncint64.InstrumentProvider = nonrecordingAsyncInt64Instrument{} - _ asyncint64.Counter = nonrecordingAsyncInt64Instrument{} - _ asyncint64.UpDownCounter = nonrecordingAsyncInt64Instrument{} - _ asyncint64.Gauge = nonrecordingAsyncInt64Instrument{} -) - -func (n nonrecordingAsyncInt64Instrument) Counter(name string, opts ...instrument.Option) (asyncint64.Counter, error) { - metrics = append(metrics, Metric{Name: strings.ReplaceAll(name, ".", "_"), Type: "COUNTER", Help: instrument.NewConfig(opts...).Description()}) - return n, nil -} - -func (n nonrecordingAsyncInt64Instrument) UpDownCounter(name string, opts ...instrument.Option) (asyncint64.UpDownCounter, error) { - metrics = append(metrics, Metric{Name: strings.ReplaceAll(name, ".", "_"), Type: "UPDOWNCOUNTER", Help: instrument.NewConfig(opts...).Description()}) - return n, nil -} - -func (n nonrecordingAsyncInt64Instrument) Gauge(name string, opts ...instrument.Option) (asyncint64.Gauge, error) { - metrics = append(metrics, Metric{Name: strings.ReplaceAll(name, ".", "_"), Type: "GAUGE", Help: instrument.NewConfig(opts...).Description()}) - return n, nil -} - -func (nonrecordingAsyncInt64Instrument) Observe(context.Context, int64, ...attribute.KeyValue) { -} - -type nonrecordingSyncFloat64Instrument struct { - instrument.Synchronous -} - -var ( - _ syncfloat64.InstrumentProvider = nonrecordingSyncFloat64Instrument{} - _ syncfloat64.Counter = nonrecordingSyncFloat64Instrument{} - _ syncfloat64.UpDownCounter = nonrecordingSyncFloat64Instrument{} - _ syncfloat64.Histogram = nonrecordingSyncFloat64Instrument{} -) - -func (n nonrecordingSyncFloat64Instrument) Counter(name string, opts ...instrument.Option) (syncfloat64.Counter, error) { - metrics = append(metrics, Metric{Name: strings.ReplaceAll(name, ".", "_"), Type: "COUNTER", Help: instrument.NewConfig(opts...).Description()}) - return n, nil -} - -func (n nonrecordingSyncFloat64Instrument) UpDownCounter(name string, opts ...instrument.Option) (syncfloat64.UpDownCounter, error) { - metrics = append(metrics, Metric{Name: strings.ReplaceAll(name, ".", "_"), Type: "UPDOWNCOUNTER", Help: instrument.NewConfig(opts...).Description()}) - return n, nil -} - -func (n nonrecordingSyncFloat64Instrument) Histogram(name string, opts ...instrument.Option) (syncfloat64.Histogram, error) { - metrics = append(metrics, Metric{Name: strings.ReplaceAll(name, ".", "_"), Type: "HISTOGRAM", Help: instrument.NewConfig(opts...).Description()}) - return n, nil -} - -func (nonrecordingSyncFloat64Instrument) Add(context.Context, float64, ...attribute.KeyValue) { - -} - -func (nonrecordingSyncFloat64Instrument) Record(context.Context, float64, ...attribute.KeyValue) { - -} - -type nonrecordingSyncInt64Instrument struct { - instrument.Synchronous -} - -var ( - _ syncint64.InstrumentProvider = nonrecordingSyncInt64Instrument{} - _ syncint64.Counter = nonrecordingSyncInt64Instrument{} - _ syncint64.UpDownCounter = nonrecordingSyncInt64Instrument{} - _ syncint64.Histogram = nonrecordingSyncInt64Instrument{} -) - -func (n nonrecordingSyncInt64Instrument) Counter(name string, opts ...instrument.Option) (syncint64.Counter, error) { - metrics = append(metrics, Metric{Name: strings.ReplaceAll(name, ".", "_"), Type: "COUNTER", Help: instrument.NewConfig(opts...).Description()}) - return n, nil -} - -func (n nonrecordingSyncInt64Instrument) UpDownCounter(name string, opts ...instrument.Option) (syncint64.UpDownCounter, error) { - metrics = append(metrics, Metric{Name: strings.ReplaceAll(name, ".", "_"), Type: "UPDOWNCOUNTER", Help: instrument.NewConfig(opts...).Description()}) - return n, nil -} - -func (n nonrecordingSyncInt64Instrument) Histogram(name string, opts ...instrument.Option) (syncint64.Histogram, error) { - metrics = append(metrics, Metric{Name: strings.ReplaceAll(name, ".", "_"), Type: "HISTOGRAM", Help: instrument.NewConfig(opts...).Description()}) - return n, nil -} - -func (nonrecordingSyncInt64Instrument) Add(context.Context, int64, ...attribute.KeyValue) { -} -func (nonrecordingSyncInt64Instrument) Record(context.Context, int64, ...attribute.KeyValue) { -} diff --git a/telemetry/nonrecording/meter.go b/telemetry/nonrecording/meter.go deleted file mode 100644 index 15c9582..0000000 --- a/telemetry/nonrecording/meter.go +++ /dev/null @@ -1,50 +0,0 @@ -package nonrecording - -import ( - "context" - - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/metric/instrument" - "go.opentelemetry.io/otel/metric/instrument/asyncfloat64" - "go.opentelemetry.io/otel/metric/instrument/asyncint64" - "go.opentelemetry.io/otel/metric/instrument/syncfloat64" - "go.opentelemetry.io/otel/metric/instrument/syncint64" -) - -// NewNoopMeterProvider creates a MeterProvider that does not record any metrics. -func NewNoopMeterProvider() metric.MeterProvider { - return noopMeterProvider{} -} - -type noopMeterProvider struct{} - -var _ metric.MeterProvider = noopMeterProvider{} - -func (noopMeterProvider) Meter(instrumentationName string, opts ...metric.MeterOption) metric.Meter { - return noopMeter{} -} - -// NewNoopMeter creates a Meter that does not record any metrics. -func NewNoopMeter() metric.Meter { - return noopMeter{} -} - -type noopMeter struct{} - -var _ metric.Meter = noopMeter{} - -func (noopMeter) AsyncInt64() asyncint64.InstrumentProvider { - return nonrecordingAsyncInt64Instrument{} -} -func (noopMeter) AsyncFloat64() asyncfloat64.InstrumentProvider { - return nonrecordingAsyncFloat64Instrument{} -} -func (noopMeter) SyncInt64() syncint64.InstrumentProvider { - return nonrecordingSyncInt64Instrument{} -} -func (noopMeter) SyncFloat64() syncfloat64.InstrumentProvider { - return nonrecordingSyncFloat64Instrument{} -} -func (noopMeter) RegisterCallback([]instrument.Asynchronous, func(context.Context)) error { - return nil -} From ff50fa50853bb0096fa7a34694c3a6c04026bd8d Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Mon, 11 Sep 2023 13:57:06 +0200 Subject: [PATCH 082/134] feat: fix metrics readme --- service/httpreadme_test.go | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/service/httpreadme_test.go b/service/httpreadme_test.go index 3da0c69..b1b735b 100644 --- a/service/httpreadme_test.go +++ b/service/httpreadme_test.go @@ -82,19 +82,21 @@ func ExampleNewHTTPReadme() { // // List of all accessed environment variables. // - // | Key | Type | Required | Default | - // | ------------------------- | -------- | -------- | ------- | - // | `EXAMPLE_BOOL` | `bool` | | | - // | `EXAMPLE_REQUIRED_BOOL` | `bool` | | | - // | `EXAMPLE_REQUIRED_BOOL` | `bool` | `true` | | - // | `EXAMPLE_REQUIRED_STRING` | `string` | | | - // | `EXAMPLE_REQUIRED_STRING` | `string` | `true` | | - // | `EXAMPLE_STRING` | `string` | | `demo` | - // | `LOG_DISABLE_CALLER` | `bool` | | | - // | `LOG_DISABLE_STACKTRACE` | `bool` | | | - // | `LOG_ENCODING` | `string` | | `json` | - // | `LOG_LEVEL` | `string` | | `info` | - // | `LOG_MODE` | `string` | | `prod` | + // | Key | Type | Required | Default | + // | ------------------------- | -------- | -------- | --------- | + // | `EXAMPLE_BOOL` | `bool` | | | + // | `EXAMPLE_REQUIRED_BOOL` | `bool` | | | + // | `EXAMPLE_REQUIRED_BOOL` | `bool` | `true` | | + // | `EXAMPLE_REQUIRED_STRING` | `string` | | | + // | `EXAMPLE_REQUIRED_STRING` | `string` | `true` | | + // | `EXAMPLE_STRING` | `string` | | `demo` | + // | `LOG_DISABLE_CALLER` | `bool` | | | + // | `LOG_DISABLE_STACKTRACE` | `bool` | | | + // | `LOG_ENCODING` | `string` | | `json` | + // | `LOG_LEVEL` | `string` | | `info` | + // | `LOG_MODE` | `string` | | `prod` | + // | `OTEL_ENABLED` | `bool` | | | + // | `OTEL_SERVICE_NAME` | `string` | | `service` | // // ### Config // From 7230e50becbf24aa8b9fc695449ab9a29430c677 Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Mon, 11 Sep 2023 13:58:10 +0200 Subject: [PATCH 083/134] feat: fix metrics readme --- service/httpreadme_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/service/httpreadme_test.go b/service/httpreadme_test.go index b1b735b..1411c03 100644 --- a/service/httpreadme_test.go +++ b/service/httpreadme_test.go @@ -108,6 +108,7 @@ func ExampleNewHTTPReadme() { // | `example.required.bool` | `bool` | `true` | | // | `example.required.string` | `string` | `true` | | // | `example.string` | `string` | | `fallback` | + // | `otel.enabled` | `bool` | | `true` | // | `service.readme.enabled` | `bool` | | `true` | // // ### Init Services From 2c4734184c2ae62c9839c8674d966757a54e263c Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Mon, 11 Sep 2023 14:09:37 +0200 Subject: [PATCH 084/134] feat: add check --- service/http_test.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/service/http_test.go b/service/http_test.go index 8146d33..22331bb 100644 --- a/service/http_test.go +++ b/service/http_test.go @@ -2,7 +2,9 @@ package service_test import ( "io" + "net" "net/http" + "time" "github.com/foomo/keel" "github.com/foomo/keel/service" @@ -24,6 +26,9 @@ func ExampleNewHTTP() { ) go func() { + if _, err := net.DialTimeout("tcp", "localhost:8080", 10*time.Second); err != nil { + panic(err.Error()) + } resp, _ := http.Get("http://localhost:8080") //nolint:noctx defer resp.Body.Close() //nolint:govet b, _ := io.ReadAll(resp.Body) From 7fded0fa583a4e96232332c972ab62427d889f5e Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Mon, 11 Sep 2023 14:14:58 +0200 Subject: [PATCH 085/134] feat: fence output --- metrics/readme.go | 2 +- service/httpreadme_test.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/metrics/readme.go b/metrics/readme.go index bd49412..9273505 100644 --- a/metrics/readme.go +++ b/metrics/readme.go @@ -12,7 +12,7 @@ func Readme() string { if gatherer, err := prometheus.DefaultGatherer.Gather(); err == nil { for _, value := range gatherer { rows = append(rows, []string{ - value.GetName(), + markdown.Code(value.GetName()), value.GetType().String(), value.GetHelp(), }) diff --git a/service/httpreadme_test.go b/service/httpreadme_test.go index 1411c03..ab374af 100644 --- a/service/httpreadme_test.go +++ b/service/httpreadme_test.go @@ -155,8 +155,8 @@ func ExampleNewHTTPReadme() { // // | Name | Type | Description | // | ---------------------------------- | ------- | ------------------------------------------------------------------ | - // | foo_bar_total | COUNTER | Foo bar metrics | - // | foo_baz_total | COUNTER | Foo baz metrics | + // | `foo_bar_total` | COUNTER | Foo bar metrics | + // | `foo_baz_total` | COUNTER | Foo baz metrics | // | `go_gc_duration_seconds` | SUMMARY | A summary of the pause duration of garbage collection cycles. | // | `go_goroutines` | GAUGE | Number of goroutines that currently exist. | // | `go_info` | GAUGE | Information about the Go environment. | From 8da81ee42e55ef78b8a9d5e8737e39a9276785fe Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Mon, 11 Sep 2023 17:11:09 +0200 Subject: [PATCH 086/134] feat: extract helper --- service/helper_test.go | 22 ++++++++++++++++++++++ service/http_test.go | 12 ++---------- service/httpreadme_test.go | 8 ++------ 3 files changed, 26 insertions(+), 16 deletions(-) diff --git a/service/helper_test.go b/service/helper_test.go index af3aaf4..32a00d9 100644 --- a/service/helper_test.go +++ b/service/helper_test.go @@ -1,6 +1,9 @@ package service_test import ( + "io" + "net" + "net/http" "syscall" "time" ) @@ -18,3 +21,22 @@ func shutdown() { panic(err) } } + +func waitFor(addr string) { + if _, err := net.DialTimeout("tcp", addr, 10*time.Second); err != nil { + panic(err.Error()) + } +} + +func httpGet(url string) string { + resp, err := http.Get(url) //nolint:all + if err != nil { + panic(err.Error()) + } + defer resp.Body.Close() + b, err := io.ReadAll(resp.Body) + if err != nil { + panic(err.Error()) + } + return string(b) +} diff --git a/service/http_test.go b/service/http_test.go index 22331bb..e899744 100644 --- a/service/http_test.go +++ b/service/http_test.go @@ -1,10 +1,7 @@ package service_test import ( - "io" - "net" "net/http" - "time" "github.com/foomo/keel" "github.com/foomo/keel/service" @@ -26,13 +23,8 @@ func ExampleNewHTTP() { ) go func() { - if _, err := net.DialTimeout("tcp", "localhost:8080", 10*time.Second); err != nil { - panic(err.Error()) - } - resp, _ := http.Get("http://localhost:8080") //nolint:noctx - defer resp.Body.Close() //nolint:govet - b, _ := io.ReadAll(resp.Body) - l.Info(string(b)) + waitFor("localhost:8080") + l.Info(httpGet("http://localhost:8080")) shutdown() }() diff --git a/service/httpreadme_test.go b/service/httpreadme_test.go index ab374af..21981f2 100644 --- a/service/httpreadme_test.go +++ b/service/httpreadme_test.go @@ -2,8 +2,6 @@ package service_test import ( "context" - "fmt" - "io" "net/http" "os" @@ -68,10 +66,8 @@ func ExampleNewHTTPReadme() { })) go func() { - resp, _ := http.Get("http://localhost:9001/readme") //nolint:noctx - defer resp.Body.Close() //nolint:govet - b, _ := io.ReadAll(resp.Body) - fmt.Print(string(b)) + waitFor("localhost:9001") + l.Info(httpGet("http://localhost:9001/readme")) shutdown() }() From f83b74cbf7f9f2fd0a0c72c516077ddd1923b81c Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Mon, 11 Sep 2023 17:21:53 +0200 Subject: [PATCH 087/134] revert: use example --- service/httpreadme_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/service/httpreadme_test.go b/service/httpreadme_test.go index 21981f2..39229d9 100644 --- a/service/httpreadme_test.go +++ b/service/httpreadme_test.go @@ -21,7 +21,7 @@ func ExampleNewHTTPReadme() { _ = os.Setenv("EXAMPLE_REQUIRED_STRING", "foo") svr := keel.NewServer( - keel.WithLogger(zap.NewNop()), + keel.WithLogger(zap.NewExample()), keel.WithPrometheusMeter(true), keel.WithHTTPReadmeService(true), ) From b459926d5331616c4eaca32948d8d867b1332d2d Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Mon, 11 Sep 2023 17:38:00 +0200 Subject: [PATCH 088/134] revert: use print --- service/httpreadme_test.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/service/httpreadme_test.go b/service/httpreadme_test.go index 39229d9..5ebb6f7 100644 --- a/service/httpreadme_test.go +++ b/service/httpreadme_test.go @@ -2,6 +2,7 @@ package service_test import ( "context" + "fmt" "net/http" "os" @@ -21,7 +22,7 @@ func ExampleNewHTTPReadme() { _ = os.Setenv("EXAMPLE_REQUIRED_STRING", "foo") svr := keel.NewServer( - keel.WithLogger(zap.NewExample()), + keel.WithLogger(zap.NewNop()), keel.WithPrometheusMeter(true), keel.WithHTTPReadmeService(true), ) @@ -67,7 +68,7 @@ func ExampleNewHTTPReadme() { go func() { waitFor("localhost:9001") - l.Info(httpGet("http://localhost:9001/readme")) + fmt.Print(httpGet("http://localhost:9001/readme")) shutdown() }() From 3baafb4042cd661082c3ddebf7dc04d19f10fe89 Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Mon, 11 Sep 2023 17:45:36 +0200 Subject: [PATCH 089/134] feat: adopt test --- service/goroutine_test.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/service/goroutine_test.go b/service/goroutine_test.go index 656a955..bcb806d 100644 --- a/service/goroutine_test.go +++ b/service/goroutine_test.go @@ -11,8 +11,6 @@ import ( ) func ExampleNewGoRoutine() { - shutdownAfter(3 * time.Second) - svr := keel.NewServer( keel.WithLogger(zap.NewExample()), ) @@ -30,6 +28,7 @@ func ExampleNewGoRoutine() { l.Info("ping") time.Sleep(time.Second) + shutdown() } }), ) @@ -41,7 +40,6 @@ func ExampleNewGoRoutine() { // {"level":"info","msg":"starting keel service","keel_service_type":"goroutine","keel_service_name":"demo"} // {"level":"info","msg":"ping","keel_service_type":"goroutine","keel_service_name":"demo","keel_service_inst":0} // {"level":"info","msg":"ping","keel_service_type":"goroutine","keel_service_name":"demo","keel_service_inst":0} - // {"level":"info","msg":"ping","keel_service_type":"goroutine","keel_service_name":"demo","keel_service_inst":0} // {"level":"debug","msg":"keel graceful shutdown"} // {"level":"info","msg":"stopping keel service","keel_service_type":"goroutine","keel_service_name":"demo"} // {"level":"info","msg":"context has been canceled du to graceful shutdow","keel_service_type":"goroutine","keel_service_name":"demo","keel_service_inst":0} From b5977de39cc9fb2513744606fd365ddc0167d97f Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Mon, 11 Sep 2023 17:46:31 +0200 Subject: [PATCH 090/134] feat: adopt test --- service/goroutine_test.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/service/goroutine_test.go b/service/goroutine_test.go index bcb806d..6257789 100644 --- a/service/goroutine_test.go +++ b/service/goroutine_test.go @@ -2,6 +2,7 @@ package service_test import ( "context" + "sync" "time" "github.com/foomo/keel" @@ -11,6 +12,8 @@ import ( ) func ExampleNewGoRoutine() { + var once sync.Once + svr := keel.NewServer( keel.WithLogger(zap.NewExample()), ) @@ -28,7 +31,7 @@ func ExampleNewGoRoutine() { l.Info("ping") time.Sleep(time.Second) - shutdown() + once.Do(shutdown) } }), ) From 329ec8ddb1542a4886db87c96ba212c5b232674c Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Mon, 11 Sep 2023 17:53:24 +0200 Subject: [PATCH 091/134] fix: nil pointer --- persistence/mongo/collection.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/persistence/mongo/collection.go b/persistence/mongo/collection.go index c50a21c..89ae5f0 100644 --- a/persistence/mongo/collection.go +++ b/persistence/mongo/collection.go @@ -133,7 +133,7 @@ func NewCollection(db *mongo.Database, name string, opts ...CollectionOption) (* indices[db.Name()] = map[string][]string{} } for _, index := range o.Indexes { - if index.Options.Name != nil { + if index.Options != nil && index.Options.Name != nil { indices[db.Name()][name] = append(indices[db.Name()][name], *index.Options.Name) } } From ea14d2be52a052be29031df5e8fa0672ae355944 Mon Sep 17 00:00:00 2001 From: Michael Hegel Date: Wed, 13 Sep 2023 09:56:59 +0200 Subject: [PATCH 092/134] returning original response AND error --- net/http/roundtripware/circuitbreaker.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/net/http/roundtripware/circuitbreaker.go b/net/http/roundtripware/circuitbreaker.go index 8f7d0a7..b7bc05c 100644 --- a/net/http/roundtripware/circuitbreaker.go +++ b/net/http/roundtripware/circuitbreaker.go @@ -220,7 +220,8 @@ func CircuitBreaker(set *CircuitBreakerSettings, opts ...CircuitBreakerOption) R done(errSuccess == nil) } - return resp, nil + // return the response and error received from the next call + return resp, err } } } From c2cccd9952cc98ac8e752722c32954d731193a70 Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Mon, 2 Oct 2023 14:42:18 +0200 Subject: [PATCH 093/134] fix: race condition --- server.go | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/server.go b/server.go index b38c095..bf318a3 100644 --- a/server.go +++ b/server.go @@ -6,6 +6,7 @@ import ( "net/http" "os" "os/signal" + "sync" "sync/atomic" "syscall" "time" @@ -39,7 +40,8 @@ type Server struct { shutdownSignals []os.Signal shutdownTimeout time.Duration running atomic.Bool - closers []interface{} + syncClosers []interface{} + syncClosersLock sync.RWMutex probes map[HealthzType][]interface{} ctx context.Context ctxCancel context.Context @@ -78,7 +80,7 @@ func NewServer(opts ...Option) *Server { defer timeoutCancel() // append internal closers - closers := append(inst.closers, inst.traceProvider, inst.meterProvider) //nolint:gocritic + closers := append(inst.closers(), inst.traceProvider, inst.meterProvider) for _, closer := range closers { l := inst.l.With(log.FName(fmt.Sprintf("%T", closer))) @@ -172,6 +174,18 @@ func NewServer(opts ...Option) *Server { return inst } +func (s *Server) closers() []interface{} { + s.syncClosersLock.RLock() + defer s.syncClosersLock.RUnlock() + return s.syncClosers +} + +func (s *Server) setClosers(v []interface{}) { + s.syncClosersLock.Lock() + defer s.syncClosersLock.Unlock() + s.syncClosers = v +} + // Logger returns server logger func (s *Server) Logger() *zap.Logger { return s.l @@ -223,7 +237,7 @@ func (s *Server) AddServices(services ...Service) { // AddCloser adds a closer to be called on shutdown func (s *Server) AddCloser(closer interface{}) { - for _, value := range s.closers { + for _, value := range s.closers() { if value == closer { return } @@ -245,7 +259,7 @@ func (s *Server) AddCloser(closer interface{}) { ErrorUnsubscriber, UnsubscriberWithContext, ErrorUnsubscriberWithContext: - s.closers = append(s.closers, closer) + s.setClosers(append(s.closers(), closer)) default: s.l.Warn("unable to add closer", log.FValue(fmt.Sprintf("%T", closer))) } From 1b1413487720653db3ed1bc9a44f2e06b13f9d9f Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Mon, 2 Oct 2023 14:47:30 +0200 Subject: [PATCH 094/134] fix: race condition --- serviceenabler.go | 50 ++++++++++++++++++++++++++++++----------------- 1 file changed, 32 insertions(+), 18 deletions(-) diff --git a/serviceenabler.go b/serviceenabler.go index dd01a1a..a648b35 100644 --- a/serviceenabler.go +++ b/serviceenabler.go @@ -2,6 +2,7 @@ package keel import ( "context" + "sync" "time" "go.uber.org/zap" @@ -12,39 +13,52 @@ import ( type ServiceFunc func() Service type ServiceEnabler struct { - l *zap.Logger - ctx context.Context - name string - service Service - serviceFn ServiceFunc - enabled bool - enabledFn func() bool - closed bool + l *zap.Logger + ctx context.Context + name string + service Service + serviceFn ServiceFunc + syncEnabled bool + syncEnabledLock sync.RWMutex + enabledFn func() bool + closed bool } func NewServiceEnabler(l *zap.Logger, name string, serviceFn ServiceFunc, enabledFn func() bool) *ServiceEnabler { return &ServiceEnabler{ - l: log.WithServiceName(l, name), - name: name, - serviceFn: serviceFn, - enabled: enabledFn(), - enabledFn: enabledFn, + l: log.WithServiceName(l, name), + name: name, + serviceFn: serviceFn, + syncEnabled: enabledFn(), + enabledFn: enabledFn, } } +func (w *ServiceEnabler) enabled() bool { + w.syncEnabledLock.RLock() + defer w.syncEnabledLock.RUnlock() + return w.syncEnabled +} + +func (w *ServiceEnabler) setEnabled(v bool) { + w.syncEnabledLock.Lock() + defer w.syncEnabledLock.Unlock() + w.syncEnabled = v +} + func (w *ServiceEnabler) Name() string { return w.name } func (w *ServiceEnabler) enable(ctx context.Context) error { - w.enabled = true + w.setEnabled(true) w.service = w.serviceFn() w.l.Info("starting dynamic service") return w.service.Start(ctx) } func (w *ServiceEnabler) disable(ctx context.Context) error { - w.enabled = false + w.setEnabled(false) w.l.Info("stopping dynamic service") return w.service.Close(ctx) } @@ -56,7 +70,7 @@ func (w *ServiceEnabler) watch() { break } time.Sleep(time.Second) - if value := w.enabledFn(); value != w.enabled { + if value := w.enabledFn(); value != w.enabled() { if value { go func() { if err := w.enable(w.ctx); err != nil { @@ -76,7 +90,7 @@ func (w *ServiceEnabler) watch() { func (w *ServiceEnabler) Start(ctx context.Context) error { w.watch() w.ctx = ctx - if w.enabled { + if w.enabled() { if err := w.enable(w.ctx); err != nil { return err } @@ -89,7 +103,7 @@ func (w *ServiceEnabler) Start(ctx context.Context) error { func (w *ServiceEnabler) Close(ctx context.Context) error { l := log.WithServiceName(w.l, w.Name()) w.closed = true - if w.enabled { + if w.enabled() { if err := w.disable(w.ctx); err != nil { return err } From 068b93c500a8ecc763454d67a905890d0fd3d475 Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Mon, 2 Oct 2023 14:48:04 +0200 Subject: [PATCH 095/134] refactor: restructure --- serviceenabler.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/serviceenabler.go b/serviceenabler.go index a648b35..3f06271 100644 --- a/serviceenabler.go +++ b/serviceenabler.go @@ -34,6 +34,10 @@ func NewServiceEnabler(l *zap.Logger, name string, serviceFn ServiceFunc, enable } } +func (w *ServiceEnabler) Name() string { + return w.name +} + func (w *ServiceEnabler) enabled() bool { w.syncEnabledLock.RLock() defer w.syncEnabledLock.RUnlock() @@ -46,10 +50,6 @@ func (w *ServiceEnabler) setEnabled(v bool) { w.syncEnabled = v } -func (w *ServiceEnabler) Name() string { - return w.name -} - func (w *ServiceEnabler) enable(ctx context.Context) error { w.setEnabled(true) w.service = w.serviceFn() From d30495d2a276f59e0105720c942e752e9f16ad8f Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Tue, 3 Oct 2023 10:19:12 +0200 Subject: [PATCH 096/134] fix: probes race condition --- option.go | 2 +- server.go | 45 +++++++++++++++++++++++++++++---------------- 2 files changed, 30 insertions(+), 17 deletions(-) diff --git a/option.go b/option.go index e6b82a1..e519ea2 100644 --- a/option.go +++ b/option.go @@ -171,7 +171,7 @@ func WithHTTPPProfService(enabled bool) Option { func WithHTTPHealthzService(enabled bool) Option { return func(inst *Server) { if config.GetBool(inst.Config(), "service.healthz.enabled", enabled)() { - service := NewDefaultServiceHTTPProbes(inst.probes) + service := NewDefaultServiceHTTPProbes(inst.probes()) inst.initServices = append(inst.initServices, service) inst.AddAlwaysHealthzers(service) } diff --git a/server.go b/server.go index bf318a3..df43165 100644 --- a/server.go +++ b/server.go @@ -42,7 +42,8 @@ type Server struct { running atomic.Bool syncClosers []interface{} syncClosersLock sync.RWMutex - probes map[HealthzType][]interface{} + syncProbes map[HealthzType][]interface{} + syncProbesLock sync.RWMutex ctx context.Context ctxCancel context.Context ctxCancelFn context.CancelFunc @@ -56,7 +57,7 @@ func NewServer(opts ...Option) *Server { inst := &Server{ shutdownTimeout: 30 * time.Second, shutdownSignals: []os.Signal{os.Interrupt, syscall.SIGTERM}, - probes: map[HealthzType][]interface{}{}, + syncProbes: map[HealthzType][]interface{}{}, ctx: context.Background(), c: config.Config(), l: log.Logger(), @@ -174,18 +175,6 @@ func NewServer(opts ...Option) *Server { return inst } -func (s *Server) closers() []interface{} { - s.syncClosersLock.RLock() - defer s.syncClosersLock.RUnlock() - return s.syncClosers -} - -func (s *Server) setClosers(v []interface{}) { - s.syncClosersLock.Lock() - defer s.syncClosersLock.Unlock() - s.syncClosers = v -} - // Logger returns server logger func (s *Server) Logger() *zap.Logger { return s.l @@ -259,7 +248,7 @@ func (s *Server) AddCloser(closer interface{}) { ErrorUnsubscriber, UnsubscriberWithContext, ErrorUnsubscriberWithContext: - s.setClosers(append(s.closers(), closer)) + s.addClosers(closer) default: s.l.Warn("unable to add closer", log.FValue(fmt.Sprintf("%T", closer))) } @@ -281,7 +270,7 @@ func (s *Server) AddHealthzer(typ HealthzType, probe interface{}) { ErrorHealthzWithContext, ErrorPinger, ErrorPingerWithContext: - s.probes[typ] = append(s.probes[typ], probe) + s.addProbes(typ, probe) default: s.l.Debug("not a healthz probe", log.FValue(fmt.Sprintf("%T", probe))) } @@ -359,6 +348,30 @@ func (s *Server) Run() { s.l.Info("keel server stopped") } +func (s *Server) closers() []interface{} { + s.syncClosersLock.RLock() + defer s.syncClosersLock.RUnlock() + return s.syncClosers +} + +func (s *Server) addClosers(v ...interface{}) { + s.syncClosersLock.Lock() + defer s.syncClosersLock.Unlock() + s.syncClosers = append(s.syncClosers, v...) +} + +func (s *Server) probes() map[HealthzType][]interface{} { + s.syncProbesLock.RLock() + defer s.syncProbesLock.RUnlock() + return s.syncProbes +} + +func (s *Server) addProbes(typ HealthzType, v ...interface{}) { + s.syncProbesLock.Lock() + defer s.syncProbesLock.Unlock() + s.syncProbes[typ] = append(s.syncProbes[typ], v...) +} + // startService starts the given services func (s *Server) startService(services ...Service) { for _, service := range services { From 17c41a7dbe888abbccf5888702682741d95573a7 Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Tue, 3 Oct 2023 11:16:33 +0200 Subject: [PATCH 097/134] fix: closed race condition --- serviceenabler.go | 69 ++++++++++++++++++++++++++++------------------- 1 file changed, 41 insertions(+), 28 deletions(-) diff --git a/serviceenabler.go b/serviceenabler.go index 3f06271..bfcdccc 100644 --- a/serviceenabler.go +++ b/serviceenabler.go @@ -21,7 +21,8 @@ type ServiceEnabler struct { syncEnabled bool syncEnabledLock sync.RWMutex enabledFn func() bool - closed bool + syncClosed bool + syncClosedLock sync.RWMutex } func NewServiceEnabler(l *zap.Logger, name string, serviceFn ServiceFunc, enabledFn func() bool) *ServiceEnabler { @@ -38,6 +39,44 @@ func (w *ServiceEnabler) Name() string { return w.name } +func (w *ServiceEnabler) Start(ctx context.Context) error { + w.watch() + w.ctx = ctx + if w.enabled() { + if err := w.enable(w.ctx); err != nil { + return err + } + } else { + w.l.Info("skipping disabled dynamic service") + } + return nil +} + +func (w *ServiceEnabler) Close(ctx context.Context) error { + l := log.WithServiceName(w.l, w.Name()) + w.setClosed(true) + if w.enabled() { + if err := w.disable(w.ctx); err != nil { + return err + } + } else { + l.Info("skipping disabled dynamic service") + } + return nil +} + +func (w *ServiceEnabler) closed() bool { + w.syncClosedLock.RLock() + defer w.syncClosedLock.RUnlock() + return w.syncClosed +} + +func (w *ServiceEnabler) setClosed(v bool) { + w.syncClosedLock.Lock() + defer w.syncClosedLock.Unlock() + w.syncClosed = v +} + func (w *ServiceEnabler) enabled() bool { w.syncEnabledLock.RLock() defer w.syncEnabledLock.RUnlock() @@ -66,7 +105,7 @@ func (w *ServiceEnabler) disable(ctx context.Context) error { func (w *ServiceEnabler) watch() { go func() { for { - if w.closed { + if w.closed() { break } time.Sleep(time.Second) @@ -86,29 +125,3 @@ func (w *ServiceEnabler) watch() { } }() } - -func (w *ServiceEnabler) Start(ctx context.Context) error { - w.watch() - w.ctx = ctx - if w.enabled() { - if err := w.enable(w.ctx); err != nil { - return err - } - } else { - w.l.Info("skipping disabled dynamic service") - } - return nil -} - -func (w *ServiceEnabler) Close(ctx context.Context) error { - l := log.WithServiceName(w.l, w.Name()) - w.closed = true - if w.enabled() { - if err := w.disable(w.ctx); err != nil { - return err - } - } else { - l.Info("skipping disabled dynamic service") - } - return nil -} From 6e6dca86c870a9e21c022ff37f27eee84532caf3 Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Wed, 18 Oct 2023 16:37:11 +0200 Subject: [PATCH 098/134] fix: pass provider --- option.go | 2 +- service/httpreadme.go | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/option.go b/option.go index 7fad21f..b00a486 100644 --- a/option.go +++ b/option.go @@ -183,7 +183,7 @@ func WithHTTPHealthzService(enabled bool) Option { func WithHTTPReadmeService(enabled bool) Option { return func(inst *Server) { if config.GetBool(inst.Config(), "service.readme.enabled", enabled)() { - svs := service.NewDefaultHTTPReadme(inst.Logger(), &inst.readmers) + svs := service.NewDefaultHTTPReadme(inst.Logger(), inst.readmers) inst.initServices = append(inst.initServices, svs) inst.AddAlwaysHealthzers(svs) } diff --git a/service/httpreadme.go b/service/httpreadme.go index 3cb5026..967173a 100644 --- a/service/httpreadme.go +++ b/service/httpreadme.go @@ -14,7 +14,7 @@ const ( DefaultHTTPReadmePath = "/readme" ) -func NewHTTPReadme(l *zap.Logger, name, addr, path string, readmers *[]interfaces.Readmer) *HTTP { +func NewHTTPReadme(l *zap.Logger, name, addr, path string, readmers func() []interfaces.Readmer) *HTTP { handler := http.NewServeMux() handler.HandleFunc(path, func(w http.ResponseWriter, r *http.Request) { switch r.Method { @@ -22,7 +22,7 @@ func NewHTTPReadme(l *zap.Logger, name, addr, path string, readmers *[]interface w.Header().Add("Content-Type", "text/markdown") w.WriteHeader(http.StatusOK) md := &markdown.Markdown{} - for _, readmer := range *readmers { + for _, readmer := range readmers() { md.Print(readmer.Readme()) } _, _ = w.Write([]byte(md.String())) @@ -33,7 +33,7 @@ func NewHTTPReadme(l *zap.Logger, name, addr, path string, readmers *[]interface return NewHTTP(l, name, addr, handler) } -func NewDefaultHTTPReadme(l *zap.Logger, readmers *[]interfaces.Readmer) *HTTP { +func NewDefaultHTTPReadme(l *zap.Logger, readmers func() []interfaces.Readmer) *HTTP { return NewHTTPReadme( l, DefaultHTTPReadmeName, From ffd01bfd9c6647ab51c35b963c79830ab68e78bb Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Wed, 18 Oct 2023 17:04:48 +0200 Subject: [PATCH 099/134] fix: compare --- server.go | 5 ----- 1 file changed, 5 deletions(-) diff --git a/server.go b/server.go index 41da268..b786b6a 100644 --- a/server.go +++ b/server.go @@ -260,11 +260,6 @@ func (s *Server) AddClosers(closers ...interface{}) { // AddReadmer adds a readmer to be added to the exposed readme func (s *Server) AddReadmer(readmer interfaces.Readmer) { - for _, value := range s.readmers() { - if value == readmer { - return - } - } s.addReadmers(readmer) } From 4ac67cead907968fd688c8fa1d769cc24dd4d277 Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Thu, 7 Dec 2023 15:00:42 +0100 Subject: [PATCH 100/134] fix: pprof --- service/httppprof_pprof.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/service/httppprof_pprof.go b/service/httppprof_pprof.go index ca020c4..9336e0c 100644 --- a/service/httppprof_pprof.go +++ b/service/httppprof_pprof.go @@ -17,17 +17,17 @@ const ( DefaultHTTPPProfPath = "/debug/pprof" ) -func NewHTTPPProf(l *zap.Logger, name, addr, path string) *ServiceHTTP { +func NewHTTPPProf(l *zap.Logger, name, addr, path string) *HTTP { handler := http.NewServeMux() handler.HandleFunc(path+"/", pprof.Index) handler.HandleFunc(path+"/cmdline", pprof.Cmdline) handler.HandleFunc(path+"/profile", pprof.Profile) handler.HandleFunc(path+"/symbol", pprof.Symbol) handler.HandleFunc(path+"/trace", pprof.Trace) - return NewServiceHTTP(l, name, addr, handler) + return NewHTTP(l, name, addr, handler) } -func NewDefaultHTTPPProf() *ServiceHTTP { +func NewDefaultHTTPPProf() *HTTP { return NewHTTPPProf( log.Logger(), DefaultHTTPPProfName, From 48af074cd6ec3960b8b347d577dd1e82046948f9 Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Thu, 7 Dec 2023 15:17:05 +0100 Subject: [PATCH 101/134] fix: default pprof arguments --- service/httppprof_pprof.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/service/httppprof_pprof.go b/service/httppprof_pprof.go index 9336e0c..ff96229 100644 --- a/service/httppprof_pprof.go +++ b/service/httppprof_pprof.go @@ -7,7 +7,6 @@ import ( "net/http" "net/http/pprof" - "github.com/foomo/keel/log" "go.uber.org/zap" ) @@ -27,9 +26,9 @@ func NewHTTPPProf(l *zap.Logger, name, addr, path string) *HTTP { return NewHTTP(l, name, addr, handler) } -func NewDefaultHTTPPProf() *HTTP { +func NewDefaultHTTPPProf(l *zap.Logger) *HTTP { return NewHTTPPProf( - log.Logger(), + l, DefaultHTTPPProfName, DefaultHTTPPProfAddr, DefaultHTTPPProfPath, From e100f0730ac3428387d2086b11807b5727605c14 Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Thu, 14 Dec 2023 08:34:47 +0100 Subject: [PATCH 102/134] wip: optimize graceful shutdown --- examples/graceful/main.go | 60 ++++++++++++++++++++++++++++++++++++++- interfaces/closer.go | 14 +++++++++ server.go | 2 +- 3 files changed, 74 insertions(+), 2 deletions(-) diff --git a/examples/graceful/main.go b/examples/graceful/main.go index 4286086..0e50152 100644 --- a/examples/graceful/main.go +++ b/examples/graceful/main.go @@ -4,8 +4,10 @@ import ( "context" "net/http" "sync" + "syscall" "time" + "github.com/foomo/keel/interfaces" "github.com/foomo/keel/service" "go.uber.org/zap" @@ -15,6 +17,7 @@ import ( func main() { svr := keel.NewServer( + //keel.WithLogger(zap.NewExample()), keel.WithHTTPZapService(true), keel.WithHTTPViperService(true), keel.WithHTTPPrometheusService(true), @@ -28,15 +31,70 @@ func main() { // create demo service svs := http.NewServeMux() svs.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { + l.Info("handling request...") + time.Sleep(3 * time.Second) w.WriteHeader(http.StatusOK) _, _ = w.Write([]byte("OK")) + l.Info("... handled request") }) svr.AddService( service.NewHTTP(l, "demo", "localhost:8080", svs), ) - svr.Run() + svr.AddCloser(interfaces.CloseFunc(func(ctx context.Context) error { + l.Info("custom closer") + return nil + })) + + go svr.Run() + time.Sleep(1 * time.Second) + l.Info("1. starting test") + + { + l.Info("2. checking healthz") + readiness(l, "http://localhost:9400/healthz/readiness") + } + + go func() { + l.Info("2. sending request") + if r, err := http.Get("http://localhost:8080"); err != nil { + l.Fatal(err.Error()) + } else { + l.Info(" /", zap.Int("status", r.StatusCode)) + } + }() + time.Sleep(100 * time.Millisecond) + + l.Info("3. sending shutdown signal") + if err := syscall.Kill(syscall.Getpid(), syscall.SIGTERM); err != nil { + l.Fatal(err.Error()) + } + + { + l.Info("2. checking healthz") + readiness(l, "http://localhost:9400/healthz/readiness") + } + + l.Info("4. waiting for shutdown") + time.Sleep(10 * time.Second) + l.Info(" done") +} + +func readiness(l *zap.Logger, url string) { + ctx, cancel := context.WithTimeout(context.Background(), 100*time.Millisecond) + defer cancel() + req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) + if err != nil { + l.Error(err.Error()) + return + } + resp, err := http.DefaultClient.Do(req) + if err != nil { + l.Error(err.Error()) + return + } + l.Info(url, zap.Int("status", resp.StatusCode)) } func waitGroup(ctx context.Context, l *zap.Logger) { diff --git a/interfaces/closer.go b/interfaces/closer.go index abbc719..9107be2 100644 --- a/interfaces/closer.go +++ b/interfaces/closer.go @@ -4,6 +4,14 @@ import ( "context" ) +type CloseHandler struct { + Value func(ctx context.Context) error +} + +func (r CloseHandler) Close(ctx context.Context) error { + return r.Value(ctx) +} + // Closer interface type Closer interface { Close() @@ -23,3 +31,9 @@ type CloserWithContext interface { type ErrorCloserWithContext interface { Close(ctx context.Context) error } + +func CloseFunc(v func(ctx context.Context) error) CloseHandler { + return CloseHandler{ + Value: v, + } +} diff --git a/server.go b/server.go index b786b6a..abd55b4 100644 --- a/server.go +++ b/server.go @@ -65,7 +65,7 @@ type Server struct { func NewServer(opts ...Option) *Server { inst := &Server{ shutdownTimeout: 30 * time.Second, - shutdownSignals: []os.Signal{os.Interrupt, syscall.SIGTERM}, + shutdownSignals: []os.Signal{syscall.SIGTERM}, syncReadmers: []interfaces.Readmer{}, syncProbes: map[healthz.Type][]interface{}{}, ctx: context.Background(), From b29c1c2506467a015869c82aa9c0de00c463759e Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Thu, 14 Dec 2023 09:45:58 +0100 Subject: [PATCH 103/134] feat: fix lint error --- net/http/roundtripware/circuitbreaker.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/net/http/roundtripware/circuitbreaker.go b/net/http/roundtripware/circuitbreaker.go index b7bc05c..c37072d 100644 --- a/net/http/roundtripware/circuitbreaker.go +++ b/net/http/roundtripware/circuitbreaker.go @@ -99,7 +99,7 @@ func CircuitBreakerWithMetric( } func CircuitBreakerWithIsSuccessful( - isSuccessful func(err error, req *http.Request, resp *http.Response) (e error), + isSuccessful func(err error, req *http.Request, resp *http.Response) error, copyReqBody bool, copyRespBody bool, ) CircuitBreakerOption { @@ -133,7 +133,7 @@ func CircuitBreaker(set *CircuitBreakerSettings, opts ...CircuitBreakerOption) R circuitBreaker := gobreaker.NewTwoStepCircuitBreaker(cbrSettings) return func(l *zap.Logger, next Handler) Handler { - return func(r *http.Request) (resp *http.Response, err error) { + return func(r *http.Request) (resp *http.Response, err error) { //nolint:nonamedreturns if r == nil { return nil, errors.New("request is nil") } From 9745fce55c1083d5fc9bd4639c459a1f1fa1998f Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Fri, 15 Mar 2024 10:09:30 +0100 Subject: [PATCH 104/134] feat: make default const overrideable --- service/httphealthz.go | 9 +++++---- service/httppprof.go | 2 +- service/httppprof_pprof.go | 2 +- service/httpprometheus.go | 2 +- service/httpreadme.go | 2 +- service/httpviper.go | 2 +- service/httpzap.go | 2 +- 7 files changed, 11 insertions(+), 10 deletions(-) diff --git a/service/httphealthz.go b/service/httphealthz.go index 09c5606..80fa45a 100644 --- a/service/httphealthz.go +++ b/service/httphealthz.go @@ -7,12 +7,11 @@ import ( "github.com/foomo/keel/healthz" "github.com/foomo/keel/interfaces" - "go.uber.org/zap" - "github.com/foomo/keel/log" + "go.uber.org/zap" ) -const ( +var ( DefaultHTTPHealthzName = "healthz" DefaultHTTPHealthzAddr = ":9400" DefaultHTTPHealthzPath = "/healthz" @@ -31,7 +30,9 @@ func NewHealthz(l *zap.Logger, name, addr, path string, probes map[healthz.Type] unavailable := func(l *zap.Logger, w http.ResponseWriter, r *http.Request, err error) { if err != nil { - log.WithHTTPRequest(l, r).Info("http healthz server", log.FError(err), log.FHTTPStatusCode(http.StatusServiceUnavailable)) + l = log.WithError(l, err) + l = log.WithHTTPRequest(l, r) + l.Debug("healthz probe failed") http.Error(w, http.StatusText(http.StatusServiceUnavailable), http.StatusServiceUnavailable) } } diff --git a/service/httppprof.go b/service/httppprof.go index 2ff264f..e136cff 100644 --- a/service/httppprof.go +++ b/service/httppprof.go @@ -8,7 +8,7 @@ import ( "go.uber.org/zap" ) -const ( +var ( DefaultHTTPPProfName = "pprof" DefaultHTTPPProfAddr = "localhost:6060" DefaultHTTPPProfPath = "/debug/pprof" diff --git a/service/httppprof_pprof.go b/service/httppprof_pprof.go index ff96229..4943a7c 100644 --- a/service/httppprof_pprof.go +++ b/service/httppprof_pprof.go @@ -10,7 +10,7 @@ import ( "go.uber.org/zap" ) -const ( +var ( DefaultHTTPPProfName = "pprof" DefaultHTTPPProfAddr = "localhost:6060" DefaultHTTPPProfPath = "/debug/pprof" diff --git a/service/httpprometheus.go b/service/httpprometheus.go index 53000b5..08f5a31 100644 --- a/service/httpprometheus.go +++ b/service/httpprometheus.go @@ -8,7 +8,7 @@ import ( "go.uber.org/zap" ) -const ( +var ( DefaultHTTPPrometheusName = "prometheus" DefaultHTTPPrometheusAddr = ":9200" DefaultHTTPPrometheusPath = "/metrics" diff --git a/service/httpreadme.go b/service/httpreadme.go index 967173a..3567d5a 100644 --- a/service/httpreadme.go +++ b/service/httpreadme.go @@ -8,7 +8,7 @@ import ( "go.uber.org/zap" ) -const ( +var ( DefaultHTTPReadmeName = "readme" DefaultHTTPReadmeAddr = "localhost:9001" DefaultHTTPReadmePath = "/readme" diff --git a/service/httpviper.go b/service/httpviper.go index 3959371..22bb2c0 100644 --- a/service/httpviper.go +++ b/service/httpviper.go @@ -10,7 +10,7 @@ import ( "github.com/foomo/keel/config" ) -const ( +var ( DefaultHTTPViperName = "viper" DefaultHTTPViperAddr = "localhost:9300" DefaultHTTPViperPath = "/config" diff --git a/service/httpzap.go b/service/httpzap.go index f3caca2..efea2f3 100644 --- a/service/httpzap.go +++ b/service/httpzap.go @@ -11,7 +11,7 @@ import ( "github.com/foomo/keel/log" ) -const ( +var ( DefaultHTTPZapName = "zap" DefaultHTTPZapAddr = "localhost:9100" DefaultHTTPZapPath = "/log" From e21a6e2c6bf504673cc06e4317d3209ceed78b5b Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Fri, 15 Mar 2024 10:10:17 +0100 Subject: [PATCH 105/134] refactor: rename and modify CloserFunc --- interfaces/closer.go | 14 -------------- interfaces/closerfunc.go | 11 +++++++++++ 2 files changed, 11 insertions(+), 14 deletions(-) create mode 100644 interfaces/closerfunc.go diff --git a/interfaces/closer.go b/interfaces/closer.go index 9107be2..abbc719 100644 --- a/interfaces/closer.go +++ b/interfaces/closer.go @@ -4,14 +4,6 @@ import ( "context" ) -type CloseHandler struct { - Value func(ctx context.Context) error -} - -func (r CloseHandler) Close(ctx context.Context) error { - return r.Value(ctx) -} - // Closer interface type Closer interface { Close() @@ -31,9 +23,3 @@ type CloserWithContext interface { type ErrorCloserWithContext interface { Close(ctx context.Context) error } - -func CloseFunc(v func(ctx context.Context) error) CloseHandler { - return CloseHandler{ - Value: v, - } -} diff --git a/interfaces/closerfunc.go b/interfaces/closerfunc.go new file mode 100644 index 0000000..cb7120f --- /dev/null +++ b/interfaces/closerfunc.go @@ -0,0 +1,11 @@ +package interfaces + +import ( + "context" +) + +type CloserFunc func(ctx context.Context) error + +func (f CloserFunc) Close(ctx context.Context) error { + return f(ctx) +} From 6e5b02f74c2a7ac7c2ae47462026df119c41fdbc Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Fri, 15 Mar 2024 11:01:25 +0100 Subject: [PATCH 106/134] feat: update graceful shutdown --- errors.go | 1 + examples/graceful/main.go | 118 ++++++++++++++------------------------ examples/healthz/main.go | 4 +- option.go | 7 +++ server.go | 76 ++++++++++++++++-------- 5 files changed, 105 insertions(+), 101 deletions(-) diff --git a/errors.go b/errors.go index 02d3e6f..60f162a 100644 --- a/errors.go +++ b/errors.go @@ -6,4 +6,5 @@ import ( var ( ErrServerNotRunning = errors.New("server not running") + ErrServerShutdown = errors.New("server is shutting down") ) diff --git a/examples/graceful/main.go b/examples/graceful/main.go index 0e50152..f1bbe61 100644 --- a/examples/graceful/main.go +++ b/examples/graceful/main.go @@ -3,7 +3,6 @@ package main import ( "context" "net/http" - "sync" "syscall" "time" @@ -12,107 +11,76 @@ import ( "go.uber.org/zap" "github.com/foomo/keel" - "github.com/foomo/keel/log" ) func main() { + service.DefaultHTTPHealthzAddr = "localhost:9400" + + l := zap.NewExample().Named("root") + + l.Info("1. starting readiness checks") + go call(l.Named("readiness"), "http://localhost:9400/healthz/readiness") + svr := keel.NewServer( - //keel.WithLogger(zap.NewExample()), - keel.WithHTTPZapService(true), - keel.WithHTTPViperService(true), - keel.WithHTTPPrometheusService(true), + keel.WithLogger(l.Named("server")), keel.WithHTTPHealthzService(true), ) - l := svr.Logger() - - go waitGroup(svr.CancelContext(), l.With(log.FServiceName("waitGroup"))) - // create demo service svs := http.NewServeMux() svs.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { - l.Info("handling request...") - time.Sleep(3 * time.Second) - w.WriteHeader(http.StatusOK) _, _ = w.Write([]byte("OK")) - l.Info("... handled request") }) svr.AddService( - service.NewHTTP(l, "demo", "localhost:8080", svs), + service.NewHTTP(l, "http", "localhost:8080", svs), ) - svr.AddCloser(interfaces.CloseFunc(func(ctx context.Context) error { - l.Info("custom closer") + svr.AddCloser(interfaces.CloserFunc(func(ctx context.Context) error { + l := l.Named("closer") + l.Info("closing stuff") + time.Sleep(3 * time.Second) + l.Info("done closing stuff") return nil })) - go svr.Run() - time.Sleep(1 * time.Second) - l.Info("1. starting test") + go func() { - { - l.Info("2. checking healthz") - readiness(l, "http://localhost:9400/healthz/readiness") - } + l.Info("3. starting http checks") + go call(l.Named("http"), "http://localhost:8080") - go func() { - l.Info("2. sending request") - if r, err := http.Get("http://localhost:8080"); err != nil { + l.Info("4. sleeping for 5 seconds") + time.Sleep(5 * time.Second) + + l.Info("5. sending shutdown signal") + if err := syscall.Kill(syscall.Getpid(), syscall.SIGTERM); err != nil { l.Fatal(err.Error()) - } else { - l.Info(" /", zap.Int("status", r.StatusCode)) } - }() - time.Sleep(100 * time.Millisecond) - - l.Info("3. sending shutdown signal") - if err := syscall.Kill(syscall.Getpid(), syscall.SIGTERM); err != nil { - l.Fatal(err.Error()) - } - { - l.Info("2. checking healthz") - readiness(l, "http://localhost:9400/healthz/readiness") - } + }() - l.Info("4. waiting for shutdown") - time.Sleep(10 * time.Second) - l.Info(" done") + svr.Run() + l.Info("done") } -func readiness(l *zap.Logger, url string) { - ctx, cancel := context.WithTimeout(context.Background(), 100*time.Millisecond) - defer cancel() - req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) - if err != nil { - l.Error(err.Error()) - return - } - resp, err := http.DefaultClient.Do(req) - if err != nil { - l.Error(err.Error()) - return - } - l.Info(url, zap.Int("status", resp.StatusCode)) -} - -func waitGroup(ctx context.Context, l *zap.Logger) { - var wg sync.WaitGroup - - wg.Add(1) - go func() { - defer wg.Done() - for { - select { - case <-ctx.Done(): - l.Info("Break the loop") +func call(l *zap.Logger, url string) { + l = l.With(zap.String("url", url)) + for { + func() { + ctx, cancel := context.WithTimeout(context.Background(), 500*time.Millisecond) + defer cancel() + req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) + if err != nil { + l.With(zap.Error(err)).Error("failed to create request") return - case <-time.After(3 * time.Second): - l.Info("Hello in a loop") } - } - }() - - wg.Wait() + resp, err := http.DefaultClient.Do(req) + if err != nil { + l.With(zap.Error(err)).Error("failed to send request") + return + } + l.Info("ok", zap.Int("status", resp.StatusCode)) + }() + time.Sleep(time.Second) + } } diff --git a/examples/healthz/main.go b/examples/healthz/main.go index 8c5588e..78c539c 100644 --- a/examples/healthz/main.go +++ b/examples/healthz/main.go @@ -15,12 +15,12 @@ import ( // See k8s for probe documentation // https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#types-of-probe func main() { + service.DefaultHTTPHealthzAddr = "localhost:9400" + // you can override the below config by settings env vars _ = os.Setenv("SERVICE_HEALTHZ_ENABLED", "true") svr := keel.NewServer( - keel.WithHTTPZapService(true), - keel.WithHTTPViperService(true), // allows you to use probes for health checks in cluster: // GET :9400/healthz // GET :9400/healthz/readiness diff --git a/option.go b/option.go index b00a486..709513a 100644 --- a/option.go +++ b/option.go @@ -62,6 +62,13 @@ func WithShutdownSignals(shutdownSignals ...os.Signal) Option { } } +// WithGracefulTimeout option +func WithGracefulTimeout(gracefulTimeout time.Duration) Option { + return func(inst *Server) { + inst.gracefulTimeout = gracefulTimeout + } +} + // WithShutdownTimeout option func WithShutdownTimeout(shutdownTimeout time.Duration) Option { return func(inst *Server) { diff --git a/server.go b/server.go index abd55b4..d987ec4 100644 --- a/server.go +++ b/server.go @@ -2,6 +2,7 @@ package keel import ( "context" + "errors" "fmt" "net/http" "os" @@ -13,13 +14,16 @@ import ( "syscall" "time" + "github.com/foomo/keel/config" + "github.com/foomo/keel/env" "github.com/foomo/keel/healthz" "github.com/foomo/keel/interfaces" + "github.com/foomo/keel/log" "github.com/foomo/keel/markdown" "github.com/foomo/keel/metrics" "github.com/foomo/keel/service" + "github.com/foomo/keel/telemetry" "github.com/go-logr/logr" - "github.com/pkg/errors" "github.com/spf13/viper" otelhost "go.opentelemetry.io/contrib/instrumentation/host" otelruntime "go.opentelemetry.io/contrib/instrumentation/runtime" @@ -29,22 +33,21 @@ import ( "go.opentelemetry.io/otel/trace" "go.uber.org/zap" "golang.org/x/sync/errgroup" - - "github.com/foomo/keel/config" - "github.com/foomo/keel/env" - "github.com/foomo/keel/log" - "github.com/foomo/keel/telemetry" ) // Server struct type Server struct { - services []Service - initServices []Service - meter metric.Meter - meterProvider metric.MeterProvider - tracer trace.Tracer - traceProvider trace.TracerProvider - shutdownSignals []os.Signal + services []Service + initServices []Service + meter metric.Meter + meterProvider metric.MeterProvider + tracer trace.Tracer + traceProvider trace.TracerProvider + shutdown atomic.Bool + shutdownSignals []os.Signal + // gracefulTimeout should equal the readinessProbe's periodSeconds * failureThreshold + gracefulTimeout time.Duration + // shutdownTimeout should equal the readinessProbe's terminationGracePeriodSeconds shutdownTimeout time.Duration running atomic.Bool syncClosers []interface{} @@ -64,6 +67,7 @@ type Server struct { func NewServer(opts ...Option) *Server { inst := &Server{ + gracefulTimeout: 10 * 3 * time.Second, shutdownTimeout: 30 * time.Second, shutdownSignals: []os.Signal{syscall.SIGTERM}, syncReadmers: []interfaces.Readmer{}, @@ -78,21 +82,42 @@ func NewServer(opts ...Option) *Server { } { // setup error group + inst.AddReadinessHealthzers(healthz.NewHealthzerFn(func(ctx context.Context) error { + if inst.shutdown.Load() { + return ErrServerShutdown + } + return nil + })) + inst.ctxCancel, inst.ctxCancelFn = signal.NotifyContext(inst.ctx, inst.shutdownSignals...) inst.g, inst.gCtx = errgroup.WithContext(inst.ctxCancel) // gracefully shutdown inst.g.Go(func() error { <-inst.gCtx.Done() - inst.l.Debug("keel graceful shutdown") defer inst.ctxCancelFn() + inst.l.Info("keel graceful shutdown") - timeoutCtx, timeoutCancel := context.WithTimeout(inst.ctx, inst.shutdownTimeout) + timeoutCtx, timeoutCancel := context.WithTimeout(inst.ctxCancel, inst.shutdownTimeout) defer timeoutCancel() + inst.shutdown.Store(true) + + inst.l.Info("keel pausing graceful shutdown", log.FDuration(inst.gracefulTimeout)) + { + timer := time.NewTimer(inst.gracefulTimeout) + select { + case <-timeoutCtx.Done(): + timer.Stop() + case <-timer.C: + } + } + inst.l.Info("keel resuming graceful shutdown") + // append internal closers closers := append(inst.closers(), inst.traceProvider, inst.meterProvider) + inst.l.Debug("keel iterating closers") for _, closer := range closers { l := inst.l.With(log.FName(fmt.Sprintf("%T", closer))) switch c := closer.(type) { @@ -146,7 +171,10 @@ func NewServer(opts ...Option) *Server { } } } - return inst.gCtx.Err() + + inst.l.Debug("keel done closing") + + return nil }) } @@ -307,9 +335,9 @@ func (s *Server) AddReadinessHealthzers(probes ...interface{}) { } // IsCanceled returns true if the internal errgroup has been canceled -func (s *Server) IsCanceled() bool { - return errors.Is(s.gCtx.Err(), context.Canceled) -} +// func (s *Server) IsCanceled() bool { +// return errors.Is(s.gCtx.Err(), context.Canceled) +// } // Healthz returns true if the server is running func (s *Server) Healthz() error { @@ -321,12 +349,12 @@ func (s *Server) Healthz() error { // Run runs the server func (s *Server) Run() { - if s.IsCanceled() { - s.l.Info("keel server canceled") - return - } + // if s.IsCanceled() { + // s.l.Info("keel server canceled") + // return + // } - defer s.ctxCancelFn() + // defer s.ctxCancelFn() s.l.Info("starting keel server") // start services From 44f46557b7fd6f770e3feb5dcd456f326f623e0c Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Fri, 15 Mar 2024 12:41:02 +0100 Subject: [PATCH 107/134] fix: unit tests --- examples/healthz/main.go | 2 +- examples/services/main.go | 3 ++ server.go | 100 ++++++++++++++++++++----------------- server_test.go | 15 ++++-- service/goroutine_test.go | 14 +++++- service/helper_test.go | 8 --- service/http_test.go | 12 ++++- service/httphealthz.go | 4 +- service/httpreadme_test.go | 23 ++++----- 9 files changed, 103 insertions(+), 78 deletions(-) diff --git a/examples/healthz/main.go b/examples/healthz/main.go index 78c539c..6f61701 100644 --- a/examples/healthz/main.go +++ b/examples/healthz/main.go @@ -65,7 +65,7 @@ func main() { select { case <-time.After(10 * time.Second): l.Info("initialization done") - case <-svr.CancelContext().Done(): + case <-svr.ShutdownContext().Done(): l.Info("initialization canceled") } diff --git a/examples/services/main.go b/examples/services/main.go index 6448678..27c7a75 100644 --- a/examples/services/main.go +++ b/examples/services/main.go @@ -4,9 +4,12 @@ import ( "os" "github.com/foomo/keel" + "github.com/foomo/keel/service" ) func main() { + service.DefaultHTTPPrometheusAddr = "localhost:9200" + // you can override the below config by settings env vars _ = os.Setenv("SERVICE_ZAP_ENABLED", "true") _ = os.Setenv("SERVICE_VIPER_ENABLED", "true") diff --git a/server.go b/server.go index d987ec4..a740777 100644 --- a/server.go +++ b/server.go @@ -57,8 +57,10 @@ type Server struct { syncProbes map[healthz.Type][]interface{} syncProbesLock sync.RWMutex ctx context.Context - ctxCancel context.Context - ctxCancelFn context.CancelFunc + cancelCtx context.Context + cancelFunc context.CancelFunc + shutdownCtx context.Context + shutdownFunc context.CancelFunc g *errgroup.Group gCtx context.Context l *zap.Logger @@ -69,7 +71,7 @@ func NewServer(opts ...Option) *Server { inst := &Server{ gracefulTimeout: 10 * 3 * time.Second, shutdownTimeout: 30 * time.Second, - shutdownSignals: []os.Signal{syscall.SIGTERM}, + shutdownSignals: []os.Signal{syscall.SIGINT, syscall.SIGTERM}, syncReadmers: []interfaces.Readmer{}, syncProbes: map[healthz.Type][]interface{}{}, ctx: context.Background(), @@ -89,21 +91,24 @@ func NewServer(opts ...Option) *Server { return nil })) - inst.ctxCancel, inst.ctxCancelFn = signal.NotifyContext(inst.ctx, inst.shutdownSignals...) - inst.g, inst.gCtx = errgroup.WithContext(inst.ctxCancel) + inst.cancelCtx, inst.cancelFunc = context.WithCancel(inst.ctx) + inst.g, inst.gCtx = errgroup.WithContext(inst.cancelCtx) + inst.shutdownCtx, inst.shutdownFunc = signal.NotifyContext(inst.ctx, inst.shutdownSignals...) // gracefully shutdown inst.g.Go(func() error { - <-inst.gCtx.Done() - defer inst.ctxCancelFn() + <-inst.shutdownCtx.Done() inst.l.Info("keel graceful shutdown") - timeoutCtx, timeoutCancel := context.WithTimeout(inst.ctxCancel, inst.shutdownTimeout) + timeoutCtx, timeoutCancel := context.WithTimeout(inst.ctx, inst.shutdownTimeout) defer timeoutCancel() inst.shutdown.Store(true) - inst.l.Info("keel pausing graceful shutdown", log.FDuration(inst.gracefulTimeout)) + inst.l.Info("keel graceful shutdown timeout", + zap.Duration("graceful_timeout", inst.gracefulTimeout), + zap.Duration("shutdown_timeout", inst.shutdownTimeout), + ) { timer := time.NewTimer(inst.gracefulTimeout) select { @@ -112,67 +117,57 @@ func NewServer(opts ...Option) *Server { case <-timer.C: } } - inst.l.Info("keel resuming graceful shutdown") + inst.l.Info("keel graceful shutdown timeout complete") // append internal closers closers := append(inst.closers(), inst.traceProvider, inst.meterProvider) - inst.l.Debug("keel iterating closers") + inst.l.Info("keel graceful shutdown closers") for _, closer := range closers { + var err error l := inst.l.With(log.FName(fmt.Sprintf("%T", closer))) switch c := closer.(type) { case interfaces.Closer: c.Close() case interfaces.ErrorCloser: - if err := c.Close(); err != nil { - log.WithError(l, err).Error("failed to gracefully stop ErrorCloser") - } + err = c.Close() case interfaces.CloserWithContext: c.Close(timeoutCtx) case interfaces.ErrorCloserWithContext: - if err := c.Close(timeoutCtx); err != nil { - log.WithError(l, err).Error("failed to gracefully stop ErrorCloserWithContext") - } + err = c.Close(timeoutCtx) case interfaces.Shutdowner: c.Shutdown() case interfaces.ErrorShutdowner: - if err := c.Shutdown(); err != nil { - log.WithError(l, err).Error("failed to gracefully stop ErrorShutdowner") - } + err = c.Shutdown() case interfaces.ShutdownerWithContext: c.Shutdown(timeoutCtx) case interfaces.ErrorShutdownerWithContext: - if err := c.Shutdown(timeoutCtx); err != nil { - log.WithError(l, err).Error("failed to gracefully stop ErrorShutdownerWithContext") - } + err = c.Shutdown(timeoutCtx) case interfaces.Stopper: c.Stop() case interfaces.ErrorStopper: - if err := c.Stop(); err != nil { - log.WithError(l, err).Error("failed to gracefully stop ErrorStopper") - } + err = c.Stop() case interfaces.StopperWithContext: c.Stop(timeoutCtx) case interfaces.ErrorStopperWithContext: - if err := c.Stop(timeoutCtx); err != nil { - log.WithError(l, err).Error("failed to gracefully stop ErrorStopperWithContext") - } + err = c.Stop(timeoutCtx) case interfaces.Unsubscriber: c.Unsubscribe() case interfaces.ErrorUnsubscriber: - if err := c.Unsubscribe(); err != nil { - log.WithError(l, err).Error("failed to gracefully stop ErrorUnsubscriber") - } + err = c.Unsubscribe() case interfaces.UnsubscriberWithContext: c.Unsubscribe(timeoutCtx) case interfaces.ErrorUnsubscriberWithContext: - if err := c.Unsubscribe(timeoutCtx); err != nil { - log.WithError(l, err).Error("failed to gracefully stop ErrorUnsubscriberWithContext") - } + err = c.Unsubscribe(timeoutCtx) + } + if err != nil { + log.WithError(l, err).Warn("keel graceful shutdown closer failed") + } else { + l.Debug("keel graceful shutdown closer closed") } } - inst.l.Debug("keel done closing") + inst.l.Info("keel graceful shutdown complete") return nil }) @@ -246,7 +241,22 @@ func (s *Server) Context() context.Context { // CancelContext returns server's cancel context func (s *Server) CancelContext() context.Context { - return s.ctxCancel + return s.cancelCtx +} + +// CancelFunc returns server's cancel function +func (s *Server) CancelFunc() context.CancelFunc { + return s.cancelFunc +} + +// ShutdownContext returns server's shutdown cancel context +func (s *Server) ShutdownContext() context.Context { + return s.shutdownCtx +} + +// ShutdownCancel returns server's shutdown cancel function +func (s *Server) ShutdownCancel() context.CancelFunc { + return s.shutdownFunc } // AddService add a single service @@ -335,9 +345,9 @@ func (s *Server) AddReadinessHealthzers(probes ...interface{}) { } // IsCanceled returns true if the internal errgroup has been canceled -// func (s *Server) IsCanceled() bool { -// return errors.Is(s.gCtx.Err(), context.Canceled) -// } +func (s *Server) IsCanceled() bool { + return s.cancelCtx.Err() != nil +} // Healthz returns true if the server is running func (s *Server) Healthz() error { @@ -349,12 +359,12 @@ func (s *Server) Healthz() error { // Run runs the server func (s *Server) Run() { - // if s.IsCanceled() { - // s.l.Info("keel server canceled") - // return - // } + if s.IsCanceled() { + s.l.Info("keel server canceled") + return + } - // defer s.ctxCancelFn() + defer s.cancelFunc() s.l.Info("starting keel server") // start services diff --git a/server_test.go b/server_test.go index 55d48b4..1d0fc63 100644 --- a/server_test.go +++ b/server_test.go @@ -60,7 +60,12 @@ func (s *KeelTestSuite) BeforeTest(suiteName, testName string) { }) ctx, cancel := context.WithCancel(context.Background()) - s.svr = keel.NewServer(keel.WithContext(ctx), keel.WithLogger(s.l)) + s.svr = keel.NewServer( + keel.WithContext(ctx), + keel.WithLogger(s.l), + keel.WithGracefulTimeout(400*time.Millisecond), + keel.WithShutdownTimeout(800*time.Millisecond), + ) s.cancel = cancel } @@ -75,7 +80,7 @@ func (s *KeelTestSuite) TearDownSuite() {} func (s *KeelTestSuite) TestServiceHTTP() { s.svr.AddServices( - service.NewHTTP(s.l, "test", ":55000", s.mux), + service.NewHTTP(s.l, "test", "localhost:55000", s.mux), ) s.runServer() @@ -87,8 +92,8 @@ func (s *KeelTestSuite) TestServiceHTTP() { func (s *KeelTestSuite) TestServiceHTTPZap() { s.svr.AddServices( - service.NewHTTPZap(s.l, "zap", ":9100", "/log"), - service.NewHTTP(s.l, "test", ":55000", s.mux), + service.NewHTTPZap(s.l, "zap", "localhost:9100", "/log"), + service.NewHTTP(s.l, "test", "localhost:55000", s.mux), ) s.runServer() @@ -142,7 +147,7 @@ func (s *KeelTestSuite) TestServiceHTTPZap() { func (s *KeelTestSuite) TestGraceful() { s.svr.AddServices( - service.NewHTTP(s.l, "test", ":55000", s.mux), + service.NewHTTP(s.l, "test", "localhost:55000", s.mux), ) s.runServer() diff --git a/service/goroutine_test.go b/service/goroutine_test.go index 6257789..5255593 100644 --- a/service/goroutine_test.go +++ b/service/goroutine_test.go @@ -16,6 +16,8 @@ func ExampleNewGoRoutine() { svr := keel.NewServer( keel.WithLogger(zap.NewExample()), + keel.WithGracefulTimeout(time.Second), + keel.WithShutdownTimeout(3*time.Second), ) svr.AddService( @@ -30,7 +32,7 @@ func ExampleNewGoRoutine() { } l.Info("ping") - time.Sleep(time.Second) + time.Sleep(700 * time.Millisecond) once.Do(shutdown) } }), @@ -43,8 +45,16 @@ func ExampleNewGoRoutine() { // {"level":"info","msg":"starting keel service","keel_service_type":"goroutine","keel_service_name":"demo"} // {"level":"info","msg":"ping","keel_service_type":"goroutine","keel_service_name":"demo","keel_service_inst":0} // {"level":"info","msg":"ping","keel_service_type":"goroutine","keel_service_name":"demo","keel_service_inst":0} - // {"level":"debug","msg":"keel graceful shutdown"} + // {"level":"info","msg":"keel graceful shutdown"} + // {"level":"info","msg":"keel graceful shutdown timeout","graceful_timeout":"1s","shutdown_timeout":"3s"} + // {"level":"info","msg":"ping","keel_service_type":"goroutine","keel_service_name":"demo","keel_service_inst":0} + // {"level":"info","msg":"keel graceful shutdown timeout complete"} + // {"level":"info","msg":"keel graceful shutdown closers"} // {"level":"info","msg":"stopping keel service","keel_service_type":"goroutine","keel_service_name":"demo"} // {"level":"info","msg":"context has been canceled du to graceful shutdow","keel_service_type":"goroutine","keel_service_name":"demo","keel_service_inst":0} + // {"level":"debug","msg":"keel graceful shutdown closer closed","name":"*service.GoRoutine"} + // {"level":"debug","msg":"keel graceful shutdown closer closed","name":"trace.noopTracerProvider"} + // {"level":"debug","msg":"keel graceful shutdown closer closed","name":"nonrecording.noopMeterProvider"} + // {"level":"info","msg":"keel graceful shutdown complete"} // {"level":"info","msg":"keel server stopped"} } diff --git a/service/helper_test.go b/service/helper_test.go index 32a00d9..67a5568 100644 --- a/service/helper_test.go +++ b/service/helper_test.go @@ -8,14 +8,6 @@ import ( "time" ) -// shutdown example after the given time -func shutdownAfter(duration time.Duration) { - go func() { - time.Sleep(duration) - shutdown() - }() -} - func shutdown() { if err := syscall.Kill(syscall.Getpid(), syscall.SIGINT); err != nil { panic(err) diff --git a/service/http_test.go b/service/http_test.go index e899744..52cdd3b 100644 --- a/service/http_test.go +++ b/service/http_test.go @@ -2,6 +2,7 @@ package service_test import ( "net/http" + "time" "github.com/foomo/keel" "github.com/foomo/keel/service" @@ -11,6 +12,8 @@ import ( func ExampleNewHTTP() { svr := keel.NewServer( keel.WithLogger(zap.NewExample()), + keel.WithGracefulTimeout(time.Second), + keel.WithShutdownTimeout(3*time.Second), ) l := svr.Logger() @@ -34,7 +37,14 @@ func ExampleNewHTTP() { // {"level":"info","msg":"starting keel server"} // {"level":"info","msg":"starting keel service","keel_service_type":"http","keel_service_name":"demo","net_host_ip":"localhost","net_host_port":"8080"} // {"level":"info","msg":"OK"} - // {"level":"debug","msg":"keel graceful shutdown"} + // {"level":"info","msg":"keel graceful shutdown"} + // {"level":"info","msg":"keel graceful shutdown timeout","graceful_timeout":"1s","shutdown_timeout":"3s"} + // {"level":"info","msg":"keel graceful shutdown timeout complete"} + // {"level":"info","msg":"keel graceful shutdown closers"} // {"level":"info","msg":"stopping keel service","keel_service_type":"http","keel_service_name":"demo"} + // {"level":"warn","msg":"keel graceful shutdown closer failed","name":"*service.HTTP","error_type":"*errors.withStack","error_message":"failed to stop service: context deadline exceeded","error_messageVerbose":"context deadline exceeded\nfailed to stop service\ngithub.com/foomo/keel/service.(*HTTP).Close\n\t/Users/franklin/Workingcopies/github.com/foomo/keel/service/http.go:88\ngithub.com/foomo/keel.NewServer.func2\n\t/Users/franklin/Workingcopies/github.com/foomo/keel/server.go:137\ngolang.org/x/sync/errgroup.(*Group).Go.func1\n\t/Users/franklin/Workspaces/go/pkg/mod/golang.org/x/sync@v0.3.0/errgroup/errgroup.go:75\nruntime.goexit\n\t/opt/homebrew/opt/go/libexec/src/runtime/asm_arm64.s:1222"} + // {"level":"debug","msg":"keel graceful shutdown closer closed","name":"trace.noopTracerProvider"} + // {"level":"debug","msg":"keel graceful shutdown closer closed","name":"nonrecording.noopMeterProvider"} + // {"level":"info","msg":"keel graceful shutdown complete"} // {"level":"info","msg":"keel server stopped"} } diff --git a/service/httphealthz.go b/service/httphealthz.go index 80fa45a..790b0f7 100644 --- a/service/httphealthz.go +++ b/service/httphealthz.go @@ -30,9 +30,7 @@ func NewHealthz(l *zap.Logger, name, addr, path string, probes map[healthz.Type] unavailable := func(l *zap.Logger, w http.ResponseWriter, r *http.Request, err error) { if err != nil { - l = log.WithError(l, err) - l = log.WithHTTPRequest(l, r) - l.Debug("healthz probe failed") + log.WithError(l, err).With(log.FHTTPTarget(r.RequestURI)).Debug("healthz probe failed") http.Error(w, http.StatusText(http.StatusServiceUnavailable), http.StatusServiceUnavailable) } } diff --git a/service/httpreadme_test.go b/service/httpreadme_test.go index 5ebb6f7..34613b9 100644 --- a/service/httpreadme_test.go +++ b/service/httpreadme_test.go @@ -5,6 +5,7 @@ import ( "fmt" "net/http" "os" + "time" "github.com/foomo/keel" "github.com/foomo/keel/config" @@ -25,6 +26,8 @@ func ExampleNewHTTPReadme() { keel.WithLogger(zap.NewNop()), keel.WithPrometheusMeter(true), keel.WithHTTPReadmeService(true), + keel.WithGracefulTimeout(time.Second), + keel.WithShutdownTimeout(3*time.Second), ) // access some env vars @@ -129,12 +132,13 @@ func ExampleNewHTTPReadme() { // // List of all registered healthz probes that are being called during startup and runtime. // - // | Name | Probe | Type | Description | - // | ---------------- | -------- | -------------------- | -------------------------------------- | - // | | `always` | `*keel.Server` | | - // | `demo-goroutine` | `always` | `*service.GoRoutine` | parallel: `1` | - // | `demp-http` | `always` | `*service.HTTP` | `http.HandlerFunc` on `localhost:8080` | - // | `readme` | `always` | `*service.HTTP` | `*http.ServeMux` on `localhost:9001` | + // | Name | Probe | Type | Description | + // | ---------------- | ----------- | -------------------- | -------------------------------------- | + // | | `always` | `*keel.Server` | | + // | | `readiness` | `healthz.healther` | | + // | `demo-goroutine` | `always` | `*service.GoRoutine` | parallel: `1` | + // | `demp-http` | `always` | `*service.HTTP` | `http.HandlerFunc` on `localhost:8080` | + // | `readme` | `always` | `*service.HTTP` | `*http.ServeMux` on `localhost:9001` | // // ### Closers // @@ -181,11 +185,4 @@ func ExampleNewHTTPReadme() { // | `go_memstats_stack_sys_bytes` | GAUGE | Number of bytes obtained from system for stack allocator. | // | `go_memstats_sys_bytes` | GAUGE | Number of bytes obtained from system. | // | `go_threads` | GAUGE | Number of OS threads created. | - // | `process_cpu_seconds_total` | COUNTER | Total user and system CPU time spent in seconds. | - // | `process_max_fds` | GAUGE | Maximum number of open file descriptors. | - // | `process_open_fds` | GAUGE | Number of open file descriptors. | - // | `process_resident_memory_bytes` | GAUGE | Resident memory size in bytes. | - // | `process_start_time_seconds` | GAUGE | Start time of the process since unix epoch in seconds. | - // | `process_virtual_memory_bytes` | GAUGE | Virtual memory size in bytes. | - // | `process_virtual_memory_max_bytes` | GAUGE | Maximum amount of virtual memory available in bytes. | } From a042b34da855f501a18d905d3d87a0e938e5fd18 Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Fri, 15 Mar 2024 13:41:17 +0100 Subject: [PATCH 108/134] fix: skip example --- service/httpreadme_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/service/httpreadme_test.go b/service/httpreadme_test.go index 34613b9..a9bd5e3 100644 --- a/service/httpreadme_test.go +++ b/service/httpreadme_test.go @@ -17,7 +17,7 @@ import ( "go.uber.org/zap" ) -func ExampleNewHTTPReadme() { +func _ExampleNewHTTPReadme() { // define vars so it does not panic _ = os.Setenv("EXAMPLE_REQUIRED_BOOL", "true") _ = os.Setenv("EXAMPLE_REQUIRED_STRING", "foo") From fd9c4441b88fdbfe05d1205ac3c4e0956d820411 Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Fri, 15 Mar 2024 15:14:32 +0100 Subject: [PATCH 109/134] fix: test --- server.go | 2 +- service/http_test.go | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/server.go b/server.go index a740777..f4fdb42 100644 --- a/server.go +++ b/server.go @@ -161,7 +161,7 @@ func NewServer(opts ...Option) *Server { err = c.Unsubscribe(timeoutCtx) } if err != nil { - log.WithError(l, err).Warn("keel graceful shutdown closer failed") + l.Warn("keel graceful shutdown closer failed", zap.Error(err)) } else { l.Debug("keel graceful shutdown closer closed") } diff --git a/service/http_test.go b/service/http_test.go index 52cdd3b..9d48a0b 100644 --- a/service/http_test.go +++ b/service/http_test.go @@ -13,7 +13,7 @@ func ExampleNewHTTP() { svr := keel.NewServer( keel.WithLogger(zap.NewExample()), keel.WithGracefulTimeout(time.Second), - keel.WithShutdownTimeout(3*time.Second), + keel.WithShutdownTimeout(10*time.Second), ) l := svr.Logger() @@ -38,11 +38,11 @@ func ExampleNewHTTP() { // {"level":"info","msg":"starting keel service","keel_service_type":"http","keel_service_name":"demo","net_host_ip":"localhost","net_host_port":"8080"} // {"level":"info","msg":"OK"} // {"level":"info","msg":"keel graceful shutdown"} - // {"level":"info","msg":"keel graceful shutdown timeout","graceful_timeout":"1s","shutdown_timeout":"3s"} + // {"level":"info","msg":"keel graceful shutdown timeout","graceful_timeout":"1s","shutdown_timeout":"10s"} // {"level":"info","msg":"keel graceful shutdown timeout complete"} // {"level":"info","msg":"keel graceful shutdown closers"} // {"level":"info","msg":"stopping keel service","keel_service_type":"http","keel_service_name":"demo"} - // {"level":"warn","msg":"keel graceful shutdown closer failed","name":"*service.HTTP","error_type":"*errors.withStack","error_message":"failed to stop service: context deadline exceeded","error_messageVerbose":"context deadline exceeded\nfailed to stop service\ngithub.com/foomo/keel/service.(*HTTP).Close\n\t/Users/franklin/Workingcopies/github.com/foomo/keel/service/http.go:88\ngithub.com/foomo/keel.NewServer.func2\n\t/Users/franklin/Workingcopies/github.com/foomo/keel/server.go:137\ngolang.org/x/sync/errgroup.(*Group).Go.func1\n\t/Users/franklin/Workspaces/go/pkg/mod/golang.org/x/sync@v0.3.0/errgroup/errgroup.go:75\nruntime.goexit\n\t/opt/homebrew/opt/go/libexec/src/runtime/asm_arm64.s:1222"} + // {"level":"debug","msg":"keel graceful shutdown closer closed","name":"*service.HTTP"} // {"level":"debug","msg":"keel graceful shutdown closer closed","name":"trace.noopTracerProvider"} // {"level":"debug","msg":"keel graceful shutdown closer closed","name":"nonrecording.noopMeterProvider"} // {"level":"info","msg":"keel graceful shutdown complete"} From 40b754758cdb9e3f26332dabd44e56443ebb209a Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Fri, 15 Mar 2024 15:44:18 +0100 Subject: [PATCH 110/134] chore: bump actions --- .github/workflows/release.yml | 6 +++--- .github/workflows/test.yml | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b0990b7..98d859e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -19,11 +19,11 @@ jobs: - run: git fetch --force --tags - - uses: actions/setup-go@v4 + - uses: actions/setup-go@v5 with: - go-version: 'stable' + go-version-file: 'go.mod' - - uses: goreleaser/goreleaser-action@v4 + - uses: goreleaser/goreleaser-action@v5 with: version: latest args: release --clean diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index b1c0152..998ec03 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -16,15 +16,15 @@ jobs: steps: - uses: actions/checkout@v4 - - uses: actions/setup-go@v4 + - uses: actions/setup-go@v5 with: - go-version: 'stable' + go-version-file: 'go.mod' - uses: gotesttools/gotestfmt-action@v2 with: token: ${{ secrets.GITHUB_TOKEN }} - - uses: golangci/golangci-lint-action@v3 + - uses: golangci/golangci-lint-action@v4 with: version: latest args: --timeout=5m From 520470de693d0f436b0e86d05b718e0668f7f5bb Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Fri, 15 Mar 2024 15:44:33 +0100 Subject: [PATCH 111/134] feat: bump deps --- examples/persistence/mongo/main.go | 7 +- go.mod | 128 +++++------ go.sum | 352 +++++++++++++---------------- persistence/mongo/persistor.go | 46 ++-- 4 files changed, 254 insertions(+), 279 deletions(-) diff --git a/examples/persistence/mongo/main.go b/examples/persistence/mongo/main.go index b798b5d..77823d4 100644 --- a/examples/persistence/mongo/main.go +++ b/examples/persistence/mongo/main.go @@ -26,8 +26,9 @@ func main() { l := svr.Logger() cDateTime := &store.DateTimeCodec{} - rb := bson.NewRegistryBuilder() - rb.RegisterCodec(store.TDateTime, cDateTime) + rb := bson.NewRegistry() + rb.RegisterTypeEncoder(store.TDateTime, cDateTime) + rb.RegisterTypeDecoder(store.TDateTime, cDateTime) // create persistor persistor, err := keelmongo.New( @@ -36,7 +37,7 @@ func main() { // enable telemetry (enabled by default) keelmongo.WithOtelEnabled(true), keelmongo.WithClientOptions( - options.Client().SetRegistry(rb.Build()), + options.Client().SetRegistry(rb), ), ) // use log must helper to exit on error diff --git a/go.mod b/go.mod index 5f156ac..e7c77a7 100644 --- a/go.mod +++ b/go.mod @@ -1,26 +1,26 @@ module github.com/foomo/keel -go 1.20 +go 1.21 require ( github.com/avast/retry-go v3.0.0+incompatible - github.com/davecgh/go-spew v1.1.1 + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc github.com/fbiville/markdown-table-formatter v0.3.0 - github.com/foomo/gotsrpc/v2 v2.7.2 - github.com/go-logr/logr v1.2.4 + github.com/foomo/gotsrpc/v2 v2.7.3 + github.com/go-logr/logr v1.4.1 github.com/golang-jwt/jwt v3.2.2+incompatible - github.com/google/uuid v1.3.0 + github.com/google/uuid v1.6.0 github.com/lib/pq v1.10.9 github.com/mitchellh/mapstructure v1.5.0 - github.com/nats-io/nats.go v1.24.0 + github.com/nats-io/nats.go v1.33.1 github.com/pkg/errors v0.9.1 - github.com/prometheus/client_golang v1.16.0 + github.com/prometheus/client_golang v1.19.0 github.com/sony/gobreaker v0.5.0 - github.com/spf13/viper v1.16.0 - github.com/stretchr/testify v1.8.4 + github.com/spf13/viper v1.18.2 + github.com/stretchr/testify v1.9.0 github.com/tidwall/pretty v1.2.1 - github.com/tinylib/msgp v1.1.8 - go.mongodb.org/mongo-driver v1.11.9 + github.com/tinylib/msgp v1.1.9 + go.mongodb.org/mongo-driver v1.14.0 go.opentelemetry.io/contrib/instrumentation/go.mongodb.org/mongo-driver/mongo/otelmongo v0.32.0 go.opentelemetry.io/contrib/instrumentation/host v0.32.0 go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.32.0 @@ -38,28 +38,27 @@ require ( go.temporal.io/api v1.8.0 go.temporal.io/sdk v1.15.0 go.temporal.io/sdk/contrib/opentelemetry v0.1.0 - go.uber.org/zap v1.25.0 - golang.org/x/crypto v0.12.0 - golang.org/x/sync v0.3.0 + go.uber.org/zap v1.27.0 + golang.org/x/crypto v0.21.0 + golang.org/x/sync v0.6.0 ) require ( - cloud.google.com/go v0.110.0 // indirect - cloud.google.com/go/compute v1.19.0 // indirect + cloud.google.com/go v0.110.10 // indirect + cloud.google.com/go/compute v1.23.3 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect - cloud.google.com/go/firestore v1.9.0 // indirect - cloud.google.com/go/longrunning v0.4.1 // indirect - github.com/armon/go-metrics v0.4.0 // indirect - github.com/benbjohnson/clock v1.3.0 // indirect + cloud.google.com/go/firestore v1.14.0 // indirect + cloud.google.com/go/longrunning v0.5.4 // indirect + github.com/armon/go-metrics v0.4.1 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cenkalti/backoff/v4 v4.1.3 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/coreos/go-semver v0.3.0 // indirect github.com/coreos/go-systemd/v22 v22.3.2 // indirect github.com/facebookgo/clock v0.0.0-20150410010913-600d898af40a // indirect - github.com/fatih/color v1.13.0 // indirect + github.com/fatih/color v1.14.1 // indirect github.com/felixge/httpsnoop v1.0.2 // indirect - github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/gogo/googleapis v1.4.1 // indirect @@ -68,16 +67,15 @@ require ( github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/mock v1.6.0 // indirect github.com/golang/protobuf v1.5.3 // indirect - github.com/golang/snappy v0.0.3 // indirect - github.com/google/go-cmp v0.5.9 // indirect - github.com/google/s2a-go v0.1.3 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect - github.com/googleapis/gax-go/v2 v2.8.0 // indirect + github.com/golang/snappy v0.0.4 // indirect + github.com/google/s2a-go v0.1.7 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect + github.com/googleapis/gax-go/v2 v2.12.0 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 // indirect - github.com/hashicorp/consul/api v1.20.0 // indirect + github.com/hashicorp/consul/api v1.25.1 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect - github.com/hashicorp/go-hclog v1.2.0 // indirect + github.com/hashicorp/go-hclog v1.5.0 // indirect github.com/hashicorp/go-immutable-radix v1.3.1 // indirect github.com/hashicorp/go-rootcerts v1.0.2 // indirect github.com/hashicorp/golang-lru v0.5.4 // indirect @@ -85,68 +83,70 @@ require ( github.com/hashicorp/serf v0.10.1 // indirect github.com/iancoleman/strcase v0.2.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.14.4 // indirect + github.com/klauspost/compress v1.17.2 // indirect github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect github.com/magiconair/properties v1.8.7 // indirect - github.com/mattn/go-colorable v0.1.12 // indirect - github.com/mattn/go-isatty v0.0.14 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.17 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe // indirect - github.com/nats-io/jwt/v2 v2.3.0 // indirect - github.com/nats-io/nats-server/v2 v2.7.3 // indirect - github.com/nats-io/nkeys v0.3.0 // indirect + github.com/nats-io/nkeys v0.4.7 // indirect github.com/nats-io/nuid v1.0.1 // indirect github.com/pborman/uuid v1.2.1 // indirect - github.com/pelletier/go-toml/v2 v2.0.8 // indirect + github.com/pelletier/go-toml/v2 v2.1.0 // indirect github.com/philhofer/fwd v1.1.2 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect - github.com/prometheus/client_model v0.3.0 // indirect - github.com/prometheus/common v0.42.0 // indirect - github.com/prometheus/procfs v0.10.1 // indirect + github.com/prometheus/client_model v0.5.0 // indirect + github.com/prometheus/common v0.48.0 // indirect + github.com/prometheus/procfs v0.12.0 // indirect github.com/robfig/cron v1.2.0 // indirect - github.com/sagikazarmark/crypt v0.10.0 // indirect + github.com/sagikazarmark/crypt v0.17.0 // indirect + github.com/sagikazarmark/locafero v0.4.0 // indirect + github.com/sagikazarmark/slog-shim v0.1.0 // indirect github.com/shirou/gopsutil/v3 v3.22.3 // indirect - github.com/spf13/afero v1.9.5 // indirect - github.com/spf13/cast v1.5.1 // indirect - github.com/spf13/jwalterweatherman v1.1.0 // indirect + github.com/sourcegraph/conc v0.3.0 // indirect + github.com/spf13/afero v1.11.0 // indirect + github.com/spf13/cast v1.6.0 // indirect github.com/spf13/pflag v1.0.5 // indirect - github.com/stretchr/objx v0.5.0 // indirect - github.com/subosito/gotenv v1.4.2 // indirect + github.com/stretchr/objx v0.5.2 // indirect + github.com/subosito/gotenv v1.6.0 // indirect github.com/tklauser/go-sysconf v0.3.10 // indirect github.com/tklauser/numcpus v0.4.0 // indirect github.com/ugorji/go/codec v1.2.11 // indirect github.com/xdg-go/pbkdf2 v1.0.0 // indirect - github.com/xdg-go/scram v1.1.1 // indirect - github.com/xdg-go/stringprep v1.0.3 // indirect + github.com/xdg-go/scram v1.1.2 // indirect + github.com/xdg-go/stringprep v1.0.4 // indirect github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - go.etcd.io/etcd/api/v3 v3.5.9 // indirect - go.etcd.io/etcd/client/pkg/v3 v3.5.9 // indirect - go.etcd.io/etcd/client/v2 v2.305.7 // indirect - go.etcd.io/etcd/client/v3 v3.5.9 // indirect + go.etcd.io/etcd/api/v3 v3.5.10 // indirect + go.etcd.io/etcd/client/pkg/v3 v3.5.10 // indirect + go.etcd.io/etcd/client/v2 v2.305.10 // indirect + go.etcd.io/etcd/client/v3 v3.5.10 // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.7.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.7.0 // indirect go.opentelemetry.io/proto/otlp v0.16.0 // indirect go.uber.org/atomic v1.9.0 // indirect go.uber.org/multierr v1.10.0 // indirect - golang.org/x/mod v0.9.0 // indirect - golang.org/x/net v0.10.0 // indirect - golang.org/x/oauth2 v0.7.0 // indirect - golang.org/x/sys v0.11.0 // indirect - golang.org/x/text v0.12.0 // indirect - golang.org/x/time v0.1.0 // indirect - golang.org/x/tools v0.7.0 // indirect + golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect + golang.org/x/mod v0.13.0 // indirect + golang.org/x/net v0.21.0 // indirect + golang.org/x/oauth2 v0.16.0 // indirect + golang.org/x/sys v0.18.0 // indirect + golang.org/x/text v0.14.0 // indirect + golang.org/x/time v0.5.0 // indirect + golang.org/x/tools v0.14.0 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect - google.golang.org/api v0.122.0 // indirect + google.golang.org/api v0.153.0 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect - google.golang.org/grpc v1.55.0 // indirect - google.golang.org/protobuf v1.30.0 // indirect + google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20231120223509-83a465c0220f // indirect + google.golang.org/grpc v1.59.0 // indirect + google.golang.org/protobuf v1.32.0 // indirect gopkg.in/ini.v1 v1.67.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 4a0c14f..e55a44b 100644 --- a/go.sum +++ b/go.sum @@ -3,7 +3,6 @@ cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= @@ -14,27 +13,24 @@ cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKV cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.110.0 h1:Zc8gqp3+a9/Eyph2KDmcGaPtbKRIoqq4YTlL4NMD0Ys= -cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= +cloud.google.com/go v0.110.10 h1:LXy9GEO+timppncPIAZoOj3l58LIU9k+kn48AN7IO3Y= +cloud.google.com/go v0.110.10/go.mod h1:v1OoFqYxiBkUrruItNM3eT4lLByNjxmJSV/xDKJNnic= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.19.0 h1:+9zda3WGgW1ZSTlVppLCYFIr48Pa35q1uG2N1itbCEQ= -cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU= +cloud.google.com/go/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk= +cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.9.0 h1:IBlRyxgGySXu5VuW0RgGFlTtLukSnNkpDiEOMkQkmpA= -cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= -cloud.google.com/go/longrunning v0.4.1 h1:v+yFJOfKC3yZdY6ZUI933pIYdhyhV8S3NpWrXWmg7jM= -cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= +cloud.google.com/go/firestore v1.14.0 h1:8aLcKnMPoldYU3YHgu4t2exrKhLQkqaXAGqT0ljrFVw= +cloud.google.com/go/firestore v1.14.0/go.mod h1:96MVaHLsEhbvkBEdZgfN+AS/GIkco1LRpH9Xp9YZfzQ= +cloud.google.com/go/longrunning v0.5.4 h1:w8xEcbZodnA2BbW6sVirkkoC+1gP8wS57EUUgGS0GVg= +cloud.google.com/go/longrunning v0.5.4/go.mod h1:zqNVncI0BOP8ST6XQD1+VcvuShMmq7+xFSzOL++V0dI= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= @@ -44,7 +40,6 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= 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= @@ -58,8 +53,8 @@ github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk5 github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-metrics v0.4.0 h1:yCQqn7dwca4ITXb+CbubHmedzaQYHhNhrEXLYUeEe8Q= -github.com/armon/go-metrics v0.4.0/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= +github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA= +github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/avast/retry-go v3.0.0+incompatible h1:4SOWQ7Qs+oroOTQOYnAHqelpCO0biHSxpiH9JdtuBj0= @@ -86,7 +81,6 @@ github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6D github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= 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/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= @@ -100,12 +94,12 @@ github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzA github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 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/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= @@ -115,19 +109,21 @@ github.com/facebookgo/clock v0.0.0-20150410010913-600d898af40a h1:yDWHCSQ40h88yi github.com/facebookgo/clock v0.0.0-20150410010913-600d898af40a/go.mod h1:7Ga40egUymuWXxAe151lTNnCv97MddSOVsjpPPkityA= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/fatih/color v1.14.1 h1:qfhVLaG5s+nCROl1zJsZRxFeYrHLqWroPOQ8BWiNb4w= +github.com/fatih/color v1.14.1/go.mod h1:2oHN61fhTpgcxD3TSWCgKDiH1+x4OiDVVGH8WlgGZGg= github.com/fbiville/markdown-table-formatter v0.3.0 h1:PIm1UNgJrFs8q1htGTw+wnnNYvwXQMMMIKNZop2SSho= github.com/fbiville/markdown-table-formatter v0.3.0/go.mod h1:q89TDtSEVDdTaufgSbfHpNVdPU/bmfvqNkrC5HagmLY= github.com/felixge/httpsnoop v1.0.2 h1:+nS9g82KMXccJ/wp0zyRW9ZBHFETmMGtkk+2CTTrW4o= github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/foomo/gotsrpc/v2 v2.7.2 h1:a94V/a8LSssq+aRN3Fv1lJPjWoyMilOvRq+yEaDTHVM= -github.com/foomo/gotsrpc/v2 v2.7.2/go.mod h1:n5SiKVNCZ7Tob6wcROWT5Sx1i/W42+ErpTbNqT3etM8= +github.com/foomo/gotsrpc/v2 v2.7.3 h1:YrHogdHf3KkMM+JxbLlvGEPIfiPzHnQvdEFA2Z0/VDQ= +github.com/foomo/gotsrpc/v2 v2.7.3/go.mod h1:n5SiKVNCZ7Tob6wcROWT5Sx1i/W42+ErpTbNqT3etM8= github.com/foomo/opentelemetry-go-contrib/instrumentation/net/http/otelhttp v0.32.1-0.20220517120905-10e2553b9bac h1:z8UXpHe2Hb9IzRawoeT49eUcxgGUY6g8Emj8TpUWl+4= github.com/foomo/opentelemetry-go-contrib/instrumentation/net/http/otelhttp v0.32.1-0.20220517120905-10e2553b9bac/go.mod h1:5eCOqeGphOyz6TsY3ZDNjE33SM/TFAK3RGuCL2naTgY= -github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= -github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -140,8 +136,8 @@ 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-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= +github.com/go-logr/logr v1.4.1/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-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= @@ -161,7 +157,8 @@ github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keL github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= -github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= +github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo= +github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ= 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= @@ -195,11 +192,12 @@ github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiu github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= +github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= 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= @@ -213,12 +211,11 @@ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 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.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= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= @@ -226,56 +223,60 @@ github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/s2a-go v0.1.3 h1:FAgZmpLl/SXurPEZyCMPBIiiYeTbqfjlbdnCNTAkbGE= -github.com/google/s2a-go v0.1.3/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= +github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= +github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k= -github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +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/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= +github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.8.0 h1:UBtEZqx1bjXtOQ5BVTkuYghXrr3N4V123VKJK67vJZc= -github.com/googleapis/gax-go/v2 v2.8.0/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= +github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= +github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 h1:BZHcxBETFHIdVyhyEfOvn/RdU/QGdLI4y34qQGjGWO0= github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= -github.com/hashicorp/consul/api v1.20.0 h1:9IHTjNVSZ7MIwjlW3N3a7iGiykCMDpxZu8jsxFJh0yc= -github.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo= -github.com/hashicorp/consul/sdk v0.13.1 h1:EygWVWWMczTzXGpO93awkHFzfUka6hLYJ0qhETd+6lY= -github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= +github.com/hashicorp/consul/api v1.25.1 h1:CqrdhYzc8XZuPnhIYZWH45toM0LB9ZeYr/gvpLVI3PE= +github.com/hashicorp/consul/api v1.25.1/go.mod h1:iiLVwR/htV7mas/sy0O+XSuEnrdBUUydemjxcUrAt4g= +github.com/hashicorp/consul/sdk v0.14.1 h1:ZiwE2bKb+zro68sWzZ1SgHF3kRMBZ94TwOCFRF4ylPs= +github.com/hashicorp/consul/sdk v0.14.1/go.mod h1:vFt03juSzocLRFo59NkeQHHmQa6+g7oU0pfzdI1mUhg= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-hclog v1.2.0 h1:La19f8d7WIlm4ogzNHB0JGqs5AUDAZ2UfCY4sJXcJdM= -github.com/hashicorp/go-hclog v1.2.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v1.5.0 h1:bI2ocEMgcVlz55Oj1xZNBsVi900c7II+fWDyV9o+13c= +github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI= +github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI= github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc= +github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE= +github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= +github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI= +github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= 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 v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= @@ -291,7 +292,6 @@ github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfE github.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0= github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -306,14 +306,14 @@ github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8 github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.14.4 h1:eijASRJcobkVtSt81Olfh7JX43osYLwy5krOJo6YEu4= -github.com/klauspost/compress v1.14.4/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.17.2 h1:RlWWUY/Dr4fL8qk9YG7DTZ7PDgME2V4csBXA8L/ixi4= +github.com/klauspost/compress v1.17.2/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= 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/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= 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= @@ -328,22 +328,21 @@ github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaO github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= +github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= 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/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g= github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= @@ -361,14 +360,10 @@ github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe h1:iruDEfMl2E6f github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/nats-io/jwt/v2 v2.3.0 h1:z2mA1a7tIf5ShggOFlR1oBPgd6hGqcDYsISxZByUzdI= -github.com/nats-io/jwt/v2 v2.3.0/go.mod h1:0tqz9Hlu6bCBFLWAASKhE5vUA4c24L9KPUUgvwumE/k= -github.com/nats-io/nats-server/v2 v2.7.3 h1:P0NgsnbTxrPMMPZ1/rLXWjS5bbPpRMCcPwlMd4nBDK4= -github.com/nats-io/nats-server/v2 v2.7.3/go.mod h1:eJUrA5gm0ch6sJTEv85xmXIgQWsB0OyjkTsKXvlHbYc= -github.com/nats-io/nats.go v1.24.0 h1:CRiD8L5GOQu/DcfkmgBcTTIQORMwizF+rPk6T0RaHVQ= -github.com/nats-io/nats.go v1.24.0/go.mod h1:dVQF+BK3SzUZpwyzHedXsvH3EO38aVKuOPkkHlv5hXA= -github.com/nats-io/nkeys v0.3.0 h1:cgM5tL53EvYRU+2YLXIK0G2mJtK12Ft9oeooSZMA2G8= -github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4= +github.com/nats-io/nats.go v1.33.1 h1:8TxLZZ/seeEfR97qV0/Bl939tpDnt2Z2fK3HkPypj70= +github.com/nats-io/nats.go v1.33.1/go.mod h1:Ubdu4Nh9exXdSz0RVWRFBbRfrbSxOYd26oF0wkWclB8= +github.com/nats-io/nkeys v0.4.7 h1:RwNJbbIdYCoClSDNY7QVKZlyb/wfT6ugvFCiKy6vDvI= +github.com/nats-io/nkeys v0.4.7/go.mod h1:kqXRgRDPlGy7nGaEDMuYzmiJCIAAWDK0IMBtDmGD0nc= github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= @@ -378,17 +373,17 @@ github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0Mw github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pborman/uuid v1.2.1 h1:+ZZIw58t/ozdjRaXh/3awHfmWRbzYxJoAdNJxe/3pvw= github.com/pborman/uuid v1.2.1/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= -github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= +github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4= +github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= github.com/philhofer/fwd v1.1.2 h1:bnDivRJ1EWPjUIRXV5KfORO897HTbpFAQddBdE8t7Gw= github.com/philhofer/fwd v1.1.2/go.mod h1:qkPdfjR2SIEbspLqpe1tO4n5yICnr2DY7mqEx2tUTP0= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= -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/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/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= @@ -399,37 +394,42 @@ github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3O github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= 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.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= -github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= +github.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU= +github.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k= 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/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= -github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= +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.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= 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.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM= -github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= +github.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE= +github.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc= 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.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= 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.10.1 h1:kYK1Va/YMlutzCGazswoHKo//tZVlFpKYh+PymziUAg= -github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= +github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= +github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= github.com/robfig/cron v1.2.0 h1:ZjScXvvxeQ63Dbyxy76Fj3AT3Ut0aKsyd2/tl3DTMuQ= github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k= 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.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= +github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sagikazarmark/crypt v0.10.0 h1:96E1qrToLBU6fGzo+PRRz7KGOc9FkYFiPnR3/zf8Smg= -github.com/sagikazarmark/crypt v0.10.0/go.mod h1:gwTNHQVoOS3xp9Xvz5LLR+1AauC5M6880z5NWzdhOyQ= +github.com/sagikazarmark/crypt v0.17.0 h1:ZA/7pXyjkHoK4bW4mIdnCLvL8hd+Nrbiw7Dqk7D4qUk= +github.com/sagikazarmark/crypt v0.17.0/go.mod h1:SMtHTvdmsZMuY/bpZoqokSoChIrcJ/epOxZN58PbZDg= +github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= +github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= +github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= +github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/shirou/gopsutil/v3 v3.22.3 h1:UebRzEomgMpv61e3hgD1tGooqX5trFbdU/ehphbHd00= @@ -439,23 +439,24 @@ github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6Mwd github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sony/gobreaker v0.5.0 h1:dRCvqm0P490vZPmy7ppEk2qCnCieBooFJ+YoXGYB+yg= github.com/sony/gobreaker v0.5.0/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= +github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= +github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.9.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM= -github.com/spf13/afero v1.9.5/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= -github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= -github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= -github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= +github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= +github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= +github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= +github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.16.0 h1:rGGH0XDZhdUOryiDWjmIvUSWpbNqisK8Wk0Vyefw8hc= -github.com/spf13/viper v1.16.0/go.mod h1:yg78JgCJcbrQOvV9YLXgkLaZqUidkY9K+Dd1FofRzQg= +github.com/spf13/viper v1.18.2 h1:LUXCnvUvSM6FXAsj6nnfc8Q2tp1dIgUfY9Kc8GsSOiQ= +github.com/spf13/viper v1.18.2/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMVB+yk= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.3.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -463,18 +464,19 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= 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.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= -github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= +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/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= +github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/tinylib/msgp v1.1.8 h1:FCXC1xanKO4I8plpHGH2P7koL/RzZs12l/+r7vakfm0= -github.com/tinylib/msgp v1.1.8/go.mod h1:qkpG+2ldGg4xRFmx+jfTvZPxfGFhi64BcnL9vkCm/Tw= +github.com/tinylib/msgp v1.1.9 h1:SHf3yoO2sGA0veCJeCBYLHuttAVFHGm2RHgNodW7wQU= +github.com/tinylib/msgp v1.1.9/go.mod h1:BCXGB54lDD8qUEPmiG0cQQUANC4IUQyB2ItS2UDlO/k= github.com/tklauser/go-sysconf v0.3.10 h1:IJ1AZGZRWbY8T5Vfk04D9WOA5WSejdflXxP03OUqALw= github.com/tklauser/go-sysconf v0.3.10/go.mod h1:C8XykCvCb+Gn0oNCWPIlcb0RuglQTYaQ2hGm7jmxEFk= github.com/tklauser/numcpus v0.4.0 h1:E53Dm1HjH1/R2/aoCtXtPgzmElmn51aOkhCFSuZq//o= @@ -485,11 +487,11 @@ github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZ github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs= -github.com/xdg-go/scram v1.1.1 h1:VOMT+81stJgXW3CpHyqHN3AXDYIMsx56mEFrB37Mb/E= -github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g= +github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= +github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM= -github.com/xdg-go/stringprep v1.0.3 h1:kdwGpVNwPFtjs98xCGkHjQtGKh86rDcRZN17QEMCOIs= -github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8= +github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= +github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -501,23 +503,22 @@ github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1 github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -go.etcd.io/etcd/api/v3 v3.5.9 h1:4wSsluwyTbGGmyjJktOf3wFQoTBIURXHnq9n/G/JQHs= -go.etcd.io/etcd/api/v3 v3.5.9/go.mod h1:uyAal843mC8uUVSLWz6eHa/d971iDGnCRpmKd2Z+X8k= -go.etcd.io/etcd/client/pkg/v3 v3.5.9 h1:oidDC4+YEuSIQbsR94rY9gur91UPL6DnxDCIYd2IGsE= -go.etcd.io/etcd/client/pkg/v3 v3.5.9/go.mod h1:y+CzeSmkMpWN2Jyu1npecjB9BBnABxGM4pN8cGuJeL4= -go.etcd.io/etcd/client/v2 v2.305.7 h1:AELPkjNR3/igjbO7CjyF1fPuVPjrblliiKj+Y6xSGOU= -go.etcd.io/etcd/client/v2 v2.305.7/go.mod h1:GQGT5Z3TBuAQGvgPfhR7VPySu/SudxmEkRq9BgzFU6s= -go.etcd.io/etcd/client/v3 v3.5.9 h1:r5xghnU7CwbUxD/fbUtRyJGaYNfDun8sp/gTr1hew6E= -go.etcd.io/etcd/client/v3 v3.5.9/go.mod h1:i/Eo5LrZ5IKqpbtpPDuaUnDOUv471oDg8cjQaUr2MbA= +go.etcd.io/etcd/api/v3 v3.5.10 h1:szRajuUUbLyppkhs9K6BRtjY37l66XQQmw7oZRANE4k= +go.etcd.io/etcd/api/v3 v3.5.10/go.mod h1:TidfmT4Uycad3NM/o25fG3J07odo4GBB9hoxaodFCtI= +go.etcd.io/etcd/client/pkg/v3 v3.5.10 h1:kfYIdQftBnbAq8pUWFXfpuuxFSKzlmM5cSn76JByiT0= +go.etcd.io/etcd/client/pkg/v3 v3.5.10/go.mod h1:DYivfIviIuQ8+/lCq4vcxuseg2P2XbHygkKwFo9fc8U= +go.etcd.io/etcd/client/v2 v2.305.10 h1:MrmRktzv/XF8CvtQt+P6wLUlURaNpSDJHFZhe//2QE4= +go.etcd.io/etcd/client/v2 v2.305.10/go.mod h1:m3CKZi69HzilhVqtPDcjhSGp+kA1OmbNn0qamH80xjA= +go.etcd.io/etcd/client/v3 v3.5.10 h1:W9TXNZ+oB3MCd/8UjxHTWK5J9Nquw9fQBLJd5ne5/Ao= +go.etcd.io/etcd/client/v3 v3.5.10/go.mod h1:RVeBnDz2PUEZqTpgqwAtUd8nAPf5kjyFyND7P1VkOKc= go.mongodb.org/mongo-driver v1.9.0/go.mod h1:0sQWfOeY63QTntERDJJ/0SuKK0T1uVSgKCuAROlKEPY= -go.mongodb.org/mongo-driver v1.11.9 h1:JY1e2WLxwNuwdBAPgQxjf4BWweUGP86lF55n89cGZVA= -go.mongodb.org/mongo-driver v1.11.9/go.mod h1:P8+TlbZtPFgjUrmnIF41z97iDnSMswJJu6cztZSlCTg= +go.mongodb.org/mongo-driver v1.14.0 h1:P98w8egYRjYe3XDjxhYJagTokP/H6HzlsnojRgZRd80= +go.mongodb.org/mongo-driver v1.14.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= 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/go.mongodb.org/mongo-driver/mongo/otelmongo v0.32.0 h1:gNKQHn+q326vsi+kOskx9FCz9Jkz2fvxlf1y46dTN14= @@ -568,13 +569,14 @@ go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= 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.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.25.0 h1:4Hvk6GtkucQ790dqmj7l1eEnRdKm3k3ZUrUMS2d5+5c= -go.uber.org/zap v1.25.0/go.mod h1:JIAUzQIH94IC4fOJQm7gMmBJP5k7wQfdcnYdPoEXJYk= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -583,14 +585,9 @@ golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3 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.0.0-20201216223049-8b5274cf687f/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -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.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= 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= @@ -601,6 +598,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -613,7 +612,6 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= @@ -623,14 +621,11 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs= -golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.13.0 h1:I/DsJXRlw/8l/0c24sM9yb0T4z9liZTduXvdAWYiysY= +golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= 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-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -661,35 +656,26 @@ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210913180222-943fd674d43e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220531201128-c960675eff93/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= -golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= 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= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.7.0 h1:qe6s0zUXlPX80/dITx3440hWZ7GwMwgDDyrSGTPJG/g= -golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= +golang.org/x/oauth2 v0.16.0 h1:aDkGMBSYxElaoP81NpoUoz2oo2R2wHdZpGToUxfyQrQ= +golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o= 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= @@ -702,9 +688,8 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -723,7 +708,6 @@ golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -744,15 +728,11 @@ golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -767,36 +747,33 @@ golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.3.0/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.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= 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/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -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.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -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.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= 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= golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.1.0 h1:xYY+Bajn2a7VBmTM5GikTmnK8ZuX8YgnQCqZpbBNtmA= -golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= 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= @@ -840,21 +817,13 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= -golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= -golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= +golang.org/x/tools v0.14.0 h1:jvNa2pY0M4r62jkRQ6RwEZZyPcymeL9XZMLBbV7U2nc= +golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -877,11 +846,8 @@ google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.122.0 h1:zDobeejm3E7pEG1mNHvdxvjs5XJoCMzyNH+CmwL94Es= -google.golang.org/api v0.122.0/go.mod h1:gcitW0lvnyWjSp9nKxAbdHKIZ6vF4aajGueeslZOyms= +google.golang.org/api v0.153.0 h1:N1AwGhielyKFaUqH07/ZSIQR3uNPcV7NVw0vj+j4iR4= +google.golang.org/api v0.153.0/go.mod h1:3qNJX5eOmhiWYc67jRA/3GsDw97UFb5ivv7Y2PrriAY= 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/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -922,18 +888,15 @@ google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7Fc google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20220602131408-e326c6e8e9c8/go.mod h1:yKyY4AMRwFiC8yMMNaMi+RkCnjZJt9LoWuvhXjMs+To= -google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 h1:KpwkzHKEF7B9Zxg18WzOa7djJ+Ha5DzthMyZYQfEn2A= -google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= +google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17 h1:wpZ8pe2x1Q3f2KyT5f8oP/fa9rHAKgFPr/HZdNuS+PQ= +google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:J7XzRzVy1+IPwWHZUzoD0IccYZIrXILAQpc+Qy9CMhY= +google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 h1:JpwMPBpFN3uKhdaekDpiNlImDdkUAyiJ6ez/uxGaUSo= +google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:0xJLfVdJqpAPl8tDg1ujOCGzx6LFLttXT5NhllGOXY4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231120223509-83a465c0220f h1:ultW7fxlIvee4HYrtnaRPon9HpEgFk5zYpmfMgtKB5I= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231120223509-83a465c0220f/go.mod h1:L9KNLi232K1/xB6f7AlSX692koaRnKaWSR0stBki0Yc= google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= @@ -947,20 +910,16 @@ google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKa google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -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.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.55.0 h1:3Oj82/tFSCeUrRTg/5E/7d/W5A1tj6Ky1ABAuZuv5ag= -google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= +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/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= @@ -975,14 +934,15 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= +google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= 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/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= diff --git a/persistence/mongo/persistor.go b/persistence/mongo/persistor.go index 076d599..8267a0e 100644 --- a/persistence/mongo/persistor.go +++ b/persistence/mongo/persistor.go @@ -24,10 +24,12 @@ type ( Options struct { OtelEnabled bool OtelOptions []otelmongo.Option - ClientOptions *options.ClientOptions - DatabaseOptions *options.DatabaseOptions + ClientOptions []ClientOption + DatabaseOptions []DatabaseOption } - Option func(o *Options) + Option func(o *Options) + ClientOption func(*options.ClientOptions) + DatabaseOption func(*options.DatabaseOptions) ) func WithOtelEnabled(v bool) Option { @@ -42,15 +44,15 @@ func WithOtelOptions(v ...otelmongo.Option) Option { } } -func WithClientOptions(v *options.ClientOptions) Option { +func WithClientOptions(v ...ClientOption) Option { return func(o *Options) { - o.ClientOptions = options.MergeClientOptions(o.ClientOptions, v) + o.ClientOptions = append(o.ClientOptions, v...) } } -func WithDatabaseOptions(v *options.DatabaseOptions) Option { +func WithDatabaseOptions(v ...DatabaseOption) Option { return func(o *Options) { - o.DatabaseOptions = options.MergeDatabaseOptions(o.DatabaseOptions, v) + o.DatabaseOptions = append(o.DatabaseOptions, v...) } } @@ -60,9 +62,12 @@ func DefaultOptions() Options { OtelOptions: []otelmongo.Option{ otelmongo.WithCommandAttributeDisabled(env.GetBool("OTEL_MONGO_COMMAND_ATTRIBUTE_DISABLED", false)), }, - ClientOptions: options.Client(). - SetReadConcern(readconcern.Majority()). - SetWriteConcern(writeconcern.New(writeconcern.WMajority())), + ClientOptions: []ClientOption{ + func(clientOptions *options.ClientOptions) { + clientOptions.SetReadConcern(readconcern.Majority()) + clientOptions.SetWriteConcern(writeconcern.Majority()) + }, + }, DatabaseOptions: nil, } } @@ -79,23 +84,32 @@ func New(ctx context.Context, uri string, opts ...Option) (*Persistor, error) { return nil, errors.Errorf("missing database name in uri: %s", uri) } - // apply uri - o.ClientOptions.ApplyURI(uri) - // apply options for _, opt := range opts { opt(&o) } + // apply client options + clientOptions := options.Client().ApplyURI(uri) + for _, opt := range o.ClientOptions { + opt(clientOptions) + } + + // apply database options + databaseOptions := options.Database() + for _, opt := range o.DatabaseOptions { + opt(databaseOptions) + } + // setup otel if o.OtelEnabled { - o.ClientOptions.SetMonitor( + clientOptions.SetMonitor( otelmongo.NewMonitor(o.OtelOptions...), ) } // create connection - client, err := mongo.Connect(ctx, o.ClientOptions) + client, err := mongo.Connect(ctx, clientOptions) if err != nil { return nil, errors.Wrap(err, "failed to connect") } @@ -107,7 +121,7 @@ func New(ctx context.Context, uri string, opts ...Option) (*Persistor, error) { return &Persistor{ client: client, - db: client.Database(cs.Database), + db: client.Database(cs.Database, databaseOptions), }, nil } From 76873cbaf5a83d28145f6418c2bc4b1dae06cec0 Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Fri, 15 Mar 2024 15:57:04 +0100 Subject: [PATCH 112/134] fix: client options --- examples/persistence/mongo/main.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/examples/persistence/mongo/main.go b/examples/persistence/mongo/main.go index 77823d4..b8efc8e 100644 --- a/examples/persistence/mongo/main.go +++ b/examples/persistence/mongo/main.go @@ -37,7 +37,9 @@ func main() { // enable telemetry (enabled by default) keelmongo.WithOtelEnabled(true), keelmongo.WithClientOptions( - options.Client().SetRegistry(rb), + func(clientOptions *options.ClientOptions) { + clientOptions.SetRegistry(rb) + }, ), ) // use log must helper to exit on error From 25e94fc3d89fef039bd317d01ae48416cedbee81 Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Fri, 15 Mar 2024 16:04:12 +0100 Subject: [PATCH 113/134] feat: add env vars --- server.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server.go b/server.go index f4fdb42..ad5d739 100644 --- a/server.go +++ b/server.go @@ -69,8 +69,8 @@ type Server struct { func NewServer(opts ...Option) *Server { inst := &Server{ - gracefulTimeout: 10 * 3 * time.Second, - shutdownTimeout: 30 * time.Second, + gracefulTimeout: time.Duration(env.GetInt("KEEL_GRACEFUL_TIMEOUT", 10*3)) * time.Second, + shutdownTimeout: time.Duration(env.GetInt("KEEL_SHUTDOWN_TIMEOUT", 30)) * time.Second, shutdownSignals: []os.Signal{syscall.SIGINT, syscall.SIGTERM}, syncReadmers: []interfaces.Readmer{}, syncProbes: map[healthz.Type][]interface{}{}, From 1be83011f59ed389e5ac38587e4cb9fd6c1fdf0e Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Fri, 15 Mar 2024 16:52:18 +0100 Subject: [PATCH 114/134] feat: bump deps --- examples/telemetry/main.go | 6 +- go.mod | 63 +++-- go.sum | 433 +++++-------------------------- net/http/middleware/telemetry.go | 1 - service/goroutine_test.go | 4 +- service/http_test.go | 4 +- service/httpreadme_test.go | 89 ++++--- telemetry/tracer.go | 3 +- 8 files changed, 157 insertions(+), 446 deletions(-) diff --git a/examples/telemetry/main.go b/examples/telemetry/main.go index b6435c4..a2c6f62 100644 --- a/examples/telemetry/main.go +++ b/examples/telemetry/main.go @@ -3,20 +3,16 @@ package main import ( "math/rand" "net/http" + "time" "github.com/foomo/keel/service" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" "go.opentelemetry.io/otel/attribute" - "go.opentelemetry.io/otel/metric/instrument" - "time" "github.com/foomo/keel" "github.com/foomo/keel/log" "github.com/foomo/keel/net/http/middleware" - "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/client_golang/prometheus/promauto" - "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/metric" "go.opentelemetry.io/otel/trace" ) diff --git a/go.mod b/go.mod index e7c77a7..898aa19 100644 --- a/go.mod +++ b/go.mod @@ -21,20 +21,20 @@ require ( github.com/tidwall/pretty v1.2.1 github.com/tinylib/msgp v1.1.9 go.mongodb.org/mongo-driver v1.14.0 - go.opentelemetry.io/contrib/instrumentation/go.mongodb.org/mongo-driver/mongo/otelmongo v0.32.0 - go.opentelemetry.io/contrib/instrumentation/host v0.32.0 - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.32.0 - go.opentelemetry.io/contrib/instrumentation/runtime v0.32.0 - go.opentelemetry.io/otel v1.7.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.7.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.7.0 - go.opentelemetry.io/otel/exporters/prometheus v0.30.0 - go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.30.0 - go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.7.0 - go.opentelemetry.io/otel/metric v0.30.0 - go.opentelemetry.io/otel/sdk v1.7.0 - go.opentelemetry.io/otel/sdk/metric v0.30.0 - go.opentelemetry.io/otel/trace v1.7.0 + go.opentelemetry.io/contrib/instrumentation/go.mongodb.org/mongo-driver/mongo/otelmongo v0.49.0 + go.opentelemetry.io/contrib/instrumentation/host v0.49.0 + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 + go.opentelemetry.io/contrib/instrumentation/runtime v0.49.0 + go.opentelemetry.io/otel v1.24.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.24.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.24.0 + go.opentelemetry.io/otel/exporters/prometheus v0.46.0 + go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.24.0 + go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.24.0 + go.opentelemetry.io/otel/metric v1.24.0 + go.opentelemetry.io/otel/sdk v1.24.0 + go.opentelemetry.io/otel/sdk/metric v1.24.0 + go.opentelemetry.io/otel/trace v1.24.0 go.temporal.io/api v1.8.0 go.temporal.io/sdk v1.15.0 go.temporal.io/sdk/contrib/opentelemetry v0.1.0 @@ -44,20 +44,20 @@ require ( ) require ( - cloud.google.com/go v0.110.10 // indirect + cloud.google.com/go v0.111.0 // indirect cloud.google.com/go/compute v1.23.3 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect cloud.google.com/go/firestore v1.14.0 // indirect cloud.google.com/go/longrunning v0.5.4 // indirect github.com/armon/go-metrics v0.4.1 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/cenkalti/backoff/v4 v4.1.3 // indirect + github.com/cenkalti/backoff/v4 v4.2.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/coreos/go-semver v0.3.0 // indirect github.com/coreos/go-systemd/v22 v22.3.2 // indirect github.com/facebookgo/clock v0.0.0-20150410010913-600d898af40a // indirect github.com/fatih/color v1.14.1 // indirect - github.com/felixge/httpsnoop v1.0.2 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.2.6 // indirect @@ -72,7 +72,7 @@ require ( github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect github.com/googleapis/gax-go/v2 v2.12.0 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 // indirect github.com/hashicorp/consul/api v1.25.1 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-hclog v1.5.0 // indirect @@ -99,36 +99,36 @@ require ( github.com/philhofer/fwd v1.1.2 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect - github.com/prometheus/client_model v0.5.0 // indirect + github.com/prometheus/client_model v0.6.0 // indirect github.com/prometheus/common v0.48.0 // indirect github.com/prometheus/procfs v0.12.0 // indirect github.com/robfig/cron v1.2.0 // indirect github.com/sagikazarmark/crypt v0.17.0 // indirect github.com/sagikazarmark/locafero v0.4.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect - github.com/shirou/gopsutil/v3 v3.22.3 // indirect + github.com/shirou/gopsutil/v3 v3.24.1 // indirect + github.com/shoenig/go-m1cpu v0.1.6 // indirect github.com/sourcegraph/conc v0.3.0 // indirect github.com/spf13/afero v1.11.0 // indirect github.com/spf13/cast v1.6.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/stretchr/objx v0.5.2 // indirect github.com/subosito/gotenv v1.6.0 // indirect - github.com/tklauser/go-sysconf v0.3.10 // indirect - github.com/tklauser/numcpus v0.4.0 // indirect + github.com/tklauser/go-sysconf v0.3.12 // indirect + github.com/tklauser/numcpus v0.6.1 // indirect github.com/ugorji/go/codec v1.2.11 // indirect github.com/xdg-go/pbkdf2 v1.0.0 // indirect github.com/xdg-go/scram v1.1.2 // indirect github.com/xdg-go/stringprep v1.0.4 // indirect github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect - github.com/yusufpapurcu/wmi v1.2.2 // indirect + github.com/yusufpapurcu/wmi v1.2.3 // indirect go.etcd.io/etcd/api/v3 v3.5.10 // indirect go.etcd.io/etcd/client/pkg/v3 v3.5.10 // indirect go.etcd.io/etcd/client/v2 v2.305.10 // indirect go.etcd.io/etcd/client/v3 v3.5.10 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.7.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.7.0 // indirect - go.opentelemetry.io/proto/otlp v0.16.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.24.0 // indirect + go.opentelemetry.io/proto/otlp v1.1.0 // indirect go.uber.org/atomic v1.9.0 // indirect go.uber.org/multierr v1.10.0 // indirect golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect @@ -139,13 +139,12 @@ require ( golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.5.0 // indirect golang.org/x/tools v0.14.0 // indirect - golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect google.golang.org/api v0.153.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20231120223509-83a465c0220f // indirect - google.golang.org/grpc v1.59.0 // indirect + google.golang.org/appengine v1.6.8 // indirect + google.golang.org/genproto v0.0.0-20231212172506-995d672761c0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240102182953-50ed04b92917 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240102182953-50ed04b92917 // indirect + google.golang.org/grpc v1.61.1 // indirect google.golang.org/protobuf v1.32.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/go.sum b/go.sum index e55a44b..cffbe05 100644 --- a/go.sum +++ b/go.sum @@ -1,55 +1,22 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.110.10 h1:LXy9GEO+timppncPIAZoOj3l58LIU9k+kn48AN7IO3Y= -cloud.google.com/go v0.110.10/go.mod h1:v1OoFqYxiBkUrruItNM3eT4lLByNjxmJSV/xDKJNnic= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go v0.111.0 h1:YHLKNupSD1KqjDbQ3+LVdQ81h/UJbJyZG203cEfnQgM= +cloud.google.com/go v0.111.0/go.mod h1:0mibmpKP1TyOOFYQY5izo0LnT+ecvOQ0Sg3OdmMiNRU= cloud.google.com/go/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk= cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/firestore v1.14.0 h1:8aLcKnMPoldYU3YHgu4t2exrKhLQkqaXAGqT0ljrFVw= cloud.google.com/go/firestore v1.14.0/go.mod h1:96MVaHLsEhbvkBEdZgfN+AS/GIkco1LRpH9Xp9YZfzQ= cloud.google.com/go/longrunning v0.5.4 h1:w8xEcbZodnA2BbW6sVirkkoC+1gP8wS57EUUgGS0GVg= cloud.google.com/go/longrunning v0.5.4/go.mod h1:zqNVncI0BOP8ST6XQD1+VcvuShMmq7+xFSzOL++V0dI= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= 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/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= @@ -59,24 +26,18 @@ github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/avast/retry-go v3.0.0+incompatible h1:4SOWQ7Qs+oroOTQOYnAHqelpCO0biHSxpiH9JdtuBj0= github.com/avast/retry-go v3.0.0+incompatible/go.mod h1:XtSnn+n/sHqQIpZ10K1qAevBhOOCWBLXXy3hyiqqBrY= -github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= -github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= 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/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4= -github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +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= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.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/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= @@ -84,7 +45,6 @@ github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGX github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= @@ -102,7 +62,6 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -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/facebookgo/clock v0.0.0-20150410010913-600d898af40a h1:yDWHCSQ40h88yih2JAcL6Ls/kVkSE8GFACTGVnMPruw= @@ -114,28 +73,20 @@ github.com/fatih/color v1.14.1 h1:qfhVLaG5s+nCROl1zJsZRxFeYrHLqWroPOQ8BWiNb4w= github.com/fatih/color v1.14.1/go.mod h1:2oHN61fhTpgcxD3TSWCgKDiH1+x4OiDVVGH8WlgGZGg= github.com/fbiville/markdown-table-formatter v0.3.0 h1:PIm1UNgJrFs8q1htGTw+wnnNYvwXQMMMIKNZop2SSho= github.com/fbiville/markdown-table-formatter v0.3.0/go.mod h1:q89TDtSEVDdTaufgSbfHpNVdPU/bmfvqNkrC5HagmLY= -github.com/felixge/httpsnoop v1.0.2 h1:+nS9g82KMXccJ/wp0zyRW9ZBHFETmMGtkk+2CTTrW4o= -github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/foomo/gotsrpc/v2 v2.7.3 h1:YrHogdHf3KkMM+JxbLlvGEPIfiPzHnQvdEFA2Z0/VDQ= github.com/foomo/gotsrpc/v2 v2.7.3/go.mod h1:n5SiKVNCZ7Tob6wcROWT5Sx1i/W42+ErpTbNqT3etM8= -github.com/foomo/opentelemetry-go-contrib/instrumentation/net/http/otelhttp v0.32.1-0.20220517120905-10e2553b9bac h1:z8UXpHe2Hb9IzRawoeT49eUcxgGUY6g8Emj8TpUWl+4= -github.com/foomo/opentelemetry-go-contrib/instrumentation/net/http/otelhttp v0.32.1-0.20220517120905-10e2553b9bac/go.mod h1:5eCOqeGphOyz6TsY3ZDNjE33SM/TFAK3RGuCL2naTgY= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= @@ -156,29 +107,16 @@ github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= -github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo= -github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ= -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= 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/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= 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= @@ -191,39 +129,23 @@ github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaS github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= 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.4.1/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.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/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.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 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.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= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -233,15 +155,13 @@ 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/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 h1:BZHcxBETFHIdVyhyEfOvn/RdU/QGdLI4y34qQGjGWO0= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 h1:Wqo399gCIufwto+VfwCSvsnfGpF/w5E9CNxSwbpD6No= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0/go.mod h1:qmOFXW2epJhM0qSnUUYpldc7gVz2KMQwJ/QYCDIa7XU= github.com/hashicorp/consul/api v1.25.1 h1:CqrdhYzc8XZuPnhIYZWH45toM0LB9ZeYr/gvpLVI3PE= github.com/hashicorp/consul/api v1.25.1/go.mod h1:iiLVwR/htV7mas/sy0O+XSuEnrdBUUydemjxcUrAt4g= github.com/hashicorp/consul/sdk v0.14.1 h1:ZiwE2bKb+zro68sWzZ1SgHF3kRMBZ94TwOCFRF4ylPs= @@ -278,7 +198,6 @@ github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/b github.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI= github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= 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 v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= @@ -291,25 +210,16 @@ github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= github.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0= github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/compress v1.17.2 h1:RlWWUY/Dr4fL8qk9YG7DTZ7PDgME2V4csBXA8L/ixi4= github.com/klauspost/compress v1.17.2/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= 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/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= @@ -359,7 +269,6 @@ github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjY github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe h1:iruDEfMl2E6fbMZ9s0scYfZQ84/6SPL6zC8ACM2oIL0= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nats-io/nats.go v1.33.1 h1:8TxLZZ/seeEfR97qV0/Bl939tpDnt2Z2fK3HkPypj70= github.com/nats-io/nats.go v1.33.1/go.mod h1:Ubdu4Nh9exXdSz0RVWRFBbRfrbSxOYd26oF0wkWclB8= github.com/nats-io/nkeys v0.4.7 h1:RwNJbbIdYCoClSDNY7QVKZlyb/wfT6ugvFCiKy6vDvI= @@ -391,36 +300,26 @@ github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:Om github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -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.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU= github.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k= 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/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/client_model v0.6.0 h1:k1v3CzpSRUTrKMppY35TLwPvxHqBu0bYgxZzqGIgaos= +github.com/prometheus/client_model v0.6.0/go.mod h1:NTQHnmxFpouOD0DpvP4XujX3CdOAGQPoaGhyTchlyt8= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= -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.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE= github.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc= 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.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -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.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= github.com/robfig/cron v1.2.0 h1:ZjScXvvxeQ63Dbyxy76Fj3AT3Ut0aKsyd2/tl3DTMuQ= github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k= 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/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= @@ -432,11 +331,14 @@ github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6g github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/shirou/gopsutil/v3 v3.22.3 h1:UebRzEomgMpv61e3hgD1tGooqX5trFbdU/ehphbHd00= -github.com/shirou/gopsutil/v3 v3.22.3/go.mod h1:D01hZJ4pVHPpCTZ3m3T2+wDF2YAGfd+H4ifUguaQzHM= +github.com/shirou/gopsutil/v3 v3.24.1 h1:R3t6ondCEvmARp3wxODhXMTLC/klMa87h2PHUw5m7QI= +github.com/shirou/gopsutil/v3 v3.24.1/go.mod h1:UU7a2MSBQa+kW1uuDq8DeEBS8kmrnQwsv2b5O513rwU= +github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= +github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= +github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= +github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sony/gobreaker v0.5.0 h1:dRCvqm0P490vZPmy7ppEk2qCnCieBooFJ+YoXGYB+yg= github.com/sony/gobreaker v0.5.0/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= @@ -461,7 +363,6 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= @@ -472,37 +373,32 @@ github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsT github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= -github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tinylib/msgp v1.1.9 h1:SHf3yoO2sGA0veCJeCBYLHuttAVFHGm2RHgNodW7wQU= github.com/tinylib/msgp v1.1.9/go.mod h1:BCXGB54lDD8qUEPmiG0cQQUANC4IUQyB2ItS2UDlO/k= -github.com/tklauser/go-sysconf v0.3.10 h1:IJ1AZGZRWbY8T5Vfk04D9WOA5WSejdflXxP03OUqALw= -github.com/tklauser/go-sysconf v0.3.10/go.mod h1:C8XykCvCb+Gn0oNCWPIlcb0RuglQTYaQ2hGm7jmxEFk= -github.com/tklauser/numcpus v0.4.0 h1:E53Dm1HjH1/R2/aoCtXtPgzmElmn51aOkhCFSuZq//o= -github.com/tklauser/numcpus v0.4.0/go.mod h1:1+UI3pD8NW14VMwdgJNJ1ESk2UnwhAnz5hMwiKKqXCQ= +github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= -github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs= github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= -github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM= github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= -github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= +github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= go.etcd.io/etcd/api/v3 v3.5.10 h1:szRajuUUbLyppkhs9K6BRtjY37l66XQQmw7oZRANE4k= go.etcd.io/etcd/api/v3 v3.5.10/go.mod h1:TidfmT4Uycad3NM/o25fG3J07odo4GBB9hoxaodFCtI= go.etcd.io/etcd/client/pkg/v3 v3.5.10 h1:kfYIdQftBnbAq8pUWFXfpuuxFSKzlmM5cSn76JByiT0= @@ -511,52 +407,46 @@ go.etcd.io/etcd/client/v2 v2.305.10 h1:MrmRktzv/XF8CvtQt+P6wLUlURaNpSDJHFZhe//2Q go.etcd.io/etcd/client/v2 v2.305.10/go.mod h1:m3CKZi69HzilhVqtPDcjhSGp+kA1OmbNn0qamH80xjA= go.etcd.io/etcd/client/v3 v3.5.10 h1:W9TXNZ+oB3MCd/8UjxHTWK5J9Nquw9fQBLJd5ne5/Ao= go.etcd.io/etcd/client/v3 v3.5.10/go.mod h1:RVeBnDz2PUEZqTpgqwAtUd8nAPf5kjyFyND7P1VkOKc= -go.mongodb.org/mongo-driver v1.9.0/go.mod h1:0sQWfOeY63QTntERDJJ/0SuKK0T1uVSgKCuAROlKEPY= go.mongodb.org/mongo-driver v1.14.0 h1:P98w8egYRjYe3XDjxhYJagTokP/H6HzlsnojRgZRd80= go.mongodb.org/mongo-driver v1.14.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= 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/go.mongodb.org/mongo-driver/mongo/otelmongo v0.32.0 h1:gNKQHn+q326vsi+kOskx9FCz9Jkz2fvxlf1y46dTN14= -go.opentelemetry.io/contrib/instrumentation/go.mongodb.org/mongo-driver/mongo/otelmongo v0.32.0/go.mod h1:9WqBmOJ4AOChNHtnRBSCGlKN4PQf1coLTCK57fyXE/s= -go.opentelemetry.io/contrib/instrumentation/host v0.32.0 h1:rgDeaor0XDeUaUCGj0VJIRdQYwsYANlnIh4yMgnaZvo= -go.opentelemetry.io/contrib/instrumentation/host v0.32.0/go.mod h1:GavGOmrtAjm+/J0WkNWzDC9rCAKQaD2d9JUzG225sgc= -go.opentelemetry.io/contrib/instrumentation/runtime v0.32.0 h1:eMQf85EgNd2YWEikRJwEy4ADOiwlIum4rcHcssB4Qzk= -go.opentelemetry.io/contrib/instrumentation/runtime v0.32.0/go.mod h1:qtaLlIO4HC4DfedkYTOrvS2u7nA3N/v8w9mehrBD4O8= +go.opentelemetry.io/contrib/instrumentation/go.mongodb.org/mongo-driver/mongo/otelmongo v0.49.0 h1:qF3LdpkD3Kbaw0Smsh+SVcJI/mtYGz9ZdCmu0YF2Lo4= +go.opentelemetry.io/contrib/instrumentation/go.mongodb.org/mongo-driver/mongo/otelmongo v0.49.0/go.mod h1:eqNF9g7W06ubrU7jk6M6UW9OTrcSPZvVY10cw9DUJ7c= +go.opentelemetry.io/contrib/instrumentation/host v0.49.0 h1:PHK4Cnis16iENFfqnzvuak5vfRl5L0UaTG2Z03vr3iI= +go.opentelemetry.io/contrib/instrumentation/host v0.49.0/go.mod h1:0XQuDAhohvWG6+cdmjX6aFbC4mGMjYf1xILFh5OUcEg= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= +go.opentelemetry.io/contrib/instrumentation/runtime v0.49.0 h1:dg9y+7ArpumB6zwImJv47RHfdgOGQ1EMkzP5vLkEnTU= +go.opentelemetry.io/contrib/instrumentation/runtime v0.49.0/go.mod h1:Ul4MtXqu/hJBM+v7a6dCF0nHwckPMLpIpLeCi4+zfdw= go.opentelemetry.io/otel v1.2.0/go.mod h1:aT17Fk0Z1Nor9e0uisf98LrntPGMnk4frBO9+dkf69I= -go.opentelemetry.io/otel v1.7.0 h1:Z2lA3Tdch0iDcrhJXDIlC94XE+bxok1F9B+4Lz/lGsM= -go.opentelemetry.io/otel v1.7.0/go.mod h1:5BdUoMIz5WEs0vt0CUEMtSSaTSHBBVwrhnz7+nrD5xk= -go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.7.0 h1:7Yxsak1q4XrJ5y7XBnNwqWx9amMZvoidCctv62XOQ6Y= -go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.7.0/go.mod h1:M1hVZHNxcbkAlcvrOMlpQ4YOO3Awf+4N2dxkZL3xm04= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.7.0 h1:cMDtmgJ5FpRvqx9x2Aq+Mm0O6K/zcUkH73SFz20TuBw= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.7.0/go.mod h1:ceUgdyfNv4h4gLxHR0WNfDiiVmZFodZhZSbOLhpxqXE= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.7.0 h1:MFAyzUPrTwLOwCi+cltN0ZVyy4phU41lwH+lyMyQTS4= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.7.0/go.mod h1:E+/KKhwOSw8yoPxSSuUHG6vKppkvhN+S1Jc7Nib3k3o= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.7.0 h1:pLP0MH4MAqeTEV0g/4flxw9O8Is48uAIauAnjznbW50= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.7.0/go.mod h1:aFXT9Ng2seM9eizF+LfKiyPBGy8xIZKwhusC1gIu3hA= -go.opentelemetry.io/otel/exporters/prometheus v0.30.0 h1:YXo5ZY5nofaEYMCMTTMaRH2cLDZB8+0UGuk5RwMfIo0= -go.opentelemetry.io/otel/exporters/prometheus v0.30.0/go.mod h1:qN5feW+0/d661KDtJuATEmHtw5bKBK7NSvNEP927zSs= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.30.0 h1:2glg1ZFVVZf47zFuX0iwBPPid4tqzBYYWTVVu0pc+us= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.30.0/go.mod h1:LGFXSl/Js7uN7mDcrzCcHVj48JOtoYDjm4oUI4dLif0= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.7.0 h1:8hPcgCg0rUJiKE6VWahRvjgLUrNl7rW2hffUEPKXVEM= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.7.0/go.mod h1:K4GDXPY6TjUiwbOh+DkKaEdCF8y+lvMoM6SeAPyfCCM= -go.opentelemetry.io/otel/metric v0.30.0 h1:Hs8eQZ8aQgs0U49diZoaS6Uaxw3+bBE3lcMUKBFIk3c= -go.opentelemetry.io/otel/metric v0.30.0/go.mod h1:/ShZ7+TS4dHzDFmfi1kSXMhMVubNoP0oIaBp70J6UXU= +go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= +go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.24.0 h1:t6wl9SPayj+c7lEIFgm4ooDBZVb01IhLB4InpomhRw8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.24.0/go.mod h1:iSDOcsnSA5INXzZtwaBPrKp/lWu/V14Dd+llD0oI2EA= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.24.0 h1:Mw5xcxMwlqoJd97vwPxA8isEaIoxsta9/Q51+TTJLGE= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.24.0/go.mod h1:CQNu9bj7o7mC6U7+CA/schKEYakYXWr79ucDHTMGhCM= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.24.0 h1:Xw8U6u2f8DK2XAkGRFV7BBLENgnTGX9i4rQRxJf+/vs= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.24.0/go.mod h1:6KW1Fm6R/s6Z3PGXwSJN2K4eT6wQB3vXX6CVnYX9NmM= +go.opentelemetry.io/otel/exporters/prometheus v0.46.0 h1:I8WIFXR351FoLJYuloU4EgXbtNX2URfU/85pUPheIEQ= +go.opentelemetry.io/otel/exporters/prometheus v0.46.0/go.mod h1:ztwVUHe5DTR/1v7PeuGRnU5Bbd4QKYwApWmuutKsJSs= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.24.0 h1:JYE2HM7pZbOt5Jhk8ndWZTUWYOVift2cHjXVMkPdmdc= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.24.0/go.mod h1:yMb/8c6hVsnma0RpsBMNo0fEiQKeclawtgaIaOp2MLY= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.24.0 h1:s0PHtIkN+3xrbDOpt2M8OTG92cWqUESvzh2MxiR5xY8= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.24.0/go.mod h1:hZlFbDbRt++MMPCCfSJfmhkGIWnX1h3XjkfxZUjLrIA= +go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= +go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= go.opentelemetry.io/otel/sdk v1.2.0/go.mod h1:jNN8QtpvbsKhgaC6V5lHiejMoKD+V8uadoSafgHPx1U= -go.opentelemetry.io/otel/sdk v1.7.0 h1:4OmStpcKVOfvDOgCt7UriAPtKolwIhxpnSNI/yK+1B0= -go.opentelemetry.io/otel/sdk v1.7.0/go.mod h1:uTEOTwaqIVuTGiJN7ii13Ibp75wJmYUDe374q6cZwUU= -go.opentelemetry.io/otel/sdk/metric v0.30.0 h1:XTqQ4y3erR2Oj8xSAOL5ovO5011ch2ELg51z4fVkpME= -go.opentelemetry.io/otel/sdk/metric v0.30.0/go.mod h1:8AKFRi5HyvTR0RRty3paN1aMC9HMT+NzcEhw/BLkLX8= +go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw= +go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= +go.opentelemetry.io/otel/sdk/metric v1.24.0 h1:yyMQrPzF+k88/DbH7o4FMAs80puqd+9osbiBrJrz/w8= +go.opentelemetry.io/otel/sdk/metric v1.24.0/go.mod h1:I6Y5FjH6rvEnTTAYQz3Mmv2kl6Ek5IIrmwTLqMrrOE0= go.opentelemetry.io/otel/trace v1.2.0/go.mod h1:N5FLswTubnxKxOJHM7XZC074qpeEdLy3CgAVsdMucK0= -go.opentelemetry.io/otel/trace v1.7.0 h1:O37Iogk1lEkMRXewVtZ1BBTVn5JEp8GrJvP92bJqC6o= -go.opentelemetry.io/otel/trace v1.7.0/go.mod h1:fzLSB9nqR2eXzxPXb2JW9IKE+ScyXA48yyE4TNvoHqU= +go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= +go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.opentelemetry.io/proto/otlp v0.16.0 h1:WHzDWdXUvbc5bG2ObdrGfaNpQz7ft7QN9HHmJlbiB1E= -go.opentelemetry.io/proto/otlp v0.16.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= +go.opentelemetry.io/proto/otlp v1.1.0 h1:2Di21piLrCqJ3U3eXGCTPHE9R8Nh+0uglSnOyxikMeI= +go.opentelemetry.io/proto/otlp v1.1.0/go.mod h1:GpBHCBWiqvVLDqmHZsoMM3C5ySeKTC7ej/RNTae6MdY= go.temporal.io/api v1.5.0/go.mod h1:BqKxEJJYdxb5dqf0ODfzfMxh8UEQ5L3zKS51FiIYYkA= go.temporal.io/api v1.8.0 h1:FzAMmBeLs6BEMFyHeJ9M9GAv6McFuH/GjnliBCdQ/Zw= go.temporal.io/api v1.8.0/go.mod h1:7m1ZOVUFi/54a5IMzMeELnvDy5sJwRfz11zi3Jrww8w= @@ -568,7 +458,6 @@ go.temporal.io/sdk/contrib/opentelemetry v0.1.0/go.mod h1:TrPfwtdvlwR3vqJFyPyl+W go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= @@ -579,46 +468,20 @@ go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= 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.0.0-20201216223049-8b5274cf687f/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= 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= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= 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-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= @@ -633,34 +496,16 @@ golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73r 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-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210913180222-943fd674d43e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220531201128-c960675eff93/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= @@ -668,12 +513,7 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= 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= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.16.0 h1:aDkGMBSYxElaoP81NpoUoz2oo2R2wHdZpGToUxfyQrQ= golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -682,10 +522,7 @@ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/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.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= @@ -696,70 +533,43 @@ golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/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-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210910150752-751e447fb3d0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= 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= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -768,9 +578,6 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -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= golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= @@ -778,45 +585,11 @@ golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGm 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-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= @@ -828,98 +601,40 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 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-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -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= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= google.golang.org/api v0.153.0 h1:N1AwGhielyKFaUqH07/ZSIQR3uNPcV7NVw0vj+j4iR4= google.golang.org/api v0.153.0/go.mod h1:3qNJX5eOmhiWYc67jRA/3GsDw97UFb5ivv7Y2PrriAY= 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/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/genproto v0.0.0-20180518175338-11a468237815/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20220602131408-e326c6e8e9c8/go.mod h1:yKyY4AMRwFiC8yMMNaMi+RkCnjZJt9LoWuvhXjMs+To= -google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17 h1:wpZ8pe2x1Q3f2KyT5f8oP/fa9rHAKgFPr/HZdNuS+PQ= -google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:J7XzRzVy1+IPwWHZUzoD0IccYZIrXILAQpc+Qy9CMhY= -google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 h1:JpwMPBpFN3uKhdaekDpiNlImDdkUAyiJ6ez/uxGaUSo= -google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:0xJLfVdJqpAPl8tDg1ujOCGzx6LFLttXT5NhllGOXY4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231120223509-83a465c0220f h1:ultW7fxlIvee4HYrtnaRPon9HpEgFk5zYpmfMgtKB5I= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231120223509-83a465c0220f/go.mod h1:L9KNLi232K1/xB6f7AlSX692koaRnKaWSR0stBki0Yc= +google.golang.org/genproto v0.0.0-20231212172506-995d672761c0 h1:YJ5pD9rF8o9Qtta0Cmy9rdBwkSjrTCT6XTiUQVOtIos= +google.golang.org/genproto v0.0.0-20231212172506-995d672761c0/go.mod h1:l/k7rMz0vFTBPy+tFSGvXEd3z+BcoG1k7EHbqm+YBsY= +google.golang.org/genproto/googleapis/api v0.0.0-20240102182953-50ed04b92917 h1:rcS6EyEaoCO52hQDupoSfrxI3R6C2Tq741is7X8OvnM= +google.golang.org/genproto/googleapis/api v0.0.0-20240102182953-50ed04b92917/go.mod h1:CmlNWB9lSezaYELKS5Ym1r44VrrbPUa7JTvw+6MbpJ0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240102182953-50ed04b92917 h1:6G8oQ016D88m1xAKljMlBOOGWDZkes4kMhgGFlf8WcQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240102182953-50ed04b92917/go.mod h1:xtjpI3tXFPP051KaWnhvxkiubL/6dJ18vLVf7q2pTOU= google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= 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.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -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 v1.61.1 h1:kLAiWrZs7YeDM6MumDe7m3y4aM6wacLzM1Y/wiLP9XY= +google.golang.org/grpc v1.61.1/go.mod h1:VUbo7IFqmF1QtCAstipjG0GIoq49KvMe9+h1jFLBNJs= 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= @@ -928,7 +643,6 @@ google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzi 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.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= @@ -938,12 +652,10 @@ google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7 google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= 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/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -951,7 +663,6 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= @@ -959,12 +670,4 @@ gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C 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-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/net/http/middleware/telemetry.go b/net/http/middleware/telemetry.go index 7b059b7..b643893 100644 --- a/net/http/middleware/telemetry.go +++ b/net/http/middleware/telemetry.go @@ -8,7 +8,6 @@ import ( httplog "github.com/foomo/keel/net/http/log" "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" "go.opentelemetry.io/otel" - "go.opentelemetry.io/otel/metric" "go.opentelemetry.io/otel/propagation" "go.opentelemetry.io/otel/trace" "go.uber.org/zap" diff --git a/service/goroutine_test.go b/service/goroutine_test.go index 5255593..f9bab03 100644 --- a/service/goroutine_test.go +++ b/service/goroutine_test.go @@ -53,8 +53,8 @@ func ExampleNewGoRoutine() { // {"level":"info","msg":"stopping keel service","keel_service_type":"goroutine","keel_service_name":"demo"} // {"level":"info","msg":"context has been canceled du to graceful shutdow","keel_service_type":"goroutine","keel_service_name":"demo","keel_service_inst":0} // {"level":"debug","msg":"keel graceful shutdown closer closed","name":"*service.GoRoutine"} - // {"level":"debug","msg":"keel graceful shutdown closer closed","name":"trace.noopTracerProvider"} - // {"level":"debug","msg":"keel graceful shutdown closer closed","name":"nonrecording.noopMeterProvider"} + // {"level":"debug","msg":"keel graceful shutdown closer closed","name":"noop.TracerProvider"} + // {"level":"debug","msg":"keel graceful shutdown closer closed","name":"noop.MeterProvider"} // {"level":"info","msg":"keel graceful shutdown complete"} // {"level":"info","msg":"keel server stopped"} } diff --git a/service/http_test.go b/service/http_test.go index 9d48a0b..ec98487 100644 --- a/service/http_test.go +++ b/service/http_test.go @@ -43,8 +43,8 @@ func ExampleNewHTTP() { // {"level":"info","msg":"keel graceful shutdown closers"} // {"level":"info","msg":"stopping keel service","keel_service_type":"http","keel_service_name":"demo"} // {"level":"debug","msg":"keel graceful shutdown closer closed","name":"*service.HTTP"} - // {"level":"debug","msg":"keel graceful shutdown closer closed","name":"trace.noopTracerProvider"} - // {"level":"debug","msg":"keel graceful shutdown closer closed","name":"nonrecording.noopMeterProvider"} + // {"level":"debug","msg":"keel graceful shutdown closer closed","name":"noop.TracerProvider"} + // {"level":"debug","msg":"keel graceful shutdown closer closed","name":"noop.MeterProvider"} // {"level":"info","msg":"keel graceful shutdown complete"} // {"level":"info","msg":"keel server stopped"} } diff --git a/service/httpreadme_test.go b/service/httpreadme_test.go index a9bd5e3..27b6b92 100644 --- a/service/httpreadme_test.go +++ b/service/httpreadme_test.go @@ -10,10 +10,11 @@ import ( "github.com/foomo/keel" "github.com/foomo/keel/config" "github.com/foomo/keel/env" + "github.com/foomo/keel/net/http/middleware" "github.com/foomo/keel/service" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" - "go.opentelemetry.io/otel/metric/instrument" + "go.opentelemetry.io/otel/metric" "go.uber.org/zap" ) @@ -53,16 +54,20 @@ func _ExampleNewHTTPReadme() { Name: "foo_bar_total", Help: "Foo bar metrics", }) - fooBazCounter, _ := m.SyncInt64().Counter("foo_baz_total", instrument.WithDescription("Foo baz metrics")) + fooBazCounter, _ := m.Int64Counter("foo_baz_total", metric.WithDescription("Foo baz metrics")) fooBarCounter.Add(1) fooBazCounter.Add(svr.Context(), 1) // add http service - svr.AddService(service.NewHTTP(l, "demp-http", "localhost:8080", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.WriteHeader(http.StatusOK) - _, _ = w.Write([]byte("OK")) - }))) + svr.AddService( + service.NewHTTP(l, "demp-http", "localhost:8080", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusOK) + _, _ = w.Write([]byte("OK")) + }), + middleware.Telemetry(), + ), + ) // add go routine service svr.AddService(service.NewGoRoutine(l, "demo-goroutine", func(ctx context.Context, l *zap.Logger) error { @@ -71,7 +76,8 @@ func _ExampleNewHTTPReadme() { go func() { waitFor("localhost:9001") - fmt.Print(httpGet("http://localhost:9001/readme")) + httpGet("http://localhost:8080/") + fmt.Println(httpGet("http://localhost:9001/readme")) shutdown() }() @@ -90,6 +96,8 @@ func _ExampleNewHTTPReadme() { // | `EXAMPLE_REQUIRED_STRING` | `string` | | | // | `EXAMPLE_REQUIRED_STRING` | `string` | `true` | | // | `EXAMPLE_STRING` | `string` | | `demo` | + // | `KEEL_GRACEFUL_TIMEOUT` | `int` | | | + // | `KEEL_SHUTDOWN_TIMEOUT` | `int` | | | // | `LOG_DISABLE_CALLER` | `bool` | | | // | `LOG_DISABLE_STACKTRACE` | `bool` | | | // | `LOG_ENCODING` | `string` | | `json` | @@ -154,35 +162,40 @@ func _ExampleNewHTTPReadme() { // // List of all registered metrics than are being exposed. // - // | Name | Type | Description | - // | ---------------------------------- | ------- | ------------------------------------------------------------------ | - // | `foo_bar_total` | COUNTER | Foo bar metrics | - // | `foo_baz_total` | COUNTER | Foo baz metrics | - // | `go_gc_duration_seconds` | SUMMARY | A summary of the pause duration of garbage collection cycles. | - // | `go_goroutines` | GAUGE | Number of goroutines that currently exist. | - // | `go_info` | GAUGE | Information about the Go environment. | - // | `go_memstats_alloc_bytes_total` | COUNTER | Total number of bytes allocated, even if freed. | - // | `go_memstats_alloc_bytes` | GAUGE | Number of bytes allocated and still in use. | - // | `go_memstats_buck_hash_sys_bytes` | GAUGE | Number of bytes used by the profiling bucket hash table. | - // | `go_memstats_frees_total` | COUNTER | Total number of frees. | - // | `go_memstats_gc_sys_bytes` | GAUGE | Number of bytes used for garbage collection system metadata. | - // | `go_memstats_heap_alloc_bytes` | GAUGE | Number of heap bytes allocated and still in use. | - // | `go_memstats_heap_idle_bytes` | GAUGE | Number of heap bytes waiting to be used. | - // | `go_memstats_heap_inuse_bytes` | GAUGE | Number of heap bytes that are in use. | - // | `go_memstats_heap_objects` | GAUGE | Number of allocated objects. | - // | `go_memstats_heap_released_bytes` | GAUGE | Number of heap bytes released to OS. | - // | `go_memstats_heap_sys_bytes` | GAUGE | Number of heap bytes obtained from system. | - // | `go_memstats_last_gc_time_seconds` | GAUGE | Number of seconds since 1970 of last garbage collection. | - // | `go_memstats_lookups_total` | COUNTER | Total number of pointer lookups. | - // | `go_memstats_mallocs_total` | COUNTER | Total number of mallocs. | - // | `go_memstats_mcache_inuse_bytes` | GAUGE | Number of bytes in use by mcache structures. | - // | `go_memstats_mcache_sys_bytes` | GAUGE | Number of bytes used for mcache structures obtained from system. | - // | `go_memstats_mspan_inuse_bytes` | GAUGE | Number of bytes in use by mspan structures. | - // | `go_memstats_mspan_sys_bytes` | GAUGE | Number of bytes used for mspan structures obtained from system. | - // | `go_memstats_next_gc_bytes` | GAUGE | Number of heap bytes when next garbage collection will take place. | - // | `go_memstats_other_sys_bytes` | GAUGE | Number of bytes used for other system allocations. | - // | `go_memstats_stack_inuse_bytes` | GAUGE | Number of bytes in use by the stack allocator. | - // | `go_memstats_stack_sys_bytes` | GAUGE | Number of bytes obtained from system for stack allocator. | - // | `go_memstats_sys_bytes` | GAUGE | Number of bytes obtained from system. | - // | `go_threads` | GAUGE | Number of OS threads created. | + // | Name | Type | Description | + // | --------------------------------------- | --------- | ------------------------------------------------------------------ | + // | `foo_bar_total` | COUNTER | Foo bar metrics | + // | `foo_baz_total` | COUNTER | Foo baz metrics | + // | `go_gc_duration_seconds` | SUMMARY | A summary of the pause duration of garbage collection cycles. | + // | `go_goroutines` | GAUGE | Number of goroutines that currently exist. | + // | `go_info` | GAUGE | Information about the Go environment. | + // | `go_memstats_alloc_bytes_total` | COUNTER | Total number of bytes allocated, even if freed. | + // | `go_memstats_alloc_bytes` | GAUGE | Number of bytes allocated and still in use. | + // | `go_memstats_buck_hash_sys_bytes` | GAUGE | Number of bytes used by the profiling bucket hash table. | + // | `go_memstats_frees_total` | COUNTER | Total number of frees. | + // | `go_memstats_gc_sys_bytes` | GAUGE | Number of bytes used for garbage collection system metadata. | + // | `go_memstats_heap_alloc_bytes` | GAUGE | Number of heap bytes allocated and still in use. | + // | `go_memstats_heap_idle_bytes` | GAUGE | Number of heap bytes waiting to be used. | + // | `go_memstats_heap_inuse_bytes` | GAUGE | Number of heap bytes that are in use. | + // | `go_memstats_heap_objects` | GAUGE | Number of allocated objects. | + // | `go_memstats_heap_released_bytes` | GAUGE | Number of heap bytes released to OS. | + // | `go_memstats_heap_sys_bytes` | GAUGE | Number of heap bytes obtained from system. | + // | `go_memstats_last_gc_time_seconds` | GAUGE | Number of seconds since 1970 of last garbage collection. | + // | `go_memstats_lookups_total` | COUNTER | Total number of pointer lookups. | + // | `go_memstats_mallocs_total` | COUNTER | Total number of mallocs. | + // | `go_memstats_mcache_inuse_bytes` | GAUGE | Number of bytes in use by mcache structures. | + // | `go_memstats_mcache_sys_bytes` | GAUGE | Number of bytes used for mcache structures obtained from system. | + // | `go_memstats_mspan_inuse_bytes` | GAUGE | Number of bytes in use by mspan structures. | + // | `go_memstats_mspan_sys_bytes` | GAUGE | Number of bytes used for mspan structures obtained from system. | + // | `go_memstats_next_gc_bytes` | GAUGE | Number of heap bytes when next garbage collection will take place. | + // | `go_memstats_other_sys_bytes` | GAUGE | Number of bytes used for other system allocations. | + // | `go_memstats_stack_inuse_bytes` | GAUGE | Number of bytes in use by the stack allocator. | + // | `go_memstats_stack_sys_bytes` | GAUGE | Number of bytes obtained from system for stack allocator. | + // | `go_memstats_sys_bytes` | GAUGE | Number of bytes obtained from system. | + // | `go_threads` | GAUGE | Number of OS threads created. | + // | `http_server_duration_milliseconds` | HISTOGRAM | Measures the duration of inbound HTTP requests. | + // | `http_server_request_size_bytes_total` | COUNTER | Measures the size of HTTP request messages. | + // | `http_server_response_size_bytes_total` | COUNTER | Measures the size of HTTP response messages. | + // | `otel_scope_info` | GAUGE | Instrumentation Scope metadata | + // | `target_info` | GAUGE | Target metadata | } diff --git a/telemetry/tracer.go b/telemetry/tracer.go index 9c9aa32..5ca41f6 100644 --- a/telemetry/tracer.go +++ b/telemetry/tracer.go @@ -11,6 +11,7 @@ import ( sdktrace "go.opentelemetry.io/otel/sdk/trace" semconv "go.opentelemetry.io/otel/semconv/v1.10.0" "go.opentelemetry.io/otel/trace" + "go.opentelemetry.io/otel/trace/noop" "github.com/foomo/keel/env" ) @@ -24,7 +25,7 @@ func TraceProvider() trace.TracerProvider { } func NewNoopTraceProvider() (trace.TracerProvider, error) { - tracerProvider := trace.NewNoopTracerProvider() + tracerProvider := noop.NewTracerProvider() otel.SetTracerProvider(tracerProvider) return tracerProvider, nil } From 5c5d32717bb4a680ce68d8fd118b214c785b259b Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Fri, 22 Mar 2024 10:37:29 +0100 Subject: [PATCH 115/134] feat: update logging format --- log/{log.go => logger.go} | 59 +++++++++++++-------------------------- 1 file changed, 19 insertions(+), 40 deletions(-) rename log/{log.go => logger.go} (62%) diff --git a/log/log.go b/log/logger.go similarity index 62% rename from log/log.go rename to log/logger.go index 1a27662..b0b5e1d 100644 --- a/log/log.go +++ b/log/logger.go @@ -2,7 +2,6 @@ package log import ( "fmt" - "time" "go.uber.org/zap" "go.uber.org/zap/zapcore" @@ -10,60 +9,40 @@ import ( "github.com/foomo/keel/env" ) -const ( - ModeDev = "dev" - ModeProd = "prod" -) - var ( config zap.Config atomicLevel = zap.NewAtomicLevelAt(zap.InfoLevel) ) func init() { - var level string - switch env.Get("LOG_MODE", ModeProd) { - case ModeDev: - config = NewDevelopmentConfig() - level = env.Get("LOG_LEVEL", "debug") - default: - config = NewProductionConfig() - level = env.Get("LOG_LEVEL", "info") + zap.ReplaceGlobals(NewLogger( + env.Get("LOG_LEVEL", "info"), + env.Get("LOG_FORMAT", "json"), + )) +} + +// NewLogger return a new logger instance +func NewLogger(level, encoding string) *zap.Logger { + config = zap.NewProductionConfig() + if value, err := zapcore.ParseLevel(level); err == nil { + atomicLevel.SetLevel(value) } + config.Encoding = encoding config.Level = atomicLevel config.EncoderConfig.TimeKey = "time" - config.DisableCaller = env.GetBool("LOG_DISABLE_STACKTRACE", true) - config.DisableStacktrace = env.GetBool("LOG_DISABLE_CALLER", true) - - if value, err := config.Build(); err != nil { - panic(err) - } else { - zap.ReplaceGlobals(value) + config.EncoderConfig.EncodeTime = zapcore.RFC3339NanoTimeEncoder + if encoding == "console" { + config.EncoderConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder } - - if value, err := zapcore.ParseLevel(env.Get("LOG_LEVEL", level)); err != nil { + config.DisableCaller = env.GetBool("LOG_DISABLE_STACKTRACE", !config.Level.Enabled(zap.DebugLevel)) + config.DisableStacktrace = env.GetBool("LOG_DISABLE_CALLER", !config.Level.Enabled(zap.DebugLevel)) + if value, err := config.Build(); err != nil { panic(err) } else { - atomicLevel.SetLevel(value) + return value } } -func NewProductionConfig() zap.Config { - config = zap.NewProductionConfig() - config.Encoding = env.Get("LOG_ENCODING", "json") - config.EncoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder - return config -} - -func NewDevelopmentConfig() zap.Config { - config = zap.NewDevelopmentConfig() - config.Encoding = env.Get("LOG_ENCODING", "console") - config.EncoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder - config.EncoderConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder - config.EncoderConfig.EncodeTime = func(t time.Time, enc zapcore.PrimitiveArrayEncoder) {} - return config -} - // Logger return the logger instance func Logger() *zap.Logger { return zap.L() From f791248997cb23da42fa856af1e83793c001903b Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Fri, 22 Mar 2024 21:18:11 +0100 Subject: [PATCH 116/134] feat: update graceful --- option.go | 12 ++++++------ server.go | 33 ++++++++++++++++----------------- server_test.go | 2 +- service/goroutine_test.go | 18 +++++++++--------- service/http_test.go | 18 +++++++++--------- service/httpreadme_test.go | 2 +- 6 files changed, 42 insertions(+), 43 deletions(-) diff --git a/option.go b/option.go index 709513a..527e93c 100644 --- a/option.go +++ b/option.go @@ -62,17 +62,17 @@ func WithShutdownSignals(shutdownSignals ...os.Signal) Option { } } -// WithGracefulTimeout option -func WithGracefulTimeout(gracefulTimeout time.Duration) Option { +// WithGracefulPeriod option +func WithGracefulPeriod(gracefulPeriod time.Duration) Option { return func(inst *Server) { - inst.gracefulTimeout = gracefulTimeout + inst.gracefulPeriod = gracefulPeriod } } -// WithShutdownTimeout option -func WithShutdownTimeout(shutdownTimeout time.Duration) Option { +// WithGracefulTimeout option +func WithGracefulTimeout(gracefulTimeout time.Duration) Option { return func(inst *Server) { - inst.shutdownTimeout = shutdownTimeout + inst.gracefulTimeout = gracefulTimeout } } diff --git a/server.go b/server.go index ad5d739..facaa48 100644 --- a/server.go +++ b/server.go @@ -45,10 +45,10 @@ type Server struct { traceProvider trace.TracerProvider shutdown atomic.Bool shutdownSignals []os.Signal - // gracefulTimeout should equal the readinessProbe's periodSeconds * failureThreshold + // gracefulTimeout should be lower than terminationGracePeriodSeconds gracefulTimeout time.Duration - // shutdownTimeout should equal the readinessProbe's terminationGracePeriodSeconds - shutdownTimeout time.Duration + // gracefulPeriod should equal the terminationGracePeriodSeconds + gracefulPeriod time.Duration running atomic.Bool syncClosers []interface{} syncClosersLock sync.RWMutex @@ -69,8 +69,8 @@ type Server struct { func NewServer(opts ...Option) *Server { inst := &Server{ - gracefulTimeout: time.Duration(env.GetInt("KEEL_GRACEFUL_TIMEOUT", 10*3)) * time.Second, - shutdownTimeout: time.Duration(env.GetInt("KEEL_SHUTDOWN_TIMEOUT", 30)) * time.Second, + gracefulTimeout: time.Duration(env.GetInt("KEEL_GRACEFUL_PERIOD", 30)) * time.Second, + gracefulPeriod: time.Duration(env.GetInt("KEEL_GRACEFUL_TIMEOUT", 15)) * time.Second, shutdownSignals: []os.Signal{syscall.SIGINT, syscall.SIGTERM}, syncReadmers: []interfaces.Readmer{}, syncProbes: map[healthz.Type][]interface{}{}, @@ -98,17 +98,16 @@ func NewServer(opts ...Option) *Server { // gracefully shutdown inst.g.Go(func() error { <-inst.shutdownCtx.Done() - inst.l.Info("keel graceful shutdown") - - timeoutCtx, timeoutCancel := context.WithTimeout(inst.ctx, inst.shutdownTimeout) + timeoutCtx, timeoutCancel := context.WithTimeout(inst.ctx, inst.gracefulPeriod) defer timeoutCancel() - inst.shutdown.Store(true) - - inst.l.Info("keel graceful shutdown timeout", + inst.l.Info("keel graceful shutdown", + // zap.Int32("readiness_threshold", inst.readinessThreshold), zap.Duration("graceful_timeout", inst.gracefulTimeout), - zap.Duration("shutdown_timeout", inst.shutdownTimeout), + zap.Duration("graceful_period", inst.gracefulPeriod), ) + + inst.l.Info("keel graceful shutdown: timeout") { timer := time.NewTimer(inst.gracefulTimeout) select { @@ -117,12 +116,12 @@ func NewServer(opts ...Option) *Server { case <-timer.C: } } - inst.l.Info("keel graceful shutdown timeout complete") + inst.l.Info("keel graceful shutdown: timeout complete") // append internal closers closers := append(inst.closers(), inst.traceProvider, inst.meterProvider) - inst.l.Info("keel graceful shutdown closers") + inst.l.Info("keel graceful shutdown: closers") for _, closer := range closers { var err error l := inst.l.With(log.FName(fmt.Sprintf("%T", closer))) @@ -161,13 +160,13 @@ func NewServer(opts ...Option) *Server { err = c.Unsubscribe(timeoutCtx) } if err != nil { - l.Warn("keel graceful shutdown closer failed", zap.Error(err)) + l.Warn("keel graceful shutdown: closer failed", zap.Error(err)) } else { - l.Debug("keel graceful shutdown closer closed") + l.Debug("keel graceful shutdown: closer closed") } } - inst.l.Info("keel graceful shutdown complete") + inst.l.Info("keel graceful shutdown: complete") return nil }) diff --git a/server_test.go b/server_test.go index 1d0fc63..3205266 100644 --- a/server_test.go +++ b/server_test.go @@ -64,7 +64,7 @@ func (s *KeelTestSuite) BeforeTest(suiteName, testName string) { keel.WithContext(ctx), keel.WithLogger(s.l), keel.WithGracefulTimeout(400*time.Millisecond), - keel.WithShutdownTimeout(800*time.Millisecond), + keel.WithGracefulPeriod(800*time.Millisecond), ) s.cancel = cancel } diff --git a/service/goroutine_test.go b/service/goroutine_test.go index f9bab03..87584b5 100644 --- a/service/goroutine_test.go +++ b/service/goroutine_test.go @@ -17,7 +17,7 @@ func ExampleNewGoRoutine() { svr := keel.NewServer( keel.WithLogger(zap.NewExample()), keel.WithGracefulTimeout(time.Second), - keel.WithShutdownTimeout(3*time.Second), + keel.WithGracefulPeriod(3*time.Second), ) svr.AddService( @@ -45,16 +45,16 @@ func ExampleNewGoRoutine() { // {"level":"info","msg":"starting keel service","keel_service_type":"goroutine","keel_service_name":"demo"} // {"level":"info","msg":"ping","keel_service_type":"goroutine","keel_service_name":"demo","keel_service_inst":0} // {"level":"info","msg":"ping","keel_service_type":"goroutine","keel_service_name":"demo","keel_service_inst":0} - // {"level":"info","msg":"keel graceful shutdown"} - // {"level":"info","msg":"keel graceful shutdown timeout","graceful_timeout":"1s","shutdown_timeout":"3s"} + // {"level":"info","msg":"keel graceful shutdown","graceful_timeout":"1s","graceful_period":"3s"} + // {"level":"info","msg":"keel graceful shutdown: timeout"} // {"level":"info","msg":"ping","keel_service_type":"goroutine","keel_service_name":"demo","keel_service_inst":0} - // {"level":"info","msg":"keel graceful shutdown timeout complete"} - // {"level":"info","msg":"keel graceful shutdown closers"} + // {"level":"info","msg":"keel graceful shutdown: timeout complete"} + // {"level":"info","msg":"keel graceful shutdown: closers"} // {"level":"info","msg":"stopping keel service","keel_service_type":"goroutine","keel_service_name":"demo"} // {"level":"info","msg":"context has been canceled du to graceful shutdow","keel_service_type":"goroutine","keel_service_name":"demo","keel_service_inst":0} - // {"level":"debug","msg":"keel graceful shutdown closer closed","name":"*service.GoRoutine"} - // {"level":"debug","msg":"keel graceful shutdown closer closed","name":"noop.TracerProvider"} - // {"level":"debug","msg":"keel graceful shutdown closer closed","name":"noop.MeterProvider"} - // {"level":"info","msg":"keel graceful shutdown complete"} + // {"level":"debug","msg":"keel graceful shutdown: closer closed","name":"*service.GoRoutine"} + // {"level":"debug","msg":"keel graceful shutdown: closer closed","name":"noop.TracerProvider"} + // {"level":"debug","msg":"keel graceful shutdown: closer closed","name":"noop.MeterProvider"} + // {"level":"info","msg":"keel graceful shutdown: complete"} // {"level":"info","msg":"keel server stopped"} } diff --git a/service/http_test.go b/service/http_test.go index ec98487..02f14f1 100644 --- a/service/http_test.go +++ b/service/http_test.go @@ -13,7 +13,7 @@ func ExampleNewHTTP() { svr := keel.NewServer( keel.WithLogger(zap.NewExample()), keel.WithGracefulTimeout(time.Second), - keel.WithShutdownTimeout(10*time.Second), + keel.WithGracefulPeriod(10*time.Second), ) l := svr.Logger() @@ -37,14 +37,14 @@ func ExampleNewHTTP() { // {"level":"info","msg":"starting keel server"} // {"level":"info","msg":"starting keel service","keel_service_type":"http","keel_service_name":"demo","net_host_ip":"localhost","net_host_port":"8080"} // {"level":"info","msg":"OK"} - // {"level":"info","msg":"keel graceful shutdown"} - // {"level":"info","msg":"keel graceful shutdown timeout","graceful_timeout":"1s","shutdown_timeout":"10s"} - // {"level":"info","msg":"keel graceful shutdown timeout complete"} - // {"level":"info","msg":"keel graceful shutdown closers"} + // {"level":"info","msg":"keel graceful shutdown","graceful_timeout":"1s","graceful_period":"10s"} + // {"level":"info","msg":"keel graceful shutdown: timeout"} + // {"level":"info","msg":"keel graceful shutdown: timeout complete"} + // {"level":"info","msg":"keel graceful shutdown: closers"} // {"level":"info","msg":"stopping keel service","keel_service_type":"http","keel_service_name":"demo"} - // {"level":"debug","msg":"keel graceful shutdown closer closed","name":"*service.HTTP"} - // {"level":"debug","msg":"keel graceful shutdown closer closed","name":"noop.TracerProvider"} - // {"level":"debug","msg":"keel graceful shutdown closer closed","name":"noop.MeterProvider"} - // {"level":"info","msg":"keel graceful shutdown complete"} + // {"level":"debug","msg":"keel graceful shutdown: closer closed","name":"*service.HTTP"} + // {"level":"debug","msg":"keel graceful shutdown: closer closed","name":"noop.TracerProvider"} + // {"level":"debug","msg":"keel graceful shutdown: closer closed","name":"noop.MeterProvider"} + // {"level":"info","msg":"keel graceful shutdown: complete"} // {"level":"info","msg":"keel server stopped"} } diff --git a/service/httpreadme_test.go b/service/httpreadme_test.go index 27b6b92..aac58c1 100644 --- a/service/httpreadme_test.go +++ b/service/httpreadme_test.go @@ -28,7 +28,7 @@ func _ExampleNewHTTPReadme() { keel.WithPrometheusMeter(true), keel.WithHTTPReadmeService(true), keel.WithGracefulTimeout(time.Second), - keel.WithShutdownTimeout(3*time.Second), + keel.WithGracefulPeriod(3*time.Second), ) // access some env vars From 801110dc8e34d37c2ba7aeee38870fa41a57b36b Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Mon, 25 Mar 2024 08:20:18 +0100 Subject: [PATCH 117/134] chore: update workflows --- .github/dependabot.yml | 17 ++++++----------- .github/workflows/{test.yml => pr.yml} | 11 ++++++----- .github/workflows/{release.yml => tag.yml} | 11 +++++------ .golangci.yml | 1 + .goreleaser.yml | 17 +++++++++++++++++ 5 files changed, 35 insertions(+), 22 deletions(-) rename .github/workflows/{test.yml => pr.yml} (78%) rename .github/workflows/{release.yml => tag.yml} (65%) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 1ba1f3b..c9d1dc6 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,15 +1,10 @@ -# To get started with Dependabot version updates, you'll need to specify which -# package ecosystems to update and where the package manifests are located. -# Please see the documentation for all configuration options: -# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates - version: 2 updates: - - package-ecosystem: "github-actions" - directory: "/" + - package-ecosystem: github-actions + directory: '/' schedule: - interval: "weekly" - - package-ecosystem: "gomod" - directory: "/" + interval: weekly + - package-ecosystem: gomod + directory: '/' schedule: - interval: "weekly" + interval: weekly diff --git a/.github/workflows/test.yml b/.github/workflows/pr.yml similarity index 78% rename from .github/workflows/test.yml rename to .github/workflows/pr.yml index b1c0152..1f91bba 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/pr.yml @@ -1,9 +1,10 @@ -name: Test Branch +name: PR check on: push: branches: [ main ] pull_request: + merge_group: workflow_dispatch: concurrency: @@ -18,18 +19,18 @@ jobs: - uses: actions/setup-go@v4 with: - go-version: 'stable' + go-version-file: 'go.mod' - uses: gotesttools/gotestfmt-action@v2 with: token: ${{ secrets.GITHUB_TOKEN }} - - uses: golangci/golangci-lint-action@v3 + - uses: golangci/golangci-lint-action@v4 with: version: latest - args: --timeout=5m - - run: make test + - name: Run tests + run: make test - uses: coverallsapp/github-action@v2 with: diff --git a/.github/workflows/release.yml b/.github/workflows/tag.yml similarity index 65% rename from .github/workflows/release.yml rename to .github/workflows/tag.yml index b0990b7..a6595d2 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/tag.yml @@ -14,16 +14,15 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - run: git fetch --force --tags + - name: Unshallow + run: git fetch --prune --unshallow - - uses: actions/setup-go@v4 + - uses: actions/setup-go@v5 with: - go-version: 'stable' + go-version-file: go.mod - - uses: goreleaser/goreleaser-action@v4 + - uses: goreleaser/goreleaser-action@v5 with: version: latest args: release --clean diff --git a/.golangci.yml b/.golangci.yml index f3f5ee7..a2052d7 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -1,4 +1,5 @@ run: + timeout: 5m skip-dirs: - tmp diff --git a/.goreleaser.yml b/.goreleaser.yml index fbb8188..6282460 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -1,5 +1,22 @@ +project_name: keel + +release: + github: + owner: foomo + name: keel + prerelease: auto + builds: - skip: true +archives: + - format: tar.gz + format_overrides: + - goos: windows + format: zip + files: + - LICENSE + - README.md + changelog: use: github-native From 57bfd19fc93e20fd9e22f12f82a5c8f7d6b7fbce Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Tue, 26 Mar 2024 13:49:16 +0100 Subject: [PATCH 118/134] feat: set timeouts --- service/http.go | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/service/http.go b/service/http.go index e955f6e..b7b46e2 100644 --- a/service/http.go +++ b/service/http.go @@ -7,6 +7,7 @@ import ( "net/http" "strings" "sync/atomic" + "time" "github.com/pkg/errors" "go.uber.org/zap" @@ -23,6 +24,10 @@ type HTTP struct { l *zap.Logger } +// ------------------------------------------------------------------------------------------------ +// ~ Constructor +// ------------------------------------------------------------------------------------------------ + func NewHTTP(l *zap.Logger, name, addr string, handler http.Handler, middlewares ...middleware.Middleware) *HTTP { if l == nil { l = log.Logger() @@ -35,19 +40,34 @@ func NewHTTP(l *zap.Logger, name, addr string, handler http.Handler, middlewares return &HTTP{ server: &http.Server{ - Addr: addr, - ErrorLog: zap.NewStdLog(l), - Handler: middleware.Compose(l, name, handler, middlewares...), + Addr: addr, + ErrorLog: zap.NewStdLog(l), + IdleTimeout: 5 * time.Second, + ReadTimeout: 5 * time.Second, + WriteTimeout: 5 * time.Second, + Handler: middleware.Compose(l, name, handler, middlewares...), }, name: name, l: l, } } +// ------------------------------------------------------------------------------------------------ +// ~ Getter +// ------------------------------------------------------------------------------------------------ + func (s *HTTP) Name() string { return s.name } +func (s *HTTP) Server() *http.Server { + return s.server +} + +// ------------------------------------------------------------------------------------------------ +// ~ Public methods +// ------------------------------------------------------------------------------------------------ + func (s *HTTP) Healthz() error { if !s.running.Load() { return ErrServiceNotRunning @@ -69,12 +89,12 @@ func (s *HTTP) Start(ctx context.Context) error { fields = append(fields, log.FNetHostIP(ip), log.FNetHostPort(port)) } s.l.Info("starting keel service", fields...) - s.server.BaseContext = func(_ net.Listener) context.Context { return ctx } - s.server.RegisterOnShutdown(func() { + s.Server().BaseContext = func(_ net.Listener) context.Context { return ctx } + s.Server().RegisterOnShutdown(func() { s.running.Store(false) }) s.running.Store(true) - if err := s.server.ListenAndServe(); errors.Is(err, http.ErrServerClosed) { + if err := s.Server().ListenAndServe(); errors.Is(err, http.ErrServerClosed) { return nil } else if err != nil { return errors.Wrap(err, "failed to start service") @@ -84,7 +104,7 @@ func (s *HTTP) Start(ctx context.Context) error { func (s *HTTP) Close(ctx context.Context) error { s.l.Info("stopping keel service") - if err := s.server.Shutdown(ctx); err != nil { + if err := s.Server().Shutdown(ctx); err != nil { return errors.Wrap(err, "failed to stop service") } return nil From e2062f5940553ab81e3c16410b67c66ad347cf2b Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Mon, 15 Apr 2024 09:08:49 +0200 Subject: [PATCH 119/134] chore: group dependencies --- .github/dependabot.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index c9d1dc6..61d3a33 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -4,7 +4,15 @@ updates: directory: '/' schedule: interval: weekly + - package-ecosystem: gomod directory: '/' schedule: interval: weekly + groups: + gomod-security: + applies-to: security-updates + patterns: ['*'] + gomod-update: + applies-to: version-updates + patterns: ['*'] From a423908c97c710e12696c9f81285d3953b9faa71 Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Mon, 15 Apr 2024 09:09:12 +0200 Subject: [PATCH 120/134] revert: remove graceful timeout --- examples/graceful/main.go | 86 ----------------- examples/graceful/main_test.go | 130 +++++++++++++++++++++++++ examples/remoteconfig/main.go | 4 +- go.mod | 81 ++++++++-------- go.sum | 168 +++++++++++++++++---------------- option.go | 7 -- server.go | 74 +++++---------- server_test.go | 2 - service/goroutine_test.go | 6 +- service/http.go | 12 +-- service/http_test.go | 5 +- service/httpreadme_test.go | 1 - telemetry/meter.go | 2 +- 13 files changed, 288 insertions(+), 290 deletions(-) delete mode 100644 examples/graceful/main.go create mode 100644 examples/graceful/main_test.go diff --git a/examples/graceful/main.go b/examples/graceful/main.go deleted file mode 100644 index f1bbe61..0000000 --- a/examples/graceful/main.go +++ /dev/null @@ -1,86 +0,0 @@ -package main - -import ( - "context" - "net/http" - "syscall" - "time" - - "github.com/foomo/keel/interfaces" - "github.com/foomo/keel/service" - "go.uber.org/zap" - - "github.com/foomo/keel" -) - -func main() { - service.DefaultHTTPHealthzAddr = "localhost:9400" - - l := zap.NewExample().Named("root") - - l.Info("1. starting readiness checks") - go call(l.Named("readiness"), "http://localhost:9400/healthz/readiness") - - svr := keel.NewServer( - keel.WithLogger(l.Named("server")), - keel.WithHTTPHealthzService(true), - ) - - // create demo service - svs := http.NewServeMux() - svs.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { - _, _ = w.Write([]byte("OK")) - }) - - svr.AddService( - service.NewHTTP(l, "http", "localhost:8080", svs), - ) - - svr.AddCloser(interfaces.CloserFunc(func(ctx context.Context) error { - l := l.Named("closer") - l.Info("closing stuff") - time.Sleep(3 * time.Second) - l.Info("done closing stuff") - return nil - })) - - go func() { - - l.Info("3. starting http checks") - go call(l.Named("http"), "http://localhost:8080") - - l.Info("4. sleeping for 5 seconds") - time.Sleep(5 * time.Second) - - l.Info("5. sending shutdown signal") - if err := syscall.Kill(syscall.Getpid(), syscall.SIGTERM); err != nil { - l.Fatal(err.Error()) - } - - }() - - svr.Run() - l.Info("done") -} - -func call(l *zap.Logger, url string) { - l = l.With(zap.String("url", url)) - for { - func() { - ctx, cancel := context.WithTimeout(context.Background(), 500*time.Millisecond) - defer cancel() - req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) - if err != nil { - l.With(zap.Error(err)).Error("failed to create request") - return - } - resp, err := http.DefaultClient.Do(req) - if err != nil { - l.With(zap.Error(err)).Error("failed to send request") - return - } - l.Info("ok", zap.Int("status", resp.StatusCode)) - }() - time.Sleep(time.Second) - } -} diff --git a/examples/graceful/main_test.go b/examples/graceful/main_test.go new file mode 100644 index 0000000..0272bac --- /dev/null +++ b/examples/graceful/main_test.go @@ -0,0 +1,130 @@ +package main + +import ( + "context" + "net/http" + "syscall" + "time" + + "github.com/foomo/keel/interfaces" + "github.com/foomo/keel/service" + "go.uber.org/zap" + + "github.com/foomo/keel" +) + +func ExampleMain() { + service.DefaultHTTPHealthzAddr = "localhost:9400" + + l := zap.NewExample().Named("root") + + go func() { + c := make(chan bool, 1) + time.Sleep(2 * time.Second) + + l.Info("1. starting checks") + go func() { + c <- true + for { + call(l.Named("http"), "http://localhost:8080") + call(l.Named("readiness"), "http://localhost:9400/healthz/readiness") + time.Sleep(time.Second) + } + }() + <-c + close(c) + + l.Info("2. sleeping for 5 seconds") + time.Sleep(5 * time.Second) + + l.Info("3. sending shutdown signal") + if err := syscall.Kill(syscall.Getpid(), syscall.SIGTERM); err != nil { + l.Fatal(err.Error()) + } + }() + + svr := keel.NewServer( + keel.WithLogger(l.Named("server")), + keel.WithHTTPHealthzService(true), + ) + + // create demo service + svs := http.NewServeMux() + svs.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { + _, _ = w.Write([]byte("OK")) + }) + + svr.AddService( + service.NewHTTP(l, "http", "localhost:8080", svs), + ) + + svr.AddCloser(interfaces.CloserFunc(func(ctx context.Context) error { + l := l.Named("closer") + l.Info("closing stuff") + time.Sleep(3 * time.Second) + l.Info("done closing stuff") + return nil + })) + + svr.Run() + l.Info("done") + + // Output: + // {"level":"info","logger":"root.server","msg":"starting keel service","keel_service_type":"http","keel_service_name":"healthz","net_host_ip":"localhost","net_host_port":"9400"} + // {"level":"info","logger":"root.server","msg":"starting keel server"} + // {"level":"info","logger":"root","msg":"starting keel service","keel_service_type":"http","keel_service_name":"http","net_host_ip":"localhost","net_host_port":"8080"} + // {"level":"info","logger":"root","msg":"1. starting checks"} + // {"level":"info","logger":"root","msg":"2. sleeping for 5 seconds"} + // {"level":"info","logger":"root.http","msg":"ok","url":"http://localhost:8080","status":200} + // {"level":"info","logger":"root.readiness","msg":"ok","url":"http://localhost:9400/healthz/readiness","status":200} + // {"level":"info","logger":"root.http","msg":"ok","url":"http://localhost:8080","status":200} + // {"level":"info","logger":"root.readiness","msg":"ok","url":"http://localhost:9400/healthz/readiness","status":200} + // {"level":"info","logger":"root.http","msg":"ok","url":"http://localhost:8080","status":200} + // {"level":"info","logger":"root.readiness","msg":"ok","url":"http://localhost:9400/healthz/readiness","status":200} + // {"level":"info","logger":"root.http","msg":"ok","url":"http://localhost:8080","status":200} + // {"level":"info","logger":"root.readiness","msg":"ok","url":"http://localhost:9400/healthz/readiness","status":200} + // {"level":"info","logger":"root.http","msg":"ok","url":"http://localhost:8080","status":200} + // {"level":"info","logger":"root.readiness","msg":"ok","url":"http://localhost:9400/healthz/readiness","status":200} + // {"level":"info","logger":"root","msg":"3. sending shutdown signal"} + // {"level":"info","logger":"root.server","msg":"keel graceful shutdown","graceful_period":"30s"} + // {"level":"info","logger":"root.server","msg":"keel graceful shutdown: closers"} + // {"level":"info","logger":"root","msg":"stopping keel service","keel_service_type":"http","keel_service_name":"http"} + // {"level":"debug","logger":"root.server","msg":"keel graceful shutdown: closer closed","name":"*service.HTTP"} + // {"level":"info","logger":"root.closer","msg":"closing stuff"} + // {"level":"error","logger":"root.http","msg":"failed to send request","url":"http://localhost:8080","error":"Get \"http://localhost:8080\": dial tcp [::1]:8080: connect: connection refused"} + // {"level":"debug","logger":"root.server","msg":"healthz probe failed","error_type":"*errors.fundamental","error_message":"service not running","error_messageVerbose":"service not running\ngithub.com/foomo/keel/service.init\n\t:1\nruntime.doInit1\n\t/opt/homebrew/opt/go/libexec/src/runtime/proc.go:7176\nruntime.doInit\n\t/opt/homebrew/opt/go/libexec/src/runtime/proc.go:7143\nruntime.main\n\t/opt/homebrew/opt/go/libexec/src/runtime/proc.go:253\nruntime.goexit\n\t/opt/homebrew/opt/go/libexec/src/runtime/asm_arm64.s:1222","http_target":"/healthz/readiness"} + // {"level":"info","logger":"root.readiness","msg":"ok","url":"http://localhost:9400/healthz/readiness","status":503} + // {"level":"error","logger":"root.http","msg":"failed to send request","url":"http://localhost:8080","error":"Get \"http://localhost:8080\": dial tcp [::1]:8080: connect: connection refused"} + // {"level":"debug","logger":"root.server","msg":"healthz probe failed","error_type":"*errors.fundamental","error_message":"service not running","error_messageVerbose":"service not running\ngithub.com/foomo/keel/service.init\n\t:1\nruntime.doInit1\n\t/opt/homebrew/opt/go/libexec/src/runtime/proc.go:7176\nruntime.doInit\n\t/opt/homebrew/opt/go/libexec/src/runtime/proc.go:7143\nruntime.main\n\t/opt/homebrew/opt/go/libexec/src/runtime/proc.go:253\nruntime.goexit\n\t/opt/homebrew/opt/go/libexec/src/runtime/asm_arm64.s:1222","http_target":"/healthz/readiness"} + // {"level":"info","logger":"root.readiness","msg":"ok","url":"http://localhost:9400/healthz/readiness","status":503} + // {"level":"error","logger":"root.http","msg":"failed to send request","url":"http://localhost:8080","error":"Get \"http://localhost:8080\": dial tcp [::1]:8080: connect: connection refused"} + // {"level":"debug","logger":"root.server","msg":"healthz probe failed","error_type":"*errors.fundamental","error_message":"service not running","error_messageVerbose":"service not running\ngithub.com/foomo/keel/service.init\n\t:1\nruntime.doInit1\n\t/opt/homebrew/opt/go/libexec/src/runtime/proc.go:7176\nruntime.doInit\n\t/opt/homebrew/opt/go/libexec/src/runtime/proc.go:7143\nruntime.main\n\t/opt/homebrew/opt/go/libexec/src/runtime/proc.go:253\nruntime.goexit\n\t/opt/homebrew/opt/go/libexec/src/runtime/asm_arm64.s:1222","http_target":"/healthz/readiness"} + // {"level":"info","logger":"root.readiness","msg":"ok","url":"http://localhost:9400/healthz/readiness","status":503} + // {"level":"info","logger":"root.closer","msg":"done closing stuff"} + // {"level":"debug","logger":"root.server","msg":"keel graceful shutdown: closer closed","name":"interfaces.CloserFunc"} + // {"level":"info","logger":"root.server","msg":"stopping keel service","keel_service_type":"http","keel_service_name":"healthz"} + // {"level":"debug","logger":"root.server","msg":"keel graceful shutdown: closer closed","name":"*service.HTTP"} + // {"level":"debug","logger":"root.server","msg":"keel graceful shutdown: closer closed","name":"noop.TracerProvider"} + // {"level":"debug","logger":"root.server","msg":"keel graceful shutdown: closer closed","name":"noop.MeterProvider"} + // {"level":"info","logger":"root.server","msg":"keel graceful shutdown: complete"} + // {"level":"info","logger":"root.server","msg":"keel server stopped"} + // {"level":"info","logger":"root","msg":"done"} +} + +func call(l *zap.Logger, url string) { + l = l.With(zap.String("url", url)) + + ctx, cancel := context.WithTimeout(context.Background(), 500*time.Millisecond) + defer cancel() + req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) + if err != nil { + l.With(zap.Error(err)).Error("failed to create request") + return + } + resp, err := http.DefaultClient.Do(req) + if err != nil { + l.With(zap.Error(err)).Error("failed to send request") + return + } + l.Info("ok", zap.Int("status", resp.StatusCode)) +} diff --git a/examples/remoteconfig/main.go b/examples/remoteconfig/main.go index 3e5b43b..7607b7e 100644 --- a/examples/remoteconfig/main.go +++ b/examples/remoteconfig/main.go @@ -27,13 +27,13 @@ func main() { fmt.Println("initial foo:", fooFn()) //nolint:forbidigo // watch changes - config.WatchString(svr.CancelContext(), fooFn, func(s string) { + config.WatchString(svr.Context(), fooFn, func(s string) { fmt.Println("change foo:", fooFn()) //nolint:forbidigo }) ch := make(chan string) // watch changes - config.WatchStringChan(svr.CancelContext(), fooFn, ch) + config.WatchStringChan(svr.Context(), fooFn, ch) go func(ch chan string) { for { value := <-ch diff --git a/go.mod b/go.mod index 898aa19..a833e6e 100644 --- a/go.mod +++ b/go.mod @@ -6,13 +6,13 @@ require ( github.com/avast/retry-go v3.0.0+incompatible github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc github.com/fbiville/markdown-table-formatter v0.3.0 - github.com/foomo/gotsrpc/v2 v2.7.3 + github.com/foomo/gotsrpc/v2 v2.8.1 github.com/go-logr/logr v1.4.1 github.com/golang-jwt/jwt v3.2.2+incompatible github.com/google/uuid v1.6.0 github.com/lib/pq v1.10.9 github.com/mitchellh/mapstructure v1.5.0 - github.com/nats-io/nats.go v1.33.1 + github.com/nats-io/nats.go v1.34.1 github.com/pkg/errors v0.9.1 github.com/prometheus/client_golang v1.19.0 github.com/sony/gobreaker v0.5.0 @@ -20,38 +20,38 @@ require ( github.com/stretchr/testify v1.9.0 github.com/tidwall/pretty v1.2.1 github.com/tinylib/msgp v1.1.9 - go.mongodb.org/mongo-driver v1.14.0 - go.opentelemetry.io/contrib/instrumentation/go.mongodb.org/mongo-driver/mongo/otelmongo v0.49.0 - go.opentelemetry.io/contrib/instrumentation/host v0.49.0 - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 - go.opentelemetry.io/contrib/instrumentation/runtime v0.49.0 - go.opentelemetry.io/otel v1.24.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.24.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.24.0 - go.opentelemetry.io/otel/exporters/prometheus v0.46.0 - go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.24.0 - go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.24.0 - go.opentelemetry.io/otel/metric v1.24.0 - go.opentelemetry.io/otel/sdk v1.24.0 - go.opentelemetry.io/otel/sdk/metric v1.24.0 - go.opentelemetry.io/otel/trace v1.24.0 + go.mongodb.org/mongo-driver v1.15.0 + go.opentelemetry.io/contrib/instrumentation/go.mongodb.org/mongo-driver/mongo/otelmongo v0.50.0 + go.opentelemetry.io/contrib/instrumentation/host v0.50.0 + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.50.0 + go.opentelemetry.io/contrib/instrumentation/runtime v0.50.0 + go.opentelemetry.io/otel v1.25.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.25.0 + go.opentelemetry.io/otel/exporters/prometheus v0.47.0 + go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.25.0 + go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.25.0 + go.opentelemetry.io/otel/metric v1.25.0 + go.opentelemetry.io/otel/sdk v1.25.0 + go.opentelemetry.io/otel/sdk/metric v1.25.0 + go.opentelemetry.io/otel/trace v1.25.0 go.temporal.io/api v1.8.0 go.temporal.io/sdk v1.15.0 go.temporal.io/sdk/contrib/opentelemetry v0.1.0 go.uber.org/zap v1.27.0 - golang.org/x/crypto v0.21.0 - golang.org/x/sync v0.6.0 + golang.org/x/crypto v0.22.0 + golang.org/x/sync v0.7.0 ) require ( - cloud.google.com/go v0.111.0 // indirect - cloud.google.com/go/compute v1.23.3 // indirect + cloud.google.com/go v0.112.0 // indirect + cloud.google.com/go/compute v1.24.0 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect cloud.google.com/go/firestore v1.14.0 // indirect - cloud.google.com/go/longrunning v0.5.4 // indirect + cloud.google.com/go/longrunning v0.5.5 // indirect github.com/armon/go-metrics v0.4.1 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/cenkalti/backoff/v4 v4.2.1 // indirect + github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/coreos/go-semver v0.3.0 // indirect github.com/coreos/go-systemd/v22 v22.3.2 // indirect @@ -66,7 +66,7 @@ require ( github.com/gogo/status v1.1.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/mock v1.6.0 // indirect - github.com/golang/protobuf v1.5.3 // indirect + github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/s2a-go v0.1.7 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect @@ -99,14 +99,14 @@ require ( github.com/philhofer/fwd v1.1.2 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect - github.com/prometheus/client_model v0.6.0 // indirect + github.com/prometheus/client_model v0.6.1 // indirect github.com/prometheus/common v0.48.0 // indirect github.com/prometheus/procfs v0.12.0 // indirect github.com/robfig/cron v1.2.0 // indirect github.com/sagikazarmark/crypt v0.17.0 // indirect github.com/sagikazarmark/locafero v0.4.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect - github.com/shirou/gopsutil/v3 v3.24.1 // indirect + github.com/shirou/gopsutil/v3 v3.24.2 // indirect github.com/shoenig/go-m1cpu v0.1.6 // indirect github.com/sourcegraph/conc v0.3.0 // indirect github.com/spf13/afero v1.11.0 // indirect @@ -116,36 +116,37 @@ require ( github.com/subosito/gotenv v1.6.0 // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect - github.com/ugorji/go/codec v1.2.11 // indirect + github.com/ugorji/go/codec v1.2.12 // indirect github.com/xdg-go/pbkdf2 v1.0.0 // indirect github.com/xdg-go/scram v1.1.2 // indirect github.com/xdg-go/stringprep v1.0.4 // indirect github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect - github.com/yusufpapurcu/wmi v1.2.3 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect go.etcd.io/etcd/api/v3 v3.5.10 // indirect go.etcd.io/etcd/client/pkg/v3 v3.5.10 // indirect go.etcd.io/etcd/client/v2 v2.305.10 // indirect go.etcd.io/etcd/client/v3 v3.5.10 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.24.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.47.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0 // indirect go.opentelemetry.io/proto/otlp v1.1.0 // indirect go.uber.org/atomic v1.9.0 // indirect go.uber.org/multierr v1.10.0 // indirect golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect - golang.org/x/mod v0.13.0 // indirect - golang.org/x/net v0.21.0 // indirect - golang.org/x/oauth2 v0.16.0 // indirect - golang.org/x/sys v0.18.0 // indirect + golang.org/x/mod v0.16.0 // indirect + golang.org/x/net v0.23.0 // indirect + golang.org/x/oauth2 v0.17.0 // indirect + golang.org/x/sys v0.19.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.5.0 // indirect - golang.org/x/tools v0.14.0 // indirect - google.golang.org/api v0.153.0 // indirect + golang.org/x/tools v0.19.0 // indirect + google.golang.org/api v0.162.0 // indirect google.golang.org/appengine v1.6.8 // indirect - google.golang.org/genproto v0.0.0-20231212172506-995d672761c0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240102182953-50ed04b92917 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240102182953-50ed04b92917 // indirect - google.golang.org/grpc v1.61.1 // indirect - google.golang.org/protobuf v1.32.0 // indirect + google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda // indirect + google.golang.org/grpc v1.63.0 // indirect + google.golang.org/protobuf v1.33.0 // indirect gopkg.in/ini.v1 v1.67.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 cffbe05..ad90fb6 100644 --- a/go.sum +++ b/go.sum @@ -1,15 +1,15 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.111.0 h1:YHLKNupSD1KqjDbQ3+LVdQ81h/UJbJyZG203cEfnQgM= -cloud.google.com/go v0.111.0/go.mod h1:0mibmpKP1TyOOFYQY5izo0LnT+ecvOQ0Sg3OdmMiNRU= -cloud.google.com/go/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk= -cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= +cloud.google.com/go v0.112.0 h1:tpFCD7hpHFlQ8yPwT3x+QeXqc2T6+n6T+hmABHfDUSM= +cloud.google.com/go v0.112.0/go.mod h1:3jEEVwZ/MHU4djK5t5RHuKOA/GbLddgTdVubX1qnPD4= +cloud.google.com/go/compute v1.24.0 h1:phWcR2eWzRJaL/kOiJwfFsPs4BaKq1j6vnpZrc1YlVg= +cloud.google.com/go/compute v1.24.0/go.mod h1:kw1/T+h/+tK2LJK0wiPPx1intgdAM3j/g3hFDlscY40= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/firestore v1.14.0 h1:8aLcKnMPoldYU3YHgu4t2exrKhLQkqaXAGqT0ljrFVw= cloud.google.com/go/firestore v1.14.0/go.mod h1:96MVaHLsEhbvkBEdZgfN+AS/GIkco1LRpH9Xp9YZfzQ= -cloud.google.com/go/longrunning v0.5.4 h1:w8xEcbZodnA2BbW6sVirkkoC+1gP8wS57EUUgGS0GVg= -cloud.google.com/go/longrunning v0.5.4/go.mod h1:zqNVncI0BOP8ST6XQD1+VcvuShMmq7+xFSzOL++V0dI= +cloud.google.com/go/longrunning v0.5.5 h1:GOE6pZFdSrTb4KAiKnXsJBtlE6mEyaW44oKyMILWnOg= +cloud.google.com/go/longrunning v0.5.5/go.mod h1:WV2LAxD8/rg5Z1cNW6FJ/ZpX4E4VnDnoTk0yawPBB7s= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= @@ -31,8 +31,8 @@ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+Ce 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/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -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/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= +github.com/cenkalti/backoff/v4 v4.3.0/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= @@ -48,6 +48,8 @@ github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa h1:jQCWAUqqlij9Pgj2i/PB79y4KOPYVyFYdROxgaCwdTQ= +github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa/go.mod h1:x/1Gn8zydmfq8dk6e9PdstVsDgu9RuyIIJqAaF//0IM= github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI= @@ -64,6 +66,8 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= 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/envoyproxy/protoc-gen-validate v1.0.4 h1:gVPz/FMfvh57HdSJQyvBtF00j8JU4zdyUgIUNhlgg0A= +github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= github.com/facebookgo/clock v0.0.0-20150410010913-600d898af40a h1:yDWHCSQ40h88yih2JAcL6Ls/kVkSE8GFACTGVnMPruw= github.com/facebookgo/clock v0.0.0-20150410010913-600d898af40a/go.mod h1:7Ga40egUymuWXxAe151lTNnCv97MddSOVsjpPPkityA= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= @@ -75,8 +79,8 @@ github.com/fbiville/markdown-table-formatter v0.3.0 h1:PIm1UNgJrFs8q1htGTw+wnnNY github.com/fbiville/markdown-table-formatter v0.3.0/go.mod h1:q89TDtSEVDdTaufgSbfHpNVdPU/bmfvqNkrC5HagmLY= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/foomo/gotsrpc/v2 v2.7.3 h1:YrHogdHf3KkMM+JxbLlvGEPIfiPzHnQvdEFA2Z0/VDQ= -github.com/foomo/gotsrpc/v2 v2.7.3/go.mod h1:n5SiKVNCZ7Tob6wcROWT5Sx1i/W42+ErpTbNqT3etM8= +github.com/foomo/gotsrpc/v2 v2.8.1 h1:UW2OMZ4WLZn2+nTbJuyhxsJuSGUm1AAHU8mTg5K51YI= +github.com/foomo/gotsrpc/v2 v2.8.1/go.mod h1:JEouU6o526p+RPTqM0DOS/AVr1CbE9DyCIJAAy/VuMI= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= @@ -127,8 +131,8 @@ github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -269,8 +273,8 @@ github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjY github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe h1:iruDEfMl2E6fbMZ9s0scYfZQ84/6SPL6zC8ACM2oIL0= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/nats-io/nats.go v1.33.1 h1:8TxLZZ/seeEfR97qV0/Bl939tpDnt2Z2fK3HkPypj70= -github.com/nats-io/nats.go v1.33.1/go.mod h1:Ubdu4Nh9exXdSz0RVWRFBbRfrbSxOYd26oF0wkWclB8= +github.com/nats-io/nats.go v1.34.1 h1:syWey5xaNHZgicYBemv0nohUPPmaLteiBEUT6Q5+F/4= +github.com/nats-io/nats.go v1.34.1/go.mod h1:Ubdu4Nh9exXdSz0RVWRFBbRfrbSxOYd26oF0wkWclB8= github.com/nats-io/nkeys v0.4.7 h1:RwNJbbIdYCoClSDNY7QVKZlyb/wfT6ugvFCiKy6vDvI= github.com/nats-io/nkeys v0.4.7/go.mod h1:kqXRgRDPlGy7nGaEDMuYzmiJCIAAWDK0IMBtDmGD0nc= github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= @@ -306,8 +310,8 @@ github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1: 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/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.6.0 h1:k1v3CzpSRUTrKMppY35TLwPvxHqBu0bYgxZzqGIgaos= -github.com/prometheus/client_model v0.6.0/go.mod h1:NTQHnmxFpouOD0DpvP4XujX3CdOAGQPoaGhyTchlyt8= +github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= +github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE= @@ -331,8 +335,8 @@ github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6g github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/shirou/gopsutil/v3 v3.24.1 h1:R3t6ondCEvmARp3wxODhXMTLC/klMa87h2PHUw5m7QI= -github.com/shirou/gopsutil/v3 v3.24.1/go.mod h1:UU7a2MSBQa+kW1uuDq8DeEBS8kmrnQwsv2b5O513rwU= +github.com/shirou/gopsutil/v3 v3.24.2 h1:kcR0erMbLg5/3LcInpw0X/rrPSqq4CDPyI6A6ZRC18Y= +github.com/shirou/gopsutil/v3 v3.24.2/go.mod h1:tSg/594BcA+8UdQU2XcW803GWYgdtauFFPgJCJKZlVk= github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= @@ -382,8 +386,8 @@ github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0h github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= -github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= -github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= +github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= @@ -397,8 +401,8 @@ github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9dec github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= -github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= go.etcd.io/etcd/api/v3 v3.5.10 h1:szRajuUUbLyppkhs9K6BRtjY37l66XQQmw7oZRANE4k= go.etcd.io/etcd/api/v3 v3.5.10/go.mod h1:TidfmT4Uycad3NM/o25fG3J07odo4GBB9hoxaodFCtI= go.etcd.io/etcd/client/pkg/v3 v3.5.10 h1:kfYIdQftBnbAq8pUWFXfpuuxFSKzlmM5cSn76JByiT0= @@ -407,43 +411,45 @@ go.etcd.io/etcd/client/v2 v2.305.10 h1:MrmRktzv/XF8CvtQt+P6wLUlURaNpSDJHFZhe//2Q go.etcd.io/etcd/client/v2 v2.305.10/go.mod h1:m3CKZi69HzilhVqtPDcjhSGp+kA1OmbNn0qamH80xjA= go.etcd.io/etcd/client/v3 v3.5.10 h1:W9TXNZ+oB3MCd/8UjxHTWK5J9Nquw9fQBLJd5ne5/Ao= go.etcd.io/etcd/client/v3 v3.5.10/go.mod h1:RVeBnDz2PUEZqTpgqwAtUd8nAPf5kjyFyND7P1VkOKc= -go.mongodb.org/mongo-driver v1.14.0 h1:P98w8egYRjYe3XDjxhYJagTokP/H6HzlsnojRgZRd80= -go.mongodb.org/mongo-driver v1.14.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c= +go.mongodb.org/mongo-driver v1.15.0 h1:rJCKC8eEliewXjZGf0ddURtl7tTVy1TK3bfl0gkUSLc= +go.mongodb.org/mongo-driver v1.15.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c= 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/go.mongodb.org/mongo-driver/mongo/otelmongo v0.49.0 h1:qF3LdpkD3Kbaw0Smsh+SVcJI/mtYGz9ZdCmu0YF2Lo4= -go.opentelemetry.io/contrib/instrumentation/go.mongodb.org/mongo-driver/mongo/otelmongo v0.49.0/go.mod h1:eqNF9g7W06ubrU7jk6M6UW9OTrcSPZvVY10cw9DUJ7c= -go.opentelemetry.io/contrib/instrumentation/host v0.49.0 h1:PHK4Cnis16iENFfqnzvuak5vfRl5L0UaTG2Z03vr3iI= -go.opentelemetry.io/contrib/instrumentation/host v0.49.0/go.mod h1:0XQuDAhohvWG6+cdmjX6aFbC4mGMjYf1xILFh5OUcEg= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= -go.opentelemetry.io/contrib/instrumentation/runtime v0.49.0 h1:dg9y+7ArpumB6zwImJv47RHfdgOGQ1EMkzP5vLkEnTU= -go.opentelemetry.io/contrib/instrumentation/runtime v0.49.0/go.mod h1:Ul4MtXqu/hJBM+v7a6dCF0nHwckPMLpIpLeCi4+zfdw= +go.opentelemetry.io/contrib/instrumentation/go.mongodb.org/mongo-driver/mongo/otelmongo v0.50.0 h1:pN+CPCIXka5rg0d91Hc8orzpVafqban7HQXRFU59pco= +go.opentelemetry.io/contrib/instrumentation/go.mongodb.org/mongo-driver/mongo/otelmongo v0.50.0/go.mod h1:X1YwMghrQggm0d12RfxefDAGBS8fYstCmKNGlDIxDy4= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.47.0 h1:UNQQKPfTDe1J81ViolILjTKPr9WetKW6uei2hFgJmFs= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.47.0/go.mod h1:r9vWsPS/3AQItv3OSlEJ/E4mbrhUbbw18meOjArPtKQ= +go.opentelemetry.io/contrib/instrumentation/host v0.50.0 h1:yKknCHYNj2pks9t6uijR+g7tQ/yfSwlZnY8BM0wq92E= +go.opentelemetry.io/contrib/instrumentation/host v0.50.0/go.mod h1:u3JyxgMGuT1Lp8g0j3pmWsVXA9KTX3OFrRqLH3hyoME= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.50.0 h1:cEPbyTSEHlQR89XVlyo78gqluF8Y3oMeBkXGWzQsfXY= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.50.0/go.mod h1:DKdbWcT4GH1D0Y3Sqt/PFXt2naRKDWtU+eE6oLdFNA8= +go.opentelemetry.io/contrib/instrumentation/runtime v0.50.0 h1:6dck47miguAOny5MeqX1G8idd+HpzDFt86U33d7aW2I= +go.opentelemetry.io/contrib/instrumentation/runtime v0.50.0/go.mod h1:rdPhRwNd2sHiRmwJAGs8xcwitqmP/j8pvl9X5jloYjU= go.opentelemetry.io/otel v1.2.0/go.mod h1:aT17Fk0Z1Nor9e0uisf98LrntPGMnk4frBO9+dkf69I= -go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= -go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.24.0 h1:t6wl9SPayj+c7lEIFgm4ooDBZVb01IhLB4InpomhRw8= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.24.0/go.mod h1:iSDOcsnSA5INXzZtwaBPrKp/lWu/V14Dd+llD0oI2EA= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.24.0 h1:Mw5xcxMwlqoJd97vwPxA8isEaIoxsta9/Q51+TTJLGE= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.24.0/go.mod h1:CQNu9bj7o7mC6U7+CA/schKEYakYXWr79ucDHTMGhCM= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.24.0 h1:Xw8U6u2f8DK2XAkGRFV7BBLENgnTGX9i4rQRxJf+/vs= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.24.0/go.mod h1:6KW1Fm6R/s6Z3PGXwSJN2K4eT6wQB3vXX6CVnYX9NmM= -go.opentelemetry.io/otel/exporters/prometheus v0.46.0 h1:I8WIFXR351FoLJYuloU4EgXbtNX2URfU/85pUPheIEQ= -go.opentelemetry.io/otel/exporters/prometheus v0.46.0/go.mod h1:ztwVUHe5DTR/1v7PeuGRnU5Bbd4QKYwApWmuutKsJSs= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.24.0 h1:JYE2HM7pZbOt5Jhk8ndWZTUWYOVift2cHjXVMkPdmdc= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.24.0/go.mod h1:yMb/8c6hVsnma0RpsBMNo0fEiQKeclawtgaIaOp2MLY= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.24.0 h1:s0PHtIkN+3xrbDOpt2M8OTG92cWqUESvzh2MxiR5xY8= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.24.0/go.mod h1:hZlFbDbRt++MMPCCfSJfmhkGIWnX1h3XjkfxZUjLrIA= -go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= -go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= +go.opentelemetry.io/otel v1.25.0 h1:gldB5FfhRl7OJQbUHt/8s0a7cE8fbsPAtdpRaApKy4k= +go.opentelemetry.io/otel v1.25.0/go.mod h1:Wa2ds5NOXEMkCmUou1WA7ZBfLTHWIsp034OVD7AO+Vg= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0 h1:dT33yIHtmsqpixFsSQPwNeY5drM9wTcoL8h0FWF4oGM= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0/go.mod h1:h95q0LBGh7hlAC08X2DhSeyIG02YQ0UyioTCVAqRPmc= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0 h1:vOL89uRfOCCNIjkisd0r7SEdJF3ZJFyCNY34fdZs8eU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0/go.mod h1:8GlBGcDk8KKi7n+2S4BT/CPZQYH3erLu0/k64r1MYgo= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.25.0 h1:Mbi5PKN7u322woPa85d7ebZ+SOvEoPvoiBu+ryHWgfA= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.25.0/go.mod h1:e7ciERRhZaOZXVjx5MiL8TK5+Xv7G5Gv5PA2ZDEJdL8= +go.opentelemetry.io/otel/exporters/prometheus v0.47.0 h1:OL6yk1Z/pEGdDnrBbxSsH+t4FY1zXfBRGd7bjwhlMLU= +go.opentelemetry.io/otel/exporters/prometheus v0.47.0/go.mod h1:xF3N4OSICZDVbbYZydz9MHFro1RjmkPUKEvar2utG+Q= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.25.0 h1:d7nHbdzU84STOiszaOxQ3kw5IwkSmHsU5Muol5/vL4I= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.25.0/go.mod h1:yiPA1iZbb/EHYnODXOxvtKuB0I2hV8ehfLTEWpl7BJU= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.25.0 h1:0vZZdECYzhTt9MKQZ5qQ0V+J3MFu4MQaQ3COfugF+FQ= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.25.0/go.mod h1:e7iXx3HjaSSBXfy9ykVUlupS2Vp7LBIBuT21ousM2Hk= +go.opentelemetry.io/otel/metric v1.25.0 h1:LUKbS7ArpFL/I2jJHdJcqMGxkRdxpPHE0VU/D4NuEwA= +go.opentelemetry.io/otel/metric v1.25.0/go.mod h1:rkDLUSd2lC5lq2dFNrX9LGAbINP5B7WBkC78RXCpH5s= go.opentelemetry.io/otel/sdk v1.2.0/go.mod h1:jNN8QtpvbsKhgaC6V5lHiejMoKD+V8uadoSafgHPx1U= -go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw= -go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= -go.opentelemetry.io/otel/sdk/metric v1.24.0 h1:yyMQrPzF+k88/DbH7o4FMAs80puqd+9osbiBrJrz/w8= -go.opentelemetry.io/otel/sdk/metric v1.24.0/go.mod h1:I6Y5FjH6rvEnTTAYQz3Mmv2kl6Ek5IIrmwTLqMrrOE0= +go.opentelemetry.io/otel/sdk v1.25.0 h1:PDryEJPC8YJZQSyLY5eqLeafHtG+X7FWnf3aXMtxbqo= +go.opentelemetry.io/otel/sdk v1.25.0/go.mod h1:oFgzCM2zdsxKzz6zwpTZYLLQsFwc+K0daArPdIhuxkw= +go.opentelemetry.io/otel/sdk/metric v1.25.0 h1:7CiHOy08LbrxMAp4vWpbiPcklunUshVpAvGBrdDRlGw= +go.opentelemetry.io/otel/sdk/metric v1.25.0/go.mod h1:LzwoKptdbBBdYfvtGCzGwk6GWMA3aUzBOwtQpR6Nz7o= go.opentelemetry.io/otel/trace v1.2.0/go.mod h1:N5FLswTubnxKxOJHM7XZC074qpeEdLy3CgAVsdMucK0= -go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= -go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= +go.opentelemetry.io/otel/trace v1.25.0 h1:tqukZGLwQYRIFtSQM2u2+yfMVTgGVeqRLPUYx1Dq6RM= +go.opentelemetry.io/otel/trace v1.25.0/go.mod h1:hCCs70XM/ljO+BeQkyFnbK28SBIJ/Emuha+ccrCRT7I= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.opentelemetry.io/proto/otlp v1.1.0 h1:2Di21piLrCqJ3U3eXGCTPHE9R8Nh+0uglSnOyxikMeI= go.opentelemetry.io/proto/otlp v1.1.0/go.mod h1:GpBHCBWiqvVLDqmHZsoMM3C5ySeKTC7ej/RNTae6MdY= @@ -472,8 +478,8 @@ golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3 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.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= +golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= +golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= @@ -487,8 +493,8 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.13.0 h1:I/DsJXRlw/8l/0c24sM9yb0T4z9liZTduXvdAWYiysY= -golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic= +golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= 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-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -510,12 +516,12 @@ golang.org/x/net v0.0.0-20210913180222-943fd674d43e/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220531201128-c960675eff93/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= -golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= +golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.16.0 h1:aDkGMBSYxElaoP81NpoUoz2oo2R2wHdZpGToUxfyQrQ= -golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o= +golang.org/x/oauth2 v0.17.0 h1:6m3ZPmLEFdVxKKWnKq4VqZ60gutO35zm+zrAHVmHyDQ= +golang.org/x/oauth2 v0.17.0/go.mod h1:OzPDGQiuQMguemayvdylqddI7qcD9lnSDb+1FiwQ5HA= 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= @@ -525,8 +531,8 @@ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= -golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -564,9 +570,9 @@ golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= +golang.org/x/sys v0.19.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.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -595,14 +601,14 @@ golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.14.0 h1:jvNa2pY0M4r62jkRQ6RwEZZyPcymeL9XZMLBbV7U2nc= -golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg= +golang.org/x/tools v0.19.0 h1:tfGCXNR1OsFG+sVdLAitlpjAvD/I6dHDKnYrpEZUHkw= +golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 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= -google.golang.org/api v0.153.0 h1:N1AwGhielyKFaUqH07/ZSIQR3uNPcV7NVw0vj+j4iR4= -google.golang.org/api v0.153.0/go.mod h1:3qNJX5eOmhiWYc67jRA/3GsDw97UFb5ivv7Y2PrriAY= +google.golang.org/api v0.162.0 h1:Vhs54HkaEpkMBdgGdOT2P6F0csGG/vxDS0hWHJzmmps= +google.golang.org/api v0.162.0/go.mod h1:6SulDkfoBIg4NFmCuZ39XeeAgSHCPecfSUuDyYlAHs0= 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/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= @@ -615,12 +621,12 @@ google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20220602131408-e326c6e8e9c8/go.mod h1:yKyY4AMRwFiC8yMMNaMi+RkCnjZJt9LoWuvhXjMs+To= -google.golang.org/genproto v0.0.0-20231212172506-995d672761c0 h1:YJ5pD9rF8o9Qtta0Cmy9rdBwkSjrTCT6XTiUQVOtIos= -google.golang.org/genproto v0.0.0-20231212172506-995d672761c0/go.mod h1:l/k7rMz0vFTBPy+tFSGvXEd3z+BcoG1k7EHbqm+YBsY= -google.golang.org/genproto/googleapis/api v0.0.0-20240102182953-50ed04b92917 h1:rcS6EyEaoCO52hQDupoSfrxI3R6C2Tq741is7X8OvnM= -google.golang.org/genproto/googleapis/api v0.0.0-20240102182953-50ed04b92917/go.mod h1:CmlNWB9lSezaYELKS5Ym1r44VrrbPUa7JTvw+6MbpJ0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240102182953-50ed04b92917 h1:6G8oQ016D88m1xAKljMlBOOGWDZkes4kMhgGFlf8WcQ= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240102182953-50ed04b92917/go.mod h1:xtjpI3tXFPP051KaWnhvxkiubL/6dJ18vLVf7q2pTOU= +google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY= +google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo= +google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de h1:jFNzHPIeuzhdRwVhbZdiym9q0ory/xY3sA+v2wPg8I0= +google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:5iCWqnniDlqZHrd3neWVTOwvh/v6s3232omMecelax8= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda h1:LI5DOvAxUPMv/50agcLLoo+AdWc1irS9Rzz4vPuD1V4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= @@ -633,8 +639,8 @@ google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAG google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.61.1 h1:kLAiWrZs7YeDM6MumDe7m3y4aM6wacLzM1Y/wiLP9XY= -google.golang.org/grpc v1.61.1/go.mod h1:VUbo7IFqmF1QtCAstipjG0GIoq49KvMe9+h1jFLBNJs= +google.golang.org/grpc v1.63.0 h1:WjKe+dnvABXyPJMD7KDNLxtoGk5tgk+YFWN6cBWjZE8= +google.golang.org/grpc v1.63.0/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA= 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= @@ -648,8 +654,8 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= -google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= 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-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/option.go b/option.go index 527e93c..cf7d675 100644 --- a/option.go +++ b/option.go @@ -69,13 +69,6 @@ func WithGracefulPeriod(gracefulPeriod time.Duration) Option { } } -// WithGracefulTimeout option -func WithGracefulTimeout(gracefulTimeout time.Duration) Option { - return func(inst *Server) { - inst.gracefulTimeout = gracefulTimeout - } -} - // WithHTTPZapService option with default value func WithHTTPZapService(enabled bool) Option { return func(inst *Server) { diff --git a/server.go b/server.go index facaa48..38655fa 100644 --- a/server.go +++ b/server.go @@ -45,8 +45,6 @@ type Server struct { traceProvider trace.TracerProvider shutdown atomic.Bool shutdownSignals []os.Signal - // gracefulTimeout should be lower than terminationGracePeriodSeconds - gracefulTimeout time.Duration // gracefulPeriod should equal the terminationGracePeriodSeconds gracefulPeriod time.Duration running atomic.Bool @@ -57,10 +55,9 @@ type Server struct { syncProbes map[healthz.Type][]interface{} syncProbesLock sync.RWMutex ctx context.Context - cancelCtx context.Context - cancelFunc context.CancelFunc - shutdownCtx context.Context - shutdownFunc context.CancelFunc + cancel context.CancelFunc + gracefulCtx context.Context + gracefulCancel context.CancelFunc g *errgroup.Group gCtx context.Context l *zap.Logger @@ -69,8 +66,7 @@ type Server struct { func NewServer(opts ...Option) *Server { inst := &Server{ - gracefulTimeout: time.Duration(env.GetInt("KEEL_GRACEFUL_PERIOD", 30)) * time.Second, - gracefulPeriod: time.Duration(env.GetInt("KEEL_GRACEFUL_TIMEOUT", 15)) * time.Second, + gracefulPeriod: time.Duration(env.GetInt("KEEL_GRACEFUL_PERIOD", 30)) * time.Second, shutdownSignals: []os.Signal{syscall.SIGINT, syscall.SIGTERM}, syncReadmers: []interfaces.Readmer{}, syncProbes: map[healthz.Type][]interface{}{}, @@ -91,33 +87,21 @@ func NewServer(opts ...Option) *Server { return nil })) - inst.cancelCtx, inst.cancelFunc = context.WithCancel(inst.ctx) - inst.g, inst.gCtx = errgroup.WithContext(inst.cancelCtx) - inst.shutdownCtx, inst.shutdownFunc = signal.NotifyContext(inst.ctx, inst.shutdownSignals...) + inst.ctx, inst.cancel = context.WithCancel(inst.ctx) + inst.g, inst.gCtx = errgroup.WithContext(inst.ctx) + inst.gracefulCtx, inst.gracefulCancel = signal.NotifyContext(inst.ctx, inst.shutdownSignals...) // gracefully shutdown inst.g.Go(func() error { - <-inst.shutdownCtx.Done() + <-inst.gracefulCtx.Done() + inst.shutdown.Store(true) timeoutCtx, timeoutCancel := context.WithTimeout(inst.ctx, inst.gracefulPeriod) defer timeoutCancel() inst.l.Info("keel graceful shutdown", - // zap.Int32("readiness_threshold", inst.readinessThreshold), - zap.Duration("graceful_timeout", inst.gracefulTimeout), zap.Duration("graceful_period", inst.gracefulPeriod), ) - inst.l.Info("keel graceful shutdown: timeout") - { - timer := time.NewTimer(inst.gracefulTimeout) - select { - case <-timeoutCtx.Done(): - timer.Stop() - case <-timer.C: - } - } - inst.l.Info("keel graceful shutdown: timeout complete") - // append internal closers closers := append(inst.closers(), inst.traceProvider, inst.meterProvider) @@ -168,7 +152,7 @@ func NewServer(opts ...Option) *Server { inst.l.Info("keel graceful shutdown: complete") - return nil + return ErrServerShutdown }) } @@ -238,24 +222,14 @@ func (s *Server) Context() context.Context { return s.ctx } -// CancelContext returns server's cancel context -func (s *Server) CancelContext() context.Context { - return s.cancelCtx -} - -// CancelFunc returns server's cancel function -func (s *Server) CancelFunc() context.CancelFunc { - return s.cancelFunc -} - // ShutdownContext returns server's shutdown cancel context func (s *Server) ShutdownContext() context.Context { - return s.shutdownCtx + return s.gracefulCtx } // ShutdownCancel returns server's shutdown cancel function func (s *Server) ShutdownCancel() context.CancelFunc { - return s.shutdownFunc + return s.gracefulCancel } // AddService add a single service @@ -343,11 +317,6 @@ func (s *Server) AddReadinessHealthzers(probes ...interface{}) { s.AddHealthzers(healthz.TypeReadiness, probes...) } -// IsCanceled returns true if the internal errgroup has been canceled -func (s *Server) IsCanceled() bool { - return s.cancelCtx.Err() != nil -} - // Healthz returns true if the server is running func (s *Server) Healthz() error { if !s.running.Load() { @@ -358,12 +327,7 @@ func (s *Server) Healthz() error { // Run runs the server func (s *Server) Run() { - if s.IsCanceled() { - s.l.Info("keel server canceled") - return - } - - defer s.cancelFunc() + defer s.cancel() s.l.Info("starting keel server") // start services @@ -381,11 +345,11 @@ func (s *Server) Run() { s.running.Store(true) // wait for shutdown - if err := s.g.Wait(); err != nil && !errors.Is(err, context.Canceled) { - log.WithError(s.l, err).Error("service error") + if err := s.g.Wait(); errors.Is(err, ErrServerShutdown) { + s.l.Info("keel server stopped") + } else if err != nil { + log.WithError(s.l, err).Error("keel server failed") } - - s.l.Info("keel server stopped") } func (s *Server) closers() []interface{} { @@ -441,9 +405,11 @@ func (s *Server) Readme() string { // startService starts the given services func (s *Server) startService(services ...Service) { + c := make(chan struct{}, 1) for _, value := range services { value := value s.g.Go(func() error { + c <- struct{}{} if err := value.Start(s.ctx); errors.Is(err, http.ErrServerClosed) { log.WithError(s.l, err).Debug("server has closed") } else if err != nil { @@ -452,7 +418,9 @@ func (s *Server) startService(services ...Service) { } return nil }) + <-c } + close(c) } func (s *Server) readmeCloser() string { diff --git a/server_test.go b/server_test.go index 3205266..0d5bd44 100644 --- a/server_test.go +++ b/server_test.go @@ -63,8 +63,6 @@ func (s *KeelTestSuite) BeforeTest(suiteName, testName string) { s.svr = keel.NewServer( keel.WithContext(ctx), keel.WithLogger(s.l), - keel.WithGracefulTimeout(400*time.Millisecond), - keel.WithGracefulPeriod(800*time.Millisecond), ) s.cancel = cancel } diff --git a/service/goroutine_test.go b/service/goroutine_test.go index 87584b5..ad67482 100644 --- a/service/goroutine_test.go +++ b/service/goroutine_test.go @@ -16,7 +16,6 @@ func ExampleNewGoRoutine() { svr := keel.NewServer( keel.WithLogger(zap.NewExample()), - keel.WithGracefulTimeout(time.Second), keel.WithGracefulPeriod(3*time.Second), ) @@ -45,10 +44,7 @@ func ExampleNewGoRoutine() { // {"level":"info","msg":"starting keel service","keel_service_type":"goroutine","keel_service_name":"demo"} // {"level":"info","msg":"ping","keel_service_type":"goroutine","keel_service_name":"demo","keel_service_inst":0} // {"level":"info","msg":"ping","keel_service_type":"goroutine","keel_service_name":"demo","keel_service_inst":0} - // {"level":"info","msg":"keel graceful shutdown","graceful_timeout":"1s","graceful_period":"3s"} - // {"level":"info","msg":"keel graceful shutdown: timeout"} - // {"level":"info","msg":"ping","keel_service_type":"goroutine","keel_service_name":"demo","keel_service_inst":0} - // {"level":"info","msg":"keel graceful shutdown: timeout complete"} + // {"level":"info","msg":"keel graceful shutdown","graceful_period":"3s"} // {"level":"info","msg":"keel graceful shutdown: closers"} // {"level":"info","msg":"stopping keel service","keel_service_type":"goroutine","keel_service_name":"demo"} // {"level":"info","msg":"context has been canceled du to graceful shutdow","keel_service_type":"goroutine","keel_service_name":"demo","keel_service_inst":0} diff --git a/service/http.go b/service/http.go index b7b46e2..0e31523 100644 --- a/service/http.go +++ b/service/http.go @@ -60,10 +60,6 @@ func (s *HTTP) Name() string { return s.name } -func (s *HTTP) Server() *http.Server { - return s.server -} - // ------------------------------------------------------------------------------------------------ // ~ Public methods // ------------------------------------------------------------------------------------------------ @@ -89,12 +85,12 @@ func (s *HTTP) Start(ctx context.Context) error { fields = append(fields, log.FNetHostIP(ip), log.FNetHostPort(port)) } s.l.Info("starting keel service", fields...) - s.Server().BaseContext = func(_ net.Listener) context.Context { return ctx } - s.Server().RegisterOnShutdown(func() { + s.server.BaseContext = func(_ net.Listener) context.Context { return ctx } + s.server.RegisterOnShutdown(func() { s.running.Store(false) }) s.running.Store(true) - if err := s.Server().ListenAndServe(); errors.Is(err, http.ErrServerClosed) { + if err := s.server.ListenAndServe(); errors.Is(err, http.ErrServerClosed) { return nil } else if err != nil { return errors.Wrap(err, "failed to start service") @@ -104,7 +100,7 @@ func (s *HTTP) Start(ctx context.Context) error { func (s *HTTP) Close(ctx context.Context) error { s.l.Info("stopping keel service") - if err := s.Server().Shutdown(ctx); err != nil { + if err := s.server.Shutdown(ctx); err != nil { return errors.Wrap(err, "failed to stop service") } return nil diff --git a/service/http_test.go b/service/http_test.go index 02f14f1..960a440 100644 --- a/service/http_test.go +++ b/service/http_test.go @@ -12,7 +12,6 @@ import ( func ExampleNewHTTP() { svr := keel.NewServer( keel.WithLogger(zap.NewExample()), - keel.WithGracefulTimeout(time.Second), keel.WithGracefulPeriod(10*time.Second), ) @@ -37,9 +36,7 @@ func ExampleNewHTTP() { // {"level":"info","msg":"starting keel server"} // {"level":"info","msg":"starting keel service","keel_service_type":"http","keel_service_name":"demo","net_host_ip":"localhost","net_host_port":"8080"} // {"level":"info","msg":"OK"} - // {"level":"info","msg":"keel graceful shutdown","graceful_timeout":"1s","graceful_period":"10s"} - // {"level":"info","msg":"keel graceful shutdown: timeout"} - // {"level":"info","msg":"keel graceful shutdown: timeout complete"} + // {"level":"info","msg":"keel graceful shutdown","graceful_period":"10s"} // {"level":"info","msg":"keel graceful shutdown: closers"} // {"level":"info","msg":"stopping keel service","keel_service_type":"http","keel_service_name":"demo"} // {"level":"debug","msg":"keel graceful shutdown: closer closed","name":"*service.HTTP"} diff --git a/service/httpreadme_test.go b/service/httpreadme_test.go index aac58c1..45b388d 100644 --- a/service/httpreadme_test.go +++ b/service/httpreadme_test.go @@ -27,7 +27,6 @@ func _ExampleNewHTTPReadme() { keel.WithLogger(zap.NewNop()), keel.WithPrometheusMeter(true), keel.WithHTTPReadmeService(true), - keel.WithGracefulTimeout(time.Second), keel.WithGracefulPeriod(3*time.Second), ) diff --git a/telemetry/meter.go b/telemetry/meter.go index f950b00..287dd9c 100644 --- a/telemetry/meter.go +++ b/telemetry/meter.go @@ -14,7 +14,7 @@ import ( "go.opentelemetry.io/otel/metric/noop" sdkmetric "go.opentelemetry.io/otel/sdk/metric" otelresource "go.opentelemetry.io/otel/sdk/resource" - semconv "go.opentelemetry.io/otel/semconv/v1.20.0" + semconv "go.opentelemetry.io/otel/semconv/v1.24.0" ) var ( From e35d4582d2b1facdc271b665eba9d99824fd226f Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Mon, 15 Apr 2024 09:42:53 +0200 Subject: [PATCH 121/134] refactor: use standard errors --- examples/graceful/main_test.go | 8 ++++---- service/errors.go | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/examples/graceful/main_test.go b/examples/graceful/main_test.go index 0272bac..5e60e47 100644 --- a/examples/graceful/main_test.go +++ b/examples/graceful/main_test.go @@ -70,8 +70,8 @@ func ExampleMain() { l.Info("done") // Output: - // {"level":"info","logger":"root.server","msg":"starting keel service","keel_service_type":"http","keel_service_name":"healthz","net_host_ip":"localhost","net_host_port":"9400"} // {"level":"info","logger":"root.server","msg":"starting keel server"} + // {"level":"info","logger":"root.server","msg":"starting keel service","keel_service_type":"http","keel_service_name":"healthz","net_host_ip":"localhost","net_host_port":"9400"} // {"level":"info","logger":"root","msg":"starting keel service","keel_service_type":"http","keel_service_name":"http","net_host_ip":"localhost","net_host_port":"8080"} // {"level":"info","logger":"root","msg":"1. starting checks"} // {"level":"info","logger":"root","msg":"2. sleeping for 5 seconds"} @@ -92,13 +92,13 @@ func ExampleMain() { // {"level":"debug","logger":"root.server","msg":"keel graceful shutdown: closer closed","name":"*service.HTTP"} // {"level":"info","logger":"root.closer","msg":"closing stuff"} // {"level":"error","logger":"root.http","msg":"failed to send request","url":"http://localhost:8080","error":"Get \"http://localhost:8080\": dial tcp [::1]:8080: connect: connection refused"} - // {"level":"debug","logger":"root.server","msg":"healthz probe failed","error_type":"*errors.fundamental","error_message":"service not running","error_messageVerbose":"service not running\ngithub.com/foomo/keel/service.init\n\t:1\nruntime.doInit1\n\t/opt/homebrew/opt/go/libexec/src/runtime/proc.go:7176\nruntime.doInit\n\t/opt/homebrew/opt/go/libexec/src/runtime/proc.go:7143\nruntime.main\n\t/opt/homebrew/opt/go/libexec/src/runtime/proc.go:253\nruntime.goexit\n\t/opt/homebrew/opt/go/libexec/src/runtime/asm_arm64.s:1222","http_target":"/healthz/readiness"} + // {"level":"debug","logger":"root.server","msg":"healthz probe failed","error_type":"*errors.errorString","error_message":"service not running","http_target":"/healthz/readiness"} // {"level":"info","logger":"root.readiness","msg":"ok","url":"http://localhost:9400/healthz/readiness","status":503} // {"level":"error","logger":"root.http","msg":"failed to send request","url":"http://localhost:8080","error":"Get \"http://localhost:8080\": dial tcp [::1]:8080: connect: connection refused"} - // {"level":"debug","logger":"root.server","msg":"healthz probe failed","error_type":"*errors.fundamental","error_message":"service not running","error_messageVerbose":"service not running\ngithub.com/foomo/keel/service.init\n\t:1\nruntime.doInit1\n\t/opt/homebrew/opt/go/libexec/src/runtime/proc.go:7176\nruntime.doInit\n\t/opt/homebrew/opt/go/libexec/src/runtime/proc.go:7143\nruntime.main\n\t/opt/homebrew/opt/go/libexec/src/runtime/proc.go:253\nruntime.goexit\n\t/opt/homebrew/opt/go/libexec/src/runtime/asm_arm64.s:1222","http_target":"/healthz/readiness"} + // {"level":"debug","logger":"root.server","msg":"healthz probe failed","error_type":"*errors.errorString","error_message":"service not running","http_target":"/healthz/readiness"} // {"level":"info","logger":"root.readiness","msg":"ok","url":"http://localhost:9400/healthz/readiness","status":503} // {"level":"error","logger":"root.http","msg":"failed to send request","url":"http://localhost:8080","error":"Get \"http://localhost:8080\": dial tcp [::1]:8080: connect: connection refused"} - // {"level":"debug","logger":"root.server","msg":"healthz probe failed","error_type":"*errors.fundamental","error_message":"service not running","error_messageVerbose":"service not running\ngithub.com/foomo/keel/service.init\n\t:1\nruntime.doInit1\n\t/opt/homebrew/opt/go/libexec/src/runtime/proc.go:7176\nruntime.doInit\n\t/opt/homebrew/opt/go/libexec/src/runtime/proc.go:7143\nruntime.main\n\t/opt/homebrew/opt/go/libexec/src/runtime/proc.go:253\nruntime.goexit\n\t/opt/homebrew/opt/go/libexec/src/runtime/asm_arm64.s:1222","http_target":"/healthz/readiness"} + // {"level":"debug","logger":"root.server","msg":"healthz probe failed","error_type":"*errors.errorString","error_message":"service not running","http_target":"/healthz/readiness"} // {"level":"info","logger":"root.readiness","msg":"ok","url":"http://localhost:9400/healthz/readiness","status":503} // {"level":"info","logger":"root.closer","msg":"done closing stuff"} // {"level":"debug","logger":"root.server","msg":"keel graceful shutdown: closer closed","name":"interfaces.CloserFunc"} diff --git a/service/errors.go b/service/errors.go index 53f93a8..97c6c1b 100644 --- a/service/errors.go +++ b/service/errors.go @@ -1,7 +1,7 @@ package service import ( - "github.com/pkg/errors" + "errors" ) var ( From a3ec7df9f1ddd9042facf6b4de20c75b6e6b1cd7 Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Mon, 15 Apr 2024 09:48:59 +0200 Subject: [PATCH 122/134] chore: run single tests --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 08b42e1..da2a3f0 100644 --- a/Makefile +++ b/Makefile @@ -27,7 +27,7 @@ doc: .PHONY: test ## Run tests test: - @go test -coverprofile=coverage.out -race -json ./... | gotestfmt + @go test -p 1 -coverprofile=coverage.out -race -json ./... | gotestfmt .PHONY: lint ## Run linter From 46c4a75a694ee81fbb1731753d1b4d518ad6ebd9 Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Mon, 15 Apr 2024 10:12:48 +0200 Subject: [PATCH 123/134] refactor: move log --- server.go | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/server.go b/server.go index 38655fa..738d7fc 100644 --- a/server.go +++ b/server.go @@ -327,8 +327,8 @@ func (s *Server) Healthz() error { // Run runs the server func (s *Server) Run() { - defer s.cancel() s.l.Info("starting keel server") + defer s.cancel() // start services s.startService(s.services...) @@ -339,9 +339,7 @@ func (s *Server) Run() { } // set running - defer func() { - s.running.Store(false) - }() + defer s.running.Store(false) s.running.Store(true) // wait for shutdown From 317647db12c90d32e8e684ba3b48799ebe660903 Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Mon, 15 Apr 2024 10:22:37 +0200 Subject: [PATCH 124/134] revert: change from example --- examples/graceful/{main_test.go => main.go} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename examples/graceful/{main_test.go => main.go} (99%) diff --git a/examples/graceful/main_test.go b/examples/graceful/main.go similarity index 99% rename from examples/graceful/main_test.go rename to examples/graceful/main.go index 5e60e47..5fd3323 100644 --- a/examples/graceful/main_test.go +++ b/examples/graceful/main.go @@ -13,7 +13,7 @@ import ( "github.com/foomo/keel" ) -func ExampleMain() { +func main() { service.DefaultHTTPHealthzAddr = "localhost:9400" l := zap.NewExample().Named("root") From 686ef11205edf2adcb75a8024dd2dcdafe788987 Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Tue, 16 Apr 2024 08:55:30 +0200 Subject: [PATCH 125/134] refactor: rename keeltest folder --- .github/dependabot.yml | 1 + go.mod | 1 + {test => keeltest}/assert/assert.go | 6 +- {test => keeltest}/assert/assert_test.go | 2 +- {test => keeltest}/assert/assertions.go | 6 +- {test => keeltest}/client.go | 0 {test/util => keeltest}/inline.go | 2 +- {test/util => keeltest}/inline_test.go | 17 ++-- {test => keeltest}/option.go | 0 {test => keeltest}/require/assertions.go | 6 +- {test => keeltest}/require/require.go | 6 +- {test => keeltest}/server.go | 0 {test => keeltest}/service.go | 0 {test => keeltest}/servicehttp.go | 0 net/http/middleware/cors_test.go | 2 +- net/http/middleware/logger_test.go | 2 +- server_test.go | 11 ++- test/log.go | 105 ----------------------- 18 files changed, 35 insertions(+), 132 deletions(-) rename {test => keeltest}/assert/assert.go (81%) rename {test => keeltest}/assert/assert_test.go (95%) rename {test => keeltest}/assert/assertions.go (85%) rename {test => keeltest}/client.go (100%) rename {test/util => keeltest}/inline.go (99%) rename {test/util => keeltest}/inline_test.go (61%) rename {test => keeltest}/option.go (100%) rename {test => keeltest}/require/assertions.go (83%) rename {test => keeltest}/require/require.go (78%) rename {test => keeltest}/server.go (100%) rename {test => keeltest}/service.go (100%) rename {test => keeltest}/servicehttp.go (100%) delete mode 100644 test/log.go diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 61d3a33..e82631a 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,4 +1,5 @@ version: 2 + updates: - package-ecosystem: github-actions directory: '/' diff --git a/go.mod b/go.mod index a833e6e..5e5a2a4 100644 --- a/go.mod +++ b/go.mod @@ -38,6 +38,7 @@ require ( go.temporal.io/api v1.8.0 go.temporal.io/sdk v1.15.0 go.temporal.io/sdk/contrib/opentelemetry v0.1.0 + go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 golang.org/x/crypto v0.22.0 golang.org/x/sync v0.7.0 diff --git a/test/assert/assert.go b/keeltest/assert/assert.go similarity index 81% rename from test/assert/assert.go rename to keeltest/assert/assert.go index e024345..08333b5 100644 --- a/test/assert/assert.go +++ b/keeltest/assert/assert.go @@ -5,8 +5,8 @@ import ( "fmt" "testing" + "github.com/foomo/keel/keeltest" "github.com/foomo/keel/log" - keeltestutil "github.com/foomo/keel/test/util" "github.com/stretchr/testify/assert" "github.com/tidwall/pretty" ) @@ -14,7 +14,7 @@ import ( func InlineEqual(t *testing.T, actual interface{}, msgAndArgs ...interface{}) bool { t.Helper() - expected, ok := keeltestutil.Inline(t, 2, "%v", actual) + expected, ok := keeltest.Inline(t, 2, "%v", actual) if ok { return assert.Equal(t, expected, fmt.Sprintf("%v", actual), msgAndArgs...) } else { @@ -30,7 +30,7 @@ func InlineJSONEq(t *testing.T, actual interface{}, msgAndArgs ...interface{}) b t.Fatal("failed to marshal json", log.FError(err)) } - expected, ok := keeltestutil.Inline(t, 2, string(actualBytes)) + expected, ok := keeltest.Inline(t, 2, string(actualBytes)) if ok { return assert.Equal(t, string(pretty.Pretty([]byte(expected))), string(pretty.Pretty(actualBytes)), msgAndArgs...) } else { diff --git a/test/assert/assert_test.go b/keeltest/assert/assert_test.go similarity index 95% rename from test/assert/assert_test.go rename to keeltest/assert/assert_test.go index 6d86152..4121070 100644 --- a/test/assert/assert_test.go +++ b/keeltest/assert/assert_test.go @@ -3,7 +3,7 @@ package keelassert_test import ( "testing" - keelassert "github.com/foomo/keel/test/assert" + keelassert "github.com/foomo/keel/keeltest/assert" "github.com/stretchr/testify/assert" ) diff --git a/test/assert/assertions.go b/keeltest/assert/assertions.go similarity index 85% rename from test/assert/assertions.go rename to keeltest/assert/assertions.go index 6abcb76..cb37301 100644 --- a/test/assert/assertions.go +++ b/keeltest/assert/assertions.go @@ -5,8 +5,8 @@ import ( "fmt" "testing" + "github.com/foomo/keel/keeltest" "github.com/foomo/keel/log" - keeltestutil "github.com/foomo/keel/test/util" "github.com/stretchr/testify/assert" "github.com/tidwall/pretty" ) @@ -26,7 +26,7 @@ func New(t *testing.T) *Assertions { //nolint:thelper func (a *Assertions) InlineEqual(actual interface{}, msgAndArgs ...interface{}) bool { a.t.Helper() - expected, ok := keeltestutil.Inline(a.t, 2, "%v", actual) + expected, ok := keeltest.Inline(a.t, 2, "%v", actual) if ok { return assert.Equal(a.t, expected, fmt.Sprintf("%v", actual), msgAndArgs...) } else { @@ -42,7 +42,7 @@ func (a *Assertions) InlineJSONEq(actual interface{}, msgAndArgs ...interface{}) a.t.Fatal("failed to marshal json", log.FError(err)) } - expected, ok := keeltestutil.Inline(a.t, 2, string(actualBytes)) + expected, ok := keeltest.Inline(a.t, 2, string(actualBytes)) if ok { return assert.Equal(a.t, string(pretty.Pretty([]byte(expected))), string(pretty.Pretty(actualBytes)), msgAndArgs...) } else { diff --git a/test/client.go b/keeltest/client.go similarity index 100% rename from test/client.go rename to keeltest/client.go diff --git a/test/util/inline.go b/keeltest/inline.go similarity index 99% rename from test/util/inline.go rename to keeltest/inline.go index b5b8532..53357c6 100644 --- a/test/util/inline.go +++ b/keeltest/inline.go @@ -1,4 +1,4 @@ -package keeltestutil +package keeltest import ( "encoding/json" diff --git a/test/util/inline_test.go b/keeltest/inline_test.go similarity index 61% rename from test/util/inline_test.go rename to keeltest/inline_test.go index 28944a8..c492dc4 100644 --- a/test/util/inline_test.go +++ b/keeltest/inline_test.go @@ -1,27 +1,30 @@ -package keeltestutil_test +package keeltest_test import ( "testing" - keeltestutil "github.com/foomo/keel/test/util" + "github.com/foomo/keel/keeltest" "github.com/stretchr/testify/assert" + "go.uber.org/goleak" ) func TestInline(t *testing.T) { + defer goleak.VerifyNone(t) + t.Run("read inline", func(t *testing.T) { - value, ok := keeltestutil.Inline(t, 1) // INLINE: hello world + value, ok := keeltest.Inline(t, 1) // INLINE: hello world assert.True(t, ok) assert.Equal(t, "hello world", value) }) t.Run("read inline int", func(t *testing.T) { - value, ok := keeltestutil.InlineInt(t, 1) // INLINE: 1 + value, ok := keeltest.InlineInt(t, 1) // INLINE: 1 assert.True(t, ok) assert.Equal(t, 1, value) }) t.Run("read inline float", func(t *testing.T) { - value, ok := keeltestutil.InlineFloat64(t, 1) // INLINE: 1.5 + value, ok := keeltest.InlineFloat64(t, 1) // INLINE: 1.5 assert.True(t, ok) assert.Equal(t, 1.5, value) }) @@ -30,12 +33,12 @@ func TestInline(t *testing.T) { var x struct { Foo string `json:"foo"` } - keeltestutil.InlineJSON(t, 1, &x) // INLINE: {"foo":"bar"} + keeltest.InlineJSON(t, 1, &x) // INLINE: {"foo":"bar"} assert.Equal(t, "bar", x.Foo) }) t.Run("write inline", func(t *testing.T) { - value, ok := keeltestutil.Inline(t, 1, "hello %s", "world") // INLINE: hello world + value, ok := keeltest.Inline(t, 1, "hello %s", "world") // INLINE: hello world assert.True(t, ok) assert.Equal(t, "hello world", value) }) diff --git a/test/option.go b/keeltest/option.go similarity index 100% rename from test/option.go rename to keeltest/option.go diff --git a/test/require/assertions.go b/keeltest/require/assertions.go similarity index 83% rename from test/require/assertions.go rename to keeltest/require/assertions.go index a9956e5..0e43989 100644 --- a/test/require/assertions.go +++ b/keeltest/require/assertions.go @@ -5,8 +5,8 @@ import ( "fmt" "testing" + "github.com/foomo/keel/keeltest" "github.com/foomo/keel/log" - keeltestutil "github.com/foomo/keel/test/util" "github.com/stretchr/testify/require" "github.com/tidwall/pretty" ) @@ -26,7 +26,7 @@ func New(t *testing.T) *Assertions { //nolint:thelper func (a *Assertions) InlineEqual(actual interface{}, msgAndArgs ...interface{}) { a.t.Helper() - if expected, ok := keeltestutil.Inline(a.t, 2, "%v", actual); ok { + if expected, ok := keeltest.Inline(a.t, 2, "%v", actual); ok { require.Equal(a.t, expected, fmt.Sprintf("%v", actual), msgAndArgs...) } } @@ -38,7 +38,7 @@ func (a *Assertions) InlineJSONEq(actual interface{}, msgAndArgs ...interface{}) if err != nil { a.t.Fatal("failed to marshal json", log.FError(err)) } - if expected, ok := keeltestutil.Inline(a.t, 2, string(actualBytes)); ok { + if expected, ok := keeltest.Inline(a.t, 2, string(actualBytes)); ok { require.Equal(a.t, string(pretty.Pretty([]byte(expected))), string(pretty.Pretty(actualBytes)), msgAndArgs...) } } diff --git a/test/require/require.go b/keeltest/require/require.go similarity index 78% rename from test/require/require.go rename to keeltest/require/require.go index c26a819..5d38172 100644 --- a/test/require/require.go +++ b/keeltest/require/require.go @@ -5,15 +5,15 @@ import ( "fmt" "testing" + "github.com/foomo/keel/keeltest" "github.com/foomo/keel/log" - keeltestutil "github.com/foomo/keel/test/util" "github.com/stretchr/testify/require" "github.com/tidwall/pretty" ) func InlineEqual(t *testing.T, actual interface{}, msgAndArgs ...interface{}) { t.Helper() - if expected, ok := keeltestutil.Inline(t, 2, "%v", actual); ok { + if expected, ok := keeltest.Inline(t, 2, "%v", actual); ok { require.Equal(t, expected, fmt.Sprintf("%v", actual), msgAndArgs...) } } @@ -25,7 +25,7 @@ func InlineJSONEq(t *testing.T, actual interface{}, msgAndArgs ...interface{}) { if err != nil { t.Fatal("failed to marshal json", log.FError(err)) } - if expected, ok := keeltestutil.Inline(t, 2, string(actualBytes)); ok { + if expected, ok := keeltest.Inline(t, 2, string(actualBytes)); ok { require.Equal(t, string(pretty.Pretty([]byte(expected))), string(pretty.Pretty(actualBytes)), msgAndArgs...) } } diff --git a/test/server.go b/keeltest/server.go similarity index 100% rename from test/server.go rename to keeltest/server.go diff --git a/test/service.go b/keeltest/service.go similarity index 100% rename from test/service.go rename to keeltest/service.go diff --git a/test/servicehttp.go b/keeltest/servicehttp.go similarity index 100% rename from test/servicehttp.go rename to keeltest/servicehttp.go diff --git a/net/http/middleware/cors_test.go b/net/http/middleware/cors_test.go index 67b671e..f1b15d1 100644 --- a/net/http/middleware/cors_test.go +++ b/net/http/middleware/cors_test.go @@ -5,9 +5,9 @@ import ( "net/http/httptest" "testing" + keelassert "github.com/foomo/keel/keeltest/assert" keelhttp "github.com/foomo/keel/net/http" "github.com/foomo/keel/net/http/middleware" - keelassert "github.com/foomo/keel/test/assert" "go.uber.org/zap/zaptest" ) diff --git a/net/http/middleware/logger_test.go b/net/http/middleware/logger_test.go index 78dd46c..386c5f3 100644 --- a/net/http/middleware/logger_test.go +++ b/net/http/middleware/logger_test.go @@ -4,10 +4,10 @@ import ( "fmt" "net/http" + "github.com/foomo/keel/keeltest" "github.com/foomo/keel/log" httplog "github.com/foomo/keel/net/http/log" "github.com/foomo/keel/net/http/middleware" - keeltest "github.com/foomo/keel/test" "go.uber.org/zap" ) diff --git a/server_test.go b/server_test.go index 0d5bd44..d90ff9c 100644 --- a/server_test.go +++ b/server_test.go @@ -13,10 +13,11 @@ import ( "github.com/foomo/keel/service" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/suite" + "go.uber.org/goleak" "go.uber.org/zap" + "go.uber.org/zap/zaptest" "github.com/foomo/keel" - keeltest "github.com/foomo/keel/test" ) type KeelTestSuite struct { @@ -29,12 +30,12 @@ type KeelTestSuite struct { // SetupSuite hook func (s *KeelTestSuite) SetupSuite() { - s.l = keeltest.NewLogger(s.T()).Zap() + s.l = zaptest.NewLogger(s.T()) } // BeforeTest hook func (s *KeelTestSuite) BeforeTest(suiteName, testName string) { - s.l = keeltest.NewLogger(s.T()).Zap() + s.l = zaptest.NewLogger(s.T()) s.mux = http.NewServeMux() s.mux.HandleFunc("/ok", func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) @@ -74,7 +75,9 @@ func (s *KeelTestSuite) AfterTest(suiteName, testName string) { } // TearDownSuite hook -func (s *KeelTestSuite) TearDownSuite() {} +func (s *KeelTestSuite) TearDownSuite() { + goleak.VerifyNone(s.T()) +} func (s *KeelTestSuite) TestServiceHTTP() { s.svr.AddServices( diff --git a/test/log.go b/test/log.go deleted file mode 100644 index 82d2b5f..0000000 --- a/test/log.go +++ /dev/null @@ -1,105 +0,0 @@ -package keeltest - -import ( - "bytes" - "fmt" - - "go.uber.org/zap" - "go.uber.org/zap/zapcore" - "go.uber.org/zap/zaptest" -) - -type ( - Logger struct { - zap *zap.Logger - writer *testingWriter - } - LoggerOptions struct { - Level zapcore.LevelEnabler - zapOptions []zap.Option - } - LoggerOption func(*LoggerOptions) -) - -// LoggerWithLevel adds zap.Option's to a test Logger built by NewLogger. -func LoggerWithLevel(o zapcore.LevelEnabler) LoggerOption { - return func(v *LoggerOptions) { - v.Level = o - } -} - -// LoggerWithZapOptions adds zap.Option's to a test Logger built by NewLogger. -func LoggerWithZapOptions(o ...zap.Option) LoggerOption { - return func(v *LoggerOptions) { - v.zapOptions = o - } -} - -func NewLogger(t zaptest.TestingT, opts ...LoggerOption) *Logger { - cfg := LoggerOptions{ - Level: zapcore.DebugLevel, - } - for _, opt := range opts { - opt(&cfg) - } - - writer := newTestingWriter(t) - zapOptions := []zap.Option{ - zap.AddCaller(), - // zap.AddCallerSkip(1), - // Send zap errors to the same writer and mark the test as failed if that happens. - zap.ErrorOutput(writer), - } - zapOptions = append(zapOptions, cfg.zapOptions...) - - e := zap.NewDevelopmentEncoderConfig() - e.TimeKey = "" - e.EncodeLevel = zapcore.CapitalColorLevelEncoder - e.EncodeCaller = func(s zapcore.EntryCaller, enc zapcore.PrimitiveArrayEncoder) { - enc.AppendString(fmt.Sprintf("\x1b[%dm%s\x1b[0m", uint8(37), s.TrimmedPath())) - } - return &Logger{ - zap: zap.New( - zapcore.NewCore( - zapcore.NewConsoleEncoder(e), - writer, - cfg.Level, - ), - zapOptions..., - ), - writer: writer, - } -} - -func (l *Logger) T(t zaptest.TestingT) *Logger { - l.writer.t = t - return l -} - -func (l *Logger) Zap() *zap.Logger { - return l.zap -} - -// testingWriter is a WriteSyncer that writes to the given testing.TB. -type testingWriter struct { - t zaptest.TestingT -} - -func newTestingWriter(t zaptest.TestingT) *testingWriter { - return &testingWriter{t: t} -} - -func (w *testingWriter) Write(p []byte) (int, error) { - if w.t == nil { - return fmt.Printf("%s", p) //nolint:forbidigo - } else { - // Note: t.Log is safe for concurrent use. - // Strip trailing newline because t.Log always adds one. - w.t.Logf("%s", bytes.TrimRight(p, "\n")) - return len(p), nil - } -} - -func (w *testingWriter) Sync() error { - return nil -} From 8882274093f7d52aec39d15cb872ff70f70b73f3 Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Tue, 16 Apr 2024 09:38:28 +0200 Subject: [PATCH 126/134] feat: update & fix lints --- .golangci.yml | 245 ++++++++++++++---- config/remote.go | 2 +- config/watch.go | 4 +- errors/wrappederror_test.go | 7 +- go.mod | 2 - jwt/jwtkey.go | 6 +- log/with.go | 2 +- net/gotsrpc/errors.go | 2 +- net/http/middleware/jwt.go | 8 +- net/http/roundtripware/circuitbreaker.go | 2 +- net/http/roundtripware/circuitbreaker_test.go | 30 +-- persistence/mongo/collection.go | 4 +- persistence/mongo/utils.go | 4 +- server.go | 10 +- server_test.go | 13 +- service/httpreadme_test.go | 2 +- serviceenabler.go | 12 +- telemetry/meter.go | 3 +- 18 files changed, 247 insertions(+), 111 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index a2052d7..c149ab6 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -1,90 +1,229 @@ run: timeout: 5m - skip-dirs: - - tmp + +issues: + exclude-dirs: + - 'bin' + - 'tmp' + - 'vendor' + exclude-rules: + - path: _test\.go + linters: + - forcetypeassert + - gocheckcompilerdirectives linters-settings: + # https://golangci-lint.run/usage/linters/#misspell + misspell: + mode: restricted + # https://golangci-lint.run/usage/linters/#asasalint + asasalint: + ignore-test: true + # https://golangci-lint.run/usage/linters/#exhaustive + exhaustive: + default-signifies-exhaustive: true + # https://golangci-lint.run/usage/linters/#gocritic + gocritic: + disabled-checks: + - assignOp + - ifElseChain + # https://golangci-lint.run/usage/linters/#testifylint + testifylint: + disable: + - float-compare + # https://golangci-lint.run/usage/linters/#gosec + gosec: + confidence: medium # https://golangci-lint.run/usage/linters/#revive revive: + enable-all-rules: true + ignore-generated-header: true rules: + - name: line-length-limit + disabled: true + #- name: if-return + # disabled: true + #- name: bare-return + # disabled: true + - name: cognitive-complexity + disabled: true + - name: unused-parameter + disabled: true + - name: add-constant + disabled: true - name: indent-error-flow disabled: true + - name: cyclomatic + disabled: true + - name: function-length + disabled: true + - name: early-return + disabled: true + #- name: nested-structs + # disabled: true + #- name: var-naming + # disabled: true + - name: use-any + disabled: true + - name: max-public-structs + disabled: true + #- name: function-result-limit + # disabled: true + - name: flag-parameter + disabled: true + - name: unused-receiver + disabled: true + #- name: argument-limit + # disabled: true + #- name: empty-lines + # disabled: true + - name: confusing-naming + disabled: true + #- name: import-alias-naming + # disabled: true + - name: empty-block + disabled: true + #- name: import-shadowing + # disabled: true + - name: unhandled-error + arguments: + - "fmt.Printf" + - "fmt.Println" + #- name: max-control-nesting + # disabled: true - name: exported disabled: true - # https://golangci-lint.run/usage/linters/#gocritic - gocritic: - enabled-tags: - - diagnostic - - performance - - style - disabled-tags: - - experimental - - opinionated - disabled-checks: - - ifElseChain - settings: - hugeParam: - sizeThreshold: 512 - # https://golangci-lint.run/usage/linters/#gosec - gosec: - config: - G306: "0700" - excludes: - - G101 # Potential hardcoded credentials - - G102 # Bind to all interfaces - - G112 # Potential slowloris attack - - G401 # Detect the usage of DES, RC4, MD5 or SHA1 - - G402 # Look for bad TLS connection settings - - G404 # Insecure random number source (rand) - - G501 # Import blocklist: crypto/md5 - - G505 # Import blocklist: crypto/sha1 + #- name: unchecked-type-assertion + # disabled: true + #- name: unnecessary-stmt + # disabled: true + #- name: get-return + # disabled: true + #- name: context-keys-type + # disabled: true + #- name: comment-spacings + # disabled: true + #- name: struct-tag + # disabled: true + #- name: confusing-results + # disabled: true + - name: superfluous-else + disabled: true + - name: unexported-return + disabled: true + #- name: error-return + # disabled: true + #- name: redefines-builtin-id + # disabled: true linters: + disable-all: true enable: # Enabled by default linters: - - errcheck - - gosimple - - govet - - ineffassign - - staticcheck + - errcheck # errcheck is a program for checking for unchecked errors in Go code. These unchecked errors can be critical bugs in some cases [fast: false, auto-fix: false] + - gosimple # (megacheck) Linter for Go source code that specializes in simplifying code [fast: false, auto-fix: false] + - govet # (vet, vetshadow) Vet examines Go source code and reports suspicious constructs. It is roughly the same as 'go vet' and uses its passes. [fast: false, auto-fix: false] + - ineffassign # Detects when assignments to existing variables are not used [fast: true, auto-fix: false] + - staticcheck # (megacheck) It's a set of rules from staticcheck. It's not the same thing as the staticcheck binary. The author of staticcheck doesn't support or approve the use of staticcheck as a library inside golangci-lint. [fast: false, auto-fix: false] + - unused # (megacheck) Checks Go code for unused constants, variables, functions and types [fast: false, auto-fix: false] - # Disabled by default linters: - - asciicheck # Simple linter to check that your code does not contain non-ASCII identifiers [fast: true, auto-fix: false] + # Disabled by your configuration linters: + - asasalint # check for pass []any as any in variadic func(...any) [fast: false, auto-fix: false] + - asciicheck # checks that all code identifiers does not have non-ASCII symbols in the name [fast: true, auto-fix: false] - bidichk # Checks for dangerous unicode character sequences [fast: true, auto-fix: false] + - bodyclose # checks whether HTTP response body is closed successfully [fast: false, auto-fix: false] + #- containedctx # containedctx is a linter that detects struct contained context.Context field [fast: false, auto-fix: false] + - contextcheck # check whether the function uses a non-inherited context [fast: false, auto-fix: false] + #- copyloopvar # (go >= 1.22) copyloopvar is a linter detects places where loop variables are copied [fast: true, auto-fix: false] + #- cyclop # checks function and package cyclomatic complexity [fast: false, auto-fix: false] + - decorder # check declaration order and count of types, constants, variables and functions [fast: true, auto-fix: false] + #- depguard # Go linter that checks if package imports are in a list of acceptable packages [fast: true, auto-fix: false] + #- dogsled # Checks assignments with too many blank identifiers (e.g. x, _, _, _, := f()) [fast: true, auto-fix: false] #- dupl # Tool for code clone detection [fast: true, auto-fix: false] + #- dupword # checks for duplicate words in the source code [fast: true, auto-fix: false] + - durationcheck # check for two durations multiplied together [fast: false, auto-fix: false] + - errchkjson # Checks types passed to the json encoding functions. Reports unsupported types and reports occations, where the check for the returned error can be omitted. [fast: false, auto-fix: false] + - errname # Checks that sentinel errors are prefixed with the `Err` and error types are suffixed with the `Error`. [fast: false, auto-fix: false] + - errorlint # errorlint is a linter for that can be used to find code that will cause problems with the error wrapping scheme introduced in Go 1.13. [fast: false, auto-fix: false] + - execinquery # execinquery is a linter about query string checker in Query function which reads your Go src files and warning it finds [fast: false, auto-fix: false] + - exhaustive # check exhaustiveness of enum switch statements [fast: false, auto-fix: false] + #- exhaustruct # Checks if all structure fields are initialized [fast: false, auto-fix: false] + - exportloopref # checks for pointers to enclosing loop variables [fast: false, auto-fix: false] + #- forbidigo # Forbids identifiers [fast: false, auto-fix: false] - forcetypeassert # finds forced type assertions [fast: true, auto-fix: false] + #- funlen # Tool for detection of long functions [fast: true, auto-fix: false] + #- gci # Gci controls Go package import order and makes it always deterministic. [fast: true, auto-fix: true] + #- ginkgolinter # enforces standards of using ginkgo and gomega [fast: false, auto-fix: false] + - gocheckcompilerdirectives # Checks that go compiler directive comments (//go:) are valid. [fast: true, auto-fix: false] + #- gochecknoglobals # Check that no global variables exist. [fast: false, auto-fix: false] #- gochecknoinits # Checks that no init functions are present in Go code [fast: true, auto-fix: false] - - goconst # Finds repeated strings that could be replaced by a constant [fast: true, auto-fix: false] - - gocritic # Provides diagnostics that check for bugs, performance and style issues. [fast: false, auto-fix: false] - - goimports # In addition to fixing imports, goimports also formats your code in the same style as gofmt. [fast: true, auto-fix: true] - #- gomoddirectives # Manage the use of 'replace', 'retract', and 'excludes' directives in go.mod. [fast: true, auto-fix: false] + - gochecksumtype # Run exhaustiveness checks on Go "sum types" [fast: false, auto-fix: false] + #- gocognit # Computes and checks the cognitive complexity of functions [fast: true, auto-fix: false] + #- goconst # Finds repeated strings that could be replaced by a constant [fast: true, auto-fix: false] + - gocritic # Provides diagnostics that check for bugs, performance and style issues. [fast: false, auto-fix: true] + #- gocyclo # Computes and checks the cyclomatic complexity of functions [fast: true, auto-fix: false] + #- godot # Check if comments end in a period [fast: true, auto-fix: true] + #- godox # Tool for detection of FIXME, TODO and other comment keywords [fast: true, auto-fix: false] + #- goerr113 # Go linter to check the errors handling expressions [fast: false, auto-fix: false] + - gofmt # Gofmt checks whether code was gofmt-ed. By default this tool runs with -s option to check for code simplification [fast: true, auto-fix: true] + #- gofumpt # Gofumpt checks whether code was gofumpt-ed. [fast: true, auto-fix: true] + - goheader # Checks is file header matches to pattern [fast: true, auto-fix: true] + - goimports # Check import statements are formatted according to the 'goimport' command. Reformat imports in autofix mode. [fast: true, auto-fix: true] + #- gomnd # An analyzer to detect magic numbers. [fast: true, auto-fix: false] + - gomoddirectives # Manage the use of 'replace', 'retract', and 'excludes' directives in go.mod. [fast: true, auto-fix: false] - gomodguard # Allow and block list linter for direct Go module dependencies. This is different from depguard where there are different block types for example version constraints and module recommendations. [fast: true, auto-fix: false] - - goprintffuncname # Checks that printf-like functions are named with `f` at the end [fast: true, auto-fix: false] - - gosec # (gas): Inspects source code for security problems [fast: false, auto-fix: false] - - grouper # An analyzer to analyze expression groups. [fast: true, auto-fix: false] + - goprintffuncname # Checks that printf-like functions are named with `f` at the end. [fast: true, auto-fix: false] + - gosec # (gas) Inspects source code for security problems [fast: false, auto-fix: false] + #- gosmopolitan # Report certain i18n/l10n anti-patterns in your Go codebase [fast: false, auto-fix: false] + - grouper # Analyze expression groups. [fast: true, auto-fix: false] - importas # Enforces consistent import aliases [fast: false, auto-fix: false] + #- inamedparam # reports interfaces with unnamed method parameters [fast: true, auto-fix: false] + #- interfacebloat # A linter that checks the number of methods inside an interface. [fast: true, auto-fix: false] + #- intrange # (go >= 1.22) intrange is a linter to find places where for loops could make use of an integer range. [fast: true, auto-fix: false] + #- ireturn # Accept Interfaces, Return Concrete Types [fast: false, auto-fix: false] + #- lll # Reports long lines [fast: true, auto-fix: false] + #- loggercheck # (logrlint) Checks key value pairs for common logger libraries (kitlog,klog,logr,zap). [fast: false, auto-fix: false] #- maintidx # maintidx measures the maintainability index of each function. [fast: true, auto-fix: false] - makezero # Finds slice declarations with non-zero initial length [fast: false, auto-fix: false] - - misspell # Finds commonly misspelled English words in comments [fast: true, auto-fix: true] - - nakedret # Finds naked returns in functions greater than a specified function length [fast: true, auto-fix: false] + - misspell # Finds commonly misspelled English words [fast: true, auto-fix: true] + - mirror # reports wrong mirror patterns of bytes/strings usage [fast: false, auto-fix: true] + - musttag # enforce field tags in (un)marshaled structs [fast: false, auto-fix: false] + #- nakedret # Checks that functions with naked returns are not longer than a maximum size (can be zero). [fast: true, auto-fix: false] #- nestif # Reports deeply nested if statements [fast: true, auto-fix: false] - nilerr # Finds the code that returns nil even if it checks that the error is not nil. [fast: false, auto-fix: false] - nilnil # Checks that there is no simultaneous return of `nil` error and an invalid value. [fast: false, auto-fix: false] - - noctx # noctx finds sending http request without context.Context [fast: false, auto-fix: false] - - nolintlint # Reports ill-formed or insufficient nolint directives [fast: true, auto-fix: false] + #- nlreturn # nlreturn checks for a new line before return and branch statements to increase code clarity [fast: true, auto-fix: false] + - noctx # Finds sending http request without context.Context [fast: false, auto-fix: false] + - nolintlint # Reports ill-formed or insufficient nolint directives [fast: true, auto-fix: true] - nonamedreturns # Reports all named returns [fast: false, auto-fix: false] - nosprintfhostport # Checks for misuse of Sprintf to construct a host with port in a URL. [fast: true, auto-fix: false] + #- paralleltest # Detects missing usage of t.Parallel() method in your Go test [fast: false, auto-fix: false] + #- perfsprint # Checks that fmt.Sprintf can be replaced with a faster alternative. [fast: false, auto-fix: false] - prealloc # Finds slice declarations that could potentially be pre-allocated [fast: true, auto-fix: false] - predeclared # find code that shadows one of Go's predeclared identifiers [fast: true, auto-fix: false] - promlinter # Check Prometheus metrics naming via promlint [fast: true, auto-fix: false] + #- protogetter # Reports direct reads from proto message fields when getters should be used [fast: false, auto-fix: true] + - reassign # Checks that package variables are not reassigned [fast: false, auto-fix: false] - revive # Fast, configurable, extensible, flexible, and beautiful linter for Go. Drop-in replacement of golint. [fast: false, auto-fix: false] + #- rowserrcheck # checks whether Rows.Err of rows is checked successfully [fast: false, auto-fix: false] + #- sloglint # ensure consistent code style when using log/slog [fast: false, auto-fix: false] + #- spancheck # Checks for mistakes with OpenTelemetry/Census spans. [fast: false, auto-fix: false] + #- sqlclosecheck # Checks that sql.Rows, sql.Stmt, sqlx.NamedStmt, pgx.Query are closed. [fast: false, auto-fix: false] + - stylecheck # Stylecheck is a replacement for golint [fast: false, auto-fix: false] + #- tagalign # check that struct tags are well aligned [fast: true, auto-fix: true] - tagliatelle # Checks the struct tags. [fast: true, auto-fix: false] + - tenv # tenv is analyzer that detects using os.Setenv instead of t.Setenv since Go1.17 [fast: false, auto-fix: false] + - testableexamples # linter checks if examples are testable (have an expected output) [fast: true, auto-fix: false] + - testifylint # Checks usage of github.com/stretchr/testify. [fast: false, auto-fix: false] - testpackage # linter that makes you use a separate _test package [fast: true, auto-fix: false] - - thelper # thelper detects golang test helpers without t.Helper() call and checks the consistency of test helpers [fast: false, auto-fix: false] + - thelper # thelper detects tests helpers which is not start with t.Helper() method. [fast: false, auto-fix: false] + #- tparallel # tparallel detects inappropriate usage of t.Parallel() method in your Go test codes. [fast: false, auto-fix: false] - unconvert # Remove unnecessary type conversions [fast: false, auto-fix: false] - - unparam # Reports unused function parameters [fast: false, auto-fix: false] + #- unparam # Reports unused function parameters [fast: false, auto-fix: false] - usestdlibvars # A linter that detect the possibility to use variables/constants from the Go standard library. [fast: true, auto-fix: false] - - wastedassign # wastedassign finds wasted assignment statements. [fast: false, auto-fix: false] - - whitespace # Tool for detection of leading and trailing whitespace [fast: true, auto-fix: true] - disable: - - unused + #- varnamelen # checks that the length of a variable's name matches its scope [fast: false, auto-fix: false] + - wastedassign # Finds wasted assignment statements [fast: false, auto-fix: false] + - whitespace # Whitespace is a linter that checks for unnecessary newlines at the start and end of functions, if, for, etc. [fast: true, auto-fix: true] + #- wrapcheck # Checks that errors returned from external packages are wrapped [fast: false, auto-fix: false] + #- wsl # add or remove empty lines [fast: true, auto-fix: false] + #- zerologlint # Detects the wrong usage of `zerolog` that a user forgets to dispatch with `Send` or `Msg` [fast: false, auto-fix: false] diff --git a/config/remote.go b/config/remote.go index ab85c67..ae54652 100644 --- a/config/remote.go +++ b/config/remote.go @@ -3,7 +3,7 @@ package config import ( "github.com/pkg/errors" "github.com/spf13/viper" - _ "github.com/spf13/viper/remote" + _ "github.com/spf13/viper/remote" // required import ) var remotes []struct { diff --git a/config/watch.go b/config/watch.go index 9713e2e..870b771 100644 --- a/config/watch.go +++ b/config/watch.go @@ -20,7 +20,7 @@ func WatchBool(ctx context.Context, fn func() bool, callback func(bool)) { func WatchTime(ctx context.Context, fn func() time.Time, callback func(time.Time)) { current := fn() watch(ctx, func() { - if value := fn(); value != current { + if value := fn(); !value.Equal(current) { current = value callback(current) } @@ -102,7 +102,7 @@ func WatchBoolChan(ctx context.Context, fn func() bool, ch chan bool) { func WatchTimeChan(ctx context.Context, fn func() time.Time, ch chan time.Time) { current := fn() watch(ctx, func() { - if value := fn(); value != current { + if value := fn(); !value.Equal(current) { current = value ch <- current } diff --git a/errors/wrappederror_test.go b/errors/wrappederror_test.go index 05f06b0..da12b14 100644 --- a/errors/wrappederror_test.go +++ b/errors/wrappederror_test.go @@ -7,6 +7,7 @@ import ( keelerrors "github.com/foomo/keel/errors" "github.com/pkg/errors" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func ExampleNewWrappedError() { @@ -63,13 +64,13 @@ func Test_wrappedError_Error(t *testing.T) { parentErr := errors.New("parent") childErr := errors.New("child") wrappedErr := keelerrors.NewWrappedError(parentErr, childErr) - assert.Equal(t, wrappedErr.Error(), "parent: child") + assert.Equal(t, "parent: child", wrappedErr.Error()) } func Test_wrappedError_Is(t *testing.T) { parentErr := errors.New("parent") childErr := errors.New("child") wrappedErr := keelerrors.NewWrappedError(parentErr, childErr) - assert.ErrorIs(t, wrappedErr, parentErr) - assert.ErrorIs(t, wrappedErr, childErr) + require.ErrorIs(t, wrappedErr, parentErr) + require.ErrorIs(t, wrappedErr, childErr) } diff --git a/go.mod b/go.mod index 5e5a2a4..eb91f01 100644 --- a/go.mod +++ b/go.mod @@ -152,5 +152,3 @@ require ( gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) - -replace go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.32.0 => github.com/foomo/opentelemetry-go-contrib/instrumentation/net/http/otelhttp v0.32.1-0.20220517120905-10e2553b9bac diff --git a/jwt/jwtkey.go b/jwt/jwtkey.go index b55d872..b7fc16a 100644 --- a/jwt/jwtkey.go +++ b/jwt/jwtkey.go @@ -38,9 +38,9 @@ func NewKeyFromFilenames(publicKeyPemFilename, privateKeyPemFilename string) (Ke // load private key if privateKeyPemFilename != "" { - if bytes, err := os.ReadFile(privateKeyPemFilename); err != nil { + if value, err := os.ReadFile(privateKeyPemFilename); err != nil { return Key{}, errors.Wrap(err, "failed to read private key: "+privateKeyPemFilename) - } else if key, err := jwt.ParseRSAPrivateKeyFromPEM([]byte(strings.ReplaceAll(string(bytes), `\n`, "\n"))); err != nil { + } else if key, err := jwt.ParseRSAPrivateKeyFromPEM([]byte(strings.ReplaceAll(string(value), `\n`, "\n"))); err != nil { return Key{}, errors.Wrap(err, "failed to parse private key: "+privateKeyPemFilename) } else { private = key @@ -54,7 +54,7 @@ func NewKeyFromFilenames(publicKeyPemFilename, privateKeyPemFilename string) (Ke return Key{}, errors.Wrap(err, "failed to parse public key: "+publicKeyPemFilename) } else { hasher := sha256.New() - hasher.Write(bytes.TrimSpace(v)) + _, _ = hasher.Write(bytes.TrimSpace(v)) id = hex.EncodeToString(hasher.Sum(nil)) public = key } diff --git a/log/with.go b/log/with.go index cf23441..e8d7640 100644 --- a/log/with.go +++ b/log/with.go @@ -40,7 +40,7 @@ func WithServiceName(l *zap.Logger, name string) *zap.Logger { return With(l, FServiceName(name)) } -func WithTraceID(l *zap.Logger, ctx context.Context) *zap.Logger { +func WithTraceID(l *zap.Logger, ctx context.Context) *zap.Logger { //nolint:revive if spanCtx := trace.SpanContextFromContext(ctx); spanCtx.IsValid() && spanCtx.IsSampled() { l = With(l, FTraceID(spanCtx.TraceID().String()), FSpanID(spanCtx.SpanID().String())) } diff --git a/net/gotsrpc/errors.go b/net/gotsrpc/errors.go index 6105d64..46219ce 100644 --- a/net/gotsrpc/errors.go +++ b/net/gotsrpc/errors.go @@ -19,7 +19,7 @@ func NewError(e Error) *Error { func (e *Error) Is(err error) bool { if e == nil || err == nil { return false - } else if v, ok := err.(*Error); ok && v != nil { //nolint:errorlint + } else if v, ok := err.(*Error); ok && v != nil { return e.Error() == v.Error() } return false diff --git a/net/http/middleware/jwt.go b/net/http/middleware/jwt.go index d165ecf..2971f70 100644 --- a/net/http/middleware/jwt.go +++ b/net/http/middleware/jwt.go @@ -125,18 +125,18 @@ func JWTWithSetContext(v bool) JWTOption { } // JWT middleware -func JWT(jwt *jwt.JWT, contextKey interface{}, opts ...JWTOption) Middleware { +func JWT(v *jwt.JWT, contextKey interface{}, opts ...JWTOption) Middleware { options := GetDefaultJWTOptions() for _, opt := range opts { if opt != nil { opt(&options) } } - return JWTWithOptions(jwt, contextKey, options) + return JWTWithOptions(v, contextKey, options) } // JWTWithOptions middleware -func JWTWithOptions(jwt *jwt.JWT, contextKey interface{}, opts JWTOptions) Middleware { +func JWTWithOptions(v *jwt.JWT, contextKey interface{}, opts JWTOptions) Middleware { return func(l *zap.Logger, name string, next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { claims := opts.ClaimsProvider() @@ -174,7 +174,7 @@ func JWTWithOptions(jwt *jwt.JWT, contextKey interface{}, opts JWTOptions) Middl } // handle existing token - jwtToken, err := jwt.ParseWithClaims(token, claims) + jwtToken, err := v.ParseWithClaims(token, claims) if err != nil { if resume := opts.ErrorHandler(l, w, r, err); resume { next.ServeHTTP(w, r) diff --git a/net/http/roundtripware/circuitbreaker.go b/net/http/roundtripware/circuitbreaker.go index 824afd9..407bcfa 100644 --- a/net/http/roundtripware/circuitbreaker.go +++ b/net/http/roundtripware/circuitbreaker.go @@ -191,7 +191,7 @@ func CircuitBreaker(set *CircuitBreakerSettings, opts ...CircuitBreakerOption) R } // continue with the middleware chain - resp, err = next(r) //nolint:bodyclose + resp, err = next(r) var respCopy *http.Response if resp != nil { diff --git a/net/http/roundtripware/circuitbreaker_test.go b/net/http/roundtripware/circuitbreaker_test.go index 13b4a0f..79ce7ec 100644 --- a/net/http/roundtripware/circuitbreaker_test.go +++ b/net/http/roundtripware/circuitbreaker_test.go @@ -41,7 +41,7 @@ var cbSettings = &roundtripware.CircuitBreakerSettings{ return counts.ConsecutiveFailures > 3 }, OnStateChange: func(name string, from gobreaker.State, to gobreaker.State) { - fmt.Printf("\n\nstate changed from %s to %s\n\n", from, to) + _, _ = fmt.Printf("\n\nstate changed from %s to %s\n\n", from, to) }, } @@ -101,7 +101,7 @@ func TestCircuitBreaker(t *testing.T) { require.NoError(t, err) resp, err := client.Do(req) if resp != nil { - defer resp.Body.Close() + _ = resp.Body.Close() } require.NotErrorIs(t, err, roundtripware.ErrCircuitBreaker) } @@ -112,7 +112,7 @@ func TestCircuitBreaker(t *testing.T) { require.NoError(t, err) resp, err := client.Do(req) if err == nil { - defer resp.Body.Close() + _ = resp.Body.Close() } require.ErrorIs(t, err, roundtripware.ErrCircuitBreaker) @@ -123,7 +123,7 @@ func TestCircuitBreaker(t *testing.T) { require.NoError(t, err) resp, err = client.Do(req) if resp != nil { - defer resp.Body.Close() + _ = resp.Body.Close() } require.NoError(t, err) } @@ -161,7 +161,7 @@ func TestCircuitBreakerCopyBodies(t *testing.T) { require.NoError(t, errRead) // also try to close one of the bodies (should also be handled by the RoundTripware) - req.Body.Close() + _ = req.Body.Close() return err }, true, true, @@ -175,7 +175,7 @@ func TestCircuitBreakerCopyBodies(t *testing.T) { require.NoError(t, err) resp, err := client.Do(req) if resp != nil { - defer resp.Body.Close() + _ = resp.Body.Close() } require.NoError(t, err) // make sure the correct data is returned @@ -227,7 +227,7 @@ func TestCircuitBreakerReadFromNotCopiedBodies(t *testing.T) { require.NoError(t, err) resp, err := client.Do(req) if resp != nil { - defer resp.Body.Close() + _ = resp.Body.Close() } require.Error(t, err) require.ErrorIs(t, err, roundtripware.ErrReadFromActualBody) @@ -256,7 +256,7 @@ func TestCircuitBreakerReadFromNotCopiedBodies(t *testing.T) { require.NoError(t, err) resp, err = client.Do(req) if resp != nil { - defer resp.Body.Close() + _ = resp.Body.Close() } require.Error(t, err) require.ErrorIs(t, err, roundtripware.ErrReadFromActualBody) @@ -303,7 +303,7 @@ func TestCircuitBreakerInterval(t *testing.T) { require.NoError(t, err) resp, err := client.Do(req) if resp != nil { - defer resp.Body.Close() + _ = resp.Body.Close() } require.NotErrorIs(t, err, roundtripware.ErrCircuitBreaker) } @@ -318,7 +318,7 @@ func TestCircuitBreakerInterval(t *testing.T) { require.NoError(t, err) resp, err := client.Do(req) if resp != nil { - defer resp.Body.Close() + _ = resp.Body.Close() } require.NotErrorIs(t, err, roundtripware.ErrCircuitBreaker) } @@ -328,7 +328,7 @@ func TestCircuitBreakerInterval(t *testing.T) { require.NoError(t, err) resp, err := client.Do(req) if resp != nil { - defer resp.Body.Close() + _ = resp.Body.Close() } require.ErrorIs(t, err, roundtripware.ErrCircuitBreaker) } @@ -370,7 +370,7 @@ func TestCircuitBreakerIgnore(t *testing.T) { require.NoError(t, err) resp, err := client.Do(req) if resp != nil { - defer resp.Body.Close() + _ = resp.Body.Close() } require.NotErrorIs(t, err, roundtripware.ErrCircuitBreaker) require.NoError(t, err) @@ -399,16 +399,16 @@ func TestCircuitBreakerTimeout(t *testing.T) { // -> circuit breaker should change to open state for i := 0; i < 4; i++ { ctx, cancel := context.WithTimeout(context.Background(), 200*time.Millisecond) - defer cancel() req, err := http.NewRequestWithContext(ctx, http.MethodGet, svr.URL, nil) require.NoError(t, err) resp, err := client.Do(req) if resp != nil { - defer resp.Body.Close() + _ = resp.Body.Close() } require.NotErrorIs(t, err, roundtripware.ErrCircuitBreaker) require.ErrorIs(t, err, context.DeadlineExceeded) + cancel() } // send another request with a bigger timeout @@ -419,7 +419,7 @@ func TestCircuitBreakerTimeout(t *testing.T) { require.NoError(t, err) resp, err := client.Do(req) if resp != nil { - defer resp.Body.Close() + _ = resp.Body.Close() } require.ErrorIs(t, err, roundtripware.ErrCircuitBreaker) } diff --git a/persistence/mongo/collection.go b/persistence/mongo/collection.go index 89ae5f0..29425b7 100644 --- a/persistence/mongo/collection.go +++ b/persistence/mongo/collection.go @@ -394,7 +394,7 @@ func (c *Collection) FindIterate(ctx context.Context, filter interface{}, handle return err } - defer CloseCursor(cursor) + defer CloseCursor(context.WithoutCancel(ctx), cursor) for cursor.Next(ctx) { if err := handler(cursor.Decode); err != nil { @@ -424,7 +424,7 @@ func (c *Collection) AggregateIterate(ctx context.Context, pipeline mongo.Pipeli return err } - defer CloseCursor(cursor) + defer CloseCursor(context.WithoutCancel(ctx), cursor) for cursor.Next(ctx) { if err := handler(cursor.Decode); err != nil { diff --git a/persistence/mongo/utils.go b/persistence/mongo/utils.go index 9843ab5..7427447 100644 --- a/persistence/mongo/utils.go +++ b/persistence/mongo/utils.go @@ -8,8 +8,8 @@ import ( ) // CloseCursor with defer -func CloseCursor(cursor *mongo.Cursor) { - if err := cursor.Close(context.Background()); err != nil { +func CloseCursor(ctx context.Context, cursor *mongo.Cursor) { + if err := cursor.Close(ctx); err != nil { log.WithError(nil, err).Error("failed to close cursor") } } diff --git a/server.go b/server.go index 738d7fc..551ee0c 100644 --- a/server.go +++ b/server.go @@ -233,11 +233,11 @@ func (s *Server) ShutdownCancel() context.CancelFunc { } // AddService add a single service -func (s *Server) AddService(service Service) { - if !slices.Contains(s.services, service) { - s.services = append(s.services, service) - s.AddAlwaysHealthzers(service) - s.AddCloser(service) +func (s *Server) AddService(v Service) { + if !slices.Contains(s.services, v) { + s.services = append(s.services, v) + s.AddAlwaysHealthzers(v) + s.AddCloser(v) } } diff --git a/server_test.go b/server_test.go index d90ff9c..d03a2ca 100644 --- a/server_test.go +++ b/server_test.go @@ -11,7 +11,6 @@ import ( "time" "github.com/foomo/keel/service" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/suite" "go.uber.org/goleak" "go.uber.org/zap" @@ -102,7 +101,7 @@ func (s *KeelTestSuite) TestServiceHTTPZap() { s.Run("default", func() { if statusCode, body, err := s.httpGet("http://localhost:9100/log"); s.NoError(err) { s.Equal(http.StatusOK, statusCode) - s.Equal(body, `{"level":"info","disableCaller":true,"disableStacktrace":true}`) + s.Equal(`{"level":"info","disableCaller":true,"disableStacktrace":true}`, body) } if statusCode, _, err := s.httpGet("http://localhost:55000/log/info"); s.NoError(err) { s.Equal(http.StatusOK, statusCode) @@ -115,7 +114,7 @@ func (s *KeelTestSuite) TestServiceHTTPZap() { s.Run("set debug level", func() { if statusCode, body, err := s.httpPut("http://localhost:9100/log", `{"level":"debug"}`); s.NoError(err) { s.Equal(http.StatusOK, statusCode) - s.Equal(body, `{"level":"debug","disableCaller":true,"disableStacktrace":true}`) + s.Equal(`{"level":"debug","disableCaller":true,"disableStacktrace":true}`, body) } if statusCode, _, err := s.httpGet("http://localhost:55000/log/info"); s.NoError(err) { s.Equal(http.StatusOK, statusCode) @@ -128,7 +127,7 @@ func (s *KeelTestSuite) TestServiceHTTPZap() { s.Run("enable caller", func() { if statusCode, body, err := s.httpPut("http://localhost:9100/log", `{"disableCaller":false}`); s.NoError(err) { s.Equal(http.StatusOK, statusCode) - s.Equal(body, `{"level":"debug","disableCaller":false,"disableStacktrace":true}`) + s.Equal(`{"level":"debug","disableCaller":false,"disableStacktrace":true}`, body) } if statusCode, _, err := s.httpGet("http://localhost:55000/log/error"); s.NoError(err) { s.Equal(http.StatusOK, statusCode) @@ -138,7 +137,7 @@ func (s *KeelTestSuite) TestServiceHTTPZap() { s.Run("enable stacktrace", func() { if statusCode, body, err := s.httpPut("http://localhost:9100/log", `{"disableStacktrace":false}`); s.NoError(err) { s.Equal(http.StatusOK, statusCode) - s.Equal(body, `{"level":"debug","disableCaller":false,"disableStacktrace":false}`) + s.Equal(`{"level":"debug","disableCaller":false,"disableStacktrace":false}`, body) } if statusCode, _, err := s.httpGet("http://localhost:55000/log/error"); s.NoError(err) { s.Equal(http.StatusOK, statusCode) @@ -179,7 +178,7 @@ func (s *KeelTestSuite) TestGraceful() { go func(waitChan chan string) { waitChan <- "ok" time.Sleep(time.Second) - if assert.NoError(s.T(), syscall.Kill(syscall.Getpid(), syscall.SIGINT)) { + if s.NoError(syscall.Kill(syscall.Getpid(), syscall.SIGINT)) { s.l.Info("killed myself") } }(waitChan) @@ -190,7 +189,7 @@ func (s *KeelTestSuite) TestGraceful() { { // check that server is down _, _, err := s.httpGet("http://localhost:55000/ok") - s.Error(err) + s.Require().Error(err) } s.l.Info("done") diff --git a/service/httpreadme_test.go b/service/httpreadme_test.go index 45b388d..a9cd65a 100644 --- a/service/httpreadme_test.go +++ b/service/httpreadme_test.go @@ -18,7 +18,7 @@ import ( "go.uber.org/zap" ) -func _ExampleNewHTTPReadme() { +func _ExampleNewHTTPReadme() { //nolint:unused // define vars so it does not panic _ = os.Setenv("EXAMPLE_REQUIRED_BOOL", "true") _ = os.Setenv("EXAMPLE_REQUIRED_STRING", "foo") diff --git a/serviceenabler.go b/serviceenabler.go index bfcdccc..19f38c3 100644 --- a/serviceenabler.go +++ b/serviceenabler.go @@ -40,10 +40,10 @@ func (w *ServiceEnabler) Name() string { } func (w *ServiceEnabler) Start(ctx context.Context) error { - w.watch() + w.watch(w.ctx) //nolint:contextcheck w.ctx = ctx if w.enabled() { - if err := w.enable(w.ctx); err != nil { + if err := w.enable(w.ctx); err != nil { //nolint:contextcheck return err } } else { @@ -56,7 +56,7 @@ func (w *ServiceEnabler) Close(ctx context.Context) error { l := log.WithServiceName(w.l, w.Name()) w.setClosed(true) if w.enabled() { - if err := w.disable(w.ctx); err != nil { + if err := w.disable(w.ctx); err != nil { //nolint:contextcheck return err } } else { @@ -102,7 +102,7 @@ func (w *ServiceEnabler) disable(ctx context.Context) error { return w.service.Close(ctx) } -func (w *ServiceEnabler) watch() { +func (w *ServiceEnabler) watch(ctx context.Context) { go func() { for { if w.closed() { @@ -112,12 +112,12 @@ func (w *ServiceEnabler) watch() { if value := w.enabledFn(); value != w.enabled() { if value { go func() { - if err := w.enable(w.ctx); err != nil { + if err := w.enable(ctx); err != nil { w.l.Fatal("failed to dynamically start service", log.FError(err)) } }() } else { - if err := w.disable(context.TODO()); err != nil { + if err := w.disable(context.TODO()); err != nil { //nolint:contextcheck w.l.Fatal("failed to dynamically close service", log.FError(err)) } } diff --git a/telemetry/meter.go b/telemetry/meter.go index 287dd9c..31eb9e8 100644 --- a/telemetry/meter.go +++ b/telemetry/meter.go @@ -3,7 +3,6 @@ package telemetry import ( "context" "encoding/json" - "log" "os" "github.com/foomo/keel/env" @@ -44,7 +43,7 @@ func NewStdOutMeterProvider(ctx context.Context, opts ...stdoutmetric.Option) (m exporter, err := stdoutmetric.New(opts...) if err != nil { - log.Fatalf("creating stdoutmetric exporter: %v", err) + return nil, err } resource := otelresource.NewSchemaless( From 2038db357009cc44928bffd70489a57523edc445 Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Tue, 16 Apr 2024 09:52:14 +0200 Subject: [PATCH 127/134] revert: remove goleak --- go.mod | 1 - keeltest/inline_test.go | 3 --- server_test.go | 5 +---- 3 files changed, 1 insertion(+), 8 deletions(-) diff --git a/go.mod b/go.mod index eb91f01..be7a9dc 100644 --- a/go.mod +++ b/go.mod @@ -38,7 +38,6 @@ require ( go.temporal.io/api v1.8.0 go.temporal.io/sdk v1.15.0 go.temporal.io/sdk/contrib/opentelemetry v0.1.0 - go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 golang.org/x/crypto v0.22.0 golang.org/x/sync v0.7.0 diff --git a/keeltest/inline_test.go b/keeltest/inline_test.go index c492dc4..2907c02 100644 --- a/keeltest/inline_test.go +++ b/keeltest/inline_test.go @@ -5,12 +5,9 @@ import ( "github.com/foomo/keel/keeltest" "github.com/stretchr/testify/assert" - "go.uber.org/goleak" ) func TestInline(t *testing.T) { - defer goleak.VerifyNone(t) - t.Run("read inline", func(t *testing.T) { value, ok := keeltest.Inline(t, 1) // INLINE: hello world assert.True(t, ok) diff --git a/server_test.go b/server_test.go index d03a2ca..0499cac 100644 --- a/server_test.go +++ b/server_test.go @@ -12,7 +12,6 @@ import ( "github.com/foomo/keel/service" "github.com/stretchr/testify/suite" - "go.uber.org/goleak" "go.uber.org/zap" "go.uber.org/zap/zaptest" @@ -74,9 +73,7 @@ func (s *KeelTestSuite) AfterTest(suiteName, testName string) { } // TearDownSuite hook -func (s *KeelTestSuite) TearDownSuite() { - goleak.VerifyNone(s.T()) -} +func (s *KeelTestSuite) TearDownSuite() {} func (s *KeelTestSuite) TestServiceHTTP() { s.svr.AddServices( From c6734a4cf6592e2e7042aea312c32b99f23047d3 Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Wed, 17 Apr 2024 09:55:52 +0200 Subject: [PATCH 128/134] feat: add keel attr --- net/http/middleware/telemetry.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/net/http/middleware/telemetry.go b/net/http/middleware/telemetry.go index b643893..cfe7f3b 100644 --- a/net/http/middleware/telemetry.go +++ b/net/http/middleware/telemetry.go @@ -76,6 +76,13 @@ func TelemetryWithOptions(opts TelemetryOptions) Middleware { otel.GetTextMapPropagator().Inject(r.Context(), propagation.HeaderCarrier(w.Header())) } + if labeler, ok := otelhttp.LabelerFromContext(r.Context()); ok { + labeler.Add( + log.KeelServiceTypeKey.String("http"), + log.KeelServiceNameKey.String(name), + ) + } + if labeler, ok := httplog.LabelerFromRequest(r); ok { if spanCtx := trace.SpanContextFromContext(r.Context()); spanCtx.IsValid() && spanCtx.IsSampled() { labeler.Add(log.FTraceID(spanCtx.TraceID().String())) From 3fd13ec4f639426e3a87fe94c6a93833c0111595 Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Wed, 17 Apr 2024 10:22:23 +0200 Subject: [PATCH 129/134] revert: use server name for backward compatibility --- net/http/middleware/telemetry.go | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/net/http/middleware/telemetry.go b/net/http/middleware/telemetry.go index cfe7f3b..a48ffdb 100644 --- a/net/http/middleware/telemetry.go +++ b/net/http/middleware/telemetry.go @@ -9,6 +9,7 @@ import ( "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/propagation" + semconv "go.opentelemetry.io/otel/semconv/v1.12.0" "go.opentelemetry.io/otel/trace" "go.uber.org/zap" ) @@ -77,10 +78,7 @@ func TelemetryWithOptions(opts TelemetryOptions) Middleware { } if labeler, ok := otelhttp.LabelerFromContext(r.Context()); ok { - labeler.Add( - log.KeelServiceTypeKey.String("http"), - log.KeelServiceNameKey.String(name), - ) + labeler.Add(semconv.HTTPServerNameKey.String(name)) } if labeler, ok := httplog.LabelerFromRequest(r); ok { From 9d38e438ce9d374530d9aea02d7ec261ed477af6 Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Tue, 30 Apr 2024 10:00:04 +0200 Subject: [PATCH 130/134] feat: bump deps --- go.mod | 42 ++++++++++++++-------------- go.sum | 86 +++++++++++++++++++++++++++++----------------------------- 2 files changed, 64 insertions(+), 64 deletions(-) diff --git a/go.mod b/go.mod index be7a9dc..640a8a3 100644 --- a/go.mod +++ b/go.mod @@ -21,20 +21,20 @@ require ( github.com/tidwall/pretty v1.2.1 github.com/tinylib/msgp v1.1.9 go.mongodb.org/mongo-driver v1.15.0 - go.opentelemetry.io/contrib/instrumentation/go.mongodb.org/mongo-driver/mongo/otelmongo v0.50.0 - go.opentelemetry.io/contrib/instrumentation/host v0.50.0 - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.50.0 - go.opentelemetry.io/contrib/instrumentation/runtime v0.50.0 - go.opentelemetry.io/otel v1.25.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.25.0 - go.opentelemetry.io/otel/exporters/prometheus v0.47.0 - go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.25.0 - go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.25.0 - go.opentelemetry.io/otel/metric v1.25.0 - go.opentelemetry.io/otel/sdk v1.25.0 - go.opentelemetry.io/otel/sdk/metric v1.25.0 - go.opentelemetry.io/otel/trace v1.25.0 + go.opentelemetry.io/contrib/instrumentation/go.mongodb.org/mongo-driver/mongo/otelmongo v0.51.0 + go.opentelemetry.io/contrib/instrumentation/host v0.51.0 + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.51.0 + go.opentelemetry.io/contrib/instrumentation/runtime v0.51.0 + go.opentelemetry.io/otel v1.26.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.26.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.26.0 + go.opentelemetry.io/otel/exporters/prometheus v0.48.0 + go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.26.0 + go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.26.0 + go.opentelemetry.io/otel/metric v1.26.0 + go.opentelemetry.io/otel/sdk v1.26.0 + go.opentelemetry.io/otel/sdk/metric v1.26.0 + go.opentelemetry.io/otel/trace v1.26.0 go.temporal.io/api v1.8.0 go.temporal.io/sdk v1.15.0 go.temporal.io/sdk/contrib/opentelemetry v0.1.0 @@ -72,7 +72,7 @@ require ( github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect github.com/googleapis/gax-go/v2 v2.12.0 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 // indirect github.com/hashicorp/consul/api v1.25.1 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-hclog v1.5.0 // indirect @@ -106,7 +106,7 @@ require ( github.com/sagikazarmark/crypt v0.17.0 // indirect github.com/sagikazarmark/locafero v0.4.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect - github.com/shirou/gopsutil/v3 v3.24.2 // indirect + github.com/shirou/gopsutil/v3 v3.24.3 // indirect github.com/shoenig/go-m1cpu v0.1.6 // indirect github.com/sourcegraph/conc v0.3.0 // indirect github.com/spf13/afero v1.11.0 // indirect @@ -128,11 +128,11 @@ require ( go.etcd.io/etcd/client/v3 v3.5.10 // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.47.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0 // indirect - go.opentelemetry.io/proto/otlp v1.1.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.26.0 // indirect + go.opentelemetry.io/proto/otlp v1.2.0 // indirect go.uber.org/atomic v1.9.0 // indirect go.uber.org/multierr v1.10.0 // indirect - golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect + golang.org/x/exp v0.0.0-20231127185646-65229373498e // indirect golang.org/x/mod v0.16.0 // indirect golang.org/x/net v0.23.0 // indirect golang.org/x/oauth2 v0.17.0 // indirect @@ -143,9 +143,9 @@ require ( google.golang.org/api v0.162.0 // indirect google.golang.org/appengine v1.6.8 // indirect google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240304212257-790db918fca8 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda // indirect - google.golang.org/grpc v1.63.0 // indirect + google.golang.org/grpc v1.63.2 // indirect google.golang.org/protobuf v1.33.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/go.sum b/go.sum index ad90fb6..3c24ad7 100644 --- a/go.sum +++ b/go.sum @@ -164,8 +164,8 @@ github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qK github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 h1:Wqo399gCIufwto+VfwCSvsnfGpF/w5E9CNxSwbpD6No= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0/go.mod h1:qmOFXW2epJhM0qSnUUYpldc7gVz2KMQwJ/QYCDIa7XU= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 h1:/c3QmbOGMGTOumP2iT/rCwB7b0QDGLKzqOmktBjT+Is= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1/go.mod h1:5SN9VR2LTsRFsrEC6FHgRbTWrTHu6tqPeKxEQv15giM= github.com/hashicorp/consul/api v1.25.1 h1:CqrdhYzc8XZuPnhIYZWH45toM0LB9ZeYr/gvpLVI3PE= github.com/hashicorp/consul/api v1.25.1/go.mod h1:iiLVwR/htV7mas/sy0O+XSuEnrdBUUydemjxcUrAt4g= github.com/hashicorp/consul/sdk v0.14.1 h1:ZiwE2bKb+zro68sWzZ1SgHF3kRMBZ94TwOCFRF4ylPs= @@ -335,8 +335,8 @@ github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6g github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/shirou/gopsutil/v3 v3.24.2 h1:kcR0erMbLg5/3LcInpw0X/rrPSqq4CDPyI6A6ZRC18Y= -github.com/shirou/gopsutil/v3 v3.24.2/go.mod h1:tSg/594BcA+8UdQU2XcW803GWYgdtauFFPgJCJKZlVk= +github.com/shirou/gopsutil/v3 v3.24.3 h1:eoUGJSmdfLzJ3mxIhmOAhgKEKgQkeOwKpz1NbhVnuPE= +github.com/shirou/gopsutil/v3 v3.24.3/go.mod h1:JpND7O217xa72ewWz9zN2eIIkPWsDN/3pl0H8Qt0uwg= github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= @@ -415,44 +415,44 @@ go.mongodb.org/mongo-driver v1.15.0 h1:rJCKC8eEliewXjZGf0ddURtl7tTVy1TK3bfl0gkUS go.mongodb.org/mongo-driver v1.15.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c= 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/go.mongodb.org/mongo-driver/mongo/otelmongo v0.50.0 h1:pN+CPCIXka5rg0d91Hc8orzpVafqban7HQXRFU59pco= -go.opentelemetry.io/contrib/instrumentation/go.mongodb.org/mongo-driver/mongo/otelmongo v0.50.0/go.mod h1:X1YwMghrQggm0d12RfxefDAGBS8fYstCmKNGlDIxDy4= +go.opentelemetry.io/contrib/instrumentation/go.mongodb.org/mongo-driver/mongo/otelmongo v0.51.0 h1:FUwEjB8vjAYc3UFehdZZWevjgO018fpjuFPdYLIXk8U= +go.opentelemetry.io/contrib/instrumentation/go.mongodb.org/mongo-driver/mongo/otelmongo v0.51.0/go.mod h1:am6Je3ZASbWJUPXWZrKB0gwnP0Y2sfAnURRwIxM3IQ0= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.47.0 h1:UNQQKPfTDe1J81ViolILjTKPr9WetKW6uei2hFgJmFs= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.47.0/go.mod h1:r9vWsPS/3AQItv3OSlEJ/E4mbrhUbbw18meOjArPtKQ= -go.opentelemetry.io/contrib/instrumentation/host v0.50.0 h1:yKknCHYNj2pks9t6uijR+g7tQ/yfSwlZnY8BM0wq92E= -go.opentelemetry.io/contrib/instrumentation/host v0.50.0/go.mod h1:u3JyxgMGuT1Lp8g0j3pmWsVXA9KTX3OFrRqLH3hyoME= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.50.0 h1:cEPbyTSEHlQR89XVlyo78gqluF8Y3oMeBkXGWzQsfXY= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.50.0/go.mod h1:DKdbWcT4GH1D0Y3Sqt/PFXt2naRKDWtU+eE6oLdFNA8= -go.opentelemetry.io/contrib/instrumentation/runtime v0.50.0 h1:6dck47miguAOny5MeqX1G8idd+HpzDFt86U33d7aW2I= -go.opentelemetry.io/contrib/instrumentation/runtime v0.50.0/go.mod h1:rdPhRwNd2sHiRmwJAGs8xcwitqmP/j8pvl9X5jloYjU= +go.opentelemetry.io/contrib/instrumentation/host v0.51.0 h1:QljwOKW6+mdod9+lK5SzhPzGtB8XQcLNGddK/wYlMI4= +go.opentelemetry.io/contrib/instrumentation/host v0.51.0/go.mod h1:wYX18WtmQZ45RNcpd0d9uLvjGOd7I2dOoQ4h4LvoVD8= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.51.0 h1:Xs2Ncz0gNihqu9iosIZ5SkBbWo5T8JhhLJFMQL1qmLI= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.51.0/go.mod h1:vy+2G/6NvVMpwGX/NyLqcC41fxepnuKHk16E6IZUcJc= +go.opentelemetry.io/contrib/instrumentation/runtime v0.51.0 h1:1tBjncp/Rr5iuV0WfdKGGynrzIJ8bMm5z7Zl6jMjfIE= +go.opentelemetry.io/contrib/instrumentation/runtime v0.51.0/go.mod h1:6MqTuVXkhmzrIc7SFHYVTo7N6OFvVpDH5eq5xXKpAZQ= go.opentelemetry.io/otel v1.2.0/go.mod h1:aT17Fk0Z1Nor9e0uisf98LrntPGMnk4frBO9+dkf69I= -go.opentelemetry.io/otel v1.25.0 h1:gldB5FfhRl7OJQbUHt/8s0a7cE8fbsPAtdpRaApKy4k= -go.opentelemetry.io/otel v1.25.0/go.mod h1:Wa2ds5NOXEMkCmUou1WA7ZBfLTHWIsp034OVD7AO+Vg= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0 h1:dT33yIHtmsqpixFsSQPwNeY5drM9wTcoL8h0FWF4oGM= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0/go.mod h1:h95q0LBGh7hlAC08X2DhSeyIG02YQ0UyioTCVAqRPmc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0 h1:vOL89uRfOCCNIjkisd0r7SEdJF3ZJFyCNY34fdZs8eU= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0/go.mod h1:8GlBGcDk8KKi7n+2S4BT/CPZQYH3erLu0/k64r1MYgo= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.25.0 h1:Mbi5PKN7u322woPa85d7ebZ+SOvEoPvoiBu+ryHWgfA= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.25.0/go.mod h1:e7ciERRhZaOZXVjx5MiL8TK5+Xv7G5Gv5PA2ZDEJdL8= -go.opentelemetry.io/otel/exporters/prometheus v0.47.0 h1:OL6yk1Z/pEGdDnrBbxSsH+t4FY1zXfBRGd7bjwhlMLU= -go.opentelemetry.io/otel/exporters/prometheus v0.47.0/go.mod h1:xF3N4OSICZDVbbYZydz9MHFro1RjmkPUKEvar2utG+Q= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.25.0 h1:d7nHbdzU84STOiszaOxQ3kw5IwkSmHsU5Muol5/vL4I= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.25.0/go.mod h1:yiPA1iZbb/EHYnODXOxvtKuB0I2hV8ehfLTEWpl7BJU= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.25.0 h1:0vZZdECYzhTt9MKQZ5qQ0V+J3MFu4MQaQ3COfugF+FQ= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.25.0/go.mod h1:e7iXx3HjaSSBXfy9ykVUlupS2Vp7LBIBuT21ousM2Hk= -go.opentelemetry.io/otel/metric v1.25.0 h1:LUKbS7ArpFL/I2jJHdJcqMGxkRdxpPHE0VU/D4NuEwA= -go.opentelemetry.io/otel/metric v1.25.0/go.mod h1:rkDLUSd2lC5lq2dFNrX9LGAbINP5B7WBkC78RXCpH5s= +go.opentelemetry.io/otel v1.26.0 h1:LQwgL5s/1W7YiiRwxf03QGnWLb2HW4pLiAhaA5cZXBs= +go.opentelemetry.io/otel v1.26.0/go.mod h1:UmLkJHUAidDval2EICqBMbnAd0/m2vmpf/dAM+fvFs4= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.26.0 h1:1u/AyyOqAWzy+SkPxDpahCNZParHV8Vid1RnI2clyDE= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.26.0/go.mod h1:z46paqbJ9l7c9fIPCXTqTGwhQZ5XoTIsfeFYWboizjs= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.26.0 h1:Waw9Wfpo/IXzOI8bCB7DIk+0JZcqqsyn1JFnAc+iam8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.26.0/go.mod h1:wnJIG4fOqyynOnnQF/eQb4/16VlX2EJAHhHgqIqWfAo= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.26.0 h1:1wp/gyxsuYtuE/JFxsQRtcCDtMrO2qMvlfXALU5wkzI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.26.0/go.mod h1:gbTHmghkGgqxMomVQQMur1Nba4M0MQ8AYThXDUjsJ38= +go.opentelemetry.io/otel/exporters/prometheus v0.48.0 h1:sBQe3VNGUjY9IKWQC6z2lNqa5iGbDSxhs60ABwK4y0s= +go.opentelemetry.io/otel/exporters/prometheus v0.48.0/go.mod h1:DtrbMzoZWwQHyrQmCfLam5DZbnmorsGbOtTbYHycU5o= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.26.0 h1:5fnmgteaar1VcAA69huatudPduNFz7guRtCmfZCooZI= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.26.0/go.mod h1:lsPccfZiz1cb1AhBPmicWM2E4F1VynFXEvD8SEBS4TM= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.26.0 h1:0W5o9SzoR15ocYHEQfvfipzcNog1lBxOLfnex91Hk6s= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.26.0/go.mod h1:zVZ8nz+VSggWmnh6tTsJqXQ7rU4xLwRtna1M4x5jq58= +go.opentelemetry.io/otel/metric v1.26.0 h1:7S39CLuY5Jgg9CrnA9HHiEjGMF/X2VHvoXGgSllRz30= +go.opentelemetry.io/otel/metric v1.26.0/go.mod h1:SY+rHOI4cEawI9a7N1A4nIg/nTQXe1ccCNWYOJUrpX4= go.opentelemetry.io/otel/sdk v1.2.0/go.mod h1:jNN8QtpvbsKhgaC6V5lHiejMoKD+V8uadoSafgHPx1U= -go.opentelemetry.io/otel/sdk v1.25.0 h1:PDryEJPC8YJZQSyLY5eqLeafHtG+X7FWnf3aXMtxbqo= -go.opentelemetry.io/otel/sdk v1.25.0/go.mod h1:oFgzCM2zdsxKzz6zwpTZYLLQsFwc+K0daArPdIhuxkw= -go.opentelemetry.io/otel/sdk/metric v1.25.0 h1:7CiHOy08LbrxMAp4vWpbiPcklunUshVpAvGBrdDRlGw= -go.opentelemetry.io/otel/sdk/metric v1.25.0/go.mod h1:LzwoKptdbBBdYfvtGCzGwk6GWMA3aUzBOwtQpR6Nz7o= +go.opentelemetry.io/otel/sdk v1.26.0 h1:Y7bumHf5tAiDlRYFmGqetNcLaVUZmh4iYfmGxtmz7F8= +go.opentelemetry.io/otel/sdk v1.26.0/go.mod h1:0p8MXpqLeJ0pzcszQQN4F0S5FVjBLgypeGSngLsmirs= +go.opentelemetry.io/otel/sdk/metric v1.26.0 h1:cWSks5tfriHPdWFnl+qpX3P681aAYqlZHcAyHw5aU9Y= +go.opentelemetry.io/otel/sdk/metric v1.26.0/go.mod h1:ClMFFknnThJCksebJwz7KIyEDHO+nTB6gK8obLy8RyE= go.opentelemetry.io/otel/trace v1.2.0/go.mod h1:N5FLswTubnxKxOJHM7XZC074qpeEdLy3CgAVsdMucK0= -go.opentelemetry.io/otel/trace v1.25.0 h1:tqukZGLwQYRIFtSQM2u2+yfMVTgGVeqRLPUYx1Dq6RM= -go.opentelemetry.io/otel/trace v1.25.0/go.mod h1:hCCs70XM/ljO+BeQkyFnbK28SBIJ/Emuha+ccrCRT7I= +go.opentelemetry.io/otel/trace v1.26.0 h1:1ieeAUb4y0TE26jUFrCIXKpTuVK7uJGN9/Z/2LP5sQA= +go.opentelemetry.io/otel/trace v1.26.0/go.mod h1:4iDxvGDQuUkHve82hJJ8UqrwswHYsZuWCBllGV2U2y0= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.opentelemetry.io/proto/otlp v1.1.0 h1:2Di21piLrCqJ3U3eXGCTPHE9R8Nh+0uglSnOyxikMeI= -go.opentelemetry.io/proto/otlp v1.1.0/go.mod h1:GpBHCBWiqvVLDqmHZsoMM3C5ySeKTC7ej/RNTae6MdY= +go.opentelemetry.io/proto/otlp v1.2.0 h1:pVeZGk7nXDC9O2hncA6nHldxEjm6LByfA2aN8IOkz94= +go.opentelemetry.io/proto/otlp v1.2.0/go.mod h1:gGpR8txAl5M03pDhMC79G6SdqNV26naRm/KDsgaHD8A= go.temporal.io/api v1.5.0/go.mod h1:BqKxEJJYdxb5dqf0ODfzfMxh8UEQ5L3zKS51FiIYYkA= go.temporal.io/api v1.8.0 h1:FzAMmBeLs6BEMFyHeJ9M9GAv6McFuH/GjnliBCdQ/Zw= go.temporal.io/api v1.8.0/go.mod h1:7m1ZOVUFi/54a5IMzMeELnvDy5sJwRfz11zi3Jrww8w= @@ -481,8 +481,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= +golang.org/x/exp v0.0.0-20231127185646-65229373498e h1:Gvh4YaCaXNs6dKTlfgismwWZKyjVZXwOPfIyUaqU3No= +golang.org/x/exp v0.0.0-20231127185646-65229373498e/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= 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= @@ -570,7 +570,7 @@ golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -623,8 +623,8 @@ google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEc google.golang.org/genproto v0.0.0-20220602131408-e326c6e8e9c8/go.mod h1:yKyY4AMRwFiC8yMMNaMi+RkCnjZJt9LoWuvhXjMs+To= google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY= google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo= -google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de h1:jFNzHPIeuzhdRwVhbZdiym9q0ory/xY3sA+v2wPg8I0= -google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:5iCWqnniDlqZHrd3neWVTOwvh/v6s3232omMecelax8= +google.golang.org/genproto/googleapis/api v0.0.0-20240304212257-790db918fca8 h1:8eadJkXbwDEMNwcB5O0s5Y5eCfyuCLdvaiOIaGTrWmQ= +google.golang.org/genproto/googleapis/api v0.0.0-20240304212257-790db918fca8/go.mod h1:O1cOfN1Cy6QEYr7VxtjOyP5AdAuR0aJ/MYZaaof623Y= google.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda h1:LI5DOvAxUPMv/50agcLLoo+AdWc1irS9Rzz4vPuD1V4= google.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= @@ -639,8 +639,8 @@ google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAG google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.63.0 h1:WjKe+dnvABXyPJMD7KDNLxtoGk5tgk+YFWN6cBWjZE8= -google.golang.org/grpc v1.63.0/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA= +google.golang.org/grpc v1.63.2 h1:MUeiw1B2maTVZthpU5xvASfTh3LDbxHd6IJ6QQVU+xM= +google.golang.org/grpc v1.63.2/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA= 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= From d2893ace068d11f6ad88828ee1cb7bcfdbfe1a33 Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Fri, 28 Jun 2024 16:41:36 +0200 Subject: [PATCH 131/134] revert: read / write timeouts --- net/http/roundtripware/circuitbreaker_test.go | 17 ++++++------- service/http.go | 24 ++++++++++--------- 2 files changed, 20 insertions(+), 21 deletions(-) diff --git a/net/http/roundtripware/circuitbreaker_test.go b/net/http/roundtripware/circuitbreaker_test.go index 79ce7ec..36804b4 100644 --- a/net/http/roundtripware/circuitbreaker_test.go +++ b/net/http/roundtripware/circuitbreaker_test.go @@ -14,6 +14,7 @@ import ( keelhttp "github.com/foomo/keel/net/http" "github.com/foomo/keel/net/http/roundtripware" "github.com/sony/gobreaker" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.uber.org/zap/zaptest" ) @@ -138,11 +139,9 @@ func TestCircuitBreakerCopyBodies(t *testing.T) { // create http server with handler svr := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { data, err := io.ReadAll(r.Body) - require.NoError(t, err) - require.Equal(t, string(data), requestData) - _, err = w.Write([]byte(responseData)) - if err != nil { - panic(err) + if assert.NoError(t, err) && assert.Equal(t, string(data), requestData) { + _, err = w.Write([]byte(responseData)) + assert.NoError(t, err) } })) defer svr.Close() @@ -194,11 +193,9 @@ func TestCircuitBreakerReadFromNotCopiedBodies(t *testing.T) { // create http server with handler svr := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { data, err := io.ReadAll(r.Body) - require.NoError(t, err) - require.Equal(t, string(data), requestData) - _, err = w.Write([]byte(responseData)) - if err != nil { - panic(err) + if assert.NoError(t, err) && assert.Equal(t, string(data), requestData) { + _, err = w.Write([]byte(responseData)) + assert.NoError(t, err) } })) defer svr.Close() diff --git a/service/http.go b/service/http.go index 0e31523..5655467 100644 --- a/service/http.go +++ b/service/http.go @@ -18,10 +18,10 @@ import ( // HTTP struct type HTTP struct { - running atomic.Bool - server *http.Server - name string l *zap.Logger + name string + server *http.Server + running atomic.Bool } // ------------------------------------------------------------------------------------------------ @@ -39,16 +39,14 @@ func NewHTTP(l *zap.Logger, name, addr string, handler http.Handler, middlewares ) return &HTTP{ + l: l, + name: name, server: &http.Server{ - Addr: addr, - ErrorLog: zap.NewStdLog(l), - IdleTimeout: 5 * time.Second, - ReadTimeout: 5 * time.Second, - WriteTimeout: 5 * time.Second, - Handler: middleware.Compose(l, name, handler, middlewares...), + Addr: addr, + Handler: middleware.Compose(l, name, handler, middlewares...), + ErrorLog: zap.NewStdLog(l), + IdleTimeout: 30 * time.Second, }, - name: name, - l: l, } } @@ -60,6 +58,10 @@ func (s *HTTP) Name() string { return s.name } +func (s *HTTP) Server() *http.Server { + return s.server +} + // ------------------------------------------------------------------------------------------------ // ~ Public methods // ------------------------------------------------------------------------------------------------ From 04c4d559419ff6e4f326f0085a8aef28222e693a Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Fri, 28 Jun 2024 16:42:15 +0200 Subject: [PATCH 132/134] chore: disable deprecated linter --- .golangci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.golangci.yml b/.golangci.yml index c149ab6..661ecec 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -145,7 +145,6 @@ linters: - errchkjson # Checks types passed to the json encoding functions. Reports unsupported types and reports occations, where the check for the returned error can be omitted. [fast: false, auto-fix: false] - errname # Checks that sentinel errors are prefixed with the `Err` and error types are suffixed with the `Error`. [fast: false, auto-fix: false] - errorlint # errorlint is a linter for that can be used to find code that will cause problems with the error wrapping scheme introduced in Go 1.13. [fast: false, auto-fix: false] - - execinquery # execinquery is a linter about query string checker in Query function which reads your Go src files and warning it finds [fast: false, auto-fix: false] - exhaustive # check exhaustiveness of enum switch statements [fast: false, auto-fix: false] #- exhaustruct # Checks if all structure fields are initialized [fast: false, auto-fix: false] - exportloopref # checks for pointers to enclosing loop variables [fast: false, auto-fix: false] From 54f3b8af134d3510a7334ca674c4894a59763df2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 28 Jun 2024 14:54:07 +0000 Subject: [PATCH 133/134] chore(deps): bump goreleaser/goreleaser-action from 5 to 6 Bumps [goreleaser/goreleaser-action](https://github.com/goreleaser/goreleaser-action) from 5 to 6. - [Release notes](https://github.com/goreleaser/goreleaser-action/releases) - [Commits](https://github.com/goreleaser/goreleaser-action/compare/v5...v6) --- updated-dependencies: - dependency-name: goreleaser/goreleaser-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/tag.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tag.yml b/.github/workflows/tag.yml index a6595d2..8457a33 100644 --- a/.github/workflows/tag.yml +++ b/.github/workflows/tag.yml @@ -22,7 +22,7 @@ jobs: with: go-version-file: go.mod - - uses: goreleaser/goreleaser-action@v5 + - uses: goreleaser/goreleaser-action@v6 with: version: latest args: release --clean From 4dd2ed75cdb2191d146cc6bb45d30a13092ec369 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 28 Jun 2024 14:54:09 +0000 Subject: [PATCH 134/134] chore(deps): bump golangci/golangci-lint-action from 4 to 6 Bumps [golangci/golangci-lint-action](https://github.com/golangci/golangci-lint-action) from 4 to 6. - [Release notes](https://github.com/golangci/golangci-lint-action/releases) - [Commits](https://github.com/golangci/golangci-lint-action/compare/v4...v6) --- updated-dependencies: - dependency-name: golangci/golangci-lint-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/pr.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 0b1fedb..7cff415 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -25,7 +25,7 @@ jobs: with: token: ${{ secrets.GITHUB_TOKEN }} - - uses: golangci/golangci-lint-action@v4 + - uses: golangci/golangci-lint-action@v6 with: version: latest