{"record":{"id":"4dca4f89e66f6cf7","repo":"SigNoz/signoz","slug":"codetoomanyrequests","errorCode":"CodeTooManyRequests","errorMessage":"openfgaError.Error()","messagePattern":"openfgaError\\.Error\\(\\)","errorType":"error_code","errorClass":"errors.SignozError","httpStatus":429,"severity":"error","filePath":"pkg/authz/openfgaserver/server.go","lineNumber":277,"sourceCode":"\t\t\t}\n\t\t}(),\n\t\tDeletes: func() *openfgav1.WriteRequestDeletes {\n\t\t\tif len(deletionTuplesWithoutCondition) == 0 {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn &openfgav1.WriteRequestDeletes{\n\t\t\t\tTupleKeys: deletionTuplesWithoutCondition,\n\t\t\t\tOnMissing: \"ignore\",\n\t\t\t}\n\t\t}(),\n\t})\n\n\tif err != nil {\n\t\topenfgaError := new(openfgaerrors.InternalError)\n\t\tok := errors.As(err, openfgaError)\n\t\tif ok {\n\t\t\tserver.settings.Logger().ErrorContext(ctx, writeErrorMessage, errors.Attr(openfgaError.Unwrap()))\n\t\t\treturn errors.New(errors.TypeTooManyRequests, errors.CodeTooManyRequests, openfgaError.Error())\n\t\t}\n\n\t\tserver.settings.Logger().ErrorContext(ctx, writeErrorMessage, errors.Attr(err))\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\nfunc (server *Server) ReadTuples(ctx context.Context, tupleKey *openfgav1.ReadRequestTupleKey) ([]*openfgav1.TupleKey, error) {\n\tstoreID, _ := server.getStoreIDandModelID()\n\tvar tuples []*openfgav1.TupleKey\n\tcontinuationToken := \"\"\n\n\tfor {\n\t\tresponse, err := server.openfgaServer.Read(ctx, &openfgav1.ReadRequest{\n\t\t\tStoreId:           storeID,\n\t\t\tTupleKey:          tupleKey,","sourceCodeStart":259,"sourceCodeEnd":295,"githubUrl":"https://github.com/SigNoz/signoz/blob/5069bf80b08f1f00d7e014eccc09902f9871004f/pkg/authz/openfgaserver/server.go#L259-L295","documentation":"Returned by the OpenFGA write path when the underlying OpenFGA client returns an error that unwraps to an InternalError; it is re-exposed as TooManyRequests because writes are commonly rejected under load/quota. The message is the OpenFGA error's own text (openfgaError.Error()).","triggerScenarios":"Calling Write (tuples write/delete/check) against OpenFGA when the server returns an internal error — often rate limiting, connection limits, or store overload surfaced as InternalError.","commonSituations":"OpenFGA container resource-starved or restarting; too many concurrent writes from telemetry pipeline; OpenFGA version where rate limits map to InternalError; network issues between query-service and OpenFGA.","solutions":["Check OpenFGA container health/logs and restart it if it is crash-looping or overloaded","Reduce write concurrency / batch tuple writes to stay under OpenFGA limits","Verify network connectivity and OPENFGA_API_URL/creds between the service and OpenFGA","Retry with backoff — this error type is transient in nature"],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"err := server.Write(ctx, req)\nif err != nil {\n    if errors.Is(err, errors.CodeTooManyRequests) {\n        // exponential backoff + jitter, honor Retry-After if present\n        return retryWithBackoff(func() error { return server.Write(ctx, req) })\n    }\n    return err\n}","preventionTips":["Wrap OpenFGA writes in bounded exponential backoff","Batch tuple writes instead of per-event writes","Monitor OpenFGA container CPU/memory to catch overload early"],"tags":["openfga","authorization","rate-limit","go"],"backgroundTag":"backend-rate-limit-exceeded","analyzedSha":"5069bf80b08f1f00d7e014eccc09902f9871004f","analyzedAt":"2026-08-28T06:22:12.824Z","schemaVersion":2},"datasetVersion":"2026-08-28T11:17:15.048Z"}