Skip to content

Commit 7cf0595

Browse files
authored
chore: fix regression from #2912 - tracing in SchemaText() (#2947)
1 parent d9d89f8 commit 7cf0595

File tree

10 files changed

+39
-13
lines changed

10 files changed

+39
-13
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
77
### Changed
88
- Updated CI so that Postgres tests run against v18 which is GA and not against v13 which is EOL (https://github.com/authzed/spicedb/pull/2926)
99

10+
### Fixed
11+
- Regression introduced in 1.49.2: missing spans in ReadSchema calls (https://github.com/authzed/spicedb/pull/2947)
12+
1013
## [1.49.2] - 2026-03-02
1114
### Added
1215
- feat(query planner): add recursive direction strategies, and fix IS BFS (https://github.com/authzed/spicedb/pull/2891)

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+
defer 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{}

internal/services/shared/schema_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -778,7 +778,7 @@ func TestApplySchemaChangesOverExisting(t *testing.T) {
778778

779779
sr, err := rwt.ReadSchema()
780780
require.NoError(err)
781-
schemaText, err := sr.SchemaText()
781+
schemaText, err := sr.SchemaText(t.Context())
782782
require.NoError(err)
783783
require.Equal(tc.expectedSchema, schemaText)
784784
return nil

internal/services/v1/schema.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ func (ss *schemaServer) ReadSchema(ctx context.Context, _ *v1.ReadSchemaRequest)
9696
return nil, ss.rewriteError(ctx, err)
9797
}
9898

99-
schemaText, err := sr.SchemaText()
99+
schemaText, err := sr.SchemaText(ctx)
100100
if err != nil {
101101
return nil, ss.rewriteError(ctx, err)
102102
}

pkg/datalayer/datalayer.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ type DataLayer interface {
5151
// SchemaReader groups schema read methods, accessed via RevisionedReader.ReadSchema().
5252
type SchemaReader interface {
5353
// SchemaText returns the full schema text.
54-
SchemaText() (string, error)
54+
SchemaText(ctx context.Context) (string, error)
5555

5656
// LookupTypeDefByName looks up a type definition by name.
5757
LookupTypeDefByName(ctx context.Context, name string) (datastore.RevisionedTypeDefinition, bool, error)

pkg/datalayer/schema_adapter.go

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,7 @@ type legacySchemaReaderAdapter struct {
3030

3131
// SchemaText returns the schema text at the current revision by reading all namespaces and caveats
3232
// and generating the schema text from them.
33-
func (l *legacySchemaReaderAdapter) SchemaText() (string, error) {
34-
ctx := context.Background()
35-
33+
func (l *legacySchemaReaderAdapter) SchemaText(ctx context.Context) (string, error) {
3634
// Read all namespaces
3735
namespaces, err := l.ListAllTypeDefinitions(ctx)
3836
if err != nil {
@@ -61,7 +59,7 @@ func (l *legacySchemaReaderAdapter) SchemaText() (string, error) {
6159
}
6260

6361
// Generate schema text with proper use directives
64-
schemaText, _, err := generator.GenerateSchemaWithCaveatTypeSet(definitions, caveatTypeSet)
62+
schemaText, _, err := generator.GenerateSchemaWithCaveatTypeSet(ctx, definitions, caveatTypeSet)
6563
if err != nil {
6664
return "", fmt.Errorf("failed to generate schema: %w", err)
6765
}

pkg/schemadsl/generator/generator.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,15 @@ package generator
22

33
import (
44
"bufio"
5+
"context"
56
"fmt"
67
"maps"
78
"slices"
89
"sort"
910
"strings"
1011

12+
"go.opentelemetry.io/otel"
13+
1114
"github.com/authzed/spicedb/pkg/caveats"
1215
caveattypes "github.com/authzed/spicedb/pkg/caveats/types"
1316
"github.com/authzed/spicedb/pkg/genutil/mapz"
@@ -18,18 +21,23 @@ import (
1821
"github.com/authzed/spicedb/pkg/spiceerrors"
1922
)
2023

24+
var tracer = otel.Tracer("spicedb/pkg/schemadsl/generator")
25+
2126
// Ellipsis is the relation name for terminal subjects.
2227
const Ellipsis = "..."
2328

2429
// MaxSingleLineCommentLength sets the maximum length for a comment to made single line.
2530
const MaxSingleLineCommentLength = 70 // 80 - the comment parts and some padding
2631

2732
func GenerateSchema(definitions []compiler.SchemaDefinition) (string, bool, error) {
28-
return GenerateSchemaWithCaveatTypeSet(definitions, caveattypes.Default.TypeSet)
33+
return GenerateSchemaWithCaveatTypeSet(context.TODO(), definitions, caveattypes.Default.TypeSet)
2934
}
3035

3136
// GenerateSchemaWithCaveatTypeSet generates a DSL view of the given schema.
32-
func GenerateSchemaWithCaveatTypeSet(definitions []compiler.SchemaDefinition, caveatTypeSet *caveattypes.TypeSet) (string, bool, error) {
37+
func GenerateSchemaWithCaveatTypeSet(ctx context.Context, definitions []compiler.SchemaDefinition, caveatTypeSet *caveattypes.TypeSet) (string, bool, error) {
38+
_, span := tracer.Start(ctx, "GenerateSchemaWithCaveatTypeSet")
39+
defer span.End()
40+
3341
generated := make([]string, 0, len(definitions))
3442
flags := mapz.NewSet[string]()
3543

0 commit comments

Comments
 (0)