Hello,
Wenn Du möchtest, dass hier mal jemand was bastelt, dann solltest Du mal ein paar Musterdaten (so 100 DS) bereitstellen als Datei. Dann steigen die Chancen enorm :-)
Das wäre super..hier eine csv-Datei mit Daten aus der Tabelle..
http://www.file-upload.net/download-8795865/daten.csv.html
Ich habe Dir mal eine Minimallösung mit PHP gebastelt.
Dazu gibt es aber noch einiges zu sagen:
Zur Zeit filtert die Lösung mur einen Service und berechnet den.
Daraus kann man nun eine Funktion machen, vorab in einem Wrapper die Services extrahieren und dann die Liste für jeden gefundenen durchgehen. Die Datei in einem Durchlauf für alle Services durchzugehen, könnte kritisch werden ->
Da die Liste unbedingt nach dem Timestamp sortiert sein muss, habe ich diese für _einen_ Service vollständig in den Speicher geladen. Wenn die Datenmenge pro Service aber zu groß wird, geht das nicht mehr.
Dass die Anzahl der Services zu groß werden wird, dass man deren Namen nicht mehr im Speicher sammeln kann (steht ja dann jeder nur einmal drin), glaube ich weniger.
Außerdem muss die CSV-Datei "sauber" sein! Das bedeutet, keine leeren Zeilen, alle Zeilen haben dieselben Spalten. Man kann auch das abfangen, aber dann wird es langsam aufwändig.
Du solltest also eine Einschätzung vornehmen, wieviele Eintragungen pro Service maximal kommen werden. Bereits berechnete Daten sollten in eine Archivdatei ausgelagert werden.
Bei heutigen Speichergrößen sind 10MB Dateigröße mit 5 Services nicht zuviel, oder 100MB mit 50 Services, usw., soweit die ungefähr gleich viele Zeilen produzieren...
Es geht beim Speicher im Prinzip immer nur um das Sortieren.
Wenn die Datei allerdings garantiert nach Datum+Zeit sortiert vorliegt, kann die fast so groß werden, bis Deine Platte platzt. Etwas Platz brauchst Du dann sicherlich noch für die Ergebnisse und das Script :-))
Allerdings will man ja auch nicht jedes Mal von vorne anfangen zu rechnen, also würde ich schon "Monatsabschlüsse" machen.
Wenn Dir PHP etwas nützt, kann ich Dir das gerne fertig machen. Kleiner Obolus für Strom und Internet wird immer gerne entgegen genommen ;-)
<?php ### logbuch.php ### utf-8 ### ÄÖÜäöü
#*---------------------------------
# Datei nach Datum und Zeit sortiert!
# (alte Zeit) = Startzeit
# n = aktiver Status
#
# | -> nächster Datensatz
# | Status[n] += (neue Zeit) - (alte Zeit)
# | n = neuer Status
# | (alte Zeit) = (neue Zeit)
#
# Ergebnisse aus Status[x] auslesen
#*---------------------------------
$fp = fopen('daten.csv', 'rb');
$_list = array();
## erste Zeile mit Überschriften wegschneiden
$_rec = fgetcsv($fp, 0);
$alias = 'server1_check-net-snmp';
#$alias = 'server1_check-net-snmp_disk-io-bytes_device-sda';
$i = 0;
while ($_rec = fgetcsv($fp, 0))
{
if ($_rec[0] === $alias)
{
$_list['alias'][$i] = $_rec[0];
$_list['datetime'][$i] = $_rec[1];
$_list['timestamp'][$i] = strtotime($_rec[1]);
$_list['status'][$i] = $_rec[2];
$i++;
}
}
fclose($fp);
echo "<pre>\r\n";
echo htmlspecialchars(print_r($_list,1)) . "\r\n";
asort($_list['timestamp'], SORT_NUMERIC);
echo ($key = key($_list['timestamp'])) . ',' . $_list['timestamp'][$key] . "\r\n";
echo "</pre>\r\n";
$_status[0] = 0;
$_status[1] = 0;
$_status[2] = 0;
$time = $_list['timestamp'][$key];
$stat = $_list['status'][$key];
# ersten Datensatz (nur Index) löschen:
unset($_list['timestamp'][$i]);
foreach ($_list['timestamp'] as $key => $value)
{
$_status[$stat] += $value - $time;
$stat = $_list['status'][$key];
$time = $value;
}
echo "<pre>\r\n";
echo htmlspecialchars(print_r($_status,1)) . "\r\n";
echo "</pre>\r\n";
?>
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg