Fix negative value parsing in impi_sensor input (#7541)

This commit is contained in:
Daniel Nelson 2020-05-19 08:20:29 -07:00 committed by GitHub
parent bf1eb291f2
commit 443ac6df23
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 55 additions and 25 deletions

View File

@ -21,7 +21,7 @@ var (
execCommand = exec.Command // execCommand is used to mock commands in tests. execCommand = exec.Command // execCommand is used to mock commands in tests.
re_v1_parse_line = regexp.MustCompile(`^(?P<name>[^|]*)\|(?P<description>[^|]*)\|(?P<status_code>.*)`) re_v1_parse_line = regexp.MustCompile(`^(?P<name>[^|]*)\|(?P<description>[^|]*)\|(?P<status_code>.*)`)
re_v2_parse_line = regexp.MustCompile(`^(?P<name>[^|]*)\|[^|]+\|(?P<status_code>[^|]*)\|(?P<entity_id>[^|]*)\|(?:(?P<description>[^|]+))?`) re_v2_parse_line = regexp.MustCompile(`^(?P<name>[^|]*)\|[^|]+\|(?P<status_code>[^|]*)\|(?P<entity_id>[^|]*)\|(?:(?P<description>[^|]+))?`)
re_v2_parse_description = regexp.MustCompile(`^(?P<analogValue>[0-9.]+)\s(?P<analogUnit>.*)|(?P<status>.+)|^$`) re_v2_parse_description = regexp.MustCompile(`^(?P<analogValue>-?[0-9.]+)\s(?P<analogUnit>.*)|(?P<status>.+)|^$`)
re_v2_parse_unit = regexp.MustCompile(`^(?P<realAnalogUnit>[^,]+)(?:,\s*(?P<statusDesc>.*))?`) re_v2_parse_unit = regexp.MustCompile(`^(?P<realAnalogUnit>[^,]+)(?:,\s*(?P<statusDesc>.*))?`)
) )

View File

@ -7,6 +7,7 @@ import (
"testing" "testing"
"time" "time"
"github.com/influxdata/telegraf"
"github.com/influxdata/telegraf/internal" "github.com/influxdata/telegraf/internal"
"github.com/influxdata/telegraf/testutil" "github.com/influxdata/telegraf/testutil"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
@ -664,11 +665,10 @@ func Test_parseV2(t *testing.T) {
measuredAt time.Time measuredAt time.Time
} }
tests := []struct { tests := []struct {
name string name string
args args args args
wantFields map[string]interface{} expected []telegraf.Metric
wantTags map[string]string wantErr bool
wantErr bool
}{ }{
{ {
name: "Test correct V2 parsing with analog value with unit", name: "Test correct V2 parsing with analog value with unit",
@ -677,14 +677,19 @@ func Test_parseV2(t *testing.T) {
cmdOut: []byte("Power Supply 1 | 03h | ok | 10.1 | 110 Watts, Presence detected"), cmdOut: []byte("Power Supply 1 | 03h | ok | 10.1 | 110 Watts, Presence detected"),
measuredAt: time.Now(), measuredAt: time.Now(),
}, },
wantFields: map[string]interface{}{"value": float64(110)}, expected: []telegraf.Metric{
wantTags: map[string]string{ testutil.MustMetric("ipmi_sensor",
"name": "power_supply_1", map[string]string{
"status_code": "ok", "name": "power_supply_1",
"server": "host", "status_code": "ok",
"entity_id": "10.1", "server": "host",
"unit": "watts", "entity_id": "10.1",
"status_desc": "presence_detected", "unit": "watts",
"status_desc": "presence_detected",
},
map[string]interface{}{"value": 110.0},
time.Unix(0, 0),
),
}, },
wantErr: false, wantErr: false,
}, },
@ -695,26 +700,51 @@ func Test_parseV2(t *testing.T) {
cmdOut: []byte("Intrusion | 73h | ok | 7.1 |"), cmdOut: []byte("Intrusion | 73h | ok | 7.1 |"),
measuredAt: time.Now(), measuredAt: time.Now(),
}, },
wantFields: map[string]interface{}{"value": float64(0)}, expected: []telegraf.Metric{
wantTags: map[string]string{ testutil.MustMetric("ipmi_sensor",
"name": "intrusion", map[string]string{
"status_code": "ok", "name": "intrusion",
"server": "host", "status_code": "ok",
"entity_id": "7.1", "server": "host",
"status_desc": "ok", "entity_id": "7.1",
"status_desc": "ok",
},
map[string]interface{}{"value": 0.0},
time.Unix(0, 0),
),
},
wantErr: false,
},
{
name: "parse negative value",
args: args{
hostname: "host",
cmdOut: []byte("DIMM Thrm Mrgn 1 | B0h | ok | 8.1 | -55 degrees C"),
measuredAt: time.Now(),
},
expected: []telegraf.Metric{
testutil.MustMetric("ipmi_sensor",
map[string]string{
"name": "dimm_thrm_mrgn_1",
"status_code": "ok",
"server": "host",
"entity_id": "8.1",
"unit": "degrees_c",
},
map[string]interface{}{"value": -55.0},
time.Unix(0, 0),
),
}, },
wantErr: false, wantErr: false,
}, },
} }
for _, tt := range tests { for _, tt := range tests {
var acc testutil.Accumulator
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
var acc testutil.Accumulator
if err := parseV2(&acc, tt.args.hostname, tt.args.cmdOut, tt.args.measuredAt); (err != nil) != tt.wantErr { if err := parseV2(&acc, tt.args.hostname, tt.args.cmdOut, tt.args.measuredAt); (err != nil) != tt.wantErr {
t.Errorf("parseV2() error = %v, wantErr %v", err, tt.wantErr) t.Errorf("parseV2() error = %v, wantErr %v", err, tt.wantErr)
} }
testutil.RequireMetricsEqual(t, tt.expected, acc.GetTelegrafMetrics(), testutil.IgnoreTime())
}) })
acc.AssertContainsTaggedFields(t, "ipmi_sensor", tt.wantFields, tt.wantTags)
} }
} }