Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

v2: Refactor metrics interceptor and fix tests #413

Merged
merged 1 commit into from
Apr 23, 2021

Conversation

ash2k
Copy link
Contributor

@ash2k ash2k commented Apr 21, 2021

I decided to have a look at the v2 branch as I'm interested in better Prometheus metrics. I found that stuff was in a very weird state so I tried to fix, simplify and clean it all up. See inline comments for some details. I have also found that tests fail and are not executed on macOS (#411).

Closes #412.

@google-cla
Copy link

google-cla bot commented Apr 21, 2021

Thanks for your pull request. It looks like this may be your first contribution to a Google open source project (if not, look below for help). Before we can look at your pull request, you'll need to sign a Contributor License Agreement (CLA).

📝 Please visit https://cla.developers.google.com/ to sign.

Once you've signed (or fixed any issues), please reply here with @googlebot I signed it! and we'll verify it.


What to do if you already signed the CLA

Individual signers
Corporate signers

ℹ️ Googlers: Go here for more info.

@codecov-commenter
Copy link

codecov-commenter commented Apr 21, 2021

Codecov Report

Merging #413 (3b0fd77) into v2 (a79558a) will decrease coverage by 27.52%.
The diff coverage is 38.77%.

❗ Current head 3b0fd77 differs from pull request most recent head 3bfba60. Consider uploading reports for the commit 3bfba60 to get more accurate results
Impacted file tree graph

@@             Coverage Diff             @@
##               v2     #413       +/-   ##
===========================================
- Coverage   83.58%   56.06%   -27.53%     
===========================================
  Files          30       38        +8     
  Lines         932     1336      +404     
===========================================
- Hits          779      749       -30     
- Misses        114      515      +401     
- Partials       39       72       +33     
Impacted Files Coverage Δ
chain.go 0.00% <ø> (-90.91%) ⬇️
interceptors/auth/auth.go 100.00% <ø> (ø)
interceptors/auth/metadata.go 100.00% <ø> (ø)
interceptors/ratelimit/ratelimit.go 50.00% <0.00%> (-50.00%) ⬇️
interceptors/tags/fieldextractor.go 13.79% <0.00%> (-71.51%) ⬇️
testing/testpb/interceptor_suite.go 0.00% <0.00%> (ø)
testing/testpb/test.manual_extractfields.pb.go 0.00% <0.00%> (ø)
testing/testpb/test.manual_validator.pb.go 0.00% <0.00%> (ø)
testing/testpb/test.pb.go 36.92% <36.92%> (ø)
interceptors/logging/payload.go 67.18% <42.30%> (-15.43%) ⬇️
... and 49 more

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 0df73fc...3bfba60. Read the comment docs.

@ash2k
Copy link
Contributor Author

ash2k commented Apr 21, 2021

@googlebot I signed it!

interceptors/client.go Show resolved Hide resolved
@@ -50,7 +50,7 @@ func (m *mockReportable) Equal(t *testing.T, expected []*mockReport) {
require.NoError(t, err)
continue
}
require.Equal(t, expected[i].postCalls[k].Error(), err.Error(), "%v %v", i, k)
require.EqualError(t, err, expected[i].postCalls[k].Error(), "%v %v", i, k)
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If there is a bug and err is nil, then this line panics. Now it does not and fails the test cleanly.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍🏽 Thanks a lot

@@ -276,7 +276,7 @@ func (s *ClientInterceptorTestSuite) TestListReporting() {
typ: ServerStream,
svcName: testpb.TestServiceFullName,
methodName: "PingList",
postCalls: []error{io.EOF},
postCalls: []error{nil},
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Because of the change in interceptors/client.go, it's called with nil now.

@@ -329,7 +329,9 @@ func (s *ClientInterceptorTestSuite) TestBiStreamingReporting() {
if err == io.EOF {
break
}
require.NoError(s.T(), err, "reading pingStream shouldn't fail")
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is incorrect to use require in a goroutine other than the main test goroutine.

@@ -340,12 +342,12 @@ func (s *ClientInterceptorTestSuite) TestBiStreamingReporting() {
require.NoError(s.T(), ss.CloseSend())
wg.Wait()

require.EqualValues(s.T(), count, 100, "Number of received msg on the wire must match")
require.EqualValues(s.T(), 100, count, "Number of received msg on the wire must match")
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Put actual and expected values where they should be.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wow, thanks for those detailed comments (: Next time, no need for this it's very clear! 💪🏽

@@ -11,3 +11,5 @@ require (
google.golang.org/grpc v1.35.0
google.golang.org/protobuf v1.25.0
)

replace github.com/grpc-ecosystem/go-grpc-middleware/v2 => ../..
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure how to test it otherwise if changes are made to the outer module and to providers.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it'll have to be merged in two steps.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If this PR is approved I can split it into two - one updating the base and another one updating the provider. I also have a few more things I'd like to cleanup in follow ups.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds good to me, will give @bwplotka a few days to have a look but I'm otherwise happy to merge this on our own.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yup, this is the problem with multi-modules.

One thing we could add is to add some tooling that e.g makes commit with this PR on your fork, then creates commit on top of it, so it's at least not broken on master, if you just pull openmetrics module. Local path approach can break users on main. It's fine for now (dev part of v2) but we might want to improve this process. LGTM for now

}

func (rep *reportable) ServerReporter(ctx context.Context, _ interface{}, typ interceptors.GRPCType, service string, method string) (interceptors.Reporter, context.Context) {
m := NewServerMetrics(rep.registry)
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is super weird. So we're creating a new metrics holder here, we do not register it anywhere and just use it as is. This is just broken - there is no way these metrics are going to be scraped.

@@ -1,35 +1,21 @@
package metrics
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Server metrics and interceptor are refactored in the same way as client metrics and interceptor. All comments apply, not repeating them.

resp := httptest.NewRecorder()
req, err := http.NewRequest("GET", "/", nil)
require.NoError(t, err, "failed creating request for Prometheus handler")

promhttp.Handler().ServeHTTP(resp, req)
promhttp.HandlerFor(reg, promhttp.HandlerOpts{}).ServeHTTP(resp, req)
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use the explicitly passed registry here rather than a global one. Test should be self-contained and hermetic, it shouldn't depend on globals.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree, thanks for this

@@ -292,6 +293,7 @@ func toFloat64HistCount(h prometheus.Observer) uint64 {
}

func requireValue(t *testing.T, expect int, c prometheus.Collector) {
t.Helper()
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That way error traces when a test fails lead to the line where this function was invoked, not into this function. Convenience thing, helped me to navigate failing tests.

Copy link
Collaborator

@johanbrandhorst johanbrandhorst left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks generally good to me, thanks for taking the time. I'll hold off on approving as this is @bwplotka's area of expertise.

interceptors/client.go Show resolved Hide resolved
requireValueHistCount(s.T(), 1, DefaultClientMetrics.clientHandledHistogram.WithLabelValues("unary", "mwitkow.testproto.TestService", "PingEmpty"))
requireValue(s.T(), 1, s.clientMetrics.clientStartedCounter.WithLabelValues("unary", "providers.openmetrics.testproto.v1.TestService", "PingEmpty"))
requireValue(s.T(), 1, s.clientMetrics.clientHandledCounter.WithLabelValues("unary", "providers.openmetrics.testproto.v1.TestService", "PingEmpty", "OK"))
requireValueHistCount(s.T(), 1, s.clientMetrics.clientHandledHistogram.WithLabelValues("unary", "providers.openmetrics.testproto.v1.TestService", "PingEmpty"))
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice find

@@ -11,3 +11,5 @@ require (
google.golang.org/grpc v1.35.0
google.golang.org/protobuf v1.25.0
)

replace github.com/grpc-ecosystem/go-grpc-middleware/v2 => ../..
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it'll have to be merged in two steps.

Copy link
Collaborator

@bwplotka bwplotka left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for this, LGTM

I agree that the openmetrics PR might have been prematurely merged.. Yet it was kind of stated to merge a bigger chunk of work for later to iterate... yet iteration never happened and the code on main was unusable. It's totally on me, sorry for not paying close attention during the review process. Cc @yashrsharma44 for learning too on this (:

image

Let's make sure to keep the quality bar much higher next time.

@@ -50,7 +50,7 @@ func (m *mockReportable) Equal(t *testing.T, expected []*mockReport) {
require.NoError(t, err)
continue
}
require.Equal(t, expected[i].postCalls[k].Error(), err.Error(), "%v %v", i, k)
require.EqualError(t, err, expected[i].postCalls[k].Error(), "%v %v", i, k)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍🏽 Thanks a lot

// UnaryClientInterceptor is a gRPC client-side interceptor that provides Prometheus monitoring for Unary RPCs.
func UnaryClientInterceptor(clientRegister openmetrics.Registerer) grpc.UnaryClientInterceptor {
func UnaryClientInterceptor(clientMetrics *ClientMetrics) grpc.UnaryClientInterceptor {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agree, cc @yashrsharma44 for learning experience (:

@@ -340,12 +342,12 @@ func (s *ClientInterceptorTestSuite) TestBiStreamingReporting() {
require.NoError(s.T(), ss.CloseSend())
wg.Wait()

require.EqualValues(s.T(), count, 100, "Number of received msg on the wire must match")
require.EqualValues(s.T(), 100, count, "Number of received msg on the wire must match")
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wow, thanks for those detailed comments (: Next time, no need for this it's very clear! 💪🏽

@@ -11,3 +11,5 @@ require (
google.golang.org/grpc v1.35.0
google.golang.org/protobuf v1.25.0
)

replace github.com/grpc-ecosystem/go-grpc-middleware/v2 => ../..
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yup, this is the problem with multi-modules.

One thing we could add is to add some tooling that e.g makes commit with this PR on your fork, then creates commit on top of it, so it's at least not broken on master, if you just pull openmetrics module. Local path approach can break users on main. It's fine for now (dev part of v2) but we might want to improve this process. LGTM for now

resp := httptest.NewRecorder()
req, err := http.NewRequest("GET", "/", nil)
require.NoError(t, err, "failed creating request for Prometheus handler")

promhttp.Handler().ServeHTTP(resp, req)
promhttp.HandlerFor(reg, promhttp.HandlerOpts{}).ServeHTTP(resp, req)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree, thanks for this

@bwplotka bwplotka merged commit f60016a into grpc-ecosystem:v2 Apr 23, 2021
@ash2k ash2k deleted the refactor-metrics branch April 23, 2021 22:59
@yashrsharma44
Copy link
Collaborator

Thanks, @ash2k for such great work!

I was the original author for introducing the changes for openmetrics and I agree that the changes were not suitable to be merged. Thanks for such a comprehensive review and this PR might be a good opportunity for me to write good Go code 😄

yurishkuro referenced this pull request in jaegertracing/jaeger Jun 13, 2024
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
|
[github.com/grpc-ecosystem/go-grpc-middleware](https://github.com/grpc-ecosystem/go-grpc-middleware)
| `v1.4.0` -> `v2.1.0` |
[![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fgrpc-ecosystem%2fgo-grpc-middleware/v2.1.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/go/github.com%2fgrpc-ecosystem%2fgo-grpc-middleware/v2.1.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/go/github.com%2fgrpc-ecosystem%2fgo-grpc-middleware/v1.4.0/v2.1.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fgrpc-ecosystem%2fgo-grpc-middleware/v1.4.0/v2.1.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>grpc-ecosystem/go-grpc-middleware
(github.com/grpc-ecosystem/go-grpc-middleware)</summary>

###
[`v2.1.0`](https://github.com/grpc-ecosystem/go-grpc-middleware/releases/tag/v2.1.0)

[Compare
Source](https://github.com/grpc-ecosystem/go-grpc-middleware/compare/v2.0.1...v2.1.0)

#### What's Changed

- Support for subsystem in grpc prometheus counter and histogram metrics
by [@&#8203;rohsaini](https://github.com/rohsaini) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/643](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/643)
- doc: update client interceptors chaining example with grpc functions
by [@&#8203;dethi](https://github.com/dethi) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/669](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/669)
- adds fields from durationFieldFunc to request/response log entries by
[@&#8203;vroldanbet](https://github.com/vroldanbet) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/670](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/670)
- add doc for disabling log opts by
[@&#8203;coleenquadros](https://github.com/coleenquadros) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/680](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/680)
- Middleware for determining the real ip of the client by
[@&#8203;MadsRC](https://github.com/MadsRC) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/682](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/682)
- protovalidate: add option to ignore certain message types by
[@&#8203;igor-tsiglyar](https://github.com/igor-tsiglyar) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/684](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/684)
- Update README.md by [@&#8203;zeroboo](https://github.com/zeroboo) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/688](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/688)
- Fix `InitializeMetrics` signature to allow use with `xds.GRPCServer`
by [@&#8203;bozaro](https://github.com/bozaro) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/689](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/689)
- Support retriable func condition by
[@&#8203;tamayika](https://github.com/tamayika) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/687](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/687)
- Extend realip parsing of GRPC peer address to handle IPv6 by
[@&#8203;surik](https://github.com/surik) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/692](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/692)
- Fix logging Example : log only first field by
[@&#8203;arckadious](https://github.com/arckadious) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/694](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/694)
- Extent realip interceptors with ip selection based on proxy count and
list by [@&#8203;surik](https://github.com/surik) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/695](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/695)
- Fix for vulnerability CVE-2023-44487 by
[@&#8203;vkaushik](https://github.com/vkaushik) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/696](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/696)

#### New Contributors

- [@&#8203;rohsaini](https://github.com/rohsaini) made their first
contribution in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/643](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/643)
- [@&#8203;dethi](https://github.com/dethi) made their first
contribution in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/669](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/669)
- [@&#8203;vroldanbet](https://github.com/vroldanbet) made their first
contribution in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/670](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/670)
- [@&#8203;MadsRC](https://github.com/MadsRC) made their first
contribution in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/682](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/682)
- [@&#8203;igor-tsiglyar](https://github.com/igor-tsiglyar) made their
first contribution in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/684](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/684)
- [@&#8203;zeroboo](https://github.com/zeroboo) made their first
contribution in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/688](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/688)
- [@&#8203;bozaro](https://github.com/bozaro) made their first
contribution in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/689](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/689)
- [@&#8203;tamayika](https://github.com/tamayika) made their first
contribution in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/687](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/687)
- [@&#8203;surik](https://github.com/surik) made their first
contribution in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/692](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/692)
- [@&#8203;arckadious](https://github.com/arckadious) made their first
contribution in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/694](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/694)
- [@&#8203;vkaushik](https://github.com/vkaushik) made their first
contribution in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/696](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/696)

**Full Changelog**:
grpc-ecosystem/go-grpc-middleware@v2.0.1...v2.1.0

###
[`v2.0.1`](https://github.com/grpc-ecosystem/go-grpc-middleware/releases/tag/v2.0.1)

[Compare
Source](https://github.com/grpc-ecosystem/go-grpc-middleware/compare/v2.0.0...v2.0.1)

#### What's Changed

- Fix outdated 'make proto' command by
[@&#8203;takp](https://github.com/takp) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/623](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/623)
- Fix linting errors by [@&#8203;takp](https://github.com/takp) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/624](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/624)
- Logging: Add missing variadic operator for fields by
[@&#8203;olivierlemasle](https://github.com/olivierlemasle) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/629](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/629)
- feat: Support extracting fields from CallMeta by
[@&#8203;fsaintjacques](https://github.com/fsaintjacques) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/628](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/628)
- Fix "make test" and "make lint" by
[@&#8203;olivierlemasle](https://github.com/olivierlemasle) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/627](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/627)
- Do not set timeout for stream initialization by
[@&#8203;DavyJohnes](https://github.com/DavyJohnes) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/645](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/645)
- Add logging option to disable fields in log entry by
[@&#8203;coleenquadros](https://github.com/coleenquadros) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/631](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/631)
- Update logging adapter docs by
[@&#8203;aboryslawski](https://github.com/aboryslawski) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/647](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/647)

#### New Contributors

- [@&#8203;takp](https://github.com/takp) made their first
contribution in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/623](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/623)
- [@&#8203;olivierlemasle](https://github.com/olivierlemasle) made
their first contribution in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/629](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/629)
- [@&#8203;fsaintjacques](https://github.com/fsaintjacques) made their
first contribution in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/628](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/628)
- [@&#8203;DavyJohnes](https://github.com/DavyJohnes) made their first
contribution in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/645](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/645)
- [@&#8203;coleenquadros](https://github.com/coleenquadros) made their
first contribution in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/631](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/631)
- [@&#8203;aboryslawski](https://github.com/aboryslawski) made their
first contribution in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/647](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/647)

**Full Changelog**:
grpc-ecosystem/go-grpc-middleware@v2.0.0...v2.0.1

###
[`v2.0.0`](https://github.com/grpc-ecosystem/go-grpc-middleware/releases/tag/v2.0.0)

[Compare
Source](https://github.com/grpc-ecosystem/go-grpc-middleware/compare/v1.4.0...v2.0.0)

This is the first stable release of the new v2 release branch 🎉

Many of the interceptors have been rewritten from scratch and the
project has been upgraded to use the Go Protobuf v2 API.

See the project README for details and migration guide. Thanks to all
contributors who made this possible! 💪🏽

#### What's Changed

- Initial change for v2. by
[@&#8203;bwplotka](https://github.com/bwplotka) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/276](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/276)
- Updated README with note that it's under development. by
[@&#8203;bwplotka](https://github.com/bwplotka) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/278](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/278)
- Fix typo in field extractor (splices -> slices)
([#&#8203;287](https://github.com/grpc-ecosystem/go-grpc-middleware/issues/287))
by [@&#8203;bvwells](https://github.com/bvwells) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/289](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/289)
- Moved imports to v2; Moved to Go 1.14.2 by
[@&#8203;bwplotka](https://github.com/bwplotka) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/290](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/290)
- Formatted code; Added goimports to Makefile, Renamed pb_testproto to
testpb. by [@&#8203;bwplotka](https://github.com/bwplotka) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/291](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/291)
- Fixed providers go modules, examples and consistency. by
[@&#8203;bwplotka](https://github.com/bwplotka) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/292](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/292)
- added example for AuthFuncOverride v2 branch by
[@&#8203;tegk](https://github.com/tegk) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/294](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/294)
- Added some description of the Makefile in the contributing.md by
[@&#8203;yashrsharma44](https://github.com/yashrsharma44) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/298](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/298)
- v2: Add support for the zerolog logging provider by
[@&#8203;irridia](https://github.com/irridia) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/299](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/299)
- proto: fix gogoproto import by
[@&#8203;johanbrandhorst](https://github.com/johanbrandhorst) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/302](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/302)
- Retry dial and connection errors for grpc stream. by
[@&#8203;kartlee](https://github.com/kartlee) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/308](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/308)
- Moved to GH actions; Added lint; Added issue/PR templates. by
[@&#8203;bwplotka](https://github.com/bwplotka) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/296](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/296)
- inline localhost certificate into go file by
[@&#8203;bmon](https://github.com/bmon) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/318](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/318)
- Update streaming interceptor example by
[@&#8203;G07cha](https://github.com/G07cha) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/322](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/322)
- Do not stop retrying based on earlier good message from the stream by
[@&#8203;kartlee](https://github.com/kartlee) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/323](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/323)
- test certs - cherry-pick PR325 on v2 by
[@&#8203;dmitris](https://github.com/dmitris) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/331](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/331)
- add all make target, reword instructions by
[@&#8203;dmitris](https://github.com/dmitris) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/335](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/335)
- remove 1.12.x from build config for consistency with master by
[@&#8203;dmitris](https://github.com/dmitris) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/337](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/337)
- \[v2] Fix the special case for jaeger format traceid extraction by
[@&#8203;nvx](https://github.com/nvx) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/340](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/340)
- \[v2] Fix ctxtags TagBasedRequestFieldExtractor extracting from fields
in a oneof by [@&#8203;nvx](https://github.com/nvx) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/339](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/339)
- Request Logging by
[@&#8203;yashrsharma44](https://github.com/yashrsharma44) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/311](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/311)
- Bug fix for data race by
[@&#8203;yashrsharma44](https://github.com/yashrsharma44) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/354](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/354)
- make ratelimit interface context aware by
[@&#8203;xinxiao](https://github.com/xinxiao) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/367](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/367)
- Add error param to the decider method of logging middleware by
[@&#8203;yashrsharma44](https://github.com/yashrsharma44) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/372](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/372)
- \[v2] Add skip interceptor by
[@&#8203;XSAM](https://github.com/XSAM) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/364](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/364)
- Chain middleware by
[@&#8203;drewwells](https://github.com/drewwells) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/385](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/385)
- Update travis ci badget to Github actions badge. by
[@&#8203;drewwells](https://github.com/drewwells) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/384](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/384)
- Upgraded proto related deps: grpc and protobuf; removed gogo from
core. by [@&#8203;bwplotka](https://github.com/bwplotka) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/321](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/321)
- improve v2 rate-limiter by
[@&#8203;MalloZup](https://github.com/MalloZup) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/380](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/380)
- Moved to buf; Added buf lint; Fixed ping service to match standards; …
by [@&#8203;bwplotka](https://github.com/bwplotka) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/383](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/383)
- Add timer interface for OpenMetrics(Prometheus) Provider by
[@&#8203;yashrsharma44](https://github.com/yashrsharma44) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/387](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/387)
- \[Rate-limit provider]: Add token bucket implementation of
rate-limiter by [@&#8203;MalloZup](https://github.com/MalloZup) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/386](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/386)
- Add OpenMetrics(Prometheus) in the provider module by
[@&#8203;yashrsharma44](https://github.com/yashrsharma44) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/379](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/379)
- v2: Client unary interceptor timeout on v2 branch by
[@&#8203;instabledesign](https://github.com/instabledesign) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/330](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/330)
- add onRetryCallback callback function by
[@&#8203;shamil](https://github.com/shamil) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/405](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/405)
- v2: validator support for protoc-gen-validate 0.6.0 by
[@&#8203;danielhochman](https://github.com/danielhochman) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/418](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/418)
- v2: Refactor metrics interceptor and fix tests by
[@&#8203;ash2k](https://github.com/ash2k) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/413](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/413)
- Support customization of timestamp format (v2 branch) by
[@&#8203;stanhu](https://github.com/stanhu) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/399](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/399)
- Fixed misleading comments in the interceptor file by
[@&#8203;iamrajiv](https://github.com/iamrajiv) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/424](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/424)
- v2: Switch from github.com/go-kit/kit to github.com/go-kit/log
interfaces by [@&#8203;liggitt](https://github.com/liggitt) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/427](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/427)
- v2: Add support for the phuslog logging provider by
[@&#8203;ogimenezb](https://github.com/ogimenezb) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/425](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/425)
- v2:providers/zap: fix caller annotation by
[@&#8203;jkawamoto](https://github.com/jkawamoto) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/432](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/432)
- Added Dependabot by [@&#8203;iamrajiv](https://github.com/iamrajiv)
in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/376](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/376)
- Added a Copyright check in the Makefile by
[@&#8203;yashrsharma44](https://github.com/yashrsharma44) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/420](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/420)
- Cleanup v2 with some updates by
[@&#8203;yashrsharma44](https://github.com/yashrsharma44) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/419](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/419)
- openmetrics: forward server context by
[@&#8203;amenzhinsky](https://github.com/amenzhinsky) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/434](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/434)
- recovery: change the default behavior by
[@&#8203;amenzhinsky](https://github.com/amenzhinsky) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/439](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/439)
- Add all-validator support by
[@&#8203;leventeliu](https://github.com/leventeliu) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/443](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/443)
- Remove backoffutils and added the files to retry package by
[@&#8203;yashrsharma44](https://github.com/yashrsharma44) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/390](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/390)
- v2:interceptors/logging: allow to separate request response payload
logging by [@&#8203;michaljemala](https://github.com/michaljemala) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/442](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/442)
- Removed tags; Simplified interceptor code; Added logging fields
editability. by [@&#8203;bwplotka](https://github.com/bwplotka) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/394](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/394)
- InterceptorTestSuite client connection optimize by
[@&#8203;HUSTtoKTH](https://github.com/HUSTtoKTH) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/455](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/455)
- Remove opentracing from go.mod by
[@&#8203;jpkrohling](https://github.com/jpkrohling) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/477](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/477)
- Replace two old Go versions with two new ones by
[@&#8203;jpkrohling](https://github.com/jpkrohling) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/478](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/478)
- Move util/metautils to root-level package metadata, fixes
[#&#8203;392](https://github.com/grpc-ecosystem/go-grpc-middleware/issues/392)
by [@&#8203;rahulkhairwar](https://github.com/rahulkhairwar) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/474](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/474)
- Remove data race from zerolog provider by
[@&#8203;ecordell](https://github.com/ecordell) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/487](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/487)
- Update provider/kit by
[@&#8203;metalmatze](https://github.com/metalmatze) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/490](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/490)
- Refactor tracing interceptor by
[@&#8203;XSAM](https://github.com/XSAM) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/450](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/450)
- Add opentracing provider by [@&#8203;XSAM](https://github.com/XSAM)
in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/492](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/492)
- update phuslog to fix typo by
[@&#8203;ogimenezb](https://github.com/ogimenezb) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/499](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/499)
- Added logr as logging Library provider by
[@&#8203;mcdoker18](https://github.com/mcdoker18) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/510](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/510)
- ✨ new feat: selector middleware by
[@&#8203;aimuz](https://github.com/aimuz) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/511](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/511)
- Add 1.18.x and 1.19.x unit tests by
[@&#8203;aimuz](https://github.com/aimuz) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/513](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/513)
- change the doc.go to the latest format by
[@&#8203;aimuz](https://github.com/aimuz) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/512](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/512)
- fix provider examples by
[@&#8203;forsaken628](https://github.com/forsaken628) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/529](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/529)
- docs: add `logging.InjectFields` usage description by
[@&#8203;aimuz](https://github.com/aimuz) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/541](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/541)
- Bump golang.org/x/net from 0.0.0-20201021035429-f5854403a974 to 0.7.0
by [@&#8203;dependabot](https://github.com/dependabot) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/537](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/537)
- v2: All for v2: Exemplars, Cleanup, Docs, Lint, Proto upgrades and
more by [@&#8203;bwplotka](https://github.com/bwplotka) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/543](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/543)
- \[interceptors/validator] feat: add error logging in validator by
[@&#8203;rohanraj7316](https://github.com/rohanraj7316) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/544](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/544)
- fix auto-generated docs by
[@&#8203;peczenyj](https://github.com/peczenyj) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/548](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/548)
- fix vulnerability GO-2022-0603 by
[@&#8203;peczenyj](https://github.com/peczenyj) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/549](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/549)
- add support to trace on grpc_logrus.DefaultMessageProducer by
[@&#8203;peczenyj](https://github.com/peczenyj) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/547](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/547)
- Simplified logging middleware; Fields are now "any" type; Moved
logging providers to examples only. by
[@&#8203;bwplotka](https://github.com/bwplotka) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/552](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/552)
- Removed deciders; Cleaned up validators. by
[@&#8203;bwplotka](https://github.com/bwplotka) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/554](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/554)
- Adjustments to README and consistency of callback options. by
[@&#8203;bwplotka](https://github.com/bwplotka) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/555](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/555)
- Merge v2 into main (with -X theirs) by
[@&#8203;bwplotka](https://github.com/bwplotka) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/556](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/556)
- Bump golang.org/x/net from 0.5.0 to 0.7.0 in /providers/prometheus by
[@&#8203;dependabot](https://github.com/dependabot) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/561](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/561)
- Fix overwritten logger in zerolog example by
[@&#8203;longshine](https://github.com/longshine) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/574](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/574)
- Changed for for mapping fields, different var for logger in zap
example by [@&#8203;MichalFikejs](https://github.com/MichalFikejs) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/581](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/581)
- cleanup: no cap definition required by
[@&#8203;aimuz](https://github.com/aimuz) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/582](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/582)
- providers/prometheus: Add WithHistogramOpts for native histograms by
[@&#8203;metalmatze](https://github.com/metalmatze) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/584](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/584)
- fix: Refactor logger initialization in example_test.go by
[@&#8203;aimuz](https://github.com/aimuz) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/580](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/580)
- Minor code cleanups by [@&#8203;ash2k](https://github.com/ash2k) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/586](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/586)
- fix prometheus interceptors not converting context errors to gRPC
codes by [@&#8203;vtermanis](https://github.com/vtermanis) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/571](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/571)
- Update README.md by [@&#8203;bwplotka](https://github.com/bwplotka)
in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/600](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/600)
- Update PULL_REQUEST_TEMPLATE.md by
[@&#8203;bwplotka](https://github.com/bwplotka) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/601](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/601)
- Add Client rate limit interceptors 520 by
[@&#8203;rahulkhairwar](https://github.com/rahulkhairwar) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/599](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/599)
- Use default go errors package instead of github.com/pkg/errors by
[@&#8203;rifkyazizf](https://github.com/rifkyazizf) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/608](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/608)
- fix bug : should drain channel of timer after stop by
[@&#8203;ikenchina](https://github.com/ikenchina) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/612](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/612)
- feat: add interceptor for bufbuild/protovalidate by
[@&#8203;gvencadze](https://github.com/gvencadze) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/614](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/614)
- Enhancement: Introduce Option Interface for Future Interceptor
Customization by
[@&#8203;elliotmjackson](https://github.com/elliotmjackson) in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/615](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/615)

#### New Contributors

- [@&#8203;irridia](https://github.com/irridia) made their first
contribution in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/299](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/299)
- [@&#8203;xinxiao](https://github.com/xinxiao) made their first
contribution in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/367](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/367)
- [@&#8203;XSAM](https://github.com/XSAM) made their first
contribution in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/364](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/364)
- [@&#8203;MalloZup](https://github.com/MalloZup) made their first
contribution in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/380](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/380)
- [@&#8203;instabledesign](https://github.com/instabledesign) made
their first contribution in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/330](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/330)
- [@&#8203;shamil](https://github.com/shamil) made their first
contribution in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/405](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/405)
- [@&#8203;ash2k](https://github.com/ash2k) made their first
contribution in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/413](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/413)
- [@&#8203;ogimenezb](https://github.com/ogimenezb) made their first
contribution in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/425](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/425)
- [@&#8203;amenzhinsky](https://github.com/amenzhinsky) made their
first contribution in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/434](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/434)
- [@&#8203;leventeliu](https://github.com/leventeliu) made their first
contribution in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/443](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/443)
- [@&#8203;michaljemala](https://github.com/michaljemala) made their
first contribution in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/442](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/442)
- [@&#8203;HUSTtoKTH](https://github.com/HUSTtoKTH) made their first
contribution in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/455](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/455)
- [@&#8203;jpkrohling](https://github.com/jpkrohling) made their first
contribution in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/477](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/477)
- [@&#8203;rahulkhairwar](https://github.com/rahulkhairwar) made their
first contribution in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/474](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/474)
- [@&#8203;ecordell](https://github.com/ecordell) made their first
contribution in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/487](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/487)
- [@&#8203;metalmatze](https://github.com/metalmatze) made their first
contribution in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/490](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/490)
- [@&#8203;mcdoker18](https://github.com/mcdoker18) made their first
contribution in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/510](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/510)
- [@&#8203;aimuz](https://github.com/aimuz) made their first
contribution in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/511](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/511)
- [@&#8203;forsaken628](https://github.com/forsaken628) made their
first contribution in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/529](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/529)
- [@&#8203;dependabot](https://github.com/dependabot) made their first
contribution in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/537](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/537)
- [@&#8203;rohanraj7316](https://github.com/rohanraj7316) made their
first contribution in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/544](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/544)
- [@&#8203;peczenyj](https://github.com/peczenyj) made their first
contribution in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/548](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/548)
- [@&#8203;longshine](https://github.com/longshine) made their first
contribution in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/574](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/574)
- [@&#8203;MichalFikejs](https://github.com/MichalFikejs) made their
first contribution in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/581](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/581)
- [@&#8203;vtermanis](https://github.com/vtermanis) made their first
contribution in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/571](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/571)
- [@&#8203;rifkyazizf](https://github.com/rifkyazizf) made their first
contribution in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/608](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/608)
- [@&#8203;ikenchina](https://github.com/ikenchina) made their first
contribution in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/612](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/612)
- [@&#8203;gvencadze](https://github.com/gvencadze) made their first
contribution in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/614](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/614)
- [@&#8203;elliotmjackson](https://github.com/elliotmjackson) made
their first contribution in
[https://github.com/grpc-ecosystem/go-grpc-middleware/pull/615](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/615)

**Full Changelog**:
grpc-ecosystem/go-grpc-middleware@v1.4.0...v2.0.0

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/jaegertracing/jaeger).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy4zOTMuMCIsInVwZGF0ZWRJblZlciI6IjM3LjM5My4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJjaGFuZ2Vsb2c6ZGVwZW5kZW5jaWVzIl19-->

---------

Signed-off-by: Mend Renovate <[email protected]>
Signed-off-by: Yuri Shkuro <[email protected]>
Co-authored-by: Yuri Shkuro <[email protected]>
Co-authored-by: Yuri Shkuro <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants