Quelle devrait être la portée d'un bilan de santé pour un système qui déploie une webapp?

13

Aujourd'hui, j'ai eu la tâche «d'écrire un bilan de santé» pour un service de longue durée qui est un système d'orchestration pour déployer une application Web.

J'essaie de déterminer quelle serait la portée d'un tel bilan de santé et j'ai posé ces questions concernant la portée du bilan de santé:

  1. Est-il suffisant de considérer le service comme sain si le système d'orchestration signale que la tâche est en cours d'exécution?
  2. Ou devrions-nous cingler manuellement chaque service?
  3. Ou doit-il aller plus loin et essayer de s'assurer que l'application Web fait ce qu'elle est censée faire, comme afficher une page Web?
  4. Le bilan de santé doit-il également vérifier que certains services dépendants fonctionnent également? Comme une base de données ou le système d'orchestration lui-même. Ou est-ce la responsabilité d'un autre bilan de santé?
  5. Et enfin, si l'un des services dépendants est mort et que l'application Web échoue par la suite, l'application Web doit-elle signaler une mauvaise santé, ou est-elle en bonne santé, car ce n'est pas la faute des applications Web?

Je sais que ce sont 5 questions distinctes, mais elles concernent toutes la portée d'un bilan de santé pour un service de longue durée qui déploie une application Web, j'ai donc pensé qu'il serait plus logique de les regrouper dans une seule question.

C'est difficile à implémenter pour moi parce que je ne suis pas sûr de la définition de ce qui est sain, ou à quoi devrait ressembler un bilan de santé standard pour quelque chose comme ça.

Que doit contenir un bilan de santé pour ce service spécifique?

Phil Winder
la source
2
Ne faites jamais confiance aux rapports d'état automatisés. Vérifiez toujours l'état vous-même. Anecdote: L'une des causes de l'incident de Tree Mile Island était un indicateur de «soupape fermée» qui indiquait seulement que la commande «fermer la soupape» avait été émise , et non que la soupape était réellement fermée .
Kilian Foth
@KilianFoth: sur une note similaire: je connais une entreprise qui a religieusement et minutieusement testé le fonctionnement de leurs sauvegardes. Puis, un jour, ils ont eu une panne de disque catastrophique et l'ont découvert: leur restauration ne l'a pas fait.
Jörg W Mittag
7
Je pense que c'est le travail de la personne qui vous a demandé de «faire un bilan de santé» pour définir ce qu'ils entendent par «santé». Sinon, c'est juste une conjecture.
Jörg W Mittag
1
Je suis d'accord avec le commentaire de @ JörgWMittag, mais je voudrais même aller plus loin. Vous devez obtenir vos exigences non seulement de la personne qui vous a dit que vous devez concevoir un "bilan de santé", mais également déterminer qui sont les personnes ou les systèmes qui utilisent les données qui font partie d'un bilan de santé et comprendre ce qu'ils besoin ou comment ils en ont besoin. Ce sont vos exigences qui guideront votre conception.
Thomas Owens
1
J'ai clarifié cela légèrement et j'ai voté pour la réouverture car je pense que la question centrale est sur le sujet. Comprendre comment identifier ce qui devrait être inclus dans un bilan de santé est une chose parfaitement normale pour la conception de logiciels, même si la vraie réponse est «demander des exigences» (ou une variation à ce sujet).
enderland

Réponses:

15

Ceci est difficile à mettre en œuvre en raison de la définition de ce qui est sain

Vous avez répondu à votre propre question ici. La définition d'un bilan de santé va varier, car ce qui est sain varie. Cela dépend également de ce qui délivre le bilan de santé.

Une bonne question à vous poser est: "du point de vue du demandeur, le service vérifié fonctionne-t-il comme prévu?" Si c'est vous, vous pouvez le définir. S'il s'agit d'une autre équipe / service, vous devez identifier la norme / spécification pour les contrôles de santé.

Probablement dans une grande organisation, vous aurez une sorte de norme pour ce qu'un bilan de santé devrait faire. Comprenez cela.

Plus précisément, ici, votre exemple d'application Web signifie qu'il ne devrait pas retourner sain car la Webapp n'est pas saine. Mais peut-être que votre définition de «sain» inclurait ceci comme «ok». Cela fait partie de la discussion des exigences ci-dessus (encore une fois, même si c'est juste votre propre code).

Ma recommandation, en supposant qu'il n'est pas spécifié ailleurs, serait d'avoir une sorte de code d'état associé à différentes défaillances. Lorsque vous interrogez l'application Web, elle peut renvoyer une erreur indiquant que "le service dépendant est mort" et que votre client (ou tout ce qui effectue le contrôle de santé) peut connaître la raison pour laquelle le client est mort.

Pour les questions modifiées:

Est-il suffisant de considérer le service comme sain si le système d'orchestration signale que la tâche est en cours d'exécution?

Non, simplement parce qu'un processus est en cours d'exécution ne signifie pas qu'il n'est pas bloqué, totalement non fonctionnel ou une grande variété d'autres possibilités.

Ou devrions-nous cingler manuellement chaque service?

Cela peut fonctionner, selon l'étendue des fonctionnalités de votre application. Si la vérification du service répond à un "êtes-vous vivant?" ping alors cela pourrait être tout ce qui est requis. Mais si le service peut facilement être «vivant et réactif mais ne fonctionne pas réellement», vous devrez peut-être vérifier également d'autres choses.

Ou doit-il aller plus loin et essayer de s'assurer que l'application Web fait ce qu'elle est censée faire, comme afficher une page Web?

Votre bilan de santé doit s'assurer que la fonctionnalité requise attendue fonctionne comme prévu.

Si votre application retourne "en bonne santé" et ne peut pas faire ce qu'elle doit faire, vous pourriez aussi bien vous débarrasser de la totalité du contrôle de santé car cela donnera de faux positifs (sans parler de confondre le diable des personnes essayant de déboguer le problème - 'hey notre serveur web affiche sain, pourquoi ne pouvons-nous pas voir la page? ').

Le bilan de santé doit-il également vérifier que certains services dépendants fonctionnent également? Comme une base de données ou le système d'orchestration lui-même. Ou est-ce la responsabilité d'un autre bilan de santé?

Cela dépend quelque peu. Si votre service dépend d'un autre service, la nature de cette interaction doit être reflétée dans les appels API / réseau qui lui sont envoyés dans votre application et intégrés au bilan de santé.

Par exemple, un serveur Web lisant à partir d'une base de données doit avoir des informations d'état sur la base de données intégrée - sinon l'application Web se bloquera simplement si les appels d'API échouent. Vous pouvez modifier trivialement ces appels pour les intégrer à votre bilan de santé.

Cependant, si votre service envoie des événements à des consommateurs qui écoutent, sans aucune validation, il est moins important pour la fonctionnalité de votre application que les consommateurs soient vivants. "En bonne santé" à votre application envoie les messages, pas réellement les recevoir.

Fondamentalement, si votre service a besoin de parler avec d'autres services et de vérifier de toute façon leur état de santé, il est logique d'avoir au moins un niveau de vérification basique pour le bilan de santé de votre service. Cela devrait avoir un sens conceptuellement étant donné ce que je viens de dire, car votre application va déjà gérer cela (ou planter au hasard, je suppose).

Et enfin, si l'un des services dépendants est mort et que l'application Web échoue par la suite, l'application Web doit-elle signaler une mauvaise santé, ou est-elle en bonne santé, car ce n'est pas la faute des applications Web?

Ceci est essentiellement répondu ci-dessus. Ma recommandation serait que votre bilan de santé renvoie un code / message / tout ce qui donne ces informations. Les deux informations sont importantes: que le service dépendant dont votre service a besoin est mort et que votre service ne fonctionnera pas comme prévu en conséquence.

enderland
la source
2

Généralement, un bilan de santé signifie simplement "est-il vivant et répond-il". Des contrôles plus poussés que ceux-ci sont hautement spécialisés et dépendent entièrement de l'utilisation du système. C'est à vous de décider si vous allez faire un effort supplémentaire pour vérifier qu'un système traite correctement les demandes, mais vous devez d'abord faire les bases - vérifiez qu'il est là, vérifiez qu'il peut recevoir des demandes et retournera une réponse.

La façon la plus simple d'implémenter un contrôle d'intégrité est d'écrire simplement une commande que le service traite en utilisant le même mécanisme que d'autres commandes utilisent, qui ne fait que renvoyer un accusé de réception. Cela montrera la vivacité et que le système reçoit et traite les réponses.

La vérification des systèmes dépendants ne fait pas partie du bilan de santé, vous devez le garder simple et autonome. Ajoutez tour à tour un bilan de santé à chaque service dépendant. De cette façon, vous pouvez obtenir une liste de systèmes en cours d'exécution et sains et savoir facilement quand l'un va mal, lequel il s'agit!

gbjbaanb
la source
Dans le système que j'écris, je demande simplement à chaque service dépendant ses informations de version. S'il répond en temps opportun (2500 ms dans mon cas), il est alors considéré comme "en hausse". Je les interroge tous en parallèle, donc mon temps de réponse dans le pire des cas est lié.
TMN
1

D'après mon expérience, les services essentiels ont généralement les caractéristiques suivantes:

Battement de coeur

Si le service s'exécute régulièrement, cela écrit simplement une ligne dans un fichier journal ou similaire avec un horodatage pour indiquer que le corps du service a démarré à un moment donné.

Chapelure

Semblable à ce qui précède, le fil d'Ariane n'est généralement qu'un vidage du nom de la méthode (et parfois des paramètres) pour montrer que le service traite le corps du service comme prévu et où il se trouve dans le flux. Étant donné que ceux-ci peuvent générer plus de sortie, ceux-ci sont généralement contrôlés par des fichiers de configuration ou similaires, de sorte qu'ils peuvent être désactivés une fois le service intégré.


Il peut être tentant d'ajouter beaucoup d'autres choses telles que l'état de divers serveurs, services et bases de données, etc. Bien que cela soit sans aucun doute précieux, je vous déconseille d'écrire quelque chose de trop volumineux. Celles-ci pourraient être utiles pour votre tranquillité d'esprit, mais ces garanties ont tendance à être abusées une fois que les parties en charge des différents points de contact savent qu'elles sont là. Avant de le savoir, vous pourriez rédiger une application de diagnostic pour l'ensemble de l'entreprise.

Robbie Dee
la source