1. Tsung - Mappy
Rodolphe Quiédeville
Principe et généralités
27 mars 2014
Rodolphe Quiédeville (Freelance) Tsung - Mappy 27 mars 2014 1 / 54
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
version 1.5.0 stable, 1.6.0 en route pour la release
Rodolphe Quiédeville (Freelance) Tsung - Mappy 27 mars 2014 2 / 54
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 - Mappy 27 mars 2014 3 / 54
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 - Mappy 27 mars 2014 5 / 54
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 - Mappy 27 mars 2014 6 / 54
7. 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 - Mappy 27 mars 2014 7 / 54
8. Configuration
configuration centralisée
fichier xml par scenario
tout se fait sur le contrôlleur
modules optionnels à déployer sur les injecteurs
Rodolphe Quiédeville (Freelance) Tsung - Mappy 27 mars 2014 8 / 54
9. 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 - Mappy 27 mars 2014 9 / 54
10. 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 - Mappy 27 mars 2014 10 / 54
11. Le XML tu l’aimes ou ...
Rodolphe Quiédeville (Freelance) Tsung - Mappy 27 mars 2014 11 / 54
16. 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" maxnumber="1000"></users>
</arrivalphase>
</load>
Rodolphe Quiédeville (Freelance) Tsung - Mappy 27 mars 2014 16 / 54
17. Scenario
Les sessions, le subtile mélange des interactions
Example
<sessions>
<session name="small" probability="60" 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 - Mappy 27 mars 2014 17 / 54
18. 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 - Mappy 27 mars 2014 18 / 54
19. Analyse de la réponse
Rodolphe Quiédeville (Freelance) Tsung - Mappy 27 mars 2014 19 / 54
20. 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 - Mappy 27 mars 2014 20 / 54
22. 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 - Mappy 27 mars 2014 22 / 54
23. Utilisation de variables dans
les scenarii
Rodolphe Quiédeville (Freelance) Tsung - Mappy 27 mars 2014 23 / 54
24. Appel de fonction
Appel de n’importe quelle fonction Erlang ou par evaluation de code
dans le scenario
sourcetype
<setdynvars sourcetype="erlang" callback="module_users:get_unique_id">
<var name="id1" />
</setdynvars>
eval
<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 - Mappy 27 mars 2014 24 / 54
31. 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 - Mappy 27 mars 2014 31 / 54
32. En dev pour les devs
Rodolphe Quiédeville (Freelance) Tsung - Mappy 27 mars 2014 32 / 54
33. 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 - Mappy 27 mars 2014 33 / 54
35. loglevel
Le niveau de log est relatif à chaque scenario
emergency
critical
error
warning
notice (default)
info
debug
Rodolphe Quiédeville (Freelance) Tsung - Mappy 27 mars 2014 35 / 54
36. 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 - Mappy 27 mars 2014 36 / 54
37. 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 - Mappy 27 mars 2014 37 / 54
39. 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 - Mappy 27 mars 2014 39 / 54
40. 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 - Mappy 27 mars 2014 40 / 54
41. Monitoring de la cible
Rodolphe Quiédeville (Freelance) Tsung - Mappy 27 mars 2014 41 / 54
47. 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 - Mappy 27 mars 2014 47 / 54