Tout a fonctionné 
du premier coup 
Personne, jamais. 
“
La mesure, ce n’est pas 
que pour le devops 
Forum PHP Paris 2014 
Olivier Garcia, Patrick Allaert
Olivier Garcia 
● CEO de catchy.io 
● Co-créateur de www.psychologue.pro 
● Co-organisateur de l’Agile Tour à Lille (Le 18/11, venez nombreux !) 
● @0livier 
● olivier@catchy.io 
● olivier@lol.cat
Patrick Allaert 
● CTO de catchy.io 
● Travaille avec PHP/Linux depuis '98 
● Auteur de l'extension PHP APM 
● @patrick_allaert 
● patrick@catchy.io 
● patrickallaert@php.net
Geek + Garage + ? = Profit
Quit $EDITOR : Get out of the building
Hi, I’m Eric Ries. 
J’ai formalisé 
le Lean Startup
Lean Startup, basée sur le Lean/Toyotisme 
● Production par étape “Just In Time” 
● Offre adaptée à la demande 
● Focalisé sur la production de valeur 
● Amélioration continue
Vous le faites déjà (en partie) 
● Itérations sur un projet 
● Interactions client pour mieux cerner le besoin 
● Scoring des stories pour prioritiser 
● Rétrospective
while(1) {Build(); Measure(); Learn();}
Mesurer ce qui importe 
● Métriques AAA
Mesurer ce qui importe 
● Métriques AAA 
○ Actionable 
○ Auditable 
○ Accessible
Mesurer ce qui importe 
● Métriques AAA 
● Métriques de vanité
Vanité AAA
Vanité 
● Nombre de lignes de code 
AAA 
● Ratio code mort
Vanité 
● Nombre de lignes de code 
● Followers sur Twitter 
AAA 
● Ratio code mort 
● Interactions avec followers
Vanité 
● Nombre de lignes de code 
● Followers sur Twitter 
● Nombre de visiteurs 
AAA 
● Ratio code mort 
● Interactions avec followers 
● Visiteurs qui s’inscrivent
Vanité 
● Nombre de lignes de code 
● Followers sur Twitter 
● Nombre de visiteurs 
● Utilisateurs 
AAA 
● Ratio code mort 
● Interactions avec followers 
● Visiteurs qui s’inscrivent 
● Utilisateurs actifs / 6 mois
Bonnes pratiques 
● Mesurez (absolument?) tout ! 
● Focalisez-vous sur des métriques en fonction 
de l’avancement du projet / sa réussite
AARRR
AARRR
AARRR 
A.cquisition Comment les utilisateurs viennent?
AARRR 
A.cquisition Comment les utilisateurs viennent? 
Exemple “site de recrutement des Chemins de Fer Belges”: 
Une personne visite le site pendant plus de 2 minutes
AARRR 
A.cquisition Comment les utilisateurs viennent? 
A.ctivation Est-ce qu’ils s’enregistrent ?
AARRR 
A.cquisition Comment les utilisateurs viennent? 
A.ctivation Est-ce qu’ils s’enregistrent ? 
Site de recrutement: 
L’internaute complète son profil et postule pour un job.
AARRR 
A.cquisition Comment les utilisateurs viennent? 
A.ctivation Est-ce qu’ils s’enregistrent ? 
R.etention Est-ce qu’ils reviennent/sont actifs?
AARRR 
A.cquisition Comment les utilisateurs viennent? 
A.ctivation Est-ce qu’ils s’enregistrent ? 
R.etention Est-ce qu’ils reviennent/sont actifs? 
Site de recrutement: 
Les chercheurs d’emploi reviennent pour consulter de 
nouveaux jobs.
AARRR 
A.cquisition Comment les utilisateurs viennent? 
A.ctivation Est-ce qu’ils s’enregistrent ? 
R.etention Est-ce qu’ils reviennent/sont actifs? 
R.eferral Font-ils venir d’autres utilisateurs?
AARRR 
A.cquisition Comment les utilisateurs viennent? 
A.ctivation Est-ce qu’ils s’enregistrent ? 
R.etention Est-ce qu’ils reviennent/sont actifs? 
R.eferral Font-ils venir d’autres utilisateurs? 
Site de recrutement: 
1. Combien de personnes partagent-elles un job? 
2. Combien de ces partages mènent-ils à une candidature?
AARRR 
A.cquisition Comment les utilisateurs viennent? 
A.ctivation Est-ce qu’ils s’enregistrent ? 
R.etention Est-ce qu’ils reviennent/sont actifs? 
R.eferral Font-ils venir d’autres utilisateurs? 
R.evenu Quels impacts sur le €€€ ?
AARRR 
A.cquisition Comment les utilisateurs viennent? 
A.ctivation Est-ce qu’ils s’enregistrent ? 
R.etention Est-ce qu’ils reviennent/sont actifs? 
R.eferral Font-ils venir d’autres utilisateurs? 
R.evenu Quels impacts sur le €€€ ? 
Site de recrutement: 
Combien de personnes ont-elles été engagées? … et ce pour plus de 6 mois?
Outils de récolte de métriques
Le plus connu?
Google Analytics
Google Analytics - Mise en place 
<script> 
(function (i,s,o,g,r,a,m){i['GoogleAnalyticsObject' ]=r;i[r]=i[r]||function (){ 
(i[r].q=i[r].q||[]).push(arguments )},i[r].l=1*new Date();a=s.createElement (o), 
m=s.getElementsByTagName (o)[0];a.async=1;a.src=g;m.parentNode .insertBefore (a,m) 
})(window,document ,'script' ,'//www.google-analytics.com/analytics.js' ,'ga'); 
ga('create' , 'UA-XXXX-Y' , 'auto'); // Creates a tracker. 
ga('send', 'pageview' ); // Sends a pageview. 
</script>
Google Analytics - Dashboards standards
Google Analytics - Surveiller des évènements
Google Analytics - Surveiller des évènements 
ga('send', 'event', 'category', 'action'); 
ga('send', 'event', 'category', 'action', 'label'); 
ga('send', 'event', 'category', 'action', 'label', value); // value is a number.
Google Analytics - Surveiller des évènements 
ga('send', 'event', 'user', 'register'); 
ga('send', 'event', 'category', 'action', 'label'); 
ga('send', 'event', 'category', 'action', 'label', value); // value is a number.
Google Analytics - Surveiller des évènements 
ga('send', 'event', 'user', 'register'); 
ga('send', 'event', 'user', 'apply_job', 'job_123'); 
ga('send', 'event', 'category', 'action', 'label', value); // value is a number.
Google Analytics - Surveiller des évènements 
ga('send', 'event', 'user', 'register'); 
ga('send', 'event', 'user', 'apply_job', 'job_123'); 
ga('send', 'event', 'user', 'share_job', 'job_123', 3); // value is a number.
Google Analytics 
Créer des dashboards personnalisés: Embed API 
Démo en ligne: 
http://ga-dev-tools.appspot.com/demos/ 
https://github.com/googleanalytics/embed-api-demos
Google Analytics Query Explorer 
http://ga-dev-tools.appspot.com/explorer/
Google Analytics Query Explorer
Google Analytics Query Explorer
Google Analytics Query Explorer
Google Analytics Query Explorer
Google Analytics Query Explorer
Google Analytics 
Créer des dashboards personnalisés: Embed API 
{ 
ids: 
"ga:6172121", 
dimensions: 
"ga:date,ga:eventCategory", 
metrics: 
"ga:totalEvents", 
filters: 
"ga:eventCategory==Account creation", 
start-date: 
"2014-09-01", 
end-date: 
"2014-10-01" 
}
Le plus en vogue?
StatsD + Graphite
StatsD + Graphite 
Application
StatsD + Graphite 
UDP 
Application StatsD
StatsD + Graphite 
UDP 
Application StatsD
StatsD + Graphite 
UDP 
inc(login) 
Application StatsD
StatsD + Graphite 
UDP 
inc(login) echo "login:1|c" | 
Application StatsD 
nc -w 1 -u graphite. 
example.com 8125
StatsD + Graphite 
UDP 
inc(login) 
inc(login) 
Application StatsD
StatsD + Graphite 
UDP 
inc(login) 
inc(login) 
inc(register) 
Application StatsD
StatsD + Graphite 
UDP 
inc(login) 
inc(login) 
inc(register) 
duration(search, 
Application StatsD 
200ms)
StatsD + Graphite 
UDP 
inc(login) 
inc(login) 
inc(register) 
duration(search, 
Application StatsD 
200ms) 
inc(login)
StatsD + Graphite 
UDP 
inc(login) 
inc(login) 
inc(register) 
duration(search, 
Application StatsD 
200ms) 
inc(login) 
duration(search, 
300ms)
StatsD + Graphite 
UDP 
inc(login) 
inc(login) 
inc(register) 
duration(search, 
Application StatsD 
200ms) 
inc(login) 
duration(search, 
300ms) 
duration(search, 
100ms)
StatsD + Graphite 
UDP 
inc(login) 
inc(login) 
inc(register) 
duration(search, 
Application StatsD 
200ms) 
inc(login) 
duration(search, 
300ms) 
duration(search, 
100ms) 
10 secondes: 
inc(login, 3); 
inc(register, 1); 
duration( search, 3, { 
min: 100, 
max: 300, 
avg: 200, 
mean: 200 
});
StatsD + Graphite 
UDP 
inc(login) 
inc(login) 
inc(register) 
duration(search, 
Application StatsD 
200ms) 
inc(login) 
duration(search, 
300ms) 
duration(search, 
100ms) 
Graphite 
TCP 
10 secondes: 
inc(login, 3); 
inc(register, 1); 
duration( search, 3, { 
min: 100, 
max: 300, 
avg: 200, 
mean: 200 
});
StatsD + Graphite 
Graphite
StatsD + Graphite 
24h: 
/10 secondes 
Graphite
StatsD + Graphite 
24h: 
/10 secondes 
2 semaines: 
/1 minute 
Graphite
StatsD + Graphite 
24h: 
/10 secondes 
2 semaines: 
/1 minute 
Graphite 
6 mois: 
/10 minutes
StatsD + Graphite 
24h: 
/10 secondes 
2 semaines: 
/1 minute 
Graphite 
6 mois: 
/10 minutes 
5 ans: 
/1 heure
StatsD + Graphite 
24h: 
/10 secondes 
2 semaines: 
/1 minute 
Graphite 
6 mois: 
/10 minutes 
5 ans: 
/1 heure
Outils de visualisation Graphite 
● Grafana 
● Tessera 
● Graphiti 
● Giraffe 
● Graphene 
● … plus sur: http://graphite.readthedocs. 
org/en/latest/tools.html#visualization
Grafana
Tessera
Et les autres…
Et les autres… 
● Mixpanel 
● Pirate Metrics 
● KISSmetrics
En résumé 
Le succès dépend d’un feedback mesurable.
En résumé 
Le succès dépend d’un feedback mesurable. 
LeanStartup et AARRR donnent des pistes 
pour s’appuyer sur des métriques fiables.
En résumé 
Le succès dépend d’un feedback mesurable. 
LeanStartup et AARRR donnent des pistes 
pour s’appuyer sur des métriques fiables. 
Il existe des outils facilement intégrables en 
PHP pour créer ces indicateurs.
Merci 
https://joind.in/11937 http://lanyrd.com/sddybk
Credits 
www.flickr.com/photos/kk (Lil’ pirates) 
www.flickr.com/photos/betsyweber (Eric Ries) 
www.flickr.com/photos/highersights (Listen...) 
www.flickr.com/photos/75001512@N00/4228976596 (Geek) 
www.flickr.com/photos/phobia (Fail Stamp)

La mesure, ce n'est pas que pour le devops

  • 1.
    Tout a fonctionné du premier coup Personne, jamais. “
  • 2.
    La mesure, cen’est pas que pour le devops Forum PHP Paris 2014 Olivier Garcia, Patrick Allaert
  • 3.
    Olivier Garcia ●CEO de catchy.io ● Co-créateur de www.psychologue.pro ● Co-organisateur de l’Agile Tour à Lille (Le 18/11, venez nombreux !) ● @0livier ● olivier@catchy.io ● olivier@lol.cat
  • 4.
    Patrick Allaert ●CTO de catchy.io ● Travaille avec PHP/Linux depuis '98 ● Auteur de l'extension PHP APM ● @patrick_allaert ● patrick@catchy.io ● patrickallaert@php.net
  • 5.
    Geek + Garage+ ? = Profit
  • 6.
    Quit $EDITOR :Get out of the building
  • 12.
    Hi, I’m EricRies. J’ai formalisé le Lean Startup
  • 13.
    Lean Startup, baséesur le Lean/Toyotisme ● Production par étape “Just In Time” ● Offre adaptée à la demande ● Focalisé sur la production de valeur ● Amélioration continue
  • 14.
    Vous le faitesdéjà (en partie) ● Itérations sur un projet ● Interactions client pour mieux cerner le besoin ● Scoring des stories pour prioritiser ● Rétrospective
  • 15.
  • 16.
    Mesurer ce quiimporte ● Métriques AAA
  • 17.
    Mesurer ce quiimporte ● Métriques AAA ○ Actionable ○ Auditable ○ Accessible
  • 18.
    Mesurer ce quiimporte ● Métriques AAA ● Métriques de vanité
  • 19.
  • 20.
    Vanité ● Nombrede lignes de code AAA ● Ratio code mort
  • 21.
    Vanité ● Nombrede lignes de code ● Followers sur Twitter AAA ● Ratio code mort ● Interactions avec followers
  • 22.
    Vanité ● Nombrede lignes de code ● Followers sur Twitter ● Nombre de visiteurs AAA ● Ratio code mort ● Interactions avec followers ● Visiteurs qui s’inscrivent
  • 23.
    Vanité ● Nombrede lignes de code ● Followers sur Twitter ● Nombre de visiteurs ● Utilisateurs AAA ● Ratio code mort ● Interactions avec followers ● Visiteurs qui s’inscrivent ● Utilisateurs actifs / 6 mois
  • 24.
    Bonnes pratiques ●Mesurez (absolument?) tout ! ● Focalisez-vous sur des métriques en fonction de l’avancement du projet / sa réussite
  • 26.
  • 27.
  • 28.
    AARRR A.cquisition Commentles utilisateurs viennent?
  • 29.
    AARRR A.cquisition Commentles utilisateurs viennent? Exemple “site de recrutement des Chemins de Fer Belges”: Une personne visite le site pendant plus de 2 minutes
  • 30.
    AARRR A.cquisition Commentles utilisateurs viennent? A.ctivation Est-ce qu’ils s’enregistrent ?
  • 31.
    AARRR A.cquisition Commentles utilisateurs viennent? A.ctivation Est-ce qu’ils s’enregistrent ? Site de recrutement: L’internaute complète son profil et postule pour un job.
  • 32.
    AARRR A.cquisition Commentles utilisateurs viennent? A.ctivation Est-ce qu’ils s’enregistrent ? R.etention Est-ce qu’ils reviennent/sont actifs?
  • 33.
    AARRR A.cquisition Commentles utilisateurs viennent? A.ctivation Est-ce qu’ils s’enregistrent ? R.etention Est-ce qu’ils reviennent/sont actifs? Site de recrutement: Les chercheurs d’emploi reviennent pour consulter de nouveaux jobs.
  • 34.
    AARRR A.cquisition Commentles utilisateurs viennent? A.ctivation Est-ce qu’ils s’enregistrent ? R.etention Est-ce qu’ils reviennent/sont actifs? R.eferral Font-ils venir d’autres utilisateurs?
  • 35.
    AARRR A.cquisition Commentles utilisateurs viennent? A.ctivation Est-ce qu’ils s’enregistrent ? R.etention Est-ce qu’ils reviennent/sont actifs? R.eferral Font-ils venir d’autres utilisateurs? Site de recrutement: 1. Combien de personnes partagent-elles un job? 2. Combien de ces partages mènent-ils à une candidature?
  • 36.
    AARRR A.cquisition Commentles utilisateurs viennent? A.ctivation Est-ce qu’ils s’enregistrent ? R.etention Est-ce qu’ils reviennent/sont actifs? R.eferral Font-ils venir d’autres utilisateurs? R.evenu Quels impacts sur le €€€ ?
  • 37.
    AARRR A.cquisition Commentles utilisateurs viennent? A.ctivation Est-ce qu’ils s’enregistrent ? R.etention Est-ce qu’ils reviennent/sont actifs? R.eferral Font-ils venir d’autres utilisateurs? R.evenu Quels impacts sur le €€€ ? Site de recrutement: Combien de personnes ont-elles été engagées? … et ce pour plus de 6 mois?
  • 38.
    Outils de récoltede métriques
  • 39.
  • 40.
  • 41.
    Google Analytics -Mise en place <script> (function (i,s,o,g,r,a,m){i['GoogleAnalyticsObject' ]=r;i[r]=i[r]||function (){ (i[r].q=i[r].q||[]).push(arguments )},i[r].l=1*new Date();a=s.createElement (o), m=s.getElementsByTagName (o)[0];a.async=1;a.src=g;m.parentNode .insertBefore (a,m) })(window,document ,'script' ,'//www.google-analytics.com/analytics.js' ,'ga'); ga('create' , 'UA-XXXX-Y' , 'auto'); // Creates a tracker. ga('send', 'pageview' ); // Sends a pageview. </script>
  • 42.
    Google Analytics -Dashboards standards
  • 47.
    Google Analytics -Surveiller des évènements
  • 48.
    Google Analytics -Surveiller des évènements ga('send', 'event', 'category', 'action'); ga('send', 'event', 'category', 'action', 'label'); ga('send', 'event', 'category', 'action', 'label', value); // value is a number.
  • 49.
    Google Analytics -Surveiller des évènements ga('send', 'event', 'user', 'register'); ga('send', 'event', 'category', 'action', 'label'); ga('send', 'event', 'category', 'action', 'label', value); // value is a number.
  • 50.
    Google Analytics -Surveiller des évènements ga('send', 'event', 'user', 'register'); ga('send', 'event', 'user', 'apply_job', 'job_123'); ga('send', 'event', 'category', 'action', 'label', value); // value is a number.
  • 51.
    Google Analytics -Surveiller des évènements ga('send', 'event', 'user', 'register'); ga('send', 'event', 'user', 'apply_job', 'job_123'); ga('send', 'event', 'user', 'share_job', 'job_123', 3); // value is a number.
  • 53.
    Google Analytics Créerdes dashboards personnalisés: Embed API Démo en ligne: http://ga-dev-tools.appspot.com/demos/ https://github.com/googleanalytics/embed-api-demos
  • 55.
    Google Analytics QueryExplorer http://ga-dev-tools.appspot.com/explorer/
  • 57.
  • 58.
  • 59.
  • 60.
  • 62.
  • 65.
    Google Analytics Créerdes dashboards personnalisés: Embed API { ids: "ga:6172121", dimensions: "ga:date,ga:eventCategory", metrics: "ga:totalEvents", filters: "ga:eventCategory==Account creation", start-date: "2014-09-01", end-date: "2014-10-01" }
  • 66.
    Le plus envogue?
  • 67.
  • 68.
    StatsD + Graphite Application
  • 69.
    StatsD + Graphite UDP Application StatsD
  • 70.
    StatsD + Graphite UDP Application StatsD
  • 71.
    StatsD + Graphite UDP inc(login) Application StatsD
  • 72.
    StatsD + Graphite UDP inc(login) echo "login:1|c" | Application StatsD nc -w 1 -u graphite. example.com 8125
  • 73.
    StatsD + Graphite UDP inc(login) inc(login) Application StatsD
  • 74.
    StatsD + Graphite UDP inc(login) inc(login) inc(register) Application StatsD
  • 75.
    StatsD + Graphite UDP inc(login) inc(login) inc(register) duration(search, Application StatsD 200ms)
  • 76.
    StatsD + Graphite UDP inc(login) inc(login) inc(register) duration(search, Application StatsD 200ms) inc(login)
  • 77.
    StatsD + Graphite UDP inc(login) inc(login) inc(register) duration(search, Application StatsD 200ms) inc(login) duration(search, 300ms)
  • 78.
    StatsD + Graphite UDP inc(login) inc(login) inc(register) duration(search, Application StatsD 200ms) inc(login) duration(search, 300ms) duration(search, 100ms)
  • 79.
    StatsD + Graphite UDP inc(login) inc(login) inc(register) duration(search, Application StatsD 200ms) inc(login) duration(search, 300ms) duration(search, 100ms) 10 secondes: inc(login, 3); inc(register, 1); duration( search, 3, { min: 100, max: 300, avg: 200, mean: 200 });
  • 80.
    StatsD + Graphite UDP inc(login) inc(login) inc(register) duration(search, Application StatsD 200ms) inc(login) duration(search, 300ms) duration(search, 100ms) Graphite TCP 10 secondes: inc(login, 3); inc(register, 1); duration( search, 3, { min: 100, max: 300, avg: 200, mean: 200 });
  • 81.
  • 82.
    StatsD + Graphite 24h: /10 secondes Graphite
  • 83.
    StatsD + Graphite 24h: /10 secondes 2 semaines: /1 minute Graphite
  • 84.
    StatsD + Graphite 24h: /10 secondes 2 semaines: /1 minute Graphite 6 mois: /10 minutes
  • 85.
    StatsD + Graphite 24h: /10 secondes 2 semaines: /1 minute Graphite 6 mois: /10 minutes 5 ans: /1 heure
  • 86.
    StatsD + Graphite 24h: /10 secondes 2 semaines: /1 minute Graphite 6 mois: /10 minutes 5 ans: /1 heure
  • 87.
    Outils de visualisationGraphite ● Grafana ● Tessera ● Graphiti ● Giraffe ● Graphene ● … plus sur: http://graphite.readthedocs. org/en/latest/tools.html#visualization
  • 88.
  • 89.
  • 90.
  • 91.
    Et les autres… ● Mixpanel ● Pirate Metrics ● KISSmetrics
  • 92.
    En résumé Lesuccès dépend d’un feedback mesurable.
  • 93.
    En résumé Lesuccès dépend d’un feedback mesurable. LeanStartup et AARRR donnent des pistes pour s’appuyer sur des métriques fiables.
  • 94.
    En résumé Lesuccès dépend d’un feedback mesurable. LeanStartup et AARRR donnent des pistes pour s’appuyer sur des métriques fiables. Il existe des outils facilement intégrables en PHP pour créer ces indicateurs.
  • 95.
  • 96.
    Credits www.flickr.com/photos/kk (Lil’pirates) www.flickr.com/photos/betsyweber (Eric Ries) www.flickr.com/photos/highersights (Listen...) www.flickr.com/photos/75001512@N00/4228976596 (Geek) www.flickr.com/photos/phobia (Fail Stamp)