Structure JSON, Mapping et traitement Kibana

Bonjour à toutes et à tous !

Voila voila je suis nouveau sur ES et je rencontre quelques problèmes !

je vous explique ma problématique:

J'ai un fichier JSON de 3000 lignes qui contient tout un lot d'informations sur l'utilisation d'un programme à travers le monde.

La structure du fichier est la suivante:

  {
   "date":"2017-10-05T08:15:03.079+0000",
   "Espagne":[
      {
         "serverName":"AZERTYUIKJHD",
         "satus":"UP",
         "users":[
            {
              "projectName":"cccccccccc",
              "immat":"aaaaaaaaa",
              "machineName":"xxxxxxx-xxxxxxx"
            },
            {
              "projectName":"cccccccccc",
              "immat":"aaaaaaaaa",
              "machineName":"xxxxxxx-xxxxxxx"
            },
            {
              "projectName":"cccccccccc",
              "immat":"aaaaaaaaa",
              "machineName":"xxxxxxx-xxxxxxx"
            },
            {
               "projectName":"cccccccccc",
               "immat":"aaaaaaaaa",
               "machineName":"xxxxxxx-xxxxxxx"
            }
         ]
      }
   ],

   "France":[
      {
         "serverName":"AZERTYUIKJHD",
         "status":"UP",
         "users":[
            {
               "projectName":"cccccccccc",
               "immat":"aaaaaaaaa",
               "machineName":"xxxxxxx-xxxxxxx"
            },
            {
               "projectName":"cccccccccc",
               "immat":"aaaaaaaaa",
               "machineName":"xxxxxxx-xxxxxxx"
            },
            {
               "projectName":"cccccccccc",
               "immat":"aaaaaaaaa",
               "machineName":"xxxxxxx-xxxxxxx"
            },
            {
               "projectName":"cccccccccc",
               "immat":"aaaaaaaaa",
               "machineName":"xxxxxxx-xxxxxxx"
            }
         ]
            
      }
   ]
}

L'importation dans ES se passe correctement, j'ai crée mon Index, mon type qui est scan puis j'importe mon document.

Mon but est de pouvoir ajouter un fichier de ce type (4000 lignes) toutes les 3 heures et pouvoir sortir des graphes statistiques d'utilisation du programme.

Or, lorsque que j'accède a Kibana je ne peux pas vizualiser correctement mes données..
Les champs champs qui me sont proposé pour faire mes charts sont par exemple : Espagne.users.projectName. Je ne peux donc que vizualiser par pays individuellement. De plus, mon graph ne compte pas les occurences de même non (si deux users ont le meme projectName, mon graph des projectName ne m'en comptera qu'un seul)
Question 1 : Puis-je réaliser un chart qui va me dire le nombre d'users par pays avec la structure de donnée que je possède ?

En faisant quelques recherches, je me suis dit que cela venait du mapping car la structure de mon fichier JSON est composé de plusieurs objet / tableau imbriqué. Je me suis donc dis qu'il fallait que j'utilise un mapping personnalisé en déclarant mes champs "PAYS" et mes champs "users" en "type":"nested" mais lorsque que jai testé cette solution je ne pouvais plus réaliser de graph, Kibana me renvoyé une erreur disant que tout mes champs était null.
Question 2 : Quelle champs dois-je mettre en nested ou object pour que je puisse traiter toutes mes données ?
Question 3 : Dois-je changer la structure de mon fichier JSON pour pouvoir analyser mes données?

Je vous remercie par avance pour toute aide que vous pourriez m'apporter !

Mathieu

Dois-je changer la structure de mon fichier JSON pour pouvoir analyser mes données?

Oui. Indexe ce que tu cherches ou que tu veux analyser.
Ici, tu ne veux pas analyser un paquet d'applications mondial mais analyser des applications. L'objet que tu gères n'est donc pas "le monde" mais "une application".

Donc pense à ton modèle en ce sens et indexe des applications.

En gros des objets du genre:

{
  "date":"2017-10-05T08:15:03.079+0000",
  "country":"France",
  "projectName":"cccccccccc",
  "immat":"aaaaaaaaa",
  "machineName":"xxxxxxx-xxxxxxx"
}

Indexe tes 3000 documents individuellement et tu verras que d'un coup, tout devient beaucoup plus facile et sans prise de tête.

Dans ma démarche de recherche, j'avais effectivement essayé ce modèle !

Pouvez-vous me dire si l'organisation que je compte faire dans ES fait parti des bonnes pratiques ?

index : mon_index

type : users

avec des fichiers organisé comme ci-dessous
{
"date":"2017-10-05T08:15:03.079+0000",
"pays":"France",
"projectName":"cccccccccc",
"immat":"aaaaaaaaa",
"machineName":"xxxxxxx-xxxxxxx"
}

et un autre type : server
avec des fichiers organisé comme ci-dessous:

   {
  "date" : "2017-10-04T08:15:03.079+0000",
  "serverName": "name1",
  "pays": "france",
  "status": "UP",
  }

Avoir plusieurs types dans le même index n'est plus supporté en version 6.
Donc un index par "type" fonctionnel.

Comme tu sembles collecter des données avec timestamp, je te recommande d'utiliser des index temporels.

Quelques slides ici:

Et une vidéo (en anglais):

Salut Dadoonet !

Tout d'abord merci pour l'aide que tu m'apportes dans cet océan qui m'est encore inconnu.
Je ne suis pas sur de comprendre lorsque tu dis utiliser des index temporels.

Je n'utilise pas de données avec timestamp.

Voici comment se passe ma collecte de données : Toutes les 3 heures, je recois un fichier JSON de 3 à 4 mille lignes contenant toutes les infos que j'ai décrites à mon premier poste.

Une autre question que je me pose : Puis-je changer la structure de mon fichiers JSON pour passer du format que je recois au format suivant en me servant de Logstash

{
  "date":"2017-10-05T08:15:03.079+0000",
  "country":"France",
  "projectName":"cccccccccc",
  "immat":"aaaaaaaaa",
  "machineName":"xxxxxxx-xxxxxxx"
}

qui me permet de traiter mes données comme je le souhaite

Math

Je n'utilise pas de données avec timestamp.

bah si. Regarde:

 "date":"2017-10-05T08:15:03.079+0000",

Ca ressemble à un timestamp, ça.

Toutes les 3 heures, je recois un fichier JSON de 3 à 4 mille lignes contenant toutes les infos que j'ai décrites à mon premier poste.

Est-ce que leur champ "date" change?
Si oui, ce qui serait sympa peut-être c'est d'avoir un historique sur plusieurs jours, mois, années de tes données. Mais ça c'est à toi de voir.

En tout cas, si tu le fais, je te conseille de faire par exemple un index par mois, genre project-2017-10 dans lequel tu stockeras tes collectes du mois d'octobre.

Encore une fois, pas obligé.
Si tu écrases systématiquement les vieilles données toutes les heures, je te conseille d'utiliser des alias:

  • Je créé l'index project-A avec un alias project dessus. J'y indexe mes données.
    Je requête l'alias project quand je cherche.
  • Je reçois un autre fichier. Je créé l'index project-B. J'y indexe mes données.
    Je switche l'alias project dessus. Je requête toujours l'alias project quand je cherche. Mes utilisateurs n'ont rien vu. Je détruis l'index project-A.

Et je recommence ainsi de suite.

Puis-je changer la structure de mon fichiers JSON pour passer du format que je recois au format suivant en me servant de Logstash

Oui. C'est fait pour ça. Tu peux aussi regarder ingest node qui est plus simple (car pas de Logstash à maintenir) et sans doute applicable dans ton cas.

Re,

  • Je ne t'avais pas compris lorsque tu parlais de timestamp, pour moi un timestamp est le nombre de secondes écoulées entre une date et le 01/01/1970 !

  • Oui le champs date change ! je reçois donc un total de 8 fichiers par jours avec forcément des dates différentes.

  • Mon but est de pouvoir faire des statistiques d'utilisation de mon programme à travers le monde, je vais donc garder les infos très longtemps sur le serveur. Est-il mieux de créer un index par mois comme tu le recommande pour mon type de traitement ? ou créer un index pour mes utilisateurs et un autre pour les statistiques sur l'état des serveur est plus souhaitable ?

  • Les données ne seront pas écrasés donc je ne vois pas l'utilité d'utiliser des alias pour le moment

  • Merci bien pour la piste ingest node que je ne connaissais pas non plus, je vais y jetter un oeil.

  • Petite question (probablement bete) supplémentaire, Peut on faire des chart Kibana en croisant les données de différents index ?

Mon but est de pouvoir faire des statistiques d'utilisation de mon programme à travers le monde, je vais donc garder les infos très longtemps sur le serveur. Est-il mieux de créer un index par mois comme tu le recommande pour mon type de traitement ? ou créer un index pour mes utilisateurs et un autre pour les statistiques sur l'état des serveur est plus souhaitable ?

La vidéo et les slides que j'ai postés précédemment répondent à ça.

Les données ne seront pas écrasés donc je ne vois pas l'utilité d'utiliser des alias pour le moment

La vidéo et les slides que j'ai postés précédemment répondent à ça également.

Peut on faire des chart Kibana en croisant les données de différents index ?

Sur le même chart, non pas vraiment. Sauf si fonctionnellement il s'agit des mêmes données (genre, je veux croiser les données de project-2017-10 avec project-2017-09. Mais il ne s'agit pas vraiment de "croiser".

Bonjour Dadoonet,

J'ai parcouru les ressources que tu as partagé, j'y ai trouvé certaines infos que je cherchais!

Je me suis aussi penché sur ingest node, mais je ne trouve pas de processeur dont je pourrais me servir pour les actions que j'ai a appliqué a mes documents à indexer.

  • ingest node peut-il m'aider à découper mon fichier JSON et plusieurs fichiers JSON pour y être indexer?
  • ingest node peut-il m'aider à réorganiser la structure de mes documens ?

Math

  1. Non
  2. Oui

Bonjour Dadoonet,

Tes réponses m'ont déjà beaucoup aidé mais je t'avouerai me sentir vraiment perdu sur la stack ELK, je lis énormément d'informations différentes et je pense que tout se mélange plus ou moins.

Le principal problème que je rencontre pour le moment c'est la transformation de mon fichier JSON de ce format :

  {
   "date":"2017-10-05T08:15:03.079+0000",
   "Espagne":[
      {
         "serverName":"AZERTYUIKJHD",
         "satus":"UP",
         "users":[
            {
              "projectName":"cccccccccc",
              "immat":"aaaaaaaaa",
              "machineName":"xxxxxxx-xxxxxxx"
            },
            {
              "projectName":"cccccccccc",
              "immat":"aaaaaaaaa",
              "machineName":"xxxxxxx-xxxxxxx"
            },
            {
              "projectName":"cccccccccc",
              "immat":"aaaaaaaaa",
              "machineName":"xxxxxxx-xxxxxxx"
            },
            {
               "projectName":"cccccccccc",
               "immat":"aaaaaaaaa",
               "machineName":"xxxxxxx-xxxxxxx"
            }
         ]
      }
   ],

   "France":[
      {
         "serverName":"AZERTYUIKJHD",
         "status":"UP",
         "users":[
            {
               "projectName":"cccccccccc",
               "immat":"aaaaaaaaa",
               "machineName":"xxxxxxx-xxxxxxx"
            },
            {
               "projectName":"cccccccccc",
               "immat":"aaaaaaaaa",
               "machineName":"xxxxxxx-xxxxxxx"
            },
            {
               "projectName":"cccccccccc",
               "immat":"aaaaaaaaa",
               "machineName":"xxxxxxx-xxxxxxx"
            },
            {
               "projectName":"cccccccccc",
               "immat":"aaaaaaaaa",
               "machineName":"xxxxxxx-xxxxxxx"
            }
         ]            
      }
   ]
}

vers la format qui me permettrait de traiter mes données

{
  "date":"2017-10-05T08:15:03.079+0000",
  "country":"France",
  "projectName":"cccccccccc",
  "immat":"aaaaaaaaa",
  "machineName":"xxxxxxx-xxxxxxx"
}

J'ai regardé les différents processeurs de l'API ingest mais je n'y trouve pas ou ne vois pas ceux qui y sont adaptés

Pourrais-tu m'éclairer un petit peu a ce sujet ?

(J'en profite pour te remercier également pour les conférences que tu as pu tenir sur ELK, j'y ai beaucoup appris)

Math

ELK n'est plus nom utilisé. Sinon Beats se sent un peu seul :slight_smile:
Alors on dit suite elastic ou elastic stack... :smiley:

J'ai regardé les différents processeurs de l'API ingest mais je n'y trouve pas ou ne vois pas ceux qui y sont adaptés

On s'est mal compris. Tu dois faire ce travail en amont.
La donnée est générée par qui, par quoi ?
Si tu as accès à l'application qui génère la donnée, alors change le code pour la transformer depuis la source. C'est le plus facile.

Sinon, il faut passer par un ETL type Talend ou Logstash.

Avec Logstash, je ne suis pas certain que ce soit facile. En tout cas je n'ai jamais fait ça. Peut-être que @colinsurprenant a une idée...

(J'en profite pour te remercier également pour les conférences que tu as pu tenir sur ELK, j'y ai beaucoup appris)

Merci ! Heureux que ce soit utile :blush:

Merci pour l'info !

la donnée est généré par un daemon qui me retourne toute les 3h ce dit fichier de 3000-4000 lignes !

je vais donc le modifier pour qu'il me crée mes fichiers séparément déjà pret à etre traiter.

Je suppose que l'on peut configurer l'elastic stack pour qu'il index tout document présent dans un dossier (confirmation ?)

Je suppose que l'on peut configurer l'elastic stack pour qu'il index tout document présent dans un dossier

Pas vraiment. Enfin je ne crois pas. Mais regarde mon projet https://github.com/dadoonet/fscrawler/blob/master/README.md#indexing-json-docs

Ca devrait aider.

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.