From 5329f5a1e7536ae56f71bb6adf9f6c94bf1ea335 Mon Sep 17 00:00:00 2001 From: Michel Blockelet Date: Fri, 19 Feb 2010 10:09:06 +0100 Subject: [PATCH] [munin/innd_total] On essaie d'eviter un peu mieux le timeout Le graphe avait beaucoup de trous, il en a deja presque plus ... darcs-hash:20100219090906-ddb99-cb9c395a6286a5d527920725ec33bc7431850e40.gz --- munin/innd_total | 125 +++++++++++++++++++++++++++++++---------------- 1 file changed, 83 insertions(+), 42 deletions(-) diff --git a/munin/innd_total b/munin/innd_total index 7873288a..cf9cda18 100755 --- a/munin/innd_total +++ b/munin/innd_total @@ -20,11 +20,16 @@ """Plugin munin pour innd :: donne le nombre total de posts par newsgroup.""" ## Importations -import socket, sys, time +import socket, sys, threading, time ## Configuration +# Fichier de cache pour stocker les données entre deux lancements cache_file = "/tmp/munin_innd_total_cache" - +# Effectuer le compte exact du nombre de messages (beaucoup plus lent) +# sinon, utilise le compte approximatif envoyé par le serveur +exact_count = False +# Nombre de messages minimal pour être affiché +min_messages = 100 def recvlines(sock): buff = sock.recv(4096) @@ -32,51 +37,63 @@ def recvlines(sock): buff += sock.recv(4096) return buff.split('\r')[:-2] -## Connexion -s = socket.socket() -s.connect(('localhost', 119)) -## Mise en mode reader (pour utiliser 'listgroup') -s.send("mode reader\r\n") +def get_newsgroups_data(): + ## Connexion + s = socket.socket() + s.connect(('localhost', 119)) -# Petit "hack" en attendant d'utiliser la nntplib -time.sleep(0.5) + ## Mise en mode reader (pour utiliser 'listgroup') + s.send("mode reader\r\n") -s.recv(4096) + # Petit "hack" en attendant d'utiliser la nntplib + time.sleep(0.5) -## Récupération des newsgroups et du nombre de posts -s.send("list\r\n") -newsgroups = [] -for l in recvlines(s)[1:]: - name = l.split()[0] + s.recv(4096) - # Conversion du nom vers un format accepté par munin - cname = name - while '.' in cname: - (parent, sep, sub) = cname.partition('.') - cname = '%s_%s' % (parent[0], sub) - cname = cname.replace('-', '_') + ## Récupération des newsgroups et du nombre de posts + s.send("list\r\n") + newsgroups = [] + for l in recvlines(s)[1:]: + name = l.split()[0] - # Récupération du nombre de posts - s.send('listgroup %s\r\n' % name) - val = len(recvlines(s)) + # Conversion du nom vers un format accepté par munin + cname = name + while '.' in cname: + (parent, sep, sub) = cname.partition('.') + cname = '%s_%s' % (parent[0], sub) + cname = cname.replace('-', '_') - # On ne garde pas les newsgroups presque vides - if val > 5: - newsgroups.append((name, cname, val)) + # Récupération du nombre de posts + if exact_count: + s.send('listgroup %s\r\n' % name) + val = len(recvlines(s)) + else: + s.send('group %s\r\n' % name) + val = int(s.recv(4096).split()[1]) + + # On ne garde pas les newsgroups presque vides + if val > min_messages: + newsgroups.append((name, cname, val)) + + ## On garde un cache si jamais le serveur nous bounce + if len(newsgroups) > 0: + try: + f = open(cache_file, 'w') + for ngdata in newsgroups: + f.write('%s,%s,%d\n' % ngdata) + f.close() + except: + pass + else: + try: + for line in open(cache_file, 'r'): + newsgroups.append(line.strip().split(',')) + except: + pass + + return newsgroups -## On garde un cache si jamais le serveur nous bounce -if len(newsgroups) > 0: - f = open(cache_file, 'w') - for ngdata in newsgroups: - f.write('%s,%s,%d\n' % ngdata) - f.close() -else: - try: - for line in open(cache_file, 'r'): - newsgroups.append(line.strip().split(',')) - except: - pass ## Sortie if len(sys.argv) > 1 and sys.argv[1] == 'config': @@ -87,18 +104,42 @@ if len(sys.argv) > 1 and sys.argv[1] == 'config': print 'graph_vlabel posts' print 'graph_category News' print 'graph_info Nombre de posts pour chaque newsgroup' - (ng0, cng0, val0) = newsgroups[0] + rnewsgroups = get_newsgroups_data() + (ng0, cng0, val0) = rnewsgroups[0] print '%s.label %s' % (cng0, ng0) print '%s.draw AREA' % cng0 - for (ng, cng, val) in newsgroups[1:]: + for (ng, cng, val) in rnewsgroups[1:]: print '%s.label %s' % (cng, ng) print '%s.draw STACK' % cng print 'total.label Total' else: + # On lance un thread pour éviter les timeouts + finished = threading.Event() + + def thread_gnd(return_newsgroups, finished): + return_newsgroups.extend(get_newsgroups_data()) + finished.set() + + rnewsgroups = [] + t = threading.Thread(target=thread_gnd, args=(rnewsgroups, finished)) + t.daemon = True + t.start() + + # On laisse 30 secondes pour que le thread finisse + finished.wait(30) + if finished.isSet(): + fnewsgroups = rnewsgroups + else: + try: + for line in open(cache_file, 'r'): + fnewsgroups.append(line.strip().split(',')) + except: + fnewsgroups = [] + # Envoi des valeurs lines = [] total = 0 - for (ng, cng, val) in newsgroups: + for (ng, cng, val) in fnewsgroups: total += val print '%s.value %d' % (cng, val) print 'total.value %d' % total