Skip to content

Commit

Permalink
Ignore the problem of self-reported spans when multi-tenant enabled (#…
Browse files Browse the repository at this point in the history
…3787)

* Log missing tenancy at debug level

Signed-off-by: Ed Snible <snible@us.ibm.com>

* Debug message and code coverage

Signed-off-by: Ed Snible <snible@us.ibm.com>

* Simplify test

Signed-off-by: Ed Snible <snible@us.ibm.com>
  • Loading branch information
esnible committed Jul 1, 2022
1 parent 5beb965 commit 8c2e162
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 2 deletions.
9 changes: 8 additions & 1 deletion cmd/agent/app/reporter/grpc/reporter.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ import (

"go.uber.org/zap"
"google.golang.org/grpc"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"

zipkin2 "github.com/jaegertracing/jaeger/cmd/collector/app/sanitizer/zipkin"
"github.com/jaegertracing/jaeger/model"
Expand Down Expand Up @@ -71,7 +73,12 @@ func (r *Reporter) send(ctx context.Context, spans []*model.Span, process *model
req := &api_v2.PostSpansRequest{Batch: batch}
_, err := r.collector.PostSpans(ctx, req)
if err != nil {
r.logger.Error("Could not send spans over gRPC", zap.Error(err))
stat, ok := status.FromError(err)
if ok && stat.Code() == codes.PermissionDenied && stat.Message() == "missing tenant header" {
r.logger.Debug("Could not report untenanted spans over gRPC", zap.Error(err))
} else {
r.logger.Error("Could not send spans over gRPC", zap.Error(err))
}
}
return err
}
Expand Down
48 changes: 48 additions & 0 deletions cmd/agent/app/reporter/grpc/reporter_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,10 @@ import (
"github.com/stretchr/testify/require"
"go.uber.org/zap"
"google.golang.org/grpc"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/credentials/insecure"
"google.golang.org/grpc/metadata"
"google.golang.org/grpc/status"

"github.com/jaegertracing/jaeger/model"
"github.com/jaegertracing/jaeger/proto-gen/api_v2"
Expand Down Expand Up @@ -178,3 +181,48 @@ func TestReporter_MakeModelKeyValue(t *testing.T) {

assert.Equal(t, expectedTags, actualTags)
}

type mockMultitenantSpanHandler struct{}

func (h *mockMultitenantSpanHandler) PostSpans(ctx context.Context, r *api_v2.PostSpansRequest) (*api_v2.PostSpansResponse, error) {
md, ok := metadata.FromIncomingContext(ctx)
if !ok {
return &api_v2.PostSpansResponse{}, status.Errorf(codes.PermissionDenied, "missing tenant header")
}

tenants := md["x-tenant"]
if len(tenants) < 1 {
return &api_v2.PostSpansResponse{}, status.Errorf(codes.PermissionDenied, "missing tenant header")
} else if len(tenants) > 1 {
return &api_v2.PostSpansResponse{}, status.Errorf(codes.PermissionDenied, "extra tenant header")
}

return &api_v2.PostSpansResponse{}, nil
}

func TestReporter_MultitenantEmitBatch(t *testing.T) {
handler := &mockMultitenantSpanHandler{}
s, addr := initializeGRPCTestServer(t, func(s *grpc.Server) {
api_v2.RegisterCollectorServiceServer(s, handler)
})
defer s.Stop()
conn, err := grpc.Dial(addr.String(), grpc.WithTransportCredentials(insecure.NewCredentials()))
require.NoError(t, err)
defer func() { require.NoError(t, conn.Close()) }()
rep := NewReporter(conn, nil, zap.NewNop())

tm := time.Now()
tests := []struct {
in *jThrift.Batch
err string
}{
{
in: &jThrift.Batch{Process: &jThrift.Process{ServiceName: "node"}, Spans: []*jThrift.Span{{OperationName: "foo", StartTime: int64(model.TimeAsEpochMicroseconds(tm))}}},
err: "rpc error: code = PermissionDenied desc = missing tenant header",
},
}
for _, test := range tests {
err = rep.EmitBatch(context.Background(), test.in)
assert.EqualError(t, err, test.err)
}
}
2 changes: 1 addition & 1 deletion cmd/collector/app/handler/grpc_handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ func newBatchConsumer(logger *zap.Logger, spanProcessor processor.SpanProcessor,
func (c *batchConsumer) consume(ctx context.Context, batch *model.Batch) error {
tenant, err := c.validateTenant(ctx)
if err != nil {
c.logger.Error("rejecting spans (tenancy)", zap.Error(err))
c.logger.Debug("rejecting spans (tenancy)", zap.Error(err))
return err
}

Expand Down

0 comments on commit 8c2e162

Please sign in to comment.