PDA

Voir la version complète : Compter le nombre d'appels simultanés



jean
13/10/2010, 15h13
je m'étais gratté la tête il y a quelque temps pour trouver le nombre d'appels simultanés sur une période donnée (sans être tanqué devant la console en permanence)

je pense avoir trouvé ZE réponse, à base de script shell. On liste le Master.csv, en affichant l'heure d'établissement d'appel suivi de +1, et de raccroché suivi de -1. On trie, on additionne, et zou:

awk 'BEGIN{FS=",\""} /ANSWERED/{split($11, a, "\""); split($12, b, "\"");printf ("%s,1\n%s,-1\n", a[1],b[1]); }' Master.csv | sort | awk -F , '{cpt=cpt+$2; printf ("%s %03d\n", $1, cpt);}'

Après, on joue comme on veut avec le résultat, on peut filtrer sur des noms de trunk, etc...

J.

_AK_
19/10/2010, 10h39
Salut,

Super cette commande, par contre il me sort des
2010-10-01 06:43:30 000
pourquoi ton script donne l'info qu'il y a 0 com simultanées?

jean
19/10/2010, 13h07
tu es bien dans le répertoire ou est Master.csv (ie, /var/log/asterisl/cdr-csv) ?

sinon, coupe la commande en 2, le premier awk d'abord, et vois ce qui sort

_AK_
19/10/2010, 22h07
pardon je me suis mal exprimé,

j'ai bien des lignes avec un nombre d'appel simultané > 0 mais je ne comprend pas pourquoi il me sort certaines lignes a 0

jean
20/10/2010, 21h32
Ok - j'y suis !

Ce script te montre à chaque changement du nombre d'appel, le nombre d'appel et la date... par exemple:


2010-10-20 13:11:54 000
2010-10-20 13:16:54 001
2010-10-20 13:22:36 002
2010-10-20 13:23:15 003
2010-10-20 13:23:31 002
2010-10-20 13:24:51 001
2010-10-20 13:27:04 002
2010-10-20 13:27:09 001
2010-10-20 13:29:10 000
2010-10-20 13:30:38 001
tu vois qu'à 13:16:54, il y a eu un appel et que donc, 1 simultané, puis 2, puis 3, puis à 13:23:31, raccroché, on retombe à 2, etc...

Tu sais donc précisément ta charge, et à quelle heure.

Alternativement, tu peux faire
grep "2010-10-19" /var/log/asterisk/cdr-csv/Master.csv | awk 'BEGIN{FS=",\""} /ANSWERED/{split($11, a, "\""); split($12, b, "\"");printf ("%s,1\n%s,-1\n", a[1],b[1]); }' | sort | awk -F , '{cpt=cpt+$2; printf ("%s %01d\n", $1, cpt);}' | awk 'BEGIN {pdur=0;}{ if (pdur==0){pdur=substr($2,0,2)*60*60+substr($2,4,2) *60+substr($2,7,2); pc=$3; mcc=0;}else{ dur=substr($2,0,2)*60*60+substr($2,4,2)*60+substr( $2,7,2); d[pc] = d[pc]+dur-pdur; nc[pc]++; pdur=dur; pc=$3;} } END {for (i in d) { if (i>0) printf ("%d: Calls=%d, Min= %6.2f\n",i, nc[i],d[i]/60); }}'`

(j'avoue, j'aime bien awk... remplacer dans le premier grep la date du jour)
qui va te produire par nombre d'appels simultanés, le temps passé, et le nombre d'appels à ce moment:
1: Calls=68, Min= 97.50
2: Calls=41, Min= 44.63
3: Calls=10, Min= 5.20

il y a eu 68 moments avec 1 appel simultané, ca a duré 97 min
il y a eu 41 moments avec 2 appel simultané, ca a duré 44 min
il y a eu 10 moments avec 3 appel simultané, ca a duré 10 min

donc, je vois que ce serveur tourne majoritairement avec 1 appel simultané, petites pointes à 3

_AK_
22/10/2010, 09h25
Ok j'ai compris.

je pense que je vais te donner le titre de "Mister Awk" sur le forum :D

merci pour les infos.

tomarch
25/11/2010, 17h59
Merci pour ces commandes, mais n'étant pas très à l'aise avec awk, je recherche une méthode utilisant des requêtes mysql.
A part faire une usine à gaz, je ne suis pas arrivé au but escompté, donc je fait appel à vous.

jean
25/11/2010, 20h12
ahhh.. si tu savais.... tout ce qu'on peut faire avec Awk !!! c'est vraiment de la balle, avec un p'tit grep, le tout arrosé de sed !!!

mais bon... mysql est pas mal non plus, tu obtiens la même chose (ie, même résultat cf plus haut sur les explications) avec ca:

SET @cpt = 0;

SELECT evttime, @cpt := @cpt + typevt AS totcalls
FROM (SELECT starttime AS evttime, 1 AS typevt FROM cc_call
UNION ALL
SELECT stoptime AS evttime, -1 AS typevt
FROM cc_call
ORDER BY 1 ASC, 2 DESC) allcalls
WHERE evttime > '2010-11-01';

Je l'exécute avec Toad, mais ca marche aussi depuis mysql en commande ligne (attention, il y a deux lignes, le SET puis le SELECT)

Ca marche avec une bdd A2BILLING, il suffit de remplacer starttime, stoptime et cc_call avec les équivalents dans ta base

Enjoy....

tomarch
26/11/2010, 09h59
Merci beaucoup, c'est exactement ça.

Voici la requête pour la table cdr d'asterisk :

SET @cpt = 0;
SELECT evttime, @cpt := @cpt + typevt AS totcalls FROM (SELECT calldate AS evttime, 1 AS typevt FROM cdr UNION ALL SELECT adddate(calldate, interval duration second) AS evttime, -1 AS typevt FROM cdr ORDER BY 1 ASC, 2 DESC) allcalls WHERE evttime > '2010-10-01';

alpha
16/06/2016, 17h24
Salut, je suis actuellement en stage et je dois développer une application en php qui compte le nombre d'appels simultanés à l'intérieur de la table cdr. Seulement je ne trouve pas comment le faire, pourriez vous m'aider?

jean
16/06/2016, 17h44
ben, y'a tout dans ce thread !

quintana
16/06/2016, 20h15
Alternativement, tu peux faire:

grep "2010-10-19" /var/log/asterisk/cdr-csv/Master.csv | awk 'BEGIN{FS=",\""} /ANSWERED/{split($11, a, "\""); split($12, b, "\"");printf ("%s,1\n%s,-1\n", a[1],b[1]); }' | sort | awk -F , '{cpt=cpt+$2; printf ("%s %01d\n", $1, cpt);}' | awk 'BEGIN {pdur=0;}{ if (pdur==0){pdur=substr($2,0,2)*60*60+substr($2,4,2) *60+substr($2,7,2); pc=$3; mcc=0;}else{ dur=substr($2,0,2)*60*60+substr($2,4,2)*60+substr( $2,7,2); d[pc] = d[pc]+dur-pdur; nc[pc]++; pdur=dur; pc=$3;} } END {for (i in d) { if (i>0) printf ("%d: Calls=%d, Min= %6.2f\n",i, nc[i],d[i]/60); }}'`


Sérieux Jean :)

jean
16/06/2016, 21h06
y'a des fois j'abuse..... c'est vrai... en plus, je suis sur qu'en perl, ca se fait 3 fois plus vite.... dans une prochaine vie ;-)