Monitoring applicatif : Pourquoi et comment ?

8,873 views
8,705 views

Published on

Vous êtes développeur, chef de projet technique ou même responsable et vous souhaitez avoir de la visibilité sur le fonctionnement de vos applicatifs, ou sur la plateforme sur laquelle ils sont hébergés ?

Nous étudierons comment, grâce à des outils simples (StatD / Graphite / Log BDD) et nos expériences chez M6Web, mettre en place un monitoring applicatif ultra complet.
Ce monitoring vous permettra de retrouver la vue sur vos projets, pour mieux anticiper la charge, detecter la root cause en cas d'incident et connaitre l'état de chacun de vos services ...

Published in: Technology
1 Comment
9 Likes
Statistics
Notes
  • منحه مدعمه بـ150ج مصري فقط
    ((دبلومه اللغه الانجليزيه 18 مستوى+دبلومه اللغه الثانيه 9مستويات+دبلومه التنميه البشريه+الكمبيوتر'icdl,photoshop,autocad'
    +دبلومه اداره الاعمال+دبلومه المحاسبه الالكترونيه))
    كل هذا ب150ج بدلا من250ج لفتره محدوده خلال شهر رمضان
    مع اعتماد من اليونسكو واليونيسيف
    وكليه كامبردج الدوليه
    24019363 - 22623203 - 01151878708 - 01151878594 -01118792463
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total views
8,873
On SlideShare
0
From Embeds
0
Number of Embeds
1,862
Actions
Shares
0
Downloads
0
Comments
1
Likes
9
Embeds 0
No embeds

No notes for slide
  • Ce modèle peut servir de fichier de démarrage pour un album photo.
  • Et le découvrir par moi même 
  • Et ne pas attendre que le serveur soit à genoux
  • Pour encore mieux supporter la charge la prochaine fois
  • Pour que les problèmes deviennent transparent, et avoir aussi le droit à l’erreur
  • Tout ce que nous savons pourra nous servir un jour !
  • Physicien britannique
  • Monitoring applicatif : Pourquoi et comment ?

    1. 1. Monitoring Applicatif
    2. 2. M6Webgroupe M6Filiale digitale du + de 70 Sites sur PF LAMPLe MVNO M6Mobile avec Orange 11,6M de Visiteurs Unique (Mars 2012 Nielsen)Le Replay et produits dérivés des progrs télés 4 millions de lignes de codesUn comparateur de prix 16000 requêtes MySql par secondeCA 2011 : 102,1M€ Beaucoup de développeurs !
    3. 3. Kenny DITS ( @kenny_dee )Responsable Etude & Dév chez M6WebAncien dév LAMPPassionné de WebPerf & Monitoring
    4. 4. Clubic.com Jeuxvideo.fr M6.fr Turbo.frDeco.fr W9.fr
    5. 5. POURQUOI MONITORER ?Parce que !
    6. 6. Je veux savoir lorsqu’un de nosservices Php ne fonctionne plus !
    7. 7. Je veux vérifier que les erreurs et lestemps de chargement n’empirent pas !
    8. 8. Je veux mesurer l’impact d’une pub téléou d’une actualité « Hot » sur l’un denos sites !
    9. 9. Je veux trouver rapidement la oules RootCause lors d’un incident !
    10. 10. Je veux tout savoir sur tous nossites !
    11. 11. Je veux retrouvez la vue sur nos projets !Que se passe-t-il en production ?Qu’est-ce qui s’est passé ?Mes services fonctionnent-ils ?Pourquoi ne fonctionnent-t-ils plus ?
    12. 12. Et la donner à nos développeurs !Vérifier l’impact de leurs mises en production sur nos applis / surnos serveurs, sur les temps de chargement etc …
    13. 13. QUE DOIT-ON MONITORER ?Tout !
    14. 14. "If its not monitored, its not in production" Theo Schlossnagle #velocityconf
    15. 15. "If you can not measure it, you can not improve it" Lord Kelvin
    16. 16. Exemples de métriques à monitorer : • Appels aux services applicatifs • Téléchargement sur Clubic / Lectures de news, topics, vidéos … • Calcul de cote automobile sur Turbo • … • Gestion utilisateurs : • (dé)connexion • Inscription • activation • Utilisation et temps SQL: • select/update/… par db • Conso CPU • Temps d’affichage des pages • Erreurs applicatives : • HTTP (301,404 …) • PHP (Warning, Fatal, …), Js … • Utilisation des caches applicatifs • Memcached • Redis • Crawl Google …
    17. 17. COMMENT MONITORER ?
    18. 18. Monitoring humain ?On surveille le site H24 ?
    19. 19. StatsD ©Etsy & FlickR http://Graphite.wikidot.com http://Github.com/etsy/statsdhttps://github.com/graphite-project
    20. 20. Principe de fonctionnement [Client • [Serveur [Graphite]Applicatif StatsD] StatsD] [Graphite] Outils de Visualiser Collecteur Stockage PHP Envoi ses • Agrège Stocke graph des métriques • Et envoi métriques
    21. 21. STATSDLe collecteur
    22. 22. StatsDAgrégateur de statistiques1 Démon Node.js + 1 client Php (ou autre)
    23. 23. Node.JS : • Créée par Ryan Dahl (@ryah) début 2009, • basée sur la machine virtuelle V8 (projet Open Source de Google©) • Javascript coté serveur • Ultra rapide • Gestion des entrées/sorties de manière non bloquante • Très grosse communauté • Fun ! • Exemple d’un serveur Web en Node.js var http = require(http); http.createServer(function (req, res) { res.writeHead(200, {Content-Type: text/plain}); res.end(Hello Worldn); }).listen(1337, 127.0.0.1); console.log(Server running at http://127.0.0.1:1337/);
    24. 24. Représentation de nos métriques • errors • 404 • clubic (errors.404.clubic) • Jvfr (errors.404.jvfr) • … • mysql. • select. • clubic • nomdeladatabase • count (mysql.select.clubic. nomdeladatabase.count) • Une métrique n’est valable que par son nœud final
    25. 25. Applicatif Métrique Métrique Métrique StatsDLe client StatsD : Le serveur StatsD :• Incrément/Décrement • Reçoit • Agrège pendant 2 secondes• Timer • Envoie a Graphite
    26. 26. Le client StatsD : implémentation • En PHP StatsD::increment(errors.404.clubic); // +1 dune statistique StatsD::decrement(errors.404.clubic); // -1 dune statistique StatsD::timing(cpu.clubic.index, 1234); // Statistique en ms • Via Fsockopen if($fp = fsockopen(udp://<ip>, <port>)) { fwrite($fp, errors.404.clubic:1|c); fclose($fp); } • Bash PORT=2003 SERVER=graphite.<domaine>.<extension> echo "errors.404.clubic `date +%s`" | nc ${SERVER} ${PORT}; • …
    27. 27. Le serveur StatsD : • Nombre de métriques reçu par StatsD et envoyé • graphite.numStats : • Les Incréments sont stockés sous l’arbo : • stats_count.* • Les Timers sont stockés sous l’arbo • stats.timers.*. • mean • lower • upper • upper_90 • Max • count • sum (©M6web)
    28. 28. Le protocole UDP : • Fire & Forget : • Rapide • Pas d’attente de réponse du serveur • Aucun impact si le serveur est inaccessible • Attention toutefois … : trop d’UDP tue l’UDP … et les serveurs avec …
    29. 29. Notice PHP … Fuuu
    30. 30. Hack du client Php et serveur StatsD : Modification du client PHP pour envoyer moins de paquets UDP => Utilisation du register_shutdown_function pour envoyer les données Découpage en paquets (MTU à 1500 octets pour Node.js (limitation logicielle/hardware), 1472 octets max, 28 octets de header) Plusieurs démons Node.js avec un LBL sur les nodes sur un CRC32 de la chaîne modulo le nombre de serveurs
    31. 31. GRAPHITEPrésentation
    32. 32. Graphite : • Stocke des métriques dans le temps • Permet de grapher ces métriques à la demande • Graphite ne fait pas la collecte des données … • Graphite n’est pas un outil de statistique ! • Graphite est composé de 3 éléments distincts écrits en Python : • carbon - Démon qui récupère les métriques • whisper - La DB qui stocke les métriques ( ressemblant à RRD) • graphite webapp - L’interface web (sous Django) qui graphe les métriques à la demande (avec la librairie Cairo)
    33. 33. Graphite : Le Composer
    34. 34. Graph Data Graph OptionsLes options du Composer
    35. 35. COMMENT UTILISER GRAPHITE ?Quelques exemples
    36. 36. stats.timers.mysql.clubic.select.*.countAffichage du nombre de select sur Clubic par DB
    37. 37. sum(stats.timers.mysql.clubic.select.*.count)Nombre de select sur Clubic
    38. 38. limit(sortByMaxima(stats.timers.mysql.clubic.select.*.count,5))Affichage des 5 DB faisant le plus de select sur Clubic
    39. 39. limit(sortByMaxima(groupByNode(stats.timers.mysql.*.select.*.count,5,sumSeries)),5)Affichage des 5 DB faisant le plus de select tous sites confondus
    40. 40. alias(sum(stats_counts.cache.memcached.read.*),"Memcache total Read ")alias(sum(stats_counts.cache.memcached.write.*),"Memcache total Write")dashed(drawAsInfinite(stats_counts.dev.mep.master_www))Affichage des lectures/écritures Memcache avec mise en production
    41. 41. limit(sortByMaxima(groupByNode(stats.timers.mysql.*.select.*.sum,sumSeries)),10)Temps SQL passé par site au format « Camembert » avec le paramètre &graphType=pie
    42. 42. Les possibilités d’écriture de métrique : • stats_counts.mysql.clubic.select.edito.count • stats_counts.mysql.{clubic,jvfr}.select.edito.count • stats_counts.mysql.*.*.edito.count • stats_counts.mysql.c*c.select.edito.count • stats_counts.host-[0-1].cpu • … • Attention a la manière dont vous écrivez vos arbos : • Un nœud sous Graphite représente environ 6mo !!!
    43. 43. Les fonctions principales : • sumSeries, sumSeriesWithWildcards • limit • sortByMaxima / sortByMinima • aliasByNode / alias / substr • groupByNode • averageAbove / averageBelow / currentBelow … • color / dashed / lineWidth / stacked • drawAsInfinite • keepLastValue • secondYAxis • summarize • timeShift http://readthedocs.org/docs/graphite/en/latest/functions.html
    44. 44. L’URL API : • http://graphite/render/? • target=stats.timers.mysql.clubic.select.edito.count • &height=800&width=600 • &from=-8d&until=-7d • &from=20091201&until=20091231 • &from=-5min • &title=Graph%20Clubic%20Sql • &format={json|raw|csv|…} • … Exemple : http://graphite.<dom>.fr/ render ?width=300&from=- 4hours&until=now&height=230&title=Warning&target=sum(stats_counts. errors.warning.*) http://readthedocs.org/docs/graphite/en/latest/url-api.html
    45. 45. GRAPHITE AU QUOTIDIEN ?Le DashBoard
    46. 46. Le Dashboard
    47. 47. Le Dashboard …
    48. 48. ALERTING AVEC GRAPHITE ?Est ce possible ?
    49. 49. Sortir les données brutes des métriques<graphitehost>/render/?target=stats_counts.errors.404.clubic&format=json
    50. 50. DES EXEMPLESWebPerf / Cpu / Erreurs JS …
    51. 51. Temps d’affichage client #webperf • Real User Monitoring : • Navigation Timing API (spéc HTML5) • Utilisation de limage Object JS (new Image()) avec les paramètres relevés • Node.Js : Serveur HTTP (204 ok sans contenu) et agrège les données pour les envoyer à GraphiteConso Cpu coté serveur • Fonction getrusage() en PHP • http://php.net/manual/fr/function.getrusage.php • + Append_file ou preprend_file et/ou register_shutdown_function()Erreurs JS • Spec JS window.onerror(message, url, line) • Utilisation de limage Object JS (new Image()) avec les paramètres relevés pour envoi à un serveur HTTPWhat Else ? …
    52. 52. Le monitoring c’est bien, mais pour plusde précision, il est indispensable delogguer des infos plus précises ailleursBdd, Syslog, …
    53. 53. Tester simplement ? • https://github.com/suan/graphite_up • Installation via VirtualBox + Vagrant de • Graphite (https://github.com/graphite-project) • StatsD (https://github.com/etsy/statsd) • Diamond (http://opensource.brightcove.com/project/diamond) • Sur une Debian Squeeze 32-bit via Chef.
    54. 54. Conclusion • Beaucoup moins d’anomalies applicatives ressenties • Eléments factuels lors des posts-mortems • MTTD / MMTR beaucoup plus court • Vrai liant entre Exploit et Développeur • Réelle implication des développeurs sur l’impact de leurs développement • D’autres services que la technique ont mis en place leurs Dashboard à partir de nos métriques
    55. 55. Retrouvez la DT d’M6Web surhttp://tech.m6web.frEt moi sur Twitter : @kenny_dee

    ×