From f5552944d153a01d8c54be838e28c1e310371025 Mon Sep 17 00:00:00 2001 From: Shangxin Du Date: Tue, 16 Mar 2021 14:49:07 -0700 Subject: [PATCH] cisco_telemetry_mdt enhancement (#8661) --- plugins/inputs/cisco_telemetry_mdt/README.md | 64 +- .../cisco_telemetry_mdt.go | 159 +++- .../cisco_telemetry_mdt_test.go | 161 +++- .../cisco_telemetry_util.go | 892 ++++++++++++++++++ 4 files changed, 1269 insertions(+), 7 deletions(-) create mode 100644 plugins/inputs/cisco_telemetry_mdt/cisco_telemetry_util.go diff --git a/plugins/inputs/cisco_telemetry_mdt/README.md b/plugins/inputs/cisco_telemetry_mdt/README.md index 9c4eb3645d491..d15f122081d05 100644 --- a/plugins/inputs/cisco_telemetry_mdt/README.md +++ b/plugins/inputs/cisco_telemetry_mdt/README.md @@ -1,8 +1,8 @@ -# Cisco Model-Driven Telemetry (MDT) Input Plugin +# Cisco model-driven telemetry (MDT) Cisco model-driven telemetry (MDT) is an input plugin that consumes telemetry data from Cisco IOS XR, IOS XE and NX-OS platforms. It supports TCP & GRPC dialout transports. -GRPC-based transport can utilize TLS for authentication and encryption. +RPC-based transport can utilize TLS for authentication and encryption. Telemetry data is expected to be GPB-KV (self-describing-gpb) encoded. The GRPC dialout transport is supported on various IOS XR (64-bit) 6.1.x and later, IOS XE 16.10 and later, as well as NX-OS 7.x and later platforms. @@ -21,6 +21,9 @@ The TCP dialout transport is supported on IOS XR (32-bit and 64-bit) 6.1.x and l ## Address and port to host telemetry listener service_address = ":57000" + ## Grpc Maximum Message Size, default is 4MB, increase the size. + max_msg_size = 20000000 + ## Enable TLS; grpc transport only. # tls_cert = "/etc/telegraf/cert.pem" # tls_key = "/etc/telegraf/key.pem" @@ -35,6 +38,19 @@ The TCP dialout transport is supported on IOS XR (32-bit and 64-bit) 6.1.x and l ## Define aliases to map telemetry encoding paths to simple measurement names [inputs.cisco_telemetry_mdt.aliases] ifstats = "ietf-interfaces:interfaces-state/interface/statistics" + [inputs.cisco_telemetry_mdt.dmes] +# Global Property Xformation. +# prop1 = "uint64 to int" +# prop2 = "uint64 to string" +# prop3 = "string to uint64" +# prop4 = "string to int64" +# prop5 = "string to float64" +# auto-prop-xfrom = "auto-float-xfrom" #Xform any property which is string, and has float number to type float64 +# Per Path property xformation, Name is telemetry configuration under sensor-group, path configuration "WORD Distinguished Name" +# Per Path configuration is better as it avoid property collision issue of types. +# dnpath = '{"Name": "show ip route summary","prop": [{"Key": "routes","Value": "string"}, {"Key": "best-paths","Value": "string"}]}' +# dnpath2 = '{"Name": "show processes cpu","prop": [{"Key": "kernel_percent","Value": "float"}, {"Key": "idle_percent","Value": "float"}, {"Key": "process","Value": "string"}, {"Key": "user_percent","Value": "float"}, {"Key": "onesec","Value": "float"}]}' +# dnpath3 = '{"Name": "show processes memory physical","prop": [{"Key": "processname","Value": "string"}]}' ``` ### Example Output: @@ -42,3 +58,47 @@ The TCP dialout transport is supported on IOS XR (32-bit and 64-bit) 6.1.x and l ifstats,path=ietf-interfaces:interfaces-state/interface/statistics,host=linux,name=GigabitEthernet2,source=csr1kv,subscription=101 in-unicast-pkts=27i,in-multicast-pkts=0i,discontinuity-time="2019-05-23T07:40:23.000362+00:00",in-octets=5233i,in-errors=0i,out-multicast-pkts=0i,out-discards=0i,in-broadcast-pkts=0i,in-discards=0i,in-unknown-protos=0i,out-unicast-pkts=0i,out-broadcast-pkts=0i,out-octets=0i,out-errors=0i 1559150462624000000 ifstats,path=ietf-interfaces:interfaces-state/interface/statistics,host=linux,name=GigabitEthernet1,source=csr1kv,subscription=101 in-octets=3394770806i,in-broadcast-pkts=0i,in-multicast-pkts=0i,out-broadcast-pkts=0i,in-unknown-protos=0i,out-octets=350212i,in-unicast-pkts=9477273i,in-discards=0i,out-unicast-pkts=2726i,out-discards=0i,discontinuity-time="2019-05-23T07:40:23.000363+00:00",in-errors=30i,out-multicast-pkts=0i,out-errors=0i 1559150462624000000 ``` + +### NX-OS Configuration Example: +``` +Requirement DATA-SOURCE Configuration +----------------------------------------- +Environment DME path sys/ch query-condition query-target=subtree&target-subtree-class=eqptPsuSlot,eqptFtSlot,eqptSupCSlot,eqptPsu,eqptFt,eqptSensor,eqptLCSlot + DME path sys/ch depth 5 (Another configuration option) +Environment NXAPI show environment power + NXAPI show environment fan + NXAPI show environment temperature +Interface Stats DME path sys/intf query-condition query-target=subtree&target-subtree-class=rmonIfIn,rmonIfOut,rmonIfHCIn,rmonIfHCOut,rmonEtherStats +Interface State DME path sys/intf depth unbounded query-condition query-target=subtree&target-subtree-class=l1PhysIf,pcAggrIf,l3EncRtdIf,l3LbRtdIf,ethpmPhysIf +VPC DME path sys/vpc query-condition query-target=subtree&target-subtree-class=vpcDom,vpcIf +Resources cpu DME path sys/procsys query-condition query-target=subtree&target-subtree-class=procSystem,procSysCore,procSysCpuSummary,procSysCpu,procIdle,procIrq,procKernel,procNice,procSoftirq,procTotal,procUser,procWait,procSysCpuHistory,procSysLoad +Resources Mem DME path sys/procsys/sysmem/sysmemused + path sys/procsys/sysmem/sysmemusage + path sys/procsys/sysmem/sysmemfree +Per Process cpu DME path sys/proc depth unbounded query-condition rsp-foreign-subtree=ephemeral +vxlan(svi stats) DME path sys/bd query-condition query-target=subtree&target-subtree-class=l2VlanStats +BGP DME path sys/bgp query-condition query-target=subtree&target-subtree-class=bgpDom,bgpPeer,bgpPeerAf,bgpDomAf,bgpPeerAfEntry,bgpOperRtctrlL3,bgpOperRttP,bgpOperRttEntry,bgpOperAfCtrl +mac dynamic DME path sys/mac query-condition query-target=subtree&target-subtree-class=l2MacAddressTable +bfd DME path sys/bfd/inst depth unbounded +lldp DME path sys/lldp depth unbounded +urib DME path sys/urib depth unbounded query-condition rsp-foreign-subtree=ephemeral +u6rib DME path sys/u6rib depth unbounded query-condition rsp-foreign-subtree=ephemeral +multicast flow DME path sys/mca/show/flows depth unbounded +multicast stats DME path sys/mca/show/stats depth unbounded +multicast igmp NXAPI show ip igmp groups vrf all +multicast igmp NXAPI show ip igmp interface vrf all +multicast igmp NXAPI show ip igmp snooping +multicast igmp NXAPI show ip igmp snooping groups +multicast igmp NXAPI show ip igmp snooping groups detail +multicast igmp NXAPI show ip igmp snooping groups summary +multicast igmp NXAPI show ip igmp snooping mrouter +multicast igmp NXAPI show ip igmp snooping statistics +multicast pim NXAPI show ip pim interface vrf all +multicast pim NXAPI show ip pim neighbor vrf all +multicast pim NXAPI show ip pim route vrf all +multicast pim NXAPI show ip pim rp vrf all +multicast pim NXAPI show ip pim statistics vrf all +multicast pim NXAPI show ip pim vrf all + + +``` diff --git a/plugins/inputs/cisco_telemetry_mdt/cisco_telemetry_mdt.go b/plugins/inputs/cisco_telemetry_mdt/cisco_telemetry_mdt.go index db34ba94d5f0a..e0cbb87d4371c 100644 --- a/plugins/inputs/cisco_telemetry_mdt/cisco_telemetry_mdt.go +++ b/plugins/inputs/cisco_telemetry_mdt/cisco_telemetry_mdt.go @@ -3,6 +3,7 @@ package cisco_telemetry_mdt import ( "bytes" "encoding/binary" + "encoding/json" "fmt" "io" "net" @@ -37,6 +38,7 @@ type CiscoTelemetryMDT struct { ServiceAddress string `toml:"service_address"` MaxMsgSize int `toml:"max_msg_size"` Aliases map[string]string `toml:"aliases"` + Dmes map[string]string `toml:"dmes"` EmbeddedTags []string `toml:"embedded_tags"` Log telegraf.Logger @@ -50,13 +52,24 @@ type CiscoTelemetryMDT struct { // Internal state aliases map[string]string + dmesFuncs map[string]string warned map[string]struct{} extraTags map[string]map[string]struct{} + nxpathMap map[string]map[string]string //per path map + propMap map[string]func(field *telemetry.TelemetryField, value interface{}) interface{} mutex sync.Mutex acc telegraf.Accumulator wg sync.WaitGroup } +type NxPayloadXfromStructure struct { + Name string `json:"Name"` + Prop []struct { + Key string `json:"Key"` + Value string `json:"Value"` + } `json:"prop"` +} + // Start the Cisco MDT service func (c *CiscoTelemetryMDT) Start(acc telegraf.Accumulator) error { var err error @@ -66,12 +79,55 @@ func (c *CiscoTelemetryMDT) Start(acc telegraf.Accumulator) error { return err } + c.propMap = make(map[string]func(field *telemetry.TelemetryField, value interface{}) interface{}, 100) + c.propMap["test"] = nxosValueXformUint64Toint64 + c.propMap["asn"] = nxosValueXformUint64ToString //uint64 to string. + c.propMap["subscriptionId"] = nxosValueXformUint64ToString //uint64 to string. + c.propMap["operState"] = nxosValueXformUint64ToString //uint64 to string. + // Invert aliases list c.warned = make(map[string]struct{}) c.aliases = make(map[string]string, len(c.Aliases)) for alias, path := range c.Aliases { c.aliases[path] = alias } + c.initDb() + + c.dmesFuncs = make(map[string]string, len(c.Dmes)) + for dme, path := range c.Dmes { + c.dmesFuncs[path] = dme + switch path { + case "uint64 to int": + c.propMap[dme] = nxosValueXformUint64Toint64 + case "uint64 to string": + c.propMap[dme] = nxosValueXformUint64ToString + case "string to float64": + c.propMap[dme] = nxosValueXformStringTofloat + case "string to uint64": + c.propMap[dme] = nxosValueXformStringToUint64 + case "string to int64": + c.propMap[dme] = nxosValueXformStringToInt64 + case "auto-float-xfrom": + c.propMap[dme] = nxosValueAutoXformFloatProp + default: + if !strings.HasPrefix(dme, "dnpath") { // not path based property map + continue + } + + var jsStruct NxPayloadXfromStructure + err := json.Unmarshal([]byte(path), &jsStruct) + if err != nil { + continue + } + + // Build 2 level Hash nxpathMap Key = jsStruct.Name, Value = map of jsStruct.Prop + // It will override the default of code if same path is provided in configuration. + c.nxpathMap[jsStruct.Name] = make(map[string]string, len(jsStruct.Prop)) + for _, prop := range jsStruct.Prop { + c.nxpathMap[jsStruct.Name][prop.Key] = prop.Value + } + } + } // Fill extra tags c.extraTags = make(map[string]map[string]struct{}) @@ -296,7 +352,9 @@ func (c *CiscoTelemetryMDT) handleTelemetry(data []byte) { // Parse keys tags = make(map[string]string, len(keys.Fields)+3) tags["source"] = msg.GetNodeIdStr() - tags["subscription"] = msg.GetSubscriptionIdStr() + if msgID := msg.GetSubscriptionIdStr(); msgID != "" { + tags["subscription"] = msgID + } tags["path"] = msg.GetEncodingPath() for _, subfield := range keys.Fields { @@ -391,9 +449,72 @@ func (c *CiscoTelemetryMDT) parseKeyField(tags map[string]string, field *telemet } } +func (c *CiscoTelemetryMDT) parseRib(grouper *metric.SeriesGrouper, field *telemetry.TelemetryField, prefix string, path string, tags map[string]string, timestamp time.Time) { + // RIB + measurement := path + for _, subfield := range field.Fields { + //For Every table fill the keys which are vrfName, address and masklen + switch subfield.Name { + case "vrfName", "address", "maskLen": + tags[subfield.Name] = decodeTag(subfield) + } + if value := decodeValue(subfield); value != nil { + grouper.Add(measurement, tags, timestamp, subfield.Name, value) + } + if subfield.Name != "nextHop" { + continue + } + //For next hop table fill the keys in the tag - which is address and vrfname + for _, subf := range subfield.Fields { + for _, ff := range subf.Fields { + switch ff.Name { + case "address", "vrfName": + key := "nextHop/" + ff.Name + tags[key] = decodeTag(ff) + } + if value := decodeValue(ff); value != nil { + name := "nextHop/" + ff.Name + grouper.Add(measurement, tags, timestamp, name, value) + } + } + } + } +} + +func (c *CiscoTelemetryMDT) parseClassAttributeField(grouper *metric.SeriesGrouper, field *telemetry.TelemetryField, prefix string, path string, tags map[string]string, timestamp time.Time) { + // DME structure: https://developer.cisco.com/site/nxapi-dme-model-reference-api/ + var nxAttributes *telemetry.TelemetryField + isDme := strings.Contains(path, "sys/") + if path == "rib" { + //handle native data path rib + c.parseRib(grouper, field, prefix, path, tags, timestamp) + return + } + if field == nil || !isDme || len(field.Fields) == 0 || len(field.Fields[0].Fields) == 0 || len(field.Fields[0].Fields[0].Fields) == 0 { + return + } + + if field.Fields[0] != nil && field.Fields[0].Fields != nil && field.Fields[0].Fields[0] != nil && field.Fields[0].Fields[0].Fields[0].Name != "attributes" { + return + } + nxAttributes = field.Fields[0].Fields[0].Fields[0].Fields[0] + + for _, subfield := range nxAttributes.Fields { + if subfield.Name == "dn" { + tags["dn"] = decodeTag(subfield) + } else { + c.parseContentField(grouper, subfield, "", path, tags, timestamp) + } + } +} + func (c *CiscoTelemetryMDT) parseContentField(grouper *metric.SeriesGrouper, field *telemetry.TelemetryField, prefix string, path string, tags map[string]string, timestamp time.Time) { name := strings.Replace(field.Name, "-", "_", -1) + + if (name == "modTs" || name == "createTs") && decodeValue(field) == "never" { + return + } if len(name) == 0 { name = prefix } else if len(prefix) > 0 { @@ -416,7 +537,11 @@ func (c *CiscoTelemetryMDT) parseContentField(grouper *metric.SeriesGrouper, fie c.mutex.Unlock() } - grouper.Add(measurement, tags, timestamp, name, value) + if val := c.nxosValueXform(field, value, path); val != nil { + grouper.Add(measurement, tags, timestamp, name, val) + } else { + grouper.Add(measurement, tags, timestamp, name, value) + } return } @@ -430,11 +555,28 @@ func (c *CiscoTelemetryMDT) parseContentField(grouper *metric.SeriesGrouper, fie var nxAttributes, nxChildren, nxRows *telemetry.TelemetryField isNXOS := !strings.ContainsRune(path, ':') // IOS-XR and IOS-XE have a colon in their encoding path, NX-OS does not + isEVENT := isNXOS && strings.Contains(path, "EVENT-LIST") + nxChildren = nil + nxAttributes = nil for _, subfield := range field.Fields { if isNXOS && subfield.Name == "attributes" && len(subfield.Fields) > 0 { nxAttributes = subfield.Fields[0] } else if isNXOS && subfield.Name == "children" && len(subfield.Fields) > 0 { - nxChildren = subfield + if !isEVENT { + nxChildren = subfield + } else { + sub := subfield.Fields + if len(sub) > 0 && sub[0] != nil && sub[0].Fields[0].Name == "subscriptionId" && len(sub[0].Fields) >= 2 { + nxAttributes = sub[0].Fields[1].Fields[0].Fields[0].Fields[0].Fields[0].Fields[0] + } + } + //if nxAttributes == NULL then class based query. + if nxAttributes == nil { + //call function walking over walking list. + for _, sub := range subfield.Fields { + c.parseClassAttributeField(grouper, sub, name, path, tags, timestamp) + } + } } else if isNXOS && strings.HasPrefix(subfield.Name, "ROW_") { nxRows = subfield } else if _, isExtraTag := extraTags[subfield.Name]; !isExtraTag { // Regular telemetry decoding @@ -450,9 +592,16 @@ func (c *CiscoTelemetryMDT) parseContentField(grouper *metric.SeriesGrouper, fie for i, subfield := range row.Fields { if i == 0 { // First subfield contains the index, promote it from value to tag tags[prefix] = decodeTag(subfield) + //We can have subfield so recursively handle it. + if len(row.Fields) == 1 { + tags["row_number"] = strconv.FormatInt(int64(i), 10) + c.parseContentField(grouper, subfield, "", path, tags, timestamp) + } } else { c.parseContentField(grouper, subfield, "", path, tags, timestamp) } + // Nxapi we can't identify keys always from prefix + tags["row_number"] = strconv.FormatInt(int64(i), 10) } delete(tags, prefix) } @@ -531,6 +680,10 @@ const sampleConfig = ` ## Define aliases to map telemetry encoding paths to simple measurement names [inputs.cisco_telemetry_mdt.aliases] ifstats = "ietf-interfaces:interfaces-state/interface/statistics" + ##Define Property Xformation, please refer README and https://pubhub.devnetcloud.com/media/dme-docs-9-3-3/docs/appendix/ for Model details. + [inputs.cisco_telemetry_mdt.dmes] + ModTs = "ignore" + CreateTs = "ignore" ` // SampleConfig of plugin 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 f967044da881b..0a9bde81acaeb 100644 --- a/plugins/inputs/cisco_telemetry_mdt/cisco_telemetry_mdt_test.go +++ b/plugins/inputs/cisco_telemetry_mdt/cisco_telemetry_mdt_test.go @@ -311,14 +311,171 @@ func TestHandleNXAPI(t *testing.T) { c.handleTelemetry(data) require.Empty(t, acc.Errors) - tags1 := map[string]string{"path": "show nxapi", "foo": "bar", "TABLE_nxapi": "i1", "source": "hostname", "subscription": "subscription"} + tags1 := map[string]string{"path": "show nxapi", "foo": "bar", "TABLE_nxapi": "i1", "row_number": "0", "source": "hostname", "subscription": "subscription"} fields1 := map[string]interface{}{"value": "foo"} - tags2 := map[string]string{"path": "show nxapi", "foo": "bar", "TABLE_nxapi": "i2", "source": "hostname", "subscription": "subscription"} + tags2 := map[string]string{"path": "show nxapi", "foo": "bar", "TABLE_nxapi": "i2", "row_number": "0", "source": "hostname", "subscription": "subscription"} fields2 := map[string]interface{}{"value": "bar"} acc.AssertContainsTaggedFields(t, "nxapi", fields1, tags1) acc.AssertContainsTaggedFields(t, "nxapi", fields2, tags2) } +func TestHandleNXAPIXformNXAPI(t *testing.T) { + c := &CiscoTelemetryMDT{Log: testutil.Logger{}, Transport: "dummy", Aliases: map[string]string{"nxapi": "show nxapi"}} + acc := &testutil.Accumulator{} + err := c.Start(acc) + // error is expected since we are passing in dummy transport + require.Error(t, err) + + telemetry := &telemetry.Telemetry{ + MsgTimestamp: 1543236572000, + EncodingPath: "show processes cpu", + NodeId: &telemetry.Telemetry_NodeIdStr{NodeIdStr: "hostname"}, + Subscription: &telemetry.Telemetry_SubscriptionIdStr{SubscriptionIdStr: "subscription"}, + DataGpbkv: []*telemetry.TelemetryField{ + { + Fields: []*telemetry.TelemetryField{ + { + Name: "keys", + Fields: []*telemetry.TelemetryField{ + { + Name: "foo", + ValueByType: &telemetry.TelemetryField_StringValue{StringValue: "bar"}, + }, + }, + }, + { + Name: "content", + Fields: []*telemetry.TelemetryField{ + { + Fields: []*telemetry.TelemetryField{ + { + Name: "TABLE_process_cpu", + Fields: []*telemetry.TelemetryField{ + { + Fields: []*telemetry.TelemetryField{ + { + Name: "ROW_process_cpu", + Fields: []*telemetry.TelemetryField{ + { + Fields: []*telemetry.TelemetryField{ + { + Name: "index", + ValueByType: &telemetry.TelemetryField_StringValue{StringValue: "i1"}, + }, + { + Name: "value", + ValueByType: &telemetry.TelemetryField_StringValue{StringValue: "foo"}, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + } + data, _ := proto.Marshal(telemetry) + + c.handleTelemetry(data) + require.Empty(t, acc.Errors) + + tags1 := map[string]string{"path": "show processes cpu", "foo": "bar", "TABLE_process_cpu": "i1", "row_number": "0", "source": "hostname", "subscription": "subscription"} + fields1 := map[string]interface{}{"value": "foo"} + acc.AssertContainsTaggedFields(t, "show processes cpu", fields1, tags1) +} + +func TestHandleNXXformMulti(t *testing.T) { + c := &CiscoTelemetryMDT{Transport: "dummy", Aliases: map[string]string{"dme": "sys/lldp"}} + acc := &testutil.Accumulator{} + err := c.Start(acc) + // error is expected since we are passing in dummy transport + require.Error(t, err) + + telemetry := &telemetry.Telemetry{ + MsgTimestamp: 1543236572000, + EncodingPath: "sys/lldp", + NodeId: &telemetry.Telemetry_NodeIdStr{NodeIdStr: "hostname"}, + Subscription: &telemetry.Telemetry_SubscriptionIdStr{SubscriptionIdStr: "subscription"}, + DataGpbkv: []*telemetry.TelemetryField{ + { + Fields: []*telemetry.TelemetryField{ + { + Name: "keys", + Fields: []*telemetry.TelemetryField{ + { + Name: "foo", + ValueByType: &telemetry.TelemetryField_StringValue{StringValue: "bar"}, + }, + }, + }, + { + Name: "content", + Fields: []*telemetry.TelemetryField{ + { + Fields: []*telemetry.TelemetryField{ + { + Name: "fooEntity", + Fields: []*telemetry.TelemetryField{ + { + Fields: []*telemetry.TelemetryField{ + { + Name: "attributes", + Fields: []*telemetry.TelemetryField{ + { + Fields: []*telemetry.TelemetryField{ + { + Name: "rn", + ValueByType: &telemetry.TelemetryField_StringValue{StringValue: "some-rn"}, + }, + { + Name: "portIdV", + ValueByType: &telemetry.TelemetryField_Uint32Value{Uint32Value: 12}, + }, + { + Name: "portDesc", + ValueByType: &telemetry.TelemetryField_Uint64Value{Uint64Value: 100}, + }, + { + Name: "test", + ValueByType: &telemetry.TelemetryField_Uint64Value{Uint64Value: 281474976710655}, + }, + { + Name: "subscriptionId", + ValueByType: &telemetry.TelemetryField_Uint64Value{Uint64Value: 2814749767106551}, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + } + data, _ := proto.Marshal(telemetry) + + c.handleTelemetry(data) + require.Empty(t, acc.Errors) + //validate various transformation scenaarios newly added in the code. + fields := map[string]interface{}{"portIdV": "12", "portDesc": "100", "test": int64(281474976710655), "subscriptionId": "2814749767106551"} + acc.AssertContainsFields(t, "dme", fields) +} + func TestHandleNXDME(t *testing.T) { c := &CiscoTelemetryMDT{Transport: "dummy", Aliases: map[string]string{"dme": "sys/dme"}} acc := &testutil.Accumulator{} diff --git a/plugins/inputs/cisco_telemetry_mdt/cisco_telemetry_util.go b/plugins/inputs/cisco_telemetry_mdt/cisco_telemetry_util.go new file mode 100644 index 0000000000000..60140c030fed2 --- /dev/null +++ b/plugins/inputs/cisco_telemetry_mdt/cisco_telemetry_util.go @@ -0,0 +1,892 @@ +package cisco_telemetry_mdt + +import ( + telemetry "github.com/cisco-ie/nx-telemetry-proto/telemetry_bis" + "strconv" + "strings" +) + +//xform Field to string +func xformValueString(field *telemetry.TelemetryField) string { + var str string + switch val := field.ValueByType.(type) { + case *telemetry.TelemetryField_StringValue: + if len(val.StringValue) > 0 { + return val.StringValue + } + case *telemetry.TelemetryField_Uint32Value: + str = strconv.FormatUint(uint64(val.Uint32Value), 10) + return str + case *telemetry.TelemetryField_Uint64Value: + str = strconv.FormatUint(val.Uint64Value, 10) + return str + case *telemetry.TelemetryField_Sint32Value: + str = strconv.FormatInt(int64(val.Sint32Value), 10) + return str + case *telemetry.TelemetryField_Sint64Value: + str = strconv.FormatInt(val.Sint64Value, 10) + return str + } + return "" +} + +//xform Uint64 to int64 +func nxosValueXformUint64Toint64(field *telemetry.TelemetryField, value interface{}) interface{} { + if field.GetUint64Value() != 0 { + return int64(value.(uint64)) + } + return nil +} + +//xform string to float +func nxosValueXformStringTofloat(field *telemetry.TelemetryField, value interface{}) interface{} { + //convert property to float from string. + vals := field.GetStringValue() + if vals != "" { + if valf, err := strconv.ParseFloat(vals, 64); err == nil { + return valf + } + } + return nil +} + +//xform string to uint64 +func nxosValueXformStringToUint64(field *telemetry.TelemetryField, value interface{}) interface{} { + //string to uint64 + vals := field.GetStringValue() + if vals != "" { + if val64, err := strconv.ParseUint(vals, 10, 64); err == nil { + return val64 + } + } + return nil +} + +//xform string to int64 +func nxosValueXformStringToInt64(field *telemetry.TelemetryField, value interface{}) interface{} { + //string to int64 + vals := field.GetStringValue() + if vals != "" { + if val64, err := strconv.ParseInt(vals, 10, 64); err == nil { + return val64 + } + } + return nil +} + +//auto-xform +func nxosValueAutoXform(field *telemetry.TelemetryField, value interface{}) interface{} { + //check if we want auto xformation + vals := field.GetStringValue() + if vals != "" { + if val64, err := strconv.ParseUint(vals, 10, 64); err == nil { + return val64 + } + if valf, err := strconv.ParseFloat(vals, 64); err == nil { + return valf + } + if val64, err := strconv.ParseInt(vals, 10, 64); err == nil { + return val64 + } + } // switch + return nil +} + +//auto-xform float properties +func nxosValueAutoXformFloatProp(field *telemetry.TelemetryField, value interface{}) interface{} { + //check if we want auto xformation + vals := field.GetStringValue() + if vals != "" { + if valf, err := strconv.ParseFloat(vals, 64); err == nil { + return valf + } + } // switch + return nil +} + +//xform uint64 to string +func nxosValueXformUint64ToString(field *telemetry.TelemetryField, value interface{}) interface{} { + switch val := field.ValueByType.(type) { + case *telemetry.TelemetryField_StringValue: + if len(val.StringValue) > 0 { + return val.StringValue + } + case *telemetry.TelemetryField_Uint64Value: + return strconv.FormatUint(val.Uint64Value, 10) + } + return nil +} + +//Xform value field. +func (c *CiscoTelemetryMDT) nxosValueXform(field *telemetry.TelemetryField, value interface{}, path string) interface{} { + if strings.ContainsRune(path, ':') { + // not NXOS + return nil + } + if _, ok := c.propMap[field.Name]; ok { + return c.propMap[field.Name](field, value) + } + //check if we want auto xformation + if _, ok := c.propMap["auto-prop-xfromi"]; ok { + return c.propMap["auto-prop-xfrom"](field, value) + } + //Now check path based conversion. + //If mapping is found then do the required transformation. + if c.nxpathMap[path] == nil { + return nil + } + switch c.nxpathMap[path][field.Name] { + //Xformation supported is only from String, Uint32 and Uint64 + case "integer": + switch val := field.ValueByType.(type) { + case *telemetry.TelemetryField_StringValue: + if vali, err := strconv.ParseInt(val.StringValue, 10, 32); err == nil { + return vali + } + case *telemetry.TelemetryField_Uint32Value: + vali, ok := value.(uint32) + if ok == true { + return vali + } + case *telemetry.TelemetryField_Uint64Value: + vali, ok := value.(uint64) + if ok == true { + return vali + } + } //switch + return nil + //Xformation supported is only from String + case "float": + switch val := field.ValueByType.(type) { + case *telemetry.TelemetryField_StringValue: + if valf, err := strconv.ParseFloat(val.StringValue, 64); err == nil { + return valf + } + } //switch + return nil + case "string": + return xformValueString(field) + case "int64": + switch val := field.ValueByType.(type) { + case *telemetry.TelemetryField_StringValue: + if vali, err := strconv.ParseInt(val.StringValue, 10, 64); err == nil { + return vali + } + case *telemetry.TelemetryField_Uint64Value: + return int64(value.(uint64)) + } //switch + } //switch + return nil +} + +func (c *CiscoTelemetryMDT) initMemPhys() { + c.nxpathMap["show processes memory physical"] = map[string]string{"processname": "string"} +} + +func (c *CiscoTelemetryMDT) initBgpV4() { + key := "show bgp ipv4 unicast" + c.nxpathMap[key] = make(map[string]string, 1) + c.nxpathMap[key]["aspath"] = "string" +} + +func (c *CiscoTelemetryMDT) initCpu() { + key := "show processes cpu" + c.nxpathMap[key] = make(map[string]string, 5) + c.nxpathMap[key]["kernel_percent"] = "float" + c.nxpathMap[key]["idle_percent"] = "float" + c.nxpathMap[key]["process"] = "string" + c.nxpathMap[key]["user_percent"] = "float" + c.nxpathMap[key]["onesec"] = "float" +} + +func (c *CiscoTelemetryMDT) initResources() { + key := "show system resources" + c.nxpathMap[key] = make(map[string]string, 20) + c.nxpathMap[key]["cpu_state_user"] = "float" + c.nxpathMap[key]["kernel"] = "float" + c.nxpathMap[key]["current_memory_status"] = "string" + c.nxpathMap[key]["load_avg_15min"] = "float" + c.nxpathMap[key]["idle"] = "float" + c.nxpathMap[key]["load_avg_1min"] = "float" + c.nxpathMap[key]["user"] = "float" + c.nxpathMap[key]["cpu_state_idle"] = "float" + c.nxpathMap[key]["load_avg_5min"] = "float" + c.nxpathMap[key]["cpu_state_kernel"] = "float" +} + +func (c *CiscoTelemetryMDT) initPower() { + key := "show environment power" + c.nxpathMap[key] = make(map[string]string, 100) + c.nxpathMap[key]["reserve_sup"] = "string" + c.nxpathMap[key]["det_volt"] = "string" + c.nxpathMap[key]["heatsink_temp"] = "string" + c.nxpathMap[key]["det_pintot"] = "string" + c.nxpathMap[key]["det_iinb"] = "string" + c.nxpathMap[key]["ps_input_current"] = "string" + c.nxpathMap[key]["modnum"] = "string" + c.nxpathMap[key]["trayfannum"] = "string" + c.nxpathMap[key]["modstatus_3k"] = "string" + c.nxpathMap[key]["fan2rpm"] = "string" + c.nxpathMap[key]["amps_alloced"] = "string" + c.nxpathMap[key]["all_inlets_connected"] = "string" + c.nxpathMap[key]["tot_pow_out_actual_draw"] = "string" + c.nxpathMap[key]["ps_redun_op_mode"] = "string" + c.nxpathMap[key]["curtemp"] = "string" + c.nxpathMap[key]["mod_model"] = "string" + c.nxpathMap[key]["fanmodel"] = "string" + c.nxpathMap[key]["ps_output_current"] = "string" + c.nxpathMap[key]["majthres"] = "string" + c.nxpathMap[key]["input_type"] = "string" + c.nxpathMap[key]["allocated"] = "string" + c.nxpathMap[key]["fanhwver"] = "string" + c.nxpathMap[key]["clkhwver"] = "string" + c.nxpathMap[key]["fannum"] = "string" + c.nxpathMap[key]["watts_requested"] = "string" + c.nxpathMap[key]["cumulative_power"] = "string" + c.nxpathMap[key]["tot_gridB_capacity"] = "string" + c.nxpathMap[key]["pow_used_by_mods"] = "string" + c.nxpathMap[key]["tot_pow_alloc_budgeted"] = "string" + c.nxpathMap[key]["psumod"] = "string" + c.nxpathMap[key]["ps_status_3k"] = "string" + c.nxpathMap[key]["temptype"] = "string" + c.nxpathMap[key]["regval"] = "string" + c.nxpathMap[key]["inlet_temp"] = "string" + c.nxpathMap[key]["det_cord"] = "string" + c.nxpathMap[key]["reserve_fan"] = "string" + c.nxpathMap[key]["det_pina"] = "string" + c.nxpathMap[key]["minthres"] = "string" + c.nxpathMap[key]["actual_draw"] = "string" + c.nxpathMap[key]["sensor"] = "string" + c.nxpathMap[key]["zone"] = "string" + c.nxpathMap[key]["det_iin"] = "string" + c.nxpathMap[key]["det_iout"] = "string" + c.nxpathMap[key]["det_vin"] = "string" + c.nxpathMap[key]["fan1rpm"] = "string" + c.nxpathMap[key]["tot_gridA_capacity"] = "string" + c.nxpathMap[key]["fanperc"] = "string" + c.nxpathMap[key]["det_pout"] = "string" + c.nxpathMap[key]["alarm_str"] = "string" + c.nxpathMap[key]["zonespeed"] = "string" + c.nxpathMap[key]["det_total_cap"] = "string" + c.nxpathMap[key]["reserve_xbar"] = "string" + c.nxpathMap[key]["det_vout"] = "string" + c.nxpathMap[key]["watts_alloced"] = "string" + c.nxpathMap[key]["ps_in_power"] = "string" + c.nxpathMap[key]["tot_pow_input_actual_draw"] = "string" + c.nxpathMap[key]["ps_output_voltage"] = "string" + c.nxpathMap[key]["det_name"] = "string" + c.nxpathMap[key]["tempmod"] = "string" + c.nxpathMap[key]["clockname"] = "string" + c.nxpathMap[key]["fanname"] = "string" + c.nxpathMap[key]["regnumstr"] = "string" + c.nxpathMap[key]["bitnumstr"] = "string" + c.nxpathMap[key]["ps_slot"] = "string" + c.nxpathMap[key]["actual_out"] = "string" + c.nxpathMap[key]["ps_input_voltage"] = "string" + c.nxpathMap[key]["psmodel"] = "string" + c.nxpathMap[key]["speed"] = "string" + c.nxpathMap[key]["clkmodel"] = "string" + c.nxpathMap[key]["ps_redun_mode_3k"] = "string" + c.nxpathMap[key]["tot_pow_capacity"] = "string" + c.nxpathMap[key]["amps"] = "string" + c.nxpathMap[key]["available_pow"] = "string" + c.nxpathMap[key]["reserve_supxbarfan"] = "string" + c.nxpathMap[key]["watts"] = "string" + c.nxpathMap[key]["det_pinb"] = "string" + c.nxpathMap[key]["det_vinb"] = "string" + c.nxpathMap[key]["ps_state"] = "string" + c.nxpathMap[key]["det_sw_alarm"] = "string" + c.nxpathMap[key]["regnum"] = "string" + c.nxpathMap[key]["amps_requested"] = "string" + c.nxpathMap[key]["fanrpm"] = "string" + c.nxpathMap[key]["actual_input"] = "string" + c.nxpathMap[key]["outlet_temp"] = "string" + c.nxpathMap[key]["tot_capa"] = "string" +} + +func (c *CiscoTelemetryMDT) initPtpCorrection() { + key := "show ptp corrections" + c.nxpathMap[key] = make(map[string]string, 20) + c.nxpathMap[key]["sup-time"] = "string" + c.nxpathMap[key]["correction-val"] = "int64" + c.nxpathMap[key]["ptp-header"] = "string" + c.nxpathMap[key]["intf-name"] = "string" + c.nxpathMap[key]["ptp-end"] = "string" +} + +func (c *CiscoTelemetryMDT) initTrans() { + key := "show interface transceiver details" + c.nxpathMap[key] = make(map[string]string, 100) + c.nxpathMap[key]["uncorrect_ber_alrm_hi"] = "string" + c.nxpathMap[key]["uncorrect_ber_cur_warn_lo"] = "string" + c.nxpathMap[key]["current_warn_lo"] = "float" + c.nxpathMap[key]["pre_fec_ber_max_alrm_hi"] = "string" + c.nxpathMap[key]["serialnum"] = "string" + c.nxpathMap[key]["pre_fec_ber_acc_warn_lo"] = "string" + c.nxpathMap[key]["pre_fec_ber_max_warn_lo"] = "string" + c.nxpathMap[key]["laser_temp_warn_hi"] = "float" + c.nxpathMap[key]["type"] = "string" + c.nxpathMap[key]["rx_pwr_0"] = "float" + c.nxpathMap[key]["rx_pwr_warn_hi"] = "float" + c.nxpathMap[key]["uncorrect_ber_warn_hi"] = "string" + c.nxpathMap[key]["qsfp_or_cfp"] = "string" + c.nxpathMap[key]["protocol_type"] = "string" + c.nxpathMap[key]["uncorrect_ber"] = "string" + c.nxpathMap[key]["uncorrect_ber_cur_alrm_hi"] = "string" + c.nxpathMap[key]["tec_current"] = "float" + c.nxpathMap[key]["pre_fec_ber"] = "string" + c.nxpathMap[key]["uncorrect_ber_max_warn_lo"] = "string" + c.nxpathMap[key]["uncorrect_ber_min"] = "string" + c.nxpathMap[key]["current_alrm_lo"] = "float" + c.nxpathMap[key]["uncorrect_ber_acc_warn_lo"] = "string" + c.nxpathMap[key]["snr_warn_lo"] = "float" + c.nxpathMap[key]["rev"] = "string" + c.nxpathMap[key]["laser_temp_alrm_lo"] = "float" + c.nxpathMap[key]["current"] = "float" + c.nxpathMap[key]["rx_pwr_1"] = "float" + c.nxpathMap[key]["tec_current_warn_hi"] = "float" + c.nxpathMap[key]["pre_fec_ber_cur_warn_lo"] = "string" + c.nxpathMap[key]["cisco_part_number"] = "string" + c.nxpathMap[key]["uncorrect_ber_acc_warn_hi"] = "string" + c.nxpathMap[key]["temp_warn_hi"] = "float" + c.nxpathMap[key]["laser_freq_warn_lo"] = "float" + c.nxpathMap[key]["uncorrect_ber_max_alrm_lo"] = "string" + c.nxpathMap[key]["snr_alrm_hi"] = "float" + c.nxpathMap[key]["pre_fec_ber_cur_alrm_lo"] = "string" + c.nxpathMap[key]["tx_pwr_alrm_hi"] = "float" + c.nxpathMap[key]["pre_fec_ber_min_warn_lo"] = "string" + c.nxpathMap[key]["pre_fec_ber_min_warn_hi"] = "string" + c.nxpathMap[key]["rx_pwr_alrm_hi"] = "float" + c.nxpathMap[key]["tec_current_warn_lo"] = "float" + c.nxpathMap[key]["uncorrect_ber_acc_alrm_hi"] = "string" + c.nxpathMap[key]["rx_pwr_4"] = "float" + c.nxpathMap[key]["uncorrect_ber_cur"] = "string" + c.nxpathMap[key]["pre_fec_ber_alrm_hi"] = "string" + c.nxpathMap[key]["rx_pwr_warn_lo"] = "float" + c.nxpathMap[key]["bit_encoding"] = "string" + c.nxpathMap[key]["pre_fec_ber_acc"] = "string" + c.nxpathMap[key]["sfp"] = "string" + c.nxpathMap[key]["pre_fec_ber_acc_alrm_hi"] = "string" + c.nxpathMap[key]["pre_fec_ber_min"] = "string" + c.nxpathMap[key]["current_warn_hi"] = "float" + c.nxpathMap[key]["pre_fec_ber_max_alrm_lo"] = "string" + c.nxpathMap[key]["uncorrect_ber_cur_warn_hi"] = "string" + c.nxpathMap[key]["current_alrm_hi"] = "float" + c.nxpathMap[key]["pre_fec_ber_acc_alrm_lo"] = "string" + c.nxpathMap[key]["snr_alrm_lo"] = "float" + c.nxpathMap[key]["uncorrect_ber_acc"] = "string" + c.nxpathMap[key]["tx_len"] = "string" + c.nxpathMap[key]["uncorrect_ber_alrm_lo"] = "string" + c.nxpathMap[key]["pre_fec_ber_alrm_lo"] = "string" + c.nxpathMap[key]["txcvr_type"] = "string" + c.nxpathMap[key]["tec_current_alrm_lo"] = "float" + c.nxpathMap[key]["volt_alrm_lo"] = "float" + c.nxpathMap[key]["temp_alrm_hi"] = "float" + c.nxpathMap[key]["uncorrect_ber_min_warn_lo"] = "string" + c.nxpathMap[key]["laser_freq"] = "float" + c.nxpathMap[key]["uncorrect_ber_min_warn_hi"] = "string" + c.nxpathMap[key]["uncorrect_ber_cur_alrm_lo"] = "string" + c.nxpathMap[key]["pre_fec_ber_max_warn_hi"] = "string" + c.nxpathMap[key]["name"] = "string" + c.nxpathMap[key]["fiber_type_byte0"] = "string" + c.nxpathMap[key]["laser_freq_alrm_lo"] = "float" + c.nxpathMap[key]["pre_fec_ber_cur_warn_hi"] = "string" + c.nxpathMap[key]["partnum"] = "string" + c.nxpathMap[key]["snr"] = "float" + c.nxpathMap[key]["volt_alrm_hi"] = "float" + c.nxpathMap[key]["connector_type"] = "string" + c.nxpathMap[key]["tx_medium"] = "string" + c.nxpathMap[key]["tx_pwr_warn_hi"] = "float" + c.nxpathMap[key]["cisco_vendor_id"] = "string" + c.nxpathMap[key]["cisco_ext_id"] = "string" + c.nxpathMap[key]["uncorrect_ber_max_warn_hi"] = "string" + c.nxpathMap[key]["pre_fec_ber_max"] = "string" + c.nxpathMap[key]["uncorrect_ber_min_alrm_hi"] = "string" + c.nxpathMap[key]["pre_fec_ber_warn_hi"] = "string" + c.nxpathMap[key]["tx_pwr_alrm_lo"] = "float" + c.nxpathMap[key]["uncorrect_ber_warn_lo"] = "string" + c.nxpathMap[key]["10gbe_code"] = "string" + c.nxpathMap[key]["cable_type"] = "string" + c.nxpathMap[key]["laser_freq_alrm_hi"] = "float" + c.nxpathMap[key]["rx_pwr_3"] = "float" + c.nxpathMap[key]["rx_pwr"] = "float" + c.nxpathMap[key]["volt_warn_hi"] = "float" + c.nxpathMap[key]["pre_fec_ber_cur_alrm_hi"] = "string" + c.nxpathMap[key]["temperature"] = "float" + c.nxpathMap[key]["voltage"] = "float" + c.nxpathMap[key]["tx_pwr"] = "float" + c.nxpathMap[key]["laser_temp_alrm_hi"] = "float" + c.nxpathMap[key]["tx_speeds"] = "string" + c.nxpathMap[key]["uncorrect_ber_min_alrm_lo"] = "string" + c.nxpathMap[key]["pre_fec_ber_min_alrm_hi"] = "string" + c.nxpathMap[key]["ciscoid"] = "string" + c.nxpathMap[key]["tx_pwr_warn_lo"] = "float" + c.nxpathMap[key]["cisco_product_id"] = "string" + c.nxpathMap[key]["info_not_available"] = "string" + c.nxpathMap[key]["laser_temp"] = "float" + c.nxpathMap[key]["pre_fec_ber_cur"] = "string" + c.nxpathMap[key]["fiber_type_byte1"] = "string" + c.nxpathMap[key]["tx_type"] = "string" + c.nxpathMap[key]["pre_fec_ber_min_alrm_lo"] = "string" + c.nxpathMap[key]["pre_fec_ber_warn_lo"] = "string" + c.nxpathMap[key]["temp_alrm_lo"] = "float" + c.nxpathMap[key]["volt_warn_lo"] = "float" + c.nxpathMap[key]["rx_pwr_alrm_lo"] = "float" + c.nxpathMap[key]["rx_pwr_2"] = "float" + c.nxpathMap[key]["tec_current_alrm_hi"] = "float" + c.nxpathMap[key]["uncorrect_ber_acc_alrm_lo"] = "string" + c.nxpathMap[key]["uncorrect_ber_max_alrm_hi"] = "string" + c.nxpathMap[key]["temp_warn_lo"] = "float" + c.nxpathMap[key]["snr_warn_hi"] = "float" + c.nxpathMap[key]["laser_temp_warn_lo"] = "float" + c.nxpathMap[key]["pre_fec_ber_acc_warn_hi"] = "string" + c.nxpathMap[key]["laser_freq_warn_hi"] = "float" + c.nxpathMap[key]["uncorrect_ber_max"] = "string" +} + +func (c *CiscoTelemetryMDT) initIgmp() { + key := "show ip igmp groups vrf all" + c.nxpathMap[key] = make(map[string]string, 20) + c.nxpathMap[key]["group-type"] = "string" + c.nxpathMap[key]["translate"] = "string" + c.nxpathMap[key]["sourceaddress"] = "string" + c.nxpathMap[key]["vrf-cntxt"] = "string" + c.nxpathMap[key]["expires"] = "string" + c.nxpathMap[key]["group-addr"] = "string" + c.nxpathMap[key]["uptime"] = "string" +} + +func (c *CiscoTelemetryMDT) initVrfAll() { + key := "show ip igmp interface vrf all" + c.nxpathMap[key] = make(map[string]string, 20) + c.nxpathMap[key]["if-name"] = "string" + c.nxpathMap[key]["static-group-map"] = "string" + c.nxpathMap[key]["rll"] = "string" + c.nxpathMap[key]["host-proxy"] = "string" + c.nxpathMap[key]["il"] = "string" + c.nxpathMap[key]["join-group-map"] = "string" + c.nxpathMap[key]["expires"] = "string" + c.nxpathMap[key]["host-proxy-group-map"] = "string" + c.nxpathMap[key]["next-query"] = "string" + c.nxpathMap[key]["q-ver"] = "string" + c.nxpathMap[key]["if-status"] = "string" + c.nxpathMap[key]["un-solicited"] = "string" + c.nxpathMap[key]["ip-sum"] = "string" +} + +func (c *CiscoTelemetryMDT) initIgmpSnoop() { + key := "show ip igmp snooping" + c.nxpathMap[key] = make(map[string]string, 20) + c.nxpathMap[key]["repsup"] = "string" + c.nxpathMap[key]["omf_enabled"] = "string" + c.nxpathMap[key]["v3repsup"] = "string" + c.nxpathMap[key]["grepsup"] = "string" + c.nxpathMap[key]["lkupmode"] = "string" + c.nxpathMap[key]["description"] = "string" + c.nxpathMap[key]["vlinklocalgrpsup"] = "string" + c.nxpathMap[key]["gv3repsup"] = "string" + c.nxpathMap[key]["reportfloodall"] = "string" + c.nxpathMap[key]["leavegroupaddress"] = "string" + c.nxpathMap[key]["enabled"] = "string" + c.nxpathMap[key]["omf"] = "string" + c.nxpathMap[key]["sq"] = "string" + c.nxpathMap[key]["sqr"] = "string" + c.nxpathMap[key]["eht"] = "string" + c.nxpathMap[key]["fl"] = "string" + c.nxpathMap[key]["reportfloodenable"] = "string" + c.nxpathMap[key]["snoop-on"] = "string" + c.nxpathMap[key]["glinklocalgrpsup"] = "string" +} + +func (c *CiscoTelemetryMDT) initIgmpSnoopGroups() { + key := "show ip igmp snooping groups" + c.nxpathMap[key] = make(map[string]string, 20) + c.nxpathMap[key]["src-uptime"] = "string" + c.nxpathMap[key]["source"] = "string" + c.nxpathMap[key]["dyn-if-name"] = "string" + c.nxpathMap[key]["raddr"] = "string" + c.nxpathMap[key]["old-host"] = "string" + c.nxpathMap[key]["snoop-enabled"] = "string" + c.nxpathMap[key]["expires"] = "string" + c.nxpathMap[key]["omf-enabled"] = "string" + c.nxpathMap[key]["uptime"] = "string" + c.nxpathMap[key]["src-expires"] = "string" + c.nxpathMap[key]["addr"] = "string" +} + +func (c *CiscoTelemetryMDT) initIgmpSnoopGroupDetails() { + key := "show ip igmp snooping groups detail" + c.nxpathMap[key] = make(map[string]string, 20) + c.nxpathMap[key]["src-uptime"] = "string" + c.nxpathMap[key]["source"] = "string" + c.nxpathMap[key]["dyn-if-name"] = "string" + c.nxpathMap[key]["raddr"] = "string" + c.nxpathMap[key]["old-host"] = "string" + c.nxpathMap[key]["snoop-enabled"] = "string" + c.nxpathMap[key]["expires"] = "string" + c.nxpathMap[key]["omf-enabled"] = "string" + c.nxpathMap[key]["uptime"] = "string" + c.nxpathMap[key]["src-expires"] = "string" + c.nxpathMap[key]["addr"] = "string" +} + +func (c *CiscoTelemetryMDT) initIgmpSnoopGroupsSumm() { + key := "show ip igmp snooping groups summary" + c.nxpathMap[key] = make(map[string]string, 20) + c.nxpathMap[key]["src-uptime"] = "string" + c.nxpathMap[key]["source"] = "string" + c.nxpathMap[key]["dyn-if-name"] = "string" + c.nxpathMap[key]["raddr"] = "string" + c.nxpathMap[key]["old-host"] = "string" + c.nxpathMap[key]["snoop-enabled"] = "string" + c.nxpathMap[key]["expires"] = "string" + c.nxpathMap[key]["omf-enabled"] = "string" + c.nxpathMap[key]["uptime"] = "string" + c.nxpathMap[key]["src-expires"] = "string" + c.nxpathMap[key]["addr"] = "string" +} + +func (c *CiscoTelemetryMDT) initMrouter() { + key := "show ip igmp snooping mrouter" + c.nxpathMap[key] = make(map[string]string, 20) + c.nxpathMap[key]["uptime"] = "string" + c.nxpathMap[key]["expires"] = "string" +} + +func (c *CiscoTelemetryMDT) initSnoopStats() { + key := "show ip igmp snooping statistics" + c.nxpathMap[key] = make(map[string]string, 20) + c.nxpathMap[key]["ut"] = "string" +} + +func (c *CiscoTelemetryMDT) initPimInterface() { + key := "show ip pim interface vrf all" + c.nxpathMap[key] = make(map[string]string, 20) + c.nxpathMap[key]["if-is-border"] = "string" + c.nxpathMap[key]["cached_if_status"] = "string" + c.nxpathMap[key]["genid"] = "string" + c.nxpathMap[key]["if-name"] = "string" + c.nxpathMap[key]["last-cleared"] = "string" + c.nxpathMap[key]["is-pim-vpc-svi"] = "string" + c.nxpathMap[key]["if-addr"] = "string" + c.nxpathMap[key]["is-pim-enabled"] = "string" + c.nxpathMap[key]["pim-dr-address"] = "string" + c.nxpathMap[key]["hello-timer"] = "string" + c.nxpathMap[key]["pim-bfd-enabled"] = "string" + c.nxpathMap[key]["vpc-peer-nbr"] = "string" + c.nxpathMap[key]["nbr-policy-name"] = "string" + c.nxpathMap[key]["is-auto-enabled"] = "string" + c.nxpathMap[key]["if-status"] = "string" + c.nxpathMap[key]["jp-out-policy-name"] = "string" + c.nxpathMap[key]["if-addr-summary"] = "string" + c.nxpathMap[key]["if-dr"] = "string" + c.nxpathMap[key]["jp-in-policy-name"] = "string" +} + +func (c *CiscoTelemetryMDT) initPimNeigh() { + key := "show ip pim neighbor vrf all" + c.nxpathMap[key] = make(map[string]string, 20) + c.nxpathMap[key]["longest-hello-intvl"] = "string" + c.nxpathMap[key]["if-name"] = "string" + c.nxpathMap[key]["uptime"] = "string" + c.nxpathMap[key]["expires"] = "string" + c.nxpathMap[key]["bfd-state"] = "string" +} + +func (c *CiscoTelemetryMDT) initPimRoute() { + key := "show ip pim route vrf all" + c.nxpathMap[key] = make(map[string]string, 20) + c.nxpathMap[key]["rpf-nbr-1"] = "string" + c.nxpathMap[key]["rpf-nbr-addr"] = "string" + c.nxpathMap[key]["register"] = "string" + c.nxpathMap[key]["sgexpire"] = "string" + c.nxpathMap[key]["oif-bf-str"] = "string" + c.nxpathMap[key]["mcast-addrs"] = "string" + c.nxpathMap[key]["rp-addr"] = "string" + c.nxpathMap[key]["immediate-bf-str"] = "string" + c.nxpathMap[key]["sgr-prune-list-bf-str"] = "string" + c.nxpathMap[key]["context-name"] = "string" + c.nxpathMap[key]["intf-name"] = "string" + c.nxpathMap[key]["immediate-timeout-bf-str"] = "string" + c.nxpathMap[key]["rp-local"] = "string" + c.nxpathMap[key]["sgrexpire"] = "string" + c.nxpathMap[key]["timeout-bf-str"] = "string" + c.nxpathMap[key]["timeleft"] = "string" +} + +func (c *CiscoTelemetryMDT) initPimRp() { + key := "show ip pim rp vrf all" + c.nxpathMap[key] = make(map[string]string, 20) + c.nxpathMap[key]["is-bsr-forward-only"] = "string" + c.nxpathMap[key]["is-rpaddr-local"] = "string" + c.nxpathMap[key]["bsr-expires"] = "string" + c.nxpathMap[key]["autorp-expire-time"] = "string" + c.nxpathMap[key]["rp-announce-policy-name"] = "string" + c.nxpathMap[key]["rp-cand-policy-name"] = "string" + c.nxpathMap[key]["is-autorp-forward-only"] = "string" + c.nxpathMap[key]["rp-uptime"] = "string" + c.nxpathMap[key]["rp-owner-flags"] = "string" + c.nxpathMap[key]["df-bits-recovered"] = "string" + c.nxpathMap[key]["bs-timer"] = "string" + c.nxpathMap[key]["rp-discovery-policy-name"] = "string" + c.nxpathMap[key]["arp-rp-addr"] = "string" + c.nxpathMap[key]["auto-rp-addr"] = "string" + c.nxpathMap[key]["autorp-expires"] = "string" + c.nxpathMap[key]["is-autorp-enabled"] = "string" + c.nxpathMap[key]["is-bsr-local"] = "string" + c.nxpathMap[key]["is-autorp-listen-only"] = "string" + c.nxpathMap[key]["autorp-dis-timer"] = "string" + c.nxpathMap[key]["bsr-rp-expires"] = "string" + c.nxpathMap[key]["static-rp-group-map"] = "string" + c.nxpathMap[key]["rp-source"] = "string" + c.nxpathMap[key]["autorp-cand-address"] = "string" + c.nxpathMap[key]["autorp-up-time"] = "string" + c.nxpathMap[key]["is-bsr-enabled"] = "string" + c.nxpathMap[key]["bsr-uptime"] = "string" + c.nxpathMap[key]["is-bsr-listen-only"] = "string" + c.nxpathMap[key]["rpf-nbr-address"] = "string" + c.nxpathMap[key]["is-rp-local"] = "string" + c.nxpathMap[key]["is-autorp-local"] = "string" + c.nxpathMap[key]["bsr-policy-name"] = "string" + c.nxpathMap[key]["grange-grp"] = "string" + c.nxpathMap[key]["rp-addr"] = "string" + c.nxpathMap[key]["anycast-rp-addr"] = "string" +} + +func (c *CiscoTelemetryMDT) initPimStats() { + key := "show ip pim statistics vrf all" + c.nxpathMap[key] = make(map[string]string, 1) + c.nxpathMap[key]["vrf-name"] = "string" +} + +func (c *CiscoTelemetryMDT) initIntfBrief() { + key := "show interface brief" + c.nxpathMap[key] = make(map[string]string, 2) + c.nxpathMap[key]["speed"] = "string" + c.nxpathMap[key]["vlan"] = "string" +} + +func (c *CiscoTelemetryMDT) initPimVrf() { + key := "show ip pim vrf all" + c.nxpathMap[key] = make(map[string]string, 1) + c.nxpathMap[key]["table-id"] = "string" +} + +func (c *CiscoTelemetryMDT) initIpMroute() { + key := "show ip mroute summary vrf all" + c.nxpathMap[key] = make(map[string]string, 40) + c.nxpathMap[key]["nat-mode"] = "string" + c.nxpathMap[key]["oif-name"] = "string" + c.nxpathMap[key]["nat-route-type"] = "string" + c.nxpathMap[key]["uptime"] = "string" + c.nxpathMap[key]["mofrr-nbr"] = "string" + c.nxpathMap[key]["extranet_addr"] = "string" + c.nxpathMap[key]["stale-route"] = "string" + c.nxpathMap[key]["pending"] = "string" + c.nxpathMap[key]["bidir"] = "string" + c.nxpathMap[key]["expry_timer"] = "string" + c.nxpathMap[key]["mofrr-iif"] = "string" + c.nxpathMap[key]["group_addrs"] = "string" + c.nxpathMap[key]["mpib-name"] = "string" + c.nxpathMap[key]["rpf"] = "string" + c.nxpathMap[key]["mcast-addrs"] = "string" + c.nxpathMap[key]["route-mdt-iod"] = "string" + c.nxpathMap[key]["sr-oif"] = "string" + c.nxpathMap[key]["stats-rate-buf"] = "string" + c.nxpathMap[key]["source_addr"] = "string" + c.nxpathMap[key]["route-iif"] = "string" + c.nxpathMap[key]["rpf-nbr"] = "string" + c.nxpathMap[key]["translated-route-src"] = "string" + c.nxpathMap[key]["group_addr"] = "string" + c.nxpathMap[key]["lisp-src-rloc"] = "string" + c.nxpathMap[key]["stats-pndg"] = "string" + c.nxpathMap[key]["rate_buf"] = "string" + c.nxpathMap[key]["extranet_vrf_name"] = "string" + c.nxpathMap[key]["fabric-interest"] = "string" + c.nxpathMap[key]["translated-route-grp"] = "string" + c.nxpathMap[key]["internal"] = "string" + c.nxpathMap[key]["oif-mpib-name"] = "string" + c.nxpathMap[key]["oif-uptime"] = "string" + c.nxpathMap[key]["omd-vpc-svi"] = "string" + c.nxpathMap[key]["source_addrs"] = "string" + c.nxpathMap[key]["stale-oif"] = "string" + c.nxpathMap[key]["core-interest"] = "string" + c.nxpathMap[key]["oif-list-bitfield"] = "string" +} + +func (c *CiscoTelemetryMDT) initIpv6Mroute() { + key := "show ipv6 mroute summary vrf all" + c.nxpathMap[key] = make(map[string]string, 40) + c.nxpathMap[key]["nat-mode"] = "string" + c.nxpathMap[key]["oif-name"] = "string" + c.nxpathMap[key]["nat-route-type"] = "string" + c.nxpathMap[key]["uptime"] = "string" + c.nxpathMap[key]["mofrr-nbr"] = "string" + c.nxpathMap[key]["extranet_addr"] = "string" + c.nxpathMap[key]["stale-route"] = "string" + c.nxpathMap[key]["pending"] = "string" + c.nxpathMap[key]["bidir"] = "string" + c.nxpathMap[key]["expry_timer"] = "string" + c.nxpathMap[key]["mofrr-iif"] = "string" + c.nxpathMap[key]["group_addrs"] = "string" + c.nxpathMap[key]["mpib-name"] = "string" + c.nxpathMap[key]["rpf"] = "string" + c.nxpathMap[key]["mcast-addrs"] = "string" + c.nxpathMap[key]["route-mdt-iod"] = "string" + c.nxpathMap[key]["sr-oif"] = "string" + c.nxpathMap[key]["stats-rate-buf"] = "string" + c.nxpathMap[key]["source_addr"] = "string" + c.nxpathMap[key]["route-iif"] = "string" + c.nxpathMap[key]["rpf-nbr"] = "string" + c.nxpathMap[key]["translated-route-src"] = "string" + c.nxpathMap[key]["group_addr"] = "string" + c.nxpathMap[key]["lisp-src-rloc"] = "string" + c.nxpathMap[key]["stats-pndg"] = "string" + c.nxpathMap[key]["rate_buf"] = "string" + c.nxpathMap[key]["extranet_vrf_name"] = "string" + c.nxpathMap[key]["fabric-interest"] = "string" + c.nxpathMap[key]["translated-route-grp"] = "string" + c.nxpathMap[key]["internal"] = "string" + c.nxpathMap[key]["oif-mpib-name"] = "string" + c.nxpathMap[key]["oif-uptime"] = "string" + c.nxpathMap[key]["omd-vpc-svi"] = "string" + c.nxpathMap[key]["source_addrs"] = "string" + c.nxpathMap[key]["stale-oif"] = "string" + c.nxpathMap[key]["core-interest"] = "string" + c.nxpathMap[key]["oif-list-bitfield"] = "string" +} + +func (c *CiscoTelemetryMDT) initVpc() { + key := "sys/vpc" + c.nxpathMap[key] = make(map[string]string, 5) + c.nxpathMap[key]["type2CompatQualStr"] = "string" + c.nxpathMap[key]["compatQualStr"] = "string" + c.nxpathMap[key]["name"] = "string" + c.nxpathMap[key]["issuFromVer"] = "string" + c.nxpathMap[key]["issuToVer"] = "string" +} + +func (c *CiscoTelemetryMDT) initBgp() { + key := "sys/bgp" + c.nxpathMap[key] = make(map[string]string, 18) + c.nxpathMap[key]["dynRtMap"] = "string" + c.nxpathMap[key]["nhRtMap"] = "string" + c.nxpathMap[key]["epePeerSet"] = "string" + c.nxpathMap[key]["asn"] = "string" + c.nxpathMap[key]["peerImp"] = "string" + c.nxpathMap[key]["wght"] = "string" + c.nxpathMap[key]["assocDom"] = "string" + c.nxpathMap[key]["tblMap"] = "string" + c.nxpathMap[key]["unSupprMap"] = "string" + c.nxpathMap[key]["sessionContImp"] = "string" + c.nxpathMap[key]["allocLblRtMap"] = "string" + c.nxpathMap[key]["defMetric"] = "string" + c.nxpathMap[key]["password"] = "string" + c.nxpathMap[key]["retainRttRtMap"] = "string" + c.nxpathMap[key]["clusterId"] = "string" + c.nxpathMap[key]["localAsn"] = "string" + c.nxpathMap[key]["name"] = "string" + c.nxpathMap[key]["defOrgRtMap"] = "string" +} + +func (c *CiscoTelemetryMDT) initCh() { + key := "sys/ch" + c.nxpathMap[key] = make(map[string]string, 10) + c.nxpathMap[key]["fanName"] = "string" + c.nxpathMap[key]["typeCordConnected"] = "string" + c.nxpathMap[key]["vendor"] = "string" + c.nxpathMap[key]["model"] = "string" + c.nxpathMap[key]["rev"] = "string" + c.nxpathMap[key]["vdrId"] = "string" + c.nxpathMap[key]["hardwareAlarm"] = "string" + c.nxpathMap[key]["unit"] = "string" + c.nxpathMap[key]["hwVer"] = "string" +} + +func (c *CiscoTelemetryMDT) initIntf() { + key := "sys/intf" + c.nxpathMap[key] = make(map[string]string, 10) + c.nxpathMap[key]["descr"] = "string" + c.nxpathMap[key]["name"] = "string" + c.nxpathMap[key]["lastStCause"] = "string" + c.nxpathMap[key]["description"] = "string" + c.nxpathMap[key]["unit"] = "string" + c.nxpathMap[key]["operFECMode"] = "string" + c.nxpathMap[key]["operBitset"] = "string" + c.nxpathMap[key]["mdix"] = "string" +} + +func (c *CiscoTelemetryMDT) initProcsys() { + key := "sys/procsys" + c.nxpathMap[key] = make(map[string]string, 10) + c.nxpathMap[key]["name"] = "string" + c.nxpathMap[key]["id"] = "string" + c.nxpathMap[key]["upTs"] = "string" + c.nxpathMap[key]["interval"] = "string" + c.nxpathMap[key]["memstatus"] = "string" +} + +func (c *CiscoTelemetryMDT) initProc() { + key := "sys/proc" + c.nxpathMap[key] = make(map[string]string, 2) + c.nxpathMap[key]["processName"] = "string" + c.nxpathMap[key]["procArg"] = "string" +} + +func (c *CiscoTelemetryMDT) initBfd() { + key := "sys/bfd/inst" + c.nxpathMap[key] = make(map[string]string, 4) + c.nxpathMap[key]["descr"] = "string" + c.nxpathMap[key]["vrfName"] = "string" + c.nxpathMap[key]["name"] = "string" + c.nxpathMap[key]["name"] = "string" +} + +func (c *CiscoTelemetryMDT) initLldp() { + key := "sys/lldp" + c.nxpathMap[key] = make(map[string]string, 7) + c.nxpathMap[key]["sysDesc"] = "string" + c.nxpathMap[key]["portDesc"] = "string" + c.nxpathMap[key]["portIdV"] = "string" + c.nxpathMap[key]["chassisIdV"] = "string" + c.nxpathMap[key]["sysName"] = "string" + c.nxpathMap[key]["name"] = "string" + c.nxpathMap[key]["id"] = "string" +} + +func (c *CiscoTelemetryMDT) initDb() { + c.nxpathMap = make(map[string]map[string]string, 200) + + c.initPower() + c.initMemPhys() + c.initBgpV4() + c.initCpu() + c.initResources() + c.initPtpCorrection() + c.initTrans() + c.initIgmp() + c.initVrfAll() + c.initIgmpSnoop() + c.initIgmpSnoopGroups() + c.initIgmpSnoopGroupDetails() + c.initIgmpSnoopGroupsSumm() + c.initMrouter() + c.initSnoopStats() + c.initPimInterface() + c.initPimNeigh() + c.initPimRoute() + c.initPimRp() + c.initPimStats() + c.initIntfBrief() + c.initPimVrf() + c.initIpMroute() + c.initIpv6Mroute() + c.initVpc() + c.initBgp() + c.initCh() + c.initIntf() + c.initProcsys() + c.initProc() + c.initBfd() + c.initLldp() +}