Advertisement
Guest User

Untitled

a guest
Sep 27th, 2016
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Awk 23.65 KB | None | 0 0
  1. #!/usr/bin/awk -f
  2.  
  3. BEGIN {
  4.  
  5.     # Массив FQDN, которые будем опрашивать
  6.     HOST["1consul01.rtty.in"]
  7.     HOST["1consul02.rtty.in"]
  8.     HOST["1consul03.rtty.in"]
  9.  
  10.     global_fail = 100000000
  11.     contractor_metric_min_rps = 100
  12.     contractor_metric_max_95percentile = 40
  13.     contractor_metric_max_prepare_time = 750000
  14.     contractor_metric_max_return_time = 900000
  15.     contractor_metric_max_corrections_time = 300000
  16.     contractor_metric_max_consul_errors = 5
  17.  
  18.     # Что именно будем запрашивать у хостов
  19.     dst_schema = "http://"
  20.     dst_url_consul_status_peers = ":8500/v1/status/peers"
  21.     dst_url_contractor_metrics = ":8080/metrics"
  22.  
  23.     # Как именно будем запрашивать у хостов
  24.     arg_curl = " --connect-timeout 3 --max-time 6 -s -v -X GET "
  25.     exit
  26. }
  27.  
  28. # Функция выполнения запроса к хосту, формирование массива HOSTSTATUS
  29. function CurlGetResponse() {
  30.     is_fail = 1
  31.     text_json = ""
  32.     cmd_curl = sprintf("%s%s%s%s%s", bin_curl, arg_curl, HOST[h], dst_url, " 2>&1")
  33.     if (ARGV[1] == "testrun") {
  34.         printf("%s%s\n", "#T: ", cmd_curl)
  35.     } else {
  36.         while ((cmd_curl | getline line_in) > 0) {
  37.             # Зачищаем говно которое может отдать curl
  38.             gsub(/\r/,"",line_in)
  39.             if (split(line_in,T) > 0) {
  40.                 if (T[1] == "<") {
  41.                     if (T[2] == "HTTP/1.1") {
  42.                         # Фиксируем коды ответов удаленного http сервера
  43.                         if (T[3] != 200) {
  44.                             is_fail = T[3]
  45.                         } else {
  46.                             is_fail = 0
  47.                         }
  48.                     }
  49.                 # Строчки не подлежащие анализу
  50.                 } else if (T[1] == ">" || T[1] == "*" || line_in ~ /\[[0-9]+ bytes data\]/ || line_in ~ /\{ \[data not shown\]/){
  51.                     continue
  52.                 # Остается тело ответа.
  53.                 } else {
  54.                     text_json = line_in
  55.                     # Работаем с данными ноды кластера consul
  56.                     if (check_type == "consul") {
  57.                         HOSTSTATUS[++counter_host,1] = h
  58.                         ALIVESTATUS[counter_host,1] = h
  59.                         HOSTSTATUS[counter_host,2] = is_fail
  60.                         # Вызываем функцию получения из json ip адресов нод consul
  61.                         GetConsulPeers()
  62.                         # Если количество ip полученных из json равно количеству хостов в начальной конфигурации
  63. #                       if (nr_split_text_json == counter_arghost) {
  64.                             not_in_peer_list = 0
  65.                             # Сверяем полученные из json ip адреса с ip адресами хостов начальной конфигурации
  66.                             for (arghost in IPHOST) {
  67.                                 # Если ip адрес хоста начальной конфигурации не найден в массиве CONSULPEER
  68.                                 if ((IPHOST[arghost] in CONSULPEER) == 0) {
  69.                                     # Инкрементируем счетчик not_in_peer_list и пишем alert в массив HOSTSTATUS
  70.                                     ++not_in_peer_list
  71.                                     if (not_in_peer_list == 1) {
  72.                                         HOSTSTATUS[counter_host,3] = sprintf("%s%s%s", HOSTSTATUS[counter_host,3], " not_in_peer_list=", IPHOST[arghost])
  73.                                     } else {
  74.                                         HOSTSTATUS[counter_host,3] = sprintf("%s%s%s", HOSTSTATUS[counter_host,3], ",", IPHOST[arghost])
  75.                                     }
  76.                                 }
  77.                             }
  78. #                       # Если количество ip полученных из json не равно количеству хостов в начальной конфигурации, печатаем диагрностику
  79. #                       } else {
  80. #                           HOSTSTATUS[counter_host,3] = sprintf("%s%s%d%s%d", HOSTSTATUS[counter_host,3], " peer_list_count=", nr_split_text_json, " config_peer_count=", counter_arghost)
  81. #                       }
  82.                     # Работаем с данными инстанса contractor
  83.                     } else if (check_type == "contractor" && is_fail == 0) {
  84.                         # Объявляем для очередного хоста умолчальные переменные.
  85.                         contractor_metric_fail = 0
  86.                         contractor_metric_use_time_95percentile = global_fail
  87.                         contractor_metric_check_time_95percentile = global_fail
  88.                         contractor_metric_quotas_prepare_time = global_fail
  89.                         contractor_metric_quotas_return_time = global_fail
  90.                         contractor_metric_quotas_corrections_time = global_fail
  91.                         # Вызываем функцию получения из json проверяемых ниже значений
  92.                         GetContractorMetrics()
  93.                     }
  94.                 }
  95.             }
  96.             split("",T)
  97.         }
  98.         close(cmd_curl)
  99.         # Работаем с данными инстанса contractor
  100.         if (check_type == "contractor") {
  101.             # Методом перебора находим в массиве HOSTSTATUS номер проверяемого хоста
  102.             for(k = 1; k <= counter_host; k++) {
  103.                 if (HOSTSTATUS[k,1] == h) {
  104.                     ALIVESTATUS[k,1] = h
  105.                     # Вот тут присваиваем текущее значение (переменная is_fail) статуса отработки вызова curl
  106.                     HOSTSTATUS[k,4] = is_fail
  107.                     if (is_fail == 0) {
  108.                         # Если полученное из json значение совпадает со значением по-умолчанию, значит метрика use_rps не была получена
  109.                         if (contractor_metric_use_rps == global_fail) {
  110.                             ++contractor_metric_fail
  111.                             if (contractor_metric_fail == 1) {
  112.                                 HOSTSTATUS[k,5] = sprintf("%s%s", HOSTSTATUS[k,5], " metric_fail=use_rps")
  113.                             } else {
  114.                                 HOSTSTATUS[k,5] = sprintf("%s%s", HOSTSTATUS[k,5], ",use_rps")
  115.                             }
  116.                         }
  117.                         # Если полученное из json значение метрики use_rps меньше нижнего порогового значения, добавляем алерт в массив HOSTSTATUS
  118.                         if (contractor_metric_use_rps < contractor_metric_min_rps) {
  119.                             HOSTSTATUS[k,5] = sprintf("%s%s%d", HOSTSTATUS[k,5], " use_rps=", contractor_metric_use_rps)
  120.                         }
  121.                         # Если полученное из json значение совпадает со значением по-умолчанию, значит метрика use не была получена
  122.                         if (contractor_metric_use_time_95percentile == global_fail) {
  123.                             ++contractor_metric_fail
  124.                             if (contractor_metric_fail == 1) {
  125.                                 HOSTSTATUS[k,5] = sprintf("%s%s", HOSTSTATUS[k,5], " metric_fail=use_time_95")
  126.                             } else {
  127.                                 HOSTSTATUS[k,5] = sprintf("%s%s", HOSTSTATUS[k,5], ",use_time_95")
  128.                             }
  129.                         }
  130.                         # Если полученное из json значение совпадает со значением по-умолчанию, значит метрика check_rps не была получена
  131.                         if (contractor_metric_check_rps == global_fail) {
  132.                             ++contractor_metric_fail
  133.                             if (contractor_metric_fail == 1) {
  134.                                 HOSTSTATUS[k,5] = sprintf("%s%s", HOSTSTATUS[k,5], " metric_fail=check_rps")
  135.                             } else {
  136.                                 HOSTSTATUS[k,5] = sprintf("%s%s", HOSTSTATUS[k,5], ",check_rps")
  137.                             }
  138.                         }
  139.                         # Если полученное из json значение метрики use_rps меньше нижнего порогового значения, добавляем алерт в массив HOSTSTATUS
  140.                         if (contractor_metric_check_rps < contractor_metric_min_rps) {
  141.                             HOSTSTATUS[k,5] = sprintf("%s%s%d", HOSTSTATUS[k,5], " check_rps=", contractor_metric_check_rps)
  142.                         }
  143.                         # Если полученное из json значение совпадает со значением по-умолчанию, значит метрика check не была получена
  144.                         if (contractor_metric_check_time_95percentile == global_fail) {
  145.                             ++contractor_metric_fail
  146.                             if (contractor_metric_fail == 1) {
  147.                                 HOSTSTATUS[k,5] = sprintf("%s%s", HOSTSTATUS[k,5], " metric_fail=check_95")
  148.                             } else {
  149.                                 HOSTSTATUS[k,5] = sprintf("%s%s", HOSTSTATUS[k,5], ",check_95")
  150.                             }
  151.                         }
  152.                         # Если полученное из json значение метрики use больше порогового значения, добавляем алерт в массив HOSTSTATUS
  153.                         if (contractor_metric_use_time_95percentile > contractor_metric_max_95percentile) {
  154.                             HOSTSTATUS[k,5] = sprintf("%s%s%d", HOSTSTATUS[k,5], " use_95=", contractor_metric_use_time_95percentile)
  155.                         }
  156.                         # Если полученное из json значение метрики check больше порогового значения, добавляем алерт в массив HOSTSTATUS
  157.                         if (contractor_metric_check_time_95percentile > contractor_metric_max_95percentile) {
  158.                             HOSTSTATUS[k,5] = sprintf("%s%s%d", HOSTSTATUS[k,5], " check_95=", contractor_metric_check_time_95percentile)
  159.                         }
  160.                         # Если полученные из json значения метрик use и check меньше либо равны пороговому значению, добавляем сообщение в массив ALIVESTATUS
  161.                         if (contractor_metric_use_time_95percentile <= contractor_metric_max_95percentile && contractor_metric_check_time_95percentile <= contractor_metric_max_95percentile) {
  162.                             ALIVESTATUS[k,5] = sprintf("%s%s%d%s%d", ALIVESTATUS[k,5], "use_95=", contractor_metric_use_time_95percentile, ",check_95=", contractor_metric_check_time_95percentile)
  163.                         }
  164.                         # Если полученное из json значение совпадает со значением по-умолчанию, значит метрика quotas_prepare_time не была получена
  165.                         if (contractor_metric_quotas_prepare_time == global_fail) {
  166.                             ++contractor_metric_fail
  167.                             if (contractor_metric_fail == 1) {
  168.                                 HOSTSTATUS[k,5] = sprintf("%s%s", HOSTSTATUS[k,5], " metric_fail=q_prepare")
  169.                             } else {
  170.                                 HOSTSTATUS[k,5] = sprintf("%s%s", HOSTSTATUS[k,5], ",q_prepare")
  171.                             }
  172.                         }
  173.                         # Если полученное из json значение метрики quotas_prepare_time больше порогового значения, добавляем алерт в массив HOSTSTATUS
  174.                         if (int(contractor_metric_quotas_prepare_time) > int(contractor_metric_max_prepare_time)) {
  175.                             HOSTSTATUS[k,5] = sprintf("%s%s%d", HOSTSTATUS[k,5], " q_prepare=", contractor_metric_quotas_prepare_time)
  176.                         }
  177.                         # Если полученные из json значения метрики quotas_prepare_time меньше либо равно пороговому значению, добавляем сообщение в массив ALIVESTATUS
  178.                         if (contractor_metric_quotas_prepare_time <= contractor_metric_max_prepare_time) {
  179.                             ALIVESTATUS[k,5] = sprintf("%s%s%d", ALIVESTATUS[k,5], ",q_prepare=", contractor_metric_quotas_prepare_time)
  180.                         }
  181.                         # Если полученное из json значение совпадает со значением по-умолчанию, значит метрика quotas_return_time не была получена
  182.                         if (contractor_metric_quotas_return_time == global_fail) {
  183.                             ++contractor_metric_fail
  184.                             if (contractor_metric_fail == 1) {
  185.                                 HOSTSTATUS[k,5] = sprintf("%s%s", HOSTSTATUS[k,5], " metric_fail=q_return")
  186.                             } else {
  187.                                 HOSTSTATUS[k,5] = sprintf("%s%s", HOSTSTATUS[k,5], ",q_return")
  188.                             }
  189.                         }
  190.                         # Если полученное из json значение метрики quotas_return_time больше порогового значения, добавляем алерт в массив HOSTSTATUS
  191.                         if (int(contractor_metric_quotas_return_time) > int(contractor_metric_max_return_time)) {
  192.                             HOSTSTATUS[k,5] = sprintf("%s%s%d", HOSTSTATUS[k,5], " q_return=", contractor_metric_quotas_return_time)
  193.                         }
  194.                         # Если полученные из json значения метрики quotas_return_time меньше либо равно пороговому значению, добавляем сообщение в массив ALIVESTATUS
  195.                         if (contractor_metric_quotas_return_time <= contractor_metric_max_return_time) {
  196.                             ALIVESTATUS[k,5] = sprintf("%s%s%d", ALIVESTATUS[k,5], ",q_return=", contractor_metric_quotas_return_time)
  197.                         }
  198.                         # Если полученное из json значение совпадает со значением по-умолчанию, значит метрика quotas_corrections_time не была получена
  199.                         if (contractor_metric_quotas_corrections_time == global_fail) {
  200.                             ++contractor_metric_fail
  201.                             if (contractor_metric_fail == 1) {
  202.                                 HOSTSTATUS[k,5] = sprintf("%s%s", HOSTSTATUS[k,5], " metric_fail=q_corrections")
  203.                             } else {
  204.                                 HOSTSTATUS[k,5] = sprintf("%s%s", HOSTSTATUS[k,5], ",q_corrections")
  205.                             }
  206.                         }
  207.                         # Если полученное из json значение метрики quotas_corrections_time больше порогового значения, добавляем алерт в массив HOSTSTATUS
  208.                         if (contractor_metric_quotas_corrections_time > contractor_metric_max_corrections_time) {
  209.                             HOSTSTATUS[k,5] = sprintf("%s%s%d", HOSTSTATUS[k,5], " q_corrections=", contractor_metric_quotas_corrections_time)
  210.                         }
  211.                         # Если полученные из json значения метрики quotas_corrections_time меньше либо равно пороговому значению, добавляем сообщение в массив ALIVESTATUS
  212.                         if (contractor_metric_quotas_corrections_time <= contractor_metric_max_corrections_time) {
  213.                             ALIVESTATUS[k,5] = sprintf("%s%s%d", ALIVESTATUS[k,5], ",q_corrections=", contractor_metric_quotas_corrections_time)
  214.                         }
  215.                         # Если полученное из json значение метрики consul_errors больше contractor_metric_max_consul_errors, добавляем алерт в массив HOSTSTATUS
  216.                         if (contractor_metric_consul_errors > contractor_metric_max_consul_errors) {
  217.                             HOSTSTATUS[k,5] = sprintf("%s%s%d", HOSTSTATUS[k,5], " consul_err=", contractor_metric_consul_errors)
  218.                         }
  219.                     }
  220.                 }
  221.             }
  222.         }
  223.     }
  224. }
  225.  
  226. # Функция получения из json ip адресов нод consul
  227. function GetConsulPeers() {
  228.     split("",CONSULPEER)
  229.     nr_split_text_json = split(text_json,JSON,",")
  230.     if (int(nr_split_text_json)>0) {
  231.         for (j = 1; j <= nr_split_text_json; j++) {
  232.             if(match(JSON[j],/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/)>0 && JSON[j] !~ /185\.49\.145\.122/) {
  233.                 consul_peer = substr(JSON[j],RSTART,RLENGTH)
  234.                 if ((consul_peer in CONSULPEER) == 0) {
  235.                     CONSULPEER[consul_peer]
  236.                 } else {
  237.                     printf ("%s%s%s%s\n", "ERROR: Doublepeer ", consul_peer, " from host ", h) >> file_err
  238.                     close(file_err)
  239.                     exit 1
  240.                 }
  241.             }
  242.         }
  243.     }
  244. }
  245.  
  246. # Функция получения из json метрик use и check сервиса contractor
  247. function GetContractorMetrics() {
  248.     if (match(text_json,/\"use\":\{[^\}]+\}/) > 0) {
  249.         contractor_metric_use = substr(text_json,(RSTART+7),(RLENGTH-8))
  250.         nr_split = split(contractor_metric_use,CMU,",")
  251.         for (cmu = 1; cmu <= nr_split; cmu++) {
  252.             if (match(CMU[cmu],/\"rps\":[0-9\.]+/) > 0) {
  253.                 contractor_metric_use_rps = int(substr(CMU[cmu],(RSTART+6),(RLENGTH-6)))
  254.             }
  255.             if (match(CMU[cmu],/\"time_95percentile\":[0-9\.]+/) > 0) {
  256.                 contractor_metric_use_time_95percentile = int(substr(CMU[cmu],(RSTART+20),(RLENGTH-20)))
  257.             }
  258.         }
  259.         split("",CMU)
  260.     }
  261.     if (match(text_json,/\"check\":\{[^\}]+\}/) > 0) {
  262.         contractor_metric_check = substr(text_json,(RSTART+9),(RLENGTH-10))
  263.         nr_split = split(contractor_metric_check,CMC,",")
  264.         for (cmc = 1; cmc <= nr_split; cmc++) {
  265.             if (match(CMC[cmc],/\"rps\":[0-9\.]+/) > 0) {
  266.                 contractor_metric_check_rps = int(substr(CMC[cmc],(RSTART+6),(RLENGTH-6)))
  267.             }
  268.             if (match(CMC[cmc],/\"time_95percentile\":[0-9\.]+/) > 0) {
  269.                 contractor_metric_check_time_95percentile = int(substr(CMC[cmc],(RSTART+20),(RLENGTH-20)))
  270.             }
  271.         }
  272.         split("",CMC)
  273.     }
  274.     if (match(text_json,/\"quotas\":\{[\{\}\"\,\.:a-z,0-9]+\}\,/) > 0) {
  275.         text_contractor_metric_quotas = substr(text_json,(RSTART+10),(RLENGTH-11))
  276.     }  
  277.     if (match(text_contractor_metric_quotas,/\"prepare\":\{[^\}]+\}/) > 0) {
  278.         contractor_metric_quotas_prepare_time = substr(text_contractor_metric_quotas,(RSTART+11),(RLENGTH-12))
  279.         nr_split = split(contractor_metric_quotas_prepare_time,CMQP,",")
  280.         for (cmqp = 1; cmqp <= nr_split; cmqp++) {
  281.             if (match(CMQP[cmqp],/\"time\":[0-9\.]+/) > 0) {
  282.                 contractor_metric_quotas_prepare_time = int(substr(CMQP[cmqp],(RSTART+7),(RLENGTH-7)))
  283.             }
  284.         }
  285.         split("",CMQP)
  286.     }
  287.     if (match(text_contractor_metric_quotas,/\"return\":\{[^\}]+\}/) > 0) {
  288.         contractor_metric_quotas_return_time = substr(text_contractor_metric_quotas,(RSTART+10),(RLENGTH-11))
  289.         nr_split = split(contractor_metric_quotas_return_time,CMQR,",")
  290.         for (cmqr = 1; cmqr <= nr_split; cmqr++) {
  291.             if (match(CMQR[cmqr],/\"time\":[0-9\.]+/) > 0) {
  292.                 contractor_metric_quotas_return_time = int(substr(CMQR[cmqr],(RSTART+7),(RLENGTH-7)))
  293.             }
  294.         }
  295.         split("",CMQR)
  296.     }
  297.     if (match(text_contractor_metric_quotas,/\"corrections\":\{[^\}]+\}/) > 0) {
  298.         contractor_metric_quotas_corrections_time = substr(text_contractor_metric_quotas,(RSTART+15),(RLENGTH-16))
  299.         nr_split = split(contractor_metric_quotas_corrections_time,CMQC,",")
  300.         for (cmqc = 1; cmqc <= nr_split; cmqc++) {
  301.             if (match(CMQC[cmqc],/\"time\":[0-9\.]+/) > 0) {
  302.                 contractor_metric_quotas_corrections_time = int(substr(CMQC[cmqc],(RSTART+7),(RLENGTH-7)))
  303.             }
  304.         }
  305.         split("",CMQC)
  306.     }
  307.     if (match(text_json,/\"consul\":\{[^\}]+\}/) > 0) {
  308.         contractor_metric_consul = substr(text_json,(RSTART+10),(RLENGTH-11))
  309.         nr_split = split(contractor_metric_consul,CMCL,",")
  310.         for (cmcl = 1; cmcl <= nr_split; cmcl++) {
  311.             if (match(CMCL[cmcl],/\"errors\":[0-9\.]+/) > 0) {
  312.                 contractor_metric_consul_errors = int(substr(CMCL[cmcl],(RSTART+9),(RLENGTH-9)))
  313.             }
  314.         }
  315.         split("",CMCL)
  316.     }
  317. }
  318.  
  319. END {
  320.     file_err = "/dev/stderr"
  321.     which = "/usr/bin/which"
  322.  
  323.     if (ARGC != 2) {
  324.         printf ("\n\t%s\n\n", "Usage: ./this.awk { run | testrun }") >> file_err
  325.         close(file_err)
  326.         exit 1
  327.     } else {
  328.         if (ARGV[1] !~ /^(run|testrun)$/) {
  329.             printf ("\n\t%s\n\n", "Wrong ip_addr. Usage: ./this.awk { run | testrun }") >> file_err
  330.             close(file_err)
  331.             exit 1
  332.         } else {
  333.             # Выполняем which, получаем значение полного пути до host
  334.             cmd_which_host = (which" host 2>/dev/null")
  335.             cmd_which_host | getline bin_host
  336.             close(cmd_which_host)
  337.             if (length(bin_host) < 5) {
  338.                 printf ("%s\n", "ERROR: No host") >> file_err
  339.                 close(file_err)
  340.                 exit 1
  341.             }
  342.             # Для заданных в массиве HOST хостов получаем ip утилитой host
  343.             for (h in HOST) {
  344.                 ++counter_arghost
  345.                 cmd_host_arghost = (bin_host" -tA -W3 "h" 2>/dev/null")
  346.                 cmd_host_arghost | getline arghost
  347.                 close(cmd_host_arghost)
  348.                 if (ARGV[1] == "testrun") {
  349.                     printf("%s%s\n", "#T: ", cmd_host_arghost)
  350.                 }
  351.                 # Если ip получен, добавляем его в массив IPHOST
  352.                 if (split(arghost,T) == 4 && T[1] == h && T[2] == "has" && T[3] == "address" && T[4] ~ /^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/) {
  353.                     HOST[h] = sprintf("%s%s%s%s%s", "-H \"Host: ", h, "\" ", dst_schema, T[4])
  354.                     IPHOST[h] = T[4]
  355.                 # Если ip не получен, ругаемся и выходим в Warning
  356.                 } else {
  357.                     printf("%s%s\n", "Unable to resolve ", h)
  358.                     close(file_err)
  359.                     exit 1
  360.                 }
  361.                 split("",T)
  362.             }
  363.         }
  364.     }
  365.  
  366.     # Выполняем which, получаем значение полного пути до curl
  367.     cmd_which_curl = (which" curl 2>/dev/null")
  368.     cmd_which_curl | getline bin_curl
  369.     close(cmd_which_curl)
  370.     if (length(bin_curl) < 5) {
  371.         printf ("%s\n", "ERROR: No curl") >> file_err
  372.         close(file_err)
  373.         exit 1
  374.     }
  375.  
  376.     # Выполняем запрос к хостам, тип проверки - consul
  377.     for (h in HOST) {
  378.         check_type = "consul"
  379.         dst_url = dst_url_consul_status_peers
  380.         CurlGetResponse()
  381.     }
  382.  
  383.     # Если счетчик counter_host нулевой и это не тест, ругаемся и выходим в Warning
  384.     if (int(counter_host) == 0 && ARGV[1] != "testrun") {
  385.         printf ("%s\n", "ERROR: consul_counter_host=0") >> file_err
  386.         close(file_err)
  387.         exit 1
  388.     }
  389.    
  390.     # Выполняем запрос к хостам, тип проверки - contractor
  391.     for (h in HOST) {
  392.         check_type = "contractor"
  393.         dst_url = dst_url_contractor_metrics
  394.         CurlGetResponse()
  395.     }
  396.  
  397.     is_fail = 0
  398.     is_alive = 0
  399.     # Пробежка по массиву HOSTSTATUS, поиск ненулевых ответов, формирование alert_msg
  400.     for (i = 1; i <= counter_host; i++) {
  401.         # Проверяем статус (код) проверки подключения к сервису consul
  402.         if (HOSTSTATUS[i,2] != 0) {
  403.             ++is_fail
  404.             if (is_fail == 1) {
  405.                 alert_msg = sprintf("%s%s%d", HOSTSTATUS[i,1], "_consul=", HOSTSTATUS[i,2])
  406.             } else {
  407.                 alert_msg = sprintf("%s%s%s%s%d", alert_msg, " ", HOSTSTATUS[i,1], "_consul=", HOSTSTATUS[i,2])
  408.             }
  409.         # Проверяем статус (код) проверки подключения к сервису contractor
  410.         } else if (HOSTSTATUS[i,4] != 0) {
  411.             ++is_fail
  412.             if (is_fail == 1) {
  413.                 alert_msg = sprintf("%s%s%d", HOSTSTATUS[i,1], "_contractor=", HOSTSTATUS[i,4])
  414.             } else {
  415.                 alert_msg = sprintf("%s%s%s%s%d", alert_msg, " ", HOSTSTATUS[i,1], "_contractor=", HOSTSTATUS[i,4])
  416.             }
  417.         # Если статус проверки сервиса consul равен нулю (успешно проведенный сеанс связи)
  418.         } else if (HOSTSTATUS[i,2] == 0) {
  419.             # Но длина статуса сообщения, полученного в результате проверки consul не равно нулю (имеем alert)
  420.             if (length(HOSTSTATUS[i,3]) != 0) {
  421.                 # Накручиваем счетчик is_fail и формируем alert_msg
  422.                 ++is_fail
  423.                 if (is_fail == 1) {
  424.                     alert_msg = sprintf("%s%s%s", HOSTSTATUS[i,1], "_consul:", HOSTSTATUS[i,3])
  425.                 } else {
  426.                     alert_msg = sprintf("%s%s%s%s%s", alert_msg, " ", HOSTSTATUS[i,1], "_consul:", HOSTSTATUS[i,3])
  427.                 }
  428.             # Если с сервисом consul все в порядке
  429.             } else {
  430.                 # И статус проверки сервиса contractor равен нулю (успешно проведенный сеанс связи)
  431.                 if (HOSTSTATUS[i,4] == 0) {
  432.                     # Но длина статуса сообщения, полученного в результате проверки contractor не равно нулю (имеем alert)
  433.                     if (length(HOSTSTATUS[i,5]) != 0) {
  434.                         # Накручиваем счетчик is_fail и формируем alert_msg
  435.                         ++is_fail
  436.                         if (is_fail == 1) {
  437.                             alert_msg = sprintf("%s%s%s", HOSTSTATUS[i,1], "_contractor:", HOSTSTATUS[i,5])
  438.                         } else {
  439.                             alert_msg = sprintf("%s%s%s%s%s", alert_msg, " ", HOSTSTATUS[i,1], "_contractor:", HOSTSTATUS[i,5])
  440.                         }
  441.                     # Иначе формируем alive_msg
  442.                     } else {
  443.                         ++is_alive
  444.                         if (is_alive == 1) {
  445.                             alive_msg = sprintf("%s%s%s", ALIVESTATUS[i,1], "_contractor:", ALIVESTATUS[i,5])
  446.                         } else {
  447.                             alive_msg = sprintf("%s%s%s%s%s", alive_msg, " ", ALIVESTATUS[i,1], "_contractor:", ALIVESTATUS[i,5])
  448.                         }
  449.                     }
  450.                 }
  451.             }
  452.         }
  453.     }
  454.  
  455.     # Если был ненулевой ответ, печатаем алерт и выходим с двойкой
  456.     if (is_fail > 0) {
  457.         printf("%s\n", alert_msg)
  458.         close(file_err)
  459.         exit 2
  460.     # Иначе печатаем alive_msg
  461.     } else {
  462.         printf("%s\n", alive_msg)
  463.         close(file_err)
  464.     }
  465. }
  466.  
  467. # Ver: 0.7
  468. #
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement