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


  • Le 22 septembre 2010 à 17:21, par le dj :) En réponse à : 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 " :"

    Répondre à ce message

    • Le 22 septembre 2010 à 17:29, par Quentin Drouet En réponse à : 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(":","_")

      Répondre à ce message

      • Le 22 septembre 2010 à 18:56, par le dj :) En réponse à : 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").

        Répondre à ce message

        • Le 22 septembre 2010 à 21:28, par le dj :) En réponse à : 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").

          Répondre à ce message

  • Le 23 septembre 2010 à 15:50, par le dj :) En réponse à : Monitorer Shoutcast avec Munin

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

    Répondre à ce message

  • Le 1er janvier 2011 à 15:53, par Alain En réponse à : 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

    Répondre à ce message

Qui êtes-vous ?
Ajoutez votre commentaire ici
  • Ce formulaire accepte les raccourcis SPIP [->url] {{gras}} {italique} <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.