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