Grafite SNMP Contador transforma

4

Estou usando a versão 0.9.10 do grafite para ler ifHCInOctets e ifHCOutOctets , que estou pesquisando com collectd snmp e graphite_write plugins; Estou usando a collectd versão 5.1.0.

Os dados chegam ao grafite sem problemas; no entanto, quero gráfico como bits por segundo. Para testar se minhas estatísticas estão corretas, eu iniciei um download do CD iso e assisti a taxa de download ... variou entre 1.0Mbps e 2.0Mbps.

O senso comum diz que você precisa multiplicar os contadores do Octets por 8 para obter bits; no entanto, parece que eu preciso dividir por 8 para fazer a exibição da grafite corretamente.

Quando eu multiplico por um fator de escala de 0,125, scale(scaleToSeconds(nonNegativeDerivative(<SERIES>), 60),0.125) , a fórmula converte corretamente para bits por segundo e vejo números entre 1Mpbs e 2Mbps ...

Quandoeumultiplicoporumfatordeescala8.0,scale(scaleToSeconds(nonNegativeDerivative(<SERIES>),60),8),osresultadosestãoobviamenteerrados...ográficoatingeumpicode120Mbps.Euseiqueestáerrado,porqueesteéummodemacaboresidencialcomumatampade5milhões.

Pergunta : Se eu estiver enviando octetos para grafite, por que scale(<foo>, 8) está produzindo resultados incorretos?

/opt/collectd/etc/collectd.conf

LoadPlugin syslog 
LoadPlugin cpu
LoadPlugin interface
LoadPlugin load
LoadPlugin memory
LoadPlugin network
LoadPlugin snmp
LoadPlugin write_graphite

<Plugin snmp>
   <Data "std_traffic">
       Type "if_octets"
       Table true
       Instance "IF-MIB::ifName"
       Values "IF-MIB::ifHCInOctets" "IF-MIB::ifHCOutOctets"
   </Data>

   <Host "fw.pennington.net">
       Address "172.16.1.1"
       Version 2
       Community "public"
       Collect "std_traffic"
       Interval 60
   </Host>
</Plugin>

<Plugin write_graphite>
  <Carbon>
    Host "localhost"
    Port "2003"
    Prefix ""
    Postfix ""
    StoreRates false
    AlwaysAppendDS false
    EscapeCharacter "_"
  </Carbon>
</Plugin>

/opt/graphite/conf/storage-schema.conf:

[carbon]
pattern = ^carbon\.
retentions = 60s:90d

[default]
pattern = .*
retentions = 60s:1w, 5m:1y

/opt/graphite/conf/carbon.conf:

[cache]

USER = carbon

MAX_CACHE_SIZE = inf

MAX_UPDATES_PER_SECOND = 500

MAX_CREATES_PER_MINUTE = 50

LINE_RECEIVER_INTERFACE = 0.0.0.0
LINE_RECEIVER_PORT = 2003

ENABLE_UDP_LISTENER = False
UDP_RECEIVER_INTERFACE = 0.0.0.0
UDP_RECEIVER_PORT = 2003

PICKLE_RECEIVER_INTERFACE = 0.0.0.0
PICKLE_RECEIVER_PORT = 2004

USE_INSECURE_UNPICKLER = False

CACHE_QUERY_INTERFACE = 0.0.0.0
CACHE_QUERY_PORT = 7002

USE_FLOW_CONTROL = True

LOG_UPDATES = False

WHISPER_AUTOFLUSH = False

[relay]
LINE_RECEIVER_INTERFACE = 0.0.0.0
LINE_RECEIVER_PORT = 2013
PICKLE_RECEIVER_INTERFACE = 0.0.0.0
PICKLE_RECEIVER_PORT = 2014

RELAY_METHOD = rules

REPLICATION_FACTOR = 1

DESTINATIONS = 127.0.0.1:2004

MAX_DATAPOINTS_PER_MESSAGE = 500
MAX_QUEUE_SIZE = 10000

USE_FLOW_CONTROL = True

[aggregator]
LINE_RECEIVER_INTERFACE = 0.0.0.0
LINE_RECEIVER_PORT = 2023

PICKLE_RECEIVER_INTERFACE = 0.0.0.0
PICKLE_RECEIVER_PORT = 2024

DESTINATIONS = 127.0.0.1:2004

REPLICATION_FACTOR = 1

MAX_QUEUE_SIZE = 10000

USE_FLOW_CONTROL = True

MAX_DATAPOINTS_PER_MESSAGE = 500

MAX_AGGREGATION_INTERVALS = 5

Saída de whisper-fetch.py

root@tsunami:/opt/graphite/conf# python /usr/local/bin/whisper-fetch.py --pretty /opt/graphite/storage/whisper/fw_pennington_net/snmp/if_octets-Ethernet0_0/rx.wsp
Mon Sep 10 02:53:00 2012        110454375894.000000
...
Tue Sep 11 02:50:00 2012        110532796093.000000
Tue Sep 11 02:51:00 2012        110532819931.000000 <------------ Correct
Tue Sep 11 02:52:00 2012        None
root@tsunami:/opt/graphite/conf#

Saída de show interface eth0/0

mpenning-fw# sh int eth0/0
Interface Ethernet0/0 "", is up, line protocol is up
  Hardware is 88E6095, BW 100 Mbps, DLY 100 usec
        Auto-Duplex(Full-duplex), Auto-Speed(100 Mbps)
        Description: TIME WARNER 5Mbps circuit
        Available but not configured via nameif
        MAC address 0019.0726.4a39, MTU not set
        IP address unassigned
        157040376 packets input, 110532814004 bytes, 0 no buffer
                                 ^^^^^^^^^^^^^^^^^^
        Received 68921847 broadcasts, 0 runts, 0 giants
        0 input errors, 0 CRC, 0 frame, 0 overrun, 0 ignored, 0 abort
        0 L2 decode drops
        8589974681 switch ingress policy drops
        57851429 packets output, 8036229250 bytes, 0 underruns
        0 output errors, 0 collisions, 0 interface resets
        0 babbles, 0 late collisions, 0 deferred
        0 lost carrier, 0 no carrier
        0 rate limit drops
        0 switch egress policy drops
mpenning-fw#
    
por Mike Pennington 10.09.2012 / 05:43

3 respostas

5

Se você quiser bits por segundo, precisará especificar 1 em vez de 60 como segundo argumento para a função scaleToSeconds() , conforme desejar por segundo, não por minuto. (Mnemônico: é para segundos, não de segundos:)

Aqui está o patch original que implementou a função; pode esclarecer.

    
por 29.10.2012 / 19:16
1

Passei horas tentando fazer isso funcionar corretamente no Grafana v2.6 e não consegui encontrar a solução certa. Então aqui está:

  1. Verifique se você tem a Agregação de armazenamento correta definida em /etc/carbon/storage-aggregation.conf

Eu tenho todos os meus dispositivos de rede prefixados com net

[net] pattern = ^net.* retentions = 10s:7d,5m:180d,5m:5y

  1. Crie /etc/collectd/collectd.conf.d/snmp.conf e adicione o seguinte:

    FQDNLookup true
    AutoLoadPlugin true
    Interval 10
    LoadPlugin syslog
    <Plugin syslog>
      LogLevel info
    </Plugin>
    
    LoadPlugin contextswitch
    LoadPlugin cpu
    LoadPlugin df
    LoadPlugin entropy
    
    LoadPlugin interface
    LoadPlugin irq
    LoadPlugin load
    LoadPlugin memory
    LoadPlugin processes
    #LoadPlugin sensors
    LoadPlugin swap
    LoadPlugin unixsock
    LoadPlugin users
    LoadPlugin write_graphite
    
    <Plugin write_graphite>
      <Node "stats">
        Host "stats.foo.com"
        Port "2003"
        Protocol "tcp"
        LogSendErrors true
        Prefix "net."
        SeparateInstances true
        StoreRates true
        AlwaysAppendDS false
        EscapeCharacter "_"
      </Node>
    </Plugin>
    
    <Plugin unixsock>
      SocketFile "/var/run/collectd-unixsock"
      SocketGroup "adm"
      SocketPerms "0660"
    </Plugin>
    
    <Plugin df>
      # ignore rootfs; else, the root file-system would appear twice, causing
      # one of the updates to fail and spam the log
      FSType rootfs
      # ignore the usual virtual / temporary file-systems
      FSType sysfs
      FSType proc
      FSType devtmpfs
      FSType devpts
      FSType tmpfs
      FSType fusectl
      FSType cgroup
      IgnoreSelected true
    </Plugin>
    
    # added a special types.db for cisco devices
    TypesDB "/usr/share/collectd/types.db" "/usr/share/collectd/types.custom.db"
    
    LoadPlugin snmp
    <Plugin snmp>
      # the <Data> name is what to <Collect> down in the <Host> blocks
      # the "Type" must be from the list included in /usr/share/collectd/types.db (or custom.db)
      <Data "if_octets">
        Type "if_octets"
        Table true
        # Note: I use ifAlias so that it shows the Interface Descriptions instead just "GigabitEthernet_1_0_0, etc. But of course, make sure you have interface descriptions if you use this :)
        Instance "IF-MIB::ifAlias"
        Values "IF-MIB::ifHCInOctets" "IF-MIB::ifHCOutOctets"
      </Data>
      <Data "if_errors">
        Type "if_errors"
        Table true
        Instance "IF-MIB::ifAlias"
        Values "IF-MIB::ifInErrors" "IF-MIB::ifOutErrors"
      </Data>
      <Data "cisco_cpu">
        Type "cisco_cpu"
        Table true
        Values "CISCO-PROCESS-MIB::cpmCPUTotal5secRev" "CISCO-PROCESS-MIB::cpmCPUTotal1minRev" "CISCO-PROCESS-MIB::cpmCPUTotal5minRev"
      </Data>
      <Data "uptime">
        Type "uptime"
        Table false
        Instance "Uptime"
        scale 0.01
        Values  "DISMAN-EVENT-MIB::sysUpTimeInstance"
      </Data>
      <Data "memory_free">
        Type "memory_free"
        Table true
        Instance "CISCO-MEMORY-POOL-MIB::ciscoMemoryPoolName"
        Values  "CISCO-MEMORY-POOL-MIB::ciscoMemoryPoolFree"
      </Data>
      <Data "memory_used">
        Type "memory_used"
        Table true
        Instance "CISCO-MEMORY-POOL-MIB::ciscoMemoryPoolName"
        Values "CISCO-MEMORY-POOL-MIB::ciscoMemoryPoolUsed"
      </Data>
    
      # Hosts:
      <Host "rtr">
        Address "192.168.1.1"
        Version 2
        Community "public"
        Collect "if_octets" "cisco_cpu" "uptime"
        Interval 10
      </Host>
      <Host "switch">
        Address "192.168.1.254"
        Version 2 
        Community "public"
        Collect "if_octets" "cisco_cpu" "uptime"
        Interval 10
      </Host>
    </Plugin>
    

Aqui está o custom.db: (não me lembro de onde obtive o original, mas graças a esse cara!)

if_stats                ifHCInOctets:COUNTER:0:U, ifHCOutOctets:COUNTER:0:U, ifHCInUcastPkts:COUNTER:0:U, ifHCInMulticastPkts:COUNTER:0:U, ifHCInBroadcastPkts:COUNTER:0:U, ifHCOutUcastPkts:COUNTER:0:U, ifHCOutMulticastPkts:COUNTER:0:U, ifHCOutBroadcastPkts:COUNTER:0:U, ifInDiscards:COUNTER:0:U, ifInErrors:COUNTER:0:U, ifOutDiscards:COUNTER:0:U, ifOutErrors:COUNTER:0:U
if_octets_hc     ifHCInOctets:COUNTER:0:U, ifHCOutOctets:COUNTER:0:U
if_packets_hc                   ifHCInUcastPkts:COUNTER:0:U, ifHCInMcastPkts:COUNTER:0:U, ifHCInBcastPkts:COUNTER:0:U, ifHCOutUcastPkts:COUNTER:0:U, ifHCOutMcastPkts:COUNTER:0:U, ifHCOutBcastPkts:COUNTER:0:U
if_drop_discard_err_que         ifInDiscards:COUNTER:0:U, ifInErrors:COUNTER:0:U, ifOutDiscards:COUNTER:0:U, ifOutErrors:COUNTER:0:U
if_rgpackets                   ifInUcastPkts:COUNTER:0:U, ifInNUcastPkts:COUNTER:0:U, ifOutUcastPkts:COUNTER:0:U, ifOutNUcastPkts:COUNTER:0:U
sensors                      sensorValue:GAUGE:U:U, sensorThreshold:GAUGE:U:U
uptime                  uptime:GAUGE:U:U
cisco_cpu       cpu5sec:GAUGE:0:100, cpu1min:GAUGE:0:100, cpu5min:GAUGE:0:100
routes  ipv4routes:GAUGE:0:U, ipv6routes:GAUGE:0:U, mcastroutes:GAUGE:0:U
ipsla   rttAdmNumDistBkt:GAUGE:0:200, rttAdmDistInt:GAUGE:0:200, rttTotalsInit:COUNTER:0:U, rttCollectDrops:COUNTER:0:U, rttCollectTimeouts:COUNTER:0:U, rttCptComplTimeMn:GAUGE:0:100000, rttCptComplTimeMx:GAUGE:0:100000, rttCptSumCmpTm2Hi:COUNTER:0:U, rttCptSumCmpTm2Lo:COUNTER:0:U, rttCptSumCmpTm:COUNTER:0:U, rttCptOverThres:COUNTER:0:U
ipslaminimal   rttCptCompletions:COUNTER:0:U
ipsla2  rttCollectTimeouts:COUNTER:0:U

Se alguém tiver a configuração correta (e types.custom.db ) para rastrear outras métricas da Cisco, como Fonte de alimentação, Frente e verso, Ventiladores, (ESPECIALMENTE) NBAR, etc. Compartilhe!

No Grafana, configure o gráfico da seguinte forma:

alias(scale(scaleToSeconds(net.rtr.snmp.if_octets.RTR-Outside-Gi0_0.rx, 0.125), 3600), 'Download')

Você precisará substituir net.rtr.snmp.if_octets.RTR-Outside-Gi0_0 pelo nome do seu dispositivo e ifAlias

    
por 15.03.2016 / 21:09
0

Estou executando o Graphite 0.9.9 e scaleToSeconds não está disponível para mim. Para contornar o problema, você precisa entender a métrica em detalhes ... Tome meu exemplo:

O valor Y está em Milhões e não em Mbps. Você pode verificar isso configurando yUnitSystem = none em seu URL gráfico. Em segundo lugar, um octeto é 8 bits de dados que é um byte. Meu pico de 2000000000 bytes (octetos) é uma métrica por minuto, então, para ter mais sentido, vamos fazer matemática:

2000000000B / 60s ≈ 33333333B / s ≈ 32 Megabytes / s ≈ 254 Megabits / s

254 Mbps na minha interface Gigabit ethernet (1000 Mbps) está bem dentro de sua capacidade. Espero que isso ajude.

    
por 14.01.2014 / 22:00