Je rencontre un problème : Limit of total fields [1000] in index [index] has been exceeded


(Rym Guerbi Michaut) #1

Bonjour,

Utilisatrice novice des outils ELK, je rencontre un souci d'import de données en JSON.

J’utilise Logstash avec le plugin HTTP Poller en input et Elasticsearch en output.

J'ai créé mon fichier de config pour ce faire.

Je cherche à importer des données en JSON mais j’ai une erreur qui apparaît à chaque tentative:
« Limit of total fields [1000] in index [index] has been exceeded »

J'ai essayé d'ajouter une condition dans le fichier yml de Logstash en augmantant la limite à 2000 mais ça n'a rien donné.

En cherchant sur le net, j’ai compris qu’il fallait que je modifie le template d’Elasticsearch de sorte à ce que mes données soient listées en lignes et non pas en colonnes.

Pourriez-vous m’aider/m’orienter vers une solution de construction de template dans ce sens s’il vous plait?

En vous remerciant par avance.

Cordialement,


(David Pilato) #2

Tu dois modifier les settings de ton index. Voici: https://www.elastic.co/guide/en/elasticsearch/reference/6.0/mapping.html#mapping-limit-settings


(Rym Guerbi Michaut) #3

Merci pour ta réactivité @dadoonet

Et je le fais dans les paramètres de output du fichier de config Logstash, non? Parce que sinon ça n'importerait même pas les données?!

Si j'ai bien compris, c'est juste le "mapping type" que je dois modifier, en settant le meta-field "_type" en lui assignant "object" puisque c'est un document JSON. Si c'est bien ça, je voudrais confirmer que je le mets bien dans la partie output :

output {
elasticsearch {
host => ["localhost:9200"]
protocol => "http"
index => "json_10meilleurs_logs"
user => "elastic"
password => "changeme"
}

et je voudrais aussi savoir est-ce qu'il y a une synthaxe particulière?

Par ailleurs, est-ce que je ne peux pas faire ça avec ces paramètres? :


en settant les paramètres comme suit:

  • manage_template => false #pour qu'il ne mette pas le template par défaut
  • template_name => “by_row” #puisque je veux que mes données aient le même format en sortie qu'en entrée (par ligne)
  • template_overwrite => true #pour que le précédent template soit écrasé lors de cet import

(David Pilato) #4

Plus simplement tu peux créer ton index ainsi (depuis la Dev console Kibana, sinon avec curl):

DELETE test
PUT test
{
  "settings":{
    "index.mapping.total_fields.limit": 2000
  }
}

(Rym Guerbi Michaut) #5

Admettons que j'utilise Kibana pour le faire.
Comment fait-on pour modifier les paramètres d'un index qui n'a pas encore été créé sur Elasticsearch puisque l'erreur s'affiche sur Logstash lors de la tentative d'import?


(David Pilato) #6

Exactement comme je viens de le montrer.

Tu copies/colles ma réponse dans Kibana et tu exécute les deux commandes.

La 1ère ca effacer l’index si il existe
La 2eme, le créer


(Rym Guerbi Michaut) #7

Ca renvoie une erreur. Et pour cause, test n'existe pas encore.

J'ai supprimé l'ancien index qui contenait 0 document pour tenter de le créer à nouveau et depuis, je n'arrive plus à créer d'index, j'ai une erreur qui s'affiche:
"Cannot create pipeline {:reason=>"Something is wrong with your configuration."}
alors que le fichier de configuration n'a pas changé -_-


(Rym Guerbi Michaut) #8

le fichier de configuration logstash:
input {
http_poller {
urls => {
test => {
method => get
user => "me"
password => "mypassword"
url => "myurl"
headers => {
Accept => "application/json"
}
}
}
request_timeout => 120
schedule => { cron => "*/02 * * * * UTC"}
codec => "json"
metadata_target => "http_poller_metadata"
}
}

output {
elasticsearch {
hosts => ["localhost:9200"]
protocol => "http"
index => "json_10meilleurs_logs"
user => "elastic"
password => "changeme"
}
}


(David Pilato) #9

J’ai modifié mon exemple. Les guillemets sont bizarres sur iPhone parfois.

Oui si l’index n’existe pas, la première exécution donne une erreur. Normal.
Ca n’empêche pas d’exécuter la 2eme commande.


(David Pilato) #10

À noter qu’il faut remplacer test par le nom de ton index. "json_10meilleurs_logs"


(Rym Guerbi Michaut) #11

Ca marche mieux :slight_smile:L'index a été créé.
Il ne reste plus qu'à le remplir :slight_smile:
J'espère y arriver sans avoir à revenir vers toi -_-

Merci encore pour ton aide


(Rym Guerbi Michaut) #12

@dadoonet je dois malheureusement revenir vers toi pour le remplissage de mon index.

Ca a marché une fois, mais ça ne veut plus :frowning:

mon fichier de configuration :

input {
 http_poller {
    urls => {
        test => {
        method => get
        user => "moi"
        password => "mdp"
        url => "monurl"
        headers => {
        Accept => "application/json"
        }
     }
    }
    request_timeout => 120
    schedule => { cron => "*/03 * * * * UTC"}
    codec => "json"
    metadata_target => "http_poller_metadata"
  }
}

output {
  	elasticsearch {
	hosts => ["localhost:9200"] 
	index => "json_10meilleurs_logs"
	user => "elastic"
	password => "changeme"
	}
}

et sur Kibana, à l'affichage de l'index j'ai ça:

{
  "took": 2,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 1,
    "hits": [
      {
        "_index": "json_10meilleurs_logs",
        "_type": "logs",
        "_id": "AWBKBGYk-gt4iIR0On40",
        "_score": 1,
        "_source": {
          "http_request_failure": {
            "name": "test",
            "request": {
              "headers": {
                "Accept": "application/json"
              },
              "method": "get",
              "auth": {
                "eager": true,
                "user" => "moi"
                "password" => "mdp"
                "url" => "monurl"
            },
            "error": "Read timed out",
            "backtrace": null,
            "runtime_seconds": 10.289
          },
          "@timestamp": "2017-12-12T09:18:10.416Z",
          "@version": "1",
          "http_poller_metadata": {
            "name": "test",
            "host": "kda-CTBR3G2",
            "request": {
              "headers": {
                "Accept": "application/json"
              },
              "method": "get",
              "auth": {
                "eager": true,
                 "user" => "moi"
                 "password" => "mdp"
                  "url" => "monurl"
            },
            "runtime_seconds": null
          },
          "tags": [
            "_http_request_failure"
          ]
        }
      }
    ]
  }
}

J'ai un "_http_request_failure" pour les champs: _source et tags
Et je n'arrive pas à voir ce qui ne va pas.... Pourrais-tu m'aider s'il te plait?


(David Pilato) #13

Le mieux est d'ouvrir une autre discussion.
Pas la peine non plus de "ping-er" les participants au forum. Chacun est libre de répondre ou non aux questions.

Le pb est amusant.
Je ne sais pas ce qui se passe mais tu devrais changer

output { 
  elasticsearch {
    // ...
  }
}

par

output { 
  stdout { codec => rubydebug }
}

Et voir ce que ça sort.


(Rym Guerbi Michaut) #14

Merci pour tes réponses. Désolée pour le dérangement.

Je vais ouvrir un autre sujet.


(Damien Alexandre) #15

Plutôt que de lever la limite, j'aurais plutôt regardé côté document. Tu as peut être des valeurs dans les clés du JSON, ou un JSON mal formaté en sortie de Logstash. L'erreur veut quand même dire que ton JSON a plus de 1000 clé différentes, c'est pas rien ! :smile:

Concernant http_request_failure je pense que c'est un tout autre problème.


(Rym Guerbi Michaut) #16

Justement, tout le problème est là @Damien_Alexandre. Et du coup, j'ai essayé de le formater en utilisant split + mutate - convert mais ça ne marche pas non plus. Au début au moins j'avais une sortie avec toutes mes valeurs. Maintenant, il n'y a plus rien qui passe, avec ou sans filtres...

Je ne vois vraiment pas ce qui pourrait être le problème.

Je ne maîtrise pas trop les documents en JSON, comment faire pour reconnaître les clefs justement?


(Damien Alexandre) #17

Tu peux suivre la recommendation de dadoonet et remplacer ton output par celui ci:

Ensuite quand tu lancera Logstash, tu verra dans ta console les documents en sortie de pipeline, et c'est la que tu pourra ce qui cloche dans le document.
La correction dépendra du problème. N'hésite pas à partager ici un exemple d'output.


(Rym Guerbi Michaut) #19

Hello,

Un petit message juste pour dire que ça fonctionne à nouveau et je ne sais pas comment ça se fait.
Mais ça marche :blush:

Cependant, toujours le même problème de format de sortie du document: un seul document JSON au format objet malgré tous les filtres apposés. Mais je pense que j'ouvrirai un autre thread pour ça.

Merci pour votre aide.


(system) #20

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