Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Monitoring applicatif : pourquoi et comment ?

Monitoring applicatif : pourquoi et comment ?

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ébérgé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 ..

kennydee

June 15, 2012
Tweet

More Decks by kennydee

Other Decks in Programming

Transcript

  1. +  de  70  Sites  sur  PF  LAMP   11,6M  de

     Visiteurs  Unique  (Mars  2012  Nielsen)   4  millions  de  lignes  de  codes   16000  requêtes  MySql  par  seconde   Beaucoup  de  développeurs  !   M6Web   Filiale  digitale  du  groupe  M6   Le  MVNO  M6Mobile  avec  Orange   Le  Replay  et  produits  dérivés  des  progrs  télés   Un  comparateur  de  prix   CA  2011  :  102,1M€  
  2. Kenny  DITS  (  @kenny_dee  )   Responsable  Etude  &  Dév

     chez  M6Web   Ancien  dév  LAMP   Passionné  de  WebPerf  &  Monitoring  
  3. Je  veux  vérifier  que  les  erreurs  et  les   temps

     de  chargement  n’empirent  pas  !  
  4. Je  veux  mesurer  l’impact  d’une  pub  télé   ou  d’une

     actualité  «  Hot  »  sur  l’un  de   nos  sites  !  
  5. Que  se  passe-­‐t-­‐il  en  produc[on  ?     Qu’est-­‐ce  qui

     s’est  passé  ?   Mes  services  fonc[onnent-­‐ils  ?     Pourquoi  ne  fonc[onnent-­‐t-­‐ils  plus  ?     Je  veux  retrouvez  la  vue  sur  nos  projets  !  
  6. Vérifier  l’impact  de  leurs  mises  en  produc[on  sur  nos  applis

     /  sur   nos  serveurs,  sur  les  temps  de  chargement  etc  …   Et  la  donner  à  nos  développeurs  !  
  7. "If  it's  not  monitored,  it's  not  in   produc.on"  

      Theo  Schlossnagle  #velocityconf  
  8.  "If  you  can  not  measure  it,  you  can   not

     improve  it"     Lord  Kelvin  
  9. Exemples  de  métriques  à  monitorer  :   •  Appels  aux

     services  applica[fs   •  Téléchargement  sur  Clubic  /  Lectures  de  news,  topics,  vidéos  …   •  Calcul  de  cote  automobile  sur  Turbo   •  …   •  Ges[on  u[lisateurs  :     •  (dé)connexion   •  Inscrip[on   •  ac[va[on   •  U[lisa[on  et  temps  SQL:     •  select/update/…  par  db   •  Conso  CPU   •  Temps  d’affichage  des  pages   •  Erreurs  applica[ves  :     •  HTTP  (301,404  …)   •  PHP  (Warning,  Fatal,  …),  Js  …   •  U[lisa[on  des  caches  applica[fs   •  Memcached   •  Redis     •  Crawl  Google  …    
  10. [Client   StatsD]   Envoi  ses   métriques   Applica.f

      PHP   • [Serveur   StatsD]   • Agrège   • Et  envoi   Collecteur   [Graphite]   Stocke   Stockage   [Graphite]   Visualiser   des   métriques   Ou.ls  de   graph   Principe  de  fonc.onnement  
  11. 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   •  Ges[on  des  entrées/sor[es  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 World\n'); }).listen(1337, '127.0.0.1'); console.log('Server running at http://127.0.0.1:1337/');  
  12. Représenta.on  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    
  13. Le  client  StatsD  :   •  Incrément/Décrement   •  Timer

      Applica.f   StatsD   Métrique   Métrique   Métrique   Le  serveur  StatsD  :   •  Reçoit   •  Agrège  pendant  2  secondes   •  Envoie  a  Graphite  
  14. Le  client  StatsD  :  implémenta.on   •  En  PHP  

    StatsD::increment('errors.404.clubic'); // +1 d'une statistique StatsD::decrement('errors.404.clubic'); // -1 d'une 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}; ! •  …  
  15. 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.[mers.*.   •  mean   •  lower   •  upper   •  upper_90   •  Max   •  count   •  sum  (©M6web)  
  16. Le  protocole  UDP  :     •  Fire  &  Forget

     :     •  Rapide   •  Pas  d’akente  de  réponse  du  serveur   •  Aucun  impact  si  le  serveur  est  inaccessible   •  Aken[on  toutefois  …  :  trop  d’UDP  tue  l’UDP  …  et  les  serveurs  avec  …  
  17. Hack  du  client  Php  et  serveur  StatsD  :   Modifica[on

     du  client  PHP  pour  envoyer  moins  de  paquets  UDP     =>  U[lisa[on  du  register_shutdown_func[on  pour  envoyer  les  données     Découpage  en  paquets  (MTU  à  1500  octets  pour  Node.js  (limita[on   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    
  18. 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  ou[l  de  sta[s[que  !     •  Graphite  est  composé  de  3  éléments  dis[ncts  é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)  
  19. 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   •  …   •  Aken[on  a  la  manière  dont  vous  écrivez  vos  arbos  :   •  Un  nœud  sous  Graphite  représente  environ  6mo  !!!    
  20. Les  fonc.ons  principales  :   •  sumSeries,  sumSeriesWithWildcards   • 

    limit   •  sortByMaxima  /  sortByMinima   •  aliasByNode  /  alias  /  substr   •  groupByNode   •  averageAbove  /  averageBelow  /  currentBelow  …   •  color  /  dashed  /  lineWidth  /  stacked   •  drawAsInfinite   •  keepLastValue   •  secondYAxis   •  summarize   •  [meShi…   hkp://readthedocs.org/docs/graphite/en/latest/func[ons.html    
  21. L’URL  API  :   •  hkp://graphite/render/?   •  target=stats.[mers.mysql.clubic.select.edito.count  

    •  &height=800&width=600   •  &from=-­‐8d&un[l=-­‐7d   •  &from=20091201&un[l=20091231   •  &from=-­‐5min   •  &[tle=Graph%20Clubic%20Sql   •  &format={json|raw|csv|…}   •  …   Exemple  :  hkp://graphite.<dom>.fr/                            ? width=300&from=-­‐4hours&un[l=now&height=230&[tle=Warning&target =sum(stats_counts.errors.warning.*)       hkp://readthedocs.org/docs/graphite/en/latest/url-­‐api.html       render  
  22. Temps  d’affichage  client  #webperf   •  Real  User  Monitoring  :

      •  Naviga[on  Timing  API  (spéc  HTML5)   •  U[lisa[on  de  l'image  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  à  Graphite   Conso  Cpu  coté  serveur   •  Fonc[on  getrusage()  en  PHP     •  hkp://php.net/manual/fr/func[on.getrusage.php   •  +  Append_file  ou  preprend_file  et/ou  register_shutdown_func[on()   Erreurs  JS   •  Spec  JS  window.onerror(message,  url,  line)   •  U[lisa[on  de  l'image  Object  JS  (new  Image())  avec  les  paramètres   relevés  pour  envoi  à  un  serveur  HTTP   What  Else  ?  …  
  23. Le  monitoring  c’est  bien,  mais  pour  plus   de  précision,

     il  est  indispensable  de   logguer  des  infos  plus  précises  ailleurs   Bdd,  Syslog,  …  
  24. Tester  simplement  ?   •  hkps://github.com/suan/graphite_up   •  Installa[on  via

     VirtualBox  +  Vagrant  de   •  Graphite  (hkps://github.com/graphite-­‐project)   •  StatsD  (hkps://github.com/etsy/statsd)   •  Diamond  (hkp://opensource.brightcove.com/project/diamond)   •  Sur  une  Debian  Squeeze  32-­‐bit  via  Chef.  
  25. Conclusion   •  Beaucoup  moins  d’anomalies  applica[ves  ressen[es   • 

    Eléments  factuels  lors  des  posts-­‐mortems   •  MTTD  /  MMTR  beaucoup  plus  court   •  Vrai  liant  entre  Exploit  et  Développeur   •  Réelle  implica[on  des  développeurs  sur  l’impact  de  leurs   développement   •  D’autres  services  que  la  technique  ont  mis  en  place  leurs  Dashboard  à   par[r  de  nos  métriques