Skip to content

Commit 1785f40

Browse files
committed
chore: add more spans in middlewares
1 parent d0b61ee commit 1785f40

File tree

5 files changed

+26
-4
lines changed

5 files changed

+26
-4
lines changed

internal/middleware/handwrittenvalidation/handwrittenvalidation.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package handwrittenvalidation
33
import (
44
"context"
55

6+
"go.opentelemetry.io/otel"
67
"google.golang.org/grpc"
78
"google.golang.org/grpc/codes"
89
"google.golang.org/grpc/status"
@@ -12,12 +13,16 @@ type handwrittenValidator interface {
1213
HandwrittenValidate() error
1314
}
1415

16+
var tracer = otel.Tracer("spicedb/internal/middleware")
17+
1518
// UnaryServerInterceptor returns a new unary server interceptor that runs the handwritten validation
1619
// on the incoming request, if any.
1720
func UnaryServerInterceptor(ctx context.Context, req any, _ *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (any, error) {
1821
validator, ok := req.(handwrittenValidator)
1922
if ok {
23+
_, span := tracer.Start(ctx, "handwritten.validation")
2024
err := validator.HandwrittenValidate()
25+
span.End()
2126
if err != nil {
2227
return nil, status.Errorf(codes.InvalidArgument, "%s", err)
2328
}

internal/middleware/memoryprotection/memory_protection.go

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,16 @@ import (
99
middleware "github.com/grpc-ecosystem/go-grpc-middleware/v2"
1010
"github.com/prometheus/client_golang/prometheus"
1111
"github.com/prometheus/client_golang/prometheus/promauto"
12+
"go.opentelemetry.io/otel"
1213
"google.golang.org/grpc"
1314
"google.golang.org/grpc/codes"
1415
"google.golang.org/grpc/status"
1516

1617
log "github.com/authzed/spicedb/internal/logging"
1718
)
1819

20+
var tracer = otel.Tracer("spicedb/internal/middleware/memory_protection")
21+
1922
// RequestsProcessed tracks requests that were processed by this middleware.
2023
var RequestsProcessed = promauto.NewCounterVec(prometheus.CounterOpts{
2124
Namespace: "spicedb",
@@ -44,7 +47,7 @@ func New(usageProvider MemoryUsageProvider, name string) *MemoryProtectionMiddle
4447
// UnaryServerInterceptor returns a unary server interceptor that rejects incoming requests is memory usage is too high
4548
func (am *MemoryProtectionMiddleware) UnaryServerInterceptor() grpc.UnaryServerInterceptor {
4649
return func(ctx context.Context, req any, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (any, error) {
47-
if err := am.checkAdmission(info.FullMethod); err != nil {
50+
if err := am.checkAdmission(ctx, info.FullMethod); err != nil {
4851
return nil, err
4952
}
5053

@@ -55,7 +58,7 @@ func (am *MemoryProtectionMiddleware) UnaryServerInterceptor() grpc.UnaryServerI
5558
// StreamServerInterceptor returns a stream server interceptor that rejects incoming requests is memory usage is too high
5659
func (am *MemoryProtectionMiddleware) StreamServerInterceptor() grpc.StreamServerInterceptor {
5760
return func(srv any, stream grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error {
58-
if err := am.checkAdmission(info.FullMethod); err != nil {
61+
if err := am.checkAdmission(stream.Context(), info.FullMethod); err != nil {
5962
return err
6063
}
6164

@@ -65,7 +68,10 @@ func (am *MemoryProtectionMiddleware) StreamServerInterceptor() grpc.StreamServe
6568
}
6669

6770
// checkAdmission returns an error if the request should be denied because memory usage is too high.
68-
func (am *MemoryProtectionMiddleware) checkAdmission(method string) error {
71+
func (am *MemoryProtectionMiddleware) checkAdmission(ctx context.Context, method string) error {
72+
_, span := tracer.Start(ctx, "checkMemoryUsage")
73+
span.End()
74+
6975
accept := true
7076
defer func() {
7177
am.recordMetric(method, accept)

internal/middleware/memoryprotection/memory_protection_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ func TestNew(t *testing.T) {
4848
am := New(tt.inputProvider, "name")
4949
require.NotNil(t, am)
5050

51-
err := am.checkAdmission("some_method")
51+
err := am.checkAdmission(t.Context(), "some_method")
5252
if tt.expectReqLetThrough {
5353
require.NoError(t, err) // if the middleware is off, every request is let through
5454
} else {

internal/middleware/perfinsights/perfinsights.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"github.com/prometheus/client_golang/prometheus"
1212
"github.com/prometheus/client_golang/prometheus/promauto"
1313
"github.com/rs/zerolog/log"
14+
"go.opentelemetry.io/otel"
1415
"go.opentelemetry.io/otel/trace"
1516
"google.golang.org/grpc"
1617

@@ -69,6 +70,8 @@ var APIShapeLatency = promauto.NewHistogramVec(prometheus.HistogramOpts{
6970
NativeHistogramBucketFactor: 1.1,
7071
}, append([]string{"api_kind"}, allLabels...))
7172

73+
var tracer = otel.Tracer("spicedb/internal/middleware")
74+
7275
// ShapeBuilder is a function that returns a slice of strings representing the shape of the API call.
7376
// This is used to report the shape of the API call to Prometheus.
7477
type ShapeBuilder func() APIShapeLabels
@@ -79,6 +82,8 @@ func ObserveShapeLatency(ctx context.Context, methodName string, shape APIShapeL
7982
}
8083

8184
func observeShapeLatency(ctx context.Context, metric *prometheus.HistogramVec, methodName string, shape APIShapeLabels, duration time.Duration) {
85+
ctx, span := tracer.Start(ctx, "perfInsights.observeShapeLatency")
86+
defer span.End()
8287
labels := buildLabels(methodName, shape)
8388
if len(labels) == 0 {
8489
log.Warn().Str("method", methodName).

internal/middleware/usagemetrics/usagemetrics.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors"
1010
"github.com/prometheus/client_golang/prometheus"
1111
"github.com/prometheus/client_golang/prometheus/promauto"
12+
"go.opentelemetry.io/otel"
1213
"google.golang.org/grpc"
1314

1415
"github.com/authzed/authzed-go/pkg/responsemeta"
@@ -34,6 +35,8 @@ var (
3435
Help: "Histogram of cluster dispatches performed by the instance.",
3536
Buckets: []float64{1, 5, 10, 25, 50, 100, 250},
3637
}, DispatchedCountLabels)
38+
39+
tracer = otel.Tracer("spicedb/internal/middleware")
3740
)
3841

3942
type reporter struct{}
@@ -52,6 +55,9 @@ type serverReporter struct {
5255

5356
// PostCall is invoked after all PostMsgSend operations.
5457
func (r *serverReporter) PostCall(_ error, _ time.Duration) {
58+
_, span := tracer.Start(r.ctx, "usagemetrics.PostCall")
59+
defer span.End()
60+
5561
responseMeta := FromContext(r.ctx)
5662
if responseMeta == nil {
5763
responseMeta = &dispatch.ResponseMeta{}

0 commit comments

Comments
 (0)