Upload
rodolphe-quiedeville
View
312
Download
2
Embed Size (px)
DESCRIPTION
Citation preview
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 Erlangpublié sous GNU GPL V2projet Idealx initialement nommé IDX-Tsunamitest de serveur XMPP
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 2 / 58
Caractéristiques
multi protocolesscalable (validé à 10 Millions d’utilisateurs)pas d’interface graphiqueextensible par pluginsscenarios XML avec validation XSLsondes de monitoringmodèle Stochastic avec distribution de Poisson
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 3 / 58
Utilisateurs
TotalCMA-CGMMinistère des financesDailymotionSkyrock, LibérationLibertySurfGrid’5000
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 4 / 58
Principe de fonctionnement
un contrôleur0 à N injecteursune cibleun scenariodes logsdes rapports de résultats
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 5 / 58
Protocoles supportés en 1.5.0
HTTP/HTTPSWebsocketJabber/XMPPWebdavAMQP / MQTT / ZeroMQ (dev)LDAPPostgreSQLMySQL
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 6 / 58
Fonctions avancées
variables dynamiquesgestion des cookies automatiqueanalyse du résulatthinktimedonnées aléatoiresextension par modules erlangboucles et tests...
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 7 / 58
Installation
pre-requis : Erlang R15, erlang-crypto, sshpackage : Debian, Ubuntu, Fedora, ...sources : Githubscripts de creation paquet .deb dans les sourcesdé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’utilisateursgé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 startStarting 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éesinté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’uneaction et peuvent être ré-utilisées dans les actions suivantes.
ExampleRegexp<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 contenudu 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 dansles 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%%&password=%%_pass%%&op=login"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 enutilisant 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èrementassocié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 runparticulier
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 (letag est loggé avec dumptraffic="protocol")
Option -xtsung -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 scenarioemergencycriticalerrorwarningnotice (default)infodebug
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 unfichier 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+)" />
[email protected]=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;error1394696629.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 lesinjecteurs et la cible
tsung.dumpNewClient:1394697656.592317:1load:1Send:1394697656.612861:<7218.63.0>:GET /index.html?f=undefined HTTP/1.1Host: 127.0.0.1:8080User-Agent: tsung
Recv:1394697656.613965:<7218.63.0>:HTTP/1.1 200 OKServer: Yaws 1.94Date: Thu, 13 Mar 2014 08:00:56 GMTLast-Modified: Tue, 26 Jun 2012 06:10:45 GMTEtag: "3G0gq0ABxu9"Content-Length: 1165Content-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 consolelors du lancement
ExampleStarting 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 requestsconnect : 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/UDPconnectioncustom transactionsHTTP status counter
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 52 / 58
tsung.log
Example# stats: dump at 1218093520stats: users 247 247stats: connected 184 247stats: users_count 184 247stats: page 187 98.324 579.441 5465.940 2.177 9.237 595 58stats: request 1869 0.371 0.422 5.20703125 0.115 0.431 7444062 581stats: connect 186 0.427 0.184 4.47216796875 0.174 0.894 88665254 59stats: tr_login 187 100.848 579.742 5470.223 2.231 56.970 91567888 58stats: size_rcv 2715777 3568647stats: 200 1869 2450stats: size_sent 264167 347870# stats: dump at 1218093530stats: users 356 356stats: users_count 109 356stats: connected -32 215stats: page 110 3.346 0.408 5465.940 2.177 77.234 724492 245stats: request 1100 0.305 0.284 5.207 0.115 0.385 26785716 2450stats: connect 110 0.320 0.065 4.472 0.174 0.540 39158164 245stats: tr_login 110 3.419 0.414 5470.223 2.231 90.461 548628831 245stats: size_rcv 1602039 5170686stats: 200 1100 3550stats: 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 rapportsscript perl monolithique de basescripts et templates alternatifsMaheki
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 #tsungML, https://lists.process-one.net/mailman/listinfo/tsung-users
Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 57 / 58
Questions ?
Rodolphe Quiédeville
[email protected]://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