教程|监控项类型—SNMP客户端

举报
Zabbix中国 发表于 2022/11/17 11:15:46 2022/11/17
【摘要】 Zabbix 服务器和代理守护进程向 SNMP 设备一个请求中查询多个值时,这会影响所有SNMP监控项(常规 SNMP监控项、具有动态索引的 SNMP 监控项和 SNMP 自动发现)同时可以使 SNMP 处理更加高效。见批量处理技术部分内部如何运作的详细信息。对于无法使用“批量请求”的接口可以通过设置可以关闭。

  概 述

您可能希望在打印机、网络交换机、路由器或UPS等设备上使用SNMP监控,这些设备通常启用SNMP,在这些设备上尝试设置完整的操作系统和Zabbix代理是不切实际的。

为了能够监控SNMP代理在这些设备上提供的数据,Zabbix服务器初始化配置时必须支持SNMP数据源。

SNMP 检查只支持 UDP 协议。

Zabbix 服务器和代理守护进程向 SNMP 设备一个请求中查询多个值时,这会影响所有SNMP监控项(常规 SNMP监控项、具有动态索引的 SNMP 监控项和 SNMP 自动发现)同时可以使 SNMP 处理更加高效。见批量处理技术部分内部如何运作的详细信息。对于无法使用“批量请求”的接口可以通过设置可以关闭。

如果Zabbix服务器和代理守护程序收到错误的SNMP响应,则它们的日志行与以下类似:

SNMP response from host "gateway" does not contain all of the requested variable bindings

虽然它们并没有涵盖所有有问题的情况,但它们对于识别应禁用批量请求的单个SNMP设备非常有用。

Zabbix服务器/代理在查询尝试失败后将始终或至少重试一次:通过SNMP库的重试机制或通过内部批量处理机制。


配 置 S N M P 监 控

要通过SNMP开始监控设备,必须执行以下步骤:

步骤1

找出您要监控的项目的 SNMP 字符串(或 OID)。

要获取SNMP字符串列表,请使用 snmpwalk 命令(net-snmp的部分软件应该在Zabbix安装时同时安装)或等效工具:

shell> snmpwalk -v 2c -c public <主机 IP> 。

此处的“2c”代表 SNMP 版本,您也可以将其替换为“1”,表示设备上的 SNMP 版本v1。

它会返回给你一个SNMP字符串及其最后一个值的列表。如果不是,那么SNMP 'community' 可能与标准的'public'不同,在这种情况下,请找出它是什么。

然后,您可以遍历列表,直到找到要监控的字符串,例如:如果要监视通过端口3进入交换机的字节,你将使用此行中的IF-MIB :: ifInOctets.3字符串:

IF-MIB::ifInOctets.3 = Counter32: 3409739121

你现在可以使用 snmpget 命令找出'IF-MIB :: ifInOctets.3'的数字OID:

shell> snmpget -v 2c -c public -On 10.62.1.22 IF-MIB::ifInOctets.3

请注意,字符串中的最后一个数字是您需要监控的端口号。另请参阅:动态索引。效果如下:

.1.3.6.1.2.1.2.2.1.10.3 = Counter32: 3472126941

同样,OID 中的最后一个数字是端口号。



3COM似乎使用端口号在100以上,例如端口1=端口101,端口3=端口103,但Cisco使用常规数字,例如端口3=3。

 

一些最常用的SNMP OID,Zabbix将自动转换为数字表示

在上面的例子中,值类型是“Counter32”它在内部对应于ASN_COUNTER类型。完整的支持类型包括 ASN_COUNTER, ASN_COUNTER64, ASN_UINTEGER, ASN_UNSIGNED64, ASN_INTEGER, ASN_INTEGER64, ASN_FLOAT, ASN_DOUBLE, ASN_TIMETICKS, ASN_GAUGE, ASN_IPADDRESS, ASN_OCTET_STR 和 ASN_OBJECT_ID (从2.2.8, 2.4.3之后). 这些类型大致对应于snmpget 输出的 "Counter32", "Counter64", "UInteger32", "INTEGER", "Float", "Double", "Timeticks", "Gauge32", "IpAddress", "OCTET STRING", "OBJECT IDENTIFIER", 但也有可能显示为 "STRING", "Hex-STRING", "OID" 或者其它, 这取这取决于显示提示的表达方式。

步骤2

为设备创建一台主机 。


为主机添加 SNMP 接口:

  • 输入 IP 地址/DNS 名称和端口号

  • 从下拉列表中选择 SNMP 版本

  • 根据所选 SNMP 版本添加接口凭据:

    • SNMPv1、v2 只需要community凭据(默认值是"'public'")

    • SNMPv3 需要更具体的选项(见下文)

  • 将使用批量请求复选框标记为允许批量 处理 SNMP 请求

SNMPv3参数 说明
上下文名称 输入上下文名称以识别 SNMP 子网上的监控项。
自 Zabbix 2.2 起,SNMPv3 监控项支持上下文名称
在此字段中解析用户宏。
安全名称 输入安全名称。
用户宏在此字段中解析。
安全级别 选择安全级别:
noAuthNoPriv - 不使用身份验证或隐私协议
AuthNoPriv - 使用身份验证协议,不使用隐私协议
AuthPriv - 使用身份验证和隐私协议
身份验证协议 选择身份验证协议 - MD5、SHA1、SHA224、SHA256、SHA384 或 SHA512。
身份验证密码 输入身份验证密码。
用户宏在此字段中解析。
隐私协议 选择隐私协议 - DES、AES128、AES192、AES256、AES192C (Cisco) 或 AES256C (Cisco)。
隐私密码 输入隐私密码。
用户宏在此字段中解析。

如果SNMPv3凭据(安全名称,验证协议/口令,隐私协议)错误,Zabbix会从net-snmp收到错误,如果 私钥 错误,在这种情况下,Zabbix会从net-snmp收到TIMEOUT错误。



您可以使用zabbix提供的任意 SNMP 模板(SNMP 设备模板和其他模板),该模板将自动添加监控项。但是,那模板可能与主机不兼容。点击 Add 保存主机。

步骤3

创建一个监控项。

所以现在回到Zabbix并点击前面创建的SNMP主机的 监控项 。如果你在创建主机时选择使用模板,你将拥有与主机相关联的SNMP监控项列表。我们假设你要使用snmpwalk和snmpget采集的信息创建监控项,单击 创建监控项。在新的监控项表单中:

  • 输入监控项"名称"。

  • 将"类型"字段更改为"SNMP客户端"

  • 输入“键值”为有意义的内容,例如,SNMP-InOctets-Bps。

  • 确保“主机接口”字段中有你的交换机/路由器

  • 将你之前检索到的文本或数字OID输入到'SNMP OID'字段中,例如:.1.3.6.1.2.1.2.2.1.10.3

  • 将“信息类型”设置为 浮点数

  • 如果你希望“更新间隔”和“历史数据保留时长”与默认值不同,请选择一个自定义乘数(如果需要),并输入数值

  • 在进程预处理选项卡中,添加 Change per second 步骤(重要!,否则您将从 SNMP 设备获取累积值,而不是差异值)。


所有必填字段都标有红色星号。

现在保存监控项,进入 监测中 → 最新数据 来获取你的SNMP数据!

01

示 例  1

通用示例:

参数 描述
OID 1.2.3.45.6.7.8.0 (or .1.2.3.45.6.7.8.0)
键值 用作触发器引用的唯一字符串>
例如, "my_param".

请注意,OID 可以以数字或字符串形式给出。但是,在某些情况下,必须将字符串 OID 转换为数字表示。实用程序 snmpget 可用于此目的:

shell> snmpget -On localhost public enterprises.ucdavis.memory.memTotalSwap.0

在配置Zabbix源时指定了 --with-net-snmp 标志,可以监视SNMP参数

02

示 例  2

监控正常运行时间:

参数 说明
OID MIB::sysUpTime.0
Key router.uptime
Value type 浮点数
Units uptime
Multiplier 0.01

批量处理的内部工作原理


从 Zabbix server和proxy 2.2.3 版本开始查询 SNMP 设备开始在一个请求获取多个值。这会影响几种类型的 SNMP监控项:


· 常规 SNMP 监控项

· SNMP监控项带动态索引

· SNMP 低级别自动发现规则

具有相同参数的单个接口上的所有SNMP监控项都将同时进行查询。前两种类型的监控项由轮询器分批采集,最多128个监控项,而低级发现规则如前所述单独处理。

在较低级别上,执行查询值的操作有两种:获取多个指定对象和游历OID树。

对于"getting",GetRequest-PDU最多使用128个变量绑定。对于"walking",GetNextRequest-PDU用于SNMPv1和GetBulkRequest,"max-repetitions"字段最多128个用于SNMPv2和SNMPv3。

因此,每个SNMP监控项类型的批量处理的优势如下:


·  常规SNMP监控项受益于“getting” 的改进;

·  具有动态索引的SNMP监控项受益于“getting”和“walking”改进:“getting”用于索引验证,“walking”用于构建缓存;

·  SNMP低级发现规则受益于“walking”的改进。然而,有一个技术问题,并非所有设备都能够根据请求返回128个值。有些总是给出正确的回应,其它情况则会以“tooBig(1)”错误做出回应,或者一旦潜在的回应超过了一定的限度,则一律不回应。

为了找到最佳数量的对象来查询给定的设备,Zabbix使用以下策略。它在请求中查询“值1”时谨慎开始。如果成功,它会在请求中查询“值2”。如果再次成功,则查询请求中的“值3”,并通过将查询对象的数量乘以1.5来继续,导致以下请求大小的顺序:1, 2, 3, 4, 6, 9, 13, 19, 28, 42, 63, 94, 128。

然而,一旦设备拒绝给出适当的响应(例如,对于42个变量),Zabbix会做两件事情:

· 首先,对于当前批量监控项,它将单个请求中的对象数减半,并查询21个变量。如果设备处于活动状态,那么查询应该在绝大多数情况下都有效,因为已知28个变量可以工作,21个变量明显少于此。但是,如果仍然失败,那么Zabbix会逐渐回到查询值。如果此时仍然失败,那么设备肯定没有响应,请求大小也不是问题。

· Zabbix为后续批量监控项做的第二件事是它从最后成功的变量数量开始(在我们的示例中为28),并继续将请求大小递增1,直到达到限制。例如,假设最大响应大小为32个变量,后续请求的大小为29,30,31,32和33。最后一个请求将失败,Zabbix将永远不再发出大小为33的请求。从那时起,Zabbix将为该设备查询最多32个变量。

· 如果大型查询因此数量的变量而失败,则可能意味着两件事之一。设备用于限制响应大小的确切标准无法知晓,但我们尝试使用变量数来近似。因此,第一种可能性是,在一般情况下,此数量的变量大约是设备的实际响应大小限制:有时响应小于限制,有时它大于限制。第二种可能性是任何方向的UDP数据包都丢失了。由于这些原因,如果Zabbix查询失败,它会减少最大数量的变量以尝试深入到设备的舒适范围,但(从2.2.8开始)最多只能达到两次。

在上面的示例中,如果包含32个变量的查询失败,Zabbix会将计数减少到31.如果发生这种情况也会失败,Zabbix也会将计数减少到30。但是,Zabbix不会将计数减少到30以下, 因为它会假设进一步的失败是由于UDP数据包丢失,而不是设备的限制。

但是,如果设备由于其他原因无法正确处理批量请求,并且上述启发式方法不起作用,Zabbix 2.4版本之后每个接口都有“使用批量请求”设置,允许禁用该设备的批量请求。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。