在Python中反序列化Prometheus remote_write Protobuf输出遇阻求助
Prometheus Remote Write数据解析失败:Protobuf解码错误解决
问题背景
首次使用Prometheus,已配置remote_write向本地Flask服务器发送数据:
remote_write: - url: "http://localhost:5000/metric"
能读取传入字节,但无法转换为有效数据。希望不依赖第三方包,自行学习Protobuf序列化/反序列化,尝试了两种Protobuf定义解析均失败:
- 使用
metrics.proto编译后的metrics_pb2.py:
read_metric = metrics_pb2.Metric() read_metric.ParseFromString(request.data)
- 使用
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
相关产品推荐
相关产品推荐

