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

Comment Grapher et visualiser vos datas @ PHPTourLyon 2014

Comment Grapher et visualiser vos datas @ PHPTourLyon 2014

Grégoire Pineau

June 23, 2014
Tweet

More Decks by Grégoire Pineau

Other Decks in Programming

Transcript

  1. Comment grapher et
    visualiser vos datas
    PHP Tour Lyon 2014

    View Slide

  2. Qui suis-je ?
    Grégoire Pineau
    Développeur @SensioLabs
    @lyrixx

    View Slide

  3. Pourquoi Grapher ?

    View Slide

  4. Pour la visibilité
    https://www.flickr.com/photos/jronaldlee/6469277257

    View Slide

  5. Quoi Grapher ?

    View Slide

  6. Le comportement des utilisateurs
    https://www.flickr.com/photos/raneko/5198682308

    View Slide

  7. La santé
    de votre
    infra
    https://www.flickr.com/photos/traftery/4773457853

    View Slide

  8. Vos données métier !!!

    View Slide

  9. View Slide

  10. Quelques questions
    Combien de:
    ● nouveaux utilisateurs chaque jour
    ● commentaires ajoutés
    ● commandes validées
    ● erreur 500
    ● hit par controller / route

    View Slide

  11. Comment grapher vos data métier ?

    View Slide

  12. Graphite
    ● outils en python
    ● stock des time-series
    ● rend des graphiques
    ● https://graphite.readthedocs.org/

    View Slide

  13. View Slide

  14. Premier constat
    C’est moche
    Mais on a une
    solution pour ça
    !

    View Slide

  15. Architecture
    ● Whisper est l’outil bas niveau qui stock les
    data
    ● Carbon est un démon qui reçoit les
    métriques et les injecte dans Whisper
    ● Graphite est une application Django (python)
    qui rend vos données sous forme de
    graphique

    View Slide

  16. Whisper
    (DB)
    Carbon
    (démon)
    Vous
    (PHP / …)
    Graphite
    (Front/API)

    View Slide

  17. Whisper
    ● Time series database
    ● Ressemble à du RRD
    ● Mais peut travailler avec différentes
    résolutions:
    ○ 1 point toutes les 10 secondes pendant 1 jour
    ○ 1 point toutes les 10 minutes pendant 10 jour
    ○ 1 point toutes les heures pendant 5 ans
    ○ ….

    View Slide

  18. Carbon
    ● Carbon-agent est un démon
    ● Il fonctionne en TCP ou en UDP
    ● Pour chaque métrique reçu, il écrit dans
    whisper

    View Slide

  19. Graphite (1)
    ● Rend vos time serie sous forme de
    graphique temporel.
    ● Mets à disposition beaucoup de fonctions
    statistiques:
    ○ +, -, /, *
    ○ dérivé / intégral
    ○ 99 percentil
    ○ max / min
    ○ ...

    View Slide

  20. Graphite (2)
    ● Met aussi a disposition une “api”
    ○ CSV
    ○ JSON
    ○ raw
    ○ SVG
    ○ PNG
    ● http://graphite.lxc/&[...]&format=json
    ● http://graphite.lxc/&[...]&format=csv

    View Slide

  21. Écrire dans graphite

    View Slide

  22. Whisper
    ● Whisper met à jour les fichiers .wsp lorsqu’
    une nouvelle valeur arrive.
    ● Les fichiers .wsp feront toujours la même
    taille
    ● Il agrège aussi les data “anciennes” en
    fonction des fichiers storage-schema.conf et
    storage-agregation.conf

    View Slide

  23. Storage Schema
    [github]
    pattern = ^github
    retentions = 1d:5y
    [all]
    pattern = .*
    retentions = 10s:6h,1min:6d,10min:1y, 1h:5y

    View Slide

  24. Storage Aggregation
    [default_average]
    pattern = .*
    xFilesFactor = 0
    aggregationMethod = average

    View Slide

  25. Données de test
    https://gist.github.com/mleinart/6283958
    Puis:
    whisper-random.py test/foo/bar/key.wsp

    View Slide

  26. Comment exploiter les Time Series

    View Slide

  27. Raw

    View Slide

  28. Moyenne

    View Slide

  29. Différence dans le temps

    View Slide

  30. Graphite n’est pas suffisant
    Graphite ne garde que la dernière valeur
    envoyé dans un intervalle de temps
    Mais on a une
    solution pour ça
    !

    View Slide

  31. Statsd

    View Slide

  32. Statsd (1)
    ● Est un démon (node js) écrit par Etsy
    ● A qui on parle en UDP
    ● Et qui sample les data dans un intervalle de
    temps
    ● Il existe un portage pour chaque langage qui
    existe sur terre !!!

    View Slide

  33. Whisper
    (DB)
    Statsd
    (démon)
    Vous
    (PHP / …)
    Graphite
    (Front/API)
    Carbon
    (démon)

    View Slide

  34. Sampling
    Pendant un intervalle donnée, stastd va
    calculer la valeur moyenne des données en
    entré
    Puis il va envoyer cette valeur à carbon.

    View Slide

  35. Les métriques statsd
    ● Compteur (+1 à chaque nouvelle inscription)
    ● Timing (Temps de création de la réponse)
    ● Gauge (Nombre d’utilisateurs total)

    View Slide

  36. La métrique Timing
    ● Timing est TRÈS mal nommée !!!
    ● Statsd va envoyer en plus à carbon:
    ○ valeur max
    ○ valeur min
    ○ nombre de valeur recu
    ○ 99 percentil
    ○ moyenne
    ○ médiane
    ● Convient très bien pour une conso mémoire

    View Slide

  37. Ecrire dans statsd

    View Slide

  38. View Slide

  39. Résultat

    View Slide

  40. Attention à la configuration (1)
    Les fenêtres de sampling / aggragation doivent
    être les mêmes entre statsd et carbon.
    Sinon vous allez:
    perdre des données (statd > carbon)
    avoir des données à 0 (statsd < carbon)

    View Slide

  41. Attention à la configuration (2)
    Par défaut, carbon re-agrège en faisant la
    moyenne, dans certains cas il faut:
    ● garder la valeur max
    ● garder la valeur min
    ● faire le total
    https://github.
    com/etsy/statsd/blob/master/docs/graphite.md

    View Slide

  42. Et avec PHP ?

    View Slide

  43. Packagist
    ● https://packagist.org/search/?q=statsd
    ● Autant de libs que de développer
    ● (au moins) deux lib sortent du lot:
    ○ https://packagist.org/packages/beberlei/metrics (12K
    installation)
    ○ https://packagist.org/packages/m6web/statsd (3K
    installation)

    View Slide

  44. beberlei/metric

    View Slide

  45. View Slide

  46. View Slide

  47. Et avec Symfony2 ?

    View Slide

  48. MetricBundle

    View Slide

  49. Configuration des services

    View Slide

  50. Astuce Symfony2
    ● Branchez vous sur tous les listeners
    possibles :
    ○ kernel.terminate
    ■ pour grapher les temps de réponse
    ■ la mémoire
    ■ le status code
    ○ doctrine: temps passé à requêter la DB, le type de
    query (SELECT, UPDATE, …)
    ○ security: avoir des informations sur le login ...

    View Slide

  51. Quelques astuces

    View Slide

  52. Nommage des métriques (1)
    ● Le nommage est très important
    ● On peut “glober” avec graphite
    ○ analysis.details.grade.*
    ○ http.request.method.*
    ● Il faut éviter les conflits lorsqu’on glob
    ● Toujours bien namespacer les métriques

    View Slide

  53. Nommage des métriques (2)
    ● Pour les compteurs, suffixer par un verbe au
    passé :
    ○ project.created
    ○ violation.comment.created
    ● Pour le reste il n’y a pas de convention

    View Slide

  54. La fonction hitcount
    ● Graphite stock des valeurs par seconde
    ● C’est très déroutant au début
    ● Il faut utiliser la fonction hitcount par avoir
    des valeur par minutes / heures / ...

    View Slide

  55. Infrastructure (1)
    ● Installer graphite sur un SSD
    ● Installer graphite sur un SSD
    ● Installer graphite sur un SSD
    ● Installer graphite sur un SSD
    ● Installer graphite sur un SSD
    ● Installer graphite sur un SSD
    ● Installer graphite sur un SSD
    ● Installer graphite sur un SSD

    View Slide

  56. Infrastructure (2)
    Si vous n’avez pas de SSD,
    Augmentez la première fenêtre de 10 secondes
    à 1 minute
    Attention, c’est à faire dans statsd ET dans
    carbon

    View Slide

  57. Bien tester sa configuration
    ● La configuration est écrite dans le fichier .
    wsp lors de sa création.
    ● Il n’est pas possible de changer la
    configuration après coup
    ● A moins de connaître ses outils

    View Slide

  58. XFileFactor
    Défit si l'intervalle doit être mis à null lors de
    l'agrégation si il n’y a pas assez de valeur
    Le mettre à 0 si vous n’avez que peu de data.

    View Slide

  59. Connaître les outils bas niveau
    ● whisper-info.py
    ● whisper-fetch.py / whisper-dump.py
    ● whisper-resize.py
    ○ permet de changer le xfilefactor
    ○ permet de changer la taille des fenêtres
    ○ C’est lent … (120Go de data transformé en 15h)

    View Slide

  60. 0 est très différent de null

    View Slide

  61. Et maintenant ?

    View Slide

  62. Il faut construire des dashboards
    Vous pouvez utiliser graphite … Mais c’est
    moche et peu ergonomique
    Il existe pléthore de moteurs de dashboard
    open source exploitant l’API JSON de graphite.
    Il y a environ autant de moteurs de dashboard
    que de développeurs.

    View Slide

  63. Moteur connu
    Hormis quelques bons moteurs (Giraffe,
    Cubism, …) la plupart ont besoin de Ruby,
    PHP, Python ou…
    Mais pourquoi ?

    View Slide

  64. Grafana
    ● Uniquement en HTML + CSS + JS
    ● Basé sur le super moteur Kibana
    ● Mais utilise graphite comme backend
    ● http://grafana.org/

    View Slide

  65. View Slide

  66. Grafana - Features
    ● Sexy
    ● Auto - refresh
    ● Time range sélecteur
    ● Configuration dynamique
    ● Query Builder très bien fait
    ● http://grafana.org/
    ● Demo ?

    View Slide

  67. Merci.
    Des questions ?

    View Slide