Уж очень мне понравилось опубликованное на Habr(е) про то, как автор решил настроить мониторить базы Redis через Zabbix посредством скрипта bash преобразующего собираемые данные в JSON формат, а после передающего их через агент в виде строки, а уже на серверой части Zabbix идет разборка. Так как я плотно в меру своих задумок интересуюсь и использую связку Ubuntu 18.04 + Zabbix, то решил более подробно со своей точки зрения составить свою пошаговую заметку. Пройдя все нюансы не вошедшие в оригинал.

Стенд на базе Debian 10 + Proxmox, а VM развернуты через сервис FOG Project с применением файлов ответов.

Ubuntu 18.04 + Zabbix Server 4.4 (172.33.33.6)

Ubuntu 18.04 + OwnCloud 10 + Nginx

  • srv-zabbix = 172.33.33.6
  • srv-own = 172.33.33.15

Шаг №1: Извлекаю на консоль формируемую Redis информацию с системе где OwnCloud 10 + Redis (tips_ubuntu_18_04_owncloud_redis_v1.odt):

ekzorchik@srv-own:~$ sudo redis-cli -a 712mbddr@ info

# Server

redis_version:4.0.9

redis_git_sha1:00000000

redis_git_dirty:0

redis_build_id:9435c3c2879311f3

redis_mode:standalone

os:Linux 4.15.0-72-generic x86_64

arch_bits:64

multiplexing_api:epoll

atomicvar_api:atomic-builtin

gcc_version:7.4.0

process_id:3870

run_id:aefdeb4759bf6d69f8f32dec64740988827b2d15

tcp_port:6379

uptime_in_seconds:861

uptime_in_days:0

hz:10

lru_clock:4131826

executable:/usr/bin/redis-server

config_file:/etc/redis/redis.conf

# Clients

connected_clients:1

client_longest_output_list:0

client_biggest_input_buf:0

blocked_clients:0

# Memory

used_memory:1407968

used_memory_human:1.34M

used_memory_rss:4362240

used_memory_rss_human:4.16M

used_memory_peak:1409952

used_memory_peak_human:1.34M

used_memory_peak_perc:99.86%

used_memory_overhead:837878

used_memory_startup:782456

used_memory_dataset:570090

used_memory_dataset_perc:91.14%

total_system_memory:4136423424

total_system_memory_human:3.85G

used_memory_lua:37888

used_memory_lua_human:37.00K

maxmemory:0

maxmemory_human:0B

maxmemory_policy:noeviction

mem_fragmentation_ratio:3.10

mem_allocator:jemalloc-3.6.0

active_defrag_running:0

lazyfree_pending_objects:0

# Persistence

loading:0

rdb_changes_since_last_save:10

rdb_bgsave_in_progress:0

rdb_last_save_time:1581189269

rdb_last_bgsave_status:ok

rdb_last_bgsave_time_sec:-1

rdb_current_bgsave_time_sec:-1

rdb_last_cow_size:0

aof_enabled:0

aof_rewrite_in_progress:0

aof_rewrite_scheduled:0

aof_last_rewrite_time_sec:-1

aof_current_rewrite_time_sec:-1

aof_last_bgrewrite_status:ok

aof_last_write_status:ok

aof_last_cow_size:0

# Stats

total_connections_received:17

total_commands_processed:220

instantaneous_ops_per_sec:0

total_net_input_bytes:15892

total_net_output_bytes:245592

instantaneous_input_kbps:0.00

instantaneous_output_kbps:0.00

rejected_connections:0

sync_full:0

sync_partial_ok:0

sync_partial_err:0

expired_keys:13

expired_stale_perc:0.00

expired_time_cap_reached_count:0

evicted_keys:0

keyspace_hits:159

keyspace_misses:10

pubsub_channels:0

pubsub_patterns:0

latest_fork_usec:0

migrate_cached_sockets:0

slave_expires_tracked_keys:0

active_defrag_hits:0

active_defrag_misses:0

active_defrag_key_hits:0

active_defrag_key_misses:0

# Replication

role:master

connected_slaves:0

master_replid:15fbc27546ae838d206680ba785802a981061552

master_replid2:0000000000000000000000000000000000000000

master_repl_offset:0

second_repl_offset:-1

repl_backlog_active:0

repl_backlog_size:1048576

repl_backlog_first_byte_offset:0

repl_backlog_histlen:0

# CPU

used_cpu_sys:0.51

used_cpu_user:0.22

used_cpu_sys_children:0.00

used_cpu_user_children:0.00

# Cluster

cluster_enabled:0

# Keyspace

db0:keys=86,expires=34,avg_ttl=82085521

Шаг №2: Имея вывод из «Шаг №1» могу его сохранить в файл, а после через создаваемую задачу посредством cron обновлять с заданной периодичностью и через UserParameter извлекать из файла требуемые значения. Обычно я так и делал, но после этой заметки уже все по-другому.

ekzorchik@srv-own:~$ sudo redis-cli -a 712mbddr@ info > /tmp/redismetric

Шаг №3: Попробую извлечь значение параметра used_memory (Кол-во использованной памяти Redis-сервером) через Zabbix-агент:

ekzorchik@srv-own:~$ sudo nano /etc/zabbix/zabbix_agentd.d/redis.conf

UserParameter=used_memory,grep -w 'used_memory' /tmp/redismetric | cut -d: -f2

ekzorchik@srv-own:~$ sudo systemctl restart zabbix-agent

ekzorchik@srv-own:~$ zabbix_agentd -c /etc/zabbix/zabbix_agentd.d/redis.conf -t used_memory | cut -d: -f2

used_memory [t|849736]

Шаг №4: Проверяю, как с Zabbixсервера получаю значение элемента данныхused_memory:

ekzorchik@srv-zabbix:~$ apt-cache search zabbix-get

zabbix-get - Zabbix network monitoring solution - get

ekzorchik@srv-zabbix:~$ sudo apt-get install -y zabbix-get

ekzorchik@srv-zabbix:~$ zabbix_get -s 172.33.33.15 -k used_memory

849736

Шаг №5: Завожу в Zabbixсервер хост где у установлен OwnCloud 10

http://172.33.33.6/zabbix/ - Admin&zabbix - Configuration - Hosts - Create Host

  • Hostname: srv-own
  • Groups: GROUP_Ubuntu
  • Agent Interfaces: 172.33.33.15
  • Connect to: IP
  • Port: 10050
  • Description: OwnCloud 10
  • Monitored by proxy: (no proxy)
  • Enabled: отмечаю галочкой

и нажимаю Add

Шаг №6: Создаю элемент данных used_memory

  • Name: Redis:used_memory
  • Type: Zabbix agent
  • Key: used_memory
  • Host interface: 172.33.33.15:10050
  • Update interval: 5m
  • New application: Redis
  • Enabled: отмечаю галочкой

и нажимаю Add

ekzorchik@srv-zabbix:~$ sudo systemctl restart zabbix-server zabbix-agent

Шаг №7: Результат снимаемого показателя и отображения в Zabbix

Результат снимаемого показателя и отображения в Zabbix

Шаг №8: Из статьи автора на хабре позаимствовал скрипт который из вывода redis-cli info с учетом определенных выборок формирует вывод в JSONформате:

ekzorchik@srv-own:~$ sudo nano /usr/lib/zabbix/externalscripts/redis_get_info.sh

#!/bin/bash

## ===========================================================================

# Script to generate Redis monitoring data in JSON format

# for 'zabbix-agent'.

## ===========================================================================

# collect working variables/data

BIN_REDIS=$(whereis -b redis-cli | cut -d" " -f2) # /usr/bin/redis-cli

DATA_INFO=$(${BIN_REDIS} -a 712mbbdr@ INFO | tr -d '\r') # get info and remove trailing '\r' from output

##

# Extract stats and save it into env. vars.

##

# find lines with 'grep', cut second field after ":" and put it into env. variable:

ITEM_VERSION=$(grep "^redis_version:" <<<"${DATA_INFO}" | cut -d: -f2)

ITEM_UPTIME=$(grep "^uptime_in_seconds:" <<<"${DATA_INFO}" | cut -d: -f2)

ITEM_USED_MEMORY=$(grep "^used_memory:" <<<"${DATA_INFO}" | cut -d: -f2)

ITEM_USED_MEMORY_RSS=$(grep "^used_memory_rss:" <<<"${DATA_INFO}" | cut -d: -f2)

ITEM_KEYSPACE_HITS=$(grep "^keyspace_hits:" <<<"${DATA_INFO}" | cut -d: -f2)

ITEM_KEYSPACE_MISSES=$(grep "^keyspace_misses:" <<<"${DATA_INFO}" | cut -d: -f2)

ITEM_CONNECTED_CLIENTS=$(grep "^connected_clients:" <<<"${DATA_INFO}" | cut -d: -f2)

ITEM_RDB_LAST_SAVE_TIME=$(grep "^rdb_last_save_time:" <<<"${DATA_INFO}" | cut -d: -f2)

ITEM_TOTAL_CONNECTIONS_RECEIVED=$(grep "^total_connections_received:" <<<"${DATA_INFO}" | cut -d: -f2)

ITEM_REJECTED_CONNECTIONS=$(grep "^rejected_connections:" <<<"${DATA_INFO}" | cut -d: -f2)

ITEM_EXPIRED_KEYS=$(grep "^expired_keys:" <<<"${DATA_INFO}" | cut -d: -f2)

ITEM_EVICTED_KEYS=$(grep "^evicted_keys:" <<<"${DATA_INFO}" | cut -d: -f2)

# compose output JSON for Zabbix server:

echo -n "{"

echo -n "\"version\": \"${ITEM_VERSION}\","

echo -n "\"uptime\": ${ITEM_UPTIME},"

echo -n "\"used_memory\": ${ITEM_USED_MEMORY},"

echo -n "\"used_memory_rss\": ${ITEM_USED_MEMORY_RSS},"

echo -n "\"keyspace_hits\": ${ITEM_KEYSPACE_HITS},"

echo -n "\"keyspace_misses\": ${ITEM_KEYSPACE_MISSES},"

echo -n "\"connected_clients\": ${ITEM_CONNECTED_CLIENTS},"

echo -n "\"rdb_last_save_time\": ${ITEM_RDB_LAST_SAVE_TIME},"

echo -n "\"total_connections_received\": ${ITEM_TOTAL_CONNECTIONS_RECEIVED},"

echo -n "\"rejected_connections\": ${ITEM_REJECTED_CONNECTIONS},"

echo -n "\"expired_keys\": ${ITEM_EXPIRED_KEYS},"

echo -n "\"evicted_keys\": ${ITEM_EVICTED_KEYS}"

echo -n "}"

ekzorchik@srv-own:~$ sudo chmod +x /usr/lib/zabbix/externalscripts/redis_get_info.sh

Результат работы скрипта:

ekzorchik@srv-own:~$ sudo /usr/lib/zabbix/externalscripts/redis_get_info.sh

{"version": "4.0.9","uptime": 2073,"used_memory": 849736,"used_memory_rss": 3846144,"keyspace_hits": 0,"keyspace_misses": 0,"connected_clients": 1,"rdb_last_save_time": 1581015788,"total_connections_received": 4,"rejected_connections": 0,"expired_keys": 0,"evicted_keys": 0}ekzorchik@srv-own:~$

Шаг №9: Раз скрипт формирует данные, то его можно указать агенту на OwnCloud 10 системе, что при запросе с сервера, а Zabbixагент исполнит его и передаст значения на Zabbixсервер:

ekzorchik@srv-own:~$ sudo nano /etc/zabbix/zabbix_agentd.d/redis.conf

UserParameter=redis_get_info,/usr/lib/zabbix/externalscripts/redis_get_info.sh

Шаг №10: На Zabbixсервере в добавленном хосте создаю элемент данных на получение данных от Zabbixагента который дергает скрипт redis_get_info.sh

  • Name: Redis:Info
  • Type: Zabbix agent
  • Key: redis_get_info
  • Host interface: 172.33.33.15:10050
  • Type of information: Text
  • Update interval: 1m
  • History storage period: Storage period: 90d
  • New Application: ввожу Redis тем самым создаю

Создаю элемент данных на получение данных от Zabbix-агента который дергает скрипт redis_get_info.sh

ekzorchik@srv-own:~$ sudo systemctl restart zabbix-agent

Проверяю, что Zabbixсервер получает данные — ответ да!

ekzorchik@srv-zabbix:~$ zabbix_get -s 172.33.33.15 -k redis_get_info

{"version": "4.0.9","uptime": 2547,"used_memory": 849736,"used_memory_rss": 3846144,"keyspace_hits": 0,"keyspace_misses": 0,"connected_clients": 1,"rdb_last_save_time": 1581015788,"total_connections_received": 5,"rejected_connections": 0,"expired_keys": 0,"evicted_keys": 0}

ekzorchik@srv-zabbix:~$

Шаг №11: Теперь создаю элемент данных на получение версии, но есть важный нюанс, данные получаем не с агента, а с результата выполнения элемента данных который запрашивает информацию скриптом. Значит выбираем обработку Type: Dependent item

  • Name: Redis: Version
  • Type: Dependent item
  • Master item: Select и указываю элемент данных из "Шаг №10", т.е. Redis:redis_get_info, получается: srv-own:Redis:Redis_get_info
  • Key: redis_get_info.version (т.е. название скрипта + точка + результат из вывода скрипта, к примеру version)
  • Type of information: Character (в зависимости что выводит скрипт число или текст указываем либо Character либо целое, плавающее)
  • History storage period: Storage period: 90d
  • Show value: As is
  • Applications: выбираю Redis

Формирую элемент данных на основе обработки вывода JSON результатов

но прежде чем нажимать Add нужно перейти в Preprocessing и указать излекаемые данные формируются, как

  • Name: JSONPath
  • Parameters: $.version

и тогда можно нажимать «Update»

Излекаемые данные формируются, как Name: JSONPath

И вот извлекаемый результат

И вот извлекаемый результат

Прикольно!

По аналогии создаю элементы данных + указываю сделать предобработку где собираемые данные формируются скриптом в JSON формате. Итого

Итого

На основе созданных элементов решил для себя сделать собственный шаблон, создал его, хотел было перейти в него и посмотреть, а обнаружил, что в моем Zabbix 4.4 уже есть дефолтный шаблон под именем: Template DB Redis и снимаемых метрик в нем целых 64, плюс уже предопределены триггеры, обозначены какие графики строить, экраны, правила обнаружения. И кстати используется обработка на основе JSON получения метрик, вот только где скрипт под это дело?

Просмотр как настроены элементы данных в этом шаблоне показало, что все обработки строятся на выводе redis-cli info | grep <key>, т.е. я могу просто взять скрипт выше и дополнить его, переименовать, как в шаблоне. Вот только анализ работы данного шаблона мне нисколько не даст полезных знаний за которыми я все разбираю сам, уж лучше я буду делать свой, брать из готового только то что мне нужно.

По-сути я сделал что задумывал в этой заметке, теперь только по возможности так и буду делать, и смогу переделать заметку по снятию показаний со SMART и SSD дисков. На этом я прощаюсь, с уважением автор блога Олло Александр aka ekzorchik.