Quantcast
Channel: Elastic Blog - Elasticsearch, Kibana, and ELK Stack
Viewing all 378 articles
Browse latest View live

Monitoring des conteneurs Kubernetes et Docker avec Beats : logs, indicateurs et métadonnées

$
0
0

Ce blog présente le monitoring de l'environnement d'un conteneur, pouvant inclure Google Kubernetes Engine (GKE), IBM Cloud Kubernetes Service et tous les autres environnements Kubernetes (k8s) et Docker. Dans ce blog, j'utilise IBM Cloud Kubernetes Service.

Vous vous demandez peut-être pourquoi le sujet de cet article est le monitoring des conteneurs Kubernetes et Docker. Les fournisseurs cloud gèrent l'infrastructure et je n'ai qu'à me soucier de mon application, n'est-ce pas ? C'est peut-être vrai, mais je suis le genre de personne qui consulte les avis Yelp même si j'ai reçu des recommandations personnelles, et plus j'ai d'informations, mieux c'est. Je veux que tous les logs et indicateurs concernant mon application et son environnement soient disponibles. Je veux également pouvoir rechercher, visualiser et créer des alertes à leur sujet. Ce monitoring classique des conteneurs est génial, mais je vais aussi vous présenter une façon sympa d'utiliser les événements et les métadonnées Kubernetes pour annoter le diagramme de performances de mon application avec des notifications concernant la montée en charge ou les mises à niveau.

Avant de poursuivre, définissons quelques termes.

  • Log : un horodatage et un message. Il pourrait comprendre des entrées de logs classiques telles que "NGINX started at 13:42" (NGINX a démarré à 13:42) ainsi que des événements k8s tels que "There was an NGINX container with a Back-off restarting failed container at 16:20" (Un conteneur NGINX a envoyé des messages plusieurs fois et n'a pas pu redémarrer à 16:20).
  • Indicateur : une mesure numérique collectée au cours d'une période définie. Par exemple, "Sales through the eCommerce site were $50,000 over the past ten minutes" (Les ventes sur le site d'e-commerce s'élevaient à 50 000 $ ces dix dernières minutes) ou "CPU utilization was 17% from 14:00:00 to 14:00:10" (L'utilisation du processeur était de 17 % de 14:00:00 à 14:00:10).

Déploiement de l'application dans un cluster Kubernetes

Pour mon exemple, je vais utiliser cette application basée sur Apache HTTP Server, PHP et Redis.

k8s-module-1.png

D'autre part, pour monitorer l'application et l'infrastructure du conteneur, nous avons : 

  • Un déploiement Elasticsearch Service hébergé sur Elastic Cloud.
  • Les agents Beats, les agents légers de transfert de logs et d'indicateurs sont déployés comme un DaemonSet dans le même cluster Kubernetes. Notez que cela peut remplacer Fluentd qui est généralement déployé dans un cluster Kubernetes.

Logs et indicateurs

L'application ci-dessus n'est qu'une partie d'un écosystème qui génère en permanence des informations que nous devrions collecter. Voici les niveaux à partir desquels nous collectons ces logs et indicateurs :

  1. Orchestration (Kubernetes)
  2. Hôtes
  3. Application
  4. Conteneur (Docker)

k8s-module-2.png

Pour collecter les données, nous utilisons les agents Beats (Filebeat, Metricbeat et Packetbeat) et les modules System, Kubernetes et Docker ainsi que des modules pour l'application (Apache et Redis). Nous avons déployé un DaemonSet pour chaque agent Beat et nous laissons Kubernetes les gérer. Si la liste semble longue, ne vous laissez pas effrayer. En effet, la fonctionnalité Autodiscover de Beats vous simplifie la tâche.  Dans ce blog et dans la vidéo qui l'accompagne, vous trouverez les détails du déploiement des agents Beats pour monitorer une application.  En fait, si vous souhaitez commencer par le commencement, consultez la page du monitoring des conteneurs.

Pour indexer, stocker, rechercher, analyser et visualiser les données, j’ai utilisé Elasticsearch Service hébergé sur Elastic Cloud. Le déploiement d’Elasticsearch Service sur Elastic Cloud est détaillé dans notre page "Getting Started" tout comme le déploiement d’Elasticsearch et de Kibana dans un système que vous gérez vous-même. Dans tous les cas, ça fonctionne très bien.

J'ai évoqué les agents Beats et les modules, et je pense que ceux-ci méritent une meilleure introduction. Un agent Beat est un agent léger qui envoie des données à Elasticsearch ou Logstash. Parfois, les agents Beats sont déployés à l'origine des données, comme sur un système physique ou virtuel. D'autres fois, ils sont déployés parallèlement aux sources, comme, par exemple, un DaemonSet (c’est ce que j'ai fait ici). Les modules simplifient la collecte, l'analyse, l'indexation et la visualisation des formats de logs les plus courants.

Ce que je viens de vous présenter peut vous sembler un peu ennuyeux. Voyons les choses sous un autre angle : les modules Elastic propose une expérience prête à l'emploi. Imaginons que vous savez tout de la gestion d'Apache HTTPD Server, mais que vous ne connaissez pas NGINX. Vous pourriez aller voir quelqu'un qui s'y connaît en NGINX et lui demander "À quoi fais-tu attention dans les logs ? À quels indicateurs fais-tu attention ? Peux-tu me donner les greps de ton fichier d'historique ?" Selon moi, les réponses à ces questions définissent les modules des agents Beats : tableaux de bord prédéfinis, recherches enregistrées, analyse et collecte pour des tas de choses comme Kubernetes, Docker, NGINX, Apache, systèmes d'exploitation, bases de données, etc. D'après mon expérience, il s'agit d'un ensemble de fonctionnalités très puissantes.

Le module k8s collecte des indicateurs relatifs aux pods, nœuds, volumes, ReplicaSets, déploiements, etc. Chaque indicateur possède un ensemble riche de métadonnées pour que vous puissiez relier les données à votre application. Par exemple, vous pourriez ne pas vous soucier du fait que le pod xyz soit proche de la limite d'utilisation de la mémoire, mais si cet indicateur est présenté en association avec le frontend de votre application, alors vous connaissez la valeur pour votre entreprise. Il collecte également des événements (souvenez-vous, j'avais inclus les événements Kubernetes dans la définition du log ci-dessus) que nous utilisons pour enrichir le diagramme de performances dans la vidéo ci-dessous.

Le module Docker collecte des indicateurs relatifs aux conteneurs, aux hôtes, à la mémoire, au réseau, aux vérifications d'intégrité, etc. À l'instar du module Kubernetes, les métadonnées sont très précieuses pour comprendre les performances de votre application et de l'environnement.

Il existe de nombreux autres modules pour Filebeat et Metricbeat. En outre, Packetbeat est compatible avec de nombreux tableaux de bord pour des services tels que Cassandra, Flows, HTTP, MySQL, MongoDB, etc.

Regardez cette vidéo et découvrez à quel point il est facile de transformer les données en renseignements exploitables. La vidéo traite les points suivants :

  • Visualiser les événements Kubernetes avec les indicateurs de performance de l'application
  • Découvrir l'ensemble d'indicateurs d'événements du module Metricbeat Kubernetes
  • Naviguer dans les événements Kubernetes et créer la visualisation personnalisée

Présentation d'Elasticsearch SQL et exemples pratiques – 2e partie

$
0
0

Dans la 1re partie de la série Présentation d'Elasticsearch SQL, nous vous avons offert une présentation sommaire de la nouvelle fonctionnalité Elasticsearch SQL, ainsi que de l'API _translate. Le présent article vient compléter cette série en vous faisant découvrir des fonctionnalités plus complexes. Par la suite, nous étudierons certaines des limites actuelles auxquelles les utilisateurs sont susceptibles d'être confrontés lors de l'utilisation de cette première version d'Elasticsearch SQL. Puis, nous clôturerons la série par un aperçu de la roadmap.

Nous vous rappelons que tous les lecteurs ont la possibilité d'exécuter les exemples présentés dans l'environnement demo.elastic.co ou d'attendre que l'ensemble de données soit disponible via Kibana. Tous les ensembles de données utilisés dans le cadre de la présente série ont été indexés, suite à la mise à disposition de SQL par le biais de la console Kibana. Chaque exemple s'accompagne d'un lien vers le site demo.elastic.co. Cependant, vous pouvez également voir toutes les requêtes dans un même fil dans notre console de démonstration Kibana.

Exemples complexes et avantages d'Elasticsearch

Regroupement

L'architecture d'agrégation d'Elasticsearch, qui est en mesure de synthétiser des milliards de points de données, est l'une des fonctionnalités les plus puissantes et les plus appréciées de la Suite. En termes de fonctionnalités, elle est l'équivalent naturel de la commande GROUP BY sous SQL. En plus de vous présenter des exemples des fonctionnalités de la commande GROUP BY, nous nous servirons à nouveau de l'API _translate pour vous montrer les agrégations équivalentes.

"Rechercher la durée moyenne d'un vol en fonction du pays d'origine pour les vols à destination de Londres. Trier les pays par ordre alphabétique."

Essayez sur demo.elastic.co

sql> SELECT AVG(FlightTimeHour) Avg_Flight_Time, OriginCountry FROM flights GROUP BY OriginCountry ORDER BY OriginCountry LIMIT 5;
 Avg_Flight_Time  | OriginCountry
------------------+---------------
9.342180244924574 |AE
13.49582274385201 |AR
4.704097126921018 |AT
15.081367354940724|AU
7.998943401875511 |CA

L'analyse du DSL de cette requête montre l'utilisation de l'agrégation imbriquée (Composite Aggregation).

{
  "size": 0,
  "_source": false,
  "stored_fields": "_none_",
  "aggregations": {
    "groupby": {
      "composite": {
        "size": 1000,
        "sources": [
          {
            "3471": {
              "terms": {
                "field": "OriginCountry.keyword",
                "order": "asc"
              }
            }
          }
        ]
      },
      "aggregations": {
        "3485": {
          "avg": {
            "field": "FlightTimeHour"
          }
        }
      }
    }
  }
}

Essayez sur demo.elastic.co

Nous pouvons également effectuer des regroupements par champs d'alias définis dans la sélection en recourant à une fonction.

"Rechercher le nombre de vols et la durée moyenne des vols par mois."

POST _xpack/sql
{
  "query":"SELECT COUNT(*), MONTH_OF_YEAR(timestamp) AS month_of_year, AVG(FlightTimeHour) AS Avg_Flight_Time FROM flights GROUP BY month_of_year"
}

Essayez sur demo.elastic.co

   COUNT(1)    | month_of_year | Avg_Flight_Time 
---------------+---------------+-----------------
1303           |5              |8.628949653846158
8893           |6              |8.520481551839334
2863           |7              |8.463433805045094

L'utilisation de l'agrégation imbriquée offre un principal avantage : elle garantit que l'implémentation de la commande GROUP BY est scalable, même dans le cas des champs dont la cardinalité est élevée, et propose donc un mécanisme de transmission de tous les intervalles d'une agrégation précise dont l'action est comparable à celle du défilement pour les documents. Elle garantit également que l'implémentation ne soit pas exposée aux mêmes limitations de mémoire qu'en cas d'utilisation de l'agrégation de termes. En revanche, cela signifie que nous ne sommes, pour le moment, pas en mesure de trier les résultats GROUP BY par l'intermédiaire d'un indicateur. Par exemple, la proposition ci-dessous produirait une erreur :

POST _xpack/sql/translate
{
  "query":"SELECT AVG(FlightTimeHour) Avg_Flight_Time, OriginCountry FROM flights GROUP BY OriginCountry ORDER BY Avg_Flight_Time"
}

Essayez sur demo.elastic.co

Filtrage des groupes

Afin de pouvoir filtrer les groupes, nous pouvons nous servir de la condition HAVING, qui peut aussi utiliser un alias indiqué dans la clause SELECT. Pour certains experts SQL, cette action peut s'avérer inhabituelle, étant donné qu'elle est généralement impossible dans le cadre des implémentations basées sur RDBMS en raison de l'exécution de la clause SELECT après la condition HAVING. Dans notre cas, la clause HAVING se sert d'un alias déclaré au cours de la phase d'exécution. Toutefois, notre analyseur est suffisamment intelligent pour anticiper cela et relever la déclaration afin de l'utiliser dans la clause HAVING.

"Rechercher le nombre de vols, la distance moyenne et la distance au 95e percentile des vols au départ de chaque ville d'origine, pour lesquels la distance moyenne est comprise entre 3 000 et 4 000 miles."

Essayez sur demo.elastic.co

sql> SELECT OriginCityName, ROUND(AVG(DistanceKilometers)) avg_distance, COUNT(*) c, ROUND(PERCENTILE(DistanceKilometers,95)) AS percentile_distance FROM flights GROUP BY OriginCityName HAVING avg_distance BETWEEN 3000 AND 4000;
OriginCityName | avg_distance  |       c       |percentile_distance
---------------+---------------+---------------+-------------------
Verona         |3078           |120            |7927
Vienna         |3596           |120            |7436
Xi'an          |3842           |114            |7964

Pour implémenter la condition HAVING, Elasticsearch SQL utilise l'agrégation de pipeline Bucket Selector et filtre les valeurs en recourant à un script Painless paramétrable. Notez ci-dessous la façon dont la variante keyword du champ OriginCityName est automatiquement sélectionnée pour l'agrégation, au lieu de tenter d'utiliser la variante de texte standard, qui échouerait probablement en raison de la non-activation des données de champs. Les agrégations d'indicateurs avg et percentile offrent des fonctions équivalentes aux variantes SQL.

Essayez sur demo.elastic.co

{
  "size": 0,
  "_source": false,
  "stored_fields": "_none_",
  "aggregations": {
    "groupby": {
      "composite": {
        "size": 1000,
        "sources": [
          {
            "4992": {
              "terms": {
                "field": "OriginCityName.keyword",
                "order": "asc"
              }
            }
          }
        ]
      },
      "aggregations": {
        "4947": {
          "bucket_selector": {
            "buckets_path": {
              "a0": "5010",
              "a1": "5010"
            },
            "script": {
              "source": "params.v0 <= params.a0 && params.a1 <= params.v1",
              "lang": "painless",
              "params": {
                "v0": 3000,
                "v1": 4000
              }
            },
            "gap_policy": "skip"
          }
        },
        "5010": {
          "avg": {
            "field": "DistanceKilometers"
          }
        },
        "5019": {
          "percentiles": {
            "field": "DistanceKilometers",
            "percents": [
              95
            ],
            "keyed": true,
            "tdigest": {
              "compression": 100
            }
          }
        }
      }
    }
  }
}

Opérateurs de texte et pertinence

Par rapport à un RDBMS classique, l'une des fonctionnalités propres à Elasticsearch en tant que moteur de recherche est sa capacité à fournir des résultats plus étoffés qu'un simple oui / non, en tenant compte des propriétés des données textuelles par le biais d'un calcul de pertinence. L'élargissement de la syntaxe SQL nous permet de révéler cette fonctionnalité et d'aller bien au-delà de ce qu'un RDBMS classique offrirait.

De ce fait, nous vous présentons deux nouvelles clauses : QUERY et MATCH. Pour les personnes habituées à Elasticsearch, elles sont les équivalentes des opérateurs sous-jacents multi_match et query_string. Les utilisateurs de Kibana connaissent le comportement de l'opérateur query_string, puisqu'il servait à alimenter la barre de recherche par défaut. Cet opérateur offre des fonctionnalités d'analyse intelligentes et permet de produire des requêtes employant un langage de requête naturel. Cet article ne présente pas dans le détail ces deux opérateurs, mais la section correspondante du Definitive Guide fournit une parfaite présentation de ces concepts.

Par exemple, considérez ce qui suit :

"Rechercher tous les vols retardés à destination et au départ de l'aéroport de Kastrup entre le 06/06/2018 et le 17/06/2018, triés par date."

Essayez sur demo.elastic.co

En réalité, l'aéroport de Kastrup se trouve à Copenhague, son nom complet étant "Aéroport de Kastrup-Copenhague". En utilisant l'opérateur QUERY, nous recherchons simplement Kastrup.

sql> SELECT timestamp, FlightNum, OriginCityName, DestCityName FROM flights WHERE QUERY('Kastrup') AND FlightDelay=true AND timestamp > '2018-06-20' AND timestamp < '2018-06-27' ORDER BY timestamp;
       timestamp        |   FlightNum   |OriginCityName | DestCityName
------------------------+---------------+---------------+---------------
2018-06-21T01:46:28.000Z|57SWSLT        |Copenhagen     |Orlando
2018-06-21T07:28:07.000Z|X43J6GE        |Abu Dhabi      |Copenhagen
2018-06-21T13:36:31.000Z|7T04SK7        |Copenhagen     |Milan
2018-06-22T19:52:15.000Z|NXMN87D        |Mumbai         |Copenhagen
2018-06-23T08:05:02.000Z|YXHMDKV        |Copenhagen     |Oslo
2018-06-25T18:21:04.000Z|2R86JEZ        |Copenhagen     |Shanghai
2018-06-26T22:16:10.000Z|TCE99LO        |Copenhagen     |Edmonton

Notez que nous n'étions pas forcés d'indiquer le champ ici. La recherche de "kastrup" avec l'opérateur QUERY a suffi. De plus, notez que nous avons des vols retardés à destination et au départ de Kastrup. Voici la requête Elasticsearch :

Essayez sur demo.elastic.co

{
  "size": 1000,
  "query": {
    "bool": {
      "filter": [
        {
          "bool": {
            "filter": [
              {
                "bool": {
                  "filter": [
                    {
                      "query_string": {
                        "query": "Kastrup",
                        "fields": [],
                        "type": "best_fields",
                        "default_operator": "or",
                        "max_determinized_states": 10000,
                        "enable_position_increments": true,
                        "fuzziness": "AUTO",
                        "fuzzy_prefix_length": 0,
                        "fuzzy_max_expansions": 50,
                        "phrase_slop": 0,
                        "escape": false,
                        "auto_generate_synonyms_phrase_query": true,
                        "fuzzy_transpositions": true,
                        "boost": 1
                      }
                    },
                    {
                      "term": {
                        "FlightDelay": {
                          "value": true,
                          "boost": 1
                        }
                      }
                    }
                  ],
                  "adjust_pure_negative": true,
                  "boost": 1
                }
              },
              {
                "range": {
                  "timestamp": {
                    "from": "2018-06-20",
                    "to": null,
                    "include_lower": false,
                    "include_upper": false,
                    "boost": 1
                  }
                }
              }
            ],
            "adjust_pure_negative": true,
            "boost": 1
          }
        },
        {
          "range": {
            "timestamp": {
              "from": null,
              "to": "2018-06-27",
              "include_lower": false,
              "include_upper": false,
              "boost": 1
            }
          }
        }
      ],
      "adjust_pure_negative": true,
      "boost": 1
    }
  },
  "_source": {
    "includes": [
      "FlightNum",
      "OriginCityName",
      "DestCityName"
    ],
    "excludes": []
  },
  "docvalue_fields": [
    "timestamp"
  ],
  "sort": [
    {
      "timestamp": {
        "order": "asc"
      }
    }
  ]
}

Pour les utilisateurs qui commencent à utiliser Elasticsearch, cette requête est relativement complexe. En effet, nous avons une requête booléenne présentant une plage imbriquée, une restriction de terme et un opérateur de chaîne de recherche. Pour les opérateurs migrant une application depuis SQL, cette tâche aurait traditionnellement été assez ardue avant même d'avoir à se demander si la requête finale était correcte et optimale d'un point de vue fonctionnel. L'opérateur query_string actuel a été intégré à un filtre, puisqu'aucune pertinence n'était requise (le tri s'effectue par date), ce qui nous permet de tirer profit du cache de filtre, d'ignorer l'attribution d'un score et d'améliorer le temps de réponse.

Les paramètres de ces opérateurs sont également exposés dans SQL. Ce dernier exemple présente l'utilisation d'une requête MATCH avec plusieurs termes de recherche dans plusieurs champs pour limiter les résultats.

"Rechercher des vols à destination ou au départ de Barcelone pour lesquels la météo a inclus des éclairs."

Essayez sur demo.elastic.co

Aux fins de cet exemple, nous effectuons également un tri et montrons le score de pertinence par l'intermédiaire de la fonction Score().

sql> SELECT Score(), timestamp, FlightNum, OriginCityName, DestCityName, DestWeather, OriginWeather FROM flights WHERE MATCH('*Weather,*City*', 'Lightning Barcelona', 'type=cross_fields;operator=AND') ORDER BY Score() DESC LIMIT 5;
    SCORE()    |       timestamp        |   FlightNum   |OriginCityName | DestCityName  |    DestWeather    |   OriginWeather
---------------+------------------------+---------------+---------------+---------------+-------------------+-------------------
6.990964       |2018-05-31T06:00:41.000Z|L637ISB        |Barcelona      |Santiago       |Rain               |Thunder & Lightning
6.990964       |2018-06-13T12:23:44.000Z|0GIHB62        |Barcelona      |Buenos Aires   |Clear              |Thunder & Lightning
6.9796515      |2018-06-14T21:04:51.000Z|7GEMEDR        |Barcelona      |Hyderabad      |Thunder & Lightning|Rain
6.9133706      |2018-05-31T01:58:51.000Z|ZTOD7RQ        |Barcelona      |Dubai          |Sunny              |Thunder & Lightning
6.9095163      |2018-06-06T14:02:34.000Z|QSQA5CT        |Barcelona      |Naples         |Rain               |Thunder & Lightning

Nous utilisons des modèles à caractère générique pour indiquer les champs à faire correspondre et demander à ce que le résultat soit un booléen AND. Le paramètre de champs croisés ne requiert pas des termes qu'ils apparaissent dans un même champ ; ils sont en effet autorisés à apparaître dans différents champs du moment qu'ils existent. Au vu de la structure des données, cette condition est essentielle au résultat.

Ici, nos exemples ont renvoyé une comparaison des lignes et des groupes. Cependant, les opérateurs QUERY et MATCH peuvent aussi être utilisés avec une commande GROUP BY, une agrégation filtrée efficacement dans Elasticsearch.

Recherches d'index croisé et alias

Jusqu'à maintenant, nos requêtes ne ciblaient qu'une table / un index unique. Si nous dupliquons l'index des vols, en copiant les documents et en leur attribuant un nouveau nom en créant une requête de réindexation, nous pouvons requêter les deux index au même moment, à condition qu'ils aient des mappages identiques. Toute différence de mappage produirait une erreur de requête lors de l'analyse. Afin de demander simultanément plusieurs index, l'utilisateur peut les ajouter à un alias Elasticsearch ou utiliser des caractères génériques dans la clause WHERE. Par exemple, supposons que j'ai deux index "flight" et "flights-2" sous l'alias suivant "f_alias" :

POST /_aliases
{
    "actions" : [
       { "add" : { "index" : "flights-2", "alias" : "f_alias" } },
        { "add" : { "index" : "flights", "alias" : "f_alias" } }
    ]
}

Les éléments suivants sont logiquement équivalents :

sql> SELECT FlightNum, OriginCityName, DestCityName, DestWeather, OriginWeather FROM flights* ORDER BY timestamp DESC LIMIT 1;
   FlightNum   |OriginCityName | DestCityName  |  DestWeather  | OriginWeather
---------------+---------------+---------------+---------------+---------------
6UPDDGK        |Zurich         |Zurich         |Rain           |Hail
sql> SELECT FlightNum, OriginCityName, DestCityName, DestWeather, OriginWeather FROM f_alias ORDER BY timestamp DESC LIMIT 1;
   FlightNum   |OriginCityName | DestCityName  |  DestWeather  | OriginWeather
---------------+---------------+---------------+---------------+---------------
6UPDDGK        |Zurich         |Zurich         |Rain           |Hail

Essayez sur demo.elastic.co. (Remarque : notre environnement de démonstration dispose des deux index avec un alias pré-configuré pour que les utilisateurs testent l'exemple ci-dessus.)

Il se peut que nous assouplissions les exigences ci-dessus à l'avenir, mais pour le moment, elles simplifient la logique de cette première version.

Clauses JOIN

Les clauses JOIN d'une implémentation SQL avec RDBMS classique permettent de combiner les lignes de différentes tables via des colonnes associées dans une réponse tabulaire à part. Cette action permet la modélisation relationnelle des données, et il s'agit d'une rubrique importante par rapport aux options nativement disponibles dans Elasticsearch pour y parvenir. Bien qu'Elasticsearch SQL ne propose aucun opérateur JOIN pour le moment, elle permet aux utilisateurs d'exploiter des documents imbriqués, et donc d'effectuer une modélisation relationnelle simple en un et plusieurs documents. La demande de documents imbriqués est transférée en toute transparence à l'utilisateur. Pour vous faire la démonstration de cette fonctionnalité, nous avons besoin d'un index présentant de telles données. Aux fins de cet exemple, nous avons téléchargé un index "orders" sur demo.elastic.co. Les documents de cet index correspondent aux commandes d'un site de commerce électronique et contiennent des champs, tels que order_date, billing_city et customer_last_name. Par ailleurs, un champ "products" contient un sous-document imbriqué pour chaque produit de la commande. Exemple :

{
          "billing_last_name": "Green",
          "billing_first_name": "Jason",
          "order_id": 519894,
          "products": [
            {
              "tax_amount": 0,
              "taxful_price": 22.99,
              "quantity": 1,
              "taxless_price": 22.99,
              "discount_amount": 0,
              "base_unit_price": 22.99,
              "discount_percentage": 0,
              "product_name": "Briefcase - black",
              "manufacturer": "Pier One",
              "min_price": 11.27,
              "created_on": "2016-11-08T04:16:19+00:00",
              "unit_discount_amount": 0,
              "price": 22.99,
              "product_id": 12733,
              "base_price": 22.99,
              "_id": "sold_product_519894_12733",
              "category": "Men's Accessories",
              "sku": "PI952HA0M-Q11"
            },
            {
              "tax_amount": 0,
              "taxful_price": 16.99,
              "quantity": 1,
              "taxless_price": 16.99,
              "discount_amount": 0,
              "base_unit_price": 16.99,
              "discount_percentage": 0,
              "product_name": "3 PACK - Boxer shorts - white/navy",
              "manufacturer": "Pier One",
              "min_price": 8.33,
              "created_on": "2016-11-08T04:16:19+00:00",
              "unit_discount_amount": 0,
              "price": 16.99,
              "product_id": 18370,
              "base_price": 16.99,
              "_id": "sold_product_519894_18370",
              "category": "Men's Clothing",
              "sku": "PI982AA0Y-A11"
            }
          ],
          "has_error": false,
          "customer_last_name": "Green",
          "currency": "EUR",
          "billing_first_name": "Jason",
          "shipping_country_code": "US",
          "email": "swagelastic@gmail.com",
          "day_of_week": "Tuesday",
          "geoip": {
            "continent_name": "North America",
            "city_name": "New York",
            "country_iso_code": "US",
            "location": {
              "lon": -73.9862,
              "lat": 40.7662
            },
            "region_name": "New York"
          },
          "payment_status": "FULLY_PAID",
          ...
}

Normalement, pour demander ces documents, l'utilisateur doit comprendre pourquoi nous utilisons un type de donnée imbriqué pour le champ des produits, sans oublier la syntaxe de la requête imbriquée. Toutefois, avec Elasticsearch SQL, nous pouvons demander ces documents imbriqués comme si chacun d'entre eux représentait une ligne distincte comportant les champs de sa commande parente (c.-à-d. que nous aplatissons efficacement la structure aux fins de la présentation). Regardez la commande ci-dessus, qui comporte deux produits. Lorsque nous la requêtons, elle se présente sous la forme de deux lignes si nous demandons les champs des sous-documents des produits. Chaque ligne peut dorénavant contenir les champs de la commande parente, si nous le demandons. Par exemple :

"Rechercher le nom de facturation utilisé pour les vols et les produits achetés, pour la commande 518894."

sql> SELECT billing_last_name, billing_first_name, products.price, products.product_id FROM orders WHERE order_id=519894;
billing_last_name|billing_first_name|products.price |products.product_id
-----------------+------------------+---------------+-------------------
Green            |Jason             |16.984375      |18370
Green            |Jason             |22.984375      |12733

Essayez sur demo.elastic.co

L'API _translate présente la structure de cette requête en utilisant une requête imbriquée :

{
  "size": 1000,
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "order_id": {
              "value": 519894,
              "boost": 1
            }
          }
        },
        {
          "nested": {
            "query": {
              "match_all": {
                "boost": 1
              }
            },
            "path": "products",
            "ignore_unmapped": false,
            "score_mode": "none",
            "boost": 1,
            "inner_hits": {
              "ignore_unmapped": false,
              "from": 0,
              "size": 99,
              "version": false,
              "explain": false,
              "track_scores": false,
              "_source": false,
              "stored_fields": "_none_",
              "docvalue_fields": [
                "products.product_id",
                "products.price"
              ]
            }
          }
        }
      ],
      "adjust_pure_negative": true,
      "boost": 1
    }
  },
  "_source": {
    "includes": [
      "billing_last_name",
      "billing_first_name"
    ],
    "excludes": []
  },
  "sort": [
    {
      "_doc": {
        "order": "asc"
      }
    }
  ]
}

Essayez sur demo.elastic.co

À l'inverse, si nous demandons simplement les champs parents, une seule ligne est présentée :

"Rechercher le nom de facturation utilisé pour les vols, pour la commande 518894."

sql> SELECT billing_last_name, billing_first_name FROM orders WHERE order_id=519894;
billing_last_name|billing_first_name
-----------------+------------------
Green            |Jason

Essayez sur demo.elastic.co

Fonctionnalités manquantes et à venir...

Limites actuelles auxquelles vous risquez d'être confronté au début de toute expérimentation :

  • Requêtes de table / d'index croisés : possibles à condition que les mappages des index soient identiques. À l'heure actuelle, toute différence produit une erreur au moment de la requête.
  • Opérateurs JOIN : comme nous l'avons souligné plus haut, nous prenons en charge des opérateurs JOIN limités uniquement en cas d'utilisation de documents imbriqués.
  • Tri des groupes dans la commande GROUP BY : comme mentionné plus haut, cette limitation provient de l'agrégation imbriquée Elasticsearch.
  • Clauses SELECT imbriquées : il s'agit d'un mécanisme ordinaire visant à étayer l'analyse des outils BI. Bien que les instructions SELECT imbriquées utilisant plusieurs index peuvent être l'équivalent d'un opérateur JOIN, il serait possible de réécrire et d'exécuter des instructions utilisant le même index. Nous pourrions envisager cette possibilité dans le futur.

Voici quelques-uns des avantages d'Elasticsearch que nous prévoyons d'intégrer dans les prochaines versions :

  • Possibilité d'exécuter une commande GROUP BY sur plusieurs niveaux (p. ex. "rechercher des itinéraires de vols (départ et destination) par mois avec un retard moyen supérieur à 2 h")
  • Présentation des opérateurs géospatiaux Elasticsearch
  • Support de type INTERVAL (p. ex. possibilité de travailler sur la différence entre deux dates et deux heures)
  • Amélioration des fonctions Data/Time Math et String
  • Prise en charge des histogrammes dans le cadre du regroupement
  • Recherche d'index croisé et de cluster croisé présentant des mappages non identiques

Merci d'être arrivé jusqu'ici et surveillez la sortie des prochains numéros de la série Présentation d'Elasticsearch SQL.

Présentation d'Elasticsearch SQL et exemples pratiques – 1re partie

$
0
0

La version 6.3 de la Suite Elastic était l'une des versions récentes les plus riches en fonctionnalités. Comme si l'ouverture de X-Pack et l'ajout des rollups de données ne suffisaient pas à susciter votre enthousiasme, nous avons annoncé l'ajout de la prise en charge de SQL comme fonction expérimentale. Il s'agit de l'une des fonctions les plus demandées depuis les débuts, relativement récents, d'Elasticsearch.

Dans cette série d'articles, nous vous présentons quelques-unes des fonctionnalités et capacités actuellement prises en charge par Elasticsearch SQL. En outre, nous aborderons ouvertement les quelques limitations que présente ce système, ainsi que nos projets à venir.

Public cible

Historiquement, Elastic a toujours hésité à ajouter SQL à Elasticsearch, pour plusieurs raisons. Voici quelques-unes des questions les plus souvent posées :

  • Que représente exactement la prise en charge de SQL ?
  • Quelles fonctionnalités seraient prises en charge ? Le plus souvent, cette question était présentée ainsi : "Prenons-nous en charge les jointures ? Les expressions/fonctions ? Le regroupement ?"
  • Doit-on prendre en charge la connectivité JDBC/ODBC ?
  • Est-il vraiment nécessaire de prendre en charge SQL ou ne parvenons-nous simplement pas à fournir les ressources suffisantes aux nouveaux utilisateurs pour qu'ils puissent se familiariser avec notre propre langage dédié (Elasticsearch DSL ou DSL) ?

Après plusieurs tentatives, nous avons identifié les fonctionnalités requises qui, selon nous, seraient utiles à nos utilisateurs. D'après les discussions que nous avons eues avec eux, nous pensons que SQL s'avère être une solution avantageuse pour deux principaux types d'utilisateurs :

  • Les nouveaux utilisateurs de la Suite Elastic, pour qui le langage dédié d'Elasticsearch (DSL) peut sembler terrifiant de prime abord, ou qui n'ont tout simplement pas le temps d'en apprendre la syntaxe dans le détail. Par exemple, pour un utilisateur qui convertit une application basée sur SQL afin d'améliorer les performances et l'évolutivité, et qui recherche la requête équivalente sans avoir à apprendre toute la syntaxe. Trouver des équivalences en fonction de ce que vous connaissez déjà est une approche courante pour l'apprentissage de nouveaux langages.
  • Les consommateurs de données qui ne souhaitent pas apprendre l'intégralité du langage DSL, ou qui n'en ont pas besoin. Il peut s'agir de scientifiques des données qui souhaitent extraire des données à des fins de traitement externe. Alternativement, il peut s'agir d'utilisateurs BI moins spécialisés, qui ont une connaissance générale de SQL et qui utilisent ces opérations au quotidien.

En dehors des publics décrits ci-dessus, on ne peut pas nier que le langage SQL, en tant que langage déclaratif, constitue un paradigme extrêmement séduisant pour tous. C'est ce qu'explique cette série d'articles. Il ne fait aucun doute que la prévalence du langage SQL s'appuie sur la capacité à exprimer la logique du calcul et ce que vous essayez d'accomplir, sans avoir à définir le flux de contrôle. De plus, comme vous le verrez, certaines requêtes SQL définissent élégamment un problème qui peut s'avérer "verbeux" avec avec un DSL équivalent. En résumé, DSL décrit élégamment des problèmes de recherche en texte intégral, SQL s'avère plus efficace pour décrire des requêtes basées sur des analyses structurées.

Ce qu'est Elasticsearch SQL, et ce qu'il n'est pas…

Dans sa version initiale, Elasticsearch SQL est une interface en lecture seule conforme à un sous-ensemble de spécifications ANSI SQL, qui permet d'exposer Elasticsearch sous forme de source tabulaire. Nous proposons également des opérateurs supplémentaires, en plus de ces spécifications, qui affichent des capacités propres à Elasticsearch, par rapport aux déploiements basés sur RDBMS. Nous nous sommes efforcés de fournir une implémentation légère et rapide qui minimise les dépendances externes et les pièces mobiles. Cette première offre ne transforme en aucun cas Elasticsearch en base de données entièrement relationnelle (avec ses propriétés associées) ni ne remplace l'impératif de modélisation des données. Bien que certaines expressions et fonctions de manipulation des données soient intégrées par le plug-in SQL, nous respectons un principe de pushdown chaque fois que l'ordre et le nombre de résultats sont impactés ou que le regroupement est requis. Cela permet de limiter le traitement actuel des données dans le plug-in Elasticsearch SQL à la seule manipulation des résultats (par exemple, fonctions sur les champs) et de cantonner le client (pilote JDBC/CLI ou navigateur) au rendu. Cette approche exploite l'évolutivité et la performance d'Elasticsearch, afin qu'il se charge des opérations complexes.

elasticsearch-sql.png

Concepts de mappage : index et documents vs tables et lignes

Aux débuts d'Elasticsearch, les index et les types étaient souvent considérés comme analogues aux tables et bases de données RDBMS, principalement pour aider les utilisateurs à comprendre des concepts potentiellement nouveaux et à les utiliser. Comme nous l'expliquons dans la documentation d'Elasticsearch 6.3, il s'agit d'une analogie incorrecte et potentiellement dangereuse. C'est pourquoi nous supprimons des types. Cependant, nous avons encore besoin d'une équivalence logique, correcte et utilisable, entre le modèle axé sur un document sans schéma d'Elasticsearch et les concepts fortement "typés" de SQL.

Heureusement, les index Elasticsearch, comme les tables RDBMS, sont physiquement isolés et doivent être utilisés, grossièrement, de la même manière (c'est-à-dire, pour stocker des données associées). Les lignes et les documents constituent aussi une analogie naturelle, car ils fournissent un mécanisme permettant de regrouper les champs/colonnes, bien qu'une ligne soit généralement plus stricte (et ait plus d'applications), alors qu'un document est généralement un peu plus flexible (tout en conservant une structure). Les champs dans Elasticsearch représentent une entrée de nom et prennent en charge plusieurs types de données. De plus, ils peuvent contenir plusieurs valeurs (c'est-à-dire une liste). À l'exception de ces champs à plusieurs valeurs, ce concept permet un mappage direct avec les colonnes SQL. Remarque : si vous tentez une commande SELECT dans un champ à plusieurs valeurs, la requête échouera et indiquera une erreur.

Les autres concepts n'offrent pas de mappage aussi direct : les équivalences entre les bases de données SQL et les clusters Elasticsearch restent limitées. Cependant, elles n'affectent généralement pas l'utilisateur d'Elasticsearch SQL. Pour en savoir plus sur ce sujet, consultez la documentation Mappage des concepts dans SQL et Elasticsearch.

Pour résumer, utilisez le nom de l'index dans votre clause WHERE pour cibler une table / un index spécifique. Les documents uniques seront alors rendus sous forme de lignes et les champs seront mappés en colonnes. En raison de ce mappage largement transparent, nous utiliserons ces termes de manière interchangeable dans la suite de cet article.

Éléments d'implémentation internes

L'implémentation d'Elasticsearch SQL se compose de 4 phases d'exécution :

elasticsearch-sql-implementation.png

La phase d'analyse est chargée de convertir la requête SQL en arbre de syntaxe abstraite (AST). La validation de la syntaxe est effectuée lors de cette phase, avant que l'analyseur valide l'AST et résolve les tables, colonnes, fonctions, alias et espaces de noms pour produire un plan logique. Ce plan est optimisé et inclut le retrait des éventuelles expressions redondantes, avant d'être converti en plan physique (c'est-à-dire, en DSL) afin d'être exécuté. L'exécuteur de requête exécute alors la requête réelle et transmet les résultats au client, en procédant à la conversion des types et la conversion tabulaire, selon les besoins (par exemple, arbre d'agrégation en table).

Méthodes de connectivité

Lorsque l'on fournit une solution SQL, la prise en charge de la connectivité devient un facteur essentiel. Bien qu'une interface exclusivement REST soit acceptable pour certains utilisateurs, la plupart des utilisateurs souhaitent pouvoir se connecter via des interfaces standard (typiquement JDBC et ODBC). Nous prévoyons la prise en charge d'ODBC et nous y travaillons activement. L'interface JDBC est quant à elle disponible avec cette première version et disponible au téléchargement (en version bêta).

Surtout, toutes les communications avec ces pilotes se feront via HTTP, par l'intermédiaire de notre interface REST. Cela offre plusieurs avantages intéressants :

  1. Accorder l'accès SQL aux utilisateurs équivaut à ouvrir et exposer un port Elasticsearch qui s'intègre de manière native avec le système de sécurité. Par conséquent, nous pouvons immédiatement prendre en charge le langage SQL dans Elasticsearch Service hébergé dans le cloud et disponible via Elastic Cloud, et les utilisateurs existants peuvent alors l'associer à des permissions de contrôle d'accès prêtes à l'emploi.
  2. Cela nous permet d'utiliser SQL directement via l'interface REST et de fournir un client CLI supplémentaire, pour plus de simplicité. Cette seconde offre devrait rencontrer un grand succès auprès des administrateurs qui connaissent déjà le fonctionnement des lignes de commande, courantes dans les systèmes RDBMS.

Le pilote JDBC utilise la toute nouvelle bibliothèque XContent, chargée d'analyser les requêtes et les réponses (historiquement, ce code était étroitement lié à Elasticsearch). Ainsi, le pilote ne dépend plus de l'ensemble des bibliothèques Elasticsearch et reste donc léger et portable. Nous continuerons d'améliorer ce processus de séparation dans les futures versions, afin de créer un pilote plus petit et plus rapide.

Exemples simples

Intéressons-nous à quelques exemples qui utilisent un mélange CLI et API REST. Dans les cas que nous étudierons, nous utilisons un exemple d'ensemble de données qui sera bientôt distribué avec Kibana. Si vous trépignez d'impatience, cet ensemble de données de vol est aussi disponible sur demo.elastic.co. Vous pouvez y exécuter les exemples suivants, via la console Kibana. Tout au long de cette série d'articles, nous vous proposons des liens vers demo.elastic.co qui se remplissent automatiquement avec la requête concernée. Nous offrons aussi la liste complète des requêtes à exécuter dans la console Kibana de démonstration. Dans certains cas, les résultats peuvent varier s'il n'existe aucun ordre ni aucune restriction explicite concernant la demande, en raison de l'ordre naturel des résultats dans Elasticsearch, lorsqu'aucun ordre de tri ni aucun facteur de pertinence ne s'applique.

Récupération des informations de schéma Elasticsearch : DSL vs SQL

Commençons par identifier le schéma dans la table / index et les champs avec lesquels nous pouvons jouer. Pour cela, nous utilisons l'interface REST :

Requête

POST _xpack/sql
{
  "query":"DESCRIBE flights"
}

Essayez sur demo.elastic.co

Réponse

{
  "columns": [
    {
      "name": "column",
      "type": "keyword"
    },
    {
      "name": "type",
      "type": "keyword"
    }
  ],
  "rows": [
    [ "AvgTicketPrice", "REAL" ],
    [ "Cancelled", "BOOLEAN" ],
    [ "Carrier", "VARCHAR" ],
    [ "Dest", "VARCHAR" ],
    [ "DestAirportID", "VARCHAR" ],
    [ "DestCityName", "VARCHAR" ],
    [ "DestCountry", "VARCHAR" ],
    [ "DestLocation", "OTHER" ],
    [ "DestRegion", "VARCHAR" ],
    [ "DestWeather", "VARCHAR" ],
    [ "DistanceKilometers", "REAL" ],
    [ "DistanceMiles", "REAL" ],
    [ "FlightDelay", "BOOLEAN" ],
    [ "FlightDelayMin", "INTEGER" ],
    [ "FlightDelayType", "VARCHAR" ],
    [ "FlightNum", "VARCHAR" ],
    [ "FlightTimeHour", "VARCHAR" ],
    [ "FlightTimeMin", "REAL" ],
    [ "Origin", "VARCHAR" ],
    [ "OriginAirportID", "VARCHAR" ],
    [ "OriginCityName", "VARCHAR" ],
    [ "OriginCountry", "VARCHAR" ],
    [ "OriginLocation", "OTHER" ],
    [ "OriginRegion", "VARCHAR" ],
    [ "OriginWeather", "VARCHAR" ],
    [ "dayOfWeek", "INTEGER" ],
    [ "timestamp", "TIMESTAMP" ]
  ]
}

La réponse ci-dessus peut aussi être formatée sous forme tabulaire, grâce au paramètre URL ?format=txt. Par exemple :

POST _xpack/sql?format=txt 
{
  "query":"DESCRIBE flights"
}

Essayez sur demo.elastic.co

column          |     type      
--------------------------+---------------
AvgTicketPrice            |REAL           
Cancelled                 |BOOLEAN        
Carrier                   |VARCHAR        
Carrier.keyword           |VARCHAR        
Dest                      |VARCHAR        
Dest.keyword              |VARCHAR        
DestAirportID             |VARCHAR        
DestAirportID.keyword     |VARCHAR        
DestCityName              |VARCHAR        
DestCityName.keyword      |VARCHAR        
DestCountry               |VARCHAR        
DestCountry.keyword       |VARCHAR        
DestLocation              |STRUCT         
DestLocation.lat          |VARCHAR        
DestLocation.lat.keyword  |VARCHAR        
DestLocation.lon          |VARCHAR        
DestLocation.lon.keyword  |VARCHAR        
DestRegion                |VARCHAR        
DestRegion.keyword        |VARCHAR        
DestWeather               |VARCHAR        
DestWeather.keyword       |VARCHAR        
DistanceKilometers        |REAL           
DistanceMiles             |REAL           
FlightDelay               |BOOLEAN        
FlightDelayMin            |BIGINT         
FlightDelayType           |VARCHAR        
FlightDelayType.keyword   |VARCHAR        
FlightNum                 |VARCHAR        
FlightNum.keyword         |VARCHAR        
FlightTimeHour            |REAL           
FlightTimeMin             |REAL           
Origin                    |VARCHAR        
Origin.keyword            |VARCHAR        
OriginAirportID           |VARCHAR        
OriginAirportID.keyword   |VARCHAR        
OriginCityName            |VARCHAR        
OriginCityName.keyword    |VARCHAR        
OriginCountry             |VARCHAR        
OriginCountry.keyword     |VARCHAR        
OriginLocation            |STRUCT         
OriginLocation.lat        |VARCHAR        
OriginLocation.lat.keyword|VARCHAR        
OriginLocation.lon        |VARCHAR        
OriginLocation.lon.keyword|VARCHAR        
OriginRegion              |VARCHAR        
OriginRegion.keyword      |VARCHAR        
OriginWeather             |VARCHAR        
OriginWeather.keyword     |VARCHAR        
dayOfWeek                 |BIGINT         
timestamp                 |TIMESTAMP

Nous allons ensuite utiliser la structure de réponse tabulaire illustrée ci-dessus pour fournir un exemple de réponse depuis l'API REST. Pour obtenir la même requête depuis la console, nous devons nous connecter avec les identifiants suivants :

./elasticsearch-sql-cli http://elastic@localhost:9200

Après avoir répondu à la demande de saisie de mot de passe…

sql> DESCRIBE flights;
column      |     type
------------------+---------------
AvgTicketPrice    |REAL
Cancelled         |BOOLEAN
Carrier           |VARCHAR
Dest              |VARCHAR
DestAirportID     |VARCHAR
DestCityName      |VARCHAR
DestCountry       |VARCHAR
DestLocation      |OTHER
DestRegion        |VARCHAR
DestWeather       |VARCHAR
DistanceKilometers|REAL
DistanceMiles     |REAL
FlightDelay       |BOOLEAN
FlightDelayMin    |INTEGER
FlightDelayType   |VARCHAR
FlightNum         |VARCHAR
FlightTimeHour    |VARCHAR
FlightTimeMin     |REAL
Origin            |VARCHAR
OriginAirportID   |VARCHAR
OriginCityName    |VARCHAR
OriginCountry     |VARCHAR
OriginLocation    |OTHER
OriginRegion      |VARCHAR
OriginWeather     |VARCHAR
dayOfWeek         |INTEGER
timestamp         |TIMESTAMP
sql>

Le schéma ci-dessus est également renvoyé avec chaque requête pour les champs affichés dans la clause SELECT. Ainsi, le pilote bénéficie de toutes les informations de type nécessaires et requises pour formater ou exploiter les résultats. Par exemple, une clause SELECT simple avec une clause LIMIT pour que la réponse reste courte. Par défaut, nous renvoyons 1 000 lignes.

SELECT simple

POST _xpack/sql?format=txt
{
  "query":"SELECT FlightNum FROM flights LIMIT 1"
}

Essayez sur demo.elastic.co (remarque : les résultats peuvent varier)

   FlightNum   
---------------
1Y0TZOE

Cette même requête / réponse REST est consommée par le pilote JDBC et la console, mais l'utilisateur ne la voit pas.

sql> SELECT OriginCountry, OriginCityName FROM flights LIMIT 1;
OriginCountry |OriginCityName
---------------+---------------
US      |San Diego

Essayez sur demo.elastic.co (remarque : les résultats peuvent varier)

Notez que si vous effectuez une requête pour un champ qui n'existe pas (sensibilité aux minuscules ou aux majuscules), la sémantique d'un stockage fortement typé implique qu'une erreur sera renvoyée. Cela diffère du comportement d'Elasticsearch, avec lequel le champ ne sera tout simplement pas renvoyé. Par exemple, si vous modifiez la structure ci-dessus pour utiliser le champ « OrigincityName » au lieu de « OriginCityName », vous obtiendrez un message d'erreur utile :

{
  "error": {
    "root_cause": [
      {
        "type": "verification_exception",
        "reason": "Found 1 problem(s)\nline 1:8: Unknown column [OrigincityName], did you mean any of [OriginCityName, DestCityName]?"
      }
    ],
    "type": "verification_exception",
    "reason": "Found 1 problem(s)\nline 1:8: Unknown column [OrigincityName], did you mean any of [OriginCityName, DestCityName]?"
  },
  "status": 400
}

Essayez sur demo.elastic.co

De la même manière, si nous tentons d'utiliser une fonction ou une expression sur un champ non compatible, nous obtenons une erreur adaptée. De manière générale, l'analyseur échoue rapidement lors de la validation de l'AST. Pour cela, Elasticsearch doit connaître le mappage d'index et les capacités de chaque champ. C'est pourquoi, lorsqu'un client accède à l'interface SQL avec sécurité, il doit posséder les autorisations appropriées.

Nous ne pouvons pas illustrer toutes les requêtes et leurs réponses. Cet article serait interminable. Pour aller au plus court, voici quelques requêtes, par ordre de complexité, ainsi que quelques points d'intérêt.

SELECT avec WHERE et ORDER BY

"Rechercher les 10 plus longs vols de plus de 5 h aux États-Unis."

POST _xpack/sql?format=txt
{
  "query":"SELECT OriginCityName, DestCityName FROM flights WHERE FlightTimeHour > 5 AND OriginCountry='US' ORDER BY FlightTimeHour DESC LIMIT 10"
}

Essayez sur demo.elastic.co

OriginCityName | DestCityName  
---------------+---------------
Atlanta        |Durban         
Louisville     |Melbourne      
Peoria         |Melbourne      
Albuquerque    |Durban         
Birmingham     |Durban         
Bangor         |Brisbane       
Seattle        |Durban         
Huntsville     |Sydney         
Savannah       |Shanghai       
Philadelphia   |Xi'an

L'opérateur de restriction du nombre de lignes varie en fonction de l'implémentation SQL. Pour Elasticsearch SQL, nous utilisons PostgreSQL / MySQL de manière constante pour l'implémentation de l'opérateur LIMIT.

Maths

Un petit calcul, au hasard…

sql> SELECT ((1 + 3) * 1.5 / (7 - 6)) * 2 AS random;
    random
---------------
12.0

Essayez sur demo.elastic.co

Dans cet exemple, le côté serveur effectue une opération post-traitement concernant les fonctions. Il n'existe aucune requête équivalente en DSL.

Fonctions et expressions

"Rechercher tous les vols, après le mois de juin, dont la durée de vol est supérieure à 5 h et classés du plus long au plus court."

POST _xpack/sql?format=txt
{
  "query":"SELECT MONTH_OF_YEAR(timestamp), OriginCityName, DestCityName FROM flights WHERE FlightTimeHour > 5 AND MONTH_OF_YEAR(timestamp) > 6 ORDER BY FlightTimeHour DESC LIMIT 10"
}

Essayez sur demo.elastic.co

MONTH_OF_YEAR(timestamp [UTC])|OriginCityName |   DestCityName    
------------------------------+---------------+-------------------
7                             |Buenos Aires   |Shanghai           
7                             |Stockholm      |Sydney             
7                             |Chengdu        |Bogota             
7                             |Adelaide       |Cagliari           
7                             |Osaka          |Buenos Aires       
7                             |Buenos Aires   |Chitose / Tomakomai
7                             |Buenos Aires   |Shanghai           
7                             |Adelaide       |Washington         
7                             |Osaka          |Quito              
7                             |Buenos Aires   |Xi'an

Typiquement, ces fonctions nécessitent d'écrire avec Painless pour obtenir un résultat équivalent dans Elasticsearch alors que les éléments déclaratifs fonctionnels de SQL évitent toute sorte de scripts. En outre, notez que nous pouvons utiliser la fonction pour les clauses WHERE et SELECT. L'élément de la clause WHERE est dirigé vers Elasticsearch, car il affecte le nombre de résultats. La fonction SELECT, quant à elle, est gérée par le plug-in côté serveur, dès son apparition.

Notez que vous pouvez accéder à une liste de fonctions disponibles grâce à "SHOW FUNCTIONS".

Essayez sur demo.elastic.co

En associant cela aux capacités mathématiques mentionnées précédemment, nous pouvons commencer à formuler des requêtes qui seraient trop complexes à articuler en DSL pour la plupart des utilisateurs.

"Rechercher la distance et la vitesse moyenne des 2 vols les plus rapides (vélocité) qui partent lundi, mardi ou mercredi, entre 9 h et 11 h et qui parcourent plus de 500 km. Arrondir la distance et la vitesse à l'entier le plus proche. Si la vitesse est la même, afficher le vol le plus long en premier."

Essayez sur demo.elastic.co

sql> SELECT timestamp, FlightNum, OriginCityName, DestCityName, ROUND(DistanceMiles) AS distance, ROUND(DistanceMiles/FlightTimeHour) AS speed, DAY_OF_WEEK(timestamp) AS day_of_week FROM flights WHERE DAY_OF_WEEK(timestamp) >= 0 AND DAY_OF_WEEK(timestamp) <= 2 AND HOUR_OF_DAY(timestamp) >=9 AND HOUR_OF_DAY(timestamp) <= 10 ORDER BY speed DESC, distance DESC LIMIT 2;
       timestamp        |   FlightNum   |OriginCityName | DestCityName  |   distance    |     speed     |  day_of_week
------------------------+---------------+---------------+---------------+---------------+---------------+---------------
2018-07-03T10:03:11.000Z|REPKGRT        |Melbourne      |Norfolk        |10199          |783            |2
2018-06-05T09:18:29.000Z|J72Y2HS        |Dubai          |Lima           |9219           |783            |2

Cette question est curieuse et plutôt alambiquée, mais vous avez compris le principe. Notez également comment nous avons créé des alias de champs et comment nous y faisons référence dans la clause ORDER BY.

De plus, notez que dans la clause SELECT, vous n'êtes pas obligé de remplir tous les champs utilisés dans les clauses WHERE et ORDER BY. Il s'agit là d'une légère différence par rapport aux implémentations de SQL que vous utilisiez précédemment. Par exemple, la structure suivante est parfaitement valide :

POST _xpack/sql
{
  "query":"SELECT timestamp, FlightNum FROM flights WHERE AvgTicketPrice > 500 ORDER BY AvgTicketPrice"
}

Essayez sur demo.elastic.co

Traduire des requêtes SQL en DSL

Nous avons tous déjà été confrontés à une requête SQL difficile à exprimer en DSL. Et nous nous sommes tous déjà demandé si cette solution était réellement optimale. L'une des fonctions particulièrement intéressantes de la nouvelle interface SQL est sa capacité à aider les nouveaux utilisateurs d'Elasticsearch à pallier ces problèmes. À l'aide de l'interface REST, nous ajoutons /translate au point de terminaison "sql" afin d'obtenir la requête Elasticsearch que le pilote enverrait.

Prenons l'exemple des précédentes requêtes :

POST _xpack/sql/translate
{
  "query":"SELECT OriginCityName, DestCityName FROM flights WHERE FlightTimeHour > 5 AND OriginCountry='US' ORDER BY FlightTimeHour DESC LIMIT 10"
}

Essayez sur demo.elastic.co

Le DSL équivalent est relativement évident pour les utilisateurs expérimentés d'Elasticsearch :

{
  "size": 10,
  "query": {
    "bool": {
      "filter": [
        {
          "range": {
            "FlightTimeHour": {
              "from": 5,
              "to": null,
              "include_lower": false,
              "include_upper": false,
              "boost": 1
            }
          }
        },
        {
          "term": {
            "OriginCountry.keyword": {
              "value": "US",
              "boost": 1
            }
          }
        }
      ],
      "adjust_pure_negative": true,
      "boost": 1
    }
  },
  "_source": {
    "includes": [
      "OriginCityName",
      "DestCityName"
    ],
    "excludes": []
  },
  "sort": [
    {
      "FlightTimeHour": {
        "order": "desc"
      }
    }
  ]
}

Sans surprise, la clause WHERE est convertie en requêtes de range et de term. Notez que la variante OriginCountry.keyword du sous-champ est utilisée pour la correspondance de terme exacte, par rapport à l'élément OriginCountry parent (qui correspond à un texte). L'utilisateur n'est pas tenu de connaître les différences de comportement du mappage sous-jacent : le bon type de champ est sélectionné automatiquement. Il est intéressant de noter que l'interface essaie d'optimiser les performances de récupération en utilisant docvalue_fields sur l'élément _source lorsque cela est possible, c'est-à-dire pour les types exacts (valeurs numériques, dates, mots-clés) avec les Doc Values activées. Vous pouvez compter sur Elasticsearch SQL pour générer le DSL le plus optimal pour la requête spécifiée.

À présent, prenons l'exemple de la requête la plus complexe que nous avons utilisée :

POST _xpack/sql/translate
{
  "query":"SELECT timestamp, FlightNum, OriginCityName, DestCityName, ROUND(DistanceMiles) AS distance, ROUND(DistanceMiles/FlightTimeHour) AS speed, DAY_OF_WEEK(timestamp) AS day_of_week FROM flights WHERE DAY_OF_WEEK(timestamp) >= 0 AND DAY_OF_WEEK(timestamp) <= 2 AND HOUR_OF_DAY(timestamp) >=9 AND HOUR_OF_DAY(timestamp) <= 10 ORDER BY speed DESC, distance DESC LIMIT 2"
}

Essayez sur demo.elastic.co

Et la réponse…

{
  "size": 2,
  "query": {
    "bool": {
      "filter": [
        {
          "bool": {
            "filter": [
              {
                "script": {
                  "script": {
                    "source": "(params.v0 <= doc[params.v1].value.getDayOfWeek()) && (doc[params.v2].value.getDayOfWeek() <= params.v3)",
                    "lang": "painless",
                    "params": {
                      "v0": 0,
                      "v1": "timestamp",
                      "v2": "timestamp",
                      "v3": 2
                    }
                  },
                  "boost": 1
                }
              },
              {
                "script": {
                  "script": {
                    "source": "doc[params.v0].value.getHourOfDay() >= params.v1",
                    "lang": "painless",
                    "params": {
                      "v0": "timestamp",
                      "v1": 9
                    }
                  },
                  "boost": 1
                }
              }
            ],
            "adjust_pure_negative": true,
            "boost": 1
          }
        },
        {
          "script": {
            "script": {
              "source": "doc[params.v0].value.getHourOfDay() <= params.v1",
              "lang": "painless",
              "params": {
                "v0": "timestamp",
                "v1": 10
              }
            },
            "boost": 1
          }
        }
      ],
      "adjust_pure_negative": true,
      "boost": 1
    }
  },
  "_source": false,
  "stored_fields": "_none_",
  "docvalue_fields": [
    "timestamp",
    "FlightNum",
    "OriginCityName",
    "DestCityName",
    "DistanceMiles",
    "FlightTimeHour"
  ],
  "sort": [
    {
      "_script": {
        "script": {
          "source": "Math.round((doc[params.v0].value) / (doc[params.v1].value))",
          "lang": "painless",
          "params": {
            "v0": "DistanceMiles",
            "v1": "FlightTimeHour"
          }
        },
        "type": "number",
        "order": "desc"
      }
    },
    {
      "_script": {
        "script": {
          "source": "Math.round(doc[params.v0].value)",
          "lang": "painless",
          "params": {
            "v0": "DistanceMiles"
          }
        },
        "type": "number",
        "order": "desc"
      }
    }
  ]
}

Nos clauses WHERE et ORDER BY ont été converties en scripts Painless et utilisées dans les requêtes sort et script fournies par Elasticsearch. Ces scripts sont même paramétrés de manière à éviter les compilations et à exploiter la mise en cache du script.

Notons que, bien que la structure ci-dessus représente la traduction la plus optimale pour la déclaration SQL, elle ne représente pas la meilleure solution pour le problème dans son intégralité. En réalité, il faudrait chiffrer le jour de la semaine, l'heure de la journée et la vitesse sur le document au moment de l'index. Cela nous permettrait d'utiliser des requêtes de plages simples. Cette solution peut s'avérer légèrement plus performante que l'utilisation de scripts Painless pour résoudre ce problème précis. Certains de ces champs sont en fait déjà présents dans le document, pour cette raison. C'est un thème courant auquel les utilisateurs doivent prêter attention : nous pouvons compter sur l'implémentation Elasticsearch SQL pour obtenir une traduction optimale, cependant, elle n'utilise que les champs spécifiés dans la requête et ne fournit donc pas nécessairement la meilleure solution pour le problème dans son ensemble. Il est impératif de tenir compte des points forts de la plateforme sous-jacente pour obtenir une approche optimale. L'API _translate représente alors une première étape de ce processus.

À suivre

Dans l'article Introduction pratique à Elasticsearch – 2e partie, nous continuerons à utiliser l'API _translate afin d'illustrer des fonctions plus complexes d'Elasticsearch SQL. Nous nous intéresserons également aux limitations auxquelles les utilisateurs peuvent être confrontés dans la première version. Enfin, vous aurez un aperçu des projets à venir.

Indexation, codage et recherches : Elastic Site Search et Elastic App Search

$
0
0

Elastic propose des services de recherche auto-gérés, efficaces et extrêmement utiles. Cet article s'intéresse à deux de ces services : Elastic Site Search et Elastic App Search. Ces deux services partagent un même objectif : fournir des outils qui permettent de créer et de configurer des expériences de recherche pertinentes et utiles et nécessitant un temps de mise en œuvre minime. Bien que similaires, les services se distinguent par la méthode utilisée pour atteindre cet objectif.

Après avoir lu cet article, vous serez en mesure d'identifier la solution qui vous convient.

Le défi : la recherche profonde

Elastic Site Search et Elastic App Search utilisent tous deux Elasticsearch, un moteur de recherche RESTful, distribué, open source. Et ils en ont grandement besoin ! La recherche représente un problème de taille. Elasticsearch est un outil testé et éprouvé qui peut aider à corriger les problématiques les plus complexes.

Les problématiques de recherche peuvent être classées dans trois grandes catégories :

Ingestion. Vous avez des données. Vous voulez faire en sorte de pouvoir effectuer des recherches sur ces données. Le processus d'ingestion consiste à transformer un objet (une page Web, une réponse d'une API back-end) en document pouvant faire l'objet d'une recherche. Il s'agit du processus d'indexation : traduire des données dans un format optimal qui peut être traité par un moteur de recherche. Comment indexer vos données ? Hébergerez-vous l'infrastructure ? Que faire si les données sont sur l'Internet public ? Et si elles se trouvent sur un réseau intranet privé ?  

Ingestion simplifiée, flexibilité et surcharge minime liée au développement : voilà ce que vous recherchez.

Livraison des résultats. Votre moteur est rempli de documents qui peuvent tous faire l'objet d'une recherche. Quel résultat obtenez-vous en retour ? Les documents, bien évidemment, mais quels documents ? Combien ? Et à quoi ressemblent-ils ? Quelle expérience offriront-ils ? Qu'en est-il de la saisie automatique ? Allez-vous créer une expérience prédictive, qui anticipe les actions des utilisateurs ? Les résultats généreront-ils de la valeur ?

Vous voulez des résultats pertinents qui vous aident à concrétiser vos objectifs opérationnels, à améliorer le RSI et à offrir une expérience agréable aux utilisateurs.

Gestion. Après avoir conçu et développé une expérience de recherche, comment la gérerez-vous ? Il a fallu du temps au développeur pour la créer. Imaginez le temps nécessaire pour l'ajuster et l'améliorer. Les collaborateurs moins techniques peuvent-ils participer à l'optimisation continue ? Comment gérerez-vous les accès ? Recueillerez-vous des données analytiques et intégrerez-vous la recherche dans votre pipeline d'analyse ?

Vous voulez une recherche fonctionnelle dès aujourd'hui, utile et pratique pour tous les collaborateurs, qui peut être améliorée et modifiée avec un minimum de friction.

Deux solutions efficaces, mais différentes

Elastic App Search et Elastic Site Search peuvent répondre à des exigences de recherche profonde, pour une multitude de cas d'utilisation différents. Plateforme de commerce électronique, base de connaissances, société de médias, application de jeu, offre SaaS, plateforme mixte et bien d'autres… Quel que soit votre statut, ces deux solutions offrent une expérience de recherche de grande qualité.

Ces deux solutions sont entièrement gérées, bien documentées et proposent un accès à un support technique de premier plan. De plus, elles offrent les avantages suivants :

  • Pertinence de premier plan et réglage précis de la pertinence, grâce aux synonymes, pondérations, classements des résultats, etc.
  • Moteurs optimisés selon la langue afin d'améliorer la pertinence de la recherche dans 14 langues différentes.
  • Analyses profondes pour obtenir des informations précieuses concernant le processus de recherche des utilisateurs, ce qu'ils trouvent et ce qu'ils ne trouvent pas.
  • Indexation basée sur API et API de recherche profonde, avec paramètres de la requête (par exemple, recherche à facettes, filtrage, triage et boosting).

Comment choisir ? En réalité, c'est assez simple. Tout dépend de la manière dont vous souhaitez corriger les problèmes d'ingestion, de livraison des résultats et de gestion.

Vous voulez que vos pages Web soient automatiquement scannées et indexées et vous souhaitez utiliser des plug-ins ou des solutions prêts à l'emploi, bénéficier d'un tableau de bord fonctionnel et clair et appliquer des points de terminaison d'API de soutien ? Elastic Site Search est la solution qu'il vous faut.

Vous souhaitez incorporer les points de terminaison d'API de fonctionnalité et de recherche les plus profonds et les plus variés dans le code de votre application et régler précisément la pertinence, grâce à un tableau de bord moderne et accessible ? Elastic App Search est fait pour vous.

Elastic Site Search : le robot qu'il vous faut

Le robot d'indexation (Site Search Crawler) est au cœur des opérations d'Elastic Site Search et il fonctionne comme n'importe quel autre robot d'indexation. Google, DuckDuckGo, Bing… Tous les grands moteurs de recherche déploient un robot, un système sophistiqué, sur toutes les pages Web publiques. Les robots scannent et indexent ces pages Web, en recueillant des indicateurs, en capturant du contenu et en créant des documents, en même temps.

Site Search Crawler est hébergé et géré par Elastic. Il s'occupe de l'ingestion. Il est automatisé, répond intelligemment aux erreurs et ne nécessite aucune configuration continue. Ajoutez un domaine, choisissez de traiter ou non vos balises META, le fichier Robots.txt, les flux RSS/Atom ou le plan du site, puis laissez faire. Vos pages sont alors traduites en documents indexés, pouvant faire l'objet d'une recherche.

Prenons l'exemple d'une grosse base de connaissance publique, contenant des articles utiles. Lorsque vous saisissez l'adresse de votre site Web, Site Search Crawler analyse et indexe chaque page Web. Une fois indexées, vos pages sont organisées en champs, en fonction d'un schéma. Dès lors, les capacités de réglage précis de la pertinence d'une fonction, telles que la pondération, peuvent être appliquées.

Vous pouvez sélectionner un ensemble de champs spécifiques et paramétrer précisément la "pondération" de chaque champ. Par exemple, que faire si nous voulons associer les recherches des utilisateurs et le titre d'un document, sans que le corps du texte influence les résultats ? Et si vous souhaitez privilégier des résultats plus populaires, qui ont reçu plus de clics ?


Il faut alors sélectionner les champs de titre, corps et popularité, puis ajuster la pondération, sur une échelle de 1 à 10.

L'ingestion automatisée et les fonctions design sont séduisantes. Mais qu'en est-il de la création d'une expérience de recherche ? Comment Elastic Site Search peut-il m'aider à intégrer la fonction d'indexation puissante et le contrôle précis de la pertinence dans mon site Web ? Les options de design et personnalisation proposées par Elastic Site Search incluent aussi bien des solutions prêtes à l'emploi que des expériences de recherche dynamiques et personnalisables.

En installant l'extrait JavaScript Site Search et en créant un nouveau champ de recherche ou en modifiant le champ existant, vous pouvez utiliser la superposition Site Search prête à l'emploi et configurable pour afficher les résultats de la recherche.

Et pour les designs personnalisés ? Elastic Site Search contient un ensemble d'API à ces fins. Des clients internes prennent en charge Java, Node.js, Python et Ruby. Nous proposons des bibliothèques JavaScript populaires, ainsi que la saisie automatique, que vous pouvez utiliser comme point de départ pour créer des expériences personnalisées inventives :

C'est lorsque le robot peut effectuer les tâches les plus complexes qu'Elastic Site Search est le plus efficace. Le temps de mise en route est court, il peut être configuré selon vos préférences et il assure la mise à jour des résultats. Les plug-ins et API Elastic Site Search sont particulièrement utiles pour les compléments. Cependant, certaines fonctions sont uniquement disponibles dans le tableau de bord et n'ont pas de point de terminaison API correspondant.

Pour le contrôle programmatique intégral des points de terminaison API plus profonds, nous vous recommandons Elastic App Search.

Elastic App Search : centré sur l'API et ergonomique

Elastic App Search est axé sur les API. Des clients internes prennent en charge Ruby, JavaScript, Java, Node.js et Python. Elastic App Search n'utilise pas de robot.

Le développeur qui utilise les API Elastic App Search détermine comment générer les données d'objet qui seront indexées et comment les différents points de terminaison d'API seront appliqués. L'ingestion, la livraison des résultats et l'implémentation globale sont traitées par programmes. Que vous créiez une recherche dans un tableau de bord engageant, une application mobile ou Web complexe, un jeu ou une boutique, si vous pouvez le programmer, vous pouvez faire en sorte de pouvoir rechercher les objets.

Toutes les fonctionnalités du tableau de bord sont traduites dans des API précises et robustes, que vous pouvez écrire dans votre code d'application. Par exemple, Elastic Site Search et Elastic App Search permettent tous deux de créer un ensemble de synonymes. Les ensembles de synonymes sont particulièrement utiles. En effet, les chercheurs utilisent souvent un vocabulaire très différent. Une "voiture" pour une personne peut être un "véhicule" pour une autre, ou encore une "auto", une "bagnole" et bien d'autres.

Dans Elastic Site Search, vous pouvez appliquer des synonymes grâce au tableau de bord :

Vous pouvez procéder de la même manière dans le tableau de bord d'Elastic App Search…

… ou vous pouvez effectuer une requête en fonction d'un point de terminaison d'API bien documenté :

curl -X POST 'https://host-xxxxxx.api.swiftype.com/api/as/v1/engines/rent-a-car/synonyms' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer private-xxxxxxxxxxxxxxxxxxxx' \
-d '{
  "synonyms": ["car", "vehicle", "jalopy"]
}'

Les API d'Elastic App Search agissent bien plus en profondeur. Examinons, par exemple, comment un utilisateur qui crée une plateforme de commerce électronique peut consommer Analytics API Suite. La recherche commence par une expression libre. Les informations analytiques obtenues peuvent alors être profondes. La suite Analytics peut renvoyer des informations concernant les requêtes des utilisateurs et révéler les documents qui ont reçu des clics sur une période de temps ajustable.

curl -X POST 'https://host-2376rb.api.swiftype.com/api/as/v1/engines/sample-engine/analytics/queries' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer private-xxxxxxxxxxxxxxxxxxxxxxxx' \
-d '{
  "filters": {
    "date": {
      "from": "2018-06-15T12:00:00+00:00",
      "to": "2018-06-19T00:00:00+00:00"
    }
  }
}'

Par exemple, imaginons qu'un article vendu dans votre magasin devienne un succès instantané, du jour au lendemain. Les recherches et les clics pour un document augmentent alors de manière soudaine et frénétique. Il s'agit d'une opportunité commerciale importante. Que faire ?

Vous pouvez écrire une fonction qui consomme les API Analytics de manière à capturer les documents les plus populaires trouvés grâce à la recherche. Vous pouvez alors étendre cette fonction de manière à publier automatiquement ces documents, dans un volet proéminent et voyant, sur votre page d'accueil. La recherche des utilisateurs révèle la demande et les fonctions automatisées optimisent le processus en fonction de celle-ci, en temps réel. Bien que les données analytiques soient profondes et utiles, les capacités de recherche sont le point fort d'Elastic App Search.

Les champs de schéma dans un document peuvent être associés à l'une des quatre valeurs suivantes : texte, chiffre, date et géolocalisation. Elastic App Search offre une fonctionnalité profonde pour ces quatre types. La géolocalisation est de plus en plus populaire, et ce n'est pas un hasard. Une personne se trouve à un endroit précis ou se rend dans un nouvel endroit et elle souhaite savoir ce qui se trouve à proximité.

En exploitant les coordonnées géographiques de l'utilisateur, vous pouvez écrire son emplacement géographique dans les requêtes de recherche et booster la pertinence des résultats, en fonction du facteur de proximité.

Supposons que nous disposons d'une application mobile qui répertorie les restaurants bons pour la santé à travers le monde…

curl -X GET 'https://host-xxxxxx.api.swiftype.com/api/as/v1/engines/food-paradise/search' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer search-xxxxxxxxxxxxxxxxxxxxxx' \
-d '{
  "boosts": {
    "current_location": {
      "type": "proximity",
      "function": "linear",
      "center": "37.6213, -122.3790",
      "factor": 8
    }
  },
  "query": "sushi"
}'

Une requête pour des sushis multiplierait le score de pertinence d'un résultat par le facteur fourni, compte tenu de sa proximité par rapport au centre. Le centre est alors informé par les données de localisation provenant du chercheur. Ainsi, il est possible de proposer des résultats en fonction de l'espace et donc particulièrement pertinents.

Le regroupement avancé est un troisième cas possible utilisant la profondeur des API Elastic App Search. Imaginons que vous proposiez de la documentation. Lorsque vous changez de version de produit, vous devez également modifier la documentation et créer de nouvelles versions.

curl -X GET 'https://host-2376rb.api.swiftype.com/api/as/v1/engines/sample-engine/search' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer search-o5bk7qpaedd2xmcsavb1d8os' \
-d '{
  "query": "meta tags",
  "result_fields": {
    "url": {
      "raw": {}
    },
    "title": {
      "raw": {}
    },
    "description": {
      "raw": {}
    },
    "version": {
      "raw": {}
    }
  },
  "group": {
    "field": "url"
  }
}'

Si un utilisateur recherche une fonction spécifique, comment regrouperiez-vous les différentes versions du document dans lesquelles la fonction apparaît ? Une requête groupée permettrait de renvoyer un résultat de recherche unique pour toutes les pages des différentes versions d'un même sujet. Vous pouvez autoriser l'utilisateur à sélectionner la version qu'il souhaite à partir de ce résultat unique, au lieu de l'obliger à examiner des douzaines de résultats correspondant aux différentes versions.

Pour Elastic App Search, la fonction de recherche va bien au-delà d'une simple recherche de document pertinent, dans un champ de recherche, effectuée par un visiteur. La recherche devient une action fonctionnelle. Vous disposez de documents et votre code peut effectuer des recherches dans ces documents, de manière intelligente. Vous pouvez automatiser les actions en fonction de ce que vous souhaitez trouver sans avoir besoin du contexte global d'un champ de recherche.

À première vue, Elastic App Search semble davantage destiné aux utilisateurs "plus techniques". En effet, les API plairont à coup sûr aux développeurs souhaitant créer des recherches flexibles et pertinentes. Cependant, bien qu'Elastic App Search vous laisse créer et indexer l'interface, le tableau de bord et les fonctionnalités qu'il contient sont ergonomiques et adaptés à tous les niveaux d'expertise technique.

Résumé

Les solutions Elastic vous aident à satisfaire aux besoins de votre activité. Si vous souhaitez intégrer une expérience de recherche de qualité au sein de vos sites Web ou de vos applications, ne cherchez plus. Elastic Site Search ou Elastic App Search, à votre guise, est la solution qu'il vous faut.

Pour en savoir plus, consultez les pages des solutions Elastic Site Search ou Elastic App Search. Ces deux solutions proposent une version d'essai gratuite pendant 14 jours, sans obligation de fournir d'informations de carte de crédit.

Ce que vous respirez : analyser les données sur la qualité de l'air avec Elasticsearch sur Elastic Cloud

$
0
0

La Suite Elastic a largement fait ses preuves pour ce qui est de la collecte, de l'indexation et de la fourniture d'informations utiles à partir des données. Non seulement la gestion intégrée des informations est possible, mais, comme nous le verrons dans cette série de billets, elle peut même être agréable. Nous observerons la totalité du processus, des données brutes et vides de sens aux conclusions sur lesquelles les citadins d'aujourd'hui peuvent s'appuyer pour améliorer leur vie de tous les jours.

L'augmentation constante de la population dans les grandes villes du monde pose de nombreux problèmes, notamment la pollution de l'air, qui est sans doute l'un des problèmes ayant le plus d'impact sur la santé des habitants. Dans le cadre d'un effort pour informer les citoyens et prendre des mesures d'urgence, certaines institutions publiques ont déployé une multitude de capteurs pour récolter des informations sur la concentration de différents polluants dans la ville.

Ces mesures relevant de la responsabilité des institutions publiques, il n'est pas rare qu'elles soient publiées et mises à disposition de quiconque souhaite y accéder. C'est le cas des échantillons prélevés dans l'une des plus grandes villes européennes (pour ce qui est de la population, qui s'élève à plus de trois millions d'habitants) : Madrid.

Voyons comment Elasticsearch permet de faire parler facilement ces mesures chimiques obscures pour qu'elles révèlent les habitudes des Madrilènes.

Des fichiers CSV aux documents Elasticsearch

Nous devons d'abord observer la source des données. La mairie de Madrid dispose d'un portail de données ouvertes qui permet d'accéder à un jeu de données de mesures horaires de la qualité de l'air (en espagnol).

Sur ce portail, on peut obtenir un point de terminaison HTTP délivrant un fichier CSV actualisé toutes les heures et contenant les mesures du jour, jusqu'à la dernière heure écoulée.

Chaque ligne du fichier correspond à une paire de clés (Lieu, Produit chimique) et contient les mesures heure par heure pour la journée complète. Chaque valeur horaire est notée dans une colonne.

... STATION PRODUIT CHIMIQUE ... MOIS JOUR 0 h
Mesure
0 h
Valide ?
... 23 h
Mesure
23 h
Valide ?
Numéro (code) Code (code) Numéro Numéro Numéro "V" ou "F" (Vrai/Faux) Numéro "V" ou "F" (Vrai/Faux)

Des valeurs numériques sont attribuées aux champs tels que STATION et PRODUIT CHIMIQUE. Elles sont respectivement associées à des positions géographiques et à des formulations de composés chimiques. Cette association est indiquée dans des tableaux présents sur le site de source de données.

À l'inverse, les mesures horaires ("Mesure x h") et les marqueurs permettant de savoir si elles sont valides ("x h valide ?") sont indiqués par des valeurs brutes. Les unités sont indiquées dans un autre tableau de la spécification de source, tandis que l'indicateur de validation peut avoir la valeur "V" ou "F", signifiant "Verdadero" ou "Falso" ("Vrai" ou "Faux" en espagnol).

Les résultats des échantillonnages de produits chimiques sont représentés sous la forme de mesures dans l'espace et dans le temps. Cela vous rappelle quelque chose ? Eh oui : les séries temporelles d'événements spatiaux. Cela veut dire que les lignes ne correspondent pas à des événements. Au contraire, chaque ligne rassemble jusqu'à 24 événements, qui partagent tous le même lieu et le même composé chimique.

Si nous encodions chaque événement dans un document JSON, cela ressemblerait à l'exemple ci-dessous :

{
  "timestamp": 1532815200000,
  "location": {
    "lat": 40.4230897,
    "lon": -3.7160478
  },
  "measurement": {
    "value": 7,
    "chemical": "SO2",
    "unit": "μg/m^3"
  }
}

Par ailleurs, on pourrait facilement l'enrichir avec les limites de l'Organisation mondiale de la santé (OMS) en ajoutant simplement un champ supplémentaire dans le sous-document de mesures. La séparation de chaque ligne du fichier CSV en plusieurs documents JSON permet de mieux les comprendre, et de les ingérer encore plus facilement dans Elasticsearch.

{
  "timestamp": 1532815200000,
  "location": {
    "lat": 40.4230897,
    "lon": -3.7160478
  },
  "measurement": {
    "value": 7,
    "chemical": "SO2",
    "unit": "μg/m^3",
    "who_limit": 20
  }
}

L'ensemble de tous les documents correspondant à cette structure peut être décrit à l'aide d'un autre document JSON. Cela constitue un mapping dans Elasticsearch, que nous allons utiliser pour décrire la manière dont les documents sont stockés dans un index donné.

{
  "air_measurements": {
    "properties": {
      "timestamp": {
        "type": "date"
      },
      "location": {
        "type": "geo_point"
      },
      "measurement": {
        "properties": {
          "value": {
            "type": "double"
          },
          "who_limit": {
            "type": "double"
          },
          "chemical": {
            "type": "keyword"
          },
          "unit": {
            "type": "keyword"
          }
        }
      }
    }
  }
}

Déployez un cluster en quelques secondes sur Elastic Cloud

À ce stade, vous pouvez configurer un cluster Elasticsearch localement, ou commencer une période d'essai gratuit de 14 jours d'Elasticsearch Service sur Elastic Cloud. Découvrez comment déployer un nouveau cluster en quelques clics seulement. Pour cette démonstration, je vais utiliser Elastic Cloud.

Une fois connecté à Elastic Cloud, vous devrez déployer un nouveau cluster. Pour évaluer la taille du cluster pour ce cas d'utilisation, il faut savoir qu'un fichier JSON d'événements de mesure sur un mois prend environ 34 Mo d'espace disque (avant l'indexation) : nous pouvons donc utiliser le plus petit cluster proposé (1 Go de RAM, 24 Go d'espace disque). Ce petit cluster devrait être suffisant pour héberger nos données de départ. Elastic Cloud permet une montée en charge en toute simplicité. Si nécessaire, il sera toujours possible d'augmenter la taille plus tard, de modifier le nombre de zones de disponibilité ou d'apporter d'autres modifications à notre cluster.

En moins de temps qu'il n'en faut pour préparer un plat au micro-ondes, notre cluster Elasticsearch est prêt à recevoir et à indexer notre ensemble d'événements de mesure.

Extraire, transformer, charger

Personne ne voudrait devoir effectuer manuellement le passage du fichier CSV d'origine à un ensemble de documents JSON pour coder des mesures. (En fait, cela rappelle plutôt un châtiment sisyphéen.) C'est une tâche qu'il faut automatiser.

Pour cela, commençons par dresser un script d'automatisation pour aplatir le tableau CSV en documents JSON. Nous allons utiliser Scala pour cette étape :

  • c'est un langage qui permet de se concentrer sur le flux de données plutôt que sur le flux du programme. Il propose ainsi des opérations pour transformer facilement des collections de documents ;
  • il est fourni avec de nombreuses bibliothèques de manipulation JSON ;
  • grâce à Ammonite, il est possible d'écrire des scripts de manipulation de données en un clin d'œil.

L'extrait de script extractor.sc ci-dessous condense la logique de transformation :

  // Récupérer le fichier sur le portail de données ouvertes de la mairie de Madrid
  lazy val sourceLines = scala.io.Source.fromURL(uri).getLines().toList
  sourceLines.headOption foreach { head =>
    /* La première ligne du fichier CSV contient les noms des étiquettes, il est facile
       de calculer une carte à partir des étiquettes aux positions pour rendre le reste du code 
       plus lisible. */
    lazy val label2pos = head.split(";").zipWithIndex.toMap
    // Pour chaque ligne, produire facilement plusieurs événements avec flatMap
    lazy val entries = sourceLines.tail flatMap { rawEntry =>
      val positionalEntry = rawEntry.split(";").toVector
      val entry = label2pos.mapValues(positionalEntry)
      /* Les 8 premières positions sont utilisées pour extraire les informations communes aux
       24 mesures horaires. */
      val stationId = entry("ESTACION").toInt
      val ChemicalEntry(chemical, unit, limit) = chemsTable(entry("MAGNITUD").toInt)
      // Les valeurs de mesure sont contenues dans les 24 dernières colonnes
      positionalEntry.drop(8).toList.grouped(2).zipWithIndex collect {
        case (List(value, "V"), hour) =>
          val timestamp = new DateTime(
            entry("ANO").toInt,
            entry("MES").toInt,
            entry("DIA").toInt,
            hour, 0, 0
          )
          // Et voilà : l'événement généré comme classe de cas.
          Entry(
            timestamp,
            location = locations(stationId),
            measurement = Measurement(value.toDouble, chemical, unit, limit)
          )
      }
    }
  1. Récupérer le dernier rapport horaire publié, qui contient les mesures réalisées jusqu'à l'heure qui vient de s'écouler.
  2. Pour chaque ligne :
    1. Extraire les champs communs à tous les événements générés à partir de la ligne (ID de la station et produit chimique mesuré).
    2. Extraire les mesures correspondant à celles réalisées actuellement pendant la journée (24 max). Filtrer les valeurs qui ne sont pas marquées comme des mesures valides.
    3. Pour chacune d'entre elles, générer l'horodatage de la mesure en associant la date de la ligne et le numéro de la colonne de mesure. Combiner les champs communs de la ligne, l'horodatage et la valeur enregistrée en un seul objet d'événement (Entrée).

Le script continue à sérialiser les objets Entrée comme documents JSON et à les imprimer dans une succession de JSON indépendants.

Extractor.sc peut recevoir des arguments lui ordonnant de récupérer les données pour les transformer à partir d'autres sources, comme des fichiers locaux, ou d'ajouter des actions requises par l'API Bulk d'Elasticsearch lors du chargement de fichiers de journée entière en une seule fois.

extracteur
  --uri        String (default http://www.mambiente.munimadrid.es/opendata/horario.csv)
  --bulkIndex
  --bulkType

Envoyer des données à Elasticsearch

Nous avons maintenant un script qui se charge de traduire les fichiers CSV en listes de documents. Comment les indexer ? C'est simple : il suffit de passer quelques appels à notre cluster.

Création d'index

Pour commencer : il faut créer l'index. Nous avons déjà créé un JSON pour nos mappings de documents et nous pouvons l'intégrer à notre définition d'index : ./payloads/index_creation.json

{
    "settings" : {
        "number_of_shards" : 1
    },
    "mappings" : {
        "air_measurements" : {
            "properties" : {
                "timestamp": { "type": "date" },
                "location" : { "type" : "geo_point" },
                "measurement": {
                    "properties": {
                        "value": { "type": "double" },
                        "who_limit": { "type": "double" },
                        "chemical": { "type": "keyword" },
                        "unit": { "type": "keyword" }
                    }
                }
            }
        }
    }
}

Transférons-le au point de terminaison de création d'index de notre cluster :

curl -u "$ESUSER:$ESPASS" -X PUT -H 'Content-type: application/json' \
     "$ESHOST/airquality" \
     -d "@./payloads/index_creation.json"

Nous obtenons alors l'index airquality (qualité de l'air).

Chargement groupé (bulk)

L'API Bulk est la méthode la plus rapide pour charger toutes ces données dans Elasticsearch. Cette méthode consiste à établir une connexion, à charger un ensemble de documents, et à terminer l'opération. Pour charger les documents un par un, il faudrait établir une connexion TCP, envoyer le document, recevoir une confirmation, et fermer la connexion pour chaque mesure de chaque ligne du fichier CSV. C'est beaucoup trop inefficace.

Comme indiqué par la documentation de l'API Bulk, vous devez charger un fichier NDJSON avec deux lignes par document :

  • une avec l'action à effectuer dans Elasticsearch
  • et l'autre avec le document concerné par cette action. L'action qui nous intéresse est l'indexation.

L'outil extractor.sc est donc fourni avec deux options supplémentaires permettant de contrôler l'action d'indexation et son apparence juste avant chaque document :

  • bulkIndex INDEX : si cette étape est passée, le script d'extraction passe à chaque document par le biais d'une action index dans INDEX.
  • bulkType TYPE : si cette étape passe après bulkIndex, termine l'action d'indexation avec le type auquel le document doit correspondre.
    /* L'ensemble d'événements est ensuite sérialisé et imprimé dans la sortie standard.
       Cela permet de les utiliser comme fichier ndjson.
     */
    val asJsonStrings = entries flatMap { (entry: Entry) =>
      Some(bulkIndex).filter(_.nonEmpty).toList.map { index =>
        val entryId = {
          import entry._
          val id = s"${timestamp}_${location}_${measurement.chemical}"
          java.util.Base64.getEncoder.encodeToString(id.getBytes)
        }
        /* En option, il est aussi possible de sérialiser les actions groupées pour améliorer la performance 
           du transfert de données. */
        BulkIndexAction(
          BulkIndexActionInfo(
            _index = index,
            _id = entryId,
            _type = Some(bulkType).filter(_.nonEmpty)
          )
        ).asJson.noSpaces
      } :+ entry.asJson.noSpaces
    }
    asJsonStrings.foreach(println)

Cela permet de générer notre fichier NDJSON massif contenant toutes les entrées de la journée :

time ./extractor.sc --bulkIndex airquality --bulkType air_measurements > today_bulk.ndjson

En 1,46 seconde, il a généré le fichier que nous pouvons envoyer à l'API Bulk comme suit :

time curl -u $ESUSER:$ESPASS -X POST -H 'Content-type: application/x-ndjson' \
     $ESHOST/_bulk \
     --data-binary "@today_bulk.ndjson" | jq '.'

Il a fallu 0,98 seconde pour terminer la requête de chargement.

Avec cette méthode, le temps total de l'opération a été de 2,44 secondes (1,46 seconde à partir de la récupération et de la transformation de données et 0,98 seconde à partir de la requête de chargement groupé) : c'est 182 fois plus rapide qu'en chargeant les documents un par un. Vous avez bien lu : 2,44 secondes contre 7 minutes et 26 secondes.

La conclusion importante est la suivante : utilisez l'API bulk pour les processus qui indexent de grandes quantités de documents.

Des données aux informations

Toutes nos félicitations pour ce (très) bon choix. Nous avons atteint le point où les mesures de l'air de la ville sont indexées dans Elasticsearch. Cela signifie, par exemple, que nous pouvons facilement rechercher et récupérer des données, d'une manière beaucoup plus simple que s'il fallait télécharger, extraire et rechercher manuellement les informations qui nous intéressent.

Prenez ce cas d'étude, par exemple. Si, après avoir admiré Les Ménines, nous devions choisir entre :

  • profiter du beau temps à Madrid, et
  • continuer à profiter du musée du Prado

nous pourrions demander à Elasticsearch de nous conseiller le meilleur choix pour notre santé, en lui demandant de nous indiquer la dernière mesure de NO2 effectuée à la station météorologique la plus proche, dans un rayon de 1 km : ./es/payloads/search_geo_query.json

{
  "size": "1",
  "sort": [
    {
      "timestamp": {
        "order": "desc"
      }
    },
    {
      "_geo_distance": {
        "location": {
          "lat": 40.4142923,
          "lon": -3.6912903
        },
        "order": "asc",
        "unit": "km",
        "distance_type": "plane"
      }
    }
  ],
  "query": {
    "bool": {
      "must": {
        "match": {
          "measurement.chemical": "NO2"
        }
      },
      "filter": {
        "geo_distance": {
          "distance": "1km",
          "location": {
            "lat": 40.4142923,
            "lon": -3.6912903
          }
        }
      }
    }
  }
}
curl -H "Content-type: application/json" -X GET -u $ESUSER:$ESPASS $ESHOST/airquality/_search -d  "@./es/payloads/search_geo_query.json"

Et recevoir la réponse suivante :

{
  "took": 4,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 4248,
    "max_score": null,
    "hits": [
      {
        "_index": "airquality",
        "_type": "air_measurements",
        "_id": "okzC5mQBiAHT98-ka_Yh",
        "_score": null,
        "_source": {
          "timestamp": 1532872800000,
          "location": {
            "lat": 40.4148374,
            "lon": -3.6867532
          },
          "measurement": {
            "value": 5,
            "chemical": "NO2",
            "unit": "μg/m^3",
            "who_limit": 200
          }
        },
        "sort": [
          1532872800000,
          0.3888672868035024
        ]
      }
    ]
  }
}

Ce qui nous indique que la station météorologique du Retiro rapporte un taux de 5 µg/m^3 de NO2. C'est un bon résultat, si l'on considère que la limite définie par l'OMS est de 200 µg/m^3. Profitons-en pour aller déguster quelques tapas !

air_01.jpg

Pour être honnête, je n'ai jamais vu personne sortir son ordinateur portable pour saisir des commandes cURL dans un musée. Mais ces requêtes sont si faciles à coder dans pratiquement tous les langages de programmation qu'il est possible de fournir des applications en frontend en quelques jours. En effet, nous avons déjà un backend analytique complet avec notre index d'informations.

Voir l'invisible avec Kibana

Et si nous n'avions même pas besoin de composer l'application ? Et si, dans notre cluster actuel, nous pouvions simplement commencer à explorer les données en cliquant pour obtenir des informations pertinentes ? C'est tout à fait possible avec Kibana. Nous pouvons accéder au management de cluster sur cloud.elastic.co et cliquer sur le lien pour accéder à notre déploiement Kibana :

air_02.png

Kibana permet de créer des visualisations et des tableaux de bord complets à partir des documents indexés dans Elasticsearch.

Les modèles d'indexation sont notre méthode pour enregistrer les index dans Kibana afin qu'ils puissent être utilisés par les visualisations pour extraire les données. Avant de créer des graphiques pour notre index airquality (qualité de l'air), la première étape est donc de déclarer cet index.

air_03.png

Après la création, nous pouvons ajouter notre première visualisation. Commençons par quelque chose de simple : un graphique de l'évolution des niveaux de concentrations moyennes d'un produit chimique dans la ville au fil du temps. Par exemple, le NO2 :

Tout d'abord, il faut créer un graphique linéaire dans lequel l'axe Y représente une agrégation moyenne pour le champ measurement.value (valeur.mesure) sur les intervalles horaires représentés sur l'axe X. Pour sélectionner le produit chimique qui nous intéresse, nous pouvons utiliser la barre de recherche de Kibana, qui permet de filtrer rapidement les mesures de NO2. De plus, en activant la fonction de saisie semi-automatique, nous pouvons obtenir des suggestions pour nous guider tout au long du processus de définition de la recherche.

air_04.png

Enfin, avec Time Range (Plage horaire), nous pouvons choisir la période des données visualisées.

air_05.png

Des résultats immédiats en quelques clics :

air_06.png

Les cartes de coordonnées sont l'un des graphiques les plus utiles à utiliser pour ce jeu de données. Comme chaque mesure contient les coordonnées de la station ayant effectué cette mesure, nous pouvons représenter les points chauds de la pollution. C'est-à-dire, passer d'une moyenne des entrées spatiales sur les intervalles de temps à une moyenne des entrées temporelles dans des emplacements spatiaux. Les intervalles sont désormais des agrégations Geohash par lieu, le champ contenant le point de mesure.

air_07.jpg

En sélectionnant la plage de la dernière heure écoulée, nous pouvons nous faire une idée des zones les plus propres à visiter en ce moment. Les plages annuelles nous indiquent les zones les plus propres en moyenne et peuvent nous aider, par exemple, à prendre une décision sur l'endroit où acheter une maison pour vivre plus sainement.

Champs scriptés

Comme nos documents suivent les niveaux recommandés par l'OMS pour certains produits chimiques, nous pouvons déterminer à quel point l'air est sain ou non. Par exemple, en utilisant une visualisation de jauge sur une proportion de la concentration mesurée et de la limite établie par l'OMS. Mais cette division n'a pas été effectuée lorsque nous avons chargé les données. Ce n'est pas un problème, car il est toujours possible de générer de nouveaux champs à partir des champs indexés à l'aide du langage de script Painless, qu'une personne ayant déjà utilisé Java n'aura aucun problème à comprendre et à utiliser (depuis Kibana 6.4, il est également possible d'obtenir un aperçu des résultats fournis par le script Painless).

air_08.gif

Nous pouvons ensuite les utiliser dans nos visualisations, comme s'il s'agissait de champs indexés ordinaires :

air_09.png

Regardez : de simples règles permettent d'obtenir des visualisations riches dans Kibana. Dans l'exemple ci-dessus, nous avons :

  • filtré les documents, en sélectionnant uniquement ceux pour lesquels il existe des limites définies par l'OMS ;
  • utilisé les fonctions Split Groups (Groupes divisés) et Terms Aggregation (Agrégation de termes) sur le champ measurement.chemical.

Cela a permis de générer un graphique de jauge de chaque produit chimique pour lesquels il existe des limites OMS connues.

Comprendre la pollution à Madrid

Exploitez les visualisations Kibana pour élaborer des tableaux de bord qui regroupent les visualisations – la clé pour interpréter et comprendre l'état d'un système en temps réel. Dans ce cas, le système est la composition de l'atmosphère, et ses interactions avec les activités humaines.

air_10.jpg

Dans le tableau de bord ci-dessus, un utilisateur peut choisir n'importe quel produit chimique et n'importe quelle plage, et se faire une idée assez précise des endroits et du degré de pollution de l'atmosphère par ce composé. Essayez par vous-même ! (identifiant : test, mot de passe : madrid_air).

Vous pouvez aussi vous faire une idée générale de la qualité de l'air à Madrid en utilisant le même identifiant et le même mot de passe.

air_11.jpg

Comment ces tableaux de bord peuvent-ils aider ? Observons une semaine au hasard au mois de mars (du 12 mars au 18 mars) :

air_12.png

Ces pics de NOx (un composé produit par la combustion dans les moteurs diesel) nous révèlent-ils quelque chose sur les habitudes des Madrilènes ? Oui. Des habitudes que l'on observe deux fois par jour...

air_13.png

Une fois vers 8 h CEST, et une fois vers 21 h CEST. Ce que l'on observe, c'est l'augmentation de l'utilisation des voitures diesel pour les déplacements dans la ville, lorsque les travailleurs se rendent sur leur lieu de travail. Ensuite, presque personne n'utilise ces véhicules pendant les heures d'ouverture des bureaux, et l'on observe un autre pic de fumées lorsque les travailleurs ont terminé leur journée et rentrent chez eux.

Il est également intéressant de constater que la concentration en O3 augmente lorsque celle en NOx diminue. L'ozone (O3) est un produit dérivé des réactions entre les NOx et les composés organiques en présence de la lumière du soleil : on peut donc s'attendre à une corrélation entre les NOx et l'O3.

air_14.png

air_15.png

On peut également observer que la situation générale s'améliore le week-end :

air_16.png

Observez comment le parc El Retiro (un immense espace vert au cœur de la ville) est entouré de points chauds d'émission de NO2, tout en étant une zone d'émissions plus faibles grâce à la végétation importante et à l'absence de trafic :

Prise en main de Canvas dans Kibana

$
0
0
Mise à jour du 21 décembre 2018 : Canvas est intégré à Kibana 6.5+ : vous n'avez plus besoin de l'installer séparément.

Exit la mise à jour manuelle des tableaux et présentations.

Canvas est un outil de présentation intégré à Kibana. Il vous permet de créer des présentations et des diapositives irréprochables, qui extraient directement les données actives d'Elasticsearch. Résultat ? Vous pouvez dire adieu aux mises à jour manuelles de vos présentations : vos visuels, les éléments de vos diagrammes et vos graphiques sont mis à jour en quasi temps réel. Mais Canvas a plus d'un tour dans son sac et ne se limite pas au cas d'utilisation présenté dans cet article.

Envie d'en savoir plus ? Regardez cette vidéo du créateur de Canvas, Rashid Khan, qui nous parle de sa vision de Canvas à l'occasion de l'événement Elastic{ON} 2018.

Pourquoi utiliser Canvas

Créer une présentation prend du temps. Surtout lorsque les données présentées doivent être manipulées pour que votre audience les trouve plus digestes que du JSON. Intégrer à une présentation la capture d'écran d'un graphique à barres ? A priori, rien de plus facile. Pourtant, même des tâches aussi simples peuvent très vite devenir fastidieuses si vous devez régulièrement mettre à jour les données de vos graphiques. Et vous êtes souvent obligé d'exporter vos données, de les nettoyer, de les coller dans votre présentation, d'ajouter des images, et j'en passe. Un processus qui peut très rapidement devenir aussi pénible que laborieux.

Sans compter que les constatations ci-dessus n'effleurent même pas de loin la possibilité d'ajuster vos données à chaud (c'est-à-dire en direct lors de la présentation). Imaginez que lors d'une présentation, une diapositive montre les résultats trimestriels d'une entreprise et que le PDG demande à voir les résultats mensuels De deux choses l'une : soit un salarié assez prévoyant a pensé à préparer cette diapositive à l'avance, soit le PDG devra se contenter d'un : "Heu... Je vous la transmettrai après la réunion".

Avec Canvas, finies les fastidieuses et incessantes mises à jour des visualisations. Mieux encore, Canvas intègre des outils et des filtres puissants, qui vous permettent d'ajuster vos données à chaud, pour des présentations flexibles, dynamiques et intéressantes.

Produits requis et installation de Canvas

Produits requis

Pour vous lancer avec Canvas, vous aurez besoin des produits suivants :

  • Elasticsearch pour le stockage et l'indexation des données
  • Kibana pour l'IU

Si vous n'avez pas déjà installé ces produits ou que vous ne les avez encore jamais utilisés, consultez la page Getting started with the Elastic Stack pour en savoir plus. Vous pouvez aussi jeter un œil à ce référentiel Github de déploiement rapide, qui vous aidera à déployer Elasticsearch et Kibana sur une machine Ubuntu en quelques minutes.

Installation de Canvas

À compter de la version 6.5, Canvas fait partie de la distribution par défaut de Kibana. Pour faire vos premier pas avec Canvas, il vous suffit donc d'installer Elasticsearch et Kibana. (Remarque : Nous avons mis à jour cette section en décembre 2018 pour y intégrer les instructions relatives aux versions 6.5 et suivantes)

Sources de données

Pour les besoins de ce tutoriel, nous utiliserons Metricbeat comme source de données actives, car il s'agit d'une source rapide, simple à utiliser et relativement prévisible.

1. Télécharger et décompresser Metricbeat

Rendez-vous sur la page de téléchargement de Metricbeat pour y télécharger le binaire adapté à votre système d'exploitation. Une fois le téléchargement terminé, décompressez le zip. Différents fichiers s'affichent dans le répertoire Metricbeat.

2. Configurer Metricbeat

Vous devez ensuite configurer Metricbeat, afin qu'il envoie des données vers votre instance Elasticsearch. Ouvrez metricbeat.yml avec votre éditeur de code préféré. Si votre instance Elasticsearch est...

  1. locale : la configuration par défaut est déjà paramétrée pour envoyer des données vers Elasticsearch (exécuté sur http://localhost:9200). Aucune modification n'est nécessaire. Si vous devez quand-même apporter des modifications, suivez le processus décrit à l'étape suivante.
  2. distante : accédez à la section Elasticsearch output (Sortie Elasticsearch) et modifiez la sortie, afin qu'elle pointe vers votre instance :
    setup.kibana:
      host: "url-to-my-kibana-instance:5601"
    ...
    ...
    output.elasticsearch:
      hosts: ["url-to-my-elasticsearch-instance:9200"]
    	

3. Exécuter Metricbeat

Enregistrez le fichier metricbeat.yml. Exécutez-le ensuite avec l'option -setup, qui demandera au système de charger les tableaux de bord par défaut vers Kibana.

./metricbeat -c metricbeat.yml -setup -e

CONSEIL : si vous ajoutez l'option -e lorsque vous exécutez Metricbeat, vous pouvez afficher les logs en cours d'exécution.

Comment créer votre première présentation Canvas

Dans Canvas, les projets sont appelés "présentations". Ces dernières sont analogues aux présentations habituelles et peuvent comporter plusieurs pages.

  1. Une fois que vous avez installé Canvas et configuré Metricbeat, accédez à votre instance Kibana et sélectionnez Canvas dans le volet de gauche, comme illustré ci-dessous.
  2. Cliquez sur "Create workpad" (Créer une présentation).
  3. Nommez votre présentation et donnez-lui un nom unique.

image1.gif

Apparence de l'interface Canvas


canvas.jpg

  1. Boutons
    • Data Refresh Interval (Intervalle d'actualisation des données) - permet de définir le délai après lequel Canvas recherche des mises à jour dans Elasticsearch.
    • Toggle Fullscreen (Activer/Désactiver le plein écran) - permet d'activer ou de désactiver le "mode Présentation".
    • Export Workpad (Exporter la présentation) - permet d'exporter la présentation au format PDF.
    • Toggle Editing Sidebar (Afficher/Masquer le volet d'édition) - permet de masquer la section 6 (image ci-dessus).
  2. Add Element (Ajouter un élément) - permet d'afficher le sélecteur d'éléments, afin d'intégrer à votre présentation Canvas des tableaux, des graphes, des images et plus encore.
  3. Element Layer Control (Contrôle de la couche d'éléments) - vous permet de choisir les éléments à mettre au premier plan, de masquer des éléments et de créer des compositions.
  4. Duplicate an Element (Dupliquer un élément) - Remarque : Vous devez sélectionner un élément pour utiliser cette option.
  5. Canvas Workpad (Présentation Canvas) - principale zone de travail.
  6. Editing Controls (Commandes d'édition) - panneau contextuel permettant de modifier les propriétés des éléments sélectionnés (polices, couleurs, feuilles de style personnalisées, etc.).
  7. Canvas Main Menu (Menu principal Canvas) - permet de passer d'une présentation à une autre, de cloner, d'importer, d'exporter ou de supprimer des présentations.
  8. Page Control (Contrôle de page)  - permet de créer des pages ou de passer d'une page existante à une autre.
  9. Element Code Editor (Éditeur de code d'élément) - pour coder tout ce que vous voulez à la moindre occasion. Un outil qui vous offre une flexibilité totale pour vos requêtes, votre mise en forme et vos pipelines. (On vous en dit plus dans un prochain article.)

Créer vos premiers éléments dans Canvas

Types d'éléments

  1. Cliquez sur "Add element" (Ajouter un élément)
  2. Canvas propose un grand nombre d'éléments intégrés que vous pouvez exploiter immédiatement. Sélectionnez l'élément "Horizontal Bar Chart" (Graphique à barres horizontal).
    CONSEIL : lorsque vous créez un élément pour la première fois, celui-ci intègre des données de démonstration, afin que vous puissiez vous lancer sans attendre.
  3. Dans le panneau de droite, sélectionnez l'onglet "Data" (Données).
  4. Cliquez sur "Change your data source" (Changer de source de données)
  5. Sélectionnez "Elasticsearch Raw Documents" (Documents bruts Elasticsearch)

    image5_small.png Les différentes sources de données :

    • Données de démonstration : il s'agit d'un exemple de petit ensemble de données qui est intégré à votre nouvel élément Canvas lorsque vous en créez un pour la première fois. Il sert principalement à essayer l'outil.
    • Elasticsearch Raw Documents (Documents bruts Elasticsearch) : vous permet d'accéder à vos données brutes dans Elasticsearch.
    • Timelion : Timelion est spécialement conçu pour vous permettre de traiter vos données temporelles dans Elasticsearch.
    • Elasticsearch SQL : vous permet d'accéder à vos données hébergées dans Elasticsearch via une fonctionnalité de syntaxe SQL, de manière similaire à l'option "Raw Documents" (Documents bruts).
  6. Sélectionnez l'index metricbeat-* dans la liste déroulante.
  7. En bas du volet latéral, cliquez sur "Save" (Enregistrer).
  8. Revenez en haut du volet latéral et sélectionnez l'onglet "Display" (Affichage).
  9. Nous allons déterminer la durée des boucles en fonction du nom de l'ensemble d'indicateurs (metricset.name). Nous définissons donc les axes du graphique à barres comme suit :
    • X-Axis (Axe X)
      • Mesure : Value (Valeur)
      • Champ : metricset.rtt
    • Y-Axis (Axe Y)
      • Mesure : Value (Valeur)
      • Champ : metricset.name
    • Color (Couleur)
      • Mesure : Value (Valeur)
      • Champ : metricset.name

Ajoutons un autre élément…

  1. Cliquez sur "Add element" (Ajouter un élément)
  2. Sélectionnez l'élément "Metric" (Indicateur)
  3. Faites-le glisser pour le déposer à l'emplacement où il s'affiche le mieux.
  4. Dans le panneau de droite, sélectionnez l'onglet "Data" (Données).
  5. Cette fois, sélectionnez "Elasticsearch SQL"
  6. Dans l'éditeur de requête SQL, saisissez :
    SELECT COUNT(*) FROM metricbeat*
  7. Cliquez sur "Save" (Enregistrer)
  8. L'élément affiche maintenant un avertissement, car il n'extrait plus aucune donnée.
  9. En haut du volet latéral, sélectionnez l'onglet "Display" (Affichage).
  10. Dans la section "Number" (Nombre), définissez les valeurs suivantes :
    • Mesure : Value (Valeur)
    • Champ : COUNT_1
  11. Modifiez le champ "Label" (Libellé) de cet élément et saisissez "Entries" (Entrées), puisque ce champ doit afficher le nombre d'entrées Elasticsearch.
  12. Aussi longtemps que vous exécutez Metricbeat, vous voyez ce nombre se mettre à jour en direct. En haut à gauche de l'écran, cliquez sur "Refresh" (Actualiser).
  13. Définissez l'intervalle d'actualisation sur 5 secondes.
  14. Et voilà ! Votre présentation se met à jour avec les données actives.

image4.gif

Exit les mises à jour manuelles de vos présentations.

Liens vers d'autres ressources utiles

C'est aussi simple que ça. Vous venez de créer votre première présentation Canvas et d'y intégrer des données actives via Metricbeat. N'hésitez pas à y ajouter d'autres éléments et à essayer les différentes fonctionnalités de Canvas.

Nous vous proposons aussi de consulter d'autres tutoriels Canvas ici :


Image de la bannière : "By hand" d'Eric Kilby, utilisée sous licence Creative Commons CC BY/recadrée depuis l'original

Lancement de la Suite Elastic 6.6.0

Surveiller les opérations de sécurité aéroportuaire avec Canvas et Elasticsearch

$
0
0

Chez Crimson Macaw, nous avons récemment mené à bien un projet passionnant pour le Manchester Airport Group (MAG). Notre mission consistait à créer et à implémenter des tableaux de bord en temps réel dédiés aux opérations de sécurité aéroportuaire de l'aéroport de Stansted.

L'objectif : permettre à l'équipe de la salle de contrôle et au personnel de sécurité d'avoir une meilleure visibilité sur le flux des passagers et les performances de sécurité, afin qu'ils puissent prendre des décisions rapidement en s'appuyant sur des données en temps réel. Les données devaient être ingérées depuis différents systèmes locaux et sources de données externes, pour ensuite être visualisées sur un certain nombre de grands écrans.

Les défis liés à l'ingestion des données

Après avoir choisi Elasticsearch comme couche de stockage des données, nous devions définir les données à ingérer et la méthode d'ingestion à employer. Les informations provenaient d'un grand nombre de sources différentes : systèmes locaux de bases de données, sources de données associées à des API externes, ou encore fichiers fréquemment stockés dans des buckets AWS S3. Citons par exemple les données du National Rail (services ferroviaires britanniques assurant le transport de voyageurs), que nous avons chargées dans Elasticsearch via les interfaces du protocole textuel STOMP (Streaming Text Oriented Messaging Protocol).

En soi, cela comportait déjà quelques défis à relever :

  • L'interrogation des données stockées dans des bases de données devait se faire à intervalles inférieurs à 1 minute.
  • Les données reçues de STOMP étaient compressées au format gzip.

Interroger les bases de données à intervalles plus rapprochés qu'une fois par minute

Pour répondre au premier problème, nous avons appliqué un simple correctif au plug-in logstash-input-jdbc existant. Avant application du correctif, les planifications ne pouvaient être exprimées qu'au format cron. Le processus utilisait un planificateur de tâches appelé rufus-scheduler, qui permettait de fournir des expressions de planification au format cron ou en nombre de secondes. L'unique modification apportée consistait en une ligne de code spécifiant l'utilisation de la méthode de répétition ("repeat") en lieu et place de cron :

if @schedule @scheduler = Rufus::Scheduler.new(:max_work_threads => 1) @scheduler.cron @schedule do @scheduler.repeat @schedule do execute_query(queue) end

Pour employer cette méthode, notre correctif est disponible sur GitHub.

Traiter les messages compressés au format gzip

Pour traiter les messages compressés provenant des interfaces STOMP, nous devions les décompresser en vue de filtrer les données via Logstash. Bien qu'il existe un codec permettant de lire les lignes de données contenues dans un message compressé au format gzip, les messages de notre cas d'utilisation étaient des fichiers XML à plusieurs lignes. Pour contourner ce problème, nous avons créé notre propre plug-in, à savoir logstash-codec-gzip, que nous avons placé sur GitHub.

Visualiser les données via Canvas

Au départ, nous utilisions Kibana pour visualiser les données disponibles dans le moteur de recherche Elasticsearch hébergé sur Elastic Cloud, mais nous ne parvenions pas à faire exactement ce que nous voulions. Nous avions besoin d'un niveau de contrôle plus granulaire. Le hasard faisant bien fait les choses, nous avons découvert Canvas de façon totalement fortuite à Londres en mai 2018, à l'occasion de l'AWS Summit auquel je participais en compagnie du directeur de la BI du Manchester Airport Group. L'équipe du stand Elastic avec laquelle nous avions discuté avait mentionné Canvas et nous avait expliqué que cet outil serait probablement plus adapté à nos objectifs.

"Nous avons du mal à visualiser nos données dans Kibana, car il ne nous permet pas de contrôler les choses de manière aussi détaillée qu'on le voudrait."
"Avez-vous essayé Canvas ?"
"Non, qu'est-ce que c'est ?"
"Notre nouvel outil de visualisation. Pour l'instant, il est encore en version préliminaire, mais il semblerait que ce soit l'outil qu'il vous faut."

Installation de Canvas et premières impressions

Canvas était disponible en tant que plug-in Kibana ; nous l'avons installé comme on le ferait pour n'importe quel autre plug-in Kibana. Étant donné que dans sa version préliminaire, Canvas n'était pas disponible sur Elastic Cloud, nous avons hébergé Kibana dans l'environnement AWS du Manchester Airport Group. Le tout étant intégralement scripté via Terraform.

Pour contrôler la visualisation de chaque élément, Canvas propose un langage d'expression aussi simple que sympathique. Il me fait penser aux scripts shell, où la sortie d'une commande est redirigée vers la commande suivante, et où on obtient des sous-expressions en déclarant des expressions entre accolades.

Première conception du tableau de bord dédié au hub sécurité, basée sur les wireframes utilisateur (vous verrez plus bas que le tableau de bord que nous utilisons actuellement a beaucoup changé).

Les visualisations commençaient à prendre forme, les données alimentaient les différents espaces réservés, mais l'apparence laissait encore à désirer, ce que résumait parfaitement la demande suivante.

"Une présentation plus sympa, c'est possible ?"

Il était temps d'aller chercher l'inspiration sur le web. Nous avons donc surfé sur des plateformes comme Pinterest et Dribbble, en quête de "tableaux de bord innovants", et nous y avons trouvé quelques approches intéressantes en matière de conception. C'est alors que nous avons changé de cap.

Sas de sécurité

Ce tableau de bord présente des informations sur les tendances : le nombre de passagers entrant dans la zone de contrôles de sécurité aéroportuaire s'affiche par rapport aux prévisions relatives à l'arrivée des passagers et aux temps d'attente prévus dans les files en différents points.

Trains à l'arrivée

Un très grand nombre de passagers empruntent le train pour se rendre à l'aéroport de Stansted. En cas de retard, cela peut avoir des répercussions considérables sur le nombre de passagers présents dans la zone de contrôles de sécurité aéroportuaire. Un seul train transporte à lui seul des centaines de passagers, et en cas de problème sur les voies, une fois ceux-ci résolus, il n'est pas rare que plusieurs trains arrivent quasiment au même moment.

Outre le tableau habituel qui répertorie les informations relatives aux trains, le tableau de bord affiche les heures d'arrivée des trains sur une chronologie. On constate un très net changement par rapport à la première itération et nos premiers essais de Canvas.


Elasticsearch Service : tarifs applicables au transfert de données et au stockage des sauvegardes

$
0
0

En août 2018, nous avions lancé une importante promotion sur les tarifs d'Elasticsearch Service, doublée d'une multitude de nouvelles fonctionnalités : modèles de déploiement, nouveaux types d'instances, ou encore prise en charge de l'architecture hot-warm. À l'occasion de cette annonce, nous avions aussi indiqué que nous allions bientôt ventiler nos tarifs et commencer à facturer le transfert de données et le stockage des sauvegardes, ce qui se traduirait par une meilleure maîtrise de vos dépenses et de votre consommation. Pendant toute la période promotionnelle, nous avons déduit l'intégralité de ces nouveaux frais de la facturation mensuelle. Autrement dit, sur vos factures, ces dépenses n'étaient pas facturées.

La promotion appliquée au transfert de données et au stockage des sauvegardes va prendre fin le 28 février 2019. Cet article vous propose une description détaillée de ces tarifs, ainsi que quelques conseils et astuces qui vous permettront de maîtriser vos coûts.

Tarifs applicables au stockage des sauvegardes

Les tarifs appliqués au stockage des sauvegardes sont liés au coût du stockage d'objet IaaS sous-jacent (S3 sur AWS ou GCS sur Google Cloud, par exemple). Ces coûts de stockage ne correspondent PAS au stockage sur disque alimentant les index Elasticsearch, ces derniers étant déjà compris dans le prix du cluster (autrement dit, du "déploiement", puisque c'est le terme généralement consacré de nos jours).

Comme tous les fournisseurs cloud, nous évaluons et facturons le stockage des sauvegardes en fonction de deux axes :

  • Taille du stockage (en Go/mois)
  • Nombre de requêtes d'API de stockage (1 000 requêtes/mois)

Pour calculer la taille du stockage, nous mesurons l'espace de stockage (en Go) occupé par l'ensemble des sauvegardes de tous les déploiements associés à un compte. Le même prix unitaire s'applique à toutes les régions. Et pour calculer les frais dus, nous mesurons le volume de stockage sur une base horaire, ce qui nous permet d'obtenir une taille de stockage moyenne (en Go) pour un mois donné. Ce volume moyen nous permet ensuite de facturer le compte en tenant compte des Go/mois consommés au cours du cycle de facturation (mois calendaire).

Par exemple, si le stockage utilisé en avril 2019 est de 100 Go pendant 10 jours, puis de 130 Go au cours des 20 jours restants du mois, le stockage moyen sera de 120 Go/mois, soit (100*10 + 130*20)/30.

Pour calculer les tarifs des appels d'API de stockage, nous comptons le nombre d'appels que l'ensemble des déploiements associés à un compte ont envoyés pour les sauvegarde ou les restaurations. Contrairement à la taille du stockage, cette dimension est cumulative : elle se cumule au cours du cycle de facturation et elle est facturée toutes les 1 000 requêtes.

À compter de la date de cette publication (1er février 2019), les tarifs applicables à ces deux dimensions seront les suivants :

  • Taille du stockage –0,033 $ par Go et par mois
  • Requêtes d'API de stockage – 0,0018 $ pour 1 000 appels d'API

Nous proposons un niveau gratuit de 100 Go/mois. Celui-ci est disponible pour tous les comptes et applicable à tous les déploiements d'un compte. Toute consommation de stockage inférieure à ces volumes n'est pas facturée. Chaque fois que le seuil de 100 Go/mois est dépassé, nous facturons la quantité de stockage excédant le niveau gratuit de 100 Go/mois.

Nous proposons aussi un niveau gratuit de 100 000 requêtes d'API par mois. Celui-ci est disponible pour tous les comptes et applicable à tous les déploiements d'un compte. Une fois ce seuil dépassé, seules les requêtes d'API excédant le niveau gratuit sont facturées.

Tarifs applicables au transfert de données

Les frais appliqués au transfert de données reflètent le volume de données (charge utile) reçues et envoyées par les déploiements Elasticsearch, ou échangées à l'intérieur de ces derniers.

Nous mesurons et facturons le transfert de données en fonction de trois axes :

  • Données reçues (gratuit)
  • Données envoyées
  • Données échangées à l'intérieur d'un déploiement

Les données reçues correspondent à l'ensemble du trafic entrant dans le cluster. Cela englobe les requêtes envoyées vers les index avec charge utile des données, ainsi que celles envoyées vers le cluster (bien que la taille en octets de ces dernières soit généralement bien moindre).

Les données envoyées correspondent à l'ensemble du trafic sortant du cluster. Il s'agit des données de monitoring envoyées depuis le cluster. Le tarif reste le même, quelle que soit la destination des données : qu'elles soient envoyées vers une autre région, vers Internet, ou encore dans la même région, mais vers un autre compte.

Les données échangées à l'intérieur d'un déploiement correspondent à l'ensemble du trafic envoyé entre les différents composants d'un déploiement. Il s'agit essentiellement de la synchronisation des données entre les nœuds d'un cluster réparti sur différentes zones de disponibilité, qui est automatiquement géré par le partitionnement de cluster Elasticsearch. Cela recouvre aussi les données associées à des requêtes de recherche exécutées sur plusieurs nœuds d'un cluster. Remarque : Les clusters Elasticsearch à nœud unique peuvent aussi entraîner des frais intra-cluster en raison des données échangées avec des nœuds Kibana ou d'autres nœuds (Machine Learning ou APM, par exemple). Dans de tels cas, ces frais sont généralement moins importants.

Le calcul appliqué à la consommation de transfert de données est similaire à celui des requêtes d'API de stockage : la consommation cumulée au cours du cycle de facturation donne lieu à un montant cumulatif.

À compter de la date de cette publication (1er février 2019), les tarifs applicables à ces trois dimensions seront les suivants :

  • Données reçues – 0 $ par Go transféré. Cette dimension est gratuite
  • Données envoyées – 0,032 $ par Go transféré
  • Données échangées à l'intérieur d'un déploiement – 0,016 $ par Go transféré

Nous proposons aussi un niveau gratuit de 100 Go/mois qui couvre séparément les données envoyées et les données échangées à l'intérieur d'un déploiement, et s'applique à tous les déploiements d'un compte. Une fois ce seuil dépassé, nous facturons tout transfert de données excédant le niveau gratuit de 100 Go/mois.

Questions fréquentes

Où apparaissent les frais appliqués au stockage d'instantanés et au transfert de données que j'ai consommés ?

Pour faciliter le suivi des frais de stockage d'instantanés et de transfert de données consommés à la demande, les factures font désormais apparaître de nouveaux postes et peuvent être téléchargées via la console utilisateur. Et pour vous permettre de mieux évaluer le montant des frais du mois suivant, nous allons bientôt ajouter un aperçu du cumul mensuel à ce jour.

Exemple de facture :

Quand et comment tout cela sera-t-il mis en place ?

Les nouveaux frais apparaîtront sur votre facture du 1er février 2019 relative à la consommation de janvier 2019. Cependant, ils ne vous seront pas facturés. Ils vous serviront à évaluer vos frais de transfert de données et de stockage des mois suivants. Nous répéterons le même exercice sur la facture du 1er mars 2019 relative à la consommation de février 2019. La facturation des volumes mesurés ne commencera réellement que le 1er mars 2019, pour apparaître sur la facture du 1er avril 2019.

Comment contrôler mes coûts de stockage de sauvegardes ?

Dans Elasticsearch, les sauvegardes enregistrent les données de manière incrémentale à chaque exécution de snapshot. En d'autres termes, la taille réelle des snapshots peut être plus importante que celle des index existants. Plus vous utilisez de données dans le cluster et plus vous les manipulez fréquemment (ajout, suppression ou modification des enregistrements), plus cette taille augmente. Comme adapter les modifications que vous apportez à vos données n'est pas toujours la solution la plus pratique, nous avons ajouté un paramètre avancé à la console utilisateur d'Elastic Cloud pour vous permettre de maîtriser la taille de votre stockage. Il s'agit du paramètre "Snapshot count" représentant le nombre de snapshots à conserver, disponible dans le sous-menu Snapshots. Nous avons gardé la valeur par défaut actuelle de 100 snapshots, mais vous pouvez la modifier pour définir n'importe quelle valeur comprise entre [2 et 100].

Avertissement : Lorsque vous limitez le nombre de snapshots, cela a pour effet de raccourcir la période de conservation des index. Autrement dit, vous ne disposez que d'un point de restauration récent, qui risque d'expirer rapidement.

Quant aux requêtes d'API, elles s'exécutent chaque fois qu'un instantané est effectué ou restauré. Si les restaurations ne sont généralement pas fréquentes, les sauvegardes, elles, sont effectuées par défaut toutes les 30 minutes, afin d'assurer un point de restauration récent et à jour. Nous proposons désormais un nouveau paramètre appelé "Snapshot interval" (Intervalle des snapshots), qui vous permet de choisir un intervalle allant jusqu'à 24 heures, ce qui limite les appels d'API.

Avertissement : La réduction de l'intervalle des sauvegardes risque d'entraîner une perte partielle de données, la restauration d'une sauvegarde plus ancienne ne reflétant pas toutes les modifications apportées aux données depuis la dernière sauvegarde.

Enfin, si vous avez mis en œuvre une logique de création et de restauration de snapshots via l'API Elasticsearch, nous vous conseillons de revoir votre processus, afin d'éviter des frais supplémentaires.

Comment contrôler mes coûts de transfert de données ?

Le transfert de données hors des déploiements et entre les nœuds du cluster est plus difficile à maîtriser, car il est fonction du cas d'utilisation associé au cluster et ne peut pas toujours être adapté. Mais le cas échéant, vous pouvez revoir certaines requêtes groupées que vous exécutez fréquemment.

Quel impact sur ma facture ?

Les coûts exacts du stockage des sauvegardes et du transfert de données dépendent des cas d'utilisation. Elasticsearch se prête à tant de scénarios différents, qu'il est difficile de prédire ces coûts pour tous les comptes. C'est pourquoi nous avons mis en place ces deux mois de facturation qui font apparaître le montant qui aurait été facturé, mais en le déduisant du montant à payer. Nous espérons que cela vous permettra de mieux évaluer vos coûts et de vous préparer à ce changement.

J'ai un abonnement annuel Gold ou Platinum. Ma facture sera-t-elle aussi impactée ?

Si vous êtes déjà client et que vous avez passé un contrat annuel (niveaux "Standard Annual", "Gold" et "Platinum" compris) aucun frais supplémentaire ne s'applique jusqu'au renouvellement de votre contrat, qui sera régi par les nouvelles conditions d'utilisation effectives depuis le 1er janvier 2019. En revanche, pour tous nos nouveaux clients disposant d'abonnements annuels ou mensuels, c'est la nouvelle tarification qui s'applique.

Mes déploiements sont sur GCP. Suis-je concerné par ces tarifs ?

Oui. À compter de la publication de cet article de blog, les tarifs appliqués au stockage de sauvegardes et au transfert de données sont identiques, quel que soit votre fournisseur cloud.

Économie d'espace : un bénéfice méconnu des index triés dans Elasticsearch

$
0
0

Elasticsearch 6.0 inclut une nouvelle fonctionnalité : les index triés. Vous pouvez en apprendre davantage sur le blog, mais, pour faire court, au moment de l'indexation, les documents sont triés par une ou plusieurs clés de tri dans l'ordre de votre choix. Cela présente quelques avantages :

  • Si vous demandez à Elasticsearch d'afficher et de trier un ensemble de résultats en utilisant la clé utilisée pour trier l'index, Elasticsearch n'a plus rien à classer pendant la recherche. Les résultats sont triés à l'avance !
  • Si vous n'avez pas besoin de tous les résultats et que vous triez ces derniers selon la clé de tri, Elasticsearch interrompt la recherche dès qu'il dispose de suffisamment de résultats pour vous répondre. Vous pouvez alors bénéficier d'améliorations exceptionnelles en matière de performances.
  • Lorsque vos recherches utilisent des opérateurs AND pour relier différents champs, l'index trié facilite les regroupements et permet à Elasticsearch d'ignorer de grands blocs de documents pour accélérer les recherches.

En bref, dans certains cas, cette fonctionnalité rend les recherches plus rapides, particulièrement lorsque de nombreux utilisateurs recherchent et trient vos documents de la même manière. En revanche, on parle peu des bienfaits des index triés en matière d'économie d'espace. Parlons-en sans plus attendre.

Attention : les index triés ne conviennent pas à tout le monde

Avant de décrire le fonctionnement des index triés, je me dois de rappeler que cette fonctionnalité ne convient pas à toutes les situations. Elle a pour effet d'exécuter les actions de tri au moment de l'indexation. Le tri est une opération gourmande. Si la vitesse d'indexation compte parmi vos principales préoccupations, réfléchissez-y à deux fois avant d'activer cette fonctionnalité. Elle peut réduire les performances d'écriture de 40 à 50 %. C'est pourquoi, si vos applications requièrent un taux élevé d'indexation, ce qui est souvent le cas lorsque des volumes importants de logs, d'indicateurs ou de données d'analyse de sécurité doivent être traités, les index triés ne sont probablement pas faits pour vous. En revanche, il peut se révéler utile si votre taux d'indexation est plus faible, si la vitesse de recherche constitue pour vous un facteur déterminant ou si vous bénéficiez d'un processus régulier de réindexation qui s'exécute hors des pics d'indexation.

Examen d'ordres de tri possibles : exemple

Imaginons que j'exécute une instance Elasticsearch qui sert à rechercher des produits. Supposons que je dispose d'un ensemble de documents qui, au moment de l'indexation, ressemble à ce qui suit (je les résume dans un tableau pour faciliter leur lecture) :

ID produit Catégorie de produit Couleur de produit Prix
206f467b-8cfe Chaussures Rouge $97.00
4f89fbec-acc3 Vestes Noir $120.50
47771396-dfe3 Vestes Gris $170.10
c6c8fbdf-651b Chapeaux Jaune $15.00
dc18c426-0eb3 Chaussures Rouge $107.20
ee304259-df57 Vestes Noir $88.00
9332c0ac-e55e Chaussures Noir $49.00
30e96765-52a1 Chapeaux Bleu $11.00
811cc8ca-d6bb Vestes Bleu $92.99

Supposons maintenant que nous souhaitons utiliser les index triés. Quelle clé de tri allons-nous utiliser ? Plusieurs options s'offrent à nous : la catégorie de produit, la couleur de produit ou le prix. Si les recherches effectuées par les utilisateurs sont presque toujours triées par prix et qu'aucun filtre de catégorie ou de couleur n'est disponible, il semble logique d'utiliser le prix comme clé de tri. Cependant, il est probable que les utilisateurs sélectionnent au moins une catégorie avant de rechercher l'article le moins cher. Il se peut aussi qu'ils expriment une préférence quant à la couleur du produit. Trions par catégorie croissante (product_category), par couleur croissante (product_color), puis par prix croissant (price).

"sort.field" : ["product_category", "product_color", "price"], "sort.order" : ["asc", "asc", "asc"]

L'index trié ressemble à ça :

ID produit Catégorie de produit Couleur de produit Prix
30e96765-52a1 Chapeaux Bleu $11.00
c6c8fbdf-651b Chapeaux Jaune $15.00
ee304259-df57 Vestes Noir $88.00
4f89fbec-acc3 Vestes Noir $120.50
811cc8ca-d6bb Vestes Bleu $92.99
47771396-dfe3 Vestes Gris $170.10
9332c0ac-e55e Chaussures Noir $49.00
206f467b-8cfe Chaussures Rouge $97.00
dc18c426-0eb3 Chaussures Rouge $107.20

Des choses intéressantes se produisent. En voici un exemple :

  • Demandons à Elasticsearch de rechercher les deux paires de chaussures les moins chères et de les trier par prix sans demander le nombre total de résultats pour l'ensemble des chaussures. Elasticsearch doit rechercher le bloc correspondant aux chaussures, ce qu'il peut faire efficacement en ignorant toutes les autres catégories. Une fois les deux résultats trouvés, Elasticsearch les affiche après avoir interrompu la recherche. Pour que cela fonctionne, vous devez inclure chaque élément de l'ordre de tri dans l'index, même en cas de correspondance avec vos filtres.
  • Si je demande product_category:Vestes AND product_color:Noir à Elasticsearch, ce dernier peut ignorer l'ensemble des chapeaux et des chaussures, se concentrer sur les produits « Noir », puis ignorer toutes les autres couleurs.
  • Elasticsearch compresse significativement les données en arrière-plan. La compression fonctionne lorsque des valeurs se répètent. Elle est d'autant plus efficace lorsque les valeurs répétées sont proches les unes des autres dans l'index. En regroupant tous les produits par catégories ou par couleur, les données correspondantes peuvent être efficacement compressées sur le disque. L'espace occupé sur le disque est ainsi réduit, et le système d'exploitation dispose de plus d'espace dans le cache du système de fichiers pour toujours plus de vitesse.

En général, il est recommandé d'utiliser des ordres de tri de cardinalité croissante pour bénéficier du maximum de valeurs répétées consécutives possibles.

Combien d'espace disque puis-je économiser ?

Combien d'espace disque allez-vous économiser en activant cette fonctionnalité ? Comme souvent dans la vie, ça dépend. La cardinalité du champ choisi pour le tri est un facteur prédominant. Toutefois, les économies d'espace disque peuvent être substantielles. Le weekend dernier, j'ai décidé de déplacer quelques données d'automatisation de mes objets connectés d'un vieil ordinateur à une nouvelle machine. Il existe des façons plus rapides de migrer des données, en restaurant une sauvegarde par exemple, mais j'ai pris le temps de faire une réindexation, car je voulais savoir combien d'espace je pouvais économiser en triant l'index. J'ai d'abord réindexé les objets sans ordre de tri :

status    index           pri    docs.count    docs.deleted    pri.store.size 
open      devices-2017    1      33310674      0               4.2gb

Il s'agit d'un peu plus de 30 appareils. Chacun d'eux transmet son état toutes les 30 secondes, ce qui fait  environ un document par seconde au final. Il faudrait que j'augmente massivement le taux d'indexation ou le nombre d'appareils pour observer des ralentissements lors de l'indexation. Dans mon cas, les index triés semblent une bonne solution. Les données sont composées d'identifiants et de noms d'appareils, ainsi que de plusieurs relevés de capteurs, tels que des températures, des indicateurs de marche/arrêt ou des informations d'état. J'ai trié l'index par identifiant d'appareil, puis par heure. Je me suis dit qu'il est très probable que, pour un appareil donné, les valeurs soient semblables ou identiques aux alentours d'une même heure, ce qui permettrait d'améliorer la compression. Par exemple, si l'état d'un interrupteur indique « marche » à 7:00:00, la probabilité est élevée que l'état soit identique à 7:00:30, à 7:01:00, puis pendant encore quelques minutes. Le niveau de compression de ces données devrait être intéressant. Voici le résultat après avoir trié l'index :

status    index           pri    docs.count     docs.deleted    pri.store.size
open      devices-2017    1      3310674        0               2.5gb

Environ 40 % d'économie d'espace !

Attention (encore)

À ce stade, je me sens à nouveau obligé d'avertir tout le monde, car qui n'apprécierait pas que ses données occupent 40 % moins d'espace disque ? Résumons ça en deux phrases :

  • Les économies d'espace obtenues varient. J'ai obtenu 20 % d'économie en triant l'index d'un autre ensemble de données. Choisissez avec soin vos champs de tri.
  • Votre vitesse d'indexation diminuera. Si la vitesse d'indexation vous importe énormément (par exemple, parce que vous traitez des volumes importants de logs ou d'indicateurs), le nombre de documents pouvant être indexés en peu de temps est probablement déterminant à vos yeux. Dans ce cas, il se peut que l'utilisation des index triés ne vous convienne pas.

Si les économies d'espace disque vous importent beaucoup plus que la vitesse d'indexation ou si le volume de votre index ne ralentit pas la vitesse d'indexation, les index triés pourraient valoir le coup.

Lancement d'Elastic Common Schema

$
0
0

Nous lançons Elastic Common Schema (ECS), une nouvelle spécification permettant de structurer vos données Elasticsearch de manière cohérente et personnalisée, tout en facilitant l'analyse des données provenant de différentes sources. Avec ECS, vous pouvez étendre le champ d'application des contenus analytiques tels que les tableaux de bord et les tâches de machine learning, affiner le ciblage de vos recherches et utiliser des noms de champs bien plus simples à mémoriser.

Pourquoi un schéma commun ?

Que vos analyses soient interactives (recherche, visualisation, opérations de granularité et de restructuration comme "drill-down" et "pivot") ou qu'elles soient automatisées (alerting, détection des anomalies via Machine Learning), vous devez pouvoir examiner vos données de manière homogène. Mais à moins que vos données ne proviennent toutes d'une seule et même source, vous êtes confronté à des incohérences de formats, et ce, pour les raisons suivantes :

  • Types de données disparates (logs, indicateurs, APM, flux, données contextuelles...)
  • Environnements hétérogènes répondant à différentes normes selon les fournisseurs
  • Sources de données comparables, mais néanmoins différentes (données de point de terminaison provenant de différentes sources, comme Auditbeat, Cylance et Tanium)

Imaginez que vous recherchiez un utilisateur parmi des données provenant de différentes sources. La recherche de ce seul champ vous oblige probablement à tenir compte des noms de plusieurs champs, comme user, username, nginx.access.user_name et login. Que dire des opérations de granularité et de restructuration des données comme "drill-down" et "pivot" dans de telles conditions ? Imaginez maintenant que vous ayez à développer un contenu analytique (visualisation, alerting ou tâche de machine learning, par exemple). Chaque nouvelle source de données devient synonyme de complexité ou de duplication.

Qu'est-ce que Elastic Common Schema ?

ECS est une spécification open source qui définit un ensemble commun de champs de documents pour les données ingérées dans Elasticsearch. Conçu pour prendre en charge une modélisation uniforme des données, ECS vous permet de centraliser l'analyse des données provenant de différentes sources, que la méthode employée soit interactive ou automatisée.

ECS vous offre à la fois la prévisibilité d'une taxonomie conçue à cette fin et la polyvalence d'une spécification inclusive, qui s'adapte aux cas d'utilisation personnalisés. La taxonomie d'ECS répartit les éléments de données entre différents champs organisés en trois niveaux :

Niveau Description Recommendation
Champs ECS principaux Ensemble de noms de champs entièrement défini, qui se trouve sous un ensemble défini d'objets ECS de premier niveau. On rencontre ces champs dans la plupart des cas d'utilisation. C'est donc à ce niveau qu'il faut commencer.
Champs ECS étendus Ensemble de noms de champs partiellement défini, qui se trouve sous le même ensemble d'objets ECS de premier niveau. Les champs étendus peuvent s'appliquer aux cas d'utilisation restreints. Ils autorisent aussi une plus grande souplesse selon les cas d'utilisation.
Champs personnalisés Ensemble de champs non défini et non nommé, qui se trouve sous un ensemble d'objets de premier niveau n'appartenant pas à ECS, fourni par l'utilisateur, et ne devant pas entrer en conflit avec les champs et objets ECS. C'est à ce niveau que vous pouvez ajouter des champs pour lesquels ECS ne propose pas de champ correspondant. Vous pouvez aussi conserver ici une copie des champs d'événement d'origine (au moment de faire migrer vos données vers ECS, par exemple).

Elastic Common Schema en action

1er exemple : Analyse

Voyons ce que peut faire ECS sur le log Apache ci-dessous :

10.42.42.42 - - [07/Dec/2018:11:05:07 +0100] "GET /blog HTTP/1.1" 200 2571 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36"

Lorsqu'on mappe ce message à ECS, les champs du log s'organisent comme suit :

Nom du champ Valeur Remarques
@timestamp 2018-12-07T11:05:07.000Z
ecs.version 1.0.0
event.dataset apache.access
event.original 10.42.42.42 - - [07/Dec ... Log complet et non modifié, à utiliser pour les audits 
http.request.method get
http.response.body.bytes 2571
http.response.status_code 200
http.version 1.1
host.hostname webserver-blog-prod
message "GET /blog HTTP/1.1" 200 2571 Représentation textuelle des informations importantes de l'événement, qui s'affichent sous forme de résumé succinct via une visionneuse de log.
service.name Company blog Le nom que vous avez choisi pour ce service.
service.type apache
source.geo.* Champs servant à la géolocalisation.
source.ip 10.42.42.42
url.original /blog
user.name -
user_agent.* Champs décrivant l'agent utilisateur.

Comme illustré ci-dessus, le log brut est conservé dans le champ event.original d'ECS à des fins d'audit. Remarque : Pour simplifier, cet exemple ne tient pas compte des informations relatives à l'agent Monitoring (qui apparaissent sous agent.*), ni de celles relatives à l'hôte (qui apparaissent sous host.*) et n'affiche pas tous les champs. Pour consulter une représentation plus complète, vous pouvez examiner cet exemple d'événement dans JSON.

2e exemple : Recherche

Imaginons que vous ayez besoin d'étudier l'activité d'une adresse IP dans toute une pile Web : pare-feu Palo Alto Networks, HAProxy (traité par Logstash), Apache (avec le module Beats), Elastic APM, et pour faire bonne mesure, système de détection d'intrusion Suricata (personnalisé et associé au format EVE JSON de Suricata).

Avant ECS, la recherche de cette adresse IP ressemblait plus ou moins à ceci :

src:10.42.42.42 OR client_ip:10.42.42.42 OR apache2.access.remote_ip:10.42.42.42 OR context.user.ip:10.42.42.42 OR src_ip:10.42.42.42

Mais maintenant que vous pouvez mapper toutes vos sources à ECS, votre recherche devient beaucoup plus simple :

source.ip:10.42.42.42

3e exemple : Visualisation

On voit immédiatement la puissance d'ECS lorsqu'on découvre comment elle peut être appliquée à des données normalisées de façon homogène, bien que provenant de différentes sources de données. Pour détecter les menaces, peut-être monitorez-vous votre pile Web via plusieurs sources de données réseau : un pare-feu Palo Alto nouvelle génération sur le réseau de périmètre, associé au système de détection d'intrusion Suricata, qui génère des événements et des alertes. Comment extraire les champs source.ip et network.direction de chaque message, de manière à permettre une visualisation centralisée dans Kibana et des opérations "drill-down" et "pivot" compatibles avec tous les fournisseurs ? Avec ECS, bien sûr. Le monitoring centralisé gagne vraiment en simplicité.

Dimensionner les architectures hot-warm pour les logs et les métriques dans Elasticsearch Service sur Elastic Cloud

$
0
0

Quelle différence entre Amazon Elasticsearch Service et notre offre Elasticsearch Service officielle ? Pour le savoir, comparez les offres Elasticsearch Service d'AWS et d'Elastic sur cette page.

Excellente nouvelle ! Elasticsearch Service sur Elastic Cloud est désormais compatible avec tout un éventail de matériel et de modèles de déploiement. Le voilà parfaitement adapté au traitement efficace des logs et des métriques. Autant de flexibilité implique aussi bon nombre de décisions à prendre. Choisir l'architecture la mieux adaptée à votre cas d'utilisation et évaluer la taille du cluster dont vous aurez besoin peut être une tâche ardue. Aucune inquiétude. Nous sommes là.

Dans cet article, vous découvrirez les différentes architectures fréquemment utilisées pour les logs et les métriques et dans quels cas les utiliser. Nous vous fournirons aussi des conseils sur le dimensionnement et la gestion de votre ou de vos clusters pour une utilisation optimale.

Quelles architectures sont disponibles pour mon cluster de logs ?

Dans les clusters Elasticsearch les plus simples, tous les nœuds de données ont les mêmes spécifications et remplissent tous les rôles. À mesure qu'ils s'étendent, on y ajoute souvent des nœuds dédiés à certaines tâches (nœud maître, nœud d'ingestion et nœud de machine learning dédiés, par exemple). Cela permet de décharger les nœuds de données, qui gagnent ainsi en efficacité. Dans ce type de cluster, la charge de travail liée aux requêtes et à l'indexation est répartie entre tous les nœuds de données. Ceux-ci ayant la même spécification, on dit de ce type d'architecture de cluster qu'elle est homogène ou uniforme.

uniform_cluster.png

Autre architecture très appréciée (notamment par ceux qui traitent des données temporelles comme les logs et les métriques) : l'architecture hot-warm. Elle s'appuie sur l'idée que les données sont en général immuables et qu'elles peuvent être indexées dans des index temporels. Chaque index contient ainsi des données relatives à une période spécifique, ce qui rend possible la gestion de la conservation et du cycle de vie des données grâce à la suppression des anciens index. Cette architecture comporte deux types de nœuds de données présentant des profils matériels différents : les nœuds de données "hot" et les nœuds de données "warm".

hot-warm_cluster.png

Les nœuds de données hot contiennent les index les plus récents et gèrent par conséquent toute l'indexation du cluster. Les données les plus récentes étant généralement celles que l'on recherche le plus souvent, ces nœuds sont très sollicités. De plus, l'indexation dans Elasticsearch peut faire un usage très intensif du processeur et des entrées/sorties, et cette charge de travail supplémentaire liée à la recherche signifie que ces nœuds doivent rimer avec puissance et très grande rapidité de stockage. Ce qui se traduit généralement par l'utilisation de disques SSD connectés localement.

Les nœuds warm, quant à eux, sont optimisés pour le stockage à long terme des index en lecture seule du cluster. Ils riment avec rentabilité. Généralement pourvus d'une mémoire RAM et d'un processeur conséquents, ils utilisent des disques rotatifs connectés localement ou un réseau de stockage SAN en lieu et place des disques SSD. Une fois que les index des nœuds hot dépassent la période de conservation prévue sur ces nœuds et qu'ils n'y sont plus indexés, ils sont déplacés vers les nœuds warm.

Il est important de souligner que le déplacement des données des nœuds hot vers les nœuds warm n'entraîne pas nécessairement un ralentissement de la recherche. Ces nœuds ne traitant aucune indexation gourmande en ressources, ils sont souvent capables de répondre efficacement aux requêtes portant sur les anciennes données. Le tout, avec une faible latence et sans nécessiter l'utilisation d'un stockage SSD.

Les nœuds de données compris dans cette architecture sont très spécialisés et doivent pouvoir traiter une charge de travail importante. Il est donc recommandé d'utiliser des nœuds dédiés : nœud maître, nœud d'ingestion, nœud de machine learning et nœud de coordination seule.

Quelle architecture choisir ?

Ces deux architectures sont adaptées à de nombreux cas d'utilisation et il n'est pas toujours simple de décider laquelle choisir. Cependant, certaines contraintes et conditions peuvent faire pencher la balance en faveur de l'une des deux architectures.

Ainsi, le ou les types de stockage disponibles pour le cluster constituent un facteur important dont il convient de tenir compte. Une architecture hot-warm nécessite un stockage extrêmement rapide pour les nœuds hot. Elle n'est pas adaptée si le cluster ne peut finalement utiliser qu'un stockage lent. Dans ce cas, il est préférable de miser sur une architecture uniforme et de répartir l'indexation et la recherche sur le plus grand nombre de nœuds possibles.

Les clusters uniformes s'appuient souvent sur des disques rotatifs locaux ou sur un réseau de stockage SAN, bien que les disques SSD soient de plus en plus répandus. Les stockages lents sont susceptibles de ne pas pouvoir prendre en charge des taux d'indexation très élevés, notamment en cas de recherches simultanées. Le remplissage de l'espace disque peut donc prendre beaucoup de temps. Par conséquent, il n'est possible de stocker de grands volumes de données sur chaque nœud que si leur période de conservation est suffisamment longue.

Ainsi, si le cas d'utilisation prévoit une période de conservation très courte (moins de 10 jours, par exemple), les données ne resteront pas longtemps inactives sur le disque une fois indexées. Ce cas de figure nécessite un stockage performant. Une architecture hot-warm peut fonctionner, mais un cluster uniforme ne comprenant que des nœuds hot est probablement mieux adapté et plus simple à gérer.

De quel volume de stockage ai-je besoin ?

Lorsque vous dimensionnez un cluster pour le logging et/ou les indicateurs, l'un des éléments les plus importants est le volume du stockage. Le rapport entre le volume de données brutes et l'espace qu'elles occuperont sur le disque une fois indexées et répliquées dans Elasticsearch dépend beaucoup du type de données et de la façon dont elles sont indexées. Le schéma ci-dessous présente les différentes étapes que suivent les données lors de l'indexation.

data_index_lifecycle.png

La première étape implique la transformation des données brutes en documents JSON. Ce sont ces derniers que nous indexons ensuite dans Elasticsearch. L'impact de cette transformation sur la taille des données est fonction du format d'origine et de la structure ajoutée, mais aussi de la quantité de données ajoutées via différents types d'enrichissements. On assiste à des variations considérables selon les types de données. Si vos logs sont déjà au format JSON et que vous n'ajoutez pas de données supplémentaires, la taille de vos données peut rester identique. Mais si vous avez des logs d'accès web basés sur du texte, la structure et les informations ajoutées sur le user-agent et la géolocalisation peuvent être bien plus volumineuses.

Une fois que nous indexons ces données dans Elasticsearch, les paramètres d'indexation et les mappings utilisés détermineront l'espace qu'elles occuperont sur le disque. En général, les mappings dynamiques par défaut qu'applique Elasticsearch sont plutôt conçus pour un maximum de flexibilité que pour l'optimisation du stockage sur le disque. Pour économiser de l'espace disque, vous pouvez optimiser vos mappings grâce à des modèles d'indexation personnalisés. Pour en savoir plus à ce sujet, consultez cette documentation relative à l'optimisation.

Afin d'évaluer l'espace disque que certains types de données utiliseront dans votre cluster, indexez une quantité suffisante de données. Cela vous permet d'atteindre la taille de partition (shard) que vous êtes susceptible d'utiliser en production. En phase de test, une erreur assez courante consiste à utiliser des volumes de données insuffisants, ce qui risque de générer des résultats imprécis.

Comment équilibrer ingestion et recherche ?

Lorsqu'ils dimensionnent leur cluster, la première évaluation qu'effectuent les utilisateurs vise souvent à déterminer le débit d'indexation maximal dudit cluster. Après tout, il s'agit d'une évaluation assez simple à configurer et à exécuter, et les résultats peuvent aussi servir à déterminer l'espace qu'utiliseront les données sur le disque.

Une fois que nous avons paramétré le cluster et le processus d'ingestion et que nous avons identifié le débit d'indexation maximal que nous pouvons maintenir, nous pouvons calculer le délai après lequel le disque des nœuds de données sera saturé si nous continuons à indexer à la vitesse maximale. En partant du principe que nous voulons optimiser l'utilisation de l'espace disque disponible, cela nous donne une indication sur la période de conservation minimale pour ce type de nœud.

On peut être tenté d'utiliser directement ce résultat pour déterminer la taille dont nous avons besoin. Or, nous ne disposerions alors d'aucune marge pour les recherches, toutes les ressources système étant utilisées pour l'indexation. Avouons que ce serait dommage : si les utilisateurs stockent leurs données dans Elasticsearch, c'est le plus souvent pour pouvoir les interroger à un moment ou à un autre, et il va sans dire qu'ils attendent de bonnes performances de recherche.

Quelle marge garder pour l'exécution des requêtes ? Il est difficile de donner une réponse générique à cette question. Cela dépend beaucoup du volume et de la nature des requêtes, ainsi que des niveaux de latence attendus. Le meilleur moyen de le savoir est de lancer une évaluation simulant des niveaux d'interrogation réalistes sur différents volumes de données et à différentes vitesses d'indexation, tel que décrit dans cette intervention Elastic{ON} portant sur le dimensionnement quantitatif des clusters et dans ce webinar sur l'évaluation et le dimensionnement des clusters avec Rally.

Une fois que nous avons déterminé le débit d'indexation que nous pouvons maintenir par rapport au débit maximal, tout en répondant aux requêtes des utilisateurs avec des performances acceptables, nous pouvons ajuster la période de conservation attendue, afin qu'elle corresponde à cette vitesse d'indexation moindre. Si nous ralentissons le rythme de l'indexation, nous mettrons plus de temps à remplir l'espace disque.

S'il peut nous permettre de gérer des petits pics de trafic, cet ajustement suppose en général une vitesse d'indexation constante au fil du temps. Si des pics de trafic et des fluctuations sont prévus tout au long de la journée, nous devons partir du principe que la vitesse d'indexation ajustée correspond au niveau maximal, et réduire davantage la vitesse d'indexation moyenne que chaque nœud peut gérer. En cas de fluctuations prévisibles et prolongées (par exemple pendant les heures ouvrables) une autre possibilité consiste à augmenter la taille de la zone hot pour la période concernée.

Comment utiliser tout ce stockage ?

Dans une architecture hot-warm, les nœuds warm doivent pouvoir contenir de grands volumes de données. Cela vaut aussi pour les nœuds de données d'une architecture uniforme avec période de conservation prolongée.

Le volume exact de données que vous pouvez stocker sur un nœud dépend souvent de la façon dont vous gérez l'utilisation de la mémoire. C'est souvent le principal facteur limitant que l'on rencontre sur les nœuds denses. Dans un cluster Elasticsearch, la mémoire étant sollicitée par différents processus (indexation, requêtes, mise en cache, état du cluster, données de champ et overhead de la partition, par exemple), les résultats dépendent des cas d'utilisation. De nouveau, le meilleur moyen de définir les limites applicables à votre cas d'utilisation consiste à effectuer une évaluation sur des données et des modèles de recherche réalistes. Voici toutefois quelques bonnes pratiques génériques autour des logs et des métriques, qui vous aideront à libérer tout le potentiel de vos nœuds de données.

Veillez à optimiser vos mappings

Comme évoqué plus haut, les mappings utilisés pour vos données peuvent affecter l'espace qu'elles occupent sur le disque. Ils peuvent aussi affecter la quantité de données de champ utilisées, ainsi que l'utilisation de la mémoire. Si vous avez opté pour des modules Filebeat ou des modules Logstash pour l'analyse et l'ingestion des données, ceux-ci intègrent d'office des mappings optimisés. Vous n'êtes donc pas concerné. En revanche, si vous analysez des logs personnalisés et que vous utilisez beaucoup la fonctionnalité de mapping dynamique des nouveaux champs intégrée à Elasticsearch, ce qui suit est fait pour vous.

Quand Elasticsearch assure le mapping dynamique d'une chaîne de caractères, il utilise par défaut le format champs multiples pour mapper les données en tant que texte (ce qui peut servir pour la recherche de texte libre non sensible à la casse), mais aussi en tant que mot clé (ce qui permet d'agréger les données dans Kibana). Un réglage par défaut très utile, car il permet une flexibilité optimale. Toutefois, l'inconvénient est qu'il augmente la taille des index sur le disque, ainsi que la quantité de données de champ utilisée. C'est pourquoi nous vous recommandons d'optimiser les mappings chaque fois que cela est possible, ce qui peut faire une très grande différence quand les volumes de données prennent de l'importance.

Veillez à ce que les partitions restent aussi grandes que possible

Chaque index Elasticsearch contient une ou plusieurs partitions (shards), et chacune d'entre elles présente un overhead qui utilise de l'espace mémoire. Comme l'explique cet article de blog qui traite du partitionnement, les petites partitions présentent un overhead plus important par volume de données comparées aux grandes partitions. Pour limiter au maximum l'utilisation de la mémoire sur les nœuds destinés à stocker de grands volumes de données, il est important de veiller à ce que les partitions restent aussi grandes que possible. Un bon principe de base consiste à maintenir la taille moyenne des partitions dédiées à la conservation à long terme entre 20 Go et 50 Go.

Chaque requête ou agrégation étant exécutée en monothread pour chaque partition, la latence minimale des requêtes dépend généralement de la taille de la partition. Celle-ci étant fonction des données et des requêtes, elle peut différer d'un index à l'autre, même si ces derniers relèvent du même cas d'utilisation. Pour certains volumes et types de données, il n'est cependant pas certain qu'un plus grand nombre de petites partitions affiche de meilleures performances qu'une seule grande partition.

Il est important de tester l'impact que peut avoir la taille des partitions, afin d'atteindre un équilibre optimal en tenant compte de l'utilisation des requêtes et d'un overhead minimal.

Optimisez le volume de stockage

Une compression efficace de la source JSON peut avoir un effet considérable sur l'espace disque qu'occupent les données. Par défaut, Elasticsearch compresse ces données grâce à un algorithme réglé pour atteindre un équilibre entre stockage et vitesse d'indexation, mais il propose aussi une possibilité plus radicale, le codec best_compression.

Vous pouvez le définir pour tous les nouveaux index, mais il s'accompagne d'une pénalité d'environ 5 à 10 % lors de l'indexation. Le gain d'espace disque pouvant être considérable, ce compromis peut en valoir la peine.

Si vous avez suivi les conseils de la section précédente et que vous forcez la fusion des index, vous pouvez aussi appliquer la compression améliorée juste avant de forcer la fusion.

Évitez les charges inutiles

Le dernier facteur influant sur l'utilisation de la mémoire est le traitement des requêtes. Toutes les requêtes envoyées à Elasticsearch sont coordonnées au niveau du nœud sur lequel elles arrivent. La tâche est ensuite partitionnée et répartie là où se trouvent les données. Cela concerne autant l'indexation que l'exécution de requêtes.

L'analyse et la coordination des requêtes et des réponses peuvent entraîner une utilisation considérable de la mémoire. Veillez à ce que les nœuds utilisés pour la coordination et l'indexation disposent d'une mémoire suffisante pour gérer ces tâches.

Quant aux nœuds configurés pour le stockage de données à long terme, il s'avère souvent judicieux de s'en servir comme nœuds de données dédiés et de limiter au strict minimum le nombre de tâches supplémentaires que vous leur affectez. Pour ce faire, vous pouvez diriger toutes les requêtes vers des nœuds hot ou vers des nœuds exclusivement dédiés à la coordination.

Comment appliquer tout cela à mon déploiement Elasticsearch Service ?

Elasticsearch Service est actuellement disponible sur AWS et GCP, et bien que les deux plateformes proposent les mêmes configurations d'instance et modèles de déploiement, il existe de petites différences de spécification. Dans cette section, nous aborderons les différentes configurations d'instance et verrons comment elles s'intègrent aux architectures que nous avons présentées plus haut. Nous verrons aussi comment procéder pour évaluer la taille de cluster dont nous avons besoin pour soutenir le cas d'utilisation que nous prendrons comme exemple.

Configurations d'instance disponibles

Elasticsearch Service utilise des nœuds Elasticsearch adossés à un stockage SSD rapide. C'est ce que nous appelons des nœuds highio, et ils affichent d'excellentes performances en E/S. Ils sont donc parfaitement adaptés à une utilisation comme nœuds hot dans le cadre d'une architecture hot-warm. Pour autant, ils peuvent aussi être utilisés comme nœuds de données dans une architecture uniforme. Cela est d'ailleurs souvent recommandé dans les cas où une période de conservation limitée nécessite un stockage performant.

Sur AWS et GCP, les nœuds highio affichent un ratio disque/RAM de 30:1. Autrement dit, pour 1 Go de RAM, 30 Go de stockage sont disponibles. AWS propose les tailles de nœud suivantes : 1 Go, 2 Go, 4 Go, 8 Go, 15 Go, 29 Go et 58 Go, tandis que GCP propose des tailles de 1 Go, 2 Go, 4 Go, 8 Go, 16 Go, 32 Go et 64 Go.

Autre type de nœud récemment ajouté sur Elastic Cloud : le nœud highstorage optimisé pour le stockage. Celui-ci dispose de grands volumes de stockage lent et affiche un ratio disque/RAM de 100:1. Par exemple, un nœud highstorage de 64 Go sur GCP dispose de plus de 6,2 To de stockage, et un nœud de 58 Go sur AWS propose 5,6 To. Sur chacune des deux plateformes, ces types de nœuds proposent les mêmes tailles de mémoire RAM que les nœuds highio.

Dans une architecture hot-warm, ces nœuds sont généralement utilisés comme nœuds warm. Les évaluations effectuées sur les nœuds highstorage nous apprennent que ces types de nœuds affichent de bien meilleures performances sur GCP que sur AWS, même en tenant compte des différences de tailles existantes.

2 ou 3 zones de disponibilité : que choisir ?

Dans la plupart des régions, vous pouvez choisir d'exécuter votre cluster sur deux ou trois zones de disponibilité. Et pour chaque zone du cluster, vous pouvez aussi choisir différents nombres de zone. Si vous optez pour un nombre fixe de zones de disponibilité, les tailles de cluster disponibles sont plus ou moins multipliées par deux, du moins pour les petits clusters. Si vous envisagez au contraire d'utiliser deux ou trois zones de disponibilité, vous pouvez procéder au dimensionnement par petites étapes, le passage de deux à trois zones de disponibilité en conservant la même taille de nœud n'augmentant la capacité que de 50 %.

Exemple de dimensionnement : Architecture hot-warm

Nous allons maintenant prendre l'exemple d'un cluster hot-warm qui peut ingérer quotidiennement 100 Go de logs d'accès web brut, avec une période de conservation de 30 jours. Nous allons comparer le déploiement de ce cluster avec Elastic Cloud sur AWS et sur GCP.

Remarque : Les données utilisées ici ne le sont qu'à titre d'exemple et il est fort probable que votre cas d'utilisation soit différent.

1ère étape : Évaluer le volume total des données

Dans cet exemple, nous supposons que les données sont ingérées via les modules Filebeat et que les mappings sont par conséquent optimisés. Par ailleurs, à des fins de simplification, nous nous limiterons à un seul type de données. Toujours dans cet exemple, les évaluations de l'indexation ont révélé que le ratio entre la taille des données brutes et la taille indexée sur le disque était de 1.1. On estime donc que 100 Go de données brutes donnent 110 Go de données indexées sur le disque. Un réplica a été ajouté, doublant leur taille pour atteindre 220 Go.

Sur une période de 30 jours, le volume total de données indexées et répliquées est donc de 6 600 Go, volume que le cluster dans son ensemble doit gérer.

Cet exemple suppose l'utilisation d'une partition répliquée sur l'ensemble des zones, ce qui est considéré comme une bonne pratique en matière de disponibilité et de performance.

2e étape : Dimensionner les nœuds hot

Nous avons effectué quelques évaluations du débit d'indexation maximal sur des nœuds hot utilisant cet ensemble de données, et nous avons constaté que les disques des nœuds highio sur AWS et GCP étaient pleins au bout de 3,5 jours.

Afin de garder un peu de marge pour l'exécution des requêtes et les pics de trafic, nous supposons que pour maintenir le débit d'indexation, celui-ci ne doit pas excéder 50 % du débit maximal. Si nous voulons exploiter pleinement le stockage disponible sur ces nœuds, l'indexation doit y être effectuée sur une plus longue période, et nous devons donc ajuster la période de conservation définie pour ces nœuds.

Pour une efficacité optimale, Elasticsearch nécessite aussi un espace disque supplémentaire. Pour ne pas dépasser la limite du disque, nous supposons qu'une marge de 15 % d'espace disque supplémentaire est nécessaire. Ces valeurs apparaissent dans la colonne Espace disque nécessaire du tableau ci-dessous. Tous ces éléments nous permettent de déterminer la quantité de mémoire RAM nécessaire pour chaque fournisseur.

Plateforme Ratio disque:RAM Nombre de jours jusqu'au remplissage Conservation effective (en jours) Volume de données pris en charge (en Go) Espace disque nécessaire (en Go) RAM nécessaire (en Go) Spécification relative à la zone
AWS 30:1 3,5 7 1 440 1 656 56 29 Go, 2AZ
GCP 30:1 3,5 7 1 440 1 656 56 32 Go, 2AZ

3e étape : Dimensionner les nœuds warm

Les données excédant la période de conservation des nœuds hot sont déplacées vers les nœuds warm. Pour évaluer la taille nécessaire, nous calculons le volume de données que doivent contenir ces nœuds, en tenant compte de l'overhead des limites supérieures.

Plateforme Ratio disque:RAM Conservation effective (en jours) Volume de données pris en charge (en Go) Espace disque nécessaire (en Go) RAM nécessaire (en Go) Spécification relative à la zone
AWS 100:1 23 5 060 5 819 58 29 Go, 2AZ
GCP 100:1 23 5 060 5 819 58 32 Go, 2AZ

4e étape : Ajouter d'autres types de nœuds

Pour un cluster plus résilient et hautement disponible, outre les nœuds de données, nous avons généralement besoin de 3 nœuds maîtres dédiés. Ceux-ci ne gérant aucun trafic, leur taille peut être limitée. Pour commencer, une taille initiale de 1 à 2 Go est tout à fait adaptée. Vous pouvez ensuite scaler ces nœuds jusqu'à environ 16 Go sur 3 zones de disponibilité pour accompagner la croissance du cluster.

Et ensuite ?

Si ce n'est déjà fait, testez gratuitement la version d'essai d'Elasticsearch Service pendant 14 jours et jugez-en par vous-même. Vous verrez ainsi à quel point sa configuration et sa gestion sont simplissimes. Des questions ? Besoin d'autres conseils sur le dimensionnement d'Elasticsearch Service sur Elastic Cloud ? N'hésitez pas à nous contacter directement ou à nous faire signe sur notre forum de discussion public.

Déployer un cluster de logging hot-warm sur Elasticsearch Service

$
0
0

Quelle différence entre Amazon Elasticsearch Service et notre offre Elasticsearch Service officielle ? Pour le savoir, comparez les offres Elasticsearch Service d'AWS et d'Elastic sur cette page.

Nous avons récemment intégré à Elasticsearch Service sur Elastic Cloud une multitude de nouvelles fonctionnalités conçues pour booster tous vos cas d'utilisation – du logging aux analytiques, et plus encore. L'une des fonctionnalités phares ajoutées ? Des modèles de déploiement pour architecture hot-warm, qui, couplés à un modèle tarifaire revu à la baisse, rendent encore plus intéressante l'utilisation d'Elasticsearch Service pour le logging.

Dans cet article de blog, nous verrons comment utiliser ce nouveau modèle de déploiement hot-warm et aborderons d'autres puissantes fonctionnalités de la Suite Elastic comme Machine Learning et Alerting, qui vous révèlent de précieuses informations. Tout cela, en moins de 10 minutes. Vous n'avez pas encore de compte Elasticsearch Service ? Pensez à vous inscrire pour un essai gratuit de 14 jours.

Qu'est-ce que l'architecture hot-warm ?

L'architecture hot-warm est un moyen extrêmement efficace de séparer un déploiement Elasticsearch en nœuds dits "hot" et en nœuds dits "warm". Les nœuds de données hot gèrent alors l'ensemble des données récentes en entrée et disposent d'un stockage plus rapide, qui assure une ingestion et une récupération plus promptes des données. Les nœuds warm, quant à eux, présentent une plus grande densité de stockage et s'avèrent plus rentables pour le stockage des données de logging à long terme. Lorsqu'ils sont associés, ces deux types de nœuds de données permettent un traitement efficace des données en entrée et assurent leur disponibilité pour les requêtes, tout en permettant leur conservation à long terme sans pour autant vous obliger à casser la tirelire.

Cela s'avère particulièrement utile pour les cas d'utilisation axés sur le logging, qui mettent l'accent sur les logs récents (ceux des deux dernières semaines, par exemple), et dans lesquels les logs plus anciens (qu'il peut être nécessaire de conserver pour des raisons de conformité, entre autres) peuvent s'accommoder de requêtes plus lentes.

Créer un déploiement hot-warm

Avec Elasticsearch Service, déployer une architecture hot-warm devient un jeu d'enfant, y compris lorsqu'il s'agit de gérer les règles relatives à la curation d'index pour déplacer les données des nœuds de données hot aux nœuds de données warm – une fonctionnalité unique, qui démarque Elastic Cloud des autres fournisseurs d'offres Elasticsearch hébergées. Un jeu d'enfant, vraiment ? C'est ce que nous allons voir dans cet article : nous allons déployer et exécuter un cluster de logging hot-warm en moins de 5 minutes. Ce cluster opérationnel comprendra aussi un nœud de machine learning de 1 Go gratuit, ainsi qu'un nœud Kibana de 1 Go.

Pour commencer, nous allons accéder à la console Elasticsearch Service console et cliquer sur Create Deployment (Créer un déploiement).

hot-warm-template.png

Sur notre déploiement, nous allons aussi activer Machine Learning. Tous les déploiements Elasticsearch Service comprennent un nœud de machine learning gratuit de 1 Go, ainsi qu'un nœud Kibana de 1 Go.

hot-warm-enable-ml.png

La curation d'index vous permet de définir la durée de conservation des index sur les nœuds hot avant qu'ils ne soient déplacés vers les nœuds warm. Les valeurs par défaut comprennent des index souvent utilisés, créés par Beats (metricbeat-*, filebeat-*) et Logstash (logstash-*). Leur période de conservation avant déplacement est de 1 jour. Nous conserverons ces valeurs pour notre exemple.

Remarque : Vous pourrez toujours modifier ces règles après le déploiement. Pour ce faire, accédez à la page "Operations" (Opérations) sous le déploiement.

Une fois cela fait, nous allons cliquer sur Create Deployment (Créer le déploiement).

Bravo ! Vous voilà devenu l'heureux "déployeur" de la puissante architecture hot-warm !

Envoyer des données

Notre déploiement hot-warm étant maintenant fin prêt, si nous commencions à envoyer quelques données de logging ? Pour ce faire, nous allons installer Beats sur notre machine locale, puis nous allons utiliser l'identifiant Cloud ID et le mot de passe Elasticsearch Service générés par notre déploiement pour commencer à envoyer des données. Pour tout savoir sur la configuration de Beats et d'Elasticsearch Service, n'hésitez pas à consulter l'article de blog consacré à l'utilisation de Metricbeat avec Elasticsearch Service.

Pour rechercher l'identifiant Cloud ID, accédez à la page "Deployments" (Déploiements), puis à "Cloud ID" :

deployment-cloud-id.png

Pour en savoir plus sur Machine Learning et découvrir d'autres cas d'utilisation, visitez la page dédiée à la fonctionnalité Machine Learning d'Elastic.

Conclusion

Les nouvelles fonctionnalités d'Elasticsearch Service vous permettent de vous lancer dans la puissante architecture hot-warm en quelques clics. Associées à d'autres fonctionnalités de la Suite Elastic telles que Machine Learning et Security, elles rendent le monitoring de vos logs et de vos indicateurs avec Elasticsearch Service plus performant que jamais.

Impatient d'essayer ? Lancez-vous avec notre version d'essai de 14 jours.

A propos des distributions "ouvertes", de l'open source et de la création d'entreprise

$
0
0

Chez Elastic, nous créons des produits exceptionnels capables de réunir des communautés et d'accompagner nos utilisateurs sur la voie de la réussite.

En 2009, j'ai écrit les premières lignes d'Elasticsearch et j'en ai ouvert le code source. J'ai quitté mon emploi et passé deux ans à concevoir ce produit et à développer l'incroyable communauté qui l'entoure. À partir de là, en 2012, nous avons fondé une entreprise, Elastic. Nous avons investi dans notre communauté d'utilisateurs et avons accompagné l'écosystème qui s'est développé autour de notre produit. Nous avons ajouté tellement de fonctionnalités à Apache Lucene que j'en ai perdu le compte. Cette bibliothèque est devenue le socle solide de tous nos travaux. Pour n'en nommer que quelques-uns, nous avons inclus Kibana créé par Rashid, Logstash créé par Jordan ainsi que Packetbeat créé par Monica et Tudor. Nous concevons des produits, développons des communautés et canalisons notre énergie pour fournir un maximum d'avantages à nos utilisateurs. Aujourd'hui, des centaines de développeurs Elastic s'investissent au quotidien dans cette vaste entreprise. Notre communauté compte des centaines de milliers de membres qui contribuent chaque jour à notre succès. Je suis fier de l'entreprise que nous avons créée et qui a permis de voir le développement d'une telle communauté.

Le degré de confiance atteint avec notre base d'utilisateurs me remplit de fierté et d'humilité. Il faut d'abord être ouvert, puis rester fidèle à sa communauté et à sa base d'utilisateurs. Nous faisons tout pour que rien ne détourne notre attention de ces principes.

Dès le commencement et pendant des années, nous avons été confrontés au FUD (Fear, Uncertainty and Doubt), une technique rhétorique basée sur la peur, l'incertitude et le doute. C'est une étape incontournable lorsque vous concevez quelque chose qui a du succès. Le FUD est une technique surtout utilisée par les grandes entreprises qui craignent les conséquences du succès d'autrui. C'est une réaction naturelle. "N'utilisez pas ce produit, c'est un jouet." "Ce produit ne repose que sur une poignée de développeurs, qu'arrivera-t-il s'ils se font renverser par un bus ?" "Ils ne savent pas ce dont 'l'entreprise' a besoin." "Ils ne sont pas de véritables X, Y ou Z (insérez le qualificatif du jour)." Nous ne nous sommes jamais laissés impressionner ni distraire par ces techniques. Celles-ci ont pour but de nous éloigner de notre objectif principal, développer des produits et des communautés hors du commun, que nos utilisateurs adorent. Nous échouerions si nous nous laissions distraire et nous ne vous laisserons jamais tomber.

Je ne saurais vous dire combien de forks sont issus de nos produits ni combien de fois ces derniers ont été redistribués ou regroupées. C'est le reflet de notre succès et de la portée de nos produits : de quelques entreprises à de grosses organisations chinoises, et maintenant Amazon. Il y avait toujours une "raison" de semer le doute, parfois sous de faux airs altruistes et bienveillants. Aucune d'elles n'a survécu. Ces "raisons" dictées par ceux qui en bénéficient servent à désorienter et à diviser la communauté. L'engagement ainsi que l'application dont nous faisons preuve pour développer des produits et des communautés hors du commun ont façonné notre identité et raisonnent auprès de vous, nos utilisateurs. Vous êtes témoin de la confiance que nous avons bâtie, du rythme exceptionnel de nos innovations et du succès de notre collaboration.

Nous croyons en l'open source et à la puissance qu'elle confère. Nous avons aussi indiqué dès le début pourquoi certaines fonctionnalités seront commerciales. Selon moi, notre honnêteté constitue l'une des principales raisons du succès que nous partageons. Nous avons conçu notre code open source de sorte qu'il soit immédiatement utilisable et proprement mis en œuvre. Notre vision n'a pas changé depuis nos débuts. Nous tissons des liens de confiance avec nos utilisateurs depuis des années en tenant parole et en leur étant fidèles.

Le code que nous avons écrit sous licence propriétaire en a "inspiré" d'autres. Il a été copié sans ménagement par plusieurs entreprises, et on le retrouve dans certaines distributions ou dans certains forks, comme dans l'un des nouveaux services d'Amazon qui comporte malheureusement de graves bugs. Nous sommes restés concentrés sur le développement de nos produits et de nos communautés que nos utilisateurs adorent. Rien n'a pu nous distraire, et notre constance a été payante.

Notre marque a été utilisée, malmenée, détournée et dénaturée à de nombreuses reprises. Des entreprises ont déclaré de façon mensongère collaborer avec la nôtre, en l'occurrence Amazon. Cela ne nous a pas distraits. Nous avons continué à développer des produits et des communautés hors du commun, que nos utilisateurs adorent. La distraction est l'ennemie de l'entreprise, et nous refusons de lui céder la place. C'est vous, les utilisateurs, qui nous importez et non pas le bruit ambiant.

Lorsque nous avons uni nos forces avec d'autres entreprises, nous avons ouvert notre code. Lorsque nous avons commencé à observer que nos utilisateurs utilisaient nos produits pour l'APM (monitoring des performances applicatives), nous étions vraiment enthousiastes. Nous avons uni nos forces avec OpBeat, une entreprise 100 % SaaS dans le domaine de l'APM. Ce fut pour nous un investissement commercial considérable. Nous avons ouvert la plus grande partie du code source et rendu le service totalement gratuit. La décision fut facile à prendre, car nous souhaitons développer des produits et des communautés hors du commun, que les utilisateurs adorent et méritent.

Alors que d'autres fermaient leurs portes, nous avons ouvert les nôtres. Nous avons maintenu le code open source, avec les mêmes licences, et nous sommes obstinés à être une entreprise ouverte. Nous avons passé le code écrit sous licence propriétaire sous une licence plus permissive et avons ouvert le code. Le but fut d'étendre le degré de collaboration et de transparence que nous promouvons avec le code open source à toute notre activité. Nous avons procédé de la sorte en réponse aux nombreuses conversations que nous avions eues avec nos utilisateurs. Je suis ravi des réactions que cela a suscitées parmi vous. Depuis, le niveau de nos investissements dans l'open source n'a fait qu'augmenter, tout comme notre engagement à offrir gratuitement davantage de fonctionnalités et d'expériences d'utilisation, et ce, avec des spécifications et des distributions claires.

Lorsque des entreprises intéressées par notre succès viennent à nous pour contribuer au code et demandent un traitement de faveur qui les placerait au-dessus de nos utilisateurs, nous refusons. Cela est arrivé à de nombreuses reprises au fil des années, et dernièrement, ce fut le cas avec Amazon. Certaines entreprises se rallient et deviennent de merveilleux partenaires pour nous et la communauté. D'autres, malheureusement, ne suivent pas. Nous nous engageons à traiter de la même façon tous les développeurs qui contribuent à nos produits Nous n'accordons aucun traitement de faveur et rejetons toute demande en ce sens. Notre réponse est toujours la même : envoyez-nous une pull request, comme tout le monde. La qualité parlera d'elle-même.

J'écris tout cela pour plusieurs raisons. La première : nous devons tous réfléchir à un moment donné sur la manière et les raisons d'agir qui nous ont mis sur la voie du succès, et ce, pour s'assurer de tenir le cap. Cela inclut nos utilisateurs (vous), notre communauté et notre entreprise. La deuxième concerne toutes les personnes qui font face à tant de distractions : restez concentré et égal à vous-même, c'est tout ce qui importe. La dernière : pour exprimer notre engagement partagé de poursuivre le développement de produits et de communautés hors du commun, que nos utilisateurs adorent. C'est notre véritable boussole.

C'est toujours le Jour 0 chez Elastic (comme les développeurs que nous servons, nous utilisons zéro comme base de numérotation). Rien n'a changé depuis cette première ligne de code et au cours de ces 10 ans de parcours que nous avons partagé avec vous, nos utilisateurs. Il n'y a aucune raison que cela change au cours des nombreuses années à venir. Je vous :elasticheart: tous !

La Suite Elastic 6.7.0 est arrivée

$
0
0
La version 6.7 de la Suite Elastic a fait son entrée – et elle ne devrait pas passer inaperçue. C'est un peu Noël avant l'heure. Ou une mégasurprise de Pâques. Quelque chose de cet ordre-là. Dans cet article de blog, nous vous présentons quelques-unes des grandes nouveautés. Et pour tout savoir sur une fonctionnalité ou un produit particuliers, n'hésitez pas à consulter l'article de blog qui lui est consacré. Mieux : vous pouvez même essayer la nouvelle version pour en juger par vous-même. La version 6.7 est disponible via notre service [Elasticsearch Service](/fr/cloud/elasticsearch-service) – l'unique offre Elasticsearch hébergée à proposer ces nouvelles fonctionnalités. Vous pouvez aussi choisir de [télécharger la Suite](/fr/downloads) si vous préférez tenter une expérience autogérée dans votre environnement de déploiement habituel. ### Elastic Maps : Les données géographiques de Kibana franchissent un nouveau cap Les données géographiques jouent un rôle important dans la recherche. Dans certains cas d'utilisation, elles s'avèrent même essentielles : qu'il s'agisse de donner un avis sur des restaurants du quartier, de comprendre à quel endroit la dernière campagne marketing a été la plus performante, ou encore de traquer les menaces réseau sur les quatre continents. Au fil des ans, nous avons massivement investi dans l'amélioration des fonctionnalités géographiques intégrées à la Suite Elastic : stockage plus efficace ; énormes améliorations apportées aux performances de la recherche dans Elasticsearch ; plus grand nombre d'options de visualisation géospatiale dans Kibana ; hébergement gratuit de fonds de carte et de frontières nationales et régionales avec Elastic Maps Service. Nous avons continué sur notre lancée, et sommes aujourd'hui ravis de vous proposer Elastic Maps, une nouvelle solution dédiée à la cartographie, à la recherche et à la visualisation de données géospatiales dans Kibana. Avec Elastic Maps, les options existantes de visualisation géospatiale de Kibana passent à la vitesse supérieure. Parmi les nouvelles fonctionnalités, citons : - la visualisation de différentes couches et sources de données sur la même carte - la définition dynamique des styles sur les couches vectorielles des cartes - la cartographie des données agrégées et des données au niveau du document - le contrôle de la visibilité des couches individuelles (en fonction du niveau de zoom), afin de maîtriser l'encombrement visuel Et comme toujours dans Kibana, Elastic Maps intègre la barre de recherche avec fonction de remplissage automatique, vous offrant ainsi l'expérience de recherche et de requête ad hoc en temps réel à laquelle vous a habitué la Suite Elastic. ![enter image description here][1] Zoom sur Elastic Maps dans cet [article de blog dédié au lancement de notre nouvelle solution](/fr/blog/elastic-maps-beta-released). ### Elastic Uptime : Monitorez activement la disponibilité des services et des applications Pour aider les utilisateurs à rationaliser les opérations liées au monitoring et à l'observabilité de leur infrastructure, nous avons introduit dans les dernières versions quelques nouvelles fonctionnalités, comme la découverte automatique pour Kubernetes, ou encore les solutions Infrastructure et Logs. Et pour ne pas nous arrêter en si bon chemin, nous lançons cette fois une nouvelle solution, Elastic Uptime. Détecter l'interruption ou le ralentissement des services applicatifs devient plus simple et les utilisateurs sont avertis des problèmes de manière proactive, avant même que l'application n'appelle les services concernés. Adossée à Heartbeat, agent léger conçu pour le transfert des données relatives au monitoring de la disponibilité, la solution Uptime peut aussi bien être déployée sur le réseau de l'entreprise qu'hors de celui-ci. Il lui suffit d'accéder au réseau et au point de terminaison HTTP, TCP ou ICMP à monitorer. Exemples de cas d'utilisation de la solution Uptime : disponibilité des hôtes, ou encore monitoring des services, des sites web et des API. Pour les utilisateurs, le transfert des données de disponibilité dans Elasticsearch avec les logs, les indicateurs et les données de traçage, se traduit par un suivi et une gestion plus efficaces des données, qui sont stockées dans un seul et même datastore opérationnel. ![enter image description here][2] Pour tout savoir sur la nouvelle solution Uptime, consultez cet [article de blog détaillé](/fr/blog/elastic-uptime-monitoring-solution-released). ## Elasticsearch Pour Elasticsearch, la version 6.7 marque un nouveau tournant. Outre le lancement de nouvelles fonctionnalités, **nous sommes ravis d'annoncer que bon nombre de fonctionnalités clés d'Elasticsearch passent en disponibilité générale et sont prêtes pour la production.** Comme évoqué dans l'article de blog consacré à Elasticsearch, si l'acronyme de la fonctionnalité Elasticsearch en question est un acronyme de trois lettres, il est fort probable qu'elle soit passée en disponibilité générale dans la version 6.7. ### La réplication inter-clusters (CCR) est disponible D'abord introduite en version bêta dans la version 6.5, la réplication inter-clusters (en anglais, CCR, "Cross Cluster Replication") faisait partie des fonctionnalités Elasticsearch les plus massivement demandées. CCR répond à de nombreux cas d'utilisation. Par exemple : la réplication entre data centers et entre régions, la réplication de données pour les rapprocher du serveur applicatif et de l'utilisateur, ou encore la réplication d'un grand nombre de petits clusters dans un cluster de reporting centralisé. Outre la disponibilité de cette fonctionnalité devenue mature, la version 6.7 rime aussi avec une plus grande facilité d'utilisation de la réplication inter-clusters et une optimisation de son interface utilisateur. Pour des informations plus détaillées, consultez l'[article de blog consacré à Elasticsearch 6.7.0](/fr/blog/elasticsearch-6-7-0-released). ### La gestion du cycle de vie des index (ILM) est disponible La gestion du cycle de vie des index (en anglais, ILM, "Index lifecycle management"), lancée en version bêta dans Elasticsearch 6.6, passe maintenant en disponibilité générale et devient prête pour la production. La façon dont les index Elasticsearch sont stockés et gérés au fil du temps constitue une tâche administrative cruciale pour l'optimisation des coûts et des performances des clusters. Comme son nom l'indique, cette fonctionnalité permet aux administrateurs Elasticsearch de définir et d'automatiser les règles relatives à la gestion du cycle de vie des index, c'est-à-dire l'approche adoptée pour la gestion et le déplacement des données entre les phases hot, warm, cold et leur suppression, à mesure qu'elles vieillissent. Outre sa disponibilité générale, la version 6.7 étend les possibilités qu'offre cette fonctionnalité. Notamment, les utilisateurs peuvent désormais ajouter à la phase cold une action "freeze index" (geler l'index), ce qui réduit considérablement la mémoire nécessaire au stockage de l'index. Pour en savoir plus sur cette amélioration et les autres nouveautés apportées à la gestion du cycle de vie des index, consultez l'[article de blog consacré à Elasticsearch 6.7.0](/fr/blog/elasticsearch-6-7-0-released). ### Elasticsearch SQL est disponible (y compris les clients JDBC et ODBC) Initialement lancé avec la version 6.3, [Elasticsearch SQL](/fr/products/stack/elasticsearch-sql) avait permis aux utilisateurs d'interagir avec leurs données Elasticsearch et de les interroger grâce à une syntaxe qu'ils connaissent très bien : SQL. L'ajout de cette fonctionnalité met la puissance full text d'Elasticsearch à la portée d'un très grand nombre d'utilisateurs. Outre la syntaxe de requête SQL, la fonctionnalité Elasticsearch SQL intègre aussi les clients JDBC et ODBC, ce qui permet aux outils tiers compatibles avec ces pilotes de se connecter à Elasticsearch, qui peut alors leur servir de datastore back-end. Et toutes ces fonctionnalités passent en disponibilité générale. Pour tout savoir sur le sujet, consultez l'[article de blog consacré à Elasticsearch 6.7.0](/fr/blog/elasticsearch-6-7-0-released). Le présent post ne fait qu'effleurer les nouveautés d'Elasticsearch 6.7. Elasticsearch 6.7 vous réserve tant d'autres belles choses. Découvrez-les dans l'[article de blog consacré à Elasticsearch 6.7.0](/fr/blog/elasticsearch-6-7-0-released). ## Kibana ### Canvas est disponible [Canvas](/fr/products/stack/canvas), qui avait fait son entrée en version bêta avec la Suite Elastic 6.5, permet à l'utilisateur de mettre ses données actives Elasticsearch sous les feux de la rampe, grâce à des présentations irréprochables. Dans la version 6.7, Canvas passe en disponibilité générale. Avec Canvas, les performances visuelles de Kibana atteignent de nouveaux sommets et l'analyse des données, ainsi que les précieuses informations qu'elles recèlent, deviennent accessibles à une audience élargie. Il est pleinement compatible avec Elasticsearch SQL, et tout comme les clients JDBC et ODBC, il permet aux utilisateurs d'Elasticsearch d'étendre l'impact et la portée de leurs données, qui peuvent désormais toucher un plus grand nombre de collaborateurs. ### Kibana se met au chinois simplifié Avec la version 6.7, voici la première version localisée de Kibana, qui est désormais disponible en chinois simplifié. Et ce n'est qu'un début, car Kibana est bien parti pour se transformer en tour de Babel. Outre le lancement de l'interface en chinois simplifié, Kibana 6.7 signe l'arrivée d'un nouveau framework de localisation, conçu pour la prise en charge d'autres langues à l'avenir. Ce framework de localisation permet aussi aux membres de la communauté Elastic d'accéder aux outils qui leur permettent d'ajouter leurs traductions personnalisées. Pour tout savoir sur la disponibilité générale de Canvas, la version localisée de Kibana et les autres fonctionnalités de Kibana 6.7, consultez l'[article de blog consacré à Kibana 6.7](/fr/blog/kibana-6-7-0-released). ## Beats ### Functionbeat est disponible Functionbeat est un nouveau type d'agent Beat qui se déploie comme une fonction sur des frameworks sans serveur, et permet de diffuser des logs et des indicateurs d'infrastructure cloud vers Elasticsearch. Lancé en version bêta avec la Suite Elastic 6.5, il passe en disponibilité générale avec la version 6.7. Functionbeat est compatible avec le framework AWS Lambda et peut récupérer des flux de données depuis CloudWatch Logs, SQS et Kinesis. Découvrez Functionbeat et les nouveautés de la famille Beats 6.7 dans cet [article de blog consacré aux agents Beats](/fr/blog/beats-6-7-0-released) ### Les solutions Logs et Infrastructure sont maintenant disponibles Les solutions [Infrastructure](/fr/blog/elastic-infrastructure-app-released) et [Logs](/fr/blog/elastic-logs-app-released) ont fait leur apparition en bêta avec la version 6.5. Elles passent aujourd'hui en disponibilité générale. La [solution Logs](/fr/solutions/logging) permet aux utilisateurs d'assurer le suivi de leurs logs en temps réel via un affichage compact et personnalisable.. Le processus est similaire au suivi des fichiers, à cette différence que l'utilisateur a la possibilité d'afficher l'ensemble des logs de toute l'infrastructure dans un seul et même aperçu en flux continu. Et grâce à la barre de recherche intégrée (propulsée par Elasticsearch), l'utilisateur peut facilement affiner l'affichage en flux continu, pour n'afficher que les logs qu'il recherche. Avec la [solution Infrastructure](/fr/solutions/metrics), l'utilisateur a une vue à 360° sur l'intégrité de tous les composants de son infrastructure – serveurs, pods Kubernetes, conteneurs Docker – ce qui facilite le diagnostic des problèmes grâce aux données de logs et d'indicateurs. Intégrant les capacités de détection automatique de Metricbeat, son interface utilisateur personnalisée permet un affichage et une analyse détaillée des logs, des indicateurs et des traces APM. Le tout, en un seul clic et de manière interactive. ## Prêt pour la version 7.0 ? L'Assistant de mise à niveau est là pour cela La version 7.0.0 ne saurait tarder (sa [version bêta est déjà disponible ici](/fr/blog/elastic-stack-7-0-0-beta1-released)). L'Assistant de mise à niveau intégré à la version 6.7 est là pour vous aider à préparer l'environnement existant de votre Suite Elastic, en vue de sa mise à niveau vers la version 7.0. Intégrant à la fois des API et des IU, l'Assistant de mise à niveau est un outil important, conçu pour vérifier votre cluster et vous aider à planifier votre mise à niveau. Il vous permet aussi d'identifier des éléments comme les messages de dépréciation, les index à mettre à niveau ou à réindexer, et plus encore, l'objectif étant d'assurer une mise à niveau en douceur. ### Lancez-vous Déployez un cluster sur [Elasticsearch Service](/fr/cloud/elasticsearch-service/signup) ou [téléchargez notre Suite](/fr/downloads) et partez à la découverte des nouvelles fonctionnalités. [1]: /frhttps://www.elastic.co/assets/blt9538fc85a7f25afe/gif-maps-stack-pr-med-fidelity.gif [2]: /frhttps://www.elastic.co/assets/blt7c47d118cca749df/image4.gif

Monitoring des conteneurs Kubernetes et Docker avec Beats : logs, indicateurs et métadonnées

$
0
0

Ce blog présente le monitoring de l'environnement d'un conteneur, pouvant inclure Google Kubernetes Engine (GKE), IBM Cloud Kubernetes Service et tous les autres environnements Kubernetes (k8s) et Docker. Dans ce blog, j'utilise IBM Cloud Kubernetes Service.

Vous vous demandez peut-être pourquoi le sujet de cet article est le monitoring des conteneurs Kubernetes et Docker. Les fournisseurs cloud gèrent l'infrastructure et je n'ai qu'à me soucier de mon application, n'est-ce pas ? C'est peut-être vrai, mais je suis le genre de personne qui consulte les avis Yelp même si j'ai reçu des recommandations personnelles, et plus j'ai d'informations, mieux c'est. Je veux que tous les logs et indicateurs concernant mon application et son environnement soient disponibles. Je veux également pouvoir rechercher, visualiser et créer des alertes à leur sujet. Ce monitoring classique des conteneurs est génial, mais je vais aussi vous présenter une façon sympa d'utiliser les événements et les métadonnées Kubernetes pour annoter le diagramme de performances de mon application avec des notifications concernant la montée en charge ou les mises à niveau.

Avant de poursuivre, définissons quelques termes.

  • Log : un horodatage et un message. Il pourrait comprendre des entrées de logs classiques telles que "NGINX started at 13:42" (NGINX a démarré à 13:42) ainsi que des événements k8s tels que "There was an NGINX container with a Back-off restarting failed container at 16:20" (Un conteneur NGINX a envoyé des messages plusieurs fois et n'a pas pu redémarrer à 16:20).
  • Indicateur : une mesure numérique collectée au cours d'une période définie. Par exemple, "Sales through the eCommerce site were $50,000 over the past ten minutes" (Les ventes sur le site d'e-commerce s'élevaient à 50 000 $ ces dix dernières minutes) ou "CPU utilization was 17% from 14:00:00 to 14:00:10" (L'utilisation du processeur était de 17 % de 14:00:00 à 14:00:10).

Déploiement de l'application dans un cluster Kubernetes

Pour mon exemple, je vais utiliser cette application basée sur Apache HTTP Server, PHP et Redis.

k8s-module-1.png

D'autre part, pour monitorer l'application et l'infrastructure du conteneur, nous avons : 

  • Un déploiement Elasticsearch Service hébergé sur Elastic Cloud.
  • Les agents Beats, les agents légers de transfert de logs et d'indicateurs sont déployés comme un DaemonSet dans le même cluster Kubernetes. Notez que cela peut remplacer Fluentd qui est généralement déployé dans un cluster Kubernetes.

Logs et indicateurs

L'application ci-dessus n'est qu'une partie d'un écosystème qui génère en permanence des informations que nous devrions collecter. Voici les niveaux à partir desquels nous collectons ces logs et indicateurs :

  1. Orchestration (Kubernetes)
  2. Hôtes
  3. Application
  4. Conteneur (Docker)

k8s-module-2.png

Pour collecter les données, nous utilisons les agents Beats (Filebeat, Metricbeat et Packetbeat) et les modules System, Kubernetes et Docker ainsi que des modules pour l'application (Apache et Redis). Nous avons déployé un DaemonSet pour chaque agent Beat et nous laissons Kubernetes les gérer. Si la liste semble longue, ne vous laissez pas effrayer. En effet, la fonctionnalité Autodiscover de Beats vous simplifie la tâche.  Dans ce blog et dans la vidéo qui l'accompagne, vous trouverez les détails du déploiement des agents Beats pour monitorer une application.  En fait, si vous souhaitez commencer par le commencement, consultez la page du monitoring des conteneurs.

Pour indexer, stocker, rechercher, analyser et visualiser les données, j’ai utilisé Elasticsearch Service hébergé sur Elastic Cloud. Le déploiement d’Elasticsearch Service sur Elastic Cloud est détaillé dans notre page "Getting Started" tout comme le déploiement d’Elasticsearch et de Kibana dans un système que vous gérez vous-même. Dans tous les cas, ça fonctionne très bien.

J'ai évoqué les agents Beats et les modules, et je pense que ceux-ci méritent une meilleure introduction. Un agent Beat est un agent léger qui envoie des données à Elasticsearch ou Logstash. Parfois, les agents Beats sont déployés à l'origine des données, comme sur un système physique ou virtuel. D'autres fois, ils sont déployés parallèlement aux sources, comme, par exemple, un DaemonSet (c’est ce que j'ai fait ici). Les modules simplifient la collecte, l'analyse, l'indexation et la visualisation des formats de logs les plus courants.

Ce que je viens de vous présenter peut vous sembler un peu ennuyeux. Voyons les choses sous un autre angle : les modules Elastic propose une expérience prête à l'emploi. Imaginons que vous savez tout de la gestion d'Apache HTTPD Server, mais que vous ne connaissez pas NGINX. Vous pourriez aller voir quelqu'un qui s'y connaît en NGINX et lui demander "À quoi fais-tu attention dans les logs ? À quels indicateurs fais-tu attention ? Peux-tu me donner les greps de ton fichier d'historique ?" Selon moi, les réponses à ces questions définissent les modules des agents Beats : tableaux de bord prédéfinis, recherches enregistrées, analyse et collecte pour des tas de choses comme Kubernetes, Docker, NGINX, Apache, systèmes d'exploitation, bases de données, etc. D'après mon expérience, il s'agit d'un ensemble de fonctionnalités très puissantes.

Le module k8s collecte des indicateurs relatifs aux pods, nœuds, volumes, ReplicaSets, déploiements, etc. Chaque indicateur possède un ensemble riche de métadonnées pour que vous puissiez relier les données à votre application. Par exemple, vous pourriez ne pas vous soucier du fait que le pod xyz soit proche de la limite d'utilisation de la mémoire, mais si cet indicateur est présenté en association avec le frontend de votre application, alors vous connaissez la valeur pour votre entreprise. Il collecte également des événements (souvenez-vous, j'avais inclus les événements Kubernetes dans la définition du log ci-dessus) que nous utilisons pour enrichir le diagramme de performances dans la vidéo ci-dessous.

Le module Docker collecte des indicateurs relatifs aux conteneurs, aux hôtes, à la mémoire, au réseau, aux vérifications d'intégrité, etc. À l'instar du module Kubernetes, les métadonnées sont très précieuses pour comprendre les performances de votre application et de l'environnement.

Il existe de nombreux autres modules pour Filebeat et Metricbeat. En outre, Packetbeat est compatible avec de nombreux tableaux de bord pour des services tels que Cassandra, Flows, HTTP, MySQL, MongoDB, etc.

Regardez cette vidéo et découvrez à quel point il est facile de transformer les données en renseignements exploitables. La vidéo traite les points suivants :

  • Visualiser les événements Kubernetes avec les indicateurs de performance de l'application
  • Découvrir l'ensemble d'indicateurs d'événements du module Metricbeat Kubernetes
  • Naviguer dans les événements Kubernetes et créer la visualisation personnalisée

La Suite Elastic 6.7.0 est arrivée

$
0
0
La version 6.7 de la Suite Elastic a fait son entrée – et elle ne devrait pas passer inaperçue. C'est un peu Noël avant l'heure. Ou une mégasurprise de Pâques. Quelque chose de cet ordre-là. Dans cet article de blog, nous vous présentons quelques-unes des grandes nouveautés. Et pour tout savoir sur une fonctionnalité ou un produit particuliers, n'hésitez pas à consulter l'article de blog qui lui est consacré. Mieux : vous pouvez même essayer la nouvelle version pour en juger par vous-même. La version 6.7 est disponible via notre service [Elasticsearch Service](/fr/cloud/elasticsearch-service) – l'unique offre Elasticsearch hébergée à proposer ces nouvelles fonctionnalités. Vous pouvez aussi choisir de [télécharger la Suite](/fr/downloads) si vous préférez tenter une expérience autogérée dans votre environnement de déploiement habituel. ### Elastic Maps : Les données géographiques de Kibana franchissent un nouveau cap Les données géographiques jouent un rôle important dans la recherche. Dans certains cas d'utilisation, elles s'avèrent même essentielles : qu'il s'agisse de donner un avis sur des restaurants du quartier, de comprendre à quel endroit la dernière campagne marketing a été la plus performante, ou encore de traquer les menaces réseau sur les quatre continents. Au fil des ans, nous avons massivement investi dans l'amélioration des fonctionnalités géographiques intégrées à la Suite Elastic : stockage plus efficace ; énormes améliorations apportées aux performances de la recherche dans Elasticsearch ; plus grand nombre d'options de visualisation géospatiale dans Kibana ; hébergement gratuit de fonds de carte et de frontières nationales et régionales avec Elastic Maps Service. Nous avons continué sur notre lancée, et sommes aujourd'hui ravis de vous proposer Elastic Maps, une nouvelle solution dédiée à la cartographie, à la recherche et à la visualisation de données géospatiales dans Kibana. Avec Elastic Maps, les options existantes de visualisation géospatiale de Kibana passent à la vitesse supérieure. Parmi les nouvelles fonctionnalités, citons : - la visualisation de différentes couches et sources de données sur la même carte - la définition dynamique des styles sur les couches vectorielles des cartes - la cartographie des données agrégées et des données au niveau du document - le contrôle de la visibilité des couches individuelles (en fonction du niveau de zoom), afin de maîtriser l'encombrement visuel Et comme toujours dans Kibana, Elastic Maps intègre la barre de recherche avec fonction de remplissage automatique, vous offrant ainsi l'expérience de recherche et de requête ad hoc en temps réel à laquelle vous a habitué la Suite Elastic. ![enter image description here][1] Zoom sur Elastic Maps dans cet [article de blog dédié au lancement de notre nouvelle solution](/fr/blog/elastic-maps-beta-released). ### Elastic Uptime : Monitorez activement la disponibilité des services et des applications Pour aider les utilisateurs à rationaliser les opérations liées au monitoring et à l'observabilité de leur infrastructure, nous avons introduit dans les dernières versions quelques nouvelles fonctionnalités, comme la découverte automatique pour Kubernetes, ou encore les solutions Infrastructure et Logs. Et pour ne pas nous arrêter en si bon chemin, nous lançons cette fois une nouvelle solution, Elastic Uptime. Détecter l'interruption ou le ralentissement des services applicatifs devient plus simple et les utilisateurs sont avertis des problèmes de manière proactive, avant même que l'application n'appelle les services concernés. Adossée à Heartbeat, agent léger conçu pour le transfert des données relatives au monitoring de la disponibilité, la solution Uptime peut aussi bien être déployée sur le réseau de l'entreprise qu'hors de celui-ci. Il lui suffit d'accéder au réseau et au point de terminaison HTTP, TCP ou ICMP à monitorer. Exemples de cas d'utilisation de la solution Uptime : disponibilité des hôtes, ou encore monitoring des services, des sites web et des API. Pour les utilisateurs, le transfert des données de disponibilité dans Elasticsearch avec les logs, les indicateurs et les données de traçage, se traduit par un suivi et une gestion plus efficaces des données, qui sont stockées dans un seul et même datastore opérationnel. ![enter image description here][2] Pour tout savoir sur la nouvelle solution Uptime, consultez cet [article de blog détaillé](/fr/blog/elastic-uptime-monitoring-solution-released). ## Elasticsearch Pour Elasticsearch, la version 6.7 marque un nouveau tournant. Outre le lancement de nouvelles fonctionnalités, **nous sommes ravis d'annoncer que bon nombre de fonctionnalités clés d'Elasticsearch passent en disponibilité générale et sont prêtes pour la production.** Comme évoqué dans l'article de blog consacré à Elasticsearch, si l'acronyme de la fonctionnalité Elasticsearch en question est un acronyme de trois lettres, il est fort probable qu'elle soit passée en disponibilité générale dans la version 6.7. ### La réplication inter-clusters (CCR) est disponible D'abord introduite en version bêta dans la version 6.5, la réplication inter-clusters (en anglais, CCR, "Cross Cluster Replication") faisait partie des fonctionnalités Elasticsearch les plus massivement demandées. CCR répond à de nombreux cas d'utilisation. Par exemple : la réplication entre data centers et entre régions, la réplication de données pour les rapprocher du serveur applicatif et de l'utilisateur, ou encore la réplication d'un grand nombre de petits clusters dans un cluster de reporting centralisé. Outre la disponibilité de cette fonctionnalité devenue mature, la version 6.7 rime aussi avec une plus grande facilité d'utilisation de la réplication inter-clusters et une optimisation de son interface utilisateur. Pour des informations plus détaillées, consultez l'[article de blog consacré à Elasticsearch 6.7.0](/fr/blog/elasticsearch-6-7-0-released). ### La gestion du cycle de vie des index (ILM) est disponible La gestion du cycle de vie des index (en anglais, ILM, "Index lifecycle management"), lancée en version bêta dans Elasticsearch 6.6, passe maintenant en disponibilité générale et devient prête pour la production. La façon dont les index Elasticsearch sont stockés et gérés au fil du temps constitue une tâche administrative cruciale pour l'optimisation des coûts et des performances des clusters. Comme son nom l'indique, cette fonctionnalité permet aux administrateurs Elasticsearch de définir et d'automatiser les règles relatives à la gestion du cycle de vie des index, c'est-à-dire l'approche adoptée pour la gestion et le déplacement des données entre les phases hot, warm, cold et leur suppression, à mesure qu'elles vieillissent. Outre sa disponibilité générale, la version 6.7 étend les possibilités qu'offre cette fonctionnalité. Notamment, les utilisateurs peuvent désormais ajouter à la phase cold une action "freeze index" (geler l'index), ce qui réduit considérablement la mémoire nécessaire au stockage de l'index. Pour en savoir plus sur cette amélioration et les autres nouveautés apportées à la gestion du cycle de vie des index, consultez l'[article de blog consacré à Elasticsearch 6.7.0](/fr/blog/elasticsearch-6-7-0-released). ### Elasticsearch SQL est disponible (y compris les clients JDBC et ODBC) Initialement lancé avec la version 6.3, [Elasticsearch SQL](/fr/products/stack/elasticsearch-sql) avait permis aux utilisateurs d'interagir avec leurs données Elasticsearch et de les interroger grâce à une syntaxe qu'ils connaissent très bien : SQL. L'ajout de cette fonctionnalité met la puissance full text d'Elasticsearch à la portée d'un très grand nombre d'utilisateurs. Outre la syntaxe de requête SQL, la fonctionnalité Elasticsearch SQL intègre aussi les clients JDBC et ODBC, ce qui permet aux outils tiers compatibles avec ces pilotes de se connecter à Elasticsearch, qui peut alors leur servir de datastore back-end. Et toutes ces fonctionnalités passent en disponibilité générale. Pour tout savoir sur le sujet, consultez l'[article de blog consacré à Elasticsearch 6.7.0](/fr/blog/elasticsearch-6-7-0-released). Le présent post ne fait qu'effleurer les nouveautés d'Elasticsearch 6.7. Elasticsearch 6.7 vous réserve tant d'autres belles choses. Découvrez-les dans l'[article de blog consacré à Elasticsearch 6.7.0](/fr/blog/elasticsearch-6-7-0-released). ## Kibana ### Canvas est disponible [Canvas](/fr/products/stack/canvas), qui avait fait son entrée en version bêta avec la Suite Elastic 6.5, permet à l'utilisateur de mettre ses données actives Elasticsearch sous les feux de la rampe, grâce à des présentations irréprochables. Dans la version 6.7, Canvas passe en disponibilité générale. Avec Canvas, les performances visuelles de Kibana atteignent de nouveaux sommets et l'analyse des données, ainsi que les précieuses informations qu'elles recèlent, deviennent accessibles à une audience élargie. Il est pleinement compatible avec Elasticsearch SQL, et tout comme les clients JDBC et ODBC, il permet aux utilisateurs d'Elasticsearch d'étendre l'impact et la portée de leurs données, qui peuvent désormais toucher un plus grand nombre de collaborateurs. ### Kibana se met au chinois simplifié Avec la version 6.7, voici la première version localisée de Kibana, qui est désormais disponible en chinois simplifié. Et ce n'est qu'un début, car Kibana est bien parti pour se transformer en tour de Babel. Outre le lancement de l'interface en chinois simplifié, Kibana 6.7 signe l'arrivée d'un nouveau framework de localisation, conçu pour la prise en charge d'autres langues à l'avenir. Ce framework de localisation permet aussi aux membres de la communauté Elastic d'accéder aux outils qui leur permettent d'ajouter leurs traductions personnalisées. Pour tout savoir sur la disponibilité générale de Canvas, la version localisée de Kibana et les autres fonctionnalités de Kibana 6.7, consultez l'[article de blog consacré à Kibana 6.7](/fr/blog/kibana-6-7-0-released). ## Beats ### Functionbeat est disponible Functionbeat est un nouveau type d'agent Beat qui se déploie comme une fonction sur des frameworks sans serveur, et permet de diffuser des logs et des indicateurs d'infrastructure cloud vers Elasticsearch. Lancé en version bêta avec la Suite Elastic 6.5, il passe en disponibilité générale avec la version 6.7. Functionbeat est compatible avec le framework AWS Lambda et peut récupérer des flux de données depuis CloudWatch Logs, SQS et Kinesis. Découvrez Functionbeat et les nouveautés de la famille Beats 6.7 dans cet [article de blog consacré aux agents Beats](/fr/blog/beats-6-7-0-released) ### Les solutions Logs et Infrastructure sont maintenant disponibles Les solutions [Infrastructure](/fr/blog/elastic-infrastructure-app-released) et [Logs](/fr/blog/elastic-logs-app-released) ont fait leur apparition en bêta avec la version 6.5. Elles passent aujourd'hui en disponibilité générale. La [solution Logs](/fr/solutions/logging) permet aux utilisateurs d'assurer le suivi de leurs logs en temps réel via un affichage compact et personnalisable.. Le processus est similaire au suivi des fichiers, à cette différence que l'utilisateur a la possibilité d'afficher l'ensemble des logs de toute l'infrastructure dans un seul et même aperçu en flux continu. Et grâce à la barre de recherche intégrée (propulsée par Elasticsearch), l'utilisateur peut facilement affiner l'affichage en flux continu, pour n'afficher que les logs qu'il recherche. Avec la [solution Infrastructure](/fr/solutions/metrics), l'utilisateur a une vue à 360° sur l'intégrité de tous les composants de son infrastructure – serveurs, pods Kubernetes, conteneurs Docker – ce qui facilite le diagnostic des problèmes grâce aux données de logs et d'indicateurs. Intégrant les capacités de détection automatique de Metricbeat, son interface utilisateur personnalisée permet un affichage et une analyse détaillée des logs, des indicateurs et des traces APM. Le tout, en un seul clic et de manière interactive. ## Prêt pour la version 7.0 ? L'Assistant de mise à niveau est là pour cela La version 7.0.0 ne saurait tarder (sa [version bêta est déjà disponible ici](/fr/blog/elastic-stack-7-0-0-beta1-released)). L'Assistant de mise à niveau intégré à la version 6.7 est là pour vous aider à préparer l'environnement existant de votre Suite Elastic, en vue de sa mise à niveau vers la version 7.0. Intégrant à la fois des API et des IU, l'Assistant de mise à niveau est un outil important, conçu pour vérifier votre cluster et vous aider à planifier votre mise à niveau. Il vous permet aussi d'identifier des éléments comme les messages de dépréciation, les index à mettre à niveau ou à réindexer, et plus encore, l'objectif étant d'assurer une mise à niveau en douceur. ### Lancez-vous Déployez un cluster sur [Elasticsearch Service](/fr/cloud/elasticsearch-service/signup) ou [téléchargez notre Suite](/fr/downloads) et partez à la découverte des nouvelles fonctionnalités. [1]: /frhttps://www.elastic.co/assets/blt9538fc85a7f25afe/gif-maps-stack-pr-med-fidelity.gif [2]: /frhttps://www.elastic.co/assets/blt7c47d118cca749df/image4.gif

Monitoring d'applications avec Elasticsearch et Elastic APM

$
0
0

Qu'est-ce que le monitoring des performances applicatives (APM) ?

Lorsque je parle de l'APM, il me semble utile d'inclure les autres facettes de l'"observabilité" : les logs et les indicateurs d'infrastructure. Les logs, l'APM et les indicateurs d'infrastructure constituent le trio gagnant de l'observabilité :

Il existe suffisamment de points de chevauchement pour mettre ces éléments en corrélation. Les logs peuvent signaler une erreur sans en préciser le motif. Les indicateurs peuvent signaler une augmentation soudaine de l'utilisation du processeur sans en indiquer la cause. C'est pourquoi nous pouvons résoudre un ensemble bien plus vaste de problèmes en recoupant ces informations.

Logs

D'abord, penchons-nous sur quelques définitions. Il existe une différence subtile entre les logs et les indicateurs. En général, les logs sont des événements générés lorsque quelque chose se produit, comme la réception d'une demande, la réponse qui en découle, l'ouverture d'un fichier ou une commande printf identifiée dans le code.

Par exemple, le format de log du projet Apache HTTP Server est fréquemment utilisé (l'exemple fictif suivant a été simplifié) :

264.242.88.10 - - [22/Jan/2018:07:08:53 -0800] "GET /ESProductDetailView HTTP/1.1" 200 6291
264.242.88.10 - - [22/Jan/2018:07:08:53 -0800] "POST /intro.m4v HTTP/1.1" 404 7352
264.242.88.10 - - [22/Jan/2018:16:38:53 -0800] "POST /checkout/addresses/ HTTP/1.1" 500 5253

Les logs se rattachent le plus souvent au composant plutôt qu'à l'application. Les logs sont commodes, car ils sont généralement interprétables par l'utilisateur. Dans l'exemple ci-dessus, nous observons une adresse IP, un champ qui apparemment n'a pas été configuré, une date, la page consultée par l'utilisateur suivie d'une méthode et deux numéros. D'après mon expérience, je sais que ces numéros correspondent au code de réponse (200 : tout va bien, 404 : il y a un problème, 500 : rien ne va plus) et à la quantité de données renvoyées.

En plus d'être généralement interprétables par l'utilisateur, les logs sont pratiques, car ils sont habituellement disponibles dans l'instance de l'hôte, de la machine ou du conteneur qui exécute l'application ou le service correspondant. Les logs ont cependant un inconvénient directement lié à leur nature : il faut les coder. Pour ce faire, vous devrez explicitement utiliser des commandes telles que puts dans Ruby ou system.out.println dans Java. Même si vous procédez de la sorte, la mise en forme est importante. Le format de date des logs Apache présentés ci-dessus est particulier. Par exemple, prenez la date "01/02/2019". Pour moi qui vis aux États-Unis, cette date correspond au 2 janvier 2019, mais elle correspond au 1er févier pour un grand nombre d'utilisateurs. Pensez à ce genre de détails lorsque vous mettez en forme des déclarations de logging.

Indicateurs

Les indicateurs sont généralement des résumés ou des totaux périodiques. Par exemple, au cours des 10 dernières secondes, l'utilisation moyenne du processeur s'élevait à 12 %, une application donnée utilisait 27 Mo de mémoire et le disque principal utilisait 71 % de ses capacités (c'était le cas sur ma machine, je viens de vérifier).

La capture d'écran ci-dessus présente la commande iostat exécutée sur un Mac. Elle contient de nombreux indicateurs. Les indicateurs sont utiles pour présenter des tendances ainsi que des données historiques, et le sont d'autant plus lorsque vous souhaitez créer des règles simples, prévisibles et fiables dans le but d'identifier des incidents et des anomalies. Les indicateurs ont cependant l'inconvénient de monitorer la couche d'infrastructure et d'extraire les données au niveau de l'instance des composants (hôtes, conteneurs et réseau) plutôt qu'au niveau de l'application. En outre, les anomalies de courte durée risquent d'être invisibles, car la période de référence des indicateurs est trop étendue.

APM

Le monitoring des performances applicatives permet de faire le lien entre les indicateurs et les logs. Bien que les logs et les indicateurs soient généralement transversaux (ils se réfèrent à l'infrastructure et aux composants), APM se concentre sur les applications et permet aux services informatiques ainsi qu'aux développeurs de monitorer la couche applicative de leur suite, y compris l'expérience des utilisateurs finaux.

Ajoutez APM à vos activités de monitoring pour :

  • comprendre à quoi votre service consacre du temps ainsi que l'origine des pannes ;
  • observer comment les services interagissent entre eux et visualiser les goulets d'étranglement ;
  • identifier de façon proactive et réparer les goulets d'étranglement de performances et les erreurs ;
    • de préférence, avant que de nombreux clients soient affectés ;
  • augmenter la productivité de l'équipe de développement ;
  • suivre l'expérience des utilisateurs finaux dans le navigateur.

Il est important de noter qu'APM comprend le code (nous nous pencherons sur cet aspect dans un moment).

Comparons APM aux résultats des logs. Reprenons cette entrée de log :

264.242.88.10 - - [22/Jan/2018:07:08:53 -0800] "GET /ESProductDetailView HTTP/1.1" 200 6291

À première vue, cette entrée n'indique rien d'anormal. Nous avons répondu avec succès (200) et renvoyé 6291 octets. En revanche, cette entrée n'indique pas que l'opération a duré 16,6 secondes, comme l'indique cette capture d'écran d'APM :

Cette information peut se révéler très utile. Nous avons aussi identifié une erreur dans les logs ci-dessus :

264.242.88.10 - - [22/Jan/2018:07:08:53 -0800] "POST /checkout/addresses/ HTTP/1.1" 500 5253

APM permet également d'examiner les erreurs :

APM nous indique quand elles sont survenues pour la dernière fois, le nombre d'occurrences et si elles ont été traitées par l'application. Alors que nous explorons en détail l'exception NumberParseException, un graphique illustre la distribution du nombre d'occurrences de cette erreur.

Nous constatons immédiatement que l'erreur survient quelques fois par période, et ce, pratiquement tout au long de la journée. Nous pourrions certainement identifier la trace d'appels dans l'un des fichiers de logs, mais il est probable que ces derniers ne bénéficient pas du contexte et des métadonnées disponibles dans APM :

Le rectangle rouge met l'accent sur les lignes de code qui ont causé l'exception, et les métadonnées fournies par APM indiquent exactement l'origine du problème. Même un programmeur, comme moi, qui n'utilise par Python peut identifier le problème avec exactitude et disposer de suffisamment d'informations pour ouvrir un ticket.

Tour des fonctionnalités d'APM (avec captures d'écran)

Je pourrais parler d'Elastic APM toute la journée (suivez-moi sur Twitter si vous ne me croyez pas), mais vous préférez certainement découvrir ce dont cette solution est capable. Commençons la visite.

Ouverture d'APM

Lorsque nous ouvrons l'application APM dans Kibana, tous les services configurés avec Elastic APM s'affichent :

Parcourir les services

Nous pouvons explorer les services dans le détail. Consultons par exemple le service "petclinic-spring". La présentation de chaque service est semblable à celle-ci :

Le graphique situé en haut à gauche représente les temps de réponse moyens, du 95e centile et du 99e centile pour repérer les anomalies. Nous pouvons aussi afficher ou masquer les différents éléments de courbe pour mieux apprécier la façon dont les anomalies affectent le graphique d'ensemble. Chaque courbe du graphique situé en haut à droite représente un code de réponse et indique le nombre de demandes par minute à un moment donné. Comme vous pouvez le constater, à mesure que vous déplacez le curseur sur l'un des graphiques, une fenêtre contextuelle résume les informations qui se rapportent au moment que vous pointez. Une information importante est disponible avant même que nous approfondissions notre exploration : le pic énorme de latence ne correspond à aucune réponse 500 (erreur de serveur).

Exploration des temps de réponse de transaction

En poursuivant notre tour du résumé des transactions, nous arrivons à la vue détaillée des demandes. Chaque demande est essentiellement un point de terminaison différent au sein de notre application (bien que nous puissions augmenter les valeurs par défaut à l'aide des API Agent). Je peux ordonner les données en fonction des titres de colonne. Je choisis la colonne "impact", car elle prend en compte la latence et la popularité d'une demande donnée. Dans notre exemple, les demandes "getOwners" sont les plus gourmandes, mais leurs 96 ms de latence moyenne restent malgré tout convenables. En creusant dans les détails de cette transaction, nous observons la même forme que celle que nous avons déjà constatée :

Opérations en cascade

Même les demandes les plus lentes durent moins d'une seconde. En faisant défiler l'écran vers le bas nous accédons à une vue en cascade des opérations de la transaction :

Affichage des détails de la recherche

Nous pouvons observer que de nombreuses déclarations SELECT se produisent. Avec APM, nous pouvons examiner les recherches en cours d'exécution :

Traçage distribué

Cette suite d'applications repose sur une architecture de microservice multiniveau. Étant donné que tous les niveaux sont configurés pour fonctionner avec Elastic APM, nous pouvons élargir notre horizon en cliquant sur le bouton "View full trace" (Afficher la trace complète) pour examiner tout ce qui a trait à cet appel et afficher une trace distribuée de tous les composants impliqués dans la transaction :

Couches de traces

Dans cet exemple, notre couche de départ (la couche Spring) est un service appelé par d'autres couches. Nous pouvons désormais observer que "petclinic-node" a appelé la couche "petclinic-spring". Il ne s'agit que de deux couches, mais nous en voyons bien d'autres. Dans cet exemple, une demande part de la couche du navigateur (React) :

Real User Monitoring (monitoring des utilisateurs réels)

Pour tirer un maximum de profit du traçage distribué, il est important de configurer autant de composants et de services que possible, y compris le service Real User Monitoring (RUM). Ce n'est pas parce que le temps de réponse de votre service est rapide que la navigation est fluide à partir du navigateur. C'est pourquoi il est important d'évaluer l'expérience des utilisateurs finaux dans le navigateur. Cette trace distribuée présente quatre services différents qui fonctionnent ensemble. Elle inclut le navigateur (le client) ainsi que plusieurs services. À la 53e milliseconde, le DOM est interactif, puis il s'achève à la 67e milliseconde.

Plus qu'une belle interface

Elastic APM ne se réduit pas à une interface utilisateur clé en main d'APM destinée aux développeurs d'applications. Les données qui alimentent cette interface ont d'autres vocations. Le fait que les données d'Elastic APM forment un index supplémentaire constitue un avantage considérable. Les informations sont disponibles immédiatement, avec vos logs, vos indicateurs, voire vos données d'entreprise, et vous permettent d'évaluer l'impact d'un ralentissement de vos serveurs sur votre chiffre d'affaires ou d'exploiter les données d'APM pour planifier votre prochain cycle d'amélioration du code (conseil : jetez un coup d'œil sur les demandes dont l'impact est le plus élevé).

APM intègre les visualisations ainsi que les tableaux de bord par défaut, et nous permet de les utiliser avec les visualisations qui proviennent de logs, d'indicateurs, voire de données d'entreprise.

Prise en main d'Elastic APM

Elastic APM peut s'exécuter en même temps que Logstash et Beats, et suit une topologie de déploiement similaire :

Le serveur APM sert de processeur de données. Il transmet les données des agents APM à Elasticsearch. L'installation est assez simple. Elle est décrite à la page Installation et exécution de notre documentation. Vous pouvez aussi cliquer sur le logo K dans Kibana pour accéder à la page principale de Kibana où se trouve l'option "Add APM" (Ajouter APM) :

Cette option vous indiquera comment installer un serveur APM :

Une fois le serveur installé, Kibana propose des tutoriels pour chaque type d'agent :

Vous pouvez commencer à utiliser Elastic APM avec quelques lignes de code.

Tour d'essai avec Elastic APM

Retroussez vos manches et lancez-vous. C'est la meilleure façon d'apprendre quelque chose de nouveau. Plusieurs possibilités s'offrent à vous. Si vous souhaitez interagir directement avec l'interface, vous pouvez explorer l'environnement APM de démonstration. Si vous souhaitez faire un essai localement, vous pouvez suivre les instructions disponibles sur la page de téléchargement d'APM Server.

Vous cherchez le chemin le plus court ? Utilisez Elasticsearch Service sur Elastic Cloud, notre offre SaaS qui met en quelques minutes un déploiement Elasticsearch complet à votre disposition, y compris un serveur APM (version 6.6 ou ultérieure), une instance Kibana et un nœud de machine learning. Profitez d'un essai gratuit de deux semaines). Mieux encore, nous assurons la maintenance de l'infrastructure de votre déploiement.

Activation d'APM sur Elasticsearch Service

Pour créer un cluster avec APM (ou ajouter APM à un cluster existant), naviguez vers le bas jusqu'à la section de configuration d'APM de votre cluster, cliquez sur "Enable" (Activer), puis cliquez soit sur "Save changes" (Enregistrer les modifications) lorsque vous mettez à jour un déploiement existant, soit sur "Create deployment" (Créer un déploiement) lorsque vous en créez un nouveau.

Licence

Elastic APM Server et tous les agents APM sont open source, et l'interface utilisateur APM conçue avec soin est incluse dans la distribution par défaut de la Suite Elastic sous la licence Basic gratuite. Les intégrations que nous avons mentionnées précédemment (alerting et machine learning) requièrent d'autres licences : la licence Gold pour alerting et la licence Platinum pour machine learning.

Résumé

APM nous permet d'observer le fonctionnement de nos applications à tous les niveaux. Grâce aux intégrations de machine learning et d'alerting, et à sa puissance de recherche, Elastic APM rend l'infrastructure de vos applications plus transparente. Cette solution permet de visualiser les transactions, les traces, les erreurs et les exceptions, le tout à partir d'une interface utilisateur d'APM conçue avec soin. Même lorsque nous n'avons pas de problèmes à résoudre, nous pouvons exploiter les données d'Elastic APM pour classer les correctifs par ordre de priorité, optimiser les performances de nos applications et éviter les goulets d'étranglement.

Si vous souhaitez en savoir plus sur Elastic APM et l'observabilité, découvrez quelques-uns de nos webinaires :

Faites l'essai dès aujourd'hui ! Rejoignez notre forum pour parler avec nous de l'APM. Vous pouvez aussi soumettre des tickets ou des demandes de fonctionnalités sur nos référentiels GitHub destinés à APM.

La Suite Elastic 6.7.0 est arrivée

$
0
0
La version 6.7 de la Suite Elastic a fait son entrée – et elle ne devrait pas passer inaperçue. C'est un peu Noël avant l'heure. Ou une mégasurprise de Pâques. Quelque chose de cet ordre-là. Dans cet article de blog, nous vous présentons quelques-unes des grandes nouveautés. Et pour tout savoir sur une fonctionnalité ou un produit particuliers, n'hésitez pas à consulter l'article de blog qui lui est consacré. Mieux : vous pouvez même essayer la nouvelle version pour en juger par vous-même. La version 6.7 est disponible via notre service [Elasticsearch Service](/fr/cloud/elasticsearch-service) – l'unique offre Elasticsearch hébergée à proposer ces nouvelles fonctionnalités. Vous pouvez aussi choisir de [télécharger la Suite](/fr/downloads) si vous préférez tenter une expérience autogérée dans votre environnement de déploiement habituel. ### Elastic Maps : Les données géographiques de Kibana franchissent un nouveau cap Les données géographiques jouent un rôle important dans la recherche. Dans certains cas d'utilisation, elles s'avèrent même essentielles : qu'il s'agisse de donner un avis sur des restaurants du quartier, de comprendre à quel endroit la dernière campagne marketing a été la plus performante, ou encore de traquer les menaces réseau sur les quatre continents. Au fil des ans, nous avons massivement investi dans l'amélioration des fonctionnalités géographiques intégrées à la Suite Elastic : stockage plus efficace ; énormes améliorations apportées aux performances de la recherche dans Elasticsearch ; plus grand nombre d'options de visualisation géospatiale dans Kibana ; hébergement gratuit de fonds de carte et de frontières nationales et régionales avec Elastic Maps Service. Nous avons continué sur notre lancée, et sommes aujourd'hui ravis de vous proposer Elastic Maps, une nouvelle solution dédiée à la cartographie, à la recherche et à la visualisation de données géospatiales dans Kibana. Avec Elastic Maps, les options existantes de visualisation géospatiale de Kibana passent à la vitesse supérieure. Parmi les nouvelles fonctionnalités, citons : - la visualisation de différentes couches et sources de données sur la même carte - la définition dynamique des styles sur les couches vectorielles des cartes - la cartographie des données agrégées et des données au niveau du document - le contrôle de la visibilité des couches individuelles (en fonction du niveau de zoom), afin de maîtriser l'encombrement visuel Et comme toujours dans Kibana, Elastic Maps intègre la barre de recherche avec fonction de remplissage automatique, vous offrant ainsi l'expérience de recherche et de requête ad hoc en temps réel à laquelle vous a habitué la Suite Elastic. ![enter image description here][1] Zoom sur Elastic Maps dans cet [article de blog dédié au lancement de notre nouvelle solution](/fr/blog/elastic-maps-beta-released). ### Elastic Uptime : Monitorez activement la disponibilité des services et des applications Pour aider les utilisateurs à rationaliser les opérations liées au monitoring et à l'observabilité de leur infrastructure, nous avons introduit dans les dernières versions quelques nouvelles fonctionnalités, comme la découverte automatique pour Kubernetes, ou encore les solutions Infrastructure et Logs. Et pour ne pas nous arrêter en si bon chemin, nous lançons cette fois une nouvelle solution, Elastic Uptime. Détecter l'interruption ou le ralentissement des services applicatifs devient plus simple et les utilisateurs sont avertis des problèmes de manière proactive, avant même que l'application n'appelle les services concernés. Adossée à Heartbeat, agent léger conçu pour le transfert des données relatives au monitoring de la disponibilité, la solution Uptime peut aussi bien être déployée sur le réseau de l'entreprise qu'hors de celui-ci. Il lui suffit d'accéder au réseau et au point de terminaison HTTP, TCP ou ICMP à monitorer. Exemples de cas d'utilisation de la solution Uptime : disponibilité des hôtes, ou encore monitoring des services, des sites web et des API. Pour les utilisateurs, le transfert des données de disponibilité dans Elasticsearch avec les logs, les indicateurs et les données de traçage, se traduit par un suivi et une gestion plus efficaces des données, qui sont stockées dans un seul et même datastore opérationnel. ![enter image description here][2] Pour tout savoir sur la nouvelle solution Uptime, consultez cet [article de blog détaillé](/fr/blog/elastic-uptime-monitoring-solution-released). ## Elasticsearch Pour Elasticsearch, la version 6.7 marque un nouveau tournant. Outre le lancement de nouvelles fonctionnalités, **nous sommes ravis d'annoncer que bon nombre de fonctionnalités clés d'Elasticsearch passent en disponibilité générale et sont prêtes pour la production.** Comme évoqué dans l'article de blog consacré à Elasticsearch, si l'acronyme de la fonctionnalité Elasticsearch en question est un acronyme de trois lettres, il est fort probable qu'elle soit passée en disponibilité générale dans la version 6.7. ### La réplication inter-clusters (CCR) est disponible D'abord introduite en version bêta dans la version 6.5, la réplication inter-clusters (en anglais, CCR, "Cross Cluster Replication") faisait partie des fonctionnalités Elasticsearch les plus massivement demandées. CCR répond à de nombreux cas d'utilisation. Par exemple : la réplication entre data centers et entre régions, la réplication de données pour les rapprocher du serveur applicatif et de l'utilisateur, ou encore la réplication d'un grand nombre de petits clusters dans un cluster de reporting centralisé. Outre la disponibilité de cette fonctionnalité devenue mature, la version 6.7 rime aussi avec une plus grande facilité d'utilisation de la réplication inter-clusters et une optimisation de son interface utilisateur. Pour des informations plus détaillées, consultez l'[article de blog consacré à Elasticsearch 6.7.0](/fr/blog/elasticsearch-6-7-0-released). ### La gestion du cycle de vie des index (ILM) est disponible La gestion du cycle de vie des index (en anglais, ILM, "Index lifecycle management"), lancée en version bêta dans Elasticsearch 6.6, passe maintenant en disponibilité générale et devient prête pour la production. La façon dont les index Elasticsearch sont stockés et gérés au fil du temps constitue une tâche administrative cruciale pour l'optimisation des coûts et des performances des clusters. Comme son nom l'indique, cette fonctionnalité permet aux administrateurs Elasticsearch de définir et d'automatiser les règles relatives à la gestion du cycle de vie des index, c'est-à-dire l'approche adoptée pour la gestion et le déplacement des données entre les phases hot, warm, cold et leur suppression, à mesure qu'elles vieillissent. Outre sa disponibilité générale, la version 6.7 étend les possibilités qu'offre cette fonctionnalité. Notamment, les utilisateurs peuvent désormais ajouter à la phase cold une action "freeze index" (geler l'index), ce qui réduit considérablement la mémoire nécessaire au stockage de l'index. Pour en savoir plus sur cette amélioration et les autres nouveautés apportées à la gestion du cycle de vie des index, consultez l'[article de blog consacré à Elasticsearch 6.7.0](/fr/blog/elasticsearch-6-7-0-released). ### Elasticsearch SQL est disponible (y compris les clients JDBC et ODBC) Initialement lancé avec la version 6.3, [Elasticsearch SQL](/fr/products/stack/elasticsearch-sql) avait permis aux utilisateurs d'interagir avec leurs données Elasticsearch et de les interroger grâce à une syntaxe qu'ils connaissent très bien : SQL. L'ajout de cette fonctionnalité met la puissance full text d'Elasticsearch à la portée d'un très grand nombre d'utilisateurs. Outre la syntaxe de requête SQL, la fonctionnalité Elasticsearch SQL intègre aussi les clients JDBC et ODBC, ce qui permet aux outils tiers compatibles avec ces pilotes de se connecter à Elasticsearch, qui peut alors leur servir de datastore back-end. Et toutes ces fonctionnalités passent en disponibilité générale. Pour tout savoir sur le sujet, consultez l'[article de blog consacré à Elasticsearch 6.7.0](/fr/blog/elasticsearch-6-7-0-released). Le présent post ne fait qu'effleurer les nouveautés d'Elasticsearch 6.7. Elasticsearch 6.7 vous réserve tant d'autres belles choses. Découvrez-les dans l'[article de blog consacré à Elasticsearch 6.7.0](/fr/blog/elasticsearch-6-7-0-released). ## Kibana ### Canvas est disponible [Canvas](/fr/products/stack/canvas), qui avait fait son entrée en version bêta avec la Suite Elastic 6.5, permet à l'utilisateur de mettre ses données actives Elasticsearch sous les feux de la rampe, grâce à des présentations irréprochables. Dans la version 6.7, Canvas passe en disponibilité générale. Avec Canvas, les performances visuelles de Kibana atteignent de nouveaux sommets et l'analyse des données, ainsi que les précieuses informations qu'elles recèlent, deviennent accessibles à une audience élargie. Il est pleinement compatible avec Elasticsearch SQL, et tout comme les clients JDBC et ODBC, il permet aux utilisateurs d'Elasticsearch d'étendre l'impact et la portée de leurs données, qui peuvent désormais toucher un plus grand nombre de collaborateurs. ### Kibana se met au chinois simplifié Avec la version 6.7, voici la première version localisée de Kibana, qui est désormais disponible en chinois simplifié. Et ce n'est qu'un début, car Kibana est bien parti pour se transformer en tour de Babel. Outre le lancement de l'interface en chinois simplifié, Kibana 6.7 signe l'arrivée d'un nouveau framework de localisation, conçu pour la prise en charge d'autres langues à l'avenir. Ce framework de localisation permet aussi aux membres de la communauté Elastic d'accéder aux outils qui leur permettent d'ajouter leurs traductions personnalisées. Pour tout savoir sur la disponibilité générale de Canvas, la version localisée de Kibana et les autres fonctionnalités de Kibana 6.7, consultez l'[article de blog consacré à Kibana 6.7](/fr/blog/kibana-6-7-0-released). ## Beats ### Functionbeat est disponible Functionbeat est un nouveau type d'agent Beat qui se déploie comme une fonction sur des frameworks sans serveur, et permet de diffuser des logs et des indicateurs d'infrastructure cloud vers Elasticsearch. Lancé en version bêta avec la Suite Elastic 6.5, il passe en disponibilité générale avec la version 6.7. Functionbeat est compatible avec le framework AWS Lambda et peut récupérer des flux de données depuis CloudWatch Logs, SQS et Kinesis. Découvrez Functionbeat et les nouveautés de la famille Beats 6.7 dans cet [article de blog consacré aux agents Beats](/fr/blog/beats-6-7-0-released) ### Les solutions Logs et Infrastructure sont maintenant disponibles Les solutions [Infrastructure](/fr/blog/elastic-infrastructure-app-released) et [Logs](/fr/blog/elastic-logs-app-released) ont fait leur apparition en bêta avec la version 6.5. Elles passent aujourd'hui en disponibilité générale. La [solution Logs](/fr/solutions/logging) permet aux utilisateurs d'assurer le suivi de leurs logs en temps réel via un affichage compact et personnalisable.. Le processus est similaire au suivi des fichiers, à cette différence que l'utilisateur a la possibilité d'afficher l'ensemble des logs de toute l'infrastructure dans un seul et même aperçu en flux continu. Et grâce à la barre de recherche intégrée (propulsée par Elasticsearch), l'utilisateur peut facilement affiner l'affichage en flux continu, pour n'afficher que les logs qu'il recherche. Avec la [solution Infrastructure](/fr/solutions/metrics), l'utilisateur a une vue à 360° sur l'intégrité de tous les composants de son infrastructure – serveurs, pods Kubernetes, conteneurs Docker – ce qui facilite le diagnostic des problèmes grâce aux données de logs et d'indicateurs. Intégrant les capacités de détection automatique de Metricbeat, son interface utilisateur personnalisée permet un affichage et une analyse détaillée des logs, des indicateurs et des traces APM. Le tout, en un seul clic et de manière interactive. ## Prêt pour la version 7.0 ? L'Assistant de mise à niveau est là pour cela La version 7.0.0 ne saurait tarder (sa [version bêta est déjà disponible ici](/fr/blog/elastic-stack-7-0-0-beta1-released)). L'Assistant de mise à niveau intégré à la version 6.7 est là pour vous aider à préparer l'environnement existant de votre Suite Elastic, en vue de sa mise à niveau vers la version 7.0. Intégrant à la fois des API et des IU, l'Assistant de mise à niveau est un outil important, conçu pour vérifier votre cluster et vous aider à planifier votre mise à niveau. Il vous permet aussi d'identifier des éléments comme les messages de dépréciation, les index à mettre à niveau ou à réindexer, et plus encore, l'objectif étant d'assurer une mise à niveau en douceur. ### Lancez-vous Déployez un cluster sur [Elasticsearch Service](/fr/cloud/elasticsearch-service/signup) ou [téléchargez notre Suite](/fr/downloads) et partez à la découverte des nouvelles fonctionnalités. [1]: /frhttps://www.elastic.co/assets/blt9538fc85a7f25afe/gif-maps-stack-pr-med-fidelity.gif [2]: /frhttps://www.elastic.co/assets/blt7c47d118cca749df/image4.gif

Présentation d'Elasticsearch SQL et exemples pratiques – 2e partie

$
0
0

Dans la 1re partie de la série Présentation d'Elasticsearch SQL, nous vous avons offert une présentation sommaire de la nouvelle fonctionnalité Elasticsearch SQL, ainsi que de l'API _translate. Le présent article vient compléter cette série en vous faisant découvrir des fonctionnalités plus complexes. Par la suite, nous étudierons certaines des limites actuelles auxquelles les utilisateurs sont susceptibles d'être confrontés lors de l'utilisation de cette première version d'Elasticsearch SQL. Puis, nous clôturerons la série par un aperçu de la roadmap.

Nous vous rappelons que tous les lecteurs ont la possibilité d'exécuter les exemples présentés dans l'environnement demo.elastic.co ou d'attendre que l'ensemble de données soit disponible via Kibana. Tous les ensembles de données utilisés dans le cadre de la présente série ont été indexés, suite à la mise à disposition de SQL par le biais de la console Kibana. Chaque exemple s'accompagne d'un lien vers le site demo.elastic.co. Cependant, vous pouvez également voir toutes les requêtes dans un même fil dans notre console de démonstration Kibana.

Exemples complexes et avantages d'Elasticsearch

Regroupement

L'architecture d'agrégation d'Elasticsearch, qui est en mesure de synthétiser des milliards de points de données, est l'une des fonctionnalités les plus puissantes et les plus appréciées de la Suite. En termes de fonctionnalités, elle est l'équivalent naturel de la commande GROUP BY sous SQL. En plus de vous présenter des exemples des fonctionnalités de la commande GROUP BY, nous nous servirons à nouveau de l'API _translate pour vous montrer les agrégations équivalentes.

"Rechercher la durée moyenne d'un vol en fonction du pays d'origine pour les vols à destination de Londres. Trier les pays par ordre alphabétique."

Essayez sur demo.elastic.co

sql> SELECT AVG(FlightTimeHour) Avg_Flight_Time, OriginCountry FROM flights GROUP BY OriginCountry ORDER BY OriginCountry LIMIT 5;
 Avg_Flight_Time  | OriginCountry
------------------+---------------
9.342180244924574 |AE
13.49582274385201 |AR
4.704097126921018 |AT
15.081367354940724|AU
7.998943401875511 |CA

L'analyse du DSL de cette requête montre l'utilisation de l'agrégation imbriquée (Composite Aggregation).

{
  "size": 0,
  "_source": false,
  "stored_fields": "_none_",
  "aggregations": {
    "groupby": {
      "composite": {
        "size": 1000,
        "sources": [
          {
            "3471": {
              "terms": {
                "field": "OriginCountry.keyword",
                "order": "asc"
              }
            }
          }
        ]
      },
      "aggregations": {
        "3485": {
          "avg": {
            "field": "FlightTimeHour"
          }
        }
      }
    }
  }
}

Essayez sur demo.elastic.co

Nous pouvons également effectuer des regroupements par champs d'alias définis dans la sélection en recourant à une fonction.

"Rechercher le nombre de vols et la durée moyenne des vols par mois."

POST _xpack/sql
{
  "query":"SELECT COUNT(*), MONTH_OF_YEAR(timestamp) AS month_of_year, AVG(FlightTimeHour) AS Avg_Flight_Time FROM flights GROUP BY month_of_year"
}

Essayez sur demo.elastic.co

   COUNT(1)    | month_of_year | Avg_Flight_Time 
---------------+---------------+-----------------
1303           |5              |8.628949653846158
8893           |6              |8.520481551839334
2863           |7              |8.463433805045094

L'utilisation de l'agrégation imbriquée offre un principal avantage : elle garantit que l'implémentation de la commande GROUP BY est scalable, même dans le cas des champs dont la cardinalité est élevée, et propose donc un mécanisme de transmission de tous les intervalles d'une agrégation précise dont l'action est comparable à celle du défilement pour les documents. Elle garantit également que l'implémentation ne soit pas exposée aux mêmes limitations de mémoire qu'en cas d'utilisation de l'agrégation de termes. En revanche, cela signifie que nous ne sommes, pour le moment, pas en mesure de trier les résultats GROUP BY par l'intermédiaire d'un indicateur. Par exemple, la proposition ci-dessous produirait une erreur :

POST _xpack/sql/translate
{
  "query":"SELECT AVG(FlightTimeHour) Avg_Flight_Time, OriginCountry FROM flights GROUP BY OriginCountry ORDER BY Avg_Flight_Time"
}

Essayez sur demo.elastic.co

Filtrage des groupes

Afin de pouvoir filtrer les groupes, nous pouvons nous servir de la condition HAVING, qui peut aussi utiliser un alias indiqué dans la clause SELECT. Pour certains experts SQL, cette action peut s'avérer inhabituelle, étant donné qu'elle est généralement impossible dans le cadre des implémentations basées sur RDBMS en raison de l'exécution de la clause SELECT après la condition HAVING. Dans notre cas, la clause HAVING se sert d'un alias déclaré au cours de la phase d'exécution. Toutefois, notre analyseur est suffisamment intelligent pour anticiper cela et relever la déclaration afin de l'utiliser dans la clause HAVING.

"Rechercher le nombre de vols, la distance moyenne et la distance au 95e percentile des vols au départ de chaque ville d'origine, pour lesquels la distance moyenne est comprise entre 3 000 et 4 000 miles."

Essayez sur demo.elastic.co

sql> SELECT OriginCityName, ROUND(AVG(DistanceKilometers)) avg_distance, COUNT(*) c, ROUND(PERCENTILE(DistanceKilometers,95)) AS percentile_distance FROM flights GROUP BY OriginCityName HAVING avg_distance BETWEEN 3000 AND 4000;
OriginCityName | avg_distance  |       c       |percentile_distance
---------------+---------------+---------------+-------------------
Verona         |3078           |120            |7927
Vienna         |3596           |120            |7436
Xi'an          |3842           |114            |7964

Pour implémenter la condition HAVING, Elasticsearch SQL utilise l'agrégation de pipeline Bucket Selector et filtre les valeurs en recourant à un script Painless paramétrable. Notez ci-dessous la façon dont la variante keyword du champ OriginCityName est automatiquement sélectionnée pour l'agrégation, au lieu de tenter d'utiliser la variante de texte standard, qui échouerait probablement en raison de la non-activation des données de champs. Les agrégations d'indicateurs avg et percentile offrent des fonctions équivalentes aux variantes SQL.

Essayez sur demo.elastic.co

{
  "size": 0,
  "_source": false,
  "stored_fields": "_none_",
  "aggregations": {
    "groupby": {
      "composite": {
        "size": 1000,
        "sources": [
          {
            "4992": {
              "terms": {
                "field": "OriginCityName.keyword",
                "order": "asc"
              }
            }
          }
        ]
      },
      "aggregations": {
        "4947": {
          "bucket_selector": {
            "buckets_path": {
              "a0": "5010",
              "a1": "5010"
            },
            "script": {
              "source": "params.v0 <= params.a0 && params.a1 <= params.v1",
              "lang": "painless",
              "params": {
                "v0": 3000,
                "v1": 4000
              }
            },
            "gap_policy": "skip"
          }
        },
        "5010": {
          "avg": {
            "field": "DistanceKilometers"
          }
        },
        "5019": {
          "percentiles": {
            "field": "DistanceKilometers",
            "percents": [
              95
            ],
            "keyed": true,
            "tdigest": {
              "compression": 100
            }
          }
        }
      }
    }
  }
}

Opérateurs de texte et pertinence

Par rapport à un RDBMS classique, l'une des fonctionnalités propres à Elasticsearch en tant que moteur de recherche est sa capacité à fournir des résultats plus étoffés qu'un simple oui / non, en tenant compte des propriétés des données textuelles par le biais d'un calcul de pertinence. L'élargissement de la syntaxe SQL nous permet de révéler cette fonctionnalité et d'aller bien au-delà de ce qu'un RDBMS classique offrirait.

De ce fait, nous vous présentons deux nouvelles clauses : QUERY et MATCH. Pour les personnes habituées à Elasticsearch, elles sont les équivalentes des opérateurs sous-jacents multi_match et query_string. Les utilisateurs de Kibana connaissent le comportement de l'opérateur query_string, puisqu'il servait à alimenter la barre de recherche par défaut. Cet opérateur offre des fonctionnalités d'analyse intelligentes et permet de produire des requêtes employant un langage de requête naturel. Cet article ne présente pas dans le détail ces deux opérateurs, mais la section correspondante du Definitive Guide fournit une parfaite présentation de ces concepts.

Par exemple, considérez ce qui suit :

"Rechercher tous les vols retardés à destination et au départ de l'aéroport de Kastrup entre le 06/06/2018 et le 17/06/2018, triés par date."

Essayez sur demo.elastic.co

En réalité, l'aéroport de Kastrup se trouve à Copenhague, son nom complet étant "Aéroport de Kastrup-Copenhague". En utilisant l'opérateur QUERY, nous recherchons simplement Kastrup.

sql> SELECT timestamp, FlightNum, OriginCityName, DestCityName FROM flights WHERE QUERY('Kastrup') AND FlightDelay=true AND timestamp > '2018-06-20' AND timestamp < '2018-06-27' ORDER BY timestamp;
       timestamp        |   FlightNum   |OriginCityName | DestCityName
------------------------+---------------+---------------+---------------
2018-06-21T01:46:28.000Z|57SWSLT        |Copenhagen     |Orlando
2018-06-21T07:28:07.000Z|X43J6GE        |Abu Dhabi      |Copenhagen
2018-06-21T13:36:31.000Z|7T04SK7        |Copenhagen     |Milan
2018-06-22T19:52:15.000Z|NXMN87D        |Mumbai         |Copenhagen
2018-06-23T08:05:02.000Z|YXHMDKV        |Copenhagen     |Oslo
2018-06-25T18:21:04.000Z|2R86JEZ        |Copenhagen     |Shanghai
2018-06-26T22:16:10.000Z|TCE99LO        |Copenhagen     |Edmonton

Notez que nous n'étions pas forcés d'indiquer le champ ici. La recherche de "kastrup" avec l'opérateur QUERY a suffi. De plus, notez que nous avons des vols retardés à destination et au départ de Kastrup. Voici la requête Elasticsearch :

Essayez sur demo.elastic.co

{
  "size": 1000,
  "query": {
    "bool": {
      "filter": [
        {
          "bool": {
            "filter": [
              {
                "bool": {
                  "filter": [
                    {
                      "query_string": {
                        "query": "Kastrup",
                        "fields": [],
                        "type": "best_fields",
                        "default_operator": "or",
                        "max_determinized_states": 10000,
                        "enable_position_increments": true,
                        "fuzziness": "AUTO",
                        "fuzzy_prefix_length": 0,
                        "fuzzy_max_expansions": 50,
                        "phrase_slop": 0,
                        "escape": false,
                        "auto_generate_synonyms_phrase_query": true,
                        "fuzzy_transpositions": true,
                        "boost": 1
                      }
                    },
                    {
                      "term": {
                        "FlightDelay": {
                          "value": true,
                          "boost": 1
                        }
                      }
                    }
                  ],
                  "adjust_pure_negative": true,
                  "boost": 1
                }
              },
              {
                "range": {
                  "timestamp": {
                    "from": "2018-06-20",
                    "to": null,
                    "include_lower": false,
                    "include_upper": false,
                    "boost": 1
                  }
                }
              }
            ],
            "adjust_pure_negative": true,
            "boost": 1
          }
        },
        {
          "range": {
            "timestamp": {
              "from": null,
              "to": "2018-06-27",
              "include_lower": false,
              "include_upper": false,
              "boost": 1
            }
          }
        }
      ],
      "adjust_pure_negative": true,
      "boost": 1
    }
  },
  "_source": {
    "includes": [
      "FlightNum",
      "OriginCityName",
      "DestCityName"
    ],
    "excludes": []
  },
  "docvalue_fields": [
    "timestamp"
  ],
  "sort": [
    {
      "timestamp": {
        "order": "asc"
      }
    }
  ]
}

Pour les utilisateurs qui commencent à utiliser Elasticsearch, cette requête est relativement complexe. En effet, nous avons une requête booléenne présentant une plage imbriquée, une restriction de terme et un opérateur de chaîne de recherche. Pour les opérateurs migrant une application depuis SQL, cette tâche aurait traditionnellement été assez ardue avant même d'avoir à se demander si la requête finale était correcte et optimale d'un point de vue fonctionnel. L'opérateur query_string actuel a été intégré à un filtre, puisqu'aucune pertinence n'était requise (le tri s'effectue par date), ce qui nous permet de tirer profit du cache de filtre, d'ignorer l'attribution d'un score et d'améliorer le temps de réponse.

Les paramètres de ces opérateurs sont également exposés dans SQL. Ce dernier exemple présente l'utilisation d'une requête MATCH avec plusieurs termes de recherche dans plusieurs champs pour limiter les résultats.

"Rechercher des vols à destination ou au départ de Barcelone pour lesquels la météo a inclus des éclairs."

Essayez sur demo.elastic.co

Aux fins de cet exemple, nous effectuons également un tri et montrons le score de pertinence par l'intermédiaire de la fonction Score().

sql> SELECT Score(), timestamp, FlightNum, OriginCityName, DestCityName, DestWeather, OriginWeather FROM flights WHERE MATCH('*Weather,*City*', 'Lightning Barcelona', 'type=cross_fields;operator=AND') ORDER BY Score() DESC LIMIT 5;
    SCORE()    |       timestamp        |   FlightNum   |OriginCityName | DestCityName  |    DestWeather    |   OriginWeather
---------------+------------------------+---------------+---------------+---------------+-------------------+-------------------
6.990964       |2018-05-31T06:00:41.000Z|L637ISB        |Barcelona      |Santiago       |Rain               |Thunder & Lightning
6.990964       |2018-06-13T12:23:44.000Z|0GIHB62        |Barcelona      |Buenos Aires   |Clear              |Thunder & Lightning
6.9796515      |2018-06-14T21:04:51.000Z|7GEMEDR        |Barcelona      |Hyderabad      |Thunder & Lightning|Rain
6.9133706      |2018-05-31T01:58:51.000Z|ZTOD7RQ        |Barcelona      |Dubai          |Sunny              |Thunder & Lightning
6.9095163      |2018-06-06T14:02:34.000Z|QSQA5CT        |Barcelona      |Naples         |Rain               |Thunder & Lightning

Nous utilisons des modèles à caractère générique pour indiquer les champs à faire correspondre et demander à ce que le résultat soit un booléen AND. Le paramètre de champs croisés ne requiert pas des termes qu'ils apparaissent dans un même champ ; ils sont en effet autorisés à apparaître dans différents champs du moment qu'ils existent. Au vu de la structure des données, cette condition est essentielle au résultat.

Ici, nos exemples ont renvoyé une comparaison des lignes et des groupes. Cependant, les opérateurs QUERY et MATCH peuvent aussi être utilisés avec une commande GROUP BY, une agrégation filtrée efficacement dans Elasticsearch.

Recherches d'index croisé et alias

Jusqu'à maintenant, nos requêtes ne ciblaient qu'une table / un index unique. Si nous dupliquons l'index des vols, en copiant les documents et en leur attribuant un nouveau nom en créant une requête de réindexation, nous pouvons requêter les deux index au même moment, à condition qu'ils aient des mappages identiques. Toute différence de mappage produirait une erreur de requête lors de l'analyse. Afin de demander simultanément plusieurs index, l'utilisateur peut les ajouter à un alias Elasticsearch ou utiliser des caractères génériques dans la clause WHERE. Par exemple, supposons que j'ai deux index "flight" et "flights-2" sous l'alias suivant "f_alias" :

POST /_aliases
{
    "actions" : [
       { "add" : { "index" : "flights-2", "alias" : "f_alias" } },
        { "add" : { "index" : "flights", "alias" : "f_alias" } }
    ]
}

Les éléments suivants sont logiquement équivalents :

sql> SELECT FlightNum, OriginCityName, DestCityName, DestWeather, OriginWeather FROM flights* ORDER BY timestamp DESC LIMIT 1;
   FlightNum   |OriginCityName | DestCityName  |  DestWeather  | OriginWeather
---------------+---------------+---------------+---------------+---------------
6UPDDGK        |Zurich         |Zurich         |Rain           |Hail
sql> SELECT FlightNum, OriginCityName, DestCityName, DestWeather, OriginWeather FROM f_alias ORDER BY timestamp DESC LIMIT 1;
   FlightNum   |OriginCityName | DestCityName  |  DestWeather  | OriginWeather
---------------+---------------+---------------+---------------+---------------
6UPDDGK        |Zurich         |Zurich         |Rain           |Hail

Essayez sur demo.elastic.co. (Remarque : notre environnement de démonstration dispose des deux index avec un alias pré-configuré pour que les utilisateurs testent l'exemple ci-dessus.)

Il se peut que nous assouplissions les exigences ci-dessus à l'avenir, mais pour le moment, elles simplifient la logique de cette première version.

Clauses JOIN

Les clauses JOIN d'une implémentation SQL avec RDBMS classique permettent de combiner les lignes de différentes tables via des colonnes associées dans une réponse tabulaire à part. Cette action permet la modélisation relationnelle des données, et il s'agit d'une rubrique importante par rapport aux options nativement disponibles dans Elasticsearch pour y parvenir. Bien qu'Elasticsearch SQL ne propose aucun opérateur JOIN pour le moment, elle permet aux utilisateurs d'exploiter des documents imbriqués, et donc d'effectuer une modélisation relationnelle simple en un et plusieurs documents. La demande de documents imbriqués est transférée en toute transparence à l'utilisateur. Pour vous faire la démonstration de cette fonctionnalité, nous avons besoin d'un index présentant de telles données. Aux fins de cet exemple, nous avons téléchargé un index "orders" sur demo.elastic.co. Les documents de cet index correspondent aux commandes d'un site de commerce électronique et contiennent des champs, tels que order_date, billing_city et customer_last_name. Par ailleurs, un champ "products" contient un sous-document imbriqué pour chaque produit de la commande. Exemple :

{
          "billing_last_name": "Green",
          "billing_first_name": "Jason",
          "order_id": 519894,
          "products": [
            {
              "tax_amount": 0,
              "taxful_price": 22.99,
              "quantity": 1,
              "taxless_price": 22.99,
              "discount_amount": 0,
              "base_unit_price": 22.99,
              "discount_percentage": 0,
              "product_name": "Briefcase - black",
              "manufacturer": "Pier One",
              "min_price": 11.27,
              "created_on": "2016-11-08T04:16:19+00:00",
              "unit_discount_amount": 0,
              "price": 22.99,
              "product_id": 12733,
              "base_price": 22.99,
              "_id": "sold_product_519894_12733",
              "category": "Men's Accessories",
              "sku": "PI952HA0M-Q11"
            },
            {
              "tax_amount": 0,
              "taxful_price": 16.99,
              "quantity": 1,
              "taxless_price": 16.99,
              "discount_amount": 0,
              "base_unit_price": 16.99,
              "discount_percentage": 0,
              "product_name": "3 PACK - Boxer shorts - white/navy",
              "manufacturer": "Pier One",
              "min_price": 8.33,
              "created_on": "2016-11-08T04:16:19+00:00",
              "unit_discount_amount": 0,
              "price": 16.99,
              "product_id": 18370,
              "base_price": 16.99,
              "_id": "sold_product_519894_18370",
              "category": "Men's Clothing",
              "sku": "PI982AA0Y-A11"
            }
          ],
          "has_error": false,
          "customer_last_name": "Green",
          "currency": "EUR",
          "billing_first_name": "Jason",
          "shipping_country_code": "US",
          "email": "swagelastic@gmail.com",
          "day_of_week": "Tuesday",
          "geoip": {
            "continent_name": "North America",
            "city_name": "New York",
            "country_iso_code": "US",
            "location": {
              "lon": -73.9862,
              "lat": 40.7662
            },
            "region_name": "New York"
          },
          "payment_status": "FULLY_PAID",
          ...
}

Normalement, pour demander ces documents, l'utilisateur doit comprendre pourquoi nous utilisons un type de donnée imbriqué pour le champ des produits, sans oublier la syntaxe de la requête imbriquée. Toutefois, avec Elasticsearch SQL, nous pouvons demander ces documents imbriqués comme si chacun d'entre eux représentait une ligne distincte comportant les champs de sa commande parente (c.-à-d. que nous aplatissons efficacement la structure aux fins de la présentation). Regardez la commande ci-dessus, qui comporte deux produits. Lorsque nous la requêtons, elle se présente sous la forme de deux lignes si nous demandons les champs des sous-documents des produits. Chaque ligne peut dorénavant contenir les champs de la commande parente, si nous le demandons. Par exemple :

"Rechercher le nom de facturation utilisé pour les vols et les produits achetés, pour la commande 518894."

sql> SELECT billing_last_name, billing_first_name, products.price, products.product_id FROM orders WHERE order_id=519894;
billing_last_name|billing_first_name|products.price |products.product_id
-----------------+------------------+---------------+-------------------
Green            |Jason             |16.984375      |18370
Green            |Jason             |22.984375      |12733

Essayez sur demo.elastic.co

L'API _translate présente la structure de cette requête en utilisant une requête imbriquée :

{
  "size": 1000,
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "order_id": {
              "value": 519894,
              "boost": 1
            }
          }
        },
        {
          "nested": {
            "query": {
              "match_all": {
                "boost": 1
              }
            },
            "path": "products",
            "ignore_unmapped": false,
            "score_mode": "none",
            "boost": 1,
            "inner_hits": {
              "ignore_unmapped": false,
              "from": 0,
              "size": 99,
              "version": false,
              "explain": false,
              "track_scores": false,
              "_source": false,
              "stored_fields": "_none_",
              "docvalue_fields": [
                "products.product_id",
                "products.price"
              ]
            }
          }
        }
      ],
      "adjust_pure_negative": true,
      "boost": 1
    }
  },
  "_source": {
    "includes": [
      "billing_last_name",
      "billing_first_name"
    ],
    "excludes": []
  },
  "sort": [
    {
      "_doc": {
        "order": "asc"
      }
    }
  ]
}

Essayez sur demo.elastic.co

À l'inverse, si nous demandons simplement les champs parents, une seule ligne est présentée :

"Rechercher le nom de facturation utilisé pour les vols, pour la commande 518894."

sql> SELECT billing_last_name, billing_first_name FROM orders WHERE order_id=519894;
billing_last_name|billing_first_name
-----------------+------------------
Green            |Jason

Essayez sur demo.elastic.co

Fonctionnalités manquantes et à venir...

Limites actuelles auxquelles vous risquez d'être confronté au début de toute expérimentation :

  • Requêtes de table / d'index croisés : possibles à condition que les mappages des index soient identiques. À l'heure actuelle, toute différence produit une erreur au moment de la requête.
  • Opérateurs JOIN : comme nous l'avons souligné plus haut, nous prenons en charge des opérateurs JOIN limités uniquement en cas d'utilisation de documents imbriqués.
  • Tri des groupes dans la commande GROUP BY : comme mentionné plus haut, cette limitation provient de l'agrégation imbriquée Elasticsearch.
  • Clauses SELECT imbriquées : il s'agit d'un mécanisme ordinaire visant à étayer l'analyse des outils BI. Bien que les instructions SELECT imbriquées utilisant plusieurs index peuvent être l'équivalent d'un opérateur JOIN, il serait possible de réécrire et d'exécuter des instructions utilisant le même index. Nous pourrions envisager cette possibilité dans le futur.

Voici quelques-uns des avantages d'Elasticsearch que nous prévoyons d'intégrer dans les prochaines versions :

  • Possibilité d'exécuter une commande GROUP BY sur plusieurs niveaux (p. ex. "rechercher des itinéraires de vols (départ et destination) par mois avec un retard moyen supérieur à 2 h")
  • Présentation des opérateurs géospatiaux Elasticsearch
  • Support de type INTERVAL (p. ex. possibilité de travailler sur la différence entre deux dates et deux heures)
  • Amélioration des fonctions Data/Time Math et String
  • Prise en charge des histogrammes dans le cadre du regroupement
  • Recherche d'index croisé et de cluster croisé présentant des mappages non identiques

Merci d'être arrivé jusqu'ici et surveillez la sortie des prochains numéros de la série Présentation d'Elasticsearch SQL.

Viewing all 378 articles
Browse latest View live