Les architectures distribuées soulèvent un certains nombre de problématiques en terme de traçabilité : détection des anomalies, suivi des utilisateurs, mesure des performances des différents services … Durant cette session, nous vous montrerons - démonstration à l'appui - comment nous avons apporté une solution simple à ces problématiques, en mettant en place un système de consolidation de logs avec Node.js et MongoDb.
Nantes JUG - mars 2013 - http://www.nantesjug.org
22. Outil permettant de consolider un
ensemble de traces (logs) techniques
et applicatives et de les restituer selon
plusieurs axes d’analyse.
23. 1
Loguer dans des fichiers
Log
File
org.apache.log4j.FileAppender
Données brutes
24. 1
Que logue-t-on ?
◦ Horodatage
◦ Id unique de requête (RequestID)
◦ User
◦ Service et opération exécutée
◦ Machine, nœud du cluster
◦ Couche applicative
◦ Environnement (dev, re7, prod …)
◦ Temps d’exécution
◦ En cas d’erreur
Code d’erreur
Message
Stacktrace
25. 1
RequestID
◦ ID unique généré pour chaque action utilisateur
◦ Transporté de couche en couche
◦ Permet de reconstruire l’enchaînement des services
-Xrequestid=123456789
<soap:Header>
<traces>
<requestid>123456789</requestid>
</traces>
</soap:Header>
26. 2
Loguer au plus proche de l’environnement
d’exécution
Log
File
Log
File
Log
File
La perte d’informations est limitée
27. 3
Consolider de manière asynchrone
Log
File
Log
File
Les performances ne sont pas impactées
28. 4
Stocker de l’information structurée
{
ts : "2013-03-18…" ,
Log user : "johndoe",
File service : "xxxxx",
op : "abcdef",
elapsed : "154"
}
L’exploitation des informations est facilitée
29. 5
Ne pas oublier de purger !
Les données brutes & les données consolidées
31. Nepr agent & server : NodeJS
◦ Processus légers
◦ Simplicité de mise en œuvre
◦ Données structurées JSON
Nepr db : MongoDB
◦ Stockage de données hétérogènes (schema less)
◦ Gros volumes de données en écriture
◦ L’ « eventual consistency » n’est pas un problème
◦ Stockage JSON
32. REST API
◦ POST
/data/:env/:couche/:machine
◦ GET
/perfs/:env/:service/:operation
/errors/:env/:service/:operation
/traces/:env/:requestid
/stats/:env/:service/:operation
33. Map Reduce
var mapFn = function () {
emit({
service: this.service,
operation: this.operation,
couche: this.couche
}, {
count: 1,
elapsed: this.elapsed
});
}; var reduceFn = function (key, values) {
var result = {
count: 0,
elapsed: 0
};
values.forEach(function (val) {
result.count += val.count;
result.elapsed += val.elapsed;
});
return result;
};
34. Extraction de logs significatifs via des regexp
^ INFO|([0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2},[0-9]{3})|([^|]*)|([^|]*)|([^|]*)|([^|]*)|([^|]*) TIME-USED;(d*);0;0;
Envoi de données structurées au serveur
{
type:'perf',
date:todate(m[1]),
userid:m[2],
sessionid:m[3],
requestid:m[4],
service:m[5],
operation:m[6],
elapsed:parseInt(m[7])
}
35. Configurations centralisées sur le serveur
nepr
agent GET /conf/:env/
nepr
server
Mise à jour via « svn update » / « git pull »