Мониторинг
На этой странице описаны проверки работоспособности, паттерны логов, статистика P2P-пиров и интеграция с внешними стеками мониторинга для узлов VIZ Ledger.
Проверка работоспособности: синхронизация узла
Запросите динамические глобальные свойства узла, чтобы убедиться в его работе и синхронизации:
curl -s -X POST http://localhost:8090 \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"call","params":["database_api","get_dynamic_global_properties",[]],"id":1}' \
| python3 -m json.toolПроверьте head_block_number — он должен увеличиваться каждые 3 секунды при синхронизации. Проверьте time — оно должно быть в пределах нескольких секунд от системных часов.
Простой скрипт проверки доступности:
#!/bin/bash
RESPONSE=$(curl -sf -X POST http://localhost:8090 \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"call","params":["database_api","get_dynamic_global_properties",[]],"id":1}')
if [ $? -ne 0 ]; then echo "CRIT: RPC unreachable"; exit 2; fi
HEAD=$(echo "$RESPONSE" | python3 -c "import sys,json; print(json.load(sys.stdin)['result']['head_block_number'])")
echo "OK: head_block_number=$HEAD"Паттерны логов
Производство блоков (узлы-валидаторы)
# Хорошо: слот произведён
produced block #123456 @2025-01-01T00:00:03 validator=alice sz=2048
# Пропущенный слот
MISSED-SLOT-OUR-validator: alice missed slot at 2025-01-01T00:00:06
# Обнаружен minority fork
MINORITY FORK DETECTED: rolling back to LIB #123400
# Сработал watchdog
WATCHDOG: no production for 180s, clearing flagsP2P-подключение
# Новый пир подключён
New peer is connected (203.0.113.10:2001), now 8 active peers
# Мягкий бан пира
soft-banning peer 203.0.113.10:2001 for 300s: reason=only_fork_db_blocks_no_progress
# Синхронизация завершена
Sync: peer 203.0.113.10 says we're up-to-dateСнимок и восстановление
# Снимок создан
Snapshot created at block 5000000 in 14.2s: /data/snapshots/snapshot-block-5000000.json
# Запущено автовосстановление
shared_memory_corruption_exception detected — starting auto-recovery
Recovery complete. Resumed from block 4999500Sync-логгер (DLT-режим)
Включите логгер sync для просмотра деталей переговоров о синхронизации:
[logger.sync]
level = info
appenders = stderrКлючевые сообщения:
Starting sync with peer ...— синхронизация начатаon_blockchain_item_ids_inventory: ...— получена партия ID блоковSync: peer X says we're up-to-date— синхронизация с этим пиром завершенаDEFERRED_RESIZE: sync block #N deferred— синхронизация блока отложена из-за изменения размера разделяемой памятиauto-clearing stuck peer_needs_sync_items_from_us— 30-секундная защита сняла зависший флаг
Конфигурация логов
Логи настраиваются в config.ini:
# Вывод в консоль
log.console_appender.stderr.stream = std_error
# P2P лог-файл
log.file_appender.p2p.filename = logs/p2p/p2p.log
# Уровни логирования: all, debug, info, warn, error, off
logger.default.level = warn
logger.default.appenders = stderr
logger.p2p.level = warn
logger.p2p.appenders = p2pПримечание:
node.cppнаправляет все свои вызовыilog/wlogв логгерp2p. Для просмотра P2P-сообщений настройте уровень логгераp2pнаinfo.
Ротация логов через logrotate (пример /etc/logrotate.d/vizd):
/data/vizd/logs/p2p/p2p.log {
daily
rotate 14
compress
missingok
copytruncate
}Статистика P2P-пиров
Плагин P2P записывает метрики работоспособности пиров каждые 5 минут (настраивается). Включите в config.ini:
p2p-stats-enabled = true
p2p-stats-interval = 300 # секундыПример вывода в лог:
P2P peer | ip: 203.0.113.10 | port: 2001 | latency: 45ms | bytes_in: 12345 | blocked: false | reason:
P2P peer | ip: 198.51.100.5 | port: 2001 | latency: 120ms | bytes_in: 8765 | blocked: true | reason: soft_ban
Block storage | dlt_log: [79174319..79274318] | dlt_resizes: 412 | fork_db: linked=18 unlinked=0Поля:
latency— задержка туда-обратно в мсbytes_in— дельта байт, полученных с последнего измеренияblocked/reason— статус мягкого бана или ограничения и причинаBlock storage— диапазон DLT block log, счётчик изменений размера, состояние fork_db
Высокое значение dlt_resizes в сочетании с уменьшающимся диапазоном dlt_log может указывать на срабатывание самовосстановления файла отображения. Пир с reason: soft_ban может находиться на форке или отправлять только устаревшие данные.
Prometheus и Grafana
Узел не предоставляет нативный endpoint Prometheus. Используйте Node Exporter для метрик уровня ОС и опрашивайте JSON-RPC endpoint с помощью пользовательского экспортёра:
# минимальный пример: опрос head_block_number
import requests, time
from prometheus_client import Gauge, start_http_server
g = Gauge('viz_head_block_number', 'Current head block')
def collect():
r = requests.post('http://localhost:8090', json={
"jsonrpc": "2.0", "method": "call",
"params": ["database_api", "get_dynamic_global_properties", []],
"id": 1
}, timeout=5)
g.set(r.json()['result']['head_block_number'])
start_http_server(9100)
while True:
collect()
time.sleep(3)Рекомендуемые панели дашборда:
| Панель | Метрика / Источник |
|---|---|
| Головной блок | viz_head_block_number (увеличивается каждые 3 с при синхронизации) |
| Отставание блока | time() - viz_head_block_time (секунды отставания от системных часов) |
| Количество пиров | Из лога P2P-статистики |
| Задержка пиров | Лог P2P-статистики по IP пира |
| Свободная разделяемая память | viz_shared_memory_free_mb из пользовательского экспортёра |
| CPU / RAM | Стандартные метрики Node Exporter |
| Дисковый I/O | node_disk_* Node Exporter |
ELK / Централизованное логирование
Перенаправляйте логи узла в центральный коллектор. Пример с Filebeat:
# filebeat.yml
filebeat.inputs:
- type: log
paths:
- /data/vizd/logs/p2p/p2p.log
fields:
service: vizd
node: validator-1
output.logstash:
hosts: ["logstash:5044"]Разбор ключевых полей (grok Logstash или ingest pipeline Elasticsearch):
MISSED-SLOT-OUR-validator: %{WORD:validator} missed slot at %{TIMESTAMP_ISO8601:slot_time}
produced block #%{NUMBER:block_num} @%{TIMESTAMP_ISO8601:block_time} validator=%{WORD:producer}Мониторинг, специфичный для валидатора
Ключевые метрики для оповещений
| Условие | Серьёзность | Действие |
|---|---|---|
MISSED-SLOT-OUR-validator в логах | Предупреждение | Проверить NTP, задержку сети, нагрузку CPU |
MINORITY FORK DETECTED | Критическое | Проверить P2P-подключение к сид-узлам |
WATCHDOG: no production for 180s | Критическое | Проверить ключ валидатора и работоспособность узла |
Код результата no_private_key | Критическое | Несоответствие ключа подписи — проверить конфигурацию |
Код результата low_participation | Предупреждение | Деградация работоспособности сети |
| Головной блок перестал увеличиваться | Критическое | Узел может быть заблокирован |
| Количество пиров упало до 0 | Критическое | Сетевой раздел или проблема с файрволом |
Проверка NTP
chronyc tracking | grep "System time"
# или
timedatectl | grep "NTP synchronized"Плагин validator использует собственный NTP-клиент (настраивается через ntp-server в config), но синхронизация системных часов также важна. Дрейф >200мс может вызвать пропуск слотов.
Обслуживание базы данных
Размер разделяемой памяти
Следите за предупреждениями о нехватке места в логах:
chainbase: shared memory low — resizing from 4G to 6GПревентивно настройте параметры роста в config.ini:
shared-file-size = 4G
min-free-shared-file-size = 500M
inc-shared-file-size = 2G
block-num-check-free-size = 1000Проверка резервных копий снимков
После создания снимка проверьте его корректную загрузку на тестовом узле:
vizd --create-snapshot /tmp/verify-snap.json --plugin snapshot
# Ожидается: завершается корректно с "Snapshot created at block N"Периодически тестируйте восстановление после сбоя:
vizd --replay-from-snapshot --snapshot-auto-latest --plugin snapshot
# Ожидается: импортирует снимок, воспроизводит dlt_block_log, выдаёт "Recovery complete"Чеклист реагирования на инциденты
Узел не синхронизируется:
- Проверьте количество пиров (логи
p2p-stats-enabledили RPCget_info). - Убедитесь, что файрвол разрешает TCP-порт 2001 входящий.
- Проверьте настройки
p2p-seed-node— попробуйте альтернативные сиды. - Ищите записи
soft_banв P2P-статистике — узел может находиться на форке.
Валидатор не производит блоки:
- Убедитесь, что
validatorиprivate-keyвconfig.iniсоответствуют on-chain ключу подписи. - Проверьте, не является ли причиной
low_participation(работоспособность сети). - Проверьте синхронизацию NTP.
- Ищите
MINORITY FORK DETECTED— узлу может потребоваться ресинхронизация.
Узел завис / разделяемая память повреждена:
- Если
--auto-recover-from-snapshotвключён (по умолчанию) и снимки существуют, узел восстанавливается автоматически — проверьте логи. - Ручное восстановление:
vizd --replay-from-snapshot --snapshot-auto-latest --plugin snapshot. - Если снимков нет: получите свежий снимок от доверенного пира или другого узла, затем используйте
--snapshot <path>.
RPC недоступен:
- Проверьте привязку
webserver-http-endpoint— валидаторы по умолчанию используют127.0.0.1:8090. - Проверьте конфигурацию файрвола или reverse proxy.
- Убедитесь, что список плагинов включает
webserver json_rpc database_api.
См. также: Узел-валидатор, Защита валидатора, Снимки, Конфигурация.