Google Cloud Functions 在没有错误消息的情况下崩溃
Posted
技术标签:
【中文标题】Google Cloud Functions 在没有错误消息的情况下崩溃【英文标题】:Google Cloud Functions crashes without an error message 【发布时间】:2021-02-16 04:04:18 【问题描述】:我正在运行一个 http 触发的云功能。该脚本在 Flask 条件下进行了测试,并且运行良好。由于未知原因,云运行突然停止,我收到“错误:无法处理请求”。 当我检查功能日志时,没有错误消息或任何崩溃迹象。我所看到的只是程序打印的输出,一直到它停止的地方
我分配了最大内存大小 4GB,并且我减少了请求中的数据大小(更短的时间跨度,简单的故障)。然而,同样的问题。
这是它停止的代码部分(来自 Twitter API 的数据请求):
def getAsyncData(account, entity, date_from, date_to,metric_groups,network,segmented_by=False,country_lst = None):
entity_dict = entity.active_entities(account, date_from, date_to)
if entity_dict == []:
return None
print(json.dumps(entity_dict, indent=4, sort_keys=True))
df = pd.DataFrame.from_dict(entity_dict)
entity_arr = df['entity_id'].tolist()
print(entity_arr)
queued_job_ids = []
for chunk_ids in getChunks(entity_arr, n=20):
if (segmented_by == 'LOCATIONS') or (segmented_by is None) or (segmented_by =='PLATFORMS'):
queued_job_ids.append(
entity.queue_async_stats_job(account=account, ids=chunk_ids, metric_groups=metric_groups,
start_time=date_from,
end_time=date_to,
granularity=GRANULARITY.DAY,
segmentation_type=segmented_by,
placement=network).id)
elif segmented_by == 'REGIONS':
for country in country_lst:
queued_job_ids.append(
entity.queue_async_stats_job(account=account, ids=chunk_ids, metric_groups=metric_groups,
start_time=date_from,
end_time=date_to,
granularity=GRANULARITY.DAY,
placement=network,
segmentation_type=segmented_by,
country=country, ).id)
print(queued_job_ids)
if queued_job_ids == []:
return None
# let the job complete
seconds = 10
time.sleep(seconds)
while True:
async_stats_job_results = entity.async_stats_job_result(account, job_ids=queued_job_ids)
if all(result.status == 'SUCCESS' for result in async_stats_job_results):
break
async_data = []
for result in async_stats_job_results:
async_data.append(entity.async_stats_job_data(account, url=result.url))
print(json.dumps(async_data, indent=4, sort_keys=True))
return async_data
我在日志中看到的最后一个打印是 queued_job_ids。在那之后 - 什么都没有。没有错误或任何其他活动。 我用相同的代码运行其他功能,它运行良好。 可能是什么原因?有什么想法吗?
【问题讨论】:
我遇到了类似的问题,云功能似乎抑制了异常。尝试在此方法的调用中添加try/except
块并手动打印异常。此外,由于您有 while True
,因此在每次尝试中添加日志可能有助于调试。
你能包含你的整个函数吗?什么叫getAsyncData
?你能做一个最小复制的例子吗?
所以我在 Google Cloud Run(而不是 Google Cloud Function)中部署了相同的函数,它确实返回了一个错误,这与代码的后面部分有关......
【参考方案1】:
早在 8 月就有一个问题,Cloud Functions 没有显示任何日志。您可以通过重新部署 Cloud Functions 来确认您是否受到相同问题的影响,如下所示:
gcloud functions deploy func --set-env-vars USE_WORKER_V2=true,PYTHON37_DRAIN_LOGS_ON_CRASH_WAIT_SEC=5 --runtime=python37 --runtime=python37
请查看此Issue Tracker 了解更多信息。
如果在重新部署该功能后,您仍然看不到任何日志,我建议您在新的Issue Tracker 中报告此问题,并且按照 cmets 中的建议,作为一种解决方法,您可以使用包装器。这是一个简单的例子:
import logging
import traceback
def try_catch_log(wrapped_func):
def wrapper(*args, **kwargs):
try:
response = wrapped_func(*args, **kwargs)
except Exception:
error_message = traceback.format_exc().replace('\n', ' ')
logging.error(error_message)
return 'Error';
return response;
return wrapper;
#Example hello world function
@try_catch_log
def hello_world(request):
request_args = request.args
print( 0 / 0 )
return 'Hello World!'
【讨论】:
您好,所以我添加了环境变量,但仍然看不到任何错误。我尝试使用包装器,但函数没有失败,因此异常块没有捕获到错误。 “response.content”说“无法处理请求”。似乎运行突然中止了,原因不明......以上是关于Google Cloud Functions 在没有错误消息的情况下崩溃的主要内容,如果未能解决你的问题,请参考以下文章
? Google Cloud Functions ?????? MongoDB Atlas ??
如何从 Cloud Functions 连接 Google Cloud SQL?