diff --git a/docs/api-reference/apidocs.swagger.json b/docs/api-reference/apidocs.swagger.json index 550437c74..43a9f53df 100644 --- a/docs/api-reference/apidocs.swagger.json +++ b/docs/api-reference/apidocs.swagger.json @@ -3,7 +3,7 @@ "info": { "title": "Permify API", "description": "Permify is an open source authorization service for creating fine-grained and scalable authorization systems.", - "version": "v0.9.9", + "version": "v0.10.0", "contact": { "name": "API Support", "url": "https://github.com/Permify/permify/issues", diff --git a/go.mod b/go.mod index 61c8c0e03..437505d70 100644 --- a/go.mod +++ b/go.mod @@ -53,7 +53,6 @@ require ( go.opentelemetry.io/otel/exporters/zipkin v1.27.0 go.opentelemetry.io/otel/metric v1.28.0 go.opentelemetry.io/otel/sdk v1.28.0 - go.opentelemetry.io/otel/sdk/log v0.4.0 go.opentelemetry.io/otel/sdk/metric v1.27.0 go.opentelemetry.io/otel/trace v1.28.0 golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 @@ -83,7 +82,6 @@ require ( github.com/rivo/uniseg v0.4.4 // indirect github.com/sethvargo/go-retry v0.2.4 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect - go.opentelemetry.io/otel/log v0.4.0 // indirect ) require ( @@ -160,8 +158,6 @@ require ( github.com/tklauser/numcpus v0.6.1 // indirect github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect github.com/yusufpapurcu/wmi v1.2.3 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240709073659-82184aa44bb8 - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.4.0 go.opentelemetry.io/proto/otlp v1.3.1 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/crypto v0.25.0 // indirect diff --git a/go.sum b/go.sum index f0cc86de5..2c9e2b27e 100644 --- a/go.sum +++ b/go.sum @@ -428,10 +428,6 @@ go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo= go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4= go.opentelemetry.io/otel/exporters/jaeger v1.17.0 h1:D7UpUy2Xc2wsi1Ras6V40q806WM07rqoCWzXu7Sqy+4= go.opentelemetry.io/otel/exporters/jaeger v1.17.0/go.mod h1:nPCqOnEH9rNLKqH/+rrUjiMzHJdV1BlpKcTwRTyKkKI= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240709073659-82184aa44bb8 h1:aBQ+PceJa8k6jpjr+E6TSOJxISLFXF8rbALAnKx+IhA= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240709073659-82184aa44bb8/go.mod h1:wg1IdCvTM9S+8Z3cy1150R1xO/YTQqEeJ4RO9bt9rHI= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.4.0 h1:zBPZAISA9NOc5cE8zydqDiS0itvg/P/0Hn9m72a5gvM= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.4.0/go.mod h1:gcj2fFjEsqpV3fXuzAA+0Ze1p2/4MJ4T7d77AmkvueQ= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0 h1:bFgvUr3/O4PHj3VQcFEuYKvRZJX1SJDQ+11JXuSB3/w= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0/go.mod h1:xJntEd2KL6Qdg5lwp97HMLQDVeAhrYxmzFseAMDPQ8I= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0 h1:CIHWikMsN3wO+wq1Tp5VGdVRTcON+DmOJSfDjXypKOc= @@ -444,14 +440,10 @@ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0 h1:QY7/0 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0/go.mod h1:HVkSiDhTM9BoUJU8qE6j2eSWLLXvi1USXjyd2BXT8PY= go.opentelemetry.io/otel/exporters/zipkin v1.27.0 h1:aXcxb7F6ZDC1o2Z52LDfS2g6M2FB5CrxdR2gzY4QRNs= go.opentelemetry.io/otel/exporters/zipkin v1.27.0/go.mod h1:+WMURoi4KmVB7ypbFPx3xtZTWen2Ca3lRK9u6DVTO5M= -go.opentelemetry.io/otel/log v0.4.0 h1:/vZ+3Utqh18e8TPjuc3ecg284078KWrR8BRz+PQAj3o= -go.opentelemetry.io/otel/log v0.4.0/go.mod h1:DhGnQvky7pHy82MIRV43iXh3FlKN8UUKftn0KbLOq6I= go.opentelemetry.io/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6bOeuA5Q= go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s= go.opentelemetry.io/otel/sdk v1.28.0 h1:b9d7hIry8yZsgtbmM0DKyPWMMUMlK9NEKuIG4aBqWyE= go.opentelemetry.io/otel/sdk v1.28.0/go.mod h1:oYj7ClPUA7Iw3m+r7GeEjz0qckQRJK2B8zjcZEfu7Pg= -go.opentelemetry.io/otel/sdk/log v0.4.0 h1:1mMI22L82zLqf6KtkjrRy5BbagOTWdJsqMY/HSqILAA= -go.opentelemetry.io/otel/sdk/log v0.4.0/go.mod h1:AYJ9FVF0hNOgAVzUG/ybg/QttnXhUePWAupmCqtdESo= go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g= diff --git a/internal/authn/oidc/authn.go b/internal/authn/oidc/authn.go index d22bc63bb..267b32075 100644 --- a/internal/authn/oidc/authn.go +++ b/internal/authn/oidc/authn.go @@ -305,7 +305,7 @@ func (oidc *Authn) getKeyWithRetry(keyID string, ctx context.Context) (interface // fetchKey attempts to fetch the JWKS and retrieve the key for the given keyID. func (oidc *Authn) fetchKey(keyID string, ctx context.Context) (interface{}, error) { // Log the attempt to find the key. - slog.Debug("attempting to find key in JWKS", "kid", keyID) + slog.DebugContext(ctx, "attempting to find key in JWKS", "kid", keyID) // Fetch the JWKS from the configured URI. jwks, err := oidc.jwksSet.Fetch(ctx, oidc.JwksURI) @@ -316,22 +316,22 @@ func (oidc *Authn) fetchKey(keyID string, ctx context.Context) (interface{}, err } // Log a successful fetch of the JWKS. - slog.Info("successfully fetched JWKS") + slog.InfoContext(ctx, "successfully fetched JWKS") // Attempt to find the key in the fetched JWKS using the key ID. if key, found := jwks.LookupKeyID(keyID); found { var k interface{} // Convert the key to a usable format. if err := key.Raw(&k); err != nil { - slog.Error("failed to get raw public key", "kid", keyID, "error", err) + slog.ErrorContext(ctx, "failed to get raw public key", "kid", keyID, "error", err) return nil, fmt.Errorf("failed to get raw public key: %w", err) } // Log a successful retrieval of the raw public key. - slog.Debug("successfully obtained raw public key", "key", k) + slog.DebugContext(ctx, "successfully obtained raw public key", "key", k) return k, nil // Return the public key for JWT signature verification. } // Log an error if the key ID is not found in the JWKS. - slog.Error("key ID not found in JWKS", "kid", keyID) + slog.ErrorContext(ctx, "key ID not found in JWKS", "kid", keyID) return nil, fmt.Errorf("kid %s not found", keyID) } diff --git a/internal/engines/balancer/balancer.go b/internal/engines/balancer/balancer.go index 6e4660f53..36164de26 100644 --- a/internal/engines/balancer/balancer.go +++ b/internal/engines/balancer/balancer.go @@ -100,7 +100,7 @@ func (c *Balancer) Check(ctx context.Context, request *base.PermissionCheckReque // Fetch the EntityDefinition for the given tenant, entity type, and schema version. en, _, err := c.schemaReader.ReadEntityDefinition(ctx, request.GetTenantId(), request.GetEntity().GetType(), request.GetMetadata().GetSchemaVersion()) if err != nil { - slog.Error(err.Error()) + slog.ErrorContext(ctx, err.Error()) // If an error occurs while reading the entity definition, deny permission and return the error. return &base.PermissionCheckResponse{ Can: base.CheckResult_CHECK_RESULT_DENIED, @@ -119,7 +119,7 @@ func (c *Balancer) Check(ctx context.Context, request *base.PermissionCheckReque // This key helps in distributing the request. _, err = h.Write([]byte(engines.GenerateKey(request, isRelational))) if err != nil { - slog.Error(err.Error()) + slog.ErrorContext(ctx, err.Error()) return &base.PermissionCheckResponse{ Can: base.CheckResult_CHECK_RESULT_DENIED, Metadata: &base.PermissionCheckResponseMetadata{ @@ -134,13 +134,13 @@ func (c *Balancer) Check(ctx context.Context, request *base.PermissionCheckReque defer cancel() // Logging the intention to forward the request to the underlying client. - slog.Debug("Forwarding request with key to the underlying client", slog.String("key", k)) + slog.DebugContext(ctx, "Forwarding request with key to the underlying client", slog.String("key", k)) // Perform the actual permission check by making a call to the underlying client. response, err := c.client.Check(withTimeout, request) if err != nil { // Log the error and return it. - slog.Error(err.Error()) + slog.ErrorContext(ctx, err.Error()) return &base.PermissionCheckResponse{ Can: base.CheckResult_CHECK_RESULT_DENIED, Metadata: &base.PermissionCheckResponseMetadata{ diff --git a/internal/info.go b/internal/info.go index 0303a7b83..4cd27a924 100644 --- a/internal/info.go +++ b/internal/info.go @@ -23,7 +23,7 @@ var Identifier = "" */ const ( // Version is the last release of the Permify (e.g. v0.1.0) - Version = "v0.9.9" + Version = "v0.10.0" ) // Function to create a single line of the ASCII art with centered content and color diff --git a/internal/servers/bundleServer.go b/internal/servers/bundleServer.go index c14dcf70d..75ce1c694 100644 --- a/internal/servers/bundleServer.go +++ b/internal/servers/bundleServer.go @@ -62,7 +62,7 @@ func (r *BundleServer) Write(ctx context.Context, request *v1.BundleWriteRequest if err != nil { span.RecordError(err) span.SetStatus(otelCodes.Error, err.Error()) - slog.Error(err.Error()) + slog.ErrorContext(ctx, err.Error()) return nil, status.Error(GetStatus(err), err.Error()) } @@ -85,7 +85,7 @@ func (r *BundleServer) Read(ctx context.Context, request *v1.BundleReadRequest) if err != nil { span.RecordError(err) span.SetStatus(otelCodes.Error, err.Error()) - slog.Error(err.Error()) + slog.ErrorContext(ctx, err.Error()) return nil, status.Error(GetStatus(err), err.Error()) } @@ -108,7 +108,7 @@ func (r *BundleServer) Delete(ctx context.Context, request *v1.BundleDeleteReque if err != nil { span.RecordError(err) span.SetStatus(otelCodes.Error, err.Error()) - slog.Error(err.Error()) + slog.ErrorContext(ctx, err.Error()) return nil, status.Error(GetStatus(err), err.Error()) } diff --git a/internal/servers/dataServer.go b/internal/servers/dataServer.go index 377b988ff..e16636c70 100644 --- a/internal/servers/dataServer.go +++ b/internal/servers/dataServer.go @@ -90,7 +90,7 @@ func (r *DataServer) ReadRelationships(ctx context.Context, request *v1.Relation if err != nil { span.RecordError(err) span.SetStatus(otelCodes.Error, err.Error()) - slog.Error(err.Error()) + slog.ErrorContext(ctx, err.Error()) return nil, status.Error(GetStatus(err), err.Error()) } @@ -136,7 +136,7 @@ func (r *DataServer) ReadAttributes(ctx context.Context, request *v1.AttributeRe if err != nil { span.RecordError(err) span.SetStatus(otelCodes.Error, err.Error()) - slog.Error(err.Error()) + slog.ErrorContext(ctx, err.Error()) return nil, status.Error(GetStatus(err), err.Error()) } @@ -237,7 +237,7 @@ func (r *DataServer) Write(ctx context.Context, request *v1.DataWriteRequest) (* if err != nil { span.RecordError(err) span.SetStatus(otelCodes.Error, err.Error()) - slog.Error(err.Error()) + slog.ErrorContext(ctx, err.Error()) return nil, status.Error(GetStatus(err), err.Error()) } @@ -306,7 +306,7 @@ func (r *DataServer) WriteRelationships(ctx context.Context, request *v1.Relatio if err != nil { span.RecordError(err) span.SetStatus(otelCodes.Error, err.Error()) - slog.Error(err.Error()) + slog.ErrorContext(ctx, err.Error()) return nil, status.Error(GetStatus(err), err.Error()) } @@ -338,7 +338,7 @@ func (r *DataServer) Delete(ctx context.Context, request *v1.DataDeleteRequest) if err != nil { span.RecordError(err) span.SetStatus(otelCodes.Error, err.Error()) - slog.Error(err.Error()) + slog.ErrorContext(ctx, err.Error()) return nil, status.Error(GetStatus(err), err.Error()) } @@ -370,7 +370,7 @@ func (r *DataServer) DeleteRelationships(ctx context.Context, request *v1.Relati if err != nil { span.RecordError(err) span.SetStatus(otelCodes.Error, err.Error()) - slog.Error(err.Error()) + slog.ErrorContext(ctx, err.Error()) return nil, status.Error(GetStatus(err), err.Error()) } @@ -397,7 +397,7 @@ func (r *DataServer) RunBundle(ctx context.Context, request *v1.BundleRunRequest if err != nil { span.RecordError(err) span.SetStatus(otelCodes.Error, err.Error()) - slog.Error(err.Error()) + slog.ErrorContext(ctx, err.Error()) return nil, status.Error(GetStatus(err), err.Error()) } @@ -410,7 +410,7 @@ func (r *DataServer) RunBundle(ctx context.Context, request *v1.BundleRunRequest if err != nil { span.RecordError(err) span.SetStatus(otelCodes.Error, err.Error()) - slog.Error(err.Error()) + slog.ErrorContext(ctx, err.Error()) return nil, status.Error(GetStatus(err), err.Error()) } diff --git a/internal/servers/permissionServer.go b/internal/servers/permissionServer.go index 550235d3b..dd41fac2d 100644 --- a/internal/servers/permissionServer.go +++ b/internal/servers/permissionServer.go @@ -39,7 +39,7 @@ func (r *PermissionServer) Check(ctx context.Context, request *v1.PermissionChec if err != nil { span.RecordError(err) span.SetStatus(otelCodes.Error, err.Error()) - slog.Error(err.Error()) + slog.ErrorContext(ctx, err.Error()) return nil, status.Error(GetStatus(err), err.Error()) } @@ -60,7 +60,7 @@ func (r *PermissionServer) Expand(ctx context.Context, request *v1.PermissionExp if err != nil { span.RecordError(err) span.SetStatus(otelCodes.Error, err.Error()) - slog.Error(err.Error()) + slog.ErrorContext(ctx, err.Error()) return nil, status.Error(GetStatus(err), err.Error()) } @@ -81,7 +81,7 @@ func (r *PermissionServer) LookupEntity(ctx context.Context, request *v1.Permiss if err != nil { span.RecordError(err) span.SetStatus(otelCodes.Error, err.Error()) - slog.Error(err.Error()) + slog.ErrorContext(ctx, err.Error()) return nil, status.Error(GetStatus(err), err.Error()) } @@ -102,7 +102,7 @@ func (r *PermissionServer) LookupEntityStream(request *v1.PermissionLookupEntity if err != nil { span.RecordError(err) span.SetStatus(otelCodes.Error, err.Error()) - slog.Error(err.Error()) + slog.ErrorContext(ctx, err.Error()) return status.Error(GetStatus(err), err.Error()) } @@ -123,7 +123,7 @@ func (r *PermissionServer) LookupSubject(ctx context.Context, request *v1.Permis if err != nil { span.RecordError(err) span.SetStatus(otelCodes.Error, err.Error()) - slog.Error(err.Error()) + slog.ErrorContext(ctx, err.Error()) return nil, status.Error(GetStatus(err), err.Error()) } @@ -144,7 +144,7 @@ func (r *PermissionServer) SubjectPermission(ctx context.Context, request *v1.Pe if err != nil { span.RecordError(err) span.SetStatus(otelCodes.Error, err.Error()) - slog.Error(err.Error()) + slog.ErrorContext(ctx, err.Error()) return nil, status.Error(GetStatus(err), err.Error()) } diff --git a/internal/servers/schemaServer.go b/internal/servers/schemaServer.go index 9ebd24a9f..a40a6d728 100644 --- a/internal/servers/schemaServer.go +++ b/internal/servers/schemaServer.go @@ -78,7 +78,7 @@ func (r *SchemaServer) Write(ctx context.Context, request *v1.SchemaWriteRequest if err != nil { span.RecordError(err) span.SetStatus(otelCodes.Error, err.Error()) - slog.Error(err.Error()) + slog.ErrorContext(ctx, err.Error()) return nil, status.Error(GetStatus(err), err.Error()) } @@ -220,7 +220,7 @@ func (r *SchemaServer) Read(ctx context.Context, request *v1.SchemaReadRequest) if err != nil { span.RecordError(err) span.SetStatus(otelCodes.Error, err.Error()) - slog.Error(err.Error()) + slog.ErrorContext(ctx, err.Error()) return nil, status.Error(GetStatus(err), err.Error()) } @@ -242,7 +242,7 @@ func (r *SchemaServer) List(ctx context.Context, request *v1.SchemaListRequest) if err != nil { span.RecordError(err) span.SetStatus(otelCodes.Error, err.Error()) - slog.Error(err.Error()) + slog.ErrorContext(ctx, err.Error()) return nil, status.Error(GetStatus(err), err.Error()) } diff --git a/internal/servers/tenancyServer.go b/internal/servers/tenancyServer.go index 4227c33fb..4277df824 100644 --- a/internal/servers/tenancyServer.go +++ b/internal/servers/tenancyServer.go @@ -37,7 +37,7 @@ func (t *TenancyServer) Create(ctx context.Context, request *v1.TenantCreateRequ if err != nil { span.RecordError(err) span.SetStatus(otelCodes.Error, err.Error()) - slog.Error(err.Error()) + slog.ErrorContext(ctx, err.Error()) return nil, status.Error(GetStatus(err), err.Error()) } @@ -55,7 +55,7 @@ func (t *TenancyServer) Delete(ctx context.Context, request *v1.TenantDeleteRequ if err != nil { span.RecordError(err) span.SetStatus(otelCodes.Error, err.Error()) - slog.Error(err.Error()) + slog.ErrorContext(ctx, err.Error()) return nil, status.Error(GetStatus(err), err.Error()) } @@ -73,7 +73,7 @@ func (t *TenancyServer) List(ctx context.Context, request *v1.TenantListRequest) if err != nil { span.RecordError(err) span.SetStatus(otelCodes.Error, err.Error()) - slog.Error(err.Error()) + slog.ErrorContext(ctx, err.Error()) return nil, status.Error(GetStatus(err), err.Error()) } diff --git a/internal/storage/postgres/bundleReader.go b/internal/storage/postgres/bundleReader.go index 88c800f3c..2b98f68eb 100644 --- a/internal/storage/postgres/bundleReader.go +++ b/internal/storage/postgres/bundleReader.go @@ -33,7 +33,7 @@ func (b *BundleReader) Read(ctx context.Context, tenantID, name string) (bundle ctx, span := tracer.Start(ctx, "bundle-reader.read-bundle") defer span.End() - slog.Debug("reading bundle", slog.Any("tenant_id", tenantID), slog.Any("name", name)) + slog.DebugContext(ctx, "reading bundle", slog.Any("tenant_id", tenantID), slog.Any("name", name)) builder := b.database.Builder.Select("payload").From(BundlesTable).Where(squirrel.Eq{"name": name, "tenant_id": tenantID}) @@ -45,7 +45,7 @@ func (b *BundleReader) Read(ctx context.Context, tenantID, name string) (bundle return nil, utils.HandleError(ctx, span, err, base.ErrorCode_ERROR_CODE_SQL_BUILDER) } - slog.Debug("executing sql query", slog.Any("query", query), slog.Any("arguments", args)) + slog.DebugContext(ctx, "executing sql query", slog.Any("query", query), slog.Any("arguments", args)) var row pgx.Row row = b.database.ReadPool.QueryRow(ctx, query, args...) @@ -66,7 +66,7 @@ func (b *BundleReader) Read(ctx context.Context, tenantID, name string) (bundle span.RecordError(err) span.SetStatus(codes.Error, err.Error()) - slog.Error("failed to convert the value to bundle", slog.Any("error", err)) + slog.ErrorContext(ctx, "failed to convert the value to bundle", slog.Any("error", err)) return nil, errors.New(base.ErrorCode_ERROR_CODE_INVALID_ARGUMENT.String()) } diff --git a/internal/storage/postgres/bundleWriter.go b/internal/storage/postgres/bundleWriter.go index 0ddaad4db..997ac749c 100644 --- a/internal/storage/postgres/bundleWriter.go +++ b/internal/storage/postgres/bundleWriter.go @@ -32,7 +32,7 @@ func (b *BundleWriter) Write(ctx context.Context, bundles []storage.Bundle) (nam ctx, span := tracer.Start(ctx, "bundle-writer.write-bundle") defer span.End() - slog.Debug("writing bundles to the database", slog.Any("number_of_bundles", len(bundles))) + slog.DebugContext(ctx, "writing bundles to the database", slog.Any("number_of_bundles", len(bundles))) insertBuilder := b.database.Builder.Insert(BundlesTable). Columns("name, payload, tenant_id"). @@ -59,14 +59,14 @@ func (b *BundleWriter) Write(ctx context.Context, bundles []storage.Bundle) (nam return names, utils.HandleError(ctx, span, err, base.ErrorCode_ERROR_CODE_SQL_BUILDER) } - slog.Debug("executing sql insert query", slog.Any("query", query), slog.Any("arguments", args)) + slog.DebugContext(ctx, "executing sql insert query", slog.Any("query", query), slog.Any("arguments", args)) _, err = b.database.WritePool.Exec(ctx, query, args...) if err != nil { return nil, utils.HandleError(ctx, span, err, base.ErrorCode_ERROR_CODE_EXECUTION) } - slog.Debug("successfully wrote bundles to the database", slog.Any("number_of_bundles", len(bundles))) + slog.DebugContext(ctx, "successfully wrote bundles to the database", slog.Any("number_of_bundles", len(bundles))) return } @@ -75,7 +75,7 @@ func (b *BundleWriter) Delete(ctx context.Context, tenantID, name string) (err e ctx, span := tracer.Start(ctx, "bundle-writer.delete-bundle") defer span.End() - slog.Debug("deleting bundle", slog.Any("bundle", name)) + slog.DebugContext(ctx, "deleting bundle", slog.Any("bundle", name)) deleteBuilder := b.database.Builder.Delete(BundlesTable).Where(squirrel.Eq{"name": name, "tenant_id": tenantID}) @@ -92,7 +92,7 @@ func (b *BundleWriter) Delete(ctx context.Context, tenantID, name string) (err e return utils.HandleError(ctx, span, err, base.ErrorCode_ERROR_CODE_EXECUTION) } - slog.Debug("bundle successfully deleted") + slog.DebugContext(ctx, "bundle successfully deleted") return nil } diff --git a/internal/storage/postgres/dataReader.go b/internal/storage/postgres/dataReader.go index a6c179311..0afae1d1c 100644 --- a/internal/storage/postgres/dataReader.go +++ b/internal/storage/postgres/dataReader.go @@ -46,7 +46,7 @@ func (r *DataReader) QueryRelationships(ctx context.Context, tenantID string, fi ctx, span := tracer.Start(ctx, "data-reader.query-relationships") defer span.End() - slog.Debug("querying relationships for tenant_id", slog.String("tenant_id", tenantID)) + slog.DebugContext(ctx, "querying relationships for tenant_id", slog.String("tenant_id", tenantID)) // Decode the snapshot value. var st token.SnapToken @@ -68,7 +68,7 @@ func (r *DataReader) QueryRelationships(ctx context.Context, tenantID string, fi return nil, utils.HandleError(ctx, span, err, base.ErrorCode_ERROR_CODE_SQL_BUILDER) } - slog.Debug("generated sql query", slog.String("query", query), "with args", slog.Any("arguments", args)) + slog.DebugContext(ctx, "generated sql query", slog.String("query", query), "with args", slog.Any("arguments", args)) // Execute the SQL query and retrieve the result rows. var rows pgx.Rows @@ -92,7 +92,7 @@ func (r *DataReader) QueryRelationships(ctx context.Context, tenantID string, fi return nil, utils.HandleError(ctx, span, err, base.ErrorCode_ERROR_CODE_SCAN) } - slog.Debug("successfully retrieved relation tuples from the database") + slog.DebugContext(ctx, "successfully retrieved relation tuples from the database") // Return a TupleIterator created from the TupleCollection. return collection.CreateTupleIterator(), nil @@ -104,7 +104,7 @@ func (r *DataReader) ReadRelationships(ctx context.Context, tenantID string, fil ctx, span := tracer.Start(ctx, "data-reader.read-relationships") defer span.End() - slog.Debug("reading relationships for tenant_id", slog.String("tenant_id", tenantID)) + slog.DebugContext(ctx, "reading relationships for tenant_id", slog.String("tenant_id", tenantID)) // Decode the snapshot value. var st token.SnapToken @@ -143,7 +143,7 @@ func (r *DataReader) ReadRelationships(ctx context.Context, tenantID string, fil return nil, database.NewNoopContinuousToken().Encode(), utils.HandleError(ctx, span, err, base.ErrorCode_ERROR_CODE_SQL_BUILDER) } - slog.Debug("generated sql query", slog.String("query", query), "with args", slog.Any("arguments", args)) + slog.DebugContext(ctx, "generated sql query", slog.String("query", query), "with args", slog.Any("arguments", args)) // Execute the query and retrieve the rows. var rows pgx.Rows @@ -171,7 +171,7 @@ func (r *DataReader) ReadRelationships(ctx context.Context, tenantID string, fil return nil, nil, utils.HandleError(ctx, span, err, base.ErrorCode_ERROR_CODE_SCAN) } - slog.Debug("successfully read relation tuples from database") + slog.DebugContext(ctx, "successfully read relation tuples from database") // Return the results and encoded continuous token for pagination. if len(tuples) > int(pagination.PageSize()) { @@ -187,7 +187,7 @@ func (r *DataReader) QuerySingleAttribute(ctx context.Context, tenantID string, ctx, span := tracer.Start(ctx, "data-reader.query-single-attribute") defer span.End() - slog.Debug("querying single attribute for tenant_id", slog.String("tenant_id", tenantID)) + slog.DebugContext(ctx, "querying single attribute for tenant_id", slog.String("tenant_id", tenantID)) // Decode the snapshot value. var st token.SnapToken @@ -209,7 +209,7 @@ func (r *DataReader) QuerySingleAttribute(ctx context.Context, tenantID string, return nil, utils.HandleError(ctx, span, err, base.ErrorCode_ERROR_CODE_SQL_BUILDER) } - slog.Debug("generated sql query", slog.String("query", query), "with args", slog.Any("arguments", args)) + slog.DebugContext(ctx, "generated sql query", slog.String("query", query), "with args", slog.Any("arguments", args)) row := r.database.ReadPool.QueryRow(ctx, query, args...) @@ -236,7 +236,7 @@ func (r *DataReader) QuerySingleAttribute(ctx context.Context, tenantID string, return nil, utils.HandleError(ctx, span, err, base.ErrorCode_ERROR_CODE_INTERNAL) } - slog.Debug("successfully retrieved Single attribute from the database") + slog.DebugContext(ctx, "successfully retrieved Single attribute from the database") return rt.ToAttribute(), nil } @@ -247,7 +247,7 @@ func (r *DataReader) QueryAttributes(ctx context.Context, tenantID string, filte ctx, span := tracer.Start(ctx, "data-reader.query-attributes") defer span.End() - slog.Debug("querying Attributes for tenant_id", slog.String("tenant_id", tenantID)) + slog.DebugContext(ctx, "querying Attributes for tenant_id", slog.String("tenant_id", tenantID)) // Decode the snapshot value. var st token.SnapToken @@ -269,7 +269,7 @@ func (r *DataReader) QueryAttributes(ctx context.Context, tenantID string, filte return nil, utils.HandleError(ctx, span, err, base.ErrorCode_ERROR_CODE_SQL_BUILDER) } - slog.Debug("generated sql query", slog.String("query", query), "with args", slog.Any("arguments", args)) + slog.DebugContext(ctx, "generated sql query", slog.String("query", query), "with args", slog.Any("arguments", args)) // Execute the SQL query and retrieve the result rows. var rows pgx.Rows @@ -307,7 +307,7 @@ func (r *DataReader) QueryAttributes(ctx context.Context, tenantID string, filte return nil, utils.HandleError(ctx, span, err, base.ErrorCode_ERROR_CODE_SCAN) } - slog.Debug("successfully retrieved attributes tuples from the database") + slog.DebugContext(ctx, "successfully retrieved attributes tuples from the database") // Return a TupleIterator created from the TupleCollection. return collection.CreateAttributeIterator(), nil @@ -319,7 +319,7 @@ func (r *DataReader) ReadAttributes(ctx context.Context, tenantID string, filter ctx, span := tracer.Start(ctx, "data-reader.read-attributes") defer span.End() - slog.Debug("reading attributes for tenant_id", slog.String("tenant_id", tenantID)) + slog.DebugContext(ctx, "reading attributes for tenant_id", slog.String("tenant_id", tenantID)) // Decode the snapshot value. var st token.SnapToken @@ -358,7 +358,7 @@ func (r *DataReader) ReadAttributes(ctx context.Context, tenantID string, filter return nil, database.NewNoopContinuousToken().Encode(), utils.HandleError(ctx, span, err, base.ErrorCode_ERROR_CODE_SQL_BUILDER) } - slog.Debug("generated sql query", slog.String("query", query), "with args", slog.Any("arguments", args)) + slog.DebugContext(ctx, "generated sql query", slog.String("query", query), "with args", slog.Any("arguments", args)) // Execute the query and retrieve the rows. var rows pgx.Rows @@ -400,7 +400,7 @@ func (r *DataReader) ReadAttributes(ctx context.Context, tenantID string, filter return nil, nil, utils.HandleError(ctx, span, err, base.ErrorCode_ERROR_CODE_SCAN) } - slog.Debug("successfully read attributes from the database") + slog.DebugContext(ctx, "successfully read attributes from the database") // Return the results and encoded continuous token for pagination. if len(attributes) > int(pagination.PageSize()) { @@ -416,7 +416,7 @@ func (r *DataReader) QueryUniqueEntities(ctx context.Context, tenantID, name, sn ctx, span := tracer.Start(ctx, "data-reader.query-unique-entities") defer span.End() - slog.Debug("querying unique entities for tenant_id", slog.String("tenant_id", tenantID)) + slog.DebugContext(ctx, "querying unique entities for tenant_id", slog.String("tenant_id", tenantID)) // Decode the snapshot value. var st token.SnapToken @@ -446,7 +446,7 @@ func (r *DataReader) QueryUniqueEntities(ctx context.Context, tenantID, name, sn // Append ORDER BY and LIMIT clauses. query = fmt.Sprintf("%s ORDER BY id LIMIT %d", query, pagination.PageSize()+1) - slog.Debug("generated sql query", slog.String("query", query)) + slog.DebugContext(ctx, "generated sql query", slog.String("query", query)) // Execute the query and retrieve the rows. var rows pgx.Rows @@ -475,7 +475,7 @@ func (r *DataReader) QueryUniqueEntities(ctx context.Context, tenantID, name, sn return nil, nil, utils.HandleError(ctx, span, err, base.ErrorCode_ERROR_CODE_INTERNAL) } - slog.Debug("successfully retrieved unique entities from the database") + slog.DebugContext(ctx, "successfully retrieved unique entities from the database") // Return the results and encoded continuous token for pagination. if len(entityIDs) > int(pagination.PageSize()) { @@ -491,7 +491,7 @@ func (r *DataReader) QueryUniqueSubjectReferences(ctx context.Context, tenantID ctx, span := tracer.Start(ctx, "data-reader.query-unique-subject-reference") defer span.End() - slog.Debug("querying unique subject references for tenant_id", slog.String("tenant_id", tenantID)) + slog.DebugContext(ctx, "querying unique subject references for tenant_id", slog.String("tenant_id", tenantID)) // Decode the snapshot value. var st token.SnapToken @@ -534,7 +534,7 @@ func (r *DataReader) QueryUniqueSubjectReferences(ctx context.Context, tenantID return nil, database.NewNoopContinuousToken().Encode(), utils.HandleError(ctx, span, err, base.ErrorCode_ERROR_CODE_SQL_BUILDER) } - slog.Debug("generated sql query", slog.String("query", query), "with args", slog.Any("arguments", args)) + slog.DebugContext(ctx, "generated sql query", slog.String("query", query), "with args", slog.Any("arguments", args)) // Execute the query and retrieve the rows. var rows pgx.Rows @@ -561,7 +561,7 @@ func (r *DataReader) QueryUniqueSubjectReferences(ctx context.Context, tenantID return nil, nil, utils.HandleError(ctx, span, err, base.ErrorCode_ERROR_CODE_SCAN) } - slog.Debug("successfully retrieved unique subject references from the database") + slog.DebugContext(ctx, "successfully retrieved unique subject references from the database") // Return the results and encoded continuous token for pagination. if len(subjectIDs) > int(pagination.PageSize()) { @@ -577,7 +577,7 @@ func (r *DataReader) HeadSnapshot(ctx context.Context, tenantID string) (token.S ctx, span := tracer.Start(ctx, "data-reader.head-snapshot") defer span.End() - slog.Debug("getting head snapshot for tenant_id", slog.String("tenant_id", tenantID)) + slog.DebugContext(ctx, "getting head snapshot for tenant_id", slog.String("tenant_id", tenantID)) var xid types.XID8 @@ -598,7 +598,7 @@ func (r *DataReader) HeadSnapshot(ctx context.Context, tenantID string) (token.S return nil, utils.HandleError(ctx, span, err, base.ErrorCode_ERROR_CODE_SCAN) } - slog.Debug("successfully retrieved latest snapshot token") + slog.DebugContext(ctx, "successfully retrieved latest snapshot token") // Return the latest snapshot token associated with the tenant. return snapshot.Token{Value: xid}, nil diff --git a/internal/storage/postgres/dataWriter.go b/internal/storage/postgres/dataWriter.go index ca9134fb3..2f32ac5e6 100644 --- a/internal/storage/postgres/dataWriter.go +++ b/internal/storage/postgres/dataWriter.go @@ -50,7 +50,7 @@ func (w *DataWriter) Write( defer span.End() // Ensure that the span is ended when the function returns. // Log the start of a data write operation. - slog.Debug("writing data for tenant_id", slog.String("tenant_id", tenantID), "max retries", slog.Any("max_retries", w.database.GetMaxRetries())) + slog.DebugContext(ctx, "writing data for tenant_id", slog.String("tenant_id", tenantID), "max retries", slog.Any("max_retries", w.database.GetMaxRetries())) // Check if the total number of tuples and attributes exceeds the maximum allowed per write. if len(tupleCollection.GetTuples())+len(attributeCollection.GetAttributes()) > w.database.GetMaxDataPerWrite() { @@ -64,7 +64,7 @@ func (w *DataWriter) Write( if err != nil { // Check if the error is due to serialization, and if so, retry. if utils.IsSerializationRelatedError(err) || pgconn.SafeToRetry(err) { - slog.Warn("serialization error occurred", slog.String("tenant_id", tenantID), slog.Int("retry", i)) + slog.WarnContext(ctx, "serialization error occurred", slog.String("tenant_id", tenantID), slog.Int("retry", i)) utils.WaitWithBackoff(ctx, tenantID, i) continue // Retry the operation. } @@ -76,7 +76,7 @@ func (w *DataWriter) Write( } // Log an error if the operation failed after reaching the maximum number of retries. - slog.Error("max retries reached", slog.Any("error", errors.New(base.ErrorCode_ERROR_CODE_ERROR_MAX_RETRIES.String()))) + slog.ErrorContext(ctx, "max retries reached", slog.Any("error", errors.New(base.ErrorCode_ERROR_CODE_ERROR_MAX_RETRIES.String()))) // Return an error indicating that the maximum number of retries has been reached. return nil, errors.New(base.ErrorCode_ERROR_CODE_ERROR_MAX_RETRIES.String()) @@ -95,7 +95,7 @@ func (w *DataWriter) Delete( defer span.End() // Ensure that the span is ended when the function returns. // Log the start of a data deletion operation. - slog.Debug("deleting data for tenant_id", slog.String("tenant_id", tenantID), "max retries", slog.Any("max_retries", w.database.GetMaxRetries())) + slog.DebugContext(ctx, "deleting data for tenant_id", slog.String("tenant_id", tenantID), "max retries", slog.Any("max_retries", w.database.GetMaxRetries())) // Retry loop for handling transient errors like serialization issues. for i := 0; i <= w.database.GetMaxRetries(); i++ { @@ -104,7 +104,7 @@ func (w *DataWriter) Delete( if err != nil { // Check if the error is due to serialization, and if so, retry. if utils.IsSerializationRelatedError(err) || pgconn.SafeToRetry(err) { - slog.Warn("serialization error occurred", slog.String("tenant_id", tenantID), slog.Int("retry", i)) + slog.WarnContext(ctx, "serialization error occurred", slog.String("tenant_id", tenantID), slog.Int("retry", i)) utils.WaitWithBackoff(ctx, tenantID, i) continue // Retry the operation. } @@ -116,7 +116,7 @@ func (w *DataWriter) Delete( } // Log an error if the operation failed after reaching the maximum number of retries. - slog.Debug("max retries reached", slog.Any("error", errors.New(base.ErrorCode_ERROR_CODE_ERROR_MAX_RETRIES.String()))) + slog.DebugContext(ctx, "max retries reached", slog.Any("error", errors.New(base.ErrorCode_ERROR_CODE_ERROR_MAX_RETRIES.String()))) // Return an error indicating that the maximum number of retries has been reached. return nil, errors.New(base.ErrorCode_ERROR_CODE_ERROR_MAX_RETRIES.String()) @@ -135,7 +135,7 @@ func (w *DataWriter) RunBundle( defer span.End() // Ensure that the span is ended when the function returns. // Log the start of running a bundle operation. - slog.Debug("running bundle for tenant_id", slog.String("tenant_id", tenantID), "max retries", slog.Any("max_retries", w.database.GetMaxRetries())) + slog.DebugContext(ctx, "running bundle for tenant_id", slog.String("tenant_id", tenantID), "max retries", slog.Any("max_retries", w.database.GetMaxRetries())) // Retry loop for handling transient errors like serialization issues. for i := 0; i <= w.database.GetMaxRetries(); i++ { @@ -144,7 +144,7 @@ func (w *DataWriter) RunBundle( if err != nil { // Check if the error is due to serialization, and if so, retry. if utils.IsSerializationRelatedError(err) || pgconn.SafeToRetry(err) { - slog.Warn("serialization error occurred", slog.String("tenant_id", tenantID), slog.Int("retry", i)) + slog.WarnContext(ctx, "serialization error occurred", slog.String("tenant_id", tenantID), slog.Int("retry", i)) utils.WaitWithBackoff(ctx, tenantID, i) continue // Retry the operation. } @@ -156,7 +156,7 @@ func (w *DataWriter) RunBundle( } // Log an error if the operation failed after reaching the maximum number of retries. - slog.Error("max retries reached", slog.Any("error", errors.New(base.ErrorCode_ERROR_CODE_ERROR_MAX_RETRIES.String()))) + slog.ErrorContext(ctx, "max retries reached", slog.Any("error", errors.New(base.ErrorCode_ERROR_CODE_ERROR_MAX_RETRIES.String()))) // Return an error indicating that the maximum number of retries has been reached. return nil, errors.New(base.ErrorCode_ERROR_CODE_ERROR_MAX_RETRIES.String()) @@ -186,9 +186,9 @@ func (w *DataWriter) write( return nil, err } - slog.Debug("retrieved transaction", slog.Any("xid", xid), "for tenant", slog.Any("tenant_id", tenantID)) + slog.DebugContext(ctx, "retrieved transaction", slog.Any("xid", xid), "for tenant", slog.Any("tenant_id", tenantID)) - slog.Debug("processing tuples and executing insert query") + slog.DebugContext(ctx, "processing tuples and executing insert query") batch := &pgx.Batch{} @@ -235,7 +235,7 @@ func (w *DataWriter) write( return nil, err } - slog.Debug("data successfully written to the database") + slog.DebugContext(ctx, "data successfully written to the database") return snapshot.NewToken(xid).Encode(), nil } @@ -264,9 +264,9 @@ func (w *DataWriter) delete( return nil, err } - slog.Debug("retrieved transaction", slog.Any("xid", xid), "for tenant", slog.Any("tenant_id", tenantID)) + slog.DebugContext(ctx, "retrieved transaction", slog.Any("xid", xid), "for tenant", slog.Any("tenant_id", tenantID)) - slog.Debug("processing tuple and executing update query") + slog.DebugContext(ctx, "processing tuple and executing update query") if !validation.IsTupleFilterEmpty(tupleFilter) { tbuilder := w.database.Builder.Update(RelationTuplesTable).Set("expired_tx_id", xid).Where(squirrel.Eq{"expired_tx_id": "0", "tenant_id": tenantID}) @@ -286,7 +286,7 @@ func (w *DataWriter) delete( } } - slog.Debug("processing attribute and executing update query") + slog.DebugContext(ctx, "processing attribute and executing update query") if !validation.IsAttributeFilterEmpty(attributeFilter) { abuilder := w.database.Builder.Update(AttributesTable).Set("expired_tx_id", xid).Where(squirrel.Eq{"expired_tx_id": "0", "tenant_id": tenantID}) @@ -310,7 +310,7 @@ func (w *DataWriter) delete( return nil, err } - slog.Debug("data successfully deleted from the database") + slog.DebugContext(ctx, "data successfully deleted from the database") return snapshot.NewToken(xid).Encode(), nil } @@ -339,7 +339,7 @@ func (w *DataWriter) runBundle( return nil, err } - slog.Debug("retrieved transaction", slog.Any("xid", xid), "for tenant", slog.Any("tenant_id", tenantID)) + slog.DebugContext(ctx, "retrieved transaction", slog.Any("xid", xid), "for tenant", slog.Any("tenant_id", tenantID)) batch := &pgx.Batch{} diff --git a/internal/storage/postgres/schemaReader.go b/internal/storage/postgres/schemaReader.go index b432936dc..cdcca4ca1 100644 --- a/internal/storage/postgres/schemaReader.go +++ b/internal/storage/postgres/schemaReader.go @@ -38,7 +38,7 @@ func (r *SchemaReader) ReadSchema(ctx context.Context, tenantID, version string) ctx, span := tracer.Start(ctx, "schema-reader.read-schema") defer span.End() - slog.Debug("reading schema", slog.Any("tenant_id", tenantID), slog.Any("version", version)) + slog.DebugContext(ctx, "reading schema", slog.Any("tenant_id", tenantID), slog.Any("version", version)) builder := r.database.Builder.Select("name, serialized_definition, version").From(SchemaDefinitionTable).Where(squirrel.Eq{"version": version, "tenant_id": tenantID}) @@ -50,7 +50,7 @@ func (r *SchemaReader) ReadSchema(ctx context.Context, tenantID, version string) return nil, utils.HandleError(ctx, span, err, base.ErrorCode_ERROR_CODE_SQL_BUILDER) } - slog.Debug("executing sql query", slog.Any("query", query), slog.Any("arguments", args)) + slog.DebugContext(ctx, "executing sql query", slog.Any("query", query), slog.Any("arguments", args)) var rows pgx.Rows rows, err = r.database.ReadPool.Query(ctx, query, args...) @@ -72,7 +72,7 @@ func (r *SchemaReader) ReadSchema(ctx context.Context, tenantID, version string) return nil, utils.HandleError(ctx, span, err, base.ErrorCode_ERROR_CODE_SCAN) } - slog.Debug("successfully retrieved", slog.Any("schema definitions", len(definitions))) + slog.DebugContext(ctx, "successfully retrieved", slog.Any("schema definitions", len(definitions))) sch, err = schema.NewSchemaFromStringDefinitions(false, definitions...) if err != nil { @@ -87,7 +87,7 @@ func (r *SchemaReader) ReadSchemaString(ctx context.Context, tenantID, version s ctx, span := tracer.Start(ctx, "schema-reader.read-schema-string") defer span.End() - slog.Debug("reading schema", slog.Any("tenant_id", tenantID), slog.Any("version", version)) + slog.DebugContext(ctx, "reading schema", slog.Any("tenant_id", tenantID), slog.Any("version", version)) builder := r.database.Builder.Select("name, serialized_definition, version").From(SchemaDefinitionTable).Where(squirrel.Eq{"version": version, "tenant_id": tenantID}) @@ -99,7 +99,7 @@ func (r *SchemaReader) ReadSchemaString(ctx context.Context, tenantID, version s return []string{}, utils.HandleError(ctx, span, err, base.ErrorCode_ERROR_CODE_SQL_BUILDER) } - slog.Debug("executing sql query", slog.Any("query", query), slog.Any("arguments", args)) + slog.DebugContext(ctx, "executing sql query", slog.Any("query", query), slog.Any("arguments", args)) var rows pgx.Rows rows, err = r.database.ReadPool.Query(ctx, query, args...) @@ -120,7 +120,7 @@ func (r *SchemaReader) ReadSchemaString(ctx context.Context, tenantID, version s return []string{}, utils.HandleError(ctx, span, err, base.ErrorCode_ERROR_CODE_SCAN) } - slog.Debug("successfully retrieved", slog.Any("schema definitions", len(definitions))) + slog.DebugContext(ctx, "successfully retrieved", slog.Any("schema definitions", len(definitions))) return definitions, err } @@ -130,7 +130,7 @@ func (r *SchemaReader) ReadEntityDefinition(ctx context.Context, tenantID, name, ctx, span := tracer.Start(ctx, "schema-reader.read-entity-definition") defer span.End() - slog.Debug("reading entity definition", slog.Any("tenant_id", tenantID), slog.Any("version", version)) + slog.DebugContext(ctx, "reading entity definition", slog.Any("tenant_id", tenantID), slog.Any("version", version)) builder := r.database.Builder.Select("name, serialized_definition, version").Where(squirrel.Eq{"name": name, "version": version, "tenant_id": tenantID}).From(SchemaDefinitionTable).Limit(1) @@ -142,7 +142,7 @@ func (r *SchemaReader) ReadEntityDefinition(ctx context.Context, tenantID, name, return nil, "", utils.HandleError(ctx, span, err, base.ErrorCode_ERROR_CODE_SQL_BUILDER) } - slog.Debug("executing sql query", slog.Any("query", query), slog.Any("arguments", args)) + slog.DebugContext(ctx, "executing sql query", slog.Any("query", query), slog.Any("arguments", args)) var def storage.SchemaDefinition row := r.database.ReadPool.QueryRow(ctx, query, args...) @@ -161,7 +161,7 @@ func (r *SchemaReader) ReadEntityDefinition(ctx context.Context, tenantID, name, definition, err = schema.GetEntityByName(sch, name) - slog.Debug("successfully retrieved", slog.Any("schema definition", definition)) + slog.DebugContext(ctx, "successfully retrieved", slog.Any("schema definition", definition)) return definition, def.Version, err } @@ -171,7 +171,7 @@ func (r *SchemaReader) ReadRuleDefinition(ctx context.Context, tenantID, name, v ctx, span := tracer.Start(ctx, "schema-reader.read-rule-definition") defer span.End() - slog.Debug("reading rule definition", slog.Any("tenant_id", tenantID), slog.Any("name", name), slog.Any("version", version)) + slog.DebugContext(ctx, "reading rule definition", slog.Any("tenant_id", tenantID), slog.Any("name", name), slog.Any("version", version)) builder := r.database.Builder.Select("name, serialized_definition, version").Where(squirrel.Eq{"name": name, "version": version, "tenant_id": tenantID}).From(SchemaDefinitionTable).Limit(1) @@ -183,7 +183,7 @@ func (r *SchemaReader) ReadRuleDefinition(ctx context.Context, tenantID, name, v return nil, "", utils.HandleError(ctx, span, err, base.ErrorCode_ERROR_CODE_SQL_BUILDER) } - slog.Debug("executing sql query", slog.Any("query", query), slog.Any("arguments", args)) + slog.DebugContext(ctx, "executing sql query", slog.Any("query", query), slog.Any("arguments", args)) var def storage.SchemaDefinition row := r.database.ReadPool.QueryRow(ctx, query, args...) @@ -194,7 +194,7 @@ func (r *SchemaReader) ReadRuleDefinition(ctx context.Context, tenantID, name, v return nil, "", utils.HandleError(ctx, span, err, base.ErrorCode_ERROR_CODE_SCAN) } - slog.Debug("successfully retrieved rule definition for", slog.Any("name", name)) + slog.DebugContext(ctx, "successfully retrieved rule definition for", slog.Any("name", name)) var sch *base.SchemaDefinition sch, err = schema.NewSchemaFromStringDefinitions(false, def.Serialized()) @@ -204,7 +204,7 @@ func (r *SchemaReader) ReadRuleDefinition(ctx context.Context, tenantID, name, v definition, err = schema.GetRuleByName(sch, name) - slog.Debug("successfully created rule definition") + slog.DebugContext(ctx, "successfully created rule definition") return definition, def.Version, err } @@ -214,7 +214,7 @@ func (r *SchemaReader) HeadVersion(ctx context.Context, tenantID string) (versio ctx, span := tracer.Start(ctx, "schema-reader.head-version") defer span.End() - slog.Debug("finding the latest version fo the schema for", slog.String("tenant_id", tenantID)) + slog.DebugContext(ctx, "finding the latest version fo the schema for", slog.String("tenant_id", tenantID)) var query string var args []interface{} @@ -225,7 +225,7 @@ func (r *SchemaReader) HeadVersion(ctx context.Context, tenantID string) (versio return "", utils.HandleError(ctx, span, err, base.ErrorCode_ERROR_CODE_SQL_BUILDER) } - slog.Debug("executing sql query", slog.Any("query", query), slog.Any("arguments", args)) + slog.DebugContext(ctx, "executing sql query", slog.Any("query", query), slog.Any("arguments", args)) row := r.database.ReadPool.QueryRow(ctx, query, args...) err = row.Scan(&version) @@ -236,7 +236,7 @@ func (r *SchemaReader) HeadVersion(ctx context.Context, tenantID string) (versio return "", utils.HandleError(ctx, span, err, base.ErrorCode_ERROR_CODE_SCAN) } - slog.Debug("successfully found the latest schema version", slog.Any("version", version)) + slog.DebugContext(ctx, "successfully found the latest schema version", slog.Any("version", version)) return version, nil } @@ -246,7 +246,7 @@ func (r *SchemaReader) ListSchemas(ctx context.Context, tenantID string, paginat ctx, span := tracer.Start(ctx, "tenant-reader.list-tenants") defer span.End() - slog.Debug("listing schemas with pagination", slog.Any("pagination", pagination)) + slog.DebugContext(ctx, "listing schemas with pagination", slog.Any("pagination", pagination)) builder := r.database.Builder.Select("DISTINCT version").From(SchemaDefinitionTable).Where(squirrel.Eq{"tenant_id": tenantID}) if pagination.Token() != "" { @@ -268,7 +268,7 @@ func (r *SchemaReader) ListSchemas(ctx context.Context, tenantID string, paginat return nil, nil, utils.HandleError(ctx, span, err, base.ErrorCode_ERROR_CODE_SQL_BUILDER) } - slog.Debug("executing sql query", slog.Any("query", query), slog.Any("arguments", args)) + slog.DebugContext(ctx, "executing sql query", slog.Any("query", query), slog.Any("arguments", args)) var rows pgx.Rows rows, err = r.database.ReadPool.Query(ctx, query, args...) @@ -297,7 +297,7 @@ func (r *SchemaReader) ListSchemas(ctx context.Context, tenantID string, paginat return nil, nil, utils.HandleError(ctx, span, err, base.ErrorCode_ERROR_CODE_INTERNAL) } - slog.Debug("successfully listed schemas", slog.Any("number_of_schemas", len(schemas))) + slog.DebugContext(ctx, "successfully listed schemas", slog.Any("number_of_schemas", len(schemas))) if len(schemas) > int(pagination.PageSize()) { return schemas[:pagination.PageSize()], utils.NewContinuousToken(lastVersion).Encode(), nil diff --git a/internal/storage/postgres/schemaWriter.go b/internal/storage/postgres/schemaWriter.go index 860b57819..97ea0c94f 100644 --- a/internal/storage/postgres/schemaWriter.go +++ b/internal/storage/postgres/schemaWriter.go @@ -32,7 +32,7 @@ func (w *SchemaWriter) WriteSchema(ctx context.Context, schemas []storage.Schema ctx, span := tracer.Start(ctx, "schema-writer.write-schema") defer span.End() - slog.Debug("writing schemas to the database", slog.Any("number_of_schemas", len(schemas))) + slog.DebugContext(ctx, "writing schemas to the database", slog.Any("number_of_schemas", len(schemas))) insertBuilder := w.database.Builder.Insert(SchemaDefinitionTable).Columns("name, serialized_definition, version, tenant_id") @@ -48,14 +48,14 @@ func (w *SchemaWriter) WriteSchema(ctx context.Context, schemas []storage.Schema return utils.HandleError(ctx, span, err, base.ErrorCode_ERROR_CODE_SQL_BUILDER) } - slog.Debug("executing sql insert query", slog.Any("query", query), slog.Any("arguments", args)) + slog.DebugContext(ctx, "executing sql insert query", slog.Any("query", query), slog.Any("arguments", args)) _, err = w.database.WritePool.Exec(ctx, query, args...) if err != nil { return utils.HandleError(ctx, span, err, base.ErrorCode_ERROR_CODE_EXECUTION) } - slog.Debug("successfully wrote schemas to the database", slog.Any("number_of_schemas", len(schemas))) + slog.DebugContext(ctx, "successfully wrote schemas to the database", slog.Any("number_of_schemas", len(schemas))) return nil } diff --git a/internal/storage/postgres/tenantReader.go b/internal/storage/postgres/tenantReader.go index 7d960d9aa..07739da59 100644 --- a/internal/storage/postgres/tenantReader.go +++ b/internal/storage/postgres/tenantReader.go @@ -34,7 +34,7 @@ func (r *TenantReader) ListTenants(ctx context.Context, pagination database.Pagi ctx, span := tracer.Start(ctx, "tenant-reader.list-tenants") defer span.End() - slog.Debug("listing tenants with pagination", slog.Any("pagination", pagination)) + slog.DebugContext(ctx, "listing tenants with pagination", slog.Any("pagination", pagination)) builder := r.database.Builder.Select("id, name, created_at").From(TenantsTable) if pagination.Token() != "" { @@ -56,7 +56,7 @@ func (r *TenantReader) ListTenants(ctx context.Context, pagination database.Pagi return nil, nil, utils.HandleError(ctx, span, err, base.ErrorCode_ERROR_CODE_SQL_BUILDER) } - slog.Debug("executing sql query", slog.Any("query", query), slog.Any("arguments", args)) + slog.DebugContext(ctx, "executing sql query", slog.Any("query", query), slog.Any("arguments", args)) var rows pgx.Rows rows, err = r.database.ReadPool.Query(ctx, query, args...) @@ -80,7 +80,7 @@ func (r *TenantReader) ListTenants(ctx context.Context, pagination database.Pagi return nil, nil, utils.HandleError(ctx, span, err, base.ErrorCode_ERROR_CODE_INTERNAL) } - slog.Debug("successfully listed tenants", slog.Any("number_of_tenants", len(tenants))) + slog.DebugContext(ctx, "successfully listed tenants", slog.Any("number_of_tenants", len(tenants))) if len(tenants) > int(pagination.PageSize()) { return tenants[:pagination.PageSize()], utils.NewContinuousToken(lastID).Encode(), nil diff --git a/internal/storage/postgres/tenantWriter.go b/internal/storage/postgres/tenantWriter.go index c6addb65d..76b52a72c 100644 --- a/internal/storage/postgres/tenantWriter.go +++ b/internal/storage/postgres/tenantWriter.go @@ -38,7 +38,7 @@ func (w *TenantWriter) CreateTenant(ctx context.Context, id, name string) (resul ctx, span := tracer.Start(ctx, "tenant-writer.create-tenant") defer span.End() - slog.Debug("creating new tenant", slog.Any("id", id), slog.Any("name", name)) + slog.DebugContext(ctx, "creating new tenant", slog.Any("id", id), slog.Any("name", name)) var createdAt time.Time err = w.database.WritePool.QueryRow(ctx, utils.InsertTenantTemplate, id, name).Scan(&createdAt) @@ -46,13 +46,13 @@ func (w *TenantWriter) CreateTenant(ctx context.Context, id, name string) (resul if strings.Contains(err.Error(), "duplicate key value") { span.RecordError(err) span.SetStatus(codes.Error, err.Error()) - slog.Error("error encountered", slog.Any("error", err)) + slog.ErrorContext(ctx, "error encountered", slog.Any("error", err)) return nil, errors.New(base.ErrorCode_ERROR_CODE_UNIQUE_CONSTRAINT.String()) } return nil, utils.HandleError(ctx, span, err, base.ErrorCode_ERROR_CODE_EXECUTION) } - slog.Debug("successfully created Tenant", slog.Any("id", id), slog.Any("name", name), slog.Any("created_at", createdAt)) + slog.DebugContext(ctx, "successfully created Tenant", slog.Any("id", id), slog.Any("name", name), slog.Any("created_at", createdAt)) return &base.Tenant{ Id: id, @@ -66,7 +66,7 @@ func (w *TenantWriter) DeleteTenant(ctx context.Context, tenantID string) (resul ctx, span := tracer.Start(ctx, "tenant-writer.delete-tenant") defer span.End() - slog.Debug("deleting tenant", slog.Any("tenant_id", tenantID)) + slog.DebugContext(ctx, "deleting tenant", slog.Any("tenant_id", tenantID)) var name string var createdAt time.Time @@ -76,7 +76,7 @@ func (w *TenantWriter) DeleteTenant(ctx context.Context, tenantID string) (resul return nil, utils.HandleError(ctx, span, err, base.ErrorCode_ERROR_CODE_EXECUTION) } - slog.Debug("successfully deleted tenant") + slog.DebugContext(ctx, "successfully deleted tenant") return &base.Tenant{ Id: tenantID, diff --git a/internal/storage/postgres/utils/common.go b/internal/storage/postgres/utils/common.go index ed416dfa4..0a2692d7d 100644 --- a/internal/storage/postgres/utils/common.go +++ b/internal/storage/postgres/utils/common.go @@ -129,20 +129,20 @@ func GenerateGCQuery(table string, value uint64) squirrel.DeleteBuilder { func HandleError(ctx context.Context, span trace.Span, err error, errorCode base.ErrorCode) error { // Check if the error is context-related if IsContextRelatedError(ctx, err) { - slog.Debug("A context-related error occurred", + slog.DebugContext(ctx, "A context-related error occurred", slog.String("error", err.Error())) return errors.New(base.ErrorCode_ERROR_CODE_CANCELLED.String()) } // Check if the error is serialization-related if IsSerializationRelatedError(err) { - slog.Debug("A serialization-related error occurred", + slog.DebugContext(ctx, "A serialization-related error occurred", slog.String("error", err.Error())) return errors.New(base.ErrorCode_ERROR_CODE_SERIALIZATION.String()) } // For all other types of errors, log them at the error level and record them in the span - slog.Error("An operational error occurred", + slog.ErrorContext(ctx, "An operational error occurred", slog.Any("error", err)) span.RecordError(err) span.SetStatus(codes.Error, err.Error()) @@ -179,7 +179,7 @@ func WaitWithBackoff(ctx context.Context, tenantID string, retries int) { backoff := time.Duration(math.Min(float64(20*time.Millisecond)*math.Pow(2, float64(retries)), float64(1*time.Second))) jitter := time.Duration(rand.Float64() * float64(backoff) * 0.5) nextBackoff := backoff + jitter - slog.Warn("waiting before retry", slog.String("tenant_id", tenantID), slog.Int64("backoff_duration", nextBackoff.Milliseconds())) + slog.WarnContext(ctx, "waiting before retry", slog.String("tenant_id", tenantID), slog.Int64("backoff_duration", nextBackoff.Milliseconds())) select { case <-time.After(nextBackoff): case <-ctx.Done(): diff --git a/internal/storage/postgres/watch.go b/internal/storage/postgres/watch.go index 44e10c73e..aeabf96a8 100644 --- a/internal/storage/postgres/watch.go +++ b/internal/storage/postgres/watch.go @@ -49,7 +49,7 @@ func (w *Watch) Watch(ctx context.Context, tenantID, snap string) (<-chan *base. changes := make(chan *base.DataChanges, w.database.GetWatchBufferSize()) errs := make(chan error, 1) - slog.Debug("watching for changes in the database", slog.Any("tenant_id", tenantID), slog.Any("snapshot", snap)) + slog.DebugContext(ctx, "watching for changes in the database", slog.Any("tenant_id", tenantID), slog.Any("snapshot", snap)) // Decode the snapshot value. // The snapshot value represents a point in the history of the database. @@ -92,7 +92,7 @@ func (w *Watch) Watch(ctx context.Context, tenantID, snap string) (<-chan *base. if err != nil { // If there is an error in getting the changes, send the error and return. - slog.Error("failed to get changes for transaction", slog.Any("id", id), slog.Any("error", err)) + slog.ErrorContext(ctx, "failed to get changes for transaction", slog.Any("id", id), slog.Any("error", err)) errs <- err return @@ -101,9 +101,9 @@ func (w *Watch) Watch(ctx context.Context, tenantID, snap string) (<-chan *base. // Send the changes, but respect the context cancellation. select { case changes <- updates: // Send updates to the changes channel. - slog.Debug("sent updates to the changes channel for transaction", slog.Any("id", id)) + slog.DebugContext(ctx, "sent updates to the changes channel for transaction", slog.Any("id", id)) case <-ctx.Done(): // If the context is done, send an error and return. - slog.Error("context canceled, stopping watch") + slog.ErrorContext(ctx, "context canceled, stopping watch") errs <- errors.New(base.ErrorCode_ERROR_CODE_CANCELLED.String()) return } @@ -118,9 +118,9 @@ func (w *Watch) Watch(ctx context.Context, tenantID, snap string) (<-chan *base. select { case <-sleep.C: // If the timer is done, continue the loop. - slog.Debug("no recent transaction IDs, waiting for changes") + slog.DebugContext(ctx, "no recent transaction IDs, waiting for changes") case <-ctx.Done(): // If the context is done, send an error and return. - slog.Error("context canceled, stopping watch") + slog.ErrorContext(ctx, "context canceled, stopping watch") errs <- errors.New(base.ErrorCode_ERROR_CODE_CANCELLED.String()) return } @@ -128,7 +128,7 @@ func (w *Watch) Watch(ctx context.Context, tenantID, snap string) (<-chan *base. } }() - slog.Debug("watch started successfully") + slog.DebugContext(ctx, "watch started successfully") // Return the channels that the caller will listen to for changes and errors. return changes, errs @@ -164,18 +164,18 @@ func (w *Watch) getRecentXIDs(ctx context.Context, value uint64, tenantID string query, args, err := builder.ToSql() if err != nil { - slog.Error("error while building sql query", slog.Any("error", err)) + slog.ErrorContext(ctx, "error while building sql query", slog.Any("error", err)) return nil, err } - slog.Debug("executing SQL query to get recent transaction", slog.Any("query", query), slog.Any("arguments", args)) + slog.DebugContext(ctx, "executing SQL query to get recent transaction", slog.Any("query", query), slog.Any("arguments", args)) // Execute the SQL query. rows, err := w.database.ReadPool.Query(ctx, query, args...) if err != nil { - slog.Error("failed to execute sql query", slog.Any("error", err)) + slog.ErrorContext(ctx, "failed to execute sql query", slog.Any("error", err)) return nil, err } @@ -188,7 +188,7 @@ func (w *Watch) getRecentXIDs(ctx context.Context, value uint64, tenantID string err := rows.Scan(&xid) if err != nil { - slog.Error("error while scanning row", slog.Any("error", err)) + slog.ErrorContext(ctx, "error while scanning row", slog.Any("error", err)) return nil, err } @@ -199,12 +199,12 @@ func (w *Watch) getRecentXIDs(ctx context.Context, value uint64, tenantID string err = rows.Err() if err != nil { - slog.Error("failed to iterate over rows", slog.Any("error", err)) + slog.ErrorContext(ctx, "failed to iterate over rows", slog.Any("error", err)) return nil, err } - slog.Debug("successfully retrieved recent transaction", slog.Any("ids", xids)) + slog.DebugContext(ctx, "successfully retrieved recent transaction", slog.Any("ids", xids)) return xids, nil } @@ -220,7 +220,7 @@ func (w *Watch) getChanges(ctx context.Context, value types.XID8, tenantID strin // Initialize a new TupleChanges instance. changes := &base.DataChanges{} - slog.Debug("retrieving changes for transaction", slog.Any("id", value), slog.Any("tenant_id", tenantID)) + slog.DebugContext(ctx, "retrieving changes for transaction", slog.Any("id", value), slog.Any("tenant_id", tenantID)) // Construct the SQL SELECT statement for retrieving the changes from the RelationTuplesTable. tbuilder := w.database.Builder.Select("entity_type, entity_id, relation, subject_type, subject_id, subject_relation, expired_tx_id"). @@ -233,17 +233,17 @@ func (w *Watch) getChanges(ctx context.Context, value types.XID8, tenantID strin // Generate the SQL query and arguments. tquery, targs, err := tbuilder.ToSql() if err != nil { - slog.Error("error while building sql query for relation tuples", slog.Any("error", err)) + slog.ErrorContext(ctx, "error while building sql query for relation tuples", slog.Any("error", err)) return nil, err } - slog.Debug("executing sql query for relation tuples", slog.Any("query", tquery), slog.Any("arguments", targs)) + slog.DebugContext(ctx, "executing sql query for relation tuples", slog.Any("query", tquery), slog.Any("arguments", targs)) // Execute the SQL query and retrieve the result rows. var trows pgx.Rows trows, err = w.database.ReadPool.Query(ctx, tquery, targs...) if err != nil { - slog.Error("failed to execute sql query for relation tuples", slog.Any("error", err)) + slog.ErrorContext(ctx, "failed to execute sql query for relation tuples", slog.Any("error", err)) return nil, errors.New(base.ErrorCode_ERROR_CODE_EXECUTION.String()) } // Ensure the rows are closed after processing. @@ -258,16 +258,16 @@ func (w *Watch) getChanges(ctx context.Context, value types.XID8, tenantID strin aquery, aargs, err := abuilder.ToSql() if err != nil { - slog.Error("error while building SQL query for attributes", slog.Any("error", err)) + slog.ErrorContext(ctx, "error while building SQL query for attributes", slog.Any("error", err)) return nil, err } - slog.Debug("executing sql query for attributes", slog.Any("query", aquery), slog.Any("arguments", aargs)) + slog.DebugContext(ctx, "executing sql query for attributes", slog.Any("query", aquery), slog.Any("arguments", aargs)) var arows pgx.Rows arows, err = w.database.ReadPool.Query(ctx, aquery, aargs...) if err != nil { - slog.Error("error while executing SQL query for attributes", slog.Any("error", err)) + slog.ErrorContext(ctx, "error while executing SQL query for attributes", slog.Any("error", err)) return nil, errors.New(base.ErrorCode_ERROR_CODE_EXECUTION.String()) } // Ensure the rows are closed after processing. @@ -284,7 +284,7 @@ func (w *Watch) getChanges(ctx context.Context, value types.XID8, tenantID strin // Scan the result row into a RelationTuple instance. err = trows.Scan(&rt.EntityType, &rt.EntityID, &rt.Relation, &rt.SubjectType, &rt.SubjectID, &rt.SubjectRelation, &expiredXID) if err != nil { - slog.Error("error while scanning row for relation tuples", slog.Any("error", err)) + slog.ErrorContext(ctx, "error while scanning row for relation tuples", slog.Any("error", err)) return nil, err } @@ -314,7 +314,7 @@ func (w *Watch) getChanges(ctx context.Context, value types.XID8, tenantID strin // Scan the result row into a RelationTuple instance. err = arows.Scan(&rt.EntityType, &rt.EntityID, &rt.Attribute, &valueStr, &expiredXID) if err != nil { - slog.Error("error while scanning row for attributes", slog.Any("error", err)) + slog.ErrorContext(ctx, "error while scanning row for attributes", slog.Any("error", err)) return nil, err } @@ -323,7 +323,7 @@ func (w *Watch) getChanges(ctx context.Context, value types.XID8, tenantID strin unmarshaler := &jsonpb.Unmarshaler{} err = unmarshaler.Unmarshal(strings.NewReader(valueStr), rt.Value) if err != nil { - slog.Error("failed to unmarshal attribute value", slog.Any("error", err)) + slog.ErrorContext(ctx, "failed to unmarshal attribute value", slog.Any("error", err)) return nil, err } @@ -342,7 +342,7 @@ func (w *Watch) getChanges(ctx context.Context, value types.XID8, tenantID strin }) } - slog.Debug("successfully retrieved changes for transaction", slog.Any("id", value)) + slog.DebugContext(ctx, "successfully retrieved changes for transaction", slog.Any("id", value)) // Return the changes and no error. return changes, nil diff --git a/pkg/cmd/serve.go b/pkg/cmd/serve.go index a318f9de6..e792a17b3 100644 --- a/pkg/cmd/serve.go +++ b/pkg/cmd/serve.go @@ -176,50 +176,12 @@ func serve() func(cmd *cobra.Command, args []string) error { // Print banner and initialize logger internal.PrintBanner() - var handler slog.Handler - - switch cfg.Log.Output { - case "json": - handler = telemetry.OtelHandler{ - Next: slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{ - Level: getLogLevel(cfg.Log.Level), - }), - } - case "text": - handler = telemetry.OtelHandler{ - Next: slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{ - Level: getLogLevel(cfg.Log.Level), - }), - } - default: - handler = telemetry.OtelHandler{ - Next: slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{ - Level: getLogLevel(cfg.Log.Level), - }), - } - } - logger := slog.New(handler) - slog.SetDefault(logger) - - internal.Identifier = cfg.AccountID - if internal.Identifier == "" { - message := "Account ID is not set. Please fill in the Account ID for better support. Get your Account ID from https://permify.co/account" - slog.Error(message) - - ticker := time.NewTicker(24 * time.Hour) - defer ticker.Stop() - - go func() { - for range ticker.C { - slog.Error(message) - } - }() - } - // Set up context and signal handling ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM) defer stop() + var logger *slog.Logger + if cfg.Log.Enabled { headers := map[string]string{} for _, header := range cfg.Log.Headers { @@ -230,16 +192,19 @@ func serve() func(cmd *cobra.Command, args []string) error { headers[h[0]] = h[1] } - exporter, _ := logexporters.ExporterFactory( + exporter, err := logexporters.ExporterFactory( cfg.Log.Exporter, cfg.Log.Endpoint, cfg.Log.Insecure, cfg.Log.URLPath, headers, ) + if err != nil { + return errors.New("invalid logger exporter") + } lp := telemetry.NewLog(exporter) - logger := slog.New(otelslog.NewOtelHandler(lp, &otelslog.HandlerOptions{ + logger = slog.New(otelslog.NewOtelHandler(lp, &otelslog.HandlerOptions{ Level: getLogLevel(cfg.Log.Level), })) @@ -250,6 +215,41 @@ func serve() func(cmd *cobra.Command, args []string) error { slog.Error(err.Error()) } }() + } else { + var handler slog.Handler + + switch cfg.Log.Output { + case "json": + handler = slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{ + Level: getLogLevel(cfg.Log.Level), + }) + case "text": + handler = slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{ + Level: getLogLevel(cfg.Log.Level), + }) + default: + handler = slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{ + Level: getLogLevel(cfg.Log.Level), + }) + } + + logger = slog.New(handler) + slog.SetDefault(logger) + } + + internal.Identifier = cfg.AccountID + if internal.Identifier == "" { + message := "Account ID is not set. Please fill in the Account ID for better support. Get your Account ID from https://permify.co/account" + slog.Error(message) + + ticker := time.NewTicker(24 * time.Hour) + defer ticker.Stop() + + go func() { + for range ticker.C { + slog.Error(message) + } + }() } slog.Info("🚀 starting permify service...") diff --git a/pkg/pb/base/v1/openapi.pb.go b/pkg/pb/base/v1/openapi.pb.go index 6392bab77..aca73a404 100644 --- a/pkg/pb/base/v1/openapi.pb.go +++ b/pkg/pb/base/v1/openapi.pb.go @@ -28,7 +28,7 @@ var file_base_v1_openapi_proto_rawDesc = []byte{ 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x42, 0xfb, 0x03, 0x92, 0x41, 0xed, 0x02, 0x12, 0x9e, 0x02, 0x0a, 0x0b, 0x50, 0x65, 0x72, 0x6d, + 0x42, 0xfc, 0x03, 0x92, 0x41, 0xee, 0x02, 0x12, 0x9f, 0x02, 0x0a, 0x0b, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x66, 0x79, 0x20, 0x41, 0x50, 0x49, 0x12, 0x6d, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x66, 0x79, 0x20, 0x69, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, @@ -46,21 +46,21 @@ var file_base_v1_openapi_proto_rawDesc = []byte{ 0x2f, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x66, 0x79, 0x2f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x66, 0x79, 0x2f, 0x62, 0x6c, 0x6f, 0x62, 0x2f, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x2f, 0x4c, 0x49, 0x43, 0x45, 0x4e, 0x53, 0x45, - 0x32, 0x06, 0x76, 0x30, 0x2e, 0x39, 0x2e, 0x39, 0x2a, 0x01, 0x02, 0x32, 0x10, 0x61, 0x70, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x3a, 0x10, 0x61, - 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x5a, - 0x23, 0x0a, 0x21, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, - 0x13, 0x08, 0x02, 0x1a, 0x0d, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x02, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, - 0x31, 0x42, 0x0c, 0x4f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, - 0x01, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x50, 0x65, - 0x72, 0x6d, 0x69, 0x66, 0x79, 0x2f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x66, 0x79, 0x2f, 0x70, 0x6b, - 0x67, 0x2f, 0x70, 0x62, 0x2f, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x76, 0x31, 0x3b, 0x62, 0x61, 0x73, - 0x65, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x42, 0x58, 0x58, 0xaa, 0x02, 0x07, 0x42, 0x61, 0x73, 0x65, - 0x2e, 0x56, 0x31, 0xca, 0x02, 0x07, 0x42, 0x61, 0x73, 0x65, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x13, - 0x42, 0x61, 0x73, 0x65, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0xea, 0x02, 0x08, 0x42, 0x61, 0x73, 0x65, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x32, 0x07, 0x76, 0x30, 0x2e, 0x31, 0x30, 0x2e, 0x30, 0x2a, 0x01, 0x02, 0x32, 0x10, 0x61, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x3a, 0x10, + 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, + 0x5a, 0x23, 0x0a, 0x21, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, + 0x12, 0x13, 0x08, 0x02, 0x1a, 0x0d, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x02, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, + 0x76, 0x31, 0x42, 0x0c, 0x4f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, + 0x50, 0x01, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x50, + 0x65, 0x72, 0x6d, 0x69, 0x66, 0x79, 0x2f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x66, 0x79, 0x2f, 0x70, + 0x6b, 0x67, 0x2f, 0x70, 0x62, 0x2f, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x76, 0x31, 0x3b, 0x62, 0x61, + 0x73, 0x65, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x42, 0x58, 0x58, 0xaa, 0x02, 0x07, 0x42, 0x61, 0x73, + 0x65, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x07, 0x42, 0x61, 0x73, 0x65, 0x5c, 0x56, 0x31, 0xe2, 0x02, + 0x13, 0x42, 0x61, 0x73, 0x65, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x08, 0x42, 0x61, 0x73, 0x65, 0x3a, 0x3a, 0x56, 0x31, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var file_base_v1_openapi_proto_goTypes = []any{} diff --git a/pkg/telemetry/slogotel.go b/pkg/telemetry/slogotel.go deleted file mode 100644 index 95e9230e7..000000000 --- a/pkg/telemetry/slogotel.go +++ /dev/null @@ -1,201 +0,0 @@ -package telemetry - -import ( - "context" - "fmt" - "log/slog" - "time" - - "go.opentelemetry.io/otel/attribute" - "go.opentelemetry.io/otel/baggage" - "go.opentelemetry.io/otel/codes" - "go.opentelemetry.io/otel/trace" -) - -type OtelHandler struct { - // Next represents the next handler in the chain. - Next slog.Handler - // NoBaggage determines whether to add context baggage members to the log record. - NoBaggage bool - // NoTraceEvents determines whether to record an event for every log on the active trace. - NoTraceEvents bool -} - -type OtelHandlerOpt func(handler *OtelHandler) - -// HandlerFn defines the handler used by slog.Handler as return value. -type HandlerFn func(slog.Handler) slog.Handler - -// WithNoBaggage returns an OtelHandlerOpt, which sets the NoBaggage flag -func WithNoBaggage(noBaggage bool) OtelHandlerOpt { - return func(handler *OtelHandler) { - handler.NoBaggage = noBaggage - } -} - -// WithNoTraceEvents returns an OtelHandlerOpt, which sets the NoTraceEvents flag -func WithNoTraceEvents(noTraceEvents bool) OtelHandlerOpt { - return func(handler *OtelHandler) { - handler.NoTraceEvents = noTraceEvents - } -} - -// New creates a new OtelHandler to use with log/slog -func New(next slog.Handler, opts ...OtelHandlerOpt) *OtelHandler { - ret := &OtelHandler{ - Next: next, - } - for _, opt := range opts { - opt(ret) - } - return ret -} - -// NewOtelHandler creates and returns a new HandlerFn, which wraps a handler with OtelHandler to use with log/slog. -func NewOtelHandler(opts ...OtelHandlerOpt) HandlerFn { - return func(next slog.Handler) slog.Handler { - return New(next, opts...) - } -} - -// Handle handles the provided log record and adds correlation between a slog record and an Open-Telemetry span. -func (h OtelHandler) Handle(ctx context.Context, record slog.Record) error { - if ctx == nil { - return h.Next.Handle(ctx, record) - } - - if !h.NoBaggage { - // Adding context baggage members to log record. - b := baggage.FromContext(ctx) - for _, m := range b.Members() { - record.AddAttrs(slog.String(m.Key(), m.Value())) - } - } - - span := trace.SpanFromContext(ctx) - if span == nil || !span.IsRecording() { - return h.Next.Handle(ctx, record) - } - - if !h.NoTraceEvents { - // Adding log info to span event. - eventAttrs := make([]attribute.KeyValue, 0, record.NumAttrs()) - eventAttrs = append(eventAttrs, attribute.String(slog.MessageKey, record.Message)) - eventAttrs = append(eventAttrs, attribute.String(slog.LevelKey, record.Level.String())) - eventAttrs = append(eventAttrs, attribute.String(slog.TimeKey, record.Time.Format(time.RFC3339Nano))) - record.Attrs(func(attr slog.Attr) bool { - otelAttr := h.slogAttrToOtelAttr(attr) - if otelAttr.Valid() { - eventAttrs = append(eventAttrs, otelAttr) - } - - return true - }) - - span.AddEvent("LogRecord", trace.WithAttributes(eventAttrs...)) - } - - // Adding span info to log record. - spanContext := span.SpanContext() - if spanContext.HasTraceID() { - traceID := spanContext.TraceID().String() - record.AddAttrs(slog.String("TraceId", traceID)) - } - - if spanContext.HasSpanID() { - spanID := spanContext.SpanID().String() - record.AddAttrs(slog.String("SpanId", spanID)) - } - - // Setting span status if the log is an error. - // Purposely leaving as codes.Unset (default) otherwise. - if record.Level >= slog.LevelError { - span.SetStatus(codes.Error, record.Message) - } - - return h.Next.Handle(ctx, record) -} - -// WithAttrs returns a new Otel whose attributes consists of handler's attributes followed by attrs. -func (h OtelHandler) WithAttrs(attrs []slog.Attr) slog.Handler { - return OtelHandler{ - Next: h.Next.WithAttrs(attrs), - NoBaggage: h.NoBaggage, - NoTraceEvents: h.NoTraceEvents, - } -} - -// WithGroup returns a new Otel with a group, provided the group's name. -func (h OtelHandler) WithGroup(name string) slog.Handler { - return OtelHandler{ - Next: h.Next.WithGroup(name), - NoBaggage: h.NoBaggage, - NoTraceEvents: h.NoTraceEvents, - } -} - -// Enabled reports whether the logger emits log records at the given context and level. -// Note: We handover the decision down to the next handler. -func (h OtelHandler) Enabled(ctx context.Context, level slog.Level) bool { - return h.Next.Enabled(ctx, level) -} - -// slogAttrToOtelAttr converts a slog attribute to an OTel one. -// Note: returns an empty attribute if the provided slog attribute is empty. -func (h OtelHandler) slogAttrToOtelAttr(attr slog.Attr, groupKeys ...string) attribute.KeyValue { - attr.Value = attr.Value.Resolve() - if attr.Equal(slog.Attr{}) { - return attribute.KeyValue{} - } - - key := func(k string, prefixes ...string) string { - for _, prefix := range prefixes { - k = fmt.Sprintf("%s.%s", prefix, k) - } - - return k - }(attr.Key, groupKeys...) - - value := attr.Value.Resolve() - - switch attr.Value.Kind() { - case slog.KindBool: - return attribute.Bool(key, value.Bool()) - case slog.KindFloat64: - return attribute.Float64(key, value.Float64()) - case slog.KindInt64: - return attribute.Int64(key, value.Int64()) - case slog.KindString: - return attribute.String(key, value.String()) - case slog.KindTime: - return attribute.String(key, value.Time().Format(time.RFC3339Nano)) - case slog.KindGroup: - groupAttrs := value.Group() - if len(groupAttrs) == 0 { - return attribute.KeyValue{} - } - - for _, groupAttr := range groupAttrs { - return h.slogAttrToOtelAttr(groupAttr, append(groupKeys, key)...) - } - case slog.KindAny: - switch v := attr.Value.Any().(type) { - case []string: - return attribute.StringSlice(key, v) - case []int: - return attribute.IntSlice(key, v) - case []int64: - return attribute.Int64Slice(key, v) - case []float64: - return attribute.Float64Slice(key, v) - case []bool: - return attribute.BoolSlice(key, v) - default: - return attribute.KeyValue{} - } - default: - return attribute.KeyValue{} - } - - return attribute.KeyValue{} -} diff --git a/proto/base/v1/openapi.proto b/proto/base/v1/openapi.proto index ef29b4462..24a409a2a 100644 --- a/proto/base/v1/openapi.proto +++ b/proto/base/v1/openapi.proto @@ -9,7 +9,7 @@ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = { info: { title: "Permify API"; description: "Permify is an open source authorization service for creating fine-grained and scalable authorization systems."; - version: "v0.9.9"; + version: "v0.10.0"; contact: { name: "API Support"; url: "https://github.com/Permify/permify/issues";