# - \#5 Java gateway

#### Visão geral

O Zabbix 2.0 inovou com o suporte nativo ao monitoramento de aplicações
Java através de JMX, este suporte foi adicionado através do componente
"Zabbix Java Gateway". Ele é um processo de background (daemon) escrito
em Java. Quando o Zabbix Server precisa coletar um item (dado) através
de um contador JMX em um host, ele solicita ao Zabbix Java Gateway, que
utiliza a [API de gerência
JMX](http://java.sun.com/javase/technologies/core/mntr-mgmt/javamanagement/)
para requisitar da aplicação o dado de interesse. A aplicação não
precisa de softwares adicionais, apenas necessita ter sido iniciada com
a opção `-Dcom.sun.management.jmxremote` no momento de sua inicialização
(linha de comando).

O Zabbix Java Gateway aceita conexões oriundas do Zabbix Server e do
Zabbix Proxy e só pode ser utilizado como um "proxy passivo". Ao
contrário do que ocorre com um Zabbix Proxy o Zabbix Java Gateway pode
estar atrás de outro proxy (um Zabbix Proxy). O acesso a cada Zabbix
Java Gateway é configurado diretamente no arquivo de configuração do
Zabbix Server ou do Zabbix Proxy e só pode existir um Zabbix Java
Gateway por Zabbix Server ou Zabbix Proxy. Se você precisar de ter mais
de um Zabbix Java Gateway em um mesmo ambiente da solução Zabbix você
precisará configurar um novo Zabbix Proxy para cada Zabbix Java Gateway.
Se um host possuir itens do tipo **JMX agent** e itens de outros tipos,
apenas os itens do tipo **JMX agent** serão solicitados ao Zabbix Java
Gateway.

O Zabbix Java Gateway não faz cache de nenhum valor coletado.

O Zabbix Server ou Zabbix Proxy tem um processo específico para se
conectar ao Zabbix Java Gateway, controlado pela opção
**StartJavaPollers**. Internamente o Zabbix Java Gateway inicia
múltiplas threads, controladas pela opção **START\_POLLERS**. No lado do
servidor, se a conexão demorar mais do que o limite em segundos da opção
**Timeout**, a requisição será terminada (abortada), mas o Zabbix Java
Gateway continuará aguardando pela coleta do contador JMX. Para resolver
isso, desde o Zabbix 2.0.15, Zabbix 2.2.10 e Zabbix 2.4.5 foi adicionada
a opção **TIMEOUT** no Zabbix Java Gateway que permite definir o tempo
máximo para as operações remotas do JMX.

O Zabbix Server ou o Zabbix Proxy irá agrupar as requisições em uma
única requisição JMX, sempre que possível (é afetado pelos intervalos
entre coletas), e enviar para o Zabbix Java Gateway em uma única conexão
visando obter melhor performance.

É recomendável configurar a opção **StartJavaPollers** com valor menor
ou igual à opção **START\_POLLERS**, de outra forma existirão situações
onde não existirão trheads disponíveis para atender às requisições.

A sessão abaixo descreve como obter e como executar o Zabbix Java
Gateway, como configurar o Zabbix Server (ou Zabbix Proxy) para usar o
Zabbix Java Gateway para monitoração JMX, e como configurar os itens do
Zabbix em sua interface web para coletar um contador JMX específico.

#### - Obtendo o Zabbix Java Gateway

Existem duas formas de se obter o Zabbix Java Gateway. A primeira forma
é adquirir o pacote do Zabbix Java Gateway package do site da Zabbix e a
segunda é compilar a partir de seu código fonte.

##### - Adquirir do site da Zabbix

Os pacotes do Zabbix Java Gateway (RHEL, Debian, Ubuntu) estão
disponíveis para download em <http://www.zabbix.com/download.php>.

##### - Compilando a partir do código fonte

Para compilar o Zabbix Java Gateway, primeiramente execute o script
`./configure` com o parâmetro `--enable-java`. É aconselhável que você
especifique também o parâmetro `--prefix` para utilizar outro caminho
que não o padrão (/usr/local), o Zabbix Java Gateway irá criar toda a
árvore de diretórios, não somente o executável.

    $ ./configure --enable-java --prefix=$PREFIX

Para compilar e empacotar o Zabbix Java Gateway em um arquivo JAR,
execute o `make`. Observe que para este passo você precisará dos
executáveis `javac` e `jar` em seu path.

    $ make

Após a execução do `make` será criado o arquivo
zabbix-java-gateway-$VERSION.jar em src/zabbix\_java/bin. Se você
preferir poderá ajustar o Zabbix Java Gateway para funcionamento a
partir de src/zabbix\_java no diretório da distribução, para tanto,
precisará seguir as instruções de configuração e execução do Zabbix Java
Gateway. Caso contrário, se você possuir privilégios suficientes,
execute `make install`.

    $ make install

#### - Visão geral dos arquivos na da distribuição do Zabbix Java Gateway

Independentemente da forma de obtenção do Zabbix Java Gateway, neste
momento você possui uma coletânia de scripts para o shell, arquivos JAR
e arquivos de configuração localizados em $PREFIX/sbin/zabbix\_java. O
papel deles é descrito a seguir:

O Zabbix Java Gateway em sí.

    bin/zabbix-java-gateway-$VERSION.jar

Dependências do Zabbix Java Gateway: [Logback](http://logback.qos.ch/),
[SLF4J](http://www.slf4j.org/), e [Android
JSON](https://android.googlesource.com/platform/libcore/+/master/json)
library.

    lib/logback-core-0.9.27.jar
    lib/logback-classic-0.9.27.jar
    lib/slf4j-api-1.6.1.jar
    lib/android-json-4.3_r3.1.jar

Arquivos de configuração de log.

    lib/logback.xml  
    lib/logback-console.xml

Scripts para inicialização e finalização do Zabbix Java Gateway.

    shutdown.sh  
    startup.sh

Arquivo de configuração dos scripts anteriores.

    settings.sh

#### - Configurando e executando o Zabbix Java gateway

Por padrão o Zabbix Java Gateway escuta a porta **10052**. Se você
planeja executa-lo em outra porta é possível a configuração usando o
script `settings.sh`. Veja a descrição do [arquivo de configuração do
Zabbix Java Gateway](/pt/manual/appendix/config/zabbix_java) para melhor
entendimento de suas opções.

::: notewarning
A porta **10052** não é [registrada no
IANA](http://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.txt).
:::

Uma vez que as configurações estejam conforme sua necessidade, você
poderá inicia-lo através do script de inicialização:

    $ ./startup.sh

Por outro lado, se você necessita de parar o serviço, execute o script
de finalização:

    $ ./shutdown.sh

Diferentemente do Zabbix Server e do Zabbix Proxy o Zabbix Java Gateway
é leve e não necessita de um banco de dados.

#### - Configurando o Zabbix Server para uso em conjunto com o Zabbix Jav Gateway Java gateway

Neste momento o Zabbix Java Gateway está apto para execução e você pode
configurar o Zabbix Server para que ele saiba localiza-lo. Esta tarefa
pode ser concluída especificando os parâmetros **JavaGateway** e
**JavaGatewayPort** no [arquivo de configuração do Zabbix
Server](/pt/manual/appendix/config/zabbix_server). Se o host com a
aplicação JMX em execução for monitorado através de um Zabbix Porxy,
você deverá definir tais parâmetros no [arquivo de configuração do
proxy](/pt/manual/appendix/config/zabbix_proxy).

    JavaGateway=192.168.3.14
    JavaGatewayPort=10052

Por padrão o Zabbix Server não inicia nenhum processo relacionado à
monitoração JMX. Se você necessita deste tipo de monitoração deverá
especificar uma quantidade de processos de pooler Java a serem
pré-alocados. Esta configuração é feita no mesmo arquivo através do
parâmetro a seguir:

    StartJavaPollers=5

Não se esqueça de reiniciar o Zabbix Server ou Zabbix Proxy após alterar
suas configurações.

#### - Debugando o Zabbix Java Gateway

Caso ocorram problemas com o Zabbix Java Gateway ou caso a mensagem de
erro apresentada na interface web do Zabbix não seja clara o suficiente,
você poderá necessitar analisar o arquivo de log do Zabbix Java Gateway.

Por padrão, as atividades do Zabbix Java Gateway são registradas no
arquivo /tmp/zabbix\_java.log com o nível de log: "info". Algumas vezes
o nível de detalhe da informação lá constante pode não ser suficiente,
sendo necessário o incremento da quantidade de informações registradas.
Este incremento de nível de log pode ser feito ao modificar o arquivo
lib/logback.xml modificando o parâmetro "level" da tag <root> para
"debug":

    <root level="debug">
      <appender-ref ref="FILE" />
    </root>

Observe que, diferentemente do Zabbix Server ou Zabbix Proxy, não é
necessário o reinicio do Zabbix Java Gateway quando o arquivo
logback.xml é modificado. Quando você concluir o debug, poderá retornar
o nível para "info".

Se você necessitar de registrar o log de outras formas, poderá ajustar o
logback.xml conforme suas necessidades. Observe o [manual do
log](http://logback.qos.ch/manual/) para mais detalhes.

Algumas vezes para as ações de debug é útil iniciar o Zabbix Java
Gateway é útil inicia-lo como uma aplicação de console (shell) ao invés
do modo de background (daemon). Para fazer isso comente a variável
PID\_FILE em `settings.sh`. Se a variável PID\_FILE estiver ausente, o
script `startup.sh` iniciará o Zabbix Java Gateway como uma aplicação de
console e configurará o **Logback** para o arquivo
lib/logback-console.xml, tal configuração não apenas demonstrará as
mensagens na console, também irá habilitar o modo de log para "debug".

Finalmente, observe que o Zabbix Java Gateway usa o SLF4J para as
atividades de log, você pode substituir o Logback pelo framework de sua
escolha ao colocar o arquivo JAR apropriado dentro do diretório lib.
Para mais detalhes consulte o [manual do
SLF4J](http://www.slf4j.org/manual.html).
