web-dev-qa-db-fra.com

sortie logstash vers index elasticsearch et mappage

J'essaie d'avoir une sortie logstash dans elasticsearch mais je ne sais pas comment utiliser le mapping que j'ai défini dans elasticsearch ...

À Kibana, j'ai fait ceci:

Créé un index et un mapping comme ceci:

PUT /kafkajmx2
{
  "mappings": {
    "kafka_mbeans": {
      "properties": {
        "@timestamp": {
          "type": "date"
        },
        "@version": {
          "type": "integer"
        },
        "Host": {
          "type": "keyword"
        },
        "metric_path": {
          "type": "text"
        },
        "type": {
          "type": "keyword"
        },
        "path": {
          "type": "text"
        },
        "metric_value_string": {
          "type": "keyword"
        },
        "metric_value_number": {
          "type": "float"
        }
      }
    }
  }

}

Peut écrire des données comme ça:

POST /kafkajmx2/kafka_mbeans
{
  "metric_value_number":159.03478490788203,
  "path":"/home/usrxxx/logstash-5.2.0/bin/jmxconf",
  "@timestamp":"2017-02-12T23:08:40.934Z",
  "@version":"1","Host":"localhost",
  "metric_path":"node1.kafka.server:type=BrokerTopicMetrics,name=TotalFetchRequestsPerSec.FifteenMinuteRate",
  "type":null


}

maintenant ma sortie logstash ressemble à ceci:

input {
        kafka {
                kafka details here
        }

}
output {

    elasticsearch {
            hosts => "http://elasticsearch:9050"
            index => "kafkajmx2"

    }

}

et il écrit simplement dans l'index kafkajmx2 mais n'utilise pas la carte, quand je l'interroge comme ceci dans kibana:

get /kafkajmx2/kafka_mbeans/_search?q=*
{


}

Je récupère ceci:

      {
        "_index": "kafkajmx2",
        "_type": "logs",
        "_id": "AVo34xF_j-lM6k7wBavd",
        "_score": 1,
        "_source": {
          "@timestamp": "2017-02-13T14:31:53.337Z",
          "@version": "1",
          "message": """
{"metric_value_number":0,"path":"/home/usrxxx/logstash-5.2.0/bin/jmxconf","@timestamp":"2017-02-13T14:31:52.654Z","@version":"1","Host":"localhost","metric_path":"node1.kafka.server:type=SessionExpireListener,name=ZooKeeperAuthFailuresPerSec.Count","type":null}

"""
        }
      }

comment lui dire d'utiliser la carte kafka_mbeans dans la sortie logstash?

-----MODIFIER-----

J'ai essayé ma sortie comme ça mais j'obtiens toujours les mêmes résultats:

output {

        elasticsearch {
                hosts => "http://10.204.93.209:9050"
                index => "kafkajmx2"
                template_name => "kafka_mbeans"
                codec => plain {
                        format => "%{message}"
                }

        }

}

les données dans la recherche élastique devraient ressembler à ceci:

{
  "@timestamp": "2017-02-13T14:31:52.654Z", 
  "@version": "1", 
  "Host": "localhost", 
  "metric_path": "node1.kafka.server:type=SessionExpireListener,name=ZooKeeperAuthFailuresPerSec.Count", 
  "metric_value_number": 0, 
  "path": "/home/usrxxx/logstash-5.2.0/bin/jmxconf", 
  "type": null
}

-------- EDIT 2 --------------

J'ai au moins eu le message d'analyser JSON en ajoutant un filtre comme celui-ci:

input {
        kafka {
                ...kafka details....
        }

}
filter {
        json {
                source => "message"
                remove_field => ["message"]
        }
}
output {

        elasticsearch {
                hosts => "http://node1:9050"
                index => "kafkajmx2"
                template_name => "kafka_mbeans"
        }

}

Il n’utilise pas encore le modèle, mais cet atleast analyse correctement le json ...

  {
    "_index": "kafkajmx2",
    "_type": "logs",
    "_id": "AVo4a2Hzj-lM6k7wBcMS",
    "_score": 1,
    "_source": {
      "metric_value_number": 0.9967205071482902,
      "path": "/home/usrxxx/logstash-5.2.0/bin/jmxconf",
      "@timestamp": "2017-02-13T16:54:16.701Z",
      "@version": "1",
      "Host": "localhost",
      "metric_path": "kafka1.kafka.network:type=SocketServer,name=NetworkProcessorAvgIdlePercent.Value",
      "type": null
    }
  }
8
lightweight

Ce que vous devez changer est très simple. Commencez par utiliser le codec json dans votre entrée kafka. Pas besoin du filtre json, vous pouvez le supprimer.

    kafka {
            ...kafka details....
            codec => "json"
    }

Ensuite, dans votre sortie elasticsearch, vous manquez le type de mappage (paramètre document_type ci-dessous), ce qui est important sinon il vaut par défaut logs (comme vous pouvez le voir) et cela ne correspond pas à votre type de mappage kafka_mbeans. De plus, vous n'avez pas vraiment besoin d'utiliser un modèle puisque votre index existe déjà. Effectuez la modification suivante:

    elasticsearch {
            hosts => "http://node1:9050"
            index => "kafkajmx2"
            document_type => "kafka_mbeans"
    }
5
Val

Ceci est défini avec le paramètre template_name sur la sortie elasticsearch.

elasticsearch {
        hosts         => "http://elasticsearch:9050"
        index         => "kafkajmx2"
        template_name => "kafka_mbeans"
}

Un avertissement, cependant. Si vous souhaitez commencer à créer des index encadrés dans le temps, par exemple un index par semaine, vous devrez effectuer quelques étapes supplémentaires pour vous assurer que votre mappage reste identique. Vous avez quelques options ici:

  • Créez un modèle elasticsearch et définissez-le pour l'appliquer aux index à l'aide d'un glob. Tels que kafkajmx2-*
  • Utilisez le paramètre template sur la sortie, qui spécifie un fichier JSON qui définit votre mappage qui sera utilisé avec tous les index créés via cette sortie.
0
sysadmin1138