Consultando MIBs SNMP com o Qlikview

 

Este documento descreve de forma simplificada como usar o Qlikview para ler informações de dispositivos através do protocolo SNMP. No exemplo  apresentado existem algumas questões não resolvidas, como ler MIBs que retornam dados que retornam valores com tipos que não sejam numérico ou texto, porém serve de base para o aprimoramento de suas funcionalidades.

 

Pensando na capacidade do Qlikview extrair dados de diversas fontes, fiquei curioso em saber se conseguiria coletar de dados de servidores, usando além do LDAP, o protocolo SNMP. Não encontrei nada sobre o assunto, quando então resolvi pesquisar como poderia realizar a ação. Neste caso apresentado, estou recuperando dados de um servidor com SO Windows Server 2012 R2. O painel construído apresenta dados coletados do AD via LDAP  tais como grupos de usuário e usuários (disponível nativamente pelo Qlikview) e de dados do servidor recuperados via SNMP. A mesma técnica pode ser usado para recuperar dados de qualquer dispositivo com suporte a SNMP, como roteadores, switches, firewalls, storages, etc.

 

No caso do windows server, é necessário que o serviço SNMP encontre-se configurado e em execução.

 

Inicialmente precisava saber como fazer um GET em uma MIB SNMP. Então identifiquei um objeto do windows chamado ISNMP Automation Interface  (maiores detalhes em: https://msdn.microsoft.com/en-us/library/windows/hardware/ff554433(v=vs.85).aspx), e então construí o seguinte modulo VBScript:

 

'#####################################################################################

'# snmpGet - Função para receber o valor de um OID SNMP.

'#

'# Parâmetros: p_mib - MIB SNMP que se deseje recuperar

'#            p_ip  - Endereço IP do dispositivo que se deseja fazer a consulta SNMP

'#

'# Por: Jean Paul Neumann

'# Data ÚltMod: 04/02/2016

'# (c)2016 By NTech Tecnologia de Informação Ltda - www.ntech.com.br

'# Referencia componente SNMP

'# https://msdn.microsoft.com/en-us/library/windows/hardware/ff554433(v=vs.85).aspx

'#####################################################################################

 

Function snmpGet(p_mib, p_ip)

 

  Dim strDevice

  Dim strMib

 

  strDevice = p_ip

  strCommunity = "public"

 

  Set objSNMP = CreateObject("OlePrn.OleSNMP")

  objSNMP.Open strDevice, strCommunity, 2, 1000

 

  value = objSNMP.Get( p_mib )

 

' If err > 0 Then

' ' Do something to handle the error

' 'msgbox("Ocorreu um erro em snmGet")

' MsgBox "Error #" & CStr(Err.Number) & " " & Err.Description, vbCritical, "Error"

' End If

' On Error Goto 0

 

  objSNMP.Close

 

  snmpGet=value

 

End Function

 

Como estou consultando MIBs SNMP em um único dispositivo, então criei uma variavél no script para definir o IP que será passado nas chamadas da function snmpGet():

 

//#### Definição Variaveis SNMP ####

SET v_SNMPip='192.168.0.135';

 

Para finalmente fazer a carga fazendo consulta de diversas MIBs SNMP aos servidor, usamos o seguinte script de carga:

 

[Mibs]:

LOAD *, snmpGet(mib, ip) as valor;

LOAD * INLINE [

    mib, host, ip, desc

    .iso.org.dod.internet.mgmt.mib-2.system.sysName.0, zeus, $(v_SNMPip), sysName

    .iso.org.dod.internet.mgmt.mib-2.system.sysUpTime.0, zeus, $(v_SNMPip), sysUpTime

    .iso.org.dod.internet.mgmt.mib-2.system.sysDescr.0, zeus, $(v_SNMPip), sysDescr

    .iso.org.dod.internet.mgmt.mib-2.host.hrSystem.hrSystemNumUsers.0, zeus, $(v_SNMPip), hrSystemNumUsers

    .iso.org.dod.internet.mgmt.mib-2.host.hrSystem.hrSystemProcesses.0,zeus, $(v_SNMPip), hrSystemProcesses

    .iso.org.dod.internet.mgmt.mib-2.host.hrStorage.hrMemorySize.0,zeus, $(v_SNMPip), hrMemorySize

    .iso.org.dod.internet.mgmt.mib-2.host.hrStorage.hrStorageTable.hrStorageEntry.hrStorageAllocationUnits.1,zeus, $(v_SNMPip), hrStorageAllocationUnits

    .iso.org.dod.internet.mgmt.mib-2.host.hrStorage.hrStorageTable.hrStorageEntry.hrStorageSize.1,zeus, $(v_SNMPip), hrStorageSize

    .iso.org.dod.internet.mgmt.mib-2.host.hrStorage.hrStorageTable.hrStorageEntry.hrStorageUsed.1,zeus, $(v_SNMPip), hrStorageUsed

];

 

 

Vejam que inicialmente carregamos na tabela [Mibs] uma Tabela Inline com os seguintes Campos:

 

  •   mib = Mib SNMP que define qual o atributo do servidor que queremos ler.
  •   host = Nome do host (apenas informativo).
  •   ip = Endereço IP do dispositivo que desejamos fazer consulta SNMP. Neste exemplos usanmos o endereço IP definido na variavél v_SNMPip.
  •   desc = Descrição da MIB SNMP.

 

Em seguida acrescentamos a tabela [Mibs] o atributo valor que será preenchido chamando a função VBScript snmpGet(), passando como parâmetro os campos da tabela Inline mib e ip. Desta forma para cada mib da Inline a função snmpGet() fará uma requisição da mesma ao dispositivo de endereço ip .

 

 

Então você poderá ter um resultado como visto no painel abaixo:

 

ScreenShotSM.png