added rotation ...
[rrdtool.git] / doc / rrdtutorial.es.pod
1 =head1 NAME
2
3 rrdtutorial - Tutorial sobre RRDtool por Alex van den Bogaerdt
4 (Traducido al castellano por Jesús Couto Fandiño)
5
6 =for html <div align="right">Versión <a href="rrdtutorial.es.pdf">PDF</a></div>
7
8 =for html <div align="right"><a href="rrdtutorial.html">Enlish</a></div>
9
10 =head1 DESCRIPTION / DESCRIPCIÓN
11
12 RRDtool es un programa escrito por Tobias Oetiker con la
13 colaboración de muchas personas en diversas partes del mundo. Alex van
14 den Bogaerdt escribió este documento para ayudarte a entender que es
15 RRDtool y que es lo que puede hacer por ti.
16
17 La documentación que viene con RRDtool puede ser demasiado técnica
18 para algunos. Este tutorial existe para ayudarte a entender las
19 funciones básicas de RRdtool. Debe servirte de preparación para leer la
20 documentación, y además explica algunas ideas generales sobre
21 estadística, con un enfoque particular hacia las redes.
22
23 =head1 TUTORIAL
24
25 =head2 Importante
26
27 ¡Por favor, no te adelantes en la lectura de este documento! Esta
28 primera parte explica los fundamentos básicos. Puede ser aburrida,
29 pero si te saltas los fundamentos, los ejemplos no te van a tener
30 mucho sentido.
31
32 =head2 ¿Qué es RRDtool?
33
34 RRDtool significa "herramienta de bases de datos en round robin".
35 "Round robin" es una técnica que implica un número fijo de datos, y un
36 apuntador al elemento más reciente. Piensa en un circulo con unos
37 cuantos puntos dibujados alrededor del borde; estos puntos son los
38 lugares donde se pueden guardar los datos. Dibuja ahora una flecha
39 desde el centro del círculo a uno de los puntos; este es el apuntador.
40 Cuando se lee o escribe el dato actualmente apuntado, la flecha se
41 mueve al próximo elemento. Como estamos en un círculo, no hay ni
42 principio ni fin; siempre puedes seguir, eternamente. Al cabo de un
43 tiempo ya se habrán usado todas las posiciones disponibles y el
44 proceso empieza a reutilizar las antiguas. De esta forma, la base de datos
45 no crece en tamaño y, por lo tanto, no requiere ningún mantenimiento.
46 RRDtool trabaja con estas bases de datos en "round-robin", guardando y
47 recuperando datos de ellas.
48
49 =head2 ¿Qué datos pueden guardarse en una RRD?
50
51 Lo que se te ocurra. Debes poder medir algún valor dado en distintos
52 momentos en el tiempo y proveer a RRDtool de estos valores. Si puedes
53 hacer esto, RRDtool puede guardar los datos. Los valores tienen que
54 ser numéricos, pero no necesariamente enteros, como en MRTG.
55
56 Muchos ejemplos mencionan SNMP, que es el acrónimo de
57 "Simple Network Management Protocol" (Protocolo Simple de
58 Administración de Redes). Lo de "simple" se refiere al protocolo - no
59 se supone que sea fácil administrar o monitorizar una red. Cuando
60 hayas terminado con este documento, deberás saber lo suficiente para
61 entender cuando oigas a otros hablar sobre
62 SNMP. Por ahora, simplemente considera a
63 SNMP como una forma de preguntarle a los dispositivos
64 por los valores de ciertos contadores que mantienen. Son estos valores
65 de estos contadores los que vamos a almacenar en la RRD.
66
67 =head2 ¿Qué puedo hacer con esta herramienta?
68
69 RRDtool se deriva de MRTG (Multi Router
70 Traffic Grapher, Graficador De Tráfico de Múltiples Enrutadores).
71 MRTG empezó como un pequeño script para poder
72 graficar el uso de una conexión a la Internet. Luego evolucionó,
73 permitiendo graficar otras fuentes de datos, como temperatura,
74 velocidad, voltajes, cantidad de páginas impresas, etc... Lo más
75 probable es que empieces a usar RRDtool para guardar y procesar datos
76 conseguidos a través de SNMP, y que los datos
77 sean el número de bytes (o bits) transferidos desde y hacia una red u
78 ordenador. RRDtool te permite crear una base de datos, guardar los
79 datos en ellas, recuperarlos y crear gráficos en formato SVG o PNG,
80 para mostrarlos en un navegador web. Esas imágenes dependen de los
81 datos que hayas guardado y pueden, por ejemplo, ser un sumario del
82 promedio de uso de la red, o los picos de tráfico que ocurrieron.
83 También lo puedes usar para mostrar el nivel de las mareas, la
84 radiación solar, el consumo de electricidad, el número de visitantes
85 en una exposición en un momento dado, los niveles de ruido cerca del
86 aeropuerto, la temperatura en tu lugar de vacaciones favorito, o en
87 la nevera, o cualquier otra cosa que te puedas imaginar, mientras
88 tengas algún sensor con el cual medir los datos y seas capaz de
89 pasarle los números a RRDtool.
90
91 =head2 ¿Y si aún tengo problemas después de leer este documento?
92
93 Lo primero, ¡léelo otra vez!. Puede que te hayas perdido de algo.
94 Si no puedes compilar el código fuente y usas un sistema operativo
95 bastante común, casi seguro que no es la culpa de RRDtool.
96 Probablemente consigas versiones pre-compiladas por la Internet. Si
97 provienen de una fuente confiable, úsalas. Si, por otro lado, el
98 programa funciona, pero no te da los resultados que tu esperabas,
99 puede ser un problema con la configuración; revísala y
100 compárala con los ejemplos.
101
102 Hay una lista de correo electrónico y una archivo de la misma. Lee
103 la lista durante unas cuantas semanas, y busca en el archivo. Es
104 descortés hacer una pregunta sin haber revisado el archivo; ¡puede que
105 tu problema ya haya sido resuelto antes! Normalmente ocurre así en todas
106 las listas de correo, no sólo esta. Examina la documentación que vino
107 con RRDtool para ver donde está el archivo y como usarlo.
108
109 Te sugiero que te tomes un momento y te subscribas a la lista ahora
110 mismo, enviando un mensaje a rrd-users-request@list.ee.ethz.ch
111 con título C<subscribe>. Si eventualmente deseas salirte de la lista,
112 envía otro correo a la misma dirección, con título C<unsubscribe>.
113
114 =head2 ¿Cómo me vas a ayudar?
115
116 Dándote descripciones y ejemplos detallados. Asumimos que el seguir
117 las instrucciones en el orden en que se presentan aquí te dará
118 suficiente conocimiento  de RRDtool como para que experimentes por tu
119 cuenta. Si no funciona a la primera, puede que te hallas saltado algo;
120 siguiendo los ejemplos obtendrás algo de experiencia práctica y, lo
121 que es más importante, un poco de información sobre como funciona el
122 programa.
123
124 Necesitarás saber algo sobre números hexadecimales. Si no, empieza
125 por leer "bin_dec_hex" antes de continuar.
126
127 =head2 Tu primera base de datos en round-robin
128
129 En mi opinión, la mejor forma de aprender algo es haciéndolo. ¿Por
130 qué no empezamos ya? Vamos a crear una base de datos, poner unos cuantos
131 valores en ella y extraerlos después. La salida que obtengas debe ser
132 igual a la que aparece en este documento.
133
134 Empezaremos con algo fácil, comparando un coche con un enrutador, o
135 por decirlo de otra forma, comparando kilómetros con bits y bytes. A
136 nosotros nos da lo mismo; son unos números obtenidos en un espacio de tiempo.
137
138 Asumamos que tenemos un dispositivo que transfiere bytes desde y
139 hacia la Internet. Este dispositivo tiene un contador que empieza en 0
140 al encenderse y se incrementa con cada byte transferido. Este contador
141 tiene un valor máximo; si ese valor se alcanza y se cuenta un byte
142 más, el contador vuelve a empezar desde cero. Esto es exactamente lo
143 mismo que pasa con muchos contadores, como el cuentakilómetros del
144 coche. En muchas de las disertaciones sobre redes se habla de bits por
145 segundo, así que empezaremos por acostumbrarnos a esto. Asumamos que un
146 byte son 8 bits y empecemos a pensar en bits y no en bytes. ¡El
147 contador, sin embargo, sigue contando en bytes! En el mundo
148 SNMP, la mayoría de los contadores tienen una
149 longitud de 32 bits. Esto significa que pueden contar desde 0 hasta
150 4294967295. Usaremos estos valores en los ejemplos. El dispositivo, cuando 
151 le preguntamos, retorna el valor actual del contador. Como sabemos el
152 tiempo transcurrido desde la última vez que le preguntamos, sabemos
153 cuantos bytes se han transferido C<***en promedio***> por
154 segundo. Esto no es muy difícil de calcular; primero en palabras,
155 luego en operaciones:
156
157 =over 4
158
159 =item 1.
160
161 Toma el valor actual del contador y réstale el valor anterior
162
163 =item 2.
164
165 Haz lo mismo con la fecha
166
167 =item 3.
168
169 Divide el resultado del paso (1) por el resultado del paso (2).
170 El resultado es la cantidad de bytes por segundo. Si lo
171 multiplicas por ocho obtienes la cantidad de bits por segundo
172
173 =back
174
175   bps = (contador_actual - contador_anterior) / (fecha_actual - fecha_anterior) * 8
176
177 Para algunos será de ayuda traducir esto a un ejemplo automotor.
178 No prueben estas velocidades en la práctica, y si lo hacen, no me
179 echen la culpa por los resultados.
180
181 Usaremos las siguientes abreviaturas:
182
183  M:    metros
184  KM:   kilómetros (= 1000 metros).
185  H:    horas
186  S:    segundos
187  KM/H: kilómetros por hora
188  M/S:  metros por segundo
189
190
191 Vas conduciendo un coche. A las 12:05, miras el contador en el
192 salpicadero y ves que el coche ha recorrido 12345
193 KM. A las 12:10 vuelves a mirar otra vez, y dice
194 12357 KM. Quiere decir, que has recorrido 12
195 KM en cinco minutos. Un científico convertiría
196 esto en metros por segundos; esto es bastante parecido al problema de
197 pasar de bytes transferidos en 5 minutos a bits por segundo.
198
199 Viajamos 12 kilómetros, que son 12000 metros. Tardamos 5 minutos, o
200 sea 300 segundos. Nuestra velocidad es 12000M / 300S igual a 40 M/S.
201
202 También podemos calcular la velocidad en KM/H: 12 veces 5 minutos
203 es una hora, así que multiplicando los 12 KM por 12 obtenemos 144
204 KM/H. No intentes esto en casa, o por donde vivo :-)
205
206 Recuerda que estos números son tan sólo promedios. No hay forma de
207 deducir, viendo sólo los números, si fuiste a una velocidad constante.
208 Hay un ejemplo más adelante en el tutorial que explica esto.
209
210 Espero que entiendas que no hay diferencia entre calcular la
211 velocidad en M/S o bps; sólo la forma en que
212 recogemos los datos es distinta. Inclusive, la K de kilo en este
213 caso es exactamente la misma, ya que en redes k es 1000
214
215 Ahora vamos a crear una base de datos en la que guardar todos estos
216 interesantes valores. El método a usar para arrancar el programa puede
217 variar de un sistema de operación a otro, pero asumamos que lo puedes
218 resolver tu mismo en caso que se diferente en el sistema que usas.
219 Asegúrate de no sobreescribir ningún archivo en tu sistema al
220 ejecutarlo y escribe todo como una sola línea (tuve que partirlo para
221 que fuera legible), saltándote todos los caracteres '\'
222
223    rrdtool create test.rrd             \
224             --start 920804400          \
225             DS:speed:COUNTER:600:U:U   \
226             RRA:AVERAGE:0.5:1:24       \
227             RRA:AVERAGE:0.5:6:10
228
229 (o sea, escribe: C<rrdtool create test.rrd --start 920804400 DS ...>)
230
231 =head2 ¿Qué hemos creado?
232
233 Hemos creado una base de datos en round robin llamada test
234 (test.rrd), que empieza desde el mediodía del día en que empecé a
235 escribir este documento (7 de marzo de 1999). En ella se guarda una
236 fuente de datos (DS), llamada "speed", que se
237 lee de un contador. En la misma base de datos se guardan dos archivos
238 en round robin (RRAs), uno promedia los datos cada vez que se leen (o
239 sea, no hay nada que promediar), y mantiene 24 muestras (24 por 5
240 minutos = 2 horas de muestras). El otro promedia 6 muestras (media
241 hora), y guarda 10 de estos promedios (o sea, 5 horas). Las opciones
242 restantes las veremos más adelante.
243
244 RRDtool usa un formato de "fecha" especial que viene del mundo de
245 UNIX. Estas "fechas" son el número de segundos
246 que han pasado desde el primero de enero de 1970, zona UTC. Este
247 número de segundos se convierte luego en la fecha local, por lo que
248 varia según la franja horaria.
249
250 Lo más probable es que tu no vivas en la misma parte del mundo que
251 yo, por lo que tu franja horaria será diferente. En los ejemplos,
252 cuando mencione horas, puede que no sean las mismas para ti; esto no
253 afecta mucho los resultados, sólo tienes que corregir las horas
254 mientras lees. Por ejemplo, las 12:05 para mí son las 11:05 para los
255 amigos en la Gran Bretaña.
256
257 Ahora tenemos que llenar nuestra base de datos con valores. Vamos a
258 suponer que leímos estos datos:
259
260  12:05  12345 KM
261  12:10  12357 KM
262  12:15  12363 KM
263  12:20  12363 KM
264  12:25  12363 KM
265  12:30  12373 KM
266  12:35  12383 KM
267  12:40  12393 KM
268  12:45  12399 KM
269  12:50  12405 KM
270  12:55  12411 KM
271  13:00  12415 KM
272  13:05  12420 KM
273  13:10  12422 KM
274  13:15  12423 KM
275
276 Llenaremos la base de datos así:
277
278  rrdtool update test.rrd 920804700:12345 920805000:12357 920805300:12363
279  rrdtool update test.rrd 920805600:12363 920805900:12363 920806200:12373
280  rrdtool update test.rrd 920806500:12383 920806800:12393 920807100:12399
281  rrdtool update test.rrd 920807400:12405 920807700:12411 920808000:12415
282  rrdtool update test.rrd 920808300:12420 920808600:12422 920808900:12423
283
284 Lo que significa: actualiza nuestra base de datos test con los
285 siguientes valores:
286
287  fecha 920804700, valor 12345
288  fecha 920805000, valor 12357
289  
290  etcétera.
291
292 Como ves, pueden introducirse más de un valor en la base de datos
293 por ejecución del comando. Yo los agrupo de tres en tres para hacerlo
294 legible, pero en realidad el máximo depende del sistema de operación.
295
296 Ahora podemos recuperar los datos usando ``rrdtool fetch'':
297
298  rrdtool fetch test.rrd AVERAGE --start 920804400 --end 920809200
299
300 Debes obtener esto como salida:
301
302                     speed
303  
304  920804400:        NaN
305  920804700:        NaN
306  920805000: 4.0000000000e-02
307  920805300: 2.0000000000e-02
308  920805600: 0.0000000000e+00
309  920805900: 0.0000000000e+00
310  920806200: 3.3333333333e-02
311  920806500: 3.3333333333e-02
312  920806800: 3.3333333333e-02
313  920807100: 2.0000000000e-02
314  920807400: 2.0000000000e-02
315  920807700: 2.0000000000e-02
316  920808000: 1.3333333333e-02
317  920808300: 1.6666666667e-02
318  920808600: 6.6666666667e-03
319  920808900: 3.3333333333e-03
320  920809200:        NaN
321
322 Si no, hay algo mal. Probablemente tu sistema de operación muestre ``NaN''
323 de otra forma; representa "Not a Number", o sea "No es un número". Si
324 aparece ``U'' o ``UNKN'' o algo parecido, es lo mismo. Si hay alguna otra
325 diferencia, probablemente te equivocaste al introducir algún P valor
326 (asumiendo que mi tutorial está bien, por supuesto :-). En ese caso, borra
327 la base de datos y prueba de nuevo.
328
329 Lo que representa exactamente esta salida lo vamos más adelante en el tutorial.
330
331 =head2 Hora de hacer algunos gráficos
332
333 Prueba este comando:
334
335  rrdtool graph speed.png                                 \
336          --start 920804400 --end 920808000               \
337          DEF:myspeed=test.rrd:speed:AVERAGE              \
338          LINE2:myspeed#FF0000
339
340 Este comando crea speed.png, un gráfico de los datos desde las
341 12:00 hasta las 13:00. Contiene una definición de la variable myspeed
342 y define el color como rojo. Notarás que el gráfico no comienza
343 exactamente a las 12:00 sino a las 12:05, y es porque no tenemos datos
344 suficientes como para calcular el promedio de velocidad antes de ese
345 momento. Esto sólo ocurre en caso de que se pierdan algún muestreo, lo
346 que esperamos que no debe ocurrir muy a menudo.
347
348 Si ha funcionado, ¡felicitaciones!. Si no, revisa qué puede estar mal.
349
350 La definición de colores se construye a partir del rojo, verde y
351 azul. Especificas cuanto de cada uno de estos componentes vas a usar
352 en hexadecimal: 00 significa "nada de este color" y FF significa
353 "este color a máxima intensidad". El "color" blanco es la mezcla
354 del rojo, verde y azul a toda intensidad:
355 FFFFFF; el negro es la ausencia de todos los colores: 000000.
356
357    rojo    #FF0000
358    verde   #00FF00
359    azul    #0000FF
360    violeta #FF00FF     (mezcla de rojo y azul)
361    gris    #555555     (un tercio de cada uno de los colores)
362
363 El archivo PNG que acabas de crear puede
364 verse con tu visor de archivos de imagen favorito. Los navegadores lo
365 mostrarán usando la URL
366 ``file://el/camino/de/directorios/hasta/speed.png''
367
368 =head2 Gráficos con un poco de matemática
369
370 Cuando veas la imagen, notarás que el eje horizontal tiene unas
371 etiquetas marcando las 12:10, 12:20, 12:30, 12:40 y 12:50. Los otros
372 dos momentos (12:00 y 13:00) no se pueden mostrar bien por falta de datos, así que
373 el programa se los salta. El eje vertical muestra el rango de los valores que
374 entramos. Introdujimos los kilómetros y luego dividimos entre 300
375 segundos, por lo que obtuvimos valores bastante bajos. Para ser
376 exactos, el primer valor, 12 (12357-12345), dividido entre 300 da
377 0.04, lo que RRDtool muestra como ``40m'', o sea ``40/1000''. ¡La
378 ``m''' no tiene nada que ver con metros, kilómetros o milímetros!.
379 RRDtool no sabe nada de unidades, el sólo trabaja con números, no con
380 metros.
381
382 Donde nos equivocamos fue en que debimos medir en metros. Así,
383 (12357000-12345000)/300 = 12000/300 = 40.
384
385 Vamos a corregirlo. Podríamos recrear la base de datos con los
386 valores correctos, pero hay una forma mejor: ¡haciendo los cálculos
387 mientras creamos el archivo png!
388
389    rrdtool graph speed2.png                           \
390       --start 920804400 --end 920808000               \
391       --vertical-label m/s                            \
392       DEF:myspeed=test.rrd:speed:AVERAGE              \
393       CDEF:realspeed=myspeed,1000,*                   \
394       LINE2:realspeed#FF0000
395
396 Cuando veas esta imagen, notarás que la ``m'' ha desaparecido, y
397 ahora tienes los resultados correctos. Además hemos añadido una
398 etiqueta a la imagen. Apartando esto, el archivo PNG es el mismo.
399
400 Las operaciones están en la sección del CDEF
401 y están escritas en Notación Polaca Inversa (Reverse Polish Notation o
402 ``RPN''). En palabras, dice: "toma la fuente de
403 datos myspeed y el numero 1000, y multiplícalos". No te molestes en
404 meterte con RPN todavía, la veremos con más
405 detalle más adelante. Además, puede que quieras leer mi tutorial sobre
406 los CDEF y el tutorial de Steve Rader sobre RPN, pero primero terminemos con este.
407
408 ¡Un momento! Si podemos multiplicar los valores por mil, entonces,
409 ¡también debería ser posible el mostrar la velocidad en kilómetros por
410 hora usando los mismos datos!
411
412 Para cambiar el valor que medimos en metros por segundo, calculamos
413 los metros por hora (valor * 3600) y dividimos entre 1000 para sacar
414 los kilómetros por hora. Todo junto hace valor * (3600/1000) == valor
415 * 3.6.
416
417 Como en nuestra base de datos cometimos un error guardando los
418 valores en kilómetros, debemos compensar por ello, multiplicando por
419 100, por lo que al aplicar esta corrección nos queda valor * 3600.
420
421 Ahora vamos a crear este png, agreándole un poco más de magia...
422
423    rrdtool graph speed3.png                           \
424       --start 920804400 --end 920808000               \
425       --vertical-label km/h                           \
426       DEF:myspeed=test.rrd:speed:AVERAGE              \
427       "CDEF:kmh=myspeed,3600,*"                       \
428       CDEF:fast=kmh,100,GT,kmh,0,IF                   \
429       CDEF:good=kmh,100,GT,0,kmh,IF                   \
430       HRULE:100#0000FF:"Maximum allowed"              \
431       AREA:good#00FF00:"Good speed"                   \
432       AREA:fast#FF0000:"Too fast"
433
434 Esto luce mucho mejor. La velocidad en KM/H,
435 y además tenemos una línea extra mostrando la velocidad máxima
436 permitida (en el camino por donde conduzco). También le cambie los
437 colores de la velocidad, y ahora paso de ser una línea a un área.
438
439 Los cálculos son más complejos ahora. Para calcular la velocidad "aceptable":
440
441    Verifica si la velocidad en kmh es mayor que 100     ( kmh,100 ) GT           
442    Si es así, retorna 0, si no, retorna la velocidad    ((( kmh,100 ) GT ), 0, kmh) IF
443
444 Para calcular la parte de velocidad "excesiva":
445
446    Verifica si la velocidad en kmh es mayor que 100     ( kmh,100 ) GT
447    Si es así, retorna la velocidad, si no, retorna 0    ((( kmh,100) GT ), kmh, 0) IF
448
449 =head2 Magia gráfica
450
451 Me gusta creer que virtualmente no hay limites para lo que RRDtool puede
452 hacer con los datos. No voy a explicarlo en detalle, pero mira este PNG:
453
454    rrdtool graph speed4.png                           \
455       --start 920804400 --end 920808000               \
456       --vertical-label km/h                           \
457       DEF:myspeed=test.rrd:speed:AVERAGE              \
458       "CDEF:kmh=myspeed,3600,*"                       \
459       CDEF:fast=kmh,100,GT,100,0,IF                   \
460       CDEF:over=kmh,100,GT,kmh,100,-,0,IF             \
461       CDEF:good=kmh,100,GT,0,kmh,IF                   \
462       HRULE:100#0000FF:"Maximum allowed"              \
463       AREA:good#00FF00:"Good speed"                   \
464       AREA:fast#550000:"Too fast"                     \
465       STACK:over#FF0000:"Over speed"
466
467 Vamos a crear una página HTML simple para ver los tres archivos PNG:
468
469    <HTML><HEAD><TITLE>Velocidad</TITLE></HEAD><BODY>
470    <IMG src="speed2.png" alt="Speed in meters per second">
471    <BR>
472    <IMG src="speed3.png" alt="Speed in kilometers per hour">
473    <BR>
474    <IMG src="speed4.png" alt="Traveled too fast?">
475    </BODY></HTML>
476
477 Guárdalo como ``speed.html'' o algo parecido, y examínalo con un navegador.
478
479 Ahora, todo lo que tienes que hacer es medir los datos regularmente
480 y actualizar la base de datos. Cuando quieras verlos, vuelve a crear
481 los archivos PNG y asegúrate que se carguen de nuevo en tu navegador
482 (Nota: presionar el botón de "refrescar" puede no ser suficiente; en
483 particular, Netscape tiene un problema al respecto, por lo que
484 necesitaras darle al botón mientras presionas la tecla de mayúsculas.
485
486 =head2 Actualizaciones de verdad
487
488 Ya hemos usado el comando ``update''; vimos que recibia uno o más
489 parámetros en el formato: ``E<lt>fechaE<gt>:E<lt>valorE<gt>''. Para
490 facilitarte las cosas, puedes obtener la fecha actual colocando
491 ``N'' en la fecha. También podrías usar la función
492 ``time'' de Perl para obtenerla. El ejemplo más corto de todo el
493 tutorial :)
494
495    perl -e 'print time, "\n" '
496
497 Ahora, la forma de poner a correr un programa a intervalos
498 regulares de tiempo depende del sistema de operación. La
499 actualización, en pseudo-código, sería:
500
501    Toma el valor, colócalo en la variable "$speed"
502    rrdtool update speed.rrd N:$speed
503
504 (Pero no lo hagas sobre nuestra base de datos de pruebas, que aún
505 la vamos a usar en otros ejemplos.
506
507 Eso es todo. Ejecutando este script cada 5 minutos, lo único que
508 tienes que hacer para ver los gráficos actuales es correr los ejemplos
509 anteriores, que también puedes poner en un script. Luego de correrlo,
510 basta con cargar index.html
511
512 =head2 Unas palabras sobre SNMP
513
514 Me imagino que muy pocas personas serán capaces de obtener en su
515 ordenador datos reales de su coche cada 5 minutos; los demás nos
516 tendremos que conformar con algún otro contador. Puedes, por ejemplo,
517 medir la cantidad de páginas que ha hecho una impresora, cuanto café
518 has hecho con la cafetera, el medidor del consumo de electricidad, o
519 cualquier otra cosa. Cualquier contador incremental puede
520 monitorizarse y graficarse con lo que has aprendido hasta ahora. Más
521 adelante, veremos también como monitorizar otro tipo de valores, como
522 la temperatura. La mayoría usaremos alguna vez un contador que lleve
523 la cuenta de cuantos octetos (bytes) a transferido un dispositivo de
524 red, así que vamos a ver como hacer esto. Empezaremos describiendo
525 como recoger los datos. Hay quien dirá que hay herramientas que pueden
526 recoger estos datos por ti. ¡Es cierto! Pero, creo que es importante
527 darse cuenta de que no son necesarias. Cuando tienes que determinar
528 porqué algo no funciona, necesitas saber cómo funciona en primer lugar.
529
530 Una herramienta que mencionamos brevemente al principio del
531 documento es SNMP. SNMP es una forma de comunicarse con tus equipos.
532 La herramienta particular que voy a usar más adelante se llama
533 ``snmpget'', y funciona así:
534
535    snmpget dispositivo clave OID
536
537 En "dispositivo" colocas el nombre o dirección IP del equipo a
538 monitorizar. En clave, colocas la "cadena de caracteres de la
539 comunidad de lectura", como se le denomina en el mundillo SNMP.
540 Muchos dispositivos aceptarán "public" como
541 cadena por defecto, pero por razones de privacidad y seguridad esta
542 clave puede estar deshabilitada. Consulta la documentación
543 correspondiente al dispositivo o programa.
544
545 Luego esta el tercer parámetro, llamado OID
546 (Object IDentifier, identificador de objeto).
547
548 Al principio, cuando empiezas a aprender sobre SNMP, parece muy
549 confuso. No lo es tanto cuando le hechas una ojeada a los
550 ``MIB'' (Manager Information Base, o Base de
551 Información Administrativa). Es un árbol invertido que describe los
552 datos, empezando en un nodo raíz desde el que parten varias ramas.
553 Cada rama termina en otro nodo y puede abrir nuevas sub-ramas. Cada
554 rama tiene un nombre, y forman un camino que nos lleva hasta el fondo
555 del árbol. En este ejemplo, las ramas que vamos a tomar se llaman iso,
556 org, dod, internet, mgmt y mib-2. También pueden accederse por su
557 número relativo; en este caso, estos números son 1, 3, 6, 1, 2 y 1:
558
559    iso.org.dod.internet.mgmt.mib-2 (1.3.6.1.2.1)
560
561 En algunos programas se usa un punto al iniciar el OID. Esto puede
562 ser confuso; no hay ningún punto inicial en la especificación de los
563 OID... sin embargo, algunos programas usan por defecto un prefijo
564 inicial. Para indicar la diferencia entre los OID abreviados (o sea, a
565 los que se le pondrá el prefijo inicial) y los completos, estos
566 programas necesitan que los OID completos empiecen por un punto. Para
567 empeorar las cosas, se usan varios prefijos distintos...
568
569 De acuerdo, sigamos con el inicio de nuestro OID: teníamos
570 1.3.6.1.2.1 . Ahora, nos interesa la rama ``interfaces'', que tiene el
571 número dos (o sea, 1.3.6.1.2.1.2, o 1.3.6.1.2.1.interfaces).
572
573 Lo primero es hacernos con un programa SNMP. Busca algún 
574 paquete pre-compilado para tu plataforma, si no, puedes
575 buscar el código fuente y compilarlo tu mismo. En Internet encontrarás
576 muchos programas, búscalos con un motor de búsqueda o como prefieras.
577 Mi sugerencia es que busques el paquete CMU-SNMP, que esta bastante difundido.
578
579 Asumamos que ya tienes el programa. Empecemos por tomar ciertos
580 datos que están disponibles en la mayoría de los sistemas. Recuerda:
581 hay un nombre abreviado para la parte del árbol que más nos interesa.
582
583 Voy a usar la versión corta, ya que creo que este documento ya es
584 lo bastante largo. Si no te funciona, añádele el prefijo .1.3.6.1.2.1
585 y prueba de nuevo. O prueba leyendo el manual; sáltate las partes que
586 no entiendas aún, y busca las secciones que hablan de como arrancar y
587 usar el programa.
588
589    snmpget myrouter public system.sysdescr.0
590
591 El dispositivo deberá contestarte con una descripción, probablemente
592 vacía, de sí mismo. Si no consigues una respuesta válida, prueba con
593 otra "clave" u otro dispositivo; no podemos seguir hasta tener un
594 resultado.
595
596    snmpget myrouter public interfaces.ifnumber.0
597
598 Con suerte, usando este comando obtendrás un número como resultado:
599 el número de interfaces del dispositivo. Si es así, seguiremos
600 adelante con otro programa, llamado "snmpwalk"
601
602    snmpwalk myrouter public interfaces.iftable.ifentry.ifdescr
603
604 Si obtienes una lista de interfaces, ya casi hemos llegado. Aquí
605 tienes un ejemplo del resultado:
606
607    [user@host /home/alex]$ snmpwalk cisco public 2.2.1.2   
608    interfaces.ifTable.ifEntry.ifDescr.1 = "BRI0: B-Channel 1"
609    interfaces.ifTable.ifEntry.ifDescr.2 = "BRI0: B-Channel 2"
610    interfaces.ifTable.ifEntry.ifDescr.3 = "BRI0" Hex: 42 52 49 30
611    interfaces.ifTable.ifEntry.ifDescr.4 = "Ethernet0"
612    interfaces.ifTable.ifEntry.ifDescr.5 = "Loopback0"
613
614 En este equipo CISCO, quiero monitorizar la interfaz "Ethernet0".
615 Viendo que es la cuarta, pruebo con:
616
617    [user@host /home/alex]$ snmpget cisco public 2.2.1.10.4 2.2.1.16.4
618  
619    interfaces.ifTable.ifEntry.ifInOctets.4 = 2290729126
620    interfaces.ifTable.ifEntry.ifOutOctets.4 = 1256486519
621
622 Entonces, tengo 2 OIDs que monitorizar, y son (en el formato largo, ahora):
623
624    1.3.6.1.2.1.2.2.1.10
625  
626         y
627  
628    1.3.6.1.2.1.2.2.1.16
629
630 , ambas con el número de interfaz de 4
631
632 No te engañes, esto no lo logre yo al primer intento. Me tomó un
633 tiempo entender lo que significaban todos estos números; ayuda cuando
634 se traducen en un texto descriptivo... por lo menos, cuando oigas
635 hablar de MIBs y OIDs, ahora sabrás de qué se trata. No te olvides
636 del número de interfaz (0 si el valor no depende de una interfaz), y
637 prueba con snmpwalk si no obtienes una respuesta clara con snmpget.
638
639 Si entendiste todo esto, y obtienes resultados del dispositivo con
640 el que estás probando, sigue adelante con el tutorial. Si no, vuelve a
641 leer esta sección; es importante
642
643 =head2 Un ejemplo real
644
645 Ok, empecemos con la diversión. Primero, crea una base de datos
646 nueva. Vamos a guardar en ella 2 contadores, "input" y "ouput". Los
647 datos los vamos a guardar en archivos que los promediarán, tomando
648 grupos de 1, 6, 24 o 288 muestras. También archivaremos los valores
649 máximos. Lo explicaremos con más detalle después. El intervalo de
650 tiempo entre las muestras será de 300 segundos (5 minutos).
651
652  1 muestra "promediada" sigue siendo 1 muestra cada 5 minutos
653  6 muestras promediadas son un promedio de cada 30 minutos
654  24 muestras promediadas son un promedio de cada 2 horas
655  288 muestras promediadas son un promedio de cada día
656
657 Vamos a tratar de ser compatibles con MRTG, que guarda más o menos
658 esta cantidad de datos:
659
660  600 muestras de 5 minutos:          2 días y 2 horas
661  600 promedios de 30 minutos:        12.5 días
662  600 promedios de 2 horas:           50 días
663  600 promedios de 1 día:             732 días
664
665 Uniendo todos estos rangos tenemos que en total guardamos datos de
666 unos 797 días. RRDtool guarda los datos de una forma distinta a MRTG;
667 no empieza el archivo "semanal" donde acaba el "diario", sino que
668 ambos archivos contienen la información más reciente, ¡por lo que con
669 RRDtool archivamos más datos que con MRTG!
670
671 Necesitaremos:
672
673  600 muestras de 5 minutos    (2 días y 2 horas)
674  700 entradas de 30 minutos   (2 días y 2 horas, más 12.5 días)
675  775 entradas de 2 horas      (lo anterior + 50 días)
676  797 entradas de 1 día        (lo anterior + 732 días, redondeando)
677
678    rrdtool create myrouter.rrd         \
679             DS:input:COUNTER:600:U:U   \
680             DS:output:COUNTER:600:U:U  \
681             RRA:AVERAGE:0.5:1:600      \
682             RRA:AVERAGE:0.5:6:700      \
683             RRA:AVERAGE:0.5:24:775     \
684             RRA:AVERAGE:0.5:288:797    \
685             RRA:MAX:0.5:1:600          \
686             RRA:MAX:0.5:6:700          \
687             RRA:MAX:0.5:24:775         \
688             RRA:MAX:0.5:288:797
689
690 Lo siguiente es recoger los datos y guardarlos, como en el ejemplo
691 siguiente. Esta parcialmente en pseudo-código, por lo que tendrás que
692 buscar exactamente como hacerlo funcionar en tu sistema operativo.
693
694    mientras no sea el fin del universo
695    hacer
696       tomar el resultado de 
697           snmpget router community 2.2.1.10.4
698       en la variable $in
699       tomar el resultado de
700           snmpget router community 2.2.1.16.4
701       en la variable $out
702       rrdtool update myrouter.rrd N:$in:$out
703       esperar 5 minutos
704    hecho
705
706 Luego, tras recoger datos por un día, crea una imagen, usando:
707
708    rrdtool graph myrouter-day.png --start -86400 \
709             DEF:inoctets=myrouter.rrd:input:AVERAGE \
710             DEF:outoctets=myrouter.rrd:output:AVERAGE \
711             AREA:inoctets#00FF00:"In traffic" \
712             LINE1:outoctets#0000FF:"Out traffic"
713
714 Este comando debe producir un gráfico del tráfico del día. Un día
715 son 24 horas, de 60 minutos, de 60 segundos: 24*60*60=86400, o sea que
716 empezamos a "ahora" menos 86400 segundos. Definimos (con los DEFs)
717 "inoctets" y "outoctets" como los valores promedio de la base da datos
718 myrouter.rrd, dibujando un área para el tráfico de entrada y una línea
719 para el tráfico de salida.
720
721 Mira la imagen y sigue recogiendo datos por unos cuantos días. Si
722 lo deseas, puedes probar con los ejemplos de la base de datos de
723 pruebas y ver si puedes hacer trabajar las diversas opciones y
724 operaciones.
725
726 Sugerencia:
727
728 Haz un gráfico que muestre el tráfico en bytes por segundo y en
729 bits por segundo. Colorea el tráfico Ethernet rojo si sobrepasa los
730 cuatro megabits por segundo.
731
732 =head2 Funciones de consolidación
733
734 Unos cuantos párrafos atrás hablábamos sobre la posibilidad de
735 guardar el valor máximo en vez del promedio. Profundicemos un poco en
736 este tema.
737
738 Recordemos lo que hablábamos sobre la velocidad de un coche.
739 Supongamos que manejamos a 144 KM/H durante 5
740 minutos y luego nos detiene la policía durante unos 25 minutos. Al
741 finalizar el regaño, tomamos nuestro portátil y creamos una imagen
742 desde nuestra base de datos. Si visualizamos la segunda RRA que
743 creamos, tendremos el promedio de 6 muestreos. Las velocidades
744 registradas serian 144+0+0+0+0+0=144, lo que en promedio nos da una
745 velocidad de 24 KM/H., con lo que nos igual nos
746 pondrían una multa, sólo que no por exceso de velocidad.
747
748 Obviamente, en este caso, no deberíamos tomar en cuenta los
749 promedios. Estos son útiles en varios casos. Por ejemplo, si queremos
750 ver cuantos KM hemos viajado, este sería el
751 gráfico más indicado. Pero por otro lado, para ver la velocidad ha la
752 que hemos viajado, los valores máximos son más adecuados.
753
754 Es lo mismo con los datos que recogemos. Si quieres saber la
755 cantidad total, mira los promedios. Si quieres ver la velocidad, mira
756 los máximos. Con el tiempo, ambas cantidades se separan cada vez más.
757 En la última base de datos que creamos, había dos archivos que
758 guardaban los datos de cada día. El archivo que guarda los promedios
759 mostrará valores bajos, mientras que el de máximos mostrará valores más
760 altos. Para mi coche, mostraría valores promedio de 96/24=4 KM/H
761 (viajo unos 96 kilómetros por día), y máximos de 1220 KM/H (la
762 velocidad máxima que alcanzo cada día)
763
764 Como ves, una gran diferencia. No mires el segundo gráfico para
765 estimar la distancia que recorro, ni al primero para estimar la
766 velocidad a la que voy. Esto sólo funciona con muestras muy cercanas,
767 pero no si sacas promedios.
768
769 Algunas veces, hago un viaje largo. Si hago un recorrido por
770 Europa, conduciendo por unas 12 horas, el primer gráfico subirá
771 a unos 60 KM/H. El segundo mostrará unos 180 KM/H. Esto significa que
772 recorrí unos 60 KM/H por 24 horas = 1440 KM. Muestra además que fui a
773 una velocidad promedio mayor a la normal y a un máximo de 180 KM/H,
774 ¡no que fui 8 horas a una velocidad fija de 180 KM/H! Este es un
775 ejemplo real: tengo que seguir la corriente en las autopistas de
776 Alemania, detenerme por gasolina y café de vez en cuando, manejar más
777 lentamente por Austria y Holanda, e ir con cuidado en las montañas y
778 las villas. Si viéramos los gráficos de los promedios de cada 5
779 minutos, la imagen sería completamente distinta; veríamos los mismos
780 valores de promedio y de máxima. (suponiendo que las mediciones fueran
781 cada 300 segundos). Se podría ver cuando paré, cuando iba en
782 primera, cuando iba por las autopistas, etc. La granularidad de los
783 datos es más alta, por lo que se tiene más información. Sin embargo,
784 esto nos lleva unas 12 muestras por hora, o 288 al día, lo cual es
785 mucho para guardar por un periodo de tiempo largo. Por lo tanto,
786 sacamos el promedio, guardando eventualmente un solo valor por día.
787 Con este único valor, no podemos ver mucho.
788
789 Es importante comprender lo que expuesto en estos últimos párrafos.
790 Unos ejes y unas líneas no tienen ningún valor por si mismos; hay que
791 saber que representan e interpretar correctamente los valores
792 obtenidos. Sean cuales sean los datos, esto siempre será cierto.
793
794 El mayor error que puedes cometer es usar los datos recogidos para
795 algo para lo cual no sirven. En ese caso, seria hasta mejor no tener
796 gráfico alguno.
797
798 =head2 Repasemos lo que sabemos
799
800 Ahora ya sabes como crear una base de datos. Puedes guardar valores
801 en ella, extraerlos creando un gráfico, hacer operaciones matemáticas
802 con ellos desde la base de datos y visualizar los resultados de estas
803 en vez de los datos originales. Vimos la diferencia entre los
804 promedios y los máximos y cuando debemos usar cada uno (o al menos una
805 idea de ello)
806
807 RRDtool puede hacer más de lo que hemos visto hasta ahora. Pero
808 antes de continuar, te recomiendo que releas el texto desde el
809 principio y pruebes a hacerle algunas modificaciones a los ejemplos.
810 Asegúrate de entenderlo todo. El esfuerzo valdrá la pena, y te ayudará,
811 no sólo con el resto del documento, sino en tu trabajo diario de
812 monitorización, mucho después de terminar con esta introducción.
813
814 =head2 Tipos de fuentes de datos
815
816 De acuerdo, quieres continuar. Bienvenido de vuelta otra vez y
817 prepárate; voy a ir más rápido con los ejemplos y explicaciones.
818
819 Ya vimos que, para ver el cambio de un contador a lo largo del
820 tiempo, tenemos que tomar dos números y dividir la diferencia entre el
821 tiempo transcurrido entre las mediciones. Para los ejemplos que hemos
822 visto es lo lógico, pero hay otras posibilidades. Por ejemplo, mi
823 enrutador me puede dar la temperatura actual en tres puntos distintos,
824 la entrada de aire, el llamado "punto caliente" y la salida de
825 ventilación. Estos valores no son contadores; si tomo los valores de
826 dos muestreos y lo divido entre 300 segundos, obtendré el cambio de
827 temperatura por segundo. ¡Esperemos que sea cero, o tendríamos un
828 incendio en el cuarto de ordenadores! :)
829
830 Entonces, ¿que hacemos? Podemos decirle a RRDtool que guarde los
831 valores tal como los medimos (esto no es exactamente así, pero se
832 aproxima bastante a la verdad). Así, los gráficos se verán mucho
833 mejor. Puedo ver cuando el enrutador está trabajando más (en serio,
834 funciona; como usa más electricidad, genera más calor y sube la
835 temperatura), puedo saber cuando me he dejado las puertas abiertas (el
836 cuarto de ordenadores tiene aire acondicionado; con las puertas
837 abiertas el aire caliente del resto del edificion entra y sube la
838 temperatura en la entrada de aire del enrutador), etc. Antes usamos un
839 tipo de datos de "contador", ahora usaremos un tipo de datos
840 diferente, con un nombre diferente, GAUGE.
841 Tenemos otros tipos:
842
843  - COUNTER este ya lo conocemos
844  - GAUGE   este acabamos de verlo
845  - DERIVE
846  - ABSOLUTE
847
848 Los otros dos tipos son DERIVE y ABSOLUTE. ABSOLUTE puede usarse
849 igual que COUNTER, con una diferencia; RRDtool asume que el contador
850 se reinicia cada vez que se lee. O en otras palabras; el delta entre
851 los valores no hay que calcularlo, mientras que con COUNTER RRDtool
852 tiene que sacar él la cuenta. Por ejemplo, nuestro primer ejemplo,
853 (12345, 12357, 12363, 12363), sería (unknown, 12, 6, 0) en ABSOLUTE.
854 El otro tipo, DERIVE, es como COUNTER, pero al contrario de COUNTER,
855 este valor también puede decrecer, por lo que puede tenerse un delta
856 negativo.
857
858 Vamos a probarlos todos:
859
860    rrdtool create all.rrd --start 978300900 \
861             DS:a:COUNTER:600:U:U \
862             DS:b:GAUGE:600:U:U \
863             DS:c:DERIVE:600:U:U \
864             DS:d:ABSOLUTE:600:U:U \
865             RRA:AVERAGE:0.5:1:10
866    rrdtool update all.rrd \
867             978301200:300:1:600:300    \
868             978301500:600:3:1200:600   \
869             978301800:900:5:1800:900   \
870             978302100:1200:3:2400:1200 \
871             978302400:1500:1:2400:1500 \
872             978302700:1800:2:1800:1800 \
873             978303000:2100:4:0:2100    \
874             978303300:2400:6:600:2400  \
875             978303600:2700:4:600:2700  \
876             978303900:3000:2:1200:3000
877    rrdtool graph all1.png -s 978300600 -e 978304200 -h 400 \
878             DEF:linea=all.rrd:a:AVERAGE LINE3:linea#FF0000:"Line A" \
879             DEF:lineb=all.rrd:b:AVERAGE LINE3:lineb#00FF00:"Line B" \
880             DEF:linec=all.rrd:c:AVERAGE LINE3:linec#0000FF:"Line C" \
881             DEF:lined=all.rrd:d:AVERAGE LINE3:lined#000000:"Line D"
882
883 =head2 RRDtool bajo el microscopio
884
885 =over 4
886
887 =item *
888
889 La línea A es un contador, por lo que
890 debe incrementarse continuamente y RRDtool tiene que calcular las
891 diferencias. Además RRDtool tiene que dividir la diferencia entre
892 el tiempo transcurrido. Esto debería terminar con una línea recta
893 en 1 (los deltas son 300, y los intervalos son de 300)
894
895 =item *
896
897 La línea B es de tipo GAUGE. Estos son
898 los valores "reales", así que el gráfico debe mostrar lo mismo que
899 los valores que introducimos: una especie de onda
900 Z<>
901
902 =item *
903
904 La línea C es de tipo DERIVE. Es un
905 contador, y puede decrecer. Va entre 2400 y 0, con 1800 en el medio.
906
907 =item *
908
909 La línea D es de tipo ABSOLUTE. Esto es,
910 es un contador pero no hay que calcular las diferencias. Los
911 números son iguales a la línea A, y espero
912 que puedas ver la diferencia en los gráficos.
913
914 =back
915
916 Esto equivale a los valores siguientes, empezando a las 23:10 y
917 terminando a las 00:10 (las U significan desconocido).
918
919
920  - Línea  A:  u  u  1  1  1  1  1  1  1  1  1  u
921  - Línea  B:  u  1  3  5  3  1  2  4  6  4  2  u
922  - Línea  C:  u  u  2  2  2  0 -2 -6  2  0  2  u
923  - Línea  D:  u  1  2  3  4  5  6  7  8  9 10  u
924
925 Si tu archivo PNG muestra todo esto, has
926 entrado los datos correctamente, tu programa RRDtool está funcionando
927 bien, el visor de gráficos no te engaña y hemos entrado en el 2000 sin
928 problemas :) Puedes probar el mismo ejemplo cuatro veces, una por cada línea.
929
930 Revisemos los datos otra vez:
931
932 =over 4
933
934 =item *
935
936 Línea A: 300, 600, 900 , etc.
937 La diferencia del contador es siempre 300, igual que el intervalo de
938 tiempo transcurrido entre mediciones. Por lo tanto, el promedio
939 siempre es 1. Pero, ¿por qué el primer punto tiene un valor de
940 "desconocido"? ¿Acaso no era conocido el valor que pusimos en la
941 base de datos? ¡Si! Pero no teníamos un valor inicial para
942 calcular la diferencia. Sería un error asumir que el contador
943 empezaba en 0, así que no conocemos el valor de la diferencia
944
945 =item *
946
947 Línea B: 
948 No hay nada que calcular, los valores son los mismos que se
949 introdujeron en la base de datos.
950
951 =item *
952
953 Línea C: 
954 De nuevo, no conocemos el valor
955 inicial antes de la primera medición, así que se aplica el mismo
956 razonamiento que para la línea A. En este
957 caso las diferencias no son constantes, así que la línea no es
958 recta. Si hubiésemos puesto los mismos valores que en la línea
959 A, el gráfico sería el mismo. Al contrario
960 que COUNTER, el valor puede decrecer, y espero mostrarte más
961 adelante el por que de la diferencia entre ambos tipos.
962
963 =item *
964
965 Línea D: En este caso, el dispositivo nos
966 da las diferencias por sí mismo. Por lo tanto, conocemos la
967 diferencia inicial, y podemos graficarla. Tenemos los mismos
968 valores que en la línea A, pero su
969 significado es distinto, por lo que el gráfico también lo es. En
970 este caso, las diferencias se incrementan en 300 cada vez,
971 mientras que el intervalo de tiempo permanece constante en 300
972 segundos, por lo que la división nos da resultados cada vez mayores.
973
974 =back
975
976 =head2 Reinicialización de los contadores
977
978 Todavía nos quedan algunas cosas por ver. Nos quedan algunas
979 opciones importantes por cubrir, y aun no hemos hablado de la
980 reinicialización de contadores. Empecemos por ahí: Estamos en nuestro
981 coche, vemos el contador y muestra 999987. Andamos unos 20 KM, así que
982 el contador debe subir a 1000007. Desafortunadamente, el contador
983 sólo tiene 6 dígitos, así que en realidad nos muestra 000007. Si
984 estuviéramos guardando los valores en un tipo DERIVE, esto
985 significaría que el contador retrocedió unos 999980 KM. Por supuesto
986 esto no es cierto, por lo que necesitamos alguna protección contra estos
987 casos. Esta protección sólo la tenemos para el tipo COUNTER, el cual
988 de todas formas era el que teníamos que haber usado para este tipo de
989 contador. ¿Cómo funciona? Los valores tipo COUNTER no deben decrecer
990 nunca, ¡por lo que RRDtool asume en ese caso que el contador se ha
991 reinicializado! Si la diferencia es negativa, esto se compensa sumando
992 el valor máximo del contador + 1. Para nuestro coche, tendríamos:
993
994  Delta = 7 - 999987 = -999980    (en vez de 1000007-999987=20)
995  
996  Delta real= -999980 + 999999 + 1 = 20
997
998 Al momento de escribir este documento, RRDtool maneja contadores de
999 32 o 64 bits de tamaño. Estos contadores pueden manejar los siguientes
1000 valores:
1001
1002  - 32 bits: 0 ..           4294967295
1003  - 64 bits: 0 .. 18446744073709551615
1004
1005 Si estos valores te parecen raros, podemos verlos en formato hexadecimal:
1006
1007  - 32 bits: 0 ..         FFFFFFFF
1008  - 64 bits: 0 .. FFFFFFFFFFFFFFFF
1009
1010 RRDtool maneja ambos contadores de la misma manera. Si ocurre un
1011 desbordamiento y la diferencia es negativa, RRDtool le suma primero
1012 el máximo del contador "menor" (32 bits) + 1 a la diferencia. Si aún
1013 así la diferencia es negativa, entonces el contador reinicializado era
1014 mayor (64 bits), por lo que se le suma el valor máximo del contador
1015 "largo" + 1 y se le resta el máximo del contador "pequeño" que sumamos
1016 erróneamente. Hay un problema con esto: supongamos que un contador
1017 largo se ha reinicializado al sumársele una diferencia muy grande;
1018 entonces es posible que al añadir el valor máximo del contador pequeño
1019 la diferencia nos dé positivo. En este caso poco probable, los valores
1020 resultantes no serian correctos. Para que ocurra esto, el incremento
1021 tiene que ser casi tan grande como el valor máximo del contador, por
1022 lo que de ocurrir es muy probable que halla varios problemas más en
1023 la configuración y no merezca la pena preocuparse sólo por este. Aún
1024 así, he incluido un ejemplo de este caso para que lo puedas juzgar por
1025 ti mismo.
1026
1027 A continuación, unos ejemplos de reinicialización de los
1028 contadores. Prueba de hacer los cálculos por ti mismo, o acepta mis
1029 resultados si tu calculadora no puede con los números :)
1030
1031 Números de corrección:
1032
1033  - 32 bits: (4294967295+1) =                                 4294967296
1034  - 64 bits: (18446744073709551615+1)-correction1 = 18446744069414584320
1035  
1036  Antes:          4294967200
1037  Incremento:            100
1038  Debería ser:    4294967300
1039  Pero es:                 4
1040  Diferencia:    -4294967196
1041  Corrección #1: -4294967196 + 4294967296 = 100
1042  
1043  Antes:          18446744073709551000
1044  Incremento:                      800
1045  Debería ser:    18446744073709551800
1046  Pero es:                         184
1047  Diferencia:    -18446744073709550816
1048  Corrección #1: -18446744073709550816 +4294967296 = -18446744069414583520
1049  Corrección #2: -18446744069414583520 +18446744069414584320 = 800
1050  
1051  Antes:          18446744073709551615 ( valor máximo )
1052  Incremento:     18446744069414584320 ( incremento absurdo, 
1053  Debería ser:    36893488143124135935   mínimo para que 
1054  Pero es:        18446744069414584319   funcione el ejemplo)       
1055  Diferencia:              -4294967296
1056  Corrección #1:  -4294967296 + 4294967296 = 0 (positivo,
1057                                                por tanto no se hace 
1058                                                la segunda corrección)
1059  
1060  Antes:          18446744073709551615 ( valor máximo )
1061  Incremento:     18446744069414584319 
1062  Debería ser:    36893488143124135934
1063  Pero es:        18446744069414584318
1064  Diferencia:              -4294967297
1065  Corrección #1:  -4294967297 +4294967296 = -1
1066  Corrección #2:  -1 +18446744069414584320 = 18446744069414584319
1067
1068 Como puede verse en los últimos ejemplos, necesitas unos valores
1069 bastante extraños para hacer que RRDtool falle (asumiendo que no tenga
1070 ningún error el programa, por supuesto), así que esto no debería
1071 ocurrir. Sin embargo, SNMP o cualquier otro
1072 método que uses de recogida de datos puede también reportar algún
1073 valor erróneo ocasionalmente. No podemos prevenir todos los errores,
1074 pero podemos tomar algunas medidas. El comando "create" de RRDtool
1075 tiene dos parámetros especialmente para esto, que definen los valores
1076 mínimo y máximo permitidos. Hasta ahora hemos usado "U",
1077 "desconocido". Si le pasas valores para uno o ambos parámetros y
1078 RRDtool recibe un valor fuera de esos límites, los ignorará. Para un
1079 termómetro en grados Celsius, el mínimo absoluto es -273. Para mi
1080 enrutador, puedo asumir que ese mínimo es mucho mayor, digamos que 10.
1081 La temperatura máxima la pondría en unos 80 grados; más alto y
1082 el aparato no funcionaría. Para mi coche, nunca esperaría obtener
1083 valores negativos, y tampoco esperaría valores mayores a 230.
1084 Cualquier otra cosa sería un error. Pero recuerda, lo contrario no es
1085 cierto: si los valores pasan este examen no quiere decir que sean los
1086 correctos. Siempre examina bien el gráfico si los valores parecen
1087 extraños.
1088
1089
1090 =head2 Remuestreo de los datos
1091
1092 Hay una funcionalidad importante de RRDtool que no hemos explicado
1093 todavía: es virtualmente imposible recoger los datos y pasarselos a
1094 RRDtool a intervalos exactos de tiempo. Por tanto, RRDtool interpola
1095 los datos a los intervalos exactos. Si no sabes que significa esto o
1096 como se hace, he aquí la ayuda que necesitas:
1097
1098 Supongamos un contador se incremente exactamente en 1 cada segundo.
1099 Queremos medirlo cada 300 segundos, por lo que deberíamos tener
1100 valores separados exactamente en 300. Sin embargo, por varias
1101 circunstancias llegamos unos segundos tarde y el intervalo es 303. La
1102 diferencia será por tanto 303. Obviamente, RRDtool no debe colocar 303
1103 en la base de datos y dar así la impresión de que el contador se
1104 incrementó 303 en 300 segundos. Aquí es donde RRDtool interpola:
1105 alterá el valor 303 al valor que tendría 3 segundos antes y guarda 300
1106 en 300 segundos. Digamos que la próxima vez llegamos justo a tiempo;
1107 por tanto, el intervalo actual es 297 segundos, por lo que el contador
1108 debería ser 297. De nuevo, RRDtool altera el valor y guarda 300, como
1109 debe ser.
1110
1111          en RRD                     en realidad
1112  tiempo+000:   0 delta="U"    tiempo+000:   0 delta="U" 
1113  tiempo+300: 300 delta=300    tiempo+300: 300 delta=300
1114  tiempo+600: 600 delta=300    tiempo+603: 603 delta=303
1115  tiempo+900: 900 delta=300    tiempo+900: 900 delta=297
1116
1117 Creemos dos bases de datos idénticas. He escogido el rango de
1118 tiempo entre 920805000 y 920805900.
1119
1120    rrdtool create seconds1.rrd   \
1121       --start 920804700          \
1122       DS:seconds:COUNTER:600:U:U \
1123       RRA:AVERAGE:0.5:1:24
1124
1125    para Unix: cp seconds1.rrd seconds2.rrd
1126    para DOS: copy seconds1.rrd seconds2.rrd
1127    para VMS:  y yo que sé :)
1128
1129    rrdtool update seconds1.rrd \
1130       920805000:000 920805300:300 920805600:600 920805900:900
1131    rrdtool update seconds2.rrd \
1132       920805000:000 920805300:300 920805603:603 920805900:900
1133
1134    rrdtool graph seconds1.png                       \
1135       --start 920804700 --end 920806200             \
1136       --height 200                                  \
1137       --upper-limit 1.05 --lower-limit 0.95 --rigid \
1138       DEF:seconds=seconds1.rrd:seconds:AVERAGE      \
1139       CDEF:unknown=seconds,UN                       \
1140       LINE2:seconds#0000FF                          \
1141       AREA:unknown#FF0000
1142    rrdtool graph seconds2.png                       \
1143       --start 920804700 --end 920806200             \
1144       --height 200                                  \
1145       --upper-limit 1.05 --lower-limit 0.95 --rigid \
1146       DEF:seconds=seconds2.rrd:seconds:AVERAGE      \
1147       CDEF:unknown=seconds,UN                       \
1148       LINE2:seconds#0000FF                          \
1149       AREA:unknown#FF0000
1150
1151 Los dos gráficos debe ser iguales.
1152
1153 =head1 RESUMEN
1154
1155 Es hora de concluir este documento. Ahora debes conocer lo básico
1156 como para trabajar con RRDtool y leer la documentación. Aún hay mucho
1157 más por descubrir acerca de RRDtool, y le encontrarás; más y más usos
1158 para la herramienta. Con los ejemplos y la herramienta puedes crear
1159 fácilmente muchos gráficos; también puedes usar las interfaces
1160 disponibles.
1161
1162 =head1 LISTA DE CORREO
1163
1164 Recuerda subscribirte a la lista de correo. Aunque no contestes los
1165 correos que aparecen en ella, te servirá de ayuda a ti y a los demás.
1166 Mucho de lo que se sobre MRTG (y por tanto sobre RRDtool), lo aprendí
1167 tan sólo con leer la lista, sin escribir. No hay por que preguntar las
1168 preguntas básicas, que ya tienen su respuesta en la FAQ (¡léela!). Con
1169 miles de usuarios a lo largo del mundo, siempre hay preguntas que tu
1170 puedes responder con lo aprendido en este y otros documentos.
1171
1172 =head1 VER TAMBIÉN
1173
1174 Las páginas del manual de RRDtool
1175
1176 =head1 AUTOR
1177
1178 Espero que hayas disfrutado con los ejemplos y las descripciones.
1179 Si es así, ayuda a otros refiriéndolos a este documento cuando te
1180 hagan preguntas básicas. No sólo obtendrán la respuesta, sino que
1181 aprenderán muchas otras cosas.
1182
1183 Alex van den Bogaerdt <alex@ergens.op.het.net>