summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIlya Mashchenko <ilya@netdata.cloud>2024-05-17 18:44:15 +0300
committerGitHub <noreply@github.com>2024-05-17 18:44:15 +0300
commit4dbed7d6b590174ac9433b7a621649fb9fb21544 (patch)
treeb6fec7a4ac6221d2d9c3762d413c768aadac8bea
parent72b72c20aa78a049ff64100f8ae9e3891cfd99eb (diff)
go.d dyncfg add userconfig action (#17684)
-rw-r--r--src/go/collectors/go.d.plugin/agent/jobmgr/dyncfg.go112
-rw-r--r--src/go/collectors/go.d.plugin/agent/jobmgr/manager_test.go148
-rw-r--r--src/go/collectors/go.d.plugin/agent/jobmgr/sim_test.go7
-rw-r--r--src/go/collectors/go.d.plugin/agent/module/registry.go1
-rw-r--r--src/go/collectors/go.d.plugin/modules/activemq/activemq.go9
-rw-r--r--src/go/collectors/go.d.plugin/modules/adaptecraid/adaptec.go5
-rw-r--r--src/go/collectors/go.d.plugin/modules/apache/apache.go3
-rw-r--r--src/go/collectors/go.d.plugin/modules/bind/bind.go5
-rw-r--r--src/go/collectors/go.d.plugin/modules/cassandra/cassandra.go3
-rw-r--r--src/go/collectors/go.d.plugin/modules/chrony/chrony.go5
-rw-r--r--src/go/collectors/go.d.plugin/modules/cockroachdb/cockroachdb.go3
-rw-r--r--src/go/collectors/go.d.plugin/modules/consul/consul.go5
-rw-r--r--src/go/collectors/go.d.plugin/modules/coredns/coredns.go7
-rw-r--r--src/go/collectors/go.d.plugin/modules/couchbase/couchbase.go3
-rw-r--r--src/go/collectors/go.d.plugin/modules/couchdb/couchdb.go7
-rw-r--r--src/go/collectors/go.d.plugin/modules/dnsdist/dnsdist.go3
-rw-r--r--src/go/collectors/go.d.plugin/modules/dnsmasq/dnsmasq.go7
-rw-r--r--src/go/collectors/go.d.plugin/modules/dnsmasq_dhcp/dhcp.go7
-rw-r--r--src/go/collectors/go.d.plugin/modules/dnsquery/dnsquery.go13
-rw-r--r--src/go/collectors/go.d.plugin/modules/docker/docker.go5
-rw-r--r--src/go/collectors/go.d.plugin/modules/docker_engine/docker_engine.go3
-rw-r--r--src/go/collectors/go.d.plugin/modules/dockerhub/dockerhub.go3
-rw-r--r--src/go/collectors/go.d.plugin/modules/elasticsearch/elasticsearch.go3
-rw-r--r--src/go/collectors/go.d.plugin/modules/envoy/envoy.go3
-rw-r--r--src/go/collectors/go.d.plugin/modules/example/example.go5
-rw-r--r--src/go/collectors/go.d.plugin/modules/fail2ban/fail2ban.go5
-rw-r--r--src/go/collectors/go.d.plugin/modules/filecheck/filecheck.go9
-rw-r--r--src/go/collectors/go.d.plugin/modules/fluentd/fluentd.go5
-rw-r--r--src/go/collectors/go.d.plugin/modules/freeradius/freeradius.go1
-rw-r--r--src/go/collectors/go.d.plugin/modules/geth/geth.go1
-rw-r--r--src/go/collectors/go.d.plugin/modules/haproxy/haproxy.go1
-rw-r--r--src/go/collectors/go.d.plugin/modules/hddtemp/hddtemp.go1
-rw-r--r--src/go/collectors/go.d.plugin/modules/hdfs/hdfs.go1
-rw-r--r--src/go/collectors/go.d.plugin/modules/hpssa/hpssa.go5
-rw-r--r--src/go/collectors/go.d.plugin/modules/httpcheck/httpcheck.go9
-rw-r--r--src/go/collectors/go.d.plugin/modules/intelgpu/intelgpu.go5
-rw-r--r--src/go/collectors/go.d.plugin/modules/isc_dhcpd/isc_dhcpd.go3
-rw-r--r--src/go/collectors/go.d.plugin/modules/k8s_kubelet/kubelet.go5
-rw-r--r--src/go/collectors/go.d.plugin/modules/k8s_kubeproxy/kubeproxy.go3
-rw-r--r--src/go/collectors/go.d.plugin/modules/k8s_state/kube_state.go3
-rw-r--r--src/go/collectors/go.d.plugin/modules/lighttpd/lighttpd.go3
-rw-r--r--src/go/collectors/go.d.plugin/modules/litespeed/litespeed.go3
-rw-r--r--src/go/collectors/go.d.plugin/modules/logind/logind.go5
-rw-r--r--src/go/collectors/go.d.plugin/modules/logstash/logstash.go3
-rw-r--r--src/go/collectors/go.d.plugin/modules/lvm/lvm.go5
-rw-r--r--src/go/collectors/go.d.plugin/modules/megacli/megacli.go5
-rw-r--r--src/go/collectors/go.d.plugin/modules/mongodb/mongodb.go8
-rw-r--r--src/go/collectors/go.d.plugin/modules/mongodb/testdata/config.json1
-rw-r--r--src/go/collectors/go.d.plugin/modules/mongodb/testdata/config.yaml1
-rw-r--r--src/go/collectors/go.d.plugin/modules/mysql/mysql.go7
-rw-r--r--src/go/collectors/go.d.plugin/modules/nginx/nginx.go3
-rw-r--r--src/go/collectors/go.d.plugin/modules/nginxplus/nginxplus.go3
-rw-r--r--src/go/collectors/go.d.plugin/modules/nginxvts/nginxvts.go3
-rw-r--r--src/go/collectors/go.d.plugin/modules/ntpd/ntpd.go5
-rw-r--r--src/go/collectors/go.d.plugin/modules/nvidia_smi/nvidia_smi.go5
-rw-r--r--src/go/collectors/go.d.plugin/modules/nvme/nvme.go5
-rw-r--r--src/go/collectors/go.d.plugin/modules/openvpn/openvpn.go7
-rw-r--r--src/go/collectors/go.d.plugin/modules/openvpn_status_log/openvpn.go5
-rw-r--r--src/go/collectors/go.d.plugin/modules/pgbouncer/pgbouncer.go5
-rw-r--r--src/go/collectors/go.d.plugin/modules/phpdaemon/phpdaemon.go3
-rw-r--r--src/go/collectors/go.d.plugin/modules/phpfpm/phpfpm.go3
-rw-r--r--src/go/collectors/go.d.plugin/modules/pihole/pihole.go3
-rw-r--r--src/go/collectors/go.d.plugin/modules/pika/pika.go7
-rw-r--r--src/go/collectors/go.d.plugin/modules/ping/ping.go11
-rw-r--r--src/go/collectors/go.d.plugin/modules/portcheck/portcheck.go5
-rw-r--r--src/go/collectors/go.d.plugin/modules/postgres/postgres.go11
-rw-r--r--src/go/collectors/go.d.plugin/modules/powerdns/authoritativens.go3
-rw-r--r--src/go/collectors/go.d.plugin/modules/powerdns_recursor/recursor.go3
-rw-r--r--src/go/collectors/go.d.plugin/modules/prometheus/prometheus.go19
-rw-r--r--src/go/collectors/go.d.plugin/modules/proxysql/proxysql.go5
-rw-r--r--src/go/collectors/go.d.plugin/modules/pulsar/pulsar.go5
-rw-r--r--src/go/collectors/go.d.plugin/modules/rabbitmq/rabbitmq.go3
-rw-r--r--src/go/collectors/go.d.plugin/modules/redis/redis.go15
-rw-r--r--src/go/collectors/go.d.plugin/modules/rspamd/rspamd.go3
-rw-r--r--src/go/collectors/go.d.plugin/modules/scaleio/scaleio.go3
-rw-r--r--src/go/collectors/go.d.plugin/modules/sensors/sensors.go5
-rw-r--r--src/go/collectors/go.d.plugin/modules/smartctl/smartctl.go13
-rw-r--r--src/go/collectors/go.d.plugin/modules/snmp/snmp.go35
-rw-r--r--src/go/collectors/go.d.plugin/modules/squidlog/squidlog.go7
-rw-r--r--src/go/collectors/go.d.plugin/modules/storcli/storcli.go5
-rw-r--r--src/go/collectors/go.d.plugin/modules/supervisord/supervisord.go5
-rw-r--r--src/go/collectors/go.d.plugin/modules/systemdunits/systemdunits.go13
-rw-r--r--src/go/collectors/go.d.plugin/modules/tengine/tengine.go3
-rw-r--r--src/go/collectors/go.d.plugin/modules/traefik/traefik.go3
-rw-r--r--src/go/collectors/go.d.plugin/modules/unbound/unbound.go11
-rw-r--r--src/go/collectors/go.d.plugin/modules/upsd/upsd.go9
-rw-r--r--src/go/collectors/go.d.plugin/modules/vcsa/vcsa.go3
-rw-r--r--src/go/collectors/go.d.plugin/modules/vernemq/vernemq.go3
-rw-r--r--src/go/collectors/go.d.plugin/modules/vsphere/vsphere.go9
-rw-r--r--src/go/collectors/go.d.plugin/modules/weblog/weblog.go21
-rw-r--r--src/go/collectors/go.d.plugin/modules/whoisquery/whoisquery.go9
-rw-r--r--src/go/collectors/go.d.plugin/modules/windows/windows.go5
-rw-r--r--src/go/collectors/go.d.plugin/modules/wireguard/wireguard.go3
-rw-r--r--src/go/collectors/go.d.plugin/modules/x509check/x509check.go11
-rw-r--r--src/go/collectors/go.d.plugin/modules/zfspool/zfspool.go7
-rw-r--r--src/go/collectors/go.d.plugin/modules/zookeeper/zookeeper.go9
-rw-r--r--src/go/collectors/go.d.plugin/pkg/logs/csv.go6
-rw-r--r--src/go/collectors/go.d.plugin/pkg/logs/parser.go10
-rw-r--r--src/go/collectors/go.d.plugin/pkg/matcher/expr.go4
-rw-r--r--src/go/collectors/go.d.plugin/pkg/prometheus/selector/expr.go4
-rw-r--r--src/go/collectors/go.d.plugin/pkg/tlscfg/config.go8
-rw-r--r--src/go/collectors/go.d.plugin/pkg/web/client.go8
-rw-r--r--src/go/collectors/go.d.plugin/pkg/web/request.go26
-rw-r--r--src/go/collectors/go.d.plugin/pkg/web/web.go4
104 files changed, 567 insertions, 308 deletions
diff --git a/src/go/collectors/go.d.plugin/agent/jobmgr/dyncfg.go b/src/go/collectors/go.d.plugin/agent/jobmgr/dyncfg.go
index fae40eb389..8a39034bcc 100644
--- a/src/go/collectors/go.d.plugin/agent/jobmgr/dyncfg.go
+++ b/src/go/collectors/go.d.plugin/agent/jobmgr/dyncfg.go
@@ -7,6 +7,7 @@ import (
"encoding/json"
"fmt"
"log/slog"
+ "reflect"
"strconv"
"strings"
"time"
@@ -59,10 +60,10 @@ func dyncfgJobID(cfg confgroup.Config) string {
}
func dyncfgModCmds() string {
- return "add schema enable disable test"
+ return "add schema enable disable test userconfig"
}
func dyncfgJobCmds(cfg confgroup.Config) string {
- cmds := "schema get enable disable update restart test"
+ cmds := "schema get enable disable update restart test userconfig"
if isDyncfg(cfg) {
cmds += " remove"
}
@@ -107,8 +108,14 @@ func (m *Manager) dyncfgConfig(fn functions.Function) {
default:
}
+ //m.Infof("QQ FN: '%s'", fn)
+
action := strings.ToLower(fn.Args[1])
+
switch action {
+ case "userconfig":
+ m.dyncfgConfigUserconfig(fn)
+ return
case "test":
m.dyncfgConfigTest(fn)
return
@@ -127,8 +134,6 @@ func (m *Manager) dyncfgConfig(fn functions.Function) {
func (m *Manager) dyncfgConfigExec(fn functions.Function) {
action := strings.ToLower(fn.Args[1])
- //m.Infof("QQ FN(%s): '%s'", action, fn)
-
switch action {
case "test":
m.dyncfgConfigTest(fn)
@@ -154,6 +159,43 @@ func (m *Manager) dyncfgConfigExec(fn functions.Function) {
}
}
+func (m *Manager) dyncfgConfigUserconfig(fn functions.Function) {
+ id := fn.Args[0]
+ jn := "test"
+ if len(fn.Args) > 2 {
+ jn = fn.Args[2]
+ }
+
+ mn, ok := extractModuleName(id)
+ if !ok {
+ m.Warningf("dyncfg: userconfig: could not extract module and job from id (%s)", id)
+ m.dyncfgRespf(fn, 400,
+ "Invalid ID format. Could not extract module and job name from ID. Provided ID: %s.", id)
+ return
+ }
+
+ creator, ok := m.Modules.Lookup(mn)
+ if !ok {
+ m.Warningf("dyncfg: userconfig: module %s not found", mn)
+ m.dyncfgRespf(fn, 404, "The specified module '%s' is not registered.", mn)
+ return
+ }
+
+ if creator.Config == nil || creator.Config() == nil {
+ m.Warningf("dyncfg: userconfig: module %s: configuration not found", mn)
+ m.dyncfgRespf(fn, 500, "Module %s does not provide configuration.", mn)
+ return
+ }
+
+ bs, err := userConfigFromPayload(creator.Config(), jn, fn)
+ if err != nil {
+ m.Warningf("dyncfg: userconfig: module %s: failed to create config from payload: %v", mn, err)
+ m.dyncfgRespf(fn, 400, "Invalid configuration format. Failed to create configuration from payload: %v.", err)
+ }
+
+ m.dyncfgRespPayloadYAML(fn, string(bs))
+}
+
func (m *Manager) dyncfgConfigTest(fn functions.Function) {
id := fn.Args[0]
mn, ok := extractModuleName(id)
@@ -164,6 +206,11 @@ func (m *Manager) dyncfgConfigTest(fn functions.Function) {
return
}
+ jn := "test"
+ if len(fn.Args) > 2 {
+ jn = fn.Args[2]
+ }
+
creator, ok := m.Modules.Lookup(mn)
if !ok {
m.Warningf("dyncfg: test: module %s not found", mn)
@@ -187,7 +234,7 @@ func (m *Manager) dyncfgConfigTest(fn functions.Function) {
}
cfg.SetModule(mn)
- cfg.SetName("test")
+ cfg.SetName(jn)
job := creator.Create()
@@ -238,7 +285,7 @@ func (m *Manager) dyncfgConfigSchema(fn functions.Function) {
return
}
- m.dyncfgRespPayload(fn, mod.JobConfigSchema)
+ m.dyncfgRespPayloadJSON(fn, mod.JobConfigSchema)
}
func (m *Manager) dyncfgConfigGet(fn functions.Function) {
@@ -287,7 +334,7 @@ func (m *Manager) dyncfgConfigGet(fn functions.Function) {
return
}
- m.dyncfgRespPayload(fn, string(bs))
+ m.dyncfgRespPayloadJSON(fn, string(bs))
}
func (m *Manager) dyncfgConfigRestart(fn functions.Function) {
@@ -665,9 +712,17 @@ func (m *Manager) dyncfgSetConfigMeta(cfg confgroup.Config, module, name string)
}
}
-func (m *Manager) dyncfgRespPayload(fn functions.Function, payload string) {
+func (m *Manager) dyncfgRespPayloadJSON(fn functions.Function, payload string) {
+ m.dyncfgRespPayload(fn, payload, "application/json")
+}
+
+func (m *Manager) dyncfgRespPayloadYAML(fn functions.Function, payload string) {
+ m.dyncfgRespPayload(fn, payload, " application/yaml")
+}
+
+func (m *Manager) dyncfgRespPayload(fn functions.Function, payload string, contentType string) {
ts := strconv.FormatInt(time.Now().Unix(), 10)
- m.api.FUNCRESULT(fn.UID, "application/json", payload, "200", ts)
+ m.ap