上篇文章已经初步讲解了 telegraf 通过 snmp plugins 监控网络设备,那么在实际监控工作中,网络设备监控起来相对比较复杂,特别是大型的框式设备,动辄上千条监控项,如果通过一条条写,肯定是不太切合实际的,所以本文将提供自动发现的方式自动创建对应的监控项。
本文将对交换机端口的入方向流量&出方向流量进行演示。下表即是个人认为常用的几个监控项,如果有偏差请自行调整。
名称 | OID | 数据类型 | 备注 |
---|---|---|---|
ifName | .1.3.6.1.2.1.31.1.1.1.1 | OCTET STRING{(0,255)} | 端口名称 |
ifAlias | .1.3.6.1.2.1.31.1.1.1.18 | OCTET STRING{(0,242)} | 端口别名 |
ifOperStatus | .1.3.6.1.2.1.2.2.1.8 | INTEGER | 端口状态:up(1),down(2) |
ifHighSpeed | .1.3.6.1.2.1.31.1.1.1.15 | Gauge32 | 端口当前速率 |
ifHCInOctets | .1.3.6.1.2.1.31.1.1.1.6 | Counter64 | 入方向流量 |
ifHCOutOctets | .1.3.6.1.2.1.31.1.1.1.10 | Counter64 | 出方向流量 |
ifInErrors | .1.3.6.1.2.1.2.2.1.14 | Counter32 | 入方向错包 |
ifOutErrors | .1.3.6.1.2.1.2.2.1.20 | Counter32 | 出方向错包 |
ifType | .1.3.6.1.2.1.2.2.1.3 | INTEGER | 端口类型 |
ifOutDiscards | .1.3.6.1.2.1.2.2.1.19 | Counter32 | 出口丢包 |
ifInDiscards | .1.3.6.1.2.1.2.2.1.13 | Counter32 | 入口丢包 |
在做监控项的时候需要两个点,第一个如果来写监控项更清晰,另外一个是方便后面做过滤(过滤会放在下一篇)。什么意思呢? 通过上面的表格得知入方向流量的 OID(ifHCInOctets)为 1.3.6.1.2.1.31.1.1.1.6,通过 snmpwalk 发现有很多监控项。
那么怎么知道哪个是哪个呢?此时还需要查询其他监控项得知,这个 OID 就是端口名称,OID 为 1.3.6.1.2.1.31.1.1.1.1,通过该 OID 查询的结果可以看出端口的名称。
那么这两个得出的结果如何对应呢?细心的朋友可以发现,这两个 OID 对应的结果的最后一位是相同的。例如我们已经知道了 10GE1/0/1 的 OID 是 IF-MIB::ifName.5(1.3.6.1.2.1.31.1.1.1.1.5),接下来将入方向流量的 OID 加上.5 来测试,即可得到如下结果。
到了这里基本就可以确定整个逻辑了,通过上述表格对比,可以发现前缀 1.3.6.1.2.1.2.2(ifTable)和 1.3.6.1.2.1.31.1.1(ifXTable)是相同的,而这些 OID 都是出自于这两个 table 里。那么在写配置的时候该如何选择呢?先用 ifxTable 看看。
[global_tags]
[agent]
interval = "30s"
round_interval = true
metric_batch_size = 1000
metric_buffer_limit = 10000
collection_jitter = "0s"
flush_interval = "30s"
flush_jitter = "0s"
precision = ""
hostname = "test"
omit_hostname = false
[[outputs.opentsdb]]
host = "http://10.0.0.13"
port = 19000
http_batch_size = 50
http_path = "/opentsdb/put"
debug = false
separator = "_"
[[inputs.snmp]]
agents = ["10.240.3.241"]
timeout = "5s"
version = 2
community = "huawei@123"
agent_host_tag = "ident"
retries = 1
[[inputs.snmp.table]]
oid = "1.3.6.1.2.1.31.1.1"
name = "interface"
inherit_tags = ["source"]
[[inputs.snmp.table.field]]
oid = "1.3.6.1.2.1.2.2.1.2"
name = "port_name"
is_tag = true
[[inputs.snmp.table.field]]
oid = "1.3.6.1.2.1.31.1.1.1.18"
name = "port_alias"
is_tag = true
[[inputs.snmp.table.field]]
oid = "1.3.6.1.2.1.2.2.1.8"
name = "port_status"
is_tag = true
[[inputs.snmp.table.field]]
oid = "1.3.6.1.2.1.2.2.1.3"
name = "port_type"
is_tag = true
telegraf --config /etc/telegraf/telegraf.conf --input-filter snmp --test
通过上图可以看到有很多无用的监控项,以 Vlanif34 监控项为例。通过下面两图对比可以得出最终获得的监控项是自定义 + ifxTable 里所有的取值。
这一步仅做演示,实际可以不需要,避免多余的监控项产生
前端的效果就看的比较清楚了,多余的监控项就比较清晰了,那么如何过滤掉多余的监控项呢?
可以在 inputs.snmp 里加入 fieldpass 来实现过滤。针对监控项可以加的过滤参数如下:
fieldpass 可以理为匹配该名称监控项才可采集
fielddrop 匹配该名称的监控项不进行采集
[global_tags]
[agent]
interval = "30s"
round_interval = true
metric_batch_size = 1000
metric_buffer_limit = 10000
collection_jitter = "0s"
flush_interval = "30s"
flush_jitter = "0s"
precision = ""
hostname = "test"
omit_hostname = false
[[outputs.opentsdb]]
host = "http://10.0.0.13"
port = 19000
http_batch_size = 50
http_path = "/opentsdb/put"
debug = false
separator = "_"
[[inputs.snmp]]
agents = ["10.240.3.241"]
timeout = "5s"
version = 2
community = "huawei@123"
agent_host_tag = "ident"
retries = 1
fieldpass = ["ifHCInOctets","ifHCOutOctets"]
[[inputs.snmp.table]]
oid = "1.3.6.1.2.1.31.1.1"
name = "interface"
inherit_tags = ["source"]
[[inputs.snmp.table.field]]
oid = "1.3.6.1.2.1.2.2.1.2"
name = "port_name"
is_tag = true
[[inputs.snmp.table.field]]
oid = "1.3.6.1.2.1.31.1.1.1.18"
name = "port_alias"
is_tag = true
[[inputs.snmp.table.field]]
oid = "1.3.6.1.2.1.2.2.1.8"
name = "port_status"
is_tag = true
[[inputs.snmp.table.field]]
oid = "1.3.6.1.2.1.2.2.1.3"
name = "port_type"
is_tag = true
一系列操作下来其实会遇到很多问题,大家在实际操作中就知道了,由于夜莺部分完成监控后,自身出图功能相对较弱,需要借助 grafana 出图,所以还需要考虑变量的设定,这无疑会增加对 label 和 metric 定义的难度,在下一期会出终结篇,会详细讲解