SlideShare a Scribd company logo
1 of 58
Download to read offline
Tsung - Leboncoin
Rodolphe Quiédeville
Principe et généralités
13 mars 2014
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 1 / 58
Tsung
début développement en 2001
écrit en Erlang
publié sous GNU GPL V2
projet Idealx initialement nommé IDX-Tsunami
test de serveur XMPP
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 2 / 58
Caractéristiques
multi protocoles
scalable (validé à 10 Millions d’utilisateurs)
pas d’interface graphique
extensible par plugins
scenarios XML avec validation XSL
sondes de monitoring
modèle Stochastic avec distribution de Poisson
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 3 / 58
Utilisateurs
Total
CMA-CGM
Ministère des finances
Dailymotion
Skyrock, Libération
LibertySurf
Grid’5000
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 4 / 58
Principe de fonctionnement
un contrôleur
0 à N injecteurs
une cible
un scenario
des logs
des rapports de résultats
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 5 / 58
Protocoles supportés en 1.5.0
HTTP/HTTPS
Websocket
Jabber/XMPP
Webdav
AMQP / MQTT / ZeroMQ (dev)
LDAP
PostgreSQL
MySQL
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 6 / 58
Fonctions avancées
variables dynamiques
gestion des cookies automatique
analyse du résulat
thinktime
données aléatoires
extension par modules erlang
boucles et tests
...
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 7 / 58
Installation
pre-requis : Erlang R15, erlang-crypto, ssh
package : Debian, Ubuntu, Fedora, ...
sources : Github
scripts de creation paquet .deb dans les sources
déploiement à l’identique sur le contrôleur et les injecteurs
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 8 / 58
Le XML tu l’aimes ou ...
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 9 / 58
Scenario
Squelette de scenario
Example
<?xml version="1.0"?>
<!DOCTYPE tsung SYSTEM "/usr/share/tsung/tsung-1.0.dtd">
<tsung loglevel="notice" version="1.0">
<clients />
<servers />
<options />
<load>
<arrivalphase />
</load>
<sessions>
<session>
<transaction />
<transaction />
</session>
</sessions>
</tsung>
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 10 / 58
Scenario
Heureusement Tsung supporte les ENTITY
Example
<?xml version="1.0"?>
<!DOCTYPE tsung SYSTEM "/usr/share/tsung/tsung-1.0.dtd"
[
<!ENTITY clients SYSTEM "/opt/tsung/scr/clients.xml">
<!ENTITY servers SYSTEM "/opt/tsung/scr/servers.xml">
<!ENTITY load SYSTEM "/opt/tsung/scr/load.xml">
<!ENTITY session1 SYSTEM "/opt/tsung/scr/sess1.xml">
<!ENTITY session2 SYSTEM "/opt/tsung/scr/sess2.xml">
]
>
<tsung loglevel="notice" version="1.0">
&clients;
&servers;
<options />
&load;
<sessions>
&session1;
&session2;
</sessions>
</tsung>
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 11 / 58
Scenario
La cible
Simple
<servers>
<server host="www.target.fr" port="8080" type="tcp" />
</servers>
Complexe
<servers>
<server host="192.168.0.1" port="80" weight="4" type="tcp" />
<server host="192.168.0.2" port="80" weight="2" type="tcp" />
<server host="192.168.0.3" port="80" weight="2" type="tcp" />
<server host="192.168.0.4" port="81" weight="1" type="tcp" />
</servers>
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 12 / 58
Scenario
Les injecteurs
Simple
<clients>
<client host="foo" weight="1" />
</clients>
Complexe
<clients>
<client host="foo" weight="1" maxusers="1000" cpu="2">
<ip value="10.9.195.12"></ip>
<ip value="10.9.195.13"></ip>
</client>
<client host="bar" weight="2" maxusers="3000"/>
<client host="lorem" weight="3" maxusers="3000" cpu="4"/>
</clients>
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 13 / 58
Scenario
La charge va définir l’injection des utilisateurs
Example
<load>
<arrivalphase phase="1" duration="2" unit="minute">
<users interarrival="5" unit="second"></users>
</arrivalphase>
<arrivalphase phase="2" duration="10" unit="minute">
<users arrivalrate="1" unit="second"></users>
</arrivalphase>
<arrivalphase phase="3" duration="60" unit="minute">
<users arrivalrate="10" unit="second"></users>
</arrivalphase>
</load>
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 14 / 58
Scenario
Limitation possible de la durée totale et du nombre d’utilisateurs
générés
Example
<load duration="1" unit="hour">
<arrivalphase phase="1" duration="10" unit="minute">
<users interarrival="5" unit="second" maxnumber="10"></users>
</arrivalphase>
<arrivalphase phase="2" duration="40" unit="minute">
<users arrivalrate="1" unit="second"></users>
</arrivalphase>
</load>
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 15 / 58
Scenario
Les sessions, le subtile mélange des interactions
Example
<sessions>
<session name="small" probability="90" type="ts_http">
<transaction name="one">
...
</session>
<session name="extended" probability="35" type="ts_http">
<transaction name="foo">
...
</session>
<session name="rss" probability="5" type="ts_http">
<transaction name="home_ress">
....
</session>
</sessions>
Depuis la 1.5.0 on peut utiliser weight au lieu de probability
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 16 / 58
Scenario
Les transactions regroupent les requêtes en cas de besoin statistique
Example
<transaction name="home">
<request>
<http url="/" />
</request>
<request>
<http url="/img.jpg" />
</request>
</transaction>
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 17 / 58
Scenario
Création du scenario
En mode proxy
$ tsung-recorder start
Starting Tsung recorder on port 8090
"Record file: /home/rodo/.tsung/tsung_recorder20131003-1633.xml"
Depuis les logs
$ log2tsung.pl
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 18 / 58
Scenario
Les requêtes peuvent être relatives à la cible ou spécifiées
intégralement
Example
<request>
<http url="/" method="GET" version="1.1" />
</request>
<request>
<http url="/api/v1/foo?format=json" />
</request>
<request>
<http url="http://front-preprod.domain.lan/css/main.css" />
</request>
<request>
<http url="http://back-preprod.domain.lan/api/bar.json" />
</request>
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 19 / 58
Variables
Les requêtes peuvent inclure des variables substituées lors du run
Example
<session name="rec20040316-08:47" probability="100" type="ts_http">
<request subst="true">
<http url="/echo?symbol=%%_foo%%" method="GET"></http>
</request>
</session>
Ici foo sera substitué par sa valeur à chaque appel.
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 20 / 58
Analyse de la réponse
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 21 / 58
dyn_variable
Les variables dynamiques sont initialisées par lecture du résultat d’une
action et peuvent être ré-utilisées dans les actions suivantes.
Example
Regexp
<request>
<dyn_variable name="nb_page" re="Page d+ on (d+)" />
<http url="/articles" method="GET" version="1.1" ></http>
</request>
<request subst="true">
<http url="/articles?page=%%_nb_page%%" method="GET" version="1.1" ></http>
</request>
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 22 / 58
dyn_variable
Utilisation du xpath
Example
<request>
<dyn_variable name="field1_value" xpath="//div[2]/@value"/>
<http url="/articles" method="GET" version="1.1" ></http>
</request>
<request>
<http url="/json/api/object/%%_field1_value%%" method="GET" version="1.1" ></http>
</request>
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 23 / 58
dyn_variable
Lecture d’un JSON
Example
<request>
<dyn_variable name="nb_page" jsonpath="field.array[3].value"/>
<http url="/articles" method="GET" version="1.1" ></http>
</request>
<request subst="true">
<http url="/articles?page=%%_nb_page%%" method="GET" version="1.1" ></http>
</request>
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 24 / 58
match
L’élément match permet de déclencher une action suivant le contenu
du résultat de la requête.
Example
<request>
<match do="loop" sleep_loop="5" max_loop="10" when="match">Retry</match>
<match do="abort" when="match">Error</match>
<http url="/index.php" method="GET">
</request>
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 25 / 58
Utilisation de variables dans
les scenarii
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 26 / 58
Appel de fonction
Appel de n’importe quelle fonction Erlang
Example
<setdynvars sourcetype="erlang" callback="module_users:get_unique_id">
<var name="id1" />
</setdynvars>
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 27 / 58
Modules erlang
Ecriture modules métiers en ... Erlang
Example
<session name="rec20040316-08:47" probability="100" type="ts_http">
<request subst="true">
<http url="/echo?symbol=%%symbol:new%%" method="GET"></http>
</request>
</session>
symbol.erl
-module(symbol).
-export([new/1]).
new({Pid, DynData}) ->
case random:uniform(3) of
1 -> ‘‘France’’;
2 -> ‘‘Irlande’’;
3 -> ‘‘Japon’’
end.
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 28 / 58
lecture de données
Lecture d’un fichier de données
Example
<setdynvars sourcetype="file" fileid="userlist.csv" delimiter=";" order="iter">
<var name="user" />
<var name="pass" />
</setdynvars>
<request subst="true">
<http url="/login.cgi" version="1.0" contents="user=%%_username%%&amp;password=%%_pass%%&amp;op=l
content_type="application/x-www-form-urlencoded" method="POST">
</http>
</request>
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 29 / 58
Evaluation de code
Du code Erlang peut être introduit directement dans le scenario en
utilisant un sourcetype eval
Example
<setdynvars sourcetype="eval"
code="fun({Pid,DynVars})->
{ok,Val}=ts_dynvars:lookup(md5data,DynVars),
ts_digest:md5hex(Val) end.">
<var name="md5sum" />
</setdynvars>
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 30 / 58
Autres sourcetype
Génération de valeurs aléatoires
random_number
<setdynvars sourcetype="random_number" start="3" end="32">
<var name="rndint" />
</setdynvars>
random_string
<setdynvars sourcetype="random_string" length="8">
<var name="passwd" />
</setdynvars>
constante
<setdynvars sourcetype="value" value="foobar">
<var name="constant" />
</setdynvars>
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 31 / 58
if, for, foreach, ...
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 32 / 58
if
Conditionnel de base
Example
<if var="tsung_userid" eq="3">
<request> <http url="/foo"/> </request>
<request> <http url="/bar"/> </request>
</if>
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 33 / 58
la boucle for
Un classique fort pratique
Example
<for var="i" from="0" to="50" incr="1">
<transaction name=""home"">
<request> <http url="/index.html"/></request>
<request> <http url="/main.js"/></request>
<request> <http url="/img.png"/></request>
</transaction>
<request subst="true"> <http url="/ping?foo=%%_i%%"/></request>
<thinktime value="40" random="true" />
</for>
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 34 / 58
foreach
Permet de boucler sur tous les éléments d’un tableau, régulièrement
associée avec un module renvoyant une liste d’urls
Example
<setdynvars sourcetype="erlang"callback="geomodule:get_tiles">
<var name="list_url" />
</setdynvars>
<foreach name="element" in="list_url">
<request subst="true">
<http url="%%_element%%" />
</request>
</foreach>
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 35 / 58
repeat
Sortie de boucle avec while ou until
Example
<repeat name="myloop" max_repeat="40">
...
<request>
<dyn_variable name="result" re="Result: (.*)"/>
<http url="/random" method="GET" version="1.1"></http>
</request>
...
<until var="result" eq="5"/>
</repeat>
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 36 / 58
En dev pour les devs
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 37 / 58
Le tagging de requêtes
(1.5.1 dev) Tagger des requêtes permet d’exclure celles-ci d’un run
particulier
Scenario
<request>
<http url="/" method="GET"></http>
</request>
<request tag="image">
<http url="/foo.png" method="GET"></http>
</request>
Particulièrement utile lors des phases de debugging du scénario (le
tag est loggé avec dumptraffic="protocol")
Option -x
tsung -f SCENARIO.xml -x image start
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 38 / 58
Les logs
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 39 / 58
loglevel
Le niveau de log est relatif à chaque scenario
emergency
critical
error
warning
notice (default)
info
debug
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 40 / 58
fichiers de log
Les logs sont tous présents sur le contrôleur mais séparé dans un
fichier par injecteurs.
tsung.dump
=ERROR REPORT==== 13-Mar-2014::09:13:12 ===
** State machine <0.64.0> terminating
** Last message in was {timeout,#Ref<0.0.0.168>,end_thinktime}
** When State == think
** Data == {state_rcv,none,
{{0,0,0,0},0},
undefined,0,10000,"127.0.0.1",8080,gen_tcp,
{proto_opts,negociate,10,600000,32768,32768,undefined,
undefined},
false,1,undefined,true,undefined,
{1394,698391,114389},
4,4,false,undefined,0,[],<<>>,
{http,0,0,-1,{none,none},false,false,{false,false},[]},
0,2,524288,524288,
{dyndata,[{tsung_userid,"2"}],{http_dyndata,"tsung",[]}},
ts_http,[],undefined,full}
** Reason for termination =
** {{badmatch,false},[{erl_eval,expr,3,[]}]}
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 41 / 58
Log
Le level notice permet par exemple l’accès aux variables
scenario
<dyn_variable name="code" re="HTTP/1.1 (d+)" />
tsung0@host.log
=INFO REPORT==== 23-Nov-2013::09:17:37 ===
ts_search:(6:<0.69.0>) DynVar (RE): Match (code=<<"200">>)
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 42 / 58
dumptraffic
dumptraffic="protocol"
tsung.dump
#date;pid;id;http method;host;URL;HTTP status;size;match;error
1394696629.331706;<7218.63.0>;1;get;127.0.0.1;/index.html?f=0;200;1354;;
1394696629.33297;<7218.63.0>;1;get;127.0.0.1;/index.html?f=1;200;1354;;
1394696629.333824;<7218.63.0>;1;get;127.0.0.1;/index.html?f=2;200;1354;;
1394696629.334671;<7218.63.0>;1;get;127.0.0.1;/index.html?f=3;200;1354;;
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 43 / 58
dumptraffic
dumptraffic="true" permet de logger l’intégralité du traffic entre les
injecteurs et la cible
tsung.dump
NewClient:1394697656.592317:1
load:1
Send:1394697656.612861:<7218.63.0>:GET /index.html?f=undefined HTTP/1.1
Host: 127.0.0.1:8080
User-Agent: tsung
Recv:1394697656.613965:<7218.63.0>:HTTP/1.1 200 OK
Server: Yaws 1.94
Date: Thu, 13 Mar 2014 08:00:56 GMT
Last-Modified: Tue, 26 Jun 2012 06:10:45 GMT
Etag: "3G0gq0ABxu9"
Content-Length: 1165
Content-Type: text/html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
...
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 44 / 58
Backtrace
Une erreur dans le scenario génère une trace complète sur la console
lors du lancement
Example
Starting Tsung
"Log directory is: /tmp/20140313-0911"
2542- fatal: {endtag_does_not_match,
{was,transaction,should_have_been,setdynvars}}
Config Error, aborting ! {fatal,
{{endtag_does_not_match,
{was,transaction,should_have_been,
setdynvars}},
{file,"tiny.xml"},
{line,32},
{col,9}}}
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 45 / 58
Monitoring de la cible
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 46 / 58
Erlang
Monitoring directement intégré dans Tsung
Example
<monitoring>
<monitor host="www-a" type="erlang"></monitor>
<monitor host="bigfoot-1" type="erlang"></monitor>
<monitor host="bigfoot-2" type="erlang"></monitor>
<monitor host="db" type="erlang"></monitor>
</monitoring>
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 47 / 58
SNMP
Monitoring par protocole SNMP
Example
<monitoring>
<monitor host="geronimo" type="snmp"/>
<monitor host="db" type="snmp">
<snmp version="v2" community="mycommunity" port="11161"/>
</monitor>
</monitoring>
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 48 / 58
Munin
Utilisation des sondes Munin
Example
<monitoring>
<monitor host="geronimo" type="munin"/>
</monitoring>
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 49 / 58
Action !
La commande utile :
Exécution
$ tsung -f scenario.xml -l logs/ start
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 50 / 58
Les mesures
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 51 / 58
Statistiques
request : Response time for each request.
page : Response time for each set of requests
connect : Duration of the connection establishment.
reconnect : Number of reconnection.
size_rcv : Size of responses in bytes.
size_sent : Size of requests in bytes.
session : Duration of a user’s session.
users : Number of simultaneous users (it’s session has started,
but not yet finished).
connected : number of users with an opened TCP/UDP
connection
custom transactions
HTTP status counter
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 52 / 58
tsung.log
Example
# stats: dump at 1218093520
stats: users 247 247
stats: connected 184 247
stats: users_count 184 247
stats: page 187 98.324 579.441 5465.940 2.177 9.237 595 58
stats: request 1869 0.371 0.422 5.20703125 0.115 0.431 7444062 581
stats: connect 186 0.427 0.184 4.47216796875 0.174 0.894 88665254 59
stats: tr_login 187 100.848 579.742 5470.223 2.231 56.970 91567888 58
stats: size_rcv 2715777 3568647
stats: 200 1869 2450
stats: size_sent 264167 347870
# stats: dump at 1218093530
stats: users 356 356
stats: users_count 109 356
stats: connected -32 215
stats: page 110 3.346 0.408 5465.940 2.177 77.234 724492 245
stats: request 1100 0.305 0.284 5.207 0.115 0.385 26785716 2450
stats: connect 110 0.320 0.065 4.472 0.174 0.540 39158164 245
stats: tr_login 110 3.419 0.414 5470.223 2.231 90.461 548628831 245
stats: size_rcv 1602039 5170686
stats: 200 1100 3550
stats: size_sent 150660 498530
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 53 / 58
tsung.log
Example
{
"stats": [
{"timestamp": 1317413841, "samples": []},
{"timestamp": 1317413851, "samples": [
{"name": "users", "value": 0, "max": 0},
{"name": "users_count", "value": 0, "total": 0},
{"name": "finish_users_count", "value": 0, "total": 0}]},
{"timestamp": 1317413861, "samples": [
{"name": "users", "value": 0, "max": 1},
{"name": "load", "hostname": "requiem", "value": 1, "mean":
0.0,"stddev": 0,"max": 0.0,"min": 0.0 ,"global_mean": 0
,"global_count": 0},
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 54 / 58
Les rapports
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 55 / 58
Rapports
Génération des rapports
script perl monolithique de base
scripts et templates alternatifs
Maheki
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 56 / 58
Contribuer
Docs, https://tsung.readthedocs.org/
Code, https://github.com/processone/tsung/
CI, http://jenkins.quiedeville.org/view/Tsung/
Bugtrack,
https://support.process-one.net/browse/TSUN
Irc, freenode #tsung
ML, https://lists.process-one.net/mailman/
listinfo/tsung-users
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 57 / 58
Questions ?
Rodolphe Quiédeville
rodolphe@quiedeville.org
http://blog.rodolphe.quiedeville.org/
Document publié sous Licence Creative Commons BY-SA 2.0
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 58 / 58

More Related Content

Similar to Présentation de Tsung chez Leboncoin

Tp2: Installation d'une couche d’abstraction entre un robot physique et ros
Tp2: Installation d'une couche d’abstraction entre un robot physique et rosTp2: Installation d'une couche d’abstraction entre un robot physique et ros
Tp2: Installation d'une couche d’abstraction entre un robot physique et rosSaid Benaissa
 
Messaging temps réel avec Go
Messaging temps réel avec GoMessaging temps réel avec Go
Messaging temps réel avec GoMickaël Rémond
 
Baromètre nPerf des opérateurs mobiles au T3 2017
Baromètre nPerf des opérateurs mobiles au T3 2017Baromètre nPerf des opérateurs mobiles au T3 2017
Baromètre nPerf des opérateurs mobiles au T3 2017PXNetwork
 
20120110 paris jug-packaging-natif
20120110 paris jug-packaging-natif20120110 paris jug-packaging-natif
20120110 paris jug-packaging-natifHenri Gomez
 
PHP #1 : introduction
PHP #1 : introductionPHP #1 : introduction
PHP #1 : introductionJean Michel
 
[Devoxx MA 2023] R2DBC = R2D2 + JDBC (enfin presque...)
[Devoxx MA 2023] R2DBC = R2D2 + JDBC (enfin presque...)[Devoxx MA 2023] R2DBC = R2D2 + JDBC (enfin presque...)
[Devoxx MA 2023] R2DBC = R2D2 + JDBC (enfin presque...)Bruno Bonnin
 
Communications Réseaux et HTTP avec PHP
Communications Réseaux et HTTP avec PHPCommunications Réseaux et HTTP avec PHP
Communications Réseaux et HTTP avec PHPjulien pauli
 
Play framework - Human Talks Grenoble - 12.02.2013
Play framework - Human Talks Grenoble - 12.02.2013Play framework - Human Talks Grenoble - 12.02.2013
Play framework - Human Talks Grenoble - 12.02.2013Xavier NOPRE
 
Comment trouver et fixer des memory leaks dans une app Vue/Nuxt
Comment trouver et fixer des memory leaks dans une app Vue/NuxtComment trouver et fixer des memory leaks dans une app Vue/Nuxt
Comment trouver et fixer des memory leaks dans une app Vue/NuxtJonathanMartin201
 
Les containers docker vu par un chef cuisinier et un mécanicien
Les containers docker vu par un chef cuisinier et un mécanicienLes containers docker vu par un chef cuisinier et un mécanicien
Les containers docker vu par un chef cuisinier et un mécanicienRachid Zarouali
 
Rich Desktop Applications
Rich Desktop ApplicationsRich Desktop Applications
Rich Desktop Applicationsgoldoraf
 

Similar to Présentation de Tsung chez Leboncoin (20)

Messages queues - Socloz@PHPForum 2013
Messages queues - Socloz@PHPForum 2013Messages queues - Socloz@PHPForum 2013
Messages queues - Socloz@PHPForum 2013
 
Tp2: Installation d'une couche d’abstraction entre un robot physique et ros
Tp2: Installation d'une couche d’abstraction entre un robot physique et rosTp2: Installation d'une couche d’abstraction entre un robot physique et ros
Tp2: Installation d'une couche d’abstraction entre un robot physique et ros
 
HTML5 en projet
HTML5 en projetHTML5 en projet
HTML5 en projet
 
Messaging temps réel avec Go
Messaging temps réel avec GoMessaging temps réel avec Go
Messaging temps réel avec Go
 
Baromètre nPerf des opérateurs mobiles au T3 2017
Baromètre nPerf des opérateurs mobiles au T3 2017Baromètre nPerf des opérateurs mobiles au T3 2017
Baromètre nPerf des opérateurs mobiles au T3 2017
 
Apache Open SSL
Apache Open SSLApache Open SSL
Apache Open SSL
 
20120110 paris jug-packaging-natif
20120110 paris jug-packaging-natif20120110 paris jug-packaging-natif
20120110 paris jug-packaging-natif
 
Tapestry
TapestryTapestry
Tapestry
 
Présentation devops&puppet 04112014
Présentation devops&puppet 04112014 Présentation devops&puppet 04112014
Présentation devops&puppet 04112014
 
PHP #1 : introduction
PHP #1 : introductionPHP #1 : introduction
PHP #1 : introduction
 
[Devoxx MA 2023] R2DBC = R2D2 + JDBC (enfin presque...)
[Devoxx MA 2023] R2DBC = R2D2 + JDBC (enfin presque...)[Devoxx MA 2023] R2DBC = R2D2 + JDBC (enfin presque...)
[Devoxx MA 2023] R2DBC = R2D2 + JDBC (enfin presque...)
 
Communications Réseaux et HTTP avec PHP
Communications Réseaux et HTTP avec PHPCommunications Réseaux et HTTP avec PHP
Communications Réseaux et HTTP avec PHP
 
Mysql
MysqlMysql
Mysql
 
Play framework - Human Talks Grenoble - 12.02.2013
Play framework - Human Talks Grenoble - 12.02.2013Play framework - Human Talks Grenoble - 12.02.2013
Play framework - Human Talks Grenoble - 12.02.2013
 
Meetup angular rshop
Meetup angular rshopMeetup angular rshop
Meetup angular rshop
 
iTunes Stats
iTunes StatsiTunes Stats
iTunes Stats
 
Comment trouver et fixer des memory leaks dans une app Vue/Nuxt
Comment trouver et fixer des memory leaks dans une app Vue/NuxtComment trouver et fixer des memory leaks dans une app Vue/Nuxt
Comment trouver et fixer des memory leaks dans une app Vue/Nuxt
 
Les containers docker vu par un chef cuisinier et un mécanicien
Les containers docker vu par un chef cuisinier et un mécanicienLes containers docker vu par un chef cuisinier et un mécanicien
Les containers docker vu par un chef cuisinier et un mécanicien
 
Pgbackrest meetup
Pgbackrest meetupPgbackrest meetup
Pgbackrest meetup
 
Rich Desktop Applications
Rich Desktop ApplicationsRich Desktop Applications
Rich Desktop Applications
 

More from Rodolphe Quiédeville (14)

Tests unitaires pour PostgreSQL avec pgTap
Tests unitaires pour PostgreSQL avec pgTapTests unitaires pour PostgreSQL avec pgTap
Tests unitaires pour PostgreSQL avec pgTap
 
PostgreSQL Meetup Nantes #2
PostgreSQL Meetup Nantes #2PostgreSQL Meetup Nantes #2
PostgreSQL Meetup Nantes #2
 
SQL Debug avec Django @ PyConFr 2015
SQL Debug avec Django @ PyConFr 2015SQL Debug avec Django @ PyConFr 2015
SQL Debug avec Django @ PyConFr 2015
 
Pytong2015
Pytong2015Pytong2015
Pytong2015
 
Tsung de 1 à 1 million / Confoo Montréal 2015
Tsung de 1 à 1 million / Confoo Montréal 2015Tsung de 1 à 1 million / Confoo Montréal 2015
Tsung de 1 à 1 million / Confoo Montréal 2015
 
Confoo django
Confoo djangoConfoo django
Confoo django
 
BBL Données gégraphiques libres chez Work4labs
BBL Données gégraphiques libres chez Work4labsBBL Données gégraphiques libres chez Work4labs
BBL Données gégraphiques libres chez Work4labs
 
Tsung GIS
Tsung GISTsung GIS
Tsung GIS
 
BBL autour de PostgreSQL @Novapost
BBL autour de PostgreSQL @NovapostBBL autour de PostgreSQL @Novapost
BBL autour de PostgreSQL @Novapost
 
Un Tsung vaut mieux que 2 "croisons les doigts"
Un Tsung vaut mieux que 2 "croisons les doigts"Un Tsung vaut mieux que 2 "croisons les doigts"
Un Tsung vaut mieux que 2 "croisons les doigts"
 
OpenStreetMap Realtime Check
OpenStreetMap Realtime CheckOpenStreetMap Realtime Check
OpenStreetMap Realtime Check
 
de 1 à 1 million avec Tsung
de 1 à 1 million avec Tsungde 1 à 1 million avec Tsung
de 1 à 1 million avec Tsung
 
Tests de performance avec Tsung
Tests de performance avec TsungTests de performance avec Tsung
Tests de performance avec Tsung
 
Asterisk
AsteriskAsterisk
Asterisk
 

Présentation de Tsung chez Leboncoin

  • 1. Tsung - Leboncoin Rodolphe Quiédeville Principe et généralités 13 mars 2014 Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 1 / 58
  • 2. Tsung début développement en 2001 écrit en Erlang publié sous GNU GPL V2 projet Idealx initialement nommé IDX-Tsunami test de serveur XMPP Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 2 / 58
  • 3. Caractéristiques multi protocoles scalable (validé à 10 Millions d’utilisateurs) pas d’interface graphique extensible par plugins scenarios XML avec validation XSL sondes de monitoring modèle Stochastic avec distribution de Poisson Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 3 / 58
  • 4. Utilisateurs Total CMA-CGM Ministère des finances Dailymotion Skyrock, Libération LibertySurf Grid’5000 Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 4 / 58
  • 5. Principe de fonctionnement un contrôleur 0 à N injecteurs une cible un scenario des logs des rapports de résultats Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 5 / 58
  • 6. Protocoles supportés en 1.5.0 HTTP/HTTPS Websocket Jabber/XMPP Webdav AMQP / MQTT / ZeroMQ (dev) LDAP PostgreSQL MySQL Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 6 / 58
  • 7. Fonctions avancées variables dynamiques gestion des cookies automatique analyse du résulat thinktime données aléatoires extension par modules erlang boucles et tests ... Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 7 / 58
  • 8. Installation pre-requis : Erlang R15, erlang-crypto, ssh package : Debian, Ubuntu, Fedora, ... sources : Github scripts de creation paquet .deb dans les sources déploiement à l’identique sur le contrôleur et les injecteurs Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 8 / 58
  • 9. Le XML tu l’aimes ou ... Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 9 / 58
  • 10. Scenario Squelette de scenario Example <?xml version="1.0"?> <!DOCTYPE tsung SYSTEM "/usr/share/tsung/tsung-1.0.dtd"> <tsung loglevel="notice" version="1.0"> <clients /> <servers /> <options /> <load> <arrivalphase /> </load> <sessions> <session> <transaction /> <transaction /> </session> </sessions> </tsung> Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 10 / 58
  • 11. Scenario Heureusement Tsung supporte les ENTITY Example <?xml version="1.0"?> <!DOCTYPE tsung SYSTEM "/usr/share/tsung/tsung-1.0.dtd" [ <!ENTITY clients SYSTEM "/opt/tsung/scr/clients.xml"> <!ENTITY servers SYSTEM "/opt/tsung/scr/servers.xml"> <!ENTITY load SYSTEM "/opt/tsung/scr/load.xml"> <!ENTITY session1 SYSTEM "/opt/tsung/scr/sess1.xml"> <!ENTITY session2 SYSTEM "/opt/tsung/scr/sess2.xml"> ] > <tsung loglevel="notice" version="1.0"> &clients; &servers; <options /> &load; <sessions> &session1; &session2; </sessions> </tsung> Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 11 / 58
  • 12. Scenario La cible Simple <servers> <server host="www.target.fr" port="8080" type="tcp" /> </servers> Complexe <servers> <server host="192.168.0.1" port="80" weight="4" type="tcp" /> <server host="192.168.0.2" port="80" weight="2" type="tcp" /> <server host="192.168.0.3" port="80" weight="2" type="tcp" /> <server host="192.168.0.4" port="81" weight="1" type="tcp" /> </servers> Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 12 / 58
  • 13. Scenario Les injecteurs Simple <clients> <client host="foo" weight="1" /> </clients> Complexe <clients> <client host="foo" weight="1" maxusers="1000" cpu="2"> <ip value="10.9.195.12"></ip> <ip value="10.9.195.13"></ip> </client> <client host="bar" weight="2" maxusers="3000"/> <client host="lorem" weight="3" maxusers="3000" cpu="4"/> </clients> Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 13 / 58
  • 14. Scenario La charge va définir l’injection des utilisateurs Example <load> <arrivalphase phase="1" duration="2" unit="minute"> <users interarrival="5" unit="second"></users> </arrivalphase> <arrivalphase phase="2" duration="10" unit="minute"> <users arrivalrate="1" unit="second"></users> </arrivalphase> <arrivalphase phase="3" duration="60" unit="minute"> <users arrivalrate="10" unit="second"></users> </arrivalphase> </load> Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 14 / 58
  • 15. Scenario Limitation possible de la durée totale et du nombre d’utilisateurs générés Example <load duration="1" unit="hour"> <arrivalphase phase="1" duration="10" unit="minute"> <users interarrival="5" unit="second" maxnumber="10"></users> </arrivalphase> <arrivalphase phase="2" duration="40" unit="minute"> <users arrivalrate="1" unit="second"></users> </arrivalphase> </load> Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 15 / 58
  • 16. Scenario Les sessions, le subtile mélange des interactions Example <sessions> <session name="small" probability="90" type="ts_http"> <transaction name="one"> ... </session> <session name="extended" probability="35" type="ts_http"> <transaction name="foo"> ... </session> <session name="rss" probability="5" type="ts_http"> <transaction name="home_ress"> .... </session> </sessions> Depuis la 1.5.0 on peut utiliser weight au lieu de probability Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 16 / 58
  • 17. Scenario Les transactions regroupent les requêtes en cas de besoin statistique Example <transaction name="home"> <request> <http url="/" /> </request> <request> <http url="/img.jpg" /> </request> </transaction> Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 17 / 58
  • 18. Scenario Création du scenario En mode proxy $ tsung-recorder start Starting Tsung recorder on port 8090 "Record file: /home/rodo/.tsung/tsung_recorder20131003-1633.xml" Depuis les logs $ log2tsung.pl Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 18 / 58
  • 19. Scenario Les requêtes peuvent être relatives à la cible ou spécifiées intégralement Example <request> <http url="/" method="GET" version="1.1" /> </request> <request> <http url="/api/v1/foo?format=json" /> </request> <request> <http url="http://front-preprod.domain.lan/css/main.css" /> </request> <request> <http url="http://back-preprod.domain.lan/api/bar.json" /> </request> Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 19 / 58
  • 20. Variables Les requêtes peuvent inclure des variables substituées lors du run Example <session name="rec20040316-08:47" probability="100" type="ts_http"> <request subst="true"> <http url="/echo?symbol=%%_foo%%" method="GET"></http> </request> </session> Ici foo sera substitué par sa valeur à chaque appel. Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 20 / 58
  • 21. Analyse de la réponse Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 21 / 58
  • 22. dyn_variable Les variables dynamiques sont initialisées par lecture du résultat d’une action et peuvent être ré-utilisées dans les actions suivantes. Example Regexp <request> <dyn_variable name="nb_page" re="Page d+ on (d+)" /> <http url="/articles" method="GET" version="1.1" ></http> </request> <request subst="true"> <http url="/articles?page=%%_nb_page%%" method="GET" version="1.1" ></http> </request> Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 22 / 58
  • 23. dyn_variable Utilisation du xpath Example <request> <dyn_variable name="field1_value" xpath="//div[2]/@value"/> <http url="/articles" method="GET" version="1.1" ></http> </request> <request> <http url="/json/api/object/%%_field1_value%%" method="GET" version="1.1" ></http> </request> Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 23 / 58
  • 24. dyn_variable Lecture d’un JSON Example <request> <dyn_variable name="nb_page" jsonpath="field.array[3].value"/> <http url="/articles" method="GET" version="1.1" ></http> </request> <request subst="true"> <http url="/articles?page=%%_nb_page%%" method="GET" version="1.1" ></http> </request> Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 24 / 58
  • 25. match L’élément match permet de déclencher une action suivant le contenu du résultat de la requête. Example <request> <match do="loop" sleep_loop="5" max_loop="10" when="match">Retry</match> <match do="abort" when="match">Error</match> <http url="/index.php" method="GET"> </request> Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 25 / 58
  • 26. Utilisation de variables dans les scenarii Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 26 / 58
  • 27. Appel de fonction Appel de n’importe quelle fonction Erlang Example <setdynvars sourcetype="erlang" callback="module_users:get_unique_id"> <var name="id1" /> </setdynvars> Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 27 / 58
  • 28. Modules erlang Ecriture modules métiers en ... Erlang Example <session name="rec20040316-08:47" probability="100" type="ts_http"> <request subst="true"> <http url="/echo?symbol=%%symbol:new%%" method="GET"></http> </request> </session> symbol.erl -module(symbol). -export([new/1]). new({Pid, DynData}) -> case random:uniform(3) of 1 -> ‘‘France’’; 2 -> ‘‘Irlande’’; 3 -> ‘‘Japon’’ end. Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 28 / 58
  • 29. lecture de données Lecture d’un fichier de données Example <setdynvars sourcetype="file" fileid="userlist.csv" delimiter=";" order="iter"> <var name="user" /> <var name="pass" /> </setdynvars> <request subst="true"> <http url="/login.cgi" version="1.0" contents="user=%%_username%%&amp;password=%%_pass%%&amp;op=l content_type="application/x-www-form-urlencoded" method="POST"> </http> </request> Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 29 / 58
  • 30. Evaluation de code Du code Erlang peut être introduit directement dans le scenario en utilisant un sourcetype eval Example <setdynvars sourcetype="eval" code="fun({Pid,DynVars})-> {ok,Val}=ts_dynvars:lookup(md5data,DynVars), ts_digest:md5hex(Val) end."> <var name="md5sum" /> </setdynvars> Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 30 / 58
  • 31. Autres sourcetype Génération de valeurs aléatoires random_number <setdynvars sourcetype="random_number" start="3" end="32"> <var name="rndint" /> </setdynvars> random_string <setdynvars sourcetype="random_string" length="8"> <var name="passwd" /> </setdynvars> constante <setdynvars sourcetype="value" value="foobar"> <var name="constant" /> </setdynvars> Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 31 / 58
  • 32. if, for, foreach, ... Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 32 / 58
  • 33. if Conditionnel de base Example <if var="tsung_userid" eq="3"> <request> <http url="/foo"/> </request> <request> <http url="/bar"/> </request> </if> Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 33 / 58
  • 34. la boucle for Un classique fort pratique Example <for var="i" from="0" to="50" incr="1"> <transaction name=""home""> <request> <http url="/index.html"/></request> <request> <http url="/main.js"/></request> <request> <http url="/img.png"/></request> </transaction> <request subst="true"> <http url="/ping?foo=%%_i%%"/></request> <thinktime value="40" random="true" /> </for> Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 34 / 58
  • 35. foreach Permet de boucler sur tous les éléments d’un tableau, régulièrement associée avec un module renvoyant une liste d’urls Example <setdynvars sourcetype="erlang"callback="geomodule:get_tiles"> <var name="list_url" /> </setdynvars> <foreach name="element" in="list_url"> <request subst="true"> <http url="%%_element%%" /> </request> </foreach> Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 35 / 58
  • 36. repeat Sortie de boucle avec while ou until Example <repeat name="myloop" max_repeat="40"> ... <request> <dyn_variable name="result" re="Result: (.*)"/> <http url="/random" method="GET" version="1.1"></http> </request> ... <until var="result" eq="5"/> </repeat> Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 36 / 58
  • 37. En dev pour les devs Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 37 / 58
  • 38. Le tagging de requêtes (1.5.1 dev) Tagger des requêtes permet d’exclure celles-ci d’un run particulier Scenario <request> <http url="/" method="GET"></http> </request> <request tag="image"> <http url="/foo.png" method="GET"></http> </request> Particulièrement utile lors des phases de debugging du scénario (le tag est loggé avec dumptraffic="protocol") Option -x tsung -f SCENARIO.xml -x image start Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 38 / 58
  • 39. Les logs Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 39 / 58
  • 40. loglevel Le niveau de log est relatif à chaque scenario emergency critical error warning notice (default) info debug Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 40 / 58
  • 41. fichiers de log Les logs sont tous présents sur le contrôleur mais séparé dans un fichier par injecteurs. tsung.dump =ERROR REPORT==== 13-Mar-2014::09:13:12 === ** State machine <0.64.0> terminating ** Last message in was {timeout,#Ref<0.0.0.168>,end_thinktime} ** When State == think ** Data == {state_rcv,none, {{0,0,0,0},0}, undefined,0,10000,"127.0.0.1",8080,gen_tcp, {proto_opts,negociate,10,600000,32768,32768,undefined, undefined}, false,1,undefined,true,undefined, {1394,698391,114389}, 4,4,false,undefined,0,[],<<>>, {http,0,0,-1,{none,none},false,false,{false,false},[]}, 0,2,524288,524288, {dyndata,[{tsung_userid,"2"}],{http_dyndata,"tsung",[]}}, ts_http,[],undefined,full} ** Reason for termination = ** {{badmatch,false},[{erl_eval,expr,3,[]}]} Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 41 / 58
  • 42. Log Le level notice permet par exemple l’accès aux variables scenario <dyn_variable name="code" re="HTTP/1.1 (d+)" /> tsung0@host.log =INFO REPORT==== 23-Nov-2013::09:17:37 === ts_search:(6:<0.69.0>) DynVar (RE): Match (code=<<"200">>) Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 42 / 58
  • 44. dumptraffic dumptraffic="true" permet de logger l’intégralité du traffic entre les injecteurs et la cible tsung.dump NewClient:1394697656.592317:1 load:1 Send:1394697656.612861:<7218.63.0>:GET /index.html?f=undefined HTTP/1.1 Host: 127.0.0.1:8080 User-Agent: tsung Recv:1394697656.613965:<7218.63.0>:HTTP/1.1 200 OK Server: Yaws 1.94 Date: Thu, 13 Mar 2014 08:00:56 GMT Last-Modified: Tue, 26 Jun 2012 06:10:45 GMT Etag: "3G0gq0ABxu9" Content-Length: 1165 Content-Type: text/html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> ... Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 44 / 58
  • 45. Backtrace Une erreur dans le scenario génère une trace complète sur la console lors du lancement Example Starting Tsung "Log directory is: /tmp/20140313-0911" 2542- fatal: {endtag_does_not_match, {was,transaction,should_have_been,setdynvars}} Config Error, aborting ! {fatal, {{endtag_does_not_match, {was,transaction,should_have_been, setdynvars}}, {file,"tiny.xml"}, {line,32}, {col,9}}} Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 45 / 58
  • 46. Monitoring de la cible Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 46 / 58
  • 47. Erlang Monitoring directement intégré dans Tsung Example <monitoring> <monitor host="www-a" type="erlang"></monitor> <monitor host="bigfoot-1" type="erlang"></monitor> <monitor host="bigfoot-2" type="erlang"></monitor> <monitor host="db" type="erlang"></monitor> </monitoring> Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 47 / 58
  • 48. SNMP Monitoring par protocole SNMP Example <monitoring> <monitor host="geronimo" type="snmp"/> <monitor host="db" type="snmp"> <snmp version="v2" community="mycommunity" port="11161"/> </monitor> </monitoring> Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 48 / 58
  • 49. Munin Utilisation des sondes Munin Example <monitoring> <monitor host="geronimo" type="munin"/> </monitoring> Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 49 / 58
  • 50. Action ! La commande utile : Exécution $ tsung -f scenario.xml -l logs/ start Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 50 / 58
  • 51. Les mesures Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 51 / 58
  • 52. Statistiques request : Response time for each request. page : Response time for each set of requests connect : Duration of the connection establishment. reconnect : Number of reconnection. size_rcv : Size of responses in bytes. size_sent : Size of requests in bytes. session : Duration of a user’s session. users : Number of simultaneous users (it’s session has started, but not yet finished). connected : number of users with an opened TCP/UDP connection custom transactions HTTP status counter Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 52 / 58
  • 53. tsung.log Example # stats: dump at 1218093520 stats: users 247 247 stats: connected 184 247 stats: users_count 184 247 stats: page 187 98.324 579.441 5465.940 2.177 9.237 595 58 stats: request 1869 0.371 0.422 5.20703125 0.115 0.431 7444062 581 stats: connect 186 0.427 0.184 4.47216796875 0.174 0.894 88665254 59 stats: tr_login 187 100.848 579.742 5470.223 2.231 56.970 91567888 58 stats: size_rcv 2715777 3568647 stats: 200 1869 2450 stats: size_sent 264167 347870 # stats: dump at 1218093530 stats: users 356 356 stats: users_count 109 356 stats: connected -32 215 stats: page 110 3.346 0.408 5465.940 2.177 77.234 724492 245 stats: request 1100 0.305 0.284 5.207 0.115 0.385 26785716 2450 stats: connect 110 0.320 0.065 4.472 0.174 0.540 39158164 245 stats: tr_login 110 3.419 0.414 5470.223 2.231 90.461 548628831 245 stats: size_rcv 1602039 5170686 stats: 200 1100 3550 stats: size_sent 150660 498530 Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 53 / 58
  • 54. tsung.log Example { "stats": [ {"timestamp": 1317413841, "samples": []}, {"timestamp": 1317413851, "samples": [ {"name": "users", "value": 0, "max": 0}, {"name": "users_count", "value": 0, "total": 0}, {"name": "finish_users_count", "value": 0, "total": 0}]}, {"timestamp": 1317413861, "samples": [ {"name": "users", "value": 0, "max": 1}, {"name": "load", "hostname": "requiem", "value": 1, "mean": 0.0,"stddev": 0,"max": 0.0,"min": 0.0 ,"global_mean": 0 ,"global_count": 0}, Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 54 / 58
  • 55. Les rapports Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 55 / 58
  • 56. Rapports Génération des rapports script perl monolithique de base scripts et templates alternatifs Maheki Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 56 / 58
  • 57. Contribuer Docs, https://tsung.readthedocs.org/ Code, https://github.com/processone/tsung/ CI, http://jenkins.quiedeville.org/view/Tsung/ Bugtrack, https://support.process-one.net/browse/TSUN Irc, freenode #tsung ML, https://lists.process-one.net/mailman/ listinfo/tsung-users Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 57 / 58
  • 58. Questions ? Rodolphe Quiédeville rodolphe@quiedeville.org http://blog.rodolphe.quiedeville.org/ Document publié sous Licence Creative Commons BY-SA 2.0 Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 58 / 58