Start · Sprachen · PHP · Referenz · rrd_fetch

rrd_fetch

Funktion

Liest gespeicherte Zeitreihendaten aus einer RRD-Datei und gibt sie als Array zurück.

Kategorie: misc

Signatur

rrd_fetch(string $filename, array $options): array|false

Beschreibung

rrd_fetch() ist Teil der RRD-Erweiterung (Round-Robin-Database) für PHP und ermöglicht es, gespeicherte Messwerte aus einer .rrd-Datei abzufragen. Die Funktion entspricht dem CLI-Befehl rrdtool fetch und gibt Zeitreihendaten für einen definierten Zeitraum und eine Konsolidierungsfunktion zurück.

Die Rückgabe enthält Metadaten (Start-/Endzeit, Schrittgröße) sowie die eigentlichen Datenpunkte aller in der RRD-Datei gespeicherten Datenquellen (Data Sources). Damit lassen sich Messwerte für Weiterverarbeitungen, Exporte oder eigene Diagramme abrufen, ohne auf externe Diagramm-Generierung angewiesen zu sein.

Typische Anwendungsfälle sind Monitoring-Systeme (z. B. Netzwerküberwachung), Performance-Tracking oder das Exportieren historischer Messdaten. Die gewünschte Konsolidierungsfunktion (AVERAGE, MIN, MAX, LAST) sowie der Zeitraum werden über das $options-Array gesteuert.

  • AVERAGE: Durchschnittswert über den Konsolidierungszeitraum
  • MIN: Minimalwert im Zeitraum
  • MAX: Maximalwert im Zeitraum
  • LAST: Letzter gespeicherter Wert im Zeitraum

Parameter

Name Typ Default Beschreibung
$filename Pflicht string Pfad zur RRD-Datei (.rrd), aus der die Daten gelesen werden sollen.
$options Pflicht array Array mit Optionen für den Fetch-Befehl. Typischerweise enthält es die Konsolidierungsfunktion (AVERAGE, MIN, MAX, LAST) sowie optional Zeitbereichsangaben mit --start und --end (als Unix-Timestamp oder relative Angaben wie -1h). Beispiel: ['AVERAGE', '--start', '-1h', '--end', 'now'].

Rückgabewert

Typ
array|false
Beschreibung
Bei Erfolg ein assoziatives Array mit den Schlüsseln start (Unix-Timestamp des ersten Datenpunkts), end (Unix-Timestamp des letzten Datenpunkts), step (Schrittweite in Sekunden) und data (assoziatives Array der Datenquellen mit ihren Messwerten als numerisch indizierte Arrays). Bei einem Fehler wird false zurückgegeben; die Fehlermeldung kann mit rrd_error() abgerufen werden.

Beispiele

Durchschnittswerte der letzten Stunde aus einer RRD-Datei lesen

<?php
$file = '/var/lib/rrd/traffic.rrd';
$options = [
    'AVERAGE',
    '--start', '-1h',
    '--end',   'now',
];

$result = rrd_fetch($file, $options);

if ($result === false) {
    echo 'Fehler: ' . rrd_error();
} else {
    echo 'Start:    ' . date('Y-m-d H:i:s', $result['start']) . PHP_EOL;
    echo 'Ende:     ' . date('Y-m-d H:i:s', $result['end'])   . PHP_EOL;
    echo 'Schritte: ' . $result['step'] . ' Sekunden'          . PHP_EOL;

    foreach ($result['data'] as $dsName => $values) {
        echo PHP_EOL . "Datenquelle: $dsName" . PHP_EOL;
        foreach ($values as $timestamp => $value) {
            $time = date('H:i:s', $result['start'] + $timestamp * $result['step']);
            printf("  %s => %s\n", $time, is_nan((float)$value) ? 'N/A' : number_format((float)$value, 2));
        }
    }
}
Start: 2024-06-01 12:00:00 Ende: 2024-06-01 13:00:00 Schritte: 300 Sekunden Datenquelle: inOctets 12:00:00 => 1234.56 12:05:00 => 2345.67 ...

Maximalwerte eines bestimmten Zeitraums abfragen

<?php
$file = '/var/lib/rrd/cpu.rrd';
$start = strtotime('2024-05-01 00:00:00');
$end   = strtotime('2024-05-01 23:59:59');

$options = [
    'MAX',
    '--start', (string)$start,
    '--end',   (string)$end,
];

$result = rrd_fetch($file, $options);

if ($result === false) {
    echo 'Fehler beim Lesen der RRD-Datei: ' . rrd_error();
} else {
    foreach ($result['data'] as $dsName => $values) {
        $max = max(array_filter($values, fn($v) => !is_nan((float)$v)));
        echo "Maximaler Wert für '$dsName': " . number_format($max, 4) . PHP_EOL;
    }
}
Maximaler Wert für 'user': 98.1234 Maximaler Wert für 'system': 45.6789

// Wichtig · Fallstricke

Voraussetzung: Die PHP-Erweiterung rrd muss installiert und aktiviert sein (pecl install rrd bzw. Paketmanager). Sie ist nicht Teil der Standard-PHP-Distribution.

NaN-Werte: RRD-Datenbanken können unbekannte Werte (unknown) enthalten, die in PHP als NAN (Not a Number) zurückgegeben werden. Vor arithmetischen Operationen sollte daher stets is_nan() geprüft werden.

Zeitzonenproblematik: RRD-Zeitstempel sind immer UTC-basiert. Bei der Ausgabe bzw. Weiterverarbeitung ist auf die korrekte Zeitzonen-Konvertierung zu achten.

Leistung: Bei sehr großen RRD-Dateien oder langen Zeiträumen mit kleiner Schrittgröße kann die zurückgegebene Datenmenge sehr groß werden. Ggf. den Zeitraum oder die Auflösung einschränken.