fix(inputs.cisco_telemetry_mdt): Fix MDT source field overwrite (#13693)

This commit is contained in:
Matt Schmitz 2023-07-31 15:26:22 -04:00 committed by GitHub
parent c2956acc69
commit 66dc5ce940
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 67 additions and 6 deletions

View File

@ -62,6 +62,9 @@ See the [CONFIGURATION.md][CONFIGURATION.md] for more details.
## Include the delete field in every telemetry message.
# include_delete_field = false
## Specify custom name for incoming MDT source field.
# source_field_name = "mdt_source"
## Define aliases to map telemetry encoding paths to simple measurement names
[inputs.cisco_telemetry_mdt.aliases]
ifstats = "ietf-interfaces:interfaces-state/interface/statistics"

View File

@ -60,6 +60,7 @@ type CiscoTelemetryMDT struct {
EmbeddedTags []string `toml:"embedded_tags"`
EnforcementPolicy GRPCEnforcementPolicy `toml:"grpc_enforcement_policy"`
IncludeDeleteField bool `toml:"include_delete_field"`
SourceFieldName string `toml:"source_field_name"`
Log telegraf.Logger
@ -397,6 +398,10 @@ func (c *CiscoTelemetryMDT) handleTelemetry(data []byte) {
for _, subfield := range keys.Fields {
c.parseKeyField(tags, subfield, "")
}
// If incoming MDT contains source key, copy to mdt_src
if _, ok := tags["source"]; ok {
tags[c.SourceFieldName] = tags["source"]
}
} else {
tags = make(map[string]string, 3)
}
@ -746,6 +751,7 @@ func init() {
return &CiscoTelemetryMDT{
Transport: "grpc",
ServiceAddress: "127.0.0.1:57000",
SourceFieldName: "mdt_source",
}
})
}

View File

@ -983,3 +983,52 @@ func TestGRPCDialoutKeepalive(t *testing.T) {
c.Stop()
require.NoError(t, conn.Close())
}
func TestSourceFieldRewrite(t *testing.T) {
c := &CiscoTelemetryMDT{Log: testutil.Logger{}, Transport: "dummy", Aliases: map[string]string{"alias": "type:model/some/path"}}
c.SourceFieldName = "mdt_source"
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: "type:model/some/path",
NodeId: &telemetryBis.Telemetry_NodeIdStr{NodeIdStr: "hostname"},
Subscription: &telemetryBis.Telemetry_SubscriptionIdStr{SubscriptionIdStr: "subscription"},
DataGpbkv: []*telemetryBis.TelemetryField{
{
Fields: []*telemetryBis.TelemetryField{
{
Name: "keys",
Fields: []*telemetryBis.TelemetryField{
{
Name: "source",
ValueByType: &telemetryBis.TelemetryField_StringValue{StringValue: "str"},
},
},
},
{
Name: "content",
Fields: []*telemetryBis.TelemetryField{
{
Name: "bool",
ValueByType: &telemetryBis.TelemetryField_BoolValue{BoolValue: false},
},
},
},
},
},
},
}
data, err := proto.Marshal(telemetry)
require.NoError(t, err)
c.handleTelemetry(data)
require.Empty(t, acc.Errors)
tags := map[string]string{"path": "type:model/some/path", "mdt_source": "str", "source": "hostname", "subscription": "subscription"}
fields := map[string]interface{}{"bool": false}
acc.AssertContainsTaggedFields(t, "alias", fields, tags)
}

View File

@ -25,6 +25,9 @@
## Include the delete field in every telemetry message.
# include_delete_field = false
## Specify custom name for incoming MDT source field.
# source_field_name = "mdt_source"
## Define aliases to map telemetry encoding paths to simple measurement names
[inputs.cisco_telemetry_mdt.aliases]
ifstats = "ietf-interfaces:interfaces-state/interface/statistics"