nantes jug - traçabilité dans une architecture distribuée avec node.js et mongodb
DESCRIPTION
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.orgTRANSCRIPT
![Page 1: Nantes JUG - Traçabilité dans une architecture distribuée avec Node.js et MongoDB](https://reader033.vdocuments.net/reader033/viewer/2022052600/55868fb4d8b42a6f718b462d/html5/thumbnails/1.jpg)
Traçabilité dans une architecture distribuée
avec Node.js et MongoDB
Jérôme Creignou - @jcreignouSébastien Prunier - @sebprunier
![Page 2: Nantes JUG - Traçabilité dans une architecture distribuée avec Node.js et MongoDB](https://reader033.vdocuments.net/reader033/viewer/2022052600/55868fb4d8b42a6f718b462d/html5/thumbnails/2.jpg)
Architecture
Application
Application Applicati
on
ESB
ESB ESBESB
Service [R]
SGBDR
Rules Controler
Service [W]
Service [R] Service
[W]
Legacy
Mainframe
Controler
![Page 3: Nantes JUG - Traçabilité dans une architecture distribuée avec Node.js et MongoDB](https://reader033.vdocuments.net/reader033/viewer/2022052600/55868fb4d8b42a6f718b462d/html5/thumbnails/3.jpg)
Infrastructure
Service A
Service A
Service AService A
Service A
Service A
Load Balancer
Cluster 1 Cluster 2
![Page 4: Nantes JUG - Traçabilité dans une architecture distribuée avec Node.js et MongoDB](https://reader033.vdocuments.net/reader033/viewer/2022052600/55868fb4d8b42a6f718b462d/html5/thumbnails/4.jpg)
Architecture vs. Infrastructure
SGBDR
Application
ESB
load bal.
load bal.
ESB ESB ESB
Serv.
Serv.
Serv.
Serv.
cluster
cluster
cluster
cluster
![Page 5: Nantes JUG - Traçabilité dans une architecture distribuée avec Node.js et MongoDB](https://reader033.vdocuments.net/reader033/viewer/2022052600/55868fb4d8b42a6f718b462d/html5/thumbnails/5.jpg)
Ce qu’on aurait aimé …
![Page 6: Nantes JUG - Traçabilité dans une architecture distribuée avec Node.js et MongoDB](https://reader033.vdocuments.net/reader033/viewer/2022052600/55868fb4d8b42a6f718b462d/html5/thumbnails/6.jpg)
Mais malheureusement …
![Page 7: Nantes JUG - Traçabilité dans une architecture distribuée avec Node.js et MongoDB](https://reader033.vdocuments.net/reader033/viewer/2022052600/55868fb4d8b42a6f718b462d/html5/thumbnails/7.jpg)
La (dure) réalité !
Toute
ressemblance avec
une architecture
existante est
purement fortuite
![Page 8: Nantes JUG - Traçabilité dans une architecture distribuée avec Node.js et MongoDB](https://reader033.vdocuments.net/reader033/viewer/2022052600/55868fb4d8b42a6f718b462d/html5/thumbnails/8.jpg)
Objectif 1
![Page 9: Nantes JUG - Traçabilité dans une architecture distribuée avec Node.js et MongoDB](https://reader033.vdocuments.net/reader033/viewer/2022052600/55868fb4d8b42a6f718b462d/html5/thumbnails/9.jpg)
Traçabilité !
![Page 10: Nantes JUG - Traçabilité dans une architecture distribuée avec Node.js et MongoDB](https://reader033.vdocuments.net/reader033/viewer/2022052600/55868fb4d8b42a6f718b462d/html5/thumbnails/10.jpg)
Architecture vs. Infrastructure
SGBDR
Application
ESB
load bal.
load bal.
ESB ESB ESB
Serv.
Serv.
Serv.
Serv.
cluster
cluster
cluster
cluster
![Page 11: Nantes JUG - Traçabilité dans une architecture distribuée avec Node.js et MongoDB](https://reader033.vdocuments.net/reader033/viewer/2022052600/55868fb4d8b42a6f718b462d/html5/thumbnails/11.jpg)
Objectif 2
![Page 12: Nantes JUG - Traçabilité dans une architecture distribuée avec Node.js et MongoDB](https://reader033.vdocuments.net/reader033/viewer/2022052600/55868fb4d8b42a6f718b462d/html5/thumbnails/12.jpg)
Détection d’anomalies !
![Page 13: Nantes JUG - Traçabilité dans une architecture distribuée avec Node.js et MongoDB](https://reader033.vdocuments.net/reader033/viewer/2022052600/55868fb4d8b42a6f718b462d/html5/thumbnails/13.jpg)
Architecture vs. Infrastructure
SGBDR
Application
ESB
load bal.
load bal.
ESB ESB ESB
Serv.
Serv.
Serv.
cluster
cluster
cluster
cluster
![Page 14: Nantes JUG - Traçabilité dans une architecture distribuée avec Node.js et MongoDB](https://reader033.vdocuments.net/reader033/viewer/2022052600/55868fb4d8b42a6f718b462d/html5/thumbnails/14.jpg)
Objectif 3
![Page 15: Nantes JUG - Traçabilité dans une architecture distribuée avec Node.js et MongoDB](https://reader033.vdocuments.net/reader033/viewer/2022052600/55868fb4d8b42a6f718b462d/html5/thumbnails/15.jpg)
Mesure des performances !
![Page 16: Nantes JUG - Traçabilité dans une architecture distribuée avec Node.js et MongoDB](https://reader033.vdocuments.net/reader033/viewer/2022052600/55868fb4d8b42a6f718b462d/html5/thumbnails/16.jpg)
Architecture vs. Infrastructure
SGBDR
Application
ESB
load bal.
load bal.
ESB ESB ESB
Serv.
Serv.
Serv.
Serv.
cluster
cluster
cluster
cluster
![Page 17: Nantes JUG - Traçabilité dans une architecture distribuée avec Node.js et MongoDB](https://reader033.vdocuments.net/reader033/viewer/2022052600/55868fb4d8b42a6f718b462d/html5/thumbnails/17.jpg)
Vous avez 15 jours !
KISS
![Page 18: Nantes JUG - Traçabilité dans une architecture distribuée avec Node.js et MongoDB](https://reader033.vdocuments.net/reader033/viewer/2022052600/55868fb4d8b42a6f718b462d/html5/thumbnails/18.jpg)
Advice (Xebia Essentials)
![Page 19: Nantes JUG - Traçabilité dans une architecture distribuée avec Node.js et MongoDB](https://reader033.vdocuments.net/reader033/viewer/2022052600/55868fb4d8b42a6f718b462d/html5/thumbnails/19.jpg)
FBI (Fausse Bonne Idée)
org.apache.log4j.jdbc.JDBCAppender
SGBDR
![Page 20: Nantes JUG - Traçabilité dans une architecture distribuée avec Node.js et MongoDB](https://reader033.vdocuments.net/reader033/viewer/2022052600/55868fb4d8b42a6f718b462d/html5/thumbnails/20.jpg)
CREATE TABLE ALL_LOGS (DATA BLOB)
FBI (Fausse Bonne Idée)
« On va abstraire la notion de log, créer un schéma pivot, des convertisseurs et … »
inexploitable !
pas évolutif !
![Page 21: Nantes JUG - Traçabilité dans une architecture distribuée avec Node.js et MongoDB](https://reader033.vdocuments.net/reader033/viewer/2022052600/55868fb4d8b42a6f718b462d/html5/thumbnails/21.jpg)
Notre solution
* Log Logarithme John Neper NepR
NepR*
![Page 22: Nantes JUG - Traçabilité dans une architecture distribuée avec Node.js et MongoDB](https://reader033.vdocuments.net/reader033/viewer/2022052600/55868fb4d8b42a6f718b462d/html5/thumbnails/22.jpg)
NepR
Outil permettant de consolider un ensemble de traces (logs) techniques
et applicatives et de les restituer selon plusieurs axes d’analyse.
![Page 23: Nantes JUG - Traçabilité dans une architecture distribuée avec Node.js et MongoDB](https://reader033.vdocuments.net/reader033/viewer/2022052600/55868fb4d8b42a6f718b462d/html5/thumbnails/23.jpg)
Bonnes pratiques
org.apache.log4j.FileAppender
LogFile
1
Loguer dans des fichiers
Données brutes
![Page 24: Nantes JUG - Traçabilité dans une architecture distribuée avec Node.js et MongoDB](https://reader033.vdocuments.net/reader033/viewer/2022052600/55868fb4d8b42a6f718b462d/html5/thumbnails/24.jpg)
Bonnes pratiques 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
![Page 25: Nantes JUG - Traçabilité dans une architecture distribuée avec Node.js et MongoDB](https://reader033.vdocuments.net/reader033/viewer/2022052600/55868fb4d8b42a6f718b462d/html5/thumbnails/25.jpg)
Bonnes pratiques 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>
HTTP
SOAP
![Page 26: Nantes JUG - Traçabilité dans une architecture distribuée avec Node.js et MongoDB](https://reader033.vdocuments.net/reader033/viewer/2022052600/55868fb4d8b42a6f718b462d/html5/thumbnails/26.jpg)
Bonnes pratiques 2
LogFile
LogFile
LogFile
Loguer au plus proche de l’environnement d’exécution
La perte d’informations est limitée
![Page 27: Nantes JUG - Traçabilité dans une architecture distribuée avec Node.js et MongoDB](https://reader033.vdocuments.net/reader033/viewer/2022052600/55868fb4d8b42a6f718b462d/html5/thumbnails/27.jpg)
Bonnes pratiques 3
Consolider de manière asynchrone
Les performances ne sont pas impactées
LogFile
LogFile
![Page 28: Nantes JUG - Traçabilité dans une architecture distribuée avec Node.js et MongoDB](https://reader033.vdocuments.net/reader033/viewer/2022052600/55868fb4d8b42a6f718b462d/html5/thumbnails/28.jpg)
Bonnes pratiques 4
Stocker de l’information structurée
L’exploitation des informations est facilitée
LogFile
{ ts : "2013-03-18…" , user : "johndoe", service : "xxxxx", op : "abcdef", elapsed : "154"}
![Page 29: Nantes JUG - Traçabilité dans une architecture distribuée avec Node.js et MongoDB](https://reader033.vdocuments.net/reader033/viewer/2022052600/55868fb4d8b42a6f718b462d/html5/thumbnails/29.jpg)
Bonnes pratiques 5
Ne pas oublier de purger !
Les données brutes & les données consolidées
![Page 30: Nantes JUG - Traçabilité dans une architecture distribuée avec Node.js et MongoDB](https://reader033.vdocuments.net/reader033/viewer/2022052600/55868fb4d8b42a6f718b462d/html5/thumbnails/30.jpg)
Solution techniqueLogFile
File
LogFile
LogFile
nepragent
nepragent
nepragent
nepragent
neprserver
neprdb
Objet « trace »
Objet « perf »
Objet « anomalie »
neprconsole
LogFile
![Page 31: Nantes JUG - Traçabilité dans une architecture distribuée avec Node.js et MongoDB](https://reader033.vdocuments.net/reader033/viewer/2022052600/55868fb4d8b42a6f718b462d/html5/thumbnails/31.jpg)
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
Choix technologiques
![Page 32: Nantes JUG - Traçabilité dans une architecture distribuée avec Node.js et MongoDB](https://reader033.vdocuments.net/reader033/viewer/2022052600/55868fb4d8b42a6f718b462d/html5/thumbnails/32.jpg)
REST API◦ POST
/data/:env/:couche/:machine◦ GET
/perfs/:env/:service/:operation /errors/:env/:service/:operation /traces/:env/:requestid /stats/:env/:service/:operation
nepr-server
![Page 33: Nantes JUG - Traçabilité dans une architecture distribuée avec Node.js et MongoDB](https://reader033.vdocuments.net/reader033/viewer/2022052600/55868fb4d8b42a6f718b462d/html5/thumbnails/33.jpg)
Map Reduce
nepr-server
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;};
![Page 34: Nantes JUG - Traçabilité dans une architecture distribuée avec Node.js et MongoDB](https://reader033.vdocuments.net/reader033/viewer/2022052600/55868fb4d8b42a6f718b462d/html5/thumbnails/34.jpg)
Extraction de logs significatifs via des regexp
Envoi de données structurées au serveur
nepr-agent
^ 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;
{ 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])}
![Page 35: Nantes JUG - Traçabilité dans une architecture distribuée avec Node.js et MongoDB](https://reader033.vdocuments.net/reader033/viewer/2022052600/55868fb4d8b42a6f718b462d/html5/thumbnails/35.jpg)
Configurations centralisées sur le serveur
Mise à jour via « svn update » / « git pull »
nepr-agent
nepragent
neprserver
GET /conf/:env/
![Page 36: Nantes JUG - Traçabilité dans une architecture distribuée avec Node.js et MongoDB](https://reader033.vdocuments.net/reader033/viewer/2022052600/55868fb4d8b42a6f718b462d/html5/thumbnails/36.jpg)
Démonstration !
nepr-console