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