2016-11-11 7 views
1

私はElasticSearchクエリをデバッグしようとしています。私は問題のあるクエリの説明を有効にしました。これは、クエリが合計を実行する必要がある中間のスコアの積を実行していることを示しています。 (私はelastic4sを使用してクエリ要求を作成しています)埋め込みElasticSearchですべてのクエリを記録するにはどうすればよいですか?

問題は、実際に生成されたクエリが何であるかわかりません。私はバグがelastic4s(クエリのリクエストを間違って生成する)、私のコード、またはelasticsearchにあるかどうかを判断したい。

ESLoggerFactory.setDefaultFactory(new Slf4jESLoggerFactory()) 
val settings = Settings.settingsBuilder 
    .put("path.data", dataDirPath) 
    .put("path.home", "/var/elastic/") 
    .put("cluster.name", clusterName) 
    .put("http.enabled", httpEnabled) 
    .put("index.number_of_shards", 1) 
    .put("index.number_of_replicas", 0) 
    .put("discovery.zen.ping.multicast.enabled", false) 
    .put("index.refresh_interval", "10ms") 
    .put("script.engine.groovy.inline.search", true) 
    .put("script.engine.groovy.inline.update", true) 
    .put("script.engine.groovy.inline.mapping", true) 
    .put("index.search.slowlog.threshold.query.debug", "0s") 
    .put("index.search.slowlog.threshold.fetch.debug", "0s") 
    .build 

を、私は私のlogback.xmlで構成されたログファイルに記録されている任意のクエリを見つけることができません。だから私は、次のコードを使用して試験に用い埋め込まelasticsearchインスタンスのログを有効にしています。 elasticsearchの他のログメッセージが実際のクエリではなく現れています。

+0

Fiddlerでスニッフィングすることでクエリを取得できますか? – plmaheu

答えて

1

ほとんどのタイプの要求に対して、要求を送信します。これをコードの便利な場所に記録することができます。すべてのES検索クエリを生成する1つのメソッドがある場合。偽のJSONを生成するElasticsearchのコードには、まだバグが残っている可能性があるので、完全に信頼すべきではありません。しかし、.showの出力で問題を再現しようとすると、HTTP経由で実際のElasticsearchクラスタに対してSenseを使用することができます。可能であれば、それはelastic4sのバグではないことを知ります。(b)JSONを簡単に操作できます問題の原因を突き止めるようにしてください。

を呼び出すことがあるため、Elasticsearch APIまたは別のJVMベースのラッパーを使用して呼び出すと、JSON文字列を取得してログに記録できます。

埋め込み型のElasticsearchを使用すると、これはロギングの点で優れています。ビルダーの呼び出しにブレークポイントを設定し、作成された実際のJava Elasticsearchリクエストオブジェクトを観察するのは簡単です(最も正確ですアプローチ)。

1

少なくとも、現在利用可能なESバージョンではないことは少なくともできません。これは、いくつかの長さ(例えばhttps://github.com/elastic/elasticsearch/issues/9172https://github.com/elastic/elasticsearch/issues/12187)で議論されたことですが、これはすぐに変更される可能性があり、タスクAPIの書き直しがあるようです。その間、ES Restlog(https://github.com/etsy/es-restlog)のようなものを使用したり、ESの前にnginxを置いたり、nginxログにクエリを取り込んだりすることができます。 tcpdump(例:tcpdump -vvv -x -X -i any port 9200)を使用して、サーバー上で実行中のクエリを取得することもできます。最後のオプションは、アプリケーションを変更して実行するのではなく、クエリをエコーすることです(クエリ自体がJSONなので、実行する前にES自体にクエリを挿入する)。 elastic4sの特定の場合には、それはJSON-over-HTTPのプロトコルをするために使用されていた場合は、要求のJSON本体部分があったであろうものを生成するelastic4sのクエリオブジェクトに.showを呼び出す機能を提供しています

関連する問題