You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何追踪未确认推送通知的更多详情?Pub/Sub推送订阅302错误请求失败详情记录方法咨询

捕获Pub/Sub推送订阅失败请求详情及追踪未确认通知的方法

刚好之前处理过类似的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 15:37:51