Skip to content

Commit 1bffce2

Browse files
yusufshalabysrebhan
authored andcommitted
fix(inputs.cisco_telemetry_mdt): Handle NXOS DME subtree telemetry format (#15923)
(cherry picked from commit 2268175)
1 parent 0662544 commit 1bffce2

File tree

2 files changed

+148
-2
lines changed

2 files changed

+148
-2
lines changed

plugins/inputs/cisco_telemetry_mdt/cisco_telemetry_mdt.go

+8-2
Original file line numberDiff line numberDiff line change
@@ -624,13 +624,19 @@ func (c *CiscoTelemetryMDT) parseClassAttributeField(grouper *metric.SeriesGroup
624624
}
625625
nxAttributes = field.Fields[0].Fields[0].Fields[0].Fields[0]
626626

627+
// Find dn tag among list of attributes
627628
for _, subfield := range nxAttributes.Fields {
628629
if subfield.Name == "dn" {
629630
tags["dn"] = decodeTag(subfield)
630-
} else {
631-
c.parseContentField(grouper, subfield, "", encodingPath, tags, timestamp)
631+
break
632632
}
633633
}
634+
// Add attributes to grouper with consistent dn tag
635+
for _, subfield := range nxAttributes.Fields {
636+
c.parseContentField(grouper, subfield, "", encodingPath, tags, timestamp)
637+
}
638+
// Delete dn tag to prevent it from being added to the next node's attributes
639+
delete(tags, "dn")
634640
}
635641

636642
func (c *CiscoTelemetryMDT) getMeasurementName(encodingPath string) string {

plugins/inputs/cisco_telemetry_mdt/cisco_telemetry_mdt_test.go

+140
Original file line numberDiff line numberDiff line change
@@ -820,6 +820,146 @@ func TestHandleNXDME(t *testing.T) {
820820
fields1 := map[string]interface{}{"value": "foo"}
821821
acc.AssertContainsTaggedFields(t, "dme", fields1, tags1)
822822
}
823+
func TestHandleNXDMESubtree(t *testing.T) {
824+
c := &CiscoTelemetryMDT{
825+
Transport: "dummy",
826+
Aliases: map[string]string{"dme": "sys/dme"},
827+
}
828+
acc := &testutil.Accumulator{}
829+
err := c.Start(acc)
830+
// error is expected since we are passing in dummy transport
831+
require.Error(t, err)
832+
833+
telemetry := &telemetryBis.Telemetry{
834+
MsgTimestamp: 1543236572000,
835+
EncodingPath: "sys/dme",
836+
NodeId: &telemetryBis.Telemetry_NodeIdStr{NodeIdStr: "hostname"},
837+
Subscription: &telemetryBis.Telemetry_SubscriptionIdStr{SubscriptionIdStr: "subscription"},
838+
DataGpbkv: []*telemetryBis.TelemetryField{
839+
{
840+
Fields: []*telemetryBis.TelemetryField{
841+
{
842+
Name: "keys",
843+
Fields: []*telemetryBis.TelemetryField{
844+
{
845+
Name: "sys/dme",
846+
ValueByType: &telemetryBis.TelemetryField_StringValue{StringValue: "sys/dme"},
847+
},
848+
},
849+
},
850+
{
851+
Name: "content",
852+
Fields: []*telemetryBis.TelemetryField{
853+
{
854+
Fields: []*telemetryBis.TelemetryField{
855+
{
856+
Name: "children",
857+
Fields: []*telemetryBis.TelemetryField{
858+
{
859+
Fields: []*telemetryBis.TelemetryField{
860+
{
861+
Name: "fooEntity",
862+
Fields: []*telemetryBis.TelemetryField{
863+
{
864+
Fields: []*telemetryBis.TelemetryField{
865+
{
866+
Name: "attributes",
867+
Fields: []*telemetryBis.TelemetryField{
868+
{
869+
Fields: []*telemetryBis.TelemetryField{
870+
{
871+
Name: "foo",
872+
ValueByType: &telemetryBis.TelemetryField_StringValue{
873+
StringValue: "bar1",
874+
},
875+
},
876+
{
877+
Name: "dn",
878+
ValueByType: &telemetryBis.TelemetryField_StringValue{
879+
StringValue: "eth1/1",
880+
},
881+
},
882+
},
883+
},
884+
},
885+
},
886+
},
887+
},
888+
},
889+
},
890+
},
891+
},
892+
{
893+
Fields: []*telemetryBis.TelemetryField{
894+
{
895+
Name: "fooEntity",
896+
Fields: []*telemetryBis.TelemetryField{
897+
{
898+
Fields: []*telemetryBis.TelemetryField{
899+
{
900+
Name: "attributes",
901+
Fields: []*telemetryBis.TelemetryField{
902+
{
903+
Fields: []*telemetryBis.TelemetryField{
904+
{
905+
Name: "foo",
906+
ValueByType: &telemetryBis.TelemetryField_StringValue{
907+
StringValue: "bar2",
908+
},
909+
},
910+
{
911+
Name: "dn",
912+
ValueByType: &telemetryBis.TelemetryField_StringValue{
913+
StringValue: "eth1/2",
914+
},
915+
},
916+
},
917+
},
918+
},
919+
},
920+
},
921+
},
922+
},
923+
},
924+
},
925+
},
926+
},
927+
},
928+
},
929+
},
930+
},
931+
},
932+
},
933+
},
934+
}}
935+
data, err := proto.Marshal(telemetry)
936+
require.NoError(t, err)
937+
938+
c.handleTelemetry(data)
939+
require.Empty(t, acc.Errors)
940+
941+
require.Len(t, acc.Metrics, 2)
942+
943+
tags1 := map[string]string{
944+
"dn": "eth1/1",
945+
"path": "sys/dme",
946+
"source": "hostname",
947+
"subscription": "subscription",
948+
"sys/dme": "sys/dme",
949+
}
950+
fields1 := map[string]interface{}{"foo": "bar1", "dn": "eth1/1"}
951+
acc.AssertContainsTaggedFields(t, "dme", fields1, tags1)
952+
953+
tags2 := map[string]string{
954+
"dn": "eth1/2",
955+
"path": "sys/dme",
956+
"source": "hostname",
957+
"subscription": "subscription",
958+
"sys/dme": "sys/dme",
959+
}
960+
fields2 := map[string]interface{}{"foo": "bar2", "dn": "eth1/2"}
961+
acc.AssertContainsTaggedFields(t, "dme", fields2, tags2)
962+
}
823963

824964
func TestTCPDialoutOverflow(t *testing.T) {
825965
c := &CiscoTelemetryMDT{

0 commit comments

Comments
 (0)