28 octobre 2015 Technique

L'histoire de Sense - Lancement de Sense 2.0.0-beta1

Par Boaz Leskes

Le point de départ

Comme tout projet qui se respecte, Sense a été imaginé autour de quelques bières, après une séance d'aviron sur le fleuve AmstelMon ami, Jasper et moi parlions du hackathon annuel qui se tiendrait prochainement dans la boîte de JasperCe hackathon suit une procédure stricte qui dicte la façon dont les idées sont sélectionnées et les équipes constituées. À cette époque, Jasper et moi nous étions tous les deux engagés à travailler avec Anne Veling ur un écran d'historique alternatif dans le navigateur Chrome.

Bien que nous étions tous les deux des utilisateurs satisfaits d'Elasticsearch, Jasper et moi avons décrété qu'il n'existait pas d'outil convenable nous permettant d'envoyer des requêtes à l'API REST. Le meilleur outil était toujours la commande cURL depuis le terminal, la honte. Il vous suffit de passer 5 secondes dans le terminal à essayer d'envoyer des requêtes avec un corps pour vous rendre compte combien cela est pénible. Pour des choses toutes simples, comme corriger une erreur de frappe, vous deviez retaper la totalité de la commande ou vous battre avec le support multi-lignes du terminal. On devait pouvoir trouver un éditeur JSON basé sur le Web et le mettre à l'œuvre.

Ce n'est pas possible... en un week-end.

J'ai fait des recherches et j'ai appelé Anne. Je lui ai dit que je restais engagé dans mon projet de la page des Historiques mais, puisque nous étions tous des fervents utilisateurs d'Elasticsearch, nous pourrions peut-être mieux profiter de notre temps pour lui créer une belle Console. Il suffisait d'utiliser l'éditeur en ligne Ace et construire une base de connaissances qui reconnaîtrait l'API automatiquement et donnerait des suggestions contextuelles appropriées. Anne a été tout de suite emballé par l'idée et l'a trouvée sympa. Malheureusement il a dû refuser car elle contrevenait l'une des règles de base du hackathon : être réalisé en un week-end. Evidemment, ce que je proposais ne pouvait pas l'être. Au bout du compte, nous avons poursuivi notre idée et créé la plus belle page de remplacement de l'Historique de Chrome jamais vue.

Néanmoins, le défi avait été lancé et je devais prouver que c'était possible. Le week-end d'après (en plus de quelques soirées :)) je me suis assis et je l'ai créé. Sense était né. Il était truffé de bugs, mais ça marchait. Je l'ai montré à plusieurs personnes et ils ont été emballés.

Les premiers jours

À partir de là, j'ai passé une soirée par semaine à développer la Base de connaissances et à corriger les bugs. Sense commençait à en intéresser plusieurs et j'avais peur que les gens ne gardent en tête que l'ancienne version pleine de bugs. J'ai donc décidé de lancer Sense en tant qu'extension dans Chrome, pour qu'il soit mis à jour automatiquement avec les nouvelles versions. Les fonctionnalités telles que le volet Historique ont été ajoutées une par une.

C'est à cette époque que j'ai rejoint Elastic. J'étais ravi de savoir que beaucoup de personnes dans l'entreprise utilisaient Sense et qu'ils étaient très emballés. Je me souviens parfaitement de parler à Clint, qui m'a dit « Tu sais ce que Sense devrait faire ? Il devrait utiliser ce format et te permettre d'avoir plusieurs requêtes dans l'éditeur ». Me voilà reparti pour un nouveau défi, et bien sûr, je devais le relever. Ce n'était pas aussi simple cette fois, et je devais me plonger dans les abîmes de Ace. Au final, j'ai obtenu un nouveau mode Ace (la logique de mise en valeur utilisée par Ace) étroitement intégré dans le moteur de suggestions de Sense.

Pour voir ce que ça donne, regardez cette image d'un ancien écran de Sen Sense:

Figure 1. Sense 0.7

Sense 0.7

Tout en haut, vous tapiez l'url d'une API et sur la gauche le corps JSON. Tout était bien séparé et je pouvais utiliser le mode JSON standard d'Ace. Mais maintenant je devais trouver comment prendre en charge le format suivant :

GET _cluster/health
POST index/_settings
{
  "index": { "number_of_replicas": 3 }
}
		

Cela signifiait qu'Ace devait savoir comment analyser 3 éléments différents : une méthode HTTP, une URL et, en option, un corps JSON. Pire, la distinction entre ces 3 modes n'était pas aussi nette qu'avant. La seule manière de savoir qu'un corps JSON était complet était de compter les accolades. Il a fallu pas mal de travail et de personnalisation d'Ace, mais j'ai réussi et c'est comme ça qu'est née la syntaxe Sense (merci Clint !).

L'ère Marvel

Au travail, ma mission principale est devenue le développement de Marvel, notre solution de Gestion et de Monitoring pour Elasticsearch (note à part : Marvel vient de renaître, voir « Lancement de Shield, Watche et Marvel 2.0.0 »). Marvel devait devenir gratuit pour une utilisation en développement et il était logique d'incorporer Sense dans Marvel. Grâce à cela, j'ai pu me concentrer sur Sense pendant la journée et le partager avec beaucoup plus d'utilisateurs qu'avant. Cela a aussi voulu dire que des développeurs JavaScript légitimes ont travaillé sur Sense, et ont aidé à le nettoyer tout en me faisant découvrir les dernières trouvailles dans le monde des Navigateurs.


Pendant cette période, Sense a été réécrit plusieurs fois. J'ai, notamment, modifié les deux moteurs de suggestions pour URL et JSON, pour n'en créer qu'un seul capable de fonctionner dans ces deux contextes, et de s'adapter à un troisième contexte : les paramètres URL.


Par ailleurs, ce nouveau moteur est suffisamment intelligent pour tenir compte de plusieurs contextes de suggestions. Par exemple, imaginez le paramètre de tri _search API s:

GET _search
{
  "sort": [
     "timestamp": "desc",
     "price": {
        "order": "desc".
        "missing": "last"
     },
     "nested_filter": { "term": { ... }},
     "_score"
  ]
}
		

En fonction de l'endroit où vous vous trouvez, Sense a besoin de suggérer des valeurs simples (telles que _score), des structures plus complexes (telles que order et missing), voire même un filtre arbitraire (tel que nested_filter). 

Tous ces chemins de suggestions sont traités simultanément et sont exclus au fur et à mesure qu'ils ne sont plus pertinents.

Lancement de Sense 2.0

Marvel 1.x a été construit sur Kibana 3.0, qui était un excellent outil d'exploration des données et de tableaux de bord. Cependant, l'équipe de Kibana visait plus haut. Kibana 4.x a été conçu pour être une plateforme d'application générique sur laquelle on peut facilement créer des applications IU qui fonctionnent avec Elasticsearch comme backend. En réalité, Marvel 2.0 st la toute première appli à utiliser Kibana comme plateforme.

En repensant à Sense, une console générique qui interagit avec l'API d'Elasticsearch, je me suis rendu compte que Sense s'inscrit parfaitement dans la vision des applis de Kibana. Aujourd'hui je suis ravi d'annoncer le lancement de Sense 2.0 en tant qu'appli Kibana open-source gratuite pour l'utilisation en développement et en production.

Figure 2. Capture d'écran Sense 2.0

Sense 2.0


Points clés de la nouvelle version

Sense 2.0 s'accompagne aussi de très bonnes améliorations. En voici les principales (une liste complète est disponible ici):

Elasticsearch 2.0
La base de connaissances de Sense a été mise à jour pour prendre en charge Elasticsearch 2.0 et comprend désormais des suggestions de remplissage automatique pour les nouvelles agrégations
 
Exécution de requêtes multiples

Lorsque vous testez ou essayez un nouveau programme, vous avez souvent besoin de répéter la même série de commandes. Il vous suffit donc de toutes les écrire dans Sense, de sélectionner et d'envoyer des requêtes multiples à Elasticsearch.

Figure 3. Envoyer des requêtes multiples

multiple requests

Sense envoie les requêtes à Elasticsearch une par une, et, au fur et à mesure des réponses fournies par Elasticsearch, affiche les résultats dans le volet de droite. Ceci est très utile lors du débogage d'un problème ou lorsque vous essayez des combinaisons de recherche pour différents scénarios.

Copier-Coller de requêtes multiples

En sélectionnant des requêtes multiples vous pouvez aussi les formater automatiquement et les copier sous forme de cURL d'un seul coup. Par exemple:

Figure 4. Copier des requêtes multiples sous forme de cURL

copy as curl

ajoutez ce qui suit à votre clipboard :

# Delete all data in the `website` index
curl -XDELETE "http://localhost:9200/website"
# Create a document with ID 123
curl -XPUT "http://localhost:9200/website/blog/123" -d'
{
  "title": "My first blog entry",
  "text":  "Just trying this out...",
  "date":  "2014/01/01"
}'
				

Bien sûr, vous pouvez également coller plusieurs commandes cURL et Sense les analysera tout aussi bien.

Quelques mots pour finir

Nous lançons Sense 2.0.0 comme version beta pour commencer, sachant pertinemment qu'il reste encore du travail. Nous espérons lancer une version GA prochainement.

Pour en savoir plus et tester Sense 2.0, veuillez consulter notre nouvelle documentation. Faites-nous part de vos commentaires sur les forums et ouvrez un ticket si vous avez des suggestions ou si vous rencontrez des bugs.