Elasticsearchにlogstash出力を作成しようとしていますが、elasticsearchで定義したマッピングの使用方法がわかりません...
Kibanaでこれを行いました:
次のようにインデックスとマッピングを作成しました:
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"
}
}
}
}
}
次のようにデータを書き込むことができます:
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
}
今私のlogstash出力は次のようになります:
input {
kafka {
kafka details here
}
}
output {
elasticsearch {
hosts => "http://elasticsearch:9050"
index => "kafkajmx2"
}
}
そして、それをkafkajmx2
インデックスですが、マップを使用していません。kibanaで次のようにクエリすると、
get /kafkajmx2/kafka_mbeans/_search?q=*
{
}
私はこれを取り戻します:
{
"_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}
"""
}
}
マップを使用するように指示する方法kafka_mbeans
logstash出力で?
-----編集-----
私はこのような出力を試しましたが、同じ結果が得られます:
output {
elasticsearch {
hosts => "http://10.204.93.209:9050"
index => "kafkajmx2"
template_name => "kafka_mbeans"
codec => plain {
format => "%{message}"
}
}
}
エラスティック検索のデータは次のようになります。
{
"@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
}
--------編集2 ----------------
私は少なくとも次のようなフィルターを追加することによってjsonに解析するメッセージを取得しました:
input {
kafka {
...kafka details....
}
}
filter {
json {
source => "message"
remove_field => ["message"]
}
}
output {
elasticsearch {
hosts => "http://node1:9050"
index => "kafkajmx2"
template_name => "kafka_mbeans"
}
}
それはまだテンプレートを使用していませんが、これは少なくとも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
}
}
変更する必要があるのは非常に簡単です。まず、json
入力でkafka
コーデックを使用します。 json
フィルターは必要ありません。削除できます。
kafka {
...kafka details....
codec => "json"
}
次に、elasticsearch
出力にマッピングタイプがありません(下記のパラメーターdocument_type
)。これは重要です。それ以外の場合は、デフォルトでlogs
になります(ご覧のとおり)。 t kafka_mbeans
マッピングタイプと一致します。さらに、インデックスはすでに存在しているため、テンプレートを使用する必要はありません。次の変更を行います。
elasticsearch {
hosts => "http://node1:9050"
index => "kafkajmx2"
document_type => "kafka_mbeans"
}
これは the template_name
パラメータelasticsearch
出力。
elasticsearch {
hosts => "http://elasticsearch:9050"
index => "kafkajmx2"
template_name => "kafka_mbeans"
}
ただし、警告が1つあります。週に1つのインデックスなど、時間どおりにボックス化されたインデックスの作成を開始する場合は、マッピングをそれぞれに維持するために、さらにいくつかの手順を実行する必要があります。そこではいくつかのオプションがあります:
kafkajmx2-*
template
parameter を使用します。これは、その出力を通じて作成されるすべてのインデックスで使用されるマッピングを定義するJSONファイルを指定します。