2016-11-11 3 views
1

Я пытаюсь отладить запрос ElasticSearch. Я включил объяснение проблемного запроса, и это показывает, что запрос выполняет продукт промежуточных оценок, где он должен делать сумму. (Я создаю запрос запроса, используя elastic4s.)Как регистрировать все запросы во встроенном ElasticSearch?

Проблема в том, что я не вижу, что такое сгенерированный запрос. Я хочу определить, находится ли ошибка в elastic4s (некорректно генерирует запрос запроса), в моем коде или в elasticsearch. Поэтому я позволил протоколирования для встроенного 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, а не фактические запросы.

+0

Вы можете получить запрос, обнюхивая с помощью Fiddler? – plmaheu

ответ

1

В конкретном случае elastic4s, он предлагает возможность вызова .show на elastic4s объекта запроса для создания того, что JSON часть тела запроса бы если JSON-над-HTTP протокол был использован для отправьте запрос для большинства типов запросов. Затем это может быть зарегистрировано в удобной точке вашего кода, например. если у вас есть один метод, который генерирует все поисковые запросы ES. Код в Elasticsearch, который генерирует поддельный JSON, все равно может иметь ошибки, поэтому ему не следует полностью доверять. Тем не менее, стоит попытаться воспроизвести проблему с результатом .show, используя Sense против реального кластера Elasticearch через HTTP. Если вы можете, вы (а) знаете, что это не ошибка с эластиком, и (b) может легко манипулировать JSON до попытайтесь выяснить, что вызывает проблему.

show в некоторых случаях вызывает toString, поэтому с помощью простого API Elasticsearch или другой поверх него на основе JVM-оболочки вы можете вызвать это, чтобы получить строку JSON для регистрации.

С встроенным Elasticsearch это так же хорошо, как вы собираетесь получать с точки зрения ведения журнала - не доставляя точку останова на вызовы компоновщика и наблюдая за объектами запроса Java Elasticsearch, которые созданы (что является наиболее точным подход).

1

Вы не можете, по крайней мере, не напрямую, по крайней мере, не в версиях ES, доступных в настоящее время. Это то, что обсуждалось на какой-то длине (например, https://github.com/elastic/elasticsearch/issues/9172 и https://github.com/elastic/elasticsearch/issues/12187), похоже, что это может измениться в ближайшее время, с переходом API-интерфейсов задач. Тем временем вы можете использовать такие вещи, как ES Restlog (https://github.com/etsy/es-restlog) и/или поместить nginx перед ES и захватить запросы в журналах nginx. Вы также можете использовать tcpdump (например, tcpdump -vvv -x -X -i any port 9200) и захватить запрос, как он работает на сервере. Последний вариант - изменить ваше приложение и повторить запрос вместо его выполнения (и/или вставить запрос в ES непосредственно перед его выполнением, так как сам запрос - JSON).

Смежные вопросы