Уж очень мне понравилось опубликованное на 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)
- Разбор установки Zabbix 4.4 на Ubuntu 18.04 Server
- Отключить листинг каталогов корня Zabbix Server 4.4
- Как установить Zabbix Agent 4.4 on Ubuntu 18.04 Server amd64
Ubuntu 18.04 + OwnCloud 10 + Nginx
- Обновленная установка OwnCloud 10 + nginx на Ubuntu 18.04
- Как установить Zabbix Agent 4.4 on Ubuntu 18.04 Server amd64
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
Шаг №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 тем самым создаю
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
но прежде чем нажимать Add
нужно перейти в Preprocessing
и указать излекаемые данные формируются, как
Name: JSONPath
Parameters: $.version
и тогда можно нажимать «Update
»
И вот извлекаемый результат
Прикольно!
По аналогии создаю элементы данных + указываю сделать предобработку где собираемые данные формируются скриптом в JSON
формате. Итого
На основе созданных элементов решил для себя сделать собственный шаблон, создал его, хотел было перейти в него и посмотреть, а обнаружил, что в моем Zabbix 4.4
уже есть дефолтный шаблон под именем: Template DB Redis
и снимаемых метрик в нем целых 64
, плюс уже предопределены триггеры, обозначены какие графики строить, экраны, правила обнаружения. И кстати используется обработка на основе JSON
получения метрик, вот только где скрипт под это дело?
Просмотр как настроены элементы данных в этом шаблоне показало, что все обработки строятся на выводе redis-cli info | grep <key>
, т.е. я могу просто взять скрипт выше и дополнить его, переименовать, как в шаблоне. Вот только анализ работы данного шаблона мне нисколько не даст полезных знаний за которыми я все разбираю сам, уж лучше я буду делать свой, брать из готового только то что мне нужно.
По-сути я сделал что задумывал в этой заметке, теперь только по возможности так и буду делать, и смогу переделать заметку по снятию показаний со SMART
и SSD
дисков. На этом я прощаюсь, с уважением автор блога Олло Александр aka ekzorchik.