Почему упругий-рельсы внезапно вызывают Faraday :: ConnectionFailed (срок выполнения истек)? - PullRequest
0 голосов
/ 10 июня 2019

Я использую Elasticsearch в приложении Rails через самоэластичные модели и гемы эластичного поиска.

Раньше все работало нормально, но после некоторых обновлений я теперь получаю ошибку Connection Failed всякий раз, когда пытаюсьвзаимодействовать с удаленным кластером (AWS Elasticsearch).

> MyModel.__elasticsearch__.create_index! force: true
=> Faraday::ConnectionFailed (execution expired)

Я изо всех сил пытаюсь выяснить, что является причиной этой ошибки подключения.После поиска похожих проблем я настроил таймауты и попробовал различные комбинации http, https и naked urls, но безуспешно.

Что является разумным способом отладки этой ошибки подключения?

Мой Elasticsearch инициализируется следующим образом.

#initializers/elasticsearch.rb


require 'faraday_middleware'
require 'faraday_middleware/aws_sigv4'

credentials = Aws::Credentials.new(
  ENV.fetch('AWS_ACCESS_KEY_ID'),
  ENV.fetch('AWS_SECRET_ACCESS_KEY')
)

config = {
  url: ENV.fetch('AWS_ELASTICSEARCH_URL'),
  retry_on_failure: true,
  transport_options: {
    request: { timeout: 10 }
  }
}


client = Elasticsearch::Client.new( config ) do |f|
  f.request :aws_sigv4, credentials: credentials, service: 'es', region: ENV.fetch('AWS_ELASTICSEARCH_REGION')
end


Elasticsearch::Model.client = client

Ответы [ 2 ]

0 голосов
/ 17 июня 2019

Оказалось, что в этом выпуске было две части.

Сначала Elasticsearch :: Client, как настроено выше, использовал порт ES по умолчанию 9200. Мой ES размещен на AWS, который, по-видимому, не предоставляет этот порт.

После исправления этого, Я столкнулся со вторым вопросом (который я подозреваю, более конкретно для этого приложения).Я начал получать ошибку Faraday::ConnectionFailed (end of file).Я не знаю, что вызвало это, но настройка клиента с host и scheme исправила это.

Моя окончательная конфигурация выглядит следующим образом:

#initializers/elasticsearch.rb


# ...

config = {
  host: ENV.fetch('AWS_ELASTICSEARCH_URL'),
  port: 443,
  scheme: "https",
  retry_on_failure: true,
  transport_options: {
    request: { timeout: 10 }
  }
}

client = Elasticsearch::Client.new( config ) do |f|
# ...

NB AWS_ELASTICSEARCH_URL должен возвращать URL без протокола.

0 голосов
/ 10 июня 2019

Это из-за проблемы с версией.Используйте это gem 'elasticsearch-model', '~> 5'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...