Networking

Graphite SNMP 計數器轉換

  • March 15, 2016

我正在使用石墨版本 0.9.10 來閱讀ifHCInOctetsand ifHCOutOctets,我正在使用and外掛進行輪詢;我使用的是5.1.0 版。collectd snmp``graphite_writecollectd

數據毫無問題地進入石墨;但是,我想以每秒位數的形式繪製圖表。為了測試我的統計數據是否正確,我開始下載 CD iso 並觀察下載速率……它在 1.0Mbps 和 2.0Mbps 之間變化。

常識告訴你,需要將 Octets 計數器乘以 8 才能得到位;但是,似乎我需要除以 8 才能正確顯示石墨。

當我乘以 0.125 比例因子時scale(scaleToSeconds(nonNegativeDerivative(<SERIES>), 60),0.125),公式正確轉換為每秒位數,我看到 1Mpbs 和 2Mbps 之間的數字……

正確比例 - 0.125

當我乘以 8.0 比例因子時scale(scaleToSeconds(nonNegativeDerivative(<SERIES>), 60),8),結果顯然是錯誤的……圖形峰值為 120Mbps。我知道那是錯誤的,因為這是一個 5M 上限的住宅電纜調製解調器。

錯誤的比例

問題:如果我向石墨發送八位字節,為什麼會scale(<foo>, 8)產生不正確的結果?


/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

輸出自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#

輸出自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#

如果你想要每秒位數,你需要指定 1 而不是 60 作為scaleToSeconds()函式的第二個參數,因為你想要每秒,而不是每分鐘。(助記符:是,而不是:)

這是實現該功能的原始更新檔;它可能會澄清。

我花了幾個小時試圖讓它在 Grafana v2.6 中正常工作,但找不到正確的解決方案。所以這裡是:

  1. 確保您在中定義了正確的儲存聚合/etc/carbon/storage-aggregation.conf

我所有的網路設備都以net

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

  1. 創建/etc/collectd/collectd.conf.d/snmp.conf並添加以下內容:
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>

這是custom.db:(我不記得我在哪裡得到了原始文件,但感謝那個傢伙!)

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

如果有人有正確的配置(和types.custom.db)來跟踪其他思科指標,如電源、雙工、風扇、(特別是)NBAR 等,請分享!

在 Grafana 中,像這樣配置圖形:

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

您需要替換net.rtr.snmp.if_octets.RTR-Outside-Gi0_0為您的設備名稱和 ifAlias

引用自:https://serverfault.com/questions/425828