應用指標數據采集並錄入Elasticsearch倉庫 - 運維筆記


 

為了進行數字化IT治理,需要對一些應用進程相關指標進行采集並入庫。收集到的應用指標數據最好要進行ES入倉,入到Kafka里面,並通過Kibana可視化展示。

下面是應用指標數據進行ES入倉的請求說明

測試區接口說明:
訪問鏈接:http://192.168.10.10:10222/haha/heiheiAPI/test_1_kafka
請求header:Content-Type:application/json
請求方法:POST
請求參數,token中填入示例中的128位token即可,data的值是一個數組,數組中的每個元素是一個json對象(對應會插入ES中的1個document),給出具體信息:
{
    "token": "bd1df2b11111111112222222222222222333333333333333333yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy",
    "data": [
        {
            "type": "英文字符,最長不超過10位",
            "desc": "指標的中文描述, 可為空",
            "@timestamp": "時間戳,以標准unix時間戳為准,下面會給出shell和python的生成示例",
            "appname": "應用系統編碼,以aiops上的信息為准",
            "hostname": "主機名",
            "value": "采集的指標值, 由於各系統需求不一致, 此處統一使用string類型, 否則可能會造成mapping沖突, 但某些功能需要int/float,再討論",
            "checker": "發送數據的腳本路徑或IP, 可為空"
        }
    ]
}


==============================================================================================
# python生成時間戳示例
import datetime
timestamp = datetime.datetime.strftime(datetime.datetime.now(), '%s')
 
==============================================================================================
# python請求示例
import urllib2   # 這里是python2,根據各人使用有不同,總之是構建http request
import hashlib
import json
url = 'http://192.168.10.10:10222/haha/heiheiAPI/test_1_kafka'
data = {
    'token': 'bd1df2b11111111112222222222222222333333333333333333yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy',
    'data': [
        {}
    ]
}
headers = {'Content-Type': 'application/json'}
req = urllib2.Request(url, json.dumps(data), headers = headers)
res = urllib2.urlopen(req).read()
=============================================================================================

# bash shell生成時間戳示例
date +'%s'
# bash shell請求示例
curl -s -XPOST -H "Content-Type:application/json" -d 請求數據 http://192.168.10.10:10222/haha/heiheiAPI/test_1_kafka

這里使用了兩個腳本:
1)shell腳本進行指標數據采集(最終使用腳本:20_app_process_index.sh
2)python腳本進行ES入倉請求提交,請求方法:POST。 在python腳本里調用shell腳本,調取shell腳本執行結果。(最終使用腳本:20_app_process_index_es.py

[root@kevin_test app_process_index]# pwd
/root/100_app_index/app_process_index
[root@kevin_test app_process_index]# ll
total 120
-rwxr-xr-x 1 root root   783 Jun 20 18:16 20_app_process_index_es.py
-rwxr-xr-x 1 root root   290 Jun 20 18:16 20_app_process_index.py2
-rwxr-xr-x 1 root root 15398 Jun 20 18:19 20_app_process_index.sh
-rwxr-xr-x 1 root root 10414 Jun 20 18:16 20_app_process_index_shell.sh

[root@kevin_test ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        20G  4.8G   14G  26% /
tmpfs           2.9G   12K  2.9G   1% /dev/shm
/dev/vdb2       9.8G  458M  8.8G   5% /software
/dev/vdb3        30G   21G  7.2G  75% /opt/bobo
/dev/vdb4        38G  6.9G   29G  20% /var/log/bobo

其中,/opt/cbd為應用程序所在空間,/var/log/bobo是日志所在空間

一、shell腳本 (執行結果要時JSON格式的,這里在shell腳本里拼出來的JSON樣式)

[root@kevin_test app_process_index]# cat 20_app_process_index_shell.sh 
#!/bin/bash

source /etc/profile
hostName=$(hostname)
IP=$(ifconfig eth0| sed -nr '2s/(^[^0-9]+)([0-9.]+)+( .*$)/\2/gp')
appName=$(echo ${hostName:3:3})

collectTime=`date +'%s'`
dataSource=$(echo "`pwd`/$0@${IP}")

indexType="應用進程相關指標"

echo "指標類型: ${indexType}"
echo "指標采集時間: ${collectTime}"
echo "主機名: ${hostName}"
echo "應用名稱: ${appName}"
echo "發送數據源主機: ${dataSource}"
echo -e "\n此次采集應用進程相關指標情況如下:"

echo -e "---------------------------------------------------"
###########應用進程占內存百分比###########
indexName1="應用進程占內存百分比"
ps auxw|grep bxapp|awk '{if (NR>1){print $4}}' > /tmp/mem_list
NUM1=`cat /tmp/mem_list|wc -l`

if [ $NUM1 -eq 0 ];then
   echo "${indexName}為0"
else
   MEM_PER_SUM=$(awk '{MEM_PER+=$1}END{print MEM_PER}' /tmp/mem_list)
   echo "${indexName1}:" ${MEM_PER_SUM}%
fi

echo -e "---------------------------------------------------"
###########應用進程占CPU百分比###########
indexName2="應用進程占CPU百分比"
ps auxw|grep bxapp|awk '{if (NR>1){print $3}}' > /tmp/cpu_list
NUM2=`cat /tmp/cpu_list|wc -l`

if [ $NUM2 -eq 0 ];then
   echo "${indexName2}為0"
else
   CPU_PER_SUM=$(awk '{CPU_PER+=$1}END{print CPU_PER}' /tmp/cpu_list)
   echo "${indexName2}:" ${CPU_PER_SUM}%
fi

echo -e "---------------------------------------------------"
###########應用進程run最長時間及其進程###########
indexName3="應用進程run最長時間"
PID=$(ps -eo user,pid,etime|grep bxapp|sort -k 3 -rn|head -1|awk '{print $2}')
RUN_TIME=$(ps -eo user,pid,etime|grep bxapp|sort -k 3 -rn|head -1|awk '{print $3}')
PROCESS=$(ps -ef|grep ${PID}|grep -v grep|awk '{print $8}')

echo -e "${indexName3}: ${RUN_TIME} \n進程: ${PROCESS}"


echo -e "---------------------------------------------------"
###########應用進程TIME-WAIT連接數###########
indexName4="應用進程TIME-WAIT連接數"
NUM3=$(ss -a|grep -w "TIME_WAIT" |wc -l)
echo "${indexName4}: ${NUM3}"

echo -e "---------------------------------------------------"
###########應用進程ESTABLISHED連接數###########
indexName5="應用進程ESTABLISHED連接數"
NUM4=$(ss -a|grep -w "ESTAB" |wc -l)
echo "${indexName5}: ${NUM4}"

echo -e "---------------------------------------------------"
###########應用進程FIN_WAIT2連接數###########
indexName6="應用進程FIN_WAIT2連接數"
NUM5=$(ss -a|grep -w "FIN_WAIT2" |wc -l)
echo "${indexName6}: ${NUM5}"

echo -e "---------------------------------------------------"
###########日志空間使用率###########
indexName7="日志空間使用率"
LOG_SPACE_USER=$(df -h|grep "/var/log"|awk '{print $5}')
echo "${indexName7}: ${LOG_SPACE_USER}"

echo -e "---------------------------------------------------"
###########應用程序空間使用率###########
indexName8="應用程序空間使用率"
APP_SPACE_USER=$(df -h|grep "/opt"|awk '{print $5}')
echo "${indexName8}: ${APP_SPACE_USER}"

echo -e "---------------------------------------------------"
###########應用所在磁盤讀速率(Blk/s)###########
indexName9="應用所在磁盤讀速率(Blk/s)"
DISK=$(df -h|grep "/opt/${appName}"|awk '{print $1}')
DEVICE=$(df -h|grep "/opt/${appName}"|awk '{print $1}'|awk -F"/" '{print $3}')
READ=$(iostat ${DISK}|grep -w ${DEVICE}|awk '{print $3}')

echo "${indexName9}: ${READ}"

echo -e "---------------------------------------------------"
###########應用所在磁盤寫速率(Blk/s)###########
indexName10="應用所在磁盤寫速率(Blk/s)"
DISK=$(df -h|grep "/opt/${appName}"|awk '{print $1}')
DEVICE=$(df -h|grep "/opt/${appName}"|awk '{print $1}'|awk -F"/" '{print $3}')
WRITE=$(iostat ${DISK}|grep -w ${DEVICE}|awk '{print $4}')

echo "${indexName10}: ${WRITE}"

echo -e "---------------------------------------------------"
###########應用所在磁盤TPS###########
indexName11="應用所在磁盤TPS"
DISK=$(df -h|grep "/opt/${appName}"|awk '{print $1}')
DEVICE=$(df -h|grep "/opt/${appName}"|awk '{print $1}'|awk -F"/" '{print $3}')
TPS=$(iostat ${DISK}|grep -w ${DEVICE}|awk '{print $2}')

echo "${indexName11}: ${TPS}"

echo -e "---------------------------------------------------"
###########TOMCAT分配最小內存 ###########
indexName12="TOMCAT分配最小內存"
NUM6=$(ps -ef|grep -w tomcat|grep -v grep|wc -l)
if [ ${NUM6} -eq 0 ];then
   echo "當前沒有Tomcat進程,${indexName12}: 0"
else
    for TOMCAT in $(find /opt/${appName}/ -name *tomcat* -type d)
    do
      NUM7=$(ps -ef|grep ${TOMCAT}|grep -v grep|wc -l)
      if [ ${NUM7} -eq 0 ];then
        echo "not ${TOMCAT}" >> /dev/null 2>&1
      else
        XMS=$(ps -ef|grep ${TOMCAT}/|grep "\-Xms"|awk -F"-Xms" '{print $2}'|cut -d" " -f1)
        echo -e "${indexName12}: ${XMS}  (實例名:${TOMCAT})"
      fi
    done
fi

echo -e "---------------------------------------------------"
###########TOMCAT分配最大內存 ###########
indexName13="TOMCAT分配最大內存"
NUM8=$(ps -ef|grep -w tomcat|grep -v grep|wc -l)
if [ ${NUM8} -eq 0 ];then
   echo "當前沒有Tomcat進程,${indexName13}: 0"
else
    for TOMCAT in $(find /opt/${appName}/ -name *tomcat* -type d)
    do
      NUM9=$(ps -ef|grep ${TOMCAT}|grep -v grep|wc -l)
      if [ ${NUM9} -eq 0 ];then
        echo "not ${TOMCAT}" >> /dev/null 2>&1
      else
        XMX=$(ps -ef|grep ${TOMCAT}/|grep "\-Xmx"|awk -F"-Xmx" '{print $2}'|cut -d" " -f1)
        echo -e "${indexName13}: ${XMX}  (實例名:${TOMCAT})"
      fi
    done
fi

echo -e "---------------------------------------------------"
###########TOMCAT分配年輕代空間 ###########
indexName14="TOMCAT分配年輕代空間"
NUM10=$(ps -ef|grep -w tomcat|grep -v grep|wc -l)
if [ ${NUM10} -eq 0 ];then
   echo "當前沒有Tomcat進程,${indexName14}: 0"
else
    for TOMCAT in $(find /opt/${appName}/ -name *tomcat* -type d)
    do
      NUM11=$(ps -ef|grep ${TOMCAT}|grep -v grep|wc -l)
      if [ ${NUM11} -eq 0 ];then
        echo "not ${TOMCAT}" >> /dev/null 2>&1
      else
        XMN=$(ps -ef|grep ${TOMCAT}/|grep "\-Xmn"|awk -F"-Xmn" '{print $2}'|cut -d" " -f1)
        echo -e "${indexName14}: ${XMN}  (實例名:${TOMCAT})"
      fi
    done
fi

echo -e "---------------------------------------------------"
###########TOMCAT每個線程的堆棧大小 ###########
indexName15="TOMCAT每個線程的堆棧大小"
NUM12=$(ps -ef|grep -w tomcat|grep -v grep|wc -l)
if [ ${NUM12} -eq 0 ];then
   echo "當前沒有Tomcat進程,${indexName15}: 0"
else
    for TOMCAT in $(find /opt/${appName}/ -name *tomcat* -type d)
    do
      NUM13=$(ps -ef|grep ${TOMCAT}|grep -v grep|wc -l)
      if [ ${NUM13} -eq 0 ];then
        echo "not ${TOMCAT}" >> /dev/null 2>&1
      else
        XSS=$(ps -ef|grep ${TOMCAT}/|grep "\-Xss"|awk -F"-Xss" '{print $2}'|cut -d" " -f1)
        echo -e "${indexName15}: ${XSS}  (實例名:${TOMCAT})"
      fi
    done
fi

echo -e "---------------------------------------------------"
###########TOMCAT-GC時長占比 ###########
indexName16="TOMCAT-GC時長占比"
NUM14=$(ps -ef|grep -w tomcat|grep -v grep|wc -l)
if [ ${NUM14} -eq 0 ];then
   echo "當前沒有Tomcat進程,${indexName16}: 0"
else
    for TOMCAT in $(find /opt/${appName}/ -name *tomcat* -type d)
    do
      NUM15=$(ps -ef|grep ${TOMCAT}|grep -v grep|wc -l)
      if [ ${NUM15} -eq 0 ];then
        echo "not ${TOMCAT}" >> /dev/null 2>&1
      else
        GC=$(ps -ef|grep ${TOMCAT}/|grep "\GCTimeRatio"|awk -F"GCTimeRatio" '{print $2}'|cut -d" " -f1|awk -F"=" '{print $2}')
        echo -e "${indexName16}: ${GC}  (實例名:${TOMCAT})"
      fi
    done
fi

echo -e "---------------------------------------------------"
###########Zookeeper分配最小內存 ###########
indexName17="Zookeeper分配最小內存"
#zookeeper安裝時沒有手動定義內存配置,默認為系統內存的四分之一
NUM16=$(ps -ef|grep zookeeper|grep -v grep|wc -l)
if [ ${NUM16} -eq 0 ];then
   echo "當前沒有zookeeper進程,${indexName17}: 0"
else
   MEM_TOTAL=$(free -m|grep "Mem"|awk '{print $2}')
   ZK_MEM_MAX=`expr ${MEM_TOTAL} / 4`

   echo "${indexName17}: ${ZK_MEM_MAX}M" 
fi 


echo -e "---------------------------------------------------"
###########Zookeeper分配最大內存 ###########
indexName18="Zookeeper分配最大內存"
#zookeeper安裝時沒有手動定義內存配置,默認為系統內存的四分之一
NUM17=$(ps -ef|grep zookeeper|grep -v grep|wc -l)
if [ ${NUM17} -eq 0 ];then
   echo "當前沒有zookeeper進程,${indexName18}: 0"
else
   MEM_TOTAL=$(free -m|grep "Mem"|awk '{print $2}')
   ZK_MEM_MAX=`expr ${MEM_TOTAL} / 4`

   echo "${indexName18}: ${ZK_MEM_MAX}M" 
fi 

echo -e "---------------------------------------------------"
###########KAFKA分配最小內存 ###########
indexName19="KAFKA分配最小內存"
NUM18=$(ps -ef|grep kafka|grep -v grep|wc -l)
if [ ${NUM18} -eq 0 ];then
    echo "當前沒有KAFKA進程,${indexName19}: 0"
else
    cd /opt/${appName}/
    for KAFKA in $(find /opt/${appName}/ -name *kafka* -type d)
    do
    NUM19=$(ps -ef|grep ${KAFKA}|grep -v grep|wc -l)
       if [ ${NUM19} -eq 0 ];then
          echo "not this ${KAFKA}" >/dev/null 2>&1
       else
          FILE=${KAFKA}/bin/kafka-server-start.sh 
          KAFKA_MEM_MIN=$(cat ${FILE}|grep "Xmx"|awk -F'"' '{print $2}'|awk '{print $2}'|awk -F"Xms" '{print $2}')
          echo "${indexName19}: ${KAFKA_MEM_MIN}"
       fi
    done
fi


echo -e "---------------------------------------------------"
###########KAFKA分配最大內存 ###########
indexName20="KAFKA分配最大內存"
NUM20=$(ps -ef|grep kafka|grep -v grep|wc -l)
if [ ${NUM20} -eq 0 ];then
    echo "當前沒有KAFKA進程,${indexName20}: 0"
else
    cd /opt/${appName}/
    for KAFKA in $(find /opt/${appName}/ -name *kafka* -type d)
    do
    NUM21=$(ps -ef|grep ${KAFKA}|grep -v grep|wc -l)
       if [ ${NUM21} -eq 0 ];then
          echo "not this ${KAFKA}" >/dev/null 2>&1
       else
          FILE=${KAFKA}/bin/kafka-server-start.sh 
          KAFKA_MEM_MAX=$(cat ${FILE}|grep "Xmx"|awk -F'"' '{print $2}'|awk '{print $1}'|awk -F"Xmx" '{print $2}')
          echo "${indexName20}: ${KAFKA_MEM_MAX}"
       fi
    done
fi

echo -e "---------------------------------------------------"
###########應用系統進程數量 ###########
indexName21="應用系統進程數量"
NUM22=$(ps -eo user,pid,cmd|awk '{if($1=="bxapp")print}'|wc -l)
echo "${indexName21}:"${NUM22}

執行這個腳本:

[root@kevin_test app_process_index]# sh 20_app_process_index_shell.sh
指標類型: 應用進程相關指標
指標采集時間: 1561029337
主機名: kevin_test
應用名稱: bobo
發送數據源主機: /root/100_app_index/app_process_index/20_app_process_index_shell.sh@192.168.10.99

此次采集應用進程相關指標情況如下:
---------------------------------------------------
應用進程占內存百分比: 69.7%
---------------------------------------------------
應用進程占CPU百分比: 13.8%
---------------------------------------------------
應用進程run最長時間: 609-08:33:26 
進程: ../src/redis-sentinel
---------------------------------------------------
應用進程TIME-WAIT連接數: 0
---------------------------------------------------
應用進程ESTABLISHED連接數: 455
---------------------------------------------------
應用進程FIN_WAIT2連接數: 0
---------------------------------------------------
日志空間使用率: 20%
---------------------------------------------------
應用程序空間使用率: 75%
---------------------------------------------------
應用所在磁盤讀速率(Blk/s): 2.30
---------------------------------------------------
應用所在磁盤寫速率(Blk/s): 16.41
---------------------------------------------------
應用所在磁盤TPS: 1.31
---------------------------------------------------
當前沒有Tomcat進程,TOMCAT分配最小內存: 0
---------------------------------------------------
當前沒有Tomcat進程,TOMCAT分配最大內存: 0
---------------------------------------------------
當前沒有Tomcat進程,TOMCAT分配年輕代空間: 0
---------------------------------------------------
當前沒有Tomcat進程,TOMCAT每個線程的堆棧大小: 0
---------------------------------------------------
當前沒有Tomcat進程,TOMCAT-GC時長占比: 0
---------------------------------------------------
Zookeeper分配最小內存: 1459M
---------------------------------------------------
Zookeeper分配最大內存: 1459M
---------------------------------------------------
當前沒有KAFKA進程,KAFKA分配最小內存: 0
---------------------------------------------------
當前沒有KAFKA進程,KAFKA分配最大內存: 0
---------------------------------------------------
應用系統進程數量:10

注意:上面是還沒有轉化JSON格式的腳本。下面是轉化為JSON格式后的腳本(實際用的就是下面這個腳本)

[root@kevin_test app_process_index]# cat 20_app_process_index.sh 
#!/bin/bash

source /etc/profile
hostName=$(hostname)
IP=$(ifconfig eth0| sed -nr '2s/(^[^0-9]+)([0-9.]+)+( .*$)/\2/gp')
appName=$(echo ${hostName:3:3})

collectTime=$(date +'%s')
dataSource=$(echo "$0@${IP}")
indexType="app_process"


###########應用進程占內存百分比###########
ps auxw|grep bxapp|awk '{if (NR>1){print $4}}' > /tmp/mem_list
NUM1=`cat /tmp/mem_list|wc -l`

if [ $NUM1 -eq 0 ];then
   echo -e "{
   \"type\":\"${indexType}\",
   \"desc\":\"應用進程占內存百分比\",
   \"@timestamp\":\"${collectTime}\",
   \"appname\":\"${appName}\",
   \"hostname\":\"${hostName}\",
   \"value\":\"當前沒有進程\",
   \"checker\":\"${dataSource}\"
   }+"
else
   MEM_PER_SUM=$(awk '{MEM_PER+=$1}END{print MEM_PER}' /tmp/mem_list)
   echo -e "{
   \"type\":\"${indexType}\",
   \"desc\":\"應用進程占內存百分比\",
   \"@timestamp\":\"${collectTime}\",
   \"appname\":\"${appName}\",
   \"hostname\":\"${hostName}\",
   \"value\":\"${MEM_PER_SUM}%\",
   \"checker\":\"${dataSource}\"
   }+"
fi

###########應用進程占CPU百分比###########
ps auxw|grep bxapp|awk '{if (NR>1){print $3}}' > /tmp/cpu_list
NUM2=`cat /tmp/cpu_list|wc -l`

if [ $NUM2 -eq 0 ];then
   echo -e "{
   \"type\":\"${indexType}\",
   \"desc\":\"應用進程占CPU百分比\",
   \"@timestamp\":\"${collectTime}\",
   \"appname\":\"${appName}\",
   \"hostname\":\"${hostName}\",
   \"value\":\"當前沒有進程\",
   \"checker\":\"${dataSource}\"
   }+"
else
   CPU_PER_SUM=$(awk '{CPU_PER+=$1}END{print CPU_PER}' /tmp/cpu_list)
   echo -e "{
   \"type\":\"${indexType}\",
   \"desc\":\"應用進程占CPU百分比\",
   \"@timestamp\":\"${collectTime}\",
   \"appname\":\"${appName}\",
   \"hostname\":\"${hostName}\",
   \"value\":\"${CPU_PER_SUM}%\",
   \"checker\":\"${dataSource}\"
   }+"
fi

###########應用進程run最長時間及其進程###########
PID=$(ps -eo user,pid,etime|grep bxapp|sort -k 3 -rn|head -1|awk '{print $2}')
RUN_TIME=$(ps -eo user,pid,etime|grep bxapp|sort -k 3 -rn|head -1|awk '{print $3}')
PROCESS=$(ps -ef|grep ${PID}|grep -v grep|awk '{print $8}')

   echo -e "{
   \"type\":\"${indexType}\",
   \"desc\":\"應用進程run最長時間及其進程\",
   \"@timestamp\":\"${collectTime}\",
   \"appname\":\"${appName}\",
   \"hostname\":\"${hostName}\",
   \"value\":\"${RUN_TIME}, ${PROCESS}\",
   \"checker\":\"${dataSource}\"
   }+"

###########應用進程TIME-WAIT連接數###########
NUM3=$(ss -a|grep -w "TIME_WAIT" |wc -l)
   echo -e "{
   \"type\":\"${indexType}\",
   \"desc\":\"應用進程TIME-WAIT連接數\",
   \"@timestamp\":\"${collectTime}\",
   \"appname\":\"${appName}\",
   \"hostname\":\"${hostName}\",
   \"value\":\"${NUM3}\",
   \"checker\":\"${dataSource}\"
   }+"

###########應用進程ESTABLISHED連接數###########
NUM4=$(ss -a|grep -w "ESTAB" |wc -l)
   echo -e "{
   \"type\":\"${indexType}\",
   \"desc\":\"應用進程ESTABLISHED連接數\",
   \"@timestamp\":\"${collectTime}\",
   \"appname\":\"${appName}\",
   \"hostname\":\"${hostName}\",
   \"value\":\"${NUM4}\",
   \"checker\":\"${dataSource}\"
   }+"

###########應用進程FIN_WAIT2連接數###########
NUM5=$(ss -a|grep -w "FIN_WAIT2" |wc -l)
   echo -e "{
   \"type\":\"${indexType}\",
   \"desc\":\"應用進程FIN_WAIT2連接數\",
   \"@timestamp\":\"${collectTime}\",
   \"appname\":\"${appName}\",
   \"hostname\":\"${hostName}\",
   \"value\":\"${NUM5}\",
   \"checker\":\"${dataSource}\"
   }+"

###########日志空間使用率###########
LOG_SPACE_USER=$(df -h|grep "/var/log"|awk '{print $5}')
   echo -e "{
   \"type\":\"${indexType}\",
   \"desc\":\"日志空間使用率\",
   \"@timestamp\":\"${collectTime}\",
   \"appname\":\"${appName}\",
   \"hostname\":\"${hostName}\",
   \"value\":\"${LOG_SPACE_USER}\",
   \"checker\":\"${dataSource}\"
   }+"
###########應用程序空間使用率###########
APP_SPACE_USER=$(df -h|grep "/opt"|awk '{print $5}')
   echo -e "{
   \"type\":\"${indexType}\",
   \"desc\":\"應用程序空間使用率\",
   \"@timestamp\":\"${collectTime}\",
   \"appname\":\"${appName}\",
   \"hostname\":\"${hostName}\",
   \"value\":\"${APP_SPACE_USER}\",
   \"checker\":\"${dataSource}\"
   }+"

###########應用所在磁盤讀速率(Blk/s)###########
DISK=$(df -h|grep "/opt/${appName}"|awk '{print $1}')
DEVICE=$(df -h|grep "/opt/${appName}"|awk '{print $1}'|awk -F"/" '{print $3}')
READ=$(iostat ${DISK}|grep -w ${DEVICE}|awk '{print $3}')
   echo -e "{
   \"type\":\"${indexType}\",
   \"desc\":\"應用所在磁盤讀速率(Blk/s)\",
   \"@timestamp\":\"${collectTime}\",
   \"appname\":\"${appName}\",
   \"hostname\":\"${hostName}\",
   \"value\":\"${READ}\",
   \"checker\":\"${dataSource}\"
   }+"

###########應用所在磁盤寫速率(Blk/s)###########
DISK=$(df -h|grep "/opt/${appName}"|awk '{print $1}')
DEVICE=$(df -h|grep "/opt/${appName}"|awk '{print $1}'|awk -F"/" '{print $3}')
WRITE=$(iostat ${DISK}|grep -w ${DEVICE}|awk '{print $4}')
   echo -e "{
   \"type\":\"${indexType}\",
   \"desc\":\"應用所在磁盤寫速率(Blk/s)\",
   \"@timestamp\":\"${collectTime}\",
   \"appname\":\"${appName}\",
   \"hostname\":\"${hostName}\",
   \"value\":\"${WRITE}\",
   \"checker\":\"${dataSource}\"
   }+"

###########應用所在磁盤TPS###########
DISK=$(df -h|grep "/opt/${appName}"|awk '{print $1}')
DEVICE=$(df -h|grep "/opt/${appName}"|awk '{print $1}'|awk -F"/" '{print $3}')
TPS=$(iostat ${DISK}|grep -w ${DEVICE}|awk '{print $2}')
   echo -e "{
   \"type\":\"${indexType}\",
   \"desc\":\"應用所在磁盤TPS\",
   \"@timestamp\":\"${collectTime}\",
   \"appname\":\"${appName}\",
   \"hostname\":\"${hostName}\",
   \"value\":\"${TPS}\",
   \"checker\":\"${dataSource}\"
   }+"

###########TOMCAT分配最小內存 ###########
NUM6=$(ps -ef|grep -w tomcat|grep -v grep|wc -l)
if [ ${NUM6} -eq 0 ];then
   echo -e "{
   \"type\":\"${indexType}\",
   \"desc\":\"TOMCAT分配最小內存\",
   \"@timestamp\":\"${collectTime}\",
   \"appname\":\"${appName}\",
   \"hostname\":\"${hostName}\",
   \"value\":\"當前沒有Tomcat進程\",
   \"checker\":\"${dataSource}\"
   }+"
else
    for TOMCAT in $(find /opt/${appName}/ -name *tomcat* -type d)
    do
      NUM7=$(ps -ef|grep ${TOMCAT}|grep -v grep|wc -l)
      if [ ${NUM7} -eq 0 ];then
        echo "not ${TOMCAT}" >> /dev/null 2>&1
      else
        XMS=$(ps -ef|grep ${TOMCAT}/|grep "\-Xms"|awk -F"-Xms" '{print $2}'|cut -d" " -f1)
          echo -e "{
          \"type\":\"${indexType}\",
          \"desc\":\"TOMCAT分配最小內存\",
          \"@timestamp\":\"${collectTime}\",
          \"appname\":\"${appName}\",
          \"hostname\":\"${hostName}\",
          \"value\":\"${XMS}  (實例名:${TOMCAT})\",
          \"checker\":\"${dataSource}\"
          }+"
      fi
    done
fi

###########TOMCAT分配最大內存 ###########
NUM8=$(ps -ef|grep -w tomcat|grep -v grep|wc -l)
if [ ${NUM8} -eq 0 ];then
   echo -e "{
   \"type\":\"${indexType}\",
   \"desc\":\"TOMCAT分配最大內存\",
   \"@timestamp\":\"${collectTime}\",
   \"appname\":\"${appName}\",
   \"hostname\":\"${hostName}\",
   \"value\":\"當前沒有Tomcat進程\",
   \"checker\":\"${dataSource}\"
   }+"
else
    for TOMCAT in $(find /opt/${appName}/ -name *tomcat* -type d)
    do
      NUM9=$(ps -ef|grep ${TOMCAT}|grep -v grep|wc -l)
      if [ ${NUM9} -eq 0 ];then
        echo "not ${TOMCAT}" >> /dev/null 2>&1
      else
        XMX=$(ps -ef|grep ${TOMCAT}/|grep "\-Xmx"|awk -F"-Xmx" '{print $2}'|cut -d" " -f1)
          echo -e "{
          \"type\":\"${indexType}\",
          \"desc\":\"TOMCAT分配最大內存\",
          \"@timestamp\":\"${collectTime}\",
          \"appname\":\"${appName}\",
          \"hostname\":\"${hostName}\",
          \"value\":\"${XMX}  (實例名:${TOMCAT})\",
          \"checker\":\"${dataSource}\"
          }+"
      fi
    done
fi

###########TOMCAT分配年輕代空間 ###########
NUM10=$(ps -ef|grep -w tomcat|grep -v grep|wc -l)
if [ ${NUM10} -eq 0 ];then
   echo -e "{
   \"type\":\"${indexType}\",
   \"desc\":\"TOMCAT分配年輕代空間\",
   \"@timestamp\":\"${collectTime}\",
   \"appname\":\"${appName}\",
   \"hostname\":\"${hostName}\",
   \"value\":\"當前沒有Tomcat進程\",
   \"checker\":\"${dataSource}\"
   }+"

else
    for TOMCAT in $(find /opt/${appName}/ -name *tomcat* -type d)
    do
      NUM11=$(ps -ef|grep ${TOMCAT}|grep -v grep|wc -l)
      if [ ${NUM11} -eq 0 ];then
        echo "not ${TOMCAT}" >> /dev/null 2>&1
      else
        XMN=$(ps -ef|grep ${TOMCAT}/|grep "\-Xmn"|awk -F"-Xmn" '{print $2}'|cut -d" " -f1)
          echo -e "{
          \"type\":\"${indexType}\",
          \"desc\":\"TOMCAT分配年輕代空間\",
          \"@timestamp\":\"${collectTime}\",
          \"appname\":\"${appName}\",
          \"hostname\":\"${hostName}\",
          \"value\":\"${XMN}  (實例名:${TOMCAT})\",
          \"checker\":\"${dataSource}\"
          }+"
      fi
    done
fi

###########TOMCAT每個線程的堆棧大小 ###########
NUM12=$(ps -ef|grep -w tomcat|grep -v grep|wc -l)
if [ ${NUM12} -eq 0 ];then
   echo -e "{
   \"type\":\"${indexType}\",
   \"desc\":\"TOMCAT每個線程的堆棧大小\",
   \"@timestamp\":\"${collectTime}\",
   \"appname\":\"${appName}\",
   \"hostname\":\"${hostName}\",
   \"value\":\"當前沒有Tomcat進程\",
   \"checker\":\"${dataSource}\"
   }+"
else
    for TOMCAT in $(find /opt/${appName}/ -name *tomcat* -type d)
    do
      NUM13=$(ps -ef|grep ${TOMCAT}|grep -v grep|wc -l)
      if [ ${NUM13} -eq 0 ];then
        echo "not ${TOMCAT}" >> /dev/null 2>&1
      else
        XSS=$(ps -ef|grep ${TOMCAT}/|grep "\-Xss"|awk -F"-Xss" '{print $2}'|cut -d" " -f1)
          echo -e "{
          \"type\":\"${indexType}\",
          \"desc\":\"TOMCAT每個線程的堆棧大小\",
          \"@timestamp\":\"${collectTime}\",
          \"appname\":\"${appName}\",
          \"hostname\":\"${hostName}\",
          \"value\":\"${XSS}  (實例名:${TOMCAT})\",
          \"checker\":\"${dataSource}\"
          }+"
      fi
    done
fi

###########TOMCAT-GC時長占比 ###########
NUM14=$(ps -ef|grep -w tomcat|grep -v grep|wc -l)
if [ ${NUM14} -eq 0 ];then
   echo -e "{
   \"type\":\"${indexType}\",
   \"desc\":\"TOMCAT-GC時長占比\",
   \"@timestamp\":\"${collectTime}\",
   \"appname\":\"${appName}\",
   \"hostname\":\"${hostName}\",
   \"value\":\"當前沒有Tomcat進程\",
   \"checker\":\"${dataSource}\"
   }+"
else
    for TOMCAT in $(find /opt/${appName}/ -name *tomcat* -type d)
    do
      NUM15=$(ps -ef|grep ${TOMCAT}|grep -v grep|wc -l)
      if [ ${NUM15} -eq 0 ];then
        echo "not ${TOMCAT}" >> /dev/null 2>&1
      else
        GC=$(ps -ef|grep ${TOMCAT}/|grep "\GCTimeRatio"|awk -F"GCTimeRatio" '{print $2}'|cut -d" " -f1|awk -F"=" '{print $2}')
          echo -e "{
          \"type\":\"${indexType}\",
          \"desc\":\"TOMCAT-GC時長占比\",
          \"@timestamp\":\"${collectTime}\",
          \"appname\":\"${appName}\",
          \"hostname\":\"${hostName}\",
          \"value\":\"${GC}  (實例名:${TOMCAT})\",
          \"checker\":\"${dataSource}\"
          }+"
      fi
    done
fi

###########Zookeeper分配最小內存###########
#zookeeper安裝時沒有手動定義內存配置,默認為系統內存的四分之一
NUM16=$(ps -ef|grep zookeeper|grep -v grep|wc -l)
if [ ${NUM16} -eq 0 ];then
   echo -e "{
   \"type\":\"${indexType}\",
   \"desc\":\"Zookeeper分配最小內存\",
   \"@timestamp\":\"${collectTime}\",
   \"appname\":\"${appName}\",
   \"hostname\":\"${hostName}\",
   \"value\":\"當前沒有Zookeeper進程\",
   \"checker\":\"${dataSource}\"
   }+"
else
   MEM_TOTAL=$(free -m|grep "Mem"|awk '{print $2}')
   ZK_MEM_MIN=`expr ${MEM_TOTAL} / 4`
   echo -e "{
   \"type\":\"${indexType}\",
   \"desc\":\"Zookeeper分配最小內存\",
   \"@timestamp\":\"${collectTime}\",
   \"appname\":\"${appName}\",
   \"hostname\":\"${hostName}\",
   \"value\":\"${ZK_MEM_MIN}M\",
   \"checker\":\"${dataSource}\"
   }+"
fi

###########Zookeeper分配最大內存###########
#zookeeper安裝時沒有手動定義內存配置,默認為系統內存的四分之一
NUM17=$(ps -ef|grep zookeeper|grep -v grep|wc -l)
if [ ${NUM17} -eq 0 ];then
   echo -e "{
   \"type\":\"${indexType}\",
   \"desc\":\"Zookeeper分配最大內存\",
   \"@timestamp\":\"${collectTime}\",
   \"appname\":\"${appName}\",
   \"hostname\":\"${hostName}\",
   \"value\":\"當前沒有Zookeeper進程\",
   \"checker\":\"${dataSource}\"
   }+"
else
   MEM_TOTAL=$(free -m|grep "Mem"|awk '{print $2}')
   ZK_MEM_MAX=`expr ${MEM_TOTAL} / 4`
   echo -e "{
   \"type\":\"${indexType}\",
   \"desc\":\"Zookeeper分配最大內存\",
   \"@timestamp\":\"${collectTime}\",
   \"appname\":\"${appName}\",
   \"hostname\":\"${hostName}\",
   \"value\":\"${ZK_MEM_MAX}M\",
   \"checker\":\"${dataSource}\"
   }+"
fi

###########KAFKA分配最小內存 ###########
NUM18=$(ps -ef|grep kafka|grep -v grep|wc -l)
if [ ${NUM18} -eq 0 ];then
   echo -e "{
   \"type\":\"${indexType}\",
   \"desc\":\"KAFKA分配最小內存\",
   \"@timestamp\":\"${collectTime}\",
   \"appname\":\"${appName}\",
   \"hostname\":\"${hostName}\",
   \"value\":\"當前沒有KAFKA進程\",
   \"checker\":\"${dataSource}\"
   }+"
else
    cd /opt/${appName}/
    for KAFKA in $(find /opt/${appName}/ -name *kafka* -type d)
    do
    NUM19=$(ps -ef|grep ${KAFKA}|grep -v grep|wc -l)
       if [ ${NUM19} -eq 0 ];then
          echo "not this ${KAFKA}" >/dev/null 2>&1
       else
          FILE=${KAFKA}/bin/kafka-server-start.sh 
          KAFKA_MEM_MIN=$(cat ${FILE}|grep "Xmx"|awk -F'"' '{print $2}'|awk '{print $2}'|awk -F"Xms" '{print $2}')
          echo -e "{
   \"type\":\"${indexType}\",
   \"desc\":\"KAFKA分配最小內存\",
   \"@timestamp\":\"${collectTime}\",
   \"appname\":\"${appName}\",
   \"hostname\":\"${hostName}\",
   \"value\":\"${KAFKA_MEM_MIN}\",
   \"checker\":\"${dataSource}\"
   }+"
       fi
    done
fi

###########KAFKA分配最大內存 ###########
NUM20=$(ps -ef|grep kafka|grep -v grep|wc -l)
if [ ${NUM20} -eq 0 ];then
   echo -e "{
   \"type\":\"${indexType}\",
   \"desc\":\"KAFKA分配最大內存\",
   \"@timestamp\":\"${collectTime}\",
   \"appname\":\"${appName}\",
   \"hostname\":\"${hostName}\",
   \"value\":\"當前沒有KAFKA進程\",
   \"checker\":\"${dataSource}\"
   }+"
else
    cd /opt/${appName}/
    for KAFKA in $(find /opt/${appName}/ -name *kafka* -type d)
    do
    NUM21=$(ps -ef|grep ${KAFKA}|grep -v grep|wc -l)
       if [ ${NUM21} -eq 0 ];then
          echo "not this ${KAFKA}" >/dev/null 2>&1
       else
          FILE=${KAFKA}/bin/kafka-server-start.sh 
          KAFKA_MEM_MAX=$(cat ${FILE}|grep "Xmx"|awk -F'"' '{print $2}'|awk '{print $1}'|awk -F"Xmx" '{print $2}')
          echo -e "{
   \"type\":\"${indexType}\",
   \"desc\":\"KAFKA分配最大內存\",
   \"@timestamp\":\"${collectTime}\",
   \"appname\":\"${appName}\",
   \"hostname\":\"${hostName}\",
   \"value\":\"${KAFKA_MEM_MAX}\",
   \"checker\":\"${dataSource}\"
   }+"
       fi
    done
fi

###########應用系統進程數量 ###########
NUM22=$(ps -eo user,pid,cmd|awk '{if($1=="bxapp")print}'|wc -l)
   echo -e "{
   \"type\":\"${indexType}\",
   \"desc\":\"應用系統進程數量\",
   \"@timestamp\":\"${collectTime}\",
   \"appname\":\"${appName}\",
   \"hostname\":\"${hostName}\",
   \"value\":\"${NUM22}\",
   \"checker\":\"${dataSource}\"
   }"

執行這個腳本(JSON字段跟上面ES入倉要求的字段匹配):

[root@kevin_test app_process_index]# sh 20_app_process_index.sh
{
   "type":"app_process",
   "desc":"應用進程占內存百分比",
   "@timestamp":"1561029533",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"69.7%",
   "checker":"20_app_process_index.sh@192.168.10.99"
   }+
{
   "type":"app_process",
   "desc":"應用進程占CPU百分比",
   "@timestamp":"1561029533",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"13.8%",
   "checker":"20_app_process_index.sh@192.168.10.99"
   }+
{
   "type":"app_process",
   "desc":"應用進程run最長時間及其進程",
   "@timestamp":"1561029533",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"609-08:36:42, ../src/redis-sentinel",
   "checker":"20_app_process_index.sh@192.168.10.99"
   }+
{
   "type":"app_process",
   "desc":"應用進程TIME-WAIT連接數",
   "@timestamp":"1561029533",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"0",
   "checker":"20_app_process_index.sh@192.168.10.99"
   }+
{
   "type":"app_process",
   "desc":"應用進程ESTABLISHED連接數",
   "@timestamp":"1561029533",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"454",
   "checker":"20_app_process_index.sh@192.168.10.99"
   }+
{
   "type":"app_process",
   "desc":"應用進程FIN_WAIT2連接數",
   "@timestamp":"1561029533",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"0",
   "checker":"20_app_process_index.sh@192.168.10.99"
   }+
{
   "type":"app_process",
   "desc":"日志空間使用率",
   "@timestamp":"1561029533",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"20%",
   "checker":"20_app_process_index.sh@192.168.10.99"
   }+
{
   "type":"app_process",
   "desc":"應用程序空間使用率",
   "@timestamp":"1561029533",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"75%",
   "checker":"20_app_process_index.sh@192.168.10.99"
   }+
{
   "type":"app_process",
   "desc":"應用所在磁盤讀速率(Blk/s)",
   "@timestamp":"1561029533",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"2.30",
   "checker":"20_app_process_index.sh@192.168.10.99"
   }+
{
   "type":"app_process",
   "desc":"應用所在磁盤寫速率(Blk/s)",
   "@timestamp":"1561029533",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"16.41",
   "checker":"20_app_process_index.sh@192.168.10.99"
   }+
{
   "type":"app_process",
   "desc":"應用所在磁盤TPS",
   "@timestamp":"1561029533",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"1.31",
   "checker":"20_app_process_index.sh@192.168.10.99"
   }+
{
   "type":"app_process",
   "desc":"TOMCAT分配最小內存",
   "@timestamp":"1561029533",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"當前沒有Tomcat進程",
   "checker":"20_app_process_index.sh@192.168.10.99"
   }+
{
   "type":"app_process",
   "desc":"TOMCAT分配最大內存",
   "@timestamp":"1561029533",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"當前沒有Tomcat進程",
   "checker":"20_app_process_index.sh@192.168.10.99"
   }+
{
   "type":"app_process",
   "desc":"TOMCAT分配年輕代空間",
   "@timestamp":"1561029533",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"當前沒有Tomcat進程",
   "checker":"20_app_process_index.sh@192.168.10.99"
   }+
{
   "type":"app_process",
   "desc":"TOMCAT每個線程的堆棧大小",
   "@timestamp":"1561029533",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"當前沒有Tomcat進程",
   "checker":"20_app_process_index.sh@192.168.10.99"
   }+
{
   "type":"app_process",
   "desc":"TOMCAT-GC時長占比",
   "@timestamp":"1561029533",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"當前沒有Tomcat進程",
   "checker":"20_app_process_index.sh@192.168.10.99"
   }+
{
   "type":"app_process",
   "desc":"Zookeeper分配最小內存",
   "@timestamp":"1561029533",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"1459M",
   "checker":"20_app_process_index.sh@192.168.10.99"
   }+
{
   "type":"app_process",
   "desc":"Zookeeper分配最大內存",
   "@timestamp":"1561029533",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"1459M",
   "checker":"20_app_process_index.sh@192.168.10.99"
   }+
{
   "type":"app_process",
   "desc":"KAFKA分配最小內存",
   "@timestamp":"1561029533",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"當前沒有KAFKA進程",
   "checker":"20_app_process_index.sh@192.168.10.99"
   }+
{
   "type":"app_process",
   "desc":"KAFKA分配最大內存",
   "@timestamp":"1561029533",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"當前沒有KAFKA進程",
   "checker":"20_app_process_index.sh@192.168.10.99"
   }+
{
   "type":"app_process",
   "desc":"應用系統進程數量",
   "@timestamp":"1561029533",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"10",
   "checker":"20_app_process_index.sh@192.168.10.99"
   }

二、然后使用python調用shell腳本,調取shell腳本的執行結果
下面三個腳本都可以使用,區別在於:
第一個腳本:默認就是在當前路徑下調用shell腳本,shell和python兩個腳本是放在統一目錄下的
第二個腳本和第三個腳本:先獲取當前腳本所在目錄路徑,然后在python腳本里調用shell腳本時,使用的是shell腳本全路徑

這里推薦使用第三個腳本,但是注意:
使用第二或第三個腳本時,shell腳本里的dataSource要寫成:dataSource=$(echo "$0@${IP}")
而使用第一個腳本時,shell腳本里的dataSource要寫成:dataSource=$(echo "`pwd`/$0@${IP}")

區別就是:
第一或第二個腳本,在輸出的JSON格式的結果中,checker不會帶上`pwd`
第三個腳本,在輸出的JSON格式的結果中,checker會帶上`pwd`,所以就不需要在shell腳本里再加上`pwd`,否則路徑就多了~

第一個腳本==================================================================
[root@kevin_test app_process_index]# cat 20_app_process_index.py
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import os
import json

#默認就在當前路徑下執行20_app_process_index.sh
json_set = os.popen("sh 20_app_process_index.sh").read().split('+')
for json_str in json_set:
    print json_str

第二個腳本==================================================================
[root@kevin_test app_process_index]# cat 20_app_process_index.py1 
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import os
import json

#獲取當前路徑,調用shell腳本, 執行時跟全路徑
now_path=os.path.abspath('.')
index_script="sh %s/20_app_process_index.sh" % (now_path)

json_set = os.popen(index_script).read().split('+')
for json_str in json_set:
    print json_str

第三個腳本================================================================
[root@kevin_test app_process_index]# cat 20_app_process_index.py2
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import os
import json

#獲取當前路徑,調用shell腳本, 執行時跟全路徑
now_path=os.path.abspath(__file__)
now_path=os.path.dirname(now_path)
index_script="sh %s/20_app_process_index.sh" % (now_path)

json_set = os.popen(index_script).read().split('+')
for json_str in json_set:
    print json_str

來看看幾個腳本結果:
如下第一個腳本的"checker" 字段,由於shell腳本里的"dataSource"沒有帶"pwd",所以"checker"字段中的腳本路徑不全

[root@kevin_test app_process_index]# python 20_app_process_index.py
{
   "type":"app_process",
   "desc":"應用進程占內存百分比",
   "@timestamp":"1561030141",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"69.7%",
   "checker":"20_app_process_index.sh@192.168.10.99"
   }

{
   "type":"app_process",
   "desc":"應用進程占CPU百分比",
   "@timestamp":"1561030141",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"13.8%",
   "checker":"20_app_process_index.sh@192.168.10.99"
   }

{
   "type":"app_process",
   "desc":"應用進程run最長時間及其進程",
   "@timestamp":"1561030141",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"609-08:46:50, ../src/redis-sentinel",
   "checker":"20_app_process_index.sh@192.168.10.99"
   }

{
   "type":"app_process",
   "desc":"應用進程TIME-WAIT連接數",
   "@timestamp":"1561030141",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"0",
   "checker":"20_app_process_index.sh@192.168.10.99"
   }

{
   "type":"app_process",
   "desc":"應用進程ESTABLISHED連接數",
   "@timestamp":"1561030141",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"455",
   "checker":"20_app_process_index.sh@192.168.10.99"
   }

{
   "type":"app_process",
   "desc":"應用進程FIN_WAIT2連接數",
   "@timestamp":"1561030141",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"0",
   "checker":"20_app_process_index.sh@192.168.10.99"
   }

{
   "type":"app_process",
   "desc":"日志空間使用率",
   "@timestamp":"1561030141",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"20%",
   "checker":"20_app_process_index.sh@192.168.10.99"
   }

{
   "type":"app_process",
   "desc":"應用程序空間使用率",
   "@timestamp":"1561030141",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"75%",
   "checker":"20_app_process_index.sh@192.168.10.99"
   }

{
   "type":"app_process",
   "desc":"應用所在磁盤讀速率(Blk/s)",
   "@timestamp":"1561030141",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"2.30",
   "checker":"20_app_process_index.sh@192.168.10.99"
   }

{
   "type":"app_process",
   "desc":"應用所在磁盤寫速率(Blk/s)",
   "@timestamp":"1561030141",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"16.41",
   "checker":"20_app_process_index.sh@192.168.10.99"
   }

{
   "type":"app_process",
   "desc":"應用所在磁盤TPS",
   "@timestamp":"1561030141",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"1.31",
   "checker":"20_app_process_index.sh@192.168.10.99"
   }

{
   "type":"app_process",
   "desc":"TOMCAT分配最小內存",
   "@timestamp":"1561030141",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"當前沒有Tomcat進程",
   "checker":"20_app_process_index.sh@192.168.10.99"
   }

{
   "type":"app_process",
   "desc":"TOMCAT分配最大內存",
   "@timestamp":"1561030141",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"當前沒有Tomcat進程",
   "checker":"20_app_process_index.sh@192.168.10.99"
   }

{
   "type":"app_process",
   "desc":"TOMCAT分配年輕代空間",
   "@timestamp":"1561030141",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"當前沒有Tomcat進程",
   "checker":"20_app_process_index.sh@192.168.10.99"
   }

{
   "type":"app_process",
   "desc":"TOMCAT每個線程的堆棧大小",
   "@timestamp":"1561030141",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"當前沒有Tomcat進程",
   "checker":"20_app_process_index.sh@192.168.10.99"
   }

{
   "type":"app_process",
   "desc":"TOMCAT-GC時長占比",
   "@timestamp":"1561030141",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"當前沒有Tomcat進程",
   "checker":"20_app_process_index.sh@192.168.10.99"
   }

{
   "type":"app_process",
   "desc":"Zookeeper分配最小內存",
   "@timestamp":"1561030141",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"1459M",
   "checker":"20_app_process_index.sh@192.168.10.99"
   }

{
   "type":"app_process",
   "desc":"Zookeeper分配最大內存",
   "@timestamp":"1561030141",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"1459M",
   "checker":"20_app_process_index.sh@192.168.10.99"
   }

{
   "type":"app_process",
   "desc":"KAFKA分配最小內存",
   "@timestamp":"1561030141",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"當前沒有KAFKA進程",
   "checker":"20_app_process_index.sh@192.168.10.99"
   }

{
   "type":"app_process",
   "desc":"KAFKA分配最大內存",
   "@timestamp":"1561030141",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"當前沒有KAFKA進程",
   "checker":"20_app_process_index.sh@192.168.10.99"
   }

{
   "type":"app_process",
   "desc":"應用系統進程數量",
   "@timestamp":"1561030141",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"11",
   "checker":"20_app_process_index.sh@192.168.10.99"
   }

第二或第三個腳本執行結果一樣,"checker"字段中的腳本路徑是完整路徑

[root@kevin_test app_process_index]# python 20_app_process_index.py 
{
   "type":"app_process",
   "desc":"應用進程占內存百分比",
   "@timestamp":"1561030444",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"70.8%",
   "checker":"/root/100_app_index/app_process_index/20_app_process_index.sh@192.168.10.99"
   }

{
   "type":"app_process",
   "desc":"應用進程占CPU百分比",
   "@timestamp":"1561030444",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"144.8%",
   "checker":"/root/100_app_index/app_process_index/20_app_process_index.sh@192.168.10.99"
   }

{
   "type":"app_process",
   "desc":"應用進程run最長時間及其進程",
   "@timestamp":"1561030444",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"609-08:51:53, ../src/redis-sentinel",
   "checker":"/root/100_app_index/app_process_index/20_app_process_index.sh@192.168.10.99"
   }

{
   "type":"app_process",
   "desc":"應用進程TIME-WAIT連接數",
   "@timestamp":"1561030444",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"0",
   "checker":"/root/100_app_index/app_process_index/20_app_process_index.sh@192.168.10.99"
   }

{
   "type":"app_process",
   "desc":"應用進程ESTABLISHED連接數",
   "@timestamp":"1561030444",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"456",
   "checker":"/root/100_app_index/app_process_index/20_app_process_index.sh@192.168.10.99"
   }

{
   "type":"app_process",
   "desc":"應用進程FIN_WAIT2連接數",
   "@timestamp":"1561030444",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"0",
   "checker":"/root/100_app_index/app_process_index/20_app_process_index.sh@192.168.10.99"
   }

{
   "type":"app_process",
   "desc":"日志空間使用率",
   "@timestamp":"1561030444",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"20%",
   "checker":"/root/100_app_index/app_process_index/20_app_process_index.sh@192.168.10.99"
   }

{
   "type":"app_process",
   "desc":"應用程序空間使用率",
   "@timestamp":"1561030444",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"75%",
   "checker":"/root/100_app_index/app_process_index/20_app_process_index.sh@192.168.10.99"
   }

{
   "type":"app_process",
   "desc":"應用所在磁盤讀速率(Blk/s)",
   "@timestamp":"1561030444",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"2.30",
   "checker":"/root/100_app_index/app_process_index/20_app_process_index.sh@192.168.10.99"
   }

{
   "type":"app_process",
   "desc":"應用所在磁盤寫速率(Blk/s)",
   "@timestamp":"1561030444",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"16.41",
   "checker":"/root/100_app_index/app_process_index/20_app_process_index.sh@192.168.10.99"
   }

{
   "type":"app_process",
   "desc":"應用所在磁盤TPS",
   "@timestamp":"1561030444",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"1.31",
   "checker":"/root/100_app_index/app_process_index/20_app_process_index.sh@192.168.10.99"
   }

{
   "type":"app_process",
   "desc":"TOMCAT分配最小內存",
   "@timestamp":"1561030444",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"當前沒有Tomcat進程",
   "checker":"/root/100_app_index/app_process_index/20_app_process_index.sh@192.168.10.99"
   }

{
   "type":"app_process",
   "desc":"TOMCAT分配最大內存",
   "@timestamp":"1561030444",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"當前沒有Tomcat進程",
   "checker":"/root/100_app_index/app_process_index/20_app_process_index.sh@192.168.10.99"
   }

{
   "type":"app_process",
   "desc":"TOMCAT分配年輕代空間",
   "@timestamp":"1561030444",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"當前沒有Tomcat進程",
   "checker":"/root/100_app_index/app_process_index/20_app_process_index.sh@192.168.10.99"
   }

{
   "type":"app_process",
   "desc":"TOMCAT每個線程的堆棧大小",
   "@timestamp":"1561030444",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"當前沒有Tomcat進程",
   "checker":"/root/100_app_index/app_process_index/20_app_process_index.sh@192.168.10.99"
   }

{
   "type":"app_process",
   "desc":"TOMCAT-GC時長占比",
   "@timestamp":"1561030444",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"當前沒有Tomcat進程",
   "checker":"/root/100_app_index/app_process_index/20_app_process_index.sh@192.168.10.99"
   }

{
   "type":"app_process",
   "desc":"Zookeeper分配最小內存",
   "@timestamp":"1561030444",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"1459M",
   "checker":"/root/100_app_index/app_process_index/20_app_process_index.sh@192.168.10.99"
   }

{
   "type":"app_process",
   "desc":"Zookeeper分配最大內存",
   "@timestamp":"1561030444",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"1459M",
   "checker":"/root/100_app_index/app_process_index/20_app_process_index.sh@192.168.10.99"
   }

{
   "type":"app_process",
   "desc":"KAFKA分配最小內存",
   "@timestamp":"1561030444",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"當前沒有KAFKA進程",
   "checker":"/root/100_app_index/app_process_index/20_app_process_index.sh@192.168.10.99"
   }

{
   "type":"app_process",
   "desc":"KAFKA分配最大內存",
   "@timestamp":"1561030444",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"當前沒有KAFKA進程",
   "checker":"/root/100_app_index/app_process_index/20_app_process_index.sh@192.168.10.99"
   }

{
   "type":"app_process",
   "desc":"應用系統進程數量",
   "@timestamp":"1561030444",
   "appname":"bobo",
   "hostname":"kevin_test",
   "value":"10",
   "checker":"/root/100_app_index/app_process_index/20_app_process_index.sh@192.168.10.99"
   }

最后將上面的第三個腳本整合到"20_app_process_index_es.py"腳本里,作為ES入倉請求的腳本

[root@kevin_test app_process_index]# cat 20_app_process_index_es.py 
#!/usr/bin/python
# -*- coding: UTF-8 -*-

import urllib2  
import hashlib
import json
import os

now_path=os.path.abspath(__file__)
now_path=os.path.dirname(now_path)
index_script="sh %s/20_app_process_index.sh" % (now_path)

json_set = os.popen(index_script).read().split('+')

app_index = []
for json_str in json_set:
    app_index.append(json.loads(json_str))

url = 'http://192.168.10.10:10222/haha/heiheiAPI/test_1_kafka'
data = {
    'token': 'bd1df2b11111111112222222222222222333333333333333333yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy',
    'data': app_index
}

headers = {'Content-Type': 'application/json'}
req = urllib2.Request(url, json.dumps(data), headers = headers)
res = urllib2.urlopen(req).read()

print res
#print app_index

執行這個請求腳本

[root@kevin_test app_process_index]# python 20_app_process_index_es.py
{"retCode": 200}

將腳本中的最后一行注釋打開(即"#print app_index"),測試下入倉的數據:
[root@kevin_test app_process_index]# python 20_app_process_index_es.py
{"retCode": 200}
[{u'appname': u'bobo', u'@timestamp': u'1561030595', u'hostname': u'kevin_test', u'value': u'69.7%', u'checker': 
u'/root/100_app_index/app_process_index/20_app_process_index.sh@192.168.10.99', u'type': u'app_process', u'desc': u'
\u5e94\u7528\u8fdb\u7a0b\u5360\u5185\u5b58\u767e\u5206\u6bd4'}, {u'appname': u'bobo', u'@timestamp': u'1561030595', 
u'hostname': u'kevin_test', u'value': u'13.8%', u'checker': u'/root/100_app_index/app_process_index/20_app_process_index.sh@192.168.10.99', 
u'type': u'app_process', u'desc': u'\u5e94\u7528\u8fdb\u7a0b\u5360CPU\u767e\u5206\u6bd4'}, {u'appname': u'bobo', u'@timestamp': u'1561030595', 
u'hostname': u'kevin_test', u'value': u'609-08:54:24, ../src/redis-sentinel', u'checker': 
u'/root/100_app_index/app_process_index/20_app_process_index.sh@192.168.10.99', u'type': u'app_process', u'desc': 
u'\u5e94\u7528\u8fdb\u7a0brun\u6700\u957f\u65f6\u95f4\u53ca\u5176\u8fdb\u7a0b'}, {u'appname': u'bobo', u'@timestamp': u'1561030595', u'hostname': 
u'kevin_test', u'value': u'0', u'checker': u'/root/100_app_index/app_process_index/20_app_process_index.sh@192.168.10.99', u'type': u'app_process', 
u'desc': u'\u5e94\u7528\u8fdb\u7a0bTIME-WAIT\u8fde\u63a5\u6570'}, {u'appname': u'bobo', u'@timestamp': u'1561030595', u'hostname': u'kevin_test', 
u'value': u'458', u'checker': u'/root/100_app_index/app_process_index/20_app_process_index.sh@192.168.10.99', u'type': u'app_process', u'desc': 
u'\u5e94\u7528\u8fdb\u7a0bESTABLISHED\u8fde\u63a5\u6570'}, {u'appname': u'bobo', u'@timestamp': u'1561030595', u'hostname': u'kevin_test', 
u'value': u'0', u'checker': u'/root/100_app_index/app_process_index/20_app_process_index.sh@192.168.10.99', u'type': u'app_process', u'desc': 
u'\u5e94\u7528\u8fdb\u7a0bFIN_WAIT2\u8fde\u63a5\u6570'}, {u'appname': u'bobo', u'@timestamp': u'1561030595', u'hostname': u'kevin_test', 
u'value': u'20%', u'checker': u'/root/100_app_index/app_process_index/20_app_process_index.sh@192.168.10.99', u'type': u'app_process', 
u'desc': u'\u65e5\u5fd7\u7a7a\u95f4\u4f7f\u7528\u7387'}, {u'appname': u'bobo', u'@timestamp': u'1561030595', u'hostname': u'kevin_test', 
u'value': u'75%', u'checker': u'/root/100_app_index/app_process_index/20_app_process_index.sh@192.168.10.99', u'type': u'app_process', u'desc': 
u'\u5e94\u7528\u7a0b\u5e8f\u7a7a\u95f4\u4f7f\u7528\u7387'}, {u'appname': u'bobo', u'@timestamp': u'1561030595', u'hostname': u'kevin_test', 
u'value': u'2.30', u'checker': u'/root/100_app_index/app_process_index/20_app_process_index.sh@192.168.10.99', u'type': u'app_process', u'desc': 
u'\u5e94\u7528\u6240\u5728\u78c1\u76d8\u8bfb\u901f\u7387\uff08Blk/s\uff09'}, {u'appname': u'bobo', u'@timestamp': u'1561030595', u'hostname': 
u'kevin_test', u'value': u'16.41', u'checker': u'/root/100_app_index/app_process_index/20_app_process_index.sh@192.168.10.99', u'type': u'app_process', 
u'desc': u'\u5e94\u7528\u6240\u5728\u78c1\u76d8\u5199\u901f\u7387\uff08Blk/s\uff09'}, {u'appname': u'bobo', u'@timestamp': u'1561030595', u'hostname': 
u'kevin_test', u'value': u'1.31', u'checker': u'/root/100_app_index/app_process_index/20_app_process_index.sh@192.168.10.99', u'type': u'app_process', 
u'desc': u'\u5e94\u7528\u6240\u5728\u78c1\u76d8TPS'}, {u'appname': u'bobo', u'@timestamp': u'1561030595', u'hostname': u'kevin_test', u'value': 
u'\u5f53\u524d\u6ca1\u6709Tomcat\u8fdb\u7a0b', u'checker': u'/root/100_app_index/app_process_index/20_app_process_index.sh@192.168.10.99', u'type': 
u'app_process', u'desc': u'TOMCAT\u5206\u914d\u6700\u5c0f\u5185\u5b58'}, {u'appname': u'bobo', u'@timestamp': u'1561030595', u'hostname': u'kevin_test', 
u'value': u'\u5f53\u524d\u6ca1\u6709Tomcat\u8fdb\u7a0b', u'checker': u'/root/100_app_index/app_process_index/20_app_process_index.sh@192.168.10.99', 
u'type': u'app_process', u'desc': u'TOMCAT\u5206\u914d\u6700\u5927\u5185\u5b58'}, {u'appname': u'bobo', u'@timestamp': u'1561030595', u'hostname': 
u'kevin_test', u'value': u'\u5f53\u524d\u6ca1\u6709Tomcat\u8fdb\u7a0b', u'checker': u'/root/100_app_index/app_process_index/20_app_process_index.sh@192.168.10.99', 
u'type': u'app_process', u'desc': u'TOMCAT\u5206\u914d\u5e74\u8f7b\u4ee3\u7a7a\u95f4'}, {u'appname': u'bobo', u'@timestamp': u'1561030595', u'hostname': 
u'kevin_test', u'value': u'\u5f53\u524d\u6ca1\u6709Tomcat\u8fdb\u7a0b', u'checker': u'/root/100_app_index/app_process_index/20_app_process_index.sh@192.168.10.99', 

======================================================
上面涉及到python的當前路徑調用問題(即上面討論的第一、二、三的python腳本)

需要注意:
上面20_app_process_index_es.py腳本中的"json_set = os.popen(index_script).read().split('+')"說明:
20_app_process_index.sh腳本執行結果為json格式,並通過"+"分割,那么傳給列表app_index里面,每個元素
就是這個shell腳本執行結果中的一組json內容。

注意:如果shell執行結果的內容中有"+",則執行20_app_process_index_es.py腳本就會失敗,python解析失敗!
可以在20_app_process_index_es.py腳本中"app_index.append(json.loads(json_str))"這一行的上面添加"
print json_str",即打印app_index列表內容進行測試。 如果shell腳本執行結果中有"+",跟設置的分隔符一樣,
就可以測試到執行python腳本失敗的原因了!

可以將shell腳本中的分割符號"+"改寫其他的,比如"+++++"

這里對python獲取當前目錄路徑和文件的方法做個記錄:
一、獲取當前路徑

1)使用sys.argv[0]
import sys
print sys.argv[0]
#輸出
#本地路徑
     
2)os模塊
import  os
print os.getcwd()                     #獲取當前工作目錄路徑
print os.path.abspath('.')            #獲取當前工作目錄路徑
print os.path.abspath('test.txt')     #獲取當前目錄文件下的工作目錄路徑
print os.path.abspath('..')           #獲取當前工作的父目錄 !注意是父目錄路徑
print os.path.abspath(os.curdir)      #獲取當前工作目錄路徑

3)改變當前目錄
使用: os.chdir(path)。

4)組合路徑返回
os.path.join('file1','file2','file3')
合並得到路徑 file1/file2/file3

二、獲得當前目錄下所有文件

1)os.walk() 用於在目錄樹種游走輸出目錄中的文件名字,向上或下;

語法
os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]])

參數:
top -- 根目錄下的每一個文件夾(包含它自己), 產生3-元組 (dirpath, dirnames, filenames)【文件夾路徑, 
       文件夾名字, 文件名】。

topdown --可選,為True或者沒有指定, 一個目錄的的3-元組將比它的任何子文件夾的3-元組先產生 (目錄自上而下)。
          如果topdown為 False, 一個目錄的3-元組將比它的任何子文件夾的3-元組后產生 (目錄自下而上)。

onerror -- 可選,是一個函數; 它調用時有一個參數, 一個OSError實例。報告這錯誤后,繼續walk,或者拋出exception終止walk。

followlinks -- 設置為 true,則通過軟鏈接訪問目錄。

2)
import os
root = os.getcwd()

def file_name(file_dir):
    for root, dirs, files in os.walk(file_dir):
        print "-----------"
        print root    #os.walk()所在目錄
        print dirs    #os.walk()所在目錄的所有目錄名
        print files   #os.walk()所在目錄的所有非目錄文件名
        print " "

file_name(root)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM