Este es el comando cdeftutorial que se puede ejecutar en el proveedor de alojamiento gratuito de OnWorks utilizando una de nuestras múltiples estaciones de trabajo en línea gratuitas, como Ubuntu Online, Fedora Online, emulador en línea de Windows o emulador en línea de MAC OS.
PROGRAMA:
NOMBRE
cdeftutorial - Tutorial de CDEF de Alex van den Bogaerdt
DESCRIPCIÓN
Intención de este documento: proporcionar algunos ejemplos de las partes de uso común de
Lenguaje CDEF de RRDtool.
Si cree que alguna característica importante no se explica correctamente y si la agrega a esto
El documento beneficiaría a la mayoría de los usuarios, por favor pídame que lo agregue. Entonces intentaré proporcionar
una respuesta en la próxima versión de este tutorial. ¡Sin comentarios no hay cambios! Adiciones
a este documento también son bienvenidos. - Alex van den Bogaerdt[email protected]>
Por Qué este vídeo ¿tutorial?
Una de las partes poderosas de RRDtool es su capacidad para hacer todo tipo de cálculos en el
datos recuperados de sus bases de datos. Sin embargo, las muchas opciones y sintaxis de RRDtool hacen que sea
difícil de entender para el usuario medio. Los manuales son buenos para explicar lo que
estas opciones lo hacen; Sin embargo, no explican (y no deberían) explicar en detalle por qué son
útil. Al igual que con mi tutorial de RRDtool: si desea un documento simple en un lenguaje simple,
debería leer este tutorial. Si está satisfecho con la documentación oficial, puede encontrar
este documento demasiado simple o incluso aburrido. Si elige leer este tutorial, también
Espero que haya leído y comprendido completamente mi otro tutorial.
Más lectura
Si tiene dificultades con la forma en que trato de explicarlo, lea el artículo de Steve Rader.
rpntutorial. Puede ayudarlo a comprender cómo funciona todo esto.
Qué están CDEF?
Al recuperar datos de un RRD, está utilizando un "DEF" para trabajar con esos datos. Pensar en
como una variable que cambia con el tiempo (donde el tiempo es el eje x). El valor de esto
variable es lo que se encuentra en la base de datos en ese momento en particular y no puede hacer nada
modificaciones en él. Para esto son los CDEF: toman valores de los DEF y realizan
cálculos sobre ellos.
Sintaxis
DEF: var_name_1 = some.rrd: ds_name: CF
CDEF: var_name_2 = RPN_expression
Primero define "var_name_1" como datos recopilados de la fuente de datos "ds_name" que se encuentra en RRD
"some.rrd" con función de consolidación "CF".
Suponga que el contador SNMP ifInOctets se guarda en mrtg.rrd como el DS "in". Entonces la
siguiente DEF define una variable para el promedio de esa fuente de datos:
DEF: inbytes = mrtg.rrd: in: PROMEDIO
Supongamos que desea mostrar bits por segundo (en lugar de bytes por segundo almacenados en el
base de datos.) Tiene que definir un cálculo (de ahí "CDEF") en la variable "inbytes" y utilizar
esa variable (pulgadas) en lugar de la original:
CDEF: pulgadas = pulgadas, 8, *
Esto le dice a RRDtool que multiplique inbytes por ocho para obtener inbits. Más tarde explicaré cómo esto
obras. En las funciones de gráficos o impresión, ahora puede usar bits en los que usaría
inbytes de lo contrario.
Tenga en cuenta que el nombre de la variable utilizado en el CDEF (en bits) no debe ser el mismo que el de la variable
nombrado en el DEF (inbytes)!
Expresiones RPN
RPN es la abreviatura de notación polaca inversa. Funciona de la siguiente manera. Pones las variables
o números en una pila. También pones operaciones (cosas por hacer) en la pila y esta pila
luego se procesa. El resultado se colocará en la pila. Al final, debería haber
Queda exactamente un número: el resultado de la serie de operaciones. Si no hay exactamente
Queda un número, RRDtool se quejará en voz alta.
Por encima de la multiplicación por ocho se verá así:
1. Comience con una pila vacía
2. Coloque el contenido de inbytes variables en la pila
3. Pon el número ocho en la pila.
4. Ponga la operación multiplicar en la pila
5. Procesar la pila
6. Recupere el valor de la pila y póngalo en bits variables.
Ahora haremos un ejemplo con números reales. Suponga que la variable en bytes tendría valor
10, la pila sería:
1. ||
2. | 10 |
3. | 10 | 8 |
4. | 10 | 8 | * |
5. | 80 |
6. ||
Procesar la pila (paso 5) recuperará un valor de la pila (de la derecha en
etapa 4). Esta es la operación multiplicar y esto toma dos valores de la pila como entrada.
El resultado se vuelve a poner en la pila (el valor 80 en este caso). Para multiplicar el
el orden no importa, pero para otras operaciones como la resta y la división sí.
Generalmente hablando tienes el siguiente orden:
y = A - B -> y = menos (A, B) -> CDEF: y = A, B, -
Esto no es muy intuitivo (al menos la mayoría de la gente no lo cree). Para la función f (A, B)
invierte la posición de "f", pero no invierte el orden de las variables.
Conversión Tu deseos a RPN
Primero, obtenga una imagen clara de lo que quiere hacer. Desglose el problema en menor
porciones hasta que ya no se puedan partir. Entonces es bastante simple convertir su
ideas en RPN.
Suponga que tiene varios RRD y le gustaría agregar algunos contadores en ellos. Estos podrían
sean, por ejemplo, los contadores de cada enlace WAN que esté supervisando.
Tienes:
router1.rrd con link1in link2in
router2.rrd con link1in link2in
router3.rrd con link1in link2in
Suponga que le gustaría sumar todos estos contadores, excepto el link2in dentro
router2.rrd. Necesitas hacer:
(en este ejemplo, "router1.rrd: link1in" significa DS link1in dentro del RRD router1.rrd)
router1.rrd: link1in
router1.rrd: link2in
router2.rrd: link1in
router3.rrd: link1in
router3.rrd: link2in
-------------------- +
(resultado de la suma)
Como función matemática, esto podría escribirse:
"agregar (router1.rrd: link1in, router1.rrd: link2in, router2.rrd: link1in, router3.rrd: link1in
, router3.rrd: link2.in) "
Con RRDtool y RPN, primero, defina las entradas:
DEF: a = router1.rrd: link1in: PROMEDIO
DEF: b = router1.rrd: link2in: PROMEDIO
DEF: c = router2.rrd: link1in: PROMEDIO
DEF: d = router3.rrd: link1in: PROMEDIO
DEF: e = router3.rrd: link2in: PROMEDIO
Ahora, la función matemática se convierte en: "agregar (a, b, c, d, e)"
En RPN, no hay ningún operador que sume más de dos valores, por lo que debe realizar varios
adiciones. Agrega a y b, agrega c al resultado, agrega d al resultado y agrega e al
resultado.
empujar a: una pila contiene el valor de a
presione by agregue: b, + stack contiene el resultado de a + b
presione cy agregue: c, + stack contiene el resultado de a + b + c
presione d y agregue: d, + pila contiene el resultado de a + b + c + d
presione e y agregue: e, + pila contiene el resultado de a + b + c + d + e
Lo que se calculó aquí se escribiría como:
((((a + b) + c) + d) + e)>
Esto está en RPN: "CDEF: resultado = a, b, +, c, +, d, +, e, +"
Esto es correcto, pero puede ser más claro para los humanos. No importa si agrega un
ab y luego agregue c al resultado o primero agregue b ac y luego agregue a al resultado. Esta
hace posible reescribir el RPN en "CDEF: resultado = a, b, c, d, e, +, +, +, +" que es
evaluado de manera diferente:
empujar el valor de la variable a en la pila: a
empujar el valor de la variable b en la pila: ab
empujar el valor de la variable c en la pila: abc
empujar el valor de la variable d en la pila: abcd
empujar el valor de la variable e en la pila: abcde
empujar operador + en la pila: abcde +
y procesarlo: abc P (donde P == d + e)
empujar operador + en la pila: abc P +
y procesarlo: ab Q (donde Q == c + P)
empujar operador + en la pila: ab Q +
y procesarlo: a R (donde R == b + Q)
empujar operador + en la pila: a R +
y procesarlo: S (donde S == a + R)
Como puede ver, la expresión RPN "a, b, c, d, e, +, +, +, +, +" se evaluará en
"((((d + e) + c) + b) + a)" y tiene el mismo resultado que "a, b, +, c, +, d, +, e, +". Se llama
la ley conmutativa de la suma, pero puede olvidar esto de inmediato, siempre y cuando
recuerda lo que significa.
Ahora mira una expresión que contiene una multiplicación:
Primero en matemáticas normales: "dejar resultado = a + b * c". En este caso no puede elegir el orden.
usted mismo, debe comenzar con la multiplicación y luego agregarle a. Puedes alterar
la posición de byc, no debe alterar la posición de ay b.
Debe tener esto en cuenta al convertir esta expresión en RPN. Leerlo
como: "Suma el resultado de b * c a a" y luego es fácil escribir la expresión RPN:
"resultado = a, b, c, *, +" Otra expresión que devolvería lo mismo: "resultado = b, c, *, a, +"
En matemáticas normales, puede encontrar algo como "a * (b + c)" y esto también se puede convertir
en RPN. El paréntesis solo te dice que primero sumes byc, y luego multipliques a con el
resultado. Nuevamente, ahora es fácil escribirlo en RPN: "resultado = a, b, c, +, *". Tenga en cuenta que esto es
muy similar a una de las expresiones del párrafo anterior, solo que la multiplicación
y la adición cambió de lugar.
Cuando tiene problemas con RPN o cuando RRDtool se queja, generalmente es algo bueno
para escribir la pila en una hoja de papel y ver qué pasa. Ten el manual listo
y finge ser RRDtool. Solo haz todos los cálculos a mano para ver qué pasa, estoy seguro
esto resolverá la mayoría de los problemas que encuentre, si no todos.
Cosas especial números
El desconocido propuesta de
A veces, la recopilación de sus datos fallará. Esto puede ser muy común, especialmente cuando
consultas sobre enlaces ocupados. RRDtool se puede configurar para permitir uno (o incluso más)
valores desconocidos y calcule la actualización que falta. Puede, por ejemplo, consultar su
dispositivo cada minuto. Esto está creando un PDP o punto de datos primario por minuto.
Si definió su RRD para contener un RRA que almacena valores de 5 minutos, necesita cinco de
esos PDP para crear un CDP (punto de datos consolidados). Estos PDP pueden volverse desconocidos en
Dos casos:
1. Las actualizaciones están demasiado separadas. Esto se ajusta mediante la configuración de "latido".
2. La actualización se estableció como desconocida a propósito al no insertar ningún valor (utilizando la plantilla
opción) o utilizando "U" como valor para insertar.
Cuando se calcula un CDP, otro mecanismo determina si este CDP es válido o no. Si
hay demasiados PDP desconocidos, el CDP también es desconocido. Esto está determinado por el
factor xff. Tenga en cuenta que una actualización de contador desconocida puede generar dos PDP desconocidos. Si
solo permite un PDP desconocido por CDP, ¡esto hace que el CDP sea desconocido!
Suponga que el contador aumenta uno por segundo y lo recupera cada minuto:
valor de contador tasa resultante
10'000
10'060 1; (10'060-10'000)/60 == 1
10'120 1; (10'120-10'060)/60 == 1
Desconocido Desconocido; no sabes el último valor
10'240 desconocido; no sabes el valor anterior
10'300 1; (10'300-10'240)/60 == 1
Si el CDP se calculara a partir de las últimas cinco actualizaciones, obtendría dos PDP desconocidos
y tres PDP conocidos. Si xff se hubiera establecido en 0.5, que por cierto es un
factor usado, el CDP tendría un valor conocido de 1. Si xff se hubiera establecido en 0.2 entonces
el CDP resultante sería desconocido.
Debe decidir los valores adecuados de latido, la cantidad de PDP por CDP y el xff
factor. Como puede ver en el texto anterior, definen el comportamiento de su RRA.
Acoplar con desconocido datos in Tu base de datos
Como ha leído en el capítulo anterior, las entradas de un RRA se pueden establecer en el valor desconocido.
valor. Si realiza cálculos con este tipo de valor, el resultado también debe ser desconocido.
Esto significa que una expresión como "resultado = a, b, +" será desconocida si a o b es
desconocido. Sería incorrecto simplemente ignorar el valor desconocido y devolver el valor de la
otro parámetro. Al hacerlo, asumiría que "desconocido" significa "cero" y esto no es
verdadera.
Ha habido un caso en el que alguien estuvo recopilando datos durante más de un año. Una nueva pieza de
Se instaló el equipo, se creó un nuevo RRD y se cambiaron los scripts para agregar un
contador de la base de datos anterior y un contador de la nueva base de datos. El resultado fue
decepcionante, una gran parte de las estadísticas parecía haber desaparecido misteriosamente ...
Por supuesto que no lo hicieron, los valores de la base de datos anterior (valores conocidos) se agregaron a los valores
de la nueva base de datos (valores desconocidos) y el resultado era desconocido.
En este caso, es bastante razonable utilizar un CDEF que altera los datos desconocidos a cero.
Los contadores del dispositivo eran desconocidos (después de todo, ¡aún no estaba instalado!) Pero ya sabes
que la tasa de datos a través del dispositivo tenía que ser cero (por la misma razón: era
no instalado).
Hay algunos ejemplos a continuación que hacen este cambio.
Infinity
Los datos infinitos son otra forma de un número especial. No se puede graficar porque por
definición, nunca alcanzarías el valor infinito. Puedes pensar en positivo y
infinito negativo dependiendo de la posición relativa a cero.
RRDtool es capaz de representar (-no- graficar!) El infinito deteniéndose en su corriente
máximo (para infinito positivo) o mínimo (para infinito negativo) sin saber esto
máximo mínimo).
Infinity en RRDtool se usa principalmente para dibujar un ÁREA sin conocer su vertical
dimensiones. Puede pensar en ello como dibujar un ÁREA con una altura infinita y mostrar
solo la parte que es visible en el gráfico actual. Esta es probablemente una buena forma de
infinito aproximado y seguro que permite algunos trucos ingeniosos. Consulte los ejemplos a continuación.
Acoplar con desconocido datos y infinito
A veces le gustaría descartar datos desconocidos y pretender que son cero (o cualquier otro
valor para el caso) y, a veces, le gustaría fingir que los datos conocidos son desconocidos
(descartar datos que se sabe que son incorrectos). Es por eso que los CDEF admiten datos desconocidos.
También hay ejemplos disponibles que muestran datos desconocidos utilizando infinito.
Cosas ejemplos
Ejemplo: usando a recientemente creado RRD
Mantienes estadísticas en tu enrutador durante más de un año. Recientemente instaló un
enrutador adicional y le gustaría mostrar el rendimiento combinado de estos dos dispositivos.
Si solo suma los contadores de router.rrd y router2.rrd, agregará datos conocidos
(de router.rrd) a datos desconocidos (de router2.rrd) para la mayor parte de sus estadísticas.
Puede resolver esto de varias maneras:
· Mientras crea la nueva base de datos, llénela con ceros desde el principio hasta ahora. Tienes
para que la base de datos se inicie en o antes de la hora menos reciente en la otra base de datos.
· Alternativamente, puede utilizar CDEF y modificar los datos desconocidos a cero.
Ambos métodos tienen sus pros y sus contras. El primer método es problemático y si lo desea
haz eso, tienes que resolverlo tú mismo. No es posible crear una base de datos llena
con ceros, tienes que introducirlos manualmente. Se describe la implementación del segundo método
siguiente:
Lo que queremos es: "si el valor es desconocido, sustitúyelo por cero". Esto podría estar escrito en
pseudocódigo como: si (el valor es desconocido) entonces (cero) else (valor). Al leer el rrdgraph
manual, observa la función "UN" que devuelve cero o uno. También nota el "SI"
función que toma cero o uno como entrada.
Primero mire la función "SI". Toma tres valores de la pila, el primer valor es
el punto de decisión, el segundo valor se devuelve a la pila si la evaluación es "verdadera"
y si no, el tercer valor se devuelve a la pila. Queremos que la función "ONU" decida
qué sucede entonces combinamos esas dos funciones en un CDEF.
Anotemos las dos posibles rutas para la función "SI":
si es cierto, devuelve un
si es falso, devuelve b
En RPN: "resultado = x, a, b, IF" donde "x" es verdadero o falso.
Ahora tenemos que completar "x", esta debería ser la parte "(el valor es desconocido)" y esto está en
RPN: "resultado = valor, UN"
Ahora los combinamos: "resultado = valor, UN, a, b, IF" y cuando completamos las cosas apropiadas
para "a" y "b" hemos terminado:
"CDEF: resultado = valor, UN, 0, valor, SI"
Es posible que desee leer la guía RPN de Steve Rader si tiene dificultades con la forma en que
Explicó este último ejemplo.
Si desea verificar esta expresión RPN, simplemente imite el comportamiento de RRDtool:
Para cualquier valor conocido, la expresión se evalúa de la siguiente manera:
CDEF: resultado = valor, UN, 0, valor, SI (valor, UN) no es cierto, por lo que se convierte en 0
CDEF: resultado = 0,0, valor, SI "SI" devolverá el tercer valor
CDEF: resultado = valor Se devuelve el valor conocido
Para el valor desconocido, esto sucede:
CDEF: resultado = valor, UN, 0, valor, SI (valor, UN) es verdadero por lo que se convierte en 1
CDEF: resultado = 1,0, valor, SI "SI" ve 1 y devuelve el segundo valor
CDEF: resultado = 0 Se devuelve cero
Por supuesto, si desea ver otro valor en lugar de cero, puede usar ese otro
.
Eventualmente, cuando todos los datos desconocidos se eliminan del RRD, es posible que desee eliminar este
regla para que los datos desconocidos se muestren correctamente.
Ejemplo: mejor manipulación of desconocido datos, by usando time
El ejemplo anterior tiene un inconveniente. Si registra datos desconocidos en su base de datos después
instalando su nuevo equipo, también se traducirá a cero y por lo tanto usted
no verá que hubo un problema. Esto no es bueno y lo que realmente quieres hacer es:
· Si hay datos desconocidos, mire el momento en que se tomó esta muestra.
· Si el valor desconocido es anterior al tiempo xxx, hágalo cero.
· Si es posterior al tiempo xxx, déjelo como dato desconocido.
Esto es factible: puede comparar la hora en que se tomó la muestra con una hora conocida.
Suponiendo que comenzó a monitorear su dispositivo el viernes 17 de septiembre de 1999, 00:35:57 MET
DST. Traduzca este tiempo en segundos desde 1970-01-01 y se convierte en 937'521'357. Si tu
procesar valores desconocidos que se recibieron después de este tiempo, desea dejarlos desconocidos
y si se "recibieron" antes de esta hora, desea traducirlos a cero (por lo que
puede ignorarlos de manera efectiva mientras los agrega a sus otros contadores de enrutadores).
Traducir el viernes 17 de septiembre de 1999, 00:35:57 MET DST a 937'521'357 se puede hacer por,
por ejemplo, usando gnu date:
fecha -d "19990917 00:35:57" +% s
También puede volcar la base de datos y ver dónde comienzan a conocerse los datos. Existen
Varias otras formas de hacer esto, solo elija una.
Ahora tenemos que crear la magia que nos permita procesar valores desconocidos diferentes
dependiendo de la hora en que se tomó la muestra. Este es un proceso de tres pasos:
1. Si la marca de tiempo del valor es posterior a 937'521'357, déjela como está.
2. Si el valor es un valor conocido, déjelo como está.
3. Cambie el valor desconocido a cero.
Veamos la primera parte:
si (verdadero) devuelve el valor original
Reescribimos esto:
si (verdadero) devuelve "a"
si (falso) devuelve "b"
Necesitamos calcular verdadero o falso a partir del paso 1. Hay una función disponible que devuelve
la marca de tiempo de la muestra actual. Se llama, sorprendentemente, "TIEMPO". Esta vez
debe compararse con un número constante, necesitamos "GT". La salida de "GT" es verdadera o falsa
y esta es una buena entrada para "SI". Queremos "if (time> 937521357) then (return a) else
(volver b) ".
Este proceso ya se describió a fondo en el capítulo anterior, así que hagámoslo rápido:
si (x) entonces a else b
donde x representa "tiempo> 937521357"
donde a representa el valor original
donde b representa el resultado del ejemplo anterior
tiempo> 937521357 -> TIEMPO, 937521357, GT
si (x) entonces a else b -> x, a, b, IF
sustituto x -> TIEMPO, 937521357, GT, a, b, IF
sustituir a -> TIEMPO, 937521357, GT, valor, b, SI
sustituto b -> TIEMPO, 937521357, GT, valor, valor, UN, 0, valor, SI, SI
Terminamos con: "CDEF: result = TIME, 937521357, GT, value, value, UN, 0, value, IF, IF"
Esto parece muy complejo, sin embargo, como puede ver, no fue demasiado difícil de idear.
Ejemplo: Pretendiendo extraño datos no es there
Suponga que tiene un problema que se muestra como grandes picos en su gráfico. Tú lo sabes
sucede y por qué, por lo que decide solucionar el problema. Quizás estás usando tu
red para hacer una copia de seguridad por la noche y, al hacerlo, obtiene casi 10 MB / s mientras que el resto de
su actividad de red no produce números superiores a 100 kb / s.
Hay dos opciones:
1. Si el número supera los 100 kb / s, es incorrecto y desea enmascararlo cambiándolo
en desconocido.
2. No desea que el gráfico muestre más de 100 kb / s.
Pseudocódigo: if (número> 100) luego desconocido, más número o Pseudocódigo: if (número> 100)
luego 100 más número.
El segundo "problema" también se puede resolver utilizando la opción rígida del gráfico RRDtool,
sin embargo, esto no tiene el mismo resultado. En este ejemplo, puede terminar con un gráfico que
realiza el ajuste de escala automático. Además, si usa los números para mostrar los máximos, se establecerán en
100kb / s.
Usamos "IF" y "GT" nuevamente. "si (x) entonces (y) si no (z)" se escribe como
"CDEF: resultado = x, y, z, SI"; ahora complete x, y y z. Para x, complete "número mayor que
100 kb / s "convirtiéndose en" número, 100000, GT "(¡kilo es 1 y b / s es lo que medimos!). La" z "
la parte es "número" en ambos casos y la parte "y" es "UNKN" para desconocido o "100000"
por 100 kb / s.
Las dos expresiones CDEF serían:
CDEF: resultado = número, 100000, GT, UNKN, número, SI
CDEF: resultado = número, 100000, GT, 100000, número, SI
Ejemplo: trabajando on a a ciertos time lapso
Si desea un gráfico que abarque algunas semanas, pero solo desea ver los datos de algunos enrutadores
durante una semana, debe "ocultar" el resto del período de tiempo. No me preguntes cuando esto sucedería
sea útil, solo está aquí para el ejemplo :)
Necesitamos comparar la marca de tiempo con una fecha de inicio y una fecha de finalización. Comparar no es
difícil:
TIME, begintime, GE
TIEMPO, tiempo del fin, LE
Estas dos partes del CDEF producen 0 para falso o 1 para verdadero. Ahora podemos comprobar si
ambos son 0 (o 1) usando algunas declaraciones IF pero, como señaló Wataru Satoh, podemos
utilice las funciones "*" o "+" como un Y lógico y un O lógico.
Para "*", el resultado será cero (falso) si cualquiera de los dos operadores es cero. Para
"+", el resultado solo será falso (0) cuando se agreguen dos operadores falsos (0).
Advertencia: * cualquier * número que no sea igual a 0 se considerará "verdadero". Esto significa que, para
ejemplo, "-1,1, +" (que debería ser "verdadero o verdadero") se convertirá en FALSO ... En otras palabras,
use "+" solo si sabe con certeza que solo tiene números positivos (o cero).
Compilemos el CDEF completo:
DEF: ds0 = router1.rrd: PROMEDIO
CDEF: ds0modified = TIME, begintime, GT, TIME, endtime, LE, *, ds0, UNKN, IF
Esto devolverá el valor de ds0 si ambas comparaciones son verdaderas. Tu tambien puedes hacerlo
al revés:
DEF: ds0 = router1.rrd: PROMEDIO
CDEF: ds0modified = TIME, begintime, LT, TIME, endtime, GT, +, UNKN, ds0, IF
Esto devolverá un DESCONOCIDO si alguna de las comparaciones devuelve verdadero.
Ejemplo: Tú sospechar a have problemas y want a ver desconocido datos.
Suponga que suma el número de usuarios activos en varios servidores de terminales. Si uno de ellos
no da una respuesta (o una incorrecta) obtiene "NaN" en la base de datos ("No es un
Number ") y NaN se evalúa como Desconocido.
En este caso, le gustaría recibir una alerta y la suma de los valores restantes es de
no tiene ningún valor para ti.
Sería algo como:
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 = users1, users2, users3, users4, +, +, +
Si ahora traza todos los usuarios, los datos desconocidos en uno de los usuarios1..usuarios4 aparecerán como una brecha en
su gráfico. Desea modificar esto para mostrar una línea roja brillante, no un espacio.
Defina un CDEF adicional que se desconozca si todo está bien y es infinito si hay un desconocido
valor:
CDEF: datos incorrectos = allusers, UN, INF, UNKN, IF
"allusers, UN" evaluará como verdadero o falso, es la parte (x) del "SI"
funciona y comprueba si todos los usuarios son desconocidos. La parte (y) de la función "SI" está configurada
a "INF" (que significa infinito) y la parte (z) de la función devuelve "UNKN".
La lógica es: si (todos los usuarios == desconocido) entonces devuelve INF; de lo contrario, devuelve UNKN.
Ahora puede usar AREA para mostrar estos "datos incorrectos" en rojo brillante. Si es desconocido (porque
allusers es conocido) entonces el AREA roja no aparecerá. Si el valor es INF (porque todos los usuarios
se desconoce), el ÁREA roja se completará en el gráfico en ese momento en particular.
AREA: allusers # 0000FF: recuento combinado de usuarios
AREA: datos incorrectos # FF0000: datos desconocidos
mismos (aqui) eficiente con APILADO datos:
Si usa la pila en el ejemplo anterior (como lo haría yo), entonces no sume los valores.
Por lo tanto, no hay relación entre los cuatro valores y no obtienes un solo
valor para probar. Suponga que los usuarios3 serían desconocidos en un momento determinado: los usuarios1 están graficados,
users2 se apila encima de users1, users3 es desconocido y, por lo tanto, no sucede nada,
users4 se apila encima de users2. Agregue los CDEF adicionales de todos modos y utilícelos para superponer
el gráfico "normal":
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 = users1, users2, users3, users4, +, +, +
CDEF: datos incorrectos = allusers, UN, INF, UNKN, IF
AREA: users1 # 0000FF: usuarios en ts1
PILA: usuarios2 # 00FF00: usuarios en ts2
PILA: usuarios3 # 00FFFF: usuarios en ts3
PILA: usuarios4 # FFFF00: usuarios en ts4
AREA: datos incorrectos # FF0000: datos desconocidos
Si hay datos desconocidos en uno de los usuarios1..usuarios4, se dibujará el ÁREA de "datos incorrectos" y
Debido a que comienza en el eje X y tiene una altura infinita, sobrescribirá efectivamente el
Piezas apiladas.
Puede combinar las dos líneas CDEF en una (no usamos "allusers") si lo desea. Pero
hay buenas razones para escribir dos CDEFS:
· Mejora la legibilidad del guión.
· Se puede utilizar dentro de GPRINT para mostrar el número total de usuarios.
Si opta por combinarlos, puede sustituir los "allusers" del segundo CDEF por
la parte después del signo igual de la primera línea:
CDEF: datos incorrectos = usuarios1, usuarios2, usuarios3, usuarios4, +, +, +, UN, INF, UNKN, IF
Si lo hace, no podrá utilizar estos siguientes GPRINT:
COMENTARIO: "Número total de usuarios vistos"
GPRINT: allusers: MAX: "Máximo:% 6.0lf"
GPRINT: allusers: MIN: "Mínimo:% 6.0lf"
GPRINT: todos los usuarios: PROMEDIO: "Promedio:% 6.0lf"
GPRINT: allusers: LAST: "Actual:% 6.0lf \ n"
El ejemplos Desde los RRD gráfica manual página
Grados Celsius vs Grados Fahrenheit
Para convertir Celsius en Fahrenheit, use la fórmula F = 9/5 * C + 32
rrdtool graph demo.png --title = "Gráfico de demostración" \
DEF: cel = demo.rrd: exhaust: AVERAGE \
CDEF: lejos = 9,5, /, cel, *, 32, + \
LINE2: cel # 00a000: "D. Celsius" \
LINE2: far # ff0000: "D. Fahrenheit \ c"
Este ejemplo obtiene el DS llamado "exhaust" de la base de datos "demo.rrd" y coloca los valores en
variable "cel". El CDEF utilizado se evalúa de la siguiente manera:
CDEF: lejos = 9,5, /, cel, *, 32, +
1. presione 9, presione 5
2. Pulse la función "dividir" y procese.
la pila ahora contiene 9/5
3. presione la variable "cel"
4. Pulse la función "multiplicar" y procese.
la pila ahora contiene 9/5 * cel
5. presione 32
6. presione la función "más" y procesela
la pila contiene ahora la temperatura en Fahrenheit
Cambiar desconocido into cero
rrdtool graph demo.png --title = "Gráfico de demostración" \
DEF: idat1 = interface1.rrd: ds0: PROMEDIO \
DEF: idat2 = interface2.rrd: ds0: PROMEDIO \
DEF: odat1 = interface1.rrd: ds1: PROMEDIO \
DEF: odat2 = interface2.rrd: ds1: PROMEDIO \
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: Input Aggregate \
LINE1: aggoutput # 0000FF: Agregado de salida
Estos dos CDEF se construyen a partir de varias funciones. Ayuda dividirlos al ver lo que
ellas hacen. Comenzando con el primer CDEF obtendríamos:
idat1, ONU -> a
0 -> b
idat1 -> c
si (a) entonces (b) si no (c)
Por tanto, el resultado es "0" si es cierto que "idat1" es igual a "UN". Si no, el original
el valor de "idat1" se vuelve a colocar en la pila. Llamemos a esta respuesta "d". El proceso es
repetido para los siguientes cinco elementos en la pila, se hace lo mismo y devolverá la respuesta
"h". Por tanto, la pila resultante es "d, h". La expresión se ha simplificado a
"d, h, +, 8, *" y ahora será fácil ver que sumamos "d" y "h", y multiplicamos el
resultado con ocho.
El resultado final es que hemos agregado "idat1" e "idat2" y en el proceso efectivamente
valores desconocidos ignorados. El resultado se multiplica por ocho, lo más probable es que convierta bytes / s
a bits / s.
Infinity demostración
rrdtool graph example.png --title = "INF demo" \
DEF: val1 = some.rrd: ds0: PROMEDIO \
DEF: val2 = some.rrd: ds1: PROMEDIO \
DEF: val3 = some.rrd: ds2: PROMEDIO \
DEF: val4 = other.rrd: ds0: PROMEDIO \
CDEF: background = val4, POP, TIME, 7200,%, 3600, LE, INF, UNKN, IF \
CDEF: wipeout = val1, val2, val3, val4, +, +, +, UN, INF, UNKN, IF \
AREA: fondo # F0F0F0 \
AREA: val1 # 0000FF: Value1 \
PILA: val2 # 00C000: Valor2 \
PILA: val3 # FFFF00: Valor3 \
PILA: val4 # FFC000: Valor4 \
AREA: whipeout # FF0000: Desconocido
Esta demostración demuestra dos formas de utilizar infinity. Es un poco complicado ver lo que sucede en
el CDEF "de fondo".
"val4, POP, TIME, 7200,%, 3600, LE, INF, UNKN, IF"
Este RPN toma el valor de "val4" como entrada y luego lo elimina inmediatamente de la pila.
usando "POP". La pila ahora está vacía, pero como efecto secundario ahora sabemos el momento en que este
se tomó muestra. Este tiempo lo pone en la pila la función "HORA".
"TIME, 7200,%" toma el módulo de tiempo y 7'200 (que son dos horas). La resultante
El valor en la pila será un número en el rango de 0 a 7199.
Para las personas que no conocen la función módulo: es el resto después de un número entero
división. Si divide 16 entre 3, la respuesta sería 5 y el resto sería 1. Entonces,
"16,3,%" devuelve 1.
Tenemos el resultado de "TIME, 7200,%" en la pila, llamémoslo "a". El inicio de la RPN
se ha convertido en "a, 3600, LE" y esto comprueba si "a" es menor o igual que "3600". Es verdad
la mitad del tiempo. Ahora tenemos que procesar el resto del RPN y esto es solo un simple
Función "IF" que devuelve "INF" o "UNKN" según la hora. Esto es devuelto
a la variable "fondo".
El segundo CDEF se ha discutido anteriormente en este documento, por lo que no lo haremos aquí.
Ahora puedes dibujar las diferentes capas. Comience con el fondo que sea desconocido
(nada que ver) o infinito (se llena toda la parte positiva del gráfico).
A continuación, dibuja los datos sobre este fondo, se superpondrá al fondo. Suponer
uno de val1..val4 sería desconocido, en ese caso terminará con solo tres barras apiladas
Encima del otro. No quiere ver esto porque los datos solo son válidos cuando todos
cuatro variables son válidas. Es por eso que usa el segundo CDEF, superpondrá los datos
con un AREA para que los datos ya no se puedan ver.
Si sus datos también pueden tener valores negativos, también debe sobrescribir la otra mitad de
su gráfico. Esto se puede hacer de una manera relativamente simple: lo que necesita es el "wipeout"
variable y coloque un signo negativo antes: "CDEF: wipeout2 = wipeout, -1, *"
Filtrado: datos
Puede realizar un filtrado de datos complejo:
FILTRO MEDIANO: filtra el ruido de disparo
DEF: var = database.rrd: tráfico: PROMEDIO
CDEF: prev1 = PREV (var)
CDEF: prev2 = PREV (prev1)
CDEF: mediana = var, prev1, prev2,3, SORT, POP, EXC, POP
LINE3: mediana # 000077: filtrado
LINE1: prev2 # 007700: 'datos sin procesar'
DERIVAR:
DEF: var = database.rrd: tráfico: PROMEDIO
CDEF: prev1 = PREV (var)
CDEF: tiempo = var, POP, TIEMPO
CDEF: prevtime = PREV (hora)
CDEF: derivate = var, prev1, -, time, prevtime, -, /
LINE3: derivada # 000077: derivada
LINE1: var # 007700: 'datos sin procesar'
Oct of ideas para ahora
Este documento fue creado a partir de preguntas hechas por mí o por otras personas en el
Lista de correo RRDtool. Por favor, avíseme si encuentra errores en él o si tiene problemas.
entendiéndolo. Si cree que debería haber una adición, envíeme un correo electrónico:
<[email protected]>
Recuerde: No dejan comentarios, iguales no cambios!
Use cdeftutorial en línea usando los servicios de onworks.net