#!/bin/bash
#
#***************************************************************************
# Author: liwanggui
# Email: liwanggui@163.com
# Date: 2021-12-17
# FileName: apache_exporter.sh
# Description: apache 监控数据采集
# Copyright (C): 2021 All rights reserved
#***************************************************************************
#
# 与 node_exporter 配合使用，用于替代 apache_exporter，
# 使用 node_exporter 的 textfile collector 功能向 prometheus 提供数据
#

PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin

prog=apache
prog_exe=httpd

server_url="http://127.0.0.1:818/server-status/?auto"

textfile="/usr/local/node_exporter/metrics/${prog}.prom"

declare -A metrics=()


function _curl() {
    curl -s --connect-timeout 3 $@
}

function exporter() {
    if ! _curl -I $server_url &>/dev/null; then
        metrics["apache_up"]=0
        return
    fi
    
    tmpfile=$(mktemp)
    _curl $server_url | tr -d '\r' > $tmpfile

    metrics["apache_up"]=1
    metrics['apache_process_num']=$(ps aux | grep apache | grep $prog_exe | wc -l)
    metrics["apache_accesses_total"]=$(grep '^Total Accesses:' $tmpfile | awk '{print $NF}')
    metrics["apache_workers{state=\"busy\"}"]=$(grep '^BusyWorkers:' $tmpfile | head -n1 | awk '{print $NF}')
    metrics["apache_workers{state=\"idle\"}"]=$(grep '^IdleWorkers:' $tmpfile | head -n1 | awk '{print $NF}')
    metrics["apache_uptime_seconds_total"]=$(grep '^Uptime:' $tmpfile | awk '{print $NF}')
    
    metrics["apache_scoreboard{state=\"idle\"}"]=${metrics["apache_workers{state=\"idle\"}"]}
    metrics["apache_scoreboard{state=\"closing\"}"]=$(grep '^Scoreboard:' $tmpfile | awk '{print $NF}' | grep -o 'C' | wc -l)
    metrics["apache_scoreboard{state=\"dns\"}"]=$(grep '^Scoreboard:' $tmpfile | awk '{print $NF}' | grep -o 'D' | wc -l)
    metrics["apache_scoreboard{state=\"graceful_stop\"}"]=$(grep '^Scoreboard:' $tmpfile | awk '{print $NF}' | grep -o 'G' | wc -l)
    metrics["apache_scoreboard{state=\"idle_cleanup\"}"]=$(grep '^Scoreboard:' $tmpfile | awk '{print $NF}' | grep -o 'I' | wc -l)
    metrics["apache_scoreboard{state=\"keepalive\"}"]=$(grep '^Scoreboard:' $tmpfile | awk '{print $NF}' | grep -o 'K' | wc -l)
    metrics["apache_scoreboard{state=\"logging\"}"]=$(grep '^Scoreboard:' $tmpfile | awk '{print $NF}' | grep -o 'L' | wc -l)
    metrics["apache_scoreboard{state=\"open_slot\"}"]=$(grep '^Scoreboard:' $tmpfile | awk '{print $NF}' | grep -o '\.' | wc -l)
    metrics["apache_scoreboard{state=\"read\"}"]=$(grep '^Scoreboard:' $tmpfile | awk '{print $NF}' | grep -o 'R' | wc -l)
    metrics["apache_scoreboard{state=\"reply\"}"]=$(grep '^Scoreboard:' $tmpfile | awk '{print $NF}' | grep -o 'W' | wc -l)
    metrics["apache_scoreboard{state=\"startup\"}"]=$(grep '^Scoreboard:' $tmpfile | awk '{print $NF}' | grep -o 'S' | wc -l)

    /bin/rm -f $tmpfile
}

function run() {
    [ -f "${textfile}" ] && /bin/rm -f ${textfile}

    # 获取监控数据
    exporter

    # 写入文件
    OLD=$IFS
    IFS=$'\n'
    for key in ${!metrics[@]}; do
        echo "$key ${metrics[$key]:-0}" >> ${textfile}
    done
    IFS=$OLD
}

function help_usage() {
    cat <<EOF
usage: $0 CMD [options]

commands:
    run              采集 ${prog} 监控数据
    help             打印帮助信息

examples:
    # 运行程序采集监控数据
    $0 run
EOF
}

case "$1" in 
    run)
        run
        ;;
    help)
        help_usage
        ;;
    *)
        echo $"Usage: $0 {run|help}"
        exit 2
        ;;
esac