Documentation technique : Debian
Documentation basée sur la distribution Debian

> > > > Monitorer Shoutcast avec Munin

Monitorer Shoutcast avec Munin

Si un serveur Shoutcast est installé sur la machine, il peut être intéressant de le monitorer.

Voici un script de monitoring pour Munin écrit en Python qui permet de :

  • compter le nombre de clients connectés au flux
  • comptabiliser le temps d’écoute et d’en réaliser une moyenne

Pour l’utiliser, il faut s’assurer que python 2.5 soit installé sur la machine :

  1. sudo apt-get install python2.5

On a décidé de déposer nos plugins personnalisés dans le répertoire /opt/share/munin/plugins, on vérifie qu’il existe bien et on s’y déplace :

  1. #Créer le répertoire des plugins dans le cas ou il n'existe pas déjà
  2. sudo mkdir -p /opt/share/munin/plugins
  3. cd /opt/share/munin/plugins

Télécharger

On édite le fichier qui nous servira de plugin :

  1. sudo nano shoutcast_

On y colle le contenu suivant en modifiant les lignes :

  • server : si le serveur a monitorer est sur une autre machine ou sur un port différent
  • pw : le mot de passe d’admin du serveur pour avoir accès aux statistiques
  1. #!/usr/bin/env python2.5
  2. """
  3. Plugin to monitor shoutcast streaming servers.
  4.  
  5. Author: kent1 <kent1@arscenic.info>
  6. Version: 2010091301
  7.  
  8. This program is free software: you can redistribute it and/or modify
  9. it under the terms of the GNU General Public License as published by
  10. the Free Software Foundation, either version 3 of the License, or
  11. (at your option) any later version.
  12.  
  13. This program is distributed in the hope that it will be useful,
  14. but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16. GNU General Public License for more details.
  17.  
  18. You should have received a copy of the GNU General Public License
  19. along with this program.  If not, see <http://www.gnu.org/licenses/>.
  20.  
  21. Usage:
  22.     - Link or copy to /etc/munin/plugins
  23.     - To enable listening duration,
  24.     also link to shoutcast_duration respectively.
  25.  
  26. Configuration:
  27.     - Enter your server, user and pw below
  28.       (The plugin does not need to run on
  29.       the same host as your shoutcast server)
  30.     - Optionally provide hosts to exclude.
  31.  
  32. Possible TODOs:
  33.     - use autoconf
  34.     - use munin's configuration system
  35.     - documentation
  36.  
  37. """
  38.  
  39. # CONFIGURATION
  40.  
  41. server = "127.0.0.1:8000"
  42. user = "admin"
  43. pw = "password"
  44.  
  45. # Exclude these hosts when calculating listening duration / listeners count
  46. # (we use this to prevent our aircheck recording system from appearing in the stats)
  47. #exclude = ("123.123.123.123",)
  48. exclude = ()
  49.  
  50. # /CONFIGURATION
  51.  
  52. from sys import argv, exit, stderr
  53. import urllib2
  54. from xml.etree.ElementTree import ElementTree
  55. from os.path import basename
  56.  
  57. stats_url = "http://%s/admin.cgi?mode=viewxml" % server
  58. realm = "Shoutcast Server"
  59. auth_handler = urllib2.HTTPBasicAuthHandler()
  60. auth_handler.add_password(realm, server, user, pw)
  61. opener = urllib2.build_opener(auth_handler)
  62.  
  63. opener.addheaders = [('User-agent', 'Mozilla/5.0')]
  64.  
  65. f = opener.open(stats_url)
  66. tree = ElementTree()
  67. tree.parse(f)
  68. f.close()
  69.  
  70. sources = []
  71. sources.append({"mount": tree.find("SERVERTITLE").text,
  72.     "listeners": tree.find("CURRENTLISTENERS").text,
  73.     "connected": tree.find("STREAMHITS").text})
  74.  
  75. plugin_name = basename(argv[0])
  76.  
  77. try:
  78.     if argv[1] == "config":
  79.         if plugin_name == "shoutcast_duration":
  80.             print "graph_title Shoutcast client listening duration"
  81.             print "graph_args --base 1000 -l 0"
  82.             print "graph_scale no"
  83.             print "graph_category Shoutcast"
  84.             print "graph_vlabel minutes"
  85.             print "avg.label average listening duration"
  86.             print "mdn.label median listening duration"
  87.         else:
  88.             print "graph_title Shoutcast listeners count"
  89.             print "graph_args --base 1000 -l 0"
  90.             print "graph_scale no"
  91.             print "graph_category Shoutcast"
  92.             print "graph_vlabel listeners"
  93.             is_first = True
  94.             for s in sources:
  95.                 sname = s["mount"].strip("/").replace(".","_")
  96.                 print "%s.label source %s" % (sname, s["mount"])
  97.                 if is_first:
  98.                     print "%s.draw AREA" % sname
  99.                     is_first = False
  100.                 else:
  101.                     print "%s.draw STACK" % sname
  102.  
  103.         exit(0)
  104.  
  105. except IndexError:
  106.     pass
  107.  
  108. durations = {}
  109. for s in sources:
  110.     durations[s["mount"]] = []
  111.     for l in tree.find("LISTENERS").getiterator("LISTENER"):
  112.         if l.find("HOSTNAME").text not in exclude:
  113.             durations[s["mount"]].append(int(l.find("CONNECTTIME").text))
  114.  
  115. if plugin_name == "shoutcast_duration":
  116.     if not durations:
  117.         exit(0)
  118.     alldurations = reduce(lambda x, y: x+y, durations.values())
  119.     alldurations.sort()
  120.     print "avg.value %s" % (sum(alldurations) / float(len(alldurations)) / 60.,)
  121.     if len(alldurations) % 2:
  122.         median = alldurations[len(alldurations) / 2] / 60.
  123.     elif len(alldurations):
  124.         median = (alldurations[len(alldurations) / 2 - 1] + alldurations[len(alldurations) / 2]) / 2. / 60.
  125.     else:
  126.         median = 0
  127.     print "mdn.value %s" % median
  128. else:
  129.     for s in sources:
  130.         print "%s.value %s" % (s["mount"].strip("/").replace(".","_"), len(durations[s["mount"]]))

Télécharger

Ensuite on donne les droits d’exécution sur le fichier :

  1. sudo chmod +x shoutcast_

Le script permettant de monitorer deux choses différentes, on crée deux liens symboliques vers le répertoire des plugins de Munin :

  1. # Le compteur de clients connectés au flux
  2. sudo ln -s /opt/share/munin/plugins/shoutcast_ /etc/munin/plugins/shoutcast_counts
  3. # Le graphique donnant la durée des connections
  4. sudo ln -s /opt/share/munin/plugins/shoutcast_ /etc/munin/plugins/shoutcast_duration

Télécharger

Il est possible ensuite de tester le bon fonctionnement des modules en lançant les commandes :

  1. sudo munin-run shoutcast_counts
  2. sudo munin-run shoutcast_duration

Télécharger

Le résultat de ces commandes doivent donner les valeurs qui s’afficheront dans les graphiques.

Puis on redémarre le noeud :

  1. sudo /etc/init.d/munin-node restart

Attendez quelques minutes et vous devriez voir apparaitre ces nouveaux graphiques sur votre affichage web du serveur.

Articles complémentaires

  • Auteur :
  • Publié le :
  • Mis à jour : 25/10/15

8 commentaires


Qui êtes-vous ?
[Se connecter]
Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.