Die Aufzeichnung müsste von der Auswertung völlig entkoppelt werden.
Ich arbeite daran, das für mein cacti Monitoring umzubauen. Cacti ist auch ein *.rrd basierendes Monitoringsystem. Es besteht darin, zum einen eine Umgebung für ein periodisches Abfragen zu bieten und zum anderen das on-the-fly Generieren von vordefinierten Grafiken.
Cacti allerdings erwartet, dass jeder Datenwert instant ermittelt wird. Also nur das Auslesen von vorhandenen Daten geht. Sekundenlange Messdauer geht nicht.
Also bin ich dabei, einen kleinen Dienst zu schreiben (shellskript), der in Schleife ständig alle konfigurierten Kanäle durchläuft. Pro Kanal misst er eine vorgegebene Anzahl von Sekunden und schreibt das Ergebnis (Zeitstempel : Datendurchsatz) in eine Textdatei mit der Kanalnummer. Nach dem ersten Komplettdurchlauf aller Kanäle gibts für jeden Kanal eine Textdatei, in der der Durchsatz zum letzten gemessenen Zeitstempel steht. Die Textdateien werden ständig neu erstellt, weil der Dienst ja reihum ständig neu misst und neue Werte erhält. Es stehen also immer die jeweils zuletzt gelesenen Daten drin.
Cacti hat nun seinerseits alle Kanäle konfiguriert und fragt innerhalb seines integrierten Schedulers nach und nach sämtliche Kanäle durch. Ich muss noch ein simples cacti Abfragemodul schreiben, das als Input die von cacti gelieferte Kanalnummer entgegennimmt, die dazugehörige Textdatei ausliest, und Zeitstempel : Datendurchsatz an cacti zurückliefert.
Cacti erkennt automatisch, ob es diesen Zeitstempel schonmal bekommen hat, und trägt bei neuem Zeitstempel den Durchsatzwert in das *.rrd seines Kanals ein. Das Konzept von *.rrd kommt hier gut zum tragen: man benötigt keine Synchronisierung zwischen ermitteln der Daten und wegschreiben ins *.rrd. Stattdessen füttert man die *.rrd mit irgendeinem Timestamp, und innerhalb des *.rrd wird das in das vordefinierte Zeitschema mit dem tick-Intervall gepresst und hineingeschrieben. Dabei wird gewichtet und gemittelt, je nach Position des Zeitstempel eher vorne oder eher hinten im Intervall bei mehreren Datenwerten innerhalb desselben Intervalls. Damit muss man sich also gar nicht rumschlagen.
Mehr ist das dann nicht.
Aufsummierung, Aggregierung und Grafik-Erstellung macht dann cacti, kein selbstgeschriebenes Skript.
Mein Problem mit der Umsetzung liegt eigentlich an was anderem: Der TV-Tuner hängt nicht an der Maschine, auf der Cacti läuft. Ich muss die Daten also rüber auf den Cacti Server schaffen. Die generische Lösung für Netzzugriff in cacti ist snmp, also bin ich statt des cacti Abfragemodul dabei, die Inhalte der Durchsatz-Textdateien in einem snmp-Tree im snmp Daemon abzubilden, damit ich das dann in cacti dann einfach mit Bordmitteln einlesen kann. Da habe ich bisher noch keinen Bock gehabt, diese Fummelarbeit zu machen. Eigentlich geht das super leicht mit dem "extend" oder "exec" Keyword in der snmpd.conf - nur ein Einzeiler - nur habe ich bisher noch keine Zeit gehabt das exakt auszutüfteln.