Publié par

Il y a 5 années -

Temps de lecture 11 minutes

Logstash, ElasticSearch, Kibana – S01E01 – Analyse d’e-réputation sur Twitter

Il arrive souvent que l’équipe marketing ou les community managers passent une partie de leur temps à scruter les différents réseaux sociaux en vogue (Facebook, Twitter, Google+, blogs, forums, etc.) pour prendre la tendance sur l’e-réputation de leur entreprise et de ses produits. Le tryptique Logstash, ElasticSearch, Kibana est une solution intéressante pour automatiser la collecte d’information et construire des tableaux de bords, avec des indicateurs agrégés et clairs.

Dans cet premier opus d’une mini série, nous allons voir comment monter un monitoring de Twitter afin d’aider notre équipe marketing. Ce "classique" dans la communauté ElasticSearch (JUG, talks, …) permettra de nous focaliser sur la configuration d’un dashboard Kibana.

À la fin de cet article, nous pourrons notamment répondre à des questions comme :

  • combien de fois ai-je été cité dans un tweet durant les 15 dernières minutes ?
  • quelle est ma part de marché parmi mes concurrents ?
  • quels sont les hashtags les plus populaires associés à ma marque ?
  • quelle est la répartition géographique des gens qui parlent de mes produits ?

Suivez le guide.

Dans un cas réel, une entreprise choisira certainement de cibler des termes comme :

  • son nom
  • le nom de ses produits
  • le nom du concurrent
  • le nom des produits concurrents

Pour les besoins de l’exercice, nous nous concentrerons sur les termes iphone, android, et blackberry. Ces 3 termes permettent de remonter un nombre de résultats suffisamment conséquent pour tester notre solution.

Création d’une application Twitter

Avant de pouvoir indexer le contenu de Twitter, il faut se brancher sur son API de Streaming public. Pour cela, vous devez créer une application Twitter. C’est une procédure très simple ne prenant pas plus de 5 minutes.
À l’aide de votre compte Twitter habituel :

  • Rendez-vous sur la page de vos applications à cette adresse : https://dev.twitter.com/apps
  • Créez une nouvelle application (ici "Twitter Survey")
  • Remplissez tous les champs du formulaire excepté "Callback URL"
  • Acceptez les conditions (sans les lire ;)
  • Validez
  • Cliquez tout en bas de la page de votre application sur le bouton "Create my access token"

Notez les valeurs "Consumer key", "Consumer secret", "Access token" et "Access token secret" vous donnant accès à la précieuse API.

Installation d’ElasticSearch

Dans le terminal de votre Unix préféré, installons :

curl -O https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-0.90.3.zip
unzip elasticsearch-0.90.3.zip
cd elasticsearch-0.90.3/

bin/plugin --install mobz/elasticsearch-head

bin/plugin -install elasticsearch/elasticsearch-river-twitter/1.4.0

Démarrez ElasticSearch :

./bin/elasticsearch -f
[2013-10-01 21:21:38,447][INFO ][node                     ] [Forearm] version[0.90.3], pid[18147], build[5c38d60/2013-08-06T13:18:31Z]
[2013-10-01 21:21:38,447][INFO ][node                     ] [Forearm] initializing ...
[2013-10-01 21:21:38,458][INFO ][plugins                  ] [Forearm] loaded [river-twitter], sites [bigdesk, head]
[2013-10-01 21:21:40,322][INFO ][node                     ] [Forearm] initialized
[2013-10-01 21:21:40,322][INFO ][node                     ] [Forearm] starting ...
[2013-10-01 21:21:40,410][INFO ][transport                ] [Forearm] bound_address {inet[/0:0:0:0:0:0:0:0:9300]}, publish_address {inet[/192.168.1.5:9300]}
[2013-10-01 21:21:43,435][INFO ][cluster.service          ] [Forearm] new_master [Forearm][qEpnBLA_RuGq1JcOSzsGVQ][inet[/192.168.1.5:9300]], reason: zen-disco-join (elected_as_master)
[2013-10-01 21:21:43,455][INFO ][discovery                ] [Forearm] elasticsearch/qEpnBLA_RuGq1JcOSzsGVQ
[2013-10-01 21:21:43,465][INFO ][http                     ] [Forearm] bound_address {inet[/0:0:0:0:0:0:0:0:9200]}, publish_address {inet[/192.168.1.5:9200]}
[2013-10-01 21:21:43,465][INFO ][node                     ] [Forearm] started
[2013-10-01 21:21:43,475][INFO ][gateway                  ] [Forearm] recovered [0] indices into cluster_state

Création de la River Twitter

Une river est un service tournant au sein du cluster Elasticsearch, permettant de tirer ("pull") ou de recevoir ("pushed with data") des données.
Il existe plusieurs types de river, notamment :

Dans un autre terminal nous allons créer une river Elasticsearch de type "twitter" portant le nom "mobiles". Cette river indexera tous les tweets publics contenant les termes "iphone", "android", "blackberry". Les tweets seront insérés par lots de 500 et stockés dans l’index "mobiles".

Note : N’oubliez pas de remplacer les étoiles par les valeurs correspondantes de votre application Twitter ^_^

curl -XPUT localhost:9200/_river/mobiles/_meta -d '
{
    "type" : "twitter",
    "twitter" : {
        "oauth" : {
            "consumer_key" : "*********************",
            "consumer_secret" : "******************************************",
            "access_token" : "**************************************************",
            "access_token_secret" : "*******************************************"
        },
        "filter" : {
            "tracks" : "iphone,android,blackberry"
        } 
    },
    "index" : {
        "index" : "mobiles",
        "type" : "tweet",
        "bulk_size" : 500
    }
}
'

La sortie d’ElasticSearch devrait être similaire à celle-ci :

[2013-10-01 21:22:01,104][INFO ][cluster.metadata           ] [Forearm] [_river] creating index, cause [auto(index api)], shards [1]/[1], mappings []
[2013-10-01 21:22:01,369][INFO ][cluster.metadata           ] [Forearm] [_river] update_mapping [mobiles] (dynamic)
[2013-10-01 21:22:01,387][INFO ][river.twitter              ] [Forearm] [twitter][mobiles] creating twitter stream river
[2013-10-01 21:22:01,472][INFO ][cluster.metadata           ] [Forearm] [mobiles] creating index, cause [api], shards [5]/[1], mappings [tweet]
[2013-10-01 21:22:01,534][INFO ][river.twitter              ] [Forearm] [twitter][mobiles] starting filter twitter stream
[2013-10-01 21:22:01,536][INFO ][twitter4j.TwitterStreamImpl] Establishing connection.
[2013-10-01 21:22:01,622][INFO ][cluster.metadata           ] [Forearm] [_river] update_mapping [mobiles] (dynamic)
[2013-10-01 21:22:09,980][INFO ][twitter4j.TwitterStreamImpl] Connection established.
[2013-10-01 21:22:09,980][INFO ][twitter4j.TwitterStreamImpl] Receiving status stream. 

Vous pouvez visualiser l’état de santé de votre cluster Elasticsearch grâce au plugin head à l’adresse http://localhost:9200/_plugin/head

Installation de Kibana

Pour installer Kibana, il vous faut également un serveur web. L’exemple est donné pour une installation standard d’Apache, mais tout autre serveur web capable de servir des fichiers statiques fera l’affaire. Il faut que vous adaptiez à votre contexte.

curl -O https://download.elasticsearch.org/kibana/kibana/kibana-3.0.0milestone4.zip
unzip kibana-3.0.0milestone4.zip
sudo mv kibana-3.0.0milestone4 /var/www/kibana

Vous pouvez désormais accéder à Kibana à l’adresse : http://localhost/kibana

La page d’accueil de Kibana dispose d’un menu en haut à droite permettant de charger, sauvegarder et partager vos dashboard via :

  • Fichier JSON
  • ElasticSearch
  • Gist
  • Permalien

Kibana offre 4 dashboards par défaut :

  • un dashboard générique Logstash
  • un dashboard générique Elasticsearch
  • un dashboard non configuré
  • un dashboard vide

Un dashboard se "branche" sur tous les index de votre cluster Elasticsearch, un index, ou les index dont le nom match un pattern (cas de logstash notamment).
L’interface HTML5 basé sur Twitter Bootstrap se décompose en lignes de 12 colonnes (pliables ou non) contenant des panels.
Il existe plusieurs types de panels à ajouter et configurer (recherche, période de temps, histogramme, camembert, carte, Markdown, …)

Création d’un dashboard Kibana

Nous allons créer un dashboard pas à pas, personnalisé pour nos données. N’oubliez pas de sauvegarder votre dashboard avant de rafraichir la page de votre navigateur !

Etape 1 – Configuration et ligne de recherche

Partez d’un Dashboard vierge en cliquant sur le lien "Blank Dashboard".

Nous allons connecter Kibana à l’index "mobiles" de notre Elasticsearch.

Ouvrez la fenêtre modale "Dashboard settings" en cliquant sur la roue crantée dans le coin supérieur droit :

  • dans l’onglet "General" : insérez le titre "Twitter Survey ™" et choisissez le style "dark" ou "light" selon votre envie
  • dans l’onglet "Index" : sélectionnez "none" pour "Timestamping" et insérer "mobiles" pour "Default index"
  • dans l’onglet "Controls" : cochez toutes les cases afin de vous donner le maximum d’options
  • dans l’onglet "Timepicker" : remplissez le champ "Time field" avec "created_at". Cette propriété contient la date du tweet. Elle servira de référence temporelle pour les requêtes
  • fermez la boite de dialogue avec le bouton "Close"

La barre de recherche utilise le format Lucene Query ou une expression régulière depuis peu.

En cliquant sur le bouton "+" du champ recherche, créez 4 barres de recherche contenant les requêtes suivantes :

  • *
  • iphone-android-blackberry
  • android-iphone-blackberry
  • blackberry-iphone-android

Vous pouvez épingler des recherches et leurs attribuer un alias.
Cliquez sur chaque rond de couleurs et sauvegardez les alias suivants :

  • All
  • iPhone
  • Android
  • Blackberry

Vous devez obtenir un dashboard similaire à celui-ci : Twitter Survey ™ – Step 1

Etape 2 – Ligne Hits

Nous allons ajouter une ligne "Hits" contenant des panels affichant le total de nos recherches "All", "iPhone", "Android", et "Blackberry".

Commencez par ajouter une ligne à votre dashboard :

  • cliquez sur le bouton "Add a row"
  • insérez "Hits" dans le champ titre
  • cliquez sur le bouton "Create Row" puis "Close"

Ajoutez un premier panel affichant le nombre total de tweets :

  • cliquez sur le bouton "Add panel to empty row"
  • sélectionnez le type "hits"
  • choisissez la valeur 3 pour la propriété "", qui correspond au nombre de colonne que le panel va prendre sur la ligne (Kibana est basé sur Twitter Bootstrap, qui utilise un layout de 12 colonnes)
  • choisissez le style "Total" et une taille de police de 28 pt.
  • utilisez la recherche "All" en choisissant "selected" dans le champ "queries", puis cliquez sur "All"
  • cliquez sur le bouton "Add Panel" puis "Close" pour finir

Répétez cette opération afin de créer les 3 autres panels affichant le total de tweets pour les requêtes "iPhone", "Android" et "Blackberry".

Vous devez obtenir une ligne similaire à celle-ci : Twitter Survey ™ – Step 2

Etape 3 – Ligne Trends

Maintenant que nous sommes capable d’avoir un peu de visibilité sur nos données, voyons comment répondre à une question métier de type :
"Quelle est l’évolution durant les 5 dernières minutes par rapport à l’heure précédente ? ".
Pour cela :

  • cliquez sur "Add a row" pour ajoutez une ligne "Trends" qui va contenir nos 4 panels de type "trends"
  • utilisez "5m" pour le champ "Time Ago"
  • choisissez une police de 20pt
  • utilisez les queries "All", "iPhone", "Android", et "Blackberry", une pour chaque panel

Une fois les 4 panneaux créés, ajoutez un filtre de temps "Last 1 hour" (en haut à droite "add time filter"). Vous remarquerez que votre filtre sur la dernière heure est apparu dans l’accordéon "Filtering".

Vous devez obtenir une ligne similaire à celle-ci : Twitter Survey ™ – Step 3

Etape 4 – Ligne Timeline

Ajoutez une ligne "Timeline" contenant un panel de type "Histogram" affichant l’évolution des résultats dans le temps.
Utilisez le mode "count" et la valeur "created_at" pour le champ "Time Field".
Sélectionnez les queries "iPhone", "Android" et "Blackberry".

Vous devez obtenir une ligne similaire à celle-ci : Twitter Survey ™ – Step 4

Ligne 5 – Ligne Analytics

Ajoutez une ligne "Analytics".
Nous allons ajouter 3 panels :

  • un panel affichant la répartition entre iPhone, Android et Blackberry
  • un panel affichant les hashtags les plus utilisés
  • une carte affichant les utilisateurs par pays.

Pour cela, ajouter les panels suivants :

  • un panel de type "Hits", style "pie", et cochez la case "donut" et sélectionnez les queries "iPhone", "Android", "Blackberry"
  • un panel de type "Pie", mode "terms", et utilisez "hashtag.text" dans le champ "Field" et sélectionnez la query "All" vous pouvez exclure une liste de termes, ici on utilisera : "iphone,android,iphonegames,androidgames,gameinsight,rt,retweet"
  • un panel de type "Map", et utilisez "place.country_code" dans le champ "Field" et sélectionnez la query "All"

Vous devez obtenir une ligne similaire à celle-ci : Twitter Survey ™ – Step 5

Ligne 6 – Ligne des Tweets

Afin de visualiser les données sélectionnées dans un tableau paginé, nous allons ajouter une ligne "Tweets" contenant un panel de type "Table".
Lors de l’ajout du panel table, ajoutez les colonnes "created_at", "text", et "retweet_count" afin de les afficher par défault.
Sélectionnez la query "All" pour finir.

Vous devez obtenir une ligne similaire à celle-ci (et le dashboard final…) : Twitter Survey ™ – Step 6

Dashboard Final

Le dashboard final nous permet de savoir :

  • 74939 tweets ont été indéxés
  • Il y a 8.22% de tweets en plus contenant "blackberry", depuis les 5 dernières minutes, par rapport à la dernière heure
  • Quelques tweets viennent d’Indonésie

Pour allez plus loin

Kibana est construit autour des frameworks Twitter Bootstrap et Angular JS.
Vous pouvez ajouter votre propre type de panel relativement facilement si ces 2 frameworks vous sont familiers.
Le panel "Hits" est un exemple simple pour se plonger dans le projet :
https://github.com/elasticsearch/kibana/tree/master/src/app/panels/hits

Sources

Publié par

Publié par Vincent Spiewak

Vincent est un consultant passionné ayant rejoint Xebia en Mai 2013. Il aime concevoir des projets innovants dans un cadre Agile. Son expérience tourne autour du monde Java / EE, WOA, et de la conduite du changement. (@vspiewak)

Commentaire

10 réponses pour " Logstash, ElasticSearch, Kibana – S01E01 – Analyse d’e-réputation sur Twitter "

  1. Publié par , Il y a 5 années

    Il faudra penser à préciser dans l’article à quel moment Kibiana se branche à Elasticsearch

  2. Publié par , Il y a 5 années

    Kibana se « branche » tout seul ;)

    Par défaut, il est configuré pour requêter le cluster Elasticsearch de l’host courant.
    On peux modifier ce comportement via le fichier config.js:
    elasticsearch: "http://"+window.location.hostname+":9200"

  3. Publié par , Il y a 5 années

    Merci pour cette présentation, avez vous rencontré des problèmes liés au champs Time Field pour la génération des graphiques ?

    De mon coté, Kibana n’à pas l’air d’apprécier mon format TIMESTAMP_ISO8601

    Exemple : 2013-12-11 18:06:44+0100

  4. Publié par , Il y a 5 années

    Bonjour,
    il est difficile de répondre sans voir la configuration, ni le message d’erreur précis.

    Cependant, le champ Elasticsearch utilisé par Kibana pour le Timepicker doit être de type « date ».
    Je vous invite à vérifier le mapping via l’url: http://localhost:9200/_mapping

  5. Publié par , Il y a 5 années

    Bonjour Vincent,

    Merci à nouveau, j’en ai profiter pour lire votre deuxième « épisode ».

    Il semble bien s’agir d’un problème de champ, actuellement après mon filtre grok, le champ est de type « string » malgré avoir essayé de le convertir en « date ».

    Mon champ date sans modification :

    2013-12-11 18:06:44+0100

    Mon pattern :

    LOG_DATE %{YEAR}-%{MONTHNUM}-%{MONTHDAY} %{HOUR}:%{MINUTE}:%{SECOND}%{ISO8601_TIMEZONE}

    Mon filtre grok :

    match => [ « message », « %{WORD:logType},%{LOG_DATE:timeLogged:date},%{DATA:jobDesc} » ]

    Et mon filtre date :

    match => [« timeLogged », »yyyy-MM-dd HH:mm:ssZ »]

    Je vais continuer de vérifier tout ça :)

  6. Publié par , Il y a 5 années

    Attention, 2013-12-11 18:06:44+0100 n’est pas au format ISO8601 !
    Chez moi, tout se passe très bien avec la configuration suivante:

    format du log:
    2013-12-11 18:06:44+0100 test

    configuration logstash:

    input {
    stdin {}
    }

    filter {
    grok {
    match => [ "message", "(?%{YEAR}-%{MONTHNUM}-%{MONTHDAY} %{HOUR}:%{MINUTE}:%{SECOND}%{ISO8601_TIMEZONE}) %{GREEDYDATA:data}"]
    }
    date {
    match => [ "log_date", "YYYY-MM-dd HH:mm:ssZ" ]
    }
    }

    output {
    stdout { debug => true}
    elasticsearch {}
    }

    sortie logstash:

    {
    "@timestamp" => "2013-12-11T17:06:44.000Z",
    "@version" => "1",
    "data" => "test",
    "host" => "0.0.0.0",
    "log_date" => "2013-12-11 18:06:44+0100",
    "message" => "2013-12-11 18:06:44+0100 test"
    }

    mapping elasticsearch:

    {"logstash-2013.12.11":{"logs":{"properties":{"@timestamp":{"type":"date","format":"dateOptionalTime"},"@version":{"type":"string"}, "data":{"type":"string"},"host":{"type":"string"},"log_date":{"type":"string"},"message":{"type":"string"}}}}}

    Cordialement

  7. Publié par , Il y a 5 années

    Bonjour,
    je ne comprends pas les requêtes iphone-android-blackberry, android-iphone-blackberry,
    blackberry-iphone-android ?

    Iphone, android et blackberry respectivement n’auraient elles pa été suffisantes ?

    Merci,

  8. Publié par , Il y a 5 années

    @Scamianbas :

    Bonjour,
    Il manque des espaces dans les lignes, il faut corriger par :
    iphone -android -blackberry
    android -iphone -blackberry
    blackberry -iphone -android
    le signe – signifiant l’exlusion.

  9. Publié par , Il y a 5 années

    Bonjour,

    Je suis un débutant

    Est-ce-que qu’un sait comment insérer un log dans Logstash qui me servira pour faire des recherche de données via Elasticsearch et pour finir créer un simple dashbord avec kibana

    Merci d’avance

  10. Publié par , Il y a 4 années

    Bonjour Vincent ,
    cette solution est magique :)
    je veux juste comprendre l’avantage de cette solution par rapport aux solutions existantes comme google analytics
    Merci d’avance

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Nous recrutons

Être un Xebian, c'est faire partie d'un groupe de passionnés ; C'est l'opportunité de travailler et de partager avec des pairs parmi les plus talentueux.