diff options
author | Ilya Mashchenko <ilya@netdata.cloud> | 2024-03-14 13:04:25 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-03-14 13:04:25 +0200 |
commit | d5384db76074f6344a6fa9396f22393e3b0f420a (patch) | |
tree | b1ddcb9e6a21f717c929154bdda16dcb883aaaaa | |
parent | b7ff918d9161de68ef37e94e9845a81beba64b9a (diff) |
go.d.plugin: sd compose: allow multi config template (#17157)
3 files changed, 49 insertions, 9 deletions
diff --git a/src/go/collectors/go.d.plugin/agent/discovery/sd/pipeline/compose.go b/src/go/collectors/go.d.plugin/agent/discovery/sd/pipeline/compose.go index 68274ab182..de2ed21b8f 100644 --- a/src/go/collectors/go.d.plugin/agent/discovery/sd/pipeline/compose.go +++ b/src/go/collectors/go.d.plugin/agent/discovery/sd/pipeline/compose.go @@ -4,6 +4,7 @@ package pipeline import ( "bytes" + "errors" "fmt" "text/template" @@ -70,14 +71,13 @@ func (c *configComposer) compose(tgt model.Target) []confgroup.Config { continue } - var cfg confgroup.Config - - if err := yaml.Unmarshal(c.buf.Bytes(), &cfg); err != nil { - c.Warningf("failed on yaml unmarshalling: %v", err) + cfgs, err := c.parseTemplateData(c.buf.Bytes()) + if err != nil { + c.Warningf("failed to parse template data: %v", err) continue } - configs = append(configs, cfg) + configs = append(configs, cfgs...) } } @@ -87,6 +87,35 @@ func (c *configComposer) compose(tgt model.Target) []confgroup.Config { return configs } +func (c *configComposer) parseTemplateData(bs []byte) ([]confgroup.Config, error) { + var data any + if err := yaml.Unmarshal(bs, &data); err != nil { + return nil, err + } + + type ( + single = map[any]any + multi = []any + ) + + switch data.(type) { + case single: + var cfg confgroup.Config + if err := yaml.Unmarshal(bs, &cfg); err != nil { + return nil, err + } + return []confgroup.Config{cfg}, nil + case multi: + var cfgs []confgroup.Config + if err := yaml.Unmarshal(bs, &cfgs); err != nil { + return nil, err + } + return cfgs, nil + default: + return nil, errors.New("unknown config format") + } +} + func newComposeRules(cfg []ComposeRuleConfig) ([]*composeRule, error) { var rules []*composeRule diff --git a/src/go/collectors/go.d.plugin/agent/discovery/sd/pipeline/compose_test.go b/src/go/collectors/go.d.plugin/agent/discovery/sd/pipeline/compose_test.go index ccbb072bf7..fa758bcd32 100644 --- a/src/go/collectors/go.d.plugin/agent/discovery/sd/pipeline/compose_test.go +++ b/src/go/collectors/go.d.plugin/agent/discovery/sd/pipeline/compose_test.go @@ -38,7 +38,8 @@ func TestConfigComposer_compose(t *testing.T) { name: {{ .Name }}-5 - selector: "bar6" template: | - name: {{ .Name }}-6 + - name: {{ .Name }}-6 + - name: {{ .Name }}-7 ` tests := map[string]struct { target model.Target @@ -70,6 +71,7 @@ func TestConfigComposer_compose(t *testing.T) { {"name": "mock-4"}, {"name": "mock-5"}, {"name": "mock-6"}, + {"name": "mock-7"}, }, }, } diff --git a/src/go/collectors/go.d.plugin/config/go.d/sd/net_listeners.conf b/src/go/collectors/go.d.plugin/config/go.d/sd/net_listeners.conf index 80a97ebde9..fdd54d72e0 100644 --- a/src/go/collectors/go.d.plugin/config/go.d/sd/net_listeners.conf +++ b/src/go/collectors/go.d.plugin/config/go.d/sd/net_listeners.conf @@ -278,9 +278,18 @@ compose: dsn: netdata@tcp(127.0.0.1:{{.Port}})/ - selector: "nginx" template: | - module: nginx - name: local - url: http://localhost:{{.Port}}/stub_status + - module: nginx + name: local + url: http://localhost:{{.Port}}/stub_status + - module: nginx + name: local + url: http://localhost:{{.Port}}/basic_status + - module: nginx + name: local + url: http://localhost:{{.Port}}/nginx_status + - module: nginx + name: local + url: http://localhost:{{.Port}}/status - selector: "ntpd" template: | module: ntpd |