SlideShare une entreprise Scribd logo
1  sur  53
Télécharger pour lire hors ligne
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 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
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
Utilisateurs
Total
CMA-CGM
Ministère des finances
Dailymotion
Skyrock, Libération
LibertySurf
Grid’5000
Rodolphe Quiédeville (Freelance) Tsung - Mappy 27 mars 2014 4 / 54
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
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
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
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
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
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
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’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
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 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
Utilisation de variables dans
les 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 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
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=l
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 foreach
Des 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 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
Les logs
Rodolphe Quiédeville (Freelance) Tsung - Mappy 27 mars 2014 34 / 54
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
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
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
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 - Mappy 27 mars 2014 38 / 54
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
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
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 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
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 - 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 rapports
script perl monolithique de base
scripts et templates alternatifs
Maheki
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 #tsung
ML, https://lists.process-one.net/mailman/
listinfo/tsung-users
Rodolphe Quiédeville (Freelance) Tsung - Mappy 27 mars 2014 52 / 54
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 - Mappy 27 mars 2014 53 / 54

Contenu connexe

En vedette

Tests unitaires pour PostgreSQL avec pgTap
Tests unitaires pour PostgreSQL avec pgTapTests unitaires pour PostgreSQL avec pgTap
Tests unitaires pour PostgreSQL avec pgTapRodolphe Quiédeville
 
Digital humanities and libraries
Digital humanities and libraries Digital humanities and libraries
Digital humanities and libraries librarianrafia
 
Social Media & Online Presence
Social Media & Online PresenceSocial Media & Online Presence
Social Media & Online Presencelibrarianrafia
 
Digital Humanities for Historians: An introduction
Digital Humanities for Historians: An introductionDigital Humanities for Historians: An introduction
Digital Humanities for Historians: An introductionlibrarianrafia
 
Digital Humanities & UTA libraries
Digital Humanities & UTA libraries  Digital Humanities & UTA libraries
Digital Humanities & UTA libraries librarianrafia
 
Using Omeka as a Gateway to Digital Projects
Using Omeka as a Gateway to Digital ProjectsUsing Omeka as a Gateway to Digital Projects
Using Omeka as a Gateway to Digital Projectslibrarianrafia
 
The Silver Age of Comics 1956-c.1970
The Silver Age of Comics 1956-c.1970The Silver Age of Comics 1956-c.1970
The Silver Age of Comics 1956-c.1970librarianrafia
 
Introduction to databases and metadata
Introduction to databases and metadataIntroduction to databases and metadata
Introduction to databases and metadatalibrarianrafia
 
Introduction To Searching The Web
Introduction To Searching The WebIntroduction To Searching The Web
Introduction To Searching The Weblibrarianrafia
 
Digitization for accessibility
Digitization for accessibilityDigitization for accessibility
Digitization for accessibilitylibrarianrafia
 
Your Digital Identity: Social Media & Online Presence
Your Digital Identity: Social Media & Online PresenceYour Digital Identity: Social Media & Online Presence
Your Digital Identity: Social Media & Online Presencelibrarianrafia
 
Create a (free) Wordpress Site
Create a (free) Wordpress SiteCreate a (free) Wordpress Site
Create a (free) Wordpress Sitelibrarianrafia
 
Auto volador, trabajo practico
Auto volador, trabajo practicoAuto volador, trabajo practico
Auto volador, trabajo practicoCamilaRenfijes
 
Pensamiento positivo y la plenitud de la vida
Pensamiento positivo y la plenitud de la vidaPensamiento positivo y la plenitud de la vida
Pensamiento positivo y la plenitud de la vidaEuler Ruiz
 

En vedette (20)

Tests unitaires pour PostgreSQL avec pgTap
Tests unitaires pour PostgreSQL avec pgTapTests unitaires pour PostgreSQL avec pgTap
Tests unitaires pour PostgreSQL avec pgTap
 
Digital humanities and libraries
Digital humanities and libraries Digital humanities and libraries
Digital humanities and libraries
 
Social Media & Online Presence
Social Media & Online PresenceSocial Media & Online Presence
Social Media & Online Presence
 
Digital Humanities for Historians: An introduction
Digital Humanities for Historians: An introductionDigital Humanities for Historians: An introduction
Digital Humanities for Historians: An introduction
 
Introduction to Omeka
Introduction to OmekaIntroduction to Omeka
Introduction to Omeka
 
Digital Humanities & UTA libraries
Digital Humanities & UTA libraries  Digital Humanities & UTA libraries
Digital Humanities & UTA libraries
 
Using Omeka as a Gateway to Digital Projects
Using Omeka as a Gateway to Digital ProjectsUsing Omeka as a Gateway to Digital Projects
Using Omeka as a Gateway to Digital Projects
 
The Silver Age of Comics 1956-c.1970
The Silver Age of Comics 1956-c.1970The Silver Age of Comics 1956-c.1970
The Silver Age of Comics 1956-c.1970
 
Introduction to databases and metadata
Introduction to databases and metadataIntroduction to databases and metadata
Introduction to databases and metadata
 
Introduction To Searching The Web
Introduction To Searching The WebIntroduction To Searching The Web
Introduction To Searching The Web
 
Digitization for accessibility
Digitization for accessibilityDigitization for accessibility
Digitization for accessibility
 
Your Digital Identity: Social Media & Online Presence
Your Digital Identity: Social Media & Online PresenceYour Digital Identity: Social Media & Online Presence
Your Digital Identity: Social Media & Online Presence
 
Create a (free) Wordpress Site
Create a (free) Wordpress SiteCreate a (free) Wordpress Site
Create a (free) Wordpress Site
 
Apellidos2
Apellidos2Apellidos2
Apellidos2
 
7 série
7 série7 série
7 série
 
Auto volador, trabajo practico
Auto volador, trabajo practicoAuto volador, trabajo practico
Auto volador, trabajo practico
 
comunidad virtual
comunidad virtualcomunidad virtual
comunidad virtual
 
Pensamiento positivo y la plenitud de la vida
Pensamiento positivo y la plenitud de la vidaPensamiento positivo y la plenitud de la vida
Pensamiento positivo y la plenitud de la vida
 
Antartique
AntartiqueAntartique
Antartique
 
A arte na antiguidade
A  arte  na  antiguidadeA  arte  na  antiguidade
A arte na antiguidade
 

Similaire à BBL chez Mappy autour de Tsung

Tests de montée en charge avec Tsung
Tests de montée en charge avec TsungTests de montée en charge avec Tsung
Tests de montée en charge avec TsungRodolphe Quiédeville
 
Oxalide Workshop #3 - Elasticearch, an overview
Oxalide Workshop #3 - Elasticearch, an overviewOxalide Workshop #3 - Elasticearch, an overview
Oxalide Workshop #3 - Elasticearch, an overviewLudovic Piot
 
Oxalide Academy : Workshop #3 Elastic Search
Oxalide Academy : Workshop #3 Elastic SearchOxalide Academy : Workshop #3 Elastic Search
Oxalide Academy : Workshop #3 Elastic SearchOxalide
 
Apache Storm - Introduction au traitement temps-réel avec Storm
Apache Storm - Introduction au traitement temps-réel avec StormApache Storm - Introduction au traitement temps-réel avec Storm
Apache Storm - Introduction au traitement temps-réel avec StormParis_Storm_UG
 
Paris stormusergroup intrudocution
Paris stormusergroup intrudocutionParis stormusergroup intrudocution
Paris stormusergroup intrudocutionParis_Storm_UG
 
Gestion des logs sur une plateforme web
Gestion des logs sur une plateforme webGestion des logs sur une plateforme web
Gestion des logs sur une plateforme webfredcons
 
BBL - Monitoring - kyriba
BBL - Monitoring - kyribaBBL - Monitoring - kyriba
BBL - Monitoring - kyribaOlivier BAZOUD
 
Terraform OpenStack : Mise en pratique sur infrastructure OVH (Rennes devops)
Terraform OpenStack : Mise en pratique sur infrastructure OVH (Rennes devops) Terraform OpenStack : Mise en pratique sur infrastructure OVH (Rennes devops)
Terraform OpenStack : Mise en pratique sur infrastructure OVH (Rennes devops) Joël Séguillon
 
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...Normandy JUG
 
Génération automatique de texte
Génération automatique de texteGénération automatique de texte
Génération automatique de texteEstelle Delpech
 
Solr overview presentation
Solr overview presentationSolr overview presentation
Solr overview presentationspy-seth
 
20120110 paris jug-packaging-natif
20120110 paris jug-packaging-natif20120110 paris jug-packaging-natif
20120110 paris jug-packaging-natifHenri Gomez
 
SQLSaturday Paris 2014 - Monitoring et configuration SSAS
SQLSaturday Paris 2014 - Monitoring et configuration SSASSQLSaturday Paris 2014 - Monitoring et configuration SSAS
SQLSaturday Paris 2014 - Monitoring et configuration SSASGUSS
 
Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...
Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...
Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...fdussert
 

Similaire à BBL chez Mappy autour de Tsung (20)

Ruby STAR
Ruby STARRuby STAR
Ruby STAR
 
Tsung GIS
Tsung GISTsung GIS
Tsung GIS
 
Tests de montée en charge avec Tsung
Tests de montée en charge avec TsungTests de montée en charge avec Tsung
Tests de montée en charge avec Tsung
 
Vert.x 3
Vert.x 3Vert.x 3
Vert.x 3
 
Oxalide Workshop #3 - Elasticearch, an overview
Oxalide Workshop #3 - Elasticearch, an overviewOxalide Workshop #3 - Elasticearch, an overview
Oxalide Workshop #3 - Elasticearch, an overview
 
Oxalide Academy : Workshop #3 Elastic Search
Oxalide Academy : Workshop #3 Elastic SearchOxalide Academy : Workshop #3 Elastic Search
Oxalide Academy : Workshop #3 Elastic Search
 
Messages queues - Socloz@PHPForum 2013
Messages queues - Socloz@PHPForum 2013Messages queues - Socloz@PHPForum 2013
Messages queues - Socloz@PHPForum 2013
 
Apache Storm - Introduction au traitement temps-réel avec Storm
Apache Storm - Introduction au traitement temps-réel avec StormApache Storm - Introduction au traitement temps-réel avec Storm
Apache Storm - Introduction au traitement temps-réel avec Storm
 
Paris stormusergroup intrudocution
Paris stormusergroup intrudocutionParis stormusergroup intrudocution
Paris stormusergroup intrudocution
 
Gestion des logs sur une plateforme web
Gestion des logs sur une plateforme webGestion des logs sur une plateforme web
Gestion des logs sur une plateforme web
 
BBL - Monitoring - kyriba
BBL - Monitoring - kyribaBBL - Monitoring - kyriba
BBL - Monitoring - kyriba
 
Terraform OpenStack : Mise en pratique sur infrastructure OVH (Rennes devops)
Terraform OpenStack : Mise en pratique sur infrastructure OVH (Rennes devops) Terraform OpenStack : Mise en pratique sur infrastructure OVH (Rennes devops)
Terraform OpenStack : Mise en pratique sur infrastructure OVH (Rennes devops)
 
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
 
Génération automatique de texte
Génération automatique de texteGénération automatique de texte
Génération automatique de texte
 
Solr overview presentation
Solr overview presentationSolr overview presentation
Solr overview presentation
 
20120110 paris jug-packaging-natif
20120110 paris jug-packaging-natif20120110 paris jug-packaging-natif
20120110 paris jug-packaging-natif
 
Geneve Monitoring Graylog
Geneve Monitoring GraylogGeneve Monitoring Graylog
Geneve Monitoring Graylog
 
SQLSaturday Paris 2014 - Monitoring et configuration SSAS
SQLSaturday Paris 2014 - Monitoring et configuration SSASSQLSaturday Paris 2014 - Monitoring et configuration SSAS
SQLSaturday Paris 2014 - Monitoring et configuration SSAS
 
Apache Beam
Apache Beam Apache Beam
Apache Beam
 
Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...
Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...
Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...
 

Plus de Rodolphe Quiédeville

Plus de Rodolphe Quiédeville (12)

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

BBL chez Mappy autour de Tsung

  • 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
  • 4. Utilisateurs Total CMA-CGM Ministère des finances Dailymotion Skyrock, Libération LibertySurf Grid’5000 Rodolphe Quiédeville (Freelance) Tsung - Mappy 27 mars 2014 4 / 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
  • 12. 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
  • 13. 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
  • 14. 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
  • 15. 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
  • 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
  • 21. 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
  • 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
  • 25. 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
  • 26. 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 - Mappy 27 mars 2014 26 / 54
  • 27. 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
  • 28. if, for, foreach, ... Rodolphe Quiédeville (Freelance) Tsung - Mappy 27 mars 2014 28 / 54
  • 29. 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
  • 30. for et foreach Des 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
  • 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
  • 34. Les logs Rodolphe Quiédeville (Freelance) Tsung - Mappy 27 mars 2014 34 / 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
  • 42. 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
  • 43. 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
  • 44. Munin Utilisation des sondes Munin Example <monitoring> <monitor host="geronimo" type="munin"/> </monitoring> Rodolphe Quiédeville (Freelance) Tsung - Mappy 27 mars 2014 44 / 54
  • 45. Action ! La commande utile : Exécution $ tsung -f scenario.xml -l logs/ start Rodolphe Quiédeville (Freelance) Tsung - Mappy 27 mars 2014 45 / 54
  • 46. Les mesures Rodolphe Quiédeville (Freelance) Tsung - Mappy 27 mars 2014 46 / 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
  • 48. 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 - Mappy 27 mars 2014 48 / 54
  • 49. 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
  • 50. Les rapports Rodolphe Quiédeville (Freelance) Tsung - Mappy 27 mars 2014 50 / 54
  • 51. Rapports Génération des rapports script perl monolithique de base scripts et templates alternatifs Maheki Rodolphe Quiédeville (Freelance) Tsung - Mappy 27 mars 2014 51 / 54
  • 52. 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 - Mappy 27 mars 2014 52 / 54
  • 53. 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 - Mappy 27 mars 2014 53 / 54