Zum Inhalt springen

Job-Reports-API

Job-Reports sind Teil von Vaicoa Pro und Vaicoa Team. Wie du einen einrichtest: Bei fehlgeschlagenen Jobs Bescheid bekommen.

RequestPOST https://api.vaicoa.com/v1/ingest/job
AuthentifizierungHeader X-Agent-Token: <agent_token>, das Token pro Server des überwachten Servers, zu dem der Job gehört
Content-Typeapplication/json
BodyHöchstens 4 KiB

Das Token entscheidet, zu welchem Server ein Job gehört. Ein Job, der woanders läuft, nutzt das Token des Servers, auf den er sich bezieht. Auf einem Server mit Agent ist das Token CV_AGENT_TOKEN in /etc/cloudviewer-agent/agent.env.

{
"reports": [
{ "job_name": "backup-s3", "exit_code": 0, "duration_seconds": 412, "max_age_seconds": 93600 }
]
}
FeldTypPflichtBedeutung
reportsArray mit 1 bis 16 ObjektenjaEin Objekt pro Job
reports[].job_nameString, ^[a-z0-9][a-z0-9-_.]{0,63}$jaDer Name des Jobs auf seinem Server. Der erste Report mit einem neuen Namen legt den Job an
reports[].exit_codeInteger, 32 Bitja0 ist ein Erfolg, alles andere ein Fehlschlag
reports[].duration_secondsZahl, 0 oder mehrneinWie lange der Durchlauf gedauert hat
reports[].max_age_secondsZahl, größer als 0neinWie alt der letzte erfolgreiche Durchlauf werden darf, bevor der Job veraltet ist. Weglassen, wenn du nur Alarme bei Fehlschlägen willst
  • job_name: Kleinbuchstaben, Ziffern, -, _ und ., 1 bis 64 Zeichen, beginnend mit einem Buchstaben oder einer Ziffer.
  • Unbekannte Felder werden abgewiesen. Es gibt kein Nachrichtenfeld und kein Zeitfeld: Die Zeit des Durchlaufs ist der Moment, in dem Vaicoa den Report empfängt.
  • Ein Request gilt ganz oder gar nicht: Ist ein Report ungültig, wird keiner gespeichert.
  • Jeder Report ersetzt den letzten Stand des Jobs, auch max_age_seconds. Ein Report ohne dieses Feld entfernt die Zeitgrenze des Jobs.
  • Nur ein Report mit Exit-Code 0 setzt die Zeit des letzten Erfolgs neu.
  • Vaicoa speichert den letzten Stand jedes Jobs, keine Historie der Durchläufe: letzte Ausführung, letzter Erfolg, letzter Exit-Code, letzte Dauer und die Zeitgrenze.
StatuscodeWann
202Angenommen. Body: {"accepted": <number of reports>}
401unauthorizedToken fehlt oder ist unbekannt
401agent_revokedToken entzogen
403entitlement_requiredDer Plan des Teams enthält keine Job-Reports
413validation_failedBody größer als 4 KiB
422invalid_schemaKein JSON, ein unbekanntes Feld, kein exit_code, keine oder mehr als 16 Reports, oder eine Zahl außerhalb des erlaubten Bereichs
422invalid_job_namejob_name passt nicht zum Muster
422job_limit_reachedDer Report würde einen 17. Job auf dem Server anlegen
429rate_limitedMehr als das Request-Budget. Retry-After sagt, wann du es erneut versuchen kannst
503internal, busyVaicoa ist ausgelastet oder nicht verfügbar. Nach Retry-After erneut versuchen

Fehler sind JSON: {"code": "…", "message": "…"}. Die Nachricht nennt das Feld, zum Beispiel reports[0].job_name must match [a-z0-9][a-z0-9-_.]{0,63}.

GrenzeWert
Body4 KiB
Reports pro Request1 bis 16
Jobs pro Server16. Reports für bestehende Jobs werden immer angenommen
Requests pro Token2 pro Minute, Bursts bis 16

Viele Cronjobs, die zur vollen Stunde starten, passen in den Burst, und ein Request kann bis zu 16 Jobs enthalten. Ein Job besteht so lange wie sein Server; einen einzelnen Job zu entfernen ist noch nicht möglich.

Terminal-Fenster
cloudviewer-report --job <name> [--max-age <duration>] [--token-file <path>] -- <command> [arguments…]
FlagBedeutung
--job <name>Pflicht. Der job_name
--max-age <duration>Sekunden oder eine Zahl mit m, h oder d: 26h sind 93600. Wird als max_age_seconds gesendet. Weglassen, wenn du nur Alarme bei Fehlschlägen willst
--token-file <path>Liest das Token aus dieser Datei, die nur das Token enthält. Für einen Server ohne Agent oder einen Nutzer, der agent.env nicht lesen kann
--Beendet die Flags. Alles danach ist der Befehl
  • Der Wrapper ist Teil des Agent-Pakets, unter /usr/bin/cloudviewer-report.
  • Er führt zuerst den Befehl aus, sendet dann dessen Exit-Code und die Dauer in ganzen Sekunden und beendet sich mit dem Exit-Code des Befehls.
  • Token: --token-file, sonst CV_AGENT_TOKEN aus der Umgebung, sonst /etc/cloudviewer-agent/agent.env. Normale Nutzer können diese Datei nicht lesen, ein Job, der nicht als root läuft, braucht also --token-file.
  • API-URL: CV_AGENT_FACADE_URL, sonst https://api.vaicoa.com. Kommt das Token aus agent.env, gilt die URL aus dieser Datei.
  • Ohne Token gibt er „job ran, not reported“ aus und beendet sich mit dem Exit-Code des Befehls.
  • Bei 429 oder 503 versucht er es einmal erneut, nach Retry-After (höchstens 60 Sekunden, 5, wenn der Header fehlt). Bei jedem anderen Fehler gibt er den HTTP-Status aus; der Exit-Code bleibt der des Befehls. Jeder Request bricht nach 15 Sekunden ab.
  • Ein fehlendes --job, ein fehlender Befehl oder ein ungültiges --max-age ist ein Bedienfehler: Exit-Code 2, und der Befehl läuft nicht.
StatusWann
ErfolgreichDer letzte Exit-Code ist 0 und der Job ist nicht veraltet
FehlgeschlagenDer letzte Exit-Code ist nicht 0
VeraltetDer Job hat ein max_age_seconds, und sein letzter erfolgreicher Durchlauf ist älter. „Veraltet“ hat Vorrang vor einem letzten Exit-Code 0

Ein Job, der nie erfolgreich war, wird nie veraltet, weil es keinen Erfolg gibt, von dem aus gemessen wird. Er erscheint als Fehlgeschlagen, und seine Zeile zeigt Nie erfolgreich.

RegelSchwereLöst aus, wenn
UserJobFailedWarnungder letzte Exit-Code 5 Minuten lang nicht 0 ist
UserJobStaleWarnungder letzte erfolgreiche Durchlauf 5 Minuten lang älter ist als das max_age_seconds des Jobs
  • Vaicoa prüft jeden Job einmal pro Minute.
  • Ein Job ohne max_age_seconds bekommt nur UserJobFailed.
  • Ein fehlgeschlagener Durchlauf, auf den innerhalb von 5 Minuten ein erfolgreicher folgt, löst keinen Alarm aus. Der nächste erfolgreiche Durchlauf beendet beide Alarme.
  • Alle Regeln: Alarmregeln.