Signatur
Beschreibung
RRDCreator ist Teil der PECL-Erweiterung rrd und ermöglicht es, eine neue RRD-Datenbankdatei programmatisch zu erzeugen. RRD (Round Robin Database) ist ein System zur effizienten Speicherung von Zeitreihendaten, das in der Netzwerk- und Systemüberwachung weit verbreitet ist (z. B. in Tools wie Cacti oder Munin).
Mit RRDCreator definiert man zunächst die Datei, den Startzeitpunkt und den Abtastschritt (Step), fügt dann über addDataSource() eine oder mehrere Datenquellen (DS) hinzu und legt mit addArchive() Konsolidierungsarchive (RRA) fest, die bestimmen, wie lange und in welcher Granularität Daten gespeichert werden. Der eigentliche Schreibvorgang auf die Festplatte erfolgt erst durch den Aufruf von save().
Typische Anwendungsfälle sind das Aufzeichnen von CPU-Auslastung, Netzwerkdurchsatz, Temperaturwerten oder anderen metrischen Zeitreihendaten, bei denen ältere Datenpunkte automatisch zusammengefasst (konsolidiert) werden sollen, um Speicherplatz zu sparen.
Die Erweiterung muss über PECL installiert sein (pecl install rrd). Auf vielen Linux-Distributionen ist außerdem das Paket librrd-dev als Abhängigkeit erforderlich.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $filename Pflicht | string | Pfad zur RRD-Datei, die erstellt werden soll (z. B. /var/lib/rrd/traffic.rrd). |
|
| $startTime | int | -1 | Unix-Timestamp, ab dem die Datenbank Einträge akzeptiert. Wird -1 übergeben, verwendet die Bibliothek time() - 10 als Startzeitpunkt. |
| $step | int | 300 | Abtastintervall in Sekunden (Step). Gibt an, in welchem Rhythmus Daten in die Datenbank geschrieben werden sollen. Standard ist 300 (5 Minuten). |
Beispiele
Einfache RRD-Datei für Netzwerktraffic anlegen
<?php
// Neue RRD-Datei anlegen, Startzeit jetzt minus 10 Sekunden, 5-Minuten-Step
$creator = new RRDCreator('/var/lib/rrd/traffic.rrd', time() - 10, 300);
// Datenquellen definieren: eingehend und ausgehend in Bytes/s
$creator->addDataSource('traffic_in:COUNTER:600:0:U');
$creator->addDataSource('traffic_out:COUNTER:600:0:U');
// Archiv 1: Mittelwerte, keine Lücken, 2016 Einträge à 5 Minuten = 7 Tage
$creator->addArchive('AVERAGE:0.5:1:2016');
// Archiv 2: Mittelwerte, je 12 Steps (= 1 Stunde) konsolidiert, 1440 Einträge = 60 Tage
$creator->addArchive('AVERAGE:0.5:12:1440');
// Archiv 3: Maximalwerte, je 288 Steps (= 1 Tag), 365 Einträge = 1 Jahr
$creator->addArchive('MAX:0.5:288:365');
// Datei tatsächlich auf die Festplatte schreiben
if ($creator->save()) {
echo 'RRD-Datei erfolgreich erstellt.' . PHP_EOL;
} else {
echo 'Fehler beim Erstellen der RRD-Datei.' . PHP_EOL;
}
CPU-Auslastung erfassen – RRD mit GAUGE-Datenquelle
<?php
// RRD für CPU-Prozentauslastung mit 1-Minuten-Step
$creator = new RRDCreator('/tmp/cpu.rrd', time() - 10, 60);
// GAUGE: Wert wird direkt gespeichert (kein Differenzieren wie bei COUNTER)
$creator->addDataSource('cpu_usage:GAUGE:120:0:100');
// Detailarchiv für 24 Stunden (1440 Einträge à 1 Minute)
$creator->addArchive('AVERAGE:0.5:1:1440');
// Tagesarchiv für 1 Jahr (365 Einträge, je 1440 Minuten = 1 Tag konsolidiert)
$creator->addArchive('AVERAGE:0.5:1440:365');
$creator->addArchive('MAX:0.5:1440:365');
$creator->addArchive('MIN:0.5:1440:365');
if (!$creator->save()) {
throw new RuntimeException('Konnte CPU-RRD-Datei nicht erstellen.');
}
echo 'cpu.rrd angelegt.' . PHP_EOL;
// Wichtig · Fallstricke
Installation: Die rrd-Erweiterung ist nicht im PHP-Kern enthalten und muss über PECL installiert werden: pecl install rrd. Zusätzlich wird die C-Bibliothek librrd benötigt (apt install librrd-dev oder yum install rrdtool-devel).
Datenquellen-Syntax (DS): Das Format für addDataSource() lautet name:typ:heartbeat:min:max. Gültige Typen sind COUNTER, GAUGE, DERIVE, DCOUNTER, DDERIVE und ABSOLUTE. Der Heartbeat gibt an, nach wie vielen Sekunden ohne Messwert UNKNOWN eingetragen wird.
Archiv-Syntax (RRA): Das Format für addArchive() lautet CF:xff:steps:rows, wobei CF die Konsolidierungsfunktion ist (AVERAGE, MIN, MAX, LAST) und xff der maximal erlaubte Anteil an UNKNOWN-Werten.
Datei überschreiben: Existiert die Zieldatei bereits, schlägt save() fehl. Die alte Datei muss vorher explizit gelöscht werden (unlink()).