#!/bin/sh

envnik=$(basename "${TILER_ENVIRONMENT}" .js)

if test "$1" = "config"; then
echo "graph_title fd usage (${envnik})"
cat <<"EOM"
graph_vlabel number of file descriptors
graph_category windshaft
graph_scale no
procs.label Number of tiler processes
pgsql.label PostgreSQL connections (max)
redis.label Redis connections (max)
http.label Incoming http requests (max)
caches.label Number of renderer caches (max)
nfd.label Total file descriptors (max)
EOM
exit 0
fi

if test x"$1" != x; then
  TILER_ENVIRONMENT=$(cd $(dirname $0); pwd)/../../config/environments/${1}.js
fi

if test -z "$TILER_ENVIRONMENT"; then
  echo "Usage: $0 [<environment>]" >&2
  echo "   or: [TILER_ENVIRONMENT=<environment>] $0" >&2
  exit 1
fi

http_port=$(echo "console.log(require('${TILER_ENVIRONMENT}').port)" | node) || exit 1
pgsql_port=$(echo "console.log(require('${TILER_ENVIRONMENT}').postgres.port)" | node) || exit 1
redis_port=$(echo "console.log(require('${TILER_ENVIRONMENT}').redis.port)" | node) || exit 1

pids=$(lsof -i :${http_port} | grep LISTEN | awk '{print $2}')
nworkers=$(echo "${pids}" | wc -l)
pids=$(echo "${pids}" | paste -sd ' ')

if test -z "${pids}"; then
  echo "No processes found listening on tcp port '${http_port}'" >&2
  exit 1
fi

tmpreport="/tmp/checkfd.$$.txt"

lsof -Pp $(echo "${pids}" | tr ' ' ',') > "${tmpreport}"

maxdb=0
maxredis=0
maxhttp=0
maxtot=0
maxcache=0

for pid in ${pids}; do

  cnt=$(grep "${pid}" "${tmpreport}" | grep ":${pgsql_port} " | wc -l);
  if test $cnt -gt $maxdb; then maxdb=$cnt; fi
  
  cnt=$(grep "${pid}" "${tmpreport}" | grep ":${redis_port} " | wc -l);
  if test $cnt -gt $maxredis; then maxredis=$cnt; fi

  cnt=$(grep "${pid}" "${tmpreport}" | grep ":${http_port}-" | grep -v "LISTEN" | wc -l);
  if test $cnt -gt $maxhttp; then maxhttp=$cnt; fi

  cnt=$(grep "${pid}" "${tmpreport}" | wc -l);
  if test $cnt -gt $maxtot; then maxtot=$cnt; fi

  log=$(grep "${pid}" "${tmpreport}" | grep -w 1w | awk '{print $9}')
  if test -e "${log}"; then
    kill -USR2 "${pid}"
    cnt=$(tac ${log} | sed -n -e '/ItemKey/p;/ RenderCache /q' | wc -l)
    if test $cnt -gt $maxcache; then maxcache=$cnt; fi
  else
    # report the error...
    maxcache=-1
  fi

done

echo "procs.value ${nworkers}"
echo "pgsql.value ${maxdb}"
echo "redis.value ${maxredis}"
echo "http.value ${maxhttp}"
echo "caches.value ${maxcache}"
echo "nfd.value ${maxtot}"

rm -f "${tmpreport}"
