SlideShare une entreprise Scribd logo
1  sur  48
Télécharger pour lire hors ligne
Logs, exceptions, mails, et
  autres désagréments
L’architecture de data-mining et de remontée d’erreurs chez Fotonauts




Olivier Gutknecht       Aymerick Jéhanne         Mathieu Poumeyrol
olg@fotonauts.com       aymerick@fotonauts.com   kali@fotonauts.com
La Seule Vraie Question



 “euh , il s ’est p assé
     quoi,    là ?”
La Seule Vraie Réponse

         les


LOGS
2 usages
Global et éternel
• Toutes les machines
• Sur tous les composants voulus
• A tous les niveaux
• Aussi longtemps que désiré
• Analyse en batch
• Usages applicatifs, business, métriques
Local et focalisé
• Axé sur les situations d’erreur
• Sur quelques composants (Rails, Merb)
• Autant d’informations que possible
• Persistence à court/moyen terme
• Analyse minimal et quasi-live
• Usage axé développement
ErrorMailerx
     e d u
   R
Idée Géniale #1


• Envoyons un mail à chaque exception Rails
Google tried to deliver your
  message, but it was rejected.
   The user you are trying to
            contact
is receiving mail at a rate
 that prevents additional
   messages from being
         delivered.
Hey !
Solution 1




MPW-C Compiler
 ”Too many errors
    on one line
  (make fewer)”
Solution 1I




    Jean Cocteau
 “Puisque ces mystères
 me dépassent, feignons
d'en être l'organisateur”
Une situation classique
irc://internal #infra


<rapportr> [prod][amz-prod-xx.fotonauts.net]
           [picor][exception][error]
           No route matches "/hello-world" with
           {:method=>:get}




      Notification dans notre canal IRC interne
irc://internal #infra
<rapportr> [prod][aws-prod-xx.fotonauts.net]
           [picor][exception][error]
           No route matches "/hello-world" with
           {:method=>:get}

           => http://xxx.fotonauts.net:5984/_utils/browse/
           document.html?infra-events/
           picor_exception_error_9b0b24e0-
           e817-012b-2ea4-12313800e821


      ... avec le lien vers un document CouchDB
Inclusion directe du hash généré par Rails dans CouchDB
function(doc) {
      if (doc['data']['env']['HTTP_X_FORWARDED_FOR']
           ==   "81.57.x.x, 127.0.0.1")
        emit(doc['date'], doc['message']));
    }




Définition ‘live’ d’une requête, conservable si besoin
Bono-bots
             Rails App          stomp   AMQP Exchange


                                                          amqp
                                             amqp


Toute action de haut niveau génère
un message sur notre système bus              Rapportr    bots   InfraLogger
asynchrone / agents de traitements
(bono-bots) pour gestion des
notifications utilisateurs, etc...                                   http
                                                 irc


On profite de la même
infrastructure pour véhiculer les            IRC Server          CouchDB
notifications d’exceptions.
Error “Mailer”
def self.deliver_exception(exception)
  evt = {
    :app     => 'picor',
    :type    => 'exception',
    :level   => 'error',
    :message => exception.message,
    :grid    => grid,
    :fqdn    => fqdn,
  }
  evt[:session][:params] = controller.params
  evt[:session][:env] = controller.request.env
  evt[:data][:backtrace] = exception.backtrace

  Bono::Bus::Infra.publish(Bono::Event.new(evt))
end
InfraBot - Couch
class InfraLogger < Bono::Bot::Service::Base
  def start
    options = {:queue => "#{Bono::Bot.uid}.service.infra_logger"}
    @queue = Bono::Bus::Infra.watch_events(options) do |event|
      infra_event_received(event)
    end
    super
  end

  # callback fired when an infra event is received
  def infra_event_received(event)
    # format document
    doc = event.to_hash
    doc['_id'] = doc.delete('uid')
    # save to CouchDB database
    Bono::Database::CouchDB.store_document_async('infra-events',
                                             doc, 'infra_logger')
  end
end
InfraBot - IRC
class IrcLogger < Bono::Bot::Service::Base
  def start
    @c = EventMachine::connect(IRC_SERVER, IRC_PORT, BonoIrc, self)
    @c {|conn| conn.send_data("JOIN #infran") }
    @c do |conn|
      options = {:queue => "#{Bot.uid}.service.irc_logger.infra_events"}
      @infra_events_queue = Bono::Infra.watch_events(options) do |e|
        infra_event_received(e)
      end
    end
  end

  # callback fired when an infra event is received
  def infra_event_received(e)
    send_message(“#infra”, e.to_s)
    send_message(“#infra”,
        "http://xxx:5984/_utils/browse/document.html?infra-events/#{e}")
  end
end
Idées en l’air

• Si plus de n erreur sur action par jour
  Entrer un bug automatiquement
• Si plus de n erreur sur user x
  Envoyer un mail d’investigation
• Si plus de n tentatives d’attaque
  Blacklister l’IP pour x heures
Logs globaux
Usage final

• Statistiques applicatif utilisateur
 • Page views, country views
• Search
 • Rating, ...
• Business metrics
Sources
• Frontaux Web
 • Varnish / Nginx / Lighttpd
• Rails
 • production.log
 • Log d’actions utilisateur haut niveau
• Divers logs infrastructure
 • mysql-slow.log, ...
Flot de traitement

• Acquérir les logs en place
• Store-n-forward
• Perennisation des logs bruts
• Traitement itératif des logs bruts
Flot de traitement

• Acquérir les logs en place : multitail
• Store-n-forward : Scribe
• Perennisation des logs bruts : S3
• Traitement itératif des logs bruts : Batchr
MySQL          High-level
Rails Log   HTTP Log
                                         Log           action log




             Multitail                     Multitail




              Scribe                       Scribe




                         ScribeServer
Outils externes
• EC2 / S3 : Amazon Web Services
• Hadoop: Framework Map/Reduce
• Hive: Data-mining sur Hadoop
• Scribe: logger distribué / hiérarchique
  basé sur
  Thrift: RPC bas niveau très efficace
ScribeServer           HDFS




                            Uploader            Hadoop/Hive




                               S3                Analyzer




                Business            Developer
Web front-end                                      Indexer
                 Metrics              Tools
Batchr
• Acquisition des données “historiques”
• Importation des données journalières en
  DFS Hadoop
 • Analyse des logs (GeoIP, comptage, ...)
• Update historique + journalière
• Réinjection S3
• Réinjection applicatif
Implémentation
• Gestion globale du batch par Rake
 • Gestion des instances EC2 (setup cluster
    hadoop, gestion de l’erreur)

 • Import/Export S3 ←→ HDFS
 • Extraction/Analyse avec Hadoop/HIVE
 • Réinjection dans l’applicatifs (Ruby DBI)
Hadoop EC2
• Réécriture du setup des images Hadoop-
  EC2 en rake
 • Boot d’une image Ubuntu standard
 • Configuration Rake Net::SSH::Multi
  • Download d’un hadoop standard
  • Drivé par le clustermaster via rake
hadoop_ec2:setup




hadoop_ec2:setup_os_instances          hadoop_ec2:mkfs




                                                     hadoop_ec2:local_execution_directory




                           hadoop_ec2:setup_hadoop




                                                 hadoop_ec2:run
hadoop_ec2:run




                                                        batchr:hadoop_setup




                       batchr:prepare_hive




batchr:dfs_accesslog                         batchr:dfs_buslog
                                                                              batchr:dfs_old_datasets
GeoIPCountryWhois.csv           batchr:dfs_ips




                         batchr:dfs_geoips




                          batchr:table_ips




                        batchr:table_update_datasets                      batchr:table_old_datasets




                                                  batchr:table_datasets
batchr:table_datasets




batchr:dfs_datasets                batchr:dfs_stats




batchr:s3_datasets                batchr:s3_stats




                            batchr:app_stats




           batchr:daily_attempt
“Stateful Rake”
• Rake
 • Expression des dépendances
 • Exécution manuelle d’une étape
• Avec des ajouts...
 • Etapes intermédiaires non fiables
 • Qu’est-ce qu’une tache terminée ?
class TaskOnce < Rake::Task
  def execute(args)
    time = Time.now
    begin
      super(args)
      File.open(".done."+ name, "w") do |o|
          o.puts(Time.now - time).to_s + "sn"
      end
    rescue Exception => e
      File.open(".fail."+ name, "w") { |o| o.puts e.inspect }
      raise e
    end
  end

  def needed?
    !File.exist?(".done." + name)
  end
end

def once(args, &block)
  TaskOnce.define_task(args, &block)
end
desc "extract unique ips from log"

once :dfs_ips => :table_accesslog do
  @hadoop.hive_string <<-HIVE, "dfs_ips"
  INSERT OVERWRITE DIRECTORY 'ips'
  SELECT distinct(remote_addr_int)
       FROM accesslog
       SORT BY remote_addr_int
  HIVE
end
desc "run me every day"
task :daily do
  begin
    Rake::Task["batchr:daily_attempt"].invoke
  ensure
    Rake::Task["batchr:cleanup"].invoke
  end
end


desc "run me every day, no cleanup on error"
task :daily_attempt => [ :pick_yesterday, :picor_stats,
                         :s3_datasets, :statr_datasets ]   do

end
Idées en l’air
• Vraie reprise sur panne (Cluster EC2)
• Réconciliation de logs
• Accès filtré à une fenêtre de logs
• Web Rake (monitoring, dashboard, ...)
• Frameworkiser EC2/Hadoop/Rake
• Prototypage des requêtes data-mining
 • Quid de l’usage/pertinence de Hive ?

Contenu connexe

Tendances

Configuration Management avec Drupal 8
Configuration Management avec Drupal 8Configuration Management avec Drupal 8
Configuration Management avec Drupal 8Aurelien Navarre
 
Monitoring applicatif : Pourquoi et comment ?
Monitoring applicatif : Pourquoi et comment ?Monitoring applicatif : Pourquoi et comment ?
Monitoring applicatif : Pourquoi et comment ?Kenny Dits
 
Paris stormusergroup intrudocution
Paris stormusergroup intrudocutionParis stormusergroup intrudocution
Paris stormusergroup intrudocutionParis_Storm_UG
 
Paris Kafka Meetup - Concepts & Architecture
Paris Kafka Meetup - Concepts & ArchitectureParis Kafka Meetup - Concepts & Architecture
Paris Kafka Meetup - Concepts & ArchitectureFlorian Hussonnois
 
Breizhcamp : Guide de survie du développeur dans une application (Java) qui rame
Breizhcamp : Guide de survie du développeur dans une application (Java) qui rameBreizhcamp : Guide de survie du développeur dans une application (Java) qui rame
Breizhcamp : Guide de survie du développeur dans une application (Java) qui ramebleporini
 
Perfug Guide de survie du développeur dans une application Java qui rame
Perfug Guide de survie du développeur dans une application Java qui ramePerfug Guide de survie du développeur dans une application Java qui rame
Perfug Guide de survie du développeur dans une application Java qui ramebleporini
 
Cassandra Ippevent 20 Juin 2013
Cassandra Ippevent 20 Juin 2013Cassandra Ippevent 20 Juin 2013
Cassandra Ippevent 20 Juin 2013vberetti
 
201211 drupagora hostingdrupal
201211 drupagora hostingdrupal201211 drupagora hostingdrupal
201211 drupagora hostingdrupalOxalide
 
Mix it 2011 - Clojure
Mix it 2011 - ClojureMix it 2011 - Clojure
Mix it 2011 - Clojurelolopetit
 
Grails from scratch to prod - MixIT 2011
Grails from scratch to prod - MixIT 2011Grails from scratch to prod - MixIT 2011
Grails from scratch to prod - MixIT 2011Aurélien Maury
 
Présentation de Apache Zookeeper
Présentation de Apache ZookeeperPrésentation de Apache Zookeeper
Présentation de Apache ZookeeperMichaël Morello
 
Realtime Web avec Kafka, Spark et Mesos
Realtime Web avec Kafka, Spark et MesosRealtime Web avec Kafka, Spark et Mesos
Realtime Web avec Kafka, Spark et Mesosebiznext
 
Chtijug springbatch 2011
Chtijug springbatch 2011Chtijug springbatch 2011
Chtijug springbatch 2011Olivier BAZOUD
 
Paris JUG Spring Batch
Paris JUG Spring BatchParis JUG Spring Batch
Paris JUG Spring BatchOlivier BAZOUD
 
Guide (un tout petit peu) pratique (et totalement subjectif) du stream proces...
Guide (un tout petit peu) pratique (et totalement subjectif) du stream proces...Guide (un tout petit peu) pratique (et totalement subjectif) du stream proces...
Guide (un tout petit peu) pratique (et totalement subjectif) du stream proces...Bruno Bonnin
 
Realtime Web avec Akka, Kafka, Spark et Mesos - Devoxx Paris 2014
Realtime Web avec Akka, Kafka, Spark et Mesos - Devoxx Paris 2014Realtime Web avec Akka, Kafka, Spark et Mesos - Devoxx Paris 2014
Realtime Web avec Akka, Kafka, Spark et Mesos - Devoxx Paris 2014Ippon
 

Tendances (18)

REX Storm Redis
REX Storm RedisREX Storm Redis
REX Storm Redis
 
Configuration Management avec Drupal 8
Configuration Management avec Drupal 8Configuration Management avec Drupal 8
Configuration Management avec Drupal 8
 
Monitoring applicatif : Pourquoi et comment ?
Monitoring applicatif : Pourquoi et comment ?Monitoring applicatif : Pourquoi et comment ?
Monitoring applicatif : Pourquoi et comment ?
 
Paris stormusergroup intrudocution
Paris stormusergroup intrudocutionParis stormusergroup intrudocution
Paris stormusergroup intrudocution
 
Paris Kafka Meetup - Concepts & Architecture
Paris Kafka Meetup - Concepts & ArchitectureParis Kafka Meetup - Concepts & Architecture
Paris Kafka Meetup - Concepts & Architecture
 
Breizhcamp : Guide de survie du développeur dans une application (Java) qui rame
Breizhcamp : Guide de survie du développeur dans une application (Java) qui rameBreizhcamp : Guide de survie du développeur dans une application (Java) qui rame
Breizhcamp : Guide de survie du développeur dans une application (Java) qui rame
 
Perfug Guide de survie du développeur dans une application Java qui rame
Perfug Guide de survie du développeur dans une application Java qui ramePerfug Guide de survie du développeur dans une application Java qui rame
Perfug Guide de survie du développeur dans une application Java qui rame
 
Cassandra Ippevent 20 Juin 2013
Cassandra Ippevent 20 Juin 2013Cassandra Ippevent 20 Juin 2013
Cassandra Ippevent 20 Juin 2013
 
201211 drupagora hostingdrupal
201211 drupagora hostingdrupal201211 drupagora hostingdrupal
201211 drupagora hostingdrupal
 
Mix it 2011 - Clojure
Mix it 2011 - ClojureMix it 2011 - Clojure
Mix it 2011 - Clojure
 
HADOOP + R
HADOOP + RHADOOP + R
HADOOP + R
 
Grails from scratch to prod - MixIT 2011
Grails from scratch to prod - MixIT 2011Grails from scratch to prod - MixIT 2011
Grails from scratch to prod - MixIT 2011
 
Présentation de Apache Zookeeper
Présentation de Apache ZookeeperPrésentation de Apache Zookeeper
Présentation de Apache Zookeeper
 
Realtime Web avec Kafka, Spark et Mesos
Realtime Web avec Kafka, Spark et MesosRealtime Web avec Kafka, Spark et Mesos
Realtime Web avec Kafka, Spark et Mesos
 
Chtijug springbatch 2011
Chtijug springbatch 2011Chtijug springbatch 2011
Chtijug springbatch 2011
 
Paris JUG Spring Batch
Paris JUG Spring BatchParis JUG Spring Batch
Paris JUG Spring Batch
 
Guide (un tout petit peu) pratique (et totalement subjectif) du stream proces...
Guide (un tout petit peu) pratique (et totalement subjectif) du stream proces...Guide (un tout petit peu) pratique (et totalement subjectif) du stream proces...
Guide (un tout petit peu) pratique (et totalement subjectif) du stream proces...
 
Realtime Web avec Akka, Kafka, Spark et Mesos - Devoxx Paris 2014
Realtime Web avec Akka, Kafka, Spark et Mesos - Devoxx Paris 2014Realtime Web avec Akka, Kafka, Spark et Mesos - Devoxx Paris 2014
Realtime Web avec Akka, Kafka, Spark et Mesos - Devoxx Paris 2014
 

En vedette

Deck seo campus 2011 utiliser les logs serveurs
Deck seo campus 2011   utiliser les logs serveursDeck seo campus 2011   utiliser les logs serveurs
Deck seo campus 2011 utiliser les logs serveursPhilippe YONNET
 
AFUP - Mini conférences PHP - Les LOGs
AFUP - Mini conférences PHP - Les LOGsAFUP - Mini conférences PHP - Les LOGs
AFUP - Mini conférences PHP - Les LOGsFrédéric Sagez
 
Drupal 8 + Elasticsearch + Docker
Drupal 8 + Elasticsearch + DockerDrupal 8 + Elasticsearch + Docker
Drupal 8 + Elasticsearch + DockerRoald Umandal
 
Plateforme centralisée d’analyse des logs des frontaux http en temps réel dan...
Plateforme centralisée d’analyse des logs des frontaux http en temps réel dan...Plateforme centralisée d’analyse des logs des frontaux http en temps réel dan...
Plateforme centralisée d’analyse des logs des frontaux http en temps réel dan...Guillaume MOCQUET
 
SMSSI ITIL
SMSSI  ITILSMSSI  ITIL
SMSSI ITILchammem
 
A la recherche d'ElasticSearch
A la recherche d'ElasticSearchA la recherche d'ElasticSearch
A la recherche d'ElasticSearchNinnir
 
Analyse combinée crawl + logs - Search Foresight & Botify
Analyse combinée crawl + logs - Search Foresight & BotifyAnalyse combinée crawl + logs - Search Foresight & Botify
Analyse combinée crawl + logs - Search Foresight & BotifyPhilippe YONNET
 
Chapitre2 prise en_main_kibana
Chapitre2 prise en_main_kibanaChapitre2 prise en_main_kibana
Chapitre2 prise en_main_kibanaFabien SABATIER
 
Chapitre3 elk concepts_avances
Chapitre3 elk concepts_avancesChapitre3 elk concepts_avances
Chapitre3 elk concepts_avancesFabien SABATIER
 
IDS,SNORT ET SÉCURITÉ RESEAU
IDS,SNORT ET SÉCURITÉ RESEAUIDS,SNORT ET SÉCURITÉ RESEAU
IDS,SNORT ET SÉCURITÉ RESEAUCHAOUACHI marwen
 
[Sildes] plateforme centralisée d’analyse des logs des frontaux http en temps...
[Sildes] plateforme centralisée d’analyse des logs des frontaux http en temps...[Sildes] plateforme centralisée d’analyse des logs des frontaux http en temps...
[Sildes] plateforme centralisée d’analyse des logs des frontaux http en temps...Guillaume MOCQUET
 
ElasticSearch : Architecture et Développement
ElasticSearch : Architecture et DéveloppementElasticSearch : Architecture et Développement
ElasticSearch : Architecture et DéveloppementMohamed hedi Abidi
 
Beginner's Guide to SIEM
Beginner's Guide to SIEM Beginner's Guide to SIEM
Beginner's Guide to SIEM AlienVault
 
Elasticsearch - Montpellier JUG
Elasticsearch - Montpellier JUGElasticsearch - Montpellier JUG
Elasticsearch - Montpellier JUGDavid Pilato
 

En vedette (20)

Deck seo campus 2011 utiliser les logs serveurs
Deck seo campus 2011   utiliser les logs serveursDeck seo campus 2011   utiliser les logs serveurs
Deck seo campus 2011 utiliser les logs serveurs
 
Le PHP chez Deezer
Le PHP chez DeezerLe PHP chez Deezer
Le PHP chez Deezer
 
AFUP - Mini conférences PHP - Les LOGs
AFUP - Mini conférences PHP - Les LOGsAFUP - Mini conférences PHP - Les LOGs
AFUP - Mini conférences PHP - Les LOGs
 
Cci octobre 2014
Cci octobre 2014Cci octobre 2014
Cci octobre 2014
 
Drupal 8 + Elasticsearch + Docker
Drupal 8 + Elasticsearch + DockerDrupal 8 + Elasticsearch + Docker
Drupal 8 + Elasticsearch + Docker
 
Plateforme centralisée d’analyse des logs des frontaux http en temps réel dan...
Plateforme centralisée d’analyse des logs des frontaux http en temps réel dan...Plateforme centralisée d’analyse des logs des frontaux http en temps réel dan...
Plateforme centralisée d’analyse des logs des frontaux http en temps réel dan...
 
Séminaire Log Management
Séminaire Log ManagementSéminaire Log Management
Séminaire Log Management
 
SMSSI ITIL
SMSSI  ITILSMSSI  ITIL
SMSSI ITIL
 
A la recherche d'ElasticSearch
A la recherche d'ElasticSearchA la recherche d'ElasticSearch
A la recherche d'ElasticSearch
 
Analyse combinée crawl + logs - Search Foresight & Botify
Analyse combinée crawl + logs - Search Foresight & BotifyAnalyse combinée crawl + logs - Search Foresight & Botify
Analyse combinée crawl + logs - Search Foresight & Botify
 
Chapitre2 prise en_main_kibana
Chapitre2 prise en_main_kibanaChapitre2 prise en_main_kibana
Chapitre2 prise en_main_kibana
 
Splunk
SplunkSplunk
Splunk
 
Chapitre3 elk concepts_avances
Chapitre3 elk concepts_avancesChapitre3 elk concepts_avances
Chapitre3 elk concepts_avances
 
IDS,SNORT ET SÉCURITÉ RESEAU
IDS,SNORT ET SÉCURITÉ RESEAUIDS,SNORT ET SÉCURITÉ RESEAU
IDS,SNORT ET SÉCURITÉ RESEAU
 
[Sildes] plateforme centralisée d’analyse des logs des frontaux http en temps...
[Sildes] plateforme centralisée d’analyse des logs des frontaux http en temps...[Sildes] plateforme centralisée d’analyse des logs des frontaux http en temps...
[Sildes] plateforme centralisée d’analyse des logs des frontaux http en temps...
 
Rapport projet pfe
Rapport projet pfeRapport projet pfe
Rapport projet pfe
 
IPTV
IPTVIPTV
IPTV
 
ElasticSearch : Architecture et Développement
ElasticSearch : Architecture et DéveloppementElasticSearch : Architecture et Développement
ElasticSearch : Architecture et Développement
 
Beginner's Guide to SIEM
Beginner's Guide to SIEM Beginner's Guide to SIEM
Beginner's Guide to SIEM
 
Elasticsearch - Montpellier JUG
Elasticsearch - Montpellier JUGElasticsearch - Montpellier JUG
Elasticsearch - Montpellier JUG
 

Similaire à Paris RailsCamp 2009

Microbox : Ma toolbox microservices - Julien Roy
Microbox : Ma toolbox microservices - Julien RoyMicrobox : Ma toolbox microservices - Julien Roy
Microbox : Ma toolbox microservices - Julien Royekino
 
Hadoop MapReduce - OSDC FR 2009
Hadoop MapReduce - OSDC FR 2009Hadoop MapReduce - OSDC FR 2009
Hadoop MapReduce - OSDC FR 2009Olivier Grisel
 
Ops@viadeo : Puppet & Co... 6 mois après par Xavier Krantz
Ops@viadeo : Puppet & Co... 6 mois après par Xavier KrantzOps@viadeo : Puppet & Co... 6 mois après par Xavier Krantz
Ops@viadeo : Puppet & Co... 6 mois après par Xavier KrantzOlivier DASINI
 
BreizhCamp 2019 - IoT et open source hardware pour la collecte de timeseries
BreizhCamp 2019 - IoT et open source hardware pour la collecte de timeseriesBreizhCamp 2019 - IoT et open source hardware pour la collecte de timeseries
BreizhCamp 2019 - IoT et open source hardware pour la collecte de timeseriesXavier MARIN
 
[GAB2016] Azure DocumentDB - Jean-Luc Boucho
[GAB2016] Azure DocumentDB - Jean-Luc Boucho[GAB2016] Azure DocumentDB - Jean-Luc Boucho
[GAB2016] Azure DocumentDB - Jean-Luc BouchoCellenza
 
Jean-Luc Boucho - Azure DocumentDB - Global Azure Bootcamp 2016 Paris
Jean-Luc Boucho - Azure DocumentDB - Global Azure Bootcamp 2016 Paris Jean-Luc Boucho - Azure DocumentDB - Global Azure Bootcamp 2016 Paris
Jean-Luc Boucho - Azure DocumentDB - Global Azure Bootcamp 2016 Paris AZUG FR
 
Démo Gatling au Performance User Group de Casablanca - 25 sept 2014
Démo Gatling au Performance User Group de Casablanca - 25 sept 2014Démo Gatling au Performance User Group de Casablanca - 25 sept 2014
Démo Gatling au Performance User Group de Casablanca - 25 sept 2014Benoît de CHATEAUVIEUX
 
08 01 mise en place d'un serveur web
08 01 mise en place d'un serveur web08 01 mise en place d'un serveur web
08 01 mise en place d'un serveur webNoël
 
Checklist pour concevoir une application dans le cloud.10 conseils à l'attent...
Checklist pour concevoir une application dans le cloud.10 conseils à l'attent...Checklist pour concevoir une application dans le cloud.10 conseils à l'attent...
Checklist pour concevoir une application dans le cloud.10 conseils à l'attent...Alexandre Touret
 
Maven/Ivy vs OSGi (Toulouse Jug 26-05-2011)
Maven/Ivy vs OSGi (Toulouse Jug 26-05-2011)Maven/Ivy vs OSGi (Toulouse Jug 26-05-2011)
Maven/Ivy vs OSGi (Toulouse Jug 26-05-2011)hibnico
 
Checklist pour concevoir une application dans le cloud.10 conseils à l'attent...
Checklist pour concevoir une application dans le cloud.10 conseils à l'attent...Checklist pour concevoir une application dans le cloud.10 conseils à l'attent...
Checklist pour concevoir une application dans le cloud.10 conseils à l'attent...Alexandre Touret
 
S2-01-PHP.pptx
S2-01-PHP.pptxS2-01-PHP.pptx
S2-01-PHP.pptxkohay75604
 
Stats web avec Hive chez Scoop.it
Stats web avec Hive chez Scoop.itStats web avec Hive chez Scoop.it
Stats web avec Hive chez Scoop.ithibnico
 
2013 01-08-php-maturite
2013 01-08-php-maturite2013 01-08-php-maturite
2013 01-08-php-maturiteRémi Alvado
 
XebiCon'16 : Choisissez votre style avec Docker & Amazon Web Services Par Al...
XebiCon'16 : Choisissez votre style avec Docker & Amazon Web Services  Par Al...XebiCon'16 : Choisissez votre style avec Docker & Amazon Web Services  Par Al...
XebiCon'16 : Choisissez votre style avec Docker & Amazon Web Services Par Al...Publicis Sapient Engineering
 
Javascript as a first programming language : votre IC prête pour la révolution !
Javascript as a first programming language : votre IC prête pour la révolution !Javascript as a first programming language : votre IC prête pour la révolution !
Javascript as a first programming language : votre IC prête pour la révolution !VISEO
 
Azure Camp 9 Décembre - slides session développeurs webmedia
Azure Camp 9 Décembre - slides session développeurs webmediaAzure Camp 9 Décembre - slides session développeurs webmedia
Azure Camp 9 Décembre - slides session développeurs webmediaMicrosoft
 

Similaire à Paris RailsCamp 2009 (20)

Formation Google App Engine
Formation Google App EngineFormation Google App Engine
Formation Google App Engine
 
Microbox : Ma toolbox microservices - Julien Roy
Microbox : Ma toolbox microservices - Julien RoyMicrobox : Ma toolbox microservices - Julien Roy
Microbox : Ma toolbox microservices - Julien Roy
 
Hadoop MapReduce - OSDC FR 2009
Hadoop MapReduce - OSDC FR 2009Hadoop MapReduce - OSDC FR 2009
Hadoop MapReduce - OSDC FR 2009
 
Vert.x 3
Vert.x 3Vert.x 3
Vert.x 3
 
Ops@viadeo : Puppet & Co... 6 mois après par Xavier Krantz
Ops@viadeo : Puppet & Co... 6 mois après par Xavier KrantzOps@viadeo : Puppet & Co... 6 mois après par Xavier Krantz
Ops@viadeo : Puppet & Co... 6 mois après par Xavier Krantz
 
BreizhCamp 2019 - IoT et open source hardware pour la collecte de timeseries
BreizhCamp 2019 - IoT et open source hardware pour la collecte de timeseriesBreizhCamp 2019 - IoT et open source hardware pour la collecte de timeseries
BreizhCamp 2019 - IoT et open source hardware pour la collecte de timeseries
 
[GAB2016] Azure DocumentDB - Jean-Luc Boucho
[GAB2016] Azure DocumentDB - Jean-Luc Boucho[GAB2016] Azure DocumentDB - Jean-Luc Boucho
[GAB2016] Azure DocumentDB - Jean-Luc Boucho
 
Jean-Luc Boucho - Azure DocumentDB - Global Azure Bootcamp 2016 Paris
Jean-Luc Boucho - Azure DocumentDB - Global Azure Bootcamp 2016 Paris Jean-Luc Boucho - Azure DocumentDB - Global Azure Bootcamp 2016 Paris
Jean-Luc Boucho - Azure DocumentDB - Global Azure Bootcamp 2016 Paris
 
Démo Gatling au Performance User Group de Casablanca - 25 sept 2014
Démo Gatling au Performance User Group de Casablanca - 25 sept 2014Démo Gatling au Performance User Group de Casablanca - 25 sept 2014
Démo Gatling au Performance User Group de Casablanca - 25 sept 2014
 
08 01 mise en place d'un serveur web
08 01 mise en place d'un serveur web08 01 mise en place d'un serveur web
08 01 mise en place d'un serveur web
 
Checklist pour concevoir une application dans le cloud.10 conseils à l'attent...
Checklist pour concevoir une application dans le cloud.10 conseils à l'attent...Checklist pour concevoir une application dans le cloud.10 conseils à l'attent...
Checklist pour concevoir une application dans le cloud.10 conseils à l'attent...
 
Maven/Ivy vs OSGi (Toulouse Jug 26-05-2011)
Maven/Ivy vs OSGi (Toulouse Jug 26-05-2011)Maven/Ivy vs OSGi (Toulouse Jug 26-05-2011)
Maven/Ivy vs OSGi (Toulouse Jug 26-05-2011)
 
Checklist pour concevoir une application dans le cloud.10 conseils à l'attent...
Checklist pour concevoir une application dans le cloud.10 conseils à l'attent...Checklist pour concevoir une application dans le cloud.10 conseils à l'attent...
Checklist pour concevoir une application dans le cloud.10 conseils à l'attent...
 
S2-01-PHP.pptx
S2-01-PHP.pptxS2-01-PHP.pptx
S2-01-PHP.pptx
 
Infrastructure as code drupal
Infrastructure as code drupalInfrastructure as code drupal
Infrastructure as code drupal
 
Stats web avec Hive chez Scoop.it
Stats web avec Hive chez Scoop.itStats web avec Hive chez Scoop.it
Stats web avec Hive chez Scoop.it
 
2013 01-08-php-maturite
2013 01-08-php-maturite2013 01-08-php-maturite
2013 01-08-php-maturite
 
XebiCon'16 : Choisissez votre style avec Docker & Amazon Web Services Par Al...
XebiCon'16 : Choisissez votre style avec Docker & Amazon Web Services  Par Al...XebiCon'16 : Choisissez votre style avec Docker & Amazon Web Services  Par Al...
XebiCon'16 : Choisissez votre style avec Docker & Amazon Web Services Par Al...
 
Javascript as a first programming language : votre IC prête pour la révolution !
Javascript as a first programming language : votre IC prête pour la révolution !Javascript as a first programming language : votre IC prête pour la révolution !
Javascript as a first programming language : votre IC prête pour la révolution !
 
Azure Camp 9 Décembre - slides session développeurs webmedia
Azure Camp 9 Décembre - slides session développeurs webmediaAzure Camp 9 Décembre - slides session développeurs webmedia
Azure Camp 9 Décembre - slides session développeurs webmedia
 

Paris RailsCamp 2009

  • 1. Logs, exceptions, mails, et autres désagréments L’architecture de data-mining et de remontée d’erreurs chez Fotonauts Olivier Gutknecht Aymerick Jéhanne Mathieu Poumeyrol olg@fotonauts.com aymerick@fotonauts.com kali@fotonauts.com
  • 2. La Seule Vraie Question “euh , il s ’est p assé quoi, là ?”
  • 3. La Seule Vraie Réponse les LOGS
  • 5. Global et éternel • Toutes les machines • Sur tous les composants voulus • A tous les niveaux • Aussi longtemps que désiré • Analyse en batch • Usages applicatifs, business, métriques
  • 6. Local et focalisé • Axé sur les situations d’erreur • Sur quelques composants (Rails, Merb) • Autant d’informations que possible • Persistence à court/moyen terme • Analyse minimal et quasi-live • Usage axé développement
  • 7. ErrorMailerx e d u R
  • 8. Idée Géniale #1 • Envoyons un mail à chaque exception Rails
  • 9. Google tried to deliver your message, but it was rejected. The user you are trying to contact is receiving mail at a rate that prevents additional messages from being delivered.
  • 10. Hey !
  • 11. Solution 1 MPW-C Compiler ”Too many errors on one line (make fewer)”
  • 12. Solution 1I Jean Cocteau “Puisque ces mystères me dépassent, feignons d'en être l'organisateur”
  • 14. irc://internal #infra <rapportr> [prod][amz-prod-xx.fotonauts.net] [picor][exception][error] No route matches "/hello-world" with {:method=>:get} Notification dans notre canal IRC interne
  • 15. irc://internal #infra <rapportr> [prod][aws-prod-xx.fotonauts.net] [picor][exception][error] No route matches "/hello-world" with {:method=>:get} => http://xxx.fotonauts.net:5984/_utils/browse/ document.html?infra-events/ picor_exception_error_9b0b24e0- e817-012b-2ea4-12313800e821 ... avec le lien vers un document CouchDB
  • 16. Inclusion directe du hash généré par Rails dans CouchDB
  • 17.
  • 18.
  • 19. function(doc) { if (doc['data']['env']['HTTP_X_FORWARDED_FOR'] == "81.57.x.x, 127.0.0.1") emit(doc['date'], doc['message'])); } Définition ‘live’ d’une requête, conservable si besoin
  • 20. Bono-bots Rails App stomp AMQP Exchange amqp amqp Toute action de haut niveau génère un message sur notre système bus Rapportr bots InfraLogger asynchrone / agents de traitements (bono-bots) pour gestion des notifications utilisateurs, etc... http irc On profite de la même infrastructure pour véhiculer les IRC Server CouchDB notifications d’exceptions.
  • 21. Error “Mailer” def self.deliver_exception(exception) evt = { :app => 'picor', :type => 'exception', :level => 'error', :message => exception.message, :grid => grid, :fqdn => fqdn, } evt[:session][:params] = controller.params evt[:session][:env] = controller.request.env evt[:data][:backtrace] = exception.backtrace Bono::Bus::Infra.publish(Bono::Event.new(evt)) end
  • 22. InfraBot - Couch class InfraLogger < Bono::Bot::Service::Base def start options = {:queue => "#{Bono::Bot.uid}.service.infra_logger"} @queue = Bono::Bus::Infra.watch_events(options) do |event| infra_event_received(event) end super end # callback fired when an infra event is received def infra_event_received(event) # format document doc = event.to_hash doc['_id'] = doc.delete('uid') # save to CouchDB database Bono::Database::CouchDB.store_document_async('infra-events', doc, 'infra_logger') end end
  • 23. InfraBot - IRC class IrcLogger < Bono::Bot::Service::Base def start @c = EventMachine::connect(IRC_SERVER, IRC_PORT, BonoIrc, self) @c {|conn| conn.send_data("JOIN #infran") } @c do |conn| options = {:queue => "#{Bot.uid}.service.irc_logger.infra_events"} @infra_events_queue = Bono::Infra.watch_events(options) do |e| infra_event_received(e) end end end # callback fired when an infra event is received def infra_event_received(e) send_message(“#infra”, e.to_s) send_message(“#infra”, "http://xxx:5984/_utils/browse/document.html?infra-events/#{e}") end end
  • 24. Idées en l’air • Si plus de n erreur sur action par jour Entrer un bug automatiquement • Si plus de n erreur sur user x Envoyer un mail d’investigation • Si plus de n tentatives d’attaque Blacklister l’IP pour x heures
  • 26. Usage final • Statistiques applicatif utilisateur • Page views, country views • Search • Rating, ... • Business metrics
  • 27.
  • 28.
  • 29.
  • 30.
  • 31. Sources • Frontaux Web • Varnish / Nginx / Lighttpd • Rails • production.log • Log d’actions utilisateur haut niveau • Divers logs infrastructure • mysql-slow.log, ...
  • 32. Flot de traitement • Acquérir les logs en place • Store-n-forward • Perennisation des logs bruts • Traitement itératif des logs bruts
  • 33. Flot de traitement • Acquérir les logs en place : multitail • Store-n-forward : Scribe • Perennisation des logs bruts : S3 • Traitement itératif des logs bruts : Batchr
  • 34. MySQL High-level Rails Log HTTP Log Log action log Multitail Multitail Scribe Scribe ScribeServer
  • 35. Outils externes • EC2 / S3 : Amazon Web Services • Hadoop: Framework Map/Reduce • Hive: Data-mining sur Hadoop • Scribe: logger distribué / hiérarchique basé sur Thrift: RPC bas niveau très efficace
  • 36. ScribeServer HDFS Uploader Hadoop/Hive S3 Analyzer Business Developer Web front-end Indexer Metrics Tools
  • 37. Batchr • Acquisition des données “historiques” • Importation des données journalières en DFS Hadoop • Analyse des logs (GeoIP, comptage, ...) • Update historique + journalière • Réinjection S3 • Réinjection applicatif
  • 38. Implémentation • Gestion globale du batch par Rake • Gestion des instances EC2 (setup cluster hadoop, gestion de l’erreur) • Import/Export S3 ←→ HDFS • Extraction/Analyse avec Hadoop/HIVE • Réinjection dans l’applicatifs (Ruby DBI)
  • 39. Hadoop EC2 • Réécriture du setup des images Hadoop- EC2 en rake • Boot d’une image Ubuntu standard • Configuration Rake Net::SSH::Multi • Download d’un hadoop standard • Drivé par le clustermaster via rake
  • 40. hadoop_ec2:setup hadoop_ec2:setup_os_instances hadoop_ec2:mkfs hadoop_ec2:local_execution_directory hadoop_ec2:setup_hadoop hadoop_ec2:run
  • 41. hadoop_ec2:run batchr:hadoop_setup batchr:prepare_hive batchr:dfs_accesslog batchr:dfs_buslog batchr:dfs_old_datasets
  • 42. GeoIPCountryWhois.csv batchr:dfs_ips batchr:dfs_geoips batchr:table_ips batchr:table_update_datasets batchr:table_old_datasets batchr:table_datasets
  • 43. batchr:table_datasets batchr:dfs_datasets batchr:dfs_stats batchr:s3_datasets batchr:s3_stats batchr:app_stats batchr:daily_attempt
  • 44. “Stateful Rake” • Rake • Expression des dépendances • Exécution manuelle d’une étape • Avec des ajouts... • Etapes intermédiaires non fiables • Qu’est-ce qu’une tache terminée ?
  • 45. class TaskOnce < Rake::Task def execute(args) time = Time.now begin super(args) File.open(".done."+ name, "w") do |o| o.puts(Time.now - time).to_s + "sn" end rescue Exception => e File.open(".fail."+ name, "w") { |o| o.puts e.inspect } raise e end end def needed? !File.exist?(".done." + name) end end def once(args, &block) TaskOnce.define_task(args, &block) end
  • 46. desc "extract unique ips from log" once :dfs_ips => :table_accesslog do @hadoop.hive_string <<-HIVE, "dfs_ips" INSERT OVERWRITE DIRECTORY 'ips' SELECT distinct(remote_addr_int) FROM accesslog SORT BY remote_addr_int HIVE end
  • 47. desc "run me every day" task :daily do begin Rake::Task["batchr:daily_attempt"].invoke ensure Rake::Task["batchr:cleanup"].invoke end end desc "run me every day, no cleanup on error" task :daily_attempt => [ :pick_yesterday, :picor_stats, :s3_datasets, :statr_datasets ] do end
  • 48. Idées en l’air • Vraie reprise sur panne (Cluster EC2) • Réconciliation de logs • Accès filtré à une fenêtre de logs • Web Rake (monitoring, dashboard, ...) • Frameworkiser EC2/Hadoop/Rake • Prototypage des requêtes data-mining • Quid de l’usage/pertinence de Hive ?

Notes de l'éditeur