Présentation de Tsung chez Leboncoin

1,129 views

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,129
On SlideShare
0
From Embeds
0
Number of Embeds
19
Actions
Shares
0
Downloads
12
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Présentation de Tsung chez Leboncoin

  1. 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. 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. 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. 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. 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. 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. 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. 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. 9. Le XML tu l’aimes ou ... Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 9 / 58
  10. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 21. Analyse de la réponse Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 21 / 58
  22. 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. 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. 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. 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. 26. Utilisation de variables dans les scenarii Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 26 / 58
  27. 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. 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. 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. 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. 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. 32. if, for, foreach, ... Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 32 / 58
  33. 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. 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. 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. 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. 37. En dev pour les devs Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 37 / 58
  38. 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. 39. Les logs Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 39 / 58
  40. 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. 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. 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
  43. 43. 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
  44. 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. 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. 46. Monitoring de la cible Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 46 / 58
  47. 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. 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. 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. 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. 51. Les mesures Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 51 / 58
  52. 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. 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. 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. 55. Les rapports Rodolphe Quiédeville (Freelance) Tsung - Leboncoin 13 mars 2014 55 / 58
  56. 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. 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. 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

×