2014-09-25 4 views
1

Я использую саранчу для стресс-теста нашего приложения.Где я могу найти журналы саранчи?

У меня возникают ошибки, потому что вызов POST кажется неправильным. Где я могу увидеть журналы для саранчи? Я хотел бы посмотреть, как выглядит почтовый вызов, чтобы понять, что случилось.

Вот мой код в случае, если кто-то может сказать мне, что я делаю неправильно:

from locust import HttpLocust, TaskSet, task 

json3 = """{"stack_name": "beenz-php-app-12", "disable_rollback": true, "template": "php", "timeout_mins": 60}""" 

class MyTaskSet(TaskSet): 
    @task 
    def send(self): 
      response = self.client.post("/stacks", json3, headers={'X-Auth-Key': 'xxxx', 'Content-Type': 'application/json', 'X-Auth-User': 'xxxx', 'Accept': 'application/json', 'X-Auth-Token':'xxxx'}) 
      print "Response status code:", response.status_code 
      print "Response content:", response.content 

class MyLocust(HttpLocust): 
    task_set = MyTaskSet 
    min_wait = 5000 
    max_wait = 15000 

Спасибо!

+0

Я вижу эту ошибку в Locust: HTTPError ('500 Server Error: Server Error',) – Beenz

ответ

0

У вас есть синтаксическая ошибка в строке, начинающейся с response = self.client.post(.... Последняя строка никогда не закрывается: 'X-Auth-Token':'xxxx}.

Измените его на 'X-Auth-Token':'xxxx'}, и скрипт должен работать нормально.

При запуске Locust со сценарием, который вы отправили (с синтаксической ошибкой), вы сразу получите трассировку Исключения и стека.

+0

Когда я заменил фактический токен на х, я думаю, что я случайно вынул заключительную цитату. В моем сценарии он есть. ошибки, которые я вижу, - это 500-е.Мне было интересно, где журналы для Locust, чтобы я мог взглянуть и посмотреть, как выглядит столбец. Когда я использую Postman с тем же URL-адресом, телом и заголовками, он работает нормально. – Beenz

+0

Я вижу. Я не уверен, какой журнал вы имеете в виду. Один из способов отладки проблемы - это выполнить запрос, используя как почтальон, так и Locust, http://requestb.in/, а затем посмотреть, что отличается. – heyman

5

Добавляя --logfile=locustfile.log параметр при запуске саранчи, ваши print сообщения будут перенаправлены в файл с именем locustfile.log, который я думаю, это журнала вы упомянули в своем вопросе.

Предположим, что ваше имя файла саранчи locustfile.py. И вы запускаете саранчу на своей локальной машине. Вы можете начать саранчу на locust --host=http://127.0.0.1 --logfile=locustfile.log. Затем вы сможете запустить тест саранчи на http://127.0.0.1:8089/.

0

В случае, если это не было очевидно, нет установленного по умолчанию. https://github.com/locustio/locust/blob/master/locust/main.py

линия 167

# log file 
parser.add_option(
    '--logfile', 
    action='store', 
    type='str', 
    dest='logfile', 
    default=None, 
    help="Path to log file. If not set, log will go to stdout/stderr", 
) 

Просто передайте предпочтительное место в случае работает как фоновый процесс, как lyen упоминалось.

0

Опция --logfile, упомянутая другими, является, пожалуй, самым легким маршрутом. Обратите внимание, что вы, вероятно, хотите записывать свои сообщения, а не печатать их. Я думаю, что саранча устанавливает специальный регистратор stdout таким образом, что сообщения print отправляются на консоль, но не в файл журнала.

Альтернативой --logfile является использование системы регистрации python для добавления собственного приложения для файлов. Это хороший вариант, если вам нужен скопированный файл-приложение или формат журнала, который вы предпочитаете в формате, который настраивается саранчой.

Вот пример того, как мы настраиваем и используем ведение журнала в нашем тесте саранчи. Обратите внимание, как каждый экземпляр набора задач регистрируется в своем собственном журнале. Это позволяет легко фильтровать файл журнала на одну саранчу. Также обратите внимание, что мы регистрируем все ошибки HTTP как предупреждения.

from locust import HttpLocust, TaskSet, task 
import itertools 
import logging 
import socket 
from logging.handlers import RotatingFileHandler 

def append_file_logger(): 
    root_logger = logging.getLogger() 
    log_format = "%(asctime)s.%(msecs)03d000 [%(levelname)s] {0}/%(name)s : %(message)s".format(socket.gethostname()) 
    formatter = logging.Formatter(log_format, '%Y-%m-%d %H:%M:%S') 
    file_handler = RotatingFileHandler('./locust.log', maxBytes=5 * 1024 * 1024, backupCount=3) 
    file_handler.setFormatter(formatter) 
    file_handler.setLevel(logging.INFO) 
    root_logger.addHandler(file_handler)  

append_file_logger() 

counter = itertools.count() 

class FooTaskSet(TaskSet): 
    def on_start(self): 
     self.logger = logging.getLogger('locust-%03d' % counter.next()) 
     self.logger.info('Hatching locust') 

    @task 
    def send(self): 
     response = self.client.post(...) 
     if not response.ok: 
      self.logger.warn('Error sending post') # TODO add status code, url, and reponse to the log 

Окончательное предложение: Если у вас есть несколько задач, настраивать их регистрировать все ошибки HTTP с тем же форматом. Легко извлекает данные из вашего журнала.

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