We use a combination of Munin and Nodeping. Munin gives us the graphs we need to address problems. So far nodeping has been by far the best uptime monitoring we have used. It is generally very accurate and has lots of options.
Internally, munin, mrtg and nagios. For external monitoring pingdom has been pretty solid. If we were to start over now we would likely replace mrtg with cactii. Likewise we would explore Zabbix and Zenoss for nagios replacements.
It really depends on what but we use Nagios + check_mk + pnp4nagios for general monitoring. We use Munin for resource graphing and Cacti for other SNMP metrics (IE: switches). We use Smokeping to monitor latency / strange issues from other locations.
We're in the midst of migrating over to ZenOSS however it's a slow and steady process to get it to our liking. It's a wicked system however!
We use NodePing, StatusCake, and a custom monitoring script (basic PING and HTTP tests) for real-time alerts for any outages.
For resources, we have Observium for our network and a custom monitoring software for all of our servers. We have munin setup for our physical nodes also.
Nagios for basic monitoring if things are up or down, basically I just let it sit and email me in case something goes down. Munin for graphs and more data.
We've been having a good experience with Cacti and RDDTool for graphing. Pingdom and New Relic has been great for monitoring uptime and performance from third parties.