30 sep

Send graphite data

Bueno después de explicar como instalar y configurar graphite con wsgi, vamos a ver como hacer un pequeño script para enviar los datos a graphite, pero como somos un poco vagos, vamos a utilizar uno hecho por el compañero Tomas, que podemos encontrarlo en su github basic-monitoring.sh

Con ese script de base, os explico que hace cada cosa y como tratar los datos.

Pues venga vamos al lío.

Primero de todo debemos entender como tenemos que enviarle la información a graphite, debemos enviarla con una estructura predefinida, nombredelametrica valor timestamp, un ejemplo para que se vea más claro.

servers.raspberry.loadavg_1min 0.03 1373628644

Donde

servers.raspberry.loadavg_1min -> Sera la estructura de carpetas que tendremos siendo el ultimo valor (loadavg_1min) la metrica.

0.03 -> Sera el valor de la metrica

1373628644 -> el tiempo en unixtime (segundos)

Pues vamos a ir montando opciones para cada tipo de valor.

CPU

Podemos sacar la carga de la CPU tal que así.


#!/bin/bash
now=`date +%s`
host=raspberry

#Load average
read un cinc quinze resta < /proc/loadavg
data="servers.$host.loadavg_1min $un $now n servers.$host.loadavg_5min $cinc $now n servers.$host.loadavg_15min $quinze $now n"

Si hacemos un echo $data veremos


servers.raspberry.loadavg_1min 0.03 1373628644 n servers.raspberry.loadavg_5min 0.08 1373628644 n servers.raspberry.loadavg_15min 0.08 1373628644 n

Como tenemos que enviar valor tras valor utilizaremos echo con la opcion -e para que coja cada n y lo convierta en salto de linea. Una vez tenemos los datos estructurados debemos enviarlo al puerto 2003 del servidor de graphite y esto es  tan fácil como hacer un nc.

Pues aqui el ejemplo.


echo -e $data |nc -w 5 ipdelservidor 2003 2>&2

Pues visto esto vamos a sacar las métricas de la memoria.

Memoria

Aquí lo que hacemos es sacar la información del comando free -o y lo pasamos a %,  después lo añadimos a la métrica anterior.


data="$data `free -o|awk -v host=$host -v now=$now '(NR==2) {printf("servers.%s.memory %s %s \n ", host, $3/$2*100, now)} (NR==3) {printf("servers.%s.swap %s %s\n ", host, $3/$2*100, now)}'`"

Ahora los datos de CPU y disco, que los sacaremos con el comando sar. (debemos instalar el sar si no lo tenemos, sudo apt-get install sysstat)


data="$data `sar -u 3|awk -v host=$host -v now=$now 'END {printf("servers.%s.cpu %s %s \n ", host, 100-$8, now)}'`"

data="$data `sar -b 3|awk -v host=$host -v now=$now 'END {printf("servers.%s.disk.totalops %s %s \n servers.%s.disk.readops %s %s \n servers.%s.disk.writeops %s %s \n servers.%s.disk.breads %s %s \n servers.%s.disk.bwrites %s %s \n ", host, $2, now, host, $3, now, host, $4, now, host, $5, now, host, $6, now)}'`"

Y lo enviamos todo con


echo -e $data |nc -w 5 $carbon_server 2003 2>&2

Y con esto deberíamos empezar a ver los datos aparecer en nuestro Graphite!

Bonus track

Hace poco encontré como sacar la temperatura de nuestra rasbperry y aquí os pongo los comando, que podéis unir a la lista de arriba para enviar a graphite.


# Temperatura
tempcpu=$((`cat /sys/class/thermal/thermal_zone0/temp|cut -c1-2`)).$((`cat /sys/class/thermal/thermal_zone0/temp|cut -c3-5`))
echo servers.$host.tempcpu $tempcpu $now | nc -w 5 ipservergraphite 2003 2>&2
tempgpu=`/opt/vc/bin/vcgencmd measure_temp|cut -c6-9`
echo servers.$host.tempgpu $tempgpu $now | nc -w 5 ipservergraphite 2003 2>&2

La verdad es que hay que cambiar algunas cosas partiendo del script de compañero Tomas, así que os dejo el que yo utilizo, ya que de esa forma si lo pones debe funcionar a la primera.

#!/bin/bash
now=`date +%s`
host=raspberry

#Load average
read un cinc quinze resta < /proc/loadavg
data="servers.$host.loadavg_1min $un $now n servers.$host.loadavg_5min $cinc $now n servers.$host.loadavg_15min $quinze $now n"

#Memoria
data="$data `free -o|awk -v host=$host -v now=$now '(NR==2) {printf("servers.%s.memory %s %s \n ", host, $3/$2*100, now)} (NR==3) {printf("servers.%s.swap %s %s\n ", host, $3/$2*100, now)}'`"

#Recollim CPU
data="$data `sar -u 3 3|awk -v host=$host -v now=$now 'END {printf("servers.%s.cpu %s %s \n ", host, 100-$8, now)}'`"

#Recollim dades de disc
data="$data `sar -b 3 3|awk -v host=$host -v now=$now 'END {printf("servers.%s.disk.totalops %s %s \n servers.%s.disk.readops %s %s \n servers.%s.disk.writeops %s %s \n servers.%s.disk.breads %s %s \
n servers.%s.disk.bwrites %s %s \n ", host, $2, now, host, $3, now, host, $4, now, host, $5, now, host, $6, now)}'`"

# Temperatura
tempcpu=$((`cat /sys/class/thermal/thermal_zone0/temp|cut -c1-2`)).$((`cat /sys/class/thermal/thermal_zone0/temp|cut -c3-5`))
echo servers.$host.tempcpu $tempcpu $now | nc -w 5 ipgraphite 2003 2>&2
tempgpu=`/opt/vc/bin/vcgencmd measure_temp|cut -c6-9`
echo servers.$host.tempgpu $tempgpu $now | nc -w 5 ipgraphite 2003 2>&2
#Enviem dades
echo -e $data | sed 's:,:.:g' | nc -w 5 ipgraphite 2003 2>&2
exit $?

Resultado?
El siguiente….

Captura de pantalla de 2013-07-25 17:34:48

Ale a disfrutarlo!!

26 sep

Instalación y configuración de Graphite + wsgi

Bueno os voy a explicar como configurar Graphite, lo haremos en una maquina EC2 de las que son gratuitas. https://aws.amazon.com/es/free/.

Que es Graphite?

Graphite es una herramienta que nos permite básicamente crear gráficos sobre unos datos que le vamos enviando periódicamente desde la máquina que queremos monitorizar, es muy sencillo y muy potente ya que tiene miles de funciones para hacer realmente cosas muy interesantes.

En el post Estadísticas VMware con PowerCLI y Graphite. ya se hacia una pequeña introducción y había unos ejemplos donde podéis ver el escenario final.

Pues venga al lio!

Tenemos que tener instalados una serie de paquetes, tales como estos.

apt-get install python apache2 python-twisted python-memcache libapache2-mod-python python-django libpixman-1-0 python-cairo python-django-tagging libapache2-mod-wsg python-cairo-dev python-django libapache2-mod-python python-setuptools git

Ahora nos bajaremos las ramas desde github.com

git clone https://github.com/graphite-project/graphite-web.git
git clone https://github.com/graphite-project/carbon.git
git clone https://github.com/graphite-project/whisper.git

En este punto, tenemos los tres repositorios en la rama masters, yo al ser un entorno de pruebas lo probare en esas versiones, si queréis algo mas estable esta la versión 0.9.10, que podéis cambiar a ella de la siguiente forma.

cd graphite-web
git checkout 0.9.10
cd ..
cd carbon
git checkout 0.9.10
cd ..
cd whisper
git checkout 0.9.10
cd ..

Y si aún lo queréis mas fácil podéis instalarlo desde el repositorio.


apt-get install  python-whisper graphite-carbon

Ahora vamos a instalar cada uno de los componentes, primero whisper, que es la base de datos donde iremos guardando las metricas.

Desde la carpeta de whisper haremos.

sudo python setup.py install

Y dentro de la carpeta carbon

sudo python setup.py install

Ahora vamos a configurar carbon, utilizaremos los ficheros por defecto.

cd /opt/graphite/conf
cp carbon.conf.example carbon.conf
cp storage-schemas.conf.example storage-schemas.conf

Como podemos ver en storage-schema.conf la configuración tiene un estilo tal que.

vi cd /opt/graphite/conf/storage-schemas.conf
[default_1min_for_1day]
pattern = .*
retentions = 60s:1d

Esto quiere decir que nos guardara una granularidad de 60 segundos durante 1 día, como vemos es muy poco así que lo vamos a cambiar a lo siguiente.

[default_1min_for_1month_15min_for_2years]
pattern = .*
retentions = 60s:30d,15m:1y

Que quiere decir que nos guardara una granularidad de 60 segundos durante 30 días y 15 minutos durante 1 años.

Ahora vamos a la carperta graphite-web, para configurar el entrono


python check-dependencies.py

Es posible que nos de algun error de dependencias en mi caso cuando instale me decia


[REQUIRED] Unable to import the 'pytz' module, do you have pytz module installed for python 2.7.4?
[REQUIRED] Unable to import the 'pyparsing' module, do you have pyparsing module installed for python 2.7.4?

La forma mas sencilla de instalar esto es con pip asi que haremos


apt-get install python-pip

easy_install pyparsing==1.5.7

Y en el caso de pyparsing seleccionamos el compatible con la versión, en mi caso 1.5.7

Y una vez tengamos las dependencias cumplidas instalamos graphite-web


python setup.py install

Pues ahora que ya tenemos los tres componentes instalados, vamos a configurar el apache para que nos sirva las peticiones.

Yo lo estoy haciendo sobre una Debian y haremos un virtual host tal que.


vim /etc/apache2/sites-available/graphite
-------------------------------------------
# This needs to be in your server's config somewhere, probably
# the main httpd.conf
# NameVirtualHost *:80

# This line also needs to be in your server's config.
# LoadModule wsgi_module modules/mod_wsgi.so

# You need to manually edit this file to fit your needs.
# This configuration assumes the default installation prefix

# of /opt/graphite/, if you installed graphite somewhere else
# you will need to change all the occurances of /opt/graphite/
# in this file to your chosen install location.

<IfModule !wsgi_module.c>
 LoadModule wsgi_module modules/mod_wsgi.so
</IfModule>

# XXX You need to set this up!
# Read http://code.google.com/p/modwsgi/wiki/ConfigurationDirectives#WSGISocketPrefix
WSGISocketPrefix /var/run/wsgi

<VirtualHost *:80>
 ServerName graphite
 DocumentRoot "/opt/graphite/webapp"
 ErrorLog /opt/graphite/storage/log/webapp/error.log
 CustomLog /opt/graphite/storage/log/webapp/access.log common

# I've found that an equal number of processes & threads tends
 # to show the best performance for Graphite (ymmv).
 WSGIDaemonProcess graphite processes=5 threads=5 display-name='%{GROUP}' inactivity-timeout=120
 WSGIProcessGroup graphite
 WSGIApplicationGroup %{GLOBAL}
 WSGIImportScript /opt/graphite/conf/graphite.wsgi process-group=graphite application-group=%{GLOBAL}

# XXX You will need to create this file! There is a graphite.wsgi.example
 # file in this directory that you can safely use, just copy it to graphite.wgsi
 WSGIScriptAlias / /opt/graphite/conf/graphite.wsgi

Alias /content/ /opt/graphite/webapp/content/
 <Location "/content/">
 SetHandler None
 </Location>

# XXX In order for the django admin site media to work you
 # must change @DJANGO_ROOT@ to be the path to your django
 # installation, which is probably something like:
 # /usr/lib/python2.6/site-packages/django
 Alias /media/ "@DJANGO_ROOT@/contrib/admin/media/"
 <Location "/media/">
 SetHandler None
 </Location>

# The graphite.wsgi file has to be accessible by apache. It won't
 # be visible to clients because of the DocumentRoot though.
 <Directory /opt/graphite/conf/>
 Order deny,allow
 Allow from all
 </Directory>

</VirtualHost>
----------------------------------------
ln -s ../sites-available/graphite ../sites-enabled/001-graphite


El virtualhost que os puse más arriba es el que trae el como ejemplo, pero cambiando la ruta de “WSGISocketPrefix /var/run/wsgi” ya que sino no encuentra el wsgi, ahora preparamos el resto de configuraciones para que vaya correctamente.

cd graphite/examples
sudo cp example-graphite-vhost.conf /etc/apache2/sites-available/default
sudo cp /opt/graphite/conf/graphite.wsgi.example /opt/graphite/conf/graphite.wsgi
sudo vim /etc/apache2/sites-available/default
# moved 'WSGIImportScript /opt/gr..' to right before virtual host since it gave me an error saying
# WSGIImportScript cannot occur within <VirtualHost> section
# if this path does not exist make it!!!!!!
# /etc/httpd/wsgi
sudo mkdir /etc/httpd
sudo mkdir /etc/httpd/wsgi
sudo /etc/init.d/apache2 reload

Ahora lo que vamos hacer es crear la base de datos donde guardaremos las métricas

cd /opt/graphite/webapp/graphite
sudo python manage.py syncdb

 

cd /opt/graphite/webapp/graphite
cp local_settings.py.example local_settings.py

Si nos da algun problema al crear la base de datos, pondremos lo siguiente en el fichero de local_settings.py


DATABASES = {
 'default': {
 'NAME': '/opt/graphite/storage/graphite.db',
 'ENGINE': 'django.db.backends.sqlite3',
 'USER': '',
 'PASSWORD': '',
 'HOST': '',
 'PORT': ''
 }
}

Vamos a configurar el wsgi para que trabaje fino fino con apache.

Debemos asegurar sobretodo que tenemos bien configurado la carga del modulo, lo deberemos mirar en el fichero wsgi.load


cat /etc/apache2/mods-enabled/wsgi.load

LoadModule wsgi_module /usr/lib/apache2/modules/mod_wsgi.so

Y por ultimo arrancamos graphite

sudo ./bin/carbon-cache.py start

Y comprobamos la configuración de apache

apachectl -t
Syntax OK

Y probamos en la url.

http://ipservidor/ y veremos algo tal que esto
graphite

Bueno ahora solo nos quedará enviarle los datos a graphite, en el post Estadísticas VMware con PowerCLI y Graphite ya hacia una pequeña introducción, pero en breve haré otro post explicando más en detalle como enviar los datos.

Ale a disfrutarlo

18 sep

Resumen – Instalación de PostgreSQL 9.2 optimizada para sistemas de producción

Bueno esto va a ser un post resumen, no soy muy partidario, pero reconozco que ir saltando de un post a otro para hacer la instalación de PostgreSQL puede ser un poco lioso, así que unifico los links en todos en uno.

El orden esta clara desde el sistema operativo hacia arriba, llegando a la replicación.

  1.  Instalación de PostgreSQL – Parte 1 – Optimización del sistema de ficheros

  2.  Instalación de PostgreSQL – Parte 2 – Instalación y configuración de PostgreSQL

  3.  Instalación de PostgreSQL – Parte 3 – Optimización del sistema operativo

  4.  Instalación de PostgreSQL – Parte 4 – Configuración de la replicación

Biografía

http://www.postgresql.org.es/documentacion
http://es.wikipedia.org/wiki/PostgreSQL
http://www.enterprisedb.com/products-services-training/products/postgresql-overview