fix edge case in aerospike plugin where an expected hex string was converted to integer if all digits (#8542)
This commit is contained in:
parent
7d3b7fc2f9
commit
a063f9d7f7
|
|
@ -81,6 +81,14 @@ var sampleConfig = `
|
||||||
# num_histogram_buckets = 100 # default: 10
|
# num_histogram_buckets = 100 # default: 10
|
||||||
`
|
`
|
||||||
|
|
||||||
|
// On the random chance a hex value is all digits
|
||||||
|
// these are fields that can contain hex and should always be strings
|
||||||
|
var protectedHexFields = map[string]bool{
|
||||||
|
"node_name": true,
|
||||||
|
"cluster_key": true,
|
||||||
|
"paxos_principal": true,
|
||||||
|
}
|
||||||
|
|
||||||
func (a *Aerospike) SampleConfig() string {
|
func (a *Aerospike) SampleConfig() string {
|
||||||
return sampleConfig
|
return sampleConfig
|
||||||
}
|
}
|
||||||
|
|
@ -238,8 +246,9 @@ func (a *Aerospike) parseNodeInfo(stats map[string]string, hostPort string, node
|
||||||
fields := make(map[string]interface{})
|
fields := make(map[string]interface{})
|
||||||
|
|
||||||
for k, v := range stats {
|
for k, v := range stats {
|
||||||
val := parseValue(v)
|
key := strings.Replace(k, "-", "_", -1)
|
||||||
fields[strings.Replace(k, "-", "_", -1)] = val
|
fields[key] = parseAerospikeValue(key, v)
|
||||||
|
|
||||||
}
|
}
|
||||||
acc.AddFields("aerospike_node", fields, tags, time.Now())
|
acc.AddFields("aerospike_node", fields, tags, time.Now())
|
||||||
|
|
||||||
|
|
@ -284,8 +293,8 @@ func (a *Aerospike) parseNamespaceInfo(stats map[string]string, hostPort string,
|
||||||
if len(parts) < 2 {
|
if len(parts) < 2 {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
val := parseValue(parts[1])
|
key := strings.Replace(parts[0], "-", "_", -1)
|
||||||
nFields[strings.Replace(parts[0], "-", "_", -1)] = val
|
nFields[key] = parseAerospikeValue(key, parts[1])
|
||||||
}
|
}
|
||||||
acc.AddFields("aerospike_namespace", nFields, nTags, time.Now())
|
acc.AddFields("aerospike_namespace", nFields, nTags, time.Now())
|
||||||
|
|
||||||
|
|
@ -355,8 +364,8 @@ func (a *Aerospike) parseSetInfo(stats map[string]string, hostPort string, names
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
val := parseValue(pieces[1])
|
key := strings.Replace(pieces[0], "-", "_", -1)
|
||||||
nFields[strings.Replace(pieces[0], "-", "_", -1)] = val
|
nFields[key] = parseAerospikeValue(key, pieces[1])
|
||||||
}
|
}
|
||||||
acc.AddFields("aerospike_set", nFields, nTags, time.Now())
|
acc.AddFields("aerospike_set", nFields, nTags, time.Now())
|
||||||
|
|
||||||
|
|
@ -436,7 +445,7 @@ func (a *Aerospike) parseHistogram(stats map[string]string, hostPort string, nam
|
||||||
for i, bucket := range buckets {
|
for i, bucket := range buckets {
|
||||||
// Sum records and increment bucket collection counter
|
// Sum records and increment bucket collection counter
|
||||||
if bucketCount < numRecordsPerBucket {
|
if bucketCount < numRecordsPerBucket {
|
||||||
bucketSum = bucketSum + parseValue(bucket).(int64)
|
bucketSum = bucketSum + parseAerospikeValue("", bucket).(int64)
|
||||||
bucketCount++
|
bucketCount++
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -469,8 +478,10 @@ func splitNamespaceSet(namespaceSet string) (string, string) {
|
||||||
return split[0], split[1]
|
return split[0], split[1]
|
||||||
}
|
}
|
||||||
|
|
||||||
func parseValue(v string) interface{} {
|
func parseAerospikeValue(key string, v string) interface{} {
|
||||||
if parsed, err := strconv.ParseInt(v, 10, 64); err == nil {
|
if protectedHexFields[key] {
|
||||||
|
return v
|
||||||
|
} else if parsed, err := strconv.ParseInt(v, 10, 64); err == nil {
|
||||||
return parsed
|
return parsed
|
||||||
} else if parsed, err := strconv.ParseUint(v, 10, 64); err == nil {
|
} else if parsed, err := strconv.ParseUint(v, 10, 64); err == nil {
|
||||||
return parsed
|
return parsed
|
||||||
|
|
|
||||||
|
|
@ -454,19 +454,27 @@ func TestParseHistogramNamespace(t *testing.T) {
|
||||||
}
|
}
|
||||||
func TestAerospikeParseValue(t *testing.T) {
|
func TestAerospikeParseValue(t *testing.T) {
|
||||||
// uint64 with value bigger than int64 max
|
// uint64 with value bigger than int64 max
|
||||||
val := parseValue("18446744041841121751")
|
val := parseAerospikeValue("", "18446744041841121751")
|
||||||
require.Equal(t, uint64(18446744041841121751), val)
|
require.Equal(t, val, uint64(18446744041841121751))
|
||||||
|
|
||||||
val = parseValue("true")
|
val = parseAerospikeValue("", "true")
|
||||||
require.Equal(t, true, val)
|
require.Equal(t, val, true)
|
||||||
|
|
||||||
// int values
|
// int values
|
||||||
val = parseValue("42")
|
val = parseAerospikeValue("", "42")
|
||||||
require.Equal(t, val, int64(42), "must be parsed as int")
|
require.Equal(t, int64(42), val, "must be parsed as an int64")
|
||||||
|
|
||||||
// string values
|
// string values
|
||||||
val = parseValue("BB977942A2CA502")
|
val = parseAerospikeValue("", "BB977942A2CA502")
|
||||||
require.Equal(t, val, `BB977942A2CA502`, "must be left as string")
|
require.Equal(t, `BB977942A2CA502`, val, "must be left as a string")
|
||||||
|
|
||||||
|
// all digit hex values, unprotected
|
||||||
|
val = parseAerospikeValue("", "1992929191")
|
||||||
|
require.Equal(t, int64(1992929191), val, "must be parsed as an int64")
|
||||||
|
|
||||||
|
// all digit hex values, protected
|
||||||
|
val = parseAerospikeValue("node_name", "1992929191")
|
||||||
|
require.Equal(t, `1992929191`, val, "must be left as a string")
|
||||||
}
|
}
|
||||||
|
|
||||||
func FindTagValue(acc *testutil.Accumulator, measurement string, key string, value string) bool {
|
func FindTagValue(acc *testutil.Accumulator, measurement string, key string, value string) bool {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue