Home page > Monitoring > Munin > Monitoring spécifiques > 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

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

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

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

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.

8 comments


  • On 22 September 2010 at 17:21, by le dj :) Replying to: Monitorer Shoutcast avec Munin

    Merci pour ce plugin, duration fonctionne.

    J’ai un petit problème avec counts.
    S’il y a le caractère ":" (2 points) dans le nom du stream, par exemple ::ma radio::, le log munin-update.log remonte :
    sep 22 17:15:02 - Warning: Unknown option "__::" in "localdomain;localhost.localdomain:shoutcast_count.__::".
    sep 22 17:15:03 [28037] - Unable to update localdomain -> localhost.localdomain -> shoutcast_counts -> __: No such field (no "label" field defined when running plugin with "config").

    J’ai vu dans le fichier du plugin que "." était remplacé par "_" mais je ne sais pas comment faire pour remplacer ":"

    Reply to this message

    • On 22 September 2010 at 17:29, by Quentin Drouet Replying to: Monitorer Shoutcast avec Munin

      Hello ...

      Peux tu essayer de remplacer la ligne :

      1. sname = s["mount"].strip("/").replace(".","_")

      par la ligne suivante :

      1. sname = s["mount"].strip("/").replace(".","_").replace(":","_")

      Reply to this message

      • On 22 September 2010 at 18:56, by le dj :) Replying to: Monitorer Shoutcast avec Munin

        avec la modif, voici le message d’erreur :
        sep 22 18:50:02 - Warning: Unknown option "____" in "localdomain;localhost.localdomain:shoutcast_counts.____".
        sep 22 18:50:05 [2757] - Unable to update localdomain -> localhost.localdomain -> shoutcast_counts -> __: No such field (no "label" field defined when running plugin with "config").

        Reply to this message

        • On 22 September 2010 at 21:28, by le dj :) Replying to: Monitorer Shoutcast avec Munin

          j’ai remplacé la ligne par :
          sname = s["mount"].strip("/").replace(".","").replace(":","")
          un message d’erreur a disparu mais il y a tjs celui-là :
          sep 22 21:20:10 [26289] - Unable to update localdomain -> localhost.localdomain -> shoutcast_counts -> __: No such field (no "label" field defined when running plugin with "config").

          Reply to this message

  • On 23 September 2010 at 15:50, by le dj :) Replying to: Monitorer Shoutcast avec Munin

    J’ai essayé des trucs mais ça marche pas.

    Reply to this message

  • On 1 January 2011 at 15:53, by Alain Replying to: Monitorer Shoutcast avec Munin

    Bonjour Quentin,

    je souhaiterais savoir s’il est possible de monitorer plusieurs serveurs shoutcast avec le fichier de configuration donné ?

    Merci d’avance.

    Alain

    Reply to this message


Any message or comment?
  • (To create paragraphs, you simply leave blank lines.)

Who are you? (optional)
  • [Sign In]