Оповещения
На основе метрик можно настроить оповещения и получать уведомления о проблемах. В этом разделе приведены примеры настройки с
использованием правил Prometheus. Полный файл
alerts.yml доступен в репозитории
tarantool/grafana-dashboard
на GitHub.
С помощью внутренних метрик Tarantool можно отслеживать детальное потребление оперативной памяти, состояние репликации, статус
движка базы данных, выявлять проблемы бизнес-логики (например, HTTP-ответы 4xx и 5xx или низкую частоту запросов) и статистику
внешних модулей (например, ошибки CRUD). Таймауты расчета, уровни важности и пороговые значения (особенно для бизнес-логики)
приведены здесь как пример: для конкретного приложения их, возможно, потребуется увеличить или уменьшить. Также задайте
корректные временные интервалы для оценки частоты согласно конфигурации Prometheus.
Благодаря мониторингу метрики tnt_info_memory_lua можно предотвратить переполнение памяти и выявить некорректные практики
работы с Lua-кодом.
- alert: HighLuaMemoryWarningexpr: tnt_info_memory_lua >= (512 * 1024 * 1024)for: 1mlabels:severity: warningannotations:summary: "Instance '{{ $labels.alias }}' ('{{ $labels.job }}') Lua runtime warning"description: "'{{ $labels.alias }}' instance of job '{{ $labels.job }}' uses too much Lua memoryand may hit threshold soon."- alert: HighLuaMemoryAlertexpr: tnt_info_memory_lua >= (1024 * 1024 * 1024)for: 1mlabels:severity: pageannotations:summary: "Instance '{{ $labels.alias }}' ('{{ $labels.job }}') Lua runtime alert"description: "'{{ $labels.alias }}' instance of job '{{ $labels.job }}' uses too much Lua memoryand likely to hit threshold soon."
При достижении лимитов экземпляр Tarantool станет недоступен для операций записи. Чтобы вовремя это отследить, можно
использовать статистику распределения slab.
Она покажет, сколько свободной оперативной памяти осталось для хранения кортежей и индексов memtx на экземпляре. С помощью такого
оповещения можно понять, когда необходимо увеличить лимит memtx_memory или добавить новое хранилище в кластер vshard.
- alert: LowMemtxArenaRemainingWarningexpr: (tnt_slab_quota_used_ratio >= 80) and (tnt_slab_arena_used_ratio >= 80)for: 1mlabels:severity: warningannotations:summary: "Instance '{{ $labels.alias }}' ('{{ $labels.job }}') low arena memory remaining"description: "Low arena memory (tuples and indexes) remaining for '{{ $labels.alias }}' instance of job '{{ $labels.job }}'.Consider increasing memtx_memory or number of storages in case of sharded data."- alert: LowMemtxArenaRemainingexpr: (tnt_slab_quota_used_ratio >= 90) and (tnt_slab_arena_used_ratio >= 90)for: 1mlabels:severity: pageannotations:summary: "Instance '{{ $labels.alias }}' ('{{ $labels.job }}') low arena memory remaining"description: "Low arena memory (tuples and indexes) remaining for '{{ $labels.alias }}' instance of job '{{ $labels.job }}'.You are likely to hit limit soon.It is strongly recommended to increase memtx_memory or number of storages in case of sharded data."- alert: LowMemtxItemsRemainingWarningexpr: (tnt_slab_quota_used_ratio >= 80) and (tnt_slab_items_used_ratio >= 80)for: 1mlabels:severity: warningannotations:summary: "Instance '{{ $labels.alias }}' ('{{ $labels.job }}') low items memory remaining"description: "Low items memory (tuples) remaining for '{{ $labels.alias }}' instance of job '{{ $labels.job }}'.Consider increasing memtx_memory or number of storages in case of sharded data."- alert: LowMemtxItemsRemainingexpr: (tnt_slab_quota_used_ratio >= 90) and (tnt_slab_items_used_ratio >= 90)for: 1mlabels:severity: pageannotations:summary: "Instance '{{ $labels.alias }}' ('{{ $labels.job }}') low items memory remaining"description: "Low items memory (tuples) remaining for '{{ $labels.alias }}' instance of job '{{ $labels.job }}'.You are likely to hit limit soon.It is strongly recommended to increase memtx_memory or number of storages in case of sharded data."
Оповещения о производительности регулятора vinyl укажут на возможные проблемы с планировщиком или диском.
- alert: LowVinylRegulatorRateLimitexpr: tnt_vinyl_regulator_rate_limit < 100000for: 1mlabels:severity: warningannotations:summary: "Instance '{{ $labels.alias }}' ('{{ $labels.job }}') have low vinyl regulator rate limit"description: "Instance '{{ $labels.alias }}' of job '{{ $labels.job }}' have low vinyl engine regulator rate limit.This indicates issues with the disk or the scheduler."
Ошибки транзакций Vinyl могут вызывать ошибки при обработке пользовательских запросов.
- alert: HighVinylTxConflictRateexpr: rate(tnt_vinyl_tx_conflict[5m]) / rate(tnt_vinyl_tx_commit[5m]) > 0.05for: 1mlabels:severity: criticalannotations:summary: "Instance '{{ $labels.alias }}' ('{{ $labels.job }}') have high vinyl tx conflict rate"description: "Instance '{{ $labels.alias }}' of job '{{ $labels.job }}' havehigh vinyl transactions conflict rate. It indicates that vinyl is not healthy."
Задачи планировщика Vinyl, завершившиеся с ошибкой, указывают на проблемы с диском и могут быть причиной увеличения потребления оперативной памяти.
- alert: HighVinylSchedulerFailedTasksRateexpr: rate(tnt_vinyl_scheduler_tasks{status="failed"}[5m]) > 0.1for: 1mlabels:severity: criticalannotations:summary: "Instance '{{ $labels.alias }}' ('{{ $labels.job }}') have high vinyl scheduler failed tasks rate"description: "Instance '{{ $labels.alias }}' of job '{{ $labels.job }}' havehigh vinyl scheduler failed tasks rate."
Если значение tnt_replication_status равно 0, статус
репликации экземпляра не равен
follows, а значит, репликация либо еще не готова, либо остановлена по какой-то причине.
- alert: ReplicationNotRunningexpr: tnt_replication_status == 0for: 1mlabels:severity: criticalannotations:summary: "Instance '{{ $labels.alias }}' ('{{ $labels.job }}') {{ $labels.stream }} (id {{ $labels.id }})replication is not running"description: "Instance '{{ $labels.alias }}' ('{{ $labels.job }}') {{ $labels.stream }} (id {{ $labels.id }})replication is not running."
Даже если асинхронная репликация находится в состоянии "follows", о её неисправности может свидетельствовать слишком высокий
лаг. Это также может влиять на работу сборщика мусора Tarantool (см. описание функции
box.info.gc()).
- alert: HighReplicationLagexpr: tnt_replication_lag > 1for: 1mlabels:severity: warningannotations:summary: "Instance '{{ $labels.alias }}' ('{{ $labels.job }}') have high replication lag (id {{ $labels.id }})"description: "Instance '{{ $labels.alias }}' of job '{{ $labels.job }}' have high replication lag(id {{ $labels.id }}), check up your network and cluster state."
Высокое время событийного цикла fiber приводит к снижению производительности приложения, таймаутам и различным предупреждениям. Причиной может быть большое количество работающих файберов или файберы, которые слишком долго работают без передачи управления (yield) или сна.
- alert: HighEVLoopTimeexpr: tnt_ev_loop_time > 0.1for: 1mlabels:severity: warningannotations:summary: "Instance '{{ $labels.alias }}' ('{{ $labels.job }}') event loop has high cycle duration"description: "Instance '{{ $labels.alias }}' of job '{{ $labels.job }}' event loop has high cycle duration.Some high loaded fiber has too little yields. It may be the reason of 'Too long WAL write' warnings."
Состояние конфигурации показывает статус применения конфигурации Tarantool 3. Дополнительные метрики отображают количество предупреждений и ошибок, возникших при применении.
- alert: ConfigWarningAlertsexpr: tnt_config_alerts{level="warn"} > 0for: 1mlabels:severity: warningannotations:summary: "Instance '{{ $labels.alias }}' ('{{ $labels.job }}') has configuration 'warn' alerts"description: "Instance '{{ $labels.alias }}' of job '{{ $labels.job }}' has configuration 'warn' alerts.Please, check config:info() for detailed info."- alert: ConfigErrorAlertsexpr: tnt_config_alerts{level="error"} > 0for: 1mlabels:severity: pageannotations:summary: "Instance '{{ $labels.alias }}' ('{{ $labels.job }}') has configuration 'error' alerts"description: "Instance '{{ $labels.alias }}' of job '{{ $labels.job }}' has configuration 'error' alerts.Latest configuration has not been applied.Please, check config:info() for detailed info."- alert: ConfigStatusNotReadyexpr: tnt_config_status{status="ready"} == 0for: 5mlabels:severity: warningannotations:summary: "Instance '{{ $labels.alias }}' ('{{ $labels.job }}') configuration is not ready"description: "Instance '{{ $labels.alias }}' of job '{{ $labels.job }}' configuration is not ready.Please, check config:info() for detailed info."
Модуль metrics отслеживает обработчики
tarantool/http, см. раздел
Сбор HTTP-метрик.
Здесь используется коллектор summary с именем по умолчанию и вычислением 0.99 квантиля.
Большое количество ответов с кодами ошибок обычно указывает на проблемы с API или некорректную работу приложения.
- alert: HighInstanceHTTPClientErrorRateexpr: sum by (job, instance, method, path, alias) (rate(http_server_request_latency_count{ job="tarantool", status=~"^4\d{2}$" }[5m])) > 10for: 1mlabels:severity: pageannotations:summary: "Instance '{{ $labels.alias }}' ('{{ $labels.job }}') high rate of client error responses"description: "Too many {{ $labels.method }} requests to {{ $labels.path }} pathon '{{ $labels.alias }}' instance of job '{{ $labels.job }}' get client error (4xx) responses."- alert: HighHTTPClientErrorRateexpr: sum by (job, method, path) (rate(http_server_request_latency_count{ job="tarantool", status=~"^4\d{2}$" }[5m])) > 20for: 1mlabels:severity: pageannotations:summary: "Job '{{ $labels.job }}' high rate of client error responses"description: "Too many {{ $labels.method }} requests to {{ $labels.path }} pathon instances of job '{{ $labels.job }}' get client error (4xx) responses."- alert: HighHTTPServerErrorRateexpr: sum by (job, instance, method, path, alias) (rate(http_server_request_latency_count{ job="tarantool", status=~"^5\d{2}$" }[5m])) > 0for: 1mlabels:severity: pageannotations:summary: "Instance '{{ $labels.alias }}' ('{{ $labels.job }}') server error responses"description: "Some {{ $labels.method }} requests to {{ $labels.path }} pathon '{{ $labels.alias }}' instance of job '{{ $labels.job }}' get server error (5xx) responses."
Ответы с высокой задержкой указывают на недостаточную производительность. Это может быть вызвано некорректной работой приложения либо недостаточным количеством роутеров в кластере.
- alert: HighHTTPLatencyexpr: http_server_request_latency{ job="tarantool", quantile="0.99" } > 0.1for: 5mlabels:severity: warningannotations:summary: "Instance '{{ $labels.alias }}' ('{{ $labels.job }}') high HTTP latency"description: "Some {{ $labels.method }} requests to {{ $labels.path }} path with {{ $labels.status }} response statuson '{{ $labels.alias }}' instance of job '{{ $labels.job }}' are processed too long."
Низкая частота запросов в периоды, когда они ожидаются, может свидетельствовать о проблемах с балансировщиком, внешним клиентом или сетью.
- alert: LowRouterHTTPRequestRateexpr: sum by (job, instance, alias) (rate(http_server_request_latency_count{ job="tarantool", alias=~"^.*router.*$" }[5m])) < 10for: 5mlabels:severity: warningannotations:summary: "Router '{{ $labels.alias }}' ('{{ $labels.job }}') low activity"description: "Router '{{ $labels.alias }}' instance of job '{{ $labels.job }}' gets too little requests.Please, check up your balancer middleware."
Если в приложении используются запросы через модуль CRUD, статистика модуля укажет на внутренние ошибки, вызванные некорректной обработкой входных и внутренних параметров.
- alert: HighCRUDErrorRateexpr: rate(tnt_crud_stats_count{ job="tarantool", status="error" }[5m]) > 0.1for: 1mlabels:severity: criticalannotations:summary: "Instance '{{ $labels.alias }}' ('{{ $labels.job }}') too many CRUD {{ $labels.operation }} errors."description: "Too many {{ $labels.operation }} CRUD requests for '{{ $labels.name }}' space on'{{ $labels.alias }}' instance of job '{{ $labels.job }}' get module error responses."
Статистика модуля также укажет на проблемы с производительностью запросов. Слишком высокая задержка запросов приводит к высокой задержке ответов клиентам. Это может быть вызвано проблемами с сетью или диском. Запросы на чтение с некорректными условиями (относительно индексов спейса и схемы шардирования) могут приводить к полному сканированию или операциям map-reduce, что также может быть причиной высокой задержки.
- alert: HighCRUDLatencyexpr: tnt_crud_stats{ job="tarantool", quantile="0.99" } > 0.1for: 1mlabels:severity: warningannotations:summary: "Instance '{{ $labels.alias }}' ('{{ $labels.job }}') too high CRUD {{ $labels.operation }} latency."description: "Some {{ $labels.operation }} {{ $labels.status }} CRUD requests for '{{ $labels.name }}' space on'{{ $labels.alias }}' instance of job '{{ $labels.job }}' are processed too long."
Статистика модуля также покажет количество операций map-reduce и частоту сканирований.
- alert: HighCRUDMapReduceRateexpr: rate(tnt_crud_map_reduces{ job="tarantool" }[5m]) > 0.1for: 1mlabels:severity: warningannotations:summary: "Instance '{{ $labels.alias }}' ('{{ $labels.job }}') too many CRUD {{ $labels.operation }} map reduces."description: "There are too many {{ $labels.operation }} CRUD map reduce requests for '{{ $labels.name }}' space on'{{ $labels.alias }}' instance of job '{{ $labels.job }}'.Check your request conditions or consider changing sharding schema."
Без метрик Tarantool можно пропустить критические состояния. Prometheus предоставляет метрику up для мониторинга состояния
своих целей.
- alert: InstanceDownexpr: up == 0for: 1mlabels:severity: pageannotations:summary: "Instance '{{ $labels.instance }}' ('{{ $labels.job }}') down"description: "'{{ $labels.instance }}' of job '{{ $labels.job }}' has been down for more than a minute."
Отслеживайте состояние CPU, диска и оперативной памяти сервера с помощью подходящих инструментов. Например, при высокой нагрузке на CPU экземпляр Tarantool может перестать отправлять метрики - такие сбои можно отследить только извне.