Estou envolvido em projeto de BI onde trabalho que precisamos extrair informações da poderosa ferramenta de monitoramento Zabbix ao mais poderoso ainda Microsoft Power BI.
O Power BI continua a me surpreender a cada dia. A cada novo release aprendo novas maneiras de liberar o poder do Power BI.
Configurei a conexão do Power BI em um ambiente de teste do Zabbix no meu próprio computador. Por mais incrível que o Zabbix seja, achamos necessário melhorar seus relatórios e recursos de visualização. Como sou DBA, rapidamente conectei com uma solução Power BI.
Esta postagem pressupõe um nível básico de conhecimento do Power BI. Não tem isso? Temos um Curso Power BI grátis básico e também um curso completo – Power BI – Profissional – Do Básico ao avançado + Criação de 5 projetos práticos.
Tudo bem, vamos nos aprofundar nos detalhes!
Primeiro, você precisará gerar um token Zabbix para o Power BI se conectar ao Zabbix. Você só precisa fazer isso uma vez; o token será salvo e usado para futuras atualizações de dados.
- No Power BI Desktop, abra ‘Transform Data’.
- Configure quatro parâmetros de texto: um para seu usuário Zabbix, um para sua senha Zabbix, um para sua URL Zabbix e um para armazenar seu token Zabbix:
Abra o Editor avançado para ‘GetZabbixToken’ e copie e cole o código a seguir (este código pressupõe que você está usando parâmetros, conforme listado acima como uma etapa opcional). Este JSON fará uma chamada para o seu servidor Zabbix e recuperará um token único.
let
user = User ,
password = Password ,
url = ZabbixURL ,
Body = " {
" " jsonrpc " " : " " 2.0 " " ,
" " método " " : " " usuário . login " " ,
" " params " " : {
"" usuário "" : "" "& usuário &""" ,
"" senha "" :"" "& senha &" ""
} ,
"" auth "" : null ,
"" id "" : 1
} " ,
Fonte = Json . Documento (
Web . Conteúdo (
url ,
[
Cabeçalhos = [
# " Tipo de conteúdo " = " aplicativo / json "
] ,
Conteúdo = Texto .ToBinary (Corpo )
]
)
)
na
fonte
Ao fechar o editor avançado, o JSON será executado. Se tudo estiver correto, você deverá ver resultados semelhantes à captura de tela abaixo, com um token no campo de resultado. Se você vir ‘erro’ no campo de resultado, clique nele para expandir o erro e ver o que está errado.
- Copie o token gerado acima e cole no parâmetro ZabbixToken.
- Desative a consulta GetZabbixToken. Observação: você também pode executar GetZabbixToken a cada vez e fazer referência a essa consulta em vez de usar um parâmetro. Eu escolho o método do parâmetro, pois você só precisa obter o token uma vez e não há necessidade de gerar um novo token toda vez que você atualizar os dados.
Obtenha dados do Zabbix
A seguir, usaremos o parâmetro token acima para recuperar alguns dados do Zabbix. Para este exemplo, obteremos os dados do usuário. Também irei fornecer a você um trecho de código com o corpo para obter os dados de inventário do host!
- Crie outra consulta em branco e renomeie-a para ‘ZabbixUsers’. Abra o ‘Editor Avançado’, copie e cole o código abaixo. Isso usará o parâmetro token criado anteriormente e chamará o método user.get da API do Zabbix. Em seguida, ele converterá o JSON resultante em uma tabela e expandirá os dados:
let
token = ZabbixToken ,
Body =
" {
" " jsonrpc " " : " " 2.0 " " ,
" " method " " : " " user . get " " ,
" " params " " : {
" " output " " : " " extender ""
} ,
"" auth "" : """& token &" "" ,
"" id "" : 1
} " ,
Source = Json . Document (
Web . Contents (
ZabbixURL ,
[
Headers = [
# " Content-Type " = " application / json "
] ,
Content = Text . ToBinary ( Body )
]
)
) ,
result = Source [ resultado ] ,
#"Convertido em Tabela" = Tabela . FromList ( result , Splitter . SplitByNothing ( ) , null , null , ExtraValues . Error ) ,
# "Expanded Column1" = Table . ExpandRecordColumn ( # "Convertido em Tabela" , "Coluna1" , { "userid" , "alias" , "nome" , "sobrenome" , "url" , , "autologout" , "lang" , "refresh" , "type" , "theme" , "try_failed" , "try_ip" , "try_clock" , "rows_per_page" } , { "userid" , "alias" , "name" , "sobrenome" , "url" , "autologin" , "autologout" , "lang" , "atualizar" , "tipo", "tema" , "tentativa_failed" , "tentativa_ip" , "try_clock" , "rows_per_page" } )
em
# "Expanded Column1"
Seus resultados devem ser uma tabela com todos os seus usuários Zabbix:
Você também pode obter informações sobre o inventário do host Zabbix chamando host.get e definindo o parâmetro ‘selectInventory’ como ‘true’:
let
token = ZabbixToken,
Body =
"{
""jsonrpc"": ""2.0"",
""method"": ""host.get"",
""params"": {
""selectInventory"":true,
""output"": ""extend""
},
""auth"": """ & token & """,
""id"": 1
}",
Source = Json.Document(
Web.Contents(
ZabbixURL,
[
Headers=[
#"Content-Type"="application/json"
],
Content = Text.ToBinary(Body)
]
)
),
result = Source[result],
#"Converted to Table" = Table.FromList(result, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
#"Expanded Column1" = Table.ExpandRecordColumn(#"Converted to Table", "Column1", {"hostid", "proxy_hostid", "host", "status", "disable_until", "error", "available", "errors_from", "lastaccess", "ipmi_authtype", "ipmi_privilege", "ipmi_username", "ipmi_password", "ipmi_disable_until", "ipmi_available", "snmp_disable_until", "snmp_available", "maintenanceid", "maintenance_status", "maintenance_type", "maintenance_from", "ipmi_errors_from", "snmp_errors_from", "ipmi_error", "snmp_error", "jmx_disable_until", "jmx_available", "jmx_errors_from", "jmx_error", "name", "flags", "templateid", "description", "tls_connect", "tls_accept", "tls_issuer", "tls_subject", "tls_psk_identity", "tls_psk", "proxy_address", "auto_compress", "discover", "inventory_mode", "inventory"}, {"hostid", "proxy_hostid", "host", "status", "disable_until", "error", "available", "errors_from", "lastaccess", "ipmi_authtype", "ipmi_privilege", "ipmi_username", "ipmi_password", "ipmi_disable_until", "ipmi_available", "snmp_disable_until", "snmp_available", "maintenanceid", "maintenance_status", "maintenance_type", "maintenance_from", "ipmi_errors_from", "snmp_errors_from", "ipmi_error", "snmp_error", "jmx_disable_until", "jmx_available", "jmx_errors_from", "jmx_error", "name", "flags", "templateid", "description", "tls_connect", "tls_accept", "tls_issuer", "tls_subject", "tls_psk_identity", "tls_psk", "proxy_address", "auto_compress", "discover", "inventory_mode", "inventory"}),
#"FILTER: inventory_mode = 1" = Table.SelectRows(#"Expanded Column1", each ([inventory_mode] = "1")),
#"Expanded inventory" = Table.ExpandRecordColumn(#"FILTER: inventory_mode = 1", "inventory", {"type", "type_full", "name", "alias", "os", "os_full", "os_short", "serialno_a", "serialno_b", "tag", "asset_tag", "macaddress_a", "macaddress_b", "hardware", "hardware_full", "software", "software_full", "software_app_a", "software_app_b", "software_app_c", "software_app_d", "software_app_e", "contact", "location", "location_lat", "location_lon", "notes", "chassis", "model", "hw_arch", "vendor", "contract_number", "installer_name", "deployment_status", "url_a", "url_b", "url_c", "host_networks", "host_netmask", "host_router", "oob_ip", "oob_netmask", "oob_router", "date_hw_purchase", "date_hw_install", "date_hw_expiry", "date_hw_decomm", "site_address_a", "site_address_b", "site_address_c", "site_city", "site_state", "site_country", "site_zip", "site_rack", "site_notes", "poc_1_name", "poc_1_email", "poc_1_phone_a", "poc_1_phone_b", "poc_1_cell", "poc_1_screen", "poc_1_notes", "poc_2_name", "poc_2_email", "poc_2_phone_a", "poc_2_phone_b", "poc_2_cell", "poc_2_screen", "poc_2_notes"}, {"inventory.type", "inventory.type_full", "inventory.name", "inventory.alias", "inventory.os", "inventory.os_full", "inventory.os_short", "inventory.serialno_a", "inventory.serialno_b", "inventory.tag", "inventory.asset_tag", "inventory.macaddress_a", "inventory.macaddress_b", "inventory.hardware", "inventory.hardware_full", "inventory.software", "inventory.software_full", "inventory.software_app_a", "inventory.software_app_b", "inventory.software_app_c", "inventory.software_app_d", "inventory.software_app_e", "inventory.contact", "inventory.location", "inventory.location_lat", "inventory.location_lon", "inventory.notes", "inventory.chassis", "inventory.model", "inventory.hw_arch", "inventory.vendor", "inventory.contract_number", "inventory.installer_name", "inventory.deployment_status", "inventory.url_a", "inventory.url_b", "inventory.url_c", "inventory.host_networks", "inventory.host_netmask", "inventory.host_router", "inventory.oob_ip", "inventory.oob_netmask", "inventory.oob_router", "inventory.date_hw_purchase", "inventory.date_hw_install", "inventory.date_hw_expiry", "inventory.date_hw_decomm", "inventory.site_address_a", "inventory.site_address_b", "inventory.site_address_c", "inventory.site_city", "inventory.site_state", "inventory.site_country", "inventory.site_zip", "inventory.site_rack", "inventory.site_notes", "inventory.poc_1_name", "inventory.poc_1_email", "inventory.poc_1_phone_a", "inventory.poc_1_phone_b", "inventory.poc_1_cell", "inventory.poc_1_screen", "inventory.poc_1_notes", "inventory.poc_2_name", "inventory.poc_2_email", "inventory.poc_2_phone_a", "inventory.poc_2_phone_b", "inventory.poc_2_cell", "inventory.poc_2_screen", "inventory.poc_2_notes"})
in
#"Expanded inventory"
Seu resultado deve ser assim:
Como um exemplo de quais dados você pode recuperar do Zabbix, aqui estão os dados que estamos usando:
Resumo
Você pode usar os exemplos acima como base para obter quaisquer dados disponíveis na API do Zabbix . O Zabbix fornece uma excelente documentação sobre todos os métodos e parâmetros da API aqui: https://www.zabbix.com/documentation/current/manual/api/reference (certifique-se de consultar a documentação da sua versão do Zabbix).
Obrigado por nós seguir!
Link permanente
Bom dia, seu código funciona. O editor M do PBI já identificou na concatenação inicial
Link permanente
eu consegui a disponibilidade.