Я использую графит версии 0.9.10 для чтения ifHCInOctets
и ifHCOutOctets
, который я опрашиваю с помощью collectd
snmp
и graphite_write
плагины; я использую collectd
версия 5.1.0.
Данные поступают в графит без проблем; однако я хочу построить график в битах в секунду. Чтобы проверить, верна ли моя статистика, я начал загрузку ISO-образа с компакт-диска и посмотрел скорость загрузки ... она варьировалась от 1,0 до 2,0 Мбит / с.
Здравый смысл подсказывает вам, что вам нужно умножить счетчики октетов на 8, чтобы получить биты; однако мне кажется, что мне нужно разделить на 8, чтобы графитовый дисплей отображался правильно.
Когда я умножаю на коэффициент масштабирования 0,125, scale(scaleToSeconds(nonNegativeDerivative(<SERIES>), 60),0.125)
, формула правильно преобразуется в биты в секунду, и я вижу числа от 1 до 2 Мбит / с ...
Когда я умножаю на коэффициент масштабирования 8,0, scale(scaleToSeconds(nonNegativeDerivative(<SERIES>), 60),8)
, результаты явно неверны ... пик на графике составляет 120 Мбит / с. Я знаю, что это неправильно, потому что это жилой кабельный модем с пропускной способностью 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 и не мог найти правильного решения. Итак, вот оно:
/etc/carbon/storage-aggregation.conf
У меня есть все мои сетевые устройства с префиксом net
[net]
pattern = ^net.*
retentions = 10s:7d,5m:180d,5m:5y
Создайте /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
) для отслеживания других показателей Cisco, таких как источник питания, дуплекс, вентиляторы, (ОСОБЕННО) 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
Я использую Graphite 0.9.9, и функция scaleToSeconds мне недоступна. Чтобы обойти проблему, вам нужно подробно разбираться в метрике ... Возьмем мой пример:
Значение Y указывается в миллионах, а не в Мбит / с. Вы можете убедиться в этом, установив yUnitSystem = none в URL вашего графика. Во-вторых, октет - это 8 бит данных, которые являются байтом. Мой пик в 2000000000 байт (октетов) - это поминутная метрика, поэтому, чтобы лучше понять ее, давайте сделаем математику:
2000000000Б / 60с ≈ 33333333Б / с ≈ 32 Мегабайт / с ≈ 254 Мегабит / с
254 Мбит / с на моем интерфейсе Gigabit Ethernet (1000 Мбит / с) вполне соответствует его возможностям. Надеюсь, это поможет.