Measuring VM Traffic on CloudSigma

Cómo medir el tráfico de un su VM con la API de Cloudsigma y RRDtool

Aprenda a medir el tráfico de sus máquinas virtuales en CloudSigma usando las sencillas instrucciones a continuación, para obtener, almacenar y graficar el tráfico de nuestras diferentes interfaces de red. Para obtener los estadísticos de cada interface podemos hacer uso de la API de CloudSigma y un sencillo script que almacenará los datos de cada interfaz de red.

La base de datos a usar en este ejemplo es RRDTool que es una base de datos especializada en series de tiempo, también puedes usar otras bases de datos similares como InfluxDB o Graphite, pero para este ejemplo seguiremos con el viejo y confiable RRDTool que se encuentra disponible en todas las distribuciones de Linux, además también necesitaremos instalar el comando `jq`.

El primer paso será crear una base de datos donde almacenaremos el tráfico de nuestra interface de red a monitorear en nuestro directorio designado:

rrdtool create your_file_name.rrd --step 300 \
    DS:traffic_in:COUNTER:600:0:100000000 DS:traffic_out:COUNTER:600:0:100000000 \
    RRA:AVERAGE:0.5:1:600 RRA:AVERAGE:0.5:6:700 RRA:AVERAGE:0.5:24:775 
    RRA:AVERAGE:0.5:288:797 \
    RRA:MAX:0.5:1:600 RRA:MAX:0.5:6:700 RRA:MAX:0.5:24:775 RRA:MAX:0.5:288:797

Con este comando estamos creando una base de datos con dos Data Sources (DS), una para el tráfico de entrada (traffic_in) y otra para el tráfico de salida (traffic_out). La siguiente parte será obtener los estadísticos de la interface con la API de CloudSigma. Primero que nada obtendremos la cadena para autenticarnos con la API de CloudSigma:

echo -n "username@usermail:password' | base64

Con esto obtendremos una cadena de texto con el usuario y password en base 64 que usaremos en el script para obtener los datos:

#!/bin/bash
# Filename: update_script.sh
 
location="zrh"
authentication="Your_username_and_password_in_base64"
server="uuid_of_your_guest"
 
data=`curl -sLH "Authorization: Basic $authentication" -H "Content-type: application/json" https://$location.cloudigma.com/api/2.0/servers/$server/?limit=0`
 
tx=`echo $data | jq  '.nics[] | .runtime | select(.interface_type=="public") | .io | .bytes_recv'`
rx=`echo $data | jq  '.nics[] | .runtime | select(.interface_type=="public") | .io | .bytes_sent'`
 
rrdtool update $server.rrd N:$rx:$tx

Este script obtendrá los bytes recibidos y enviados en la interface con IP pública y los guardará en el archivo rrd. Es importante notar que el tx y rx para la API de cloudsigma están invertidos en la máquina virtual. Es decir que si la API reporta 20 Megabytes de recepción (rx), la máquina virtual reportará esos 20 Megabytes en la transmisión (tx)

Ejemplo:

API			        VM
tx 75 Mb ---------> rx 75 Mb
rx 20 Mb <--------- tx 20 Mb

Ahora hay que hacer este comando periódico para que esté obteniendo los estadísticos continuamente, así que creamos un cronjob que cada 5 minutos esté alimentanodo los datos con el comando `crontab -e` y agregamos la siguiente línea al final del archivo.

*/5 * * * * /path_to_update_script.sh

Esto alimentará los datos al archivo rrd.

Finalmente podemos crear gráficas o consultar intervalos de datos también con rrdtool, digamos que queremos obtener la gráfica y el total del ancho de banda consumido en los últimos 7 días. Para el intervalo de tiempo usamos los parámetros `--end now --start end-7d`.

server="uuid_of_your_guest"
rrdtool graph $server.png --imgformat=PNG \
    --end now --start end-7d \
    --title='Bandwidth used by my Server' \
    --base=1000 --height='120' --width='500' --alt-autoscale-max  --lower-limit='0' \
    DEF:rx=$server.rrd:traffic_in:AVERAGE \
    DEF:tx=$server.rrd:traffic_out:AVERAGE \
    CDEF:cdef_rx='rx,8,*' CDEF:cdef_tx='tx,8,*' \
    CDEF:rx_mb='rx,1000000,/' CDEF:tx_mb='tx,1000000,/' \
    AREA:cdef_rx#00CF00FF:'Inbound' LINE1:cdef_tx#002A97FF:'Outbound\n' \
    VDEF:rx_total=rx_mb,TOTAL VDEF:tx_total=tx_mb,TOTAL \
    GPRINT:rx_total:'Total rx\:%8.2lf MB' \
    GPRINT:tx_total:'Total tx\:%8.2lf MB'

Con esto crearemos un gráfico con el resumen total del ancho de banda calculado por las funciones VDEF. Los intervalos de tiempo pueden calcularse como segundos desde epoch (Unix time) o especificando la referencia.

Por último les comparto la documentación y sitio oficial de RRDtool para aprender más sobre esta herramienta que tiene muchas más asombrosas funciones:

https://oss.oetiker.ch/rrdtool/doc/index.en.html