@cryptotaxi247 / netdata-1 / commits / f67009e2c

feat(go.d.plugin): enable dyncfg vnodes (#19238)

* enable dyncfg vnodes * improve dyncfg vnodes funcs

Ilya Mashchenko committed Dec 17, 2024 at 14:18 UTC f67009e2c795bf40154ad19e98eac2af516d4aa8
3 files changed +43 -20
src/go/plugin/go.d/agent/jobmgr/dyncfg_vnode.go
+37 -14
@@ -141,15 +141,25 @@ func (m *Manager) dyncfgVnodeAdd(fn functions.Function) {
141
142 dyncfgUpdateVnodeConfig(cfg, name)
143
144 - m.Vnodes[name] = cfg
144 + if err := m.verifyVnodeUnique(cfg); err != nil {
145 + m.Warningf("dyncfg: add: vnode job %s: %v", name, err)
146 + m.dyncfgRespf(fn, 400, "Failed to create configuration from payload: %v.", err)
147 + return
148 + }
149
146 - if orig, ok := m.Vnodes[name]; ok && !orig.Equal(cfg) {
147 - m.runningJobs.forEach(func(_ string, job *module.Job) {
148 - if job.Vnode().Name == name {
149 - job.UpdateVnode(cfg)
150 - }
151 - })
150 + if orig, ok := m.Vnodes[name]; ok && orig.Equal(cfg) {
151 + m.dyncfgRespf(fn, 202, "")
152 + m.dyncfgVnodeJobCreate(cfg, dyncfgRunning)
153 + return
154 }
155 +
156 + m.Vnodes[name] = cfg
157 +
158 + m.runningJobs.forEach(func(_ string, job *module.Job) {
159 + if job.Vnode().Name == name {
160 + job.UpdateVnode(cfg)
161 + }
162 + })
163 m.dyncfgRespf(fn, 202, "")
164 m.dyncfgVnodeJobCreate(cfg, dyncfgRunning)
165 }
@@ -205,11 +215,9 @@ func (m *Manager) dyncfgVnodeTest(fn functions.Function) {
215
216 dyncfgUpdateVnodeConfig(cfg, name)
217
208 - id := fn.Args[0]
209 - _, ok := m.Vnodes[name]
210 -
211 - if id == dyncfgVnodeID || !ok {
212 - m.dyncfgRespf(fn, 200, "")
218 + if err := m.verifyVnodeUnique(cfg); err != nil {
219 + m.Warningf("dyncfg: test: vnode job %s: %v", name, err)
220 + m.dyncfgRespf(fn, 400, "Failed to create configuration from payload: %v.", err)
221 return
222 }
223
@@ -263,7 +271,7 @@ func (m *Manager) dyncfgVnodeUpdate(fn functions.Function) {
271 }
272
273 func (m *Manager) dyncfgVnodeUserconfig(fn functions.Function) {
266 - bs, err := m.vnodeUserconfigFromPayload(fn)
274 + bs, err := vnodeUserconfigFromPayload(fn)
275 if err != nil {
276 m.Warningf("dyncfg: userconfig: vnode: failed to create config from payload: %v", err)
277 m.dyncfgRespf(fn, 400, "Invalid configuration format. Failed to create configuration from payload: %v.", err)
@@ -286,6 +294,21 @@ func (m *Manager) dyncfgVnodeAffectedJobs(vnode string) string {
294 return s.String()
295 }
296
297 +func (m *Manager) verifyVnodeUnique(newCfg *vnodes.VirtualNode) error {
298 + for _, cfg := range m.Vnodes {
299 + if cfg.Name == newCfg.Name {
300 + continue
301 + }
302 + if cfg.Hostname == newCfg.Hostname {
303 + return fmt.Errorf("duplicate virtual node name detected (job '%s')", cfg.Name)
304 + }
305 + if cfg.GUID == newCfg.GUID {
306 + return fmt.Errorf("duplicate virtual node guid detected (job '%s')", cfg.Name)
307 + }
308 + }
309 + return nil
310 +}
311 +
312 func dyncfgUpdateVnodeConfig(cfg *vnodes.VirtualNode, name string) {
313 cfg.Name = name
314 if cfg.Hostname == "" {
@@ -305,7 +328,7 @@ func vnodeConfigFromPayload(fn functions.Function) (*vnodes.VirtualNode, error)
328 return &cfg, nil
329 }
330
308 -func (m *Manager) vnodeUserconfigFromPayload(fn functions.Function) ([]byte, error) {
331 +func vnodeUserconfigFromPayload(fn functions.Function) ([]byte, error) {
332 cfg, err := vnodeConfigFromPayload(fn)
333 if err != nil {
334 return nil, err
src/go/plugin/go.d/agent/jobmgr/manager.go
+5 -5
@@ -93,11 +93,11 @@ func (m *Manager) Run(ctx context.Context, in chan []*confgroup.Group) {
93
94 m.FnReg.Register("config", m.dyncfgConfig)
95
96 - //m.dyncfgVnodeModuleCreate()
97 - //
98 - //for _, cfg := range m.Vnodes {
99 - // m.dyncfgVnodeJobCreate(cfg, dyncfgRunning)
100 - //}
96 + m.dyncfgVnodeModuleCreate()
97 +
98 + for _, cfg := range m.Vnodes {
99 + m.dyncfgVnodeJobCreate(cfg, dyncfgRunning)
100 + }
101
102 for name := range m.Modules {
103 m.dyncfgCollectorModuleCreate(name)
src/go/plugin/go.d/agent/module/job.go
+1 -1
@@ -418,7 +418,7 @@ func (j *Job) collect() (result map[string]int64) {
418
419 func (j *Job) processMetrics(metrics map[string]int64, startTime time.Time, sinceLastRun int) bool {
420 var createChart bool
421 - if j.module.VirtualNode() != nil {
421 + if j.module.VirtualNode() == nil {
422 select {
423 case vnode := <-j.updVnode:
424 j.vnodeCreated = false