Hörerzahl bei Icecast

Status
Für weitere Antworten geschlossen.

fresssh

Benutzer
hallo,
ich würde gern die hörerzahl auf icecast servern ermitteln, aber nicht über die stats.xml, sondern lokal auf dem jeweiligen streamingserver. hat jemand eine idee dazu? irgendwie muss die hörerzahl ja auch in der xml landen und an der stelle würde ich sie gerne abgreifen um mir die authentifizierung zu sparen.
grüße
 
Moin,

Leider kenne ich die icecast Software nicht selber (habe bisher nur shoutcast Server in den Fingern gehabt), aber ich würde da mal die Dokumentation (so verfügbar) untersuchen - gibt es vielleicht eine Art API-Dokumentation? Was Du im Prinzip brauchst, ist eine Schnittstelle zu der Software, über die Du den gesuchten Wert abfragen kannst (Stichwort. Webservice oder vergleichbares). Falls die Software keine Schnittstelle außer der XML-Schnittstelle bietet, dann bräuchtest Du im Prinzip ein Programm, das regelmäßig die XML-Datei parst.

LG

McCavity
 
mmh ich werde in sachen doku mal forschen. zum thema xml parsen: da du dich ja auch schon beim thema loadbalancing mit eingebracht hast, kennst du quasi schon mein vorhaben, nämlich gewichtung von servern nach rechenkapazität und auslastung.ums kurz zu machen: die user-zahl abfrage will ich ein script einbinden, welches dann in einem intervall kleiner gleich 5 minuten auf den streamingservern lokal laufen soll. und in dem zusammenhang scheint es mir nicht sehr vorteilhaft wenn sich die server alle 5 minuten bei sich selbst authentifizieren müssen. zu überwachungszwecken habe ich derzeit bereits ein perlskript laufen, welches die xml´parst, welche vorher als temps gespeichert werden, allerdings läuft die überwachung auf einem extra server. ich könnte zwar die daten vom überwachungsserver nehmen, aber damit würde dieser einen möglichen engpass darstellen wenn was schief läuft.
 
Dazu habe ich erstmal eine Verständnisfrage (wie gesagt, ich kenne den icecast Server nicht): Wie kommt man denn gewöhnlich an die stats.xml heran? Liegt die irgendwo im Dateisystem des icecast Servers, oder holt man sich die von dem mittels eines URI? Meine Vermutung wäre ja gewesen, daß man die über einen URI holt (sowas wie "http://mein.serv.er:8000/stats.xml") - in dem Fall würde ich die überhaupt nicht auf dem icecast server auswerten, sondern auf dem Loadbalancer in regelmäßigen Intervallen die Datei abfragen (könnte man - mit ein wenig Bauchschmerzen - auch gleich als Indikator "Server da / Server weg" mißbrauchen) und dann vor Ort eine kleine Tabelle (reicht ein Plain Text File im Dateiisystem) anlegen, die dann wieder vom Loadbalancing Script ausgelesen werden kann - das wäre zumindest mein bevorzugtes Vorgehen.

Beim Loadbalancing ist es normalerweise so, daß auf den geloadbalancten (was für ein Wort) Servern eigentlich gar nichts verändert werden sollte - Du solltest einen beliebigen, nach Standard aufgesetzten Server ins Loadbalancing nehmen können, ohne daß Du auf dem neuen Server erst irgendwas konfigurieren mußt. *Sämtliche* Konfiguration, Auswertung und das Balancing selbst sollten *ausschließlich* auf dem Load Balancer stattfinden. Das hat den Charme, daß die Server einfach bleiben (Du brauchst die nur nach Standard aufzusetzen, eine Fehlerquelle weniger) und genauso vereinfachst Du Dir die Fehlersuche, weil du klar zwischen dem Loadbalancing-Teil und dem eigentlichen Dienst, den Du anbietest (Stream) unterscheiden kannst.

LG

McCavity
 
genau, die xml bekommt man über einen uri. mein gedanke bei der sache war, dass die variable "hörerzahl" ja vom icecast ermittelt wird und an das xml file übergeben wird, also quasi irgendwo als ausgabewert eines programms o.ä. zur verfügung steht. ich dachte mir dass ich die hörerzahl so vielleicht iwie abgreifen könnte. aber da werde ich mich wohl mal in die doku vertiefen müssen, solange sich keine icecast-cracks zu wort melden ;)
zum thema 'alles auf dem loadbalancer laufen lassen' antworte ich am besten im loadbalancing thread :)
 
Wie im anderen Thread angesprochen, du musst die stats.xml über HTTP abrufen (geht auch mit einem Script), da dann der jeweiligen Ist-Zustand im Icecast-Prozess zurückgegeben wird, es handelt sich um dynamisch generierte Daten und nicht um eine Datei, die periodisch ins Dateisystem geschrieben wird.
 
Und genau hier beißt sich die Katze in den Schwanz, denn um an die stats.xml, bzw. deren Inhalt zu kommen, müsste sich per Benutzernamen und Passwort authentifiziert werden.
 
Is doch mit php kein wirkliches Problem:

Ich weiss leider nicht wie der URL-Aufruf beim Icecast aussieht aber das könnte als Anhalt dienen wenn der Icecast HTTP Basic Auth für das Login verwendet:
Ich nutze ein ähnliches Script um so die Daten von einem Shoutcast 2.x Abzufragen.
PHP:
// URL der stats.xml OHNE http://
$ch = curl_init('hostname.tld/stats.xml');
 
// Serverport des Icecast
curl_setopt($ch, CURLOPT_PORT, '9999');
 
// Timeout
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
 
// Authtype (http basic auth)
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
 
// Benutzerdaten (Loginname und Passwort)
curl_setopt($ch, CURLOPT_USERPWD, 'Login:Password');
 
// Rückgabedaten entgegennehmen
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
 
// Useragent, falls der Icegast einen verlangt um Daten zurückzusenden
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla (Get Stats)');
 
// Anforderung ausführen
$curl = curl_exec($ch);
 
// Fehler Abfangen und xml Daten per simplexml bereitstellen
if ($curl)
{
    $sxml = new SimpleXMLElement($curl);
}
else
{
    $sxml = 'Error';
}
 
// Beispiel um auf Hörerzahlen zuzugreifen
// bei XML Aufbau
// <Icecast>
//    <Listener>
//        <Currentlistener>25</Currentlistener>
//        <Uniquelistener>23</Uniquelistener>
//        <PeakListener>123</Peaklistener>
//    </Listener>
// ...
// </Icecast>
 
$listeners = $sxml->Icecast->Listener->Currentlistener
PHP-Curl und PHP-Simplexml sollten eigentlich bei allen PHP-Versionen > 5.0standard sein.


- MAD
 
Pff, das Problem ist kein technisches sondern dass der Fragesteller die Funktionsweise von Icecast und IPC im allgemeinen nicht versteht.
 
danke für eure antworten
dude, du magst recht haben dass ich mir die funktionsweise von icecast noch nicht im detail zu gemüte geführt habe, das ist bei dem projekt um das es hier geht auch gar nicht unmittelbar meine aufgabe. soweit zu gehen dass ich ipc im allgemeinen nicht verstehe halte ich für ein bisschen zu viel drama ;)
@madXhawk, danke für den code, ich hab zwar auch perl und php skripte für die problematik aber ich muss gestehen deins scheint mir auf den ersten blick deutlich sparsamer zu sein. hab aber noch nicht getestet.

die authentifizierung will ich mir deshalb sparen, weil diese ja natürlich rechenzeit kostet. und da die abfrage jede minute ausgeführt werden soll und im betreffenden skript noch andere abfragen ablaufen summieren sich die bearbeitungszeiten. das ist einfach der hintergrund. es funktioniert auch mit authentifizierung, aber ich dachte halt ich kann an der stelle zeit sparen, da es doch unsinnig ist wenn die kiste sich bei sich selbst anmelden muss.
 
die authentifizierung will ich mir deshalb sparen, weil diese ja natürlich rechenzeit kostet.

Achso. Jaa nee, das ist unkritisch. HTTP Basic Authentifizierung ist nicht Rechenintensiv, es wird exakt ein HTTP-Request gemacht, ob mit oder ohne Authentifizierung. Es würde das System erheblich mehr belasten, wenn Icecast fortlaufend eine stats.xml ins Dateisystem schreiben würde, auch wenn diese niemand lesen möchte. Dabei würde noch (Festplatten-) I/O anfallen, und da entsteht wesentlich schneller ein Engpass als bei der Rechenzeit.
 
Hallo fressh,

also ich nutze einen ähnlichen Code zum Abfragen des Shoutcast für die Songanzeige auf der Webseite. Normaler Interval ist alle 60 Sekunden und sogar alle 15 Sekunden für die Songanzeige auf der Webseite (Nur wenn User auf der Seite sind, die Abfrage ist jedoch gecached, damit nicht für jeden User eine Abfrage statfindet) Ich konnte bisher keine merklichen Änderungen in der CPU Auslastung erkennen weder beim 60 Sek. noch beim 15 Sek Abfrageinterval mit Auth.
Ich denke also alle 60 sek die stats.xml abzufragen sollte nicht ins Gewicht fallen. Zudem glaube ich das der Icecast genau wie der Shoutcast keine andere Schnittstelle nach aussen bietet. Dürfte also ohne Eingriff in die Icecastsoftware keine andere Mglichkeit geben.

Gruss
MAD
 
hey,
es ging mir dabei nicht so sehr um die cpu sondern um die generelle abarbeitungszeit. aber ich habs jetzt so gelöst, dass 2 skripte per cron laufen: das erste lädt die xml als string runter und das zweite skript verarbeitet diesen string und führt die restlichen abfragen durch.


die Abfrage ist jedoch gecached, damit nicht für jeden User eine Abfrage statfindet
wie realisierst du diesen cache?
grüße
 
Da unsere Webseite auf dem phpBB3 basiert nutze ich hier die interne cachefunktion vom phpBB.
Geht aber auch so recht einfach, zumindest mit php.
Du holst dir die Daten, packst diese in ein array, serialisierst dieses (php serialize() Funktion) und schreibst es mit einem Timestamp in eine Textdatei.
Bei jedem Aufruf holst du die Daten aus der Textdatei unserialisierst sie (php unserialize() Funktion) und prüfst ob der Timestamp älter als x Sekunden ist.
Wenn nein, gibst du die Daten aus der Textdatei aus, wenn ja holst du neue Daten gibst sie aus und schriebst diese mit einem neuen Timestamp in die Textdatei,

Dies hat natürlich den Nachteil, das du eine Menge lesenden Zugriff auf die Cachedatei hast, was idR. aber schneller sein sollte als Abfragen an den Server zu senden.
Lohnt sich aber im Grunde auch nur bei der Anzeige der Songs auf der Webseite die alle 15 Sekunden Aktualisiert wird. (Bei 30 Besuchern 1 Abfrage an den Streamserver und 31 [30 lesend, 1 schreibend] Zugriffe auf die Cachedatei auf dem Webserver)

- MAD
 
ich frage wegen meinem loadbalancing(redirecting- ;) ) projekt. im moment läuft hab ich es ähnlich gelöst wie du mit deinen titeln, die ip adresse vom geeignesten server kommt in eine textdatei welche beim aufruf eines streams geöffnet wird um den inhalt zurückzugeben. wie du schon sagst, das erzeugt eine menge zugriffe, ich dachte es gibt da evtl eine elegantere möglichkeit.
grüße
 
Du kannst die Textdatei in ein tmpfs legen, das ist 'ne Ramdisk im Arbeitsspeicher. Belegt nur dann RAM, wenn auch was drin liegt. Einfach irgendwo mounten:
Code:
mount tmpfs -t tmpfs /irgendwo
.

Noch einfacher ist, PHP-APC zu benutzen. Das ist einerseits ein Opcode-Cache (speichert die compilierten PHP-Scripte im RAM und nutzt diese beim nächsten Request anstatt immer neu zu interpretieren), andererseits kannst du auch eigene Werte in dessen Cache legen. Der Cache liegt im Arbeitsspeicher, es gibt also keine Festplattenzugriffe wenn du da was reintust oder rausholst.

Standardprozedere geht ungefähr so:
PHP:
$server = apc_fetch('server_fuer_blah');
if ($server === FALSE) {
    // Nichts im Cache gefunden, muss Daten besorgen
    $server = bestimme_den_server_fuer_blah();
    apc_store('server_fuer_blah', $server);
}

Zu beachten ist, dass das ein Cache ist, keine Datenbank. Das heisst man muss immer damit rechnen, dass apc_fetch() keine Daten zurückgibt (z.B. wenn der Server neu gestartet wurde oder der Wert aus dem Cache fliegt weil kein Platz mehr ist). Installation ist super einfach, Debian-Paket php5-apc oder RedHat RPM php-pecl-apc installieren und den Webserver neustarten. Wenn du mehrere verteilte Webserver hast, kannst du auch Memcache benutzen, der macht im Prinzip das selbe aber kann auf mehreren Server verteilt werden. APC funktioniert immer nur innerhalb eines Prozesses (z.B. Apache mod_php oder php-fpm)
 
super tip, danke dafür!
ich hab apc installiert und auch die ini datei angepasst, aber irgendwie funktioniert das nicht. vielleicht liegts ja am funktionsprinzip des cache, der funktioniert ja nur innerhalb eines prozesses wie du sagst. was bedeutet das für die skripte in denen ich mit dem cache arbeiten will? an der stelle muss ich wohl einsehen dass meine kenntnisse in sachen ipc doch eher rudimentär sind ;)
ich habe folgendes testskript geschrieben:
PHP:
//variable_cachen.php :
<?
$a = 1234;
apc_store('test', $a);
?>
 
//cache_abrufen.php :
<?
var_dump(apc_fetch('test'));
?>

der aufruf beider skripte bringt folgende meldung (bei beiden identisch, abgesehen vom namen) :
Code:
PHP Notice:  Unknown: 1. h->opened_path=[/var/www/cache_abrufen.php]  h->filename=[cache_abrufen.php]
in Unknown on line 0
PHP Notice:  Unknown: apc_cache_find [101840]
in Unknown on line 0
PHP Notice:  Unknown: 2. h->opened_path=[/var/www/cache_abrufen.php]  h->filename=[cache_abrufen.php]
in Unknown on line 0
PHP Notice:  Unknown: apc_cache_make_file_entry: entry->data.file.filename is [/var/www/cache_abrufen.php]
in Unknown on line 0
PHP Notice:  Unknown: Inserting [/var/www/cache_abrufen.php]
in Unknown on line 0

wo könnte der fehler liegen?
grüße
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben