For monitoring statistics (memory usage, load, mysql activity, apache activity, etc.) I use Munin. Out of the box it already tracks a lot of things and plots graphs for different time intervals (last 24 hours, last 7 days, last month, last year). Through plugins even more things can be monitored. It's output are HTML pages with pretty graphs.
Munin has a master/node architecture: nodes gather statistics on a server and the master stores the data and produces HTML and graphs.
I use Monit to keep track of running processes and to restart or alert me when certain configureable conditions arise (high cpu load, high memory usage, no HTTP response, etc.) Monit can also monitor more general things about a server, such as cpu load, memory usage, harddisk status or disk usage.
Monit needs to be configured for every service or hardware you want to monitor and how to respond when something goes wrong. The most used options are to do nothing, send an alert email or restart the service.
Monit is great when it works, but sometimes it fails to start, stop or restart a service and there is not a lot of diagnostic information available to tell you what went wrong. This means you don't know if the problem was with your service or with the Monit configuration, which runs with a cron-like minimal environment.
Both tools are available by default on most Linux distributions.