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

在Python中反序列化Prometheus remote_write Protobuf输出遇阻求助

Prometheus Remote Write数据解析失败:Protobuf解码错误解决

问题背景

首次使用Prometheus,已配置remote_write向本地Flask服务器发送数据:

remote_write:
  - url: "http://localhost:5000/metric"

能读取传入字节,但无法转换为有效数据。希望不依赖第三方包,自行学习Protobuf序列化/反序列化,尝试了两种Protobuf定义解析均失败:

  1. 使用metrics.proto编译后的metrics_pb2.py:
read_metric = metrics_pb2.Metric()
read_metric.ParseFromString(request.data)
  1. 使用remote.proto编译后的remote_pb2.py解析WriteRequest:
read_metric = remote_pb2.WriteRequest()
read_metric.ParseFromString(request.data)

均报错:google.protobuf.message.DecodeError: Error parsing message

补充目标:将多Prometheus实例数据流转至消息队列,供主动学习模型做在线实时训练,因此选择remote_write而非拉取模式,欢迎其他方案建议。

解决方法

核心问题:Prometheus Remote Write发送的数据默认经过Snappy压缩,必须先解压再解析Protobuf消息。正确代码如下:

import snappy
# 替换为你的remote_pb2导入路径
from proto_files import remote_pb2

raw_data = request.data
decompressed_data = snappy.uncompress(raw_data)

write_request = remote_pb2.WriteRequest()
write_request.ParseFromString(decompressed_data)

额外建议

  • Protobuf定义选择:必须使用remote.proto中的WriteRequest,这是Prometheus Remote Write的标准传输消息结构,包含批量时间序列数据,是正确的解析对象,而非单独的Metric。
  • 替代方案推荐:
    • 若不想自行处理序列化/压缩逻辑,可使用prometheus-agent,它能高效聚合多实例数据,支持直接对接消息队列(如Kafka)。
    • 针对实时流场景,thanos-receive可接收多实例Remote Write数据,再转发至消息队列,减少自定义开发工作量。
    • 若使用Kafka,可直接选用支持Remote Write的Kafka导出组件,快速完成数据流转。

内容的提问来源于stack exchange,提问作者picklepick

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 13:45:28