diff --git a/README.md b/README.md
index 782aa83..3210f6d 100644
--- a/README.md
+++ b/README.md
@@ -61,7 +61,7 @@ var (
```
-## func [AddStreamClientInterceptor]()
+## func [AddStreamClientInterceptor]()
```go
func AddStreamClientInterceptor(ctx context.Context, i ...grpc.StreamClientInterceptor)
@@ -70,7 +70,7 @@ func AddStreamClientInterceptor(ctx context.Context, i ...grpc.StreamClientInter
AddStreamClientInterceptor adds a server interceptor to default server interceptors
-## func [AddStreamServerInterceptor]()
+## func [AddStreamServerInterceptor]()
```go
func AddStreamServerInterceptor(ctx context.Context, i ...grpc.StreamServerInterceptor)
@@ -79,7 +79,7 @@ func AddStreamServerInterceptor(ctx context.Context, i ...grpc.StreamServerInter
AddStreamServerInterceptor adds a server interceptor to default server interceptors
-## func [AddUnaryClientInterceptor]()
+## func [AddUnaryClientInterceptor]()
```go
func AddUnaryClientInterceptor(ctx context.Context, i ...grpc.UnaryClientInterceptor)
@@ -88,7 +88,7 @@ func AddUnaryClientInterceptor(ctx context.Context, i ...grpc.UnaryClientInterce
AddUnaryClientInterceptor adds a server interceptor to default server interceptors
-## func [AddUnaryServerInterceptor]()
+## func [AddUnaryServerInterceptor]()
```go
func AddUnaryServerInterceptor(ctx context.Context, i ...grpc.UnaryServerInterceptor)
@@ -97,7 +97,7 @@ func AddUnaryServerInterceptor(ctx context.Context, i ...grpc.UnaryServerInterce
AddUnaryServerInterceptor adds a server interceptor to default server interceptors
-## func [DebugLoggingInterceptor]()
+## func [DebugLoggingInterceptor]()
```go
func DebugLoggingInterceptor() grpc.UnaryServerInterceptor
@@ -106,7 +106,7 @@ func DebugLoggingInterceptor() grpc.UnaryServerInterceptor
DebugLoggingInterceptor is the interceptor that logs all request/response from a handler
-## func [DefaultClientInterceptor]()
+## func [DefaultClientInterceptor]()
```go
func DefaultClientInterceptor(defaultOpts ...interface{}) grpc.UnaryClientInterceptor
@@ -115,7 +115,7 @@ func DefaultClientInterceptor(defaultOpts ...interface{}) grpc.UnaryClientInterc
DefaultClientInterceptor are the set of default interceptors that should be applied to all client calls
-## func [DefaultClientInterceptors]()
+## func [DefaultClientInterceptors]()
```go
func DefaultClientInterceptors(defaultOpts ...interface{}) []grpc.UnaryClientInterceptor
@@ -124,7 +124,7 @@ func DefaultClientInterceptors(defaultOpts ...interface{}) []grpc.UnaryClientInt
DefaultClientInterceptors are the set of default interceptors that should be applied to all client calls
-## func [DefaultClientStreamInterceptor]()
+## func [DefaultClientStreamInterceptor]()
```go
func DefaultClientStreamInterceptor(defaultOpts ...interface{}) grpc.StreamClientInterceptor
@@ -133,7 +133,7 @@ func DefaultClientStreamInterceptor(defaultOpts ...interface{}) grpc.StreamClien
DefaultClientStreamInterceptor are the set of default interceptors that should be applied to all stream client calls
-## func [DefaultClientStreamInterceptors]()
+## func [DefaultClientStreamInterceptors]()
```go
func DefaultClientStreamInterceptors(defaultOpts ...interface{}) []grpc.StreamClientInterceptor
@@ -142,7 +142,7 @@ func DefaultClientStreamInterceptors(defaultOpts ...interface{}) []grpc.StreamCl
DefaultClientStreamInterceptors are the set of default interceptors that should be applied to all stream client calls
-## func [DefaultInterceptors]()
+## func [DefaultInterceptors]()
```go
func DefaultInterceptors() []grpc.UnaryServerInterceptor
@@ -151,7 +151,7 @@ func DefaultInterceptors() []grpc.UnaryServerInterceptor
DefaultInterceptors are the set of default interceptors that are applied to all coldbrew methods
-## func [DefaultStreamInterceptors]()
+## func [DefaultStreamInterceptors]()
```go
func DefaultStreamInterceptors() []grpc.StreamServerInterceptor
@@ -160,7 +160,7 @@ func DefaultStreamInterceptors() []grpc.StreamServerInterceptor
DefaultStreamInterceptors are the set of default interceptors that should be applied to all coldbrew streams
-## func [DoHTTPtoGRPC]()
+## func [DoHTTPtoGRPC]()
```go
func DoHTTPtoGRPC(ctx context.Context, svr interface{}, handler func(ctx context.Context, req interface{}) (interface{}, error), in interface{}) (interface{}, error)
@@ -186,7 +186,7 @@ func (s *svc) echo(ctx context.Context, req *proto.EchoRequest) (*proto.EchoResp
```
-## func [FilterMethodsFunc]()
+## func [FilterMethodsFunc]()
```go
func FilterMethodsFunc(ctx context.Context, fullMethodName string) bool
@@ -195,7 +195,7 @@ func FilterMethodsFunc(ctx context.Context, fullMethodName string) bool
FilterMethodsFunc is the default implementation of Filter function
-## func [GRPCClientInterceptor]()
+## func [GRPCClientInterceptor]()
```go
func GRPCClientInterceptor(options ...grpc_opentracing.Option) grpc.UnaryClientInterceptor
@@ -204,7 +204,7 @@ func GRPCClientInterceptor(options ...grpc_opentracing.Option) grpc.UnaryClientI
GRPCClientInterceptor is the interceptor that intercepts all cleint requests and adds tracing info to them
-## func [HystrixClientInterceptor]()
+## func [HystrixClientInterceptor]()
```go
func HystrixClientInterceptor(defaultOpts ...grpc.CallOption) grpc.UnaryClientInterceptor
@@ -213,7 +213,7 @@ func HystrixClientInterceptor(defaultOpts ...grpc.CallOption) grpc.UnaryClientIn
HystrixClientInterceptor is the interceptor that intercepts all client requests and adds hystrix info to them
-## func [NRHttpTracer]()
+## func [NRHttpTracer]()
```go
func NRHttpTracer(pattern string, h http.HandlerFunc) (string, http.HandlerFunc)
@@ -222,7 +222,7 @@ func NRHttpTracer(pattern string, h http.HandlerFunc) (string, http.HandlerFunc)
NRHttpTracer adds newrelic tracing to this http function
-## func [NewRelicClientInterceptor]()
+## func [NewRelicClientInterceptor]()
```go
func NewRelicClientInterceptor() grpc.UnaryClientInterceptor
@@ -231,7 +231,7 @@ func NewRelicClientInterceptor() grpc.UnaryClientInterceptor
NewRelicClientInterceptor intercepts all client actions and reports them to newrelic
-## func [NewRelicInterceptor]()
+## func [NewRelicInterceptor]()
```go
func NewRelicInterceptor() grpc.UnaryServerInterceptor
@@ -240,7 +240,7 @@ func NewRelicInterceptor() grpc.UnaryServerInterceptor
NewRelicInterceptor intercepts all server actions and reports them to newrelic
-## func [OptionsInterceptor]()
+## func [OptionsInterceptor]()
```go
func OptionsInterceptor() grpc.UnaryServerInterceptor
@@ -249,7 +249,7 @@ func OptionsInterceptor() grpc.UnaryServerInterceptor
-## func [PanicRecoveryInterceptor]()
+## func [PanicRecoveryInterceptor]()
```go
func PanicRecoveryInterceptor() grpc.UnaryServerInterceptor
@@ -258,7 +258,7 @@ func PanicRecoveryInterceptor() grpc.UnaryServerInterceptor
-## func [ResponseTimeLoggingInterceptor]()
+## func [ResponseTimeLoggingInterceptor]()
```go
func ResponseTimeLoggingInterceptor(ff FilterFunc) grpc.UnaryServerInterceptor
@@ -267,7 +267,7 @@ func ResponseTimeLoggingInterceptor(ff FilterFunc) grpc.UnaryServerInterceptor
ResponseTimeLoggingInterceptor logs response time for each request on server
-## func [ResponseTimeLoggingStreamInterceptor]()
+## func [ResponseTimeLoggingStreamInterceptor]()
```go
func ResponseTimeLoggingStreamInterceptor() grpc.StreamServerInterceptor
@@ -276,7 +276,7 @@ func ResponseTimeLoggingStreamInterceptor() grpc.StreamServerInterceptor
ResponseTimeLoggingStreamInterceptor logs response time for stream RPCs.
-## func [ServerErrorInterceptor]()
+## func [ServerErrorInterceptor]()
```go
func ServerErrorInterceptor() grpc.UnaryServerInterceptor
@@ -285,7 +285,7 @@ func ServerErrorInterceptor() grpc.UnaryServerInterceptor
ServerErrorInterceptor intercepts all server actions and reports them to error notifier
-## func [ServerErrorStreamInterceptor]()
+## func [ServerErrorStreamInterceptor]()
```go
func ServerErrorStreamInterceptor() grpc.StreamServerInterceptor
@@ -294,7 +294,7 @@ func ServerErrorStreamInterceptor() grpc.StreamServerInterceptor
ServerErrorStreamInterceptor intercepts server errors for stream RPCs and reports them to the error notifier.
-## func [SetFilterFunc]()
+## func [SetFilterFunc]()
```go
func SetFilterFunc(ctx context.Context, ff FilterFunc)
@@ -303,7 +303,7 @@ func SetFilterFunc(ctx context.Context, ff FilterFunc)
SetFilterFunc sets the default filter function to be used by interceptors
-## func [TraceIdInterceptor]()
+## func [TraceIdInterceptor]()
```go
func TraceIdInterceptor() grpc.UnaryServerInterceptor
@@ -312,7 +312,7 @@ func TraceIdInterceptor() grpc.UnaryServerInterceptor
TraceIdInterceptor allows injecting trace id from request objects
-## func [UseColdBrewClientInterceptors]()
+## func [UseColdBrewClientInterceptors]()
```go
func UseColdBrewClientInterceptors(ctx context.Context, flag bool)
@@ -323,7 +323,7 @@ UseColdBrewClientInterceptors allows enabling/disabling coldbrew client intercep
when set to false, the coldbrew client interceptors will not be used
-## func [UseColdBrewServerInterceptors]()
+## func [UseColdBrewServerInterceptors]()
```go
func UseColdBrewServerInterceptors(ctx context.Context, flag bool)
@@ -334,7 +334,7 @@ UseColdBrewServerInterceptors allows enabling/disabling coldbrew server intercep
when set to false, the coldbrew server interceptors will not be used
-## type [FilterFunc]()
+## type [FilterFunc]()
If it returns false, the given request will not be traced.
diff --git a/interceptors.go b/interceptors.go
index 197c05c..1675efb 100644
--- a/interceptors.go
+++ b/interceptors.go
@@ -24,6 +24,7 @@ import (
"github.com/newrelic/go-agent/v3/integrations/nrgrpc"
newrelic "github.com/newrelic/go-agent/v3/newrelic"
"google.golang.org/grpc"
+ "google.golang.org/grpc/status"
)
var (
@@ -373,6 +374,13 @@ func HystrixClientInterceptor(defaultOpts ...grpc.CallOption) grpc.UnaryClientIn
return nil
}
}
+ if st, ok := status.FromError(invokerErr); ok {
+ for _, code := range options.excludedCodes {
+ if st.Code() == code {
+ return nil
+ }
+ }
+ }
return invokerErr
}, nil)
if invokerErr != nil {
diff --git a/options.go b/options.go
index 11147d7..5688bc1 100644
--- a/options.go
+++ b/options.go
@@ -1,6 +1,9 @@
package interceptors
-import "google.golang.org/grpc"
+import (
+ "google.golang.org/grpc"
+ "google.golang.org/grpc/codes"
+)
type clientOption interface {
grpc.CallOption
@@ -11,6 +14,7 @@ type clientOptions struct {
hystrixName string
disableHystrix bool
excludedErrors []error
+ excludedCodes []codes.Code
}
type optionCarrier struct {
@@ -22,7 +26,7 @@ func (h *optionCarrier) process(co *clientOptions) {
h.processor(co)
}
-//WithHystrixName changes the hystrix name to be used in the client interceptors
+// WithHystrixName changes the hystrix name to be used in the client interceptors
func WithHystrixName(name string) clientOption {
return &optionCarrier{
processor: func(co *clientOptions) {
@@ -59,3 +63,12 @@ func WithHystrixExcludedErrors(errors ...error) clientOption {
},
}
}
+
+// WithHystrixExcludedCodes sets the gRPC codes that should be excluded from hystrix circuit breaker
+func WithHystrixExcludedCodes(grpcCodes ...codes.Code) clientOption {
+ return &optionCarrier{
+ processor: func(co *clientOptions) {
+ co.excludedCodes = append(co.excludedCodes, grpcCodes...)
+ },
+ }
+}