- #3 Traps SNMP
Visão geral
O fluxo de comunicação de uma 'trap SNMP' é o inverso do de uma coleta.
Para este tipo de item o dispositivo monitorado inicia a comunicação enviando um 'trap' que é coletado pelo processo 'Zabbix Trapper' que está presente o Zabbix Server e no Zabbix Proxy.
Normalmente as 'traps' são enviadas quando determinada condição ocorre, a partir desta mudança o Agente SNMP se conecta ao servidor SNMP (no caso o Zabbix Trapper) usando a porta 162 (para as consultas SNMP é utilizada a porta 161). Usando 'traps' você poderá detectar problemas logo que ocorrerem, sem ter que aguardar uma eventual fila de coletas.
O recebimento de 'traps SNMP' no zabbix foi desenvolvido para funcionar em conjunto com o snmptrapd chamando um script perl ou SNMPTT.
O 'workflow' de um recebimento de trap:
- snmptrapd recebe a trap
- snmptrapd envia o dado para o SNMPTT ou chama um 'trap receiver' escrito em Perl
- O SNMPTT ou o 'Perl trap receiver' interpreta, formata e grava o dado em um arquivo
- O 'Zabbix SNMP trapper' lê e interpreta os dados do arquivo
- Para cada trap o Zabbix procura todos os itens de "SNMP trapper" com interfaces compatíveis com a origem do dado. Observe que somente o "IP" ou o "DNS" da interface do host será utilizado durante a pesquisa.
- Para cada item localizado, a trap será comparada com a expressão regular em "snmptrap[regexp]". O dado da trap será enviado como um novo valor para todos os itens compatíveis. Se não for encontrado um item compatível, e existir um item de "snmptrap.fallback" definido, o valor será repassado para ele.
- Se a trap não conseguir salvar o valor recebido em nenhum item, o Zabbix irá registrar isso no "log de traps não correspondentes
". (Que pode ser habilitado através da opção "Registrar traps SNMP não
correspondentes" disponível em Administração → Geral → Outros.)
- Configurando as traps SNMP
A configuração dos campos a seguir é específica para itens deste tipo:
- Você precisará possuir uma interface SNMP
Em Configuração → Hosts, no campo Interface do Host defina uma interface com o IP ou DNS correto. O endereço de cada trap recebida é comparada com o IP ou com o DNS de todas as interfaces SNMP para localizar os hosts correspondentes.
- Configure o item
Utilize uma das chaves de trap SNMP no campo Chave do item:
| Chave | ||
|---|---|---|
| Descrição | Valor retornado | Comentários |
| snmptrap[regexp] | ||
| Captura qualquer trap SNMP que corresponda com um endereço definido pela expressão regular informada no campo regexp | Trap SNMP | Este item só pode ser definido em interfaces SNMP. Este item é suportado desde o Zabbix 2.0.0. Observação: A partir do Zabbix 2.0.5, macros de usuário e expressões globais são suportadas para este tipo de item. |
| snmptrap.fallback | ||
| Captura todas as traps SNMP de um determinado IP que não tenha sido recebida por nenhum item snmptrap[] daquela interface | Trap SNMP | Este item só pode ser definido em interfaces SNMP. Este item é suportado desde o Zabbix 2.0.0. |
Expressões regulares de várias linhas não são suportadas neste momento.
Defina o Tipo da informação para 'Log' para que os registros de hora sejam processados. Observe que qualquer outro formato, tal qual o numérico, também são aceitáveis mas requerem um gerenciador de trap personalizado.
Para a monitoração de trap SNMP, você primeiro deverá configura-la.
- Configurando a monitoração via SNMP trap
Configurando o Zabbix Server/Proxy
Para receber as traps, o Zabbix Server/Proxy deverá estar configurado para iniciar o processo de SNMP trapper e apontado para o arquivo de traps que estará sendo alimentado pelo SNMPTT ou pelo 'perl trap receiver'. Para fazer isso, edite o arquivo de configuração (zabbix_server.conf ou zabbix_proxy.conf):
- StartSNMPTrapper=1
- SNMPTrapperFile=[TRAP FILE]
Se o parâmetro do systemd PrivateTmp tiver sido definido é improvável que funcione no /tmp.
Configurando o SNMPTT
Primeiramente o 'snmptrapd' precisa estar configurado para utilizar o SNMPTT.
Para uma melhor performance, o SNMPTT precisa estar
configurado como um daemon utilizando o snmptthandler-embedded para
enviar as traps. Veja mais intruções sobre configuração do SNMPTT neste
endereço:
http://snmptt.sourceforge.net/docs/snmptt.shtml
Quando o SNMPTT estiver apto a receber as 'traps', ajuste-o para registrar as traps:
- registre as traps no arquivo de traps que será lido pelo Zabbix:
log_enable = 1
log_file = [TRAP FILE] - defina o formato de data e hora:
date_time_format = %H:%M:%S %Y/%m/%d = [DATE TIME FORMAT]
Agora formate as traps de forma a possibilitar que o Zabbix as reconheça (edite o arquivo snmptt.conf):
- Cada instrução de formato deverá começar com "ZBXTRAP [address]",
onde [address] será o valor usado na comparação com as interfaces
(pelo IP ou DNS). Exemplo.:
EVENT coldStart .1.3.6.1.6.3.1.1.5.1 "Status Events" Normal
FORMAT ZBXTRAP $aA Device reinitialized (coldStart) - Veja mais sobre formato de SNMP trap a seguir
Não utilize traps 'não esperadas' - o Zabbix não
estará apto a reconhece-las. Traps não esperadas podem ser tratadas ao
definir um evento geral no snmptt.conf:
EVENT general .* "General event" Normal
Configurando o Perl trap receiver
Requerimentos: Perl, pacote Net-SNMP compilado com
--enable-embedded-perl (já é padrão no Net-SNMP 5.4)
'Perl trap receiver' (olhe em misc/snmptrap/zabbix_trap_receiver.pl)
poderá ser utilizado para encaminhar as traps para o Zabbix Server/Proxy
diretamente a partir do snmptrapd. Para configurar:
- adicione o script perl no arquivo de configuração do 'snmptrapd'
(snmptrapd.conf), Exemplo:
perl do "[FULL PATH TO PERL RECEIVER SCRIPT]"; - configure o recebedor, exemplo:
$SNMPTrapperFile = '[TRAP FILE]';
$DateTimeFormat = '[DATE TIME FORMAT]';
Se o nome do script não estiver entre aspas, o snmptrapd irá se recusar a iniciar com mensagens similares a estas:
Regexp modifiers "/l" and "/a" are mutually exclusive at (eval 2) line 1, at end of line
Regexp modifier "/l" may not appear twice at (eval 2) line 1, at end of line
Formato do SNMP trap
Tanto os 'perl trap receivers' quanto o 'SNMPTT trap configuration' precisam formatar a trap conforme o padrão a seguir: [timestamp] [the trap, part 1] ZBXTRAP [address] [the trap, part 2], onde
- [timestamp] - momento de ocorrência do evento
- ZBXTRAP - cabeçalho que indica o início de uma nova linha de trap
- [address] - endereço IP para localizar o host a receber a trap
Observe que o "ZBXTRAP" e o "[address]" serão removidos da mensagem
durante o processamento. Se a trap utilizar outro formato, o Zabbix pode
analisa-las de forma inesperada.
Exemplo de trap:
11:30:15 2011/07/27 .1.3.6.1.6.3.1.1.5.3 Normal "Status Events"
localhost - ZBXTRAP 192.168.1.1 Link down on interface 2. Admin state:
- Operational state: 2
Esta trap será enviada para um host com a interface SNMP com IP=192.168.1.1:
11:30:15 2011/07/27 .1.3.6.1.6.3.1.1.5.3 Normal "Status Events" localhost - Link down on interface 2. Admin state: 1.
- Requerimentos de sistema
Rotação de logs
O Zabbix não provê rotação de logs que possa ser gerida pelo usuário. A rotação de logs primeiro irá renomear o arquivo antigo e após isso apaga-lo para garantir que nenhuma trap será perdida, conforme processo a seguir:\
- O Zabbix abre o arquivo de traps na última posição conhecida e vai para o passo 3
- O Zabbix verifica se o arquivo aberto já foi rotacionado ao comparar o número do inode definido para o mesmo. Se não existe arquivo aberto, o Zabbix reseta a informação de última posição conhecida e retorna ao passo 1.
- O Zabbix lê o dado do arquivo aberto e define uma nova localização.
- Os novos dados são analisados. Se era o arquivo rotacionado, o arquivo é fechado e retorna ao passo 2.
- Se não existe novo dado, o Zabbix aguarda 1 segundo e retorna ao passo 2.
O tamanho máximo de um arquivo de log para o Zabbix é de 2GB. O arquivo de log precisa ser rotacionado antes deste limite.
Sistema de arquivos
Devido à forma de implementação, o Zabbix precisa que o sistema de
arquivos suporte inodes para diferenciar os arquivos (a informação é
obtida através da função stat()).
- Exemplo de configuração
Este exemplo utiliza o snmptrapd + SNMPTT para enviar traps ao Zabbix Server:
- zabbix_server.conf - configure o Zabbix para iniciar o SNMP
trapper e defina a localização do arquivo file:
StartSNMPTrapper=1
SNMPTrapperFile=/tmp/my_zabbix_traps.tmp - snmptrapd.conf - adicione o SNMPTT como o gerenciador de traps:
traphandle default snmptt - snmptt.ini - configure o arquivo de saída e o formato de hora:
log_file = /tmp/my_zabbix_traps.tmp
date_time_format = %H:%M:%S %Y/%m/%d - snmptt.conf - defina o formato padrão de trap:
EVENT general .* "General event" Normal
FORMAT ZBXTRAP $aA $ar - Crie um item SNMP TEST:
IP da Interface SNMP do Host IP: 127.0.0.1
Chave: snmptrap["General"]
Formato de hora do log: hh:mm:ss yyyy/MM/dd
Teste o funcionamento:
- Comando utilizado para enviar uma trap:
snmptrap -v 1 -c public 127.0.0.1 '.1.3.6.1.6.3.1.1.5.3' '0.0.0.0' 6 33 '55' .1.3.6.1.6.3.1.1.5.3 s "teststring000" - Que será recebida:
15:48:18 2011/07/26 .1.3.6.1.6.3.1.1.5.3.0.33 Normal "General event" localhost - ZBXTRAP 127.0.0.1 127.0.0.1 - Valor par ao teste do item:
15:48:18 2011/07/26 .1.3.6.1.6.3.1.1.5.3.0.33 Normal "General event" localhost - 127.0.0.1
Este exemplo simples utiliza o SNMPTT como traphandle. Para melhor performance em ambientes de produção, utilize um script Perl para encaminhar as traps do snmptrapd ao SNMPTT ou diretamente ao Zabbix.