hospital
par Benoît Bryon - www.marmelune.net
PyCon FR - Pau - Octobre 2015
des tests en PROD
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 ?
heatlthchecks - PyConFr 2015 - Pau
By Benoît Bryon
heatlthchecks - PyConFr 2015 - Pau
Bug logiciel, configuration, problème du système ou service tiers en panne ? Hospital s'inspire des tests unitaires pour générer des diagnostics sur des services en cours de fonctionnement.
- 1,443