Info
Content

Exposition formats

Метрики выставляются для прометеуса в простом текстовом формате
Раньше можно было использовать protobuf, но больше нельзя (из-за некоторых особенностей это работает менее эффективно)

Text-based format

Начиная со 2 версии все приложения, которые предоставляют метрики в формате пригодном для прометеуса, должны предоставлять их в текстовом формате

Basic Info:

Аспект Описание
Транспорт HTTP
Кодировка UTF-8, \n - конец строки
HTTP Content-Type text/plain; version=0.0.4
Optional HTTP Content-Encoding gzip
Преимущества - Человекочитаемый
- Быстро обрабатывается
- Читается построчно (вместе с docstrings)
Ограничения - Многословность
- Типы не являются неотъемлемой частью синтаксиса, поэтому проверять их почти невозможно
- Издержки на парсинг
Поддерживаемые примитивы - Counter
- Gauge
- Histogram
- Summary
- Untyped

Текстовый формат метрик premetheus строко-ориентированный
Строки разделяются символом переноса строки \n
Последняя строка так же заканчивается этим символом
Screenshot_2021_02_02-12_49_03-2021-07-01-at-17shshsh.png

Пустые строки игнорируются


Внутри строки ее элементы разделются более чем одним пробелом или табом
Начальные и конечные пробелы/табы игнорируются

Строки у которых первый непустой символ это решетка # - комментарии

# HELP go_goroutines Number of goroutines that currently exist.
# TYPE go_goroutines gauge
go_goroutines 9

Если после решетки идет не HELP или TYPE, то комментарий полностью игнорируется (то есть он для людей)

  • HELP - После этого ключевого слова ожидается как минимум название метрики, а все что дальше идет в этой строке, считается справкой. Для любого имени метрики может существовать только один HELP
  • TYPE - После слова type ожидается два слова, имя метрики и ее тип. Комментарий с типом должен встретиться раньше чем первый сэмпл данных. Если тип не встретится раньше то будет установлен тип untyped

Каждая строка описывается следующим EBNF выражением:

metric_name [
  "{" label_name "=" `"` label_value `"` { "," label_name "=" `"` label_value `"` } [ "," ] "}"
] value [ timestamp ]
  • metric_name и label_name - подчиняются уже ранее описанным prometheus lang ограничениям
  • label_value - любая последовательность UTF-8 символов (\,",\n должны экранироваться)
  • value - это Foat, представляемый в соответствии с требованиями Go'шной ParseFloat(). Также валидны NaN, +Inf, и -Inf (Not a Number, positive infinity, negative infinity)
  • timestamp - это int64 представляемый в соответствии с Go'шной ParseInt()

Все строки для конкретной метрики должны быть сгруппированы в одну группу. Так же круто бы иметь воспроизводимую сортировку внутри этой группы, но если на это тратятся значительные вычислительные затраты, то можно не сортировать
Каждая строка должна иметь уникальную комбинацию имени и набора лейблов, иначе поведение при приеме метрик становится непредсказуемым

histogram и summary сложно представимы в текстовом виде, поэтому применяются следующие соглашения:

  • Сумма выборки для сводки или гистограммы с именем x приводится в виде отдельной выборки с именем x_sum
  • Количество выборок для сводки или гистограммы с именем x задается как отдельный образец с именем x_count
  • Каждый квантиль сводки с именем x задается в виде отдельной строки с тем же именем x и лейблом {quantile="y"}
  • Каждое количество сегментов гистограммы с именем x отображается в виде отдельной строки с именем x_bucket и меткой {le="y"} (где y-верхняя граница сегмента)
  • Гистограмма должна иметь ячейку с {le="+Inf"}. Его значение должно совпадать со значением x_count
  • Сегменты гистограммы и квантили сводки должны отображаться в порядке возрастания числовых значений их меток (для le или лейбла quantile соответственно)

Ниже пример представления метрик

# HELP http_requests_total The total number of HTTP requests.
# TYPE http_requests_total counter
http_requests_total{method="post",code="200"} 1027 1395066363000
http_requests_total{method="post",code="400"}    3 1395066363000

# Escaping in label values:
msdos_file_access_time_seconds{path="C:\\DIR\\FILE.TXT",error="Cannot find file:\n\"FILE.TXT\""} 1.458255915e9

# Minimalistic line:
metric_without_timestamp_and_labels 12.47

# A weird metric from before the epoch:
something_weird{problem="division by zero"} +Inf -3982045

# A histogram, which has a pretty complex representation in the text format:
# HELP http_request_duration_seconds A histogram of the request duration.
# TYPE http_request_duration_seconds histogram
http_request_duration_seconds_bucket{le="0.05"} 24054
http_request_duration_seconds_bucket{le="0.1"} 33444
http_request_duration_seconds_bucket{le="0.2"} 100392
http_request_duration_seconds_bucket{le="0.5"} 129389
http_request_duration_seconds_bucket{le="1"} 133988
http_request_duration_seconds_bucket{le="+Inf"} 144320
http_request_duration_seconds_sum 53423
http_request_duration_seconds_count 144320

# Finally a summary, which has a complex representation, too:
# HELP rpc_duration_seconds A summary of the RPC duration in seconds.
# TYPE rpc_duration_seconds summary
rpc_duration_seconds{quantile="0.01"} 3102
rpc_duration_seconds{quantile="0.05"} 3272
rpc_duration_seconds{quantile="0.5"} 4773
rpc_duration_seconds{quantile="0.9"} 9001
rpc_duration_seconds{quantile="0.99"} 76656
rpc_duration_seconds_sum 1.7560473e+07
rpc_duration_seconds_count 2693
No Comments
Back to top