Протобуф разбирать текст - PullRequest
0 голосов
/ 09 июня 2018

У меня есть следующий текст 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 голосов
/ 10 июня 2018

Ваши данные не являются Protobuf.Protobuf - это двоичный формат, а не текстовый, поэтому он не будет удобочитаемым, как данные, которые вы видите.Технически, у Protobuf есть альтернативное текстовое представление, используемое для отладки, но ваши данные тоже не тот формат.

Вместо этого ваши данные выглядят как текстовый формат Prometheus, который не является форматом Protobuf.Чтобы разобрать это, вам понадобится анализатор текста Prometheus.Обычно только Prometheus использует этот формат, поэтому не так много библиотек для его анализа (в то время как существует множество библиотек для его создания).Тем не менее, формат довольно прост, и вы можете проанализировать его с помощью подходящего регулярного выражения.

Некоторые серверы, которые экспортируют метрики Prometheus, также поддерживают экспорт в альтернативный формат на основе Protobuf.Если ваш сервер поддерживает это, вы можете запросить его, отправив заголовок:

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

Если вы отправите это в запросе, вы могли бы получить обратно формат на основе Protobuf, еслиСервер поддерживает это.Обратите внимание, что формат Protobuf устарел и удален в Prometheus 2, поэтому, вероятно, в наши дни его поддержит меньшее количество серверов.

Если ваш сервер поддерживает этот формат, обратите внимание, что результат все еще не является простым Protobuf.Скорее, это коллекция протобуфов в формате «с разделителями».Каждый Protobuf имеет префикс с длиной, закодированной в varint («varint» - это целочисленное кодирование Protobuf с переменной шириной).В C ++ или Java есть функции «parseDelimitedFrom», которые можно использовать для разбора этого формата, но похоже, что Ruby в настоящее время не имеет встроенной поддержки.

...