]> granicus.if.org Git - icinga2/commitdiff
Fix InfluxDB backslash escaping 6196/head
authorNoah Hilverling <noah.hilverling@icinga.com>
Wed, 4 Apr 2018 11:02:48 +0000 (13:02 +0200)
committerNoah Hilverling <noah.hilverling@icinga.com>
Wed, 4 Apr 2018 11:02:48 +0000 (13:02 +0200)
fixes #6182

lib/perfdata/influxdbwriter.cpp

index 04153c3e8b043aaa5931f9cf4340fda2c194a87b..8a3fe97b19366a949b593f0e80afd48a73763075 100644 (file)
@@ -305,6 +305,17 @@ String InfluxdbWriter::EscapeKeyOrTagValue(const String& str)
        boost::algorithm::replace_all(result, "=", "\\=");
        boost::algorithm::replace_all(result, ",", "\\,");
        boost::algorithm::replace_all(result, " ", "\\ ");
+
+       // InfluxDB 'feature': although backslashes are allowed in keys they also act
+       // as escape sequences when followed by ',' or ' '.  When your tag is like
+       // 'metric=C:\' bad things happen.  Backslashes themselves cannot be escaped
+       // and through experimentation they also escape '='.  To be safe we replace
+       // trailing backslashes with and underscore.
+       // See https://github.com/influxdata/influxdb/issues/8587 for more info
+       size_t length = result.GetLength();
+       if (result[length - 1] == '\\')
+               result[length - 1] = '_';
+
        return result;
 }