# #google-cloud-platform #google-cloud-functions
Вопрос:
У меня есть облачная функция Google, запускаемая тематическим шаблоном.
В большинстве случаев все работает нормально, как это:
2021-11-06 15:12:38.830 GMT vote_stage oga5hymuzx4p Function execution started
2021-11-06 15:13:45.392 GMT vote_stage oga5hymuzx4p Function execution took 66563 ms, finished with status: 'ok'
Но, к сожалению, раз в двадцать я вижу только это:
2021-11-06 15:08:45.139 GMT vote_stage rvfnd4wo5nwd Function execution started
Как это возможно, что нет журнала выхода ?
Ниже приведен код функции:
def vote_stage(event, context):
assert context == context
call_datetime = reusable.time.get_now()
game_id = event['attributes']['game_id']
logger.info(f'start, game_id={game_id}')
game = build_game(game_id)
resp = ut.exceptions.ExceptionsHandler(game).handle_vote_stage_exceptions()
if resp:
logger.info(f'exception, game_id={game_id}')
return resp
game.dict['vote_stage_last_trigger'] = reusable.time.get_now()
ut.firestore.FirestoreEditor(game).set_game(merge=True)
while True:
game = build_game(game_id)
ut.slack.SlackOperator(game).update_vote_stage_lower()
c1 = len(game.frozen_guessers) == 1
c2 = game.time_left_to_vote <= 0
c3 = not game.remaining_potential_voters
if c1 or c2 or c3:
game.dict['frozen_voters'] = deepcopy(game.dict['voters'])
game.dict['vote_stage_over'] = True
ut.firestore.FirestoreEditor(game).set_game(merge=True)
game.stage_triggerer.trigger_pre_result_stage()
logger.info(f'pre_result_stage triggered, game_id={game_id}')
return make_response('', 200)
if ut.time.datetime1_minus_datetime2(
reusable.time.get_now(),
call_datetime) > game.self_trigger_threshold:
game.stage_triggerer.trigger_vote_stage()
logger.info(f'vote_stage self-triggered, game_id={game_id}')
return make_response('', 200)
time.sleep(game.refresh_interval)
Здесь game.self_trigger_threshold = 60 секунд и game.refresh_interval = 9 секунд. Время ожидания функции vote_stage составляет 540 секунд.
Метод game.stage_triggerer.trigger_pre_result_stage() публикует сообщение в теме «topic_pre_result_stage», которое запускает облачную функцию «pre_result_stage».
Метод game.stage_triggerer.trigger_vote_stage() публикует сообщение в теме «topic_vote_stage», которое запускает облачную функцию «vote_stage».
Единственный внутренний журнал, который я нахожу, это:
2021-11-06 15:08:49.594 GMT vote_stage rvfnd4wo5nwd 2021-11-06 15:08:49,594 - INFO - start, game_id=20211106_150714amp;T01LTPERV4Zamp;C02EKL5PQAXamp;U01LFAZNKPVamp;2694551026434.1707796879169.ce017050e1e74e97332c2a04d4b19c08
Вот снимок экрана (сделанный в 2021-11-07) средства просмотра устаревших журналов, на котором показаны все журналы выполнения этой функции (с execution_id = rvfnd4wo5nwd):
Вот скриншот (сделанный в 2021-11-07) средства просмотра устаревших журналов, на котором показаны все журналы с уровнем = «Ошибки» функции vote_stage:
Как можно видеть, ни один из них не относится к 2021-11-06 годам.
Комментарии:
1. Как долго вы ждали, прежде чем проверить завершение? Как ты смотрела в журналах? Например, что делать, если функция вышла из строя … Я бы предположил, что это будет отображаться в нефильтрованных журналах, но может не отображаться в отфильтрованных журналах. Возможно, посмотрите в облачном журнале напрямую, чтобы узнать, можно ли увидеть больше.
2. Я просто добавляю эти детали к вопросу.
3. Сколько времени займет обработка? Каков тайм-аут облачных функций
4. Обработка занимает около 70-х годов. Время ожидания составляет 540 секунд.
5. Это может звучать как неожиданность. Возможно, у службы закончилась память или другой ресурс. Скорее всего, журнал просто потерялся из-за какой-то системной неполадки. Не могли бы вы проверить, ведут ли некоторые из ваших текущих идентификаторов выполнения все еще так, как вы описали?
Ответ №1:
У меня больше нет ошибок. Я сделал следующее изменение: я заменил publisher.publish(**kwargs)
publisher.publish(**kwargs).result()
эту функцию, которая используется для запуска темы pubsub.
Как описано здесь https://cloud.google.com/functions/docs/troubleshooting : Если ваша функция создает асинхронные задачи, она также должна явно дождаться завершения этих задач.
Ответ №2:
Пропущенные записи в журналах из Облачных функций обычно не ожидаются и могут быть вызваны завершением процесса до того, как он достигнет фазы, на которой журналы пересылаются в Облачный мониторинг. Отсутствующая запись в журнале обычно не вызывает беспокойства, но может указывать на некоторую несбалансированную конфигурацию. Преждевременное прекращение использования ресурсов может быть вызвано исчерпанием некоторого лимита. Похоже, что ваша функция занимает значительное количество времени.
vote_stage oga5hymuzx4p Function execution took 66563 ms,
finished with status: 'ok'
Где тайм-аут по умолчанию составляет 1 минуту, и его можно продлить до 9, так как ваша функция говорит, что у нее тайм-аут 540 секунд.
В вашей настройке тайм-аут функции близок к предельному, и случается, что она потребляет большую часть времени выполнения. Таким образом, вполне возможно, что журналы не будут захвачены. Что может помочь, так это поэкспериментировать с конфигурацией облачных функций и предоставить больше ресурсов, но этого может быть недостаточно, поскольку основная причина здесь неизвестна.
Лучший вариант, который я мог бы предложить, — обратиться в службу поддержки Google Cloud, чтобы правильно проверить, что происходит в фоновом режиме, и правильно понять характеристики трафика функции. У GCP есть бесплатная пробная версия, которую вы можете попробовать, и поддержка для нее также доступна.