Low-level discovery com o Zabbix

Já tem algum tempo que post algo útil aqui nesse blog, ando com muitos projetos e acabei não possuindo tempo para tal.

Hoje vou falar um pouco sobre Zabbix. O Zabbix é um software open source de monitoramento de disponibilidade e performance de servidores, desktop, switchs e aplicações diversas, seja o monitoramento via SNMP ou cliente zabbix.

O assunto que irei abordar dentro do zabbix é o Low-level discovery (também conhecido como “lld” e esta será a forma que irei chamá-lo durante o post). O lld tem uma função básica, porém extremamente útil para monitoração em larga escala. Ele simplesmente executa um script no agente e irá trazer informações variáveis do servidor, por exemplo interfaces configuradas em um servidor linux. Com esse retorno, o Zabbix criará automaticamente os itens, gatilhos e gráficos de acordo com as informações recebidas.

Irei utilizar um exemplo de banco de dados. Suponha que você queira monitorar o tamanho dos bancos em que você possui no seu PostgreSQL. Se você possuir 2, 3, 4 ,5, etc bancos, criar manualmente os itens e gatilhos para monitoração do tamanho da DB não será um problema. Agora, quando você possuir um grande número, o processo será repetitivo e cansativo.

Primeiramente iremos criar o script que trará as informações necessárias. É importante saber que o retorno deve ser em JSON. Neste link é possível encontrar um código em shell script que irá pesquisar os nomes dos bancos. É necessário ter o módulo simpleJSON do python para o funcionamento. Para instalá-lo execute o comando:

# aptitude install python-simplejson

Copie o script do link para o servidor e de permissão de execução para ele (chmod +x <nome_do_script>.sh). Eu indico deixar na pasta “etc/zabbix_agentd.conf.d” do zabbix  por organização. Agora será necessário criar a chave no zabbix_agentd.conf, irei aproveitar e criar a chave que retornará o tamanho do banco de dados. Segue um exemplo:

UserParameter=pgsql.db.names,/bin/sh /usr/local/zabbix/etc/zabbix_agentd.conf.d/lld_pgsql_dbnames.sh | python -mjson.tool

UserParameter=pgsql.db.size[*],psql –dbname postgres -Atc “select pg_database_size(‘$1’) as size”

Reinicie o zabbix-agent para aplicar as novas configurações e no zabbix-server execute o comando:

# zabbix_get -s<ip_do_cliente> -p<porta_configurada> -k ”pgsql.db.names”

A saída do comando deverá ser parecida como a imagem abaixo:

zabbix_lld_0

É importante saber que o script criado mostra a saída como “{#DBNAME}”: “postgres”. O valor “{#DBNAME}” é o que será utilizado pelo zabbix para associar ao item, gatilho ou gráfico criado. Como no exemplo acima ele irá criar os itens, triggers e gráfico para dois banco de dados, o “postgres” e o “asterisk”.

Se tudo ocorrer corretamente, agora sera necessário criar a “discovery rule”. Eu indico criar dentro de um template para o PostgreSQL ao invés de criar diretamente no host, pois ficará mais organizado. Segue uma imagem de exemplo:

Zabbix lld 1

Dentro de “discovery rules” entre na aba “itens prototypes”, conforme indicado na imagem abaixo:

Zabbix lld 2

Crie um “item prototype” como o exemplo abaixo:

Zabbix lld 3

Após esses procedimentos é só aguardar o zabbix executar discovery e o intervalo de coleta e será criado os itens nos hosts conforme a imagem abaixo:

Zabbix lld 4

E em dados recentes podemos confirmar que está coletando corretamente os dados:

Zabbix lld 5

Conclusão: Sem o lld não fica legal! Esta ferramenta do zabbix ajuda a administrar muito mais facilmente qualquer host. Basta no momento de criar o host adicionar o template do PostgreSQL e criar as chaves e copiar o script no agente, e voilá! Agora criar centena de hosts ficará uma passo mais fácil!

Caso tenha dificuldades nos procedimentos, comente que eu irei responder!

Notas:

  • Todos os testes foram realizados em Debian 6 e com o Zabbix versão 2.0.2. Caso necessário adapte os comandos o seu ambiente.
  • É presumido que o usuário o qual é inicado o zabbix-agent possua acesso ao banco de dados postgresql.
  • Todos os testes foram realizados nos padrões do meu ambiente. Por exemplo, a minha instalação do zabbix-agent não fica em “/usr/local” e sim em “/usr/local/zabbix”. Portanto, adapte a sua instalação e padrões.
  • Os intervalos de atualizações do lld e do item criado é um exemplo, sugiro para o lld deixar 1 dias e para o tamanho do banco 1 hora, mas varia de acordo com a necessidade de cada ambiente.
Anúncios
Esse post foi publicado em Artigos e marcado . Guardar link permanente.

40 respostas para Low-level discovery com o Zabbix

  1. Edu disse:

    Pessoal, tem como eu usar DUAS regras de LLD? Por exemplo, quero monitorar todas as interfaces com status operacional UP E que respondam a qualquer MIB-2 (ifinOctets, por exemplo). Consegui fazer uma OU outra. Se uso a regra de status operacional, um monte de interfaces que não quero monitorar (de E1, Null, Loopback) apareceram no LLD. Se uso a regra que responde ao ifInOctets, pego interfaces MIB-2 que estão desativadas. O que que eu faço?

    • Rodrigo Lang disse:

      Você já pensou em criar um script que filtre essas interfaces que você não quer monitorar? Normalmente o lld default do linux não mostra as interfaces E1 e loopback. Se puder explicar melhor seu problema eu poderia dar as dicas necessárias.

      • Edu disse:

        Rodrigo, aprendi a usar o script, e realmente ficou muito bom. Só tenho um “senão” (que citei em comentário de outro tópico): o Zabbix aparentemente não usa GetBulk pra coletar dados SNMP, e quando vou utilizar itens calculados (p.e., % de erros de entrada, que é 100*ifInErrors/ifInTotalPackets (outro item calculado, soma de ifInUcastPkts e ifInNUcastPkts), nada garante a ordem em que esses itens foram coletados, podendo estar entre 0 e 300 segundos, e a % não refletir EM NADA a real taxa de erros… Um script de trapper seria a solução?

      • Rodrigo Lang disse:

        Eduardo, também passei pelo mesmo problema. Minha solução foi utilizar o Agente ativo (ele envia todos os dados ao mesmo tempo e no momento de gerar os itens calculados ele faz com os últimos valores corretamente) e, em outro cenário, com o trapper, já que no próprio script você poderá enviar vários itens ao mesmo tempo. Você também poderá fazer um script para enviar os valores para o trapper, no qual calcula no host o valores de erro e a porcentagem e só popula os itens com o zabbix_sender. Essa última opção é boa, pois o diminui a carga no Zabbix Server, já que o processamento do cálculo é feito no host (caso seu Zabbix Server seja pequeno não fará diferença, mas é sempre bom pensar e prevenir para uma ampliação do parque não é?). Qualquer dúvida poste aí que eu respondo!

  2. diana disse:

    Rodrigo, estou tentando usar seu script numa máquina com CentOs instalado… Instalei o python-simplejson com o comando “yum install python-simplejson”, mas quando tento rodar o “script.sh | python -mjson.tool” dá uma mensagem que a ferramenta json não foi encontrada… tem ideia do que seja?

    • Rodrigo Lang disse:

      Diana, estes dias acabei descobrindo que não há necessidade de utilizar o simplejson do python. A saída do shell-script já funciona corretamente. Eu ia arrumar o post, porém estou meio curto de tempo e não consegui corrigir. Teste e qualquer dúvida me avise! Boa sorte!

      • diana disse:

        Rodrigo, deu certo com o script comum…. Mas tenho uma dúvida: se eu quiser utilizar mais de uma regra no mesmo host… Por exemplo, se eu fosse fazer o mesmo pra o Mysql eu teria que criar para a chave mysql.db.names um script que gerasse uma macro tipo {#DBNAME2} ou poderia usar a mesma da outra chave? E o User parameter que coleta os valores eu usaria (‘$2′) para pegar os valores coletados?

      • Rodrigo Lang disse:

        Pode usar o mesmo nome da variável sim, mas a chave deverá ser outra. As regras lld são independentes, portanto se estiver em outra regra não irá afetar o funcionamento. Ex.: lld para mysql, chave mysql.db.names, variável {#DBNAME}. lld para postgresql, chave psql.db.names, variável {#DBNAME}. O ideal seria criar um template para MySQL com seus itens, triggers, gráficos e lld’s específicos e outro template para o PostgreSQL, assim fica bem distinto e prático. Quanto ao número de regras, você poderá utilizar quantas quiser no mesmo host, porém elas não devem criar itens, triggers ou chaves iguais.

      • diana disse:

        Oi Rodrigo…. eu de novo… A descoberta funcionou certinho, mas a chave que consulta o valor pros itens não está dando certo… Aparentemente pq o parâmetro $1 não está trazendo os nomes dos itens…. Pra testar tentei usar a seguinte configuração UserParameter=vol.ds02.status[*],echo \’$1\’
        e aí que vi que o $1 está com valor null.
        No prototipo estou usando a chave vol.ds02.status[{#VOLNAME}]
        Alguma idéia?

      • Rodrigo Lang disse:

        Diana, o lld consegue criar os itens corretamente? Exemplo, tenho o banco “postgres” e o lld irá criar um item com a chave “psql.db.size[postgres]”. O protótipo que você criou, é tipo caractere ou numérico? Pelo que foi descrito aparenta que o tipo do item é numérico e está sendo retornado caracteres.

      • diana disse:

        É a LLD está funcionando, mas deixa eu te explicar melhor o meu cenário: Eu to usando sua ideia pra tentar monitorar volumes do storage. Criei um script que gera os nomes os volumes então com a chave UserParameter=vol.ds01,/etc/zabbix/new_script.sh eu obtenho itens vol.ds01[BANCO], vol.ds01[DADOS], etc… . Porém a minha segunda chave que deveria verificar o status dos volumes (BANCO, DADOS, etc] eu criei a chave UserParameter=vol.ds01.status[*],/etc/zabbix/new_script.sh $1
        Em que no meu entender $1 deveria está trazendo os nomes dos volumes (BANCO, DADOS, etc). Porém como eu testei com o echo o valor $1 está sendo null, não está trazendo os nomes que foram passados no item anterior pelo script. Deu pra entende agora? Quando vc faz UserParameter=pgsql.db.size[*],psql –dbname postgres -Atc “select pg_database_size(‘$1′) as size” eu entendo que o ‘$1’ vai ser substituído pelos nomes dos bancos conforme a chave anterior (postgres, asterisk, etc), não é isso?

      • Rodrigo Lang disse:

        Sim, o “UserParameter=vol.ds01.status[*],/etc/zabbix/new_script.sh $1” está recebendo uma váriavel. Se a chave é “vol.ds01[BANCO]”, ele irá executar “/etc/zabbix/new_script.sh BANCO”. Se você executar o script direto no console, ele retorna corretamente os valores? Do servidor zabbix, se você executar o comando “zabbix_get”, ele retorna o valor correto? Também tem o detalhe de no agente estar liberado o uso de parâmetros (no arquivo de configuração do agente, verificar se a opção “UnsafeUserParameters” está igual a 1).

    • diana disse:

      O parametro não estava definido no arquivo de configuração do agente, eu defini e reiniciei o agent…. Nada!!! O script funciona se eu fizer /etc/zabbix/new_script.sh BANCO, inclusive executando com o usuário Zabbix. Mas não quando coloco o parametro… Como lhe disse coloquei um echo $1 e ele estava reportando null. Estou testando exatamente pelo zabbix_get, quando usei o echo $1 ele retornou não suportado :(…. Tem mais algum parâmetro que eu deva habilitar? No servidor precisa habilitar algo pra ele enviar os prâmetros?

      • Rodrigo Lang disse:

        Se o zabbix_get está retornando não suporte é porque o problema está no agente. Confira as configurações do “UserParameter”, marque o debug igual a 4, reinicie o agente, execute o zabbix_get e verifique nos logs qual o erro que aparece.

      • diana disse:

        Rodrigo… muito estranho mas reinstalei o agente do zabbix, desativei e a reativei o parametro q vc falou e passou a funcionar… Obrigada mesmo, valeu pelo apoio!!!!!

      • Rodrigo Lang disse:

        Estranho o caso, mas que bom que resolveu. Qualquer dúvida é só comentar que eu respondo!

  3. Rodrigo Nunes disse:

    Em primeiro lugar show de bola o POST, esta de parabéns.
    Não existe muita informação sobre o uso do LLD, estou fazendo alguns teste envolvendo o ZAPCAT(http://www.kjkoster.org/zapcat/How_To_Push.html) e queria conseguir esse mesmo resultado usando o trapper como base para criar itens dinâmicos.
    Fiz os testes com o ZAPCAT Trapper , mas sem sucesso, acredito que deve ser algo com o protocolo sendo obrigatório o uso do Agent Zabbix.
    Portanto a pergunta: Alguém conseguiu usar o LLD com ZAbbix Trapper ??

    Por que não usei o agent ? Quero que a comunicação seja do Servidor(monitorado) para o Zabbix.

    Att.
    Rodrigo Leme Nunes

    • Rodrigo Lang disse:

      Opa Nunes, obrigado pelo elogio! Seguinte, é possível utilizar o trapper com o LLD, eu já fiz com alguns itens dessa forma, mas nunca com o próprio discovery. Para isso você precisará criar o LLD com o tipo “Zabbix trapper” ao invés de “agente Zabbix”. Dessa forma será possível receber os itens para descoberta, porém deverá ser no formato JSON. Então, teoricamente, você poderá fazer sua aplicação montar uma string com o formato JSON descrito no post e fazer o ZAPCAT enviar (provavelmente existe algum método ou função para isso) para o trapper do Zabbix. Teoricamente deverá funcionar, nunca utilizei o ZAPCAT, mas pela documentação não vejo porque não funcionaria.

      • Rodrigo Nunes disse:

        Lang, consegui a solução e realmente funciona.
        O que eu não sabia, que é possível usar o formato JSON junto ao zabbix_sender o que torna possível usar também com o ZAPCAT.
        Criei a descoberta LLD como Trapper e fiz o envio utilizando o zabbix_sender -z xxx.xxx.xxx.xxx -s host -k chave -o “{\”data\”:[{\”{#TSNAME}\”:\”rodrigo\”,\”{#TSTYPE}\”:\”DMS\”}]}”.
        Em resumo, eu não sabia ao certo como usar o JSON e não sabia que também funcionava com o zabbix_sender.

        Obrigado pela atenção e espaço no POST.

      • Rodrigo Lang disse:

        Cara, que bom que funcionou! O sender aceita qualquer informação na opção “-o”, quem processa é o servidor Zabbix. Boa sorte com o ZapCat! Aliás, ele funciona certinho?

  4. Rodrigo Nunes disse:

    Lang, gostei muito do ZAPCAT é uma boa alternativa ao zabbix_sender e ao agente, estou usando ele como um flamework para monitoramento independente de plataforma, em um cenário onde quem envia as informações é o cliente.

  5. Iesus disse:

    saludos meu error en zabbix… item prototype ” object should be a JSon” eu no se por que =/

  6. Gabriel disse:

    Rodrigo,

    Cheguei até seu artigo pesquisando no google sobre como criar um item no zabbix.
    Estou com uma dúvida sobre qual a diferença entre criar um item ou Discovery Rules?
    Eu criei o seguinte ambiente: Coloquei um key no agent do cliente para obter o IP público
    e através do zabbix_get eu consigo obter o endereço IP. Depois fui no servidor e criei um item no host e também foi possível obter o IP público do agent. Eu gostaria de saber como eu poderia utlizar o discovery rules para essa situação para ver se eu consigo entender a sua função.

    Abraço,

    • Rodrigo Lang disse:

      A diferença entra um item e o lld, é que o segundo cria automaticamente o primeiro. Se você tem em todos os servidores 50 itens diferentes, você pode criar uma única regra que irá criar todos estes itens de uma única vez ao conectar-se ao servidor Zabbix. No seu caso você poderá criar um lld onde irá criar itens do tipo trapper para receber as informações dos clientes.

      • Andrei Tunes disse:

        E ai Rodrigo Lang!!!
        Consegui fazer o script em .bat e ta rodando sussa!!! Mas o zabbix não ta conseguindo receber os valores.
        Quando executo o comando zabbix_get do servidor ele retorna isso:
        The handle could not be opened during redirection of handle 0
        The syntax of the command is incorrect.

        O que ta faltando?
        Valeu!

  7. Andrei Tunes disse:

    E ai Rodrigo! Beleza?

    Eu não entendi muito bem como funciona o segundo parametro, para pegar o tamanho do banco. Poderia me explicar melhor?
    Vejo que o primeiro parametro executa o script e retorna os valores, mas como o segundo parametro esta coletando o tamanho dos bancos?

    • Rodrigo Lang disse:

      Opa Andrei, tudo tranquilo e contigo?

      Funciona da seguinte forma, o primeiro parâmetro (a chave “pgsql.db.names”) irá retornar o nome dos bancos criados no servidor postgresql, com eles o lld irá criar automaticamente uma regra para coleta do tamanho de cada banco específico. Para saber mais sobre lld olha no outro post, “Low-level discovery com o Zabbix”.

      At, Rodrigo Lang.

      • Andrei Tunes disse:

        Saquei Rodrigo! Muito bom!
        Só que estou com um problema:
        Esse comando que esta no script: psql –dbname postgres
        me retorna: psql: FATAL: autenticação do tipo Ident falhou para usuário “root”
        Tentei com: # psql –dbname postgres -U postgres
        E também me retornou: psql: FATAL: autenticação do tipo Ident falhou para usuário “postgres”

        O que deixei passar?

        Valeuu

      • Rodrigo Lang disse:

        É um problema de autenticação do postgreSQL. Edite o arquivo pg_hba.conf de acordo com suas necessidades.

      • Andrei Tunes disse:

        Saquei aqui ja qual era o problema da autenticação.
        Agora meu problema é que o comando no zabbix server, o zabbix_get, não traz nada… vazio

      • Andrei Tunes disse:

        E ai Rodrigo! Cara foi uma luta aqui pra achar o erro bobo aqui. Coloquei o script em uma pasta onde o usuário não podia acessar.
        Desculpe ficar te enchendo, mas estou com uma ultima dúvida e gostaria que você me esclarecesse se possivel. Pode ser?
        Quando dou o comando zabbix_get do servidor zabbix, ele me retorna tudo em uma linha só, não como esta mostrando na explicação ai em cima. Isso tem algum impacto? Até esse momento o item não apareceu…

        Obrigado. Esse post ta show!

      • Rodrigo Lang disse:

        Não tem problema se trouxer todas as informações em uma linha só, desde que esteja no padrão JSON. Para testar se está no padrão correto, execute: “lld_pgsql_dbnames.sh | python -mjson.tool”, caso esteja o json.tool do python irá ajustar com as quebras de linha, caso não esteja irá gerar erro. Se o item ainda não apareceu ele deverá estar com alguma sinalização lá na parte de monitoramento, na mesma linha do lld do lado direito (aonde aparece uma exclamação). Neste local ele irá indicar o motivo do erro. Quaisquer problemas também é possível aumentar o debug para 4 nos arquivos de configuração e no log do zabbix server irá mostrar mais detalhadamente o erro.

        Quaisquer dúvidas é só postar, só peço desculpar se demorar para responder, pois estou meio corrida com o trabalho!

        Abraço!

      • Andrei Tunes disse:

        Funcionou! Uma maravilha!

        Rodrigo, tenho um banco de dados postgres em um servidor windows. Como poderia fazer isso funcionar em windows?
        Pensei em fazer um script em .bat, mas não tenho dominio e acho que não funciona.
        Você tem alguma idéia?

        Cara, muito obrigado pela sua ajuda!!

      • Rodrigo Lang disse:

        Beleza! Cara, no windows o caminho é o bat. Já testei com alguns outros softwares, exemplo o zimbra, e funcionou perfeitamente. Só editar o arquivo de configuração do agente zabbix para executar o script.

        At.

      • Andrei Tunes disse:

        Massa… Então com um arquivo .bat funciona.
        Eu não manjo muito bem de criação de scripts .bat. To tentando fazer um script similar a esse do linux, mas estou tendo problemas com a variavél.
        Você teria um scrip desse em .bat?

      • Andrei Tunes disse:

        E ai Rodrigo Lang!!!
        Consegui fazer o script em .bat e ta rodando sussa!!! Mas o zabbix não ta conseguindo receber os valores.
        Quando executo o comando zabbix_get do servidor ele retorna isso:
        The handle could not be opened during redirection of handle 0
        The syntax of the command is incorrect.

        O que ta faltando?
        Valeu!

      • Andrei Tunes disse:

        E ai Rodrigo!!! Consegui resolver meu problema! Fiz os scripts para windows para MySQL e postgres!

        Obrigado mais uma vez pela ajuda!!!!

        Falow

      • Rodrigo Lang disse:

        Opa Andrei. Desculpa não ter te respondido antes, estava meio corrida as coisas por aqui. Que bom que resolveu! Qualquer dúvida que surgir poste ai que quando eu puder dou uma força!

        Boa sorte e grande abraço!

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s