# - \#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:

1.  **snmptrapd** recebe a trap
2.  **snmptrapd** envia o dado para o SNMPTT ou chama um 'trap receiver'
    escrito em Perl
3.  O SNMPTT ou o 'Perl trap receiver' interpreta, formata e grava o
    dado em um arquivo
4.  O 'Zabbix SNMP trapper' lê e interpreta os dados do arquivo
5.  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.
6.  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.
7.  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](/pt/manual/regular_expressions) informada no campo **regexp**|Trap SNMP|Este item só pode ser definido em interfaces SNMP.<br>Este item é suportado desde o Zabbix 2.0.0.<br>*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.<br>Este item é suportado desde o Zabbix **2.0.0.**|

::: noteclassic
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.

::: notetip
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](/pt/manual/appendix/config/zabbix_server) ou
[zabbix\_proxy.conf](/pt/manual/appendix/config/zabbix_proxy)):

1.  StartSNMPTrapper=1
2.  SNMPTrapperFile=\[TRAP FILE\]

::: notewarning
Se o parâmetro do systemd
**[PrivateTmp](http://www.freedesktop.org/software/systemd/man/systemd.exec.html#PrivateTmp=)**
tiver sido definido é improvável que funcione no */tmp*.
:::

##### Configurando o SNMPTT

Primeiramente o 'snmptrapd' precisa estar configurado para utilizar o
SNMPTT.

::: notetip
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:

1.  registre as traps no arquivo de traps que será lido pelo Zabbix:\
    log\_enable = 1\
    log\_file = \[TRAP FILE\]
2.  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):

1.  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)
2.  Veja mais sobre formato de SNMP trap a seguir

::: noteimportant
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\]';

::: notetip
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:
1. 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:\

1.  O Zabbix abre o arquivo de traps na última posição conhecida e vai
    para o passo 3
2.  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.
3.  O Zabbix lê o dado do arquivo aberto e define uma nova localização.
4.  Os novos dados são analisados. Se era o arquivo rotacionado, o
    arquivo é fechado e retorna ao passo 2.
5.  Se não existe novo dado, o Zabbix aguarda 1 segundo e retorna ao
    passo 2.

::: noteimportant
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:

1.  **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
2.  **snmptrapd.conf** - adicione o SNMPTT como o gerenciador de traps:\
    traphandle default snmptt
3.  **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
4.  **snmptt.conf** - defina o formato padrão de trap:\
    EVENT general .\* "General event" Normal\
    FORMAT ZBXTRAP $aA $ar
5.  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:

1.  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"
2.  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
3.  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

::: notetip
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.
:::
