SlideShare una empresa de Scribd logo
martes 19 de junio de 12
martes 19 de junio de 12
Nos presentamos
                              Joan Valduvieco
                              joan.valduvieco@ofertix.com



                              Jordi Llonch
                              jordi.llonch@ofertix.com
                              @jordillonch

martes 19 de junio de 12
¿Qué es?




martes 19 de junio de 12
vendemos productos y
                      servicios a precios
                       interesantes por
                           internet

martes 19 de junio de 12
cada día abrimos 2-6
                             pequeñas tiendas
                             durante 3-4 días


martes 19 de junio de 12
martes 19 de junio de 12
vendemos
                     oportunidades de ocio


martes 19 de junio de 12
martes 19 de junio de 12
perfumería y cosmética



martes 19 de junio de 12
martes 19 de junio de 12
productos de
                            temporada


martes 19 de junio de 12
martes 19 de junio de 12
hasta tenemos una
                    tienda de las de toda la
                              vida...


martes 19 de junio de 12
martes 19 de junio de 12
en todos los proyectos
                     IT está en el camino
                            crítico


martes 19 de junio de 12
vale pues tendréis un
                  equipo de IT grande y a
                     picar código, no?


martes 19 de junio de 12
bueno...



martes 19 de junio de 12
venimos de un equipo
                            pequeño...


martes 19 de junio de 12
que hacía software...



martes 19 de junio de 12
era



martes 19 de junio de 12
ágil



martes 19 de junio de 12
rápido



martes 19 de junio de 12
barato



martes 19 de junio de 12
luego el proyecto fue
                                creciendo


martes 19 de junio de 12
pero no queríamos
                           perder los orígenes...


martes 19 de junio de 12
por eso empezamos
                                  con...


martes 19 de junio de 12
continuous deployment



martes 19 de junio de 12
requisitos ágiles



martes 19 de junio de 12
pequeños pasos hacia el
                       objetivo


martes 19 de junio de 12
KISS


martes 19 de junio de 12
test mínimo



martes 19 de junio de 12
test mínimo
                           pero suficiente para
                                nosotros

martes 19 de junio de 12
pero hoy hablaremos
                                   de...


martes 19 de junio de 12
martes 19 de junio de 12
MONITORIZACIÓN



martes 19 de junio de 12
y de cómo y porqué
                              monitorizamos


martes 19 de junio de 12
Para nosotros es vital



martes 19 de junio de 12
nuestro proyecto
                               está vivo


martes 19 de junio de 12
cada día cambia




martes 19 de junio de 12
cada día cambia
                            MUCHO


martes 19 de junio de 12
cada día cambia
                                MUCHO
                           en un año hemos añadido 3
                                líneas de negocio

martes 19 de junio de 12
así que los tests quedan
                   obsoletos muy rápido


martes 19 de junio de 12
Cuando algo va mal



martes 19 de junio de 12
si no lo vemos no pasa




martes 19 de junio de 12
si no lo vemos no pasa
                     para
                  nosotros ...


martes 19 de junio de 12
en producción
                            SIEMPRE
                             hay fallos


martes 19 de junio de 12
en producción
                             SIEMPRE
                              hay fallos
                           Aunque haya
                           mucho test
martes 19 de junio de 12
las cosas se estropean



martes 19 de junio de 12
pero al final los
                    usuarios son los que lo
                           “sufren”


martes 19 de junio de 12
y normalmente no
                           llaman para quejarse


martes 19 de junio de 12
si sabemos que las
                   cosas se rompen o que
                     a veces la liamos...


martes 19 de junio de 12
como mínimo
                 intentemos tardar poco
                       en arreglarlo


martes 19 de junio de 12
podriamos ser instaladores
                       de antenas...




martes 19 de junio de 12
y eso nos haría poco
                                  ágiles


martes 19 de junio de 12
pero tenemos la suerte
                     de desarrollar webs


martes 19 de junio de 12
así que podemos...



martes 19 de junio de 12
actualizar el código de
                        la web en minutos


martes 19 de junio de 12
y hacer rollback en
                                segundos


martes 19 de junio de 12
y hacer rollback en
                                segundos
                ... si algo va mal...

martes 19 de junio de 12
tenemos la mayoría de
                      código en un mismo
                              sitio


martes 19 de junio de 12
sólo una versión del
                           código en producción


martes 19 de junio de 12
tenemos conexión
                    directa con los clientes


martes 19 de junio de 12
y miles de clientes
                    usando nuestro código


martes 19 de junio de 12
¡usemos esas
      ventajas para ser
       más eficientes!



martes 19 de junio de 12
¡usemos esas
      ventajas para ser
       más eficientes!



martes 19 de junio de 12
un día decidimos que...



martes 19 de junio de 12
íbamos a buscar el
                           balance entre test y
                            monitorización


martes 19 de junio de 12
actualizaríamos
                                producción
                           con mucha frecuencia


martes 19 de junio de 12
haríamos cambios
                               pequeños


martes 19 de junio de 12
y si algo iba mal, lo
                           arreglaríamos rápido


martes 19 de junio de 12
pero para darnos
                 cuenta, necesitábamos...


martes 19 de junio de 12
¡MONITORIZAR!



martes 19 de junio de 12
vaaaale,
                           ¡monitorizaremos!


martes 19 de junio de 12
al monitorizar nos
                    damos cuenta de que...


martes 19 de junio de 12
¿3.2 es normal?



martes 19 de junio de 12
si no tenemos histórico
                    no sabemos si lo que
                      vemos es normal


martes 19 de junio de 12
así que es mejor
                           empezar temprano a
                                monitorizar


martes 19 de junio de 12
también tendremos
                             falsas alarmas...


martes 19 de junio de 12
realmente
                           inoportunas



martes 19 de junio de 12
realmente
                           inoportunas



martes 19 de junio de 12
pero si no monitorizas
                        no te das cuenta


martes 19 de junio de 12
hasta que es demasiado
                           tarde


martes 19 de junio de 12
“Ui, al reiniciar algo no
                        va bien”




martes 19 de junio de 12
es mejor que



martes 19 de junio de 12
“Ui, se nos ha caído
                                   todo”


martes 19 de junio de 12
al principio se ven
                              muchos fallos

             ¡paciencia y a solventarlos!

martes 19 de junio de 12
vale, usamos nagios,
                                munin, etc...
                           y ya lo tenemos, ¿no?


martes 19 de junio de 12
bueno...



martes 19 de junio de 12
nosotros usamos estas
                     herramientas pero no
                      nos sirven para todo


martes 19 de junio de 12
vamos a hablar de
                           nuestro sistema de
                             monitorización


martes 19 de junio de 12
¿pero por qué os hacéis un
             nuevo sistema de
              monitorización?


martes 19 de junio de 12
Sobretodo para
                   conocer los eventos de
                      la aplicación y
                     enlazarlos con los
                    eventos del sistema

martes 19 de junio de 12
minimizar tecnologías

                                         KISS

martes 19 de junio de 12
adaptado a nuestras
                              necesidades:


martes 19 de junio de 12
monitorizar logs




martes 19 de junio de 12
monitorizar logs




                           parsear y actuar   rápido!




martes 19 de junio de 12
deploy continuo




martes 19 de junio de 12
deploy continuo




                           monitorización en
                              tiempo real
                            y aviso sonoro
martes 19 de junio de 12
relacionar eventos
                              con medidas




martes 19 de junio de 12
relacionar eventos
                              con medidas



                              gráficas con
                            flags de eventos


martes 19 de junio de 12
todo el equipo tiene
                               acceso a la
                             monitorización


martes 19 de junio de 12
Miquel monitoriza




martes 19 de junio de 12
Jordi monitoriza




martes 19 de junio de 12
Dani también
        monitoriza
martes 19 de junio de 12
todos
monitorizamos




martes 19 de junio de 12
¡venga al lío!



martes 19 de junio de 12
Componentes del
                              sistema


martes 19 de junio de 12
obtien
                             LogMonitor      PublisherCli          en
                                                              datos




                                       PUB




                                                    PUB
                           RabbitMQ
                                 SUB




                                                     SUB
                           Collector         WebUIMonitor


                                                              utiliza
                                                                      n
                                                            los da
                                                                   tos

                                              WebUIStats


                            MongoDB


martes 19 de junio de 12
obtien
                             LogMonitor      PublisherCli          en
                                                              datos




                                       PUB




                                                    PUB
                           RabbitMQ
                                 SUB




                                                     SUB
                           Collector         WebUIMonitor


                                                              utiliza
                                                                      n
                                                            los da
                                                                   tos

                                              WebUIStats


                            MongoDB


martes 19 de junio de 12
obtien
                             LogMonitor      PublisherCli          en
                                                              datos




                                       PUB




                                                    PUB
                           RabbitMQ
                                 SUB




                                                     SUB
                           Collector         WebUIMonitor


                                                              utiliza
                                                                      n
                                                            los da
                                                                   tos

                                              WebUIStats


                            MongoDB


martes 19 de junio de 12
obtien
                             LogMonitor      PublisherCli          en
                                                              datos




                                       PUB




                                                    PUB
                           RabbitMQ
                                 SUB




                                                     SUB
                           Collector         WebUIMonitor


                                                              utiliza
                                                                      n
                                                            los da
                                                                   tos

                                              WebUIStats


                            MongoDB


martes 19 de junio de 12
obtien
                             LogMonitor      PublisherCli           en
                                                              datos




                                       PUB
                                       PUB




                                                    PUB
                                                    PUB
                           RabbitMQ




                                 SUB
                                 SUB




                                                     SUB
                                                     SUB
                           Collector         WebUIMonitor


                                                              utiliza
                                                                      n
                                                            los da
                                                                   tos

                                              WebUIStats


                            MongoDB




martes 19 de junio de 12
LogMonitor
                                                              obtien
                              LogMonitor      PublisherCli           en
                                                               datos




                                        PUB
                                        PUB




                                                     PUB
                                                     PUB
                            RabbitMQ




                                  SUB
                                  SUB




                                                      SUB
                                                      SUB
                            Collector         WebUIMonitor


                                                               utiliza
                                                                       n
                                                             los da
                                                                    tos

                                               WebUIStats


                             MongoDB




martes 19 de junio de 12
¿qué es?



martes 19 de junio de 12
parsea archivos de log




martes 19 de junio de 12
publica errores y valores
                                  estadísticos




martes 19 de junio de 12
¿cómo funciona?



martes 19 de junio de 12
kernel
                            tail -f


              archivo.log




                                       parser




                                      actores




martes 19 de junio de 12
¿qué necesita para
                               funcionar?


martes 19 de junio de 12
test_error_access_log.yml


                           upstreamerrors:
                             file: 'test/error.log'
                             file_stat: 'test/error.log.sdf'
                             parser: LogMonitorParsersNginxErrorParser
                             actors:
                               - LogMonitorActorsErrorsErrorPhpActor
                               - LogMonitorActorsErrorsErrorSqlActor
                               - LogMonitorActorsErrorsErrorSymfonyActor
                             actor_config:
                               name: '[test] error.log'
                               publishers:
                                 publisher_1:
                                   class: LogMonitorPublishersRabbitMQ
                                   config:
                                     host: localhost
                                     port: 5672
                                     user: guest
                                     pass: guest
                                     vhost: /
                                     exchange: myproject_errors




martes 19 de junio de 12
test_error_access_log.yml


                           upstreamerrors:
                             file: 'test/error.log'
                             file_stat: 'test/error.log.sdf'
                             parser: LogMonitorParsersNginxErrorParser
                             actors:
                               - LogMonitorActorsErrorsErrorPhpActor
                               - LogMonitorActorsErrorsErrorSqlActor
                               - LogMonitorActorsErrorsErrorSymfonyActor
                             actor_config:
                               name: '[test] error.log'
                               publishers:
                                 publisher_1:
                                   class: LogMonitorPublishersRabbitMQ
                                   config:
                                     host: localhost
                                     port: 5672
                                     user: guest
                                     pass: guest
                                     vhost: /
                                     exchange: myproject_errors




martes 19 de junio de 12
test_error_access_log.yml


                           upstreamerrors:
                             file: 'test/error.log'
                             file_stat: 'test/error.log.sdf'
                             parser: LogMonitorParsersNginxErrorParser
                             actors:
                               - LogMonitorActorsErrorsErrorPhpActor
                               - LogMonitorActorsErrorsErrorSqlActor
                               - LogMonitorActorsErrorsErrorSymfonyActor
                             actor_config:
                               name: '[test] error.log'
                               publishers:
                                 publisher_1:
                                   class: LogMonitorPublishersRabbitMQ
                                   config:
                                     host: localhost
                                     port: 5672
                                     user: guest
                                     pass: guest
                                     vhost: /
                                     exchange: myproject_errors




martes 19 de junio de 12
test_error_access_log.yml


                           upstreamerrors:
                             file: 'test/error.log'
                             file_stat: 'test/error.log.sdf'
                             parser: LogMonitorParsersNginxErrorParser
                             actors:
                               - LogMonitorActorsErrorsErrorPhpActor
                               - LogMonitorActorsErrorsErrorSqlActor
                               - LogMonitorActorsErrorsErrorSymfonyActor
                             actor_config:
                               name: '[test] error.log'
                               publishers:
                                 publisher_1:
                                   class: LogMonitorPublishersRabbitMQ
                                   config:
                                     host: localhost
                                     port: 5672
                                     user: guest
                                     pass: guest
                                     vhost: /
                                     exchange: myproject_errors




martes 19 de junio de 12
test_error_access_log.yml


                           upstreamerrors:
                             file: 'test/error.log'
                             file_stat: 'test/error.log.sdf'
                             parser: LogMonitorParsersNginxErrorParser
                             actors:
                               - LogMonitorActorsErrorsErrorPhpActor
                               - LogMonitorActorsErrorsErrorSqlActor
                               - LogMonitorActorsErrorsErrorSymfonyActor
                             actor_config:
                               name: '[test] error.log'
                               publishers:
                                 publisher_1:
                                   class: LogMonitorPublishersRabbitMQ
                                   config:
                                     host: localhost
                                     port: 5672
                                     user: guest
                                     pass: guest
                                     vhost: /
                                     exchange: myproject_errors




martes 19 de junio de 12
test_error_access_log.yml


                           upstreamerrors:
                             file: 'test/error.log'
                             file_stat: 'test/error.log.sdf'
                             parser: LogMonitorParsersNginxErrorParser
                             actors:
                               - LogMonitorActorsErrorsErrorPhpActor
                               - LogMonitorActorsErrorsErrorSqlActor
                               - LogMonitorActorsErrorsErrorSymfonyActor
                             actor_config:
                               name: '[test] error.log'
                               publishers:
                                 publisher_1:
                                   class: LogMonitorPublishersRabbitMQ
                                   config:
                                     host: localhost
                                     port: 5672
                                     user: guest
                                     pass: guest
                                     vhost: /
                                     exchange: myproject_errors




martes 19 de junio de 12
ejemplo de código



martes 19 de junio de 12
Parser




martes 19 de junio de 12
Parser




martes 19 de junio de 12
Parser




martes 19 de junio de 12
Parser




martes 19 de junio de 12
Actor




martes 19 de junio de 12
Actor




martes 19 de junio de 12
obtien
                             LogMonitor      PublisherCli           en
                                                              datos




                                       PUB
                                       PUB




                                                    PUB
                                                    PUB
                           RabbitMQ




                                 SUB
                                 SUB




                                                     SUB
                                                     SUB
                           Collector         WebUIMonitor


                                                              utiliza
                                                                      n
                                                            los da
                                                                   tos

                                              WebUIStats


                            MongoDB




martes 19 de junio de 12
PublisherCli
                                                                 obtien
                                 LogMonitor      PublisherCli           en
                                                                  datos




                                           PUB
                                           PUB




                                                        PUB
                                                        PUB
                               RabbitMQ




                                     SUB
                                     SUB




                                                         SUB
                                                         SUB
                               Collector         WebUIMonitor


                                                                  utiliza
                                                                          n
                                                                los da
                                                                       tos

                                                  WebUIStats


                                MongoDB




martes 19 de junio de 12
¿qué es?



martes 19 de junio de 12
publica eventos o valores desde
                          la línea de comandos




martes 19 de junio de 12
está autocontenido en:
                           publisher_cli.phar




martes 19 de junio de 12
unos ejemplos



martes 19 de junio de 12
evento: ¡OJO iniciamos
                          backup!
         php publisher_cli.phar --name="backup 
                    started" --event




martes 19 de junio de 12
publicar valor desde shell
                     script
  php publisher_cli.phar --name=log_length 
                --types=value 
--value=”$(cat /tmp/file.log|grep error|wc -l)”




martes 19 de junio de 12
publicar valor desde STDIN

                 while true; do ls | wc -l | php 
               publisher_cli.phar --name=num_files 
              --types=time --value=STDIN;sleep 5;done




martes 19 de junio de 12
obtien
                             LogMonitor      PublisherCli           en
                                                              datos




                                       PUB
                                       PUB




                                                    PUB
                                                    PUB
                           RabbitMQ




                                 SUB
                                 SUB




                                                     SUB
                                                     SUB
                           Collector         WebUIMonitor


                                                              utiliza
                                                                      n
                                                            los da
                                                                   tos

                                              WebUIStats


                            MongoDB




martes 19 de junio de 12
obtien
                                                                    en




               Collector
                             LogMonitor      PublisherCli
                                                              datos




                                       PUB
                                       PUB




                                                    PUB
                                                    PUB
                           RabbitMQ




                                 SUB
                                 SUB




                                                     SUB
                                                     SUB
                           Collector         WebUIMonitor


                                                              utiliza
                                                                      n
                                                            los da
                                                                   tos

                                              WebUIStats


                            MongoDB




martes 19 de junio de 12
¿qué es?



martes 19 de junio de 12
se suscribe al canal dónde se
                    publican los valores estadísticos




martes 19 de junio de 12
almacena valores estadísticos




martes 19 de junio de 12
ofrece una API para consultar
                                    estadística




martes 19 de junio de 12
un ejemplo



martes 19 de junio de 12
storage:
                             storage_1:
                               class: StatsStorageMongoFactory
                               config:
                                 server: 'mongodb://localhost:27017'
                                 default_database: 'stats_myproject'
                                 autorotate: false
                                 events_time_to_store: 365 # days

                           output:
                             storage: storage_1

                           channel:
                             class: StatsChannelRabbitMQ
                             config:
                               debug: false
                               host: localhost
                               port: 5672
                               user: guest
                               pass: guest
                               vhost: /
                               exchanges:
                                 - myproject_stats


martes 19 de junio de 12
storage:
                             storage_1:
                               class: StatsStorageMongoFactory
                               config:
                                 server: 'mongodb://localhost:27017'
                                 default_database: 'stats_myproject'
                                 autorotate: false
                                 events_time_to_store: 365 # days

                           output:
                             storage: storage_1

                           channel:
                             class: StatsChannelRabbitMQ
                             config:
                               debug: false
                               host: localhost
                               port: 5672
                               user: guest
                               pass: guest
                               vhost: /
                               exchanges:
                                 - myproject_stats


martes 19 de junio de 12
storage:
                             storage_1:
                               class: StatsStorageMongoFactory
                               config:
                                 server: 'mongodb://localhost:27017'
                                 default_database: 'stats_myproject'
                                 autorotate: false
                                 events_time_to_store: 365 # days

                           output:
                             storage: storage_1

                           channel:
                             class: StatsChannelRabbitMQ
                             config:
                               debug: false
                               host: localhost
                               port: 5672
                               user: guest
                               pass: guest
                               vhost: /
                               exchanges:
                                 - myproject_stats


martes 19 de junio de 12
storage:
                             storage_1:
                               class: StatsStorageMongoFactory
                               config:
                                 server: 'mongodb://localhost:27017'
                                 default_database: 'stats_myproject'
                                 autorotate: false
                                 events_time_to_store: 365 # days

                           output:
                             storage: storage_1

                           channel:
                             class: StatsChannelRabbitMQ
                             config:
                               debug: false
                               host: localhost
                               port: 5672
                               user: guest
                               pass: guest
                               vhost: /
                               exchanges:
                                 - myproject_stats


martes 19 de junio de 12
stats:
                             default_types:
                               time:
                                 operations:
                                   - 'median'
                                   - 'percentile_95'
                                   - 'max'
                                   - 'min'
                                 retentions:
                                   - '60s:1d'
                                   

                               counter:
                                 operations:
                                   - 'count'
                                 retentions:
                                   - '60s:1d'
                                   - '1h:15d'




martes 19 de junio de 12
stats:
                             default_types:
                               time:
                                 operations:
                                   - 'median'
                                   - 'percentile_95'
                                   - 'max'
                                   - 'min'
                                 retentions:
                                   - '60s:1d'
                                   

                               counter:
                                 operations:
                                   - 'count'
                                 retentions:
                                   - '60s:1d'
                                   - '1h:15d'




martes 19 de junio de 12
stats:
                             default_types:
                               time:
                                 operations:
                                   - 'median'
                                   - 'percentile_95'
                                   - 'max'
                                   - 'min'
                                 retentions:
                                   - '60s:1d'
                                   

                               counter:
                                 operations:
                                   - 'count'
                                 retentions:
                                   - '60s:1d'
                                   - '1h:15d'




martes 19 de junio de 12
stats:
                             default_types:
                               time:
                                 operations:
                                   - 'median'
                                   - 'percentile_95'
                                   - 'max'
                                   - 'min'
                                 retentions:
                                   - '60s:1d'
                                   

                               counter:
                                 operations:
                                   - 'count'
                                 retentions:
                                   - '60s:1d'
                                   - '1h:15d'




martes 19 de junio de 12
stats:
                             default_types:
                               time:
                                 operations:
                                   - 'median'
                                   - 'percentile_95'
                                   - 'max'
                                   - 'min'
                                 retentions:
                                   - '60s:1d'
                                   

                               counter:
                                 operations:
                                   - 'count'
                                 retentions:
                                   - '60s:1d'
                                   - '1h:15d'




martes 19 de junio de 12
stats:
                             default_types:
                               time:
                                 operations:
                                   - 'median'
                                   - 'percentile_95'
                                   - 'max'
                                   - 'min'
                                 retentions:
                                   - '60s:1d'
                                   

                               counter:
                                 operations:
                                   - 'count'
                                 retentions:
                                   - '60s:1d'
                                   - '1h:15d'




martes 19 de junio de 12
stats:
                             default_types:
                               time:
                                 operations:
                                   - 'median'
                                   - 'percentile_95'
                                   - 'max'
                                   - 'min'
                                 retentions:
                                   - '60s:1d'
                                   

                               counter:
                                 operations:
                                   - 'count'
                                 retentions:
                                   - '60s:1d'
                                   - '1h:15d'




martes 19 de junio de 12
stats:
                             default_types:
                               time:
                                 operations:
                                   - 'median'
                                   - 'percentile_95'
                                   - 'max'
                                   - 'min'
                                 retentions:
                                   - '60s:1d'
                                   

                               counter:
                                 operations:
                                   - 'count'
                                 retentions:
                                   - '60s:1d'
                                   - '1h:15d'




martes 19 de junio de 12
obtien
                             LogMonitor      PublisherCli           en
                                                              datos




                                       PUB
                                       PUB




                                                    PUB
                                                    PUB
                           RabbitMQ




                                 SUB
                                 SUB




                                                     SUB
                                                     SUB
                           Collector         WebUIMonitor


                                                              utiliza
                                                                      n
                                                            los da
                                                                   tos

                                              WebUIStats


                            MongoDB




martes 19 de junio de 12
obtien
                                                                       en



                 WebUIStats
                                LogMonitor      PublisherCli
                                                                 datos




                                          PUB
                                          PUB




                                                       PUB
                                                       PUB
                              RabbitMQ




                                    SUB
                                    SUB




                                                        SUB
                                                        SUB
                              Collector         WebUIMonitor


                                                                 utiliza
                                                                         n
                                                               los da
                                                                      tos

                                                 WebUIStats


                               MongoDB




martes 19 de junio de 12
¿qué es?



martes 19 de junio de 12
genera un UI web con
                           gráficos interactivos de tus
                                  estadísticas



martes 19 de junio de 12
un ejemplo



martes 19 de junio de 12
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: 10
               display:
                 title: 'Sentinel'
                 template: tpl_1_1
                 charts:
                   - chart1



martes 19 de junio de 12
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: 10
               display:
                 title: 'Sentinel'
                 template: tpl_1_1
                 charts:
                   - chart1



martes 19 de junio de 12
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: 10
               display:
                 title: 'Sentinel'
                 template: tpl_1_1
                 charts:
                   - chart1



martes 19 de junio de 12
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: 10
               display:
                 title: 'Sentinel'
                 template: tpl_1_1
                 charts:
                   - chart1



martes 19 de junio de 12
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: 10
               display:
                 title: 'Sentinel'
                 template: tpl_1_1
                 charts:
                   - chart1



martes 19 de junio de 12
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: 10
               display:
                 title: 'Sentinel'
                 template: tpl_1_1
                 charts:
                   - chart1



martes 19 de junio de 12
martes 19 de junio de 12
demo



martes 19 de junio de 12
obtien
                             LogMonitor      PublisherCli           en
                                                              datos




                                       PUB
                                       PUB




                                                    PUB
                                                    PUB
                           RabbitMQ




                                 SUB
                                 SUB




                                                     SUB
                                                     SUB
                           Collector         WebUIMonitor


                                                              utiliza
                                                                      n
                                                            los da
                                                                   tos

                                              WebUIStats


                            MongoDB




martes 19 de junio de 12
WebUIMonitor
                                                                  obtien
                                  LogMonitor      PublisherCli           en
                                                                   datos




                                            PUB
                                            PUB




                                                         PUB
                                                         PUB
                                RabbitMQ




                                      SUB
                                      SUB




                                                          SUB
                                                          SUB
                                Collector         WebUIMonitor


                                                                   utiliza
                                                                           n
                                                                 los da
                                                                        tos

                                                   WebUIStats


                                 MongoDB




martes 19 de junio de 12
¿qué es?



martes 19 de junio de 12
UI que muestra errores y eventos
                en tiempo real y reproduce un
                 sonido para errores críticos



martes 19 de junio de 12
2 partes



martes 19 de junio de 12
servidor websocket en PHP atendiendo a
                los clientes websocket y suscrito al canal de
                             errores (RabbitMQ)




martes 19 de junio de 12
cliente Javascript que conecta con el
               servidor websocket y muestra los errores y
                            reproduce sonidos




martes 19 de junio de 12
¿qué pinta tiene?



martes 19 de junio de 12
WebUIMonitor




martes 19 de junio de 12
Tecnologías utilizadas



martes 19 de junio de 12
Tecnologías utilizadas

                             O... qué juguetes nuevos tendré...


martes 19 de junio de 12
martes 19 de junio de 12
nuestro lenguaje base



martes 19 de junio de 12
martes 19 de junio de 12
ClassLoader



martes 19 de junio de 12
YAML



martes 19 de junio de 12
Console



martes 19 de junio de 12
martes 19 de junio de 12
mecanismo estándar de
                   comunicación entre
                      componentes


martes 19 de junio de 12
martes 19 de junio de 12
almacenamos valores
                               estadísticos


martes 19 de junio de 12
martes 19 de junio de 12
pantallas de usuario
                                   ricas


martes 19 de junio de 12
martes 19 de junio de 12
comunicación
                            bidireccional


martes 19 de junio de 12
enviamos errores y
                    eventos en tiempo real
                         al navegador


martes 19 de junio de 12
martes 19 de junio de 12
gráficas interactivas



martes 19 de junio de 12
permite mostrar
                           marcas de eventos


martes 19 de junio de 12
y hacer zoom



martes 19 de junio de 12
¿Qué monitorizamos?



martes 19 de junio de 12
errores php, php-fpm,
                           symfony, mysql, redis,
                                   404...


martes 19 de junio de 12
tiempo de login



martes 19 de junio de 12
tiempo renderizado de
                         páginas clave


martes 19 de junio de 12
número de logins por
                                 minuto


martes 19 de junio de 12
número de productos
                     añadidos al carrito por
                            minuto


martes 19 de junio de 12
número compras por
                                minuto


martes 19 de junio de 12
etc...



martes 19 de junio de 12
¿de qué nos ha servido
                          todo esto?


martes 19 de junio de 12
nos dice cuando es
                           importante no fallar...


martes 19 de junio de 12
martes 19 de junio de 12
picos de compra




martes 19 de junio de 12
nos damos cuenta
                      cuando nos pasamos...


martes 19 de junio de 12
martes 19 de junio de 12
el deploy satura algo




martes 19 de junio de 12
previene desastres



martes 19 de junio de 12
martes 19 de junio de 12
algo se está rompiendo por momentos...




martes 19 de junio de 12
en general nos avisa de que
           hay algo para investigar
martes 19 de junio de 12
y nos conecta con la
                            realidad de nuestro
                                  sistema


martes 19 de junio de 12
martes 19 de junio de 12
componente
                            de alertas




martes 19 de junio de 12
persistencia
                           en el LogMonitor




martes 19 de junio de 12
errores producidos en
                          el navegador



martes 19 de junio de 12
métricas desde el
                           punto de vista del
                              navegador


martes 19 de junio de 12
mejoras en la
                           arquitectura



martes 19 de junio de 12
martes 19 de junio de 12
conclusión



martes 19 de junio de 12
martes 19 de junio de 12
¡MONITORIZA!



martes 19 de junio de 12
https://github.com/ofertix




martes 19 de junio de 12
https://github.com/ofertix




                     ¡muchas
                     gracias!


martes 19 de junio de 12
Fuentes imágenes



           http://all-that-is-interesting.com/fixing-an-antennae-on-the-empire-state-building
           http://fountainxm.en.alibaba.com/column/207827945/Quality.html
           http://gooddeedaday.wordpress.com/2010/02/23/day-540-once-was-blind-but-now-i-see/
           http://www.squidoo.com/dangerous-bugs
           http://www.veryicon.com/icons/object/lifesaver/red-life-saver.html
           http://www.etsy.com/listing/38951509/white-beach-pebbles-engraved-stone-trio
           http://www.fastinternetbrowser.net/
           http://livewareis.blogspot.com.es/2011/07/mejora-de-procesos-una-opcion-para.html
           http://www.asianhealthsecrets.com/letha/?p=2314
           http://chocolatey.org/packages/mongodb




martes 19 de junio de 12

Más contenido relacionado

PDF
1 hour dive into erlang
PDF
Innovación en Marketing Digital
PDF
Designing for mobile devices
PDF
Desayunos Visitelche "El Marketing más Viejo del Mundo"
PDF
"Convirtiendo las ideas en realidad". Nicolás Palacios
PDF
Creatividad 0I (v05)
PDF
OneGoShop, el primer geolocalizador de productos para smartphones.
PDF
2024 Trend Updates: What Really Works In SEO & Content Marketing
1 hour dive into erlang
Innovación en Marketing Digital
Designing for mobile devices
Desayunos Visitelche "El Marketing más Viejo del Mundo"
"Convirtiendo las ideas en realidad". Nicolás Palacios
Creatividad 0I (v05)
OneGoShop, el primer geolocalizador de productos para smartphones.
2024 Trend Updates: What Really Works In SEO & Content Marketing

Último (20)

PDF
CONTABILIDAD Y TRIBUTACION, EJERCICIO PRACTICO
PDF
0007_PPT_DefinicionesDeDataMining_201_v1-0.pdf
DOCX
TRABAJO GRUPAL (5) (1).docxjesjssjsjjskss
PDF
MANUAL TECNOLOGÍA SER MINISTERIO EDUCACIÓN
PPTX
Curso de generación de energía mediante sistemas solares
PPTX
ANCASH-CRITERIOS DE EVALUACIÓN-FORMA-10-10 (2).pptx
PPTX
Mecanismos-de-Propagacion de ondas electromagneticas
PPTX
CLAASIFICACIÓN DE LOS ROBOTS POR UTILIDAD
PDF
PRESENTACIÓN GENERAL MIPIG - MODELO INTEGRADO DE PLANEACIÓN
PDF
Influencia-del-uso-de-redes-sociales.pdf
PPTX
Sesion 1 de microsoft power point - Clase 1
PPT
El-Gobierno-Electrónico-En-El-Estado-Bolivia
DOCX
TRABAJO GRUPAL (5) (1).docxjsjsjskskksksk
PPTX
Power Point Nicolás Carrasco (disertación Roblox).pptx
PDF
ADMINISTRACIÓN DE ARCHIVOS - TICS (SENA).pdf
PDF
programa-de-estudios-2011-guc3ada-para-el-maestro-secundarias-tecnicas-tecnol...
PDF
Instrucciones simples, respuestas poderosas. La fórmula del prompt perfecto.
PDF
Estrategia de Apoyo de Daylin Castaño (5).pdf
PPTX
Acronis Cyber Protect Cloud para Ciber Proteccion y Ciber Seguridad LATAM - A...
PDF
Diapositiva proyecto de vida, materia catedra
CONTABILIDAD Y TRIBUTACION, EJERCICIO PRACTICO
0007_PPT_DefinicionesDeDataMining_201_v1-0.pdf
TRABAJO GRUPAL (5) (1).docxjesjssjsjjskss
MANUAL TECNOLOGÍA SER MINISTERIO EDUCACIÓN
Curso de generación de energía mediante sistemas solares
ANCASH-CRITERIOS DE EVALUACIÓN-FORMA-10-10 (2).pptx
Mecanismos-de-Propagacion de ondas electromagneticas
CLAASIFICACIÓN DE LOS ROBOTS POR UTILIDAD
PRESENTACIÓN GENERAL MIPIG - MODELO INTEGRADO DE PLANEACIÓN
Influencia-del-uso-de-redes-sociales.pdf
Sesion 1 de microsoft power point - Clase 1
El-Gobierno-Electrónico-En-El-Estado-Bolivia
TRABAJO GRUPAL (5) (1).docxjsjsjskskksksk
Power Point Nicolás Carrasco (disertación Roblox).pptx
ADMINISTRACIÓN DE ARCHIVOS - TICS (SENA).pdf
programa-de-estudios-2011-guc3ada-para-el-maestro-secundarias-tecnicas-tecnol...
Instrucciones simples, respuestas poderosas. La fórmula del prompt perfecto.
Estrategia de Apoyo de Daylin Castaño (5).pdf
Acronis Cyber Protect Cloud para Ciber Proteccion y Ciber Seguridad LATAM - A...
Diapositiva proyecto de vida, materia catedra
Publicidad
Publicidad

Sistema monitorización ofertix

  • 1. martes 19 de junio de 12
  • 2. martes 19 de junio de 12
  • 3. Nos presentamos Joan Valduvieco joan.valduvieco@ofertix.com Jordi Llonch jordi.llonch@ofertix.com @jordillonch martes 19 de junio de 12
  • 4. ¿Qué es? martes 19 de junio de 12
  • 5. vendemos productos y servicios a precios interesantes por internet martes 19 de junio de 12
  • 6. cada día abrimos 2-6 pequeñas tiendas durante 3-4 días martes 19 de junio de 12
  • 7. martes 19 de junio de 12
  • 8. vendemos oportunidades de ocio martes 19 de junio de 12
  • 9. martes 19 de junio de 12
  • 10. perfumería y cosmética martes 19 de junio de 12
  • 11. martes 19 de junio de 12
  • 12. productos de temporada martes 19 de junio de 12
  • 13. martes 19 de junio de 12
  • 14. hasta tenemos una tienda de las de toda la vida... martes 19 de junio de 12
  • 15. martes 19 de junio de 12
  • 16. en todos los proyectos IT está en el camino crítico martes 19 de junio de 12
  • 17. vale pues tendréis un equipo de IT grande y a picar código, no? martes 19 de junio de 12
  • 18. bueno... martes 19 de junio de 12
  • 19. venimos de un equipo pequeño... martes 19 de junio de 12
  • 20. que hacía software... martes 19 de junio de 12
  • 21. era martes 19 de junio de 12
  • 22. ágil martes 19 de junio de 12
  • 23. rápido martes 19 de junio de 12
  • 24. barato martes 19 de junio de 12
  • 25. luego el proyecto fue creciendo martes 19 de junio de 12
  • 26. pero no queríamos perder los orígenes... martes 19 de junio de 12
  • 27. por eso empezamos con... martes 19 de junio de 12
  • 30. pequeños pasos hacia el objetivo martes 19 de junio de 12
  • 31. KISS martes 19 de junio de 12
  • 32. test mínimo martes 19 de junio de 12
  • 33. test mínimo pero suficiente para nosotros martes 19 de junio de 12
  • 34. pero hoy hablaremos de... martes 19 de junio de 12
  • 35. martes 19 de junio de 12
  • 37. y de cómo y porqué monitorizamos martes 19 de junio de 12
  • 38. Para nosotros es vital martes 19 de junio de 12
  • 39. nuestro proyecto está vivo martes 19 de junio de 12
  • 40. cada día cambia martes 19 de junio de 12
  • 41. cada día cambia MUCHO martes 19 de junio de 12
  • 42. cada día cambia MUCHO en un año hemos añadido 3 líneas de negocio martes 19 de junio de 12
  • 43. así que los tests quedan obsoletos muy rápido martes 19 de junio de 12
  • 44. Cuando algo va mal martes 19 de junio de 12
  • 45. si no lo vemos no pasa martes 19 de junio de 12
  • 46. si no lo vemos no pasa para nosotros ... martes 19 de junio de 12
  • 47. en producción SIEMPRE hay fallos martes 19 de junio de 12
  • 48. en producción SIEMPRE hay fallos Aunque haya mucho test martes 19 de junio de 12
  • 49. las cosas se estropean martes 19 de junio de 12
  • 50. pero al final los usuarios son los que lo “sufren” martes 19 de junio de 12
  • 51. y normalmente no llaman para quejarse martes 19 de junio de 12
  • 52. si sabemos que las cosas se rompen o que a veces la liamos... martes 19 de junio de 12
  • 53. como mínimo intentemos tardar poco en arreglarlo martes 19 de junio de 12
  • 54. podriamos ser instaladores de antenas... martes 19 de junio de 12
  • 55. y eso nos haría poco ágiles martes 19 de junio de 12
  • 56. pero tenemos la suerte de desarrollar webs martes 19 de junio de 12
  • 57. así que podemos... martes 19 de junio de 12
  • 58. actualizar el código de la web en minutos martes 19 de junio de 12
  • 59. y hacer rollback en segundos martes 19 de junio de 12
  • 60. y hacer rollback en segundos ... si algo va mal... martes 19 de junio de 12
  • 61. tenemos la mayoría de código en un mismo sitio martes 19 de junio de 12
  • 62. sólo una versión del código en producción martes 19 de junio de 12
  • 63. tenemos conexión directa con los clientes martes 19 de junio de 12
  • 64. y miles de clientes usando nuestro código martes 19 de junio de 12
  • 65. ¡usemos esas ventajas para ser más eficientes! martes 19 de junio de 12
  • 66. ¡usemos esas ventajas para ser más eficientes! martes 19 de junio de 12
  • 67. un día decidimos que... martes 19 de junio de 12
  • 68. íbamos a buscar el balance entre test y monitorización martes 19 de junio de 12
  • 69. actualizaríamos producción con mucha frecuencia martes 19 de junio de 12
  • 70. haríamos cambios pequeños martes 19 de junio de 12
  • 71. y si algo iba mal, lo arreglaríamos rápido martes 19 de junio de 12
  • 72. pero para darnos cuenta, necesitábamos... martes 19 de junio de 12
  • 74. vaaaale, ¡monitorizaremos! martes 19 de junio de 12
  • 75. al monitorizar nos damos cuenta de que... martes 19 de junio de 12
  • 76. ¿3.2 es normal? martes 19 de junio de 12
  • 77. si no tenemos histórico no sabemos si lo que vemos es normal martes 19 de junio de 12
  • 78. así que es mejor empezar temprano a monitorizar martes 19 de junio de 12
  • 79. también tendremos falsas alarmas... martes 19 de junio de 12
  • 80. realmente inoportunas martes 19 de junio de 12
  • 81. realmente inoportunas martes 19 de junio de 12
  • 82. pero si no monitorizas no te das cuenta martes 19 de junio de 12
  • 83. hasta que es demasiado tarde martes 19 de junio de 12
  • 84. “Ui, al reiniciar algo no va bien” martes 19 de junio de 12
  • 85. es mejor que martes 19 de junio de 12
  • 86. “Ui, se nos ha caído todo” martes 19 de junio de 12
  • 87. al principio se ven muchos fallos ¡paciencia y a solventarlos! martes 19 de junio de 12
  • 88. vale, usamos nagios, munin, etc... y ya lo tenemos, ¿no? martes 19 de junio de 12
  • 89. bueno... martes 19 de junio de 12
  • 90. nosotros usamos estas herramientas pero no nos sirven para todo martes 19 de junio de 12
  • 91. vamos a hablar de nuestro sistema de monitorización martes 19 de junio de 12
  • 92. ¿pero por qué os hacéis un nuevo sistema de monitorización? martes 19 de junio de 12
  • 93. Sobretodo para conocer los eventos de la aplicación y enlazarlos con los eventos del sistema martes 19 de junio de 12
  • 94. minimizar tecnologías KISS martes 19 de junio de 12
  • 95. adaptado a nuestras necesidades: martes 19 de junio de 12
  • 96. monitorizar logs martes 19 de junio de 12
  • 97. monitorizar logs parsear y actuar rápido! martes 19 de junio de 12
  • 98. deploy continuo martes 19 de junio de 12
  • 99. deploy continuo monitorización en tiempo real y aviso sonoro martes 19 de junio de 12
  • 100. relacionar eventos con medidas martes 19 de junio de 12
  • 101. relacionar eventos con medidas gráficas con flags de eventos martes 19 de junio de 12
  • 102. todo el equipo tiene acceso a la monitorización martes 19 de junio de 12
  • 103. Miquel monitoriza martes 19 de junio de 12
  • 104. Jordi monitoriza martes 19 de junio de 12
  • 105. Dani también monitoriza martes 19 de junio de 12
  • 107. ¡venga al lío! martes 19 de junio de 12
  • 108. Componentes del sistema martes 19 de junio de 12
  • 109. obtien LogMonitor PublisherCli en datos PUB PUB RabbitMQ SUB SUB Collector WebUIMonitor utiliza n los da tos WebUIStats MongoDB martes 19 de junio de 12
  • 110. obtien LogMonitor PublisherCli en datos PUB PUB RabbitMQ SUB SUB Collector WebUIMonitor utiliza n los da tos WebUIStats MongoDB martes 19 de junio de 12
  • 111. obtien LogMonitor PublisherCli en datos PUB PUB RabbitMQ SUB SUB Collector WebUIMonitor utiliza n los da tos WebUIStats MongoDB martes 19 de junio de 12
  • 112. obtien LogMonitor PublisherCli en datos PUB PUB RabbitMQ SUB SUB Collector WebUIMonitor utiliza n los da tos WebUIStats MongoDB martes 19 de junio de 12
  • 113. obtien LogMonitor PublisherCli en datos PUB PUB PUB PUB RabbitMQ SUB SUB SUB SUB Collector WebUIMonitor utiliza n los da tos WebUIStats MongoDB martes 19 de junio de 12
  • 114. LogMonitor obtien LogMonitor PublisherCli en datos PUB PUB PUB PUB RabbitMQ SUB SUB SUB SUB Collector WebUIMonitor utiliza n los da tos WebUIStats MongoDB martes 19 de junio de 12
  • 115. ¿qué es? martes 19 de junio de 12
  • 116. parsea archivos de log martes 19 de junio de 12
  • 117. publica errores y valores estadísticos martes 19 de junio de 12
  • 118. ¿cómo funciona? martes 19 de junio de 12
  • 119. kernel tail -f archivo.log parser actores martes 19 de junio de 12
  • 120. ¿qué necesita para funcionar? martes 19 de junio de 12
  • 121. test_error_access_log.yml upstreamerrors:   file: 'test/error.log'   file_stat: 'test/error.log.sdf'   parser: LogMonitorParsersNginxErrorParser   actors:     - LogMonitorActorsErrorsErrorPhpActor     - LogMonitorActorsErrorsErrorSqlActor     - LogMonitorActorsErrorsErrorSymfonyActor   actor_config:     name: '[test] error.log'     publishers:       publisher_1:         class: LogMonitorPublishersRabbitMQ         config:           host: localhost           port: 5672           user: guest           pass: guest           vhost: /           exchange: myproject_errors martes 19 de junio de 12
  • 122. test_error_access_log.yml upstreamerrors:   file: 'test/error.log'   file_stat: 'test/error.log.sdf'   parser: LogMonitorParsersNginxErrorParser   actors:     - LogMonitorActorsErrorsErrorPhpActor     - LogMonitorActorsErrorsErrorSqlActor     - LogMonitorActorsErrorsErrorSymfonyActor   actor_config:     name: '[test] error.log'     publishers:       publisher_1:         class: LogMonitorPublishersRabbitMQ         config:           host: localhost           port: 5672           user: guest           pass: guest           vhost: /           exchange: myproject_errors martes 19 de junio de 12
  • 123. test_error_access_log.yml upstreamerrors:   file: 'test/error.log'   file_stat: 'test/error.log.sdf'   parser: LogMonitorParsersNginxErrorParser   actors:     - LogMonitorActorsErrorsErrorPhpActor     - LogMonitorActorsErrorsErrorSqlActor     - LogMonitorActorsErrorsErrorSymfonyActor   actor_config:     name: '[test] error.log'     publishers:       publisher_1:         class: LogMonitorPublishersRabbitMQ         config:           host: localhost           port: 5672           user: guest           pass: guest           vhost: /           exchange: myproject_errors martes 19 de junio de 12
  • 124. test_error_access_log.yml upstreamerrors:   file: 'test/error.log'   file_stat: 'test/error.log.sdf'   parser: LogMonitorParsersNginxErrorParser   actors:     - LogMonitorActorsErrorsErrorPhpActor     - LogMonitorActorsErrorsErrorSqlActor     - LogMonitorActorsErrorsErrorSymfonyActor   actor_config:     name: '[test] error.log'     publishers:       publisher_1:         class: LogMonitorPublishersRabbitMQ         config:           host: localhost           port: 5672           user: guest           pass: guest           vhost: /           exchange: myproject_errors martes 19 de junio de 12
  • 125. test_error_access_log.yml upstreamerrors:   file: 'test/error.log'   file_stat: 'test/error.log.sdf'   parser: LogMonitorParsersNginxErrorParser   actors:     - LogMonitorActorsErrorsErrorPhpActor     - LogMonitorActorsErrorsErrorSqlActor     - LogMonitorActorsErrorsErrorSymfonyActor   actor_config:     name: '[test] error.log'     publishers:       publisher_1:         class: LogMonitorPublishersRabbitMQ         config:           host: localhost           port: 5672           user: guest           pass: guest           vhost: /           exchange: myproject_errors martes 19 de junio de 12
  • 126. test_error_access_log.yml upstreamerrors:   file: 'test/error.log'   file_stat: 'test/error.log.sdf'   parser: LogMonitorParsersNginxErrorParser   actors:     - LogMonitorActorsErrorsErrorPhpActor     - LogMonitorActorsErrorsErrorSqlActor     - LogMonitorActorsErrorsErrorSymfonyActor   actor_config:     name: '[test] error.log'     publishers:       publisher_1:         class: LogMonitorPublishersRabbitMQ         config:           host: localhost           port: 5672           user: guest           pass: guest           vhost: /           exchange: myproject_errors martes 19 de junio de 12
  • 127. ejemplo de código martes 19 de junio de 12
  • 128. Parser martes 19 de junio de 12
  • 129. Parser martes 19 de junio de 12
  • 130. Parser martes 19 de junio de 12
  • 131. Parser martes 19 de junio de 12
  • 132. Actor martes 19 de junio de 12
  • 133. Actor martes 19 de junio de 12
  • 134. obtien LogMonitor PublisherCli en datos PUB PUB PUB PUB RabbitMQ SUB SUB SUB SUB Collector WebUIMonitor utiliza n los da tos WebUIStats MongoDB martes 19 de junio de 12
  • 135. PublisherCli obtien LogMonitor PublisherCli en datos PUB PUB PUB PUB RabbitMQ SUB SUB SUB SUB Collector WebUIMonitor utiliza n los da tos WebUIStats MongoDB martes 19 de junio de 12
  • 136. ¿qué es? martes 19 de junio de 12
  • 137. publica eventos o valores desde la línea de comandos martes 19 de junio de 12
  • 138. está autocontenido en: publisher_cli.phar martes 19 de junio de 12
  • 139. unos ejemplos martes 19 de junio de 12
  • 140. evento: ¡OJO iniciamos backup! php publisher_cli.phar --name="backup started" --event martes 19 de junio de 12
  • 141. publicar valor desde shell script php publisher_cli.phar --name=log_length --types=value --value=”$(cat /tmp/file.log|grep error|wc -l)” martes 19 de junio de 12
  • 142. publicar valor desde STDIN while true; do ls | wc -l | php publisher_cli.phar --name=num_files --types=time --value=STDIN;sleep 5;done martes 19 de junio de 12
  • 143. obtien LogMonitor PublisherCli en datos PUB PUB PUB PUB RabbitMQ SUB SUB SUB SUB Collector WebUIMonitor utiliza n los da tos WebUIStats MongoDB martes 19 de junio de 12
  • 144. obtien en Collector LogMonitor PublisherCli datos PUB PUB PUB PUB RabbitMQ SUB SUB SUB SUB Collector WebUIMonitor utiliza n los da tos WebUIStats MongoDB martes 19 de junio de 12
  • 145. ¿qué es? martes 19 de junio de 12
  • 146. se suscribe al canal dónde se publican los valores estadísticos martes 19 de junio de 12
  • 148. ofrece una API para consultar estadística martes 19 de junio de 12
  • 149. un ejemplo martes 19 de junio de 12
  • 150. storage:   storage_1:     class: StatsStorageMongoFactory     config:       server: 'mongodb://localhost:27017'       default_database: 'stats_myproject'       autorotate: false       events_time_to_store: 365 # days output:   storage: storage_1 channel:   class: StatsChannelRabbitMQ   config:     debug: false     host: localhost     port: 5672     user: guest     pass: guest     vhost: /     exchanges:       - myproject_stats martes 19 de junio de 12
  • 151. storage:   storage_1:     class: StatsStorageMongoFactory     config:       server: 'mongodb://localhost:27017'       default_database: 'stats_myproject'       autorotate: false       events_time_to_store: 365 # days output:   storage: storage_1 channel:   class: StatsChannelRabbitMQ   config:     debug: false     host: localhost     port: 5672     user: guest     pass: guest     vhost: /     exchanges:       - myproject_stats martes 19 de junio de 12
  • 152. storage:   storage_1:     class: StatsStorageMongoFactory     config:       server: 'mongodb://localhost:27017'       default_database: 'stats_myproject'       autorotate: false       events_time_to_store: 365 # days output:   storage: storage_1 channel:   class: StatsChannelRabbitMQ   config:     debug: false     host: localhost     port: 5672     user: guest     pass: guest     vhost: /     exchanges:       - myproject_stats martes 19 de junio de 12
  • 153. storage:   storage_1:     class: StatsStorageMongoFactory     config:       server: 'mongodb://localhost:27017'       default_database: 'stats_myproject'       autorotate: false       events_time_to_store: 365 # days output:   storage: storage_1 channel:   class: StatsChannelRabbitMQ   config:     debug: false     host: localhost     port: 5672     user: guest     pass: guest     vhost: /     exchanges:       - myproject_stats martes 19 de junio de 12
  • 154. stats:   default_types:     time:       operations:         - 'median'         - 'percentile_95'         - 'max'         - 'min'       retentions:         - '60s:1d'              counter:       operations:         - 'count'       retentions:         - '60s:1d'         - '1h:15d' martes 19 de junio de 12
  • 155. stats:   default_types:     time:       operations:         - 'median'         - 'percentile_95'         - 'max'         - 'min'       retentions:         - '60s:1d'              counter:       operations:         - 'count'       retentions:         - '60s:1d'         - '1h:15d' martes 19 de junio de 12
  • 156. stats:   default_types:     time:       operations:         - 'median'         - 'percentile_95'         - 'max'         - 'min'       retentions:         - '60s:1d'              counter:       operations:         - 'count'       retentions:         - '60s:1d'         - '1h:15d' martes 19 de junio de 12
  • 157. stats:   default_types:     time:       operations:         - 'median'         - 'percentile_95'         - 'max'         - 'min'       retentions:         - '60s:1d'              counter:       operations:         - 'count'       retentions:         - '60s:1d'         - '1h:15d' martes 19 de junio de 12
  • 158. stats:   default_types:     time:       operations:         - 'median'         - 'percentile_95'         - 'max'         - 'min'       retentions:         - '60s:1d'              counter:       operations:         - 'count'       retentions:         - '60s:1d'         - '1h:15d' martes 19 de junio de 12
  • 159. stats:   default_types:     time:       operations:         - 'median'         - 'percentile_95'         - 'max'         - 'min'       retentions:         - '60s:1d'              counter:       operations:         - 'count'       retentions:         - '60s:1d'         - '1h:15d' martes 19 de junio de 12
  • 160. stats:   default_types:     time:       operations:         - 'median'         - 'percentile_95'         - 'max'         - 'min'       retentions:         - '60s:1d'              counter:       operations:         - 'count'       retentions:         - '60s:1d'         - '1h:15d' martes 19 de junio de 12
  • 161. stats:   default_types:     time:       operations:         - 'median'         - 'percentile_95'         - 'max'         - 'min'       retentions:         - '60s:1d'              counter:       operations:         - 'count'       retentions:         - '60s:1d'         - '1h:15d' martes 19 de junio de 12
  • 162. obtien LogMonitor PublisherCli en datos PUB PUB PUB PUB RabbitMQ SUB SUB SUB SUB Collector WebUIMonitor utiliza n los da tos WebUIStats MongoDB martes 19 de junio de 12
  • 163. obtien en WebUIStats LogMonitor PublisherCli datos PUB PUB PUB PUB RabbitMQ SUB SUB SUB SUB Collector WebUIMonitor utiliza n los da tos WebUIStats MongoDB martes 19 de junio de 12
  • 164. ¿qué es? martes 19 de junio de 12
  • 165. genera un UI web con gráficos interactivos de tus estadísticas martes 19 de junio de 12
  • 166. un ejemplo martes 19 de junio de 12
  • 167. 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: 10 display: title: 'Sentinel' template: tpl_1_1 charts: - chart1 martes 19 de junio de 12
  • 168. 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: 10 display: title: 'Sentinel' template: tpl_1_1 charts: - chart1 martes 19 de junio de 12
  • 169. 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: 10 display: title: 'Sentinel' template: tpl_1_1 charts: - chart1 martes 19 de junio de 12
  • 170. 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: 10 display: title: 'Sentinel' template: tpl_1_1 charts: - chart1 martes 19 de junio de 12
  • 171. 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: 10 display: title: 'Sentinel' template: tpl_1_1 charts: - chart1 martes 19 de junio de 12
  • 172. 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: 10 display: title: 'Sentinel' template: tpl_1_1 charts: - chart1 martes 19 de junio de 12
  • 173. martes 19 de junio de 12
  • 174. demo martes 19 de junio de 12
  • 175. obtien LogMonitor PublisherCli en datos PUB PUB PUB PUB RabbitMQ SUB SUB SUB SUB Collector WebUIMonitor utiliza n los da tos WebUIStats MongoDB martes 19 de junio de 12
  • 176. WebUIMonitor obtien LogMonitor PublisherCli en datos PUB PUB PUB PUB RabbitMQ SUB SUB SUB SUB Collector WebUIMonitor utiliza n los da tos WebUIStats MongoDB martes 19 de junio de 12
  • 177. ¿qué es? martes 19 de junio de 12
  • 178. UI que muestra errores y eventos en tiempo real y reproduce un sonido para errores críticos martes 19 de junio de 12
  • 179. 2 partes martes 19 de junio de 12
  • 180. servidor websocket en PHP atendiendo a los clientes websocket y suscrito al canal de errores (RabbitMQ) martes 19 de junio de 12
  • 181. cliente Javascript que conecta con el servidor websocket y muestra los errores y reproduce sonidos martes 19 de junio de 12
  • 182. ¿qué pinta tiene? martes 19 de junio de 12
  • 185. Tecnologías utilizadas O... qué juguetes nuevos tendré... martes 19 de junio de 12
  • 186. martes 19 de junio de 12
  • 187. nuestro lenguaje base martes 19 de junio de 12
  • 188. martes 19 de junio de 12
  • 189. ClassLoader martes 19 de junio de 12
  • 190. YAML martes 19 de junio de 12
  • 191. Console martes 19 de junio de 12
  • 192. martes 19 de junio de 12
  • 193. mecanismo estándar de comunicación entre componentes martes 19 de junio de 12
  • 194. martes 19 de junio de 12
  • 195. almacenamos valores estadísticos martes 19 de junio de 12
  • 196. martes 19 de junio de 12
  • 197. pantallas de usuario ricas martes 19 de junio de 12
  • 198. martes 19 de junio de 12
  • 199. comunicación bidireccional martes 19 de junio de 12
  • 200. enviamos errores y eventos en tiempo real al navegador martes 19 de junio de 12
  • 201. martes 19 de junio de 12
  • 203. permite mostrar marcas de eventos martes 19 de junio de 12
  • 204. y hacer zoom martes 19 de junio de 12
  • 206. errores php, php-fpm, symfony, mysql, redis, 404... martes 19 de junio de 12
  • 207. tiempo de login martes 19 de junio de 12
  • 208. tiempo renderizado de páginas clave martes 19 de junio de 12
  • 209. número de logins por minuto martes 19 de junio de 12
  • 210. número de productos añadidos al carrito por minuto martes 19 de junio de 12
  • 211. número compras por minuto martes 19 de junio de 12
  • 212. etc... martes 19 de junio de 12
  • 213. ¿de qué nos ha servido todo esto? martes 19 de junio de 12
  • 214. nos dice cuando es importante no fallar... martes 19 de junio de 12
  • 215. martes 19 de junio de 12
  • 216. picos de compra martes 19 de junio de 12
  • 217. nos damos cuenta cuando nos pasamos... martes 19 de junio de 12
  • 218. martes 19 de junio de 12
  • 219. el deploy satura algo martes 19 de junio de 12
  • 220. previene desastres martes 19 de junio de 12
  • 221. martes 19 de junio de 12
  • 222. algo se está rompiendo por momentos... martes 19 de junio de 12
  • 223. en general nos avisa de que hay algo para investigar martes 19 de junio de 12
  • 224. y nos conecta con la realidad de nuestro sistema martes 19 de junio de 12
  • 225. martes 19 de junio de 12
  • 226. componente de alertas martes 19 de junio de 12
  • 227. persistencia en el LogMonitor martes 19 de junio de 12
  • 228. errores producidos en el navegador martes 19 de junio de 12
  • 229. métricas desde el punto de vista del navegador martes 19 de junio de 12
  • 230. mejoras en la arquitectura martes 19 de junio de 12
  • 231. martes 19 de junio de 12
  • 232. conclusión martes 19 de junio de 12
  • 233. martes 19 de junio de 12
  • 236. https://github.com/ofertix ¡muchas gracias! martes 19 de junio de 12
  • 237. Fuentes imágenes http://all-that-is-interesting.com/fixing-an-antennae-on-the-empire-state-building http://fountainxm.en.alibaba.com/column/207827945/Quality.html http://gooddeedaday.wordpress.com/2010/02/23/day-540-once-was-blind-but-now-i-see/ http://www.squidoo.com/dangerous-bugs http://www.veryicon.com/icons/object/lifesaver/red-life-saver.html http://www.etsy.com/listing/38951509/white-beach-pebbles-engraved-stone-trio http://www.fastinternetbrowser.net/ http://livewareis.blogspot.com.es/2011/07/mejora-de-procesos-una-opcion-para.html http://www.asianhealthsecrets.com/letha/?p=2314 http://chocolatey.org/packages/mongodb martes 19 de junio de 12