This is an area where Kubernetes has the correct model, there should be a load balancer between all systems which should have functional health checks.
Once you start to add Nagios, Zabbix or other types of monitoring to the system you start to build a large state machine. This will break the loose coupling model and introduce inter-dependencies that inhibit the ease refactoring. While not set in stone the key differentiation between microservices and other variants of SOA is this loose coupling.
If the services are fine-grained and perform a single function, implement a health check at an upstream load balancer, then monitor the active pool members.
As an example in HAproxy
backend myapp
[...]
option tcp-check
tcp-check send GET\ /health HTTP/1.0\r\n
tcp-check send Host:\ foo\r\n
tcp-check send \r\n
tcp-check expect rstring ^HTTP/1.1\ 200\ Ok
tcp-check expect string container\ Good
server srv1 10.0.0.1:8080 check
server srv2 10.0.0.2:8080 check
In theory you don't care about the performance of an actual container, just that your overall performance is good.
This method makes it easy to have the system self repair and to scale with a minimal amount of complexity.
Basically you only have to check if the number of systems you expect are alive, and if not you spin up some more. If you need to add capacity you simply change the number of expected nodes.
This also simplifies refactoring as you only need to replicate or modify this test with no external dependencies or state machine.
It should also reduce down time and middle of the night Pagerduty alerts as the system self repairs.
As for the overall systems metrics, which are needed to trace down issues like latency I would want them in a central location using a tool like elasticsearch. If you use syslog, logstash or log4??? to collect metrics that will be far more useful in the long run. When systems are small and simple traditional polling based monitoring may provide enough metrics but it is preferable to have them in a format that is searchable and more importantly relational to other systems.
Solutions like monit still have their place, but it is to monitor the long lived components like the VMs or bare metal hosting your swarm, but the containers themselves should be decoupled from that system to get the most benefits from a micro-services model.