1. 程式人生 > >Zabbix監控Elastalert

Zabbix監控Elastalert

Zabbix監控Elastalert

前言

現平臺已大量使用Elastalert作為ELK日誌告警器,上週出現某個index告警查詢異常;導致無法正常告警,在還沒計劃好構建高可用方案前,先確保能夠第一時間知道Elastalert狀態是否正常。

方案

Elastalert配置檔案中writeback_index回寫的index,查詢同時,向ES的index記錄狀態,會生成index_silence index_error index_status

  • index_error記錄錯誤資訊.
  • index_status記錄狀態資訊.

在檢視狀態資訊記錄的時候,發現與Elastalert

告警查詢異常時間吻合,所以我們只需要用Zabbix監控該index就OK.

實施

查詢十五分鐘內的資料,生成自發現字典格式

由於我的rulename都是由字元與空格組成,所以替換成``號.

get_rules(){
    get_scroll=$(curl -s -XPOST "${ES_HOST}:${ES_PORT}/${INDEX}/_search?size=1000&_source=rule_name" \
        -H 'Content-Type: application/json' -d '
{
    "query" : {
        "match_all" : {}
    }
}')
    result=$(echo $get_scroll |grep -oP "(?<=rule_name\"\:)\"[^\"]*\""|sort|uniq|sed 's/"//g'|sed 's/ /_/g'|tr '\n' '|')  
    data=(${result//|/ })
    length=${#data[@]}
    printf "{\n"
    printf  '\t'"\"data\":["
    for ((i=0;i<$length;i++))
    do
        item=${data[$i]}
        printf '\n\t\t{'
        printf "\"{#RULE_NAME}\":\"${item}\"}"
        if [ $i -lt $[$length-1] ];then
            printf ','
        fi
    done
    printf  "\n\t]\n"
    printf "}\n"
    exit 0 
}

查詢某個index的狀態

get_status(){
    local rule=${1//_/ }
    query=$(cat << EOF
{
  "query" : {
    "bool": {
      "must": [
        {"match" : {"rule_name": "${rule}"}},
        {"range" : {"@timestamp":{"gte":"now-15m"}}}
      ]
    }
   }
} 
EOF
)
    get_data=$(curl -s -XPOST  "${ES_HOST}:${ES_PORT}/${INDEX}/_search?size=1" \
        -H 'Content-Type: application/json' -d "${query}")
    result=$(echo $get_data |grep -oP "(?<=rule_name\"\:)\"[^\"]*\"")
    echo "${rule}" |grep -qw "${result//\"/}" && echo 0 || echo 1
    exit 0
}

後記

指令碼傳送門