O problema
A partir da versão 6.3.3 do OpMon foi implementado um dump para o cache de mensagens não enviadas. Por mensagens não enviadas entendem-se as mensagens(textos, queries, etc) que não conseguiram ser atribuídas para o Gearman e portanto permanecem na memória interna do OpMon aguardando outra oportunidade de serem enviadas.
Em outras palavras, quando o OpMon não consegue entregar uma mensagem para o Gearman ele mantem a mensagem em uma fila interna ao processo intintulada delayed_messages, quando paramos o processo do OpMon estas mensagens são gravadas no arquivo:
/usr/local/opmon/var/delayed-messages.dump
no seguinte formato:
<fila> <mensagem>
Vale ressaltar que estas mensagens antes da versão 6.3.3 eram simplesmente descartadas quando o processo do OpMon parava, o que veio a acarretar uma gama grande de problemas pois estados eram perdidos e os relatórios de Disponibilidade acabavam não retratando fielmente o estado da monitoração. Também é importante ter em mente que o OpMon continua tentando entregar estas mensagens, sendo assim, esta fila deverá conter apenas as mensagens que ainda não puderam ser entregues mas poderão no futuro caso a conexão com o Gearman se restabeleça. Em outras palavras, se o processo do Gearmand for parado por alguns instantes é possível que esta fila passe a receber mensagens porém quando o processo do Gearman voltar ao ar estas mensagens serão entregues automaticamente, portanto a fila tornará a ficar vazia.
Como saber se o OpMon tem mensagens atrasadas
Para isto, basta rodar o seguinte comando:
[root@opmon ~]# echo "[`date +%s`] _OPDB_FETCH_DELAYED" >/usr/local/opmon/var/rw/opmon.cmd
A quantidade de mensagens aguardando na fila para serem entregues aparecerá no arquivo opmon.log, dentro do diretório /usr/local/opmon/var. Para forçar o dump das mensagens que estão na fila basta parar o processo do OpMon ou então rodar o seguinte comando:
[root@opmon ~]# echo "[`date +%s`] _OPDB_DUMP_DELAYED" >/usr/local/opmon/var/rw/opmon.cmd
Após rodar o comando acima, todas as mensagens pendentes serão armazenadas no arquivo de dump citado anteriormente.
Re-importando mensagens
Caso o OpMon possua mensagens(linhas) no arquivo de dump, as mesmas deverão ser importadas usando um utilitário de linha de comando. Isso garantirá que os estados e as checagens que não puderam ser entregues ao Gearman sejam novamente importadas assegurando relatórios tanto de Capacidade quanto de Disponibilidade mais reais.
Para importar as mensagens primeiro precisamos garantir que o OpMon esteja parado, para assegurar que novas mensagens não entrem enquanto importamos as antigas. Uma vez que o OpMon esteja parado, basta rodar o seguinte comando:
[root@opmon ~]# import_opmon_delayed_messages
Uma mensagem de sucesso será exibida. Caso isto não ocorra, recomenda-se que se copie o arquivo de dump para um diretório temporário e se comunique a equipe de desenvolvimento da OpServices. Caso a mensagem de sucesso apareça(que é o que se espera), o arquivo de dump deve ser deletado/removido manualmente e o processo do OpMon iniciado novamente.
Considerações finais
Não considera-se a existência de mensagens no arquivo de dump como algo normal, porém, devido a oscilações na rede elas podem eventualmente acontecer. Recomenda-se fortemente a monitoração deste arquivo buscando por possíveis linhas e caso isso ocorra um alerta seja gerado, podendo até ser configurado um Event Handler para re-importar os dados do arquivo.
Temendo efeitos colaterais como por exemplo uma latência maior na monitoração, este processo não foi automatizado porém no futuro não descartamos esta ideia.