Projet

Général

Profil

Development #23823

Fournir une API de vérification de bon fonctionnement

Ajouté par Frédéric Péters il y a presque 6 ans. Mis à jour il y a plus de 5 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Catégorie:
-
Version cible:
-
Début:
14 mai 2018
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:

Description

Histoire de ne pas devoir multiplier les vérifications dans Nagios, Hobo pourrait fournir un endpoint qui assurerait que tout va bien (ou listerait ce qui ne va pas).

  • résolution de nom pour tous les services
  • réponse positive de tous les services
  • certificat valide et de confiance sur tous les services
  • idées supplémentaires (?)

Fichiers

0001-provide-a-health-api.patch (5,67 ko) 0001-provide-a-health-api.patch Christophe Siraut, 28 juin 2018 15:17
0001-add-dependency-on-djangorestframework.patch (986 octets) 0001-add-dependency-on-djangorestframework.patch Christophe Siraut, 29 juin 2018 16:00
0002-provide-a-health-api-23823.patch (8,93 ko) 0002-provide-a-health-api-23823.patch Christophe Siraut, 29 juin 2018 16:00
0001-provide-a-health-api-23823.patch (11,7 ko) 0001-provide-a-health-api-23823.patch Christophe Siraut, 06 juillet 2018 14:06
0001-provide-a-health-api-23823.patch (12,4 ko) 0001-provide-a-health-api-23823.patch Christophe Siraut, 31 août 2018 18:52
0001-provide-a-health-api-23823.patch (12,6 ko) 0001-provide-a-health-api-23823.patch Christophe Siraut, 13 septembre 2018 11:25
0001-provide-a-health-api-23823.patch (13,1 ko) 0001-provide-a-health-api-23823.patch Christophe Siraut, 13 septembre 2018 18:41
0001-provide-a-health-api-23823.patch (12,5 ko) 0001-provide-a-health-api-23823.patch Christophe Siraut, 14 septembre 2018 14:38

Demandes liées

Lié à Hobo - Development #16599: cook : vérification des noms de domaine avant de lancer le déploiementFermé29 mai 2017

Actions
Lié à Hobo - Development #24519: Vérifier que l'adresse email mise en From existe bienFermé14 juin 2018

Actions

Révisions associées

Révision a6df6bdc (diff)
Ajouté par Christophe Siraut il y a plus de 5 ans

general: provide a health api (#23823)

Historique

#3

Mis à jour par Christophe Siraut il y a presque 6 ans

  • Assigné à mis à Christophe Siraut
#4

Mis à jour par Christophe Siraut il y a presque 6 ans

  • Lié à Development #16599: cook : vérification des noms de domaine avant de lancer le déploiement ajouté
#5

Mis à jour par Christophe Siraut il y a presque 6 ans

  • Lié à Development #24519: Vérifier que l'adresse email mise en From existe bien ajouté
#6

Mis à jour par Christophe Siraut il y a presque 6 ans

Une première version de travail ouverte aux commentaires.

ça sort un json structuré comme suit (le statut false est hérité par les parents):

{
    "status": true, 
    "data": {
        "services": {
            "status": true, 
            "data": {
                "Wcs": {
                    "status": true, 
                    "data": {
                        "count": 0
                    }
                }, 
                "Passerelle": {
                    "status": true, 
                    "data": {
                        "count": 0
                    }
                }, 
                "Combo": {
                    "status": true, 
                    "data": {
                        "count": 2, 
                        "foo": {
                            "status": true, 
                            "data": {
                                "resolvable": {
                                    "status": true, 
                                    "data": {}
                                }, 
                                "sucessfull": {
                                    "status": true, 
                                    "data": {}
                                }
                            }
                        }, 
                        "bar": {
                            "status": true, 
                            "data": {
                                "resolvable": {
                                    "status": true, 
                                    "data": {}
                                }, 
                                "sucessfull": {
                                    "status": true, 
                                    "data": {}
                                }
                            }
                        }
                    }
                }, 
[…]
#7

Mis à jour par Frédéric Péters il y a presque 6 ans

Ok sur l'approche du calcul à la volée; pour exposer l'API éventuellement considérer django rest framework pour l'API ? Même utilisé de façon minimale ça peut déjà amener un peu de cohérence et à un moment nous offrir des fonctionnalités gratuites.

(attention à l'orthographe de successful).

Peut-être prendre en compte is_operational() pour ne même rien tenter sur des services qui ne fonctionnent pas ?

Pour le is_successful par contre sûr se baser sur check_operational qui sait déjà ce qui est bon comme réponse http.

#8

Mis à jour par Christophe Siraut il y a presque 6 ans

Nouvelle version de travail, basée sur rest framework.

Si c'était utile d'implémenter des pages ServiceView individuelles, on a pas vraiment d'identifiant unique parce que les objets viennent de tables différentes. En fait par rapport aux cas d'usages énnoncés, plusieurs peuvent utiliser directement les méthodes des modèles (tableau de bord utilisateurs, vérification pré-cook), d'autres (monitoring externe) peuvent parser le json fourni ici.

#9

Mis à jour par Frédéric Péters il y a presque 6 ans

(les deux commits peuvent être réunis)

netloc = self.base_url.split('/')[2]

Utilise plutôt urlparse(self.base_url).netloc.

is_responsive

Toujours pas bien fan de ce nom (j'aurais suggéré is_operational mais c'est déjà pris; has_valid_http_response est long et s'éloigne de la forme is_, is_online peut-être).

Aussi, comme je le notais, il est important d'utiliser, ou au moins de faire comme, check_operational pour l'URL. (cas pratique, un combo déployé correctement a malgré tout une réponse 404 à l'accueil, c'est pour ça qu'on y teste plutôt /manage/).

20015-2018

Zéro en trop.

...# mock_socket.gethostbyname

L'intention est à mon sens bonne, c'est utile d'avoir les tests ok hors connexion.

#10

Mis à jour par Christophe Siraut il y a presque 6 ans

Voici une version testable hors ligne, renommé l'url /api/service en /api/services, pour le code de retour HTTP j'ai mis pour l'instant "is_running()".

Je ne sais pas encore si le test sur le certificat est suffisant. Peut-être ajouter le nombre de jours restant, mais est-ce que c'est pertinent ici?

Dans un autre ticket on pourra ajouter des tests sur l'expéditeur des emails.

Si on veut présenter ces infos dans le backoffice, faudra faire un design, autre ticket.

#11

Mis à jour par Christophe Siraut il y a plus de 5 ans

version revue.

pour le moment:

  • la page api/services/ est accessible aux utilisateurs non-authentifiés
  • pas de stockage du statut dans la db
#13

Mis à jour par Christophe Siraut il y a plus de 5 ans

J'aimerais valider/intégrer ce patch avant d'aller éventuellement plus loin.

  • les tests sont très rapides
  • pas de stockage en db
  • pas d'ACL
  • utilisable facilement pour #16599

Pour des tests (un peu plus complexe) sur la durée de validité du certificat et le statut SPF des expéditeurs (tickets liés), j'anticipe la création d'un ServiceStatus qui serait ajourné par une tâche plannifiée, et étendrait l'api actuel.

#14

Mis à jour par Christophe Siraut il y a plus de 5 ans

sur les tests pour l'environnement coverage-django18-authentic, j'ai l'erreur suivante:

authentic2.plugins.PluginError: ('unable to load entrypoint authentic2-auth-ssl = authentic2.auth2_auth.auth2_ssl:Plugin', VersionConflict(djangorestframework 3.8.2 (/tmp/tox-chris/hobo/coverage-django18-authentic/li
b/python2.7/site-packages), Requirement.parse('djangorestframework<3.4,>=3.3')))

c'est résolu si j'aligne la version de djangorestframework dans tox.ini avec celle définie dans le tox.ini de authentic (djangorestframework<3.4,>=3.3)

est-ce que c'est ce qu'on fait dans ce cas de figure?

#15

Mis à jour par Frédéric Péters il y a plus de 5 ans

est-ce que c'est ce qu'on fait dans ce cas de figure?

J'aimerais dire qu'on fait plutôt un ticket dans authentic pour fonctionner avec les dernières versions de django-rest-framework et qu'un patch se trouve écrit, etc.

Mais bien sûr, oui, modifie le tox.ini pour limiter à une version acceptée par authentic.

#16

Mis à jour par Frédéric Péters il y a plus de 5 ans

Quand ils étaient ok, garder les import dans un ordre qui fait plaisir à pylint (datetime/json/logging/socket/sys).

if sys.version_info[0] 2: éviter et préférer django.utils.six (from django.utils.six.moves.urllib import parse as urlparse)

logging.getLogger("urllib3").setLevel(logging.WARNING) sonne inapproprié à cet endroit, les modifcations au logging se font aujourd'hui dans debian/debian_config_common.py.

valid_statuses = [200, ] ça semble prévu pour être étendu mais il n'y a rien pour étendre, compare donc directement le statut, return bool(r.status_code 200).

# dans un init.py. Plutôt le laisser vide.

#17

Mis à jour par Christophe Siraut il y a plus de 5 ans

Frédéric Péters a écrit :

# dans un init.py. Plutôt le laisser vide.

(je me trompais et pensais que les fichiers vides sont ignorés par git comme le sont les dossiers vides)

#18

Mis à jour par Christophe Siraut il y a plus de 5 ans

J'ai renommé les ServiceBla en HealthBla et le résultat est servi sur /api/health/.

#19

Mis à jour par Frédéric Péters il y a plus de 5 ans

logging.getLogger("urllib3").setLevel(logging.WARNING) sonne inapproprié à cet endroit, les modifcations au logging se font aujourd'hui dans debian/debian_config_common.py.

Ce que je voulais dire c'est que ça devait être fait comme les autres paramètres de logging, pas juste déplacer la ligne.

#20

Mis à jour par Christophe Siraut il y a plus de 5 ans

le même patch sans le paramétrage de logging superflu (la valeur par défault INFO convient)

#21

Mis à jour par Frédéric Péters il y a plus de 5 ans

pytest.mark.django_db plutôt que répéter ce décorateur je pense qu'il suffit de taper pytestmark = pytest.mark.django_db. Tu peux changer ça et hop.

#22

Mis à jour par Frédéric Péters il y a plus de 5 ans

  • Statut changé de Solution proposée à Résolu (à déployer)

J'ai fait cette modification, j'ai aussi remplacé l'utilisation du test client de django par django-webtest, ce qu'on devrait faire partout. Et relâcher un peu la pression sur la version de djangorestframework.

commit a6df6bdcd627b965c6c9123fad2296ef5d05a998
Author: Christophe Siraut <csiraut@entrouvert.com>
Date:   Fri Sep 14 14:36:47 2018 +0200

    general: provide a health api (#23823)
#23

Mis à jour par Frédéric Péters il y a plus de 5 ans

  • Statut changé de Résolu (à déployer) à Solution déployée

Formats disponibles : Atom PDF