Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/awk -f
- BEGIN {
- # Массив FQDN, которые будем опрашивать
- HOST["1consul01.rtty.in"]
- HOST["1consul02.rtty.in"]
- HOST["1consul03.rtty.in"]
- global_fail = 100000000
- contractor_metric_min_rps = 100
- contractor_metric_max_95percentile = 40
- contractor_metric_max_prepare_time = 750000
- contractor_metric_max_return_time = 900000
- contractor_metric_max_corrections_time = 300000
- contractor_metric_max_consul_errors = 5
- # Что именно будем запрашивать у хостов
- dst_schema = "http://"
- dst_url_consul_status_peers = ":8500/v1/status/peers"
- dst_url_contractor_metrics = ":8080/metrics"
- # Как именно будем запрашивать у хостов
- arg_curl = " --connect-timeout 3 --max-time 6 -s -v -X GET "
- exit
- }
- # Функция выполнения запроса к хосту, формирование массива HOSTSTATUS
- function CurlGetResponse() {
- is_fail = 1
- text_json = ""
- cmd_curl = sprintf("%s%s%s%s%s", bin_curl, arg_curl, HOST[h], dst_url, " 2>&1")
- if (ARGV[1] == "testrun") {
- printf("%s%s\n", "#T: ", cmd_curl)
- } else {
- while ((cmd_curl | getline line_in) > 0) {
- # Зачищаем говно которое может отдать curl
- gsub(/\r/,"",line_in)
- if (split(line_in,T) > 0) {
- if (T[1] == "<") {
- if (T[2] == "HTTP/1.1") {
- # Фиксируем коды ответов удаленного http сервера
- if (T[3] != 200) {
- is_fail = T[3]
- } else {
- is_fail = 0
- }
- }
- # Строчки не подлежащие анализу
- } else if (T[1] == ">" || T[1] == "*" || line_in ~ /\[[0-9]+ bytes data\]/ || line_in ~ /\{ \[data not shown\]/){
- continue
- # Остается тело ответа.
- } else {
- text_json = line_in
- # Работаем с данными ноды кластера consul
- if (check_type == "consul") {
- HOSTSTATUS[++counter_host,1] = h
- ALIVESTATUS[counter_host,1] = h
- HOSTSTATUS[counter_host,2] = is_fail
- # Вызываем функцию получения из json ip адресов нод consul
- GetConsulPeers()
- # Если количество ip полученных из json равно количеству хостов в начальной конфигурации
- # if (nr_split_text_json == counter_arghost) {
- not_in_peer_list = 0
- # Сверяем полученные из json ip адреса с ip адресами хостов начальной конфигурации
- for (arghost in IPHOST) {
- # Если ip адрес хоста начальной конфигурации не найден в массиве CONSULPEER
- if ((IPHOST[arghost] in CONSULPEER) == 0) {
- # Инкрементируем счетчик not_in_peer_list и пишем alert в массив HOSTSTATUS
- ++not_in_peer_list
- if (not_in_peer_list == 1) {
- HOSTSTATUS[counter_host,3] = sprintf("%s%s%s", HOSTSTATUS[counter_host,3], " not_in_peer_list=", IPHOST[arghost])
- } else {
- HOSTSTATUS[counter_host,3] = sprintf("%s%s%s", HOSTSTATUS[counter_host,3], ",", IPHOST[arghost])
- }
- }
- }
- # # Если количество ip полученных из json не равно количеству хостов в начальной конфигурации, печатаем диагрностику
- # } else {
- # 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)
- # }
- # Работаем с данными инстанса contractor
- } else if (check_type == "contractor" && is_fail == 0) {
- # Объявляем для очередного хоста умолчальные переменные.
- contractor_metric_fail = 0
- contractor_metric_use_time_95percentile = global_fail
- contractor_metric_check_time_95percentile = global_fail
- contractor_metric_quotas_prepare_time = global_fail
- contractor_metric_quotas_return_time = global_fail
- contractor_metric_quotas_corrections_time = global_fail
- # Вызываем функцию получения из json проверяемых ниже значений
- GetContractorMetrics()
- }
- }
- }
- split("",T)
- }
- close(cmd_curl)
- # Работаем с данными инстанса contractor
- if (check_type == "contractor") {
- # Методом перебора находим в массиве HOSTSTATUS номер проверяемого хоста
- for(k = 1; k <= counter_host; k++) {
- if (HOSTSTATUS[k,1] == h) {
- ALIVESTATUS[k,1] = h
- # Вот тут присваиваем текущее значение (переменная is_fail) статуса отработки вызова curl
- HOSTSTATUS[k,4] = is_fail
- if (is_fail == 0) {
- # Если полученное из json значение совпадает со значением по-умолчанию, значит метрика use_rps не была получена
- if (contractor_metric_use_rps == global_fail) {
- ++contractor_metric_fail
- if (contractor_metric_fail == 1) {
- HOSTSTATUS[k,5] = sprintf("%s%s", HOSTSTATUS[k,5], " metric_fail=use_rps")
- } else {
- HOSTSTATUS[k,5] = sprintf("%s%s", HOSTSTATUS[k,5], ",use_rps")
- }
- }
- # Если полученное из json значение метрики use_rps меньше нижнего порогового значения, добавляем алерт в массив HOSTSTATUS
- if (contractor_metric_use_rps < contractor_metric_min_rps) {
- HOSTSTATUS[k,5] = sprintf("%s%s%d", HOSTSTATUS[k,5], " use_rps=", contractor_metric_use_rps)
- }
- # Если полученное из json значение совпадает со значением по-умолчанию, значит метрика use не была получена
- if (contractor_metric_use_time_95percentile == global_fail) {
- ++contractor_metric_fail
- if (contractor_metric_fail == 1) {
- HOSTSTATUS[k,5] = sprintf("%s%s", HOSTSTATUS[k,5], " metric_fail=use_time_95")
- } else {
- HOSTSTATUS[k,5] = sprintf("%s%s", HOSTSTATUS[k,5], ",use_time_95")
- }
- }
- # Если полученное из json значение совпадает со значением по-умолчанию, значит метрика check_rps не была получена
- if (contractor_metric_check_rps == global_fail) {
- ++contractor_metric_fail
- if (contractor_metric_fail == 1) {
- HOSTSTATUS[k,5] = sprintf("%s%s", HOSTSTATUS[k,5], " metric_fail=check_rps")
- } else {
- HOSTSTATUS[k,5] = sprintf("%s%s", HOSTSTATUS[k,5], ",check_rps")
- }
- }
- # Если полученное из json значение метрики use_rps меньше нижнего порогового значения, добавляем алерт в массив HOSTSTATUS
- if (contractor_metric_check_rps < contractor_metric_min_rps) {
- HOSTSTATUS[k,5] = sprintf("%s%s%d", HOSTSTATUS[k,5], " check_rps=", contractor_metric_check_rps)
- }
- # Если полученное из json значение совпадает со значением по-умолчанию, значит метрика check не была получена
- if (contractor_metric_check_time_95percentile == global_fail) {
- ++contractor_metric_fail
- if (contractor_metric_fail == 1) {
- HOSTSTATUS[k,5] = sprintf("%s%s", HOSTSTATUS[k,5], " metric_fail=check_95")
- } else {
- HOSTSTATUS[k,5] = sprintf("%s%s", HOSTSTATUS[k,5], ",check_95")
- }
- }
- # Если полученное из json значение метрики use больше порогового значения, добавляем алерт в массив HOSTSTATUS
- if (contractor_metric_use_time_95percentile > contractor_metric_max_95percentile) {
- HOSTSTATUS[k,5] = sprintf("%s%s%d", HOSTSTATUS[k,5], " use_95=", contractor_metric_use_time_95percentile)
- }
- # Если полученное из json значение метрики check больше порогового значения, добавляем алерт в массив HOSTSTATUS
- if (contractor_metric_check_time_95percentile > contractor_metric_max_95percentile) {
- HOSTSTATUS[k,5] = sprintf("%s%s%d", HOSTSTATUS[k,5], " check_95=", contractor_metric_check_time_95percentile)
- }
- # Если полученные из json значения метрик use и check меньше либо равны пороговому значению, добавляем сообщение в массив ALIVESTATUS
- if (contractor_metric_use_time_95percentile <= contractor_metric_max_95percentile && contractor_metric_check_time_95percentile <= contractor_metric_max_95percentile) {
- 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)
- }
- # Если полученное из json значение совпадает со значением по-умолчанию, значит метрика quotas_prepare_time не была получена
- if (contractor_metric_quotas_prepare_time == global_fail) {
- ++contractor_metric_fail
- if (contractor_metric_fail == 1) {
- HOSTSTATUS[k,5] = sprintf("%s%s", HOSTSTATUS[k,5], " metric_fail=q_prepare")
- } else {
- HOSTSTATUS[k,5] = sprintf("%s%s", HOSTSTATUS[k,5], ",q_prepare")
- }
- }
- # Если полученное из json значение метрики quotas_prepare_time больше порогового значения, добавляем алерт в массив HOSTSTATUS
- if (int(contractor_metric_quotas_prepare_time) > int(contractor_metric_max_prepare_time)) {
- HOSTSTATUS[k,5] = sprintf("%s%s%d", HOSTSTATUS[k,5], " q_prepare=", contractor_metric_quotas_prepare_time)
- }
- # Если полученные из json значения метрики quotas_prepare_time меньше либо равно пороговому значению, добавляем сообщение в массив ALIVESTATUS
- if (contractor_metric_quotas_prepare_time <= contractor_metric_max_prepare_time) {
- ALIVESTATUS[k,5] = sprintf("%s%s%d", ALIVESTATUS[k,5], ",q_prepare=", contractor_metric_quotas_prepare_time)
- }
- # Если полученное из json значение совпадает со значением по-умолчанию, значит метрика quotas_return_time не была получена
- if (contractor_metric_quotas_return_time == global_fail) {
- ++contractor_metric_fail
- if (contractor_metric_fail == 1) {
- HOSTSTATUS[k,5] = sprintf("%s%s", HOSTSTATUS[k,5], " metric_fail=q_return")
- } else {
- HOSTSTATUS[k,5] = sprintf("%s%s", HOSTSTATUS[k,5], ",q_return")
- }
- }
- # Если полученное из json значение метрики quotas_return_time больше порогового значения, добавляем алерт в массив HOSTSTATUS
- if (int(contractor_metric_quotas_return_time) > int(contractor_metric_max_return_time)) {
- HOSTSTATUS[k,5] = sprintf("%s%s%d", HOSTSTATUS[k,5], " q_return=", contractor_metric_quotas_return_time)
- }
- # Если полученные из json значения метрики quotas_return_time меньше либо равно пороговому значению, добавляем сообщение в массив ALIVESTATUS
- if (contractor_metric_quotas_return_time <= contractor_metric_max_return_time) {
- ALIVESTATUS[k,5] = sprintf("%s%s%d", ALIVESTATUS[k,5], ",q_return=", contractor_metric_quotas_return_time)
- }
- # Если полученное из json значение совпадает со значением по-умолчанию, значит метрика quotas_corrections_time не была получена
- if (contractor_metric_quotas_corrections_time == global_fail) {
- ++contractor_metric_fail
- if (contractor_metric_fail == 1) {
- HOSTSTATUS[k,5] = sprintf("%s%s", HOSTSTATUS[k,5], " metric_fail=q_corrections")
- } else {
- HOSTSTATUS[k,5] = sprintf("%s%s", HOSTSTATUS[k,5], ",q_corrections")
- }
- }
- # Если полученное из json значение метрики quotas_corrections_time больше порогового значения, добавляем алерт в массив HOSTSTATUS
- if (contractor_metric_quotas_corrections_time > contractor_metric_max_corrections_time) {
- HOSTSTATUS[k,5] = sprintf("%s%s%d", HOSTSTATUS[k,5], " q_corrections=", contractor_metric_quotas_corrections_time)
- }
- # Если полученные из json значения метрики quotas_corrections_time меньше либо равно пороговому значению, добавляем сообщение в массив ALIVESTATUS
- if (contractor_metric_quotas_corrections_time <= contractor_metric_max_corrections_time) {
- ALIVESTATUS[k,5] = sprintf("%s%s%d", ALIVESTATUS[k,5], ",q_corrections=", contractor_metric_quotas_corrections_time)
- }
- # Если полученное из json значение метрики consul_errors больше contractor_metric_max_consul_errors, добавляем алерт в массив HOSTSTATUS
- if (contractor_metric_consul_errors > contractor_metric_max_consul_errors) {
- HOSTSTATUS[k,5] = sprintf("%s%s%d", HOSTSTATUS[k,5], " consul_err=", contractor_metric_consul_errors)
- }
- }
- }
- }
- }
- }
- }
- # Функция получения из json ip адресов нод consul
- function GetConsulPeers() {
- split("",CONSULPEER)
- nr_split_text_json = split(text_json,JSON,",")
- if (int(nr_split_text_json)>0) {
- for (j = 1; j <= nr_split_text_json; j++) {
- if(match(JSON[j],/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/)>0 && JSON[j] !~ /185\.49\.145\.122/) {
- consul_peer = substr(JSON[j],RSTART,RLENGTH)
- if ((consul_peer in CONSULPEER) == 0) {
- CONSULPEER[consul_peer]
- } else {
- printf ("%s%s%s%s\n", "ERROR: Doublepeer ", consul_peer, " from host ", h) >> file_err
- close(file_err)
- exit 1
- }
- }
- }
- }
- }
- # Функция получения из json метрик use и check сервиса contractor
- function GetContractorMetrics() {
- if (match(text_json,/\"use\":\{[^\}]+\}/) > 0) {
- contractor_metric_use = substr(text_json,(RSTART+7),(RLENGTH-8))
- nr_split = split(contractor_metric_use,CMU,",")
- for (cmu = 1; cmu <= nr_split; cmu++) {
- if (match(CMU[cmu],/\"rps\":[0-9\.]+/) > 0) {
- contractor_metric_use_rps = int(substr(CMU[cmu],(RSTART+6),(RLENGTH-6)))
- }
- if (match(CMU[cmu],/\"time_95percentile\":[0-9\.]+/) > 0) {
- contractor_metric_use_time_95percentile = int(substr(CMU[cmu],(RSTART+20),(RLENGTH-20)))
- }
- }
- split("",CMU)
- }
- if (match(text_json,/\"check\":\{[^\}]+\}/) > 0) {
- contractor_metric_check = substr(text_json,(RSTART+9),(RLENGTH-10))
- nr_split = split(contractor_metric_check,CMC,",")
- for (cmc = 1; cmc <= nr_split; cmc++) {
- if (match(CMC[cmc],/\"rps\":[0-9\.]+/) > 0) {
- contractor_metric_check_rps = int(substr(CMC[cmc],(RSTART+6),(RLENGTH-6)))
- }
- if (match(CMC[cmc],/\"time_95percentile\":[0-9\.]+/) > 0) {
- contractor_metric_check_time_95percentile = int(substr(CMC[cmc],(RSTART+20),(RLENGTH-20)))
- }
- }
- split("",CMC)
- }
- if (match(text_json,/\"quotas\":\{[\{\}\"\,\.:a-z,0-9]+\}\,/) > 0) {
- text_contractor_metric_quotas = substr(text_json,(RSTART+10),(RLENGTH-11))
- }
- if (match(text_contractor_metric_quotas,/\"prepare\":\{[^\}]+\}/) > 0) {
- contractor_metric_quotas_prepare_time = substr(text_contractor_metric_quotas,(RSTART+11),(RLENGTH-12))
- nr_split = split(contractor_metric_quotas_prepare_time,CMQP,",")
- for (cmqp = 1; cmqp <= nr_split; cmqp++) {
- if (match(CMQP[cmqp],/\"time\":[0-9\.]+/) > 0) {
- contractor_metric_quotas_prepare_time = int(substr(CMQP[cmqp],(RSTART+7),(RLENGTH-7)))
- }
- }
- split("",CMQP)
- }
- if (match(text_contractor_metric_quotas,/\"return\":\{[^\}]+\}/) > 0) {
- contractor_metric_quotas_return_time = substr(text_contractor_metric_quotas,(RSTART+10),(RLENGTH-11))
- nr_split = split(contractor_metric_quotas_return_time,CMQR,",")
- for (cmqr = 1; cmqr <= nr_split; cmqr++) {
- if (match(CMQR[cmqr],/\"time\":[0-9\.]+/) > 0) {
- contractor_metric_quotas_return_time = int(substr(CMQR[cmqr],(RSTART+7),(RLENGTH-7)))
- }
- }
- split("",CMQR)
- }
- if (match(text_contractor_metric_quotas,/\"corrections\":\{[^\}]+\}/) > 0) {
- contractor_metric_quotas_corrections_time = substr(text_contractor_metric_quotas,(RSTART+15),(RLENGTH-16))
- nr_split = split(contractor_metric_quotas_corrections_time,CMQC,",")
- for (cmqc = 1; cmqc <= nr_split; cmqc++) {
- if (match(CMQC[cmqc],/\"time\":[0-9\.]+/) > 0) {
- contractor_metric_quotas_corrections_time = int(substr(CMQC[cmqc],(RSTART+7),(RLENGTH-7)))
- }
- }
- split("",CMQC)
- }
- if (match(text_json,/\"consul\":\{[^\}]+\}/) > 0) {
- contractor_metric_consul = substr(text_json,(RSTART+10),(RLENGTH-11))
- nr_split = split(contractor_metric_consul,CMCL,",")
- for (cmcl = 1; cmcl <= nr_split; cmcl++) {
- if (match(CMCL[cmcl],/\"errors\":[0-9\.]+/) > 0) {
- contractor_metric_consul_errors = int(substr(CMCL[cmcl],(RSTART+9),(RLENGTH-9)))
- }
- }
- split("",CMCL)
- }
- }
- END {
- file_err = "/dev/stderr"
- which = "/usr/bin/which"
- if (ARGC != 2) {
- printf ("\n\t%s\n\n", "Usage: ./this.awk { run | testrun }") >> file_err
- close(file_err)
- exit 1
- } else {
- if (ARGV[1] !~ /^(run|testrun)$/) {
- printf ("\n\t%s\n\n", "Wrong ip_addr. Usage: ./this.awk { run | testrun }") >> file_err
- close(file_err)
- exit 1
- } else {
- # Выполняем which, получаем значение полного пути до host
- cmd_which_host = (which" host 2>/dev/null")
- cmd_which_host | getline bin_host
- close(cmd_which_host)
- if (length(bin_host) < 5) {
- printf ("%s\n", "ERROR: No host") >> file_err
- close(file_err)
- exit 1
- }
- # Для заданных в массиве HOST хостов получаем ip утилитой host
- for (h in HOST) {
- ++counter_arghost
- cmd_host_arghost = (bin_host" -tA -W3 "h" 2>/dev/null")
- cmd_host_arghost | getline arghost
- close(cmd_host_arghost)
- if (ARGV[1] == "testrun") {
- printf("%s%s\n", "#T: ", cmd_host_arghost)
- }
- # Если ip получен, добавляем его в массив IPHOST
- if (split(arghost,T) == 4 && T[1] == h && T[2] == "has" && T[3] == "address" && T[4] ~ /^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/) {
- HOST[h] = sprintf("%s%s%s%s%s", "-H \"Host: ", h, "\" ", dst_schema, T[4])
- IPHOST[h] = T[4]
- # Если ip не получен, ругаемся и выходим в Warning
- } else {
- printf("%s%s\n", "Unable to resolve ", h)
- close(file_err)
- exit 1
- }
- split("",T)
- }
- }
- }
- # Выполняем which, получаем значение полного пути до curl
- cmd_which_curl = (which" curl 2>/dev/null")
- cmd_which_curl | getline bin_curl
- close(cmd_which_curl)
- if (length(bin_curl) < 5) {
- printf ("%s\n", "ERROR: No curl") >> file_err
- close(file_err)
- exit 1
- }
- # Выполняем запрос к хостам, тип проверки - consul
- for (h in HOST) {
- check_type = "consul"
- dst_url = dst_url_consul_status_peers
- CurlGetResponse()
- }
- # Если счетчик counter_host нулевой и это не тест, ругаемся и выходим в Warning
- if (int(counter_host) == 0 && ARGV[1] != "testrun") {
- printf ("%s\n", "ERROR: consul_counter_host=0") >> file_err
- close(file_err)
- exit 1
- }
- # Выполняем запрос к хостам, тип проверки - contractor
- for (h in HOST) {
- check_type = "contractor"
- dst_url = dst_url_contractor_metrics
- CurlGetResponse()
- }
- is_fail = 0
- is_alive = 0
- # Пробежка по массиву HOSTSTATUS, поиск ненулевых ответов, формирование alert_msg
- for (i = 1; i <= counter_host; i++) {
- # Проверяем статус (код) проверки подключения к сервису consul
- if (HOSTSTATUS[i,2] != 0) {
- ++is_fail
- if (is_fail == 1) {
- alert_msg = sprintf("%s%s%d", HOSTSTATUS[i,1], "_consul=", HOSTSTATUS[i,2])
- } else {
- alert_msg = sprintf("%s%s%s%s%d", alert_msg, " ", HOSTSTATUS[i,1], "_consul=", HOSTSTATUS[i,2])
- }
- # Проверяем статус (код) проверки подключения к сервису contractor
- } else if (HOSTSTATUS[i,4] != 0) {
- ++is_fail
- if (is_fail == 1) {
- alert_msg = sprintf("%s%s%d", HOSTSTATUS[i,1], "_contractor=", HOSTSTATUS[i,4])
- } else {
- alert_msg = sprintf("%s%s%s%s%d", alert_msg, " ", HOSTSTATUS[i,1], "_contractor=", HOSTSTATUS[i,4])
- }
- # Если статус проверки сервиса consul равен нулю (успешно проведенный сеанс связи)
- } else if (HOSTSTATUS[i,2] == 0) {
- # Но длина статуса сообщения, полученного в результате проверки consul не равно нулю (имеем alert)
- if (length(HOSTSTATUS[i,3]) != 0) {
- # Накручиваем счетчик is_fail и формируем alert_msg
- ++is_fail
- if (is_fail == 1) {
- alert_msg = sprintf("%s%s%s", HOSTSTATUS[i,1], "_consul:", HOSTSTATUS[i,3])
- } else {
- alert_msg = sprintf("%s%s%s%s%s", alert_msg, " ", HOSTSTATUS[i,1], "_consul:", HOSTSTATUS[i,3])
- }
- # Если с сервисом consul все в порядке
- } else {
- # И статус проверки сервиса contractor равен нулю (успешно проведенный сеанс связи)
- if (HOSTSTATUS[i,4] == 0) {
- # Но длина статуса сообщения, полученного в результате проверки contractor не равно нулю (имеем alert)
- if (length(HOSTSTATUS[i,5]) != 0) {
- # Накручиваем счетчик is_fail и формируем alert_msg
- ++is_fail
- if (is_fail == 1) {
- alert_msg = sprintf("%s%s%s", HOSTSTATUS[i,1], "_contractor:", HOSTSTATUS[i,5])
- } else {
- alert_msg = sprintf("%s%s%s%s%s", alert_msg, " ", HOSTSTATUS[i,1], "_contractor:", HOSTSTATUS[i,5])
- }
- # Иначе формируем alive_msg
- } else {
- ++is_alive
- if (is_alive == 1) {
- alive_msg = sprintf("%s%s%s", ALIVESTATUS[i,1], "_contractor:", ALIVESTATUS[i,5])
- } else {
- alive_msg = sprintf("%s%s%s%s%s", alive_msg, " ", ALIVESTATUS[i,1], "_contractor:", ALIVESTATUS[i,5])
- }
- }
- }
- }
- }
- }
- # Если был ненулевой ответ, печатаем алерт и выходим с двойкой
- if (is_fail > 0) {
- printf("%s\n", alert_msg)
- close(file_err)
- exit 2
- # Иначе печатаем alive_msg
- } else {
- printf("%s\n", alive_msg)
- close(file_err)
- }
- }
- # Ver: 0.7
- #
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement