sistema monitorización con symfony2, rabbitmq, mongodb y extjs4

Post on 17-Dec-2014

4.815 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

 

TRANSCRIPT

Nos presentamos

Jordi Llonch

jordi.llonch@ofertix.com

@jordillonch

Joan Valduvieco

joan.valduvieco@ofertix.com

¿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!

https://github.com/ofertix

¡muchas gracias!

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

top related