Перейти к содержимому

Справочник по формату пака

Пак — это один YAML-файл pack.yaml в формате версии 1. Неизвестные ключи — это ошибки, а не игнорируемые настройки: опечатка вроде treshold будет показана.

my-pack/
pack.yaml the pack itself: the only file the server needs
fixtures/ one captured response per source, named after its id
status.json
expected.prom what the extraction must produce from the fixtures
КлючОбязателенЗначение
schemaдаВсегда 1.
idдаСтрочные буквы, цифры и одиночные дефисы, начинается с буквы, до 40 символов: shelly-plug. Тип монитора становится pack.<id>, префикс метрик — dumbmonit_<id with underscores>_.
versionдаСемантическая версия пака: 1.2.0.
requiresнетВерсии DumbMonit, с которыми работает пак, в виде требования semver: ">=0.2". Сервер вне этого диапазона отклоняет пак.
labelдаНазвание, показываемое в списке типов мониторов.
summaryнетОдно предложение: что отслеживает пак.
examplesнетПродукты, к которым он применим, показываются как подсказки.
address_hintнетПлейсхолдер поля адреса: 192.168.1.50.
default_portнетПорт, используемый, если в адресе он не указан.
schemeнетhttp (по умолчанию) или https; монитор может переопределить его.
setupнетУведомление, показываемое рядом с формой монитора: title, steps (список; то, что идёт после перевода строки в шаге, показывается как копируемая команда), warning, doc_url.
credentialsнетДопустимые типы учётных данных в порядке предпочтения: none, api_token, username_password. По умолчанию: [none]. Элементом может быть {kind, label, help}, чтобы изменить формулировки формы.
optionsнетНастройки, показываемые в форме монитора (ниже).

Опции сохраняются в мониторе и читаются через {{option.<key>}} в путях, заголовках и телах запросов, а также в порогах правил.

options:
- key: switch_id # lowercase, digits, underscores
label: Switch channel
help: 0 for a plug; 0, 1, 2… for each channel of a relay.
input: number # text (default), number, boolean or select
default: 0
required: false
placeholder: ""
choices: [] # the values of a select

Каждый пак, который опрашивает монитор, также получает пять опций соединения, которые нельзя переобъявить: scheme, port, insecure_tls, request_timeout_seconds (от 1 до 120, по умолчанию 10) и allow_private_targets.

Источник — это один запрос за опрос, всегда отправляемый на собственный адрес монитора.

sources:
- id: status # lowercase, digits, underscores
type: http # http or prometheus
path: /rpc/Switch.GetStatus?id={{option.switch_id}}
method: GET # GET (default) or POST
format: json # http only: json (default) or text
headers:
Accept: application/json
body: '{"id": {{option.switch_id}}}' # POST only
auth: auto # auto (default), none, bearer or basic
  • path должен начинаться с одного /. URL запроса — это адрес монитора, за которым следует путь; после подстановки он должен сохранить ту же схему, хост и порт, иначе запрос отклоняется. Значения опций кодируются в путях с помощью процентного кодирования, поэтому значение не может добавить сегмент или изменить хост.
  • auth: auto отправляет учётные данные api_token как Authorization: Bearer …, а учётные данные username_password — как базовую аутентификацию. none ничего не отправляет неявно, поэтому учётные данные можно передать в заголовке: X-Api-Key: "{{credential.token}}". {{credential.token}}, {{credential.username}} и {{credential.password}} допускаются только в заголовках: никогда в пути или теле, которые попадают в логи.
  • Редиректы выполняются только на ту же схему, хост и порт, не более трёх. 401 и 403 сообщаются как ошибки аутентификации, другие статусы не 2xx — как ошибки протокола.
  • За один опрос выполняется не более 16 запросов, и читается не более 4 MiB на ответ.
sources:
- id: metrics
type: prometheus
path: /metrics
keep: [node_load1, node_memory_MemAvailable_bytes]
rename:
node_memory_MemAvailable_bytes: memory_available_bytes
drop:
fstype: ^(tmpfs|overlay)$
  • keep перечисляет семейства, импортируемые как есть, со всеми их метками. Имя семейства также охватывает его серии histogram и summary (_bucket, _sum, _count). Счётчики (counters), гистограммы и суммы summary остаются счётчиками; всё остальное — gauge.
  • rename задаёт сохранённому семейству имя в DumbMonit. Имя, не состоящее из строчных букв, цифр и подчёркиваний, необходимо переименовать.
  • drop отбрасывает каждый сэмпл, чья метка соответствует регулярному выражению.
  • Метки, которые DumbMonit задаёт сам (target, host, instance, job, tag_*…), сохраняются как exported_<name>.

У каждой метрики имя без префикса: power_watts в паке shelly-plug записывается как dumbmonit_shelly_plug_power_watts. Имена состоят из строчных букв, цифр и подчёркиваний и уникальны в пределах пака.

metrics:
- name: power_watts
help: Active power drawn by the load.
source: status
kind: gauge # gauge (default) or counter
json: $.apower # exactly one of json, regex or prom
scale: 1 # multiplier, e.g. 0.001 for ms → s
map: {on: 1, off: 0} # text value → number
labels: {}
ЭкстракторИсточникЗначениеlabels
json: <JSONPath>http, формат jsonКаждый узел, подходящий под путь (RFC 9535 JSONPath, включая подстановочные знаки и фильтры), даёт одну серию.метка → JSONPath, вычисляемый на объекте, который содержит значение: $.sensors[*].value с sensor: $.name помечает каждое значение соседним полем name.
regex: <expression>http, формат textКаждое совпадение даёт одну серию; значение — это группа с именем value, иначе первая группа.метка → имя группы захвата.
prom: <sample name>prometheusКаждый сэмпл с точно таким именем.метка → метка источника. Пусто: сохраняются все метки источника.

Значения: числа берутся как есть; true/false становятся 1/0; текст ищется в map или разбирается как число, если map нет. Значение, которое отсутствует, равно null или не входит в map, не даёт в этом опросе ничего.

discover превращает каждый элемент списка в набор серий с общими метками: одна строка на диск, датчик или очередь.

discover:
- name: disks
source: list
rows: $.disks[*] # JSONPath: one row per match
max_rows: 100 # default 100, at most 1,000
labels: # JSONPath evaluated on each row
disk: $.name
model: $.info.model
metrics:
- name: disk_used_bytes
json: $.used # JSONPath evaluated on each row
- name: disk_healthy
json: $.state
map: {ok: 1, degraded: 0}

Метрики строк принимают name, help, kind, json, scale и map. Строки сверх max_rows игнорируются.

Правила устанавливаются вместе с паком как обычные правила оповещений с uid pack:<id>:<name>. После этого они принадлежат вам: обновление пака добавляет правила, которых ещё нет, и никогда не перезаписывает правило, которое вы изменили или удалили.

rules:
- name: overheating # lowercase, digits, underscores
title: Shelly plug overheating
description: The internal temperature stayed above the limit for five minutes.
expr: dumbmonit_shelly_plug_temperature_celsius
op: ">" # >, >=, < or <=
threshold: "{{option.max_temperature}}" # or a number
for: 5m # 30s, 5m, 1h, 1d
severity: warning # info, warning (default) or critical
unit: °C
  • expr — это MetricsQL, и он должен использовать хотя бы одну метрику пака по её полному имени. Любое другое имя dumbmonit_*, которое он упоминает, тоже должно создаваться паком (кроме dumbmonit_up): пак не может оповещать по сериям другого типа.
  • threshold вида {{option.x}} устанавливает значение опции по умолчанию, а собственное значение этой опции у каждого монитора становится его порогом для этого правила (переопределение для монитора, перезаписываемое при каждом сохранении монитора).

Пак может содержать профили SNMP, написанные точно так же, как встроенные в profiles/. Они присоединяются к каталогу SNMP и применяются по sysObjectID, как и остальные; собственный тип монитора они не создают.

snmp_profiles:
- id: acme-ups # the pack id, or starting with "<pack id>-"
name: ACME UPS
match:
sysobjectid: [1.3.6.1.4.1.99999]
include: [system]
metrics:
- name: acme_ups_battery_percent # must start with the pack prefix
oid: 1.3.6.1.4.1.99999.1.1.0
kind: gauge
label: Заряд батареи # необязательно, показывается на странице устройства
unit: "%" # необязательно: %, s, B, °C, bool…
view: timeseries # необязательно: stat, timeseries, topn или heatmap
view_title: Батарея # метрики с одним видом и заголовком делят один график

Каталог SNMP читается при запуске: перезапустите DumbMonit после установки или обновления пака с профилями SNMP.

ЛимитЗначение
Размер пака256 KiB
Источники (запросы за опрос, включая редиректы)16
Размер ответа4 MiB
Серий за опрос5 000 (остальные отбрасываются и записываются в лог)
Объявленных метрик256
Правил64
Строк на один discover1 000
Длина значения метки200 байт

dumbmonit pack test <dir> читает fixtures/<source id>.json, .txt или .prom, выполняет то же извлечение, что и сервер, и сравнивает результат с expected.prom: текстовый формат Prometheus, отсортированный, без временных меток и без меток монитора (target, host, tag_*), которые добавляет сервер. --update записывает expected.prom из фикстур; просмотрите diff перед коммитом.