2012-03-21 7 views
2

У меня есть очередь на выгрузку, обслуживаемая бэкэнд, а когда очередь пуста, мне нужно запустить другой скрипт.Ошибка загрузки статистики очереди приложений Google App Engine

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

В любом случае, лучший способ сделать это Я считаю, что использовать метод fetch_statistics для очереди. Таким образом, сценарий может отслеживать, что происходит в очереди на выносливость, и знать, что в очереди больше нет элементов. Теперь это, очевидно, доступно через REST api для очередей, но кажется, что это слишком удобно для использования, когда я использую их внутри.

Так что я делаю вызов Queue.fetch_statistics(), но он выдает ошибку. Я попытался поместить указанную ошибку в Google, но ничего не возвращает. То же самое и в stackoverflow.

Он всегда бросает:

AttributeError: type object 'QueueStatistics' has no attribute '_QueueStatistics__TranslateError' 

Мой код:

q = taskqueue.Queue('reporting-pull') 
    try: 
     logging.debug(q.fetch_statistics()) 
    except Exception, e: 
     logging.exception(e) 

Может кто-нибудь пролить свет на это? Я делаю что-то действительно глупо здесь?

+0

AFAIK [Queue] (http://code.google.com/appengine/docs/python/taskqueue/queues.html) не имеет метода fetch_statistics –

+0

Это так, ну конечно же в коде sdk, но его не документировано. Это метод, который используется JSONified для службы REST API. В задаче.ого линия 1810 'Защита fetch_statistics (самостоятельно): «»«Получить текущие сведения об этой очереди Возвращает:.. Экземпляра QueueStatistics, содержащая информация об этой очереди „“» возвращение QueueStatistics.fetch (сами) ' Также исключенное исключение относится к объекту, возвращаемому из метода, а не к самому методу, который не существует. Во время работы он может немного отличаться. –

+0

, работающий с недокументированным api, где любой момент, когда провайдер может отключить вас и сломать вас, не является самым мудрым делом. –

ответ

2

API статистики очереди заданий теперь задокументирован и общедоступен. Ошибка больше не возникает.

1

Непосредственная причина возникновения конкретной ошибки, кажется, является ошибкой в ​​коде; Queue.fetch_statistics() вызывает QueueStatistics.fetch() вызывает QueueStatistics._FetchMultipleQueues(), который, по-видимому, встречает apiproxy_errors.ApplicationError, а затем пытается вызвать cls .__ TranslateError(), но такого метода в классе QueueStatistics не существует.

Я не знаю более глубокую причину для ApplicationError, но это может означать, что эта функция еще не поддерживается производственной версией.

+1

Спасибо Гвидо! Я не ожидал, что лучший человек ответит! Я просто подумал, что это возможно, поскольку кажется, что Rest api в SDK, похоже, использовал ту же функцию перед JSONifying для ответа. Дело в том, что я решил, что просто попробую REST API посмотреть, с чем это произошло. Кажется, что это нормально работает при производстве. {u'kind ': u'taskqueues # taskqueue', u'stats ': {u'oldestTask': u'0 ', u'leasedLastMinute': u'4 ', u'leasedLastHour': u'4 ', u'totalTasks ': 0}. Хотя кажется немного странным использовать приложение для аутентификации на отдыхе api для собственной очереди, оно работает и будет делать для меня! –

3

Just incase полезен для кого-то еще, вот пример функции, чтобы вы начали получать информацию о очереди из своего приложения. Это единственный пример и может улучшить обработку ошибок, но он должен запустить вас. Раньше мы использовали клиент Taskqueue, но я думал, что это немного переборщило, поскольку мы все равно можем сдавать в аренду и удалять код, поэтому я использовал идентификатор приложения, и это сработало.

from google.appengine.api import taskqueue 
from google.appengine.api import app_identity 
from google.appengine.api import urlfetch 
try: 
    import json 
except ImportError: 
    import simplejson as json 
import logging 

def get_queue_info(queue_name, stats=False): 
    ''' 
     Uses the Queue REST API to fetch queue info 
     Args: 
      queue_name: string - the name of the queue 
      stats: boolean - get the stats info too 
     RETURNS: 
      DICT: from the JSON response or False on fail 
    ''' 
    scope = 'https://www.googleapis.com/auth/taskqueue' 
    authorization_token, _ = app_identity.get_access_token(scope) 
    app_id = app_identity.get_application_id() 
    #note the s~ denoting HRD its not mentioned in the docs as far as 
    #I can see, but it wont work without it 
    uri = 'https://www.googleapis.com/taskqueue/v1beta1/projects/s~%s/taskqueues/%s?getStats=%s' % (app_id, queue_name, stats) 
    #make the call to the API 
    response = urlfetch.fetch(uri, method="GET", headers = {"Authorization": "OAuth " + authorization_token}) 
    if response.status_code == 200: 
     result = json.loads(response.content) 
    else: 
     logging.error('could not get queue') 
     logging.error(response.status_code) 
     logging.error(response.content) 
     return False 


    return result 

Не забудьте обновить queue.yaml с ACL для идентичности приложения

-name: queue_name 
mode: pull 
acl: 
- user_email: [email protected] 

Я надеюсь, что кто-то считает, что это полезно.

Тем временем я отправил запрос функции, чтобы мы могли сделать это с помощью объекта Queue, пожалуйста, идите и запустите его, если хотите. http://goo.gl/W8Pk1

+0

Как-то ваш запрос функции был отмечен как 'invalid' – Ryan

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