Input strings in double quotes not handled properly

Hi everyone,

I’m debugging an issue with returning strings from OIDs wich are wrapped in double quotes.
First things first.

Telegraf Version: 1.27.4 with influxdb2

This is my snmp target config

# CW1
[[inputs.snmp]]
  ## Agent addresses to retrieve values from.
  agents = ["192.168.204.3:161"]

  ## Timeout for each request.
  timeout = "5s"

  version = 2
  community = "stats"

  [[inputs.snmp.field]]
    name = "SysName"
    oid = "1.3.6.1.4.1.476.1.42.3.9.20.1.20.1.2.1.4329"
    is_tag = true

  [[inputs.snmp.field]]
    oid = "1.3.6.1.4.1.476.1.42.3.9.20.1.20.1.2.1.4123"
    name = "chillerstatus"

  [[inputs.snmp.field]]
    oid = "1.3.6.1.4.1.476.1.42.3.9.20.1.20.1.2.1.5078"
    name = "Compressor Utilization"
    conversion="float"

[[processors.strings]]
  ## Trim leading characters in cutset
   [[processors.strings.trim_left]]
     field = "chillerstatus"
     cutset = "\""

  ## Trim trailing characters in cutset
   [[processors.strings.trim_right]]
     field = "chillerstatus"
     cutset = "\""

[[inputs.exec]]
  command = "/opt/scripts/remove-quotes.sh"
  data_format = "influx"

As you can see I already tried using string trim.
I also used regex before and even external scripts to remove double quotes.
The thing is, if I set the cutset to “N” instead of “"” it cuts the first letter as exptected.

This is the output from snmpwalk (same with snmpget)

root@grafana-dc:~# snmpwalk -v2c -c stats 192.168.204.3 1.3.6.1.4.1.476.1.42.3.9.20.1.20.1.2.1.4123
iso.3.6.1.4.1.476.1.42.3.9.20.1.20.1.2.1.4123 = STRING: “Normal with Warning”

root@grafana-dc:~# snmpget -v2c -c stats 192.168.204.3 1.3.6.1.4.1.476.1.42.3.9.20.1.20.1.2.1.4123
iso.3.6.1.4.1.476.1.42.3.9.20.1.20.1.2.1.4123 = STRING: “Normal with Warning”

I got a ton of strings to handle wich are all wrapped in double quotes and as far as I understand the code correctly, the double quotes should be removed here:

if conv == "" {
    // Handle cases where no conversion is specified (e.g., default string handling).
    // If the SNMP value is []byte, it's converted to a string.
    if bs, ok := ent.Value.([]byte); ok {
        return string(bs), nil
    }
    return ent.Value, nil
}

But somehow they are still present.
Futhermore they even get preserved!

I also configured an external script as an input (as you can see in my config above)

This script does it simply:

#!/bin/bash

# Run snmpwalk and format output as InfluxDB line protocol
output=$(snmpwalk -v2c -c stats 192.168.204.3 1.3.6.1.4.1.476.1.42.3.9.20.1.20.1.2.1.4123 | awk -F': ' '{gsub(/"/, "", $2); gsub(/ /, "_", $2); print "snmp chillerstatus=\"" $2 "\""}')

# Print output
echo "$output"

And even then the double quotes are still present.

This is the output from the test run:

root@grafana-dc:~# telegraf  --test | grep snmp
2023-08-31T07:27:34Z I! Loading config: /etc/telegraf/telegraf.conf
2023-08-31T07:27:34Z I! Starting Telegraf 1.27.4
2023-08-31T07:27:34Z I! Available plugins: 237 inputs, 9 aggregators, 28 processors, 23 parsers, 59 outputs, 4 secret-stores
2023-08-31T07:27:34Z I! Loaded inputs: cpu disk diskio ethtool exec ipmi_sensor ipset kernel mem processes snmp (7x) swap system
2023-08-31T07:27:34Z I! Loaded aggregators: 
2023-08-31T07:27:34Z I! Loaded processors: strings
2023-08-31T07:27:34Z I! Loaded secretstores: 
2023-08-31T07:27:34Z W! Outputs are not used in testing mode!
2023-08-31T07:27:34Z I! Tags enabled: host=grafana-dc
> snmp,SysName=environment-HV-USV,agent_host=192.168.104.25,host=grafana-dc HV-USV\ -\ Humidity=39.9,HV-USV\ -\ Temperatur=24.2 1693466855000000000
> snmp,host=grafana-dc chillerstatus="Normal_with_Warning" 1693466855000000000
> snmp,SysName=CW\ 1,agent_host=192.168.204.3,host=grafana-dc Compressor\ Utilization=25,chillerstatus="Normal with Warning" 1693466855000000000
> snmp,SysName=sensor2,agent_host=192.168.201.51,host=grafana-dc A.C5\ -\ Raised\ Floor\ Humidity=61,A.C5\ -\ Raised\ Floor\ Temp=17 1693466855000000000
> snmp,SysName=sensor3,agent_host=192.168.201.52,host=grafana-dc A.Q1\ -\ Raised\ Floor\ Temp=17.5,A.T2\ -\ Raised\ Floor\ Temp=16.6 1693466855000000000
> snmp,SysName=sensor1,agent_host=192.168.201.50,host=grafana-dc Routing\ -\ Raised\ Floor\ Temp=17.3,Routing\ -\ Room\ Temp=26.5 1693466855000000000
> snmp,SysName=Sensor-Raum-C,agent_host=192.168.201.53,host=grafana-dc Raum\ C\ -\ Raised\ Floor\ Temp=17.3,Raum\ C\ -\ Room\ Temp=25.1 1693466855000000000
> snmp,SysName=environment-sensor-NSHV,agent_host=192.168.104.26,host=grafana-dc NSHV\ -\ Humidity=48.6,NSHV\ -\ Temperatur=23.4 1693466855000000000

In both approaches with trims or with external script the double quotes are still present and as a result not parsed to influx.

Is there any workaround I can build to address this issue?
Any help would be much appreciated.

Hi,

chillerstatus=“Normal with Warning”

It is not the OID that is wrapped in double quotes, it is the value, which is a string. Strings needs to be in quotes :wink:

TLDR but in the past I have used unicode to get specific “null” string characters from a device. maybe this could be a hint in the right direction?

[[processors.regex.fields]]
   	key = "String"
   	pattern = '\x00'
   	replacement = ""