hospital

par Benoît Bryon - www.marmelune.net

PyCon FR - Pau - Octobre 2015

Tests

Hors conditions réelles

Provisioning

Logging

Monitoring

Au lancement

Trop tard !

Vue de l'extérieur

Assertions

en cours de fonctionnement

sur la configuration, l'environnement, les données...

du point de vue de l'application

par les développeurs

pour la supervision.

Valider un déploiement

Surveiller un service

Diagnostiquer, orienter

pip install hospital

Assertions

import unittest
import hospital

@hospital.healthcheck
class DemoHealthCheck(unittest.TestCase):
    def test_predictable(self):
        """Health checks are collected."""
        self.assertTrue(True)
  • comme des tests unitaires
  • décorés par @hospital.healtcheck
  • dans un module/package "healthchecks"

healthchecks.py :

Assertions

  • assert_http_response()
  • assert_ping()
  • assert_supported_python_version()

+ vos idées

Sur l'environnement

Ce qui varie entre DEV et PROD
par exemple : la configuration.

import urlparse
import hospital
from django.conf import settings

@hospital.healthcheck
def test_celery_broker_ping(self):
    """Celery broker responds to ping."""
    parts = urlparse.urlparse(settings.BROKER_URL)
    hospital.assert_ping(parts.hostname)

En cours de fonctionnement

import urlparse
import hospital
from django.conf import settings

@hospital.healthcheck
def test_celery_broker_ping(self):
    """Celery broker responds to ping."""
    parts = urlparse.urlparse(settings.BROKER_URL)
    hospital.assert_ping(parts.hostname)

Ce qui varie pendant la vie de la PROD
par exemple : les services tiers.

Vue de l'intérieur

  • Service ElasticSearch OK
  • Service Django OK

ALERTE ! La fonction "recherche" échoue !

Externe

  • Django ping ElasticSearch OK
  • Django GET ElasticSearch KO

Interne

Par les développeurs

Qui ne range pas son frigo
mange des asticots.

Lao Tseu.

sert

Pour la supervision : CLI

hospital-cli

$ hospital-cli yourapp.healthchecks
......
6 tests passed

nose

$ nosetests --all-modules --attr='is_healthcheck' yourapp.healthchecks

pytest

$ py.test -m healthcheck yourapp.healthchecks

Pour la supervision : WEB

hospital-serve

$ hospital-serve yourapp.healthchecks &
Serving on 0.0.0.0:1515

$ curl -i http://localhost:1515/
HTTP/1.0 200 OK
Content-Type: application/json; charset=utf-8

{
    "status": "pass",
    "summary": { ... },
    "details": [ ... ]
}

Ou hospital.wsgi pour Gunicorn, Chaussette, twod.wsgi...

Un coup de main ?

Checks asynchrones

  • Jobs périodiques en parallèles
  • Rapport mis à jour fréquemment
  • Monitoring du rapport

Smoketests VS diagnostics

  • Smoketest : rapide, nécessaire et suffisant
  • Diagnostic : chercher l'erreur

Vérifiez vos applications !

  • configuration
  • services externes (BDD, APIs, stockage, ...)
  • environnement (permissions, version de Python, ...)
  • intégrité/cohérence des données

Souvent !

  • après un déploiement
  • après une migration de données
  • périodiquement en PROD
  • à la chasse au bug, en complément des logs

Questions ?

Made with Slides.com