Получение Истории по ключу элемента API zabbix

Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 804
Стаж: 5 лет 1 месяц
Откуда: Вологодская область
Поблагодарили: 33 раза
Контактная информация:

Получение Истории по ключу элемента API zabbix

Сообщение Артём Мамзиков »

Есть у нас различные электронные Журналы.
Например Журнал Учета резервных копий сделанный в GLPI
Пример
Журнал учета резервных копий
Журнал учета резервных копий
В него мы пишем то что бэк есть, его размер, район в котором находится сервер и текущую дату проверки.
Запрашивать все это скриптом дополнительно с сервера GLPI и выдавать доступ на запрос либо что то дополнительно пилить на серверах что будет скидывать данные не особо хочется тем более что данные у нас есть в zabbix.

В действии мы можем перекинуть размер файла но при условии что триггер сработает и действие выполнится , но потом придется закрывать триггеры да можно сделать на изменение размера и будет срабатывать 1 раз, можно сделать условие восстановления на траппер и закрывать все разом в определенное время.

Тут же мы добавим в шаблон проверки 2 элемента один будет запускать скрипт на заббикс сервере , а второй получать ошибки если они будут.
Шаблон будет зацеплен к узлам.
Далее через API из Имени узла получаем id далее находим элемент в узле получаем снова его id и уже по нему запрашиваем из истории последнее значение размер бэка. Ну далее все это передаем в GLPI в Журнал.
Запрос API Размера AIS_{$DATE}.zip из истории для журнала GLPI
Запрос API Размера AIS_{$DATE}.zip из истории для журнала GLPI
Имя: Запрос API Размера AIS_{$DATE}.zip из истории для журнала GLPI
Тип: Внешняя проверка
Ключ: size-bak-ais-api-glpi.sh[{HOST.CONN},{HOST.HOST},{HOST.NAME},{$HOST.PORTS}]
Тип информации: Текст
Интервал обновления: Переменный 9m 1-7,08:00-08:10
Группа: Проверка файлов
Описание: Запрос API Размера AIS_{$DATE}.zip из истории для журнала GLPI
Активировано: V

Второй Элемент траппер для получения ошибок
Ошибки API
Ошибки API
Имя: Ошибки API
Тип: Zabbix траппер
Ключ: errorsizehistoryais
Тип Информации: Текст
Описание: Запрос истории размера бекапа АИС для Журнала GLPI

Триггер
Триггер Ошибки API Получение размера bak ais из истории в журнал GLPI
Триггер Ошибки API Получение размера bak ais из истории в журнал GLPI
Имя: Ошибки API Получение размера bak ais из истории в журнал GLPI
Важность: Внимание/Предупреждение
Выражение:
{FS:errorsizehistoryais.str(ERROR)}=1 or
{FS:errorsizehistoryais.iregexp(error)}=1 or
{FS:errorsizehistoryais.iregexp(Invalid)}=1

Разрешить закрывать вручную V

Описание:
Есть ошибки API
Получение размера копии AIS из Истории Zabbix и передача в Журнал GLPI

Последнее значение: {ITEM.VALUE}

Элемент данных для которого будем искать историю размера будет
Размер файла AIS_{$DATE}.zip
Размер файла AIS_{$DATE}.zip
Имя: Размер файла AIS_{$DATE}.zip
Ключ: vfs.file.size["\\{HOST.CONN}\ais-backups\AIS_{$DATE}.zip"]


И сам скрипт


Скачать
size-bak-ais-api-glpi.sh.zip
size-bak-ais-api-glpi.sh.zip
(2.93 КБ) 10 скачиваний
Запрос вручную

Код: Выделить всё

/usr/local/share/zabbix/externalscripts/size-bak-esrn-api-glpi.sh 192.168.xxx.xxx "Имя-узла" "Видимое-имя-узла" "10050"

Код: Выделить всё

#!/bin/bash

#***********************************************************************
#Начало пользовательских переменных
#Установите для них соответствующие значения перед выполнением сценария...
zabbixServer='192.168.175.111' # Или localhost 127.0.0.1
zabbixUsername='Admin' # Логин
zabbixPassword='zabbix' # Пароль
#Конец пользовательских переменных
#***********************************************************************
# Объявим входные переменные(variable) и если входная переменная пустая задаем дефолтные настройки для некоторых переменных
IP=$1
# Имя узла сети
HOSTHOST=$2
# Видимое имя
HOSTNAME=$3
# Порт
PORT=${4:-10050}


# Получение размера файла Копии из Истории Заббикс и передача в Журнал GLPI
# По имени узла получаем ID узла, далее в ID узла находим по имени ключа элемента данных его ID и по ID Элемента запрашиваем историю

# Дата для имени файла
#dataf=$(date +%d.%m.%d)
# Получаем Искомый ключ в узле (имя:Размер файла AIS_{$datef}.BAK)
# Макросы раскрывать не будем просто как текст
key="vfs.file.size[\\\"\\\\\\\{HOST.CONN}\\\ais-backups\\\AIS_{\$DATE}.zip\\\"]"

#key="agent.ping"

header='Content-Type:application/json-rpc'
zabbixApiUrl="http://$zabbixServer/zabbix/api_jsonrpc.php"

function exit_with_error() {
  echo '**********************************'
  echo "$errorMessage"
  echo '----------------------------------'
  echo 'Сформированная Команда выполнения'
  echo '----------------------------------'
  echo  curl --silent --show-error --insecure --header $header --data "$json" $zabbixApiUrl
  echo '----------------------------------'
  echo 'Выходные данные'
  echo '----------------------------------'
  echo "$result"
  echo '**********************************'
  zabbix_sender -z $zabbixServer -p 10051 -s "${HOSTHOST}" -k errorsizehistoryais -o "ERROR $errorMessage Команда выполнения: curl --silent --show-error --insecure --header $header --data $json $zabbixApiUrl Результат $result"
}


#------------------------------------------------------
# Аутентификация пользователя. https://www.zabbix.com/documentation/current/ru/manual/api/reference/user/login
#------------------------------------------------------
errorMessage='*ERROR* - Не удается получить токен авторизации Zabbix'
json=`echo {\"jsonrpc\": \"2.0\",\"method\":\"user.login\",\"params\":{\"user\": \"$zabbixUsername\",\"password\": \"$zabbixPassword\"},\"id\": 1 }`
result=`curl --silent --show-error --insecure --header $header --data "$json" $zabbixApiUrl`
auth=$(echo "${result}" |sed -e 's|.*result":"||' -e 's/","id.*//g')
check=$(echo "${auth}"|tr -d '\r\n'| sed -n 's/error.*\|Invalid.*/ERROR/Ip')
if [[ ${check} == *ERROR* ]]; then exit_with_error &&exit 1 ; fi
echo "Вход в систему выполнен успешно - Идентификатор авторизации: $auth"
errorMessage="";json="";result="";check="" # Очистка переменных


function outapi(){
#------------------------------------------------------
# Выход из zabbix https://www.zabbix.com/documentation/current/ru/manual/api/reference/user/logout
#------------------------------------------------------
# Выполнение выхода из API.
errorMessage='*ERROR* - Не удалось выйти из системы'
json=`echo {\"jsonrpc\": \"2.0\",\"method\":\"user.logout\",\"params\": [],\"id\": 1, \"auth\": \"$auth\"}`
result=`curl --silent --show-error --insecure --header $header --data "$json" $zabbixApiUrl`
logout=$(echo "${result}" |sed -e 's|.*result":||' -e 's/,"id.*//g')
check=$(echo "${logout}"|tr -d '\r\n'| sed -n 's/error.*\|Invalid.*/ERROR/Ip')
if [[ ${check} == *ERROR* ]]; then exit_with_error; fi
echo 'Успешно вышел из Zabbix' "${logout}"
errorMessage="";json="";result="";check="" # Очистка переменных
exit 1
}


# Запрос информации об авторизовавшемся пользователе
#usinfo=`echo {\"jsonrpc\": \"2.0\",\"method\":\"user.login\",\"params\":{\"user\": \"$zabbixUsername\",\"password\": \"$zabbixPassword\",\"userData\": true},\"id\": 1 }`
#infouser=`curl --silent --show-error --insecure --header $header --data "$usinfo" $zabbixApiUrl`
#echo "${infouser}"


#------------------------------------------------------
# Получение узлов сети в соответствии с заданными параметрами https://www.zabbix.com/documentation/current/ru/manual/api/reference/host/get
#------------------------------------------------------
errorMessage='*ERROR* - Не удается проверить узел сети'
json="{\"jsonrpc\": \"2.0\",\"method\":\"host.get\",\"params\": {\"output\": [\"hostid\"],\"filter\": {\"host\": [\"$HOSTHOST\"]}},\"auth\":\"$auth\", \"id\": 1 }"
result=`curl --silent --show-error --insecure --header $header --data "$json" $zabbixApiUrl`
check=$(echo "${result}"|tr -d '\r\n'| sed -n 's/error.*\|Invalid.*/ERROR/Ip')
if [[ ${check} == *ERROR* ]]; then exit_with_error &&outapi ; fi
# Поиск Узла сети
#echo -e "Найденные Узлы сети:" "${result}"
idhost=$(echo "${result}"|sed 's|.*hostid":"||'|sed 's|"}.*||')
#echo "ID Узла:"$idhost
errorMessage="";json="";result="";check="" # Очистка переменных


#------------------------------------------------------
# Получение элементов в соответствии с заданными параметрами https://www.zabbix.com/documentation/current/ru/manual/api/reference/item/get
#------------------------------------------------------
errorMessage='*ERROR* - Не удается получить Элемент(ы) данных'
#json="{\"jsonrpc\": \"2.0\",\"method\":\"item.get\",\"params\": {\"selectApplications\": [\"name\"],\"filter\": {\"status\": 0,\"type\": 0},\"host\": \""${HOSTHOST}"\",\"search\": {\"key_\": \"$key\"},\"output\": [\"key_\",\"units\",\"name\",\"applications\"]},\"auth\":\"$auth\", \"id\": 1 }"
json="{\"jsonrpc\": \"2.0\",\"method\":\"item.get\",\"params\": {\"filter\": {\"status\": 0,\"type\": 0},\"host\":\""${HOSTHOST}"\",\"search\": {\"key_\": \"$key\"},\"output\": [\"key_\",\"name\"]},\"auth\":\"$auth\", \"id\": 1 }"
result=`curl --silent --show-error --insecure --header $header --data "$json" $zabbixApiUrl`
check=$(echo "${result}"|tr -d '\r\n'| sed -n 's/error.*\|Invalid.*/ERROR/Ip')
if [[ ${check} == *ERROR* ]]; then exit_with_error &&outapi ; fi
# Оставим только ID элемента
iditema=$(echo $result |sed 's/.*"itemid":"//g'|sed 's/","key_".*//g')
# Ключ Элемента данных
itemkey=$(echo -e $result|egrep -i 'itemid":"[0-9]+"'|sed 's/.*"key_":"//g'|sed 's/","name".*//g')
# Имя Элемента данных
itemname=$(echo -e $result|egrep -i 'itemid":"[0-9]+"'|sed 's/.*"name":"//g'|sed 's/"}.*//g')
#echo "Найденные элементы данных:" $result
#echo "ИД Элемента:" $iditema
#echo "Ключ:" $itemkey
#echo "Имя Элемента:" $itemname
errorMessage="";json="";result="";check="" # Очистка переменных


#------------------------------------------------------
# Динамика изменений https://www.zabbix.com/documentation/4.2/ru/manual/api/reference/trend/get
# clock	штамп времени	Время, когда было получено значение.
# itemid	строка	ID соответствующего элемента данных.
# num	целое число	Количество значений за выбранный час.
# value_min	целое число	Минимальное значение за час.
# value_avg	целое число	Среднее значение за час.
# value_max	целое число	Максимальное значение за час.
# time_from	штамп времени	Возврат только тех значений, которые были собраны после или в заданное время.
# time_till	штамп времени	Возврат только тех значений, которые были собраны до или в заданное время.
# countOutput	логический	Возврат в результате количества записей вместо актуальных данных.
# limit	целое число	Ограничение количества возвращаемых записей.
# output	запрос	Возврат указанных полей.
#------------------------------------------------------
errorMessage='*ERROR* - Не удается получить динамику изменений (историю)'
json="{\"jsonrpc\": \"2.0\",\"method\":\"trend.get\",\"params\": {\"output\": [\"itemid\",\"clock\",\"num\",\"value_min\",\"value_avg\",\"value_max\"],\"itemids\":[$iditema],\"limit\": \"1\"},\"auth\":\"$auth\", \"id\": 1 }"
result=`curl --silent --show-error --insecure --header $header --data "$json" $zabbixApiUrl`
check=$(echo "${result}"|tr -d '\r\n'| sed -n 's/error.*\|Invalid.*/ERROR/Ip')
if [[ ${check} == *ERROR* ]]; then exit_with_error &&outapi ; fi
# Поиск Узла сети
echo -e "Найденая Динамика изменения:" "${result}"
# Ключ Элемента данных
#itemkey=$(echo -e $result|sed 's/.*itemid":"//g'|sed 's/","clock".*//g')
# Штамп времени Время, когда было получено значение.
#itemclock=$(echo -e $result|sed 's/.*"clock":"//g'|sed 's/","num".*//g')
# Количество значений за выбранный час.
#itemnum=$(echo -e $result|sed 's/.*"num":"//g'|sed 's/","value_min".*//g')
# Минимальное значение за час.
#itemmin=$(echo -e $result|sed 's/.*"value_min":"//g'|sed 's/","value_avg".*//g')
# Среднее значение за час.
#itemavg=$(echo -e $result|sed 's/.*"value_avg":"//g'|sed 's/","value_max".*//g')
# Максимальное значение за час.
#itemmax=$(echo -e $result|sed 's/.*"value_max":"//g'|sed 's/"}.*//g')
errorMessage="";json="";result="";check="" # Очистка переменных


#------------------------------------------------------
# История  https://www.zabbix.com/documentation/4.2/ru/manual/api/reference/history/get
# Для целых чисел
# clock	штамп времени	Время, когда было получено значение.
# itemid	строка	ID соответствующего элемента данных.
# ns	целое число	Наносекунды, когда было получено значение.
# value	целое число	Полученное значение.
#------------------------------------------------------
errorMessage='*ERROR* - Не удается получить историю'
#json="{\"jsonrpc\": \"2.0\",\"method\":\"history.get\",\"params\": {\"output\": [\"itemid\",\"clock\",\"value\"],\"history\": 3,\"hostids\": $idhost,\"itemids\": $iditema,\"sortfield\": \"clock\",\"sortorder\": \"DESC\",\"limit\": 1},\"auth\":\"$auth\", \"id\": 1 }"
json="{\"jsonrpc\": \"2.0\",\"method\":\"history.get\",\"params\": {\"output\": \"extend\",\"history\": 3,\"hostids\": $idhost,\"itemids\": $iditema,\"sortfield\": \"clock\",\"sortorder\": \"DESC\",\"limit\": 1},\"auth\":\"$auth\", \"id\": 1 }"
result=`curl --silent --show-error --insecure --header $header --data "$json" $zabbixApiUrl`
check=$(echo "${result}"|tr -d '\r\n'| sed -n 's/error.*\|Invalid.*/ERROR/Ip')
if [[ ${check} == *ERROR* ]]; then exit_with_error &&outapi ; fi
# Вывод результата
echo -e "Найденая История:" "${result}"
# Ключ Элемента данных
#itemkey=$(echo -e $result|sed 's/.*itemid":"//g'|sed 's/","clock".*//g')
# Штамп времени Время, когда было получено значение.
itemclock=$(echo -e $result|sed 's/.*"clock":"//g'|sed 's/","value".*//g')
# Полученное значение.
itemvalue=$(echo -e $result|sed 's/.*"value":"//g'|sed 's/","ns".*//g')
# Наносекунды, когда было получено значение.
#itemns=$(echo -e $result|sed 's/.*"ns":"//g'|sed 's/"}.*//g')
echo "Время:" $itemclock "Значение последнее:" $itemvalue
errorMessage="";json="";result="";check="" # Очистка переменных

# Далее пересылаем нужные данные в Журнал GLPI

outapi
Получаем 2 вида истории:
Динамика изменений: макс мин сред
и Просто последний показатель из истории


Более подробно как работает API API Zabbix через Bash и Curl
количество слов: 1036

Вернуться в «API Zabbix»