master
go 124 lines 3.06 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package sdext
4
5 import (
6 "encoding/json"
7 "fmt"
8
9 "github.com/netdata/netdata/go/plugins/plugin/agent/discovery/sd"
10 "github.com/netdata/netdata/go/plugins/plugin/agent/discovery/sd/model"
11 "github.com/netdata/netdata/go/plugins/plugin/go.d/discovery/sdext/discoverer/dockersd"
12 "github.com/netdata/netdata/go/plugins/plugin/go.d/discovery/sdext/discoverer/httpsd"
13 "github.com/netdata/netdata/go/plugins/plugin/go.d/discovery/sdext/discoverer/k8ssd"
14 "github.com/netdata/netdata/go/plugins/plugin/go.d/discovery/sdext/discoverer/netlistensd"
15 "github.com/netdata/netdata/go/plugins/plugin/go.d/discovery/sdext/discoverer/snmpsd"
16 )
17
18 const (
19 discovererNetListeners = "net_listeners"
20 discovererDocker = "docker"
21 discovererHTTP = "http"
22 discovererK8s = "k8s"
23 discovererSNMP = "snmp"
24 )
25
26 func Registry(includeDocker bool) sd.Registry {
27 descs := []sd.Descriptor{
28 sd.NewDescriptor(
29 discovererNetListeners,
30 schemaNetListeners,
31 parseJSONConfig[netlistensd.Config],
32 newNetListenersDiscoverers,
33 ),
34 sd.NewDescriptor(
35 discovererK8s,
36 schemaK8s,
37 parseJSONConfig[[]k8ssd.Config],
38 newK8sDiscoverers,
39 ),
40 sd.NewDescriptor(
41 discovererHTTP,
42 schemaHTTP,
43 parseJSONConfig[httpsd.Config],
44 newHTTPDiscoverers,
45 ),
46 sd.NewDescriptor(
47 discovererSNMP,
48 schemaSNMP,
49 parseJSONConfig[snmpsd.Config],
50 newSNMPDiscoverers,
51 ),
52 }
53 if includeDocker {
54 descs = append(descs, sd.NewDescriptor(
55 discovererDocker,
56 schemaDocker,
57 parseJSONConfig[dockersd.Config],
58 newDockerDiscoverers,
59 ))
60 }
61 return sd.NewRegistry(descs...)
62 }
63
64 func parseJSONConfig[T any](raw json.RawMessage) (T, error) {
65 var cfg T
66 if err := json.Unmarshal(raw, &cfg); err != nil {
67 return cfg, err
68 }
69 return cfg, nil
70 }
71
72 func newNetListenersDiscoverers(cfg netlistensd.Config, source string) ([]model.Discoverer, error) {
73 cfg.Source = source
74 d, err := netlistensd.NewDiscoverer(cfg)
75 if err != nil {
76 return nil, err
77 }
78 return []model.Discoverer{d}, nil
79 }
80
81 func newDockerDiscoverers(cfg dockersd.Config, source string) ([]model.Discoverer, error) {
82 cfg.Source = source
83 d, err := dockersd.NewDiscoverer(cfg)
84 if err != nil {
85 return nil, err
86 }
87 return []model.Discoverer{d}, nil
88 }
89
90 func newHTTPDiscoverers(cfg httpsd.Config, source string) ([]model.Discoverer, error) {
91 cfg.Source = source
92 d, err := httpsd.NewDiscoverer(cfg)
93 if err != nil {
94 return nil, err
95 }
96 return []model.Discoverer{d}, nil
97 }
98
99 func newK8sDiscoverers(cfgs []k8ssd.Config, source string) ([]model.Discoverer, error) {
100 if len(cfgs) == 0 {
101 return nil, fmt.Errorf("empty %q discoverer config", discovererK8s)
102 }
103
104 discs := make([]model.Discoverer, 0, len(cfgs))
105 for _, cfg := range cfgs {
106 cfg.Source = source
107 d, err := k8ssd.NewDiscoverer(cfg)
108 if err != nil {
109 return nil, err
110 }
111 discs = append(discs, d)
112 }
113
114 return discs, nil
115 }
116
117 func newSNMPDiscoverers(cfg snmpsd.Config, source string) ([]model.Discoverer, error) {
118 cfg.Source = source
119 d, err := snmpsd.NewDiscoverer(cfg)
120 if err != nil {
121 return nil, err
122 }
123 return []model.Discoverer{d}, nil
124 }