A API do Áú»¢¶Ä²© permite que voc¨º recupere e modifique programaticamente a configura??o do Áú»¢¶Ä²© e fornece acesso a dados hist¨®ricos. Isto ¨¦ amplamente utilizado para:
A API do Áú»¢¶Ä²© ¨¦ uma API baseada na web e ¨¦ enviada como parte do frontend web. Ela usa o protocolo JSON-RPC 2.0, o que significam 2 coisas:
Mais informa??es sobre o protocolo e JSON podem ser encontradas no [JSON-RPC 2.0 specification(http://www.jsonrpc.org/specification) e .
Para mais informa??es sobre como integrar a funcionalidade de Zabbin em seus aplicativos Python, consulte a biblioteca para API do Áú»¢¶Ä²©.
A API consiste em v¨¢rios m¨¦todos que s?o nominalmente agrupados em APIs separadas. Cada um dos m¨¦todos desempenha uma tarefa espec¨ªfica. Por exemplo, o m¨¦todo host.create
pertence ao API host e ¨¦ usado para criar novos hosts. Historicamente, as APIs as vezes s?o chamadas de "classes".
A maioria das APIs cont¨¦m ao menos quatro m¨¦todos: get
, create
, update
e delete
para recuperar, criar, atualizar e excluir dados , respectivamente. Contudo, algumas APIs podem oferecer um conjunto de m¨¦todos totalmente diferente.
Uma vez que voc¨º tenha configurado o frontend, voc¨º pode usar requisi??es de HTTP remoto para requisitar a execu??o da API. Para isso, voc¨º precisar¨¢ enviar requisi??es HTTP POST para o arquivo api_jsonrpc.php
localizado no diret¨®rio frontend. Por exemplo, se sua instala??o do frontend Áú»¢¶Ä²© est¨¢ em http://example.com/zabbix, a requisi??o HTTP para o m¨¦todo pode ser algo como a seguir:
POST http://example.com/zabbix/api_jsonrpc.php HTTP/1.1
Content-Type: application/json-rpc
{
"jsonrpc": "2.0",
"method": "apiinfo.version",
"id": 1,
"auth": null,
"params": {}
}
A requisi??o deve ter o header Content-Type
configurado para um desses valores: application/json-rpc
, application/json
ou application/jsonrequest
.
A se??o seguinte ir¨¢ gui¨¢-lo com alguns exemplos de usos mais detalhados.
Para acessar qualquer dado no Áú»¢¶Ä²©, voc¨º precisa:
Por exemplo, se voc¨º quisesse obter um novo token de autentica??o ao fazer login como usu¨¢rio Admin padr?o, a solicita??o JSON seria assim:
{
"jsonrpc": "2.0",
"method": "user.login",
"params": {
"username": "Admin",
"password": "zabbix"
},
"id": 1,
"auth": null
}
Vamos dar uma olhada mais de perto ao objeto solicitado. Ele tem as seguintes propriedades:
jsonrpc
- vers?o do protocolo JSON-RPC usada pela API; a API do Áú»¢¶Ä²© implementa a vers?o 2.0 de JSON-RPC;method
- como m¨¦todo da API ¨¦ chamado;params
- os par?metros ser?o passados para o m¨¦todo da API;id
- um identificador arbitr¨¢rio da solicita??o;auth
- um token de autentica??o do usu¨¢rio; enquanto n?o temos um, ele ¨¦ definido como null
.Se voc¨º forneceu as credenciais corretamente, a resposta a ser retornada pela API ir¨¢ conter um token de autentica??o do usu¨¢rio:
O objeto da resposta, por sua vez, cont¨¦m as seguintes propriedades:
jsonrpc
-novamente, a vers?o do protocolo do JSON-RPC;result
- o dado retornado pelo m¨¦todo;id
- identificador da solicita??o correspondente.Agora n¨®s temos um token de autentica??o v¨¢lido que pode ser utilizado para acessar para acessar os dados no Áú»¢¶Ä²©. We now have a valid user authentication token that can be used to access the data in Áú»¢¶Ä²©. Por exemplos, vamos usar o m¨¦todo host.get para recuperar as IDs, nomes e interfaces de todos os hosts configurados: hosts:
{
"jsonrpc": "2.0",
"method": "host.get",
"params": {
"output": [
"hostid",
"host"
],
"selectInterfaces": [
"interfaceid",
"ip"
]
},
"id": 2,
"auth": "0424bd59b807674191e7d77572075f33"
}
Observe que a propriedade auth
agora est¨¢ configurada com o token de autentica??o que obtivemos atrav¨¦s douser.login
.
O objeto de resposta ir¨¢ conter o dado requisitado sobre os hosts:
{
"jsonrpc": "2.0",
"result": [
{
"hostid": "10084",
"host": "Áú»¢¶Ä²© server",
"interfaces": [
{
"interfaceid": "1",
"ip": "127.0.0.1"
}
]
}
],
"id": 2
}
Por quest?es de performance, ¨¦ sempre recomend¨¢vel listar as propriedades do objeto que voc¨º deseja recuperar para evitar recuperar tudo.
Vamos criar um novo item no "Áú»¢¶Ä²© server" usando os dados que obtivemos atrav¨¦s do m¨¦todo anterior ( host.get
). Isso pode ser feito atrav¨¦s do m¨¦todo item.create:
{
"jsonrpc": "2.0",
"method": "item.create",
"params": {
"name": "Free disk space on $1",
"key_": "vfs.fs.size[/home/joe/,free]",
"hostid": "10084",
"type": 0,
"value_type": 3,
"interfaceid": "1",
"delay": 30
},
"auth": "0424bd59b807674191e7d77572075f33",
"id": 3
}
Uma resposta bem sucedida ir¨¢ conter o ID do novo item criado, que poder¨¢ ser utilizado para referenciar o item nas requisi??es a seguir:
O m¨¦todo item.create
, assim como outros m¨¦todos criados, tamb¨¦m aceita arrays de objetos e cria pode criar v v¨¢rios itens com apenas uma APIcall.
Se criar m¨¦todos aceita arrays, ent?o podemos adicionar v¨¢rios triggers triggers assim:
{
"jsonrpc": "2.0",
"method": "trigger.create",
"params": [
{
"description": "Processor load is too high on {HOST.NAME}",
"expression": "last(/Linux server/system.cpu.load[percpu,avg1])>5",
},
{
"description": "Too many processes on {HOST.NAME}",
"expression": "avg(/Linux server/proc.num[],5m)>300",
}
],
"auth": "0424bd59b807674191e7d77572075f33",
"id": 4
}
Uma resposta bem sucedida ir¨¢ conter os IDs dos triggers criados recentemente:
Habilite um item, isto ¨¦, configure seu status para "0":
{
"jsonrpc": "2.0",
"method": "item.update",
"params": {
"itemid": "10092",
"status": 0
},
"auth": "0424bd59b807674191e7d77572075f33",
"id": 5
}
Uma resposta bem sucedida ir¨¢ conter uma ID do item atualizado:
O m¨¦todo item.update
, assim como outros m¨¦todos atualizados, tamb¨¦m aceita objetos de array e consegue atualizar v¨¢rios itens com apenas um acionamento da API.
Habilite v¨¢rios triggers, isto ¨¦, configure seu status para "0":
{
"jsonrpc": "2.0",
"method": "trigger.update",
"params": [
{
"triggerid": "13938",
"status": 0
},
{
"triggerid": "13939",
"status": 0
}
],
"auth": "0424bd59b807674191e7d77572075f33",
"id": 6
}
Uma resposta bem sucedida ir¨¢ conter os IDs de triggers atualizados:
Este ¨¦ o m¨¦todo preferido de atualiza??o. Alguns m¨¦todos API como host.massupdate
permitem escrever c¨®digos mais simples. Contudo, n?o ¨¦ recomend¨¢vel utilizar esses m¨¦todos, uma vez que eles ser?o removidos em vers?es futuras do Áú»¢¶Ä²©.
At¨¦ esse ponto, tudo o que tentamos funcionou bem. Mas, o que acontece se tentarmos fazer uma chamada incorreta para a API? Vamos tentar criar outro host chamando host.create, mas omitindo o par?metro obrigat¨®rio groups
.
{
"jsonrpc": "2.0",
&±ç³Ü´Ç³Ù;³¾¨¦³Ù´Ç»å´Ç&±ç³Ü´Ç³Ù;: "host.create",
"par?metros": {
"host": "Servidor Linux",
"interfaces": [
{
"tipo 1,
"principal": 1,
"useip": 1,
"ip": "192.168.3.1",
"dns": "",
"porta": "10050"
}
]
},
"id": 7,
"auth": "0424bd59b807674191e7d77572075f33"
}
A resposta conter¨¢ uma mensagem de erro:
{
"jsonrpc": "2.0",
"erro": {
&±ç³Ü´Ç³Ù;³¦¨®»å¾±²µ´Ç&±ç³Ü´Ç³Ù;: -32602,
"message": "Par?metros inv¨¢lidos.",
"data": "Nenhum grupo para host \"Servidor Linux\"."
},
"id": 7
}
Se ocorreu um erro, em vez da propriedade result
, a resposta object conter¨¢ uma propriedade error
com os seguintes dados:
code
- um c¨®digo de erro;message
- um breve resumo do erro;data
- uma mensagem de erro mais detalhada.Erros podem ocorrer em diferentes casos, como, por exemplo, usar entrada incorreta de valores, um tempo limite de sess?o ou tentar acessar objetos inexistentes. Seu aplicativo deve ser capaz de lidar com esses tipos de erros.
Para simplificar o versionamento da API, desde o Áú»¢¶Ä²© 2.0.4, a vers?o da API corresponde ¨¤ vers?o do pr¨®prio Áú»¢¶Ä²©. Voc¨º pode usar o m¨¦todo apiinfo.version para encontrar a vers?o da API com a qual voc¨º est¨¢ trabalhando. Isso pode ser ¨²til para ajustar seu aplicativo para usar recursos espec¨ªficos da vers?o.
Garantimos a compatibilidade com vers?es anteriores dentro de uma vers?o principal. Ao fazer altera??es incompat¨ªveis com vers?es anteriores entre vers?es principais, geralmente deixam os recursos antigos como obsoletos na pr¨®xima vers?o, e apenas remov¨º-los no lan?amento depois disso. As vezes , podemos remover recursos entre os principais lan?amentos sem fornecer nenhuma compatibilidade. ? importante que voc¨º nunca confie em nenhum recurso e migre para alternativas mais recentes o mais r¨¢pido poss¨ªvel.
Voc¨º pode acompanhar todas as altera??es feitas na API no registro de altera??es da API.
Agora voc¨º j¨¢ sabe o suficiente para come?ar a trabalhar com a API do Áú»¢¶Ä²©, mas n?o pare aqui. Para leitura adicional, sugerimos que voc¨º d¨º uma olhada na lista de APIs dispon¨ªveis.