Estamos implementando uma nova solução de monitoramento centralizado (Zenoss). A incorporação de servidores, redes e programas Java é direta com SNMP e JMX.
A questão, no entanto, é quais são as melhores práticas para monitorar e gerenciar aplicativos C ++ personalizados em ambientes grandes e heterogêneos (Solaris x86, RHEL Linux, Windows)?
As possibilidades que vejo são:
- SNMP líquido
- Vantagens
- daemon central único em cada servidor
- padrão conhecido
- fácil integração em soluções de monitoramento
- já executamos daemons Net SNMP em nossos servidores
- implementação complexa (MIBs, biblioteca Net SNMP)
- nova tecnologia a ser introduzida para os desenvolvedores de C ++
- Vantagens
- daemon central único em cada servidor
- padrão conhecido
- integração desconhecida em soluções de monitoramento (eu sei que eles podem fazer alertas com base em texto, mas como funcionaria para enviar telemetria como uso de memória, profundidade de filas, capacidade de encadeamento etc.)
- implementação simples
- possíveis problemas de integração
- tecnologia um pouco nova para desenvolvedores de C ++
- possíveis problemas de portabilidade se trocarmos de fornecedores de monitoramento
- provavelmente envolve criar um protocolo de comunicação ad-hoc (ou usar dados estruturados RFC5424; não sei se o Zenoss suporta isso sem a codificação Zenpack personalizada)
- Vantagens
- interface de gerenciamento consistente para Java e C ++
- padrão conhecido
- fácil integração em soluções de monitoramento
- implementação um tanto simples (já fazemos isso hoje para outros fins)
- complexidade (JNI, camada de conversão entre C ++ nativo e Java, basicamente escrevendo o código de gerenciamento duas vezes)
- possíveis problemas de estabilidade
- requer uma JVM em cada processo, usando consideravelmente mais memória
- JMX é uma nova tecnologia para desenvolvedores de C ++
- cada processo possui sua própria porta JMX (executamos muitos processos em cada máquina)
- Vantagens
- daemon central único em cada servidor
- interface de gerenciamento consistente para Java e C ++
- padrão conhecido
- fácil integração em soluções de monitoramento
- complexidade (basicamente escrevendo o código de gerenciamento duas vezes)
- precisa encontrar ou escrever um daemon
- precisa de um protocolo entre o daemon JMX e o processo C ++
- JMX é uma nova tecnologia para desenvolvedores de C ++
- Vantagens
- interface de gerenciamento consistente para Java e C ++
- padrão conhecido
- fácil integração em soluções de monitoramento
- daemon central único em cada servidor quando executado no modo JVM compartilhado
- implementação um tanto simples (requer geração de código)
- complexidade (geração de código, requer uma GUI e várias rodadas de ajustes para produzir o código proxy)
- possíveis problemas de estabilidade JNI
- requer uma JVM em cada processo, usando consideravelmente mais memória (no modo incorporado)
- Não suporta Solaris x86 (separador de transações)
- Mesmo se ele suporta Solaris x86, existem possíveis problemas de compatibilidade do compilador (usamos uma combinação estranha de STLPort e Forte no Solaris
- cada processo possui sua própria porta JMX quando executado no modo incorporado (executamos muitos processos em cada máquina)
- possivelmente impede um servidor JMX compartilhado para processos não C ++ (?)
Estou faltando alguma solução simples e razoavelmente padronizada?
Como não há outras soluções razoáveis, qual dessas soluções é normalmente usada para programas C ++ personalizados?
Minha intuição é que o Net SNMP é como as pessoas fazem isso, mas eu gostaria da opinião e experiência de outras pessoas antes de tomar uma decisão.