Мониторинг Redis с помощью Proto Observability
На этой странице:
- Сбор метрик Redis
- Сбор логов Redis
Сбор метрик Redis
Интеграция redisdb подключается к Redis по его собственному протоколу (RESP)
и снимает метрики из вывода INFO / CONFIG GET, SLOWLOG GET, опционально
COMMAND INFO + INFO COMMANDSTATS (флаг command_stats) и per-key
TYPE / *LEN (опция keys). Поддерживаются standalone, реплики, Sentinel и
кластерные ноды; JMX не используется — образ агента с суффиксом -jmx не
нужен.
Конфигурация Redis
Для базового мониторинга достаточно сетевого доступа к Redis с хоста агента — никаких изменений конфигурации Redis не требуется. Если на Redis включена аутентификация, заведите для агента отдельную учётную запись.
Создайте read-mostly ACL-пользователя protoobp. Минимально необходимый набор
команд для redisdb: INFO, CONFIG|GET, SLOWLOG, CLIENT,
COMMAND|DOCS, COMMAND|INFO, COMMAND|COUNT, плюс TYPE и *LEN-команды
(STRLEN, LLEN, SCARD, HLEN, ZCARD, XLEN, PFCOUNT), если задана
опция keys.
В рантайме:
redis-cli ACL SETUSER protoobp on '>protoobp' '~*' '&*' \
+info +config|get +slowlog +client +command|docs +command|info +command|count \
+type +strlen +llen +scard +hlen +zcard +xlen +pfcount
Или декларативно в redis.conf (либо в отдельном aclfile, на который
ссылается redis.conf):
user protoobp on >protoobp ~* &* +info +config|get +slowlog +client +command|docs +command|info +command|count +type +strlen +llen +scard +hlen +zcard +xlen +pfcount
Допустимо завести пользователя и с более широким ACL
(user protoobp on >protoobp ~* &* +@all), но для продакшна рекомендуется сузить
права до набора выше.
Если ACL недоступен (Redis < 6) или используется один общий пароль —
задайте requirepass в redis.conf:
requirepass <пароль>
В этом случае агент подключается без username, только с password.
Если Redis принимает соединения без пароля (например, доступ ограничен
сетью / bind), username / password в конфиге проверки просто опускаются.
`command_stats` и `keys`
command_stats: true— агент дополнительно вызываетINFO COMMANDSTATSи отдаётredis_command_calls/redis_command_usec_per_callс лейбломcommand.keys: [<key или glob-паттерн>, ...]— для каждого ключа агент снимает его длину (redis_key_length, лейблыkey/key_type). Сwarn_on_missing_keys: falseагент не пишет предупреждения о ненайденных ключах.
Конфигурация ProtoOBP агента
Если агент запускается в виде службы на хосте
В файле конфигурации ProtoOBP агента (
/etc/protoobp-agent/conf.d/redisdb.d/conf.yaml) укажите адрес, порт Redis и — если включена аутентификация — учётную запись, под которой агент подключится к базе:init_config: instances: - host: localhost port: 6379 # username: protoobp # только Redis 6+, при ACL-аутентификации # password: protoobp # пароль (ACL-пользователя или requirepass) # unix_socket_path: /var/run/redis/redis.sock # альтернатива host/port # db: 0 # индекс базы (по умолчанию 0) # ssl: false # TLS-подключение # ssl_certfile: /path/client.pem # ssl_keyfile: /path/client.key # ssl_ca_certs: /path/ca.pem command_stats: true # собирать redis_command_* (INFO COMMANDSTATS) # collect_client_metrics: false # redis_net_connections per client name (CLIENT LIST) # slowlog-max-len: 128 # сколько записей slowlog читать за раз warn_on_missing_keys: false keys: # длина перечисленных ключей (redis_key_length) - 'app:list:*' - 'app:hash:session' # tags: # - 'redis_instance:cache-1'Перезапустите агента:
systemctl restart protoobp-agent.
Если агент запускается в виде Docker контейнера
Добавьте autodiscovery-лейблы к контейнеру Redis. В docker-compose.yaml:
services:
redis:
image: redis:7-alpine
labels:
com.protoobp.ad.check_names: '["redisdb"]'
com.protoobp.ad.init_configs: '[{}]'
com.protoobp.ad.instances: '[{"host": "%%host%%", "port": 6379, "username": "protoobp", "password": "protoobp", "command_stats": true, "keys": ["app:list:events", "app:hash:session"], "warn_on_missing_keys": false}]'
Если Redis без аутентификации — уберите username / password:
com.protoobp.ad.instances: '[{"host": "%%host%%", "port": 6379, "command_stats": true}]'
То же набором LABEL в Dockerfile:
LABEL "com.protoobp.ad.check_names"='["redisdb"]'
LABEL "com.protoobp.ad.init_configs"='[{}]'
LABEL "com.protoobp.ad.instances"='[{"host": "%%host%%", "port": 6379, "username": "protoobp", "password": "protoobp", "command_stats": true}]'
Контейнер агента
Контейнер агента должен находиться в той же docker network, что и Redis, и иметь смонтированный/var/run/docker.sock:/var/run/docker.sock:ro для
autodiscovery контейнеров. Образ агента — обычный (protoobp-agent:7.40.3),
без суффикса -jmx.Проверка
Убедитесь, что проверка запустилась и собирает метрики:
docker exec protoobp-agent agent status | grep -A 10 "redisdb ("
Ожидаемый вывод — [OK] у Instance ID и ненулевые Metric Samples:
redisdb (4.5.2)
---------------
Instance ID: redisdb:f727141fd4988515 [OK]
Configuration Source: container:docker://707347e5e2...
Total Runs: 26
Metric Samples: Last Run: 135, Total: 3,372
Events: Last Run: 0, Total: 0
Service Checks: Last Run: 1, Total: 26
Average Execution Time : 16ms
Точечно проверить собираемые метрики (имена и значения) можно через
agent check:
docker exec protoobp-agent agent check redisdb \
| grep -oE '"metric": "redis\.[a-z._0-9]+"' | sort -u
На стороне агента (в выводе
agent check) метрики печатаются в исходном dotted-виде (redis.net.clients, …); в хранилище ProtoOBP backend они попадают с точками, заменёнными на подчёркивания (redis_net_clients, …) — именно так на них ссылаются дашборды и алерты. Ниже все имена приведены в backend-форме.
На одном standalone Redis 7.x под нагрузкой (command_stats: true,
keys: [...]) проверка выдаёт около 135 сэмплов за прогон, порядка 48
уникальных имён метрик, в том числе:
redis_net_clients redis_mem_used redis_keys
redis_net_maxclients redis_mem_rss redis_expires
redis_net_rejected redis_mem_peak redis_persist
redis_net_slaves redis_mem_overhead redis_keys_expired
redis_net_instantaneous_ops_per_sec redis_mem_fragmentation_ratio redis_keys_evicted
redis_clients_blocked redis_mem_maxmemory redis_pubsub_channels
redis_command_calls redis_rdb_bgsave redis_pubsub_patterns
redis_command_usec_per_call redis_rdb_changes_since_last redis_perf_latest_fork_usec
redis_slowlog_micros_count redis_rdb_last_bgsave_time redis_replication_master_repl_offset
redis_slowlog_micros_avg redis_aof_rewrite redis_key_length
redis_slowlog_micros_max redis_aof_last_rewrite_time redis_info_latency_ms
redis_slowlog_micros_median redis_slowlog_micros_95percentile redis_server_io_threads_active
redis_command_* собираются с лейблом command (по записи на каждую команду
из INFO COMMANDSTATS), redis_key_length — с лейблами key / key_type по
ключам из опции keys. На метриках присутствуют лейблы redis_host,
redis_port, redis_db, redis_role, service, env, docker_image,
image_name, image_tag, short_image (для контейнера).
`DEBUG SLEEP` и slowlog
Метрикиredis_slowlog_micros_* появляются, только если в Redis есть записи в
slowlog. В Redis 7.x команда DEBUG SLEEP по умолчанию запрещена
(enable-debug-command no); если нужно специально наполнить slowlog для
проверки, её можно временно включить (enable-debug-command yes в
redis.conf). На реальной БД slowlog наполняется естественными «тяжёлыми»
командами; включать DEBUG в проде не нужно.Собираемые метрики
Все метрики — типа gauge (мгновенное значение на момент сбора), за исключением
redis_slowlog_micros_count (типа rate — частота записей в slowlog в секунду).
Часть метрик, имена которых в INFO выглядят как кумулятивные счётчики
(keyspace_hits, keyspace_misses, total_commands_processed и т.п.),
интеграция отдаёт уже как rate в секунду.
Ниже — наиболее востребованные метрики (имена приведены в backend-форме, с
подчёркиваниями). Полный набор зависит от версии Redis и включённых опций;
метрики, специфичные для отдельных версий, помечены [vN+]. Уровень детализации
(COMMANDSTATS, per-key длины) управляется опциями command_stats и keys.
Часть «потенциальных» метрик из INFO (redis_stats_keyspace_hits /
redis_stats_keyspace_misses, redis_cpu_*, redis_net_commands) на практике
интеграцией не эмитится — они помечены ниже как «может не отправляться».
Лейблы
Общие (на всех метриках)
Добавляются агентом и ProtoOBP backend’ом:
| Лейбл | Значение |
|---|---|
host | Хост, на котором работает агент |
redis_host | Хост Redis из конфига проверки (host) |
redis_port | Порт Redis из конфига проверки (port) |
redis_db | Индекс базы (db, по умолчанию 0) |
redis_role | Роль инстанса по INFO replication: master или slave |
service | Тег service (через com.protoobp.tags.service или POBP_TAGS) |
env | Тег env |
docker_image | Полный ref образа контейнера (например, redis:7-alpine) |
image_name | Имя образа без тега |
image_tag | Тег образа |
short_image | Короткое имя образа |
Дополнительные лейблы
| Лейбл | Где появляется | Пример |
|---|---|---|
command | redis_command_* (при command_stats: true) | command:set |
key | redis_key_length (при заданном keys) | key:app:list:events |
key_type | redis_key_length (при заданном keys) | key_type:list |
Соединения и сеть
| Имя метрики | Единица | Описание |
|---|---|---|
redis_net_clients | connection | Число подключённых клиентов (без реплик) |
redis_net_slaves | connection | Число подключённых реплик |
redis_net_maxclients | connection | Лимит одновременных подключений (maxclients) |
redis_net_rejected | connection | Rate отклонённых подключений (превышен maxclients) |
redis_net_total_connections_received | connection | Rate новых подключений, принятых сервером |
redis_net_commands | command | Rate обработанных команд (total_commands_processed) — может не отправляться |
redis_net_instantaneous_ops_per_sec | operation | Команд в секунду (мгновенное значение из INFO) |
redis_net_commands_instantaneous_ops_per_sec | command | То же, в семействе redis_net_commands_* |
redis_net_instantaneous_input | kibibyte | Скорость чтения из сети, KB/с |
redis_net_instantaneous_output | kibibyte | Скорость записи в сеть, KB/с |
redis_net_total_input_bytes | byte | Rate байт, прочитанных из сети |
redis_net_total_output_bytes | byte | Rate байт, записанных в сеть |
redis_net_connections | connection | Число подключений с разбивкой по имени клиента (при collect_client_metrics) |
redis_clients_blocked | connection | Клиенты, ожидающие на блокирующем вызове (BLPOP и т.п.) |
redis_clients_watching | connection | Клиенты в режиме WATCH |
redis_clients_recent_max_input_buffer | byte | Самый большой input-буфер среди недавних подключений [v5+] |
redis_clients_recent_max_output_buffer | byte | Самый длинный output-буфер среди недавних подключений [v5+] |
redis_clients_output_buffer_limit_disconnections | — | Отключений из-за переполнения output-буфера клиента |
redis_clients_query_buffer_limit_disconnections | — | Отключений из-за переполнения query-буфера клиента |
redis_ops_reads_processed | — | Rate обработанных read-событий |
redis_ops_writes_processed | — | Rate обработанных write-событий |
Память
| Имя метрики | Единица | Описание |
|---|---|---|
redis_mem_used | byte | Память, аллоцированная Redis (used_memory) |
redis_mem_rss | byte | RSS процесса Redis, как его видит ОС |
redis_mem_peak | byte | Пиковое потребление памяти |
redis_mem_lua | byte | Память, занятая Lua-движком |
redis_mem_dataset | byte | Размер датасета (без оверхедов) |
redis_mem_overhead | byte | Оверхед внутренних структур Redis [v4+] |
redis_mem_startup | byte | Память, потреблённая на старте |
redis_mem_maxmemory | byte | Лимит maxmemory (0 = без лимита) |
redis_mem_fragmentation_ratio | fraction | Отношение mem_rss / mem_used (фрагментация / своппинг) |
redis_mem_fragmentation | byte | mem_rss − mem_used |
redis_mem_clients_normal | byte | Суммарный оверхед обычных клиентских буферов |
redis_mem_clients_slaves | byte | Суммарный оверхед клиентских буферов реплик |
redis_mem_scripts | byte | Память EVAL-скриптов + functions [v7+] |
redis_mem_total_replication_buffers | byte | Память репликационных буферов [v7+] |
redis_memory_replication_backlog | byte | Память репликационного backlog |
redis_memory_aof_buffer | byte | Транзиентная память под AOF и AOF-rewrite буферы |
redis_memory_not_counted_for_evict | byte | Память, не учитываемая при eviction (репликационные / AOF буферы) |
redis_allocator_allocated | byte | Память, выданная аллокатором (≈ mem_used) |
redis_allocator_active | byte | Активные страницы аллокатора (вкл. внешнюю фрагментацию) |
redis_allocator_resident | byte | RSS аллокатора |
redis_allocator_frag_ratio | fraction | Истинная (внешняя) фрагментация: allocator_active / allocator_allocated |
redis_eviction_current_exceeded_time | millisecond | Время с момента, как mem_used поднялась выше maxmemory |
redis_eviction_total_exceeded_time | millisecond | Суммарное время превышения maxmemory с момента старта |
redis_active_defrag_running | — | 1 — активная дефрагментация памяти сейчас выполняется, 0 — нет (activedefrag) |
redis_active_defrag_hits | operation | Число перемещений значений активной дефрагментацией |
redis_active_defrag_misses | operation | Число прерванных перемещений значений активной дефрагментацией |
redis_active_defrag_key_hits | key | Сколько ключей было дефрагментировано |
redis_active_defrag_key_misses | key | Сколько ключей было пропущено при дефрагментации |
Keyspace
| Имя метрики | Единица | Описание |
|---|---|---|
redis_keys | key | Всего ключей в базе (db<N>) |
redis_expires | key | Число ключей с установленным TTL |
redis_expires_percent | percent | Доля ключей с TTL |
redis_persist | key | Число ключей без TTL (keys − expires) |
redis_persist_percent | percent | Доля ключей без TTL |
redis_keys_expired | key | Rate ключей, удалённых по истечении TTL (expired_keys из INFO) |
redis_keys_evicted | key | Rate ключей, вытесненных из-за maxmemory (evicted_keys из INFO) |
redis_stats_keyspace_hits | key | Rate успешных lookup’ов в keyspace — может не отправляться |
redis_stats_keyspace_misses | key | Rate промахов lookup’ов в keyspace — может не отправляться |
redis_expired_subkeys | — | Rate событий истечения TTL у hash-полей |
redis_keys_total_watched | — | Число ключей под WATCH [v7.4+] |
redis_keys_total_blocking | — | Число «блокирующих» ключей [v7.2+] |
Персистентность (RDB / AOF)
| Имя метрики | Единица | Описание |
|---|---|---|
redis_rdb_bgsave | — | 1, если идёт BGSAVE, иначе 0 |
redis_rdb_last_bgsave_time | second | Длительность последнего BGSAVE |
redis_rdb_current_bgsave_time_sec | second | Длительность текущего BGSAVE (если идёт) |
redis_rdb_changes_since_last | — | Число изменений с последнего успешного снапшота |
redis_rdb_last_save_time | — | Epoch-таймстамп последнего успешного RDB-сохранения |
redis_rdb_last_cow_size | byte | Размер copy-on-write памяти при последнем BGSAVE |
redis_rdb_saves | — | Число RDB-снапшотов с момента старта |
redis_aof_enabled | — | 1, если AOF включён |
redis_aof_size | byte | Текущий размер AOF-файла |
redis_aof_base_size | byte | Размер AOF на последнем старте / rewrite |
redis_aof_buffer_length | byte | Размер AOF-буфера |
redis_aof_rewrite | — | 1, если идёт AOF-rewrite |
redis_aof_pending_rewrite | — | 1, если AOF-rewrite запланирован |
redis_aof_last_rewrite_time | second | Длительность последнего AOF-rewrite |
redis_aof_rewrites | — | Число AOF-rewrite’ов с момента старта |
redis_aof_delayed_fsync | — | Счётчик задержанных fsync |
redis_loading_loading | — | 1, если идёт загрузка дампа |
Репликация
| Имя метрики | Единица | Описание |
|---|---|---|
redis_net_slaves | connection | Число подключённых реплик |
redis_replication_master_link_down_since_seconds | second | Сколько времени канал к мастеру в состоянии down |
redis_replication_last_io_seconds_ago | second | Сколько секунд назад было последнее взаимодействие с мастером |
redis_replication_delay | offset | Отставание реплики в offset’ах |
redis_replication_master_repl_offset | offset | Репликационный offset, заявленный мастером |
redis_replication_slave_repl_offset | offset | Репликационный offset, заявленный репликой |
redis_replication_backlog_active | — | 1, если репликационный backlog активен |
redis_replication_backlog_size | byte | Размер буфера репликационного backlog |
redis_replication_backlog_histlen | byte | Объём данных в буфере backlog |
redis_replication_sync_full | — | Число full-resync’ов с репликами |
redis_replication_sync_partial_ok | — | Число принятых partial-resync’ов |
redis_replication_sync_partial_err | — | Число отклонённых partial-resync’ов |
redis_replication_min_slaves_good_slaves | — | Число реплик, считающихся «хорошими» |
redis_replication_slave_read_only | — | 1, если реплика read-only |
CPU и производительность
Семейство redis_cpu_* присутствует в INFO, но на практике интеграцией обычно
не эмитится — может не отправляться.
| Имя метрики | Единица | Описание |
|---|---|---|
redis_cpu_user | — | User CPU, потреблённый сервером Redis — может не отправляться |
redis_cpu_sys | — | System CPU, потреблённый сервером Redis — может не отправляться |
redis_cpu_user_children | — | User CPU фоновых процессов (BGSAVE, AOF-rewrite) — может не отправляться |
redis_cpu_sys_children | — | System CPU фоновых процессов — может не отправляться |
redis_cpu_user_main_thread | — | User CPU главного потока [v7+] — может не отправляться |
redis_cpu_sys_main_thread | — | System CPU главного потока [v7+] — может не отправляться |
redis_perf_latest_fork_usec | microsecond | Длительность последнего fork() (для BGSAVE / AOF) |
redis_fork_total | — | Всего операций fork() с момента старта |
redis_info_latency_ms | millisecond | Латентность вызова INFO агентом |
redis_ping_latency_ms | millisecond | Латентность вызова PING агентом |
redis_server_io_threads_active | — | 1, если активны I/O-потоки [v6+] |
Команды (command_stats)
Появляются только при command_stats: true. Несут лейбл command
(command:set, command:get, command:incr и т.п.) — по записи на каждую
команду из INFO COMMANDSTATS.
| Имя метрики | Единица | Описание |
|---|---|---|
redis_command_calls | — | Сколько раз вызывалась команда (rate) |
redis_command_usec_per_call | microsecond | Среднее время CPU на один вызов команды |
Slowlog
Считаются по записям, прочитанным агентом из SLOWLOG GET (до slowlog-max-len
записей). Заполнятся, только если в Redis есть записи медленнее
slowlog-log-slower-than.
| Имя метрики | Единица | Описание |
|---|---|---|
redis_slowlog_micros_count | query | Rate записей в slowlog (тип rate) |
redis_slowlog_micros_avg | microsecond | Средняя длительность запросов в slowlog |
redis_slowlog_micros_median | microsecond | Медиана длительности |
redis_slowlog_micros_95percentile | microsecond | 95-й перцентиль длительности |
redis_slowlog_micros_max | microsecond | Максимальная длительность |
Pub/Sub
| Имя метрики | Единица | Описание |
|---|---|---|
redis_pubsub_channels | — | Число активных pub/sub-каналов |
redis_pubsub_patterns | — | Число активных pub/sub-паттернов |
redis_pubsub_clients | — | Число клиентов в режиме pub/sub |
redis_pubsub_shard_channels | — | Число шардовых pub/sub-каналов с подписчиками |
Длина ключей (keys)
Появляется только при заданной опции keys. Несёт лейблы key и key_type.
| Имя метрики | Единица | Описание |
|---|---|---|
redis_key_length | — | Число элементов в ключе (длина list / set / hash / zset / stream / hll). Для несуществующих ключей метрика не отправляется (при warn_on_missing_keys: true пишется предупреждение) |
Кластер
Появляются на нодах с включённым cluster mode (INFO/CLUSTER INFO).
| Имя метрики | Единица | Описание |
|---|---|---|
redis_cluster_enabled | — | 1, если cluster mode включён |
redis_cluster_state | — | 1 — кластер работоспособен, 0 — есть ошибка |
redis_cluster_known_nodes | — | Число известных нод в кластере |
redis_cluster_size | — | Число мастер-нод, обслуживающих хотя бы один слот |
redis_cluster_slots_assigned | — | Число назначенных слотов |
redis_cluster_slots_ok | — | Слоты без нод в FAIL/PFAIL |
redis_cluster_slots_fail | — | Слоты в состоянии FAIL |
redis_cluster_slots_pfail | — | Слоты в состоянии PFAIL |
Ключевые метрики для дашбордов и алертов
Доступность инстанса
- Отсутствие свежих серий по инстансу (
redis_host/redis_port) — алерт: Redis недоступен или агент не может подключиться. redis_ping_latency_ms/redis_info_latency_msрезко выросли — Redis под нагрузкой или сетевые проблемы.
Память
redis_mem_usedприближается кredis_mem_maxmemory— алерт по доле (mem_used / mem_maxmemory > 80–90 %): дальше начнётся eviction илиOOM command not allowed.redis_mem_fragmentation_ratioстабильно> 1.5(фрагментация) или< 1(swap — особенно опасно).redis_keys_evicted > 0приmaxmemory-policy != noeviction— данные вытесняются; если политикаnoeviction— записи будут отвергаться.
Эффективность кэша
- Hit ratio:
redis_stats_keyspace_hits / (keyspace_hits + keyspace_misses)(если эти метрики эмитятся) — падение → кэш «не греет». redis_keys_expired— фоновый поток истечения TTL; всплеск может вызвать кратковременные просадки.
Нагрузка / поток команд
redis_net_instantaneous_ops_per_sec— основной SLI пропускной способности.redis_command_calls/redis_command_usec_per_callpercommand(приcommand_stats) — какая команда «съедает» CPU.redis_net_rejected > 0илиredis_net_clientsуперлось вredis_net_maxclients— лимит подключений исчерпан.redis_clients_blockedстабильно высокий — много клиентов висит на блокирующих вызовах.
Латентность
redis_slowlog_micros_95percentile/redis_slowlog_micros_max— «тяжёлые» команды (большиеKEYS,SORT, Lua-скрипты).redis_perf_latest_fork_usecвысокий —fork()подBGSAVE/AOF-rewrite блокирует процесс (типично на больших датасетах / без THP-tuning’а).
Персистентность
redis_rdb_last_save_timeдавно не обновлялся при ненулевомredis_rdb_changes_since_last— снапшоты не проходят (нет места, права).redis_aof_delayed_fsyncрастёт — диск не успевает заfsyncAOF.redis_rdb_bgsave == 1/redis_aof_rewrite == 1подолгу — фоновая операция зависла.
Репликация (если есть реплики)
redis_net_slavesупало ниже ожидаемого — реплика отвалилась.redis_replication_master_link_down_since_seconds > 0илиredis_replication_last_io_seconds_agoрастёт — канал к мастеру оборван.redis_replication_delay/ разницаmaster_repl_offset − slave_repl_offsetрастёт — реплика отстаёт.- Всплеск
redis_replication_sync_full— частые full-resync’ы (мал backlog или нестабильная сеть).
Сбор логов Redis
Логи Redis собираются ProtoOBP агентом и отправляются в бэкенд ProtoOBP. Здесь —
только специфичные для Redis настройки. Включение логов на стороне агента
(logs_enabled, logs_pobp_url) описано в
Получение данных логов.
По умолчанию redis-server пишет лог в stdout (когда daemonize no); если в
redis.conf задана директива logfile, лог дублируется в указанный файл
(в дистрибутивных пакетах обычно /var/log/redis/redis-server.log).
Конфигурация ProtoOBP агента
Если агент запускается в виде службы на хосте
Создайте /etc/protoobp-agent/conf.d/redisdb.d/conf.yaml (либо дополните уже
существующий — тот же файл, в котором лежит instances: для метрик) блоком
logs::
logs:
- type: file
path: /var/log/redis/redis-server.log
source: redis
service: redis
Путь к файлу — значение директивы logfile из redis.conf (в дистрибутивных
пакетах обычно /var/log/redis/redis-server.log, в Docker-образе по умолчанию
лог идёт только в stdout).
Перезапустите агента: systemctl restart protoobp-agent.
Если агент запускается в виде Docker контейнера
Шаг 1 — включите сбор логов в самом агенте через переменные окружения и смонтируйте директорию JSON-логов docker-демона:
services:
protoobp-agent:
environment:
POBP_LOGS_ENABLED: "true"
POBP_LOGS_CONFIG_USE_HTTP: "true"
POBP_LOGS_CONFIG_LOGS_POBP_URL: <protoobp-backend>:<port>
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
# Прямое чтение JSON-лог файлов docker-демона быстрее,
# чем тянуть их через Docker socket API.
- /var/lib/docker/containers:/var/lib/docker/containers:ro
Шаг 2 — добавьте лейбл com.protoobp.ad.logs к контейнеру Redis. Агент
подхватит stdout/stderr контейнера и пометит записи указанными source и
service:
services:
redis:
labels:
com.protoobp.ad.logs: '[{"source": "redis", "service": "redis"}]'
Только нужные контейнеры
Если в агенте не задана переменнаяPOBP_LOGS_CONFIG_CONTAINER_COLLECT_ALL=true,
агент собирает логи только тех контейнеров, на которых есть лейбл
com.protoobp.ad.logs.Multi-line
redis-server пишет однострочные записи с префиксом
<pid>:<role> <DD Mon YYYY HH:mm:ss.SSS> <level> <message>, например
1:M 12 May 2026 10:00:00.123 * Ready to accept connections. Многострочных
stack trace’ов Redis не выводит, поэтому правило log_processing_rules с
type: multi_line обычно не требуется. При желании можно добавить якорь
\d+:[A-Z] \d{1,2} \w{3} \d{4}:
com.protoobp.ad.logs: '[{"source": "redis", "service": "redis", "log_processing_rules": [{"type": "multi_line", "name": "log_start_with_pid_date", "pattern": "\\d+:[A-Z] \\d{1,2} \\w{3} \\d{4}"}]}]'
Проверка
В выводе agent status должен быть раздел Logs Agent с ненулевым
LogsProcessed / LogsSent и источником Source: redis с ненулевым
BytesRead:
docker exec protoobp-agent agent status | awk '/Logs Agent/,/^====[^=]/'
Logs Agent
==========
Reliable: Sending compressed logs in HTTPS to <backend> on port 443
BytesSent: 152858
EncodedBytesSent: 15685
LogsProcessed: 260
LogsSent: 260
docker
------
- Type: file
Path: /var/lib/docker/containers/707347e5e2.../707347e5e2...-json.log
Service: redis
Source: redis
Status: OK
BytesRead: 2220
Average Latency (ms): 0
У источника типа «JSON-файл docker-контейнера» поле Status может отображаться
как Pending даже при активном чтении — ориентируйтесь на BytesRead /
LogsProcessed. Принятые записи доступны в Logs Explorer ProtoOBP UI.