Monitoring Applicatif
M6Webgroupe M6Filiale digitale du                              + de 70 Sites sur PF LAMPLe MVNO M6Mobile avec Orange      ...
Kenny DITS ( @kenny_dee )Responsable Etude & Dév chez M6WebAncien dév LAMPPassionné de WebPerf & Monitoring
Clubic.com           Jeuxvideo.fr             M6.fr                  Turbo.frDeco.fr              W9.fr
POURQUOI MONITORER ?Parce que !
Je veux savoir lorsqu’un de nosservices Php ne fonctionne plus !
Je veux vérifier que les erreurs et lestemps de chargement n’empirent pas !
Je veux mesurer l’impact d’une pub téléou d’une actualité « Hot » sur l’un denos sites !
Je veux trouver rapidement la oules RootCause lors d’un incident !
Je veux tout savoir sur tous nossites !
Je veux retrouvez la vue sur nos projets !Que se passe-t-il en production ?Qu’est-ce qui s’est passé ?Mes services fonctio...
Et la donner à nos développeurs !Vérifier l’impact de leurs mises en production sur nos applis / surnos serveurs, sur les ...
QUE DOIT-ON MONITORER ?Tout !
"If its not monitored, its not in            production"     Theo Schlossnagle #velocityconf
"If you can not measure it, you can          not improve it"             Lord Kelvin
Exemples de métriques à monitorer : • Appels aux services applicatifs     • Téléchargement sur Clubic / Lectures de news, ...
COMMENT MONITORER ?
Monitoring humain ?On surveille le site H24 ?
StatsD                                             ©Etsy & FlickR    http://Graphite.wikidot.com       http://Github.com/e...
Principe de fonctionnement              [Client                 • [Serveur                                       [Graphite...
STATSDLe collecteur
StatsDAgrégateur de statistiques1 Démon Node.js + 1 client Php (ou autre)
Node.JS : • Créée par Ryan Dahl (@ryah) début 2009,     • basée sur la machine virtuelle V8 (projet Open Source de       G...
Représentation de nos métriques • errors     • 404          • clubic (errors.404.clubic)          • Jvfr (errors.404.jvfr)...
Applicatif                 Métrique   Métrique                      Métrique                  StatsDLe client StatsD :    ...
Le client StatsD : implémentation • En PHP StatsD::increment(errors.404.clubic); // +1 dune statistique StatsD::decrement(...
Le serveur StatsD : • Nombre de métriques reçu par StatsD et envoyé    • graphite.numStats : • Les Incréments sont stockés...
Le protocole UDP : • Fire & Forget :     • Rapide     • Pas d’attente de réponse du serveur     • Aucun impact si le serve...
Notice PHP … Fuuu
Hack du client Php et serveur StatsD : Modification du client PHP pour envoyer moins de paquets UDP => Utilisation du regi...
GRAPHITEPrésentation
Graphite : • Stocke des métriques dans le temps • Permet de grapher ces métriques à la demande • Graphite ne fait pas la c...
Graphite : Le Composer
Graph Data                          Graph OptionsLes options du Composer
COMMENT UTILISER GRAPHITE ?Quelques exemples
stats.timers.mysql.clubic.select.*.countAffichage du nombre de select sur Clubic par DB
sum(stats.timers.mysql.clubic.select.*.count)Nombre de select sur Clubic
limit(sortByMaxima(stats.timers.mysql.clubic.select.*.count,5))Affichage des 5 DB faisant le plus de select sur Clubic
limit(sortByMaxima(groupByNode(stats.timers.mysql.*.select.*.count,5,sumSeries)),5)Affichage des 5 DB faisant le plus de s...
alias(sum(stats_counts.cache.memcached.read.*),"Memcache total Read ")alias(sum(stats_counts.cache.memcached.write.*),"Mem...
limit(sortByMaxima(groupByNode(stats.timers.mysql.*.select.*.sum,sumSeries)),10)Temps SQL passé par site au format « Camem...
Les possibilités d’écriture de métrique : •   stats_counts.mysql.clubic.select.edito.count •   stats_counts.mysql.{clubic,...
Les fonctions principales : •   sumSeries, sumSeriesWithWildcards •   limit •   sortByMaxima / sortByMinima •   aliasByNod...
L’URL API : • http://graphite/render/?     • target=stats.timers.mysql.clubic.select.edito.count     • &height=800&width=6...
GRAPHITE AU QUOTIDIEN ?Le DashBoard
Le Dashboard
Le Dashboard …
ALERTING AVEC GRAPHITE ?Est ce possible ?
Sortir les données brutes des métriques<graphitehost>/render/?target=stats_counts.errors.404.clubic&format=json
DES EXEMPLESWebPerf / Cpu / Erreurs JS …
Temps d’affichage client #webperf • Real User Monitoring :    • Navigation Timing API (spéc HTML5)    • Utilisation de lim...
Le monitoring c’est bien, mais pour plusde précision, il est indispensable delogguer des infos plus précises ailleursBdd, ...
Tester simplement ? • https://github.com/suan/graphite_up • Installation via VirtualBox + Vagrant de     • Graphite (https...
Conclusion • Beaucoup moins d’anomalies applicatives ressenties • Eléments factuels lors des posts-mortems • MTTD / MMTR b...
Retrouvez la DT d’M6Web surhttp://tech.m6web.frEt moi sur Twitter : @kenny_dee
Monitoring applicatif : Pourquoi et comment ?
Monitoring applicatif : Pourquoi et comment ?
Monitoring applicatif : Pourquoi et comment ?
Próxima SlideShare
Cargando en…5
×

Monitoring applicatif : Pourquoi et comment ?

9.900 visualizaciones

Publicado el

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 ...

Publicado en: Tecnología
  • منحه مدعمه بـ150ج مصري فقط
    ((دبلومه اللغه الانجليزيه 18 مستوى+دبلومه اللغه الثانيه 9مستويات+دبلومه التنميه البشريه+الكمبيوتر'icdl,photoshop,autocad'
    +دبلومه اداره الاعمال+دبلومه المحاسبه الالكترونيه))
    كل هذا ب150ج بدلا من250ج لفتره محدوده خلال شهر رمضان
    مع اعتماد من اليونسكو واليونيسيف
    وكليه كامبردج الدوليه
    24019363 - 22623203 - 01151878708 - 01151878594 -01118792463
       Responder 
    ¿Estás seguro?    No
    Tu mensaje aparecerá aquí

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

×