База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как вывести APDEX из 1С в Zabbix простыми способами? › Ответ в теме: Как вывести APDEX из 1С в Zabbix простыми способами?
Самый простой вариант: считать APDEX в 1С, записывать результат в файл, а Zabbix забирать его через Zabbix Agent.
APDEX обычно рассчитывается по формуле:
|
1 |
APDEX = (Удовлетворительные + Терпимые / 2) / Все запросы |
Где:
— удовлетворительные: время ответа <= T;
— терпимые: время ответа > T и <= 4T;
— неудовлетворительные: время ответа > 4T;
— T обычно принимают равным 1, 2 или 4 секундам.
Например:
|
1 2 3 4 5 6 |
T = 2 секунды Удовлетворительные = 800 Терпимые = 150 Неудовлетворительные = 50 APDEX = (800 + 150 / 2) / 1000 = 0,875 |
В Zabbix значение можно хранить как 0,875 или умножить на 100 и показывать как 87,5%.
## Вариант 1. Файл с APDEX и UserParameter
Это наиболее простой и понятный способ.
### 1. Расчет APDEX в 1С
Ниже пример процедуры, которая получает количество операций по трем категориям и записывает APDEX в файл.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
Процедура ЗаписатьAPDEXВФайл() Экспорт ПорогТ = 2; КоличествоУдовлетворительных = 800; КоличествоТерпимых = 150; КоличествоНеудовлетворительных = 50; ВсегоОпераций = КоличествоУдовлетворительных + КоличествоТерпимых + КоличествоНеудовлетворительных; Если ВсегоОпераций = 0 Тогда ИндексAPDEX = 0; Иначе ИндексAPDEX = (КоличествоУдовлетворительных + КоличествоТерпимых / 2) / ВсегоОпераций; КонецЕсли; ИмяФайла = "/var/lib/zabbix/1c_apdex.txt"; Запись = Новый ЗаписьТекста( ИмяФайла, КодировкаТекста.UTF8, Ложь ); Запись.ЗаписатьСтроку( Формат(ИндексAPDEX, "ЧДЦ=3; ЧР=.; ЧГ=0") ); Запись.Закрыть(); КонецПроцедуры |
В реальной конфигурации вместо тестовых значений нужно получить данные из регистра сведений, журнала производительности, накопленной статистики или другого источника, где хранятся времена выполнения операций.
Важно, чтобы пользователь, под которым работает сервер 1С, имел права на запись в каталог:
|
1 |
/var/lib/zabbix/ |
Например, можно использовать отдельный каталог:
|
1 |
/opt/1c-monitoring/ |
и дать доступ на запись пользователю сервера 1С.
### 2. Настройка UserParameter
На сервере, где работает Zabbix Agent, создайте файл:
|
1 |
/etc/zabbix/zabbix_agentd.d/1c_apdex.conf |
Содержимое:
|
1 |
UserParameter=1c.apdex,cat /var/lib/zabbix/1c_apdex.txt |
Проверьте ключ:
|
1 |
zabbix_agentd -t 1c.apdex |
Ожидаемый результат:
|
1 |
1c.apdex [t|0.875] |
Перезапустите агент:
|
1 |
systemctl restart zabbix-agent |
### 3. Элемент данных в Zabbix
Создайте элемент данных:
|
1 2 3 4 5 6 |
Имя: 1С APDEX Тип: Zabbix agent Ключ: 1c.apdex Тип информации: Числовой с плавающей точкой Интервал обновления: 60 секунд Единица измерения: без единицы |
Если нужно показывать APDEX в процентах, можно записывать в файл значение 87.5, а в Zabbix указать единицу измерения %.
## Триггер на низкий APDEX
Например, критичным считаем значение ниже 0,7:
|
1 |
last(/ИмяХоста/1c.apdex)<0.7 |
Предупреждение при значении ниже 0,85:
|
1 |
last(/ИмяХоста/1c.apdex)<0.85 |
Чтобы избежать срабатывания на коротком единичном провале, лучше использовать среднее значение:
|
1 |
avg(/ИмяХоста/1c.apdex,10m)<0.7 |
## Вариант 2. Передача APDEX через zabbix_sender
Этот способ лучше, если APDEX рассчитывается по расписанию, например раз в 5 минут. Не нужно ждать, пока Zabbix Agent сам опросит файл.
### Скрипт отправки
Создайте файл:
|
1 |
/usr/local/bin/send_1c_apdex.sh |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#!/bin/bash ZABBIX_SERVER="127.0.0.1" ZABBIX_HOST="1C-Server" APDEX=$(cat /var/lib/zabbix/1c_apdex.txt) if [ -z "$APDEX" ]; then exit 1 fi /usr/bin/zabbix_sender -z "$ZABBIX_SERVER" -s "$ZABBIX_HOST" -k "1c.apdex" -o "$APDEX" |
Сделайте его исполняемым:
|
1 |
chmod +x /usr/local/bin/send_1c_apdex.sh |
Проверьте вручную:
|
1 |
/usr/local/bin/send_1c_apdex.sh |
Должен появиться результат примерно такого вида:
|
1 |
processed: 1; failed: 0; total: 1 |
В Zabbix создайте элемент данных:
|
1 2 3 4 |
Имя: 1С APDEX Тип: Zabbix trapper Ключ: 1c.apdex Тип информации: Числовой с плавающей точкой |
Запускать отправку можно через планировщик:
|
1 |
*/5 * * * * root /usr/local/bin/send_1c_apdex.sh |
Или непосредственно из регламентного задания 1С, если на сервере 1С разрешен запуск внешней команды. Но обычно безопаснее разделить расчет и отправку:
1. 1С формирует файл;
2. cron запускает zabbix_sender.
## Вариант 3. Один JSON со всеми показателями
Если нужно передавать не только APDEX, но и расшифровку, удобнее отправлять JSON:
|
1 2 3 4 5 6 7 8 |
{ "apdex": 0.875, "satisfied": 800, "tolerating": 150, "frustrated": 50, "total": 1000, "threshold": 2 } |
В 1С можно формировать JSON так:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
Процедура ЗаписатьМетрикиВJSON() Экспорт ЗаписьJSON = Новый ЗаписьJSON; ЗаписьJSON.УстановитьСтроку(); ЗаписьJSON.ЗаписатьНачалоОбъекта(); ЗаписьJSON.ЗаписатьИмяСвойства("apdex"); ЗаписьJSON.ЗаписатьЧисло(0.875); ЗаписьJSON.ЗаписатьИмяСвойства("satisfied"); ЗаписьJSON.ЗаписатьЧисло(800); ЗаписьJSON.ЗаписатьИмяСвойства("tolerating"); ЗаписьJSON.ЗаписатьЧисло(150); ЗаписьJSON.ЗаписатьИмяСвойства("frustrated"); ЗаписьJSON.ЗаписатьЧисло(50); ЗаписьJSON.ЗаписатьИмяСвойства("total"); ЗаписьJSON.ЗаписатьЧисло(1000); ЗаписьJSON.ЗаписатьИмяСвойства("threshold"); ЗаписьJSON.ЗаписатьЧисло(2); ЗаписьJSON.ЗаписатьКонецОбъекта(); JSONСтрока = ЗаписьJSON.Закрыть(); Запись = Новый ЗаписьТекста( "/var/lib/zabbix/1c_metrics.json", КодировкаТекста.UTF8, Ложь ); Запись.Записать(JSONСтрока); Запись.Закрыть(); КонецПроцедуры |
В Zabbix создается основной элемент:
|
1 2 3 4 |
Имя: Метрики 1С JSON Тип: Zabbix agent Ключ: 1c.metrics.json Тип информации: Текст |
UserParameter:
|
1 |
UserParameter=1c.metrics.json,cat /var/lib/zabbix/1c_metrics.json |
Затем создаются зависимые элементы данных.
### Зависимый элемент APDEX
|
1 2 3 4 |
Имя: 1С APDEX Тип: Зависимый элемент данных Основной элемент: Метрики 1С JSON Тип информации: Числовой с плавающей точкой |
В предобработке укажите JSONPath:
|
1 |
$.apdex |
### Зависимый элемент удовлетворительных операций
|
1 |
$.satisfied |
### Зависимый элемент терпимых операций
|
1 |
$.tolerating |
### Зависимый элемент неудовлетворительных операций
|
1 |
$.frustrated |
### Зависимый элемент общего количества операций
|
1 |
$.total |
Преимущество этого способа в том, что Zabbix делает только один опрос агента, а из одного JSON получает несколько показателей.
## Вариант 4. Сбор APDEX из журнала регистрации 1С
Если в журнале регистрации уже есть события с длительностью выполнения, можно не добавлять отдельные измерения в прикладное решение.
Общая схема:
1. Отбираются события за последнюю минуту или пять минут.
2. Для каждого события определяется длительность.
3. Длительность сравнивается с порогом T.
4. Считаются:
— быстрые операции;
— терпимые операции;
— медленные операции.
5. Рассчитывается APDEX.
6. Результат передается в файл или через zabbix_sender.
Этот способ зависит от того, какие именно события записываются в журнал регистрации и доступны ли в них длительности операций. Журнал регистрации 1С не всегда содержит полноценное время ответа пользователя, особенно если требуется измерять клиентские операции, сетевые задержки и время отрисовки формы. Поэтому для прикладного APDEX надежнее самостоятельно фиксировать начало и окончание контролируемых операций.
Например, для критичных операций можно сохранять длительность в регистр сведений:
|
1 2 3 4 5 6 |
ДатаВремя Пользователь Сеанс Операция Длительность Результат |
Затем регламентное задание за последние 5 минут выполняет расчет:
|
1 2 3 |
События с длительностью <= T -> satisfied События с длительностью <= 4T -> tolerating События с длительностью > 4T -> frustrated |
## Что лучше передавать в Zabbix
Для практического мониторинга рекомендую передавать минимум четыре показателя:
|
1 2 3 4 |
1c.apdex 1c.response.avg 1c.response.p95 1c.requests.total |
Одного APDEX бывает недостаточно. Например, APDEX равен 1, но за интервал была всего одна операция. Поэтому желательно контролировать количество операций:
|
1 |
last(/ИмяХоста/1c.requests.total)<10 |
Также полезен показатель p95, то есть 95-й процентиль времени ответа. Он показывает, насколько медленно работают самые проблемные 5% операций.
Оптимальная простая схема для небольшой базы:
|
1 2 3 4 5 |
1. Регламентное задание 1С рассчитывает APDEX каждые 5 минут. 2. 1С записывает JSON в файл. 3. Zabbix Agent получает JSON. 4. В Zabbix создается один основной элемент и несколько зависимых. 5. Триггер контролирует средний APDEX за 10 минут. |
Пример условий:
|
1 2 |
APDEX ниже 0,85: avg(/1C-Server/1c.apdex,10m)<0.85 |
|
1 2 |
APDEX ниже 0,70: avg(/1C-Server/1c.apdex,10m)<0.70 |
|
1 2 |
Мало данных для расчета: last(/1C-Server/1c.requests.total)<10 |
Для самого простого внедрения достаточно одного файла 1c_apdex.txt и ключа:
|
1 |
UserParameter=1c.apdex,cat /var/lib/zabbix/1c_apdex.txt |
Если требуется вывести сразу APDEX, количество операций и длительности, лучше использовать JSON и зависимые элементы данных.