Poste Opérations Panneau
Connecter

Maison/Documents/Surveillance

Contrat de surveillance

Version du contrat 2.0.0 · Charge utile schema_version 2.0 · Plans d'essai/payants

La surveillance met votre poste sous surveillance constante : un feu tricolore allumé en direct sa carte dans la liste, une base surveillance onglet dans Détails et message d'état Telegram distinct avec alertes de périphérie. Il combine deux composants activés indépendamment : un pousser le rythme cardiaque (un agent sur l'hôte de votre service se présente selon un horaire déclaré ; le silence est de mise lui-même un signal) et pings de disponibilité (le panneau vérifie votre URLs publics pour la disponibilité).

↓ Télécharger OpenAPI 3.1 (YAML) /monitoring-openapi.yaml · info.version 2.0.0

1. Comment ça marche (deux composants, une lumière)

Une extension est "en surveillance" lorsque la surveillance est activée et qu'au moins un Le composant est configuré. Sinon sa carte présente un point gris neutre.

1b. Heartbeats et le pool de machines à sous

La surveillance se déroule au niveau de l'extension sous la forme de deux listes plates indépendantes qui partagent un pool d'emplacements : pulsations cardiaques (producteurs poussés, anciennement « stands ») et pings de disponibilité (tirer des chèques). Une extension peut avoir plusieurs battements de cœur – par exemple un hôte principal et un travailleur rémunéré. Chaque battement de coeur pousse rapporte avec son propre jeton au porteur et déclare le sien présentation (onglets, sections et lignes Telegram) via son label. Les pings de disponibilité sont une liste plate distincte appartenant à l'extension, non imbriquée sous aucun battement de coeur. Le panneau fusionne tout en une seule lumière globale (la pire), une Surface détaillée et un message récapitulatif Telegram.

Les battements de cœur et les pings partagent un seul par extension pool de machines à sous: un un battement de coeur coûte un emplacement, un ping actif coûte un emplacement, et leur somme ne doit pas dépasser le max_slots du plan (Essai 3 · Studio 10 · Flotte 25). Le dépassement du pool renvoie 409 slot_limit ; après un déclassement, l'excédent est suspendu (pings en premier, battements de cœur en dernier). La réponse porte slots_used et max_slots pour que l'interface utilisateur puisse afficher le budget.

2. Le feu tricolore

L'agrégat est le le pire des cumul sur chaque activé composant du battement de coeur et la lumière de chaque ping actif, où les sévérités sont classées comme ok < warn < crit. La composante d'un battement de coeur est max(reported, watchdog) : reported est la gravité du overall métrique de la dernière accepté rapport; watchdog est un plancher de fraîcheur calculé à partir de la propre réception du panneau horloge (le décalage de l’horloge de l’agent est inoffensif).

ÉtatCouleurQuand
off⚪ grisSurveillance non activée ou aucun composant configuré.
paused⚪ grisActivé mais gelé (plan Gate ou pause manuelle). Les rapports sont toujours stockés.
green🟢Tous les composants ok.
yellow🟡Pire composant warn.
red🔴Pire composant crit.

La gravité est canonique ok | warn | crit. Les alias conviviaux sont normalisés lors de l'admission : warning devient warn ; error et critical deviennent crit.

3. Chien de garde (battements cardiaques manqués)

Vous déclarez l'intervalle de rapport attendu (60 s à 24 h) lors de l'activation du battement de coeur. Le chien de garde étage ensuite la lumière par fraîcheur, avec grace = max(60s, 25% of the interval) pour absorber la gigue cron et réseau :

Âge du dernier rapport acceptéÉtage de surveillance
jusqu'à intervalle + grâceok (vert)
1 rapport manqué (jusqu'à 2 × intervalle + grâce)warn (jaune)
2 rapports manqués ou pluscrit (rouge)

Un rapport rejeté (401/422/429) n'actualise jamais le chien de garde, donc un rapport cassé l'agent escalade honnêtement ; le dernier motif de refus est visible dans le paramètres de surveillance. La récupération est instantanée : le premier rapport accepté recalcule la lumière immédiatement.

4. Pings de disponibilité

Un ping est une vérification de disponibilité nommée d'un https URL public. Le panneau effectue GET avec un délai d'attente de 10 s, suit au plus 5 redirections, ne lit aucun corps au-delà d'une limite minimale et traite un statut final de la classe 2xx comme succès (204 et 206 comptent aussi). Une finale 3xx (boucle ou limite de redirection), 4xx, 5xx, délai d'attente ou erreur DNS/TLS/réseau est un échec. Une vérification échouée est confirmée par une nouvelle tentative après environ 15 s avant qu'elle ne compte, qui absorbe les incidents de réseau uniques.

Échecs consécutifs confirmésLumière ping
0ok
1warn
2 ou pluscrit

Les résultats du ping apparaissent sous forme de métriques propriétaires ping:<name> dans le pings section (Uptime) de la base surveillance onglet et comme ligne réservée Telegram pings : 🟢 api 210ms · 🟢 site 90ms · 🔴 docs (timeout). Le nombre de pings par extension et l'intervalle minimum dépendent du forfait :

PlanPings de disponibilité par extensionIntervalle de ping minimal
Procès35 minutes
Indépendant35 minutes
Studio101 minute
Flotte251 minute

La surveillance dans son ensemble est une version d'essai/payante uniquement ; l'intervalle minimum de battement de coeur est de 60 secondes sur tous les forfaits.

5. Mettre une extension en surveillance

Dans les extensions Paramètres, bloc de surveillance :

6. Le format du rapport

Le rapport contient la même charge utile v2 basée sur les métadonnées que le contrat de métriques personnalisées (onglets, sections, Telegram lignes, métriques), poussé vers POST /api/v1/monitoring/report avec Authorization: Bearer <monitoring token>. La surveillance ajoute identifiants réservés :

Identifiant réservéStatutSignification
overallrequisMétrique de genre status : le verdict du tick, gravité ok | warn | crit. Nourrit l'agrégat. Un rapport sans overall valide est rejeté (422).
issuesrecommandéMétrique du genre list : les problèmes actuels. Jusqu'à 5 éléments sont cités dans les textes d'alerte.
ping:*interditEspace de noms Metric-id des propres métriques de ping du panneau ; le pousser est rejeté (422).
pingsinterditTelegram identifiant de ligne de la ligne ping du panneau ; le pousser est rejeté (422).
monitoringonglet appartenant au panneauIdentifiant de l'onglet de base. Les métriques peuvent le résoudre (dashboard.tab: "monitoring") sans le déclarer dans tabs ; une déclaration est ignorée.

Limites : charge utile au maximum 64 Ko, tout au plus 200 métriques, au plus 2 rapports par minute par source (l'excédent obtient 429 et ne ne compte pas comme un battement de coeur).

6.1. Exemple de rapport

{
  "schema_version": "2.0",
  "generated_at": "2026-07-12T10:19:58Z",
  "tabs":     [ { "id": "stand", "title": "Stand", "order": 5, "icon": "server" } ],
  "sections": [ { "tab": "stand",      "id": "docker", "title": "Docker", "order": 0 },
                { "tab": "monitoring", "id": "host",   "title": "Host",   "order": 10 } ],
  "telegram": { "header": "{sev} {name} monitoring",
                "lines": [ { "id": "host",   "order": 0, "prefix": "🖥 " },
                           { "id": "docker", "order": 1, "prefix": "📦 " } ] },
  "metrics": [
    { "id": "overall", "kind": "status", "state": "ok", "severity": "ok" },

    { "id": "issues", "kind": "list",
      "value": { "items": [ { "text": "RAM 91% (7.1/7.8G)", "severity": "warn" } ] },
      "dashboard": { "show": true, "tab": "monitoring", "section": "host", "order": 0,
                     "render": "list", "name": "Issues" },
      "telegram":  { "show": false } },

    { "id": "ram", "kind": "percent", "label": "RAM", "value": 91, "severity": "warn",
      "dashboard": { "show": true, "tab": "monitoring", "section": "host", "order": 1,
                     "render": "kpi" },
      "telegram":  { "show": true, "line": "host", "pos": 10,
                     "format": "RAM {value}%", "sep": " · " } }
  ]
}

Réponse réussie :

{ "accepted": true, "effective": "green", "next_expected_by": "2026-07-12T10:26:13Z" }

7. Intégration d'un script de moniteur (style moniteur.sh)

Si vous exécutez déjà un script de vérification de l'état cron, ajoutez un POST de notre mieux au niveau du fin de sa tique. Un échec de livraison ne doit pas briser le tic-tac : le chien de garde attrapez quand même un silence prolongé.

# monitor.env
EXTOPS_REPORT_URL="https://extops.dev/api/v1/monitoring/report"
EXTOPS_REPORT_TOKEN="<monitoring token from Settings>"

# end of the tick: build the payload with jq from the values you already computed,
# then push it best-effort (never let delivery break the tick itself)
payload="$(jq -n --arg sev "$SEVERITY" '{
  schema_version: "2.0",
  generated_at: (now | todate),
  metrics: [ { id: "overall", kind: "status", state: $sev, severity: $sev } ]
}')"
curl -sS -m 10 -X POST "$EXTOPS_REPORT_URL" \
  -H "Authorization: Bearer $EXTOPS_REPORT_TOKEN" \
  -H "Content-Type: application/json" \
  -d "$payload" || true

Mappez les gravités de votre script sur l'ensemble canonique (critical est accepté et normalisé à crit) et alimentez votre liste de problèmes existante dans la métrique issues. Définissez l'intervalle déclaré égal au cron période.

8. Telegram : message d'état et alertes séparés

9. Le contrat lisible par machine

La description formelle du point de terminaison du rapport, le schéma de charge utile, le Les identifiants et la sémantique des feux de signalisation sont le fichier OpenAPI 3.1. Il porte le même version du contrat (2.0.0).

↓ Télécharger OpenAPI 3.1 (YAML) /monitoring-openapi.yaml