Protobuf解析文本

时间:2018-06-08 21:39:27

标签: ruby protocol-buffers google-protocol-buffer

我有以下protobuf文本,我使用google-protobuf来解析它,但我不知道该怎么做。

# HELP Type about service.
# TYPE gauge
metadata_server1{namespace="default",service="nginx"} 1
metadata_server2{namespace="default",service="operator"} 1
metadata_server3{namespace="default",service="someservice"} 1
...

每当我尝试解码它时,我都会收到此错误:

/usr/lib/ruby/gems/2.3.0/gems/protobuf-3.8.3/lib/protobuf/decoder.rb:21:in `decode_each_field'

这就是我试图解码它的方式:

class Metrics < ::Protobuf::Message
  required :string, :namespace, 1
  required :string, :value, 2
  required :string, :map, 3
end

class Message < ::Protobuf::Message
  repeated Metrics, :metrics, 1
end

data = get_data('http://localhost:8080/')

parsed_data = Metrics.decode(data)
puts parsed_data.metrics //does not work

有谁知道我怎么解析这个?

1 个答案:

答案 0 :(得分:1)

您的数据不是Protobuf。 Protobuf是二进制格式,而不是文本,因此它不像您所看到的数据那样是人类可读的。从技术上讲,Protobuf有一个用于调试的替代文本表示,但您的数据也不是那种格式。

相反,您的数据似乎是Prometheus文本格式,而不是Protobuf格式。要解析这个,你需要一个Prometheus文本解析器。通常,只有普罗米修斯本身使用这种格式,因此没有很多用于解析它的库可用(而有很多库用于创建它)。但格式非常简单,你可以使用合适的正则表达式解析它。

某些导出Prometheus指标的服务器也支持以其他基于Protobuf的格式导出它。如果您的服务器支持,您可以通过发送标题来请求它:

Accept: application/vnd.google.protobuf; proto=io.prometheus.client.MetricFamily; encoding=delimited

如果您在请求中发送该内容,则可能会获取基于Protobuf的格式,如果服务器支持该格式的话。请注意,在Prometheus 2中不推荐使用Protobuf格式并将其删除,因此现在可能会有更少的服务器支持它。

如果您的服务器支持这种格式,请注意结果仍然不是普通的Protobuf。相反,它是一个Protobufs的集合&#34; delimited&#34;格式。每个Protobuf都以varint编码长度作为前缀(&#34; varint&#34;是Protobuf的可变宽度整数编码)。在C ++或Java中,有&#34; parseDelimitedFrom&#34;可用于解析此格式的函数,但看起来Ruby目前没有内置支持。