Nos presentamos
Jordi Llonch
@jordillonch
Joan Valduvieco
¿Qué es?
vendemos productos y servicios a precios interesantes por
internet
cada día abrimos 2-6 pequeñas tiendas durante 3-4 días
vendemos oportunidades de ocio
perfumería y cosmética
productos de temporada
hasta tenemos una tienda de las de toda la
vida...
en todos los proyectos IT está en el camino
crítico
vale pues tendréis un equipo de IT grande y a
picar código, no?
bueno...
venimos de un equipo pequeño...
que hacía software...
era
ágil
rápido
barato
luego el proyecto fue creciendo
pero no queríamos perder los orígenes...
por eso empezamos con...
continuous deployment
requisitos ágiles
pequeños pasos hacia el objetivo
KISS
test mínimopero suficiente para
nosotros
pero hoy hablaremos de...
MONITORIZACIÓN
y de cómo y porqué monitorizamos
Para nosotros es vital
nuestro proyecto está vivo
cada día cambia
MUCHOen un año hemos añadido 3
líneas de negocio
así que los tests quedan obsoletos muy rápido
Cuando algo va mal
si no lo vemos no pasa
para nosotros ...
en producción SIEMPRE hay fallos
Aunque haya mucho test
las cosas se estropean
pero al final los usuarios son los que lo
“sufren”
y normalmente no llaman para quejarse
si sabemos que las cosas se rompen o que
a veces la liamos...
como mínimo intentemos tardar poco
en arreglarlo
podriamos ser instaladores de antenas...
y eso nos haría poco ágiles
pero tenemos la suerte de desarrollar webs
así que podemos...
actualizar el código de la web en minutos
y hacer rollback en segundos
... si algo va mal...
tenemos la mayoría de código en un mismo
sitio
sólo una versión del código en producción
tenemos conexión directa con los clientes
y miles de clientes usando nuestro código
¡usemos esas ventajas para ser más eficientes!
un día decidimos que...
íbamos a buscar el balance entre test y monitorización
actualizaríamos producción
con mucha frecuencia
haríamos cambios pequeños
y si algo iba mal, lo arreglaríamos rápido
pero para darnos cuenta, necesitábamos...
¡MONITORIZAR!
vaaaale, ¡monitorizaremos!
al monitorizar nos damos cuenta de que...
¿3.2 es normal?
si no tenemos histórico no sabemos si lo que
vemos es normal
así que es mejor empezar temprano a
monitorizar
también tendremos falsas alarmas...
realmente inoportunas
pero si no monitorizas no te das cuenta
hasta que es demasiado tarde
“Ui, al reiniciar algo no va bien”
es mejor que
“Ui, se nos ha caído todo”
al principio se ven muchos fallos
¡paciencia y a solventarlos!
vale, usamos nagios, munin, etc...
y ya lo tenemos, ¿no?
bueno...
nosotros usamos estas herramientas pero no nos sirven para todo
vamos a hablar de nuestro sistema de
monitorización
¿pero por qué os hacéis un nuevo sistema de monitorización?
Sobretodo para conocer los eventos de
la aplicación y enlazarlos con los
eventos del sistema
minimizar tecnologías
KISS
adaptado a nuestras necesidades:
monitorizar logs
parsear y actuar rápido!
deploy continuo
monitorización en tiempo real
y aviso sonoro
relacionar eventoscon medidas
gráficas conflags de eventos
todo el equipo tiene acceso a la
monitorización
Miquel monitoriza
Jordi monitoriza
Dani también monitoriza
todos monitorizamos
¡venga al lío!
Componentes del sistema
SUB
SUB
PUB
PUB
RabbitMQ
LogMonitor PublisherCli
Collector WebUIMonitor
WebUIStats
MongoDB
obtienen datos
utilizan los datos
SUB
SUB
PUB
PUB
RabbitMQ
LogMonitor PublisherCli
Collector WebUIMonitor
WebUIStats
MongoDB
obtienen datos
utilizan los datos
LogM
onito
rSU
B
SUB
PUB
PUB
RabbitMQ
LogMonitor PublisherCli
Collector WebUIMonitor
WebUIStats
MongoDB
obtienen datos
utilizan los datos
¿qué es?
parsea archivos de log
publica errores y valores estadísticos
¿cómo funciona?
tail -f
archivo.log
actores
kernel
parser
¿qué necesita para funcionar?
upstreamerrors: file: 'test/error.log' file_stat: 'test/error.log.sdf' parser: LogMonitor\Parsers\NginxErrorParser actors: - LogMonitor\Actors\Errors\ErrorPhpActor - LogMonitor\Actors\Errors\ErrorSqlActor - LogMonitor\Actors\Errors\ErrorSymfonyActor actor_config: name: '[test] error.log' publishers: publisher_1: class: LogMonitor\Publishers\RabbitMQ config: host: localhost port: 5672 user: guest pass: guest vhost: / exchange: myproject_errors
test_error_access_log.yml
ejemplo de código
Parser
Actor
Publ
ishe
rCli
SUB
SUB
PUB
PUB
RabbitMQ
LogMonitor PublisherCli
Collector WebUIMonitor
WebUIStats
MongoDB
obtienen datos
utilizan los datos
SUB
SUB
PUB
PUB
RabbitMQ
LogMonitor PublisherCli
Collector WebUIMonitor
WebUIStats
MongoDB
obtienen datos
utilizan los datos
¿qué es?
publica eventos o valores desde la línea de comandos
está autocontenido en: publisher_cli.phar
unos ejemplos
php publisher_cli.phar --name="backup \ started" --event
evento: ¡OJO iniciamos backup!
php publisher_cli.phar --name=log_length \ --types=value \
--value=”$(cat /tmp/file.log|grep error|wc -l)”
publicar valor desde shell script
while true; do ls | wc -l | php \ publisher_cli.phar --name=num_files \
--types=time --value=STDIN;sleep 5;done
publicar valor desde STDIN
Col
lect
orSU
B
SUB
PUB
PUB
RabbitMQ
LogMonitor PublisherCli
Collector WebUIMonitor
WebUIStats
MongoDB
obtienen datos
utilizan los datos
SUB
SUB
PUB
PUB
RabbitMQ
LogMonitor PublisherCli
Collector WebUIMonitor
WebUIStats
MongoDB
obtienen datos
utilizan los datos
¿qué es?
se suscribe al canal dónde se publican los valores estadísticos
almacena valores estadísticos
ofrece una API para consultar estadística
un ejemplo
storage: storage_1: class: \Stats\Storage\Mongo\Factory config: server: 'mongodb://localhost:27017' default_database: 'stats_myproject' autorotate: false events_time_to_store: 365 # days
output: storage: storage_1
channel: class: \Stats\Channel\RabbitMQ config: debug: false host: localhost port: 5672 user: guest pass: guest vhost: / exchanges: - myproject_stats
stats: default_types: time: operations: - 'median' - 'percentile_95' - 'max' - 'min' retentions: - '60s:1d'
counter: operations: - 'count' retentions: - '60s:1d' - '1h:15d'
Web
UIS
tats
SUB
SUB
PUB
PUB
RabbitMQ
LogMonitor PublisherCli
Collector WebUIMonitor
WebUIStats
MongoDB
obtienen datos
utilizan los datos
SUB
SUB
PUB
PUB
RabbitMQ
LogMonitor PublisherCli
Collector WebUIMonitor
WebUIStats
MongoDB
obtienen datos
utilizan los datos
¿qué es?
genera un UI web con gráficos interactivos de tus
estadísticas
un ejemplo
charts: chart1: title: 'Sentinel 7 days' options: xAxis: maxZoom: 3600000 # 1h tooltip: yDecimals: 2 series: serie1: title: 'myweb average time (s)' url: 'http://localhost/Collector/web/stats_events/
sys_myweb_sentinel_myweb_60s_7d/median/2/0' serie2: title: 'google average time (s)' url: 'http://localhost/Collector/web/stats_events/
sys_myweb_sentinel_google_60s_7d/median/2/0' interval: 10display: title: 'Sentinel' template: tpl_1_1 charts: - chart1
demo
Web
UIM
onito
rSU
B
SUB
PUB
PUB
RabbitMQ
LogMonitor PublisherCli
Collector WebUIMonitor
WebUIStats
MongoDB
obtienen datos
utilizan los datos
SUB
SUB
PUB
PUB
RabbitMQ
LogMonitor PublisherCli
Collector WebUIMonitor
WebUIStats
MongoDB
obtienen datos
utilizan los datos
¿qué es?
UI que muestra errores y eventos en tiempo real y reproduce un sonido para errores críticos
2 partes
servidor websocket en PHP atendiendo a los clientes websocket y suscrito al canal de
errores (RabbitMQ)
cliente Javascript que conecta con el servidor websocket y muestra los errores y
reproduce sonidos
¿qué pinta tiene?
WebUIMonitor
Tecnologías utilizadas
O... qué juguetes nuevos tendré...
nuestro lenguaje base
ClassLoader
YAML
Console
mecanismo estándar de comunicación entre
componentes
almacenamos valores estadísticos
pantallas de usuario ricas
comunicación bidireccional
enviamos errores y eventos en tiempo real
al navegador
gráficas interactivas
permite mostrar marcas de eventos
y hacer zoom
¿Qué monitorizamos?
errores php, php-fpm, symfony, mysql, redis,
404...
tiempo de login
tiempo renderizado de páginas clave
número de logins por minuto
número de productos añadidos al carrito por
minuto
número compras por minuto
etc...
¿de qué nos ha servido todo esto?
nos dice cuando es importante no fallar...
picos de compra
nos damos cuenta cuando nos pasamos...
el deploy satura algo
previene desastres
algo se está rompiendo por momentos...
en general nos avisa de que hay algo para investigar
y nos conecta con la realidad de nuestro
sistema
componentede alertas
persistenciaen el LogMonitor
errores producidos en el navegador
métricas desde el punto de vista del
navegador
mejoras en la arquitectura
conclusión
¡MONITORIZA!
http://all-that-is-interesting.com/fixing-an-antennae-on-the-empire-state-buildinghttp://fountainxm.en.alibaba.com/column/207827945/Quality.htmlhttp://gooddeedaday.wordpress.com/2010/02/23/day-540-once-was-blind-but-now-i-see/http://www.squidoo.com/dangerous-bugshttp://www.veryicon.com/icons/object/lifesaver/red-life-saver.htmlhttp://www.etsy.com/listing/38951509/white-beach-pebbles-engraved-stone-triohttp://www.fastinternetbrowser.net/http://livewareis.blogspot.com.es/2011/07/mejora-de-procesos-una-opcion-para.htmlhttp://www.asianhealthsecrets.com/letha/?p=2314http://chocolatey.org/packages/mongodb
Fuentes imágenes