Monitorando cotação de moedas com Zabbix 4

porJanssen Lima

Monitorando cotação de moedas com Zabbix 4

Se você é um usuário do Zabbix das versões anteriores a 4 (lançada recentemente) sabe que fazer algumas brincadeiras com Zabbix não era algo muito simples.

Para fazer o monitoramento de cotação de moedas, era preciso criar scripts que utilizassem ferramentas para extrair os dados para gerar a informação e exibir no Zabbix. E coloca ferramenta nisso (curl, aws, cut, grep etc.). Além do script, você precisava fazer duas configurações extras: criar um User Parameter para executar o script ou configurar o agendamento da execução do script via Cron. Sem contar que você tinha que criar o item para armazenar a informação.

Criar o item para coletar a cotação de uma moeda você ainda precisa fazer na versão 4 (óbvio né?). Porém, nesse artigo, eu vou mostrar como ficou mais fácil você fazer esse tipo de monitoramento.

Antes de partir para a prática do monitoramento, vou explicar de maneira rápida qual recurso utilizaremos para fazer esse monitoramento.

Checagem HTTP nativa

Um dos recursos implementados na versão 4 do Zabbix foi o agente HTTP. Com esse tipo de item, é possível:

  • Monitorar recursos de aplicações WEB
  • Monitorar APIs, baseadas em JSON/XML/Prometheus
  • Acessar campos de cabeçalho HTTP

AwesomeAPI

Nosso exemplo será coletando informações da API de moedas do site AwesomeAPI. Com o exemplo aqui mostrado você terá ideias para monitorar qualquer API que te entregue dados no formato JSON.

O primeiro passo é você saber de onde extrairemos a informação. Siga os seguintes passos:

A URL que extrairemos os dados é https://economia.awesomeapi.com.br/json/all. Você vai observar que ela retorna todas as moedas disponíveis nessa API. Isso foi proposital para dificultar um pouco e extrairmos apenas o dólar. Depois que você fizer o monitoramento você entenderá melhor e terá know-how para explorar mais esse recurso.

Criando o monitoramento

Para acompanhar nosso teste, crie um host chamado Cotacoes Moedas.

Nesse host, crie um novo item do tipo HTTP agent com os seguintes dados:

  • Name: Cotação Dólar
  • Type: HTTP agent
  • Key: dolarComercial
  • URL: https://economia.awesomeapi.com.br/json/all
  • Request Type: GET
  • Timeout: 5s
  • Request Body Type: Raw data
  • Retrieve mode: Body
  • Type of information: Numeric (float)
  • Units: $
  • Update interval: 10m
  • New appplication: Cotações

Essas são as informações básicas que devemos cadastrar. Se você salvar e aguardar o tempo de atualização do item irá observar que a coleta do item retornará erro. Isso porque não configuramos o tratamento do que o item irá armazenar. No nosso caso, o interesse é armazenar a cotação de compra da moeda dólar (USD).

Para isso, precisaremos incluir um pré-processamento no item que estamos cadastrando. Clique na aba Preprocessing:

  • Adicione um novo JSON Path com o parâmetro $.USD.bid

Observe o trecho do código abaixo extraído da resposta da API:

{
	"USD": {
		"code": "USD",
		"codein": "BRL",
		"name": "D\u00f3lar Comercial",
		"high": "3.797",
		"low": "3.7688",
		"pctChange": "0.661",
		"open": "0",
		"bid": "3.7887",
		"ask": "3.7894",
		"varBid": "0.0249",
		"timestamp": "1542826740000",
		"create_date": "2018-11-21 17:10:02"
	}

A leitura do parâmetro $.USD.bid pode ser feita da seguinte forma:

  • Extraia da raiz ($), o objeto (.USD) e seu filho (.bid)
  • Obetremos como resposta o valor 3.7887

No Zabbix, em Latest data:

E o gráfico:

Deixe agora o Zabbix trabalhar por você e fazer as coletas no intervalo que você cadastrou.

Esse foi apenas um exemplo simples do que podemos usar com esse novo recurso nativo disponível no Zabbix 4.

As possibilidades com esse novo item são muitas, por exemplo: monitorar nginx, Apache etc sem o uso de scripts. Também é possível utilizarmos LLD com item HTTP agent.

Para mais detalhes sobre esse recurso, acesse a página da documentação oficial.

Espero que tenham gostado.

Até o próximo artigo com exemplos práticos, onde demonstrarei o uso de conversão de unidades.

Sobre o Autor

Janssen Lima author

Possui 20 anos de experiência na área de TI. É autor dos livros Monitoramento de Redes com Zabbix e Consumindo a API do Zabbix com Python.

1 comentário até agora

Ugo ClemesPostado em11:33 am - nov 23, 2018

Janssen,
Boa tarde.
Mais uma vez Parabéns pelo post, consegui simular perfeitamente.

Gostaria de saber se consegue me ajudar:

Tenho uma demanda onde acesso uma URL e ele me retorna o JSON abaixo:

[{“domainType”:”NODE”,”componentFaultToleranceStatus”:{“STATIC_CONFIGURATION”:{“componentType”:”STATIC_CONFIGURATION”,”numberOfFailuresTolerable”:1,”details”:null,”underComputation”:false,”lastUpdatedTimeInUsecs”:1534702885000000},”ZOOKEEPER”:{“componentType”:”ZOOKEEPER”,”numberOfFailuresTolerable”:1,”details”:null,”underComputation”:false,”lastUpdatedTimeInUsecs”:1536182311000000},”OPLOG”:{“componentType”:”OPLOG”,”numberOfFailuresTolerable”:1,”details”:null,”underComputation”:false,”lastUpdatedTimeInUsecs”:1542971981000000},”METADATA”:{“componentType”:”METADATA”,”numberOfFailuresTolerable”:1,”details”:null,”underComputation”:false,”lastUpdatedTimeInUsecs”:1535052398000000},”EXTENT_GROUPS”:{“componentType”:”EXTENT_GROUPS”,”numberOfFailuresTolerable”:1,”details”:null,”underComputation”:false,”lastUpdatedTimeInUsecs”:1542971981000000},”STARGATE_HEALTH”:{“componentType”:”STARGATE_HEALTH”,”numberOfFailuresTolerable”:1,”details”:null,”underComputation”:false,”lastUpdatedTimeInUsecs”:1542979762000000},”ERASURE_CODE_STRIP_SIZE”:{“componentType”:”ERASURE_CODE_STRIP_SIZE”,”numberOfFailuresTolerable”:1,”details”:null,”underComputation”:false,”lastUpdatedTimeInUsecs”:1542971981000000},”FREE_SPACE”:{“componentType”:”FREE_SPACE”,”numberOfFailuresTolerable”:0,”details”:{“message”:”Cluster does not have enough capacity (167826982350024) for usage (148965861879958) to tolerate any node failure”,”attributes”:{}},”underComputation”:false,”lastUpdatedTimeInUsecs”:1542979519000000}},”clusterUnderReplicatedDataBytes”:0},{“domainType”:”RACKABLE_UNIT”,”componentFaultToleranceStatus”:{“STATIC_CONFIGURATION”:{“componentType”:”STATIC_CONFIGURATION”,”numberOfFailuresTolerable”:1,”details”:null,”underComputation”:false,”lastUpdatedTimeInUsecs”:1534702883000000},”ZOOKEEPER”:{“componentType”:”ZOOKEEPER”,”numberOfFailuresTolerable”:1,”details”:null,”underComputation”:false,”lastUpdatedTimeInUsecs”:1536182311000000},”OPLOG”:{“componentType”:”OPLOG”,”numberOfFailuresTolerable”:1,”details”:null,”underComputation”:false,”lastUpdatedTimeInUsecs”:1542971981000000},”METADATA”:{“componentType”:”METADATA”,”numberOfFailuresTolerable”:1,”details”:null,”underComputation”:false,”lastUpdatedTimeInUsecs”:1535052398000000},”EXTENT_GROUPS”:{“componentType”:”EXTENT_GROUPS”,”numberOfFailuresTolerable”:1,”details”:null,”underComputation”:false,”lastUpdatedTimeInUsecs”:1542971981000000},”STARGATE_HEALTH”:{“componentType”:”STARGATE_HEALTH”,”numberOfFailuresTolerable”:1,”details”:null,”underComputation”:false,”lastUpdatedTimeInUsecs”:1542979762000000},”ERASURE_CODE_STRIP_SIZE”:{“componentType”:”ERASURE_CODE_STRIP_SIZE”,”numberOfFailuresTolerable”:1,”details”:null,”underComputation”:false,”lastUpdatedTimeInUsecs”:1542971981000000},”FREE_SPACE”:{“componentType”:”FREE_SPACE”,”numberOfFailuresTolerable”:0,”details”:{“message”:”Cluster does not have enough capacity (167826982350024) for usage (148965861879958) to tolerate any rackable unit (block) failure”,”attributes”:{}},”underComputation”:false,”lastUpdatedTimeInUsecs”:1542979519000000}},”clusterUnderReplicatedDataBytes”:0},{“domainType”:”RACK”,”componentFaultToleranceStatus”:{“STATIC_CONFIGURATION”:{“componentType”:”STATIC_CONFIGURATION”,”numberOfFailuresTolerable”:0,”details”:{“message”:”Rack aware placement is not enabled.”,”attributes”:{}},”underComputation”:false,”lastUpdatedTimeInUsecs”:1534702884000000}},”clusterUnderReplicatedDataBytes”:0},{“domainType”:”DISK”,”componentFaultToleranceStatus”:{“OPLOG”:{“componentType”:”OPLOG”,”numberOfFailuresTolerable”:1,”details”:null,”underComputation”:false,”lastUpdatedTimeInUsecs”:1542971981000000},”METADATA”:{“componentType”:”METADATA”,”numberOfFailuresTolerable”:1,”details”:null,”underComputation”:false,”lastUpdatedTimeInUsecs”:1535052398000000},”EXTENT_GROUPS”:{“componentType”:”EXTENT_GROUPS”,”numberOfFailuresTolerable”:1,”details”:null,”underComputation”:false,”lastUpdatedTimeInUsecs”:1542971981000000},”ERASURE_CODE_STRIP_SIZE”:{“componentType”:”ERASURE_CODE_STRIP_SIZE”,”numberOfFailuresTolerable”:1,”details”:null,”underComputation”:false,”lastUpdatedTimeInUsecs”:1542971981000000},”FREE_SPACE”:{“componentType”:”FREE_SPACE”,”numberOfFailuresTolerable”:1,”details”:null,”underComputation”:false,”lastUpdatedTimeInUsecs”:1542979519000000}},”clusterUnderReplicatedDataBytes”:0}]

Não sei se conhece mais esse JSON é um status da Resiliência do NUTANIX.

Fazendo os teste para trazer informação, esta apresentando erro:

Na criação do Item – Preprocessing – adicionei:
JSON Path – $.componentFaultToleranceStatus.STATIC_CONFIGURATION.numberOfFailuresTolerable

No qual teria que retornar o valor – 1

Esta apresentando o erro:

Item preprocessing step #1 failed: cannot extract value from json by path “$.componentFaultToleranceStatus.STATIC_CONFIGURATION.numberOfFailuresTolerable”: object not found starting with json path: “componentFaultToleranceStatus.STATIC_CONFIGURATION.numberOfFailuresTolerable”

Muito obrigado

Deixe uma resposta