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
相关产品推荐
相关产品推荐

