Add support for hex values to ipmi_sensor input (#5816)
This commit is contained in:
parent
a1513e6235
commit
b22bf01fdf
|
@ -150,9 +150,19 @@ func parseV1(acc telegraf.Accumulator, hostname string, cmdOut []byte, measured_
|
||||||
fields["status"] = 0
|
fields["status"] = 0
|
||||||
}
|
}
|
||||||
|
|
||||||
if strings.Index(ipmiFields["description"], " ") > 0 {
|
description := ipmiFields["description"]
|
||||||
|
|
||||||
|
// handle hex description field
|
||||||
|
if strings.HasPrefix(description, "0x") {
|
||||||
|
descriptionInt, err := strconv.ParseInt(description, 0, 64)
|
||||||
|
if err != nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
fields["value"] = float64(descriptionInt)
|
||||||
|
} else if strings.Index(description, " ") > 0 {
|
||||||
// split middle column into value and unit
|
// split middle column into value and unit
|
||||||
valunit := strings.SplitN(ipmiFields["description"], " ", 2)
|
valunit := strings.SplitN(description, " ", 2)
|
||||||
var err error
|
var err error
|
||||||
fields["value"], err = aToFloat(valunit[0])
|
fields["value"], err = aToFloat(valunit[0])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -610,3 +610,111 @@ Power Supply 1 | 03h | ok | 10.1 | 110 Watts, Presence detected
|
||||||
extractFieldsFromRegex(re_v2_parse_line, tests[i])
|
extractFieldsFromRegex(re_v2_parse_line, tests[i])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func Test_parseV1(t *testing.T) {
|
||||||
|
type args struct {
|
||||||
|
hostname string
|
||||||
|
cmdOut []byte
|
||||||
|
measuredAt time.Time
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
wantFields map[string]interface{}
|
||||||
|
wantErr bool
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "Test correct V1 parsing with hex code",
|
||||||
|
args: args{
|
||||||
|
hostname: "host",
|
||||||
|
measuredAt: time.Now(),
|
||||||
|
cmdOut: []byte("PS1 Status | 0x02 | ok"),
|
||||||
|
},
|
||||||
|
wantFields: map[string]interface{}{"value": float64(2), "status": 1},
|
||||||
|
wantErr: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Test correct V1 parsing with value with unit",
|
||||||
|
args: args{
|
||||||
|
hostname: "host",
|
||||||
|
measuredAt: time.Now(),
|
||||||
|
cmdOut: []byte("Avg Power | 210 Watts | ok"),
|
||||||
|
},
|
||||||
|
wantFields: map[string]interface{}{"value": float64(210), "status": 1},
|
||||||
|
wantErr: false,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
var acc testutil.Accumulator
|
||||||
|
|
||||||
|
if err := parseV1(&acc, tt.args.hostname, tt.args.cmdOut, tt.args.measuredAt); (err != nil) != tt.wantErr {
|
||||||
|
t.Errorf("parseV1() error = %v, wantErr %v", err, tt.wantErr)
|
||||||
|
}
|
||||||
|
|
||||||
|
acc.AssertContainsFields(t, "ipmi_sensor", tt.wantFields)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func Test_parseV2(t *testing.T) {
|
||||||
|
type args struct {
|
||||||
|
hostname string
|
||||||
|
cmdOut []byte
|
||||||
|
measuredAt time.Time
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
wantFields map[string]interface{}
|
||||||
|
wantTags map[string]string
|
||||||
|
wantErr bool
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "Test correct V2 parsing with analog value with unit",
|
||||||
|
args: args{
|
||||||
|
hostname: "host",
|
||||||
|
cmdOut: []byte("Power Supply 1 | 03h | ok | 10.1 | 110 Watts, Presence detected"),
|
||||||
|
measuredAt: time.Now(),
|
||||||
|
},
|
||||||
|
wantFields: map[string]interface{}{"value": float64(110)},
|
||||||
|
wantTags: map[string]string{
|
||||||
|
"name": "power_supply_1",
|
||||||
|
"status_code": "ok",
|
||||||
|
"server": "host",
|
||||||
|
"entity_id": "10.1",
|
||||||
|
"unit": "watts",
|
||||||
|
"status_desc": "presence_detected",
|
||||||
|
},
|
||||||
|
wantErr: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Test correct V2 parsing without analog value",
|
||||||
|
args: args{
|
||||||
|
hostname: "host",
|
||||||
|
cmdOut: []byte("Intrusion | 73h | ok | 7.1 |"),
|
||||||
|
measuredAt: time.Now(),
|
||||||
|
},
|
||||||
|
wantFields: map[string]interface{}{"value": float64(0)},
|
||||||
|
wantTags: map[string]string{
|
||||||
|
"name": "intrusion",
|
||||||
|
"status_code": "ok",
|
||||||
|
"server": "host",
|
||||||
|
"entity_id": "7.1",
|
||||||
|
"status_desc": "ok",
|
||||||
|
},
|
||||||
|
wantErr: false,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
var acc testutil.Accumulator
|
||||||
|
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
acc.AssertContainsTaggedFields(t, "ipmi_sensor", tt.wantFields, tt.wantTags)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue