Monitoreo y gestión de tus funciones de fn project.

En el post anterior vimos cómo desplegar la consola web (Functions UI) del proyecto fn project, en donde, entre otras cosas podemos:

1. Tener acceso al listado de APIs que nos ofrece la plataforma. APIs para obtener las aplicaciones desplegadas, borrarlas, actualizarlas. Algunas otras para listar las rutas. Otras mas para obtener los logs, etc
2. Tienes acceso al listado de aplicaciones y puedes probar las funciones que estén adentro de ella
3. Tienes acceso  un dashboard que te permite saber:
     a) Hay funciones encoladas
     b) Cuántas funciones han sido ejecutadas exitosamente
     c) Cuántas estásn ejecución o bien están fallidas


Este Dashboard y las capacidades del Functions UI seguramente serán mejoradas y extendidas en el futuro cercano, pero si uno quiere crear su propia consola de monitoreo, existe también ya un Dashboard que alguien creó usando Prometheus (prometheus.io) y Grafana (grafana.com).

Lo primero a entender es que el propio fn project tiene dentro de sus funciones, una que publica las métricas. Esta la encuentras aquí:

http://192.168.99.100:8080/metrics   (cambia la IP por la de tu ambiente)

También existe una que te da las estadísticas que la Function UI publica en su tablero principal:

http://192.168.99.100:8080/stats

Si la usas, obtendrás la siguiente información:


El JSON que responde es este:

{"Queue":0,"Running":0,"Complete":13,"Failed":0,"FunctionStatsMap":{"/ejemplo":{"Queue":0,"Running":0,"Complete":1,"Failed":0},"/python":{"Queue":0,"Running":0,"Complete":12,"Failed":0}}}

Básicamente es la información que ves en esta parte del Dashboard del Function UI:


Digamos que es lo mínimo y de una manera simplificada tienes esas estadísticas tanto disponibles a través de la URL mencionada, como graficadas en el dashboard.

Pero si quieres algo mas, entonces podemos usar el recurso /metrics y de ahí ya usar Prometheus y Grafana como medio de análisis( el primero ) y como medio para graficar (el segundo).

Prometheus es un sistema de monitoreo y alertamiento open source que Soundcloud construyó hace unos años. Algunas compañías y organizaciones lo han adoptado y su base de desarrolladores es bastante extensa actualmente. Hoy es un proyecto standalone y mantenido independientemente por cualquier compañía que lo use.

Grafana es igualmente un proyecto open source que te permite consultar, visualizar, alertar y entender tus métricas sin importar en dónde están almacenadas. Sus capacidades de graficación son bastante avanzadas y en cuanto su estética, simplemente es difícil que alguien lo supere.

El proyecto fn tiene ya un Dashboard construido con Grafana y analizado con Prometheus. Este último se alimentará de las métricas producidas por fn (a través de la URL mencionada anteriormente) y Grafana utlizará un datasource de tipo Prometheus para leer la información y graficarla.

Para poder tener acceso al dashboard, realiza lo siguiente:

1. Ejecuta prometheus, para eso podemos usar docker:
docker run --name=prometheus -d -p 9090:9090 --link functions prom/prometheus

El puerto en el que quedará escuchando será el 9090 y vamos a ligar este contenedor al de fn (functions). Esto lo vimos en el primer artículo: http://oracleradio.blogspot.mx/2017/12/primer-contacto-con-fn-project.html

2. Una vez que levantó, dirígete a su consola web: 

 3. Ahora ve a la opción de configuración (Menú Status->Configuration). Ahí verás la siguiente información:


El archivo contiene varias opciones, pero la que nos interesa es la que viene hasta abajo y que marco en rojo:

Configuration

global:
  scrape_interval: 15s
  scrape_timeout: 10s
  evaluation_interval: 15s
alerting:
  alertmanagers:
  - static_configs:
    - targets: []
    scheme: http
    timeout: 10s
scrape_configs:
- job_name: prometheus
  scrape_interval: 15s
  scrape_timeout: 10s
  metrics_path: /metrics
  scheme: http
  static_configs:
  - targets:
    - 192.168.99.100:8080
Ese es tu server de funciones (fn project server), por default la configuración apunta a localhost y puerto 9090.

Y la confguración que dice /metrics, es justamente para indicarle que de ahí quieres tomar la información. En nuestro caso ahí es donde se publica la información de las métricas de nuestras funciones.

Lo que vamos a hacer es actualizar ese archivo de configuración. Para hacerlo, desde docker vamos a hacer la edición del archivo. Este se encuentra en /etc/prometheus/prometheus.yml    . Por lo que, para lograrlo, vamos a ejecutar el comando sed de UNIX:

docker exec prometheus sed -i -- 's/localhost:9090/192.168.99.100:8080/g' /etc/prometheus/prometheus.yml

Con esto vamos a cambiar la configuración original, para que apunte a nuestro fn server.

Una vez hecho esto, tenemos que actualizar la configuración. Yo he usado el comando:
killall .


Con esto la configuración se va a refrescar y quedará apuntando a tu server.

4. Ahora levanta Grafana, para eso también vamos a usar docker:

docker run --name=grafana -d -p 3000:3000 --link prometheus grafana/grafana

En este caso quedará escuchando en el puerto 3000 y ligado al contenedor que usamos para Prometheus.

Una vez que lo levantes, entra a su consola:



El usuario default es admin y password admin.

5. Ya que entres a Grafana vamos a crear un datasource:
Estando en la sección de datasources, agrega uno nuevo con los siguientes datos:



Guárdalo y Pruébalo, y saldrá esa franja verde diciendo que todo está bien.

6. Ahora vamos a impotar el Dashboard que fn project ya tiene creado para Grafana. Yo he hecho un fork de esto y lo puedes encontrar aquí:  https://github.com/RCPDevChamp/fn/blob/master/examples/grafana/fn_grafana_dashboard.json

Ya que tengas el archivo que representa al Dashboard, ve a la sección de Dashboard e impórtalo.
Esto te llevará a la siguiente pantalla y ahí selecciona el fn_grafana_dashboard.json :


7. Ya que se haya importado, simplemente ábrelo:


8. Ahora simplemente ejecuta algunas de tus funciones y verás cómo se empieza a poblar la información:




La información se actualiza de manera automática y a partir del intervalo de tiempo que hayas configurado para que recupere las métricas. 

Con esto habrás integrado tu fn project server con Grafana y con Prometheus.