Traquez les erreurs de vos apps Django avec Sentry 16


Tout foire tout le temps. Le site (ou app) sans erreur n’existe pas. Après chaque mise à jour on croise les doigts et on espère que tout va bien se passer.
Les plus courageux auront fait des tests unitaires en amont qu’ils lanceront avant l’update, les autres comme moi vont commiter leurs changements et redémarrer le serveur prod. On est boucher de père en fils dans la famille…

Avant toute chose Sentry qui avant était un projet Django serveur/client a depuis évolué et est devenu un serveur uniquement, laissant le choix du client suivant votre framework/language de travail. Sentry est disponible sur à peu près toutes les plateformes (Python, PHP, Ruby, JavaScript, Java, Node.js, iOS) et les frameworks Rails et Django. La documentation est très fournie et le projet très actif.

Dans le cas d’un site web en général on a tellement de pages qu’on ne peut pas prédire à l’avance ce qui va foirer ou pas (mais ça foire toujours, tout foire, etc…). Même si vous avez fait les tests unitaires vous aurez forcément oublié quelque chose.

Cette page spéciale sur les nains obèses unijambistes scatophiles pour lesquels vous avez créé un tag unique et qui ne supporte pas que vous ayez changé votre mode de cache va lamentablement planter et vous priver de la fidélité de DSK sur votre site pour longtemps.

Heureusement nous allons pouvoir logger toutes ces erreurs et avoir des jolis graphiques post-mortems. Bien évidement ça va vous faire du taf en plus bande de feignasses.

Sentry vient en standalone ou en version gratuite limitée, hebergée par les créateurs.
J’ai voulu installer la standalone parceque je revenais de l’apéro et qu’au 8ème Ricard on veut tout faire soit-même mais la raison et 14heures de sommeil l’ont emporté, c’est à mon réveil que je me suis alors décidé à installer la version trial limitée à 7 jours de log et 2800 evenements loggés (qui au passage suffit sur un de nos plus gros sites).

la mise en place est vraiment des plus simples:

Créez un compte et ensuite récupérez la clef API dans les préférences sur votre compte en ligne Sentry.

Du côté de votre projet Django:

Installez Raven, qui est un client Python pour Sentry. Il va se charger de collecter vos erreurs et les transmettre à Sentry.

Comme d’habitude une bonne PIP:

  pip install raven

Dans le fichier settings.py de votre projet Django:

Utilisez la clef Api fournie par Sentry (voir plus haut)

# used for sentry login
RAVEN_CONFIG = {
    'dsn': 'https://aboudouboudousplish:aboudouboudousplash@app.getsentry.com/1984',
}

Vous pouvez faire un test pour voir si tout est bien configuré:

Dans votre projet Django tapez

python manage.py raven test

Vous devriez recevoir un email de Sentry avec le récapitulatif du test raven.


L’interface Sentry:

La liste des évènements avec possibilité de filtres.

Sur le flux vous allez avoir la liste de tous les évènements loggés, vous pouvez les trier en choisissant parmi une pléthore d’options. Vous pouvez nettoyer ce flux en un seul clic (lors d’un redémarrage de serveur vous risquez d’avoir beaucoup d’erreurs qui n’en sont en fait pas, donc inutile de les traiter).

L'évènement en détail, une clarté qui donne envie d'avoir des bugs ^^

Chaque évènement du flux a une vue détail où vous allez pouvoir tracer le bug, c’est clair et plein d’informations (un peu comme les pages de debug Django). Il y a la possibilité d’ajouter des notes, de relancer la requête afin de vérifier la correction effectuée.


Le mode Team:

Sentry vous permet de bosser en équipe, vous créez un projet, des utilisateurs et chacun peut monitorer, corriger des bugs etc (pas dispo dans la version trial). Vous pouvez aussi créer des groupes d’utilisateurs qui n’auront accès qu’à certains projets. Le côté équipe a bien été intégré. Vous saurez sur qui gueuler lorsque le bug aura été mal corrigé.

Conclusion:
Monitorer ses apps est un vrai calvaire quand on n’a pas les bons outils ou que ces derniers sont chiants à installer/maintenir.
Sentry offre deux possibilités d’installation et leur mode trial vaut vraiment le coup (gratuit je le répète), les plus courageux se farciront l’install.
Pour la version standalone j’ai lu un peu partout qu’il était préférable de l’installer sur un serveur à part, à méditer avant de se lancer. Les logs sont en temps réél, vous n’avez pas à attendre le lendemain pour savoir ce qui a planté la veille, vous pouvez donc corriger vos bugs rapidement.

Le plus gros problème de Sentry je pense c’est qu’on tombe accroc, je m’y rend désormais plusieurs fois par jour pour voir si il n’y a pas un petit bug à corriger :)

PS: je cherche l’équivalent pour monitorer les serveurs, Munin est trop vieux et tous les autres outils que j’ai pu tester demandent à installer (entendez passer des heures à compiler) toute une machinerie. L’idéal serait des paquets à installer sur les serveurs à monitorer + service en ligne à la Sentry.

16 thoughts on “Traquez les erreurs de vos apps Django avec Sentry

  • Zanguu

    Sympa comme outil, juste un point qui m’aurait intéressé dans l’article:
    Il y a quoi en plus dans la standalone par rapport à la version limitée ? Et pourquoi ne pas avoir continué sur la standalone ?

    Et pour ceux qui se poseraient les mêmes questions bizarres que moi, les screenshot ne sont pas de max et donc ce n’est pas lui sur l’avatar (ou alors il est extrêmement malicieux et prépare son coup depuis plus de 6 mois).

  • Jeb

    New Relic est absolument génial (et comme le hosted Sentry installable en 3 coups de cuillère à pot) pour monitorer les serveur mais surtout les application (Django y compris donc) et le code Python. Je suis devenu accro pendant la période d’essai, et je n’ai pas suffisamment de fonds pour payer l’abo mais dès que c’est le cas je le ferai sans hésiter.

    Je vais tester Sentry de ce pas, ca me paraît être un complément parfait.

  • Max Post author

    @ ludwig
    Je ne connais pas relic, vais aller voir merci :)

    @golgotha
    Il vous en prie

    @zangua
    ben…elle est pas limité :)
    Je n’ai pas continué à l’installer car c’est chiant car long, et qu’ensuite ils conseillent de l’installer sur un serveur à part (trou de sécu possibles ou gros bouffage de ressources ?). Et que la version trial suffit et s’installe en 5 mins :)
    les screenshoot sont ceux de la doc :p , petit détail l’interfance est en français chez moi, doit y avoir moyen de régler quelque part la langue, c’est plutôt sympa.

    @foxmask
    Mais qui donc est asser fou pour être sous Python 3.4 ? :)

  • Max Post author

    Bon je viens de regarder new relic et je sens que ça va faire l’objet d’un autre billet…
    je vais le laisser en test quelques temps et vous ferait un retour .

  • Fred

    Pour monitorer les machines, Zabbix. Installé sur un petit serveur *nix au boulot, monitoring de 180 vm tranquille… Un serveur central et des agents sur les machines à surveiller.
    L’interface aurait bien besoin d’un design sympa (comme sentry).
    Mais il fait bien son taf avec des tas de graphes, alertes, … j’adore.

  • C

    Pour remplacer Munin, j’ai trouvé collectd qui, combiné à graphite (et accessoirement, graphana comme dashboard graphite) donne quelque chose de vachement pas mal ;)

  • Réchèr

    Sur l’image, la dame a une croix sur la poitrine, mais implanté sous la peau, ce qui sous-entend qu’elle est adepte du jeu de morpion.

    Cependant, son collant forme des hexagones, ce qui sous-entend qu’elle aime les jeux de plateaux plus élaborés, comme Full Metal Planet.

    Elle est là l’erreur. Elle aurait dû avoir, soit pas de croix, soit un collant qui fait des ronds. (Puisque le morpion se joue avec des croix et des ronds).

  • labrut

    Arrête moi si je dis une grosse bêtise, mais comme tu es boucher de père en fils, tu as souvent des erreurs donc ça fait qu’une entreprise tierce peut connaître le code source de ton produit ?

  • Raoullevert

    @Labrut : C’est pas bien le debug en front à coup de ‘alert’ ? Je comprends pas votre monde les jeun’s … et de mon temps on baisait sans capotes.

Leave a comment

Des questions Python sans rapport avec l'article ? Posez-les sur IndexError.