Are you using server name indication on your SharePoint servers? We have an external (EAV) monitor that can do SNI.
What you could do is set up multiple pools containing the same pool members, one for each FQDN, and an iRule on the virtual server to distribute requests to the correct pool based on HTTP::host value.
Using a unique SNI EAV monitor on each pool would down that pool if a particular site collection was not responding. Here's an example of that monitor:
!/bin/sh
These arguments supplied automatically for all external monitors:
$1 = IP (nnn.nnn.nnn.nnn notation)
$2 = port (decimal, host byte order)
This script expects the following Name/Value pairs:
HOST = the host name of the SNI-enabled site
URI = the URI to request
RECV = the expected response
Remove IPv6/IPv4 compatibility prefix (LTM passes addresses in IPv6 format)
NODE=`echo ${1} | sed 's/::ffff://'`
if [[ $NODE =~ ^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$ ]]; then
node is v4
NODE=${NODE}
else
node is v6
NODE=[${NODE}]
fi
PORT=${2}
PIDFILE="/var/run/`basename ${0}`.sni_monitor_${HOST}_${PORT}_${NODE}_sni.pid"
kill of the last instance of this monitor if hung and log current pid
if [ -f $PIDFILE ]
then
echo "EAV exceeded runtime needed to kill ${HOST}:${PORT}:${NODE}" | logger -p local0.error
kill -9 `cat $PIDFILE` > /dev/null 2>&1
fi
curl-apd -k -v --resolve $HOST:$PORT:$NODE https://$HOST$URI 2>&1 > /dev/null | grep -i "${RECV}"
STATUS=$?
rm -f $PIDFILE
if [ $STATUS -eq 0 ]
then
echo "UP"
fi
exit