nantes jug - traçabilité dans une architecture distribuée avec node.js et mongodb

36
Traçabilité dans une architecture distribuée avec Node.js et MongoDB Jérôme Creignou - @jcreignou Sébastien Prunier - @sebprunier

Upload: sebastien-prunier

Post on 21-Jun-2015

1.037 views

Category:

Technology


1 download

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.org

TRANSCRIPT

Page 1: Nantes JUG - Traçabilité dans une architecture distribuée avec Node.js et MongoDB

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

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

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

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

Ce qu’on aurait aimé …

Page 6: Nantes JUG - Traçabilité dans une architecture distribuée avec Node.js et MongoDB

Mais malheureusement …

Page 7: Nantes JUG - Traçabilité dans une architecture distribuée avec Node.js et MongoDB

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

Objectif 1

Page 9: Nantes JUG - Traçabilité dans une architecture distribuée avec Node.js et MongoDB

Traçabilité !

Page 10: Nantes JUG - Traçabilité dans une architecture distribuée avec Node.js et MongoDB

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

Objectif 2

Page 12: Nantes JUG - Traçabilité dans une architecture distribuée avec Node.js et MongoDB

Détection d’anomalies !

Page 13: Nantes JUG - Traçabilité dans une architecture distribuée avec Node.js et MongoDB

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

Objectif 3

Page 15: Nantes JUG - Traçabilité dans une architecture distribuée avec Node.js et MongoDB

Mesure des performances !

Page 16: Nantes JUG - Traçabilité dans une architecture distribuée avec Node.js et MongoDB

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

Vous avez 15 jours !

KISS

Page 18: Nantes JUG - Traçabilité dans une architecture distribuée avec Node.js et MongoDB

Advice (Xebia Essentials)

Page 19: Nantes JUG - Traçabilité dans une architecture distribuée avec Node.js et MongoDB

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

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

Notre solution

* Log Logarithme John Neper NepR

NepR*

Page 22: Nantes JUG - Traçabilité dans une architecture distribuée avec Node.js et MongoDB

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Démonstration !

nepr-console