bbl chez mappy autour de tsung

53
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

Upload: rodolphe-quiedeville

Post on 14-Dec-2014

152 views

Category:

Technology


4 download

DESCRIPTION

Présentation de l'outil de test de performance Tsung à l'équipe de Mappy.

TRANSCRIPT

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

Tsung

début développement en 2001écrit en Erlangpublié sous GNU GPL V2projet Idealx initialement nommé IDX-Tsunamitest de serveur XMPPversion 1.5.0 stable, 1.6.0 en route pour la release

Rodolphe Quiédeville (Freelance) Tsung - Mappy 27 mars 2014 2 / 54

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 - Mappy 27 mars 2014 3 / 54

Utilisateurs

TotalCMA-CGMMinistère des financesDailymotionSkyrock, LibérationLibertySurfGrid’5000

Rodolphe Quiédeville (Freelance) Tsung - Mappy 27 mars 2014 4 / 54

Principe de fonctionnement

un contrôleur0 à N injecteursune cibleun scenariodes logsdes rapports de résultats

Rodolphe Quiédeville (Freelance) Tsung - Mappy 27 mars 2014 5 / 54

Protocoles supportés en 1.5.0

HTTP/HTTPSWebsocketJabber/XMPPWebdavAMQP / MQTT / ZeroMQ (dev)LDAPPostgreSQLMySQL

Rodolphe Quiédeville (Freelance) Tsung - Mappy 27 mars 2014 6 / 54

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 - Mappy 27 mars 2014 7 / 54

Configuration

configuration centraliséefichier xml par scenariotout se fait sur le contrôlleurmodules optionnels à déployer sur les injecteurs

Rodolphe Quiédeville (Freelance) Tsung - Mappy 27 mars 2014 8 / 54

Fonctions avancées

variables dynamiquesgestion des cookies automatiqueanalyse du résulatthinktimedonnées aléatoiresextension par modules erlangboucles et tests...

Rodolphe Quiédeville (Freelance) Tsung - Mappy 27 mars 2014 9 / 54

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 - Mappy 27 mars 2014 10 / 54

Le XML tu l’aimes ou ...

Rodolphe Quiédeville (Freelance) Tsung - Mappy 27 mars 2014 11 / 54

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 - Mappy 27 mars 2014 12 / 54

Scenario

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 - Mappy 27 mars 2014 13 / 54

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 - Mappy 27 mars 2014 14 / 54

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 - Mappy 27 mars 2014 15 / 54

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

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

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

Analyse de la réponse

Rodolphe Quiédeville (Freelance) Tsung - Mappy 27 mars 2014 19 / 54

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 - Mappy 27 mars 2014 20 / 54

dyn_variable

Utilisation du xpath ou lecture directe JSON

xpath<request>

<dyn_variable name="field1_value" xpath="//div[2]/@value"/><http url="/articles" method="GET" version="1.1" ></http>

</request>

<request><http url="/api/object/%%_field1_value%%" method="GET" version="1.1" ></http>

</request>

JSON<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 - Mappy 27 mars 2014 21 / 54

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 - Mappy 27 mars 2014 22 / 54

Utilisation de variables dansles scenarii

Rodolphe Quiédeville (Freelance) Tsung - Mappy 27 mars 2014 23 / 54

Appel de fonction

Appel de n’importe quelle fonction Erlang ou par evaluation de codedans 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

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 - Mappy 27 mars 2014 25 / 54

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=login"content_type="application/x-www-form-urlencoded" method="POST"></http>

</request>

Rodolphe Quiédeville (Freelance) Tsung - Mappy 27 mars 2014 26 / 54

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 - Mappy 27 mars 2014 27 / 54

if, for, foreach, ...

Rodolphe Quiédeville (Freelance) Tsung - Mappy 27 mars 2014 28 / 54

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 - Mappy 27 mars 2014 29 / 54

for et foreachDes classiques forts utiles

for<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>

foreach<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 - Mappy 27 mars 2014 30 / 54

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

En dev pour les devs

Rodolphe Quiédeville (Freelance) Tsung - Mappy 27 mars 2014 32 / 54

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 - Mappy 27 mars 2014 33 / 54

Les logs

Rodolphe Quiédeville (Freelance) Tsung - Mappy 27 mars 2014 34 / 54

loglevel

Le niveau de log est relatif à chaque scenarioemergencycriticalerrorwarningnotice (default)infodebug

Rodolphe Quiédeville (Freelance) Tsung - Mappy 27 mars 2014 35 / 54

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 - Mappy 27 mars 2014 36 / 54

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 - Mappy 27 mars 2014 37 / 54

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 - Mappy 27 mars 2014 38 / 54

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 - Mappy 27 mars 2014 39 / 54

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 - Mappy 27 mars 2014 40 / 54

Monitoring de la cible

Rodolphe Quiédeville (Freelance) Tsung - Mappy 27 mars 2014 41 / 54

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 - Mappy 27 mars 2014 42 / 54

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 - Mappy 27 mars 2014 43 / 54

Munin

Utilisation des sondes Munin

Example<monitoring>

<monitor host="geronimo" type="munin"/></monitoring>

Rodolphe Quiédeville (Freelance) Tsung - Mappy 27 mars 2014 44 / 54

Action !

La commande utile :

Exécution$ tsung -f scenario.xml -l logs/ start

Rodolphe Quiédeville (Freelance) Tsung - Mappy 27 mars 2014 45 / 54

Les mesures

Rodolphe Quiédeville (Freelance) Tsung - Mappy 27 mars 2014 46 / 54

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 - Mappy 27 mars 2014 47 / 54

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 - Mappy 27 mars 2014 48 / 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 - Mappy 27 mars 2014 49 / 54

Les rapports

Rodolphe Quiédeville (Freelance) Tsung - Mappy 27 mars 2014 50 / 54

Rapports

Génération des rapportsscript perl monolithique de basescripts et templates alternatifsMaheki

Rodolphe Quiédeville (Freelance) Tsung - Mappy 27 mars 2014 51 / 54

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 - Mappy 27 mars 2014 52 / 54

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 - Mappy 27 mars 2014 53 / 54