slothfk / 1c_zabbix_template_ce

Шаблон Zabbix для мониторинга кластера серверов 1С Предприятия 8.3
MIT License
155 stars 54 forks source link

Вопрос: как можно отладить скрипт? #62

Closed Kirill closed 3 years ago

Kirill commented 3 years ago

Можно получить больше информации почему выводятся те или иные данные? Например скрипт /etc/zabbix/scripts/1c_central_server.sh sessions выдает summary:0:0:0:0:0:0:0:0:0:0 При этом /opt/1cv8/x86_64/8.3.18.1208/rac session --cluster=7cecb77c-1491-11e8-ee8e-43aabdf27048 list выдает большую портянку. Хочу понять, что неправильно работает, ID кластера некорректно определяется или парсинг не работает.

slothfk commented 3 years ago

ID кластера некорректно определяется

Это можно понять по содержимому файла /tmp/1c_clusters_cache

Администратор кластера есть?

Kirill commented 3 years ago

Файл есть, но пустой. Администратора для кластера не создавали. Поэтому при вызове передается только порт

slothfk commented 3 years ago

Поэтому при вызове передается только порт

Отличается от стандартного 1545?

Kirill commented 3 years ago

Отличается от стандартного 1545?

Нет. Всё по-умолчанию.

slothfk commented 3 years ago

После данных строк в файле 1c_common_module.sh

RMNGR_LIST=( $( if [ -z ${IS_WINDOWS} ]; then pgrep -ax rphost; else
    wmic path win32_process where "caption like 'rphost%'" get CommandLine | grep rphost; fi |
    sed -r 's/.*-regport ([^ ]+).*/\0|\1/; s/.*-reghost ([^ ]+).*\|/\1:/' | sort -u |
    awk -F: '{ if ( clstr_list[$1]== "" ) { clstr_list[$1]=$2 } \
        else { clstr_list[$1]=clstr_list[$1]"|"$2 } } \
        END { for ( i in clstr_list ) { print i":"clstr_list[i]} }' ) )

вставьте строку

echo ${RMNGR_LIST[*]}

и пришлите вывод

$ /etc/zabbix/scripts/1c_central_server.sh sessions

Проблема наблюдается на 8.3.18 и в текущей версии скриптов (8360c731b41b)?

Kirill commented 3 years ago

10.10.10.201:1541 summary:0:0:0:0:0:0:0:0:0:0

Адрес агента сервера приложения (заббикс агент локально)

slothfk commented 3 years ago

10.10.10.201:1541

Ответ, вероятно, кроется здесь, т.к. скрипты расчитаны на работу с именами хостов, а не ip-адресами. Пришлите вывод

$ /opt/1cv8/x86_64/8.3.18.1208/rac cluster list 10.10.10.201
Kirill commented 3 years ago
cluster                       : 7cecb77c-1491-11e8-ee8e-43aabdf27048
host                          : 10.10.10.201
port                          : 1541
name                          : "Local cluster"
expiration-timeout            : 0
lifetime-limit                : 0
max-memory-size               : 0
max-memory-time-limit         : 0
security-level                : 0
session-fault-tolerance-level : 0
load-balancing-mode           : performance
errors-count-threshold        : 0
kill-problem-processes        : 0
kill-by-memory-with-dump      : 0
slothfk commented 3 years ago

Что выдает команда?

$ /opt/1cv8/x86_64/8.3.18.1208/rac cluster list 10.10.10.201 2>/dev/null | \
awk '/^($|cluster|name|port)/' | perl -pe "s/.*: /,/; s/(.+)\n/\1/;" | sed 's/^,//' | \
awk "/1541/" | perl -pe 's/\n/;/'
Kirill commented 3 years ago
7cecb77c-1491-11e8-ee8e-43aabdf27048,1541,"Local cluster";
slothfk commented 3 years ago
7cecb77c-1491-11e8-ee8e-43aabdf27048,1541,"Local cluster";

в таком случае в файл 1c_common_module.sh после строк

    # Сохранить список UUID кластеров во временный файл
    function push_clusters_uuid {

вставить строку

    echo "${1%%:*} - ${1##*:}"

и выполнить

$ /etc/zabbix/scripts/1c_central_server.sh sessions

вместе с тем, нет ли ошибок в audit.log по записи в файл /tmp/1c_clusters_cache?

Kirill commented 3 years ago

Строку добавил, но в выводе нет информации:

# Сохранить список кластеров во временный файл
function push_clusters_list {

    # Сохранить список UUID кластеров во временный файл
    function push_clusters_uuid {
        echo "${1%%:*} - ${1##*:}"
        CURR_CLSTR=$( timeout -s HUP ${RAS_PARAMS[timeout]} rac cluster list \
            ${1%%:*}:${RAS_PARAMS[port]} 2>/dev/null | awk '/^($|cluster|name|port)/' | \
            perl -pe "s/.*: /,/; s/(.+)\n/\1/;" | sed 's/^,//' | \
            awk "/${1##*:}/" | perl -pe 's/\n/;/' )

        [[ -n ${CURR_CLSTR} ]] && echo "${1%%:*}:${CURR_CLSTR}" >> ${CLSTR_CACHE}
    }

    cat /dev/null > ${CLSTR_CACHE}

    execute_tasks push_clusters_uuid ${@}

}

вывод команды summary:0:0:0:0:0:0:0:0:0:0 на сервере где тестирую отключен SELinux. Хочу пока разобраться с одной проблемой.

slothfk commented 3 years ago

ок тогда там echo убрать, а перед

execute_tasks push_clusters_uuid ${@}

вставить

    echo ${@}
Kirill commented 3 years ago

Аналогично. Выводиться только summary.

slothfk commented 3 years ago

а если заменить

    echo ${@}

на

    echo "IN: ${@}"
Kirill commented 3 years ago

Ощущение что туда не заходит. Только summary.

slothfk commented 3 years ago

тогда давайте вывод

$ bash -x /etc/zabbix/1c_central_server.sh sessions
Kirill commented 3 years ago
bash -x /etc/zabbix/scripts/1c_central_server.sh sessions
+ alias 'rm=rm -i'
+ alias 'cp=cp -i'
+ alias 'mv=mv -i'
+ '[' -f /etc/bashrc ']'
+ . /etc/bashrc
++ '[' 0 -gt 99 ']'
++ umask 022
++ '[' '' ']'
++ shopt -q login_shell
++ for i in '/etc/profile.d/*.sh'
++ '[' -r /etc/profile.d/1ce.sh ']'
++ '[' '' ']'
++ . /etc/profile.d/1ce.sh
++ for i in '/etc/profile.d/*.sh'
++ '[' -r /etc/profile.d/256term.sh ']'
++ '[' '' ']'
++ . /etc/profile.d/256term.sh
++ for i in '/etc/profile.d/*.sh'
++ '[' -r /etc/profile.d/bash_completion.sh ']'
++ '[' '' ']'
++ . /etc/profile.d/bash_completion.sh
++ for i in '/etc/profile.d/*.sh'
++ '[' -r /etc/profile.d/colorgrep.sh ']'
++ '[' '' ']'
++ . /etc/profile.d/colorgrep.sh
++ for i in '/etc/profile.d/*.sh'
++ '[' -r /etc/profile.d/colorls.sh ']'
++ '[' '' ']'
++ . /etc/profile.d/colorls.sh
++ for i in '/etc/profile.d/*.sh'
++ '[' -r /etc/profile.d/lang.sh ']'
++ '[' '' ']'
++ . /etc/profile.d/lang.sh
++ for i in '/etc/profile.d/*.sh'
++ '[' -r /etc/profile.d/less.sh ']'
++ '[' '' ']'
++ . /etc/profile.d/less.sh
++ for i in '/etc/profile.d/*.sh'
++ '[' -r /etc/profile.d/mc.sh ']'
++ '[' '' ']'
++ . /etc/profile.d/mc.sh
++ for i in '/etc/profile.d/*.sh'
++ '[' -r /etc/profile.d/southbridge.sh ']'
++ '[' '' ']'
++ . /etc/profile.d/southbridge.sh
++ for i in '/etc/profile.d/*.sh'
++ '[' -r /etc/profile.d/vim.sh ']'
++ '[' '\[\][\[\]\u\[\]@\H \[\]\w]# \[\]' ']'
++ . /etc/profile.d/vim.sh
+++ '[' -n '4.2.46(1)-release' -o -n '' -o -n '' ']'
+++ '[' -x /usr/bin/id ']'
++++ /usr/bin/id -u
+++ ID=0
+++ '[' -n 0 -a 0 -le 200 ']'
+++ return
++ for i in '/etc/profile.d/*.sh'
++ '[' -r /etc/profile.d/which2.sh ']'
++ '[' '\[\][\[\]\u\[\]@\H \[\]\w]# \[\]' ']'
++ . /etc/profile.d/which2.sh
+++ alias 'which=alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
++ unset i
++ unset pathmunge
++ dirname /etc/zabbix/scripts/1c_central_server.sh
++ sed -r 's/\\/\//g; s/^(.{1}):/\/\1/'
+ WORK_DIR=/etc/zabbix/scripts
+ source /etc/zabbix/scripts/1c_common_module.sh
+ IB_CACHE=/tmp/1c_infobase_cache
+ case ${1} in
+ shift
+ make_ras_params
+ [[ -n '' ]]
+ [[ -n '' ]]
+ [[ -n '' ]]
+ [[ -n '' ]]
+ get_session_amounts
+ check_clusters_cache
+ RMNGR_LIST=($( if [ -z ${IS_WINDOWS} ]; then pgrep -ax rphost; else
        wmic path win32_process where "caption like 'rphost%'" get CommandLine | grep rphost; fi |
        sed -r 's/.*-regport ([^ ]+).*/\0|\1/; s/.*-reghost ([^ ]+).*\|/\1:/' | sort -u |
        awk -F: '{ if ( clstr_list[$1]== "" ) { clstr_list[$1]=$2 } \
            else { clstr_list[$1]=clstr_list[$1]"|"$2 } } \
            END { for ( i in clstr_list ) { print i":"clstr_list[i]} }' ))
++ '[' -z ']'
++ pgrep -ax rphost
++ sed -r 's/.*-regport ([^ ]+).*/\0|\1/; s/.*-reghost ([^ ]+).*\|/\1:/'
++ sort -u
++ awk -F: '{ if ( clstr_list[$1]== "" ) { clstr_list[$1]=$2 } \
            else { clstr_list[$1]=clstr_list[$1]"|"$2 } } \
            END { for ( i in clstr_list ) { print i":"clstr_list[i]} }'
+ [[ -e /tmp/1c_clusters_cache ]]
+ [[ '' == \l\o\s\t ]]
++ grep -vc '^$' /tmp/1c_clusters_cache
+ [[ 1 -ne 1 ]]
++ date -r /tmp/1c_clusters_cache +%s
++ date -d 'last hour' +%s
+ [[ 1619085882 -lt 1619082695 ]]
+ awk -F: '{ print $0;
            if ($1 !~ /^IB/) { sc["all"]+=$2; sc["bg"]+=$3; sc["hb"]+=$4; sc["ws"]+=$5; sc["hs"]+=$6; sc["as"]+=$7;
                if ( asd["cl"] < $8 ) { asd["cl"]=$8; }
                if ( asd["bg"] < $9 ) { asd["bg"]=$9; }
                if ( asd["ws"] < $10 ) { asd["ws"]=$10; }
                if ( asd["hs"] < $11 ) { asd["hs"]=$11; }
            } }
            END { print "summary:"(sc["all"]?sc["all"]:0)":"(sc["bg"]?sc["bg"]:0)":"(sc["hb"]?sc["hb"]:0)":"\
                (sc["ws"]?sc["ws"]:0)":"(sc["hs"]?sc["hs"]:0)":"(sc["as"]?sc["as"]:0)":"(asd["cl"]?asd["cl"]:0)":"\
                (asd["bg"]?asd["bg"]:0)":"(asd["ws"]?asd["ws"]:0)":"(asd["hs"]?asd["hs"]:0) }'
++ pop_clusters_list self
++ [[ ! -f /tmp/1c_clusters_cache ]]
++ [[ -n self ]]
++ [[ self == \s\e\l\f ]]
++ grep -i '^vs01' /tmp/1c_clusters_cache
++ cut -f2 -d:
++ sed 's/ /<sp>/g; s/"//g'
+ sed 's/<sp>/ /g'
+ execute_tasks get_clusters_sessions
+ TASK_CMD=get_clusters_sessions
+ shift
+ [[ -z '' ]]
summary:0:0:0:0:0:0:0:0:0:0
Kirill commented 3 years ago

Что выдает команда?

$ /opt/1cv8/x86_64/8.3.18.1208/rac cluster list 10.10.10.201 2>/dev/null | \
awk '/^($|cluster|name|port)/' | perl -pe "s/.*: /,/; s/(.+)\n/\1/;" | sed 's/^,//' | \
awk "/1541/" | perl -pe 's/\n/;/'

Может это надо было куда-то внести/поправить?

slothfk commented 3 years ago

В 1c_common_module.sh в строке

[[ -z ${IS_WINDOWS} ]] && HOSTNAME=$(hostname -s) || HOSTNAME=$(hostname)

запишите

[[ -z ${IS_WINDOWS} ]] && HOSTNAME="10.10.10.221" || HOSTNAME=$(hostname)
slothfk commented 3 years ago

проблема в том, что вы в кластере сервер добавили по ip-адресу, а скрипты работают с именами ...

Kirill commented 3 years ago
bash -x /etc/zabbix/scripts/1c_central_server.sh sessions
+ alias 'rm=rm -i'
+ alias 'cp=cp -i'
+ alias 'mv=mv -i'
+ '[' -f /etc/bashrc ']'
+ . /etc/bashrc
++ '[' 0 -gt 99 ']'
++ umask 022
++ '[' '' ']'
++ shopt -q login_shell
++ for i in '/etc/profile.d/*.sh'
++ '[' -r /etc/profile.d/1ce.sh ']'
++ '[' '' ']'
++ . /etc/profile.d/1ce.sh
++ for i in '/etc/profile.d/*.sh'
++ '[' -r /etc/profile.d/256term.sh ']'
++ '[' '' ']'
++ . /etc/profile.d/256term.sh
++ for i in '/etc/profile.d/*.sh'
++ '[' -r /etc/profile.d/bash_completion.sh ']'
++ '[' '' ']'
++ . /etc/profile.d/bash_completion.sh
++ for i in '/etc/profile.d/*.sh'
++ '[' -r /etc/profile.d/colorgrep.sh ']'
++ '[' '' ']'
++ . /etc/profile.d/colorgrep.sh
++ for i in '/etc/profile.d/*.sh'
++ '[' -r /etc/profile.d/colorls.sh ']'
++ '[' '' ']'
++ . /etc/profile.d/colorls.sh
++ for i in '/etc/profile.d/*.sh'
++ '[' -r /etc/profile.d/lang.sh ']'
++ '[' '' ']'
++ . /etc/profile.d/lang.sh
++ for i in '/etc/profile.d/*.sh'
++ '[' -r /etc/profile.d/less.sh ']'
++ '[' '' ']'
++ . /etc/profile.d/less.sh
++ for i in '/etc/profile.d/*.sh'
++ '[' -r /etc/profile.d/mc.sh ']'
++ '[' '' ']'
++ . /etc/profile.d/mc.sh
++ for i in '/etc/profile.d/*.sh'
++ '[' -r /etc/profile.d/southbridge.sh ']'
++ '[' '' ']'
++ . /etc/profile.d/southbridge.sh
++ for i in '/etc/profile.d/*.sh'
++ '[' -r /etc/profile.d/vim.sh ']'
++ '[' '\[\][\[\]\u\[\]@\H \[\]\w]# \[\]' ']'
++ . /etc/profile.d/vim.sh
+++ '[' -n '4.2.46(1)-release' -o -n '' -o -n '' ']'
+++ '[' -x /usr/bin/id ']'
++++ /usr/bin/id -u
+++ ID=0
+++ '[' -n 0 -a 0 -le 200 ']'
+++ return
++ for i in '/etc/profile.d/*.sh'
++ '[' -r /etc/profile.d/which2.sh ']'
++ '[' '\[\][\[\]\u\[\]@\H \[\]\w]# \[\]' ']'
++ . /etc/profile.d/which2.sh
+++ alias 'which=alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
++ unset i
++ unset pathmunge
++ dirname /etc/zabbix/scripts/1c_central_server.sh
++ sed -r 's/\\/\//g; s/^(.{1}):/\/\1/'
+ WORK_DIR=/etc/zabbix/scripts
+ source /etc/zabbix/scripts/1c_common_module.sh
+ IB_CACHE=/tmp/1c_infobase_cache
+ case ${1} in
+ shift
+ make_ras_params
+ [[ -n '' ]]
+ [[ -n '' ]]
+ [[ -n '' ]]
+ [[ -n '' ]]
+ get_session_amounts
+ check_clusters_cache
+ RMNGR_LIST=($( if [ -z ${IS_WINDOWS} ]; then pgrep -ax rphost; else
        wmic path win32_process where "caption like 'rphost%'" get CommandLine | grep rphost; fi |
        sed -r 's/.*-regport ([^ ]+).*/\0|\1/; s/.*-reghost ([^ ]+).*\|/\1:/' | sort -u |
        awk -F: '{ if ( clstr_list[$1]== "" ) { clstr_list[$1]=$2 } \
            else { clstr_list[$1]=clstr_list[$1]"|"$2 } } \
            END { for ( i in clstr_list ) { print i":"clstr_list[i]} }' ))
++ '[' -z ']'
++ pgrep -ax rphost
++ sed -r 's/.*-regport ([^ ]+).*/\0|\1/; s/.*-reghost ([^ ]+).*\|/\1:/'
++ sort -u
++ awk -F: '{ if ( clstr_list[$1]== "" ) { clstr_list[$1]=$2 } \
            else { clstr_list[$1]=clstr_list[$1]"|"$2 } } \
            END { for ( i in clstr_list ) { print i":"clstr_list[i]} }'
+ [[ -e /tmp/1c_clusters_cache ]]
+ [[ '' == \l\o\s\t ]]
++ grep -vc '^$' /tmp/1c_clusters_cache
+ [[ 1 -ne 1 ]]
++ date -r /tmp/1c_clusters_cache +%s
++ date -d 'last hour' +%s
+ [[ 1619085882 -lt 1619083306 ]]
+ awk -F: '{ print $0;
            if ($1 !~ /^IB/) { sc["all"]+=$2; sc["bg"]+=$3; sc["hb"]+=$4; sc["ws"]+=$5; sc["hs"]+=$6; sc["as"]+=$7;
                if ( asd["cl"] < $8 ) { asd["cl"]=$8; }
                if ( asd["bg"] < $9 ) { asd["bg"]=$9; }
                if ( asd["ws"] < $10 ) { asd["ws"]=$10; }
                if ( asd["hs"] < $11 ) { asd["hs"]=$11; }
            } }
            END { print "summary:"(sc["all"]?sc["all"]:0)":"(sc["bg"]?sc["bg"]:0)":"(sc["hb"]?sc["hb"]:0)":"\
                (sc["ws"]?sc["ws"]:0)":"(sc["hs"]?sc["hs"]:0)":"(sc["as"]?sc["as"]:0)":"(asd["cl"]?asd["cl"]:0)":"\
                (asd["bg"]?asd["bg"]:0)":"(asd["ws"]?asd["ws"]:0)":"(asd["hs"]?asd["hs"]:0) }'
++ pop_clusters_list self
++ [[ ! -f /tmp/1c_clusters_cache ]]
+ sed 's/<sp>/ /g'
++ [[ -n self ]]
++ [[ self == \s\e\l\f ]]
++ grep -i '^10.10.10.201' /tmp/1c_clusters_cache
++ cut -f2 -d:
++ sed 's/ /<sp>/g; s/"//g'
+ execute_tasks get_clusters_sessions '7cecb77c-1491-11e8-ee8e-43aabdf27048,1541,Local<sp>cluster;'
+ TASK_CMD=get_clusters_sessions
+ shift
+ [[ -z '' ]]
+ for CURR_TASK in '${@}'
+ get_clusters_sessions '7cecb77c-1491-11e8-ee8e-43aabdf27048,1541,Local<sp>cluster;'
+ for CURR_CLSTR in '${1//;/ }'
+ awk '/^(infobase|app-id|hibernate|duration-current)\s/'
+ timeout -s HUP 1.5 rac session list --cluster=7cecb77c-1491-11e8-ee8e-43aabdf27048 10.10.10.201:1545
+ grep -v '^$'
+ perl -pe 's/ //g; s/\n/ /; s/infobase:/\n/; s/.*://; s/(1CV8[^ ]*|WebClient)/cl/;
                s/BackgroundJob/bg/; s/WSConnection/ws/; s/HTTPServiceConnection/hs/'
+ awk -v cluster=CL#7cecb77c-1491-11e8-ee8e-43aabdf27048 -v ib_cache=/tmp/1c_infobase_cache 'BEGIN {
                ss[cluster]=0;
                while ( getline ib_str < ib_cache > 0) {
                    if (ib_str ~ "^"substr(cluster,4)) {
                        split(ib_str, ib_uuid); ss["IB#"ib_uuid[2]]=0; }
                } }
                { ib_mark="IB#"$1;
                ss[cluster]+=1; ss[ib_mark]+=1;
                if ( $2 != "cl" ) { sc[$2,cluster]+=1; sc[$2,ib_mark]+=1; }
                if ( $3 == "yes" ) { sc["hb",cluster]+=1; sc["hb",ib_mark]+=1 }
                if ( $4 != 0) {
                    as[cluster]+=1; as[ib_mark]+=1;
                    if ( asd[$2,cluster] < $4 ) {
                        asd[$2,cluster]=$4; asd[$2,ib_mark]=$4;
                    } else if ( asd[$2,ib_mark] < $4 ) { asd[$2,ib_mark]=$4; }
                } }
                END { for (i in ss) {
                    print i":"(ss[i]?ss[i]:0)":"(sc["bg",i]?sc["bg",i]:0)":"(sc["hb",i]?sc["hb",i]:0)":"\
                        (sc["ws",i]?sc["ws",i]:0)":"(sc["hs",i]?sc["hs",i]:0)":"(as[i]?as[i]:0)":"\
                        (asd["cl",i]?asd["cl",i]:0)":"(asd["bg",i]?asd["bg",i]:0)":"\
                        (asd["ws",i]?asd["ws",i]:0)":"(asd["hs",i]?asd["hs",i]:0) } }'
IB#b5b0aa6a-149f-11e8-4683-51b1c7a09cf9:2:0:1:0:0:0:0:0:0:0
IB#99275772-149f-11e8-4683-51b1c7a09cf9:5:0:0:0:0:0:0:0:0:0
IB#30e7b412-7706-11e8-3a84-c531fb907f23:4:0:1:0:0:1:252:0:0:0
CL#7cecb77c-1491-11e8-ee8e-43aabdf27048:11:0:2:0:0:1:252:0:0:0
summary:11:0:2:0:0:1:252:0:0:0

С именами сложнее работать когда нет нормального сервера имен. С IP проще - пользователь спокойно подключиться, даже не зная, что есть компьютер с таким именем.