如何追踪未确认推送通知的更多详情?Pub/Sub推送订阅302错误请求失败详情记录方法咨询
刚好之前处理过类似的Pub/Sub推送调试问题,给你分享几个实用的方案:
一、获取302响应的完整细节(Location头、响应体)
Pub/Sub默认的日志可能不会返回太详细的响应信息,但可以通过以下方式搞定:
开启Pub/Sub的详细投递日志
进入你的推送订阅配置,把日志类型设置为DELIVERY_ATTEMPT或者ALL。开启后,每条推送尝试的日志会包含请求的基本信息,以及响应的状态码、关键响应头(包括Location)。虽然默认不会记录完整响应体,但302响应通常没有复杂的响应体,重点的Location头是可以捕获到的,足够给防火墙排查提供线索。搭建临时调试代理
既然怀疑是防火墙返回的302,最直接的办法是在你的自有端点前加一个简单的代理服务,让Pub/Sub先推送到这个代理。代理负责完整记录所有请求和响应的细节(包括请求头、响应头、状态码、响应体),再转发到实际端点。这样不管是防火墙的拦截响应还是其他异常,你都能拿到一手数据。比如用Python Flask快速写个代理示例:
from flask import Flask, request import requests import logging app = Flask(__name__) # 配置日志,确保所有细节都被记录 logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(message)s') @app.route('/', methods=['POST']) def debug_proxy(): # 记录Pub/Sub发来的请求 app.logger.info(f"Pub/Sub Request Headers: {dict(request.headers)}") app.logger.info(f"Pub/Sub Request Body: {request.get_data(as_text=True)}") # 转发到实际业务端点 real_endpoint = "https://your-actual-endpoint.com" response = requests.post( real_endpoint, data=request.get_data(), headers=dict(request.headers) ) # 记录返回的响应(包括防火墙的302) app.logger.info(f"Response Status Code: {response.status_code}") app.logger.info(f"Response Headers: {dict(response.headers)}") app.logger.info(f"Response Body: {response.text}") # 把原响应返回给Pub/Sub return response.text, response.status_code, dict(response.headers) if __name__ == '__main__': app.run(host='0.0.0.0', port=8080)把Pub/Sub的推送端点改成这个代理的地址,运行起来后就能在日志里看到完整的交互内容了。
结合死信队列(DLQ)记录响应信息
如果你的端点能收到防火墙的302响应(不是直接被拦截),可以配置死信队列,然后在端点收到302时,手动把Location头、状态码作为消息属性添加进去,再NACK这条消息,让它进入死信队列。这样死信队列里的消息就带着你需要的调试信息,方便后续排查。不过如果防火墙直接阻断了请求,端点根本收不到,这个方法就不适用了,还是得用代理。
二、追踪未确认(unacked)推送通知的细节
对于未确认的消息,可以通过这几个方式追踪:
查看订阅监控指标
在Pub/Sub的监控面板里,重点看unacked_messages(未确认消息数)、delivery_attempts(投递尝试次数)这些指标,能快速了解整体的未确认情况。结合详细日志里的message_id,可以关联到具体的消息。创建订阅快照拉取未确认消息
你可以给目标订阅创建一个快照,快照会保留当前订阅的未确认消息状态。然后基于快照创建一个临时订阅,拉取里面的消息查看详细内容:# 创建快照 gcloud pubsub snapshots create my-debug-snapshot --subscription=my-push-sub # 创建临时订阅关联快照 gcloud pubsub subscriptions create temp-debug-sub --snapshot=my-debug-snapshot # 拉取未确认消息 gcloud pubsub subscriptions pull temp-debug-sub --auto-ack这样就能直接拿到未确认消息的内容、属性和投递历史。
通过日志和API查询消息元数据
开启详细日志后,每条投递失败的日志都会包含message_id,你可以用这个ID通过Pub/Sub API调用projects.messages.get,获取消息的完整元数据,包括投递次数、最后一次投递的时间、消息属性等细节。
总结
如果是防火墙直接拦截导致端点收不到请求,优先用调试代理的方式捕获完整交互;如果端点能收到302,死信队列+消息属性是个不错的选择。对于未确认消息,监控指标+快照+日志的组合基本能覆盖所有追踪需求。
内容的提问来源于stack exchange,提问作者D.Smeliansky

