Hoppa till innehållet
Stackship-dokumentation English

Stackship-plattformenAnvändareMaskinöversatt

Fel

Kroppen som ett misslyckat API-anrop returnerar, vad varje HTTP-statuskod betyder på plattformen, och var du slår upp ett fels kod.

Felkroppen

Ett misslyckat anrop svarar med en HTTP-statuskod och, i de flesta fall, den här JSON-kroppen:

json
{
  "error": "Access denied. You do not have permission to perform this action.",
  "code": "FORBIDDEN",
  "module": "apps",
  "correlationId": "3f2b9c1e-6d4a-4e0b-9a51-2c7d8e0f4b6a",
  "traceId": "4bf92f3577b34da6a3ce929d0e0e4736"
}
Fält Betydelse
error En mening som beskriver vad som gick fel. Den är skriven för människor, och formuleringen kan ändras
code En stabil, maskinläsbar kod. Låt din kod välja väg efter code, inte efter error. Se Slå upp en kod
module Dokumentationsnyckeln för modulen som svarade: kernel för plattformens kärna, eller en modul som apps eller db-postgres. Ett fel som kärnan skickar vidare från en modul behåller modulens nyckel, också när kärnan ersätter resten av kroppen (se Fel från gatewayen)
targetModule Bara med MODULE_UNAVAILABLE: modulen som kärnan inte nådde. Fältet innehåller resurstypen från anropets sökväg, till exempel postgresclusters, eller modulens registreringsnamn, till exempel postgres — inte en dokumentationsnyckel som i module
correlationId Identifierar anropet. Skicka en header X-Correlation-Id så använder — och returnerar — plattformen din; annars är det ett genererat GUID, eller anropets spår-ID
traceId Identifierar anropets spår i plattformens loggar. Alla fel har det inte
details Extra data, bara för vissa koder — till exempel fältfelen för VALIDATION_FAILED

Ett fält utan värde utelämnas eller skickas som null. Ett fel från en äldre modul kan sakna code och module. Vissa koder lägger till egna fält; kodens avsnitt i referensen listar dem. Ange correlationId när du rapporterar ett problem.

Fel i problemformatet

Vissa rutter svarar i stället i standardformatet för problem, med innehållstypen application/problem+json. Det gör bland andra filrutterna för appar och containerinstanser och rutterna för ögonblicksbilder:

json
{
  "type": "…",
  "title": "backups-not-configured",
  "status": 422,
  "detail": "Backups are not enabled on PostgreSQL cluster 'orders', so there is no archive to snapshot into.",
  "code": "backups-not-configured",
  "remediation": "Enable backups in the cluster's Configuration, wait for the first archive, then snapshot.",
  "module": "db-postgres",
  "correlationId": "3f2b9c1e-6d4a-4e0b-9a51-2c7d8e0f4b6a"
}

Den här kroppen har inget fält error. Meningen för människor står i detail, som vissa koder lämnar tomt, och title är antingen en kort sammanfattning eller själva koden. code, module och correlationId betyder samma sak som ovan.

En klient som läser error när det finns, och annars detail och sedan title, hittar en mening att visa för varje fel.

Statuskoder

Status Typisk code Betydelse
400 BAD_REQUEST, MODEL_BINDING_FAILED Anropet är felformat eller ett värde är ogiltigt. Se Valideringsfel
401 UNAUTHORIZED Ingen token, eller en token som är ogiltig eller har gått ut. Se Autentisera
403 FORBIDDEN, FORBIDDEN_REQUESTABLE, VAULT_GRANT_FORBIDDEN Du är inloggad men saknar behörigheten med den här omfattningen. Se Behörighetsfel
404 NOT_FOUND Rutten eller resursen finns inte
405 METHOD_NOT_ALLOWED Rutten finns men inte med den här metoden
409 CONFLICT, DUPLICATE Anropet krockar med det aktuella tillståndet: namnet är upptaget, resursen är upptagen med en annan ändring, eller så ändrades den medan du ändrade den
412 — Ett villkor i If-Match uppfylldes inte. Se Samtidiga ändringar
413 too_large Uppladdningen är större än rutten tar emot. Se Fel vid filåtkomst
422 VALIDATION_FAILED med flera Anropet är korrekt format men avvisas: det klarar inte valideringen, eller en regel förbjuder det — till exempel en policy för beräkningsplaner eller en avvisad ögonblicksbild
429 REQUEST_FAILED, resend_limit För många anrop till en rutt med hastighetsbegränsning; försök igen senare. Med resend_limit har en inbjudan skickats om så många gånger som den får
500 INTERNAL_ERROR Ett oväntat fel på plattformen
501 NOT_SUPPORTED Åtgärden stöds inte
502 PLATFORM_ERROR, GRPC_ERROR Ett anrop från plattformen till Kubernetes eller till en annan plattformstjänst misslyckades. PLATFORM_ERROR kommer också med en 4xx-status när Kubernetes avvisade ändringen — se PLATFORM_ERROR
503 MODULE_UNAVAILABLE, AUTHORIZATION_UNAVAILABLE, compute_plan_policy_unavailable Något som rutten är beroende av kan inte svara just nu. Det är code som avgör om ett nytt försök hjälper, och kodens dokumentation säger det — se Slå upp en kod. Med MODULE_UNAVAILABLE, AUTHORIZATION_UNAVAILABLE, compute_plan_policy_unavailable och GRPC_ERROR försöker du igen om en stund; en moduls egna 503-koder förklaras på modulens sidor. Ett 503 med REQUEST_FAILED anger ingen orsak; hjälper inte ett nytt försök rapporterar du det med correlationId

Slå upp en kod

En kod dokumenteras av modulen som äger den. Koder som betyder samma sak oavsett vilken modul som svarar dokumenteras en gång, under plattformens kärna (kernel), trots att kroppens module anger modulen som svarade: ett filfel från en app har "module": "apps", och dess kod finns på Fel vid filåtkomst. En moduls egna koder finns på modulens sidor.

Slå därför först upp en kod med paret module och code, och om den modulen inte dokumenterar koden, med kernel och koden. Plattformens dokumentationstjänst svarar på GET /docs-hub/errors/{module}/{code} för ett exakt par; den provar inte kernel åt dig.

Koderna som dokumenteras under kärnan finns på tre sidor:

  • Felkoder — koderna som alla moduler kan svara med, och kärnans egna
  • Fel vid filåtkomst — filrutterna för appar och containerinstanser
  • Fel vid ögonblicksbilder — varför en ögonblicksbild eller återställning av ett PostgreSQL-kluster, en SQL Server-instans eller en containerinstans avvisas

Valideringsfel

Valideringsfel kommer i de här formerna, beroende på rutten:

  • 422 med VALIDATION_FAILED, och en post per fält i details:

    json
    {
      "error": "Validation failed.",
      "code": "VALIDATION_FAILED",
      "details": [{ "field": "Name", "message": "…" }]
    }

    Vissa kontroller svarar VALIDATION_FAILED med orsaken i error och utan details.

  • 400 med BAD_REQUEST och fältfelen i errors: antingen i standardformatet för problem, per fält, eller som en lista med meddelanden:

    json
    {
      "title": "One or more validation errors occurred.",
      "status": 400,
      "errors": { "Region": ["Region is required"] },
      "code": "BAD_REQUEST"
    }
  • 400 med BAD_REQUEST och bara ett meddelande i error.

Behörighetsfel

Ett 403 säger oftast inte vilken behörighet som saknades; rollerna som ger en åtgärd listas på varje moduls behörighetssida. Be en ägare av boundaryn om den roll du behöver.

När kroppens code är FORBIDDEN_REQUESTABLE kan behörigheten begäras som just-in-time-åtkomst: details anger åtgärden, omfattningen och rollen att begära. Se Begär åtkomst. Med VAULT_GRANT_FORBIDDEN har en begäran redan skickats åt dig; se VAULT_GRANT_FORBIDDEN.

Samtidiga ändringar

Appar har stöd för optimistisk samtidighet: att läsa en app returnerar en header ETag, och ett PATCH som skickar tillbaka den som If-Match svarar 412 om appen har ändrats sedan dess. Utan If-Match tillämpas ett PATCH som förlorar en kapplöpning mot en annan ändring på nytt på appen som den ser ut nu, upp till fem gånger, så att samtidiga ändringar av olika fält alla går igenom; först när alla fem försöken förlorar svarar det 409. Andra resurser använder inte ETag eller If-Match; en krockande ändring svarar 409.

Fel från gatewayen

Anrop till en moduls rutter passerar först plattformens kärna, som skickar dem vidare till modulen. Kärnan svarar själv på vissa fel, med "module": "kernel":

  • 401 med UNAUTHORIZED och "error": "missing bearer token" — när token saknas, men också när den är ogiltig eller har gått ut.
  • 503 med MODULE_UNAVAILABLE när modulen inte kör eller inte svarar. Modulen som den inte nådde står i targetModule. Se MODULE_UNAVAILABLE.

En moduls egna 4xx-svar skickas vidare oförändrade. Ett 5xx-svar från en modul ersätts med {"error": "An internal error occurred.", "code": "…", "module": "…", "correlationId": "…"}, så att detaljerna stannar i plattformens loggar. Modulens code och module behålls, oavsett om koden skrivs med versaler eller gemener — INTERNAL_ERROR, PLATFORM_ERROR och compute_plan_policy_unavailable likaså — så länge de har formen av en kod och en modulnyckel; allt annat utelämnas. Den ersättande kroppen är vanlig JSON, också när modulen svarade i problemformatet, och har inget traceId. Kodens dokumentation säger vad felet betyder. En plattform som kör i utvecklingsläge skickar vidare 5xx-svar oförändrade.

I CLI:t

stsh skriver ut felet och avslutas med en kod som skiljer felen åt:

Avslutningskod HTTP-status
3 401
4 403
5 404
8 422
1 alla andra fel