This graph shows how many times the word ______ has been mentioned throughout the history of the program.
Hola a todos, bienvenidos, me llamo Víctor Martínez, trabajo aquí en INIC, concretamente
trabajo en Camalún y hoy os explicaré un poco una de mis últimas hazañas que fue
transformar nuestro sistema de métricas, que bueno, era algo que habíamos desarrollado
nosotros, pero con el tiempo vimos que no escalaba porque bueno, es algo bastante complejo.
Entonces, os explico un poco para poneros en contexto. Básicamente, recogemos un montón
de métricas, tanto de negocio como de infraestructura y las insertábamos en una tabla. Entonces
que pasa, cuando quieres comparar y estudiar un archivo de métricas grandes, se convierte
en algo completamente lento y tedioso. Entonces bueno, después de que esto fallara rotundamente
y que fuera imposible tener en tiempo real estadísticas sobre el comportamiento de tanto
de negocio como de la infraestructura, decidimos cambiar el sistema.
Y entonces, bueno, estuve investigando y una de las soluciones que más me atrajo fue
Grafite. Alguno de vosotros conoce Grafite, ha trabajado antes, nadie más. Bueno, esto
es Grafite. Básicamente, Grafite es una solución completa para guardar y visualizar
todas tus métricas. No todas, absolutamente todas, pero la mayor parte de tus métricas.
Por ejemplo, Grafite no es una solución adecuada para sacar métricas que son propias de un
usuario, porque es muy difícil computar valores únicos por usuario. Pero bueno, en general
la mayor parte de las métricas o al menos de las que sacamos con Grafite no es un problema.
Entonces, ¿qué beneficios ofrece Grafite? Así, a simple vista, es básicamente que es
eficiente guardando los datos. Por lo tanto, en un archivo de cinco años no tienes gigas
y gigas de datos almacenados en disco. Y su otra gran ventaja es que es muy fácil sacar
cualquier tipo de análisis y visualización de tus datos de forma eficiente, muy rápido,
tarda milisegundos. Entonces, os voy a explicar un poco exactamente de qué está compuesto
Grafite. Grafite, esencialmente, son tres componentes. Está por una parte la parte
de Frontend, que es el grafite web, que básicamente es un dashboard desde el cual puedes consultar
todas las métricas que has almacenado y aparte tiene como un wiser para generar visualizaciones
a partir de esas métricas. Adicionalmente, también tiene una API desde la cual puedes
llamar desde cualquier otro servicio externo, generar gráficos o bien consultar los datos
serializados en JSON o XML. Por otra parte, está Carbon, que Carbon es básicamente el
corazón de Grafite. Y básicamente es un servicio que escucha por un puerto y recibe
los datos que tú le envías. Entonces, él se ocupa de cachear todos esos datos en memoria
y cada X intervalos de tiempo hace un flujo al disco y los persiste. Una de las tareas
importantes que hace Carbon es agregar tus datos sobre el tiempo, que básicamente es
el programa general de guardar métricas. Cuando tienes un gran volumen de métricas,
guardar estadísticas sobre esas métricas, se vuelve complejo porque tienes que hacer
las computaciones en tiempo real. Pero si a medida que las vas guardando en disco las
vas agregando en tiempo real, entonces te ahorras ese tiempo de computación en el momento
que las necesitas. Y por último está Whisper, que Whisper básicamente es la base de datos,
la estructura binaria en cómo se persisten los datos en el disco. Y recientemente han
empezado un desarrollo paralelo que se llama Ceres, que es una versión más moderna de
Whisper y que intentan solucionar otros temas, como por ejemplo que puedas distribuir todos
tus datos en varios máquinas, porque ahora mismo escalar Whisper es un poco complejo.
Entonces empecemos. ¿Cómo meto mis datos, mis métricas en Carbon? Es muy sencillo,
Carbon tiene dos protocolos de serie sobre los cuales le puedes enviar los datos. Uno
es un sencillo socket que escucha datos en texto plano, que bueno como veis con un simple
netcat le puedes escupir datos. No es el protocolo más eficiente, pero sí que es el más claro
para enseñaros ahora mismo. Tiene otro protocolo que es mucho más eficiente que te permite
enviarle múltiples métricas con una sola conexión, pero bueno y eso lo he dejado
para vosotros. ¿Cómo funciona, cómo envió métricas a Carbon? Básicamente le enviamos
tres valores. El primero es el nombre de la métrica, el segundo el valor y el tercero
el timestamp, la fecha en que se ha efectuado esa métrica. Entonces uno de los principales
problemas que te encuentras con Grafite es que es muy importante la nomenclatura de tus
métricas, porque prácticamente todas las configuraciones afectan a esto. Entonces para
simplificaros la vida yo recomiendo que uséis una nomenclatura parecida a esta, que básicamente
es usar un nombre para el esquema, el esquema tendría a ser como el nombre de una tabla
en una base de datos SQL, luego que uséis el nombre de vuestra aplicación como namespace,
luego un tercer namespace que bueno será para agrupar un conjunto de métricas que
tengan algo que ver entre ellas y luego el nombre de la métrica y el tipo de la métrica.
Ahora más adelante veréis que es el tipo de la métrica y ahora no es muy importante.
Uno de los principales problemas con los que me he encontrado en intentar implementar Carbon
is justamente entender cómo funciona y cómo estos dos archivos de configuración afectan
a toda la configuración. Entonces entre otros archivos estos son los dos más importantes,
el primero el storage esquemas te permite definir básicamente cómo se persisten tus métricas
en el disco y cómo se efectúa la agregación sobre esas métricas. Esto es clave porque
esto define cómo de óptimo y cómo de rápido será consultar tus datos y cuánto ocuparán
en tu disco y es muy importante escoger bien unas normas de retención para que siempre
tengas la flexibilidad para consultar tus datos pero a la vez no se dispara el consumo
ni se vuelva lento. Y por otra parte está el storage aggregation que es el archivo que
define cómo se agregan tus métricas y ahora veréis qué significa. Bueno empiezo explicando
que es el que se configura el storage esquema. Entonces básicamente en este archivo hay
varias configuraciones pero la más importante es la retención. ¿Qué significa retención?
Como podéis ver aquí hay varios intervalos definidos. ¿Qué significa? Básicamente
cómo vas a almacenar tus métricas en el disco. O sea, por cada intervalo de tiempo
de granularidad quiero obtener de mis datos. Bueno quizás no es muy descriptivo pero por
ejemplo esto significa que cada métrica que inserte durante las seis últimas horas quiero
una definición de diez segundos por cada métrica. Entonces bueno y de hecho aquí estoy definiendo
diferentes retenciones. Cada siete días quiero almacenar las métricas cada minuto. Cada
año, cada hora y cada cinco años cada día. Eso me va a permitir que yo pueda consultar
un archivo de cinco años de datos y tener al menos una definición mínima de un día.
Y para que os hagáis una idea esto sería un poco una representación visual de cómo
se almacenan los datos. Ahora aquí justo en este ejemplo he definido una retención de
una hora cada cuatro horas y de un día cada cuatro días. ¿Qué significa? Básicamente
voy a tener. Imaginaos que estos son cajones de un armario. Entonces cuando yo defino estas
retenciones básicamente lo que estoy definiendo son cuatro cajones de una hora cada cuatro
horas y luego cuatro cajones más de un día para cuatro días. Entonces ¿qué significa
esto? Que si yo inserto una métrica que ha ocurrido una hora y media justo o sea que
acaba de ocurrir justo hace una hora y media significa que esta métrica se va a guardar
en el segundo cajón porque es mayor que una hora por lo tanto de pertenece a este cajón.
Si yo inserto una métrica que ha ocurrido cinco horas atrás con que es superior a las
últimas cuatro horas y he definido que este cajón sólo abarca este espacio de tiempo
esa métrica se va a insertar en este cajón de aquí. Y como último ejemplo si inserto
una métrica que ha ocurrido hace tres días y 20 horas se va a almacenar en este último
cajón. Entonces ¿qué pasa si inserto una métrica que es superior a cuatro días? esa
métrica desaparece no se persiste es una manera de bueno de hecho es una base de datos circular
significa que los datos se van perdiendo con el tiempo porque supuestamente a ti ya no
te interesa tener un archivo mayor de cuatro días. Eso en este caso porque yo he configurado
esta retención. Si me interesa ahora una retención más elevada podría configurarla.
Y conforme pasar el tiempo va acumulando. Correcto. Entre otras cosas lo que hace
cargo en es cada segundo que pasa reprocesa todas bueno obviamente sólo los datos que
necesite reprocesar y los va moviendo de un cajón a otro en función van expirando en
su estado. ¿Desgraciaste alguna de las datos en estos
días de un tiempo o puedes cambiar las retenciones? No puedes pero tienes que crear un esquema
nuevo y bueno reprocesar los datos. Es algo un poco tedioso pero bueno luego explicaré
de maneras. Tiene que ser superior pero puedes definirlo como quieras. Obviamente este espacio
tiene que ser superior a este. Ya está. Me pasó el siguiente archivo de configuración
el storage aggregation. Este archivo de cine como tus métricas se van a agregar sobre
el tiempo. O sea en el caso de que yo haya insertado aquí una métrica y pase el tiempo
en el momento en que pasa de aquí a aquí como se suman todas estas métricas en este
cajón. Eso es lo que define el storage aggregation.
Entonces bueno una configuración por defecto sería imitar esta nomenclatura que básicamente
lo que hace es definir un patrón una expresión regular y esto es el tipo de la métrica. Lo
que he hablado anteriormente aquí. Por ejemplo aquí estoy usando count. Entonces en mi storage
aggregation estoy diciéndole que todas las métricas que caben con punto count se van
a agregar usando una suma. Y bueno luego hay cuatro tipos de agregación que es el mínimo
máximo suma y media. Como puedes ver aquí la media es cualquier valor que no cualquier
métrica que nos visita con estos de aquí. Básicamente es todo. Bueno son los dos archivos
más importantes. Una vez tenemos bien configurados estos archivos según como queramos archivar
nuestros datos no vamos a tener ningún problema. Si configuramos mal estos datos estos archivos
vamos a tener un problema porque vamos a perder datos o se van a agregar de forma incorrecta
y nos van a mostrar datos inválidos. Por eso es muy importante tener claro. De hecho esto
fue una de las barreras más grandes que encontré implementando el cargón en grafite en Kamanon.
Aquí he supuesto varios ejemplos. Bueno básicamente demuestran cuál de estos métodos se va
a usar. Los que acaban con count usan esta métrica se agregan usando suma, maxmin y el
time con que no hace matching con ninguno de estos usará el default average que bueno
será usando la media. Bueno pregunta. En realidad es un concepto que tampoco he logrado entender
muy bien. No está muy bien explicado en su documentación pero bueno básicamente tiene
algo que ver. Básicamente lo que han entendido es este número que significa. Pero básicamente
define en el caso de que tu insertes valores nulos o sea que envíes una métrica sin valor
como decide en qué cajón va a parar. No lo sé muy bien. De hecho si alguien logra
entenderlo estaría bien que me lo explicara. No lo sé. De hecho estos son tan copiados
de por ahí. No se ve bien su significado. Bueno y aquí básicamente estoy demostrando
cómo funciona el storage aggregation que bueno básicamente es lo que se explicaba antes.
Si yo en este cajón envío una métrica con un valor de dos y luego adicionalmente llegan
dos métricas más en dos horas distintas con que yo he definido con que mi métrica
acaba con punto count estos tres valores se van a agregar usando una suma por lo tanto
en este cajón una vez pase el tiempo y carbón agregue esos datos va a haber un 6 en este
cajón. Entonces esto es justamente lo que comentaba antes. ¿Qué pasa si en un cajón
envío dos métricas y justo coinciden que ambas métricas caen van a parar justo en
el mismo cajón. ¿Alguien tiene alguna sospecha de qué puede pasar? Claro pero es que justamente
es la configuración lo que define es qué pasa cuando pasa de una retención a otra
pero no dentro de la misma retención. Si yo aquí, bueno si le envío una métrica que
se ha registrado un usuario hace seis minutos y luego le envío que se han registrado dos
usuarios hace cinco minutos, claro con que hace seis y cinco minutos yo he definido una
retención de una hora y cuatro horas entonces ambas métricas van a ir a parar aquí pero
carbón no sabe qué hacer con esas métricas y entonces lo que pasa es que se queda con
la última básicamente. Entonces por eso comentaba que es muy importante tener conocer
entender cómo funciona carbón para que no pasen estas cosas. Entonces ¿cómo solucionamos
este problema? ¿Qué podemos hacer para que en el caso de que obviamente nos lleguen
dos métricas en intervalos muy próximos no perdamos esa información y podamos consultarla
igualmente. Una solución obviamente es definir una retención muy baja por ejemplo de cada
doce horas almacenar cada segundo obviamente eso va a tener bastante impacto en performance
porque vamos a almacenar muchas métricas pero bueno con que es un intervalo de tiempo
de doce horas tampoco van a ser tantas y es algo que nos podemos permitir pero bueno
de todas maneras tampoco es una solución porque si una solución sólida porque si
enviamos una métrica mayor de doce horas vamos a tener un problema o si enviamos más
de una métrica por segundo vamos a tener también un problema. Entonces las únicas
soluciones validas que nos quedan es o bien nosotros preagregamos esas métricas antes
de enviárselas a Grafite o bien usamos Stabstee y ahora os voy a explicar que es Stabstee.
Bueno, primero os explico como preagregar vuestras métricas. Esto es interesante porque
por ejemplo en el caso de nuestro de Incamalun ya teníamos un conjunto de métricas que no
queríamos perder eran parte de nuestro histórico y queríamos seguir teniendo y no queríamos
implantar un sistema nuevo de métricas y perder todas nuestras métricas anteriores.
Entonces entre otros problemas este fue otro de los que me encontré que intentando importar
todas mis viejas métricas a Grafite luego no me cuadraban unas con las otras. Entonces
bueno llegué a la conclusión bueno leí mucho entendí cómo funcionaba el carbón entonces
bueno me inventé un agregador para para Grafite de hecho no se lee mucho pero bueno ahí tenéis
si queréis ver el código está ahí debajo. Entonces básicamente lo que hago es el agregador
debes saber exactamente la retención que usa Grafite y bueno básicamente lo que hago
es sumar y en función de la fecha de la métrica pues sumo o bueno agrego manualmente en función
de la retención y de dónde cae cada métrica. De hecho esto es código nuestro de producción
si sois libres de usarlo está probado y funcionado. Entonces la siguiente solución en caso de
que no queráis agregar vosotros mismos los datos o que no tengáis un histórico y empecéis
de nuevo podéis usar directamente StatsD. ¿Qué es StatsD? Básicamente StatsD es un
invento que se creó Etsy que bueno básicamente es otro Dimon otro servicio que escucha también
por re concretamente escucha por WDP cosa que es muy conveniente y bueno básicamente
hace exactamente lo mismo que Grafite solo que agrega los datos por nosotros así que
nosotros no tenemos que hacer nada y entonces tan solo necesitamos asegurarnos de que StatsD
y Grafite se entienden entre ellos y nosotros le enviamos todas las métricas en cualquier
momento a StatsD. Entonces ¿por qué digo que UDP es ventajoso? Porque UDP es muy
ligero podemos enviarles tantas métricas como queramos y los paquetes son muy pequeños
por lo tanto nos estaremos causando ningún tipo de overheap.
En UDP no hay control sobre que los paquetes han sido recibidos y no se reintentan en
caso de que no hayan sido entregados por lo tanto es posible que algunas de vuestras
métricas se pierdan pero bueno esto siempre es considerable siempre se considera que
las métricas no van a venir de una métrica que no pasa nada si algún evento se pierde
por el camino.
Entonces ¿cómo se usa StatsD? Nosotros aquí en Camalún usamos un
sistema que la creó Shopify que bueno básicamente es un cliente UDP para StatsD y la gran ventaja
de esta es que es muy sencilla y está pensada para hacer un poco de metaprogramming en Ruby
y es muy fácil extender tus clases para que automáticamente envíen métricas y bueno
básicamente son estos dos métodos obviamente tienes que preconfigurar la librería y decirle
dónde están tus servidores pero luego el uso es así de sencillo básicamente le dices
incrementame esta métrica o mídeme el tiempo que tarda esto y enviémelo con este nombre
y bueno básicamente eso es todo ya os digo eso sigue sencillo la única cosa que necesitáis
es que StatsD y Carbon se entienden unos con los otros de hecho si os vais a la documentación
de StatsD os veréis exactamente cómo tenéis que configurar tanto StatsD como Carbon sobre
todo es importante las retenciones porque StatsD por defecto hace un flush hacia Carbon
cada 10 segundos entonces vuestra retención mínima debe ser de 10 segundos pues si es
inferior vais a perder datos y bueno si es superior en principio no pasa nada vale pues
ahora os voy a enseñar un poco qué se puede conseguir con Grafite a nivel de análisis
y de visualización Grafite es un producto bastante completo y con el que se pueden
sacar bastantes conclusiones de tus métricas obviamente siempre siempre habrá una necesidad
mayor que la que te da Grafite pero la ventaja de Grafite es que también puedes hacerlo si
su dashboard no te sirve siempre puedes usar tu propio dashboard y plotear los datos de la manera
que tú quieras pero aún así el dashboard que trae de serie es bastante útil y para sacar así
cuatro conclusiones rápidas típicas de negocio y por qué hacemos esto y no hacemos así pues te
metes en Grafite ploteas un gráfico y dices ok vamos a hacerlo así porque nuestros usuarios
dicen que prefieren esto entonces hay un montón de funciones para plotear métricas pero con todo
el tiempo que llevo usándolo básicamente estas son las más útiles de todas y ahora os voy a
enseñar un poco qué hace cada uno básicamente los alias los alias y ver para para cambiar la leyenda
para ponerle nombre a las cosas es completamente opcional si no ponéis un alias os va a poner el
nombre de la métrica y aquí por ejemplo estoy usando time shift es útil para comparar una serie de
datos con la misma serie de datos en un intervalo anterior por ejemplo para comparar vuestras ventas
de esta semana con las de la semana pasada como podéis ver ahí estoy estoy ploteando valores random
comparándolos con el con el con un intervalo pasado no ya me ha asegurado de eso porque sabía que
me la estaba jugando contigo de hecho estos son workers que han de saikik saikik es un software
de bueno una cola de procesos y está bueno básicamente está ploteando cuántos han acabado
bien esta semana es la semana pasada otro método muy útil sumaráis sumaráis sirve para sumar tus
métricas en intervalos de tiempo fijos por ejemplo en este caso estoy sumando todos los
workers que han acabado bien en una hora entonces estoy ploteando las últimas 24 horas en intervalos
de una hora entonces obviamente en durante estos intervalos seguramente han habido más más métricas
pero me las ha sumado me las está mostrando así sumaráis tomó dos o tres parámetros adicionales
entre ellos puedes cambiar cómo se agregan los datos los datos fueron intervalos y tiene otro
argumento otro parámetro que es bastante puta y me ha dado bastantes dolores de cabeza en el caso
de cruceis jason para exportar los datos porque por defecto si tú le dices que use que coja los datos
de hace 24 horas no te alinea la fecha de inicio a bueno al cero entonces te puede dar bastantes
dolores de cabeza pero bueno ya es lo encontraréis aquí que estoy haciendo aquí estoy exacto estoy
poni dándole el nombre a la leyenda usando el tercer valor de empezando por cero del nombre
de la métrica o sea lo que estoy haciendo básicamente es ponerle un asterisco entonces está
cogiendo todas las métricas que coinciden con este prefijo y este sufijo y usando el nombre
bueno en cada uno de los nombres que hay en este en este hueco para pintarme tanto la leyenda como
para platearme los valores de cada serie y bueno si no os convence el dashboard de de grafite que más
que un dashboard es es como un playground para para jugar con tus métricas puedes probar otras
soluciones una interesante y divertida es taseo taseo es bueno de datos son exactamente lo mismo
todos usan la ipi de grafite para para exportar los datos y bueno cada uno los pinta de diferentes
maneras usando diferentes librerías de javascript etcétera taseo está chulo porque aparte de la
de de de platearte también te muestra el valor instantáneo de cada métrica entonces y además
es es compacto y te permite por ejemplo si tienes si estás analizando el estado de tu
infraestructura y tienes 50 servidores es muy cómodo porque puedes tener muchísimos gráficos
y incluso le puedes definir un tres hold de tal manera que te va a pintar un gráfico en rojo
cuando esté por encima por debajo de unos mínimos que tú le hayas definido entonces te permite
tener un verbo de tu infraestructura de una forma muy rápida y por otra parte está cubismo que
que es un producto de square y es muy interesante porque ellos discutían que los las visualizaciones
tradicionales son difíciles que cuesta transmitir el efecto de una métrica y en correlación con
otras métricas con con con con los gráficos tradicionales que conocemos entonces se inventaron
este este especie de espectrograma que básicamente bueno ellos dicen que es una mejor manera para
ver qué correlación hay entre una métrica y otra y qué impacto tienen entre ellas y la verdad
es un proyecto bastante interesante y lo chulo de cubismo es que también tiene un adapter
y te permite te permite conectarlo a tu a tu servidor de grafite y plotear las métricas de
manera muy fácil otro proyecto que está por ahí pegando fuerte es grafen lo chulo este proyecto
es que usa de tree que es un una nivelía javascript para hacer visualizaciones en tiempo real y la
cosa interesante es que todos estos gráficos son en tiempo real y además tiene los gauges estos
que también son divertidos depende qué tipo de métricas es más conveniente mostrarles esta
manera que con un gráfico y si nada de lo que existe os convence podéis optar por haceros
vuestro propio dashboard que en nuestro caso lo hacemos tenemos un back office y en ese back office
hay un un bueno una página de analíticas y mostramos todos los todas las métricas de negocio
están sencillo como llamar a vuestra a vuestro endpoint de grafite y pasarle como forma todo
json el target es la métrica o métricas porque le podéis pasar varios y bueno básicamente se
escupe una ray con todos vuestras métricas y nosotros bueno usamos hi charts concretamente
hi stocks que es el que te da estas cosas pero bueno al final es algo personal usas lo que más te
gusta y nada en realidad eso es todo si si decidís atreviros y probarlo recomiendo muchísimo a este
tipo exactamente no sé cómo se llama concretamente pero tiene un blog y habla muchísimo sobre
grafite de hecho tampoco sé muy bien cuál es su rol y si tiene algo que ver con grafite pero
bloguea muchísimo acerca de grafite y yo he aprendido muchísimas cosas de él es es muy interesante
y y otro problema de grafite un poco es el configurarlo porque son varios varios componentes y
tienes que hacer instalaciones individuales de cada uno así que si os animes también os recomiendo
que uséis chef pappet o bagran o cualquier cosa parecida y que no nos atreváis a hacerlo a mano
y bueno eso es todo y