Alternative to ping gateway failover

Hello,
We have 3 wan interfaces with bandwidth based load balancing. Sometimes we will experience a partial failure on our primary wan and still will allow ping replies from google dns or something else while creating a bad bottle neck for our client traffic causing timeouts.

The script below is an attempt to use bandwidth consumption to initiate failover. The Script can detect if the Rx bps drops below a set rate and after the 5th run and the bps is still below the set rate to take action. The problem is an action is taken every time the router sees the Rx bps drops below the set rate. I don’t want the router to trigger failover every single time Rx bps drops below that point. I would like to have some cushion of sorts as to not trigger a false positive.

:global rxbps;
/interface monitor-traffic 1_WAN_1 once do={
:global rxbps $("rx-bits-per-second");
}
:if [($rxbps < 5000) count=5]  do={
/ip firewall mangle set [find comment="TestRule"] new-routing-mark=Test1;
:log info "Test1"
}

Thanks in advance

Anybody

After some some research I wrote this script and It seems to be working for me. Does anybody have any better ideas or a more efficient way?

:global rxbps;
/interface monitor-traffic 1_WAN_1 once do={
:global rxbps $("rx-bits-per-second")};
:if ($rxbps < 8000) do={
     /interface monitor-traffic 1_WAN_1 once do={
     :global rxbps $("rx-bits-per-second")}
     } else={stop script};
:delay 5s
:if ($rxbps < 8000) do={
     /interface monitor-traffic 1_WAN_1 once do={
     :global rxbps $("rx-bits-per-second")}
     } else={stop script};
:delay 5s
:if ($rxbps < 8000) do={
     /interface monitor-traffic 1_WAN_1 once do={
     :global rxbps $("rx-bits-per-second")}
     } else={stop script};
:delay 5s
:if ($rxbps < 8000) do={
     /interface monitor-traffic 1_WAN_1 once do={
     :global rxbps $("rx-bits-per-second")}
     } else={stop script};
:delay 5s
:if ($rxbps < 8000) do={
     /interface monitor-traffic 1_WAN_1 once do={
     :global rxbps $("rx-bits-per-second")}
     } else={stop script};
:if ($rxbps < 8000) do={
/interface monitor-traffic 1_WAN_1 once do={
:global rxbps $("rx-bits-per-second")}} else={stop script};
:if ($rxbps < 8000) do={/ip firewall mangle set [find comment="TestRule"] new-routing-mark=Test1};
:log info "Test"

Thanks

Just posting my latest update to this script. I now incorporate rx drops and rx errors to help make a determination if there is a Partial WAN failure.

Note the setrxdropsps and setrxerrorsps are set to (= 0) for testing purposes. Any suggestions?

:global rxbps;
:global rxdropsps;
:global rxerrorsps;
:local setrxbps 80000000;
:local setdropsps 0;
:local seterrorsps 0;
/interface monitor-traffic 1_WAN_1 once do={
     :global rxbps $("rx-bits-per-second")
     :global rxdropsps $("rx-drops-per-second")
     :global rxerrorsps $("rx-errors-per-second")
     };
:if ($rxbps < setrxbps) do={
     /interface monitor-traffic 1_WAN_1 once do={
     :global rxbps $("rx-bits-per-second")
     }
     :if ($rxdropsps = setdropsps) do={
     /interface monitor-traffic 1_WAN_1 once do={
     :global rxdropsps $("rx-drops-per-second")
     }
     } else={stop script}
     :if ($rxerrorsps = seterrorsps) do={
     /interface monitor-traffic 1_WAN_1 once do={
     :global rxerrorsps $("rx-errors-per-second")
     }
     } else={stop script} 
     } else={stop script};
:delay 2s
:if ($rxbps < setrxbps) do={
     /interface monitor-traffic 1_WAN_1 once do={
     :global rxbps $("rx-bits-per-second")
     }
     :if ($rxdropsps = setdropsps) do={
     /interface monitor-traffic 1_WAN_1 once do={
     :global rxdropsps $("rx-drops-per-second")
     }
     } else={stop script}
     :if ($rxerrorsps = seterrorsps) do={
     /interface monitor-traffic 1_WAN_1 once do={
     :global rxerrorsps $("rx-errors-per-second")
     }
     } else={stop script} 
     } else={stop script};
:delay 2s
:if ($rxbps < setrxbps) do={
     /interface monitor-traffic 1_WAN_1 once do={
     :global rxbps $("rx-bits-per-second")
     }
     :if ($rxdropsps = setdropsps) do={
     /interface monitor-traffic 1_WAN_1 once do={
     :global rxdropsps $("rx-drops-per-second")
     }
     } else={stop script}
     :if ($rxerrorsps = seterrorsps) do={
     /interface monitor-traffic 1_WAN_1 once do={
     :global rxerrorsps $("rx-errors-per-second")
     }
     } else={stop script} 
     } else={stop script};
:delay 2s
:if ($rxbps < setrxbps) do={
     /interface monitor-traffic 1_WAN_1 once do={
     :global rxbps $("rx-bits-per-second")
     }
     :if ($rxdropsps = setdropsps) do={
     /interface monitor-traffic 1_WAN_1 once do={
     :global rxdropsps $("rx-drops-per-second")
     }
     } else={stop script}
     :if ($rxerrorsps = seterrorsps) do={
     /interface monitor-traffic 1_WAN_1 once do={
     :global rxerrorsps $("rx-errors-per-second")
     }
     } else={stop script}
     } else={stop script};
/ip firewall mangle set [find comment="TestRule"] new-routing-mark=Test1	 
:log info "WAN1 Failed Directing Traffic to WAN2"

Thanks

Thanks whiskeyman7, very interesting

Thanks for the Karma bajodel! My first point!