From cec60dbfa98cfe0c1caba005cda8f234678d9291 Mon Sep 17 00:00:00 2001 From: Sven Rebhan <36194019+srebhan@users.noreply.github.com> Date: Thu, 6 Jul 2023 11:20:11 +0200 Subject: [PATCH] fix(inputs.gnmi): Add option to explicitly trim field-names (#13517) --- plugins/inputs/gnmi/README.md | 3 + plugins/inputs/gnmi/gnmi.go | 2 + plugins/inputs/gnmi/handler.go | 5 +- plugins/inputs/gnmi/sample.conf | 3 + .../canonical_field_names/expected.out | 2 +- .../canonical_field_names_trim/expected.out | 1 + .../canonical_field_names_trim/responses.json | 79 +++++++++++++++++++ .../canonical_field_names_trim/telegraf.conf | 24 ++++++ .../gnmi/testcases/issue_13512/expected.out | 1 + .../gnmi/testcases/issue_13512/responses.json | 79 +++++++++++++++++++ .../gnmi/testcases/issue_13512/telegraf.conf | 22 ++++++ 11 files changed, 219 insertions(+), 2 deletions(-) create mode 100644 plugins/inputs/gnmi/testcases/canonical_field_names_trim/expected.out create mode 100644 plugins/inputs/gnmi/testcases/canonical_field_names_trim/responses.json create mode 100644 plugins/inputs/gnmi/testcases/canonical_field_names_trim/telegraf.conf create mode 100644 plugins/inputs/gnmi/testcases/issue_13512/expected.out create mode 100644 plugins/inputs/gnmi/testcases/issue_13512/responses.json create mode 100644 plugins/inputs/gnmi/testcases/issue_13512/telegraf.conf diff --git a/plugins/inputs/gnmi/README.md b/plugins/inputs/gnmi/README.md index 982a5a70d..90082287d 100644 --- a/plugins/inputs/gnmi/README.md +++ b/plugins/inputs/gnmi/README.md @@ -55,6 +55,9 @@ See the [CONFIGURATION.md][CONFIGURATION.md] for more details. ## Enable to get the canonical path as field-name # canonical_field_names = false + ## Remove leading slashes and dots in field-name + # trim_field_names = false + ## enable client-side TLS and define CA to authenticate the device # enable_tls = false # tls_ca = "/etc/telegraf/ca.pem" diff --git a/plugins/inputs/gnmi/gnmi.go b/plugins/inputs/gnmi/gnmi.go index d5a28a792..52f4d600b 100644 --- a/plugins/inputs/gnmi/gnmi.go +++ b/plugins/inputs/gnmi/gnmi.go @@ -57,6 +57,7 @@ type GNMI struct { MaxMsgSize config.Size `toml:"max_msg_size"` Trace bool `toml:"dump_responses"` CanonicalFieldNames bool `toml:"canonical_field_names"` + TrimFieldNames bool `toml:"trim_field_names"` EnableTLS bool `toml:"enable_tls" deprecated:"1.27.0;use 'tls_enable' instead"` Log telegraf.Logger `toml:"-"` internaltls.ClientConfig @@ -222,6 +223,7 @@ func (c *GNMI) Start(acc telegraf.Accumulator) error { tagStore: newTagStore(c.TagSubscriptions), trace: c.Trace, canonicalFieldNames: c.CanonicalFieldNames, + trimSlash: c.TrimFieldNames, log: c.Log, } for ctx.Err() == nil { diff --git a/plugins/inputs/gnmi/handler.go b/plugins/inputs/gnmi/handler.go index 49d73b095..e835c7cc4 100644 --- a/plugins/inputs/gnmi/handler.go +++ b/plugins/inputs/gnmi/handler.go @@ -37,6 +37,7 @@ type handler struct { tagStore *tagStore trace bool canonicalFieldNames bool + trimSlash bool log telegraf.Logger } @@ -254,7 +255,9 @@ func (h *handler) handleSubscribeResponseUpdate(acc telegraf.Accumulator, respon key = path.Base(key) } } - key = strings.TrimLeft(key, "/.") + if h.trimSlash { + key = strings.TrimLeft(key, "/.") + } if key == "" { h.log.Errorf("invalid empty path: %q", k) continue diff --git a/plugins/inputs/gnmi/sample.conf b/plugins/inputs/gnmi/sample.conf index f5a5e6b96..599ea0989 100644 --- a/plugins/inputs/gnmi/sample.conf +++ b/plugins/inputs/gnmi/sample.conf @@ -19,6 +19,9 @@ ## Enable to get the canonical path as field-name # canonical_field_names = false + ## Remove leading slashes and dots in field-name + # trim_field_names = false + ## enable client-side TLS and define CA to authenticate the device # enable_tls = false # tls_ca = "/etc/telegraf/ca.pem" diff --git a/plugins/inputs/gnmi/testcases/canonical_field_names/expected.out b/plugins/inputs/gnmi/testcases/canonical_field_names/expected.out index 31a6219b4..ddf715d06 100644 --- a/plugins/inputs/gnmi/testcases/canonical_field_names/expected.out +++ b/plugins/inputs/gnmi/testcases/canonical_field_names/expected.out @@ -1 +1 @@ -interfaces,name=eth42,path=openconfig-interfaces:/interfaces/interface,source=127.0.0.1 interfaces/interface/descr="eth42",interfaces/interface/config/id=42425u,interfaces/interface/state/in_pkts=5678u,interfaces/interface/state/out_pkts=5125u 1673608605875353770 \ No newline at end of file +interfaces,name=eth42,path=openconfig-interfaces:/interfaces/interface,source=127.0.0.1 /interfaces/interface/descr="eth42",/interfaces/interface/config/id=42425u,/interfaces/interface/state/in_pkts=5678u,/interfaces/interface/state/out_pkts=5125u 1673608605875353770 \ No newline at end of file diff --git a/plugins/inputs/gnmi/testcases/canonical_field_names_trim/expected.out b/plugins/inputs/gnmi/testcases/canonical_field_names_trim/expected.out new file mode 100644 index 000000000..31a6219b4 --- /dev/null +++ b/plugins/inputs/gnmi/testcases/canonical_field_names_trim/expected.out @@ -0,0 +1 @@ +interfaces,name=eth42,path=openconfig-interfaces:/interfaces/interface,source=127.0.0.1 interfaces/interface/descr="eth42",interfaces/interface/config/id=42425u,interfaces/interface/state/in_pkts=5678u,interfaces/interface/state/out_pkts=5125u 1673608605875353770 \ No newline at end of file diff --git a/plugins/inputs/gnmi/testcases/canonical_field_names_trim/responses.json b/plugins/inputs/gnmi/testcases/canonical_field_names_trim/responses.json new file mode 100644 index 000000000..c7262722a --- /dev/null +++ b/plugins/inputs/gnmi/testcases/canonical_field_names_trim/responses.json @@ -0,0 +1,79 @@ +[ + { + "update": { + "timestamp": "1673608605875353770", + "prefix": { + "origin": "openconfig-interfaces", + "elem": [ + { + "name": "interfaces" + }, + { + "name": "interface", + "key":{"name":"eth42"} + } + ], + "target": "subscription" + }, + "update": [ + { + "path": { + "elem": [ + { + "name": "descr" + } + ] + }, + "val": { + "stringVal": "eth42" + } + }, + { + "path": { + "elem": [ + { + "name": "config" + }, + { + "name": "id" + } + ] + }, + "val": { + "uintVal": "42425" + } + }, + { + "path": { + "elem": [ + { + "name": "state" + }, + { + "name": "in-pkts" + } + ] + }, + "val": { + "uintVal": "5678" + } + }, + { + "path": { + "elem": [ + { + "name": "state" + }, + { + "name": "out-pkts" + } + ] + }, + "val": { + "uintVal": "5125" + } + } + ] + } + } +] \ No newline at end of file diff --git a/plugins/inputs/gnmi/testcases/canonical_field_names_trim/telegraf.conf b/plugins/inputs/gnmi/testcases/canonical_field_names_trim/telegraf.conf new file mode 100644 index 000000000..febbf7dd8 --- /dev/null +++ b/plugins/inputs/gnmi/testcases/canonical_field_names_trim/telegraf.conf @@ -0,0 +1,24 @@ +[[inputs.gnmi]] + addresses = ["dummy"] + name_override = "gnmi" + redial = "10s" + canonical_field_names = true + trim_field_names = true + [[inputs.gnmi.subscription]] + name = "interfaces" + origin = "openconfig-interfaces" + path = "/interfaces/interface/descr" + subscription_mode = "sample" + sample_interval = "10s" + [[inputs.gnmi.subscription]] + name = "interfaces" + origin = "openconfig-interfaces" + path = "/interfaces/interface/config/id" + subscription_mode = "sample" + sample_interval = "10s" + [[inputs.gnmi.subscription]] + name = "interfaces" + origin = "openconfig-interfaces" + path = "/interfaces/interface/state" + subscription_mode = "sample" + sample_interval = "10s" diff --git a/plugins/inputs/gnmi/testcases/issue_13512/expected.out b/plugins/inputs/gnmi/testcases/issue_13512/expected.out new file mode 100644 index 000000000..c99ef345c --- /dev/null +++ b/plugins/inputs/gnmi/testcases/issue_13512/expected.out @@ -0,0 +1 @@ +interfaces,name=eth42,path=openconfig-interfaces:/interfaces/interface,source=127.0.0.1 descr="eth42",id=42425u,in_pkts=5678u,out_pkts=5125u 1673608605875353770 \ No newline at end of file diff --git a/plugins/inputs/gnmi/testcases/issue_13512/responses.json b/plugins/inputs/gnmi/testcases/issue_13512/responses.json new file mode 100644 index 000000000..c7262722a --- /dev/null +++ b/plugins/inputs/gnmi/testcases/issue_13512/responses.json @@ -0,0 +1,79 @@ +[ + { + "update": { + "timestamp": "1673608605875353770", + "prefix": { + "origin": "openconfig-interfaces", + "elem": [ + { + "name": "interfaces" + }, + { + "name": "interface", + "key":{"name":"eth42"} + } + ], + "target": "subscription" + }, + "update": [ + { + "path": { + "elem": [ + { + "name": "descr" + } + ] + }, + "val": { + "stringVal": "eth42" + } + }, + { + "path": { + "elem": [ + { + "name": "config" + }, + { + "name": "id" + } + ] + }, + "val": { + "uintVal": "42425" + } + }, + { + "path": { + "elem": [ + { + "name": "state" + }, + { + "name": "in-pkts" + } + ] + }, + "val": { + "uintVal": "5678" + } + }, + { + "path": { + "elem": [ + { + "name": "state" + }, + { + "name": "out-pkts" + } + ] + }, + "val": { + "uintVal": "5125" + } + } + ] + } + } +] \ No newline at end of file diff --git a/plugins/inputs/gnmi/testcases/issue_13512/telegraf.conf b/plugins/inputs/gnmi/testcases/issue_13512/telegraf.conf new file mode 100644 index 000000000..617acd7f8 --- /dev/null +++ b/plugins/inputs/gnmi/testcases/issue_13512/telegraf.conf @@ -0,0 +1,22 @@ +[[inputs.gnmi]] + addresses = ["dummy"] + name_override = "gnmi" + redial = "10s" + [[inputs.gnmi.subscription]] + name = "interfaces" + origin = "openconfig-interfaces" + path = "/interfaces/interface/descr" + subscription_mode = "sample" + sample_interval = "10s" + [[inputs.gnmi.subscription]] + name = "interfaces" + origin = "openconfig-interfaces" + path = "/interfaces/interface/config/id" + subscription_mode = "sample" + sample_interval = "10s" + [[inputs.gnmi.subscription]] + name = "interfaces" + origin = "openconfig-interfaces" + path = "/interfaces/interface/state" + subscription_mode = "sample" + sample_interval = "10s"