TimeOut ES 6.1.1


#1

bonjour,

j'utilise elasticsearch 6.1.1 dans un des projets sur lesquels je travaille.
j'ai ES sur AZURE, le soucis que j'ai c'est que si je fais pas de requête à es pendant un moment (je n'ai pas le temps exacte, quelques minutes) j'ai un timeout systimatiquement, par contre après le premier il répond sans problème, quelque ms.
Est-ce que c'est un comportement normal ?
pour info, j'utilse elasticsearch-py (python) pour appeler ES
merci d'avance.


(David Pilato) #2

Je ne connais pas la lib python mais peut-être met-il du temps pour initialiser sa première connexion, genre pour vérifier quels noeuds répondent ?

Pas certain néanmoins.


#3

Bonjour,

Merci pour votre réponse, je voulais être sûr que il n'y a pas de paramètre à changer côté ES.
si je comprends bien il n'y a pas moyen d'eviter ce soucis?
peut-être mettre en place une tâche que le reveille, ce n'ai pas propre !


(David Pilato) #4

Non, je pense plus à un pb côté client.

Tu peux tenter quelque chose.

Lance:

GET /_search

Puis attend le temps nécessaire et relance à nouveau la même commande.
Regarde si c'est long ou rapide.


#5

merci, je vais faire le test quand l'import des données est fait.
d'ici un 1/2h !


(Gabriel Tessier) #6

J'utilise aussi la lib elasticsearch-py depuis un bout de temps et j'ai jamais eu de problemes similaire ou qui s'en approche. (J'ai eu plein de problemes mais pas celui-la).
Si les GET _search repondent rapidement c'est que le problem est dans ta creation de connexion.
Tu peux partager ton code quand et comment tu fais ta connexion?


#7

Bonjour,
je n'ai pas encore fais de test avec "GET _search", je n'ai pas eu le temps de le faire, mais ma connexion est très simple, j'ai créer une classe dans mon projet qui gère tout ce qui est en lien avec ES

import  Elasticsearch 

class ElasticSearch:
    def __init__(self, hosts, port=9200):
        self.client = Elasticsearch(hosts, port=port)

    def searh(self, index_name, q):
        search = Search(using=self.client, index=index_name)
        query_search = search.suggest('my_suggest', q,....}).source(False)
        return query_search.execute()

#8

avec "GET _search" nien d'anormal, ES répond sans soucis.


(Gabriel Tessier) #9

Si pas de soucis avec GET c'est que c'est forcement a cause de la facon dont tu fais ta connexion. Quel framework tu utilises?


#10

merci pour les réponses.
c'est du flask


(Gabriel Tessier) #11

Nous on a mis ca dans le fichier extensions.py on utilise un boilerplate:
Boilerplate source: https://github.com/sloria/cookiecutter-flask
C'est avec elastic 5.x donc y'a peut etre des petites differences.

# -*- coding: utf-8 -*-
"""Extensions module. Each extension is initialized in the app factory located in app.py."""


from elasticsearch import Elasticsearch

class Elastic(object):
  """A thin wrapper around elasticsearch.Elasticsearch() Because there's no init_app.

  Original code : http://pydoc.net/Python/Flask-Elastic/0.1/flask_elastic/
  """
  def __init__(self, app=None):
    if app is not None:
      self.init_app(app)

  def init_app(self, app):
    ELASTIC_SERVER = ('127.0.0.1', )
    ELASTIC_CONFIG = {
      'timeout': 10,
      'retry_on_timeout': True,
      'sniff_on_start': True,
      'sniff_on_connection_fail': True,
      'sniffer_timeout': 60,
      'sniff_timeout': 10,
    }
    app.extensions['elastic'] = Elasticsearch(ELASTIC_SERVER, **ELASTIC_CONFIG)

  def __getattr__(self, item):
    from flask import current_app
    if 'elastic' not in current_app.extensions.keys():
      raise Exception(
        'not initialised, did you forget to call init_app?')
    return getattr(current_app.extensions['elastic'], item)


es = Elastic()

Apres tu peux appeler l'extension :

from .extensions import es

def search(self, index_name, q):
    return es.search(index=index_name, doc_type='_doc', body=q)

C'est extrait d'un grand projet j'ai mis que le minimum.
L'important c'est que la connexion ne se fasse qu'une fois quand tu demarre ton projet flask run ou python main.py.
Apres tu peux jouer avec les options dans ELASTIC_CONFIG.


#12

OK merci, je vais voir.
je vais jouer sur ELASTIC_CONFIG, concernant l'instanciation de ES, je le fais aussi une fois au démarage de l'aplication.
merci pour les réponses


#13

Bonjour,

bizzard, toujours le problème de timeout et ne peux le changer de plus 10, je pense que ça va faire pareil.

Traceback (most recent call last):
  File "/home/myhome/app_name/venv/lib/python3.5/site-packages/flask/app.py", line 1997, in __call__
    return self.wsgi_app(environ, start_response)
  File "/home/myhome/app_name/venv/lib/python3.5/site-packages/flask/app.py", line 1985, in wsgi_app
    response = self.handle_exception(e)
  File "/home/myhome/app_name/venv/lib/python3.5/site-packages/flask_restful/__init__.py", line 273, in error_router
    return original_handler(e)
  File "/home/myhome/app_name/venv/lib/python3.5/site-packages/flask/app.py", line 1540, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/home/myhome/app_name/venv/lib/python3.5/site-packages/flask/_compat.py", line 32, in reraise
    raise value.with_traceback(tb)
  File "/home/myhome/app_name/venv/lib/python3.5/site-packages/flask/app.py", line 1982, in wsgi_app
    response = self.full_dispatch_request()
  File "/home/myhome/app_name/venv/lib/python3.5/site-packages/flask/app.py", line 1614, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/home/myhome/app_name/venv/lib/python3.5/site-packages/flask_restful/__init__.py", line 273, in error_router
    return original_handler(e)
  File "/home/myhome/app_name/venv/lib/python3.5/site-packages/flask/app.py", line 1517, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/home/myhome/app_name/venv/lib/python3.5/site-packages/flask/_compat.py", line 32, in reraise
    raise value.with_traceback(tb)
  File "/home/myhome/app_name/venv/lib/python3.5/site-packages/flask/app.py", line 1612, in full_dispatch_request
    rv = self.dispatch_request()
  File "/home/myhome/app_name/venv/lib/python3.5/site-packages/flask/app.py", line 1598, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/home/myhome/app_name/venv/lib/python3.5/site-packages/flask_restful/__init__.py", line 480, in wrapper
    resp = resource(*args, **kwargs)
  File "/home/myhome/app_name/venv/lib/python3.5/site-packages/flask/views.py", line 84, in view
    return self.dispatch_request(*args, **kwargs)
  File "/home/myhome/app_name/venv/lib/python3.5/site-packages/flask_restful/__init__.py", line 595, in dispatch_request
    resp = meth(*args, **kwargs)
  File "/home/myhome/app_name/app_name/app_name/serializer/__init__.py", line 13, in wrapper
    resp = f(*args, **kwargs)
  File "/home/myhome/app_name/app_name/app_name/decorators.py", line 24, in wrapper
    return f(*args, **kwargs)
  File "/home/myhome/app_name/app_name/app_name/interfaces/filters.py", line 36, in get
    resp = current_elasticsearch.regions()
  File "/home/myhome/app_name/app_name/app_name/search/elastic_search.py", line 41, in regions
    resp_count = self.client.count(index="region")
  File "/home/myhome/app_name/venv/lib/python3.5/site-packages/elasticsearch/client/utils.py", line 76, in _wrapped
    return func(*args, params=params, **kwargs)
  File "/home/myhome/app_name/venv/lib/python3.5/site-packages/elasticsearch/client/__init__.py", line 1088, in count
    doc_type, '_count'), params=params, body=body)
  File "/home/myhome/app_name/venv/lib/python3.5/site-packages/elasticsearch/transport.py", line 314, in perform_request
    status, headers_response, data = connection.perform_request(method, url, params, body, headers=headers, ignore=ignore, timeout=timeout)
  File "/home/myhome/app_name/venv/lib/python3.5/site-packages/elasticsearch/connection/http_urllib3.py", line 157, in perform_request
    raise ConnectionTimeout('TIMEOUT', str(e), e)
elasticsearch.exceptions.ConnectionTimeout: ConnectionTimeout caused by - ReadTimeoutError(HTTPConnectionPool(host='xx.xxx.xxx.xx', port=9200): Read timed out. (read timeout=10))


(Gabriel Tessier) #14

Si ton timeout ne change pas dans ton backtrace alors que t'as modifié le code, y'a de grandes chances que ton code n'est pas appelé.
Ajout des print ou utilise pdb. On utilise ce code depuis des lustres (depuis elastic 0.9...) sur differents projets et ca fonctionne bien.


#15

Bonjour,

j'ai mis un backtrace avec 10 mais ça le fait aussi avec 60, ce n'est pas normal de mettre un Timeout de 60.
ça le fait qu'a la premiere requête si on laisse ES tranquille pendent un moment (je n'ai mésuré ce temps).
j'utilise le moteur ES: 6.1.1 sur azure
le client python:
elasticsearch==6.1.1
elasticsearch-dsl==6.1.0


(Gabriel Tessier) #16

A lire ton backtrace et le code que t'as posté plus haut tu créer une instance de connection a chaque requete...
Il serait peut etre plus simple si tu utilise un plugin comme celui-la: https://github.com/chiangf/Flask-Elasticsearch pour gerer la connexion.


#17

Bonjour,

je vais faire pareil, comme dans le pluging et voir ce que ça donne.
merci


(system) #18

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.