0. Общие моменты
Про технологический журнал 1С Предприятия слышали многие (если не слышали, то Вам сюда), а что и как из него можно извлечь для многих остается весьма сложной "наукой". Предлагаемый ниже материал не претендует на оригинальность, а всего лишь представляет еще один взгляд на "проблему". Важно понимать, что собираемые, в результате выполнения описанных действий, данные не дают готовых ответов/решений, а носят характер вспомогательных для анализа и/или быстрого выявления имеющихся проблем.
Вместе с тем, это еще один материал, который немного про GNU/Linux, и немного про инструменты для анализа работы 1С Предприятия не от фирмы 1С.
ВАЖНО: Ответственность за любые последствия, возникшие в результате внесения изменений в работающую систему по материалам данной статьи, лежат исключительно на лице, внесшим данные изменения!
1. Настройки сервера 1С Предприятия
1.1. Поместить файлы 1c_rphost_calls.sh и 1c_rphost_locks.sh (см. Приложения 2,3) в каталог /etc/zabbix/scripts. Установить права на выполнение (см. man 1 chmod);
1.2. Добавить конфигурационный файл для zabbix-agent, содержащий необходимые значения параметра UserParameter
UserParameter=1c.rphost.locks[*],/etc/zabbix/scripts/1c_rphost_locks.sh $1
UserParameter=1c.rphost.calls[*],/etc/zabbix/scripts/1c_rphost_calls.sh $1 $2 $3
Текст 1. Содержимое файла /etc/zabbix/zabbix_agentd.d/1c-rmngr.conf
1.3. Перезапустить сервис zabbix-agent
[fedotov@server_a ~]$ sudo systemctl restart zabbix-agent
1.4. Создать каталог /var/log/1C/zabbix/, владельцем установить пользователя:группу от имени которого выполняются процессы сервера 1С Предприятия (по умолчанию, usr1cv8:grp1cv8, см. man 1 chown). Внутри созданного каталога создать подкаталог problem_log.
1.5. Пользователя zabbix добавить в группу grp1cv8, чтобы он мог читать файлы журналов:
[fedotov@server_a ~]$ sudo usermod -a -G grp1cv8 zabbix
1.6. Создать файл logcfg.xml или добавить секции log содержимое, которого приведено в Приложении 1.
1.7. Убедиться что технологический журнал стал собираться в соответсвующих подкаталогах каталога, созданного в п.1.4.
2. Настройки на Zabbix-сервере
2.1. Сделать импорт шаблона 1c_rphost_template.xml (см. Приложение 4).
2.2. Добавить данный шаблон серверу 1С Предприятия.
2.3. С помощью макроса {$LOG_DIR} вы можете менять каталог содержащий файлы технологического журнала (см. п.1.4.).
2.4. С помощью макроса {$TOP_CALL_LIMIT} можно задать количество строк в ТОП-отборах по серверным вызовам.
2.5. С помощью макроса {$MAX_LOCK_WAIT} можно установить пороговое количество секунд ожидания на управляемых блокировках, по превышении которого будет срабатывать триггер.
3. Что получилось?
Каждый час zabbix будет анализировать файлы технологичского журнала за предыдущий час и выдавать информацию:
— По управляемым блокировкам (суммарное ожидание, количество таймаутов, количество взаимоблокировок). Триггеры срабатывают если обнаружены таймауты, или взаимоблокировки, или превышено пороговое значение суммарного ожидания на блокировках (установленное макросом {$MAX_LOCK_WAIT}). В случае если обнаружены какие-то проблемы, то файл технологического журнала копируется в каталог problem_log.
— По суммарной длительности серверного вызова, с указанием части от суммарной длительности вызовов по конкретной ИБ
— По суммарному процессорному времени с указанием указанием части от суммарного процессорного времени по конкретной ИБ
— По суммарному количеству серверных вызовов.
Приложение 1. Файл logcfg.xml (конфигурация технологического журнала)
<config xmlns="http://v8.1c.ru/v8/tech-log">
<dump create="false"/>
<log location="/var/log/1C/zabbix/locks" history="1">
<event>
<eq property="name" value="tlock"/>
</event>
<event>
<eq property="name" value="ttimeout"/>
</event>
<event>
<eq property="name" value="tdeadlock"/>
</event>
<property name="p:processname"/>
<property name="t:connectid"/>
<property name="waitconnections"/>
<property name="deadlockconnectionintersections"/>
<property name="regions"/>
<property name="locks"/>
<property name="context"/>
</log>
<log location="/var/log/1C/zabbix/calls" history="1">
<event>
<eq property="name" value="call"/>
<ne property="context" value=""/>
</event>
<property name="p:processname"/>
<property name="context"/>
<property name="memorypeak"/>
<property name="cputime"/>
<property name="inbytes"/>
<property name="outbytes"/>
</log>
</config>
Приложение 2. Файл 1c_rphost_calls.sh (скрипт получения данных по вызовам)
#!/bin/bash
#
# 1C Enterprise 8.3 Work Process Calls Info for Zabbix
#
# (c) 2024, Alexey Y. Fedotov
#
# Email: fedotov@kaminsoft.ru
#
LOG_DIR=${1}/zabbix/calls
[[ ! -d ${LOG_DIR} ]] && echo "ОШИБКА: Неверно задан каталог технологического журнала!" && exit 1
LOG_FILE=$(date --date="@$(($(date "+%s") - 3600))" "+%y%m%d%H")
MODE=${2}
[[ -n ${3} ]] && TOP_LIMIT=${3} || TOP_LIMIT=25
function brack_line {
[[ -n ${1} ]] && LIMIT=${1} || LIMIT=80;
for (( i=0; i < ${LIMIT}; i++ )) {
echo -n "-"
}
echo
}
case ${MODE} in
count) echo "Кол-во | Длит-ть,с | СрДл-ть,мс | Контекст";;
cpu) echo "Процессор,с (%) | Длит-ть,с | Кол-во | СрДл-ть,мс | Контекст";;
duration) echo "Длительность,с (%) | Кол-во | СрДл-ть,мс | Процессор | Контекст";;
*) echo "ОШИБКА: Неверный режим работы скрипта!"; exit 1 ;;
esac
brack_line
cat ${LOG_DIR}/rphost_*/${LOG_FILE}.log 2>/dev/null | \r
sed -re "s/[0-9]+:[0-9]+.[0-9]+-//; s/,[a-zA-Z:]+=/,/g" | \r
awk -F, -v mode=${MODE} '{ if ($4) {count[$4"->"$5]+=1; durations[$4"->"$5]+=$1; \r
cpus[$4"->"$5]+=$9; duration[$4]+=$1; cpu[$4]+=$9; } } \r
END { for ( i in count ) { \r
if ( mode == "count" ) { printf "%6d | %9.2f | %10.2f | %s
", count[i], \r
durations[i]/1000000, durations[i]/count[i]/1000, i } \r
else if ( mode == "cpu" ) { printf "%8.2f (%4.1f) | %9.2f | %6d | %10.2f | %s
", \r
cpus[i]/1000000, cpus[i]/cpu[substr(i,0,index(i,"->")-1)]*100, durations[i]/1000000, count[i], durations[i]/count[i]/1000, i } \r
else if ( mode == "duration" ) { printf "%11.2f (%4.1f) | %6d | %10.2f | %9.2f | %s
", \r
durations[i]/1000000, durations[i]/duration[substr(i,0,index(i, "->")-1)]*100, count[i], durations[i]/count[i]/1000, cpus[i]/1000000, i } \r
} }' | \r
sort -rn | head -n ${TOP_LIMIT} | awk -v mode=${MODE} -F"@" '{ if ( mode == "lazy" ) { print $2 } else { print $0 } }'
Приложение 3. Файл 1c_rphost_locks.sh (скрипт получения данных по блокировкам)
#!/bin/bash
#
# 1C Enterprise 8.3 Work Process Managed Locks Info for Zabbix
#
# (c) 2024, Alexey Y. Fedotov
#
# Email: fedotov@kaminsoft.ru
#
LOG_DIR=${1}/zabbix/locks
[[ ! -d ${LOG_DIR} ]] && echo "ОШИБКА: Неверно задан каталог технологического журнала!" && exit 1
LOG_FILE=$(date --date="@$(($(date "+%s") - 3600))" "+%y%m%d%H")
RESULT=($(cat ${LOG_DIR}/rphost_*/${LOG_FILE}.log 2>/dev/null | \r
grep -P "(TDEADLOCK|TTIMEOUT|TLOCK.*,WaitConnections=d+)" | \r
sed -re "s/[0-9]{2}:[0-9]{2}.[0-9]{6}-//; s/,[a-zA-Z:]+=/,/g" | \r
awk -F"," 'BEGIN {dl=0; to=0; lw=0} { if ($2 == "TDEADLOCK") {dl+=1} \r
else if ($2 == "TTIMEOUT") { to+=1 } \r
else { lw+=$1; lws[$4"->"$6]+=$1; } } \r
END { print lw/1000000":"to":"dl"<nl>"; \r
if ( length(lws) > 0 ) { print "Ожидания на блокировках:<nl>"; \r
for ( i in lws ) { print "> "i" - "lws[i]/1000000" сек.<nl>" } } }'))
echo ${RESULT[*]} | perl -pe 's/<nl>s?/
/g'
COUNTERS=${RESULT[0]%<*}
[[ ${COUNTERS##*:} != 0 || ${COUNTERS%%:*} != 0 || $(echo ${COUNTERS} | cut -d: -f2) != 0 ]] && \r
cd ${LOG_DIR} && tar czf ../problem_log/${LOG_FILE}.tgz ./rphost_*/${LOG_FILE}.log && \r
echo "Файлы технологического журнала сохранены (${LOG_DIR%/*}/problem_log/${LOG_FILE}.tgz)"
Приложение 4. Файл 1c_rphost_template.xml (шаблон Zabbix)
<?xml version="1.0" encoding="UTF-8"?>
<zabbix_export>
<version>4.0</version>
<date>2024-06-04T14:18:59Z</date>
<groups>
<group>
<name>Templates (Kaminsoft)</name>
</group>
</groups>
<templates>
<template>
<template>Template App 1C Enterprise Work Server</template>
<name>Template App 1C Enterprise Work Server</name>
<description/>
<groups>
<group>
<name>Templates (Kaminsoft)</name>
</group>
</groups>
<applications>
<application>
<name>[1C] Информация</name>
</application>
<application>
<name>[1C] Производительность</name>
</application>
</applications>
<items>
<item>
<name>[1C/Серверные вызовы] ТОП по суммарному количеству</name>
<type>0</type>
<snmp_community/>
<snmp_oid/>
<key>1c.rphost.calls[{$LOG_DIR},count,{$TOP_CALL_LIMIT}]</key>
<delay>60m</delay>
<history>90d</history>
<trends>0</trends>
<status>0</status>
<value_type>4</value_type>
<allowed_hosts/>
<units/>
<snmpv3_contextname/>
<snmpv3_securityname/>
<snmpv3_securitylevel>0</snmpv3_securitylevel>
<snmpv3_authprotocol>0</snmpv3_authprotocol>
<snmpv3_authpassphrase/>
<snmpv3_privprotocol>0</snmpv3_privprotocol>
<snmpv3_privpassphrase/>
<params/>
<ipmi_sensor/>
<authtype>0</authtype>
<username/>
<password/>
<publickey/>
<privatekey/>
<port/>
<description/>
<inventory_link>0</inventory_link>
<applications>
<application>
<name>[1C] Производительность</name>
</application>
</applications>
<valuemap/>
<logtimefmt/>
<preprocessing/>
<jmx_endpoint/>
<timeout>3s</timeout>
<url/>
<query_fields/>
<posts/>
<status_codes>200</status_codes>
<follow_redirects>1</follow_redirects>
<post_type>0</post_type>
<http_proxy/>
<headers/>
<retrieve_mode>0</retrieve_mode>
<request_method>0</request_method>
<output_format>0</output_format>
<allow_traps>0</allow_traps>
<ssl_cert_file/>
<ssl_key_file/>
<ssl_key_password/>
<verify_peer>0</verify_peer>
<verify_host>0</verify_host>
<master_item/>
</item>
<item>
<name>[1C/Серверные вызовы] ТОП по суммарному процессорному времени</name>
<type>0</type>
<snmp_community/>
<snmp_oid/>
<key>1c.rphost.calls[{$LOG_DIR},cpu,{$TOP_CALL_LIMIT}]</key>
<delay>60m</delay>
<history>90d</history>
<trends>0</trends>
<status>0</status>
<value_type>4</value_type>
<allowed_hosts/>
<units/>
<snmpv3_contextname/>
<snmpv3_securityname/>
<snmpv3_securitylevel>0</snmpv3_securitylevel>
<snmpv3_authprotocol>0</snmpv3_authprotocol>
<snmpv3_authpassphrase/>
<snmpv3_privprotocol>0</snmpv3_privprotocol>
<snmpv3_privpassphrase/>
<params/>
<ipmi_sensor/>
<authtype>0</authtype>
<username/>
<password/>
<publickey/>
<privatekey/>
<port/>
<description/>
<inventory_link>0</inventory_link>
<applications>
<application>
<name>[1C] Производительность</name>
</application>
</applications>
<valuemap/>
<logtimefmt/>
<preprocessing/>
<jmx_endpoint/>
<timeout>3s</timeout>
<url/>
<query_fields/>
<posts/>
<status_codes>200</status_codes>
<follow_redirects>1</follow_redirects>
<post_type>0</post_type>
<http_proxy/>
<headers/>
<retrieve_mode>0</retrieve_mode>
<request_method>0</request_method>
<output_format>0</output_format>
<allow_traps>0</allow_traps>
<ssl_cert_file/>
<ssl_key_file/>
<ssl_key_password/>
<verify_peer>0</verify_peer>
<verify_host>0</verify_host>
<master_item/>
</item>
<item>
<name>[1C/Серверные вызовы] ТОП по суммарной длительности</name>
<type>0</type>
<snmp_community/>
<snmp_oid/>
<key>1c.rphost.calls[{$LOG_DIR},duration,{$TOP_CALL_LIMIT}]</key>
<delay>60m</delay>
<history>90d</history>
<trends>0</trends>
<status>0</status>
<value_type>4</value_type>
<allowed_hosts/>
<units/>
<snmpv3_contextname/>
<snmpv3_securityname/>
<snmpv3_securitylevel>0</snmpv3_securitylevel>
<snmpv3_authprotocol>0</snmpv3_authprotocol>
<snmpv3_authpassphrase/>
<snmpv3_privprotocol>0</snmpv3_privprotocol>
<snmpv3_privpassphrase/>
<params/>
<ipmi_sensor/>
<authtype>0</authtype>
<username/>
<password/>
<publickey/>
<privatekey/>
<port/>
<description/>
<inventory_link>0</inventory_link>
<applications>
<application>
<name>[1C] Производительность</name>
</application>
</applications>
<valuemap/>
<logtimefmt/>
<preprocessing/>
<jmx_endpoint/>
<timeout>3s</timeout>
<url/>
<query_fields/>
<posts/>
<status_codes>200</status_codes>
<follow_redirects>1</follow_redirects>
<post_type>0</post_type>
<http_proxy/>
<headers/>
<retrieve_mode>0</retrieve_mode>
<request_method>0</request_method>
<output_format>0</output_format>
<allow_traps>0</allow_traps>
<ssl_cert_file/>
<ssl_key_file/>
<ssl_key_password/>
<verify_peer>0</verify_peer>
<verify_host>0</verify_host>
<master_item/>
</item>
<item>
<name>[1C/Управляемые блокировки] Количество взаимоблокировок</name>
<type>18</type>
<snmp_community/>
<snmp_oid/>
<key>1c.rphost.locks.deadlock</key>
<delay>0</delay>
<history>90d</history>
<trends>365d</trends>
<status>0</status>
<value_type>3</value_type>
<allowed_hosts/>
<units/>
<snmpv3_contextname/>
<snmpv3_securityname/>
<snmpv3_securitylevel>0</snmpv3_securitylevel>
<snmpv3_authprotocol>0</snmpv3_authprotocol>
<snmpv3_authpassphrase/>
<snmpv3_privprotocol>0</snmpv3_privprotocol>
<snmpv3_privpassphrase/>
<params/>
<ipmi_sensor/>
<authtype>0</authtype>
<username/>
<password/>
<publickey/>
<privatekey/>
<port/>
<description/>
<inventory_link>0</inventory_link>
<applications>
<application>
<name>[1C] Производительность</name>
</application>
</applications>
<valuemap/>
<logtimefmt/>
<preprocessing>
<step>
<type>5</type>
<params>d+.?d*:d+:(d+)
1</params>
</step>
</preprocessing>
<jmx_endpoint/>
<timeout>3s</timeout>
<url/>
<query_fields/>
<posts/>
<status_codes>200</status_codes>
<follow_redirects>1</follow_redirects>
<post_type>0</post_type>
<http_proxy/>
<headers/>
<retrieve_mode>0</retrieve_mode>
<request_method>0</request_method>
<output_format>0</output_format>
<allow_traps>0</allow_traps>
<ssl_cert_file/>
<ssl_key_file/>
<ssl_key_password/>
<verify_peer>0</verify_peer>
<verify_host>0</verify_host>
<master_item>
<key>1c.rphost.locks[{$LOG_DIR}]</key>
</master_item>
</item>
<item>
<name>[1C/Управляемые блокировки] Количество таймаутов</name>
<type>18</type>
<snmp_community/>
<snmp_oid/>
<key>1c.rphost.locks.timeout</key>
<delay>0</delay>
<history>90d</history>
<trends>365d</trends>
<status>0</status>
<value_type>3</value_type>
<allowed_hosts/>
<units/>
<snmpv3_contextname/>
<snmpv3_securityname/>
<snmpv3_securitylevel>0</snmpv3_securitylevel>
<snmpv3_authprotocol>0</snmpv3_authprotocol>
<snmpv3_authpassphrase/>
<snmpv3_privprotocol>0</snmpv3_privprotocol>
<snmpv3_privpassphrase/>
<params/>
<ipmi_sensor/>
<authtype>0</authtype>
<username/>
<password/>
<publickey/>
<privatekey/>
<port/>
<description/>
<inventory_link>0</inventory_link>
<applications>
<application>
<name>[1C] Производительность</name>
</application>
</applications>
<valuemap/>
<logtimefmt/>
<preprocessing>
<step>
<type>5</type>
<params>d+.?d*:(d+):d+
1</params>
</step>
</preprocessing>
<jmx_endpoint/>
<timeout>3s</timeout>
<url/>
<query_fields/>
<posts/>
<status_codes>200</status_codes>
<follow_redirects>1</follow_redirects>
<post_type>0</post_type>
<http_proxy/>
<headers/>
<retrieve_mode>0</retrieve_mode>
<request_method>0</request_method>
<output_format>0</output_format>
<allow_traps>0</allow_traps>
<ssl_cert_file/>
<ssl_key_file/>
<ssl_key_password/>
<verify_peer>0</verify_peer>
<verify_host>0</verify_host>
<master_item>
<key>1c.rphost.locks[{$LOG_DIR}]</key>
</master_item>
</item>
<item>
<name>[1C/Управляемые блокировки] Общее ожидание на блокировках</name>
<type>18</type>
<snmp_community/>
<snmp_oid/>
<key>1c.rphost.locks.wait</key>
<delay>0</delay>
<history>90d</history>
<trends>365d</trends>
<status>0</status>
<value_type>0</value_type>
<allowed_hosts/>
<units>s</units>
<snmpv3_contextname/>
<snmpv3_securityname/>
<snmpv3_securitylevel>0</snmpv3_securitylevel>
<snmpv3_authprotocol>0</snmpv3_authprotocol>
<snmpv3_authpassphrase/>
<snmpv3_privprotocol>0</snmpv3_privprotocol>
<snmpv3_privpassphrase/>
<params/>
<ipmi_sensor/>
<authtype>0</authtype>
<username/>
<password/>
<publickey/>
<privatekey/>
<port/>
<description/>
<inventory_link>0</inventory_link>
<applications>
<application>
<name>[1C] Производительность</name>
</application>
</applications>
<valuemap/>
<logtimefmt/>
<preprocessing>
<step>
<type>5</type>
<params>(d+.?d*):d+:d+
1</params>
</step>
</preprocessing>
<jmx_endpoint/>
<timeout>3s</timeout>
<url/>
<query_fields/>
<posts/>
<status_codes>200</status_codes>
<follow_redirects>1</follow_redirects>
<post_type>0</post_type>
<http_proxy/>
<headers/>
<retrieve_mode>0</retrieve_mode>
<request_method>0</request_method>
<output_format>0</output_format>
<allow_traps>0</allow_traps>
<ssl_cert_file/>
<ssl_key_file/>
<ssl_key_password/>
<verify_peer>0</verify_peer>
<verify_host>0</verify_host>
<master_item>
<key>1c.rphost.locks[{$LOG_DIR}]</key>
</master_item>
</item>
<item>
<name>[1C/Управляемые блокировки] Сводка</name>
<type>0</type>
<snmp_community/>
<snmp_oid/>
<key>1c.rphost.locks[{$LOG_DIR}]</key>
<delay>60m</delay>
<history>90d</history>
<trends>0</trends>
<status>0</status>
<value_type>4</value_type>
<allowed_hosts/>
<units/>
<snmpv3_contextname/>
<snmpv3_securityname/>
<snmpv3_securitylevel>0</snmpv3_securitylevel>
<snmpv3_authprotocol>0</snmpv3_authprotocol>
<snmpv3_authpassphrase/>
<snmpv3_privprotocol>0</snmpv3_privprotocol>
<snmpv3_privpassphrase/>
<params/>
<ipmi_sensor/>
<authtype>0</authtype>
<username/>
<password/>
<publickey/>
<privatekey/>
<port/>
<description/>
<inventory_link>0</inventory_link>
<applications>
<application>
<name>[1C] Информация</name>
</application>
</applications>
<valuemap/>
<logtimefmt/>
<preprocessing/>
<jmx_endpoint/>
<timeout>3s</timeout>
<url/>
<query_fields/>
<posts/>
<status_codes>200</status_codes>
<follow_redirects>1</follow_redirects>
<post_type>0</post_type>
<http_proxy/>
<headers/>
<retrieve_mode>0</retrieve_mode>
<request_method>0</request_method>
<output_format>0</output_format>
<allow_traps>0</allow_traps>
<ssl_cert_file/>
<ssl_key_file/>
<ssl_key_password/>
<verify_peer>0</verify_peer>
<verify_host>0</verify_host>
<master_item/>
</item>
</items>
<discovery_rules/>
<httptests/>
<macros>
<macro>
<macro>{$MAX_LOCK_WAIT}</macro>
<value>5</value>
</macro>
<macro>
<macro>{$LOG_DIR}</macro>
<value>/var/log/1C</value>
</macro>
<macro>
<macro>{$TOP_CALL_LIMIT}</macro>
<value>25</value>
</macro>
</macros>
<templates/>
<screens/>
</template>
</templates>
<triggers>
<trigger>
<expression>{Template App 1C Enterprise Work Server:1c.rphost.locks.deadlock.last()}>0</expression>
<recovery_mode>0</recovery_mode>
<recovery_expression/>
<name>[1C/Управляемые блокировки] Обнаружены взаимоблокировки</name>
<correlation_mode>0</correlation_mode>
<correlation_tag/>
<url/>
<status>0</status>
<priority>4</priority>
<description/>
<type>0</type>
<manual_close>0</manual_close>
<dependencies/>
<tags/>
</trigger>
<trigger>
<expression>{Template App 1C Enterprise Work Server:1c.rphost.locks.timeout.last()}>0</expression>
<recovery_mode>0</recovery_mode>
<recovery_expression/>
<name>[1C/Управляемые блокировки] Обнаружены таймауты</name>
<correlation_mode>0</correlation_mode>
<correlation_tag/>
<url/>
<status>0</status>
<priority>4</priority>
<description/>
<type>0</type>
<manual_close>0</manual_close>
<dependencies/>
<tags/>
</trigger>
<trigger>
<expression>{Template App 1C Enterprise Work Server:1c.rphost.locks.wait.last()}>{$MAX_LOCK_WAIT}</expression>
<recovery_mode>0</recovery_mode>
<recovery_expression/>
<name>[1C/Управялемые блокировки] Превышено пороговое значение ожидания на блокировках</name>
<correlation_mode>0</correlation_mode>
<correlation_tag/>
<url/>
<status>0</status>
<priority>4</priority>
<description/>
<type>0</type>
<manual_close>0</manual_close>
<dependencies/>
<tags/>
</trigger>
</triggers>
<graphs/>
<value_maps/>
</zabbix_export>
P.S. Если у Вас есть вопросы, предложения, замечания или Вам просто интересна тема мониторинга кластера серверов 1С Предприятия посредством Zabbix и не только, пишите, пообщаемся!
P.P.S. Теперь следить за проектом можно через GitHub
Ну офигенно же!
Я тоже в восторге. Вечером обязательно попробую.
Просто пушка
(3) со всеми проектами zabbix+1c, которые есть на github и которые я нашел, я ознакомился 🙂 Спасибо за ссылку!
Моё почтение.
Низкий поклон автору, теперь zabbix функционал расширим — будет бомба!
Круто
(2) Получилось ли чего или не срослось?
(7) Буду благодарен за обратную связь!
(10) пока не добрался.
Хочуть заббикс обновить и тогда будем пробовать.