Como você mencionou, o Zabbix é projetado para hosts / servidores e chaves, portanto, como uma primeira etapa para modelar sua hierarquia, você poderia criar hosts para cada VM e usar grupos de host conforme necessário para datacenters ou racks.
O Zabbix não possui suporte embutido para clusters ou aplicativos de roaming. Para monitorar aqueles que eu geralmente crio "meta-hosts", basicamente esvazio as entradas do host sem nenhum agente. Então eu uso algum script de monitoramento para enviar itens do trapaceiro zabbix para aquele host.
Por exemplo: usando três VMs app1, app2, app3 com monitoramento normal do sistema (CPU, memória), além de um serviço "meta-host" 1 com meu modelo de aplicativo. Em seguida, ter meu aplicativo de roaming envia dados de monitoramento com zabbix_sender -z zabbixserver -s service1 -k service.some.stat -o 42
(ou a chamada de biblioteca equivalente para a linguagem de programação).
Como resultado, terei estatísticas do sistema para todas as VMs e estatísticas contínuas do aplicativo, em vez de estatísticas de aplicativos intermitentes distribuídas em três VMs.