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
Последняя строка так же заканчивается этим символом
Пустые строки игнорируются
Внутри строки ее элементы разделются более чем одним пробелом или табом
Начальные и конечные пробелы/табы игнорируются
Строки у которых первый непустой символ это решетка #
- комментарии
# 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