web-dev-qa-db-ja.com

elasticsearchインデックスへのlogstash出力とマッピング

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
    }
  }
9
lightweight

変更する必要があるのは非常に簡単です。まず、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"
    }
5
Val

これは the template_nameパラメータelasticsearch出力。

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

ただし、警告が1つあります。週に1つのインデックスなど、時間どおりにボックス化されたインデックスの作成を開始する場合は、マッピングをそれぞれに維持するために、さらにいくつかの手順を実行する必要があります。そこではいくつかのオプションがあります:

  • Elasticsearchテンプレートを作成し、グロブを使用してインデックスに適用するように定義します。といった kafkajmx2-*
  • 出力で the template parameter を使用します。これは、その出力を通じて作成されるすべてのインデックスで使用されるマッピングを定義するJSONファイルを指定します。
0
sysadmin1138