From 4d92fe4e5e9883ba594f90cd9675a89a75edc9e2 Mon Sep 17 00:00:00 2001 From: TimurDela <32736336+TimurDela@users.noreply.github.com> Date: Wed, 1 Jun 2022 21:10:08 +0200 Subject: [PATCH] fix(inputs/modbus): #11105 fix requests starting with an omitted field (#11202) --- plugins/inputs/modbus/modbus_test.go | 67 ++++++++++++++++++++++++++++ plugins/inputs/modbus/request.go | 7 +-- 2 files changed, 71 insertions(+), 3 deletions(-) diff --git a/plugins/inputs/modbus/modbus_test.go b/plugins/inputs/modbus/modbus_test.go index 5e3d04523..5a7a7570d 100644 --- a/plugins/inputs/modbus/modbus_test.go +++ b/plugins/inputs/modbus/modbus_test.go @@ -1857,3 +1857,70 @@ func TestConfigurationPerRequestFail(t *testing.T) { }) } } + +func TestRequestsStartingWithOmits(t *testing.T) { + modbus := Modbus{ + Name: "Test", + Controller: "tcp://localhost:1502", + ConfigurationType: "request", + Log: testutil.Logger{}, + } + modbus.Requests = []requestDefinition{ + {SlaveID: 1, + ByteOrder: "ABCD", + RegisterType: "holding", + Fields: []requestFieldDefinition{ + { + Name: "holding-0", + Address: uint16(0), + InputType: "INT16", + Omit: true, + }, + { + Name: "holding-1", + Address: uint16(1), + InputType: "UINT16", + Omit: true, + }, + { + Name: "holding-2", + Address: uint16(2), + InputType: "INT16", + }, + }, + }, + } + require.NoError(t, modbus.Init()) + require.NotEmpty(t, modbus.requests) + require.NotNil(t, modbus.requests[1]) + require.Equal(t, uint16(0), modbus.requests[1].holding[0].address) + + serv := mbserver.NewServer() + require.NoError(t, serv.ListenTCP("localhost:1502")) + defer serv.Close() + + handler := mb.NewTCPClientHandler("localhost:1502") + require.NoError(t, handler.Connect()) + defer handler.Close() + client := mb.NewClient(handler) + _, err := client.WriteMultipleRegisters(uint16(0), 3, []byte{0x00, 0x01, 0x00, 0x02, 0x00, 0x03}) + require.NoError(t, err) + + expected := []telegraf.Metric{ + testutil.MustMetric( + "modbus", + map[string]string{ + "type": cHoldingRegisters, + "slave_id": strconv.Itoa(int(modbus.Requests[0].SlaveID)), + "name": modbus.Name, + }, + map[string]interface{}{"holding-2": int16(3)}, + time.Unix(0, 0), + ), + } + + var acc testutil.Accumulator + require.NoError(t, modbus.Gather(&acc)) + acc.Wait(len(expected)) + testutil.RequireMetricsEqual(t, expected, acc.GetTelegrafMetrics(), testutil.IgnoreTime()) +} diff --git a/plugins/inputs/modbus/request.go b/plugins/inputs/modbus/request.go index 16e054b67..b3c5b62dc 100644 --- a/plugins/inputs/modbus/request.go +++ b/plugins/inputs/modbus/request.go @@ -13,10 +13,12 @@ func newRequest(f field, tags map[string]string) request { r := request{ address: f.address, length: f.length, - fields: []field{f}, + fields: []field{}, tags: map[string]string{}, } - + if !f.omit { + r.fields = append(r.fields, f) + } // Copy the tags for k, v := range tags { r.tags[k] = v @@ -63,6 +65,5 @@ func groupFieldsToRequests(fields []field, tags map[string]string, maxBatchSize current = newRequest(f, tags) } requests = append(requests, current) - return requests }