EnglischFranzösischSpanisch

OnWorks-Favicon

cdeftutorial – Online in der Cloud

Führen Sie cdeftutorial beim kostenlosen Hosting-Anbieter OnWorks über Ubuntu Online, Fedora Online, den Windows-Online-Emulator oder den MAC OS-Online-Emulator aus

Dies ist der Befehl cdeftutorial, der beim kostenlosen Hosting-Anbieter OnWorks mit einer unserer zahlreichen kostenlosen Online-Workstations wie Ubuntu Online, Fedora Online, dem Windows-Online-Emulator oder dem MAC OS-Online-Emulator ausgeführt werden kann

PROGRAMM:

NAME/FUNKTION


cdeftutorial – Alex van den Bogaerdts CDEF-Tutorial

BESCHREIBUNG


Absicht dieses Dokuments: einige Beispiele für die häufig verwendeten Teile von bereitzustellen
Die CDEF-Sprache von RRDtool.

Wenn Sie der Meinung sind, dass eine wichtige Funktion nicht richtig erklärt wird, und wenn Sie sie ergänzen
Da das Dokument für die meisten Benutzer von Nutzen wäre, bitten Sie mich, es hinzuzufügen. Ich werde dann versuchen bereitzustellen
Eine Antwort finden Sie in der nächsten Version dieses Tutorials. Kein Feedback bedeutet keine Änderungen! Ergänzungen
zu diesem Dokument sind ebenfalls herzlich willkommen. – Alex van den Bogaerdt[E-Mail geschützt] >

Warum fehlen uns die Worte. Lernprogramm?
Einer der leistungsstarken Teile von RRDtool ist seine Fähigkeit, alle Arten von Berechnungen durchzuführen
Daten, die aus seinen Datenbanken abgerufen werden. Die vielen Optionen und die Syntax von RRDtool machen es jedoch möglich
für den durchschnittlichen Benutzer schwer zu verstehen. Die Handbücher erklären gut, was
diese Optionen reichen aus; Sie erklären jedoch nicht im Detail, warum dies der Fall ist (und sollten dies auch nicht tun).
nützlich. Wie bei meinem RRDtool-Tutorial: Wenn Sie ein einfaches Dokument in einfacher Sprache möchten
sollte dieses Tutorial lesen. Wenn Sie mit der offiziellen Dokumentation zufrieden sind, finden Sie sie möglicherweise
Dieses Dokument ist zu einfach oder sogar langweilig. Wenn Sie sich entscheiden, dieses Tutorial zu lesen, werde ich es auch tun
Ich gehe davon aus, dass Sie mein anderes Tutorial gelesen und vollständig verstanden haben.

Mehr Lesen
Wenn Sie Schwierigkeiten mit der Art und Weise haben, wie ich es zu erklären versuche, lesen Sie bitte die von Steve Rader
rpntutorial. Es kann Ihnen helfen zu verstehen, wie das alles funktioniert.

Was sind CDEFs?


Wenn Sie Daten von einem RRD abrufen, verwenden Sie eine „DEF“, um mit diesen Daten zu arbeiten. Denk an
es als eine Variable, die sich im Laufe der Zeit ändert (wobei die Zeit die x-Achse ist). Der Wert davon
Variable ist das, was zu diesem bestimmten Zeitpunkt in der Datenbank gefunden wird, und Sie können keine Aktionen ausführen
Änderungen daran. Dafür sind CDEFs da: Sie übernehmen Werte von DEFs und führen sie aus
Berechnungen dazu.

Syntax


DEF:var_name_1=some.rrd:ds_name:CF
CDEF:var_name_2=RPN_expression

Sie definieren zunächst „var_name_1“ als Daten, die von der in RRD gefundenen Datenquelle „ds_name“ gesammelt werden
„some.rrd“ mit Konsolidierungsfunktion „CF“.

Gehen Sie davon aus, dass der SNMP-Zähler ifInOctets in mrtg.rrd als DS „in“ gespeichert ist. Dann ist die
Die folgende DEF definiert eine Variable für den Durchschnitt dieser Datenquelle:

DEF:inbytes=mrtg.rrd:in:AVERAGE

Angenommen, Sie möchten Bits pro Sekunde anzeigen (anstelle der im gespeicherten Bytes pro Sekunde).
Datenbank.) Sie müssen eine Berechnung (daher „CDEF“) für die Variable „inbytes“ definieren und verwenden
diese Variable (inbits) anstelle des Originals:

CDEF:inbits=inbytes,8,*

Dies weist RRDtool an, Inbytes mit acht zu multiplizieren, um Inbits zu erhalten. Wie das geht, erkläre ich später
funktioniert. In den Grafik- oder Druckfunktionen können Sie jetzt Inbits dort verwenden, wo Sie es auch verwenden würden
andernfalls Inbyte.

Beachten Sie, dass der im CDEF verwendete Variablenname (inbits) nicht mit dem Variablennamen identisch sein darf
in der DEF benannt (in Bytes)!

RPN-Ausdrücke


RPN ist die Abkürzung für Reverse Polish Notation. Es funktioniert wie folgt. Sie geben die Variablen ein
oder Zahlen auf einem Stapel. Sie legen auch Operationen (zu erledigende Dinge) auf dem Stapel und diesem Stapel ab
wird dann bearbeitet. Das Ergebnis wird auf den Stapel gelegt. Am Ende sollte es so sein
genau eine Zahl übrig: das Ergebnis der Operationsreihe. Falls nicht genau
Eine Nummer übrig, RRDtool wird sich lautstark beschweren.

Die obige Multiplikation mit acht sieht folgendermaßen aus:

1. Beginnen Sie mit einem leeren Stapel

2. Legen Sie den Inhalt der Variablen inbytes auf den Stapel

3. Legen Sie die Zahl Acht auf den Stapel

4. Legen Sie die Operation „Multiplizieren“ auf den Stapel

5. Verarbeiten Sie den Stapel

6. Rufen Sie den Wert vom Stapel ab und fügen Sie ihn in die Variable inbits ein

Wir machen jetzt ein Beispiel mit reellen Zahlen. Angenommen, die Variable inbytes hätte einen Wert
10, der Stapel wäre:

1. ||

2. |10|

3. |10|8|

4. |10|8|*|

5. |80|

6. ||

Beim Verarbeiten des Stapels (Schritt 5) wird ein Wert vom Stapel abgerufen (von rechts bei
Schritt 4). Dies ist die Operation „Multiplizieren“, bei der zwei Werte als Eingabe vom Stapel genommen werden.
Das Ergebnis wird wieder auf den Stapel gelegt (in diesem Fall der Wert 80). Für die Multiplikation gilt:
Die Reihenfolge spielt keine Rolle, aber für andere Operationen wie Subtraktion und Division schon.
Generell gilt folgende Reihenfolge:

y = A - B -> y=minus(A,B) -> CDEF:y=A,B,-

Das ist nicht sehr intuitiv (zumindest glauben die meisten Leute das nicht). Für die Funktion f(A,B)
Sie kehren die Position von „f“ um, aber nicht die Reihenfolge der Variablen.

weiterverarbeitende Industrie deine Wünsche zu RPN


Machen Sie sich zunächst ein klares Bild davon, was Sie tun möchten. Teilen Sie das Problem in kleinere Teile auf
Portionen, bis sie nicht mehr geteilt werden können. Dann ist es ziemlich einfach, Ihre zu konvertieren
Ideen in RPN.

Angenommen, Sie haben mehrere RRDs und möchten darin einige Zähler addieren. Diese könnten
Dies können zum Beispiel die Zähler für jede WAN-Verbindung sein, die Sie überwachen.

Sie haben:

router1.rrd mit link1in link2in
router2.rrd mit link1in link2in
router3.rrd mit link1in link2in

Angenommen, Sie möchten alle diese Zähler addieren, mit Ausnahme von link2in im Inneren
router2.rrd. Sie müssen Folgendes tun:

(In diesem Beispiel bedeutet „router1.rrd:link1in“ den DS link1in innerhalb des RRD router1.rrd)

router1.rrd:link1in
router1.rrd:link2in
router2.rrd:link1in
router3.rrd:link1in
router3.rrd:link2in
-------------------- +
(Ergebnis der Summe)

Als mathematische Funktion könnte dies geschrieben werden:

"add(router1.rrd:link1in , router1.rrd:link2in , router2.rrd:link1in , router3.rrd:link1in
, router3.rrd:link2.in)“

Definieren Sie mit RRDtool und RPN zunächst die Eingaben:

DEF:a=router1.rrd:link1in:AVERAGE
DEF:b=router1.rrd:link2in:AVERAGE
DEF:c=router2.rrd:link1in:AVERAGE
DEF:d=router3.rrd:link1in:AVERAGE
DEF:e=router3.rrd:link2in:AVERAGE

Die mathematische Funktion lautet nun: „add(a,b,c,d,e)“

In RPN gibt es keinen Operator, der mehr als zwei Werte summiert, Sie müssen also mehrere Werte ausführen
Ergänzungen. Sie addieren a und b, c zum Ergebnis, d zum Ergebnis und e zum Ergebnis
Ergebnis.

push a: Ein Stapel enthält den Wert von a
drücke b und füge hinzu: b,+ Stapel enthält das Ergebnis von a+b
c drücken und hinzufügen: c,+ Stack enthält das Ergebnis von a+b+c
drücke d und füge hinzu: d,+ Stapel enthält das Ergebnis von a+b+c+d
Drücken Sie e und fügen Sie hinzu: e,+ Stapel enthält das Ergebnis von a+b+c+d+e

Was hier berechnet wurde, würde wie folgt niedergeschrieben werden:

( ( ( (a+b) + c) + d) + e) ​​>

Dies ist in RPN: „CDEF:result=a,b,+,c,+,d,+,e,+“

Das ist richtig, aber es kann den Menschen klarer gemacht werden. Es spielt keine Rolle, ob Sie a hinzufügen
zu b hinzufügen und dann c zum Ergebnis hinzufügen oder zuerst b zu c hinzufügen und dann a zum Ergebnis hinzufügen. Das
ermöglicht es, die RPN in „CDEF:result=a,b,c,d,e,+,+,+,+“ umzuschreiben
unterschiedlich bewertet:

Schieben Sie den Wert der Variablen a auf den Stapel: a
Schieben Sie den Wert der Variablen b auf den Stapel: ab
Schieben Sie den Wert der Variablen c auf den Stapel: abc
Push-Wert der Variablen d auf den Stapel: abcd
Push-Wert der Variablen e auf den Stapel: abcde
Push-Operator + auf den Stapel: abcde +
und verarbeite es: abc P (wobei P == d+e)
Schiebeoperator + auf den Stapel: abc P +
und verarbeite es: ab Q (wobei Q == c+P)
Schiebeoperator + auf den Stapel: ab Q +
und verarbeite es: a R (wobei R == b+Q)
Push-Operator + auf dem Stapel: ein R +
und verarbeite es: S (wobei S == a+R)

Wie Sie sehen können, wird der RPN-Ausdruck „a,b,c,d,e,+,+,+,+,+“ ausgewertet
„((((d+e)+c)+b)+a)“ und es hat das gleiche Ergebnis wie „a,b,+,c,+,d,+,e,+“. Das nennt man
das Kommutativgesetz der Addition, aber Sie können dies sofort vergessen, solange Sie
Denken Sie daran, was es bedeutet.

Schauen Sie sich nun einen Ausdruck an, der eine Multiplikation enthält:

Zuerst in der normalen Mathematik: „Ergebnis sei = a+b*c“. In diesem Fall können Sie die Reihenfolge nicht auswählen
Wenn Sie selbst möchten, müssen Sie mit der Multiplikation beginnen und dann a hinzufügen. Sie können Änderungen vornehmen
Wenn Sie die Position von b und c ändern, dürfen Sie die Position von a und b nicht ändern.

Dies müssen Sie bei der Konvertierung dieses Ausdrucks in RPN berücksichtigen. Lies es
als: „Füge das Ergebnis von b*c zu a hinzu“ und dann ist es einfach, den RPN-Ausdruck zu schreiben:
„result=a,b,c,*,+“ Ein anderer Ausdruck, der dasselbe zurückgeben würde: „result=b,c,*,a,+“

In der normalen Mathematik kann es vorkommen, dass Sie auf etwas wie „a*(b+c)“ stoßen, das auch umgerechnet werden kann
in RPN. Die Klammer weist Sie lediglich darauf hin, zuerst b und c zu addieren und dann a mit zu multiplizieren
Ergebnis. Auch hier ist es jetzt einfach, es in RPN zu schreiben: „result=a,b,c,+,*“. Beachten Sie, dass dies der Fall ist
einem der Ausdrücke im vorherigen Absatz sehr ähnlich, nur die Multiplikation
und der Zusatz wechselte die Stelle.

Wenn Sie Probleme mit RPN haben oder RRDtool sich beschwert, ist das normalerweise eine gute Sache
den Stapel auf ein Blatt Papier schreiben und sehen, was passiert. Halten Sie das Handbuch bereit
und geben Sie vor, RRDtool zu sein. Ich bin mir sicher, dass Sie einfach alle Berechnungen von Hand durchführen müssen, um zu sehen, was passiert
Dadurch werden die meisten, wenn nicht alle Probleme, auf die Sie stoßen, gelöst.

Manche besondere Zahlen


Die unbekannt Wert
Manchmal schlägt die Erfassung Ihrer Daten fehl. Dies kann sehr häufig vorkommen, insbesondere wenn
Abfragen über besetzte Links. RRDtool kann so konfiguriert werden, dass ein (oder sogar mehrere)
unbekannte(n) Wert(e) und berechnen Sie das fehlende Update. Sie können beispielsweise Ihre abfragen
Gerät jede Minute. Dabei entsteht pro Minute ein sogenannter PDP oder primärer Datenpunkt.
Wenn Sie Ihre RRD so definiert haben, dass sie eine RRA enthält, die 5-Minuten-Werte speichert, benötigen Sie fünf davon
diese PDPs, um einen CDP (konsolidierten Datenpunkt) zu erstellen. Diese PDPs können in unbekannt werden
zwei Fälle:

1. Die Updates liegen zu weit auseinander. Dies wird über die Einstellung „Heartbeat“ abgestimmt.

2. Das Update wurde absichtlich auf unbekannt gesetzt, indem kein Wert eingefügt wurde (anhand der Vorlage).
Option) oder indem Sie „U“ als einzufügenden Wert verwenden.

Wenn ein CDP berechnet wird, bestimmt ein anderer Mechanismus, ob dieser CDP gültig ist oder nicht. Wenn
Es sind zu viele PDPs unbekannt, das CDP ist ebenfalls unbekannt. Dies wird durch die bestimmt
xff-Faktor. Bitte beachten Sie, dass eine unbekannte Zähleraktualisierung zu zwei unbekannten PDPs führen kann! Wenn
Sie erlauben nur einen unbekannten PDP pro CDP, dadurch wird der CDP unbekannt!

Angenommen, der Zähler erhöht sich um eins pro Sekunde und Sie rufen ihn jede Minute ab:

Zählerwert resultierende Rate
10'000
10'060 1; (10'060-10'000)/60 == 1
10'120 1; (10'120-10'060)/60 == 1
unbekannt unbekannt; Sie kennen den letzten Wert nicht
10'240 unbekannt; Sie kennen den vorherigen Wert nicht
10'300 1; (10'300-10'240)/60 == 1

Würde der CDP aus den letzten fünf Updates berechnet, käme er auf zwei unbekannte PDPs
und drei bekannte PDPs. Wenn xff auf 0.5 gesetzt worden wäre, was übrigens üblich ist
Verwendeter Faktor, der CDP hätte einen bekannten Wert von 1. Wenn xff dann auf 0.2 gesetzt worden wäre
der resultierende CDP wäre unbekannt.

Sie müssen die richtigen Werte für Heartbeat, Anzahl der PDPs pro CDP und xff festlegen
Faktor. Wie Sie dem vorherigen Text entnehmen können, definieren sie das Verhalten Ihrer RRA.

Arbeiten mit unbekannt die Datenerfassung in deine Datenbank
Wie Sie im vorherigen Kapitel gelesen haben, können Einträge in einer RRA auf das Unbekannte gesetzt werden
Wert. Wenn Sie Berechnungen mit dieser Art von Werten durchführen, muss das Ergebnis ebenfalls unbekannt sein.
Das bedeutet, dass ein Ausdruck wie „result=a,b,+“ unbekannt ist, wenn entweder a oder b vorhanden ist
Unbekannt. Es wäre falsch, den unbekannten Wert einfach zu ignorieren und den Wert von zurückzugeben
anderer Parameter. Wenn Sie dies tun, gehen Sie davon aus, dass „unbekannt“ „Null“ bedeutet, was jedoch nicht der Fall ist
wahr.

Es gab einen Fall, in dem jemand über ein Jahr lang Daten sammelte. Ein neues Stück
Die Ausrüstung wurde installiert, ein neues RRD erstellt und die Skripte geändert, um ein hinzuzufügen
Zähler aus der alten Datenbank und einen Zähler aus der neuen Datenbank. Das Ergebnis war
enttäuschend, ein großer Teil der Statistiken schien auf mysteriöse Weise verschwunden zu sein ...
Das war natürlich nicht der Fall, Werte aus der alten Datenbank (bekannte Werte) wurden zu den Werten addiert
aus der neuen Datenbank (unbekannte Werte) und das Ergebnis war unbekannt.

In diesem Fall ist es durchaus sinnvoll, einen CDEF zu verwenden, der unbekannte Daten in Null umwandelt.
Die Zähler des Geräts waren unbekannt (schließlich war es noch nicht installiert!), aber Sie wissen es
dass die Datenrate durch das Gerät Null sein musste (aus dem gleichen Grund: das war es).
nicht installiert).

Nachfolgend finden Sie einige Beispiele, die diese Änderung bewirken.

Unendlichkeit
Unendliche Daten sind eine andere Form einer speziellen Zahl. Es kann nicht grafisch dargestellt werden, da von
Definition würden Sie niemals den unendlichen Wert erreichen. Sie können an Positives denken und
negativ unendlich, abhängig von der Position relativ zum Nullpunkt.

RRDtool ist in der Lage, die Unendlichkeit darzustellen (nicht grafisch darzustellen!), indem es bei seinem aktuellen Wert anhält
Maximum (für positive Unendlichkeit) oder Minimum (für negative Unendlichkeit), ohne dies zu wissen
Maximum Minimum).

Infinity in RRDtool wird hauptsächlich zum Zeichnen einer AREA verwendet, ohne deren Vertikale zu kennen
Maße. Sie können sich das so vorstellen, als würden Sie einen Bereich mit unendlicher Höhe zeichnen und anzeigen
nur der Teil, der im aktuellen Diagramm sichtbar ist. Dies ist wahrscheinlich ein guter Weg
ungefähr unendlich und es ermöglicht sicherlich einige nette Tricks. Beispiele finden Sie weiter unten.

Arbeiten mit unbekannt die Datenerfassung und Unendlichkeit
Manchmal möchten Sie unbekannte Daten verwerfen und so tun, als wären sie Null (oder etwas anderes).
Wert) und manchmal möchten Sie so tun, als wären bekannte Daten unbekannt
(um bekanntermaßen falsche Daten zu verwerfen). Aus diesem Grund unterstützen CDEFs unbekannte Daten.
Es sind auch Beispiele verfügbar, die unbekannte Daten mithilfe der Unendlichkeit anzeigen.

Manche Beispiele


Beispiel: Verwendung von a kürzlich erstellt DRR
Sie führen seit über einem Jahr Statistiken über Ihren Router. Kürzlich haben Sie eine installiert
Zusätzlicher Router und Sie möchten den kombinierten Durchsatz für diese beiden Geräte anzeigen.

Wenn Sie einfach die Zähler von router.rrd und router2.rrd addieren, fügen Sie bekannte Daten hinzu
(von router.rrd) zu unbekannten Daten (von router2.rrd) für den größten Teil Ihrer Statistiken.
Sie können dies auf verschiedene Arten lösen:

· Füllen Sie beim Erstellen der neuen Datenbank diese vom Anfang bis zum jetzigen Zeitpunkt mit Nullen. Du hast
um die Datenbank zum spätesten Zeitpunkt in der anderen Datenbank starten zu lassen oder davor.

· Alternativ können Sie CDEF verwenden und unbekannte Daten auf Null setzen.

Beide Methoden haben ihre Vor- und Nachteile. Die erste Methode ist mühsam und wenn Sie möchten
Tun Sie das, müssen Sie es selbst herausfinden. Es ist nicht möglich, eine gefüllte Datenbank zu erstellen
Bei Nullen müssen Sie diese manuell eingeben. Die Implementierung der zweiten Methode wird beschrieben
nächstes:

Was wir wollen ist: „Wenn der Wert unbekannt ist, ersetzen Sie ihn durch Null“. Das könnte man einschreiben
Pseudocode als: if (Wert ist unbekannt) then (Null) else (Wert). Beim Lesen des rrdgraph
Im Handbuch fällt Ihnen die Funktion „UN“ auf, die Null oder Eins zurückgibt. Sie bemerken auch das „IF“
Funktion, die Null oder Eins als Eingabe akzeptiert.

Schauen Sie sich zunächst die Funktion „IF“ an. Es werden drei Werte vom Stapel genommen, der erste Wert ist
Am Entscheidungspunkt wird der zweite Wert an den Stapel zurückgegeben, wenn die Bewertung „wahr“ ist.
und wenn nicht, wird der dritte Wert an den Stapel zurückgegeben. Wir wollen, dass die „UN“-Funktion entscheidet
Was passiert, also kombinieren wir diese beiden Funktionen in einem CDEF.

Schreiben wir die beiden möglichen Pfade für die „IF“-Funktion auf:

Wenn wahr, gib a zurück
wenn falsch, Rückgabe b

In RPN: „result=x,a,b,IF“, wobei „x“ entweder wahr oder falsch ist.

Jetzt müssen wir „x“ eintragen, das sollte der Teil „(Wert ist unbekannt)“ sein und dieser ist in
RPN: „result=value,UN“

Wir kombinieren sie nun: „result=value,UN,a,b,IF“ und tragen dann die entsprechenden Dinge ein
für „a“ und „b“ sind wir fertig:

„CDEF:result=value,UN,0,value,IF“

Vielleicht möchten Sie den RPN-Leitfaden von Steve Rader lesen, wenn Sie Schwierigkeiten mit der Art und Weise haben, wie ich
erklärte dieses letzte Beispiel.

Wenn Sie diesen RPN-Ausdruck überprüfen möchten, ahmen Sie einfach das Verhalten von RRDtool nach:

Für jeden bekannten Wert wird der Ausdruck wie folgt ausgewertet:
CDEF:result=value,UN,0,value,IF (value,UN) ist nicht wahr, daher wird es 0
CDEF:result=0,0,value,IF „IF“ gibt den 3. Wert zurück
CDEF:result=value Der bekannte Wert wird zurückgegeben

Für den unbekannten Wert geschieht Folgendes:
CDEF:result=value,UN,0,value,IF (value,UN) ist wahr, also wird es 1
CDEF:result=1,0,value,IF „IF“ sieht 1 und gibt den 2. Wert zurück
CDEF:result=0 Null wird zurückgegeben

Wenn Sie statt Null einen anderen Wert sehen möchten, können Sie natürlich diesen anderen verwenden
Wert.

Wenn schließlich alle unbekannten Daten aus dem RRD entfernt wurden, möchten Sie diese möglicherweise entfernen
Regel, damit unbekannte Daten korrekt angezeigt werden.

Beispiel: leben Umgang of unbekannt Daten, by Verwendung von Zeit
Das obige Beispiel hat einen Nachteil. Wenn Sie danach unbekannte Daten in Ihrer Datenbank protokollieren
Wenn Sie Ihre neue Ausrüstung installieren, wird sie auch in Null umgewandelt und somit auch Sie
Ich werde nicht sehen, dass es ein Problem gab. Das ist nicht gut und was Sie wirklich tun möchten, ist:

· Wenn unbekannte Daten vorliegen, sehen Sie sich den Zeitpunkt der Probenahme an.

· Wenn der unbekannte Wert vor dem Zeitpunkt xxx liegt, setzen Sie ihn auf Null.

· Wenn es nach der Zeit xxx liegt, belassen Sie es als unbekannte Daten.

Dies ist machbar: Sie können den Zeitpunkt der Probenentnahme mit einem bekannten Zeitpunkt vergleichen.
Angenommen, Sie haben am Freitag, 17. September 1999, 00:35:57 MET mit der Überwachung Ihres Geräts begonnen
Sommerzeit. Übersetzen Sie diese Zeit seit dem 1970 in Sekunden und erhalten Sie 01'01'937. Wenn du
Wenn Sie unbekannte Werte verarbeiten möchten, die nach dieser Zeit empfangen wurden, möchten Sie diese unbekannt lassen
und wenn sie vor diesem Zeitpunkt „empfangen“ wurden, möchten Sie sie in Null übersetzen (also Sie
Sie können sie effektiv ignorieren, während Sie sie zu den Zählern Ihrer anderen Router hinzufügen.

Die Übersetzung von Freitag, 17. September 1999, 00:35:57 MET DST in 937'521'357 kann erfolgen durch:
zum Beispiel mit GNU Date:

date -d "19990917 00:35:57" +%s

Sie können die Datenbank auch sichern und sehen, wo die Daten bekannt werden. Es gibt
Es gibt mehrere andere Möglichkeiten, dies zu tun. Wählen Sie einfach eine aus.

Jetzt müssen wir die Magie erschaffen, die es uns ermöglicht, unbekannte Werte anders zu verarbeiten
abhängig vom Zeitpunkt der Probenentnahme. Dies ist ein dreistufiger Prozess:

1. Wenn der Zeitstempel des Werts nach 937'521'357 liegt, lassen Sie ihn unverändert.

2. Wenn es sich um einen bekannten Wert handelt, lassen Sie ihn unverändert.

3. Ändern Sie den unbekannten Wert in Null.

Schauen wir uns Teil eins an:

if (true) gibt den ursprünglichen Wert zurück

Wir schreiben das um:

if (true) gebe „a“ zurück
wenn (falsch) „b“ zurückgeben

Wir müssen ab Schritt 1 „wahr“ oder „falsch“ berechnen. Es ist eine Funktion verfügbar, die zurückgibt
der Zeitstempel für die aktuelle Probe. Es heißt überraschenderweise „ZEIT“. Diesmal
muss mit einer konstanten Zahl verglichen werden, wir brauchen „GT“. Die Ausgabe von „GT“ ist wahr oder falsch
und das ist eine gute Eingabe für „IF“. Wir wollen „if (time > 937521357) then (return a) else.“
(Rückgabe b)".

Dieser Vorgang wurde bereits im vorherigen Kapitel ausführlich beschrieben, also machen wir es schnell:

if (x) then a else b
wobei x für „Zeit>937521357“ steht.
wobei a den ursprünglichen Wert darstellt
wobei b das Ergebnis des vorherigen Beispiels darstellt

Zeit>937521357 --> ZEIT,937521357,GT

if (x) then a else b --> x,a,b,IF
Ersetzen Sie x --> TIME,937521357,GT,a,b,IF
Ersetzen Sie a --> TIME,937521357,GT,value,b,IF
Ersetzen Sie b --> TIME,937521357,GT,value,value,UN,0,value,IF,IF

Am Ende erhalten wir: „CDEF:result=TIME,937521357,GT,value,value,UN,0,value,IF,IF“

Das sieht sehr komplex aus, aber wie Sie sehen, war es nicht allzu schwer, es zu finden.

Beispiel: Vortäuschen seltsam die Datenerfassung nicht dort
Angenommen, Sie haben ein Problem, das sich in Form großer Spitzen in Ihrem Diagramm zeigt. Du weißt das
passiert und warum, also beschließen Sie, das Problem zu umgehen. Vielleicht verwenden Sie Ihr
Netzwerk, um nachts ein Backup durchzuführen, und auf diese Weise erhalten Sie im Rest des Jahres fast 10 MB/s
Ihre Netzwerkaktivität erzeugt keine Zahlen über 100 kb/s.

Es gibt zwei Möglichkeiten:

1. Wenn die Zahl 100 kb/s überschreitet, ist sie falsch und Sie möchten, dass sie durch Ändern maskiert wird
ins Unbekannte.

2. Sie möchten nicht, dass das Diagramm mehr als 100 kb/s anzeigt.

Pseudocode: wenn (Zahl > 100) dann unbekannt sonst Zahl oder Pseudocode: wenn (Zahl > 100)
dann 100 sonst Zahl.

Das zweite „Problem“ kann auch durch die Verwendung der starren Option des RRDtool-Diagramms gelöst werden.
Dies hat jedoch nicht das gleiche Ergebnis. In diesem Beispiel können Sie am Ende ein Diagramm erstellen
führt eine automatische Skalierung durch. Auch wenn Sie die Zahlen zur Anzeige von Maxima verwenden, werden diese auf eingestellt
100 kb/s.

Wir verwenden wieder „IF“ und „GT“. „if (x) then (y) else (z)“ wird aufgeschrieben als
"CDEF:result=x,y,z,IF"; Geben Sie nun x, y und z ein. Für x geben Sie „Zahl größer als“ ein
100kb/s“ wird zu „number,100000,GT“ (Kilo ist 1 und b/s ist das, was wir messen!). Das „z“
Der Teil ist in beiden Fällen „Zahl“ und der „y“-Teil ist entweder „UNKN“ für unbekannt oder „100000“.
für 100kb/s.

Die beiden CDEF-Ausdrücke wären:

CDEF:result=number,100000,GT,UNKN,number,IF
CDEF:result=number,100000,GT,100000,number,IF

Beispiel: arbeiten, on a sicher Zeit Spannweite
Wenn Sie ein Diagramm wünschen, das sich über mehrere Wochen erstreckt, aber nur die Daten einiger Router sehen möchten
Für eine Woche müssen Sie den Rest des Zeitrahmens „ausblenden“. Fragen Sie mich nicht, wann das passieren würde
nützlich sein, es dient nur als Beispiel :)

Wir müssen den Zeitstempel mit einem Anfangsdatum und einem Enddatum vergleichen. Vergleichen ist nicht der Fall
schwierig:

ZEIT, Anfangszeit, GE
ZEIT, Endzeit, LE

Diese beiden Teile des CDEF ergeben entweder 0 für falsch oder 1 für wahr. Wir können jetzt prüfen, ob
Mit ein paar IF-Anweisungen sind sie beide 0 (oder 1), aber wie Wataru Satoh betonte, können wir das
Verwenden Sie die Funktionen „*“ oder „+“ als logisches UND und logisches ODER.

Für „*“ ist das Ergebnis Null (falsch), wenn einer der beiden Operatoren Null ist. Für
„+“, das Ergebnis ist nur dann falsch (0), wenn zwei falsche Operatoren (0) hinzugefügt werden.
Warnung: *Jede* Zahl ungleich 0 wird als „wahr“ betrachtet. Das bedeutet, dass z
Beispielsweise wird „-1,1,+“ (was „wahr oder wahr“ sein sollte) zu FALSCH ... Mit anderen Worten:
Verwenden Sie „+“ nur, wenn Sie sicher wissen, dass Sie nur positive Zahlen (oder Null) haben.

Lassen Sie uns das komplette CDEF kompilieren:

DEF:ds0=router1.rrd:AVERAGE
CDEF:ds0modified=TIME,begintime,GT,TIME,endtime,LE,*,ds0,UNKN,IF

Dies gibt den Wert von ds0 zurück, wenn beide Vergleiche „true“ zurückgeben. Du könntest es auch tun
umgekehrt:

DEF:ds0=router1.rrd:AVERAGE
CDEF:ds0modified=TIME,begintime,LT,TIME,endtime,GT,+,UNKN,ds0,IF

Dies gibt UNKNOWN zurück, wenn einer der Vergleiche true ergibt.

Beispiel: Du vermuten zu haben Probleme und wollen zu sehen unbekannt Daten.
Angenommen, Sie addieren die Anzahl der aktiven Benutzer auf mehreren Terminalservern. Wenn einer von ihnen
keine (oder falsche) Antwort gibt, erhalten Sie in der Datenbank „NaN“ („Not a
Anzahl“) und NaN wird als „Unbekannt“ bewertet.

In diesem Fall möchten Sie darauf hingewiesen werden und die Summe der verbleibenden Werte beträgt
kein Wert für dich.

Es wäre so etwas wie:

DEF:users1=location1.rrd:onlineTS1:LAST
DEF:users2=location1.rrd:onlineTS2:LAST
DEF:users3=location2.rrd:onlineTS1:LAST
DEF:users4=location2.rrd:onlineTS2:LAST
CDEF:allusers=Benutzer1,Benutzer2,Benutzer3,Benutzer4,+,+,+

Wenn Sie nun alle Benutzer grafisch darstellen, werden unbekannte Daten in einem der Benutzer1..Benutzer4 als Lücke angezeigt
Deine Grafik. Sie möchten dies so ändern, dass eine leuchtend rote Linie und keine Lücke angezeigt wird.

Definieren Sie eine zusätzliche CDEF, die unbekannt ist, wenn alles in Ordnung ist, und unendlich ist, wenn es eine Unbekannte gibt
Wert:

CDEF:wrongdata=allusers,UN,INF,UNKN,IF

„allusers,UN“ wird entweder als wahr oder falsch ausgewertet, es ist der (x)-Teil von „IF“
Funktion und prüft, ob allusers unbekannt ist. Der (y)-Teil der „IF“-Funktion ist gesetzt
zu „INF“ (was unendlich bedeutet) und der (z)-Teil der Funktion gibt „UNKN“ zurück.

Die Logik lautet: Wenn (allusers == unbekannt), dann INF zurückgeben, andernfalls UNKN zurückgeben.

Diese „falschen Daten“ können Sie nun mit AREA in leuchtendem Rot anzeigen lassen. Wenn es unbekannt ist (weil
(allusers bekannt ist), dann wird der rote BEREICH nicht angezeigt. Wenn der Wert INF ist (weil allusers
unbekannt ist), wird zu diesem bestimmten Zeitpunkt der rote BEREICH in der Grafik ausgefüllt.

AREA:allusers#0000FF:kombinierte Benutzeranzahl
BEREICH:falsche Daten#FF0000:unbekannte Daten

Gleich Beispiel nützlich mit Gestapelt Daten:
Wenn Sie im vorherigen Beispiel „stack“ verwenden (wie ich es tun würde), addieren Sie die Werte nicht.
Daher gibt es keinen Zusammenhang zwischen den vier Werten und man erhält keinen einzigen
Wert zum Testen. Angenommen, Benutzer3 wäre zu einem bestimmten Zeitpunkt unbekannt: Benutzer1 wird dargestellt,
Benutzer2 liegt über Benutzer1, Benutzer3 ist unbekannt und daher passiert nichts.
Benutzer4 wird über Benutzer2 gestapelt. Fügen Sie trotzdem die zusätzlichen CDEFs hinzu und verwenden Sie sie zum Überlagern
die „normale“ Grafik:

DEF:users1=location1.rrd:onlineTS1:LAST
DEF:users2=location1.rrd:onlineTS2:LAST
DEF:users3=location2.rrd:onlineTS1:LAST
DEF:users4=location2.rrd:onlineTS2:LAST
CDEF:allusers=Benutzer1,Benutzer2,Benutzer3,Benutzer4,+,+,+
CDEF:wrongdata=allusers,UN,INF,UNKN,IF
AREA:users1#0000FF:users bei ts1
STACK:users2#00FF00:users bei ts2
STACK:users3#00FFFF:users bei ts3
STACK:users4#FFFF00:users bei ts4
BEREICH:falsche Daten#FF0000:unbekannte Daten

Wenn in einem der Benutzer1..Benutzer4 unbekannte Daten vorhanden sind, wird der BEREICH „falsche Daten“ gezeichnet und angezeigt
Da es an der X-Achse beginnt und eine unendliche Höhe hat, wird es effektiv überschrieben
Gestapelte Teile.

Wenn Sie möchten, können Sie die beiden CDEF-Zeilen zu einer kombinieren (wir verwenden nicht „allusers“). Aber
Es gibt gute Gründe, zwei CDEFS zu schreiben:

· Es verbessert die Lesbarkeit des Skripts.

· Es kann in GPRINT verwendet werden, um die Gesamtzahl der Benutzer anzuzeigen.

Wenn Sie sie kombinieren möchten, können Sie die „allusers“ im zweiten CDEF durch ersetzen
der Teil nach dem Gleichheitszeichen aus der ersten Zeile:

CDEF:wrongdata=Benutzer1,Benutzer2,Benutzer3,Benutzer4,+,+,+,UN,INF,UNKN,IF

Wenn Sie dies tun, können Sie die folgenden GPRINTs nicht verwenden:

KOMMENTAR: „Gesamtzahl der gesehenen Benutzer“
GPRINT:allusers:MAX:"Maximum: %6.0lf"
GPRINT:allusers:MIN:"Minimum: %6.0lf"
GPRINT:allusers:AVERAGE:"Durchschnitt: %6.0lf"
GPRINT:allusers:LAST:"Aktuell: %6.0lf\n"

Die Beispiele für DRR Graph manuell Seite


Grad Celsius vs Grad Fahrenheit
Um Celsius in Fahrenheit umzurechnen, verwenden Sie die Formel F=9/5*C+32

rrdtool graph demo.png --title="Demo Graph" \
DEF:cel=demo.rrd:exhaust:AVERAGE \
CDEF:far=9,5,/,cel,*,32,+ \
LINE2:cel#00a000:"D. Celsius" \
LINE2:far#ff0000:"D. Fahrenheit\c"

Dieses Beispiel ruft den DS mit dem Namen „exhaust“ aus der Datenbank „demo.rrd“ ab und fügt die Werte ein
Variable „cel“. Der verwendete CDEF wird wie folgt bewertet:

CDEF:far=9,5,/,cel,*,32,+
1. 9 drücken, 5 drücken
2. Funktion „Teilen“ drücken und verarbeiten
Der Stapel enthält jetzt 9/5
3. Push-Variable „cel“
4. Drücken Sie die Funktion „Multiplizieren“ und verarbeiten Sie sie
Der Stapel enthält jetzt 9/5*cel
5. Drücken Sie 32
6. Drücken Sie die Funktion „Plus“ und verarbeiten Sie sie
Der Stapel enthält nun die Temperatur in Fahrenheit

Gedanken unbekannt in Null
rrdtool graph demo.png --title="Demo Graph" \
DEF:idat1=interface1.rrd:ds0:AVERAGE \
DEF:idat2=interface2.rrd:ds0:AVERAGE \
DEF:odat1=interface1.rrd:ds1:AVERAGE \
DEF:odat2=interface2.rrd:ds1:AVERAGE \
CDEF:agginput=idat1,UN,0,idat1,IF,idat2,UN,0,idat2,IF,+,8,* \
CDEF:aggoutput=odat1,UN,0,odat1,IF,odat2,UN,0,odat2,IF,+,8,* \
AREA:agginput#00cc00:Eingabeaggregat \
LINE1:aggoutput#0000FF:Ausgabeaggregat

Diese beiden CDEFs basieren auf mehreren Funktionen. Es ist hilfreich, sie beim Betrachten aufzuteilen
tun sie. Beginnend mit dem ersten CDEF würden wir Folgendes erhalten:

idat1,UN -> a
0 -> b
idat1 -> c
wenn (a) dann (b) sonst (c)

Das Ergebnis ist also „0“, wenn zutrifft, dass „idat1“ gleich „UN“ ist. Wenn nicht, das Original
Der Wert von „idat1“ wird wieder auf den Stapel gelegt. Nennen wir diese Antwort „d“. Der Prozess ist
Dies wird für die nächsten fünf Elemente auf dem Stapel wiederholt, es wird auf die gleiche Weise durchgeführt und es wird eine Antwort zurückgegeben
"H". Der resultierende Stapel ist daher „d,h“. Der Ausdruck wurde vereinfacht zu
„d,h,+,8,*“ und es ist nun leicht zu erkennen, dass wir „d“ und „h“ addieren und multiplizieren
Ergebnis mit acht.

Das Endergebnis ist, dass wir „idat1“ und „idat2“ hinzugefügt haben und dabei effektiv
unbekannte Werte ignoriert. Das Ergebnis wird mit acht multipliziert, wobei höchstwahrscheinlich Bytes/s konvertiert werden
zu Bits/s.

Unendlichkeit Demo
rrdtool graph example.png --title="INF demo" \
DEF:val1=some.rrd:ds0:AVERAGE \
DEF:val2=some.rrd:ds1:AVERAGE \
DEF:val3=some.rrd:ds2:AVERAGE \
DEF:val4=other.rrd:ds0:AVERAGE \
CDEF:background=val4,POP,TIME,7200,%,3600,LE,INF,UNKN,IF \
CDEF:wipeout=val1,val2,val3,val4,+,+,+,UN,INF,UNKN,IF \
BEREICH:Hintergrund#F0F0F0 \
BEREICH:val1#0000FF:Wert1 \
STACK:val2#00C000:Wert2 \
STACK:val3#FFFF00:Wert3 \
STACK:val4#FFC000:Value4 \
BEREICH:whipeout#FF0000:Unbekannt

Diese Demo demonstriert zwei Möglichkeiten, Infinity zu verwenden. Es ist etwas schwierig zu sehen, was passiert
der „Hintergrund“ CDEF.

„val4,POP,TIME,7200,%,3600,LE,INF,UNKN,IF“

Dieser RPN nimmt den Wert von „val4“ als Eingabe und entfernt ihn dann sofort vom Stapel
mit „POP“. Der Stapel ist jetzt leer, aber als Nebeneffekt wissen wir jetzt, wann dies der Fall ist
Probe entnommen wurde. Diese Zeit wird von der Funktion „TIME“ auf den Stapel gelegt.

„TIME,7200,%“ nimmt das Modulo der Zeit und 7'200 (das sind zwei Stunden). Das Ergebnis
Der Wert auf dem Stapel ist eine Zahl im Bereich von 0 bis 7199.

Für Leute, die die Modulo-Funktion nicht kennen: Sie ist der Rest nach einer ganzen Zahl
Aufteilung. Wenn Sie 16 durch 3 dividieren, wäre das Ergebnis 5 und der Rest wäre 1. Also,
„16,3,%“ gibt 1 zurück.

Wir haben das Ergebnis „TIME,7200,%“ auf dem Stapel, nennen wir es „a“. Der Beginn des RPN
ist zu „a,3600,LE“ geworden und prüft, ob „a“ kleiner oder gleich „3600“ ist. Es stimmt
die Hälfte der Zeit. Wir müssen jetzt den Rest des RPN verarbeiten und das ist nur ein einfacher Vorgang
„IF“-Funktion, die je nach Uhrzeit entweder „INF“ oder „UNKN“ zurückgibt. Dies wird zurückgegeben
zur Variablen „Hintergrund“.

Der zweite CDEF wurde weiter oben in diesem Dokument besprochen, daher werden wir hier nicht darauf eingehen.

Jetzt können Sie die verschiedenen Ebenen zeichnen. Beginnen Sie mit dem Hintergrund, der entweder unbekannt ist
(nichts zu sehen) oder unendlich (der gesamte positive Teil des Diagramms wird ausgefüllt).

Als nächstes zeichnen Sie die Daten auf diesen Hintergrund, sie überlagern den Hintergrund. Vermuten
einer von val1..val4 wäre unbekannt, in diesem Fall wären am Ende nur drei Balken gestapelt
übereinander. Sie möchten dies nicht sehen, da die Daten nur gültig sind, wenn alle
Vier Variablen sind gültig. Aus diesem Grund verwenden Sie den zweiten CDEF, der die Daten überlagert
mit einem AREA, so dass die Daten nicht mehr gesehen werden können.

Wenn Ihre Daten auch negative Werte haben können, müssen Sie auch die andere Hälfte überschreiben
Deine Grafik. Das geht auf relativ einfache Weise: Was Sie brauchen, ist das „Wipeout“
Variable und setzen Sie ein negatives Vorzeichen davor: „CDEF:wipeout2=wipeout,-1,*“

Filterung die Datenerfassung
Sie können einige komplexe Datenfilterungen durchführen:

MEDIAN-FILTER: Filtert Schrotrauschen

DEF:var=database.rrd:traffic:AVERAGE
CDEF:prev1=PREV(var)
CDEF:prev2=PREV(prev1)
CDEF:median=var,prev1,prev2,3,SORT,POP,EXC,POP
LINE3:median#000077:gefiltert
LINE1:prev2#007700:'Rohdaten'

ABLEITEN:

DEF:var=database.rrd:traffic:AVERAGE
CDEF:prev1=PREV(var)
CDEF:time=var,POP,TIME
CDEF:prevtime=PREV(time)
CDEF:derivate=var,prev1,-,time,prevtime,-,/
ZEILE3:Derivat#000077:Derivat
LINE1:var#007700:'Rohdaten'

Außen of Ideen für jetzt an


Dieses Dokument wurde aus Fragen erstellt, die entweder von mir selbst oder von anderen Personen gestellt wurden
RRDtool-Mailingliste. Bitte teilen Sie mir mit, wenn Sie darin Fehler finden oder Probleme haben
es zu verstehen. Wenn Sie der Meinung sind, dass es eine Ergänzung geben sollte, senden Sie mir eine E-Mail:
<[E-Mail geschützt] >

Erinnern Sie sich: Nein Feedback ist gleich nicht Änderungen!

Verwenden Sie cdeftutorial online über die Dienste von onworks.net


Kostenlose Server & Workstations

Laden Sie Windows- und Linux-Apps herunter

Linux-Befehle

Ad