You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Telegraf [[inputs.snmp.field]] 字符串转整数异常问题

解决Telegraf SNMP插件采集UPS字符串字段转为整数的问题

看起来你遇到的问题是Telegraf的SNMP插件错误地将原本是字符串类型的hostname(sysLocation)和upsType字段解析成了整数,这主要是因为插件默认的自动类型推断机制出了问题,再加上配置里有个SNMPv3不需要的参数干扰。下面是具体的解决方案:

关键修复步骤

1. 移除SNMPv3多余的community配置

SNMPv3版本不使用community字符串,这个参数只适用于SNMPv1/v2c。你的配置里同时设置了version = 3和community = "heabc",这会导致配置冲突,干扰插件的正常工作,所以首先要删掉这一行。

2. 为字符串字段强制指定数据类型

在hostname和upsType的字段配置中添加data_type = "string",告诉Telegraf强制将这些OID的返回值当作字符串处理,而不是自动推断类型。

修改后的完整配置

[[inputs.snmp]]
agents = [ "192.168.15.60", "192.168.15.64" , "192.168.15.65","192.168.15.66","192.168.15.67" ]
## Timeout for each SNMP query.
timeout = "10s"
## Number of retries to attempt within timeout.
retries = 3
## SNMP version, values can be 1, 2, or 3
version = 3
#
# ## The GETBULK max-repetitions parameter
# max_repetitions = 10
#
# ## SNMPv3 auth parameters
sec_name = "grafana"
auth_protocol = "SHA" # Values: "MD5", "SHA", ""
auth_password = "redacted"
sec_level = "authPriv" # Values: "noAuthNoPriv", "authNoPriv", "authPriv"
#
#context_name = ""
priv_protocol = "AES" # Values: "DES", "AES", ""
priv_password = "redacted"
#
# ## measurement name
[[inputs.snmp.field]]
name = "hostname"
oid = "iso.1.3.6.1.2.1.1.6.0"
conversion = ""
is_tag = true
data_type = "string"  # 新增:强制字符串类型
[[inputs.snmp.field]]
name = "upsType"
oid = "iso.1.3.6.1.4.1.318.1.1.1.1.1.1.0"
is_tag = true
conversion = ""
data_type = "string"  # 新增:强制字符串类型
[[inputs.snmp.field]]
name = "batteryCapacityPercent"
oid = "iso.1.3.6.1.4.1.318.1.1.1.2.2.1.0"
[[inputs.snmp.field]]
name = "batteryTemp"
oid = "iso.1.3.6.1.4.1.318.1.1.1.2.2.2.0"
[[inputs.snmp.field]]
name = "batteryRuntimeRemain"
oid = "iso.1.3.6.1.4.1.318.1.1.1.2.2.3.0"
[[inputs.snmp.field]]
name = "batteryReplace"
oid = "iso.1.3.6.1.4.1.318.1.1.1.2.2.4.0"
[[inputs.snmp.field]]
name = "inputVoltage"
oid = "iso.1.3.6.1.4.1.318.1.1.1.3.2.1.0"
[[inputs.snmp.field]]
name = "inputFreq"
oid = "iso.1.3.6.1.4.1.318.1.1.1.3.2.4.0"
[[inputs.snmp.field]]
name = "lastTransferReason"
oid = "iso.1.3.6.1.4.1.318.1.1.1.3.2.5.0"
[[inputs.snmp.field]]
name = "outputVoltage"
oid = "iso.1.3.6.1.4.1.318.1.1.1.4.2.1.0"
[[inputs.snmp.field]]
name = "outputFreq"
oid = "iso.1.3.6.1.4.1.318.1.1.1.4.2.2.0"
[[inputs.snmp.field]]
name = "outputLoad"
oid = "iso.1.3.6.1.4.1.318.1.1.1.4.2.3.0"
[[inputs.snmp.field]]
name = "ouputCurrent"
oid = "iso.1.3.6.1.4.1.318.1.1.1.4.2.4.0"
[[inputs.snmp.field]]
name = "lastSelfTestResult"
oid = "iso.1.3.6.1.4.1.318.1.1.1.7.2.3.0"
[[inputs.snmp.field]]
name = "lastSelfTestDate"
oid = "iso.1.3.6.1.4.1.318.1.1.1.7.2.4.0"

验证修复效果

修改配置后,再次运行测试命令:

telegraf --test --config UPS.conf

此时你应该能看到hostname和upsType字段显示正确的字符串值,而不是整数了。

问题原因说明

  • Telegraf的SNMP插件默认会自动推断SNMP返回值的数据类型,当处理SNMPv3请求时,某些字符串类型的OID值可能被错误解析为整数,通过data_type = "string"可以强制插件按字符串处理这些字段。
  • 配置中多余的community字段属于SNMPv1/v2c的参数,在SNMPv3环境下会导致配置冲突,影响插件的正常解析逻辑,移除后可以避免这类干扰。

内容的提问来源于stack exchange,提问作者Trapa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:57:17