From 21226448b7b5d3f1012db743b12321b8b08dedad Mon Sep 17 00:00:00 2001 From: yusufshalaby Date: Fri, 20 Sep 2024 22:01:45 -0400 Subject: [PATCH 1/6] add test for nxos DME subtree format --- .../cisco_telemetry_mdt_test.go | 132 ++++++++++++++++++ 1 file changed, 132 insertions(+) diff --git a/plugins/inputs/cisco_telemetry_mdt/cisco_telemetry_mdt_test.go b/plugins/inputs/cisco_telemetry_mdt/cisco_telemetry_mdt_test.go index e648d8dc07ef5..d7445d6bcd109 100644 --- a/plugins/inputs/cisco_telemetry_mdt/cisco_telemetry_mdt_test.go +++ b/plugins/inputs/cisco_telemetry_mdt/cisco_telemetry_mdt_test.go @@ -820,6 +820,138 @@ func TestHandleNXDME(t *testing.T) { fields1 := map[string]interface{}{"value": "foo"} acc.AssertContainsTaggedFields(t, "dme", fields1, tags1) } +func TestHandleNXDMESubtree(t *testing.T) { + c := &CiscoTelemetryMDT{ + Transport: "dummy", + Aliases: map[string]string{"dme": "sys/dme"}, + } + acc := &testutil.Accumulator{} + err := c.Start(acc) + // error is expected since we are passing in dummy transport + require.Error(t, err) + + telemetry := &telemetryBis.Telemetry{ + MsgTimestamp: 1543236572000, + EncodingPath: "sys/dme", + NodeId: &telemetryBis.Telemetry_NodeIdStr{NodeIdStr: "hostname"}, + Subscription: &telemetryBis.Telemetry_SubscriptionIdStr{SubscriptionIdStr: "subscription"}, + DataGpbkv: []*telemetryBis.TelemetryField{ + { + Fields: []*telemetryBis.TelemetryField{ + { + Name: "keys", + Fields: []*telemetryBis.TelemetryField{ + { + Name: "sys/dme", + ValueByType: &telemetryBis.TelemetryField_StringValue{StringValue: "sys/dme"}, + }, + }, + }, + { + Name: "content", + Fields: []*telemetryBis.TelemetryField{ + { + Fields: []*telemetryBis.TelemetryField{ + { + Name: "children", + Fields: []*telemetryBis.TelemetryField{ + { + Fields: []*telemetryBis.TelemetryField{ + { + Name: "fooEntity", + Fields: []*telemetryBis.TelemetryField{ + { + Fields: []*telemetryBis.TelemetryField{ + { + Name: "attributes", + Fields: []*telemetryBis.TelemetryField{ + { + Fields: []*telemetryBis.TelemetryField{ + { + Name: "foo", + ValueByType: &telemetryBis.TelemetryField_StringValue{StringValue: "bar1"}, + }, + { + Name: "dn", + ValueByType: &telemetryBis.TelemetryField_StringValue{StringValue: "eth1/1"}, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + { + Fields: []*telemetryBis.TelemetryField{ + { + Name: "fooEntity", + Fields: []*telemetryBis.TelemetryField{ + { + Fields: []*telemetryBis.TelemetryField{ + { + Name: "attributes", + Fields: []*telemetryBis.TelemetryField{ + { + Fields: []*telemetryBis.TelemetryField{ + { + Name: "foo", + ValueByType: &telemetryBis.TelemetryField_StringValue{StringValue: "bar2"}, + }, + { + Name: "dn", + ValueByType: &telemetryBis.TelemetryField_StringValue{StringValue: "eth1/2"}, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }} + data, err := proto.Marshal(telemetry) + require.NoError(t, err) + + c.handleTelemetry(data) + require.Empty(t, acc.Errors) + + require.Equal(t, 2, len(acc.Metrics)) + + tags1 := map[string]string{ + "dn": "eth1/1", + "path": "sys/dme", + "source": "hostname", + "subscription": "subscription", + "sys/dme": "sys/dme", + } + fields1 := map[string]interface{}{"foo": "bar1", "dn": "eth1/1"} + acc.AssertContainsTaggedFields(t, "dme", fields1, tags1) + + tags2 := map[string]string{ + "dn": "eth1/2", + "path": "sys/dme", + "source": "hostname", + "subscription": "subscription", + "sys/dme": "sys/dme", + } + fields2 := map[string]interface{}{"foo": "bar2", "dn": "eth1/2"} + acc.AssertContainsTaggedFields(t, "dme", fields2, tags2) +} func TestTCPDialoutOverflow(t *testing.T) { c := &CiscoTelemetryMDT{ From 78590952be194e0393a19c1a69c752c88700f7e5 Mon Sep 17 00:00:00 2001 From: yusufshalaby Date: Fri, 20 Sep 2024 22:05:24 -0400 Subject: [PATCH 2/6] apply the same dn tag for all fields within nxAttributes --- plugins/inputs/cisco_telemetry_mdt/cisco_telemetry_mdt.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/plugins/inputs/cisco_telemetry_mdt/cisco_telemetry_mdt.go b/plugins/inputs/cisco_telemetry_mdt/cisco_telemetry_mdt.go index ec09761623829..3e60e60596dbd 100644 --- a/plugins/inputs/cisco_telemetry_mdt/cisco_telemetry_mdt.go +++ b/plugins/inputs/cisco_telemetry_mdt/cisco_telemetry_mdt.go @@ -627,10 +627,13 @@ func (c *CiscoTelemetryMDT) parseClassAttributeField(grouper *metric.SeriesGroup for _, subfield := range nxAttributes.Fields { if subfield.Name == "dn" { tags["dn"] = decodeTag(subfield) - } else { - c.parseContentField(grouper, subfield, "", encodingPath, tags, timestamp) } } + + for _, subfield := range nxAttributes.Fields { + c.parseContentField(grouper, subfield, "", encodingPath, tags, timestamp) + } + delete(tags, "dn") } func (c *CiscoTelemetryMDT) getMeasurementName(encodingPath string) string { From ac7d68724f09001354ee64baefca487839dcfc48 Mon Sep 17 00:00:00 2001 From: yusufshalaby Date: Fri, 20 Sep 2024 22:23:18 -0400 Subject: [PATCH 3/6] fix linting errors --- .../cisco_telemetry_mdt_test.go | 26 ++++++++++++------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/plugins/inputs/cisco_telemetry_mdt/cisco_telemetry_mdt_test.go b/plugins/inputs/cisco_telemetry_mdt/cisco_telemetry_mdt_test.go index d7445d6bcd109..014e409dd0395 100644 --- a/plugins/inputs/cisco_telemetry_mdt/cisco_telemetry_mdt_test.go +++ b/plugins/inputs/cisco_telemetry_mdt/cisco_telemetry_mdt_test.go @@ -868,12 +868,16 @@ func TestHandleNXDMESubtree(t *testing.T) { { Fields: []*telemetryBis.TelemetryField{ { - Name: "foo", - ValueByType: &telemetryBis.TelemetryField_StringValue{StringValue: "bar1"}, + Name: "foo", + ValueByType: &telemetryBis.TelemetryField_StringValue{ + StringValue: "bar1", + }, }, { - Name: "dn", - ValueByType: &telemetryBis.TelemetryField_StringValue{StringValue: "eth1/1"}, + Name: "dn", + ValueByType: &telemetryBis.TelemetryField_StringValue{ + StringValue: "eth1/1", + }, }, }, }, @@ -898,12 +902,16 @@ func TestHandleNXDMESubtree(t *testing.T) { { Fields: []*telemetryBis.TelemetryField{ { - Name: "foo", - ValueByType: &telemetryBis.TelemetryField_StringValue{StringValue: "bar2"}, + Name: "foo", + ValueByType: &telemetryBis.TelemetryField_StringValue{ + StringValue: "bar2", + }, }, { - Name: "dn", - ValueByType: &telemetryBis.TelemetryField_StringValue{StringValue: "eth1/2"}, + Name: "dn", + ValueByType: &telemetryBis.TelemetryField_StringValue{ + StringValue: "eth1/2", + }, }, }, }, @@ -930,7 +938,7 @@ func TestHandleNXDMESubtree(t *testing.T) { c.handleTelemetry(data) require.Empty(t, acc.Errors) - require.Equal(t, 2, len(acc.Metrics)) + require.Len(t, acc.Metrics, 2) tags1 := map[string]string{ "dn": "eth1/1", From f6c6c3ad3fa4dbd28cfc8805147b0b77dfc5860c Mon Sep 17 00:00:00 2001 From: yusufshalaby Date: Sun, 22 Sep 2024 10:43:27 -0400 Subject: [PATCH 4/6] break loop after finding dn --- plugins/inputs/cisco_telemetry_mdt/cisco_telemetry_mdt.go | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/inputs/cisco_telemetry_mdt/cisco_telemetry_mdt.go b/plugins/inputs/cisco_telemetry_mdt/cisco_telemetry_mdt.go index 3e60e60596dbd..6ce77593151c3 100644 --- a/plugins/inputs/cisco_telemetry_mdt/cisco_telemetry_mdt.go +++ b/plugins/inputs/cisco_telemetry_mdt/cisco_telemetry_mdt.go @@ -627,6 +627,7 @@ func (c *CiscoTelemetryMDT) parseClassAttributeField(grouper *metric.SeriesGroup for _, subfield := range nxAttributes.Fields { if subfield.Name == "dn" { tags["dn"] = decodeTag(subfield) + break } } From 8dfcd6cf5f7e0b9a88ff655e978b95b3ec8aae9a Mon Sep 17 00:00:00 2001 From: yusufshalaby Date: Wed, 2 Oct 2024 12:55:25 -0400 Subject: [PATCH 5/6] add comments for dn tag processing --- plugins/inputs/cisco_telemetry_mdt/cisco_telemetry_mdt.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plugins/inputs/cisco_telemetry_mdt/cisco_telemetry_mdt.go b/plugins/inputs/cisco_telemetry_mdt/cisco_telemetry_mdt.go index 6ce77593151c3..48f63a99e0be0 100644 --- a/plugins/inputs/cisco_telemetry_mdt/cisco_telemetry_mdt.go +++ b/plugins/inputs/cisco_telemetry_mdt/cisco_telemetry_mdt.go @@ -624,16 +624,18 @@ func (c *CiscoTelemetryMDT) parseClassAttributeField(grouper *metric.SeriesGroup } nxAttributes = field.Fields[0].Fields[0].Fields[0].Fields[0] + // Find dn tag among list of attributes for _, subfield := range nxAttributes.Fields { if subfield.Name == "dn" { tags["dn"] = decodeTag(subfield) break } } - + // Add attributes to grouper with consistent dn tag for _, subfield := range nxAttributes.Fields { c.parseContentField(grouper, subfield, "", encodingPath, tags, timestamp) } + // Delete dn tag to prevent it from being added to the next node's attributes delete(tags, "dn") } From 416290dfe566efeaa6fb984b77ea19c8b2ee2c9d Mon Sep 17 00:00:00 2001 From: yusufshalaby Date: Wed, 2 Oct 2024 12:58:31 -0400 Subject: [PATCH 6/6] fix comment formatting --- plugins/inputs/cisco_telemetry_mdt/cisco_telemetry_mdt.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/inputs/cisco_telemetry_mdt/cisco_telemetry_mdt.go b/plugins/inputs/cisco_telemetry_mdt/cisco_telemetry_mdt.go index 48f63a99e0be0..151fbc341052c 100644 --- a/plugins/inputs/cisco_telemetry_mdt/cisco_telemetry_mdt.go +++ b/plugins/inputs/cisco_telemetry_mdt/cisco_telemetry_mdt.go @@ -631,7 +631,7 @@ func (c *CiscoTelemetryMDT) parseClassAttributeField(grouper *metric.SeriesGroup break } } - // Add attributes to grouper with consistent dn tag + // Add attributes to grouper with consistent dn tag for _, subfield := range nxAttributes.Fields { c.parseContentField(grouper, subfield, "", encodingPath, tags, timestamp) }