@cryptotaxi247 / netdata-1 / commits / ef7bccd2e

chore(go.d.plugin): renames part 2 (#19090)

Ilya Mashchenko committed Nov 27, 2024 at 10:41 UTC ef7bccd2eb93eb46449bc31327f76d384353de15
633 files changed +14139 -14179
src/go/plugin/go.d/collector/activemq/collect.go
+39 -39
@@ -15,7 +15,7 @@ const (
15
16 var nameReplacer = strings.NewReplacer(".", "_", " ", "")
17
18 -func (a *ActiveMQ) collect() (map[string]int64, error) {
18 +func (c *Collector) collect() (map[string]int64, error) {
19 metrics := make(map[string]int64)
20
21 var (
@@ -24,23 +24,23 @@ func (a *ActiveMQ) collect() (map[string]int64, error) {
24 err error
25 )
26
27 - if queues, err = a.apiClient.getQueues(); err != nil {
27 + if queues, err = c.apiClient.getQueues(); err != nil {
28 return nil, err
29 }
30
31 - if topics, err = a.apiClient.getTopics(); err != nil {
31 + if topics, err = c.apiClient.getTopics(); err != nil {
32 return nil, err
33 }
34
35 - a.processQueues(queues, metrics)
36 - a.processTopics(topics, metrics)
35 + c.processQueues(queues, metrics)
36 + c.processTopics(topics, metrics)
37
38 return metrics, nil
39 }
40
41 -func (a *ActiveMQ) processQueues(queues *queues, metrics map[string]int64) {
41 +func (c *Collector) processQueues(queues *queues, metrics map[string]int64) {
42 var (
43 - count = len(a.activeQueues)
43 + count = len(c.activeQueues)
44 updated = make(map[string]bool)
45 unp int
46 )
@@ -50,18 +50,18 @@ func (a *ActiveMQ) processQueues(queues *queues, metrics map[string]int64) {
50 continue
51 }
52
53 - if !a.activeQueues[q.Name] {
54 - if a.MaxQueues != 0 && count > a.MaxQueues {
53 + if !c.activeQueues[q.Name] {
54 + if c.MaxQueues != 0 && count > c.MaxQueues {
55 unp++
56 continue
57 }
58
59 - if !a.filterQueues(q.Name) {
59 + if !c.filterQueues(q.Name) {
60 continue
61 }
62
63 - a.activeQueues[q.Name] = true
64 - a.addQueueTopicCharts(q.Name, keyQueues)
63 + c.activeQueues[q.Name] = true
64 + c.addQueueTopicCharts(q.Name, keyQueues)
65 }
66
67 rname := nameReplacer.Replace(q.Name)
@@ -74,21 +74,21 @@ func (a *ActiveMQ) processQueues(queues *queues, metrics map[string]int64) {
74 updated[q.Name] = true
75 }
76
77 - for name := range a.activeQueues {
77 + for name := range c.activeQueues {
78 if !updated[name] {
79 - delete(a.activeQueues, name)
80 - a.removeQueueTopicCharts(name, keyQueues)
79 + delete(c.activeQueues, name)
80 + c.removeQueueTopicCharts(name, keyQueues)
81 }
82 }
83
84 if unp > 0 {
85 - a.Debugf("%d queues were unprocessed due to max_queues limit (%d)", unp, a.MaxQueues)
85 + c.Debugf("%d queues were unprocessed due to max_queues limit (%d)", unp, c.MaxQueues)
86 }
87 }
88
89 -func (a *ActiveMQ) processTopics(topics *topics, metrics map[string]int64) {
89 +func (c *Collector) processTopics(topics *topics, metrics map[string]int64) {
90 var (
91 - count = len(a.activeTopics)
91 + count = len(c.activeTopics)
92 updated = make(map[string]bool)
93 unp int
94 )
@@ -98,18 +98,18 @@ func (a *ActiveMQ) processTopics(topics *topics, metrics map[string]int64) {
98 continue
99 }
100
101 - if !a.activeTopics[t.Name] {
102 - if a.MaxTopics != 0 && count > a.MaxTopics {
101 + if !c.activeTopics[t.Name] {
102 + if c.MaxTopics != 0 && count > c.MaxTopics {
103 unp++
104 continue
105 }
106
107 - if !a.filterTopics(t.Name) {
107 + if !c.filterTopics(t.Name) {
108 continue
109 }
110
111 - a.activeTopics[t.Name] = true
112 - a.addQueueTopicCharts(t.Name, keyTopics)
111 + c.activeTopics[t.Name] = true
112 + c.addQueueTopicCharts(t.Name, keyTopics)
113 }
114
115 rname := nameReplacer.Replace(t.Name)
@@ -122,34 +122,34 @@ func (a *ActiveMQ) processTopics(topics *topics, metrics map[string]int64) {
122 updated[t.Name] = true
123 }
124
125 - for name := range a.activeTopics {
125 + for name := range c.activeTopics {
126 if !updated[name] {
127 // TODO: delete after timeout?
128 - delete(a.activeTopics, name)
129 - a.removeQueueTopicCharts(name, keyTopics)
128 + delete(c.activeTopics, name)
129 + c.removeQueueTopicCharts(name, keyTopics)
130 }
131 }
132
133 if unp > 0 {
134 - a.Debugf("%d topics were unprocessed due to max_topics limit (%d)", unp, a.MaxTopics)
134 + c.Debugf("%d topics were unprocessed due to max_topics limit (%d)", unp, c.MaxTopics)
135 }
136 }
137
138 -func (a *ActiveMQ) filterQueues(line string) bool {
139 - if a.queuesFilter == nil {
138 +func (c *Collector) filterQueues(line string) bool {
139 + if c.queuesFilter == nil {
140 return true
141 }
142 - return a.queuesFilter.MatchString(line)
142 + return c.queuesFilter.MatchString(line)
143 }
144
145 -func (a *ActiveMQ) filterTopics(line string) bool {
146 - if a.topicsFilter == nil {
145 +func (c *Collector) filterTopics(line string) bool {
146 + if c.topicsFilter == nil {
147 return true
148 }
149 - return a.topicsFilter.MatchString(line)
149 + return c.topicsFilter.MatchString(line)
150 }
151
152 -func (a *ActiveMQ) addQueueTopicCharts(name, typ string) {
152 +func (c *Collector) addQueueTopicCharts(name, typ string) {
153 rname := nameReplacer.Replace(name)
154
155 charts := charts.Copy()
@@ -164,22 +164,22 @@ func (a *ActiveMQ) addQueueTopicCharts(name, typ string) {
164 }
165 }
166
167 - _ = a.charts.Add(*charts...)
167 + _ = c.charts.Add(*charts...)
168
169 }
170
171 -func (a *ActiveMQ) removeQueueTopicCharts(name, typ string) {
171 +func (c *Collector) removeQueueTopicCharts(name, typ string) {
172 rname := nameReplacer.Replace(name)
173
174 - chart := a.charts.Get(fmt.Sprintf("%s_%s_messages", typ, rname))
174 + chart := c.charts.Get(fmt.Sprintf("%s_%s_messages", typ, rname))
175 chart.MarkRemove()
176 chart.MarkNotCreated()
177
178 - chart = a.charts.Get(fmt.Sprintf("%s_%s_unprocessed_messages", typ, rname))
178 + chart = c.charts.Get(fmt.Sprintf("%s_%s_unprocessed_messages", typ, rname))
179 chart.MarkRemove()
180 chart.MarkNotCreated()
181
182 - chart = a.charts.Get(fmt.Sprintf("%s_%s_consumers", typ, rname))
182 + chart = c.charts.Get(fmt.Sprintf("%s_%s_consumers", typ, rname))
183 chart.MarkRemove()
184 chart.MarkNotCreated()
185 }
src/go/plugin/go.d/collector/activemq/collector.go renamed
+23 -23
@@ -25,8 +25,8 @@ func init() {
25 })
26 }
27
28 -func New() *ActiveMQ {
29 - return &ActiveMQ{
28 +func New() *Collector {
29 + return &Collector{
30 Config: Config{
31 HTTPConfig: web.HTTPConfig{
32 RequestConfig: web.RequestConfig{
@@ -56,7 +56,7 @@ type Config struct {
56 TopicsFilter string `yaml:"topics_filter,omitempty" json:"topics_filter"`
57 }
58
59 -type ActiveMQ struct {
59 +type Collector struct {
60 module.Base
61 Config `yaml:",inline" json:""`
62
@@ -70,39 +70,39 @@ type ActiveMQ struct {
70 topicsFilter matcher.Matcher
71 }
72
73 -func (a *ActiveMQ) Configuration() any {
74 - return a.Config
73 +func (c *Collector) Configuration() any {
74 + return c.Config
75 }
76
77 -func (a *ActiveMQ) Init() error {
78 - if err := a.validateConfig(); err != nil {
77 +func (c *Collector) Init() error {
78 + if err := c.validateConfig(); err != nil {
79 return fmt.Errorf("config validation: %v", err)
80 }
81
82 - qf, err := a.initQueuesFiler()
82 + qf, err := c.initQueuesFiler()
83 if err != nil {
84 return fmt.Errorf("init queues filer: %v", err)
85 }
86 - a.queuesFilter = qf
86 + c.queuesFilter = qf
87
88 - tf, err := a.initTopicsFilter()
88 + tf, err := c.initTopicsFilter()
89 if err != nil {
90 return fmt.Errorf("init topics filter: %v", err)
91 }
92 - a.topicsFilter = tf
92 + c.topicsFilter = tf
93
94 - client, err := web.NewHTTPClient(a.ClientConfig)
94 + client, err := web.NewHTTPClient(c.ClientConfig)
95 if err != nil {
96 return fmt.Errorf("create http client: %v", err)
97 }
98
99 - a.apiClient = newAPIClient(client, a.RequestConfig, a.Webadmin)
99 + c.apiClient = newAPIClient(client, c.RequestConfig, c.Webadmin)
100
101 return nil
102 }
103
104 -func (a *ActiveMQ) Check() error {
105 - mx, err := a.collect()
104 +func (c *Collector) Check() error {
105 + mx, err := c.collect()
106 if err != nil {
107 return err
108 }
@@ -113,21 +113,21 @@ func (a *ActiveMQ) Check() error {
113 return nil
114 }
115
116 -func (a *ActiveMQ) Charts() *Charts {
117 - return a.charts
116 +func (c *Collector) Charts() *Charts {
117 + return c.charts
118 }
119
120 -func (a *ActiveMQ) Cleanup() {
121 - if a.apiClient != nil && a.apiClient.httpClient != nil {
122 - a.apiClient.httpClient.CloseIdleConnections()
120 +func (c *Collector) Cleanup() {
121 + if c.apiClient != nil && c.apiClient.httpClient != nil {
122 + c.apiClient.httpClient.CloseIdleConnections()
123 }
124 }
125
126 -func (a *ActiveMQ) Collect() map[string]int64 {
127 - mx, err := a.collect()
126 +func (c *Collector) Collect() map[string]int64 {
127 + mx, err := c.collect()
128
129 if err != nil {
130 - a.Error(err)
130 + c.Error(err)
131 return nil
132 }
133
src/go/plugin/go.d/collector/activemq/collector_test.go renamed
+39 -39
@@ -30,8 +30,8 @@ func Test_testDataIsValid(t *testing.T) {
30 }
31 }
32
33 -func TestActiveMQ_ConfigurationSerialize(t *testing.T) {
34 - module.TestConfigurationSerialize(t, &ActiveMQ{}, dataConfigJSON, dataConfigYAML)
33 +func TestCollector_ConfigurationSerialize(t *testing.T) {
34 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
35 }
36
37 var (
@@ -151,20 +151,20 @@ var (
151 }
152 )
153
154 -func TestActiveMQ_Init(t *testing.T) {
155 - job := New()
154 +func TestCollector_Init(t *testing.T) {
155 + collr := New()
156
157 // NG case
158 - job.Webadmin = ""
159 - assert.Error(t, job.Init())
158 + collr.Webadmin = ""
159 + assert.Error(t, collr.Init())
160
161 // OK case
162 - job.Webadmin = "webadmin"
163 - assert.NoError(t, job.Init())
164 - assert.NotNil(t, job.apiClient)
162 + collr.Webadmin = "webadmin"
163 + assert.NoError(t, collr.Init())
164 + assert.NotNil(t, collr.apiClient)
165 }
166
167 -func TestActiveMQ_Check(t *testing.T) {
167 +func TestCollector_Check(t *testing.T) {
168 ts := httptest.NewServer(
169 http.HandlerFunc(
170 func(w http.ResponseWriter, r *http.Request) {
@@ -177,23 +177,23 @@ func TestActiveMQ_Check(t *testing.T) {
177 }))
178 defer ts.Close()
179
180 - job := New()
181 - job.HTTPConfig.RequestConfig = web.RequestConfig{URL: ts.URL}
182 - job.Webadmin = "webadmin"
180 + collr := New()
181 + collr.HTTPConfig.RequestConfig = web.RequestConfig{URL: ts.URL}
182 + collr.Webadmin = "webadmin"
183
184 - require.NoError(t, job.Init())
185 - require.NoError(t, job.Check())
184 + require.NoError(t, collr.Init())
185 + require.NoError(t, collr.Check())
186 }
187
188 -func TestActiveMQ_Charts(t *testing.T) {
188 +func TestCollector_Charts(t *testing.T) {
189 assert.NotNil(t, New().Charts())
190 }
191
192 -func TestActiveMQ_Cleanup(t *testing.T) {
192 +func TestCollector_Cleanup(t *testing.T) {
193 New().Cleanup()
194 }
195
196 -func TestActiveMQ_Collect(t *testing.T) {
196 +func TestCollector_Collect(t *testing.T) {
197 var collectNum int
198 getQueues := func() string { return queuesData[collectNum] }
199 getTopics := func() string { return topicsData[collectNum] }
@@ -210,12 +210,12 @@ func TestActiveMQ_Collect(t *testing.T) {
210 }))
211 defer ts.Close()
212
213 - job := New()
214 - job.HTTPConfig.RequestConfig = web.RequestConfig{URL: ts.URL}
215 - job.Webadmin = "webadmin"
213 + collr := New()
214 + collr.HTTPConfig.RequestConfig = web.RequestConfig{URL: ts.URL}
215 + collr.Webadmin = "webadmin"
216
217 - require.NoError(t, job.Init())
218 - require.NoError(t, job.Check())
217 + require.NoError(t, collr.Init())
218 + require.NoError(t, collr.Check())
219
220 cases := []struct {
221 expected map[string]int64
@@ -303,38 +303,38 @@ func TestActiveMQ_Collect(t *testing.T) {
303 }
304
305 for _, c := range cases {
306 - require.Equal(t, c.expected, job.Collect())
307 - assert.Len(t, job.activeQueues, c.numQueues)
308 - assert.Len(t, job.activeTopics, c.numTopics)
309 - assert.Len(t, *job.charts, c.numCharts)
306 + require.Equal(t, c.expected, collr.Collect())
307 + assert.Len(t, collr.activeQueues, c.numQueues)
308 + assert.Len(t, collr.activeTopics, c.numTopics)
309 + assert.Len(t, *collr.charts, c.numCharts)
310 collectNum++
311 }
312 }
313
314 -func TestActiveMQ_404(t *testing.T) {
314 +func TestCollector_404(t *testing.T) {
315 ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
316 w.WriteHeader(404)
317 }))
318 defer ts.Close()
319
320 - job := New()
321 - job.Webadmin = "webadmin"
322 - job.HTTPConfig.RequestConfig = web.RequestConfig{URL: ts.URL}
320 + collr := New()
321 + collr.Webadmin = "webadmin"
322 + collr.HTTPConfig.RequestConfig = web.RequestConfig{URL: ts.URL}
323
324 - require.NoError(t, job.Init())
325 - assert.Error(t, job.Check())
324 + require.NoError(t, collr.Init())
325 + assert.Error(t, collr.Check())
326 }
327
328 -func TestActiveMQ_InvalidData(t *testing.T) {
328 +func TestCollector_InvalidData(t *testing.T) {
329 ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
330 _, _ = w.Write([]byte("hello and goodbye!"))
331 }))
332 defer ts.Close()
333
334 - mod := New()
335 - mod.Webadmin = "webadmin"
336 - mod.HTTPConfig.RequestConfig = web.RequestConfig{URL: ts.URL}
334 + collr := New()
335 + collr.Webadmin = "webadmin"
336 + collr.HTTPConfig.RequestConfig = web.RequestConfig{URL: ts.URL}
337
338 - require.NoError(t, mod.Init())
339 - assert.Error(t, mod.Check())
338 + require.NoError(t, collr.Init())
339 + assert.Error(t, collr.Check())
340 }
src/go/plugin/go.d/collector/activemq/init.go
+9 -9
@@ -8,26 +8,26 @@ import (
8 "github.com/netdata/netdata/go/plugins/pkg/matcher"
9 )
10
11 -func (a *ActiveMQ) validateConfig() error {
12 - if a.URL == "" {
11 +func (c *Collector) validateConfig() error {
12 + if c.URL == "" {
13 return errors.New("url not set")
14 }
15 - if a.Webadmin == "" {
15 + if c.Webadmin == "" {
16 return errors.New("webadmin root path set")
17 }
18 return nil
19 }
20
21 -func (a *ActiveMQ) initQueuesFiler() (matcher.Matcher, error) {
22 - if a.QueuesFilter == "" {
21 +func (c *Collector) initQueuesFiler() (matcher.Matcher, error) {
22 + if c.QueuesFilter == "" {
23 return matcher.TRUE(), nil
24 }
25 - return matcher.NewSimplePatternsMatcher(a.QueuesFilter)
25 + return matcher.NewSimplePatternsMatcher(c.QueuesFilter)
26 }
27
28 -func (a *ActiveMQ) initTopicsFilter() (matcher.Matcher, error) {
29 - if a.TopicsFilter == "" {
28 +func (c *Collector) initTopicsFilter() (matcher.Matcher, error) {
29 + if c.TopicsFilter == "" {
30 return matcher.TRUE(), nil
31 }
32 - return matcher.NewSimplePatternsMatcher(a.TopicsFilter)
32 + return matcher.NewSimplePatternsMatcher(c.TopicsFilter)
33 }
src/go/plugin/go.d/collector/adaptecraid/charts.go
+6 -6
@@ -85,7 +85,7 @@ var (
85 }
86 )
87
88 -func (a *AdaptecRaid) addLogicalDeviceCharts(ld *logicalDevice) {
88 +func (c *Collector) addLogicalDeviceCharts(ld *logicalDevice) {
89 charts := ldChartsTmpl.Copy()
90
91 for _, chart := range *charts {
@@ -100,12 +100,12 @@ func (a *AdaptecRaid) addLogicalDeviceCharts(ld *logicalDevice) {
100 }
101 }
102
103 - if err := a.Charts().Add(*charts...); err != nil {
104 - a.Warning(err)
103 + if err := c.Charts().Add(*charts...); err != nil {
104 + c.Warning(err)
105 }
106 }
107
108 -func (a *AdaptecRaid) addPhysicalDeviceCharts(pd *physicalDevice) {
108 +func (c *Collector) addPhysicalDeviceCharts(pd *physicalDevice) {
109 charts := pdChartsTmpl.Copy()
110
111 if _, err := strconv.ParseInt(pd.temperature, 10, 64); err != nil {
@@ -125,7 +125,7 @@ func (a *AdaptecRaid) addPhysicalDeviceCharts(pd *physicalDevice) {
125 }
126 }
127
128 - if err := a.Charts().Add(*charts...); err != nil {
129 - a.Warning(err)
128 + if err := c.Charts().Add(*charts...); err != nil {
129 + c.Warning(err)
130 }
131 }
src/go/plugin/go.d/collector/adaptecraid/collect.go
+3 -3
@@ -8,13 +8,13 @@ import (
8 "strings"
9 )
10
11 -func (a *AdaptecRaid) collect() (map[string]int64, error) {
11 +func (c *Collector) collect() (map[string]int64, error) {
12 mx := make(map[string]int64)
13
14 - if err := a.collectLogicalDevices(mx); err != nil {
14 + if err := c.collectLogicalDevices(mx); err != nil {
15 return nil, err
16 }
17 - if err := a.collectPhysicalDevices(mx); err != nil {
17 + if err := c.collectPhysicalDevices(mx); err != nil {
18 return nil, err
19 }
20
src/go/plugin/go.d/collector/adaptecraid/collect_ld.go
+5 -5
@@ -20,8 +20,8 @@ type logicalDevice struct {
20 failedStripes string
21 }
22
23 -func (a *AdaptecRaid) collectLogicalDevices(mx map[string]int64) error {
24 - bs, err := a.exec.logicalDevicesInfo()
23 +func (c *Collector) collectLogicalDevices(mx map[string]int64) error {
24 + bs, err := c.exec.logicalDevicesInfo()
25 if err != nil {
26 return err
27 }
@@ -36,9 +36,9 @@ func (a *AdaptecRaid) collectLogicalDevices(mx map[string]int64) error {
36 }
37
38 for _, ld := range devices {
39 - if !a.lds[ld.number] {
40 - a.lds[ld.number] = true
41 - a.addLogicalDeviceCharts(ld)
39 + if !c.lds[ld.number] {
40 + c.lds[ld.number] = true
41 + c.addLogicalDeviceCharts(ld)
42 }
43
44 px := fmt.Sprintf("ld_%s_", ld.number)
src/go/plugin/go.d/collector/adaptecraid/collect_pd.go
+5 -5
@@ -25,8 +25,8 @@ type physicalDevice struct {
25 temperature string
26 }
27
28 -func (a *AdaptecRaid) collectPhysicalDevices(mx map[string]int64) error {
29 - bs, err := a.exec.physicalDevicesInfo()
28 +func (c *Collector) collectPhysicalDevices(mx map[string]int64) error {
29 + bs, err := c.exec.physicalDevicesInfo()
30 if err != nil {
31 return err
32 }
@@ -41,9 +41,9 @@ func (a *AdaptecRaid) collectPhysicalDevices(mx map[string]int64) error {
41 }
42
43 for _, pd := range devices {
44 - if !a.pds[pd.number] {
45 - a.pds[pd.number] = true
46 - a.addPhysicalDeviceCharts(pd)
44 + if !c.pds[pd.number] {
45 + c.pds[pd.number] = true
46 + c.addPhysicalDeviceCharts(pd)
47 }
48
49 px := fmt.Sprintf("pd_%s_", pd.number)
src/go/plugin/go.d/collector/adaptecraid/collector.go renamed
+23 -29
@@ -28,8 +28,8 @@ func init() {
28 })
29 }
30
31 -func New() *AdaptecRaid {
32 - return &AdaptecRaid{
31 +func New() *Collector {
32 + return &Collector{
33 Config: Config{
34 Timeout: confopt.Duration(time.Second * 2),
35 },
@@ -44,40 +44,34 @@ type Config struct {
44 Timeout confopt.Duration `yaml:"timeout,omitempty" json:"timeout"`
45 }
46
47 -type (
48 - AdaptecRaid struct {
49 - module.Base
50 - Config `yaml:",inline" json:""`
47 +type Collector struct {
48 + module.Base
49 + Config `yaml:",inline" json:""`
50
52 - charts *module.Charts
51 + charts *module.Charts
52
54 - exec arcconfCli
53 + exec arcconfCli
54
56 - lds map[string]bool
57 - pds map[string]bool
58 - }
59 - arcconfCli interface {
60 - logicalDevicesInfo() ([]byte, error)
61 - physicalDevicesInfo() ([]byte, error)
62 - }
63 -)
55 + lds map[string]bool
56 + pds map[string]bool
57 +}
58
65 -func (a *AdaptecRaid) Configuration() any {
66 - return a.Config
59 +func (c *Collector) Configuration() any {
60 + return c.Config
61 }
62
69 -func (a *AdaptecRaid) Init() error {
70 - arcconfExec, err := a.initArcconfCliExec()
63 +func (c *Collector) Init() error {
64 + arcconf, err := c.initArcconfCliExec()
65 if err != nil {
66 return fmt.Errorf("arcconf exec initialization: %v", err)
67 }
74 - a.exec = arcconfExec
68 + c.exec = arcconf
69
70 return nil
71 }
72
79 -func (a *AdaptecRaid) Check() error {
80 - mx, err := a.collect()
73 +func (c *Collector) Check() error {
74 + mx, err := c.collect()
75 if err != nil {
76 return err
77 }
@@ -89,14 +83,14 @@ func (a *AdaptecRaid) Check() error {
83 return nil
84 }
85
92 -func (a *AdaptecRaid) Charts() *module.Charts {
93 - return a.charts
86 +func (c *Collector) Charts() *module.Charts {
87 + return c.charts
88 }
89
96 -func (a *AdaptecRaid) Collect() map[string]int64 {
97 - mx, err := a.collect()
90 +func (c *Collector) Collect() map[string]int64 {
91 + mx, err := c.collect()
92 if err != nil {
99 - a.Error(err)
93 + c.Error(err)
94 }
95
96 if len(mx) == 0 {
@@ -106,4 +100,4 @@ func (a *AdaptecRaid) Collect() map[string]int64 {
100 return mx
101 }
102
109 -func (a *AdaptecRaid) Cleanup() {}
103 +func (c *Collector) Cleanup() {}
src/go/plugin/go.d/collector/adaptecraid/collector_test.go renamed
+32 -32
@@ -39,11 +39,11 @@ func Test_testDataIsValid(t *testing.T) {
39 }
40 }
41
42 -func TestAdaptecRaid_ConfigurationSerialize(t *testing.T) {
43 - module.TestConfigurationSerialize(t, &AdaptecRaid{}, dataConfigJSON, dataConfigYAML)
42 +func TestCollector_ConfigurationSerialize(t *testing.T) {
43 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
44 }
45
46 -func TestAdaptecRaid_Init(t *testing.T) {
46 +func TestCollector_Init(t *testing.T) {
47 tests := map[string]struct {
48 config Config
49 wantFail bool
@@ -56,58 +56,58 @@ func TestAdaptecRaid_Init(t *testing.T) {
56
57 for name, test := range tests {
58 t.Run(name, func(t *testing.T) {
59 - adaptec := New()
59 + collr := New()
60
61 if test.wantFail {
62 - assert.Error(t, adaptec.Init())
62 + assert.Error(t, collr.Init())
63 } else {
64 - assert.NoError(t, adaptec.Init())
64 + assert.NoError(t, collr.Init())
65 }
66 })
67 }
68 }
69
70 -func TestAdaptecRaid_Cleanup(t *testing.T) {
70 +func TestCollector_Cleanup(t *testing.T) {
71 tests := map[string]struct {
72 - prepare func() *AdaptecRaid
72 + prepare func() *Collector
73 }{
74 "not initialized exec": {
75 - prepare: func() *AdaptecRaid {
75 + prepare: func() *Collector {
76 return New()
77 },
78 },
79 "after check": {
80 - prepare: func() *AdaptecRaid {
81 - adaptec := New()
82 - adaptec.exec = prepareMockOkCurrent()
83 - _ = adaptec.Check()
84 - return adaptec
80 + prepare: func() *Collector {
81 + collr := New()
82 + collr.exec = prepareMockOkCurrent()
83 + _ = collr.Check()
84 + return collr
85 },
86 },
87 "after collect": {
88 - prepare: func() *AdaptecRaid {
89 - adaptec := New()
90 - adaptec.exec = prepareMockOkCurrent()
91 - _ = adaptec.Collect()
92 - return adaptec
88 + prepare: func() *Collector {
89 + collr := New()
90 + collr.exec = prepareMockOkCurrent()
91 + _ = collr.Collect()
92 + return collr
93 },
94 },
95 }
96
97 for name, test := range tests {
98 t.Run(name, func(t *testing.T) {
99 - adaptec := test.prepare()
99 + collr := test.prepare()
100
101 - assert.NotPanics(t, adaptec.Cleanup)
101 + assert.NotPanics(t, collr.Cleanup)
102 })
103 }
104 }
105
106 -func TestAdaptecRaid_Charts(t *testing.T) {
106 +func TestCollector_Charts(t *testing.T) {
107 assert.NotNil(t, New().Charts())
108 }
109
110 -func TestAdaptecRaid_Check(t *testing.T) {
110 +func TestCollector_Check(t *testing.T) {
111 tests := map[string]struct {
112 prepareMock func() *mockArcconfExec
113 wantFail bool
@@ -136,20 +136,20 @@ func TestAdaptecRaid_Check(t *testing.T) {
136
137 for name, test := range tests {
138 t.Run(name, func(t *testing.T) {
139 - adaptec := New()
139 + collr := New()
140 mock := test.prepareMock()
141 - adaptec.exec = mock
141 + collr.exec = mock
142
143 if test.wantFail {
144 - assert.Error(t, adaptec.Check())
144 + assert.Error(t, collr.Check())
145 } else {
146 - assert.NoError(t, adaptec.Check())
146 + assert.NoError(t, collr.Check())
147 }
148 })
149 }
150 }
151
152 -func TestAdaptecRaid_Collect(t *testing.T) {
152 +func TestCollector_Collect(t *testing.T) {
153 tests := map[string]struct {
154 prepareMock func() *mockArcconfExec
155 wantMetrics map[string]int64
@@ -214,14 +214,14 @@ func TestAdaptecRaid_Collect(t *testing.T) {
214
215 for name, test := range tests {
216 t.Run(name, func(t *testing.T) {
217 - adaptec := New()
217 + collr := New()
218 mock := test.prepareMock()
219 - adaptec.exec = mock
219 + collr.exec = mock
220
221 - mx := adaptec.Collect()
221 + mx := collr.Collect()
222
223 assert.Equal(t, test.wantMetrics, mx)
224 - assert.Len(t, *adaptec.Charts(), test.wantCharts)
224 + assert.Len(t, *collr.Charts(), test.wantCharts)
225 })
226 }
227 }
src/go/plugin/go.d/collector/adaptecraid/exec.go
+5
@@ -13,6 +13,11 @@ import (
13 "github.com/netdata/netdata/go/plugins/logger"
14 )
15
16 +type arcconfCli interface {
17 + logicalDevicesInfo() ([]byte, error)
18 + physicalDevicesInfo() ([]byte, error)
19 +}
20 +
21 func newArcconfCliExec(ndsudoPath string, timeout time.Duration, log *logger.Logger) *arcconfCliExec {
22 return &arcconfCliExec{
23 Logger: log,
src/go/plugin/go.d/collector/adaptecraid/init.go
+2 -2
@@ -12,14 +12,14 @@ import (
12 "github.com/netdata/netdata/go/plugins/pkg/executable"
13 )
14
15 -func (a *AdaptecRaid) initArcconfCliExec() (arcconfCli, error) {
15 +func (c *Collector) initArcconfCliExec() (arcconfCli, error) {
16 ndsudoPath := filepath.Join(executable.Directory, "ndsudo")
17
18 if _, err := os.Stat(ndsudoPath); err != nil {
19 return nil, fmt.Errorf("ndsudo executable not found: %v", err)
20 }
21
22 - arcconfExec := newArcconfCliExec(ndsudoPath, a.Timeout.Duration(), a.Logger)
22 + arcconfExec := newArcconfCliExec(ndsudoPath, c.Timeout.Duration(), c.Logger)
23
24 return arcconfExec, nil
25 }
src/go/plugin/go.d/collector/ap/charts.go
+5 -5
@@ -113,7 +113,7 @@ var (
113 }
114 )
115
116 -func (a *AP) addInterfaceCharts(dev *iwInterface) {
116 +func (c *Collector) addInterfaceCharts(dev *iwInterface) {
117 charts := apChartsTmpl.Copy()
118
119 for _, chart := range *charts {
@@ -127,15 +127,15 @@ func (a *AP) addInterfaceCharts(dev *iwInterface) {
127 }
128 }
129
130 - if err := a.Charts().Add(*charts...); err != nil {
131 - a.Warning(err)
130 + if err := c.Charts().Add(*charts...); err != nil {
131 + c.Warning(err)
132 }
133
134 }
135
136 -func (a *AP) removeInterfaceCharts(dev *iwInterface) {
136 +func (c *Collector) removeInterfaceCharts(dev *iwInterface) {
137 px := fmt.Sprintf("ap_%s_%s_", dev.name, cleanSSID(dev.ssid))
138 - for _, chart := range *a.Charts() {
138 + for _, chart := range *c.Charts() {
139 if strings.HasPrefix(chart.ID, px) {
140 chart.MarkRemove()
141 chart.MarkNotCreated()
src/go/plugin/go.d/collector/ap/collect.go
+9 -9
@@ -34,8 +34,8 @@ type stationStats struct {
34 rxBitrate float64
35 }
36
37 -func (a *AP) collect() (map[string]int64, error) {
38 - bs, err := a.exec.devices()
37 +func (c *Collector) collect() (map[string]int64, error) {
38 + bs, err := c.exec.devices()
39 if err != nil {
40 return nil, err
41 }
@@ -54,7 +54,7 @@ func (a *AP) collect() (map[string]int64, error) {
54 seen := make(map[string]bool)
55
56 for _, iface := range apInterfaces {
57 - bs, err = a.exec.stationStatistics(iface.name)
57 + bs, err = c.exec.stationStatistics(iface.name)
58 if err != nil {
59 return nil, fmt.Errorf("getting station statistics for %s: %v", iface, err)
60 }
@@ -68,9 +68,9 @@ func (a *AP) collect() (map[string]int64, error) {
68
69 seen[key] = true
70
71 - if _, ok := a.seenIfaces[key]; !ok {
72 - a.seenIfaces[key] = iface
73 - a.addInterfaceCharts(iface)
71 + if _, ok := c.seenIfaces[key]; !ok {
72 + c.seenIfaces[key] = iface
73 + c.addInterfaceCharts(iface)
74 }
75
76 px := fmt.Sprintf("ap_%s_%s_", iface.name, iface.ssid)
@@ -90,10 +90,10 @@ func (a *AP) collect() (map[string]int64, error) {
90 }
91 }
92
93 - for key, iface := range a.seenIfaces {
93 + for key, iface := range c.seenIfaces {
94 if !seen[key] {
95 - delete(a.seenIfaces, key)
96 - a.removeInterfaceCharts(iface)
95 + delete(c.seenIfaces, key)
96 + c.removeInterfaceCharts(iface)
97 }
98 }
99
src/go/plugin/go.d/collector/ap/collector.go renamed
+23 -29
@@ -28,8 +28,8 @@ func init() {
28 })
29 }
30
31 -func New() *AP {
32 - return &AP{
31 +func New() *Collector {
32 + return &Collector{
33 Config: Config{
34 BinaryPath: "/usr/sbin/iw",
35 Timeout: confopt.Duration(time.Second * 2),
@@ -45,43 +45,37 @@ type Config struct {
45 BinaryPath string `yaml:"binary_path,omitempty" json:"binary_path"`
46 }
47
48 -type (
49 - AP struct {
50 - module.Base
51 - Config `yaml:",inline" json:""`
48 +type Collector struct {
49 + module.Base
50 + Config `yaml:",inline" json:""`
51
53 - charts *module.Charts
52 + charts *module.Charts
53
55 - exec iwBinary
54 + exec iwBinary
55
57 - seenIfaces map[string]*iwInterface
58 - }
59 - iwBinary interface {
60 - devices() ([]byte, error)
61 - stationStatistics(ifaceName string) ([]byte, error)
62 - }
63 -)
56 + seenIfaces map[string]*iwInterface
57 +}
58
65 -func (a *AP) Configuration() any {
66 - return a.Config
59 +func (c *Collector) Configuration() any {
60 + return c.Config
61 }
62
69 -func (a *AP) Init() error {
70 - if err := a.validateConfig(); err != nil {
63 +func (c *Collector) Init() error {
64 + if err := c.validateConfig(); err != nil {
65 return fmt.Errorf("config validation: %s", err)
66 }
67
74 - iw, err := a.initIwExec()
68 + iw, err := c.initIwExec()
69 if err != nil {
70 return fmt.Errorf("iw exec initialization: %v", err)
71 }
78 - a.exec = iw
72 + c.exec = iw
73
74 return nil
75 }
76
83 -func (a *AP) Check() error {
84 - mx, err := a.collect()
77 +func (c *Collector) Check() error {
78 + mx, err := c.collect()
79 if err != nil {
80 return err
81 }
@@ -93,14 +87,14 @@ func (a *AP) Check() error {
87 return nil
88 }
89
96 -func (a *AP) Charts() *module.Charts {
97 - return a.charts
90 +func (c *Collector) Charts() *module.Charts {
91 + return c.charts
92 }
93
100 -func (a *AP) Collect() map[string]int64 {
101 - mx, err := a.collect()
94 +func (c *Collector) Collect() map[string]int64 {
95 + mx, err := c.collect()
96 if err != nil {
103 - a.Error(err)
97 + c.Error(err)
98 }
99
100 if len(mx) == 0 {
@@ -110,4 +104,4 @@ func (a *AP) Collect() map[string]int64 {
104 return mx
105 }
106
113 -func (a *AP) Cleanup() {}
107 +func (c *Collector) Cleanup() {}
src/go/plugin/go.d/collector/ap/collector_test.go renamed
+34 -34
@@ -37,11 +37,11 @@ func Test_testDataIsValid(t *testing.T) {
37 }
38 }
39
40 -func TestAP_Configuration(t *testing.T) {
41 - module.TestConfigurationSerialize(t, &AP{}, dataConfigJSON, dataConfigYAML)
40 +func TestCollector_Configuration(t *testing.T) {
41 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
42 }
43
44 -func TestAP_Init(t *testing.T) {
44 +func TestCollector_Init(t *testing.T) {
45 tests := map[string]struct {
46 config Config
47 wantFail bool
@@ -62,59 +62,59 @@ func TestAP_Init(t *testing.T) {
62
63 for name, test := range tests {
64 t.Run(name, func(t *testing.T) {
65 - pf := New()
66 - pf.Config = test.config
65 + collr := New()
66 + collr.Config = test.config
67
68 if test.wantFail {
69 - assert.Error(t, pf.Init())
69 + assert.Error(t, collr.Init())
70 } else {
71 - assert.NoError(t, pf.Init())
71 + assert.NoError(t, collr.Init())
72 }
73 })
74 }
75 }
76
77 -func TestAP_Cleanup(t *testing.T) {
77 +func TestCollector_Cleanup(t *testing.T) {
78 tests := map[string]struct {
79 - prepare func() *AP
79 + prepare func() *Collector
80 }{
81 "not initialized exec": {
82 - prepare: func() *AP {
82 + prepare: func() *Collector {
83 return New()
84 },
85 },
86 "after check": {
87 - prepare: func() *AP {
88 - ap := New()
89 - ap.exec = prepareMockOk()
90 - _ = ap.Check()
91 - return ap
87 + prepare: func() *Collector {
88 + collr := New()
89 + collr.exec = prepareMockOk()
90 + _ = collr.Check()
91 + return collr
92 },
93 },
94 "after collect": {
95 - prepare: func() *AP {
96 - ap := New()
97 - ap.exec = prepareMockOk()
98 - _ = ap.Collect()
99 - return ap
95 + prepare: func() *Collector {
96 + collr := New()
97 + collr.exec = prepareMockOk()
98 + _ = collr.Collect()
99 + return collr
100 },
101 },
102 }
103
104 for name, test := range tests {
105 t.Run(name, func(t *testing.T) {
106 - pf := test.prepare()
106 + collr := test.prepare()
107
108 - assert.NotPanics(t, pf.Cleanup)
108 + assert.NotPanics(t, collr.Cleanup)
109 })
110 }
111 }
112
113 -func TestAP_Charts(t *testing.T) {
113 +func TestCollector_Charts(t *testing.T) {
114 assert.NotNil(t, New().Charts())
115 }
116
117 -func TestAP_Check(t *testing.T) {
117 +func TestCollector_Check(t *testing.T) {
118 tests := map[string]struct {
119 prepareMock func() *mockIwExec
120 wantFail bool
@@ -143,19 +143,19 @@ func TestAP_Check(t *testing.T) {
143
144 for name, test := range tests {
145 t.Run(name, func(t *testing.T) {
146 - ap := New()
147 - ap.exec = test.prepareMock()
146 + collr := New()
147 + collr.exec = test.prepareMock()
148
149 if test.wantFail {
150 - assert.Error(t, ap.Check())
150 + assert.Error(t, collr.Check())
151 } else {
152 - assert.NoError(t, ap.Check())
152 + assert.NoError(t, collr.Check())
153 }
154 })
155 }
156 }
157
158 -func TestAP_Collect(t *testing.T) {
158 +func TestCollector_Collect(t *testing.T) {
159 tests := map[string]struct {
160 prepareMock func() *mockIwExec
161 wantMetrics map[string]int64
@@ -207,16 +207,16 @@ func TestAP_Collect(t *testing.T) {
207
208 for name, test := range tests {
209 t.Run(name, func(t *testing.T) {
210 - ap := New()
211 - ap.exec = test.prepareMock()
210 + collr := New()
211 + collr.exec = test.prepareMock()
212
213 - mx := ap.Collect()
213 + mx := collr.Collect()
214
215 assert.Equal(t, test.wantMetrics, mx)
216
217 - assert.Equal(t, test.wantCharts, len(*ap.Charts()), "wantCharts")
217 + assert.Equal(t, test.wantCharts, len(*collr.Charts()), "wantCharts")
218
219 - module.TestMetricsHasAllChartsDims(t, ap.Charts(), mx)
219 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
220 })
221 }
222 }
src/go/plugin/go.d/collector/ap/exec.go
+5
@@ -13,6 +13,11 @@ import (
13 "github.com/netdata/netdata/go/plugins/logger"
14 )
15
16 +type iwBinary interface {
17 + devices() ([]byte, error)
18 + stationStatistics(ifaceName string) ([]byte, error)
19 +}
20 +
21 func newIwExec(binPath string, timeout time.Duration) *iwCliExec {
22 return &iwCliExec{
23 binPath: binPath,
src/go/plugin/go.d/collector/ap/init.go
+5 -5
@@ -11,15 +11,15 @@ import (
11 "strings"
12 )
13
14 -func (a *AP) validateConfig() error {
15 - if a.BinaryPath == "" {
14 +func (c *Collector) validateConfig() error {
15 + if c.BinaryPath == "" {
16 return errors.New("no iw binary path specified")
17 }
18 return nil
19 }
20
21 -func (a *AP) initIwExec() (iwBinary, error) {
22 - binPath := a.BinaryPath
21 +func (c *Collector) initIwExec() (iwBinary, error) {
22 + binPath := c.BinaryPath
23
24 if !strings.HasPrefix(binPath, "/") {
25 path, err := exec.LookPath(binPath)
@@ -33,7 +33,7 @@ func (a *AP) initIwExec() (iwBinary, error) {
33 return nil, err
34 }
35
36 - iw := newIwExec(binPath, a.Timeout.Duration())
36 + iw := newIwExec(binPath, c.Timeout.Duration())
37
38 return iw, nil
39 }
src/go/plugin/go.d/collector/apache/collect.go
+7 -7
@@ -13,24 +13,24 @@ import (
13 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/web"
14 )
15
16 -func (a *Apache) collect() (map[string]int64, error) {
17 - status, err := a.scrapeStatus()
16 +func (c *Collector) collect() (map[string]int64, error) {
17 + status, err := c.scrapeStatus()
18 if err != nil {
19 return nil, err
20 }
21
22 mx := stm.ToMap(status)
23 if len(mx) == 0 {
24 - return nil, fmt.Errorf("nothing was collected from %s", a.URL)
24 + return nil, fmt.Errorf("nothing was collected from %s", c.URL)
25 }
26
27 - a.once.Do(func() { a.charts = newCharts(status) })
27 + c.once.Do(func() { c.charts = newCharts(status) })
28
29 return mx, nil
30 }
31
32 -func (a *Apache) scrapeStatus() (*serverStatus, error) {
33 - req, err := web.NewHTTPRequest(a.RequestConfig)
32 +func (c *Collector) scrapeStatus() (*serverStatus, error) {
33 + req, err := web.NewHTTPRequest(c.RequestConfig)
34 if err != nil {
35 return nil, err
36 }
@@ -38,7 +38,7 @@ func (a *Apache) scrapeStatus() (*serverStatus, error) {
38 var stats *serverStatus
39 var perr error
40
41 - if err := web.DoHTTP(a.httpClient).Request(req, func(body io.Reader) error {
41 + if err := web.DoHTTP(c.httpClient).Request(req, func(body io.Reader) error {
42 if stats, perr = parseResponse(body); perr != nil {
43 return perr
44 }
src/go/plugin/go.d/collector/apache/collector.go renamed
+21 -21
@@ -26,8 +26,8 @@ func init() {
26 })
27 }
28
29 -func New() *Apache {
30 - return &Apache{
29 +func New() *Collector {
30 + return &Collector{
31 Config: Config{
32 HTTPConfig: web.HTTPConfig{
33 RequestConfig: web.RequestConfig{
@@ -48,7 +48,7 @@ type Config struct {
48 web.HTTPConfig `yaml:",inline" json:""`
49 }
50
51 -type Apache struct {
51 +type Collector struct {
52 module.Base
53 Config `yaml:",inline" json:""`
54
@@ -59,29 +59,29 @@ type Apache struct {
59 once *sync.Once
60 }
61
62 -func (a *Apache) Configuration() any {
63 - return a.Config
62 +func (c *Collector) Configuration() any {
63 + return c.Config
64 }
65
66 -func (a *Apache) Init() error {
67 - if err := a.validateConfig(); err != nil {
66 +func (c *Collector) Init() error {
67 + if err := c.validateConfig(); err != nil {
68 return fmt.Errorf("config validation: %v", err)
69 }
70
71 - httpClient, err := a.initHTTPClient()
71 + httpClient, err := c.initHTTPClient()
72 if err != nil {
73 return fmt.Errorf("init HTTP client: %v", err)
74 }
75 - a.httpClient = httpClient
75 + c.httpClient = httpClient
76
77 - a.Debugf("using URL %s", a.URL)
78 - a.Debugf("using timeout: %s", a.Timeout)
77 + c.Debugf("using URL %s", c.URL)
78 + c.Debugf("using timeout: %s", c.Timeout)
79
80 return nil
81 }
82
83 -func (a *Apache) Check() error {
84 - mx, err := a.collect()
83 +func (c *Collector) Check() error {
84 + mx, err := c.collect()
85 if err != nil {
86 return err
87 }
@@ -92,14 +92,14 @@ func (a *Apache) Check() error {
92 return nil
93 }
94
95 -func (a *Apache) Charts() *module.Charts {
96 - return a.charts
95 +func (c *Collector) Charts() *module.Charts {
96 + return c.charts
97 }
98
99 -func (a *Apache) Collect() map[string]int64 {
100 - mx, err := a.collect()
99 +func (c *Collector) Collect() map[string]int64 {
100 + mx, err := c.collect()
101 if err != nil {
102 - a.Error(err)
102 + c.Error(err)
103 }
104
105 if len(mx) == 0 {
@@ -108,8 +108,8 @@ func (a *Apache) Collect() map[string]int64 {
108 return mx
109 }
110
111 -func (a *Apache) Cleanup() {
112 - if a.httpClient != nil {
113 - a.httpClient.CloseIdleConnections()
111 +func (c *Collector) Cleanup() {
112 + if c.httpClient != nil {
113 + c.httpClient.CloseIdleConnections()
114 }
115 }
src/go/plugin/go.d/collector/apache/collector_test.go renamed
+54 -54
@@ -39,11 +39,11 @@ func Test_testDataIsValid(t *testing.T) {
39 }
40 }
41
42 -func TestApache_ConfigurationSerialize(t *testing.T) {
43 - module.TestConfigurationSerialize(t, &Apache{}, dataConfigJSON, dataConfigYAML)
42 +func TestCollector_ConfigurationSerialize(t *testing.T) {
43 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
44 }
45
46 -func TestApache_Init(t *testing.T) {
46 +func TestCollector_Init(t *testing.T) {
47 tests := map[string]struct {
48 wantFail bool
49 config Config
@@ -72,22 +72,22 @@ func TestApache_Init(t *testing.T) {
72
73 for name, test := range tests {
74 t.Run(name, func(t *testing.T) {
75 - apache := New()
76 - apache.Config = test.config
75 + collr := New()
76 + collr.Config = test.config
77
78 if test.wantFail {
79 - assert.Error(t, apache.Init())
79 + assert.Error(t, collr.Init())
80 } else {
81 - assert.NoError(t, apache.Init())
81 + assert.NoError(t, collr.Init())
82 }
83 })
84 }
85 }
86
87 -func TestApache_Check(t *testing.T) {
87 +func TestCollector_Check(t *testing.T) {
88 tests := map[string]struct {
89 wantFail bool
90 - prepare func(t *testing.T) (apache *Apache, cleanup func())
90 + prepare func(t *testing.T) (collr *Collector, cleanup func())
91 }{
92 "success on simple status MPM Event": {
93 wantFail: false,
@@ -121,25 +121,25 @@ func TestApache_Check(t *testing.T) {
121
122 for name, test := range tests {
123 t.Run(name, func(t *testing.T) {
124 - apache, cleanup := test.prepare(t)
124 + collr, cleanup := test.prepare(t)
125 defer cleanup()
126
127 if test.wantFail {
128 - assert.Error(t, apache.Check())
128 + assert.Error(t, collr.Check())
129 } else {
130 - assert.NoError(t, apache.Check())
130 + assert.NoError(t, collr.Check())
131 }
132 })
133 }
134 }
135
136 -func TestApache_Charts(t *testing.T) {
136 +func TestCollector_Charts(t *testing.T) {
137 assert.NotNil(t, New().Charts())
138 }
139
140 -func TestApache_Collect(t *testing.T) {
140 +func TestCollector_Collect(t *testing.T) {
141 tests := map[string]struct {
142 - prepare func(t *testing.T) (apache *Apache, cleanup func())
142 + prepare func(t *testing.T) (collr *Collector, cleanup func())
143 wantNumOfCharts int
144 wantMetrics map[string]int64
145 }{
@@ -244,102 +244,102 @@ func TestApache_Collect(t *testing.T) {
244
245 for name, test := range tests {
246 t.Run(name, func(t *testing.T) {
247 - apache, cleanup := test.prepare(t)
247 + collr, cleanup := test.prepare(t)
248 defer cleanup()
249
250 - _ = apache.Check()
250 + _ = collr.Check()
251
252 - collected := apache.Collect()
252 + collected := collr.Collect()
253
254 require.Equal(t, test.wantMetrics, collected)
255 - assert.Equal(t, test.wantNumOfCharts, len(*apache.Charts()))
255 + assert.Equal(t, test.wantNumOfCharts, len(*collr.Charts()))
256 })
257 }
258 }
259
260 -func caseMPMEventSimpleStatus(t *testing.T) (*Apache, func()) {
260 +func caseMPMEventSimpleStatus(t *testing.T) (*Collector, func()) {
261 t.Helper()
262 srv := httptest.NewServer(http.HandlerFunc(
263 func(w http.ResponseWriter, r *http.Request) {
264 _, _ = w.Write(dataSimpleStatusMPMEvent)
265 }))
266 - apache := New()
267 - apache.URL = srv.URL + "/server-status?auto"
268 - require.NoError(t, apache.Init())
266 + collr := New()
267 + collr.URL = srv.URL + "/server-status?auto"
268 + require.NoError(t, collr.Init())
269
270 - return apache, srv.Close
270 + return collr, srv.Close
271 }
272
273 -func caseMPMEventExtendedStatus(t *testing.T) (*Apache, func()) {
273 +func caseMPMEventExtendedStatus(t *testing.T) (*Collector, func()) {
274 t.Helper()
275 srv := httptest.NewServer(http.HandlerFunc(
276 func(w http.ResponseWriter, r *http.Request) {
277 _, _ = w.Write(dataExtendedStatusMPMEvent)
278 }))
279 - apache := New()
280 - apache.URL = srv.URL + "/server-status?auto"
281 - require.NoError(t, apache.Init())
279 + collr := New()
280 + collr.URL = srv.URL + "/server-status?auto"
281 + require.NoError(t, collr.Init())
282
283 - return apache, srv.Close
283 + return collr, srv.Close
284 }
285
286 -func caseMPMPreforkExtendedStatus(t *testing.T) (*Apache, func()) {
286 +func caseMPMPreforkExtendedStatus(t *testing.T) (*Collector, func()) {
287 t.Helper()
288 srv := httptest.NewServer(http.HandlerFunc(
289 func(w http.ResponseWriter, r *http.Request) {
290 _, _ = w.Write(dataExtendedStatusMPMPrefork)
291 }))
292 - apache := New()
293 - apache.URL = srv.URL + "/server-status?auto"
294 - require.NoError(t, apache.Init())
292 + collr := New()
293 + collr.URL = srv.URL + "/server-status?auto"
294 + require.NoError(t, collr.Init())
295
296 - return apache, srv.Close
296 + return collr, srv.Close
297 }
298
299 -func caseLighttpdResponse(t *testing.T) (*Apache, func()) {
299 +func caseLighttpdResponse(t *testing.T) (*Collector, func()) {
300 t.Helper()
301 srv := httptest.NewServer(http.HandlerFunc(
302 func(w http.ResponseWriter, r *http.Request) {
303 _, _ = w.Write(dataLighttpdStatus)
304 }))
305 - apache := New()
306 - apache.URL = srv.URL + "/server-status?auto"
307 - require.NoError(t, apache.Init())
305 + collr := New()
306 + collr.URL = srv.URL + "/server-status?auto"
307 + require.NoError(t, collr.Init())
308
309 - return apache, srv.Close
309 + return collr, srv.Close
310 }
311
312 -func caseInvalidDataResponse(t *testing.T) (*Apache, func()) {
312 +func caseInvalidDataResponse(t *testing.T) (*Collector, func()) {
313 t.Helper()
314 srv := httptest.NewServer(http.HandlerFunc(
315 func(w http.ResponseWriter, r *http.Request) {
316 _, _ = w.Write([]byte("hello and\n goodbye"))
317 }))
318 - apache := New()
319 - apache.URL = srv.URL + "/server-status?auto"
320 - require.NoError(t, apache.Init())
318 + collr := New()
319 + collr.URL = srv.URL + "/server-status?auto"
320 + require.NoError(t, collr.Init())
321
322 - return apache, srv.Close
322 + return collr, srv.Close
323 }
324
325 -func caseConnectionRefused(t *testing.T) (*Apache, func()) {
325 +func caseConnectionRefused(t *testing.T) (*Collector, func()) {
326 t.Helper()
327 - apache := New()
328 - apache.URL = "http://127.0.0.1:65001/server-status?auto"
329 - require.NoError(t, apache.Init())
327 + collr := New()
328 + collr.URL = "http://127.0.0.1:65001/server-status?auto"
329 + require.NoError(t, collr.Init())
330
331 - return apache, func() {}
331 + return collr, func() {}
332 }
333
334 -func case404(t *testing.T) (*Apache, func()) {
334 +func case404(t *testing.T) (*Collector, func()) {
335 t.Helper()
336 srv := httptest.NewServer(http.HandlerFunc(
337 func(w http.ResponseWriter, r *http.Request) {
338 w.WriteHeader(http.StatusNotFound)
339 }))
340 - apache := New()
341 - apache.URL = srv.URL + "/server-status?auto"
342 - require.NoError(t, apache.Init())
340 + collr := New()
341 + collr.URL = srv.URL + "/server-status?auto"
342 + require.NoError(t, collr.Init())
343
344 - return apache, srv.Close
344 + return collr, srv.Close
345 }
src/go/plugin/go.d/collector/apache/init.go
+5 -5
@@ -10,16 +10,16 @@ import (
10 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/web"
11 )
12
13 -func (a *Apache) validateConfig() error {
14 - if a.URL == "" {
13 +func (c *Collector) validateConfig() error {
14 + if c.URL == "" {
15 return errors.New("url not set")
16 }
17 - if !strings.HasSuffix(a.URL, "?auto") {
17 + if !strings.HasSuffix(c.URL, "?auto") {
18 return errors.New("invalid URL, should ends in '?auto'")
19 }
20 return nil
21 }
22
23 -func (a *Apache) initHTTPClient() (*http.Client, error) {
24 - return web.NewHTTPClient(a.ClientConfig)
23 +func (c *Collector) initHTTPClient() (*http.Client, error) {
24 + return web.NewHTTPClient(c.ClientConfig)
25 }
src/go/plugin/go.d/collector/apcupsd/collect.go
+11 -11
@@ -11,31 +11,31 @@ import (
11
12 const precision = 100
13
14 -func (a *Apcupsd) collect() (map[string]int64, error) {
15 - if a.conn == nil {
16 - conn, err := a.establishConnection()
14 +func (c *Collector) collect() (map[string]int64, error) {
15 + if c.conn == nil {
16 + conn, err := c.establishConnection()
17 if err != nil {
18 return nil, err
19 }
20 - a.conn = conn
20 + c.conn = conn
21 }
22
23 - resp, err := a.conn.status()
23 + resp, err := c.conn.status()
24 if err != nil {
25 - a.Cleanup()
25 + c.Cleanup()
26 return nil, err
27 }
28
29 mx := make(map[string]int64)
30
31 - if err := a.collectStatus(mx, resp); err != nil {
31 + if err := c.collectStatus(mx, resp); err != nil {
32 return nil, err
33 }
34
35 return mx, nil
36 }
37
38 -func (a *Apcupsd) collectStatus(mx map[string]int64, resp []byte) error {
38 +func (c *Collector) collectStatus(mx map[string]int64, resp []byte) error {
39 st, err := parseStatus(resp)
40 if err != nil {
41 return fmt.Errorf("failed to parse status: %v", err)
@@ -105,7 +105,7 @@ func (a *Apcupsd) collectStatus(mx map[string]int64, resp []byte) error {
105 }
106 if st.battdate != "" {
107 if v, err := battdateSecondsAgo(st.battdate); err != nil {
108 - a.Debugf("failed to calculate time since battery replacement for date '%s': %v", st.battdate, err)
108 + c.Debugf("failed to calculate time since battery replacement for date '%s': %v", st.battdate, err)
109 } else {
110 mx["battery_seconds_since_replacement"] = v
111 }
@@ -133,8 +133,8 @@ func battdateSecondsAgo(battdate string) (int64, error) {
133 return secsAgo, nil
134 }
135
136 -func (a *Apcupsd) establishConnection() (apcupsdConn, error) {
137 - conn := a.newConn(a.Config)
136 +func (c *Collector) establishConnection() (apcupsdConn, error) {
137 + conn := c.newConn(c.Config)
138
139 if err := conn.connect(); err != nil {
140 return nil, err
src/go/plugin/go.d/collector/apcupsd/collector.go renamed
+19 -19
@@ -22,8 +22,8 @@ func init() {
22 })
23 }
24
25 -func New() *Apcupsd {
26 - return &Apcupsd{
25 +func New() *Collector {
26 + return &Collector{
27 Config: Config{
28 Address: "127.0.0.1:3551",
29 Timeout: confopt.Duration(time.Second * 3),
@@ -39,7 +39,7 @@ type Config struct {
39 Timeout confopt.Duration `yaml:"timeout,omitempty" json:"timeout"`
40 }
41
42 -type Apcupsd struct {
42 +type Collector struct {
43 module.Base
44 Config `yaml:",inline" json:""`
45
@@ -49,20 +49,20 @@ type Apcupsd struct {
49 newConn func(Config) apcupsdConn
50 }
51
52 -func (a *Apcupsd) Configuration() any {
53 - return a.Config
52 +func (c *Collector) Configuration() any {
53 + return c.Config
54 }
55
56 -func (a *Apcupsd) Init() error {
57 - if a.Address == "" {
56 +func (c *Collector) Init() error {
57 + if c.Address == "" {
58 return errors.New("config: 'address' not set")
59 }
60
61 return nil
62 }
63
64 -func (a *Apcupsd) Check() error {
65 - mx, err := a.collect()
64 +func (c *Collector) Check() error {
65 + mx, err := c.collect()
66 if err != nil {
67 return err
68 }
@@ -72,14 +72,14 @@ func (a *Apcupsd) Check() error {
72 return nil
73 }
74
75 -func (a *Apcupsd) Charts() *module.Charts {
76 - return a.charts
75 +func (c *Collector) Charts() *module.Charts {
76 + return c.charts
77 }
78
79 -func (a *Apcupsd) Collect() map[string]int64 {
80 - mx, err := a.collect()
79 +func (c *Collector) Collect() map[string]int64 {
80 + mx, err := c.collect()
81 if err != nil {
82 - a.Error(err)
82 + c.Error(err)
83 }
84
85 if len(mx) == 0 {
@@ -88,11 +88,11 @@ func (a *Apcupsd) Collect() map[string]int64 {
88 return mx
89 }
90
91 -func (a *Apcupsd) Cleanup() {
92 - if a.conn != nil {
93 - if err := a.conn.disconnect(); err != nil {
94 - a.Warningf("error on disconnect: %v", err)
91 +func (c *Collector) Cleanup() {
92 + if c.conn != nil {
93 + if err := c.conn.disconnect(); err != nil {
94 + c.Warningf("error on disconnect: %v", err)
95 }
96 - a.conn = nil
96 + c.conn = nil
97 }
98 }
src/go/plugin/go.d/collector/apcupsd/collector_test.go renamed
+31 -32
@@ -33,25 +33,24 @@ func Test_testDataIsValid(t *testing.T) {
33 }
34 }
35
36 -func TestApcupsd_ConfigurationSerialize(t *testing.T) {
37 - module.TestConfigurationSerialize(t, &Apcupsd{}, dataConfigJSON, dataConfigYAML)
36 +func TestCollector_ConfigurationSerialize(t *testing.T) {
37 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
38 }
39
40 -func TestApcupsd_Cleanup(t *testing.T) {
41 - apc := New()
42 -
43 - require.NotPanics(t, apc.Cleanup)
40 +func TestCollector_Cleanup(t *testing.T) {
41 + collr := New()
42 + require.NotPanics(t, collr.Cleanup)
43
44 mock := prepareMockOk()
46 - apc.newConn = func(Config) apcupsdConn { return mock }
45 + collr.newConn = func(Config) apcupsdConn { return mock }
46
48 - require.NoError(t, apc.Init())
49 - _ = apc.Collect()
50 - require.NotPanics(t, apc.Cleanup)
47 + require.NoError(t, collr.Init())
48 + _ = collr.Collect()
49 + require.NotPanics(t, collr.Cleanup)
50 assert.True(t, mock.calledDisconnect)
51 }
52
54 -func TestApcupsd_Init(t *testing.T) {
53 +func TestCollector_Init(t *testing.T) {
54 tests := map[string]struct {
55 config Config
56 wantFail bool
@@ -68,19 +67,19 @@ func TestApcupsd_Init(t *testing.T) {
67
68 for name, test := range tests {
69 t.Run(name, func(t *testing.T) {
71 - apc := New()
72 - apc.Config = test.config
70 + collr := New()
71 + collr.Config = test.config
72
73 if test.wantFail {
75 - assert.Error(t, apc.Init())
74 + assert.Error(t, collr.Init())
75 } else {
77 - assert.NoError(t, apc.Init())
76 + assert.NoError(t, collr.Init())
77 }
78 })
79 }
80 }
81
83 -func TestApcupsd_Check(t *testing.T) {
82 +func TestCollector_Check(t *testing.T) {
83 tests := map[string]struct {
84 prepareMock func() *mockApcupsdConn
85 wantFail bool
@@ -105,27 +104,27 @@ func TestApcupsd_Check(t *testing.T) {
104
105 for name, test := range tests {
106 t.Run(name, func(t *testing.T) {
108 - apc := New()
109 - apc.newConn = func(Config) apcupsdConn { return test.prepareMock() }
107 + collr := New()
108 + collr.newConn = func(Config) apcupsdConn { return test.prepareMock() }
109
111 - require.NoError(t, apc.Init())
110 + require.NoError(t, collr.Init())
111
112 if test.wantFail {
114 - assert.Error(t, apc.Check())
113 + assert.Error(t, collr.Check())
114 } else {
116 - assert.NoError(t, apc.Check())
115 + assert.NoError(t, collr.Check())
116 }
117 })
118 }
119 }
120
122 -func TestApcupsd_Charts(t *testing.T) {
123 - apc := New()
124 - require.NoError(t, apc.Init())
125 - assert.NotNil(t, apc.Charts())
121 +func TestCollector_Charts(t *testing.T) {
122 + collr := New()
123 + require.NoError(t, collr.Init())
124 + assert.NotNil(t, collr.Charts())
125 }
126
128 -func TestApcupsd_Collect(t *testing.T) {
127 +func TestCollector_Collect(t *testing.T) {
128 tests := map[string]struct {
129 prepareMock func() *mockApcupsdConn
130 wantCollected map[string]int64
@@ -205,13 +204,13 @@ func TestApcupsd_Collect(t *testing.T) {
204
205 for name, test := range tests {
206 t.Run(name, func(t *testing.T) {
208 - apc := New()
209 - require.NoError(t, apc.Init())
207 + collr := New()
208 + require.NoError(t, collr.Init())
209
210 mock := test.prepareMock()
212 - apc.newConn = func(Config) apcupsdConn { return mock }
211 + collr.newConn = func(Config) apcupsdConn { return mock }
212
214 - mx := apc.Collect()
213 + mx := collr.Collect()
214
215 if _, ok := mx["battery_seconds_since_replacement"]; ok {
216 mx["battery_seconds_since_replacement"] = 86400
@@ -221,11 +220,11 @@ func TestApcupsd_Collect(t *testing.T) {
220
221 if len(test.wantCollected) > 0 {
222 if strings.Contains(name, "commlost") {
224 - module.TestMetricsHasAllChartsDimsSkip(t, apc.Charts(), mx, func(chart *module.Chart, _ *module.Dim) bool {
223 + module.TestMetricsHasAllChartsDimsSkip(t, collr.Charts(), mx, func(chart *module.Chart, _ *module.Dim) bool {
224 return chart.ID != statusChart.ID
225 })
226 } else {
228 - module.TestMetricsHasAllChartsDims(t, apc.Charts(), mx)
227 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
228 }
229 }
230
src/go/plugin/go.d/collector/beanstalk/charts.go
+5 -5
@@ -297,7 +297,7 @@ var (
297 }
298 )
299
300 -func (b *Beanstalk) addTubeCharts(name string) {
300 +func (c *Collector) addTubeCharts(name string) {
301 charts := tubeChartsTmpl.Copy()
302
303 for _, chart := range *charts {
@@ -311,15 +311,15 @@ func (b *Beanstalk) addTubeCharts(name string) {
311 }
312 }
313
314 - if err := b.Charts().Add(*charts...); err != nil {
315 - b.Warning(err)
314 + if err := c.Charts().Add(*charts...); err != nil {
315 + c.Warning(err)
316 }
317 }
318
319 -func (b *Beanstalk) removeTubeCharts(name string) {
319 +func (c *Collector) removeTubeCharts(name string) {
320 px := fmt.Sprintf("tube_%s_", cleanTubeName(name))
321
322 - for _, chart := range *b.Charts() {
322 + for _, chart := range *c.Charts() {
323 if strings.HasPrefix(chart.ID, px) {
324 chart.MarkRemove()
325 chart.MarkNotCreated()
src/go/plugin/go.d/collector/beanstalk/collect.go
+31 -31
@@ -10,30 +10,30 @@ import (
10 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/stm"
11 )
12
13 -func (b *Beanstalk) collect() (map[string]int64, error) {
14 - if b.conn == nil {
15 - conn, err := b.establishConn()
13 +func (c *Collector) collect() (map[string]int64, error) {
14 + if c.conn == nil {
15 + conn, err := c.establishConn()
16 if err != nil {
17 return nil, err
18 }
19 - b.conn = conn
19 + c.conn = conn
20 }
21
22 mx := make(map[string]int64)
23
24 - if err := b.collectStats(mx); err != nil {
25 - b.Cleanup()
24 + if err := c.collectStats(mx); err != nil {
25 + c.Cleanup()
26 return nil, err
27 }
28 - if err := b.collectTubesStats(mx); err != nil {
28 + if err := c.collectTubesStats(mx); err != nil {
29 return mx, err
30 }
31
32 return mx, nil
33 }
34
35 -func (b *Beanstalk) collectStats(mx map[string]int64) error {
36 - stats, err := b.conn.queryStats()
35 +func (c *Collector) collectStats(mx map[string]int64) error {
36 + stats, err := c.conn.queryStats()
37 if err != nil {
38 return err
39 }
@@ -43,52 +43,52 @@ func (b *Beanstalk) collectStats(mx map[string]int64) error {
43 return nil
44 }
45
46 -func (b *Beanstalk) collectTubesStats(mx map[string]int64) error {
46 +func (c *Collector) collectTubesStats(mx map[string]int64) error {
47 now := time.Now()
48
49 - if now.Sub(b.lastDiscoverTubesTime) > b.discoverTubesEvery {
50 - tubes, err := b.conn.queryListTubes()
49 + if now.Sub(c.lastDiscoverTubesTime) > c.discoverTubesEvery {
50 + tubes, err := c.conn.queryListTubes()
51 if err != nil {
52 return err
53 }
54
55 - b.Debugf("discovered tubes (%d): %v", len(tubes), tubes)
56 - v := slices.DeleteFunc(tubes, func(s string) bool { return !b.tubeSr.MatchString(s) })
55 + c.Debugf("discovered tubes (%d): %v", len(tubes), tubes)
56 + v := slices.DeleteFunc(tubes, func(s string) bool { return !c.tubeSr.MatchString(s) })
57 if len(tubes) != len(v) {
58 - b.Debugf("discovered tubes after filtering (%d): %v", len(v), v)
58 + c.Debugf("discovered tubes after filtering (%d): %v", len(v), v)
59 }
60
61 - b.discoveredTubes = v
62 - b.lastDiscoverTubesTime = now
61 + c.discoveredTubes = v
62 + c.lastDiscoverTubesTime = now
63 }
64
65 seen := make(map[string]bool)
66
67 - for i, tube := range b.discoveredTubes {
67 + for i, tube := range c.discoveredTubes {
68 if tube == "" {
69 continue
70 }
71
72 - stats, err := b.conn.queryStatsTube(tube)
72 + stats, err := c.conn.queryStatsTube(tube)
73 if err != nil {
74 return err
75 }
76
77 if stats == nil {
78 - b.Infof("tube '%s' stats object not found (tube does not exist)", tube)
79 - b.discoveredTubes[i] = ""
78 + c.Infof("tube '%s' stats object not found (tube does not exist)", tube)
79 + c.discoveredTubes[i] = ""
80 continue
81 }
82 if stats.Name == "" {
83 - b.Debugf("tube '%s' stats object has an empty name, ignoring it", tube)
84 - b.discoveredTubes[i] = ""
83 + c.Debugf("tube '%s' stats object has an empty name, ignoring it", tube)
84 + c.discoveredTubes[i] = ""
85 continue
86 }
87
88 seen[stats.Name] = true
89 - if !b.seenTubes[stats.Name] {
90 - b.seenTubes[stats.Name] = true
91 - b.addTubeCharts(stats.Name)
89 + if !c.seenTubes[stats.Name] {
90 + c.seenTubes[stats.Name] = true
91 + c.addTubeCharts(stats.Name)
92 }
93
94 px := fmt.Sprintf("tube_%s_", stats.Name)
@@ -97,18 +97,18 @@ func (b *Beanstalk) collectTubesStats(mx map[string]int64) error {
97 }
98 }
99
100 - for tube := range b.seenTubes {
100 + for tube := range c.seenTubes {
101 if !seen[tube] {
102 - delete(b.seenTubes, tube)
103 - b.removeTubeCharts(tube)
102 + delete(c.seenTubes, tube)
103 + c.removeTubeCharts(tube)
104 }
105 }
106
107 return nil
108 }
109
110 -func (b *Beanstalk) establishConn() (beanstalkConn, error) {
111 - conn := b.newConn(b.Config, b.Logger)
110 +func (c *Collector) establishConn() (beanstalkConn, error) {
111 + conn := c.newConn(c.Config, c.Logger)
112
113 if err := conn.connect(); err != nil {
114 return nil, err
src/go/plugin/go.d/collector/beanstalk/collector.go renamed
+21 -21
@@ -25,8 +25,8 @@ func init() {
25 })
26 }
27
28 -func New() *Beanstalk {
29 - return &Beanstalk{
28 +func New() *Collector {
29 + return &Collector{
30 Config: Config{
31 Address: "127.0.0.1:11300",
32 Timeout: confopt.Duration(time.Second * 1),
@@ -48,7 +48,7 @@ type Config struct {
48 TubeSelector string `yaml:"tube_selector,omitempty" json:"tube_selector"`
49 }
50
51 -type Beanstalk struct {
51 +type Collector struct {
52 module.Base
53 Config `yaml:",inline" json:""`
54
@@ -64,26 +64,26 @@ type Beanstalk struct {
64 seenTubes map[string]bool
65 }
66
67 -func (b *Beanstalk) Configuration() any {
68 - return b.Config
67 +func (c *Collector) Configuration() any {
68 + return c.Config
69 }
70
71 -func (b *Beanstalk) Init() error {
72 - if err := b.validateConfig(); err != nil {
71 +func (c *Collector) Init() error {
72 + if err := c.validateConfig(); err != nil {
73 return fmt.Errorf("config validation: %v", err)
74 }
75
76 - sr, err := b.initTubeSelector()
76 + sr, err := c.initTubeSelector()
77 if err != nil {
78 return fmt.Errorf("failed to init tube selector: %v", err)
79 }
80 - b.tubeSr = sr
80 + c.tubeSr = sr
81
82 return nil
83 }
84
85 -func (b *Beanstalk) Check() error {
86 - mx, err := b.collect()
85 +func (c *Collector) Check() error {
86 + mx, err := c.collect()
87 if err != nil {
88 return err
89 }
@@ -95,14 +95,14 @@ func (b *Beanstalk) Check() error {
95 return nil
96 }
97
98 -func (b *Beanstalk) Charts() *module.Charts {
99 - return b.charts
98 +func (c *Collector) Charts() *module.Charts {
99 + return c.charts
100 }
101
102 -func (b *Beanstalk) Collect() map[string]int64 {
103 - mx, err := b.collect()
102 +func (c *Collector) Collect() map[string]int64 {
103 + mx, err := c.collect()
104 if err != nil {
105 - b.Error(err)
105 + c.Error(err)
106 }
107
108 if len(mx) == 0 {
@@ -112,11 +112,11 @@ func (b *Beanstalk) Collect() map[string]int64 {
112 return mx
113 }
114
115 -func (b *Beanstalk) Cleanup() {
116 - if b.conn != nil {
117 - if err := b.conn.disconnect(); err != nil {
118 - b.Warningf("error on disconnect: %s", err)
115 +func (c *Collector) Cleanup() {
116 + if c.conn != nil {
117 + if err := c.conn.disconnect(); err != nil {
118 + c.Warningf("error on disconnect: %s", err)
119 }
120 - b.conn = nil
120 + c.conn = nil
121 }
122 }
src/go/plugin/go.d/collector/beanstalk/collector_test.go renamed
+39 -39
@@ -39,11 +39,11 @@ func Test_testDataIsValid(t *testing.T) {
39 }
40 }
41
42 -func TestBeanstalk_ConfigurationSerialize(t *testing.T) {
43 - module.TestConfigurationSerialize(t, &Beanstalk{}, dataConfigJSON, dataConfigYAML)
42 +func TestCollector_ConfigurationSerialize(t *testing.T) {
43 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
44 }
45
46 -func TestBeanstalk_Init(t *testing.T) {
46 +func TestCollector_Init(t *testing.T) {
47 tests := map[string]struct {
48 config Config
49 wantFail bool
@@ -64,25 +64,25 @@ func TestBeanstalk_Init(t *testing.T) {
64
65 for name, test := range tests {
66 t.Run(name, func(t *testing.T) {
67 - beans := New()
68 - beans.Config = test.config
67 + collr := New()
68 + collr.Config = test.config
69
70 if test.wantFail {
71 - assert.Error(t, beans.Init())
71 + assert.Error(t, collr.Init())
72 } else {
73 - assert.NoError(t, beans.Init())
73 + assert.NoError(t, collr.Init())
74 }
75 })
76 }
77 }
78
79 -func TestBeanstalk_Charts(t *testing.T) {
79 +func TestCollector_Charts(t *testing.T) {
80 assert.NotNil(t, New().Charts())
81 }
82
83 -func TestBeanstalk_Check(t *testing.T) {
83 +func TestCollector_Check(t *testing.T) {
84 tests := map[string]struct {
85 - prepare func() (*Beanstalk, *mockBeanstalkDaemon)
85 + prepare func() (*Collector, *mockBeanstalkDaemon)
86 wantFail bool
87 }{
88 "success on valid response": {
@@ -100,7 +100,7 @@ func TestBeanstalk_Check(t *testing.T) {
100 }
101 for name, test := range tests {
102 t.Run(name, func(t *testing.T) {
103 - beanstalk, daemon := test.prepare()
103 + collr, daemon := test.prepare()
104
105 defer func() {
106 assert.NoError(t, daemon.Close(), "daemon.Close()")
@@ -112,31 +112,31 @@ func TestBeanstalk_Check(t *testing.T) {
112 select {
113 case <-daemon.started:
114 case <-time.After(time.Second * 3):
115 - t.Errorf("mock beanstalk daemon start timed out")
115 + t.Errorf("mock collr daemon start timed out")
116 }
117
118 - require.NoError(t, beanstalk.Init())
118 + require.NoError(t, collr.Init())
119
120 if test.wantFail {
121 - assert.Error(t, beanstalk.Check())
121 + assert.Error(t, collr.Check())
122 } else {
123 - assert.NoError(t, beanstalk.Check())
123 + assert.NoError(t, collr.Check())
124 }
125
126 - beanstalk.Cleanup()
126 + collr.Cleanup()
127
128 select {
129 case <-daemon.stopped:
130 case <-time.After(time.Second * 3):
131 - t.Errorf("mock beanstalk daemon stop timed out")
131 + t.Errorf("mock collr daemon stop timed out")
132 }
133 })
134 }
135 }
136
137 -func TestBeanstalk_Collect(t *testing.T) {
137 +func TestCollector_Collect(t *testing.T) {
138 tests := map[string]struct {
139 - prepare func() (*Beanstalk, *mockBeanstalkDaemon)
139 + prepare func() (*Collector, *mockBeanstalkDaemon)
140 wantMetrics map[string]int64
141 wantCharts int
142 }{
@@ -211,7 +211,7 @@ func TestBeanstalk_Collect(t *testing.T) {
211
212 for name, test := range tests {
213 t.Run(name, func(t *testing.T) {
214 - beanstalk, daemon := test.prepare()
214 + collr, daemon := test.prepare()
215
216 defer func() {
217 assert.NoError(t, daemon.Close(), "daemon.Close()")
@@ -223,33 +223,33 @@ func TestBeanstalk_Collect(t *testing.T) {
223 select {
224 case <-daemon.started:
225 case <-time.After(time.Second * 3):
226 - t.Errorf("mock beanstalk daemon start timed out")
226 + t.Errorf("mock collr daemon start timed out")
227 }
228
229 - require.NoError(t, beanstalk.Init())
229 + require.NoError(t, collr.Init())
230
231 - mx := beanstalk.Collect()
231 + mx := collr.Collect()
232
233 require.Equal(t, test.wantMetrics, mx)
234
235 - assert.Equal(t, test.wantCharts, len(*beanstalk.Charts()), "want charts")
235 + assert.Equal(t, test.wantCharts, len(*collr.Charts()), "want charts")
236
237 if len(test.wantMetrics) > 0 {
238 - module.TestMetricsHasAllChartsDims(t, beanstalk.Charts(), mx)
238 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
239 }
240
241 - beanstalk.Cleanup()
241 + collr.Cleanup()
242
243 select {
244 case <-daemon.stopped:
245 case <-time.After(time.Second * 3):
246 - t.Errorf("mock beanstalk daemon stop timed out")
246 + t.Errorf("mock collr daemon stop timed out")
247 }
248 })
249 }
250 }
251
252 -func prepareCaseOk() (*Beanstalk, *mockBeanstalkDaemon) {
252 +func prepareCaseOk() (*Collector, *mockBeanstalkDaemon) {
253 daemon := &mockBeanstalkDaemon{
254 addr: "127.0.0.1:65001",
255 started: make(chan struct{}),
@@ -259,13 +259,13 @@ func prepareCaseOk() (*Beanstalk, *mockBeanstalkDaemon) {
259 dataStatsTube: dataStatsTubeDefault,
260 }
261
262 - beanstalk := New()
263 - beanstalk.Address = daemon.addr
262 + collr := New()
263 + collr.Address = daemon.addr
264
265 - return beanstalk, daemon
265 + return collr, daemon
266 }
267
268 -func prepareCaseUnexpectedResponse() (*Beanstalk, *mockBeanstalkDaemon) {
268 +func prepareCaseUnexpectedResponse() (*Collector, *mockBeanstalkDaemon) {
269 daemon := &mockBeanstalkDaemon{
270 addr: "127.0.0.1:65001",
271 started: make(chan struct{}),
@@ -275,13 +275,13 @@ func prepareCaseUnexpectedResponse() (*Beanstalk, *mockBeanstalkDaemon) {
275 dataStatsTube: []byte("INTERNAL_ERROR\n"),
276 }
277
278 - beanstalk := New()
279 - beanstalk.Address = daemon.addr
278 + collr := New()
279 + collr.Address = daemon.addr
280
281 - return beanstalk, daemon
281 + return collr, daemon
282 }
283
284 -func prepareCaseConnectionRefused() (*Beanstalk, *mockBeanstalkDaemon) {
284 +func prepareCaseConnectionRefused() (*Collector, *mockBeanstalkDaemon) {
285 ch := make(chan struct{})
286 close(ch)
287 daemon := &mockBeanstalkDaemon{
@@ -291,10 +291,10 @@ func prepareCaseConnectionRefused() (*Beanstalk, *mockBeanstalkDaemon) {
291 stopped: ch,
292 }
293
294 - beanstalk := New()
295 - beanstalk.Address = daemon.addr
294 + collr := New()
295 + collr.Address = daemon.addr
296
297 - return beanstalk, daemon
297 + return collr, daemon
298 }
299
300 type mockBeanstalkDaemon struct {
src/go/plugin/go.d/collector/beanstalk/init.go
+5 -5
@@ -8,19 +8,19 @@ import (
8 "github.com/netdata/netdata/go/plugins/pkg/matcher"
9 )
10
11 -func (b *Beanstalk) validateConfig() error {
12 - if b.Address == "" {
11 +func (c *Collector) validateConfig() error {
12 + if c.Address == "" {
13 return errors.New("beanstalk address is required")
14 }
15 return nil
16 }
17
18 -func (b *Beanstalk) initTubeSelector() (matcher.Matcher, error) {
19 - if b.TubeSelector == "" {
18 +func (c *Collector) initTubeSelector() (matcher.Matcher, error) {
19 + if c.TubeSelector == "" {
20 return matcher.TRUE(), nil
21 }
22
23 - m, err := matcher.NewSimplePatternsMatcher(b.TubeSelector)
23 + m, err := matcher.NewSimplePatternsMatcher(c.TubeSelector)
24 if err != nil {
25 return nil, err
26 }
src/go/plugin/go.d/collector/bind/collect.go
+20 -20
@@ -9,19 +9,19 @@ import (
9 "github.com/netdata/netdata/go/plugins/plugin/go.d/agent/module"
10 )
11
12 -func (b *Bind) collect() (map[string]int64, error) {
12 +func (c *Collector) collect() (map[string]int64, error) {
13 mx := make(map[string]int64)
14
15 - s, err := b.serverStats()
15 + s, err := c.serverStats()
16 if err != nil {
17 return nil, err
18 }
19 - b.collectServerStats(mx, s)
19 + c.collectServerStats(mx, s)
20
21 return mx, nil
22 }
23
24 -func (b *Bind) collectServerStats(metrics map[string]int64, stats *serverStats) {
24 +func (c *Collector) collectServerStats(metrics map[string]int64, stats *serverStats) {
25 var chart *Chart
26
27 for k, v := range stats.NSStats {
@@ -63,11 +63,11 @@ func (b *Bind) collectServerStats(metrics map[string]int64, stats *serverStats)
63 chartID = keyReceivedUpdates
64 }
65
66 - if !b.charts.Has(chartID) {
67 - _ = b.charts.Add(charts[chartID].Copy())
66 + if !c.charts.Has(chartID) {
67 + _ = c.charts.Add(charts[chartID].Copy())
68 }
69
70 - chart = b.charts.Get(chartID)
70 + chart = c.charts.Get(chartID)
71
72 if !chart.HasDim(k) {
73 _ = chart.AddDim(&Dim{ID: k, Name: dimName, Algo: algo})
@@ -91,11 +91,11 @@ func (b *Bind) collectServerStats(metrics map[string]int64, stats *serverStats)
91 continue
92 }
93
94 - if !b.charts.Has(v.chartID) {
95 - _ = b.charts.Add(charts[v.chartID].Copy())
94 + if !c.charts.Has(v.chartID) {
95 + _ = c.charts.Add(charts[v.chartID].Copy())
96 }
97
98 - chart = b.charts.Get(v.chartID)
98 + chart = c.charts.Get(v.chartID)
99
100 for key, val := range v.item {
101 if !chart.HasDim(key) {
@@ -107,12 +107,12 @@ func (b *Bind) collectServerStats(metrics map[string]int64, stats *serverStats)
107 }
108 }
109
110 - if !(b.permitView != nil && len(stats.Views) > 0) {
110 + if !(c.permitView != nil && len(stats.Views) > 0) {
111 return
112 }
113
114 for name, view := range stats.Views {
115 - if !b.permitView.MatchString(name) {
115 + if !c.permitView.MatchString(name) {
116 continue
117 }
118 r := view.Resolver
@@ -140,14 +140,14 @@ func (b *Bind) collectServerStats(metrics map[string]int64, stats *serverStats)
140
141 chartID := fmt.Sprintf(chartKey, name)
142
143 - if !b.charts.Has(chartID) {
143 + if !c.charts.Has(chartID) {
144 chart = charts[chartKey].Copy()
145 chart.ID = chartID
146 chart.Fam = fmt.Sprintf(chart.Fam, name)
147 - _ = b.charts.Add(chart)
147 + _ = c.charts.Add(chart)
148 }
149
150 - chart = b.charts.Get(chartID)
150 + chart = c.charts.Get(chartID)
151 dimID := fmt.Sprintf("%s_%s", name, key)
152
153 if !chart.HasDim(dimID) {
@@ -161,14 +161,14 @@ func (b *Bind) collectServerStats(metrics map[string]int64, stats *serverStats)
161 if len(r.QTypes) > 0 {
162 chartID := fmt.Sprintf(keyResolverInQTypes, name)
163
164 - if !b.charts.Has(chartID) {
164 + if !c.charts.Has(chartID) {
165 chart = charts[keyResolverInQTypes].Copy()
166 chart.ID = chartID
167 chart.Fam = fmt.Sprintf(chart.Fam, name)
168 - _ = b.charts.Add(chart)
168 + _ = c.charts.Add(chart)
169 }
170
171 - chart = b.charts.Get(chartID)
171 + chart = c.charts.Get(chartID)
172
173 for key, val := range r.QTypes {
174 dimID := fmt.Sprintf("%s_%s", name, key)
@@ -183,11 +183,11 @@ func (b *Bind) collectServerStats(metrics map[string]int64, stats *serverStats)
183 if len(r.CacheStats) > 0 {
184 chartID := fmt.Sprintf(keyResolverCacheHits, name)
185
186 - if !b.charts.Has(chartID) {
186 + if !c.charts.Has(chartID) {
187 chart = charts[keyResolverCacheHits].Copy()
188 chart.ID = chartID
189 chart.Fam = fmt.Sprintf(chart.Fam, name)
190 - _ = b.charts.Add(chart)
190 + _ = c.charts.Add(chart)
191 for _, dim := range chart.Dims {
192 dim.ID = fmt.Sprintf(dim.ID, name)
193 }
src/go/plugin/go.d/collector/bind/collector.go renamed
+23 -23
@@ -26,8 +26,8 @@ func init() {
26 })
27 }
28
29 -func New() *Bind {
30 - return &Bind{
29 +func New() *Collector {
30 + return &Collector{
31 Config: Config{
32 HTTPConfig: web.HTTPConfig{
33 RequestConfig: web.RequestConfig{
@@ -49,7 +49,7 @@ type Config struct {
49 }
50
51 type (
52 - Bind struct {
52 + Collector struct {
53 module.Base
54 Config `yaml:",inline" json:""`
55
@@ -66,40 +66,40 @@ type (
66 }
67 )
68
69 -func (b *Bind) Configuration() any {
70 - return b.Config
69 +func (c *Collector) Configuration() any {
70 + return c.Config
71 }
72
73 -func (b *Bind) Init() error {
74 - if err := b.validateConfig(); err != nil {
73 +func (c *Collector) Init() error {
74 + if err := c.validateConfig(); err != nil {
75 return fmt.Errorf("config verification: %v", err)
76 }
77
78 - pvm, err := b.initPermitViewMatcher()
78 + pvm, err := c.initPermitViewMatcher()
79 if err != nil {
80 return fmt.Errorf("init permit view matcher: %v", err)
81 }
82 if pvm != nil {
83 - b.permitView = pvm
83 + c.permitView = pvm
84 }
85
86 - httpClient, err := web.NewHTTPClient(b.ClientConfig)
86 + httpClient, err := web.NewHTTPClient(c.ClientConfig)
87 if err != nil {
88 return fmt.Errorf("creating http client : %v", err)
89 }
90 - b.httpClient = httpClient
90 + c.httpClient = httpClient
91
92 - bindClient, err := b.initBindApiClient(httpClient)
92 + bindClient, err := c.initBindApiClient(httpClient)
93 if err != nil {
94 return fmt.Errorf("init bind api client: %v", err)
95 }
96 - b.bindAPIClient = bindClient
96 + c.bindAPIClient = bindClient
97
98 return nil
99 }
100
101 -func (b *Bind) Check() error {
102 - mx, err := b.collect()
101 +func (c *Collector) Check() error {
102 + mx, err := c.collect()
103 if err != nil {
104 return err
105 }
@@ -110,23 +110,23 @@ func (b *Bind) Check() error {
110 return nil
111 }
112
113 -func (b *Bind) Charts() *Charts {
114 - return b.charts
113 +func (c *Collector) Charts() *Charts {
114 + return c.charts
115 }
116
117 -func (b *Bind) Collect() map[string]int64 {
118 - mx, err := b.collect()
117 +func (c *Collector) Collect() map[string]int64 {
118 + mx, err := c.collect()
119
120 if err != nil {
121 - b.Error(err)
121 + c.Error(err)
122 return nil
123 }
124
125 return mx
126 }
127
128 -func (b *Bind) Cleanup() {
129 - if b.httpClient != nil {
130 - b.httpClient.CloseIdleConnections()
128 +func (c *Collector) Cleanup() {
129 + if c.httpClient != nil {
130 + c.httpClient.CloseIdleConnections()
131 }
132 }
src/go/plugin/go.d/collector/bind/collector_test.go renamed
+47 -47
@@ -34,25 +34,25 @@ func Test_testDataIsValid(t *testing.T) {
34 }
35 }
36
37 -func TestBind_ConfigurationSerialize(t *testing.T) {
38 - module.TestConfigurationSerialize(t, &Bind{}, dataConfigJSON, dataConfigYAML)
37 +func TestCollector_ConfigurationSerialize(t *testing.T) {
38 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
39 }
40
41 -func TestBind_Cleanup(t *testing.T) { New().Cleanup() }
41 +func TestCollector_Cleanup(t *testing.T) { New().Cleanup() }
42
43 -func TestBind_Init(t *testing.T) {
43 +func TestCollector_Init(t *testing.T) {
44 // OK
45 - job := New()
46 - assert.NoError(t, job.Init())
47 - assert.NotNil(t, job.bindAPIClient)
45 + collr := New()
46 + assert.NoError(t, collr.Init())
47 + assert.NotNil(t, collr.bindAPIClient)
48
49 //NG
50 - job = New()
51 - job.URL = ""
52 - assert.Error(t, job.Init())
50 + collr = New()
51 + collr.URL = ""
52 + assert.Error(t, collr.Init())
53 }
54
55 -func TestBind_Check(t *testing.T) {
55 +func TestCollector_Check(t *testing.T) {
56 ts := httptest.NewServer(
57 http.HandlerFunc(
58 func(w http.ResponseWriter, r *http.Request) {
@@ -62,26 +62,26 @@ func TestBind_Check(t *testing.T) {
62 }))
63 defer ts.Close()
64
65 - job := New()
66 - job.URL = ts.URL + "/json/v1"
65 + collr := New()
66 + collr.URL = ts.URL + "/json/v1"
67
68 - require.NoError(t, job.Init())
69 - require.NoError(t, job.Check())
68 + require.NoError(t, collr.Init())
69 + require.NoError(t, collr.Check())
70 }
71
72 -func TestBind_CheckNG(t *testing.T) {
73 - job := New()
72 +func TestCollector_CheckNG(t *testing.T) {
73 + collr := New()
74
75 - job.URL = "http://127.0.0.1:38001/xml/v3"
76 - require.NoError(t, job.Init())
77 - assert.Error(t, job.Check())
75 + collr.URL = "http://127.0.0.1:38001/xml/v3"
76 + require.NoError(t, collr.Init())
77 + assert.Error(t, collr.Check())
78 }
79
80 -func TestBind_Charts(t *testing.T) {
80 +func TestCollector_Charts(t *testing.T) {
81 assert.NotNil(t, New().Charts())
82 }
83
84 -func TestBind_CollectJSON(t *testing.T) {
84 +func TestCollector_CollectJSON(t *testing.T) {
85 ts := httptest.NewServer(
86 http.HandlerFunc(
87 func(w http.ResponseWriter, r *http.Request) {
@@ -91,12 +91,12 @@ func TestBind_CollectJSON(t *testing.T) {
91 }))
92 defer ts.Close()
93
94 - job := New()
95 - job.URL = ts.URL + "/json/v1"
96 - job.PermitView = "*"
94 + collr := New()
95 + collr.URL = ts.URL + "/json/v1"
96 + collr.PermitView = "*"
97
98 - require.NoError(t, job.Init())
99 - require.NoError(t, job.Check())
98 + require.NoError(t, collr.Init())
99 + require.NoError(t, collr.Check())
100
101 expected := map[string]int64{
102 "_default_Queryv4": 4503685324,
@@ -254,11 +254,11 @@ func TestBind_CollectJSON(t *testing.T) {
254 "Others": 74006,
255 }
256
257 - assert.Equal(t, expected, job.Collect())
258 - assert.Len(t, *job.charts, 17)
257 + assert.Equal(t, expected, collr.Collect())
258 + assert.Len(t, *collr.charts, 17)
259 }
260
261 -func TestBind_CollectXML3(t *testing.T) {
261 +func TestCollector_CollectXML3(t *testing.T) {
262 ts := httptest.NewServer(
263 http.HandlerFunc(
264 func(w http.ResponseWriter, r *http.Request) {
@@ -268,12 +268,12 @@ func TestBind_CollectXML3(t *testing.T) {
268 }))
269 defer ts.Close()
270
271 - job := New()
272 - job.PermitView = "*"
273 - job.URL = ts.URL + "/xml/v3"
271 + collr := New()
272 + collr.PermitView = "*"
273 + collr.URL = ts.URL + "/xml/v3"
274
275 - require.NoError(t, job.Init())
276 - require.NoError(t, job.Check())
275 + require.NoError(t, collr.Init())
276 + require.NoError(t, collr.Check())
277
278 expected := map[string]int64{
279 "_bind_CookieClientOk": 0,
@@ -507,26 +507,26 @@ func TestBind_CollectXML3(t *testing.T) {
507 "IQUERY": 199,
508 }
509
510 - assert.Equal(t, expected, job.Collect())
511 - assert.Len(t, *job.charts, 20)
510 + assert.Equal(t, expected, collr.Collect())
511 + assert.Len(t, *collr.charts, 20)
512 }
513
514 -func TestBind_InvalidData(t *testing.T) {
514 +func TestCollector_InvalidData(t *testing.T) {
515 ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { _, _ = w.Write([]byte("hello and goodbye")) }))
516 defer ts.Close()
517
518 - job := New()
519 - job.URL = ts.URL + "/json/v1"
520 - require.NoError(t, job.Init())
521 - assert.Error(t, job.Check())
518 + collr := New()
519 + collr.URL = ts.URL + "/json/v1"
520 + require.NoError(t, collr.Init())
521 + assert.Error(t, collr.Check())
522 }
523
524 -func TestBind_404(t *testing.T) {
524 +func TestCollector_404(t *testing.T) {
525 ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(404) }))
526 defer ts.Close()
527
528 - job := New()
529 - job.URL = ts.URL + "/json/v1"
530 - require.NoError(t, job.Init())
531 - assert.Error(t, job.Check())
528 + collr := New()
529 + collr.URL = ts.URL + "/json/v1"
530 + require.NoError(t, collr.Init())
531 + assert.Error(t, collr.Check())
532 }
src/go/plugin/go.d/collector/bind/init.go
+11 -11
@@ -11,27 +11,27 @@ import (
11 "github.com/netdata/netdata/go/plugins/pkg/matcher"
12 )
13
14 -func (b *Bind) validateConfig() error {
15 - if b.URL == "" {
14 +func (c *Collector) validateConfig() error {
15 + if c.URL == "" {
16 return errors.New("url not set")
17 }
18 return nil
19 }
20
21 -func (b *Bind) initPermitViewMatcher() (matcher.Matcher, error) {
22 - if b.PermitView == "" {
21 +func (c *Collector) initPermitViewMatcher() (matcher.Matcher, error) {
22 + if c.PermitView == "" {
23 return nil, nil
24 }
25 - return matcher.NewSimplePatternsMatcher(b.PermitView)
25 + return matcher.NewSimplePatternsMatcher(c.PermitView)
26 }
27
28 -func (b *Bind) initBindApiClient(httpClient *http.Client) (bindAPIClient, error) {
28 +func (c *Collector) initBindApiClient(httpClient *http.Client) (bindAPIClient, error) {
29 switch {
30 - case strings.HasSuffix(b.URL, "/xml/v3"): // BIND 9.9+
31 - return newXML3Client(httpClient, b.RequestConfig), nil
32 - case strings.HasSuffix(b.URL, "/json/v1"): // BIND 9.10+
33 - return newJSONClient(httpClient, b.RequestConfig), nil
30 + case strings.HasSuffix(c.URL, "/xml/v3"): // BIND 9.9+
31 + return newXML3Client(httpClient, c.RequestConfig), nil
32 + case strings.HasSuffix(c.URL, "/json/v1"): // BIND 9.10+
33 + return newJSONClient(httpClient, c.RequestConfig), nil
34 default:
35 - return nil, fmt.Errorf("URL %s is wrong, supported endpoints: `/xml/v3`, `/json/v1`", b.URL)
35 + return nil, fmt.Errorf("URL %s is wrong, supported endpoints: `/xml/v3`, `/json/v1`", c.URL)
36 }
37 }
src/go/plugin/go.d/collector/boinc/collect.go
+11 -11
@@ -7,31 +7,31 @@ import (
7 "net"
8 )
9
10 -func (b *Boinc) collect() (map[string]int64, error) {
11 - if b.conn == nil {
12 - conn, err := b.establishConn()
10 +func (c *Collector) collect() (map[string]int64, error) {
11 + if c.conn == nil {
12 + conn, err := c.establishConn()
13 if err != nil {
14 return nil, err
15 }
16 - b.conn = conn
16 + c.conn = conn
17 }
18
19 - results, err := b.conn.getResults()
19 + results, err := c.conn.getResults()
20 if err != nil {
21 - b.Cleanup()
21 + c.Cleanup()
22 return nil, err
23 }
24
25 mx := make(map[string]int64)
26
27 - if err := b.collectResults(mx, results); err != nil {
27 + if err := c.collectResults(mx, results); err != nil {
28 return nil, err
29 }
30
31 return mx, nil
32 }
33
34 -func (b *Boinc) collectResults(mx map[string]int64, results []boincReplyResult) error {
34 +func (c *Collector) collectResults(mx map[string]int64, results []boincReplyResult) error {
35 mx["total"] = int64(len(results))
36 mx["active"] = 0
37
@@ -57,14 +57,14 @@ func (b *Boinc) collectResults(mx map[string]int64, results []boincReplyResult)
57 return nil
58 }
59
60 -func (b *Boinc) establishConn() (boincConn, error) {
61 - conn := b.newConn(b.Config, b.Logger)
60 +func (c *Collector) establishConn() (boincConn, error) {
61 + conn := c.newConn(c.Config, c.Logger)
62
63 if err := conn.connect(); err != nil {
64 return nil, fmt.Errorf("failed to establish connection: %w", err)
65 }
66
67 - if host, _, err := net.SplitHostPort(b.Address); err == nil {
67 + if host, _, err := net.SplitHostPort(c.Address); err == nil {
68 // for the commands we use, authentication is only required for remote connections
69 ip := net.ParseIP(host)
70 if host == "localhost" || (ip != nil && ip.IsLoopback()) {
src/go/plugin/go.d/collector/boinc/collector.go renamed
+18 -18
@@ -23,8 +23,8 @@ func init() {
23 })
24 }
25
26 -func New() *Boinc {
27 - return &Boinc{
26 +func New() *Collector {
27 + return &Collector{
28 Config: Config{
29 Address: "127.0.0.1:31416",
30 Timeout: confopt.Duration(time.Second * 1),
@@ -41,7 +41,7 @@ type Config struct {
41 Password string `yaml:"password" json:"password"`
42 }
43
44 -type Boinc struct {
44 +type Collector struct {
45 module.Base
46 Config `yaml:",inline" json:""`
47
@@ -51,20 +51,20 @@ type Boinc struct {
51 conn boincConn
52 }
53
54 -func (b *Boinc) Configuration() any {
55 - return b.Config
54 +func (c *Collector) Configuration() any {
55 + return c.Config
56 }
57
58 -func (b *Boinc) Init() error {
59 - if b.Address == "" {
58 +func (c *Collector) Init() error {
59 + if c.Address == "" {
60 return errors.New("config: 'address' not set")
61 }
62
63 return nil
64 }
65
66 -func (b *Boinc) Check() error {
67 - mx, err := b.collect()
66 +func (c *Collector) Check() error {
67 + mx, err := c.collect()
68 if err != nil {
69 return err
70 }
@@ -76,14 +76,14 @@ func (b *Boinc) Check() error {
76 return nil
77 }
78
79 -func (b *Boinc) Charts() *module.Charts {
80 - return b.charts
79 +func (c *Collector) Charts() *module.Charts {
80 + return c.charts
81 }
82
83 -func (b *Boinc) Collect() map[string]int64 {
84 - mx, err := b.collect()
83 +func (c *Collector) Collect() map[string]int64 {
84 + mx, err := c.collect()
85 if err != nil {
86 - b.Error(err)
86 + c.Error(err)
87 }
88
89 if len(mx) == 0 {
@@ -93,9 +93,9 @@ func (b *Boinc) Collect() map[string]int64 {
93 return mx
94 }
95
96 -func (b *Boinc) Cleanup() {
97 - if b.conn != nil {
98 - b.conn.disconnect()
99 - b.conn = nil
96 +func (c *Collector) Cleanup() {
97 + if c.conn != nil {
98 + c.conn.disconnect()
99 + c.conn = nil
100 }
101 }
src/go/plugin/go.d/collector/boinc/collector_test.go renamed
+34 -34
@@ -34,11 +34,11 @@ func Test_testDataIsValid(t *testing.T) {
34 }
35 }
36
37 -func TestBoinc_ConfigurationSerialize(t *testing.T) {
38 - module.TestConfigurationSerialize(t, &Boinc{}, dataConfigJSON, dataConfigYAML)
37 +func TestCollector_ConfigurationSerialize(t *testing.T) {
38 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
39 }
40
41 -func TestBoinc_Init(t *testing.T) {
41 +func TestCollector_Init(t *testing.T) {
42 tests := map[string]struct {
43 config Config
44 wantFail bool
@@ -59,59 +59,59 @@ func TestBoinc_Init(t *testing.T) {
59
60 for name, test := range tests {
61 t.Run(name, func(t *testing.T) {
62 - boinc := New()
63 - boinc.Config = test.config
62 + collr := New()
63 + collr.Config = test.config
64
65 if test.wantFail {
66 - assert.Error(t, boinc.Init())
66 + assert.Error(t, collr.Init())
67 } else {
68 - assert.NoError(t, boinc.Init())
68 + assert.NoError(t, collr.Init())
69 }
70 })
71 }
72 }
73
74 -func TestBoinc_Cleanup(t *testing.T) {
74 +func TestCollector_Cleanup(t *testing.T) {
75 tests := map[string]struct {
76 - prepare func() *Boinc
76 + prepare func() *Collector
77 }{
78 "not initialized": {
79 - prepare: func() *Boinc {
79 + prepare: func() *Collector {
80 return New()
81 },
82 },
83 "after check": {
84 - prepare: func() *Boinc {
85 - boinc := New()
86 - boinc.newConn = func(Config, *logger.Logger) boincConn { return prepareMockOk() }
87 - _ = boinc.Check()
88 - return boinc
84 + prepare: func() *Collector {
85 + collr := New()
86 + collr.newConn = func(Config, *logger.Logger) boincConn { return prepareMockOk() }
87 + _ = collr.Check()
88 + return collr
89 },
90 },
91 "after collect": {
92 - prepare: func() *Boinc {
93 - boinc := New()
94 - boinc.newConn = func(Config, *logger.Logger) boincConn { return prepareMockOk() }
95 - _ = boinc.Collect()
96 - return boinc
92 + prepare: func() *Collector {
93 + collr := New()
94 + collr.newConn = func(Config, *logger.Logger) boincConn { return prepareMockOk() }
95 + _ = collr.Collect()
96 + return collr
97 },
98 },
99 }
100
101 for name, test := range tests {
102 t.Run(name, func(t *testing.T) {
103 - boinc := test.prepare()
103 + collr := test.prepare()
104
105 - assert.NotPanics(t, boinc.Cleanup)
105 + assert.NotPanics(t, collr.Cleanup)
106 })
107 }
108 }
109
110 -func TestBoinc_Charts(t *testing.T) {
110 +func TestCollector_Charts(t *testing.T) {
111 assert.NotNil(t, New().Charts())
112 }
113
114 -func TestBoinc_Check(t *testing.T) {
114 +func TestCollector_Check(t *testing.T) {
115 tests := map[string]struct {
116 prepareMock func() *mockBoincConn
117 wantFail bool
@@ -128,20 +128,20 @@ func TestBoinc_Check(t *testing.T) {
128
129 for name, test := range tests {
130 t.Run(name, func(t *testing.T) {
131 - boinc := New()
131 + collr := New()
132 mock := test.prepareMock()
133 - boinc.newConn = func(Config, *logger.Logger) boincConn { return mock }
133 + collr.newConn = func(Config, *logger.Logger) boincConn { return mock }
134
135 if test.wantFail {
136 - assert.Error(t, boinc.Check())
136 + assert.Error(t, collr.Check())
137 } else {
138 - assert.NoError(t, boinc.Check())
138 + assert.NoError(t, collr.Check())
139 }
140 })
141 }
142 }
143
144 -func TestBoinc_Collect(t *testing.T) {
144 +func TestCollector_Collect(t *testing.T) {
145 tests := map[string]struct {
146 prepareMock func() *mockBoincConn
147 wantMetrics map[string]int64
@@ -212,20 +212,20 @@ func TestBoinc_Collect(t *testing.T) {
212
213 for name, test := range tests {
214 t.Run(name, func(t *testing.T) {
215 - boinc := New()
215 + collr := New()
216 mock := test.prepareMock()
217 - boinc.newConn = func(Config, *logger.Logger) boincConn { return mock }
217 + collr.newConn = func(Config, *logger.Logger) boincConn { return mock }
218
219 - mx := boinc.Collect()
219 + mx := collr.Collect()
220
221 require.Equal(t, test.wantMetrics, mx)
222
223 if len(test.wantMetrics) > 0 {
224 - module.TestMetricsHasAllChartsDims(t, boinc.Charts(), mx)
224 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
225 }
226
227 assert.Equal(t, test.disconnectBeforeCleanup, mock.disconnectCalled, "disconnect before cleanup")
228 - boinc.Cleanup()
228 + collr.Cleanup()
229 assert.Equal(t, test.disconnectAfterCleanup, mock.disconnectCalled, "disconnect after cleanup")
230 })
231 }
src/go/plugin/go.d/collector/cassandra/charts.go
+1 -1
@@ -442,7 +442,7 @@ var (
442 }
443 )
444
445 -func (c *Cassandra) addThreadPoolCharts(pool *threadPoolMetrics) {
445 +func (c *Collector) addThreadPoolCharts(pool *threadPoolMetrics) {
446 charts := chartsTmplThreadPool.Copy()
447
448 for _, chart := range *charts {
src/go/plugin/go.d/collector/cassandra/collect.go
+13 -13
@@ -14,7 +14,7 @@ const (
14 suffixValue = "_value"
15 )
16
17 -func (c *Cassandra) collect() (map[string]int64, error) {
17 +func (c *Collector) collect() (map[string]int64, error) {
18 pms, err := c.prom.ScrapeSeries()
19 if err != nil {
20 return nil, err
@@ -22,7 +22,7 @@ func (c *Cassandra) collect() (map[string]int64, error) {
22
23 if c.validateMetrics {
24 if !isCassandraMetrics(pms) {
25 - return nil, errors.New("collected metrics aren't Cassandra metrics")
25 + return nil, errors.New("collected metrics aren't Collector metrics")
26 }
27 c.validateMetrics = false
28 }
@@ -36,7 +36,7 @@ func (c *Cassandra) collect() (map[string]int64, error) {
36 return mx, nil
37 }
38
39 -func (c *Cassandra) resetMetrics() {
39 +func (c *Collector) resetMetrics() {
40 cm := newCassandraMetrics()
41 for key, p := range c.mx.threadPools {
42 cm.threadPools[key] = &threadPoolMetrics{
@@ -47,7 +47,7 @@ func (c *Cassandra) resetMetrics() {
47 c.mx = cm
48 }
49
50 -func (c *Cassandra) processMetric(mx map[string]int64) {
50 +func (c *Collector) processMetric(mx map[string]int64) {
51 c.mx.clientReqTotalLatencyReads.write(mx, "client_request_total_latency_reads")
52 c.mx.clientReqTotalLatencyWrites.write(mx, "client_request_total_latency_writes")
53 c.mx.clientReqLatencyReads.write(mx, "client_request_latency_reads")
@@ -138,7 +138,7 @@ func (c *Cassandra) processMetric(mx map[string]int64) {
138 }
139 }
140
141 -func (c *Cassandra) collectMetrics(pms prometheus.Series) {
141 +func (c *Collector) collectMetrics(pms prometheus.Series) {
142 c.collectClientRequestMetrics(pms)
143 c.collectDroppedMessagesMetrics(pms)
144 c.collectThreadPoolsMetrics(pms)
@@ -148,7 +148,7 @@ func (c *Cassandra) collectMetrics(pms prometheus.Series) {
148 c.collectCompactionMetrics(pms)
149 }
150
151 -func (c *Cassandra) collectClientRequestMetrics(pms prometheus.Series) {
151 +func (c *Collector) collectClientRequestMetrics(pms prometheus.Series) {
152 const metric = "org_apache_cassandra_metrics_clientrequest"
153
154 var rw struct{ read, write *metricValue }
@@ -222,7 +222,7 @@ func (c *Cassandra) collectClientRequestMetrics(pms prometheus.Series) {
222 }
223 }
224
225 -func (c *Cassandra) collectCacheMetrics(pms prometheus.Series) {
225 +func (c *Collector) collectCacheMetrics(pms prometheus.Series) {
226 const metric = "org_apache_cassandra_metrics_cache"
227
228 var hm struct{ hits, misses *metricValue }
@@ -270,7 +270,7 @@ func (c *Cassandra) collectCacheMetrics(pms prometheus.Series) {
270 }
271 }
272
273 -func (c *Cassandra) collectThreadPoolsMetrics(pms prometheus.Series) {
273 +func (c *Collector) collectThreadPoolsMetrics(pms prometheus.Series) {
274 const metric = "org_apache_cassandra_metrics_threadpools"
275
276 for _, pm := range pms.FindByName(metric + suffixValue) {
@@ -301,7 +301,7 @@ func (c *Cassandra) collectThreadPoolsMetrics(pms prometheus.Series) {
301 }
302 }
303
304 -func (c *Cassandra) collectStorageMetrics(pms prometheus.Series) {
304 +func (c *Collector) collectStorageMetrics(pms prometheus.Series) {
305 const metric = "org_apache_cassandra_metrics_storage"
306
307 for _, pm := range pms.FindByName(metric + suffixCount) {
@@ -316,7 +316,7 @@ func (c *Cassandra) collectStorageMetrics(pms prometheus.Series) {
316 }
317 }
318
319 -func (c *Cassandra) collectDroppedMessagesMetrics(pms prometheus.Series) {
319 +func (c *Collector) collectDroppedMessagesMetrics(pms prometheus.Series) {
320 const metric = "org_apache_cassandra_metrics_droppedmessage"
321
322 for _, pm := range pms.FindByName(metric + suffixCount) {
@@ -324,7 +324,7 @@ func (c *Cassandra) collectDroppedMessagesMetrics(pms prometheus.Series) {
324 }
325 }
326
327 -func (c *Cassandra) collectJVMMetrics(pms prometheus.Series) {
327 +func (c *Collector) collectJVMMetrics(pms prometheus.Series) {
328 const metricMemUsed = "jvm_memory_bytes_used"
329 const metricGC = "jvm_gc_collection_seconds"
330
@@ -362,7 +362,7 @@ func (c *Cassandra) collectJVMMetrics(pms prometheus.Series) {
362 }
363 }
364
365 -func (c *Cassandra) collectCompactionMetrics(pms prometheus.Series) {
365 +func (c *Collector) collectCompactionMetrics(pms prometheus.Series) {
366 const metric = "org_apache_cassandra_metrics_compaction"
367
368 for _, pm := range pms.FindByName(metric + suffixValue) {
@@ -385,7 +385,7 @@ func (c *Cassandra) collectCompactionMetrics(pms prometheus.Series) {
385 }
386 }
387
388 -func (c *Cassandra) getThreadPoolMetrics(name string) *threadPoolMetrics {
388 +func (c *Collector) getThreadPoolMetrics(name string) *threadPoolMetrics {
389 pool, ok := c.mx.threadPools[name]
390 if !ok {
391 pool = &threadPoolMetrics{name: name}
src/go/plugin/go.d/collector/cassandra/collector.go renamed
+9 -9
@@ -28,8 +28,8 @@ func init() {
28 })
29 }
30
31 -func New() *Cassandra {
32 - return &Cassandra{
31 +func New() *Collector {
32 + return &Collector{
33 Config: Config{
34 HTTPConfig: web.HTTPConfig{
35 RequestConfig: web.RequestConfig{
@@ -51,7 +51,7 @@ type Config struct {
51 web.HTTPConfig `yaml:",inline" json:""`
52 }
53
54 -type Cassandra struct {
54 +type Collector struct {
55 module.Base
56 Config `yaml:",inline" json:""`
57
@@ -64,11 +64,11 @@ type Cassandra struct {
64 mx *cassandraMetrics
65 }
66
67 -func (c *Cassandra) Configuration() any {
67 +func (c *Collector) Configuration() any {
68 return c.Config
69 }
70
71 -func (c *Cassandra) Init() error {
71 +func (c *Collector) Init() error {
72 if err := c.validateConfig(); err != nil {
73 return fmt.Errorf("error on validating config: %v", err)
74 }
@@ -82,7 +82,7 @@ func (c *Cassandra) Init() error {
82 return nil
83 }
84
85 -func (c *Cassandra) Check() error {
85 +func (c *Collector) Check() error {
86 mx, err := c.collect()
87 if err != nil {
88 return err
@@ -94,11 +94,11 @@ func (c *Cassandra) Check() error {
94 return nil
95 }
96
97 -func (c *Cassandra) Charts() *module.Charts {
97 +func (c *Collector) Charts() *module.Charts {
98 return c.charts
99 }
100
101 -func (c *Cassandra) Collect() map[string]int64 {
101 +func (c *Collector) Collect() map[string]int64 {
102 mx, err := c.collect()
103 if err != nil {
104 c.Error(err)
@@ -110,7 +110,7 @@ func (c *Cassandra) Collect() map[string]int64 {
110 return mx
111 }
112
113 -func (c *Cassandra) Cleanup() {
113 +func (c *Collector) Cleanup() {
114 if c.prom != nil && c.prom.HTTPClient() != nil {
115 c.prom.HTTPClient().CloseIdleConnections()
116 }
src/go/plugin/go.d/collector/cassandra/collector_test.go renamed
+36 -36
@@ -32,15 +32,15 @@ func Test_testDataIsValid(t *testing.T) {
32 }
33 }
34
35 -func TestCassandra_ConfigurationSerialize(t *testing.T) {
36 - module.TestConfigurationSerialize(t, &Cassandra{}, dataConfigJSON, dataConfigYAML)
35 +func TestCollector_ConfigurationSerialize(t *testing.T) {
36 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
37 }
38
39 func TestNew(t *testing.T) {
40 - assert.IsType(t, (*Cassandra)(nil), New())
40 + assert.IsType(t, (*Collector)(nil), New())
41 }
42
43 -func TestCassandra_Init(t *testing.T) {
43 +func TestCollector_Init(t *testing.T) {
44 tests := map[string]struct {
45 config Config
46 wantFail bool
@@ -61,21 +61,21 @@ func TestCassandra_Init(t *testing.T) {
61
62 for name, test := range tests {
63 t.Run(name, func(t *testing.T) {
64 - c := New()
65 - c.Config = test.config
64 + collr := New()
65 + collr.Config = test.config
66
67 if test.wantFail {
68 - assert.Error(t, c.Init())
68 + assert.Error(t, collr.Init())
69 } else {
70 - assert.NoError(t, c.Init())
70 + assert.NoError(t, collr.Init())
71 }
72 })
73 }
74 }
75
76 -func TestCassandra_Check(t *testing.T) {
76 +func TestCollector_Check(t *testing.T) {
77 tests := map[string]struct {
78 - prepare func() (c *Cassandra, cleanup func())
78 + prepare func() (c *Collector, cleanup func())
79 wantFail bool
80 }{
81 "success on valid response": {
@@ -97,27 +97,27 @@ func TestCassandra_Check(t *testing.T) {
97
98 for name, test := range tests {
99 t.Run(name, func(t *testing.T) {
100 - c, cleanup := test.prepare()
100 + collr, cleanup := test.prepare()
101 defer cleanup()
102
103 - require.NoError(t, c.Init())
103 + require.NoError(t, collr.Init())
104
105 if test.wantFail {
106 - assert.Error(t, c.Check())
106 + assert.Error(t, collr.Check())
107 } else {
108 - assert.NoError(t, c.Check())
108 + assert.NoError(t, collr.Check())
109 }
110 })
111 }
112 }
113
114 -func TestCassandra_Charts(t *testing.T) {
114 +func TestCollector_Charts(t *testing.T) {
115 assert.NotNil(t, New().Charts())
116 }
117
118 -func TestCassandra_Collect(t *testing.T) {
118 +func TestCollector_Collect(t *testing.T) {
119 tests := map[string]struct {
120 - prepare func() (c *Cassandra, cleanup func())
120 + prepare func() (c *Collector, cleanup func())
121 wantCollected map[string]int64
122 }{
123 "success on valid response": {
@@ -246,53 +246,53 @@ func TestCassandra_Collect(t *testing.T) {
246
247 for name, test := range tests {
248 t.Run(name, func(t *testing.T) {
249 - c, cleanup := test.prepare()
249 + collr, cleanup := test.prepare()
250 defer cleanup()
251
252 - require.NoError(t, c.Init())
252 + require.NoError(t, collr.Init())
253
254 - mx := c.Collect()
254 + mx := collr.Collect()
255
256 assert.Equal(t, test.wantCollected, mx)
257 })
258 }
259 }
260
261 -func prepareCassandra() (c *Cassandra, cleanup func()) {
261 +func prepareCassandra() (collr *Collector, cleanup func()) {
262 ts := httptest.NewServer(http.HandlerFunc(
263 func(w http.ResponseWriter, r *http.Request) {
264 _, _ = w.Write(dataExpectedMetrics)
265 }))
266
267 - c = New()
268 - c.URL = ts.URL
269 - return c, ts.Close
267 + collr = New()
268 + collr.URL = ts.URL
269 + return collr, ts.Close
270 }
271
272 -func prepareCassandraInvalidData() (c *Cassandra, cleanup func()) {
272 +func prepareCassandraInvalidData() (collr *Collector, cleanup func()) {
273 ts := httptest.NewServer(http.HandlerFunc(
274 func(w http.ResponseWriter, r *http.Request) {
275 _, _ = w.Write([]byte("hello and\n goodbye"))
276 }))
277
278 - c = New()
279 - c.URL = ts.URL
280 - return c, ts.Close
278 + collr = New()
279 + collr.URL = ts.URL
280 + return collr, ts.Close
281 }
282
283 -func prepareCassandraConnectionRefused() (c *Cassandra, cleanup func()) {
284 - c = New()
285 - c.URL = "http://127.0.0.1:38001"
286 - return c, func() {}
283 +func prepareCassandraConnectionRefused() (collr *Collector, cleanup func()) {
284 + collr = New()
285 + collr.URL = "http://127.0.0.1:38001"
286 + return collr, func() {}
287 }
288
289 -func prepareCassandraResponse404() (c *Cassandra, cleanup func()) {
289 +func prepareCassandraResponse404() (collr *Collector, cleanup func()) {
290 ts := httptest.NewServer(http.HandlerFunc(
291 func(w http.ResponseWriter, r *http.Request) {
292 w.WriteHeader(http.StatusNotFound)
293 }))
294
295 - c = New()
296 - c.URL = ts.URL
297 - return c, ts.Close
295 + collr = New()
296 + collr.URL = ts.URL
297 + return collr, ts.Close
298 }
src/go/plugin/go.d/collector/cassandra/init.go
+2 -2
@@ -9,14 +9,14 @@ import (
9 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/web"
10 )
11
12 -func (c *Cassandra) validateConfig() error {
12 +func (c *Collector) validateConfig() error {
13 if c.URL == "" {
14 return errors.New("'url' is not set")
15 }
16 return nil
17 }
18
19 -func (c *Cassandra) initPrometheusClient() (prometheus.Prometheus, error) {
19 +func (c *Collector) initPrometheusClient() (prometheus.Prometheus, error) {
20 client, err := web.NewHTTPClient(c.ClientConfig)
21 if err != nil {
22 return nil, err
src/go/plugin/go.d/collector/ceph/auth.go
+3 -3
@@ -23,7 +23,7 @@ type (
23 }
24 )
25
26 -func (c *Ceph) authLogin() (string, error) {
26 +func (c *Collector) authLogin() (string, error) {
27 // https://docs.ceph.com/en/reef/mgr/ceph_api/#post--api-auth
28
29 req, err := func() (*http.Request, error) {
@@ -72,7 +72,7 @@ func (c *Ceph) authLogin() (string, error) {
72 return tok.Token, nil
73 }
74
75 -func (c *Ceph) authCheck() (bool, error) {
75 +func (c *Collector) authCheck() (bool, error) {
76 // https://docs.ceph.com/en/reef/mgr/ceph_api/#post--api-auth-check
77 if c.token == "" {
78 return false, nil
@@ -112,7 +112,7 @@ func (c *Ceph) authCheck() (bool, error) {
112 return resp.Username != "", nil
113 }
114
115 -func (c *Ceph) authLogout() error {
115 +func (c *Collector) authLogout() error {
116 // https://docs.ceph.com/en/reef/mgr/ceph_api/#post--api-auth-logout
117
118 if c.token == "" {
src/go/plugin/go.d/collector/ceph/charts.go
+4 -4
@@ -504,7 +504,7 @@ var (
504 }
505 )
506
507 -func (c *Ceph) addClusterCharts() {
507 +func (c *Collector) addClusterCharts() {
508 charts := clusterCharts.Copy()
509
510 for _, chart := range *charts {
@@ -518,7 +518,7 @@ func (c *Ceph) addClusterCharts() {
518 }
519 }
520
521 -func (c *Ceph) addOsdCharts(osdUuid, devClass, osdName string) {
521 +func (c *Collector) addOsdCharts(osdUuid, devClass, osdName string) {
522 charts := osdChartsTmpl.Copy()
523
524 for _, chart := range *charts {
@@ -540,7 +540,7 @@ func (c *Ceph) addOsdCharts(osdUuid, devClass, osdName string) {
540 }
541 }
542
543 -func (c *Ceph) addPoolCharts(poolName string) {
543 +func (c *Collector) addPoolCharts(poolName string) {
544 charts := poolChartsTmpl.Copy()
545
546 for _, chart := range *charts {
@@ -560,7 +560,7 @@ func (c *Ceph) addPoolCharts(poolName string) {
560 }
561 }
562
563 -func (c *Ceph) removeCharts(prefix string) {
563 +func (c *Collector) removeCharts(prefix string) {
564 prefix = cleanChartID(prefix)
565 for _, chart := range *c.Charts() {
566 if strings.HasPrefix(chart.ID, prefix) {
src/go/plugin/go.d/collector/ceph/collect.go
+4 -4
@@ -14,7 +14,7 @@ import (
14
15 const precision = 1000
16
17 -func (c *Ceph) collect() (map[string]int64, error) {
17 +func (c *Collector) collect() (map[string]int64, error) {
18 mx := make(map[string]int64)
19
20 if err := c.auth(); err != nil {
@@ -43,7 +43,7 @@ func (c *Ceph) collect() (map[string]int64, error) {
43 return mx, nil
44 }
45
46 -func (c *Ceph) auth() error {
46 +func (c *Collector) auth() error {
47 if c.token != "" {
48 ok, err := c.authCheck()
49 if err != nil {
@@ -64,7 +64,7 @@ func (c *Ceph) auth() error {
64 return nil
65 }
66
67 -func (c *Ceph) getFsid() (string, error) {
67 +func (c *Collector) getFsid() (string, error) {
68 req, err := web.NewHTTPRequestWithPath(c.RequestConfig, urlPathApiMonitor)
69 if err != nil {
70 return "", err
@@ -93,7 +93,7 @@ func (c *Ceph) getFsid() (string, error) {
93 return resp.MonStatus.MonMap.FSID, nil
94 }
95
96 -func (c *Ceph) webClient(statusCodes ...int) *web.Client {
96 +func (c *Collector) webClient(statusCodes ...int) *web.Client {
97 return web.DoHTTP(c.httpClient).OnNokCode(func(resp *http.Response) (bool, error) {
98 if slices.Contains(statusCodes, resp.StatusCode) {
99 return true, nil
src/go/plugin/go.d/collector/ceph/collect_health.go
+1 -1
@@ -8,7 +8,7 @@ import (
8 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/web"
9 )
10
11 -func (c *Ceph) collectHealth(mx map[string]int64) error {
11 +func (c *Collector) collectHealth(mx map[string]int64) error {
12 req, err := web.NewHTTPRequestWithPath(c.RequestConfig, urlPathApiHealthMinimal)
13 if err != nil {
14 return err
src/go/plugin/go.d/collector/ceph/collect_osd.go
+1 -1
@@ -8,7 +8,7 @@ import (
8 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/web"
9 )
10
11 -func (c *Ceph) collectOsds(mx map[string]int64) error {
11 +func (c *Collector) collectOsds(mx map[string]int64) error {
12 req, err := web.NewHTTPRequestWithPath(c.RequestConfig, urlPathApiOsd)
13 if err != nil {
14 return err
src/go/plugin/go.d/collector/ceph/collect_pools.go
+1 -1
@@ -8,7 +8,7 @@ import (
8 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/web"
9 )
10
11 -func (c *Ceph) collectPools(mx map[string]int64) error {
11 +func (c *Collector) collectPools(mx map[string]int64) error {
12 req, err := web.NewHTTPRequestWithPath(c.RequestConfig, urlPathApiPool)
13 if err != nil {
14 return err
src/go/plugin/go.d/collector/ceph/collector.go renamed
+9 -9
@@ -30,8 +30,8 @@ func init() {
30 })
31 }
32
33 -func New() *Ceph {
34 - return &Ceph{
33 +func New() *Collector {
34 + return &Collector{
35 Config: Config{
36 HTTPConfig: web.HTTPConfig{
37 RequestConfig: web.RequestConfig{
@@ -56,7 +56,7 @@ type Config struct {
56 web.HTTPConfig `yaml:",inline" json:""`
57 }
58
59 -type Ceph struct {
59 +type Collector struct {
60 module.Base
61 Config `yaml:",inline" json:""`
62
@@ -73,11 +73,11 @@ type Ceph struct {
73 seenOsds map[string]bool
74 }
75
76 -func (c *Ceph) Configuration() any {
76 +func (c *Collector) Configuration() any {
77 return c.Config
78 }
79
80 -func (c *Ceph) Init() error {
80 +func (c *Collector) Init() error {
81 if err := c.validateConfig(); err != nil {
82 return fmt.Errorf("invalid config: %v", err)
83 }
@@ -91,7 +91,7 @@ func (c *Ceph) Init() error {
91 return nil
92 }
93
94 -func (c *Ceph) Check() error {
94 +func (c *Collector) Check() error {
95 mx, err := c.collect()
96 if err != nil {
97 return err
@@ -104,11 +104,11 @@ func (c *Ceph) Check() error {
104 return nil
105 }
106
107 -func (c *Ceph) Charts() *module.Charts {
107 +func (c *Collector) Charts() *module.Charts {
108 return c.charts
109 }
110
111 -func (c *Ceph) Collect() map[string]int64 {
111 +func (c *Collector) Collect() map[string]int64 {
112 mx, err := c.collect()
113 if err != nil {
114 c.Error(err)
@@ -121,7 +121,7 @@ func (c *Ceph) Collect() map[string]int64 {
121 return mx
122 }
123
124 -func (c *Ceph) Cleanup() {
124 +func (c *Collector) Cleanup() {
125 if c.httpClient != nil {
126 if err := c.authLogout(); err != nil {
127 c.Warningf("failed to logout: %v", err)
src/go/plugin/go.d/collector/ceph/collector_test.go renamed
+43 -43
@@ -43,12 +43,12 @@ func Test_testDataIsValid(t *testing.T) {
43 }
44 }
45
46 -func TestCeph_Configuration(t *testing.T) {
47 - module.TestConfigurationSerialize(t, &Ceph{}, dataConfigJSON, dataConfigYAML)
46 +func TestCollector_Configuration(t *testing.T) {
47 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
48 }
49
50 -func TestCeph_Init(t *testing.T) {
51 - tesceph := map[string]struct {
50 +func TestCollector_Init(t *testing.T) {
51 + tests := map[string]struct {
52 wantFail bool
53 config Config
54 }{
@@ -66,24 +66,24 @@ func TestCeph_Init(t *testing.T) {
66 },
67 }
68
69 - for name, test := range tesceph {
69 + for name, test := range tests {
70 t.Run(name, func(t *testing.T) {
71 - ceph := New()
72 - ceph.Config = test.config
71 + collr := New()
72 + collr.Config = test.config
73
74 if test.wantFail {
75 - assert.Error(t, ceph.Init())
75 + assert.Error(t, collr.Init())
76 } else {
77 - assert.NoError(t, ceph.Init())
77 + assert.NoError(t, collr.Init())
78 }
79 })
80 }
81 }
82
83 -func TestCeph_Check(t *testing.T) {
83 +func TestCollector_Check(t *testing.T) {
84 tests := map[string]struct {
85 wantFail bool
86 - prepare func(t *testing.T) (ceph *Ceph, cleanup func())
86 + prepare func(t *testing.T) (collr *Collector, cleanup func())
87 }{
88 "success with valid API key": {
89 wantFail: false,
@@ -101,25 +101,25 @@ func TestCeph_Check(t *testing.T) {
101
102 for name, test := range tests {
103 t.Run(name, func(t *testing.T) {
104 - ceph, cleanup := test.prepare(t)
104 + collr, cleanup := test.prepare(t)
105 defer cleanup()
106
107 if test.wantFail {
108 - assert.Error(t, ceph.Check())
108 + assert.Error(t, collr.Check())
109 } else {
110 - assert.NoError(t, ceph.Check())
110 + assert.NoError(t, collr.Check())
111 }
112 })
113 }
114 }
115
116 -func TestCeph_Charts(t *testing.T) {
116 +func TestCollector_Charts(t *testing.T) {
117 assert.NotNil(t, New().Charts())
118 }
119
120 -func TestCeph_Collect(t *testing.T) {
120 +func TestCollector_Collect(t *testing.T) {
121 tests := map[string]struct {
122 - prepare func(t *testing.T) (ceph *Ceph, cleanup func())
122 + prepare func(t *testing.T) (collr *Collector, cleanup func())
123 wantNumOfCharts int
124 wantMetrics map[string]int64
125 }{
@@ -224,25 +224,25 @@ func TestCeph_Collect(t *testing.T) {
224
225 for name, test := range tests {
226 t.Run(name, func(t *testing.T) {
227 - ceph, cleanup := test.prepare(t)
227 + collr, cleanup := test.prepare(t)
228 defer cleanup()
229
230 - _ = ceph.Check()
230 + _ = collr.Check()
231
232 - mx := ceph.Collect()
232 + mx := collr.Collect()
233
234 require.Equal(t, test.wantMetrics, mx)
235
236 if len(test.wantMetrics) > 0 {
237 - assert.Equal(t, test.wantNumOfCharts, len(*ceph.Charts()), "want charts")
237 + assert.Equal(t, test.wantNumOfCharts, len(*collr.Charts()), "want charts")
238
239 - module.TestMetricsHasAllChartsDims(t, ceph.Charts(), mx)
239 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
240 }
241 })
242 }
243 }
244
245 -func caseOk(t *testing.T) (*Ceph, func()) {
245 +func caseOk(t *testing.T) (*Collector, func()) {
246 t.Helper()
247
248 loginResp, _ := json.Marshal(authLoginResp{Token: "secret_token"})
@@ -295,37 +295,37 @@ func caseOk(t *testing.T) (*Ceph, func()) {
295 }
296 }))
297
298 - ceph := New()
299 - ceph.URL = srv.URL
300 - ceph.Username = "user"
301 - ceph.Password = "password"
302 - require.NoError(t, ceph.Init())
298 + collr := New()
299 + collr.URL = srv.URL
300 + collr.Username = "user"
301 + collr.Password = "password"
302 + require.NoError(t, collr.Init())
303
304 - return ceph, srv.Close
304 + return collr, srv.Close
305 }
306
307 -func caseConnectionRefused(t *testing.T) (*Ceph, func()) {
307 +func caseConnectionRefused(t *testing.T) (*Collector, func()) {
308 t.Helper()
309 - ceph := New()
310 - ceph.URL = "http://127.0.0.1:65001"
311 - ceph.Username = "user"
312 - ceph.Password = "password"
313 - require.NoError(t, ceph.Init())
309 + collr := New()
310 + collr.URL = "http://127.0.0.1:65001"
311 + collr.Username = "user"
312 + collr.Password = "password"
313 + require.NoError(t, collr.Init())
314
315 - return ceph, func() {}
315 + return collr, func() {}
316 }
317
318 -func case404(t *testing.T) (*Ceph, func()) {
318 +func case404(t *testing.T) (*Collector, func()) {
319 t.Helper()
320 srv := httptest.NewServer(http.HandlerFunc(
321 func(w http.ResponseWriter, r *http.Request) {
322 w.WriteHeader(http.StatusNotFound)
323 }))
324 - ceph := New()
325 - ceph.URL = srv.URL
326 - ceph.Username = "user"
327 - ceph.Password = "password"
328 - require.NoError(t, ceph.Init())
324 + collr := New()
325 + collr.URL = srv.URL
326 + collr.Username = "user"
327 + collr.Password = "password"
328 + require.NoError(t, collr.Init())
329
330 - return ceph, srv.Close
330 + return collr, srv.Close
331 }
src/go/plugin/go.d/collector/ceph/init.go
+1 -1
@@ -6,7 +6,7 @@ import (
6 "fmt"
7 )
8
9 -func (c *Ceph) validateConfig() error {
9 +func (c *Collector) validateConfig() error {
10 if c.URL == "" {
11 return fmt.Errorf("URL is required but not set")
12 }
src/go/plugin/go.d/collector/chrony/charts.go
+1 -1
@@ -248,7 +248,7 @@ var (
248 }
249 )
250
251 -func (c *Chrony) addServerStatsCharts() {
251 +func (c *Collector) addServerStatsCharts() {
252 if err := c.Charts().Add(*serverStatsCharts.Copy()...); err != nil {
253 c.Warning(err)
254 }
src/go/plugin/go.d/collector/chrony/collect.go
+4 -4
@@ -24,7 +24,7 @@ const (
24 leapStatusUnsynchronised = 3
25 )
26
27 -func (c *Chrony) collect() (map[string]int64, error) {
27 +func (c *Collector) collect() (map[string]int64, error) {
28 if c.conn == nil {
29 client, err := c.newConn(c.Config)
30 if err != nil {
@@ -53,7 +53,7 @@ func (c *Chrony) collect() (map[string]int64, error) {
53 return mx, nil
54 }
55
56 -func (c *Chrony) collectTracking(mx map[string]int64) error {
56 +func (c *Collector) collectTracking(mx map[string]int64) error {
57 reply, err := c.conn.tracking()
58 if err != nil {
59 return fmt.Errorf("error on collecting tracking: %v", err)
@@ -82,7 +82,7 @@ func (c *Chrony) collectTracking(mx map[string]int64) error {
82 return nil
83 }
84
85 -func (c *Chrony) collectActivity(mx map[string]int64) error {
85 +func (c *Collector) collectActivity(mx map[string]int64) error {
86 reply, err := c.conn.activity()
87 if err != nil {
88 return fmt.Errorf("error on collecting activity: %v", err)
@@ -97,7 +97,7 @@ func (c *Chrony) collectActivity(mx map[string]int64) error {
97 return nil
98 }
99
100 -func (c *Chrony) collectServerStats(mx map[string]int64) error {
100 +func (c *Collector) collectServerStats(mx map[string]int64) error {
101 bs, err := c.exec.serverStats()
102 if err != nil {
103 return fmt.Errorf("error on collecting server stats: %v", err)
src/go/plugin/go.d/collector/chrony/collector.go renamed
+9 -9
@@ -24,8 +24,8 @@ func init() {
24 })
25 }
26
27 -func New() *Chrony {
28 - return &Chrony{
27 +func New() *Collector {
28 + return &Collector{
29 Config: Config{
30 Address: "127.0.0.1:323",
31 Timeout: confopt.Duration(time.Second),
@@ -42,7 +42,7 @@ type Config struct {
42 Timeout confopt.Duration `yaml:"timeout,omitempty" json:"timeout"`
43 }
44
45 -type Chrony struct {
45 +type Collector struct {
46 module.Base
47 Config `yaml:",inline" json:""`
48
@@ -55,11 +55,11 @@ type Chrony struct {
55 newConn func(c Config) (chronyConn, error)
56 }
57
58 -func (c *Chrony) Configuration() any {
58 +func (c *Collector) Configuration() any {
59 return c.Config
60 }
61
62 -func (c *Chrony) Init() error {
62 +func (c *Collector) Init() error {
63 if err := c.validateConfig(); err != nil {
64 return fmt.Errorf("config validation: %v", err)
65 }
@@ -72,7 +72,7 @@ func (c *Chrony) Init() error {
72 return nil
73 }
74
75 -func (c *Chrony) Check() error {
75 +func (c *Collector) Check() error {
76 mx, err := c.collect()
77 if err != nil {
78 return err
@@ -84,11 +84,11 @@ func (c *Chrony) Check() error {
84 return nil
85 }
86
87 -func (c *Chrony) Charts() *module.Charts {
87 +func (c *Collector) Charts() *module.Charts {
88 return c.charts
89 }
90
91 -func (c *Chrony) Collect() map[string]int64 {
91 +func (c *Collector) Collect() map[string]int64 {
92 mx, err := c.collect()
93 if err != nil {
94 c.Error(err)
@@ -100,7 +100,7 @@ func (c *Chrony) Collect() map[string]int64 {
100 return mx
101 }
102
103 -func (c *Chrony) Cleanup() {
103 +func (c *Collector) Cleanup() {
104 if c.conn != nil {
105 c.conn.close()
106 c.conn = nil
src/go/plugin/go.d/collector/chrony/collector_test.go renamed
+41 -41
@@ -30,11 +30,11 @@ func Test_testDataIsValid(t *testing.T) {
30 }
31 }
32
33 -func TestChrony_ConfigurationSerialize(t *testing.T) {
34 - module.TestConfigurationSerialize(t, &Chrony{}, dataConfigJSON, dataConfigYAML)
33 +func TestCollector_ConfigurationSerialize(t *testing.T) {
34 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
35 }
36
37 -func TestChrony_Init(t *testing.T) {
37 +func TestCollector_Init(t *testing.T) {
38 tests := map[string]struct {
39 config Config
40 wantFail bool
@@ -52,94 +52,94 @@ func TestChrony_Init(t *testing.T) {
52
53 for name, test := range tests {
54 t.Run(name, func(t *testing.T) {
55 - c := New()
56 - c.Config = test.config
55 + collr := New()
56 + collr.Config = test.config
57
58 if test.wantFail {
59 - assert.Error(t, c.Init())
59 + assert.Error(t, collr.Init())
60 } else {
61 - assert.NoError(t, c.Init())
61 + assert.NoError(t, collr.Init())
62 }
63 })
64 }
65 }
66
67 -func TestChrony_Check(t *testing.T) {
67 +func TestCollector_Check(t *testing.T) {
68 tests := map[string]struct {
69 - prepare func() *Chrony
69 + prepare func() *Collector
70 wantFail bool
71 }{
72 "tracking: success, activity: success": {
73 wantFail: false,
74 - prepare: func() *Chrony { return prepareChronyWithMock(&mockClient{}) },
74 + prepare: func() *Collector { return prepareChronyWithMock(&mockClient{}) },
75 },
76 "tracking: success, activity: fail": {
77 wantFail: true,
78 - prepare: func() *Chrony { return prepareChronyWithMock(&mockClient{errOnActivity: true}) },
78 + prepare: func() *Collector { return prepareChronyWithMock(&mockClient{errOnActivity: true}) },
79 },
80 "tracking: fail, activity: success": {
81 wantFail: true,
82 - prepare: func() *Chrony { return prepareChronyWithMock(&mockClient{errOnTracking: true}) },
82 + prepare: func() *Collector { return prepareChronyWithMock(&mockClient{errOnTracking: true}) },
83 },
84 "tracking: fail, activity: fail": {
85 wantFail: true,
86 - prepare: func() *Chrony { return prepareChronyWithMock(&mockClient{errOnTracking: true}) },
86 + prepare: func() *Collector { return prepareChronyWithMock(&mockClient{errOnTracking: true}) },
87 },
88 "fail on creating client": {
89 wantFail: true,
90 - prepare: func() *Chrony { return prepareChronyWithMock(nil) },
90 + prepare: func() *Collector { return prepareChronyWithMock(nil) },
91 },
92 }
93
94 for name, test := range tests {
95 t.Run(name, func(t *testing.T) {
96 - c := test.prepare()
96 + collr := test.prepare()
97
98 - require.NoError(t, c.Init())
98 + require.NoError(t, collr.Init())
99
100 if test.wantFail {
101 - assert.Error(t, c.Check())
101 + assert.Error(t, collr.Check())
102 } else {
103 - assert.NoError(t, c.Check())
103 + assert.NoError(t, collr.Check())
104 }
105 })
106 }
107 }
108
109 -func TestChrony_Charts(t *testing.T) {
109 +func TestCollector_Charts(t *testing.T) {
110 assert.Equal(t, len(charts), len(*New().Charts()))
111 }
112
113 -func TestChrony_Cleanup(t *testing.T) {
113 +func TestCollector_Cleanup(t *testing.T) {
114 tests := map[string]struct {
115 - prepare func(c *Chrony)
115 + prepare func(c *Collector)
116 wantClose bool
117 }{
118 "after New": {
119 wantClose: false,
120 - prepare: func(c *Chrony) {},
120 + prepare: func(c *Collector) {},
121 },
122 "after Init": {
123 wantClose: false,
124 - prepare: func(c *Chrony) { _ = c.Init() },
124 + prepare: func(c *Collector) { _ = c.Init() },
125 },
126 "after Check": {
127 wantClose: true,
128 - prepare: func(c *Chrony) { _ = c.Init(); _ = c.Check() },
128 + prepare: func(c *Collector) { _ = c.Init(); _ = c.Check() },
129 },
130 "after Collect": {
131 wantClose: true,
132 - prepare: func(c *Chrony) { _ = c.Init(); _ = c.Collect() },
132 + prepare: func(c *Collector) { _ = c.Init(); _ = c.Collect() },
133 },
134 }
135
136 for name, test := range tests {
137 t.Run(name, func(t *testing.T) {
138 m := &mockClient{}
139 - c := prepareChronyWithMock(m)
140 - test.prepare(c)
139 + collr := prepareChronyWithMock(m)
140 + test.prepare(collr)
141
142 - require.NotPanics(t, c.Cleanup)
142 + require.NotPanics(t, collr.Cleanup)
143
144 if test.wantClose {
145 assert.True(t, m.closeCalled)
@@ -150,13 +150,13 @@ func TestChrony_Cleanup(t *testing.T) {
150 }
151 }
152
153 -func TestChrony_Collect(t *testing.T) {
153 +func TestCollector_Collect(t *testing.T) {
154 tests := map[string]struct {
155 - prepare func() *Chrony
155 + prepare func() *Collector
156 expected map[string]int64
157 }{
158 "tracking: success, activity: success, serverstats: success": {
159 - prepare: func() *Chrony { return prepareChronyWithMock(&mockClient{}) },
159 + prepare: func() *Collector { return prepareChronyWithMock(&mockClient{}) },
160 expected: map[string]int64{
161 "burst_offline_sources": 3,
162 "burst_online_sources": 4,
@@ -185,7 +185,7 @@ func TestChrony_Collect(t *testing.T) {
185 },
186 },
187 "tracking: success, activity: fail": {
188 - prepare: func() *Chrony { return prepareChronyWithMock(&mockClient{errOnActivity: true}) },
188 + prepare: func() *Collector { return prepareChronyWithMock(&mockClient{errOnActivity: true}) },
189 expected: map[string]int64{
190 "current_correction": 154872,
191 "frequency": 51051185607,
@@ -205,28 +205,28 @@ func TestChrony_Collect(t *testing.T) {
205 },
206 },
207 "tracking: fail, activity: success": {
208 - prepare: func() *Chrony { return prepareChronyWithMock(&mockClient{errOnTracking: true}) },
208 + prepare: func() *Collector { return prepareChronyWithMock(&mockClient{errOnTracking: true}) },
209 expected: nil,
210 },
211 "tracking: fail, activity: fail": {
212 - prepare: func() *Chrony { return prepareChronyWithMock(&mockClient{errOnTracking: true}) },
212 + prepare: func() *Collector { return prepareChronyWithMock(&mockClient{errOnTracking: true}) },
213 expected: nil,
214 },
215 "fail on creating client": {
216 - prepare: func() *Chrony { return prepareChronyWithMock(nil) },
216 + prepare: func() *Collector { return prepareChronyWithMock(nil) },
217 expected: nil,
218 },
219 }
220
221 for name, test := range tests {
222 t.Run(name, func(t *testing.T) {
223 - c := test.prepare()
223 + collr := test.prepare()
224
225 - require.NoError(t, c.Init())
226 - c.exec = &mockChronyc{}
227 - _ = c.Check()
225 + require.NoError(t, collr.Init())
226 + collr.exec = &mockChronyc{}
227 + _ = collr.Check()
228
229 - mx := c.Collect()
229 + mx := collr.Collect()
230 copyRefMeasurementTime(mx, test.expected)
231
232 assert.Equal(t, test.expected, mx)
@@ -234,7 +234,7 @@ func TestChrony_Collect(t *testing.T) {
234 }
235 }
236
237 -func prepareChronyWithMock(m *mockClient) *Chrony {
237 +func prepareChronyWithMock(m *mockClient) *Collector {
238 c := New()
239 if m == nil {
240 c.newConn = func(_ Config) (chronyConn, error) { return nil, errors.New("mock.newClient error") }
src/go/plugin/go.d/collector/chrony/init.go
+2 -2
@@ -12,14 +12,14 @@ import (
12 "github.com/netdata/netdata/go/plugins/pkg/executable"
13 )
14
15 -func (c *Chrony) validateConfig() error {
15 +func (c *Collector) validateConfig() error {
16 if c.Address == "" {
17 return errors.New("empty 'address'")
18 }
19 return nil
20 }
21
22 -func (c *Chrony) initChronycBinary() (chronyBinary, error) {
22 +func (c *Collector) initChronycBinary() (chronyBinary, error) {
23 host, _, err := net.SplitHostPort(c.Address)
24 if err != nil {
25 return nil, err
src/go/plugin/go.d/collector/clickhouse/charts.go
+5 -5
@@ -948,7 +948,7 @@ var (
948 }
949 )
950
951 -func (c *ClickHouse) addDiskCharts(disk *seenDisk) {
951 +func (c *Collector) addDiskCharts(disk *seenDisk) {
952 charts := diskChartsTmpl.Copy()
953
954 for _, chart := range *charts {
@@ -966,12 +966,12 @@ func (c *ClickHouse) addDiskCharts(disk *seenDisk) {
966 }
967 }
968
969 -func (c *ClickHouse) removeDiskCharts(disk *seenDisk) {
969 +func (c *Collector) removeDiskCharts(disk *seenDisk) {
970 px := fmt.Sprintf("disk_%s_", disk.disk)
971 c.removeCharts(px)
972 }
973
974 -func (c *ClickHouse) addTableCharts(table *seenTable) {
974 +func (c *Collector) addTableCharts(table *seenTable) {
975 charts := tableChartsTmpl.Copy()
976
977 for _, chart := range *charts {
@@ -990,12 +990,12 @@ func (c *ClickHouse) addTableCharts(table *seenTable) {
990 }
991 }
992
993 -func (c *ClickHouse) removeTableCharts(table *seenTable) {
993 +func (c *Collector) removeTableCharts(table *seenTable) {
994 px := fmt.Sprintf("table_%s_database_%s_", table.table, table.db)
995 c.removeCharts(px)
996 }
997
998 -func (c *ClickHouse) removeCharts(prefix string) {
998 +func (c *Collector) removeCharts(prefix string) {
999 for _, chart := range *c.Charts() {
1000 if strings.HasPrefix(chart.ID, prefix) {
1001 chart.MarkRemove()
src/go/plugin/go.d/collector/clickhouse/collect.go
+2 -2
@@ -15,7 +15,7 @@ import (
15
16 const precision = 1000
17
18 -func (c *ClickHouse) collect() (map[string]int64, error) {
18 +func (c *Collector) collect() (map[string]int64, error) {
19 mx := make(map[string]int64)
20
21 if err := c.collectSystemEvents(mx); err != nil {
@@ -40,7 +40,7 @@ func (c *ClickHouse) collect() (map[string]int64, error) {
40 return mx, nil
41 }
42
43 -func (c *ClickHouse) doHTTP(req *http.Request, assign func(column, value string, lineEnd bool)) error {
43 +func (c *Collector) doHTTP(req *http.Request, assign func(column, value string, lineEnd bool)) error {
44 return web.DoHTTP(c.httpClient).Request(req, func(body io.Reader) error {
45 return readCSVResponseData(body, assign)
46 })
src/go/plugin/go.d/collector/clickhouse/collect_system_async_metrics.go
+1 -1
@@ -21,7 +21,7 @@ where
21 OR metric LIKE 'ReplicasMaxAbsoluteDelay' FORMAT CSVWithNames
22 `
23
24 -func (c *ClickHouse) collectSystemAsyncMetrics(mx map[string]int64) error {
24 +func (c *Collector) collectSystemAsyncMetrics(mx map[string]int64) error {
25 req, _ := web.NewHTTPRequest(c.RequestConfig)
26 req.URL.RawQuery = makeURLQuery(querySystemAsyncMetrics)
27
src/go/plugin/go.d/collector/clickhouse/collect_system_disks.go
+1 -1
@@ -25,7 +25,7 @@ type diskStats struct {
25 freeBytes int64
26 }
27
28 -func (c *ClickHouse) collectSystemDisks(mx map[string]int64) error {
28 +func (c *Collector) collectSystemDisks(mx map[string]int64) error {
29 req, _ := web.NewHTTPRequest(c.RequestConfig)
30 req.URL.RawQuery = makeURLQuery(querySystemDisks)
31
src/go/plugin/go.d/collector/clickhouse/collect_system_events.go
+1 -1
@@ -17,7 +17,7 @@ FROM
17 system.events FORMAT CSVWithNames
18 `
19
20 -func (c *ClickHouse) collectSystemEvents(mx map[string]int64) error {
20 +func (c *Collector) collectSystemEvents(mx map[string]int64) error {
21 req, _ := web.NewHTTPRequest(c.RequestConfig)
22 req.URL.RawQuery = makeURLQuery(querySystemEvents)
23
src/go/plugin/go.d/collector/clickhouse/collect_system_metrics.go
+1 -1
@@ -17,7 +17,7 @@ FROM
17 system.metrics FORMAT CSVWithNames
18 `
19
20 -func (c *ClickHouse) collectSystemMetrics(mx map[string]int64) error {
20 +func (c *Collector) collectSystemMetrics(mx map[string]int64) error {
21 req, _ := web.NewHTTPRequest(c.RequestConfig)
22 req.URL.RawQuery = makeURLQuery(querySystemMetrics)
23
src/go/plugin/go.d/collector/clickhouse/collect_system_parts.go
+1 -1
@@ -33,7 +33,7 @@ type tableStats struct {
33 rows int64
34 }
35
36 -func (c *ClickHouse) collectSystemParts(mx map[string]int64) error {
36 +func (c *Collector) collectSystemParts(mx map[string]int64) error {
37 req, _ := web.NewHTTPRequest(c.RequestConfig)
38 req.URL.RawQuery = makeURLQuery(querySystemParts)
39
src/go/plugin/go.d/collector/clickhouse/collect_system_processes.go
+1 -1
@@ -15,7 +15,7 @@ FROM
15 system.processes FORMAT CSVWithNames
16 `
17
18 -func (c *ClickHouse) collectLongestRunningQueryTime(mx map[string]int64) error {
18 +func (c *Collector) collectLongestRunningQueryTime(mx map[string]int64) error {
19 req, _ := web.NewHTTPRequest(c.RequestConfig)
20 req.URL.RawQuery = makeURLQuery(queryLongestQueryTime)
21
src/go/plugin/go.d/collector/clickhouse/collector.go renamed
+9 -9
@@ -25,8 +25,8 @@ func init() {
25 })
26 }
27
28 -func New() *ClickHouse {
29 - return &ClickHouse{
28 +func New() *Collector {
29 + return &Collector{
30 Config: Config{
31 HTTPConfig: web.HTTPConfig{
32 RequestConfig: web.RequestConfig{
@@ -49,7 +49,7 @@ type Config struct {
49 }
50
51 type (
52 - ClickHouse struct {
52 + Collector struct {
53 module.Base
54 Config `yaml:",inline" json:""`
55
@@ -64,11 +64,11 @@ type (
64 seenTable struct{ db, table string }
65 )
66
67 -func (c *ClickHouse) Configuration() any {
67 +func (c *Collector) Configuration() any {
68 return c.Config
69 }
70
71 -func (c *ClickHouse) Init() error {
71 +func (c *Collector) Init() error {
72 if err := c.validateConfig(); err != nil {
73 return fmt.Errorf("config validation: %v", err)
74 }
@@ -85,7 +85,7 @@ func (c *ClickHouse) Init() error {
85 return nil
86 }
87
88 -func (c *ClickHouse) Check() error {
88 +func (c *Collector) Check() error {
89 mx, err := c.collect()
90 if err != nil {
91 return err
@@ -98,11 +98,11 @@ func (c *ClickHouse) Check() error {
98 return nil
99 }
100
101 -func (c *ClickHouse) Charts() *module.Charts {
101 +func (c *Collector) Charts() *module.Charts {
102 return c.charts
103 }
104
105 -func (c *ClickHouse) Collect() map[string]int64 {
105 +func (c *Collector) Collect() map[string]int64 {
106 mx, err := c.collect()
107 if err != nil {
108 c.Error(err)
@@ -115,7 +115,7 @@ func (c *ClickHouse) Collect() map[string]int64 {
115 return mx
116 }
117
118 -func (c *ClickHouse) Cleanup() {
118 +func (c *Collector) Cleanup() {
119 if c.httpClient != nil {
120 c.httpClient.CloseIdleConnections()
121 }
src/go/plugin/go.d/collector/clickhouse/collector_test.go renamed
+32 -32
@@ -43,10 +43,10 @@ func Test_testDataIsValid(t *testing.T) {
43 }
44
45 func TestClickhouse_ConfigurationSerialize(t *testing.T) {
46 - module.TestConfigurationSerialize(t, &ClickHouse{}, dataConfigJSON, dataConfigYAML)
46 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
47 }
48
49 -func TestClickHouse_Init(t *testing.T) {
49 +func TestCollector_Init(t *testing.T) {
50 tests := map[string]struct {
51 wantFail bool
52 config Config
@@ -67,26 +67,26 @@ func TestClickHouse_Init(t *testing.T) {
67
68 for name, test := range tests {
69 t.Run(name, func(t *testing.T) {
70 - click := New()
71 - click.Config = test.config
70 + collr := New()
71 + collr.Config = test.config
72
73 if test.wantFail {
74 - assert.Error(t, click.Init())
74 + assert.Error(t, collr.Init())
75 } else {
76 - assert.NoError(t, click.Init())
76 + assert.NoError(t, collr.Init())
77 }
78 })
79 }
80 }
81
82 -func TestClickHouse_Charts(t *testing.T) {
82 +func TestCollector_Charts(t *testing.T) {
83 assert.NotNil(t, New().Charts())
84 }
85
86 -func TestClickHouse_Check(t *testing.T) {
86 +func TestCollector_Check(t *testing.T) {
87 tests := map[string]struct {
88 wantFail bool
89 - prepare func(t *testing.T) (*ClickHouse, func())
89 + prepare func(t *testing.T) (*Collector, func())
90 }{
91 "success on valid response": {
92 wantFail: false,
@@ -104,21 +104,21 @@ func TestClickHouse_Check(t *testing.T) {
104
105 for name, test := range tests {
106 t.Run(name, func(t *testing.T) {
107 - click, cleanup := test.prepare(t)
107 + collr, cleanup := test.prepare(t)
108 defer cleanup()
109
110 if test.wantFail {
111 - assert.Error(t, click.Check())
111 + assert.Error(t, collr.Check())
112 } else {
113 - assert.NoError(t, click.Check())
113 + assert.NoError(t, collr.Check())
114 }
115 })
116 }
117 }
118
119 -func TestClickHouse_Collect(t *testing.T) {
119 +func TestCollector_Collect(t *testing.T) {
120 tests := map[string]struct {
121 - prepare func(t *testing.T) (*ClickHouse, func())
121 + prepare func(t *testing.T) (*Collector, func())
122 wantMetrics map[string]int64
123 }{
124 "success on valid response": {
@@ -237,21 +237,21 @@ func TestClickHouse_Collect(t *testing.T) {
237
238 for name, test := range tests {
239 t.Run(name, func(t *testing.T) {
240 - click, cleanup := test.prepare(t)
240 + collr, cleanup := test.prepare(t)
241 defer cleanup()
242
243 - mx := click.Collect()
243 + mx := collr.Collect()
244
245 require.Equal(t, test.wantMetrics, mx)
246
247 if len(test.wantMetrics) > 0 {
248 - module.TestMetricsHasAllChartsDims(t, click.Charts(), mx)
248 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
249 }
250 })
251 }
252 }
253
254 -func prepareCaseOk(t *testing.T) (*ClickHouse, func()) {
254 +func prepareCaseOk(t *testing.T) (*Collector, func()) {
255 t.Helper()
256 srv := httptest.NewServer(http.HandlerFunc(
257 func(w http.ResponseWriter, r *http.Request) {
@@ -273,32 +273,32 @@ func prepareCaseOk(t *testing.T) (*ClickHouse, func()) {
273 }
274 }))
275
276 - click := New()
277 - click.URL = srv.URL
278 - require.NoError(t, click.Init())
276 + collr := New()
277 + collr.URL = srv.URL
278 + require.NoError(t, collr.Init())
279
280 - return click, srv.Close
280 + return collr, srv.Close
281 }
282
283 -func prepareCaseUnexpectedResponse(t *testing.T) (*ClickHouse, func()) {
283 +func prepareCaseUnexpectedResponse(t *testing.T) (*Collector, func()) {
284 t.Helper()
285 srv := httptest.NewServer(http.HandlerFunc(
286 func(w http.ResponseWriter, r *http.Request) {
287 _, _ = w.Write([]byte("hello and\n goodbye"))
288 }))
289
290 - click := New()
291 - click.URL = srv.URL
292 - require.NoError(t, click.Init())
290 + collr := New()
291 + collr.URL = srv.URL
292 + require.NoError(t, collr.Init())
293
294 - return click, srv.Close
294 + return collr, srv.Close
295 }
296
297 -func prepareCaseConnectionRefused(t *testing.T) (*ClickHouse, func()) {
297 +func prepareCaseConnectionRefused(t *testing.T) (*Collector, func()) {
298 t.Helper()
299 - click := New()
300 - click.URL = "http://127.0.0.1:65001/stat"
301 - require.NoError(t, click.Init())
299 + collr := New()
300 + collr.URL = "http://127.0.0.1:65001/stat"
301 + require.NoError(t, collr.Init())
302
303 - return click, func() {}
303 + return collr, func() {}
304 }
src/go/plugin/go.d/collector/clickhouse/init.go
+2 -2
@@ -9,13 +9,13 @@ import (
9 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/web"
10 )
11
12 -func (c *ClickHouse) validateConfig() error {
12 +func (c *Collector) validateConfig() error {
13 if c.URL == "" {
14 return errors.New("url not set")
15 }
16 return nil
17 }
18
19 -func (c *ClickHouse) initHTTPClient() (*http.Client, error) {
19 +func (c *Collector) initHTTPClient() (*http.Client, error) {
20 return web.NewHTTPClient(c.ClientConfig)
21 }
src/go/plugin/go.d/collector/cockroachdb/collect.go
+1 -1
@@ -13,7 +13,7 @@ func validCockroachDBMetrics(scraped prometheus.Series) bool {
13 return scraped.FindByName("sql_restart_savepoint_count_internal").Len() > 0
14 }
15
16 -func (c *CockroachDB) collect() (map[string]int64, error) {
16 +func (c *Collector) collect() (map[string]int64, error) {
17 scraped, err := c.prom.ScrapeSeries()
18 if err != nil {
19 return nil, err
src/go/plugin/go.d/collector/cockroachdb/collector.go renamed
+9 -9
@@ -32,8 +32,8 @@ func init() {
32 })
33 }
34
35 -func New() *CockroachDB {
36 - return &CockroachDB{
35 +func New() *Collector {
36 + return &Collector{
37 Config: Config{
38 HTTPConfig: web.HTTPConfig{
39 RequestConfig: web.RequestConfig{
@@ -53,7 +53,7 @@ type Config struct {
53 web.HTTPConfig `yaml:",inline" json:""`
54 }
55
56 -type CockroachDB struct {
56 +type Collector struct {
57 module.Base
58 Config `yaml:",inline" json:""`
59
@@ -62,11 +62,11 @@ type CockroachDB struct {
62 prom prometheus.Prometheus
63 }
64
65 -func (c *CockroachDB) Configuration() any {
65 +func (c *Collector) Configuration() any {
66 return c.Config
67 }
68
69 -func (c *CockroachDB) Init() error {
69 +func (c *Collector) Init() error {
70 if err := c.validateConfig(); err != nil {
71 return fmt.Errorf("error on validating config: %v", err)
72 }
@@ -85,7 +85,7 @@ func (c *CockroachDB) Init() error {
85 return nil
86 }
87
88 -func (c *CockroachDB) Check() error {
88 +func (c *Collector) Check() error {
89 mx, err := c.collect()
90 if err != nil {
91 return err
@@ -97,11 +97,11 @@ func (c *CockroachDB) Check() error {
97 return nil
98 }
99
100 -func (c *CockroachDB) Charts() *Charts {
100 +func (c *Collector) Charts() *Charts {
101 return c.charts
102 }
103
104 -func (c *CockroachDB) Collect() map[string]int64 {
104 +func (c *Collector) Collect() map[string]int64 {
105 mx, err := c.collect()
106 if err != nil {
107 c.Error(err)
@@ -113,7 +113,7 @@ func (c *CockroachDB) Collect() map[string]int64 {
113 return mx
114 }
115
116 -func (c *CockroachDB) Cleanup() {
116 +func (c *Collector) Cleanup() {
117 if c.prom != nil && c.prom.HTTPClient() != nil {
118 c.prom.HTTPClient().CloseIdleConnections()
119 }
src/go/plugin/go.d/collector/cockroachdb/collector_test.go renamed
+64 -64
@@ -33,59 +33,59 @@ func Test_testDataIsValid(t *testing.T) {
33 }
34 }
35
36 -func TestCockroachDB_ConfigurationSerialize(t *testing.T) {
37 - module.TestConfigurationSerialize(t, &CockroachDB{}, dataConfigJSON, dataConfigYAML)
36 +func TestCollector_ConfigurationSerialize(t *testing.T) {
37 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
38 }
39
40 func TestNew(t *testing.T) {
41 assert.Implements(t, (*module.Module)(nil), New())
42 }
43
44 -func TestCockroachDB_Init(t *testing.T) {
45 - cdb := prepareCockroachDB()
44 +func TestCollector_Init(t *testing.T) {
45 + collr := prepareCockroachDB()
46
47 - assert.NoError(t, cdb.Init())
47 + assert.NoError(t, collr.Init())
48 }
49
50 -func TestCockroachDB_Init_ReturnsFalseIfConfigURLIsNotSet(t *testing.T) {
51 - cdb := prepareCockroachDB()
52 - cdb.URL = ""
50 +func TestCollector_Init_ReturnsFalseIfConfigURLIsNotSet(t *testing.T) {
51 + collr := prepareCockroachDB()
52 + collr.URL = ""
53
54 - assert.Error(t, cdb.Init())
54 + assert.Error(t, collr.Init())
55 }
56
57 -func TestCockroachDB_Init_ReturnsFalseIfClientWrongTLSCA(t *testing.T) {
58 - cdb := prepareCockroachDB()
59 - cdb.ClientConfig.TLSConfig.TLSCA = "testdata/tls"
57 +func TestCollector_Init_ReturnsFalseIfClientWrongTLSCA(t *testing.T) {
58 + collr := prepareCockroachDB()
59 + collr.ClientConfig.TLSConfig.TLSCA = "testdata/tls"
60
61 - assert.Error(t, cdb.Init())
61 + assert.Error(t, collr.Init())
62 }
63
64 -func TestCockroachDB_Check(t *testing.T) {
65 - cdb, srv := prepareClientServer(t)
64 +func TestCollector_Check(t *testing.T) {
65 + collr, srv := prepareClientServer(t)
66 defer srv.Close()
67
68 - assert.NoError(t, cdb.Check())
68 + assert.NoError(t, collr.Check())
69 }
70
71 -func TestCockroachDB_Check_ReturnsFalseIfConnectionRefused(t *testing.T) {
72 - cdb := New()
73 - cdb.URL = "http://127.0.0.1:38001/metrics"
74 - require.NoError(t, cdb.Init())
71 +func TestCollector_Check_ReturnsFalseIfConnectionRefused(t *testing.T) {
72 + collr := New()
73 + collr.URL = "http://127.0.0.1:38001/metrics"
74 + require.NoError(t, collr.Init())
75
76 - assert.Error(t, cdb.Check())
76 + assert.Error(t, collr.Check())
77 }
78
79 -func TestCockroachDB_Charts(t *testing.T) {
79 +func TestCollector_Charts(t *testing.T) {
80 assert.NotNil(t, New().Charts())
81 }
82
83 -func TestCockroachDB_Cleanup(t *testing.T) {
83 +func TestCollector_Cleanup(t *testing.T) {
84 assert.NotPanics(t, New().Cleanup)
85 }
86
87 -func TestCockroachDB_Collect(t *testing.T) {
88 - cdb, srv := prepareClientServer(t)
87 +func TestCollector_Collect(t *testing.T) {
88 + collr, srv := prepareClientServer(t)
89 defer srv.Close()
90
91 expected := map[string]int64{
@@ -221,98 +221,98 @@ func TestCockroachDB_Collect(t *testing.T) {
221 "valcount": 124081,
222 }
223
224 - mx := cdb.Collect()
224 + mx := collr.Collect()
225
226 assert.Equal(t, expected, mx)
227
228 - module.TestMetricsHasAllChartsDims(t, cdb.Charts(), mx)
228 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
229 }
230
231 -func TestCockroachDB_Collect_ReturnsNilIfNotCockroachDBMetrics(t *testing.T) {
232 - cdb, srv := prepareClientServerNotCockroachDBMetricResponse(t)
231 +func TestCollector_Collect_ReturnsNilIfNotCockroachDBMetrics(t *testing.T) {
232 + collr, srv := prepareClientServerNotCockroachDBMetricResponse(t)
233 defer srv.Close()
234
235 - assert.Nil(t, cdb.Collect())
235 + assert.Nil(t, collr.Collect())
236 }
237
238 -func TestCockroachDB_Collect_ReturnsNilIfConnectionRefused(t *testing.T) {
239 - cdb := prepareCockroachDB()
240 - require.NoError(t, cdb.Init())
238 +func TestCollector_Collect_ReturnsNilIfConnectionRefused(t *testing.T) {
239 + collr := prepareCockroachDB()
240 + require.NoError(t, collr.Init())
241
242 - assert.Nil(t, cdb.Collect())
242 + assert.Nil(t, collr.Collect())
243 }
244
245 -func TestCockroachDB_Collect_ReturnsNilIfReceiveInvalidResponse(t *testing.T) {
246 - cdb, ts := prepareClientServerInvalidDataResponse(t)
245 +func TestCollector_Collect_ReturnsNilIfReceiveInvalidResponse(t *testing.T) {
246 + collr, ts := prepareClientServerInvalidDataResponse(t)
247 defer ts.Close()
248
249 - assert.Nil(t, cdb.Collect())
249 + assert.Nil(t, collr.Collect())
250 }
251
252 -func TestCockroachDB_Collect_ReturnsNilIfReceiveResponse404(t *testing.T) {
253 - cdb, ts := prepareClientServerResponse404(t)
252 +func TestCollector_Collect_ReturnsNilIfReceiveResponse404(t *testing.T) {
253 + collr, ts := prepareClientServerResponse404(t)
254 defer ts.Close()
255
256 - assert.Nil(t, cdb.Collect())
256 + assert.Nil(t, collr.Collect())
257 }
258
259 -func prepareCockroachDB() *CockroachDB {
260 - cdb := New()
261 - cdb.URL = "http://127.0.0.1:38001/metrics"
262 - return cdb
259 +func prepareCockroachDB() *Collector {
260 + collr := New()
261 + collr.URL = "http://127.0.0.1:38001/metrics"
262 + return collr
263 }
264
265 -func prepareClientServer(t *testing.T) (*CockroachDB, *httptest.Server) {
265 +func prepareClientServer(t *testing.T) (*Collector, *httptest.Server) {
266 t.Helper()
267 ts := httptest.NewServer(http.HandlerFunc(
268 func(w http.ResponseWriter, r *http.Request) {
269 _, _ = w.Write(dataExpectedMetrics)
270 }))
271
272 - cdb := New()
273 - cdb.URL = ts.URL
274 - require.NoError(t, cdb.Init())
272 + collr := New()
273 + collr.URL = ts.URL
274 + require.NoError(t, collr.Init())
275
276 - return cdb, ts
276 + return collr, ts
277 }
278
279 -func prepareClientServerNotCockroachDBMetricResponse(t *testing.T) (*CockroachDB, *httptest.Server) {
279 +func prepareClientServerNotCockroachDBMetricResponse(t *testing.T) (*Collector, *httptest.Server) {
280 t.Helper()
281 ts := httptest.NewServer(http.HandlerFunc(
282 func(w http.ResponseWriter, r *http.Request) {
283 _, _ = w.Write(dataUnexpectedMetrics)
284 }))
285
286 - cdb := New()
287 - cdb.URL = ts.URL
288 - require.NoError(t, cdb.Init())
286 + collr := New()
287 + collr.URL = ts.URL
288 + require.NoError(t, collr.Init())
289
290 - return cdb, ts
290 + return collr, ts
291 }
292
293 -func prepareClientServerInvalidDataResponse(t *testing.T) (*CockroachDB, *httptest.Server) {
293 +func prepareClientServerInvalidDataResponse(t *testing.T) (*Collector, *httptest.Server) {
294 t.Helper()
295 ts := httptest.NewServer(http.HandlerFunc(
296 func(w http.ResponseWriter, r *http.Request) {
297 _, _ = w.Write([]byte("hello and\n goodbye"))
298 }))
299
300 - cdb := New()
301 - cdb.URL = ts.URL
302 - require.NoError(t, cdb.Init())
300 + collr := New()
301 + collr.URL = ts.URL
302 + require.NoError(t, collr.Init())
303
304 - return cdb, ts
304 + return collr, ts
305 }
306
307 -func prepareClientServerResponse404(t *testing.T) (*CockroachDB, *httptest.Server) {
307 +func prepareClientServerResponse404(t *testing.T) (*Collector, *httptest.Server) {
308 t.Helper()
309 ts := httptest.NewServer(http.HandlerFunc(
310 func(w http.ResponseWriter, r *http.Request) {
311 w.WriteHeader(http.StatusNotFound)
312 }))
313
314 - cdb := New()
315 - cdb.URL = ts.URL
316 - require.NoError(t, cdb.Init())
317 - return cdb, ts
314 + collr := New()
315 + collr.URL = ts.URL
316 + require.NoError(t, collr.Init())
317 + return collr, ts
318 }
src/go/plugin/go.d/collector/cockroachdb/init.go
+2 -2
@@ -9,14 +9,14 @@ import (
9 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/web"
10 )
11
12 -func (c *CockroachDB) validateConfig() error {
12 +func (c *Collector) validateConfig() error {
13 if c.URL == "" {
14 return errors.New("URL is not set")
15 }
16 return nil
17 }
18
19 -func (c *CockroachDB) initPrometheusClient() (prometheus.Prometheus, error) {
19 +func (c *Collector) initPrometheusClient() (prometheus.Prometheus, error) {
20 client, err := web.NewHTTPClient(c.ClientConfig)
21 if err != nil {
22 return nil, err
src/go/plugin/go.d/collector/consul/charts.go
+8 -8
@@ -557,7 +557,7 @@ var (
557 }
558 )
559
560 -func (c *Consul) addGlobalCharts() {
560 +func (c *Collector) addGlobalCharts() {
561 if !c.isTelemetryPrometheusEnabled() {
562 return
563 }
@@ -602,7 +602,7 @@ func (c *Consul) addGlobalCharts() {
602 }
603 }
604
605 -func (c *Consul) addServerAutopilotHealthCharts() {
605 +func (c *Collector) addServerAutopilotHealthCharts() {
606 charts := serverAutopilotHealthCharts.Copy()
607
608 for _, chart := range *charts {
@@ -644,7 +644,7 @@ func newNodeHealthCheckChart(check *agentCheck) *module.Chart {
644 return chart
645 }
646
647 -func (c *Consul) addHealthCheckCharts(check *agentCheck) {
647 +func (c *Collector) addHealthCheckCharts(check *agentCheck) {
648 var chart *module.Chart
649
650 if check.ServiceName != "" {
@@ -663,7 +663,7 @@ func (c *Consul) addHealthCheckCharts(check *agentCheck) {
663 }
664 }
665
666 -func (c *Consul) removeHealthCheckCharts(checkID string) {
666 +func (c *Collector) removeHealthCheckCharts(checkID string) {
667 id := fmt.Sprintf("health_check_%s_status", checkID)
668
669 chart := c.Charts().Get(id)
@@ -676,7 +676,7 @@ func (c *Consul) removeHealthCheckCharts(checkID string) {
676 chart.MarkNotCreated()
677 }
678
679 -func (c *Consul) addLeaderCharts() {
679 +func (c *Collector) addLeaderCharts() {
680 charts := serverLeaderCharts.Copy()
681
682 for _, chart := range *charts {
@@ -691,7 +691,7 @@ func (c *Consul) addLeaderCharts() {
691 }
692 }
693
694 -func (c *Consul) removeLeaderCharts() {
694 +func (c *Collector) removeLeaderCharts() {
695 s := make(map[string]bool)
696 for _, v := range serverLeaderCharts {
697 s[v.ID] = true
@@ -705,7 +705,7 @@ func (c *Consul) removeLeaderCharts() {
705 }
706 }
707
708 -func (c *Consul) addFollowerCharts() {
708 +func (c *Collector) addFollowerCharts() {
709 charts := serverFollowerCharts.Copy()
710 if c.isCloudManaged() {
711 // 'autopilot_server_lastContact_leader' comes from 'operator/autopilot/health' which is disabled
@@ -724,7 +724,7 @@ func (c *Consul) addFollowerCharts() {
724 }
725 }
726
727 -func (c *Consul) removeFollowerCharts() {
727 +func (c *Collector) removeFollowerCharts() {
728 s := make(map[string]bool)
729 for _, v := range serverFollowerCharts {
730 s[v.ID] = true
src/go/plugin/go.d/collector/consul/collect.go
+7 -7
@@ -14,7 +14,7 @@ const (
14 precision = 1000
15 )
16
17 -func (c *Consul) collect() (map[string]int64, error) {
17 +func (c *Collector) collect() (map[string]int64, error) {
18 if c.cfg == nil {
19 if err := c.collectConfiguration(); err != nil {
20 return nil, err
@@ -51,29 +51,29 @@ func (c *Consul) collect() (map[string]int64, error) {
51 return mx, nil
52 }
53
54 -func (c *Consul) isTelemetryPrometheusEnabled() bool {
54 +func (c *Collector) isTelemetryPrometheusEnabled() bool {
55 return c.cfg.DebugConfig.Telemetry.PrometheusOpts.Expiration != "0s"
56 }
57
58 -func (c *Consul) isCloudManaged() bool {
58 +func (c *Collector) isCloudManaged() bool {
59 return c.cfg.DebugConfig.Cloud.ClientSecret != "" || c.cfg.DebugConfig.Cloud.ResourceID != ""
60 }
61
62 -func (c *Consul) hasLicense() bool {
62 +func (c *Collector) hasLicense() bool {
63 return c.cfg.Stats.License.ID != ""
64 }
65
66 -func (c *Consul) isServer() bool {
66 +func (c *Collector) isServer() bool {
67 return c.cfg.Config.Server
68 }
69
70 -func (c *Consul) client(statusCodes ...int) *web.Client {
70 +func (c *Collector) client(statusCodes ...int) *web.Client {
71 return web.DoHTTP(c.httpClient).OnNokCode(func(resp *http.Response) (bool, error) {
72 return slices.Contains(statusCodes, resp.StatusCode), nil
73 })
74 }
75
76 -func (c *Consul) createRequest(urlPath string) (*http.Request, error) {
76 +func (c *Collector) createRequest(urlPath string) (*http.Request, error) {
77 req, err := web.NewHTTPRequestWithPath(c.RequestConfig, urlPath)
78 if err != nil {
79 return nil, fmt.Errorf("failed to create '%s' request: %w", urlPath, err)
src/go/plugin/go.d/collector/consul/collect_autopilot.go
+1 -1
@@ -26,7 +26,7 @@ type autopilotHealth struct {
26 }
27 }
28
29 -func (c *Consul) collectAutopilotHealth(mx map[string]int64) error {
29 +func (c *Collector) collectAutopilotHealth(mx map[string]int64) error {
30 req, err := c.createRequest(urlPathOperationAutopilotHealth)
31 if err != nil {
32 return err
src/go/plugin/go.d/collector/consul/collect_checks.go
+1 -1
@@ -19,7 +19,7 @@ type agentCheck struct {
19 ServiceTags []string
20 }
21
22 -func (c *Consul) collectChecks(mx map[string]int64) error {
22 +func (c *Collector) collectChecks(mx map[string]int64) error {
23 req, err := c.createRequest(urlPathAgentChecks)
24 if err != nil {
25 return err
src/go/plugin/go.d/collector/consul/collect_config.go
+1 -1
@@ -45,7 +45,7 @@ type consulConfig struct {
45 }
46 }
47
48 -func (c *Consul) collectConfiguration() error {
48 +func (c *Collector) collectConfiguration() error {
49 req, err := c.createRequest(urlPathAgentSelf)
50 if err != nil {
51 return err
src/go/plugin/go.d/collector/consul/collect_metrics.go
+8 -8
@@ -12,7 +12,7 @@ import (
12 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/prometheus"
13 )
14
15 -func (c *Consul) collectMetricsPrometheus(mx map[string]int64) error {
15 +func (c *Collector) collectMetricsPrometheus(mx map[string]int64) error {
16 mfs, err := c.prom.Scrape()
17 if err != nil {
18 return err
@@ -85,7 +85,7 @@ func (c *Consul) collectMetricsPrometheus(mx map[string]int64) error {
85 return nil
86 }
87
88 -func (c *Consul) isLeader(mfs prometheus.MetricFamilies) (bool, bool) {
88 +func (c *Collector) isLeader(mfs prometheus.MetricFamilies) (bool, bool) {
89 var mf *prometheus.MetricFamily
90 for _, v := range []string{"server_isLeader_isLeader", "server_isLeader"} {
91 if mf = mfs.GetGauge(c.promMetricNameWithHostname(v)); mf != nil {
@@ -103,7 +103,7 @@ func (c *Consul) isLeader(mfs prometheus.MetricFamilies) (bool, bool) {
103 return mf.Metrics()[0].Gauge().Value() == 1, true
104 }
105
106 -func (c *Consul) collectGauge(mx map[string]int64, mfs prometheus.MetricFamilies, name string, mul float64, aliases ...string) {
106 +func (c *Collector) collectGauge(mx map[string]int64, mfs prometheus.MetricFamilies, name string, mul float64, aliases ...string) {
107 var mf *prometheus.MetricFamily
108 for _, v := range append(aliases, name) {
109 if mf = mfs.GetGauge(c.promMetricNameWithHostname(v)); mf != nil {
@@ -125,7 +125,7 @@ func (c *Consul) collectGauge(mx map[string]int64, mfs prometheus.MetricFamilies
125 }
126 }
127
128 -func (c *Consul) collectGaugeBool(mx map[string]int64, mfs prometheus.MetricFamilies, name string, aliases ...string) {
128 +func (c *Collector) collectGaugeBool(mx map[string]int64, mfs prometheus.MetricFamilies, name string, aliases ...string) {
129 var mf *prometheus.MetricFamily
130 for _, v := range append(aliases, name) {
131 if mf = mfs.GetGauge(c.promMetricNameWithHostname(v)); mf != nil {
@@ -148,7 +148,7 @@ func (c *Consul) collectGaugeBool(mx map[string]int64, mfs prometheus.MetricFami
148 }
149 }
150
151 -func (c *Consul) collectCounter(mx map[string]int64, mfs prometheus.MetricFamilies, name string, mul float64) {
151 +func (c *Collector) collectCounter(mx map[string]int64, mfs prometheus.MetricFamilies, name string, mul float64) {
152 mf := mfs.GetCounter(c.promMetricName(name))
153 if mf == nil {
154 return
@@ -161,7 +161,7 @@ func (c *Consul) collectCounter(mx map[string]int64, mfs prometheus.MetricFamili
161 }
162 }
163
164 -func (c *Consul) collectSummary(mx map[string]int64, mfs prometheus.MetricFamilies, name string) {
164 +func (c *Collector) collectSummary(mx map[string]int64, mfs prometheus.MetricFamilies, name string) {
165 mf := mfs.GetSummary(c.promMetricName(name))
166 if mf == nil {
167 return
@@ -185,7 +185,7 @@ func (c *Consul) collectSummary(mx map[string]int64, mfs prometheus.MetricFamili
185 mx[name+"_count"] = int64(m.Summary().Count())
186 }
187
188 -func (c *Consul) promMetricName(name string) string {
188 +func (c *Collector) promMetricName(name string) string {
189 px := c.cfg.DebugConfig.Telemetry.MetricsPrefix
190 return px + "_" + name
191 }
@@ -194,7 +194,7 @@ var forbiddenCharsReplacer = strings.NewReplacer(" ", "_", ".", "_", "=", "_", "
194
195 // controlled by 'disable_hostname'
196 // https://developer.hashicorp.com/consul/docs/agent/config/config-files#telemetry-disable_hostname
197 -func (c *Consul) promMetricNameWithHostname(name string) string {
197 +func (c *Collector) promMetricNameWithHostname(name string) string {
198 px := c.cfg.DebugConfig.Telemetry.MetricsPrefix
199 node := forbiddenCharsReplacer.Replace(c.cfg.Config.NodeName)
200
src/go/plugin/go.d/collector/consul/collect_net_rtt.go
+1 -1
@@ -22,7 +22,7 @@ type nodeCoordinates struct {
22 }
23 }
24
25 -func (c *Consul) collectNetworkRTT(mx map[string]int64) error {
25 +func (c *Collector) collectNetworkRTT(mx map[string]int64) error {
26 req, err := c.createRequest(urlPathCoordinateNodes)
27 if err != nil {
28 return err
src/go/plugin/go.d/collector/consul/collector.go renamed
+9 -9
@@ -32,8 +32,8 @@ func init() {
32 })
33 }
34
35 -func New() *Consul {
36 - return &Consul{
35 +func New() *Collector {
36 + return &Collector{
37 Config: Config{
38 HTTPConfig: web.HTTPConfig{
39 RequestConfig: web.RequestConfig{
@@ -57,7 +57,7 @@ type Config struct {
57 ACLToken string `yaml:"acl_token,omitempty" json:"acl_token"`
58 }
59
60 -type Consul struct {
60 +type Collector struct {
61 module.Base
62 Config `yaml:",inline" json:""`
63
@@ -75,11 +75,11 @@ type Consul struct {
75 checks map[string]bool
76 }
77
78 -func (c *Consul) Configuration() any {
78 +func (c *Collector) Configuration() any {
79 return c.Config
80 }
81
82 -func (c *Consul) Init() error {
82 +func (c *Collector) Init() error {
83 if err := c.validateConfig(); err != nil {
84 return fmt.Errorf("config validation: %v", err)
85 }
@@ -99,7 +99,7 @@ func (c *Consul) Init() error {
99 return nil
100 }
101
102 -func (c *Consul) Check() error {
102 +func (c *Collector) Check() error {
103 mx, err := c.collect()
104 if err != nil {
105 return err
@@ -111,11 +111,11 @@ func (c *Consul) Check() error {
111 return nil
112 }
113
114 -func (c *Consul) Charts() *module.Charts {
114 +func (c *Collector) Charts() *module.Charts {
115 return c.charts
116 }
117
118 -func (c *Consul) Collect() map[string]int64 {
118 +func (c *Collector) Collect() map[string]int64 {
119 mx, err := c.collect()
120 if err != nil {
121 c.Error(err)
@@ -127,7 +127,7 @@ func (c *Consul) Collect() map[string]int64 {
127 return mx
128 }
129
130 -func (c *Consul) Cleanup() {
130 +func (c *Collector) Cleanup() {
131 if c.httpClient != nil {
132 c.httpClient.CloseIdleConnections()
133 }
src/go/plugin/go.d/collector/consul/collector_test.go renamed
+57 -57
@@ -59,11 +59,11 @@ func Test_testDataIsValid(t *testing.T) {
59 }
60 }
61
62 -func TestConsul_ConfigurationSerialize(t *testing.T) {
63 - module.TestConfigurationSerialize(t, &Consul{}, dataConfigJSON, dataConfigYAML)
62 +func TestCollector_ConfigurationSerialize(t *testing.T) {
63 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
64 }
65
66 -func TestConsul_Init(t *testing.T) {
66 +func TestCollector_Init(t *testing.T) {
67 tests := map[string]struct {
68 wantFail bool
69 config Config
@@ -84,22 +84,22 @@ func TestConsul_Init(t *testing.T) {
84
85 for name, test := range tests {
86 t.Run(name, func(t *testing.T) {
87 - consul := New()
88 - consul.Config = test.config
87 + collr := New()
88 + collr.Config = test.config
89
90 if test.wantFail {
91 - assert.Error(t, consul.Init())
91 + assert.Error(t, collr.Init())
92 } else {
93 - assert.NoError(t, consul.Init())
93 + assert.NoError(t, collr.Init())
94 }
95 })
96 }
97 }
98
99 -func TestConsul_Check(t *testing.T) {
99 +func TestCollector_Check(t *testing.T) {
100 tests := map[string]struct {
101 wantFail bool
102 - prepare func(t *testing.T) (consul *Consul, cleanup func())
102 + prepare func(t *testing.T) (collr *Collector, cleanup func())
103 }{
104 "success on response from Consul v1.13.2 server": {
105 wantFail: false,
@@ -137,21 +137,21 @@ func TestConsul_Check(t *testing.T) {
137
138 for name, test := range tests {
139 t.Run(name, func(t *testing.T) {
140 - consul, cleanup := test.prepare(t)
140 + collr, cleanup := test.prepare(t)
141 defer cleanup()
142
143 if test.wantFail {
144 - assert.Error(t, consul.Check())
144 + assert.Error(t, collr.Check())
145 } else {
146 - assert.NoError(t, consul.Check())
146 + assert.NoError(t, collr.Check())
147 }
148 })
149 }
150 }
151
152 -func TestConsul_Collect(t *testing.T) {
152 +func TestCollector_Collect(t *testing.T) {
153 tests := map[string]struct {
154 - prepare func(t *testing.T) (consul *Consul, cleanup func())
154 + prepare func(t *testing.T) (collr *Collector, cleanup func())
155 wantNumOfCharts int
156 wantMetrics map[string]int64
157 }{
@@ -532,23 +532,23 @@ func TestConsul_Collect(t *testing.T) {
532
533 for name, test := range tests {
534 t.Run(name, func(t *testing.T) {
535 - consul, cleanup := test.prepare(t)
535 + collr, cleanup := test.prepare(t)
536 defer cleanup()
537
538 - mx := consul.Collect()
538 + mx := collr.Collect()
539
540 delete(mx, "autopilot_server_stable_time")
541 delete(test.wantMetrics, "autopilot_server_stable_time")
542
543 require.Equal(t, test.wantMetrics, mx)
544 if len(test.wantMetrics) > 0 {
545 - assert.Equal(t, test.wantNumOfCharts, len(*consul.Charts()))
545 + assert.Equal(t, test.wantNumOfCharts, len(*collr.Charts()))
546 }
547 })
548 }
549 }
550
551 -func caseConsulV1143CloudServerResponse(t *testing.T) (*Consul, func()) {
551 +func caseConsulV1143CloudServerResponse(t *testing.T) (*Collector, func()) {
552 t.Helper()
553 srv := httptest.NewServer(http.HandlerFunc(
554 func(w http.ResponseWriter, r *http.Request) {
@@ -568,15 +568,15 @@ func caseConsulV1143CloudServerResponse(t *testing.T) (*Consul, func()) {
568 }
569 }))
570
571 - consul := New()
572 - consul.URL = srv.URL
571 + collr := New()
572 + collr.URL = srv.URL
573
574 - require.NoError(t, consul.Init())
574 + require.NoError(t, collr.Init())
575
576 - return consul, srv.Close
576 + return collr, srv.Close
577 }
578
579 -func caseConsulV1132ServerResponse(t *testing.T) (*Consul, func()) {
579 +func caseConsulV1132ServerResponse(t *testing.T) (*Collector, func()) {
580 t.Helper()
581 srv := httptest.NewServer(http.HandlerFunc(
582 func(w http.ResponseWriter, r *http.Request) {
@@ -596,15 +596,15 @@ func caseConsulV1132ServerResponse(t *testing.T) (*Consul, func()) {
596 }
597 }))
598
599 - consul := New()
600 - consul.URL = srv.URL
599 + collr := New()
600 + collr.URL = srv.URL
601
602 - require.NoError(t, consul.Init())
602 + require.NoError(t, collr.Init())
603
604 - return consul, srv.Close
604 + return collr, srv.Close
605 }
606
607 -func caseConsulV1132ServerWithHostnameResponse(t *testing.T) (*Consul, func()) {
607 +func caseConsulV1132ServerWithHostnameResponse(t *testing.T) (*Collector, func()) {
608 t.Helper()
609 srv := httptest.NewServer(http.HandlerFunc(
610 func(w http.ResponseWriter, r *http.Request) {
@@ -624,15 +624,15 @@ func caseConsulV1132ServerWithHostnameResponse(t *testing.T) (*Consul, func()) {
624 }
625 }))
626
627 - consul := New()
628 - consul.URL = srv.URL
627 + collr := New()
628 + collr.URL = srv.URL
629
630 - require.NoError(t, consul.Init())
630 + require.NoError(t, collr.Init())
631
632 - return consul, srv.Close
632 + return collr, srv.Close
633 }
634
635 -func caseConsulV1132ServerWithDisabledPrometheus(t *testing.T) (*Consul, func()) {
635 +func caseConsulV1132ServerWithDisabledPrometheus(t *testing.T) (*Collector, func()) {
636 t.Helper()
637 srv := httptest.NewServer(http.HandlerFunc(
638 func(w http.ResponseWriter, r *http.Request) {
@@ -650,15 +650,15 @@ func caseConsulV1132ServerWithDisabledPrometheus(t *testing.T) (*Consul, func())
650 }
651 }))
652
653 - consul := New()
654 - consul.URL = srv.URL
653 + collr := New()
654 + collr.URL = srv.URL
655
656 - require.NoError(t, consul.Init())
656 + require.NoError(t, collr.Init())
657
658 - return consul, srv.Close
658 + return collr, srv.Close
659 }
660
661 -func caseConsulV1132ClientResponse(t *testing.T) (*Consul, func()) {
661 +func caseConsulV1132ClientResponse(t *testing.T) (*Collector, func()) {
662 t.Helper()
663 srv := httptest.NewServer(http.HandlerFunc(
664 func(w http.ResponseWriter, r *http.Request) {
@@ -674,48 +674,48 @@ func caseConsulV1132ClientResponse(t *testing.T) (*Consul, func()) {
674 }
675 }))
676
677 - consul := New()
678 - consul.URL = srv.URL
677 + collr := New()
678 + collr.URL = srv.URL
679
680 - require.NoError(t, consul.Init())
680 + require.NoError(t, collr.Init())
681
682 - return consul, srv.Close
682 + return collr, srv.Close
683 }
684
685 -func caseInvalidDataResponse(t *testing.T) (*Consul, func()) {
685 +func caseInvalidDataResponse(t *testing.T) (*Collector, func()) {
686 t.Helper()
687 srv := httptest.NewServer(http.HandlerFunc(
688 func(w http.ResponseWriter, r *http.Request) {
689 _, _ = w.Write([]byte("hello and\n goodbye"))
690 }))
691
692 - consul := New()
693 - consul.URL = srv.URL
692 + collr := New()
693 + collr.URL = srv.URL
694
695 - require.NoError(t, consul.Init())
695 + require.NoError(t, collr.Init())
696
697 - return consul, srv.Close
697 + return collr, srv.Close
698 }
699
700 -func caseConnectionRefused(t *testing.T) (*Consul, func()) {
700 +func caseConnectionRefused(t *testing.T) (*Collector, func()) {
701 t.Helper()
702 - consul := New()
703 - consul.URL = "http://127.0.0.1:65535/"
704 - require.NoError(t, consul.Init())
702 + collr := New()
703 + collr.URL = "http://127.0.0.1:65535/"
704 + require.NoError(t, collr.Init())
705
706 - return consul, func() {}
706 + return collr, func() {}
707 }
708
709 -func case404(t *testing.T) (*Consul, func()) {
709 +func case404(t *testing.T) (*Collector, func()) {
710 t.Helper()
711 srv := httptest.NewServer(http.HandlerFunc(
712 func(w http.ResponseWriter, r *http.Request) {
713 w.WriteHeader(http.StatusNotFound)
714 }))
715
716 - consul := New()
717 - consul.URL = srv.URL
718 - require.NoError(t, consul.Init())
716 + collr := New()
717 + collr.URL = srv.URL
718 + require.NoError(t, collr.Init())
719
720 - return consul, srv.Close
720 + return collr, srv.Close
721 }
src/go/plugin/go.d/collector/consul/init.go
+3 -3
@@ -11,20 +11,20 @@ import (
11 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/web"
12 )
13
14 -func (c *Consul) validateConfig() error {
14 +func (c *Collector) validateConfig() error {
15 if c.URL == "" {
16 return errors.New("'url' not set")
17 }
18 return nil
19 }
20
21 -func (c *Consul) initHTTPClient() (*http.Client, error) {
21 +func (c *Collector) initHTTPClient() (*http.Client, error) {
22 return web.NewHTTPClient(c.ClientConfig)
23 }
24
25 const urlPathAgentMetrics = "/v1/agent/metrics"
26
27 -func (c *Consul) initPrometheusClient(httpClient *http.Client) (prometheus.Prometheus, error) {
27 +func (c *Collector) initPrometheusClient(httpClient *http.Client) (prometheus.Prometheus, error) {
28 r, err := web.NewHTTPRequest(c.RequestConfig.Copy())
29 if err != nil {
30 return nil, err
src/go/plugin/go.d/collector/coredns/collect.go
+86 -86
@@ -48,8 +48,8 @@ type requestMetricsNames struct {
48 responseRcodeCountTotal string
49 }
50
51 -func (cd *CoreDNS) collect() (map[string]int64, error) {
52 - raw, err := cd.prom.ScrapeSeries()
51 +func (c *Collector) collect() (map[string]int64, error) {
52 + raw, err := c.prom.ScrapeSeries()
53
54 if err != nil {
55 return nil, err
@@ -59,81 +59,81 @@ func (cd *CoreDNS) collect() (map[string]int64, error) {
59
60 // some metric names are different depending on the version
61 // update them once
62 - if !cd.skipVersionCheck {
63 - cd.updateVersionDependentMetrics(raw)
64 - cd.skipVersionCheck = true
62 + if !c.skipVersionCheck {
63 + c.updateVersionDependentMetrics(raw)
64 + c.skipVersionCheck = true
65 }
66
67 //we can only get these metrics if we know the server version
68 - if cd.version == nil {
68 + if c.version == nil {
69 return nil, errors.New("unable to determine server version")
70 }
71
72 - cd.collectPanic(mx, raw)
73 - cd.collectSummaryRequests(mx, raw)
74 - cd.collectSummaryRequestsPerType(mx, raw)
75 - cd.collectSummaryResponsesPerRcode(mx, raw)
72 + c.collectPanic(mx, raw)
73 + c.collectSummaryRequests(mx, raw)
74 + c.collectSummaryRequestsPerType(mx, raw)
75 + c.collectSummaryResponsesPerRcode(mx, raw)
76
77 - if cd.perServerMatcher != nil {
78 - cd.collectPerServerRequests(mx, raw)
79 - //cd.collectPerServerRequestsDuration(mx, raw)
80 - cd.collectPerServerRequestPerType(mx, raw)
81 - cd.collectPerServerResponsePerRcode(mx, raw)
77 + if c.perServerMatcher != nil {
78 + c.collectPerServerRequests(mx, raw)
79 + //c.collectPerServerRequestsDuration(mx, raw)
80 + c.collectPerServerRequestPerType(mx, raw)
81 + c.collectPerServerResponsePerRcode(mx, raw)
82 }
83
84 - if cd.perZoneMatcher != nil {
85 - cd.collectPerZoneRequests(mx, raw)
86 - //cd.collectPerZoneRequestsDuration(mx, raw)
87 - cd.collectPerZoneRequestsPerType(mx, raw)
88 - cd.collectPerZoneResponsesPerRcode(mx, raw)
84 + if c.perZoneMatcher != nil {
85 + c.collectPerZoneRequests(mx, raw)
86 + //c.collectPerZoneRequestsDuration(mx, raw)
87 + c.collectPerZoneRequestsPerType(mx, raw)
88 + c.collectPerZoneResponsesPerRcode(mx, raw)
89 }
90
91 return stm.ToMap(mx), nil
92 }
93
94 -func (cd *CoreDNS) updateVersionDependentMetrics(raw prometheus.Series) {
95 - version := cd.parseVersion(raw)
94 +func (c *Collector) updateVersionDependentMetrics(raw prometheus.Series) {
95 + version := c.parseVersion(raw)
96 if version == nil {
97 return
98 }
99 - cd.version = version
100 - if cd.version.LTE(version169) {
101 - cd.metricNames.panicCountTotal = metricPanicCountTotal169orOlder
102 - cd.metricNames.requestCountTotal = metricRequestCountTotal169orOlder
103 - cd.metricNames.requestTypeCountTotal = metricRequestTypeCountTotal169orOlder
104 - cd.metricNames.responseRcodeCountTotal = metricResponseRcodeCountTotal169orOlder
99 + c.version = version
100 + if c.version.LTE(version169) {
101 + c.metricNames.panicCountTotal = metricPanicCountTotal169orOlder
102 + c.metricNames.requestCountTotal = metricRequestCountTotal169orOlder
103 + c.metricNames.requestTypeCountTotal = metricRequestTypeCountTotal169orOlder
104 + c.metricNames.responseRcodeCountTotal = metricResponseRcodeCountTotal169orOlder
105 } else {
106 - cd.metricNames.panicCountTotal = metricPanicCountTotal170orNewer
107 - cd.metricNames.requestCountTotal = metricRequestCountTotal170orNewer
108 - cd.metricNames.requestTypeCountTotal = metricRequestTypeCountTotal170orNewer
109 - cd.metricNames.responseRcodeCountTotal = metricResponseRcodeCountTotal170orNewer
106 + c.metricNames.panicCountTotal = metricPanicCountTotal170orNewer
107 + c.metricNames.requestCountTotal = metricRequestCountTotal170orNewer
108 + c.metricNames.requestTypeCountTotal = metricRequestTypeCountTotal170orNewer
109 + c.metricNames.responseRcodeCountTotal = metricResponseRcodeCountTotal170orNewer
110 }
111 }
112
113 -func (cd *CoreDNS) parseVersion(raw prometheus.Series) *semver.Version {
113 +func (c *Collector) parseVersion(raw prometheus.Series) *semver.Version {
114 var versionStr string
115 for _, metric := range raw.FindByName("coredns_build_info") {
116 versionStr = metric.Labels.Get("version")
117 }
118 if versionStr == "" {
119 - cd.Error("cannot find version string in metrics")
119 + c.Error("cannot find version string in metrics")
120 return nil
121 }
122
123 version, err := semver.Make(versionStr)
124 if err != nil {
125 - cd.Errorf("failed to find server version: %v", err)
125 + c.Errorf("failed to find server version: %v", err)
126 return nil
127 }
128 return &version
129 }
130
131 -func (cd *CoreDNS) collectPanic(mx *metrics, raw prometheus.Series) {
132 - mx.Panic.Set(raw.FindByName(cd.metricNames.panicCountTotal).Max())
131 +func (c *Collector) collectPanic(mx *metrics, raw prometheus.Series) {
132 + mx.Panic.Set(raw.FindByName(c.metricNames.panicCountTotal).Max())
133 }
134
135 -func (cd *CoreDNS) collectSummaryRequests(mx *metrics, raw prometheus.Series) {
136 - for _, metric := range raw.FindByName(cd.metricNames.requestCountTotal) {
135 +func (c *Collector) collectSummaryRequests(mx *metrics, raw prometheus.Series) {
136 + for _, metric := range raw.FindByName(c.metricNames.requestCountTotal) {
137 var (
138 family = metric.Labels.Get("family")
139 proto = metric.Labels.Get("proto")
@@ -162,7 +162,7 @@ func (cd *CoreDNS) collectSummaryRequests(mx *metrics, raw prometheus.Series) {
162 }
163 }
164
165 -//func (cd *CoreDNS) collectSummaryRequestsDuration(mx *metrics, raw prometheus.Series) {
165 +//func (cd *Collector) collectSummaryRequestsDuration(mx *metrics, raw prometheus.Series) {
166 // for _, metric := range raw.FindByName(metricRequestDurationSecondsBucket) {
167 // var (
168 // server = metric.Labels.Get("server")
@@ -180,8 +180,8 @@ func (cd *CoreDNS) collectSummaryRequests(mx *metrics, raw prometheus.Series) {
180 // processRequestDuration(&mx.Summary.RequestConfig)
181 //}
182
183 -func (cd *CoreDNS) collectSummaryRequestsPerType(mx *metrics, raw prometheus.Series) {
184 - for _, metric := range raw.FindByName(cd.metricNames.requestTypeCountTotal) {
183 +func (c *Collector) collectSummaryRequestsPerType(mx *metrics, raw prometheus.Series) {
184 + for _, metric := range raw.FindByName(c.metricNames.requestTypeCountTotal) {
185 var (
186 server = metric.Labels.Get("server")
187 typ = metric.Labels.Get("type")
@@ -197,8 +197,8 @@ func (cd *CoreDNS) collectSummaryRequestsPerType(mx *metrics, raw prometheus.Ser
197 }
198 }
199
200 -func (cd *CoreDNS) collectSummaryResponsesPerRcode(mx *metrics, raw prometheus.Series) {
201 - for _, metric := range raw.FindByName(cd.metricNames.responseRcodeCountTotal) {
200 +func (c *Collector) collectSummaryResponsesPerRcode(mx *metrics, raw prometheus.Series) {
201 + for _, metric := range raw.FindByName(c.metricNames.responseRcodeCountTotal) {
202 var (
203 rcode = metric.Labels.Get("rcode")
204 server = metric.Labels.Get("server")
@@ -216,8 +216,8 @@ func (cd *CoreDNS) collectSummaryResponsesPerRcode(mx *metrics, raw prometheus.S
216
217 // Per Server
218
219 -func (cd *CoreDNS) collectPerServerRequests(mx *metrics, raw prometheus.Series) {
220 - for _, metric := range raw.FindByName(cd.metricNames.requestCountTotal) {
219 +func (c *Collector) collectPerServerRequests(mx *metrics, raw prometheus.Series) {
220 + for _, metric := range raw.FindByName(c.metricNames.requestCountTotal) {
221 var (
222 family = metric.Labels.Get("family")
223 proto = metric.Labels.Get("proto")
@@ -230,7 +230,7 @@ func (cd *CoreDNS) collectPerServerRequests(mx *metrics, raw prometheus.Series)
230 continue
231 }
232
233 - if !cd.perServerMatcher.MatchString(server) {
233 + if !c.perServerMatcher.MatchString(server) {
234 continue
235 }
236
@@ -238,9 +238,9 @@ func (cd *CoreDNS) collectPerServerRequests(mx *metrics, raw prometheus.Series)
238 server = emptyServerReplaceName
239 }
240
241 - if !cd.collectedServers[server] {
242 - cd.addNewServerCharts(server)
243 - cd.collectedServers[server] = true
241 + if !c.collectedServers[server] {
242 + c.addNewServerCharts(server)
243 + c.collectedServers[server] = true
244 }
245
246 if _, ok := mx.PerServer[server]; !ok {
@@ -261,7 +261,7 @@ func (cd *CoreDNS) collectPerServerRequests(mx *metrics, raw prometheus.Series)
261 }
262 }
263
264 -//func (cd *CoreDNS) collectPerServerRequestsDuration(mx *metrics, raw prometheus.Series) {
264 +//func (cd *Collector) collectPerServerRequestsDuration(mx *metrics, raw prometheus.Series) {
265 // for _, metric := range raw.FindByName(metricRequestDurationSecondsBucket) {
266 // var (
267 // server = metric.Labels.Get("server")
@@ -298,8 +298,8 @@ func (cd *CoreDNS) collectPerServerRequests(mx *metrics, raw prometheus.Series)
298 // }
299 //}
300
301 -func (cd *CoreDNS) collectPerServerRequestPerType(mx *metrics, raw prometheus.Series) {
302 - for _, metric := range raw.FindByName(cd.metricNames.requestTypeCountTotal) {
301 +func (c *Collector) collectPerServerRequestPerType(mx *metrics, raw prometheus.Series) {
302 + for _, metric := range raw.FindByName(c.metricNames.requestTypeCountTotal) {
303 var (
304 server = metric.Labels.Get("server")
305 typ = metric.Labels.Get("type")
@@ -311,7 +311,7 @@ func (cd *CoreDNS) collectPerServerRequestPerType(mx *metrics, raw prometheus.Se
311 continue
312 }
313
314 - if !cd.perServerMatcher.MatchString(server) {
314 + if !c.perServerMatcher.MatchString(server) {
315 continue
316 }
317
@@ -319,9 +319,9 @@ func (cd *CoreDNS) collectPerServerRequestPerType(mx *metrics, raw prometheus.Se
319 server = emptyServerReplaceName
320 }
321
322 - if !cd.collectedServers[server] {
323 - cd.addNewServerCharts(server)
324 - cd.collectedServers[server] = true
322 + if !c.collectedServers[server] {
323 + c.addNewServerCharts(server)
324 + c.collectedServers[server] = true
325 }
326
327 if _, ok := mx.PerServer[server]; !ok {
@@ -332,8 +332,8 @@ func (cd *CoreDNS) collectPerServerRequestPerType(mx *metrics, raw prometheus.Se
332 }
333 }
334
335 -func (cd *CoreDNS) collectPerServerResponsePerRcode(mx *metrics, raw prometheus.Series) {
336 - for _, metric := range raw.FindByName(cd.metricNames.responseRcodeCountTotal) {
335 +func (c *Collector) collectPerServerResponsePerRcode(mx *metrics, raw prometheus.Series) {
336 + for _, metric := range raw.FindByName(c.metricNames.responseRcodeCountTotal) {
337 var (
338 rcode = metric.Labels.Get("rcode")
339 server = metric.Labels.Get("server")
@@ -345,7 +345,7 @@ func (cd *CoreDNS) collectPerServerResponsePerRcode(mx *metrics, raw prometheus.
345 continue
346 }
347
348 - if !cd.perServerMatcher.MatchString(server) {
348 + if !c.perServerMatcher.MatchString(server) {
349 continue
350 }
351
@@ -353,9 +353,9 @@ func (cd *CoreDNS) collectPerServerResponsePerRcode(mx *metrics, raw prometheus.
353 server = emptyServerReplaceName
354 }
355
356 - if !cd.collectedServers[server] {
357 - cd.addNewServerCharts(server)
358 - cd.collectedServers[server] = true
356 + if !c.collectedServers[server] {
357 + c.addNewServerCharts(server)
358 + c.collectedServers[server] = true
359 }
360
361 if _, ok := mx.PerServer[server]; !ok {
@@ -368,8 +368,8 @@ func (cd *CoreDNS) collectPerServerResponsePerRcode(mx *metrics, raw prometheus.
368
369 // Per Zone
370
371 -func (cd *CoreDNS) collectPerZoneRequests(mx *metrics, raw prometheus.Series) {
372 - for _, metric := range raw.FindByName(cd.metricNames.requestCountTotal) {
371 +func (c *Collector) collectPerZoneRequests(mx *metrics, raw prometheus.Series) {
372 + for _, metric := range raw.FindByName(c.metricNames.requestCountTotal) {
373 var (
374 family = metric.Labels.Get("family")
375 proto = metric.Labels.Get("proto")
@@ -381,7 +381,7 @@ func (cd *CoreDNS) collectPerZoneRequests(mx *metrics, raw prometheus.Series) {
381 continue
382 }
383
384 - if !cd.perZoneMatcher.MatchString(zone) {
384 + if !c.perZoneMatcher.MatchString(zone) {
385 continue
386 }
387
@@ -389,9 +389,9 @@ func (cd *CoreDNS) collectPerZoneRequests(mx *metrics, raw prometheus.Series) {
389 zone = rootZoneReplaceName
390 }
391
392 - if !cd.collectedZones[zone] {
393 - cd.addNewZoneCharts(zone)
394 - cd.collectedZones[zone] = true
392 + if !c.collectedZones[zone] {
393 + c.addNewZoneCharts(zone)
394 + c.collectedZones[zone] = true
395 }
396
397 if _, ok := mx.PerZone[zone]; !ok {
@@ -405,7 +405,7 @@ func (cd *CoreDNS) collectPerZoneRequests(mx *metrics, raw prometheus.Series) {
405 }
406 }
407
408 -//func (cd *CoreDNS) collectPerZoneRequestsDuration(mx *metrics, raw prometheus.Series) {
408 +//func (cd *Collector) collectPerZoneRequestsDuration(mx *metrics, raw prometheus.Series) {
409 // for _, metric := range raw.FindByName(metricRequestDurationSecondsBucket) {
410 // var (
411 // zone = metric.Labels.Get("zone")
@@ -441,8 +441,8 @@ func (cd *CoreDNS) collectPerZoneRequests(mx *metrics, raw prometheus.Series) {
441 // }
442 //}
443
444 -func (cd *CoreDNS) collectPerZoneRequestsPerType(mx *metrics, raw prometheus.Series) {
445 - for _, metric := range raw.FindByName(cd.metricNames.requestTypeCountTotal) {
444 +func (c *Collector) collectPerZoneRequestsPerType(mx *metrics, raw prometheus.Series) {
445 + for _, metric := range raw.FindByName(c.metricNames.requestTypeCountTotal) {
446 var (
447 typ = metric.Labels.Get("type")
448 zone = metric.Labels.Get("zone")
@@ -453,7 +453,7 @@ func (cd *CoreDNS) collectPerZoneRequestsPerType(mx *metrics, raw prometheus.Ser
453 continue
454 }
455
456 - if !cd.perZoneMatcher.MatchString(zone) {
456 + if !c.perZoneMatcher.MatchString(zone) {
457 continue
458 }
459
@@ -461,9 +461,9 @@ func (cd *CoreDNS) collectPerZoneRequestsPerType(mx *metrics, raw prometheus.Ser
461 zone = rootZoneReplaceName
462 }
463
464 - if !cd.collectedZones[zone] {
465 - cd.addNewZoneCharts(zone)
466 - cd.collectedZones[zone] = true
464 + if !c.collectedZones[zone] {
465 + c.addNewZoneCharts(zone)
466 + c.collectedZones[zone] = true
467 }
468
469 if _, ok := mx.PerZone[zone]; !ok {
@@ -474,8 +474,8 @@ func (cd *CoreDNS) collectPerZoneRequestsPerType(mx *metrics, raw prometheus.Ser
474 }
475 }
476
477 -func (cd *CoreDNS) collectPerZoneResponsesPerRcode(mx *metrics, raw prometheus.Series) {
478 - for _, metric := range raw.FindByName(cd.metricNames.responseRcodeCountTotal) {
477 +func (c *Collector) collectPerZoneResponsesPerRcode(mx *metrics, raw prometheus.Series) {
478 + for _, metric := range raw.FindByName(c.metricNames.responseRcodeCountTotal) {
479 var (
480 rcode = metric.Labels.Get("rcode")
481 zone = metric.Labels.Get("zone")
@@ -486,7 +486,7 @@ func (cd *CoreDNS) collectPerZoneResponsesPerRcode(mx *metrics, raw prometheus.S
486 continue
487 }
488
489 - if !cd.perZoneMatcher.MatchString(zone) {
489 + if !c.perZoneMatcher.MatchString(zone) {
490 continue
491 }
492
@@ -494,9 +494,9 @@ func (cd *CoreDNS) collectPerZoneResponsesPerRcode(mx *metrics, raw prometheus.S
494 zone = rootZoneReplaceName
495 }
496
497 - if !cd.collectedZones[zone] {
498 - cd.addNewZoneCharts(zone)
499 - cd.collectedZones[zone] = true
497 + if !c.collectedZones[zone] {
498 + c.addNewZoneCharts(zone)
499 + c.collectedZones[zone] = true
500 }
501
502 if _, ok := mx.PerZone[zone]; !ok {
@@ -684,7 +684,7 @@ func setResponsePerRcode(mx *response, value float64, rcode string) {
684
685 // ---
686
687 -func (cd *CoreDNS) addNewServerCharts(name string) {
687 +func (c *Collector) addNewServerCharts(name string) {
688 charts := serverCharts.Copy()
689 for _, chart := range *charts {
690 chart.ID = fmt.Sprintf(chart.ID, "server", name)
@@ -695,10 +695,10 @@ func (cd *CoreDNS) addNewServerCharts(name string) {
695 dim.ID = fmt.Sprintf(dim.ID, name)
696 }
697 }
698 - _ = cd.charts.Add(*charts...)
698 + _ = c.charts.Add(*charts...)
699 }
700
701 -func (cd *CoreDNS) addNewZoneCharts(name string) {
701 +func (c *Collector) addNewZoneCharts(name string) {
702 charts := zoneCharts.Copy()
703 for _, chart := range *charts {
704 chart.ID = fmt.Sprintf(chart.ID, "zone", name)
@@ -710,5 +710,5 @@ func (cd *CoreDNS) addNewZoneCharts(name string) {
710 dim.ID = fmt.Sprintf(dim.ID, name)
711 }
712 }
713 - _ = cd.charts.Add(*charts...)
713 + _ = c.charts.Add(*charts...)
714 }
src/go/plugin/go.d/collector/coredns/collector.go renamed
+23 -23
@@ -28,8 +28,8 @@ func init() {
28 })
29 }
30
31 -func New() *CoreDNS {
32 - return &CoreDNS{
31 +func New() *Collector {
32 + return &Collector{
33 Config: Config{
34 HTTPConfig: web.HTTPConfig{
35 RequestConfig: web.RequestConfig{
@@ -53,7 +53,7 @@ type Config struct {
53 PerZoneStats matcher.SimpleExpr `yaml:"per_zone_stats,omitempty" json:"per_zone_stats"`
54 }
55
56 -type CoreDNS struct {
56 +type Collector struct {
57 module.Base
58 Config `yaml:",inline" json:""`
59
@@ -70,42 +70,42 @@ type CoreDNS struct {
70 metricNames requestMetricsNames
71 }
72
73 -func (cd *CoreDNS) Configuration() any {
74 - return cd.Config
73 +func (c *Collector) Configuration() any {
74 + return c.Config
75 }
76
77 -func (cd *CoreDNS) Init() error {
78 - if err := cd.validateConfig(); err != nil {
77 +func (c *Collector) Init() error {
78 + if err := c.validateConfig(); err != nil {
79 return fmt.Errorf("config validation: %v", err)
80 }
81
82 - sm, err := cd.initPerServerMatcher()
82 + sm, err := c.initPerServerMatcher()
83 if err != nil {
84 return fmt.Errorf("init per_server_stats: %v", err)
85 }
86 if sm != nil {
87 - cd.perServerMatcher = sm
87 + c.perServerMatcher = sm
88 }
89
90 - zm, err := cd.initPerZoneMatcher()
90 + zm, err := c.initPerZoneMatcher()
91 if err != nil {
92 return fmt.Errorf("init per_zone_stats: %v", err)
93 }
94 if zm != nil {
95 - cd.perZoneMatcher = zm
95 + c.perZoneMatcher = zm
96 }
97
98 - prom, err := cd.initPrometheusClient()
98 + prom, err := c.initPrometheusClient()
99 if err != nil {
100 return fmt.Errorf("init prometheus client: %v", err)
101 }
102 - cd.prom = prom
102 + c.prom = prom
103
104 return nil
105 }
106
107 -func (cd *CoreDNS) Check() error {
108 - mx, err := cd.collect()
107 +func (c *Collector) Check() error {
108 + mx, err := c.collect()
109 if err != nil {
110 return err
111 }
@@ -116,23 +116,23 @@ func (cd *CoreDNS) Check() error {
116 return nil
117 }
118
119 -func (cd *CoreDNS) Charts() *Charts {
120 - return cd.charts
119 +func (c *Collector) Charts() *Charts {
120 + return c.charts
121 }
122
123 -func (cd *CoreDNS) Collect() map[string]int64 {
124 - mx, err := cd.collect()
123 +func (c *Collector) Collect() map[string]int64 {
124 + mx, err := c.collect()
125
126 if err != nil {
127 - cd.Error(err)
127 + c.Error(err)
128 return nil
129 }
130
131 return mx
132 }
133
134 -func (cd *CoreDNS) Cleanup() {
135 - if cd.prom != nil && cd.prom.HTTPClient() != nil {
136 - cd.prom.HTTPClient().CloseIdleConnections()
134 +func (c *Collector) Cleanup() {
135 + if c.prom != nil && c.prom.HTTPClient() != nil {
136 + c.prom.HTTPClient().CloseIdleConnections()
137 }
138 }
src/go/plugin/go.d/collector/coredns/collector_test.go renamed
+53 -53
@@ -41,29 +41,29 @@ func Test_testDataIsValid(t *testing.T) {
41 }
42 }
43
44 -func TestCoreDNS_ConfigurationSerialize(t *testing.T) {
45 - module.TestConfigurationSerialize(t, &CoreDNS{}, dataConfigJSON, dataConfigYAML)
44 +func TestCollector_ConfigurationSerialize(t *testing.T) {
45 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
46 }
47
48 -func TestCoreDNS_Charts(t *testing.T) {
48 +func TestCollector_Charts(t *testing.T) {
49 assert.NotNil(t, New().Charts())
50 }
51
52 -func TestCoreDNS_Cleanup(t *testing.T) {
52 +func TestCollector_Cleanup(t *testing.T) {
53 New().Cleanup()
54 }
55
56 -func TestCoreDNS_Init(t *testing.T) {
56 +func TestCollector_Init(t *testing.T) {
57 assert.NoError(t, New().Init())
58 }
59
60 -func TestCoreDNS_InitNG(t *testing.T) {
61 - job := New()
62 - job.URL = ""
63 - assert.Error(t, job.Init())
60 +func TestCollector_InitNG(t *testing.T) {
61 + collr := New()
62 + collr.URL = ""
63 + assert.Error(t, collr.Init())
64 }
65
66 -func TestCoreDNS_Check(t *testing.T) {
66 +func TestCollector_Check(t *testing.T) {
67 tests := []struct {
68 name string
69 data []byte
@@ -81,22 +81,22 @@ func TestCoreDNS_Check(t *testing.T) {
81 }))
82 defer ts.Close()
83
84 - job := New()
85 - job.URL = ts.URL + "/metrics"
86 - require.NoError(t, job.Init())
87 - assert.NoError(t, job.Check())
84 + collr := New()
85 + collr.URL = ts.URL + "/metrics"
86 + require.NoError(t, collr.Init())
87 + assert.NoError(t, collr.Check())
88 })
89 }
90 }
91
92 -func TestCoreDNS_CheckNG(t *testing.T) {
93 - job := New()
94 - job.URL = "http://127.0.0.1:38001/metrics"
95 - require.NoError(t, job.Init())
96 - assert.Error(t, job.Check())
92 +func TestCollector_CheckNG(t *testing.T) {
93 + collr := New()
94 + collr.URL = "http://127.0.0.1:38001/metrics"
95 + require.NoError(t, collr.Init())
96 + assert.Error(t, collr.Check())
97 }
98
99 -func TestCoreDNS_Collect(t *testing.T) {
99 +func TestCollector_Collect(t *testing.T) {
100 tests := []struct {
101 name string
102 data []byte
@@ -114,12 +114,12 @@ func TestCoreDNS_Collect(t *testing.T) {
114 }))
115 defer ts.Close()
116
117 - job := New()
118 - job.URL = ts.URL + "/metrics"
119 - job.PerServerStats.Includes = []string{"glob:*"}
120 - job.PerZoneStats.Includes = []string{"glob:*"}
121 - require.NoError(t, job.Init())
122 - require.NoError(t, job.Check())
117 + collr := New()
118 + collr.URL = ts.URL + "/metrics"
119 + collr.PerServerStats.Includes = []string{"glob:*"}
120 + collr.PerZoneStats.Includes = []string{"glob:*"}
121 + require.NoError(t, collr.Init())
122 + require.NoError(t, collr.Check())
123
124 expected := map[string]int64{
125 "coredns.io._request_per_ip_family_v4": 19,
@@ -441,12 +441,12 @@ func TestCoreDNS_Collect(t *testing.T) {
441 "ya.ru._response_total": 21,
442 }
443
444 - assert.Equal(t, expected, job.Collect())
444 + assert.Equal(t, expected, collr.Collect())
445 })
446 }
447 }
448
449 -func TestCoreDNS_CollectNoLoad(t *testing.T) {
449 +func TestCollector_CollectNoLoad(t *testing.T) {
450 tests := []struct {
451 name string
452 data []byte
@@ -463,12 +463,12 @@ func TestCoreDNS_CollectNoLoad(t *testing.T) {
463 }))
464 defer ts.Close()
465
466 - job := New()
467 - job.URL = ts.URL + "/metrics"
468 - job.PerServerStats.Includes = []string{"glob:*"}
469 - job.PerZoneStats.Includes = []string{"glob:*"}
470 - require.NoError(t, job.Init())
471 - require.NoError(t, job.Check())
466 + collr := New()
467 + collr.URL = ts.URL + "/metrics"
468 + collr.PerServerStats.Includes = []string{"glob:*"}
469 + collr.PerZoneStats.Includes = []string{"glob:*"}
470 + require.NoError(t, collr.Init())
471 + require.NoError(t, collr.Check())
472
473 expected := map[string]int64{
474 "no_matching_zone_dropped_total": 0,
@@ -520,13 +520,13 @@ func TestCoreDNS_CollectNoLoad(t *testing.T) {
520 "response_total": 0,
521 }
522
523 - assert.Equal(t, expected, job.Collect())
523 + assert.Equal(t, expected, collr.Collect())
524 })
525 }
526
527 }
528
529 -func TestCoreDNS_InvalidData(t *testing.T) {
529 +func TestCollector_InvalidData(t *testing.T) {
530 ts := httptest.NewServer(
531 http.HandlerFunc(
532 func(w http.ResponseWriter, r *http.Request) {
@@ -534,13 +534,13 @@ func TestCoreDNS_InvalidData(t *testing.T) {
534 }))
535 defer ts.Close()
536
537 - job := New()
538 - job.URL = ts.URL + "/metrics"
539 - require.NoError(t, job.Init())
540 - assert.Error(t, job.Check())
537 + collr := New()
538 + collr.URL = ts.URL + "/metrics"
539 + require.NoError(t, collr.Init())
540 + assert.Error(t, collr.Check())
541 }
542
543 -func TestCoreDNS_404(t *testing.T) {
543 +func TestCollector_404(t *testing.T) {
544 ts := httptest.NewServer(
545 http.HandlerFunc(
546 func(w http.ResponseWriter, r *http.Request) {
@@ -548,13 +548,13 @@ func TestCoreDNS_404(t *testing.T) {
548 }))
549 defer ts.Close()
550
551 - job := New()
552 - job.URL = ts.URL + "/metrics"
553 - require.NoError(t, job.Init())
554 - assert.Error(t, job.Check())
551 + collr := New()
552 + collr.URL = ts.URL + "/metrics"
553 + require.NoError(t, collr.Init())
554 + assert.Error(t, collr.Check())
555 }
556
557 -func TestCoreDNS_CollectNoVersion(t *testing.T) {
557 +func TestCollector_CollectNoVersion(t *testing.T) {
558 ts := httptest.NewServer(
559 http.HandlerFunc(
560 func(w http.ResponseWriter, r *http.Request) {
@@ -562,12 +562,12 @@ func TestCoreDNS_CollectNoVersion(t *testing.T) {
562 }))
563 defer ts.Close()
564
565 - job := New()
566 - job.URL = ts.URL + "/metrics"
567 - job.PerServerStats.Includes = []string{"glob:*"}
568 - job.PerZoneStats.Includes = []string{"glob:*"}
569 - require.NoError(t, job.Init())
570 - require.Error(t, job.Check())
565 + collr := New()
566 + collr.URL = ts.URL + "/metrics"
567 + collr.PerServerStats.Includes = []string{"glob:*"}
568 + collr.PerZoneStats.Includes = []string{"glob:*"}
569 + require.NoError(t, collr.Init())
570 + require.Error(t, collr.Check())
571
572 - assert.Nil(t, job.Collect())
572 + assert.Nil(t, collr.Collect())
573 }
src/go/plugin/go.d/collector/coredns/init.go
+11 -11
@@ -10,31 +10,31 @@ import (
10 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/web"
11 )
12
13 -func (cd *CoreDNS) validateConfig() error {
14 - if cd.URL == "" {
13 +func (c *Collector) validateConfig() error {
14 + if c.URL == "" {
15 return errors.New("url not set")
16 }
17 return nil
18 }
19
20 -func (cd *CoreDNS) initPerServerMatcher() (matcher.Matcher, error) {
21 - if cd.PerServerStats.Empty() {
20 +func (c *Collector) initPerServerMatcher() (matcher.Matcher, error) {
21 + if c.PerServerStats.Empty() {
22 return nil, nil
23 }
24 - return cd.PerServerStats.Parse()
24 + return c.PerServerStats.Parse()
25 }
26
27 -func (cd *CoreDNS) initPerZoneMatcher() (matcher.Matcher, error) {
28 - if cd.PerZoneStats.Empty() {
27 +func (c *Collector) initPerZoneMatcher() (matcher.Matcher, error) {
28 + if c.PerZoneStats.Empty() {
29 return nil, nil
30 }
31 - return cd.PerZoneStats.Parse()
31 + return c.PerZoneStats.Parse()
32 }
33
34 -func (cd *CoreDNS) initPrometheusClient() (prometheus.Prometheus, error) {
35 - client, err := web.NewHTTPClient(cd.ClientConfig)
34 +func (c *Collector) initPrometheusClient() (prometheus.Prometheus, error) {
35 + client, err := web.NewHTTPClient(c.ClientConfig)
36 if err != nil {
37 return nil, err
38 }
39 - return prometheus.New(client, cd.RequestConfig), nil
39 + return prometheus.New(client, c.RequestConfig), nil
40 }
src/go/plugin/go.d/collector/couchbase/collect.go
+23 -23
@@ -16,8 +16,8 @@ const (
16 precision = 1000
17 )
18
19 -func (cb *Couchbase) collect() (map[string]int64, error) {
20 - ms, err := cb.scrapeCouchbase()
19 +func (c *Collector) collect() (map[string]int64, error) {
20 + ms, err := c.scrapeCouchbase()
21 if err != nil {
22 return nil, fmt.Errorf("error on scraping couchbase: %v", err)
23 }
@@ -26,17 +26,17 @@ func (cb *Couchbase) collect() (map[string]int64, error) {
26 }
27
28 collected := make(map[string]int64)
29 - cb.collectBasicStats(collected, ms)
29 + c.collectBasicStats(collected, ms)
30
31 return collected, nil
32 }
33
34 -func (cb *Couchbase) collectBasicStats(collected map[string]int64, ms *cbMetrics) {
34 +func (c *Collector) collectBasicStats(collected map[string]int64, ms *cbMetrics) {
35 for _, b := range ms.BucketsBasicStats {
36
37 - if !cb.collectedBuckets[b.Name] {
38 - cb.collectedBuckets[b.Name] = true
39 - cb.addBucketToCharts(b.Name)
37 + if !c.collectedBuckets[b.Name] {
38 + c.collectedBuckets[b.Name] = true
39 + c.addBucketToCharts(b.Name)
40 }
41
42 bs := b.BasicStats
@@ -51,72 +51,72 @@ func (cb *Couchbase) collectBasicStats(collected map[string]int64, ms *cbMetrics
51 }
52 }
53
54 -func (cb *Couchbase) addBucketToCharts(bucket string) {
55 - cb.addDimToChart(bucketQuotaPercentUsedChart.ID, &module.Dim{
54 +func (c *Collector) addBucketToCharts(bucket string) {
55 + c.addDimToChart(bucketQuotaPercentUsedChart.ID, &module.Dim{
56 ID: indexDimID(bucket, "quota_percent_used"),
57 Name: bucket,
58 Div: precision,
59 })
60
61 - cb.addDimToChart(bucketOpsPerSecChart.ID, &module.Dim{
61 + c.addDimToChart(bucketOpsPerSecChart.ID, &module.Dim{
62 ID: indexDimID(bucket, "ops_per_sec"),
63 Name: bucket,
64 Div: precision,
65 })
66
67 - cb.addDimToChart(bucketDiskFetchesChart.ID, &module.Dim{
67 + c.addDimToChart(bucketDiskFetchesChart.ID, &module.Dim{
68 ID: indexDimID(bucket, "disk_fetches"),
69 Name: bucket,
70 })
71
72 - cb.addDimToChart(bucketItemCountChart.ID, &module.Dim{
72 + c.addDimToChart(bucketItemCountChart.ID, &module.Dim{
73 ID: indexDimID(bucket, "item_count"),
74 Name: bucket,
75 })
76
77 - cb.addDimToChart(bucketDiskUsedChart.ID, &module.Dim{
77 + c.addDimToChart(bucketDiskUsedChart.ID, &module.Dim{
78 ID: indexDimID(bucket, "disk_used"),
79 Name: bucket,
80 })
81
82 - cb.addDimToChart(bucketDataUsedChart.ID, &module.Dim{
82 + c.addDimToChart(bucketDataUsedChart.ID, &module.Dim{
83 ID: indexDimID(bucket, "data_used"),
84 Name: bucket,
85 })
86
87 - cb.addDimToChart(bucketMemUsedChart.ID, &module.Dim{
87 + c.addDimToChart(bucketMemUsedChart.ID, &module.Dim{
88 ID: indexDimID(bucket, "mem_used"),
89 Name: bucket,
90 })
91
92 - cb.addDimToChart(bucketVBActiveNumNonResidentChart.ID, &module.Dim{
92 + c.addDimToChart(bucketVBActiveNumNonResidentChart.ID, &module.Dim{
93 ID: indexDimID(bucket, "vb_active_num_non_resident"),
94 Name: bucket,
95 })
96 }
97
98 -func (cb *Couchbase) addDimToChart(chartID string, dim *module.Dim) {
99 - chart := cb.Charts().Get(chartID)
98 +func (c *Collector) addDimToChart(chartID string, dim *module.Dim) {
99 + chart := c.Charts().Get(chartID)
100 if chart == nil {
101 - cb.Warningf("error on adding '%s' dimension: can not find '%s' chart", dim.ID, chartID)
101 + c.Warningf("error on adding '%s' dimension: can not find '%s' chart", dim.ID, chartID)
102 return
103 }
104 if err := chart.AddDim(dim); err != nil {
105 - cb.Warning(err)
105 + c.Warning(err)
106 return
107 }
108 chart.MarkNotCreated()
109 }
110
111 -func (cb *Couchbase) scrapeCouchbase() (*cbMetrics, error) {
112 - req, err := web.NewHTTPRequestWithPath(cb.RequestConfig, urlPathBucketsStats)
111 +func (c *Collector) scrapeCouchbase() (*cbMetrics, error) {
112 + req, err := web.NewHTTPRequestWithPath(c.RequestConfig, urlPathBucketsStats)
113 if err != nil {
114 return nil, err
115 }
116 req.URL.RawQuery = url.Values{"skipMap": []string{"true"}}.Encode()
117
118 ms := &cbMetrics{}
119 - if err := web.DoHTTP(cb.httpClient).RequestJSON(req, &ms.BucketsBasicStats); err != nil {
119 + if err := web.DoHTTP(c.httpClient).RequestJSON(req, &ms.BucketsBasicStats); err != nil {
120 return nil, err
121 }
122
src/go/plugin/go.d/collector/couchbase/collector.go renamed
+21 -21
@@ -28,8 +28,8 @@ func init() {
28 })
29 }
30
31 -func New() *Couchbase {
32 - return &Couchbase{
31 +func New() *Collector {
32 + return &Collector{
33 Config: Config{
34 HTTPConfig: web.HTTPConfig{
35 RequestConfig: web.RequestConfig{
@@ -49,7 +49,7 @@ type Config struct {
49 web.HTTPConfig `yaml:",inline" json:""`
50 }
51
52 -type Couchbase struct {
52 +type Collector struct {
53 module.Base
54 Config `yaml:",inline" json:""`
55
@@ -59,33 +59,33 @@ type Couchbase struct {
59 collectedBuckets map[string]bool
60 }
61
62 -func (cb *Couchbase) Configuration() any {
63 - return cb.Config
62 +func (c *Collector) Configuration() any {
63 + return c.Config
64 }
65
66 -func (cb *Couchbase) Init() error {
67 - err := cb.validateConfig()
66 +func (c *Collector) Init() error {
67 + err := c.validateConfig()
68 if err != nil {
69 return fmt.Errorf("check configuration: %v", err)
70 }
71
72 - httpClient, err := cb.initHTTPClient()
72 + httpClient, err := c.initHTTPClient()
73 if err != nil {
74 return fmt.Errorf("init HTTP client: %v", err)
75 }
76 - cb.httpClient = httpClient
76 + c.httpClient = httpClient
77
78 - charts, err := cb.initCharts()
78 + charts, err := c.initCharts()
79 if err != nil {
80 return fmt.Errorf("init charts: %v", err)
81 }
82 - cb.charts = charts
82 + c.charts = charts
83
84 return nil
85 }
86
87 -func (cb *Couchbase) Check() error {
88 - mx, err := cb.collect()
87 +func (c *Collector) Check() error {
88 + mx, err := c.collect()
89 if err != nil {
90 return err
91 }
@@ -96,14 +96,14 @@ func (cb *Couchbase) Check() error {
96 return nil
97 }
98
99 -func (cb *Couchbase) Charts() *Charts {
100 - return cb.charts
99 +func (c *Collector) Charts() *Charts {
100 + return c.charts
101 }
102
103 -func (cb *Couchbase) Collect() map[string]int64 {
104 - mx, err := cb.collect()
103 +func (c *Collector) Collect() map[string]int64 {
104 + mx, err := c.collect()
105 if err != nil {
106 - cb.Error(err)
106 + c.Error(err)
107 }
108
109 if len(mx) == 0 {
@@ -112,9 +112,9 @@ func (cb *Couchbase) Collect() map[string]int64 {
112 return mx
113 }
114
115 -func (cb *Couchbase) Cleanup() {
116 - if cb.httpClient == nil {
115 +func (c *Collector) Cleanup() {
116 + if c.httpClient == nil {
117 return
118 }
119 - cb.httpClient.CloseIdleConnections()
119 + c.httpClient.CloseIdleConnections()
120 }
src/go/plugin/go.d/collector/couchbase/collector_test.go renamed
+37 -37
@@ -32,11 +32,11 @@ func Test_testDataIsValid(t *testing.T) {
32 }
33 }
34
35 -func TestCouchbase_ConfigurationSerialize(t *testing.T) {
36 - module.TestConfigurationSerialize(t, &Couchbase{}, dataConfigJSON, dataConfigYAML)
35 +func TestCollector_ConfigurationSerialize(t *testing.T) {
36 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
37 }
38
39 -func TestCouchbase_Init(t *testing.T) {
39 +func TestCollector_Init(t *testing.T) {
40 tests := map[string]struct {
41 config Config
42 wantFail bool
@@ -68,21 +68,21 @@ func TestCouchbase_Init(t *testing.T) {
68
69 for name, test := range tests {
70 t.Run(name, func(t *testing.T) {
71 - cb := New()
72 - cb.Config = test.config
71 + collr := New()
72 + collr.Config = test.config
73
74 if test.wantFail {
75 - assert.Error(t, cb.Init())
75 + assert.Error(t, collr.Init())
76 } else {
77 - assert.NoError(t, cb.Init())
77 + assert.NoError(t, collr.Init())
78 }
79 })
80 }
81 }
82
83 -func TestCouchbase_Check(t *testing.T) {
83 +func TestCollector_Check(t *testing.T) {
84 tests := map[string]struct {
85 - prepare func(*testing.T) (cb *Couchbase, cleanup func())
85 + prepare func(*testing.T) (collr *Collector, cleanup func())
86 wantFail bool
87 }{
88 "success on valid response v6.6.0": {
@@ -104,21 +104,21 @@ func TestCouchbase_Check(t *testing.T) {
104
105 for name, test := range tests {
106 t.Run(name, func(t *testing.T) {
107 - cb, cleanup := test.prepare(t)
107 + collr, cleanup := test.prepare(t)
108 defer cleanup()
109
110 if test.wantFail {
111 - assert.Error(t, cb.Check())
111 + assert.Error(t, collr.Check())
112 } else {
113 - assert.NoError(t, cb.Check())
113 + assert.NoError(t, collr.Check())
114 }
115 })
116 }
117 }
118
119 -func TestCouchbase_Collect(t *testing.T) {
119 +func TestCollector_Collect(t *testing.T) {
120 tests := map[string]struct {
121 - prepare func(t *testing.T) (cb *Couchbase, cleanup func())
121 + prepare func(t *testing.T) (collr *Collector, cleanup func())
122 wantCollected map[string]int64
123 }{
124 "success on valid response v6.6.0": {
@@ -163,62 +163,62 @@ func TestCouchbase_Collect(t *testing.T) {
163
164 for name, test := range tests {
165 t.Run(name, func(t *testing.T) {
166 - cb, cleanup := test.prepare(t)
166 + collr, cleanup := test.prepare(t)
167 defer cleanup()
168
169 - mx := cb.Collect()
169 + mx := collr.Collect()
170
171 assert.Equal(t, test.wantCollected, mx)
172 - module.TestMetricsHasAllChartsDims(t, cb.Charts(), mx)
172 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
173 })
174 }
175 }
176
177 -func prepareCouchbaseV660(t *testing.T) (cb *Couchbase, cleanup func()) {
177 +func prepareCouchbaseV660(t *testing.T) (collr *Collector, cleanup func()) {
178 t.Helper()
179 srv := httptest.NewServer(http.HandlerFunc(
180 func(w http.ResponseWriter, r *http.Request) {
181 _, _ = w.Write(dataVer660BucketsBasicStats)
182 }))
183
184 - cb = New()
185 - cb.URL = srv.URL
186 - require.NoError(t, cb.Init())
184 + collr = New()
185 + collr.URL = srv.URL
186 + require.NoError(t, collr.Init())
187
188 - return cb, srv.Close
188 + return collr, srv.Close
189 }
190
191 -func prepareCouchbaseInvalidData(t *testing.T) (*Couchbase, func()) {
191 +func prepareCouchbaseInvalidData(t *testing.T) (*Collector, func()) {
192 t.Helper()
193 srv := httptest.NewServer(http.HandlerFunc(
194 func(w http.ResponseWriter, r *http.Request) {
195 _, _ = w.Write([]byte("hello and\n goodbye"))
196 }))
197 - cb := New()
198 - cb.URL = srv.URL
199 - require.NoError(t, cb.Init())
197 + collr := New()
198 + collr.URL = srv.URL
199 + require.NoError(t, collr.Init())
200
201 - return cb, srv.Close
201 + return collr, srv.Close
202 }
203
204 -func prepareCouchbase404(t *testing.T) (*Couchbase, func()) {
204 +func prepareCouchbase404(t *testing.T) (*Collector, func()) {
205 t.Helper()
206 srv := httptest.NewServer(http.HandlerFunc(
207 func(w http.ResponseWriter, r *http.Request) {
208 w.WriteHeader(http.StatusNotFound)
209 }))
210 - cb := New()
211 - cb.URL = srv.URL
212 - require.NoError(t, cb.Init())
210 + collr := New()
211 + collr.URL = srv.URL
212 + require.NoError(t, collr.Init())
213
214 - return cb, srv.Close
214 + return collr, srv.Close
215 }
216
217 -func prepareCouchbaseConnectionRefused(t *testing.T) (*Couchbase, func()) {
217 +func prepareCouchbaseConnectionRefused(t *testing.T) (*Collector, func()) {
218 t.Helper()
219 - cb := New()
220 - cb.URL = "http://127.0.0.1:38001"
221 - require.NoError(t, cb.Init())
219 + collr := New()
220 + collr.URL = "http://127.0.0.1:38001"
221 + require.NoError(t, collr.Init())
222
223 - return cb, func() {}
223 + return collr, func() {}
224 }
src/go/plugin/go.d/collector/couchbase/init.go
+6 -6
@@ -10,7 +10,7 @@ import (
10 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/web"
11 )
12
13 -func (cb *Couchbase) initCharts() (*Charts, error) {
13 +func (c *Collector) initCharts() (*Charts, error) {
14 var bucketCharts = module.Charts{
15 bucketQuotaPercentUsedChart.Copy(),
16 bucketOpsPerSecChart.Copy(),
@@ -24,15 +24,15 @@ func (cb *Couchbase) initCharts() (*Charts, error) {
24 return bucketCharts.Copy(), nil
25 }
26
27 -func (cb *Couchbase) initHTTPClient() (*http.Client, error) {
28 - return web.NewHTTPClient(cb.ClientConfig)
27 +func (c *Collector) initHTTPClient() (*http.Client, error) {
28 + return web.NewHTTPClient(c.ClientConfig)
29 }
30
31 -func (cb *Couchbase) validateConfig() error {
32 - if cb.URL == "" {
31 +func (c *Collector) validateConfig() error {
32 + if c.URL == "" {
33 return errors.New("URL not set")
34 }
35 - if _, err := web.NewHTTPRequest(cb.RequestConfig); err != nil {
35 + if _, err := web.NewHTTPRequest(c.RequestConfig); err != nil {
36 return err
37 }
38 return nil
src/go/plugin/go.d/collector/couchdb/collect.go
+40 -40
@@ -27,22 +27,22 @@ const (
27 httpStatusCodePrefixLen = len(httpStatusCodePrefix)
28 )
29
30 -func (cdb *CouchDB) collect() (map[string]int64, error) {
31 - ms := cdb.scrapeCouchDB()
30 +func (c *Collector) collect() (map[string]int64, error) {
31 + ms := c.scrapeCouchDB()
32 if ms.empty() {
33 return nil, nil
34 }
35
36 collected := make(map[string]int64)
37 - cdb.collectNodeStats(collected, ms)
38 - cdb.collectSystemStats(collected, ms)
39 - cdb.collectActiveTasks(collected, ms)
40 - cdb.collectDBStats(collected, ms)
37 + c.collectNodeStats(collected, ms)
38 + c.collectSystemStats(collected, ms)
39 + c.collectActiveTasks(collected, ms)
40 + c.collectDBStats(collected, ms)
41
42 return collected, nil
43 }
44
45 -func (cdb *CouchDB) collectNodeStats(collected map[string]int64, ms *cdbMetrics) {
45 +func (c *Collector) collectNodeStats(collected map[string]int64, ms *cdbMetrics) {
46 if !ms.hasNodeStats() {
47 return
48 }
@@ -56,7 +56,7 @@ func (cdb *CouchDB) collectNodeStats(collected map[string]int64, ms *cdbMetrics)
56 }
57 }
58
59 -func (cdb *CouchDB) collectSystemStats(collected map[string]int64, ms *cdbMetrics) {
59 +func (c *Collector) collectSystemStats(collected map[string]int64, ms *cdbMetrics) {
60 if !ms.hasNodeSystem() {
61 return
62 }
@@ -68,7 +68,7 @@ func (cdb *CouchDB) collectSystemStats(collected map[string]int64, ms *cdbMetric
68 collected["peak_msg_queue"] = findMaxMQSize(ms.NodeSystem.MessageQueues)
69 }
70
71 -func (cdb *CouchDB) collectActiveTasks(collected map[string]int64, ms *cdbMetrics) {
71 +func (c *Collector) collectActiveTasks(collected map[string]int64, ms *cdbMetrics) {
72 collected["active_tasks_indexer"] = 0
73 collected["active_tasks_database_compaction"] = 0
74 collected["active_tasks_replication"] = 0
@@ -83,83 +83,83 @@ func (cdb *CouchDB) collectActiveTasks(collected map[string]int64, ms *cdbMetric
83 }
84 }
85
86 -func (cdb *CouchDB) collectDBStats(collected map[string]int64, ms *cdbMetrics) {
86 +func (c *Collector) collectDBStats(collected map[string]int64, ms *cdbMetrics) {
87 if !ms.hasDBStats() {
88 return
89 }
90
91 for _, dbStats := range ms.DBStats {
92 if dbStats.Error != "" {
93 - cdb.Warning("database '", dbStats.Key, "' doesn't exist")
93 + c.Warning("database '", dbStats.Key, "' doesn't exist")
94 continue
95 }
96 merge(collected, stm.ToMap(dbStats.Info), "db_"+dbStats.Key)
97 }
98 }
99
100 -func (cdb *CouchDB) scrapeCouchDB() *cdbMetrics {
100 +func (c *Collector) scrapeCouchDB() *cdbMetrics {
101 ms := &cdbMetrics{}
102 wg := &sync.WaitGroup{}
103
104 wg.Add(1)
105 - go func() { defer wg.Done(); cdb.scrapeNodeStats(ms) }()
105 + go func() { defer wg.Done(); c.scrapeNodeStats(ms) }()
106
107 wg.Add(1)
108 - go func() { defer wg.Done(); cdb.scrapeSystemStats(ms) }()
108 + go func() { defer wg.Done(); c.scrapeSystemStats(ms) }()
109
110 wg.Add(1)
111 - go func() { defer wg.Done(); cdb.scrapeActiveTasks(ms) }()
111 + go func() { defer wg.Done(); c.scrapeActiveTasks(ms) }()
112
113 - if len(cdb.databases) > 0 {
113 + if len(c.databases) > 0 {
114 wg.Add(1)
115 - go func() { defer wg.Done(); cdb.scrapeDBStats(ms) }()
115 + go func() { defer wg.Done(); c.scrapeDBStats(ms) }()
116 }
117
118 wg.Wait()
119 return ms
120 }
121
122 -func (cdb *CouchDB) scrapeNodeStats(ms *cdbMetrics) {
123 - req, _ := web.NewHTTPRequestWithPath(cdb.RequestConfig, fmt.Sprintf(urlPathOverviewStats, cdb.Config.Node))
122 +func (c *Collector) scrapeNodeStats(ms *cdbMetrics) {
123 + req, _ := web.NewHTTPRequestWithPath(c.RequestConfig, fmt.Sprintf(urlPathOverviewStats, c.Config.Node))
124
125 var stats cdbNodeStats
126
127 - if err := cdb.client().RequestJSON(req, &stats); err != nil {
128 - cdb.Warning(err)
127 + if err := c.client().RequestJSON(req, &stats); err != nil {
128 + c.Warning(err)
129 return
130 }
131
132 ms.NodeStats = &stats
133 }
134
135 -func (cdb *CouchDB) scrapeSystemStats(ms *cdbMetrics) {
136 - req, _ := web.NewHTTPRequestWithPath(cdb.RequestConfig, fmt.Sprintf(urlPathSystemStats, cdb.Config.Node))
135 +func (c *Collector) scrapeSystemStats(ms *cdbMetrics) {
136 + req, _ := web.NewHTTPRequestWithPath(c.RequestConfig, fmt.Sprintf(urlPathSystemStats, c.Config.Node))
137
138 var stats cdbNodeSystem
139
140 - if err := cdb.client().RequestJSON(req, &stats); err != nil {
141 - cdb.Warning(err)
140 + if err := c.client().RequestJSON(req, &stats); err != nil {
141 + c.Warning(err)
142 return
143 }
144
145 ms.NodeSystem = &stats
146 }
147
148 -func (cdb *CouchDB) scrapeActiveTasks(ms *cdbMetrics) {
149 - req, _ := web.NewHTTPRequestWithPath(cdb.RequestConfig, urlPathActiveTasks)
148 +func (c *Collector) scrapeActiveTasks(ms *cdbMetrics) {
149 + req, _ := web.NewHTTPRequestWithPath(c.RequestConfig, urlPathActiveTasks)
150
151 var stats []cdbActiveTask
152
153 - if err := cdb.client().RequestJSON(req, &stats); err != nil {
154 - cdb.Warning(err)
153 + if err := c.client().RequestJSON(req, &stats); err != nil {
154 + c.Warning(err)
155 return
156 }
157
158 ms.ActiveTasks = stats
159 }
160
161 -func (cdb *CouchDB) scrapeDBStats(ms *cdbMetrics) {
162 - req, _ := web.NewHTTPRequestWithPath(cdb.RequestConfig, urlPathDatabases)
161 +func (c *Collector) scrapeDBStats(ms *cdbMetrics) {
162 + req, _ := web.NewHTTPRequestWithPath(c.RequestConfig, urlPathDatabases)
163 req.Method = http.MethodPost
164 req.Header.Add("Accept", "application/json")
165 req.Header.Add("Content-Type", "application/json")
@@ -167,18 +167,18 @@ func (cdb *CouchDB) scrapeDBStats(ms *cdbMetrics) {
167 var q struct {
168 Keys []string `json:"keys"`
169 }
170 - q.Keys = cdb.databases
170 + q.Keys = c.databases
171 body, err := json.Marshal(q)
172 if err != nil {
173 - cdb.Error(err)
173 + c.Error(err)
174 return
175 }
176 req.Body = io.NopCloser(bytes.NewReader(body))
177
178 var stats []cdbDBStats
179
180 - if err := cdb.client().RequestJSON(req, &stats); err != nil {
181 - cdb.Warning(err)
180 + if err := c.client().RequestJSON(req, &stats); err != nil {
181 + c.Warning(err)
182 return
183 }
184
@@ -200,12 +200,12 @@ func findMaxMQSize(MessageQueues map[string]any) int64 {
200 return int64(maxSize)
201 }
202
203 -func (cdb *CouchDB) pingCouchDB() error {
204 - req, _ := web.NewHTTPRequest(cdb.RequestConfig)
203 +func (c *Collector) pingCouchDB() error {
204 + req, _ := web.NewHTTPRequest(c.RequestConfig)
205
206 var info struct{ Couchdb string }
207
208 - if err := cdb.client().RequestJSON(req, &info); err != nil {
208 + if err := c.client().RequestJSON(req, &info); err != nil {
209 return err
210 }
211
@@ -216,8 +216,8 @@ func (cdb *CouchDB) pingCouchDB() error {
216 return nil
217 }
218
219 -func (cdb *CouchDB) client() *web.Client {
220 - return web.DoHTTP(cdb.httpClient).OnNokCode(func(resp *http.Response) (bool, error) {
219 +func (c *Collector) client() *web.Client {
220 + return web.DoHTTP(c.httpClient).OnNokCode(func(resp *http.Response) (bool, error) {
221 var msg struct {
222 Error string `json:"error"`
223 Reason string `json:"reason"`
src/go/plugin/go.d/collector/couchdb/collector.go renamed
+23 -23
@@ -29,8 +29,8 @@ func init() {
29 })
30 }
31
32 -func New() *CouchDB {
33 - return &CouchDB{
32 +func New() *Collector {
33 + return &Collector{
34 Config: Config{
35 HTTPConfig: web.HTTPConfig{
36 RequestConfig: web.RequestConfig{
@@ -52,7 +52,7 @@ type Config struct {
52 Databases string `yaml:"databases,omitempty" json:"databases"`
53 }
54
55 -type CouchDB struct {
55 +type Collector struct {
56 module.Base
57 Config `yaml:",inline" json:""`
58
@@ -63,39 +63,39 @@ type CouchDB struct {
63 databases []string
64 }
65
66 -func (cdb *CouchDB) Configuration() any {
67 - return cdb.Config
66 +func (c *Collector) Configuration() any {
67 + return c.Config
68 }
69
70 -func (cdb *CouchDB) Init() error {
71 - err := cdb.validateConfig()
70 +func (c *Collector) Init() error {
71 + err := c.validateConfig()
72 if err != nil {
73 return fmt.Errorf("check configuration: %v", err)
74 }
75
76 - cdb.databases = strings.Fields(cdb.Config.Databases)
76 + c.databases = strings.Fields(c.Config.Databases)
77
78 - httpClient, err := cdb.initHTTPClient()
78 + httpClient, err := c.initHTTPClient()
79 if err != nil {
80 return fmt.Errorf("init HTTP client: %v", err)
81 }
82 - cdb.httpClient = httpClient
82 + c.httpClient = httpClient
83
84 - charts, err := cdb.initCharts()
84 + charts, err := c.initCharts()
85 if err != nil {
86 return fmt.Errorf("init charts: %v", err)
87 }
88 - cdb.charts = charts
88 + c.charts = charts
89
90 return nil
91 }
92
93 -func (cdb *CouchDB) Check() error {
94 - if err := cdb.pingCouchDB(); err != nil {
93 +func (c *Collector) Check() error {
94 + if err := c.pingCouchDB(); err != nil {
95 return err
96 }
97
98 - mx, err := cdb.collect()
98 + mx, err := c.collect()
99 if err != nil {
100 return err
101 }
@@ -107,14 +107,14 @@ func (cdb *CouchDB) Check() error {
107 return nil
108 }
109
110 -func (cdb *CouchDB) Charts() *Charts {
111 - return cdb.charts
110 +func (c *Collector) Charts() *Charts {
111 + return c.charts
112 }
113
114 -func (cdb *CouchDB) Collect() map[string]int64 {
115 - mx, err := cdb.collect()
114 +func (c *Collector) Collect() map[string]int64 {
115 + mx, err := c.collect()
116 if err != nil {
117 - cdb.Error(err)
117 + c.Error(err)
118 }
119
120 if len(mx) == 0 {
@@ -123,9 +123,9 @@ func (cdb *CouchDB) Collect() map[string]int64 {
123 return mx
124 }
125
126 -func (cdb *CouchDB) Cleanup() {
127 - if cdb.httpClient == nil {
126 +func (c *Collector) Cleanup() {
127 + if c.httpClient == nil {
128 return
129 }
130 - cdb.httpClient.CloseIdleConnections()
130 + c.httpClient.CloseIdleConnections()
131 }
src/go/plugin/go.d/collector/couchdb/collector_test.go renamed
+54 -54
@@ -41,11 +41,11 @@ func Test_testDataIsValid(t *testing.T) {
41 }
42 }
43
44 -func TestCouchDB_ConfigurationSerialize(t *testing.T) {
45 - module.TestConfigurationSerialize(t, &CouchDB{}, dataConfigJSON, dataConfigYAML)
44 +func TestCollector_ConfigurationSerialize(t *testing.T) {
45 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
46 }
47
48 -func TestCouchDB_Init(t *testing.T) {
48 +func TestCollector_Init(t *testing.T) {
49 tests := map[string]struct {
50 config Config
51 wantNumOfCharts int
@@ -80,22 +80,22 @@ func TestCouchDB_Init(t *testing.T) {
80
81 for name, test := range tests {
82 t.Run(name, func(t *testing.T) {
83 - es := New()
84 - es.Config = test.config
83 + collr := New()
84 + collr.Config = test.config
85
86 if test.wantFail {
87 - assert.Error(t, es.Init())
87 + assert.Error(t, collr.Init())
88 } else {
89 - assert.NoError(t, es.Init())
90 - assert.Equal(t, test.wantNumOfCharts, len(*es.Charts()))
89 + assert.NoError(t, collr.Init())
90 + assert.Equal(t, test.wantNumOfCharts, len(*collr.Charts()))
91 }
92 })
93 }
94 }
95
96 -func TestCouchDB_Check(t *testing.T) {
96 +func TestCollector_Check(t *testing.T) {
97 tests := map[string]struct {
98 - prepare func(*testing.T) (cdb *CouchDB, cleanup func())
98 + prepare func(*testing.T) (collr *Collector, cleanup func())
99 wantFail bool
100 }{
101 "valid data": {prepare: prepareCouchDBValidData},
@@ -106,37 +106,37 @@ func TestCouchDB_Check(t *testing.T) {
106
107 for name, test := range tests {
108 t.Run(name, func(t *testing.T) {
109 - cdb, cleanup := test.prepare(t)
109 + collr, cleanup := test.prepare(t)
110 defer cleanup()
111
112 if test.wantFail {
113 - assert.Error(t, cdb.Check())
113 + assert.Error(t, collr.Check())
114 } else {
115 - assert.NoError(t, cdb.Check())
115 + assert.NoError(t, collr.Check())
116 }
117 })
118 }
119 }
120
121 -func TestCouchDB_Charts(t *testing.T) {
121 +func TestCollector_Charts(t *testing.T) {
122 assert.Nil(t, New().Charts())
123 }
124
125 -func TestCouchDB_Cleanup(t *testing.T) {
125 +func TestCollector_Cleanup(t *testing.T) {
126 assert.NotPanics(t, New().Cleanup)
127 }
128
129 -func TestCouchDB_Collect(t *testing.T) {
129 +func TestCollector_Collect(t *testing.T) {
130 tests := map[string]struct {
131 - prepare func() *CouchDB
131 + prepare func() *Collector
132 wantCollected map[string]int64
133 checkCharts bool
134 }{
135 "all stats": {
136 - prepare: func() *CouchDB {
137 - cdb := New()
138 - cdb.Config.Databases = "db1 db2"
139 - return cdb
136 + prepare: func() *Collector {
137 + collr := New()
138 + collr.Config.Databases = "db1 db2"
139 + return collr
140 },
141 wantCollected: map[string]int64{
142
@@ -225,11 +225,11 @@ func TestCouchDB_Collect(t *testing.T) {
225 checkCharts: true,
226 },
227 "wrong node": {
228 - prepare: func() *CouchDB {
229 - cdb := New()
230 - cdb.Config.Node = "bad_node@bad_host"
231 - cdb.Config.Databases = "db1 db2"
232 - return cdb
228 + prepare: func() *Collector {
229 + collr := New()
230 + collr.Config.Node = "bad_node@bad_host"
231 + collr.Config.Databases = "db1 db2"
232 + return collr
233 },
234 wantCollected: map[string]int64{
235
@@ -259,10 +259,10 @@ func TestCouchDB_Collect(t *testing.T) {
259 checkCharts: false,
260 },
261 "wrong database": {
262 - prepare: func() *CouchDB {
263 - cdb := New()
264 - cdb.Config.Databases = "bad_db db1 db2"
265 - return cdb
262 + prepare: func() *Collector {
263 + collr := New()
264 + collr.Config.Databases = "bad_db db1 db2"
265 + return collr
266 },
267 wantCollected: map[string]int64{
268
@@ -354,70 +354,70 @@ func TestCouchDB_Collect(t *testing.T) {
354
355 for name, test := range tests {
356 t.Run(name, func(t *testing.T) {
357 - cdb, cleanup := prepareCouchDB(t, test.prepare)
357 + collr, cleanup := prepareCouchDB(t, test.prepare)
358 defer cleanup()
359
360 var mx map[string]int64
361 for i := 0; i < 10; i++ {
362 - mx = cdb.Collect()
362 + mx = collr.Collect()
363 }
364
365 assert.Equal(t, test.wantCollected, mx)
366 if test.checkCharts {
367 - module.TestMetricsHasAllChartsDims(t, cdb.Charts(), mx)
367 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
368 }
369 })
370 }
371 }
372
373 -func prepareCouchDB(t *testing.T, createCDB func() *CouchDB) (cdb *CouchDB, cleanup func()) {
373 +func prepareCouchDB(t *testing.T, createCDB func() *Collector) (collr *Collector, cleanup func()) {
374 t.Helper()
375 - cdb = createCDB()
375 + collr = createCDB()
376 srv := prepareCouchDBEndpoint()
377 - cdb.URL = srv.URL
377 + collr.URL = srv.URL
378
379 - require.NoError(t, cdb.Init())
379 + require.NoError(t, collr.Init())
380
381 - return cdb, srv.Close
381 + return collr, srv.Close
382 }
383
384 -func prepareCouchDBValidData(t *testing.T) (cdb *CouchDB, cleanup func()) {
384 +func prepareCouchDBValidData(t *testing.T) (collr *Collector, cleanup func()) {
385 return prepareCouchDB(t, New)
386 }
387
388 -func prepareCouchDBInvalidData(t *testing.T) (*CouchDB, func()) {
388 +func prepareCouchDBInvalidData(t *testing.T) (*Collector, func()) {
389 t.Helper()
390 srv := httptest.NewServer(http.HandlerFunc(
391 func(w http.ResponseWriter, r *http.Request) {
392 _, _ = w.Write([]byte("hello and\n goodbye"))
393 }))
394 - cdb := New()
395 - cdb.URL = srv.URL
396 - require.NoError(t, cdb.Init())
394 + collr := New()
395 + collr.URL = srv.URL
396 + require.NoError(t, collr.Init())
397
398 - return cdb, srv.Close
398 + return collr, srv.Close
399 }
400
401 -func prepareCouchDB404(t *testing.T) (*CouchDB, func()) {
401 +func prepareCouchDB404(t *testing.T) (*Collector, func()) {
402 t.Helper()
403 srv := httptest.NewServer(http.HandlerFunc(
404 func(w http.ResponseWriter, r *http.Request) {
405 w.WriteHeader(http.StatusNotFound)
406 }))
407 - cdb := New()
408 - cdb.URL = srv.URL
409 - require.NoError(t, cdb.Init())
407 + collr := New()
408 + collr.URL = srv.URL
409 + require.NoError(t, collr.Init())
410
411 - return cdb, srv.Close
411 + return collr, srv.Close
412 }
413
414 -func prepareCouchDBConnectionRefused(t *testing.T) (*CouchDB, func()) {
414 +func prepareCouchDBConnectionRefused(t *testing.T) (*Collector, func()) {
415 t.Helper()
416 - cdb := New()
417 - cdb.URL = "http://127.0.0.1:38001"
418 - require.NoError(t, cdb.Init())
416 + collr := New()
417 + collr.URL = "http://127.0.0.1:38001"
418 + require.NoError(t, collr.Init())
419
420 - return cdb, func() {}
420 + return collr, func() {}
421 }
422
423 func prepareCouchDBEndpoint() *httptest.Server {
src/go/plugin/go.d/collector/couchdb/init.go
+9 -9
@@ -10,24 +10,24 @@ import (
10 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/web"
11 )
12
13 -func (cdb *CouchDB) validateConfig() error {
14 - if cdb.URL == "" {
13 +func (c *Collector) validateConfig() error {
14 + if c.URL == "" {
15 return errors.New("URL not set")
16 }
17 - if cdb.Node == "" {
17 + if c.Node == "" {
18 return errors.New("'node' not set")
19 }
20 - if _, err := web.NewHTTPRequest(cdb.RequestConfig); err != nil {
20 + if _, err := web.NewHTTPRequest(c.RequestConfig); err != nil {
21 return err
22 }
23 return nil
24 }
25
26 -func (cdb *CouchDB) initHTTPClient() (*http.Client, error) {
27 - return web.NewHTTPClient(cdb.ClientConfig)
26 +func (c *Collector) initHTTPClient() (*http.Client, error) {
27 + return web.NewHTTPClient(c.ClientConfig)
28 }
29
30 -func (cdb *CouchDB) initCharts() (*Charts, error) {
30 +func (c *Collector) initCharts() (*Charts, error) {
31 charts := module.Charts{}
32
33 if err := charts.Add(*dbActivityCharts.Copy()...); err != nil {
@@ -39,7 +39,7 @@ func (cdb *CouchDB) initCharts() (*Charts, error) {
39 if err := charts.Add(*serverOperationsCharts.Copy()...); err != nil {
40 return nil, err
41 }
42 - if len(cdb.databases) != 0 {
42 + if len(c.databases) != 0 {
43 dbCharts := dbSpecificCharts.Copy()
44
45 if err := charts.Add(*dbCharts...); err != nil {
@@ -47,7 +47,7 @@ func (cdb *CouchDB) initCharts() (*Charts, error) {
47 }
48
49 for _, chart := range *dbCharts {
50 - for _, db := range cdb.databases {
50 + for _, db := range c.databases {
51 if err := chart.AddDim(&module.Dim{ID: "db_" + db + "_" + chart.ID, Name: db}); err != nil {
52 return nil, err
53 }
src/go/plugin/go.d/collector/dmcache/charts.go
+2 -2
@@ -117,7 +117,7 @@ var chartDeviceDirtySizeTmpl = module.Chart{
117 },
118 }
119
120 -func (c *DmCache) addDeviceCharts(device string) {
120 +func (c *Collector) addDeviceCharts(device string) {
121 charts := deviceChartsTmpl.Copy()
122
123 for _, chart := range *charts {
@@ -135,7 +135,7 @@ func (c *DmCache) addDeviceCharts(device string) {
135 }
136 }
137
138 -func (c *DmCache) removeDeviceCharts(device string) {
138 +func (c *Collector) removeDeviceCharts(device string) {
139 px := fmt.Sprintf("dmcache_device_%s_", cleanDeviceName(device))
140
141 for _, chart := range *c.Charts() {
src/go/plugin/go.d/collector/dmcache/collect.go
+2 -2
@@ -30,7 +30,7 @@ type dmCacheDevice struct {
30 dirtyBlocks int64
31 }
32
33 -func (c *DmCache) collect() (map[string]int64, error) {
33 +func (c *Collector) collect() (map[string]int64, error) {
34 bs, err := c.exec.cacheStatus()
35 if err != nil {
36 return nil, err
@@ -45,7 +45,7 @@ func (c *DmCache) collect() (map[string]int64, error) {
45 return mx, nil
46 }
47
48 -func (c *DmCache) collectCacheStatus(mx map[string]int64, data []byte) error {
48 +func (c *Collector) collectCacheStatus(mx map[string]int64, data []byte) error {
49 var devices []*dmCacheDevice
50
51 sc := bufio.NewScanner(bytes.NewReader(data))
src/go/plugin/go.d/collector/dmcache/collector.go renamed
+15 -20
@@ -28,8 +28,8 @@ func init() {
28 })
29 }
30
31 -func New() *DmCache {
32 - return &DmCache{
31 +func New() *Collector {
32 + return &Collector{
33 Config: Config{
34 Timeout: confopt.Duration(time.Second * 2),
35 },
@@ -43,27 +43,22 @@ type Config struct {
43 Timeout confopt.Duration `yaml:"timeout,omitempty" json:"timeout"`
44 }
45
46 -type (
47 - DmCache struct {
48 - module.Base
49 - Config `yaml:",inline" json:""`
46 +type Collector struct {
47 + module.Base
48 + Config `yaml:",inline" json:""`
49
51 - charts *module.Charts
50 + charts *module.Charts
51
53 - exec dmsetupCLI
52 + exec dmsetupCli
53
55 - devices map[string]bool
56 - }
57 - dmsetupCLI interface {
58 - cacheStatus() ([]byte, error)
59 - }
60 -)
54 + devices map[string]bool
55 +}
56
62 -func (c *DmCache) Configuration() any {
57 +func (c *Collector) Configuration() any {
58 return c.Config
59 }
60
66 -func (c *DmCache) Init() error {
61 +func (c *Collector) Init() error {
62 dmsetup, err := c.initDmsetupCLI()
63 if err != nil {
64 return fmt.Errorf("dmsetup exec initialization: %v", err)
@@ -73,7 +68,7 @@ func (c *DmCache) Init() error {
68 return nil
69 }
70
76 -func (c *DmCache) Check() error {
71 +func (c *Collector) Check() error {
72 mx, err := c.collect()
73 if err != nil {
74 return err
@@ -86,11 +81,11 @@ func (c *DmCache) Check() error {
81 return nil
82 }
83
89 -func (c *DmCache) Charts() *module.Charts {
84 +func (c *Collector) Charts() *module.Charts {
85 return c.charts
86 }
87
93 -func (c *DmCache) Collect() map[string]int64 {
88 +func (c *Collector) Collect() map[string]int64 {
89 mx, err := c.collect()
90 if err != nil {
91 c.Error(err)
@@ -103,4 +98,4 @@ func (c *DmCache) Collect() map[string]int64 {
98 return mx
99 }
100
106 -func (c *DmCache) Cleanup() {}
101 +func (c *Collector) Cleanup() {}
src/go/plugin/go.d/collector/dmcache/collector_test.go renamed
+33 -33
@@ -30,11 +30,11 @@ func Test_testDataIsValid(t *testing.T) {
30 }
31 }
32
33 -func TestDmCace_Configuration(t *testing.T) {
34 - module.TestConfigurationSerialize(t, &DmCache{}, dataConfigJSON, dataConfigYAML)
33 +func TestCollector_Configuration(t *testing.T) {
34 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
35 }
36
37 -func TestDmCache_Init(t *testing.T) {
37 +func TestCollector_Init(t *testing.T) {
38 tests := map[string]struct {
39 config Config
40 wantFail bool
@@ -47,59 +47,59 @@ func TestDmCache_Init(t *testing.T) {
47
48 for name, test := range tests {
49 t.Run(name, func(t *testing.T) {
50 - lvm := New()
51 - lvm.Config = test.config
50 + collr := New()
51 + collr.Config = test.config
52
53 if test.wantFail {
54 - assert.Error(t, lvm.Init())
54 + assert.Error(t, collr.Init())
55 } else {
56 - assert.NoError(t, lvm.Init())
56 + assert.NoError(t, collr.Init())
57 }
58 })
59 }
60 }
61
62 -func TestDmCache_Cleanup(t *testing.T) {
62 +func TestCollector_Cleanup(t *testing.T) {
63 tests := map[string]struct {
64 - prepare func() *DmCache
64 + prepare func() *Collector
65 }{
66 "not initialized exec": {
67 - prepare: func() *DmCache {
67 + prepare: func() *Collector {
68 return New()
69 },
70 },
71 "after check": {
72 - prepare: func() *DmCache {
73 - lvm := New()
74 - lvm.exec = prepareMockOK()
75 - _ = lvm.Check()
76 - return lvm
72 + prepare: func() *Collector {
73 + collr := New()
74 + collr.exec = prepareMockOK()
75 + _ = collr.Check()
76 + return collr
77 },
78 },
79 "after collect": {
80 - prepare: func() *DmCache {
81 - lvm := New()
82 - lvm.exec = prepareMockOK()
83 - _ = lvm.Collect()
84 - return lvm
80 + prepare: func() *Collector {
81 + collr := New()
82 + collr.exec = prepareMockOK()
83 + _ = collr.Collect()
84 + return collr
85 },
86 },
87 }
88
89 for name, test := range tests {
90 t.Run(name, func(t *testing.T) {
91 - lvm := test.prepare()
91 + collr := test.prepare()
92
93 - assert.NotPanics(t, lvm.Cleanup)
93 + assert.NotPanics(t, collr.Cleanup)
94 })
95 }
96 }
97
98 -func TestDmCache_Charts(t *testing.T) {
98 +func TestCollector_Charts(t *testing.T) {
99 assert.NotNil(t, New().Charts())
100 }
101
102 -func TestDmCache_Check(t *testing.T) {
102 +func TestCollector_Check(t *testing.T) {
103 tests := map[string]struct {
104 prepareMock func() *mockDmsetupExec
105 wantFail bool
@@ -124,14 +124,14 @@ func TestDmCache_Check(t *testing.T) {
124
125 for name, test := range tests {
126 t.Run(name, func(t *testing.T) {
127 - dmcache := New()
127 + collr := New()
128 mock := test.prepareMock()
129 - dmcache.exec = mock
129 + collr.exec = mock
130
131 if test.wantFail {
132 - assert.Error(t, dmcache.Check())
132 + assert.Error(t, collr.Check())
133 } else {
134 - assert.NoError(t, dmcache.Check())
134 + assert.NoError(t, collr.Check())
135 }
136 })
137 }
@@ -187,17 +187,17 @@ func TestLVM_Collect(t *testing.T) {
187
188 for name, test := range tests {
189 t.Run(name, func(t *testing.T) {
190 - dmcache := New()
190 + collr := New()
191 mock := test.prepareMock()
192 - dmcache.exec = mock
192 + collr.exec = mock
193
194 - mx := dmcache.Collect()
194 + mx := collr.Collect()
195
196 assert.Equal(t, test.wantMetrics, mx)
197
198 - assert.Len(t, *dmcache.Charts(), test.wantCharts, "wantCharts")
198 + assert.Len(t, *collr.Charts(), test.wantCharts, "wantCharts")
199
200 - module.TestMetricsHasAllChartsDims(t, dmcache.Charts(), mx)
200 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
201 })
202 }
203 }
src/go/plugin/go.d/collector/dmcache/exec.go
+4
@@ -13,6 +13,10 @@ import (
13 "github.com/netdata/netdata/go/plugins/logger"
14 )
15
16 +type dmsetupCli interface {
17 + cacheStatus() ([]byte, error)
18 +}
19 +
20 func newDmsetupExec(ndsudoPath string, timeout time.Duration, log *logger.Logger) *dmsetupExec {
21 return &dmsetupExec{
22 Logger: log,
src/go/plugin/go.d/collector/dmcache/init.go
+1 -1
@@ -12,7 +12,7 @@ import (
12 "github.com/netdata/netdata/go/plugins/pkg/executable"
13 )
14
15 -func (c *DmCache) initDmsetupCLI() (dmsetupCLI, error) {
15 +func (c *Collector) initDmsetupCLI() (dmsetupCli, error) {
16 ndsudoPath := filepath.Join(executable.Directory, "ndsudo")
17 if _, err := os.Stat(ndsudoPath); err != nil {
18 return nil, fmt.Errorf("ndsudo executable not found: %v", err)
src/go/plugin/go.d/collector/dnsdist/collect.go
+7 -7
@@ -13,33 +13,33 @@ const (
13 urlPathJSONStat = "/jsonstat"
14 )
15
16 -func (d *DNSdist) collect() (map[string]int64, error) {
17 - statistics, err := d.scrapeStatistics()
16 +func (c *Collector) collect() (map[string]int64, error) {
17 + statistics, err := c.scrapeStatistics()
18 if err != nil {
19 return nil, err
20 }
21
22 collected := make(map[string]int64)
23 - d.collectStatistic(collected, statistics)
23 + c.collectStatistic(collected, statistics)
24
25 return collected, nil
26 }
27
28 -func (d *DNSdist) collectStatistic(collected map[string]int64, statistics *statisticMetrics) {
28 +func (c *Collector) collectStatistic(collected map[string]int64, statistics *statisticMetrics) {
29 for metric, value := range stm.ToMap(statistics) {
30 collected[metric] = value
31 }
32 }
33
34 -func (d *DNSdist) scrapeStatistics() (*statisticMetrics, error) {
35 - req, err := web.NewHTTPRequestWithPath(d.RequestConfig, urlPathJSONStat)
34 +func (c *Collector) scrapeStatistics() (*statisticMetrics, error) {
35 + req, err := web.NewHTTPRequestWithPath(c.RequestConfig, urlPathJSONStat)
36 if err != nil {
37 return nil, err
38 }
39 req.URL.RawQuery = url.Values{"command": []string{"stats"}}.Encode()
40
41 var stats statisticMetrics
42 - if err := web.DoHTTP(d.httpClient).RequestJSON(req, &stats); err != nil {
42 + if err := web.DoHTTP(c.httpClient).RequestJSON(req, &stats); err != nil {
43 return nil, err
44 }
45
src/go/plugin/go.d/collector/dnsdist/collector.go renamed
+21 -21
@@ -28,8 +28,8 @@ func init() {
28 })
29 }
30
31 -func New() *DNSdist {
32 - return &DNSdist{
31 +func New() *Collector {
32 + return &Collector{
33 Config: Config{
34 HTTPConfig: web.HTTPConfig{
35 RequestConfig: web.RequestConfig{
@@ -48,7 +48,7 @@ type Config struct {
48 web.HTTPConfig `yaml:",inline" json:""`
49 }
50
51 -type DNSdist struct {
51 +type Collector struct {
52 module.Base
53 Config `yaml:",inline" json:""`
54
@@ -57,33 +57,33 @@ type DNSdist struct {
57 httpClient *http.Client
58 }
59
60 -func (d *DNSdist) Configuration() any {
61 - return d.Config
60 +func (c *Collector) Configuration() any {
61 + return c.Config
62 }
63
64 -func (d *DNSdist) Init() error {
65 - err := d.validateConfig()
64 +func (c *Collector) Init() error {
65 + err := c.validateConfig()
66 if err != nil {
67 return fmt.Errorf("config validation: %v", err)
68 }
69
70 - client, err := d.initHTTPClient()
70 + client, err := c.initHTTPClient()
71 if err != nil {
72 return fmt.Errorf("init HTTP client: %v", err)
73 }
74 - d.httpClient = client
74 + c.httpClient = client
75
76 - cs, err := d.initCharts()
76 + cs, err := c.initCharts()
77 if err != nil {
78 return fmt.Errorf("init charts: %v", err)
79 }
80 - d.charts = cs
80 + c.charts = cs
81
82 return nil
83 }
84
85 -func (d *DNSdist) Check() error {
86 - mx, err := d.collect()
85 +func (c *Collector) Check() error {
86 + mx, err := c.collect()
87 if err != nil {
88 return err
89 }
@@ -94,14 +94,14 @@ func (d *DNSdist) Check() error {
94 return nil
95 }
96
97 -func (d *DNSdist) Charts() *module.Charts {
98 - return d.charts
97 +func (c *Collector) Charts() *module.Charts {
98 + return c.charts
99 }
100
101 -func (d *DNSdist) Collect() map[string]int64 {
102 - ms, err := d.collect()
101 +func (c *Collector) Collect() map[string]int64 {
102 + ms, err := c.collect()
103 if err != nil {
104 - d.Error(err)
104 + c.Error(err)
105 }
106
107 if len(ms) == 0 {
@@ -111,9 +111,9 @@ func (d *DNSdist) Collect() map[string]int64 {
111 return ms
112 }
113
114 -func (d *DNSdist) Cleanup() {
115 - if d.httpClient == nil {
114 +func (c *Collector) Cleanup() {
115 + if c.httpClient == nil {
116 return
117 }
118 - d.httpClient.CloseIdleConnections()
118 + c.httpClient.CloseIdleConnections()
119 }
src/go/plugin/go.d/collector/dnsdist/collector_test.go renamed
+40 -40
@@ -33,11 +33,11 @@ func Test_testDataIsValid(t *testing.T) {
33 }
34 }
35
36 -func TestDNSdist_ConfigurationSerialize(t *testing.T) {
37 - module.TestConfigurationSerialize(t, &DNSdist{}, dataConfigJSON, dataConfigYAML)
36 +func TestCollector_ConfigurationSerialize(t *testing.T) {
37 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
38 }
39
40 -func TestDNSdist_Init(t *testing.T) {
40 +func TestCollector_Init(t *testing.T) {
41 tests := map[string]struct {
42 config Config
43 wantFail bool
@@ -70,31 +70,31 @@ func TestDNSdist_Init(t *testing.T) {
70
71 for name, test := range tests {
72 t.Run(name, func(t *testing.T) {
73 - ns := New()
74 - ns.Config = test.config
73 + collr := New()
74 + collr.Config = test.config
75
76 if test.wantFail {
77 - assert.Error(t, ns.Init())
77 + assert.Error(t, collr.Init())
78 } else {
79 - assert.NoError(t, ns.Init())
79 + assert.NoError(t, collr.Init())
80 }
81 })
82 }
83 }
84
85 -func TestDNSdist_Charts(t *testing.T) {
86 - dist := New()
87 - require.NoError(t, dist.Init())
88 - assert.NotNil(t, dist.Charts())
85 +func TestCollector_Charts(t *testing.T) {
86 + collr := New()
87 + require.NoError(t, collr.Init())
88 + assert.NotNil(t, collr.Charts())
89 }
90
91 -func TestDNSdist_Cleanup(t *testing.T) {
91 +func TestCollector_Cleanup(t *testing.T) {
92 assert.NotPanics(t, New().Cleanup)
93 }
94
95 -func TestDNSdist_Check(t *testing.T) {
95 +func TestCollector_Check(t *testing.T) {
96 tests := map[string]struct {
97 - prepare func() (dist *DNSdist, cleanup func())
97 + prepare func() (collr *Collector, cleanup func())
98 wantFail bool
99 }{
100 "success on valid response v1.5.1": {
@@ -117,22 +117,22 @@ func TestDNSdist_Check(t *testing.T) {
117
118 for name, test := range tests {
119 t.Run(name, func(t *testing.T) {
120 - dist, cleanup := test.prepare()
120 + collr, cleanup := test.prepare()
121 defer cleanup()
122 - require.NoError(t, dist.Init())
122 + require.NoError(t, collr.Init())
123
124 if test.wantFail {
125 - assert.Error(t, dist.Check())
125 + assert.Error(t, collr.Check())
126 } else {
127 - assert.NoError(t, dist.Check())
127 + assert.NoError(t, collr.Check())
128 }
129 })
130 }
131 }
132
133 -func TestDNSdist_Collect(t *testing.T) {
133 +func TestCollector_Collect(t *testing.T) {
134 tests := map[string]struct {
135 - prepare func() (dist *DNSdist, cleanup func())
135 + prepare func() (collr *Collector, cleanup func())
136 wantCollected map[string]int64
137 }{
138 "success on valid response v1.5.1": {
@@ -185,55 +185,55 @@ func TestDNSdist_Collect(t *testing.T) {
185
186 for name, test := range tests {
187 t.Run(name, func(t *testing.T) {
188 - dist, cleanup := test.prepare()
188 + collr, cleanup := test.prepare()
189 defer cleanup()
190 - require.NoError(t, dist.Init())
190 + require.NoError(t, collr.Init())
191
192 - mx := dist.Collect()
192 + mx := collr.Collect()
193
194 assert.Equal(t, test.wantCollected, mx)
195 if len(test.wantCollected) > 0 {
196 - module.TestMetricsHasAllChartsDims(t, dist.Charts(), mx)
196 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
197 }
198 })
199 }
200 }
201
202 -func preparePowerDNSdistV151() (*DNSdist, func()) {
202 +func preparePowerDNSdistV151() (*Collector, func()) {
203 srv := preparePowerDNSDistEndpoint()
204 - ns := New()
205 - ns.URL = srv.URL
204 + collr := New()
205 + collr.URL = srv.URL
206
207 - return ns, srv.Close
207 + return collr, srv.Close
208 }
209
210 -func preparePowerDNSdist404() (*DNSdist, func()) {
210 +func preparePowerDNSdist404() (*Collector, func()) {
211 srv := httptest.NewServer(http.HandlerFunc(
212 func(w http.ResponseWriter, r *http.Request) {
213 w.WriteHeader(http.StatusNotFound)
214 }))
215 - ns := New()
216 - ns.URL = srv.URL
215 + collr := New()
216 + collr.URL = srv.URL
217
218 - return ns, srv.Close
218 + return collr, srv.Close
219 }
220
221 -func preparePowerDNSdistConnectionRefused() (*DNSdist, func()) {
222 - ns := New()
223 - ns.URL = "http://127.0.0.1:38001"
221 +func preparePowerDNSdistConnectionRefused() (*Collector, func()) {
222 + collr := New()
223 + collr.URL = "http://127.0.0.1:38001"
224
225 - return ns, func() {}
225 + return collr, func() {}
226 }
227
228 -func preparePowerDNSdistInvalidData() (*DNSdist, func()) {
228 +func preparePowerDNSdistInvalidData() (*Collector, func()) {
229 srv := httptest.NewServer(http.HandlerFunc(
230 func(w http.ResponseWriter, r *http.Request) {
231 _, _ = w.Write([]byte("hello and\n goodbye"))
232 }))
233 - ns := New()
234 - ns.URL = srv.URL
233 + collr := New()
234 + collr.URL = srv.URL
235
236 - return ns, srv.Close
236 + return collr, srv.Close
237 }
238
239 func preparePowerDNSDistEndpoint() *httptest.Server {
src/go/plugin/go.d/collector/dnsdist/init.go
+6 -6
@@ -10,22 +10,22 @@ import (
10 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/web"
11 )
12
13 -func (d *DNSdist) validateConfig() error {
14 - if d.URL == "" {
13 +func (c *Collector) validateConfig() error {
14 + if c.URL == "" {
15 return errors.New("URL not set")
16 }
17
18 - if _, err := web.NewHTTPRequest(d.RequestConfig); err != nil {
18 + if _, err := web.NewHTTPRequest(c.RequestConfig); err != nil {
19 return err
20 }
21
22 return nil
23 }
24
25 -func (d *DNSdist) initHTTPClient() (*http.Client, error) {
26 - return web.NewHTTPClient(d.ClientConfig)
25 +func (c *Collector) initHTTPClient() (*http.Client, error) {
26 + return web.NewHTTPClient(c.ClientConfig)
27 }
28
29 -func (d *DNSdist) initCharts() (*module.Charts, error) {
29 +func (c *Collector) initCharts() (*module.Charts, error) {
30 return charts.Copy(), nil
31 }
src/go/plugin/go.d/collector/dnsmasq/collect.go
+8 -8
@@ -10,17 +10,17 @@ import (
10 "github.com/miekg/dns"
11 )
12
13 -func (d *Dnsmasq) collect() (map[string]int64, error) {
13 +func (c *Collector) collect() (map[string]int64, error) {
14 mx := make(map[string]int64)
15
16 - if err := d.collectCacheStatistics(mx); err != nil {
16 + if err := c.collectCacheStatistics(mx); err != nil {
17 return nil, err
18 }
19
20 return mx, nil
21 }
22
23 -func (d *Dnsmasq) collectCacheStatistics(mx map[string]int64) error {
23 +func (c *Collector) collectCacheStatistics(mx map[string]int64) error {
24 /*
25 ;; flags: qr aa rd ra; QUERY: 7, ANSWER: 7, AUTHORITY: 0, ADDITIONAL: 0
26
@@ -56,7 +56,7 @@ func (d *Dnsmasq) collectCacheStatistics(mx map[string]int64) error {
56 }
57
58 for _, q := range questions {
59 - resp, err := d.query(q)
59 + resp, err := c.query(q)
60 if err != nil {
61 return err
62 }
@@ -110,7 +110,7 @@ func (d *Dnsmasq) collectCacheStatistics(mx map[string]int64) error {
110 return nil
111 }
112
113 -func (d *Dnsmasq) query(question string) (*dns.Msg, error) {
113 +func (c *Collector) query(question string) (*dns.Msg, error) {
114 msg := &dns.Msg{
115 MsgHdr: dns.MsgHdr{
116 Id: dns.Id(),
@@ -121,18 +121,18 @@ func (d *Dnsmasq) query(question string) (*dns.Msg, error) {
121 },
122 }
123
124 - r, _, err := d.dnsClient.Exchange(msg, d.Address)
124 + r, _, err := c.dnsClient.Exchange(msg, c.Address)
125 if err != nil {
126 return nil, err
127 }
128
129 if r == nil {
130 - return nil, fmt.Errorf("'%s' question '%s', returned an empty response", d.Address, question)
130 + return nil, fmt.Errorf("'%s' question '%s', returned an empty response", c.Address, question)
131 }
132
133 if r.Rcode != dns.RcodeSuccess {
134 s := dns.RcodeToString[r.Rcode]
135 - return nil, fmt.Errorf("'%s' question '%s' returned '%s' (%d) response code", d.Address, question, s, r.Rcode)
135 + return nil, fmt.Errorf("'%s' question '%s' returned '%s' (%d) response code", c.Address, question, s, r.Rcode)
136 }
137
138 return r, nil
src/go/plugin/go.d/collector/dnsmasq/collector.go renamed
+19 -19
@@ -25,8 +25,8 @@ func init() {
25 })
26 }
27
28 -func New() *Dnsmasq {
29 - return &Dnsmasq{
28 +func New() *Collector {
29 + return &Collector{
30 Config: Config{
31 Protocol: "udp",
32 Address: "127.0.0.1:53",
@@ -50,7 +50,7 @@ type Config struct {
50 }
51
52 type (
53 - Dnsmasq struct {
53 + Collector struct {
54 module.Base
55 Config `yaml:",inline" json:""`
56
@@ -64,33 +64,33 @@ type (
64 }
65 )
66
67 -func (d *Dnsmasq) Configuration() any {
68 - return d.Config
67 +func (c *Collector) Configuration() any {
68 + return c.Config
69 }
70
71 -func (d *Dnsmasq) Init() error {
72 - err := d.validateConfig()
71 +func (c *Collector) Init() error {
72 + err := c.validateConfig()
73 if err != nil {
74 return fmt.Errorf("config validation: %v", err)
75 }
76
77 - client, err := d.initDNSClient()
77 + client, err := c.initDNSClient()
78 if err != nil {
79 return fmt.Errorf("init DNS client: %v", err)
80 }
81 - d.dnsClient = client
81 + c.dnsClient = client
82
83 - charts, err := d.initCharts()
83 + charts, err := c.initCharts()
84 if err != nil {
85 return fmt.Errorf("init charts: %v", err)
86 }
87 - d.charts = charts
87 + c.charts = charts
88
89 return nil
90 }
91
92 -func (d *Dnsmasq) Check() error {
93 - mx, err := d.collect()
92 +func (c *Collector) Check() error {
93 + mx, err := c.collect()
94 if err != nil {
95 return err
96 }
@@ -101,14 +101,14 @@ func (d *Dnsmasq) Check() error {
101 return nil
102 }
103
104 -func (d *Dnsmasq) Charts() *module.Charts {
105 - return d.charts
104 +func (c *Collector) Charts() *module.Charts {
105 + return c.charts
106 }
107
108 -func (d *Dnsmasq) Collect() map[string]int64 {
109 - ms, err := d.collect()
108 +func (c *Collector) Collect() map[string]int64 {
109 + ms, err := c.collect()
110 if err != nil {
111 - d.Error(err)
111 + c.Error(err)
112 }
113
114 if len(ms) == 0 {
@@ -117,4 +117,4 @@ func (d *Dnsmasq) Collect() map[string]int64 {
117 return ms
118 }
119
120 -func (d *Dnsmasq) Cleanup() {}
120 +func (c *Collector) Cleanup() {}
src/go/plugin/go.d/collector/dnsmasq/collector_test.go renamed
+36 -36
@@ -30,11 +30,11 @@ func Test_testDataIsValid(t *testing.T) {
30 }
31 }
32
33 -func TestDnsmasq_ConfigurationSerialize(t *testing.T) {
34 - module.TestConfigurationSerialize(t, &Dnsmasq{}, dataConfigJSON, dataConfigYAML)
33 +func TestCollector_ConfigurationSerialize(t *testing.T) {
34 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
35 }
36
37 -func TestDnsmasq_Init(t *testing.T) {
37 +func TestCollector_Init(t *testing.T) {
38 tests := map[string]struct {
39 config Config
40 wantFail bool
@@ -67,21 +67,21 @@ func TestDnsmasq_Init(t *testing.T) {
67
68 for name, test := range tests {
69 t.Run(name, func(t *testing.T) {
70 - ns := New()
71 - ns.Config = test.config
70 + collr := New()
71 + collr.Config = test.config
72
73 if test.wantFail {
74 - assert.Error(t, ns.Init())
74 + assert.Error(t, collr.Init())
75 } else {
76 - assert.NoError(t, ns.Init())
76 + assert.NoError(t, collr.Init())
77 }
78 })
79 }
80 }
81
82 -func TestDnsmasq_Check(t *testing.T) {
82 +func TestCollector_Check(t *testing.T) {
83 tests := map[string]struct {
84 - prepare func() *Dnsmasq
84 + prepare func() *Collector
85 wantFail bool
86 }{
87 "success on valid response": {
@@ -99,31 +99,31 @@ func TestDnsmasq_Check(t *testing.T) {
99
100 for name, test := range tests {
101 t.Run(name, func(t *testing.T) {
102 - dnsmasq := test.prepare()
103 - require.NoError(t, dnsmasq.Init())
102 + collr := test.prepare()
103 + require.NoError(t, collr.Init())
104
105 if test.wantFail {
106 - assert.Error(t, dnsmasq.Check())
106 + assert.Error(t, collr.Check())
107 } else {
108 - assert.NoError(t, dnsmasq.Check())
108 + assert.NoError(t, collr.Check())
109 }
110 })
111 }
112 }
113
114 -func TestDnsmasq_Charts(t *testing.T) {
115 - dnsmasq := New()
116 - require.NoError(t, dnsmasq.Init())
117 - assert.NotNil(t, dnsmasq.Charts())
114 +func TestCollector_Charts(t *testing.T) {
115 + collr := New()
116 + require.NoError(t, collr.Init())
117 + assert.NotNil(t, collr.Charts())
118 }
119
120 -func TestDnsmasq_Cleanup(t *testing.T) {
120 +func TestCollector_Cleanup(t *testing.T) {
121 assert.NotPanics(t, New().Cleanup)
122 }
123
124 -func TestDnsmasq_Collect(t *testing.T) {
124 +func TestCollector_Collect(t *testing.T) {
125 tests := map[string]struct {
126 - prepare func() *Dnsmasq
126 + prepare func() *Collector
127 wantCollected map[string]int64
128 }{
129 "success on valid response": {
@@ -149,45 +149,45 @@ func TestDnsmasq_Collect(t *testing.T) {
149
150 for name, test := range tests {
151 t.Run(name, func(t *testing.T) {
152 - dnsmasq := test.prepare()
153 - require.NoError(t, dnsmasq.Init())
152 + collr := test.prepare()
153 + require.NoError(t, collr.Init())
154
155 - mx := dnsmasq.Collect()
155 + mx := collr.Collect()
156
157 assert.Equal(t, test.wantCollected, mx)
158 if len(test.wantCollected) > 0 {
159 - module.TestMetricsHasAllChartsDims(t, dnsmasq.Charts(), mx)
159 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
160 }
161 })
162 }
163 }
164
165 -func prepareOKDnsmasq() *Dnsmasq {
166 - dnsmasq := New()
167 - dnsmasq.newDNSClient = func(network string, timeout time.Duration) dnsClient {
165 +func prepareOKDnsmasq() *Collector {
166 + collr := New()
167 + collr.newDNSClient = func(network string, timeout time.Duration) dnsClient {
168 return &mockDNSClient{}
169 }
170 - return dnsmasq
170 + return collr
171 }
172
173 -func prepareErrorOnExchangeDnsmasq() *Dnsmasq {
174 - dnsmasq := New()
175 - dnsmasq.newDNSClient = func(network string, timeout time.Duration) dnsClient {
173 +func prepareErrorOnExchangeDnsmasq() *Collector {
174 + collr := New()
175 + collr.newDNSClient = func(network string, timeout time.Duration) dnsClient {
176 return &mockDNSClient{
177 errOnExchange: true,
178 }
179 }
180 - return dnsmasq
180 + return collr
181 }
182
183 -func prepareRcodeServerFailureOnExchangeDnsmasq() *Dnsmasq {
184 - dnsmasq := New()
185 - dnsmasq.newDNSClient = func(network string, timeout time.Duration) dnsClient {
183 +func prepareRcodeServerFailureOnExchangeDnsmasq() *Collector {
184 + collr := New()
185 + collr.newDNSClient = func(network string, timeout time.Duration) dnsClient {
186 return &mockDNSClient{
187 rcodeServerFailureOnExchange: true,
188 }
189 }
190 - return dnsmasq
190 + return collr
191 }
192
193 type mockDNSClient struct {
src/go/plugin/go.d/collector/dnsmasq/init.go
+7 -7
@@ -9,21 +9,21 @@ import (
9 "github.com/netdata/netdata/go/plugins/plugin/go.d/agent/module"
10 )
11
12 -func (d *Dnsmasq) validateConfig() error {
13 - if d.Address == "" {
12 +func (c *Collector) validateConfig() error {
13 + if c.Address == "" {
14 return errors.New("'address' parameter not set")
15 }
16 - if !isProtocolValid(d.Protocol) {
17 - return fmt.Errorf("'protocol' (%s) is not valid, expected one of %v", d.Protocol, validProtocols)
16 + if !isProtocolValid(c.Protocol) {
17 + return fmt.Errorf("'protocol' (%s) is not valid, expected one of %v", c.Protocol, validProtocols)
18 }
19 return nil
20 }
21
22 -func (d *Dnsmasq) initDNSClient() (dnsClient, error) {
23 - return d.newDNSClient(d.Protocol, d.Timeout.Duration()), nil
22 +func (c *Collector) initDNSClient() (dnsClient, error) {
23 + return c.newDNSClient(c.Protocol, c.Timeout.Duration()), nil
24 }
25
26 -func (d *Dnsmasq) initCharts() (*module.Charts, error) {
26 +func (c *Collector) initCharts() (*module.Charts, error) {
27 return cacheCharts.Copy(), nil
28 }
29
src/go/plugin/go.d/collector/dnsmasq_dhcp/charts.go
+5 -5
@@ -95,16 +95,16 @@ func newDHCPRangeCharts(dhcpRange string) *module.Charts {
95 return charts
96 }
97
98 -func (d *DnsmasqDHCP) addDHCPRangeCharts(dhcpRange string) {
98 +func (c *Collector) addDHCPRangeCharts(dhcpRange string) {
99 charts := newDHCPRangeCharts(dhcpRange)
100 - if err := d.Charts().Add(*charts...); err != nil {
101 - d.Warning(err)
100 + if err := c.Charts().Add(*charts...); err != nil {
101 + c.Warning(err)
102 }
103 }
104
105 -func (d *DnsmasqDHCP) removeDHCPRangeCharts(dhcpRange string) {
105 +func (c *Collector) removeDHCPRangeCharts(dhcpRange string) {
106 p := "dhcp_range_" + dhcpRange
107 - for _, c := range *d.Charts() {
107 + for _, c := range *c.Charts() {
108 if strings.HasSuffix(c.ID, p) {
109 c.MarkRemove()
110 c.MarkNotCreated()
src/go/plugin/go.d/collector/dnsmasq_dhcp/collect.go
+45 -45
@@ -17,21 +17,21 @@ import (
17 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/iprange"
18 )
19
20 -func (d *DnsmasqDHCP) collect() (map[string]int64, error) {
20 +func (c *Collector) collect() (map[string]int64, error) {
21 now := time.Now()
22 var updated bool
23
24 - if now.Sub(d.parseConfigTime) > d.parseConfigEvery {
25 - d.parseConfigTime = now
24 + if now.Sub(c.parseConfigTime) > c.parseConfigEvery {
25 + c.parseConfigTime = now
26
27 - dhcpRanges, dhcpHosts := d.parseDnsmasqDHCPConfiguration()
28 - d.dhcpRanges, d.dhcpHosts = dhcpRanges, dhcpHosts
29 - updated = d.updateCharts()
27 + dhcpRanges, dhcpHosts := c.parseDnsmasqDHCPConfiguration()
28 + c.dhcpRanges, c.dhcpHosts = dhcpRanges, dhcpHosts
29 + updated = c.updateCharts()
30
31 - d.collectV4V6Stats()
31 + c.collectV4V6Stats()
32 }
33
34 - f, err := os.Open(d.LeasesPath)
34 + f, err := os.Open(c.LeasesPath)
35 if err != nil {
36 return nil, err
37 }
@@ -43,91 +43,91 @@ func (d *DnsmasqDHCP) collect() (map[string]int64, error) {
43 return nil, err
44 }
45
46 - if d.leasesModTime.Equal(fi.ModTime()) {
47 - d.Debug("lease database file modification time has not changed, old data is returned")
48 - return d.mx, nil
46 + if c.leasesModTime.Equal(fi.ModTime()) {
47 + c.Debug("lease database file modification time has not changed, old data is returned")
48 + return c.mx, nil
49 }
50
51 - d.Debug("leases db file modification time has changed, reading it")
52 - d.leasesModTime = fi.ModTime()
51 + c.Debug("leases db file modification time has changed, reading it")
52 + c.leasesModTime = fi.ModTime()
53 }
54
55 leases := findLeases(f)
56 - d.collectRangesStats(leases)
56 + c.collectRangesStats(leases)
57
58 - return d.mx, nil
58 + return c.mx, nil
59 }
60
61 -func (d *DnsmasqDHCP) collectV4V6Stats() {
62 - d.mx["ipv4_dhcp_ranges"], d.mx["ipv6_dhcp_ranges"] = 0, 0
63 - for _, r := range d.dhcpRanges {
61 +func (c *Collector) collectV4V6Stats() {
62 + c.mx["ipv4_dhcp_ranges"], c.mx["ipv6_dhcp_ranges"] = 0, 0
63 + for _, r := range c.dhcpRanges {
64 if r.Family() == iprange.V6Family {
65 - d.mx["ipv6_dhcp_ranges"]++
65 + c.mx["ipv6_dhcp_ranges"]++
66 } else {
67 - d.mx["ipv4_dhcp_ranges"]++
67 + c.mx["ipv4_dhcp_ranges"]++
68 }
69 }
70
71 - d.mx["ipv4_dhcp_hosts"], d.mx["ipv6_dhcp_hosts"] = 0, 0
72 - for _, ip := range d.dhcpHosts {
71 + c.mx["ipv4_dhcp_hosts"], c.mx["ipv6_dhcp_hosts"] = 0, 0
72 + for _, ip := range c.dhcpHosts {
73 if ip.To4() == nil {
74 - d.mx["ipv6_dhcp_hosts"]++
74 + c.mx["ipv6_dhcp_hosts"]++
75 } else {
76 - d.mx["ipv4_dhcp_hosts"]++
76 + c.mx["ipv4_dhcp_hosts"]++
77 }
78 }
79 }
80
81 -func (d *DnsmasqDHCP) collectRangesStats(leases []net.IP) {
82 - for _, r := range d.dhcpRanges {
83 - d.mx["dhcp_range_"+r.String()+"_allocated_leases"] = 0
84 - d.mx["dhcp_range_"+r.String()+"_utilization"] = 0
81 +func (c *Collector) collectRangesStats(leases []net.IP) {
82 + for _, r := range c.dhcpRanges {
83 + c.mx["dhcp_range_"+r.String()+"_allocated_leases"] = 0
84 + c.mx["dhcp_range_"+r.String()+"_utilization"] = 0
85 }
86
87 for _, ip := range leases {
88 - for _, r := range d.dhcpRanges {
88 + for _, r := range c.dhcpRanges {
89 if r.Contains(ip) {
90 - d.mx["dhcp_range_"+r.String()+"_allocated_leases"]++
90 + c.mx["dhcp_range_"+r.String()+"_allocated_leases"]++
91 break
92 }
93 }
94 }
95
96 - for _, ip := range d.dhcpHosts {
97 - for _, r := range d.dhcpRanges {
96 + for _, ip := range c.dhcpHosts {
97 + for _, r := range c.dhcpRanges {
98 if r.Contains(ip) {
99 - d.mx["dhcp_range_"+r.String()+"_allocated_leases"]++
99 + c.mx["dhcp_range_"+r.String()+"_allocated_leases"]++
100 break
101 }
102 }
103 }
104
105 - for _, r := range d.dhcpRanges {
105 + for _, r := range c.dhcpRanges {
106 name := "dhcp_range_" + r.String() + "_allocated_leases"
107 - numOfIps, ok := d.mx[name]
107 + numOfIps, ok := c.mx[name]
108 if !ok {
109 - d.mx[name] = 0
109 + c.mx[name] = 0
110 }
111 - d.mx["dhcp_range_"+r.String()+"_utilization"] = int64(math.Round(calcPercent(numOfIps, r.Size())))
111 + c.mx["dhcp_range_"+r.String()+"_utilization"] = int64(math.Round(calcPercent(numOfIps, r.Size())))
112 }
113 }
114
115 -func (d *DnsmasqDHCP) updateCharts() bool {
115 +func (c *Collector) updateCharts() bool {
116 var updated bool
117 seen := make(map[string]bool)
118 - for _, r := range d.dhcpRanges {
118 + for _, r := range c.dhcpRanges {
119 seen[r.String()] = true
120 - if !d.cacheDHCPRanges[r.String()] {
121 - d.cacheDHCPRanges[r.String()] = true
122 - d.addDHCPRangeCharts(r.String())
120 + if !c.cacheDHCPRanges[r.String()] {
121 + c.cacheDHCPRanges[r.String()] = true
122 + c.addDHCPRangeCharts(r.String())
123 updated = true
124 }
125 }
126
127 - for v := range d.cacheDHCPRanges {
127 + for v := range c.cacheDHCPRanges {
128 if !seen[v] {
129 - delete(d.cacheDHCPRanges, v)
130 - d.removeDHCPRangeCharts(v)
129 + delete(c.cacheDHCPRanges, v)
130 + c.removeDHCPRangeCharts(v)
131 updated = true
132 }
133 }
src/go/plugin/go.d/collector/dnsmasq_dhcp/collector.go renamed
+16 -16
@@ -26,8 +26,8 @@ func init() {
26 })
27 }
28
29 -func New() *DnsmasqDHCP {
30 - return &DnsmasqDHCP{
29 +func New() *Collector {
30 + return &Collector{
31 Config: Config{
32 // debian defaults
33 LeasesPath: "/var/lib/misc/dnsmasq.leases",
@@ -48,7 +48,7 @@ type Config struct {
48 ConfDir string `yaml:"conf_dir,omitempty" json:"conf_dir"`
49 }
50
51 -type DnsmasqDHCP struct {
51 +type Collector struct {
52 module.Base
53 Config `yaml:",inline" json:""`
54
@@ -64,23 +64,23 @@ type DnsmasqDHCP struct {
64 mx map[string]int64
65 }
66
67 -func (d *DnsmasqDHCP) Configuration() any {
68 - return d.Config
67 +func (c *Collector) Configuration() any {
68 + return c.Config
69 }
70
71 -func (d *DnsmasqDHCP) Init() error {
72 - if err := d.validateConfig(); err != nil {
71 +func (c *Collector) Init() error {
72 + if err := c.validateConfig(); err != nil {
73 return fmt.Errorf("config validation: %v", err)
74 }
75 - if err := d.checkLeasesPath(); err != nil {
75 + if err := c.checkLeasesPath(); err != nil {
76 return fmt.Errorf("leases path check: %v", err)
77 }
78
79 return nil
80 }
81
82 -func (d *DnsmasqDHCP) Check() error {
83 - mx, err := d.collect()
82 +func (c *Collector) Check() error {
83 + mx, err := c.collect()
84 if err != nil {
85 return err
86 }
@@ -91,14 +91,14 @@ func (d *DnsmasqDHCP) Check() error {
91 return nil
92 }
93
94 -func (d *DnsmasqDHCP) Charts() *module.Charts {
95 - return d.charts
94 +func (c *Collector) Charts() *module.Charts {
95 + return c.charts
96 }
97
98 -func (d *DnsmasqDHCP) Collect() map[string]int64 {
99 - mx, err := d.collect()
98 +func (c *Collector) Collect() map[string]int64 {
99 + mx, err := c.collect()
100 if err != nil {
101 - d.Error(err)
101 + c.Error(err)
102 }
103
104 if len(mx) == 0 {
@@ -108,4 +108,4 @@ func (d *DnsmasqDHCP) Collect() map[string]int64 {
108 return mx
109 }
110
111 -func (d *DnsmasqDHCP) Cleanup() {}
111 +func (c *Collector) Cleanup() {}
src/go/plugin/go.d/collector/dnsmasq_dhcp/collector_test.go renamed
+56 -56
@@ -34,76 +34,76 @@ func Test_testDataIsValid(t *testing.T) {
34 }
35 }
36
37 -func TestDnsmasqDHCP_ConfigurationSerialize(t *testing.T) {
38 - module.TestConfigurationSerialize(t, &DnsmasqDHCP{}, dataConfigJSON, dataConfigYAML)
37 +func TestCollector_ConfigurationSerialize(t *testing.T) {
38 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
39 }
40
41 -func TestDnsmasqDHCP_Init(t *testing.T) {
42 - job := New()
43 - job.LeasesPath = testLeasesPath
44 - job.ConfPath = testConfPath
45 - job.ConfDir = testConfDir
41 +func TestCollector_Init(t *testing.T) {
42 + collr := New()
43 + collr.LeasesPath = testLeasesPath
44 + collr.ConfPath = testConfPath
45 + collr.ConfDir = testConfDir
46
47 - assert.NoError(t, job.Init())
47 + assert.NoError(t, collr.Init())
48 }
49
50 -func TestDnsmasqDHCP_InitEmptyLeasesPath(t *testing.T) {
51 - job := New()
52 - job.LeasesPath = ""
50 +func TestCollector_InitEmptyLeasesPath(t *testing.T) {
51 + collr := New()
52 + collr.LeasesPath = ""
53
54 - assert.Error(t, job.Init())
54 + assert.Error(t, collr.Init())
55 }
56
57 -func TestDnsmasqDHCP_InitInvalidLeasesPath(t *testing.T) {
58 - job := New()
59 - job.LeasesPath = testLeasesPath
60 - job.LeasesPath += "!"
57 +func TestCollector_InitInvalidLeasesPath(t *testing.T) {
58 + collr := New()
59 + collr.LeasesPath = testLeasesPath
60 + collr.LeasesPath += "!"
61
62 - assert.Error(t, job.Init())
62 + assert.Error(t, collr.Init())
63 }
64
65 -func TestDnsmasqDHCP_InitZeroDHCPRanges(t *testing.T) {
66 - job := New()
67 - job.LeasesPath = testLeasesPath
68 - job.ConfPath = "testdata/dnsmasq3.conf"
69 - job.ConfDir = ""
65 +func TestCollector_InitZeroDHCPRanges(t *testing.T) {
66 + collr := New()
67 + collr.LeasesPath = testLeasesPath
68 + collr.ConfPath = "testdata/dnsmasq3.conf"
69 + collr.ConfDir = ""
70
71 - assert.NoError(t, job.Init())
71 + assert.NoError(t, collr.Init())
72 }
73
74 -func TestDnsmasqDHCP_Check(t *testing.T) {
75 - job := New()
76 - job.LeasesPath = testLeasesPath
77 - job.ConfPath = testConfPath
78 - job.ConfDir = testConfDir
74 +func TestCollector_Check(t *testing.T) {
75 + collr := New()
76 + collr.LeasesPath = testLeasesPath
77 + collr.ConfPath = testConfPath
78 + collr.ConfDir = testConfDir
79
80 - require.NoError(t, job.Init())
81 - assert.NoError(t, job.Check())
80 + require.NoError(t, collr.Init())
81 + assert.NoError(t, collr.Check())
82 }
83
84 -func TestDnsmasqDHCP_Charts(t *testing.T) {
85 - job := New()
86 - job.LeasesPath = testLeasesPath
87 - job.ConfPath = testConfPath
88 - job.ConfDir = testConfDir
84 +func TestCollector_Charts(t *testing.T) {
85 + collr := New()
86 + collr.LeasesPath = testLeasesPath
87 + collr.ConfPath = testConfPath
88 + collr.ConfDir = testConfDir
89
90 - require.NoError(t, job.Init())
90 + require.NoError(t, collr.Init())
91
92 - assert.NotNil(t, job.Charts())
92 + assert.NotNil(t, collr.Charts())
93 }
94
95 -func TestDnsmasqDHCP_Cleanup(t *testing.T) {
95 +func TestCollector_Cleanup(t *testing.T) {
96 assert.NotPanics(t, New().Cleanup)
97 }
98
99 -func TestDnsmasqDHCP_Collect(t *testing.T) {
100 - job := New()
101 - job.LeasesPath = testLeasesPath
102 - job.ConfPath = testConfPath
103 - job.ConfDir = testConfDir
99 +func TestCollector_Collect(t *testing.T) {
100 + collr := New()
101 + collr.LeasesPath = testLeasesPath
102 + collr.ConfPath = testConfPath
103 + collr.ConfDir = testConfDir
104
105 - require.NoError(t, job.Init())
106 - require.NoError(t, job.Check())
105 + require.NoError(t, collr.Init())
106 + require.NoError(t, collr.Check())
107
108 expected := map[string]int64{
109 "dhcp_range_1230::1-1230::64_allocated_leases": 7,
@@ -134,23 +134,23 @@ func TestDnsmasqDHCP_Collect(t *testing.T) {
134 "ipv6_dhcp_ranges": 5,
135 }
136
137 - assert.Equal(t, expected, job.Collect())
137 + assert.Equal(t, expected, collr.Collect())
138 }
139
140 -func TestDnsmasqDHCP_CollectFailedToOpenLeasesPath(t *testing.T) {
141 - job := New()
142 - job.LeasesPath = testLeasesPath
143 - job.ConfPath = testConfPath
144 - job.ConfDir = testConfDir
140 +func TestCollector_CollectFailedToOpenLeasesPath(t *testing.T) {
141 + collr := New()
142 + collr.LeasesPath = testLeasesPath
143 + collr.ConfPath = testConfPath
144 + collr.ConfDir = testConfDir
145
146 - require.NoError(t, job.Init())
147 - require.NoError(t, job.Check())
146 + require.NoError(t, collr.Init())
147 + require.NoError(t, collr.Check())
148
149 - job.LeasesPath = ""
150 - assert.Nil(t, job.Collect())
149 + collr.LeasesPath = ""
150 + assert.Nil(t, collr.Collect())
151 }
152
153 -func TestDnsmasqDHCP_parseDHCPRangeValue(t *testing.T) {
153 +func TestCollector_parseDHCPRangeValue(t *testing.T) {
154 tests := map[string]struct {
155 input string
156 wantFail bool
src/go/plugin/go.d/collector/dnsmasq_dhcp/init.go
+4 -4
@@ -6,15 +6,15 @@ package dnsmasq_dhcp
6
7 import "errors"
8
9 -func (d *DnsmasqDHCP) validateConfig() error {
10 - if d.LeasesPath == "" {
9 +func (c *Collector) validateConfig() error {
10 + if c.LeasesPath == "" {
11 return errors.New("empty 'leases_path'")
12 }
13 return nil
14 }
15
16 -func (d *DnsmasqDHCP) checkLeasesPath() error {
17 - f, err := openFile(d.LeasesPath)
16 +func (c *Collector) checkLeasesPath() error {
17 + f, err := openFile(c.LeasesPath)
18 if err != nil {
19 return err
20 }
src/go/plugin/go.d/collector/dnsmasq_dhcp/parse_configuration.go
+14 -14
@@ -17,25 +17,25 @@ import (
17 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/iprange"
18 )
19
20 -func (d *DnsmasqDHCP) parseDnsmasqDHCPConfiguration() ([]iprange.Range, []net.IP) {
21 - configs := findConfigurationFiles(d.ConfPath, d.ConfDir)
20 +func (c *Collector) parseDnsmasqDHCPConfiguration() ([]iprange.Range, []net.IP) {
21 + configs := findConfigurationFiles(c.ConfPath, c.ConfDir)
22
23 - dhcpRanges := d.getDHCPRanges(configs)
24 - dhcpHosts := d.getDHCPHosts(configs)
23 + dhcpRanges := c.getDHCPRanges(configs)
24 + dhcpHosts := c.getDHCPHosts(configs)
25
26 return dhcpRanges, dhcpHosts
27 }
28
29 -func (d *DnsmasqDHCP) getDHCPRanges(configs []*configFile) []iprange.Range {
29 +func (c *Collector) getDHCPRanges(configs []*configFile) []iprange.Range {
30 var dhcpRanges []iprange.Range
31 var parsed string
32 seen := make(map[string]bool)
33
34 for _, conf := range configs {
35 - d.Debugf("looking in '%s'", conf.path)
35 + c.Debugf("looking in '%s'", conf.path)
36
37 for _, value := range conf.get("dhcp-range") {
38 - d.Debugf("found dhcp-range '%s'", value)
38 + c.Debugf("found dhcp-range '%s'", value)
39 if parsed = parseDHCPRangeValue(value); parsed == "" || seen[parsed] {
40 continue
41 }
@@ -43,11 +43,11 @@ func (d *DnsmasqDHCP) getDHCPRanges(configs []*configFile) []iprange.Range {
43
44 r, err := iprange.ParseRange(parsed)
45 if r == nil || err != nil {
46 - d.Warningf("error on parsing dhcp-range '%s', skipping it", parsed)
46 + c.Warningf("error on parsing dhcp-range '%s', skipping it", parsed)
47 continue
48 }
49
50 - d.Debugf("adding dhcp-range '%s'", parsed)
50 + c.Debugf("adding dhcp-range '%s'", parsed)
51 dhcpRanges = append(dhcpRanges, r)
52 }
53 }
@@ -58,16 +58,16 @@ func (d *DnsmasqDHCP) getDHCPRanges(configs []*configFile) []iprange.Range {
58 return dhcpRanges
59 }
60
61 -func (d *DnsmasqDHCP) getDHCPHosts(configs []*configFile) []net.IP {
61 +func (c *Collector) getDHCPHosts(configs []*configFile) []net.IP {
62 var dhcpHosts []net.IP
63 seen := make(map[string]bool)
64 var parsed string
65
66 for _, conf := range configs {
67 - d.Debugf("looking in '%s'", conf.path)
67 + c.Debugf("looking in '%s'", conf.path)
68
69 for _, value := range conf.get("dhcp-host") {
70 - d.Debugf("found dhcp-host '%s'", value)
70 + c.Debugf("found dhcp-host '%s'", value)
71 if parsed = parseDHCPHostValue(value); parsed == "" || seen[parsed] {
72 continue
73 }
@@ -75,11 +75,11 @@ func (d *DnsmasqDHCP) getDHCPHosts(configs []*configFile) []net.IP {
75
76 v := net.ParseIP(parsed)
77 if v == nil {
78 - d.Warningf("error on parsing dhcp-host '%s', skipping it", parsed)
78 + c.Warningf("error on parsing dhcp-host '%s', skipping it", parsed)
79 continue
80 }
81
82 - d.Debugf("adding dhcp-host '%s'", parsed)
82 + c.Debugf("adding dhcp-host '%s'", parsed)
83 dhcpHosts = append(dhcpHosts, v)
84 }
85 }
src/go/plugin/go.d/collector/dnsquery/collect.go
+11 -11
@@ -12,28 +12,28 @@ import (
12 "github.com/miekg/dns"
13 )
14
15 -func (d *DNSQuery) collect() (map[string]int64, error) {
16 - if d.dnsClient == nil {
17 - d.dnsClient = d.newDNSClient(d.Network, d.Timeout.Duration())
15 +func (c *Collector) collect() (map[string]int64, error) {
16 + if c.dnsClient == nil {
17 + c.dnsClient = c.newDNSClient(c.Network, c.Timeout.Duration())
18 }
19
20 mx := make(map[string]int64)
21 - domain := randomDomain(d.Domains)
22 - d.Debugf("current domain : %s", domain)
21 + domain := randomDomain(c.Domains)
22 + c.Debugf("current domain : %s", domain)
23
24 var wg sync.WaitGroup
25 var mux sync.RWMutex
26 - for _, srv := range d.Servers {
27 - for rtypeName, rtype := range d.recordTypes {
26 + for _, srv := range c.Servers {
27 + for rtypeName, rtype := range c.recordTypes {
28 wg.Add(1)
29 go func(srv, rtypeName string, rtype uint16, wg *sync.WaitGroup) {
30 defer wg.Done()
31
32 msg := new(dns.Msg)
33 msg.SetQuestion(dns.Fqdn(domain), rtype)
34 - address := net.JoinHostPort(srv, strconv.Itoa(d.Port))
34 + address := net.JoinHostPort(srv, strconv.Itoa(c.Port))
35
36 - resp, rtt, err := d.dnsClient.Exchange(msg, address)
36 + resp, rtt, err := c.dnsClient.Exchange(msg, address)
37
38 mux.Lock()
39 defer mux.Unlock()
@@ -45,13 +45,13 @@ func (d *DNSQuery) collect() (map[string]int64, error) {
45 mx[px+"query_status_dns_error"] = 0
46
47 if err != nil {
48 - d.Debugf("error on querying %s after %s query for %s : %s", srv, rtypeName, domain, err)
48 + c.Debugf("error on querying %s after %s query for %s : %s", srv, rtypeName, domain, err)
49 mx[px+"query_status_network_error"] = 1
50 return
51 }
52
53 if resp != nil && resp.Rcode != dns.RcodeSuccess {
54 - d.Debugf("invalid answer from %s after %s query for %s (rcode %d)", srv, rtypeName, domain, resp.Rcode)
54 + c.Debugf("invalid answer from %s after %s query for %s (rcode %d)", srv, rtypeName, domain, resp.Rcode)
55 mx[px+"query_status_dns_error"] = 1
56 } else {
57 mx[px+"query_status_success"] = 1
src/go/plugin/go.d/collector/dnsquery/collector.go renamed
+18 -18
@@ -27,8 +27,8 @@ func init() {
27 })
28 }
29
30 -func New() *DNSQuery {
31 - return &DNSQuery{
30 +func New() *Collector {
31 + return &Collector{
32 Config: Config{
33 Timeout: confopt.Duration(time.Second * 2),
34 Network: "udp",
@@ -56,7 +56,7 @@ type Config struct {
56 }
57
58 type (
59 - DNSQuery struct {
59 + Collector struct {
60 module.Base
61 Config `yaml:",inline" json:""`
62
@@ -72,42 +72,42 @@ type (
72 }
73 )
74
75 -func (d *DNSQuery) Configuration() any {
76 - return d.Config
75 +func (c *Collector) Configuration() any {
76 + return c.Config
77 }
78
79 -func (d *DNSQuery) Init() error {
80 - if err := d.verifyConfig(); err != nil {
79 +func (c *Collector) Init() error {
80 + if err := c.verifyConfig(); err != nil {
81 return fmt.Errorf("config validation: %v", err)
82 }
83
84 - rt, err := d.initRecordTypes()
84 + rt, err := c.initRecordTypes()
85 if err != nil {
86 return fmt.Errorf("init record type: %v", err)
87 }
88 - d.recordTypes = rt
88 + c.recordTypes = rt
89
90 - charts, err := d.initCharts()
90 + charts, err := c.initCharts()
91 if err != nil {
92 return fmt.Errorf("init charts: %v", err)
93 }
94 - d.charts = charts
94 + c.charts = charts
95
96 return nil
97 }
98
99 -func (d *DNSQuery) Check() error {
99 +func (c *Collector) Check() error {
100 return nil
101 }
102
103 -func (d *DNSQuery) Charts() *module.Charts {
104 - return d.charts
103 +func (c *Collector) Charts() *module.Charts {
104 + return c.charts
105 }
106
107 -func (d *DNSQuery) Collect() map[string]int64 {
108 - mx, err := d.collect()
107 +func (c *Collector) Collect() map[string]int64 {
108 + mx, err := c.collect()
109 if err != nil {
110 - d.Error(err)
110 + c.Error(err)
111 }
112
113 if len(mx) == 0 {
@@ -116,4 +116,4 @@ func (d *DNSQuery) Collect() map[string]int64 {
116 return mx
117 }
118
119 -func (d *DNSQuery) Cleanup() {}
119 +func (c *Collector) Cleanup() {}
src/go/plugin/go.d/collector/dnsquery/collector_test.go renamed
+37 -37
@@ -30,11 +30,11 @@ func Test_testDataIsValid(t *testing.T) {
30 }
31 }
32
33 -func TestDNSQuery_ConfigurationSerialize(t *testing.T) {
34 - module.TestConfigurationSerialize(t, &DNSQuery{}, dataConfigJSON, dataConfigYAML)
33 +func TestCollector_ConfigurationSerialize(t *testing.T) {
34 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
35 }
36
37 -func TestDNSQuery_Init(t *testing.T) {
37 +func TestCollector_Init(t *testing.T) {
38 tests := map[string]struct {
39 wantFail bool
40 config Config
@@ -113,22 +113,22 @@ func TestDNSQuery_Init(t *testing.T) {
113
114 for name, test := range tests {
115 t.Run(name, func(t *testing.T) {
116 - dq := New()
117 - dq.Config = test.config
116 + collr := New()
117 + collr.Config = test.config
118
119 if test.wantFail {
120 - assert.Error(t, dq.Init())
120 + assert.Error(t, collr.Init())
121 } else {
122 - assert.NoError(t, dq.Init())
122 + assert.NoError(t, collr.Init())
123 }
124 })
125 }
126 }
127
128 -func TestDNSQuery_Check(t *testing.T) {
128 +func TestCollector_Check(t *testing.T) {
129 tests := map[string]struct {
130 wantFail bool
131 - prepare func() *DNSQuery
131 + prepare func() *Collector
132 }{
133 "success when DNS query successful": {
134 wantFail: false,
@@ -142,33 +142,33 @@ func TestDNSQuery_Check(t *testing.T) {
142
143 for name, test := range tests {
144 t.Run(name, func(t *testing.T) {
145 - dq := test.prepare()
145 + collr := test.prepare()
146
147 - require.NoError(t, dq.Init())
147 + require.NoError(t, collr.Init())
148
149 if test.wantFail {
150 - assert.Error(t, dq.Check())
150 + assert.Error(t, collr.Check())
151 } else {
152 - assert.NoError(t, dq.Check())
152 + assert.NoError(t, collr.Check())
153 }
154 })
155 }
156 }
157
158 -func TestDNSQuery_Charts(t *testing.T) {
159 - dq := New()
158 +func TestCollector_Charts(t *testing.T) {
159 + collr := New()
160
161 - dq.Domains = []string{"google.com"}
162 - dq.Servers = []string{"192.0.2.0", "192.0.2.1"}
163 - require.NoError(t, dq.Init())
161 + collr.Domains = []string{"google.com"}
162 + collr.Servers = []string{"192.0.2.0", "192.0.2.1"}
163 + require.NoError(t, collr.Init())
164
165 - assert.NotNil(t, dq.Charts())
166 - assert.Len(t, *dq.Charts(), len(dnsChartsTmpl)*len(dq.Servers))
165 + assert.NotNil(t, collr.Charts())
166 + assert.Len(t, *collr.Charts(), len(dnsChartsTmpl)*len(collr.Servers))
167 }
168
169 -func TestDNSQuery_Collect(t *testing.T) {
169 +func TestCollector_Collect(t *testing.T) {
170 tests := map[string]struct {
171 - prepare func() *DNSQuery
171 + prepare func() *Collector
172 wantMetrics map[string]int64
173 }{
174 "success when DNS query successful": {
@@ -199,35 +199,35 @@ func TestDNSQuery_Collect(t *testing.T) {
199
200 for name, test := range tests {
201 t.Run(name, func(t *testing.T) {
202 - dq := test.prepare()
202 + collr := test.prepare()
203
204 - require.NoError(t, dq.Init())
204 + require.NoError(t, collr.Init())
205
206 - mx := dq.Collect()
206 + mx := collr.Collect()
207
208 require.Equal(t, test.wantMetrics, mx)
209 })
210 }
211 }
212
213 -func caseDNSClientOK() *DNSQuery {
214 - dq := New()
215 - dq.Domains = []string{"example.com"}
216 - dq.Servers = []string{"192.0.2.0", "192.0.2.1"}
217 - dq.newDNSClient = func(_ string, _ time.Duration) dnsClient {
213 +func caseDNSClientOK() *Collector {
214 + collr := New()
215 + collr.Domains = []string{"example.com"}
216 + collr.Servers = []string{"192.0.2.0", "192.0.2.1"}
217 + collr.newDNSClient = func(_ string, _ time.Duration) dnsClient {
218 return mockDNSClient{errOnExchange: false}
219 }
220 - return dq
220 + return collr
221 }
222
223 -func caseDNSClientErr() *DNSQuery {
224 - dq := New()
225 - dq.Domains = []string{"example.com"}
226 - dq.Servers = []string{"192.0.2.0", "192.0.2.1"}
227 - dq.newDNSClient = func(_ string, _ time.Duration) dnsClient {
223 +func caseDNSClientErr() *Collector {
224 + collr := New()
225 + collr.Domains = []string{"example.com"}
226 + collr.Servers = []string{"192.0.2.0", "192.0.2.1"}
227 + collr.newDNSClient = func(_ string, _ time.Duration) dnsClient {
228 return mockDNSClient{errOnExchange: true}
229 }
230 - return dq
230 + return collr
231 }
232
233 type mockDNSClient struct {
src/go/plugin/go.d/collector/dnsquery/init.go
+15 -15
@@ -11,34 +11,34 @@ import (
11 "github.com/miekg/dns"
12 )
13
14 -func (d *DNSQuery) verifyConfig() error {
15 - if len(d.Domains) == 0 {
14 +func (c *Collector) verifyConfig() error {
15 + if len(c.Domains) == 0 {
16 return errors.New("no domains specified")
17 }
18
19 - if len(d.Servers) == 0 {
19 + if len(c.Servers) == 0 {
20 return errors.New("no servers specified")
21 }
22
23 - if !(d.Network == "" || d.Network == "udp" || d.Network == "tcp" || d.Network == "tcp-tls") {
24 - return fmt.Errorf("wrong network transport : %s", d.Network)
23 + if !(c.Network == "" || c.Network == "udp" || c.Network == "tcp" || c.Network == "tcp-tls") {
24 + return fmt.Errorf("wrong network transport : %s", c.Network)
25 }
26
27 - if d.RecordType != "" {
28 - d.Warning("'record_type' config option is deprecated, use 'record_types' instead")
29 - d.RecordTypes = append(d.RecordTypes, d.RecordType)
27 + if c.RecordType != "" {
28 + c.Warning("'record_type' config option is deprecated, use 'record_types' instead")
29 + c.RecordTypes = append(c.RecordTypes, c.RecordType)
30 }
31
32 - if len(d.RecordTypes) == 0 {
32 + if len(c.RecordTypes) == 0 {
33 return errors.New("no record types specified")
34 }
35
36 return nil
37 }
38
39 -func (d *DNSQuery) initRecordTypes() (map[string]uint16, error) {
39 +func (c *Collector) initRecordTypes() (map[string]uint16, error) {
40 types := make(map[string]uint16)
41 - for _, v := range d.RecordTypes {
41 + for _, v := range c.RecordTypes {
42 rtype, err := parseRecordType(v)
43 if err != nil {
44 return nil, err
@@ -50,12 +50,12 @@ func (d *DNSQuery) initRecordTypes() (map[string]uint16, error) {
50 return types, nil
51 }
52
53 -func (d *DNSQuery) initCharts() (*module.Charts, error) {
53 +func (c *Collector) initCharts() (*module.Charts, error) {
54 charts := module.Charts{}
55
56 - for _, srv := range d.Servers {
57 - for _, rtype := range d.RecordTypes {
58 - cs := newDNSServerCharts(srv, d.Network, rtype)
56 + for _, srv := range c.Servers {
57 + for _, rtype := range c.RecordTypes {
58 + cs := newDNSServerCharts(srv, c.Network, rtype)
59 if err := charts.Add(*cs...); err != nil {
60 return nil, err
61 }
src/go/plugin/go.d/collector/docker/charts.go
+7 -6
@@ -140,9 +140,10 @@ var (
140 }
141 )
142
143 -func (d *Docker) addContainerCharts(name, image string) {
143 +func (c *Collector) addContainerCharts(name, image string) {
144 charts := containerChartsTmpl.Copy()
145 - if !d.CollectContainerSize {
145 +
146 + if !c.CollectContainerSize {
147 _ = charts.Remove(containerWritableLayerSizeChartTmpl.ID)
148 }
149
@@ -157,15 +158,15 @@ func (d *Docker) addContainerCharts(name, image string) {
158 }
159 }
160
160 - if err := d.Charts().Add(*charts...); err != nil {
161 - d.Warning(err)
161 + if err := c.Charts().Add(*charts...); err != nil {
162 + c.Warning(err)
163 }
164 }
165
165 -func (d *Docker) removeContainerCharts(name string) {
166 +func (c *Collector) removeContainerCharts(name string) {
167 px := fmt.Sprintf("container_%s", name)
168
168 - for _, chart := range *d.Charts() {
169 + for _, chart := range *c.Charts() {
170 if strings.HasPrefix(chart.ID, px) {
171 chart.MarkRemove()
172 chart.MarkNotCreated()
src/go/plugin/go.d/collector/docker/collect.go
+30 -30
@@ -13,42 +13,42 @@ import (
13 typesImage "github.com/docker/docker/api/types/image"
14 )
15
16 -func (d *Docker) collect() (map[string]int64, error) {
17 - if d.client == nil {
18 - client, err := d.newClient(d.Config)
16 +func (c *Collector) collect() (map[string]int64, error) {
17 + if c.client == nil {
18 + client, err := c.newClient(c.Config)
19 if err != nil {
20 return nil, err
21 }
22 - d.client = client
22 + c.client = client
23 }
24
25 - if !d.verNegotiated {
26 - d.verNegotiated = true
27 - d.negotiateAPIVersion()
25 + if !c.verNegotiated {
26 + c.verNegotiated = true
27 + c.negotiateAPIVersion()
28 }
29
30 - defer func() { _ = d.client.Close() }()
30 + defer func() { _ = c.client.Close() }()
31
32 mx := make(map[string]int64)
33
34 - if err := d.collectInfo(mx); err != nil {
34 + if err := c.collectInfo(mx); err != nil {
35 return nil, err
36 }
37 - if err := d.collectImages(mx); err != nil {
37 + if err := c.collectImages(mx); err != nil {
38 return nil, err
39 }
40 - if err := d.collectContainers(mx); err != nil {
40 + if err := c.collectContainers(mx); err != nil {
41 return nil, err
42 }
43
44 return mx, nil
45 }
46
47 -func (d *Docker) collectInfo(mx map[string]int64) error {
48 - ctx, cancel := context.WithTimeout(context.Background(), d.Timeout.Duration())
47 +func (c *Collector) collectInfo(mx map[string]int64) error {
48 + ctx, cancel := context.WithTimeout(context.Background(), c.Timeout.Duration())
49 defer cancel()
50
51 - info, err := d.client.Info(ctx)
51 + info, err := c.client.Info(ctx)
52 if err != nil {
53 return err
54 }
@@ -60,11 +60,11 @@ func (d *Docker) collectInfo(mx map[string]int64) error {
60 return nil
61 }
62
63 -func (d *Docker) collectImages(mx map[string]int64) error {
64 - ctx, cancel := context.WithTimeout(context.Background(), d.Timeout.Duration())
63 +func (c *Collector) collectImages(mx map[string]int64) error {
64 + ctx, cancel := context.WithTimeout(context.Background(), c.Timeout.Duration())
65 defer cancel()
66
67 - images, err := d.client.ImageList(ctx, typesImage.ListOptions{})
67 + images, err := c.client.ImageList(ctx, typesImage.ListOptions{})
68 if err != nil {
69 return err
70 }
@@ -103,18 +103,18 @@ var (
103 }
104 )
105
106 -func (d *Docker) collectContainers(mx map[string]int64) error {
106 +func (c *Collector) collectContainers(mx map[string]int64) error {
107 containerSet := make(map[string][]types.Container)
108
109 for _, status := range containerHealthStatuses {
110 if err := func() error {
111 - ctx, cancel := context.WithTimeout(context.Background(), d.Timeout.Duration())
111 + ctx, cancel := context.WithTimeout(context.Background(), c.Timeout.Duration())
112 defer cancel()
113
114 - v, err := d.client.ContainerList(ctx, typesContainer.ListOptions{
114 + v, err := c.client.ContainerList(ctx, typesContainer.ListOptions{
115 All: true,
116 Filters: filters.NewArgs(filters.KeyValuePair{Key: "health", Value: status}),
117 - Size: d.CollectContainerSize,
117 + Size: c.CollectContainerSize,
118 })
119 if err != nil {
120 return err
@@ -156,9 +156,9 @@ func (d *Docker) collectContainers(mx map[string]int64) error {
156
157 seen[name] = true
158
159 - if !d.containers[name] {
160 - d.containers[name] = true
161 - d.addContainerCharts(name, cntr.Image)
159 + if !c.containers[name] {
160 + c.containers[name] = true
161 + c.addContainerCharts(name, cntr.Image)
162 }
163
164 px := fmt.Sprintf("container_%s_", name)
@@ -182,19 +182,19 @@ func (d *Docker) collectContainers(mx map[string]int64) error {
182 }
183 }
184
185 - for name := range d.containers {
185 + for name := range c.containers {
186 if !seen[name] {
187 - delete(d.containers, name)
188 - d.removeContainerCharts(name)
187 + delete(c.containers, name)
188 + c.removeContainerCharts(name)
189 }
190 }
191
192 return nil
193 }
194
195 -func (d *Docker) negotiateAPIVersion() {
196 - ctx, cancel := context.WithTimeout(context.Background(), d.Timeout.Duration())
195 +func (c *Collector) negotiateAPIVersion() {
196 + ctx, cancel := context.WithTimeout(context.Background(), c.Timeout.Duration())
197 defer cancel()
198
199 - d.client.NegotiateAPIVersion(ctx)
199 + c.client.NegotiateAPIVersion(ctx)
200 }
src/go/plugin/go.d/collector/docker/collector.go renamed
+21 -21
@@ -30,8 +30,8 @@ func init() {
30 })
31 }
32
33 -func New() *Docker {
34 - return &Docker{
33 +func New() *Collector {
34 + return &Collector{
35 Config: Config{
36 Address: docker.DefaultDockerHost,
37 Timeout: confopt.Duration(time.Second * 2),
@@ -54,7 +54,7 @@ type Config struct {
54 }
55
56 type (
57 - Docker struct {
57 + Collector struct {
58 module.Base
59 Config `yaml:",inline" json:""`
60
@@ -75,20 +75,20 @@ type (
75 }
76 )
77
78 -func (d *Docker) Configuration() any {
79 - return d.Config
78 +func (c *Collector) Configuration() any {
79 + return c.Config
80 }
81
82 -func (d *Docker) Init() error {
83 - if addr := dockerhost.FromEnv(); addr != "" && d.Address == docker.DefaultDockerHost {
84 - d.Infof("using docker host from environment: %s ", addr)
85 - d.Address = addr
82 +func (c *Collector) Init() error {
83 + if addr := dockerhost.FromEnv(); addr != "" && c.Address == docker.DefaultDockerHost {
84 + c.Infof("using docker host from environment: %s ", addr)
85 + c.Address = addr
86 }
87 return nil
88 }
89
90 -func (d *Docker) Check() error {
91 - mx, err := d.collect()
90 +func (c *Collector) Check() error {
91 + mx, err := c.collect()
92 if err != nil {
93 return err
94 }
@@ -99,14 +99,14 @@ func (d *Docker) Check() error {
99 return nil
100 }
101
102 -func (d *Docker) Charts() *module.Charts {
103 - return d.charts
102 +func (c *Collector) Charts() *module.Charts {
103 + return c.charts
104 }
105
106 -func (d *Docker) Collect() map[string]int64 {
107 - mx, err := d.collect()
106 +func (c *Collector) Collect() map[string]int64 {
107 + mx, err := c.collect()
108 if err != nil {
109 - d.Error(err)
109 + c.Error(err)
110 }
111
112 if len(mx) == 0 {
@@ -115,12 +115,12 @@ func (d *Docker) Collect() map[string]int64 {
115 return mx
116 }
117
118 -func (d *Docker) Cleanup() {
119 - if d.client == nil {
118 +func (c *Collector) Cleanup() {
119 + if c.client == nil {
120 return
121 }
122 - if err := d.client.Close(); err != nil {
123 - d.Warningf("error on closing docker client: %v", err)
122 + if err := c.client.Close(); err != nil {
123 + c.Warningf("error on closing docker client: %v", err)
124 }
125 - d.client = nil
125 + c.client = nil
126 }
src/go/plugin/go.d/collector/docker/collector_test.go renamed
+69 -81
@@ -32,11 +32,11 @@ func Test_testDataIsValid(t *testing.T) {
32 }
33 }
34
35 -func TestDocker_ConfigurationSerialize(t *testing.T) {
36 - module.TestConfigurationSerialize(t, &Docker{}, dataConfigJSON, dataConfigYAML)
35 +func TestCollector_ConfigurationSerialize(t *testing.T) {
36 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
37 }
38
39 -func TestDocker_Init(t *testing.T) {
39 +func TestCollector_Init(t *testing.T) {
40 tests := map[string]struct {
41 config Config
42 wantFail bool
@@ -55,54 +55,54 @@ func TestDocker_Init(t *testing.T) {
55
56 for name, test := range tests {
57 t.Run(name, func(t *testing.T) {
58 - d := New()
59 - d.Config = test.config
58 + collr := New()
59 + collr.Config = test.config
60
61 if test.wantFail {
62 - assert.Error(t, d.Init())
62 + assert.Error(t, collr.Init())
63 } else {
64 - assert.NoError(t, d.Init())
64 + assert.NoError(t, collr.Init())
65 }
66 })
67 }
68 }
69
70 -func TestDocker_Charts(t *testing.T) {
70 +func TestCollector_Charts(t *testing.T) {
71 assert.Equal(t, len(summaryCharts), len(*New().Charts()))
72 }
73
74 -func TestDocker_Cleanup(t *testing.T) {
74 +func TestCollector_Cleanup(t *testing.T) {
75 tests := map[string]struct {
76 - prepare func(d *Docker)
76 + prepare func(*Collector)
77 wantClose bool
78 }{
79 "after New": {
80 wantClose: false,
81 - prepare: func(d *Docker) {},
81 + prepare: func(*Collector) {},
82 },
83 "after Init": {
84 wantClose: false,
85 - prepare: func(d *Docker) { _ = d.Init() },
85 + prepare: func(c *Collector) { _ = c.Init() },
86 },
87 "after Check": {
88 wantClose: true,
89 - prepare: func(d *Docker) { _ = d.Init(); _ = d.Check() },
89 + prepare: func(c *Collector) { _ = c.Init(); _ = c.Check() },
90 },
91 "after Collect": {
92 wantClose: true,
93 - prepare: func(d *Docker) { _ = d.Init(); d.Collect() },
93 + prepare: func(c *Collector) { _ = c.Init(); c.Collect() },
94 },
95 }
96
97 for name, test := range tests {
98 t.Run(name, func(t *testing.T) {
99 m := &mockClient{}
100 - d := New()
101 - d.newClient = prepareNewClientFunc(m)
100 + collr := New()
101 + collr.newClient = prepareNewClientFunc(m)
102
103 - test.prepare(d)
103 + test.prepare(collr)
104
105 - require.NotPanics(t, d.Cleanup)
105 + require.NotPanics(t, collr.Cleanup)
106
107 if test.wantClose {
108 assert.True(t, m.closeCalled)
@@ -113,44 +113,44 @@ func TestDocker_Cleanup(t *testing.T) {
113 }
114 }
115
116 -func TestDocker_Check(t *testing.T) {
116 +func TestCollector_Check(t *testing.T) {
117 tests := map[string]struct {
118 - prepare func() *Docker
118 + prepare func() *Collector
119 wantFail bool
120 }{
121 "case success": {
122 wantFail: false,
123 - prepare: func() *Docker {
123 + prepare: func() *Collector {
124 return prepareCaseSuccess()
125 },
126 },
127 "case success without container size": {
128 wantFail: false,
129 - prepare: func() *Docker {
129 + prepare: func() *Collector {
130 return prepareCaseSuccessWithoutContainerSize()
131 },
132 },
133 "fail on case err on Info()": {
134 wantFail: true,
135 - prepare: func() *Docker {
135 + prepare: func() *Collector {
136 return prepareCaseErrOnInfo()
137 },
138 },
139 "fail on case err on ImageList()": {
140 wantFail: true,
141 - prepare: func() *Docker {
141 + prepare: func() *Collector {
142 return prepareCaseErrOnImageList()
143 },
144 },
145 "fail on case err on ContainerList()": {
146 wantFail: true,
147 - prepare: func() *Docker {
147 + prepare: func() *Collector {
148 return prepareCaseErrOnContainerList()
149 },
150 },
151 "fail on case err on creating Docker client": {
152 wantFail: true,
153 - prepare: func() *Docker {
153 + prepare: func() *Collector {
154 return prepareCaseErrCreatingClient()
155 },
156 },
@@ -158,28 +158,26 @@ func TestDocker_Check(t *testing.T) {
158
159 for name, test := range tests {
160 t.Run(name, func(t *testing.T) {
161 - d := test.prepare()
161 + collr := test.prepare()
162
163 - require.NoError(t, d.Init())
163 + require.NoError(t, collr.Init())
164
165 if test.wantFail {
166 - assert.Error(t, d.Check())
166 + assert.Error(t, collr.Check())
167 } else {
168 - assert.NoError(t, d.Check())
168 + assert.NoError(t, collr.Check())
169 }
170 })
171 }
172 }
173
174 -func TestDocker_Collect(t *testing.T) {
174 +func TestCollector_Collect(t *testing.T) {
175 tests := map[string]struct {
176 - prepare func() *Docker
176 + prepare func() *Collector
177 expected map[string]int64
178 }{
179 "case success": {
180 - prepare: func() *Docker {
181 - return prepareCaseSuccess()
182 - },
180 + prepare: prepareCaseSuccess,
181 expected: map[string]int64{
182 "container_container10_health_status_healthy": 0,
183 "container_container10_health_status_none": 0,
@@ -419,9 +417,7 @@ func TestDocker_Collect(t *testing.T) {
417 },
418 },
419 "case success without container size": {
422 - prepare: func() *Docker {
423 - return prepareCaseSuccessWithoutContainerSize()
424 - },
420 + prepare: prepareCaseSuccessWithoutContainerSize,
421 expected: map[string]int64{
422 "container_container10_health_status_healthy": 0,
423 "container_container10_health_status_none": 0,
@@ -661,43 +657,35 @@ func TestDocker_Collect(t *testing.T) {
657 },
658 },
659 "fail on case err on Info()": {
664 - prepare: func() *Docker {
665 - return prepareCaseErrOnInfo()
666 - },
660 + prepare: prepareCaseErrOnInfo,
661 expected: nil,
662 },
663 "fail on case err on ImageList()": {
670 - prepare: func() *Docker {
671 - return prepareCaseErrOnImageList()
672 - },
664 + prepare: prepareCaseErrOnImageList,
665 expected: nil,
666 },
667 "fail on case err on ContainerList()": {
676 - prepare: func() *Docker {
677 - return prepareCaseErrOnContainerList()
678 - },
668 + prepare: prepareCaseErrOnContainerList,
669 expected: nil,
670 },
671 "fail on case err on creating Docker client": {
682 - prepare: func() *Docker {
683 - return prepareCaseErrCreatingClient()
684 - },
672 + prepare: prepareCaseErrCreatingClient,
673 expected: nil,
674 },
675 }
676
677 for name, test := range tests {
678 t.Run(name, func(t *testing.T) {
691 - d := test.prepare()
679 + collr := test.prepare()
680
693 - require.NoError(t, d.Init())
681 + require.NoError(t, collr.Init())
682
695 - mx := d.Collect()
683 + mx := collr.Collect()
684
685 require.Equal(t, test.expected, mx)
686
699 - if d.client != nil {
700 - m, ok := d.client.(*mockClient)
687 + if collr.client != nil {
688 + m, ok := collr.client.(*mockClient)
689 require.True(t, ok)
690 require.True(t, m.negotiateAPIVersionCalled)
691 }
@@ -706,42 +694,42 @@ func TestDocker_Collect(t *testing.T) {
694 }
695 }
696
709 -func prepareCaseSuccess() *Docker {
710 - d := New()
711 - d.CollectContainerSize = true
712 - d.newClient = prepareNewClientFunc(&mockClient{})
713 - return d
697 +func prepareCaseSuccess() *Collector {
698 + collr := New()
699 + collr.CollectContainerSize = true
700 + collr.newClient = prepareNewClientFunc(&mockClient{})
701 + return collr
702 }
703
716 -func prepareCaseSuccessWithoutContainerSize() *Docker {
717 - d := New()
718 - d.CollectContainerSize = false
719 - d.newClient = prepareNewClientFunc(&mockClient{})
720 - return d
704 +func prepareCaseSuccessWithoutContainerSize() *Collector {
705 + collr := New()
706 + collr.CollectContainerSize = false
707 + collr.newClient = prepareNewClientFunc(&mockClient{})
708 + return collr
709 }
710
723 -func prepareCaseErrOnInfo() *Docker {
724 - d := New()
725 - d.newClient = prepareNewClientFunc(&mockClient{errOnInfo: true})
726 - return d
711 +func prepareCaseErrOnInfo() *Collector {
712 + collr := New()
713 + collr.newClient = prepareNewClientFunc(&mockClient{errOnInfo: true})
714 + return collr
715 }
716
729 -func prepareCaseErrOnImageList() *Docker {
730 - d := New()
731 - d.newClient = prepareNewClientFunc(&mockClient{errOnImageList: true})
732 - return d
717 +func prepareCaseErrOnImageList() *Collector {
718 + collr := New()
719 + collr.newClient = prepareNewClientFunc(&mockClient{errOnImageList: true})
720 + return collr
721 }
722
735 -func prepareCaseErrOnContainerList() *Docker {
736 - d := New()
737 - d.newClient = prepareNewClientFunc(&mockClient{errOnContainerList: true})
738 - return d
723 +func prepareCaseErrOnContainerList() *Collector {
724 + collr := New()
725 + collr.newClient = prepareNewClientFunc(&mockClient{errOnContainerList: true})
726 + return collr
727 }
728
741 -func prepareCaseErrCreatingClient() *Docker {
742 - d := New()
743 - d.newClient = prepareNewClientFunc(nil)
744 - return d
729 +func prepareCaseErrCreatingClient() *Collector {
730 + collr := New()
731 + collr.newClient = prepareNewClientFunc(nil)
732 + return collr
733 }
734
735 func prepareNewClientFunc(m *mockClient) func(_ Config) (dockerClient, error) {
src/go/plugin/go.d/collector/docker_engine/collect.go
+7 -7
@@ -13,32 +13,32 @@ func isDockerEngineMetrics(pms prometheus.Series) bool {
13 return pms.FindByName("engine_daemon_engine_info").Len() > 0
14 }
15
16 -func (de *DockerEngine) collect() (map[string]int64, error) {
17 - pms, err := de.prom.ScrapeSeries()
16 +func (c *Collector) collect() (map[string]int64, error) {
17 + pms, err := c.prom.ScrapeSeries()
18 if err != nil {
19 return nil, err
20 }
21
22 if !isDockerEngineMetrics(pms) {
23 - return nil, fmt.Errorf("'%s' returned non docker engine metrics", de.URL)
23 + return nil, fmt.Errorf("'%s' returned non docker engine metrics", c.URL)
24 }
25
26 - mx := de.collectMetrics(pms)
26 + mx := c.collectMetrics(pms)
27 return stm.ToMap(mx), nil
28 }
29
30 -func (de *DockerEngine) collectMetrics(pms prometheus.Series) metrics {
30 +func (c *Collector) collectMetrics(pms prometheus.Series) metrics {
31 var mx metrics
32 collectHealthChecks(&mx, pms)
33 collectContainerActions(&mx, pms)
34 collectBuilderBuildsFails(&mx, pms)
35 if hasContainerStates(pms) {
36 - de.hasContainerStates = true
36 + c.hasContainerStates = true
37 mx.Container.States = &containerStates{}
38 collectContainerStates(&mx, pms)
39 }
40 if isSwarmManager(pms) {
41 - de.isSwarmManager = true
41 + c.isSwarmManager = true
42 mx.SwarmManager = &swarmManager{}
43 collectSwarmManager(&mx, pms)
44 }
src/go/plugin/go.d/collector/docker_engine/collector.go renamed
+22 -22
@@ -25,8 +25,8 @@ func init() {
25 })
26 }
27
28 -func New() *DockerEngine {
29 - return &DockerEngine{
28 +func New() *Collector {
29 + return &Collector{
30 Config: Config{
31 HTTPConfig: web.HTTPConfig{
32 RequestConfig: web.RequestConfig{
@@ -45,7 +45,7 @@ type Config struct {
45 web.HTTPConfig `yaml:",inline" json:""`
46 }
47
48 -type DockerEngine struct {
48 +type Collector struct {
49 module.Base
50 Config `yaml:",inline" json:""`
51
@@ -55,26 +55,26 @@ type DockerEngine struct {
55 hasContainerStates bool
56 }
57
58 -func (de *DockerEngine) Configuration() any {
59 - return de.Config
58 +func (c *Collector) Configuration() any {
59 + return c.Config
60 }
61
62 -func (de *DockerEngine) Init() error {
63 - if err := de.validateConfig(); err != nil {
62 +func (c *Collector) Init() error {
63 + if err := c.validateConfig(); err != nil {
64 return fmt.Errorf("config validation: %v", err)
65 }
66
67 - prom, err := de.initPrometheusClient()
67 + prom, err := c.initPrometheusClient()
68 if err != nil {
69 return fmt.Errorf("init prometheus client: %v", err)
70 }
71 - de.prom = prom
71 + c.prom = prom
72
73 return nil
74 }
75
76 -func (de *DockerEngine) Check() error {
77 - mx, err := de.collect()
76 +func (c *Collector) Check() error {
77 + mx, err := c.collect()
78 if err != nil {
79 return err
80 }
@@ -85,29 +85,29 @@ func (de *DockerEngine) Check() error {
85 return nil
86 }
87
88 -func (de *DockerEngine) Charts() *Charts {
88 +func (c *Collector) Charts() *Charts {
89 cs := charts.Copy()
90 - if !de.hasContainerStates {
90 + if !c.hasContainerStates {
91 if err := cs.Remove("engine_daemon_container_states_containers"); err != nil {
92 - de.Warning(err)
92 + c.Warning(err)
93 }
94 }
95
96 - if !de.isSwarmManager {
96 + if !c.isSwarmManager {
97 return cs
98 }
99
100 if err := cs.Add(*swarmManagerCharts.Copy()...); err != nil {
101 - de.Warning(err)
101 + c.Warning(err)
102 }
103
104 return cs
105 }
106
107 -func (de *DockerEngine) Collect() map[string]int64 {
108 - mx, err := de.collect()
107 +func (c *Collector) Collect() map[string]int64 {
108 + mx, err := c.collect()
109 if err != nil {
110 - de.Error(err)
110 + c.Error(err)
111 return nil
112 }
113
@@ -117,8 +117,8 @@ func (de *DockerEngine) Collect() map[string]int64 {
117 return mx
118 }
119
120 -func (de *DockerEngine) Cleanup() {
121 - if de.prom != nil && de.prom.HTTPClient() != nil {
122 - de.prom.HTTPClient().CloseIdleConnections()
120 +func (c *Collector) Cleanup() {
121 + if c.prom != nil && c.prom.HTTPClient() != nil {
122 + c.prom.HTTPClient().CloseIdleConnections()
123 }
124 }
src/go/plugin/go.d/collector/docker_engine/collector_test.go renamed
+59 -59
@@ -39,15 +39,15 @@ func Test_testDataIsValid(t *testing.T) {
39 }
40 }
41
42 -func TestDockerEngine_ConfigurationSerialize(t *testing.T) {
43 - module.TestConfigurationSerialize(t, &DockerEngine{}, dataConfigJSON, dataConfigYAML)
42 +func TestCollector_ConfigurationSerialize(t *testing.T) {
43 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
44 }
45
46 -func TestDockerEngine_Cleanup(t *testing.T) {
46 +func TestCollector_Cleanup(t *testing.T) {
47 assert.NotPanics(t, New().Cleanup)
48 }
49
50 -func TestDockerEngine_Init(t *testing.T) {
50 +func TestCollector_Init(t *testing.T) {
51 tests := map[string]struct {
52 config Config
53 wantFail bool
@@ -69,21 +69,21 @@ func TestDockerEngine_Init(t *testing.T) {
69
70 for name, test := range tests {
71 t.Run(name, func(t *testing.T) {
72 - dockerEngine := New()
73 - dockerEngine.Config = test.config
72 + collr := New()
73 + collr.Config = test.config
74
75 if test.wantFail {
76 - assert.Error(t, dockerEngine.Init())
76 + assert.Error(t, collr.Init())
77 } else {
78 - assert.NoError(t, dockerEngine.Init())
78 + assert.NoError(t, collr.Init())
79 }
80 })
81 }
82 }
83
84 -func TestDockerEngine_Check(t *testing.T) {
84 +func TestCollector_Check(t *testing.T) {
85 tests := map[string]struct {
86 - prepare func(*testing.T) (*DockerEngine, *httptest.Server)
86 + prepare func(*testing.T) (*Collector, *httptest.Server)
87 wantFail bool
88 }{
89 "v17.05.0-ce": {prepare: prepareClientServerV17050CE},
@@ -97,21 +97,21 @@ func TestDockerEngine_Check(t *testing.T) {
97
98 for name, test := range tests {
99 t.Run(name, func(t *testing.T) {
100 - dockerEngine, srv := test.prepare(t)
100 + collr, srv := test.prepare(t)
101 defer srv.Close()
102
103 if test.wantFail {
104 - assert.Error(t, dockerEngine.Check())
104 + assert.Error(t, collr.Check())
105 } else {
106 - assert.NoError(t, dockerEngine.Check())
106 + assert.NoError(t, collr.Check())
107 }
108 })
109 }
110 }
111
112 -func TestDockerEngine_Charts(t *testing.T) {
112 +func TestCollector_Charts(t *testing.T) {
113 tests := map[string]struct {
114 - prepare func(*testing.T) (*DockerEngine, *httptest.Server)
114 + prepare func(*testing.T) (*Collector, *httptest.Server)
115 wantNumCharts int
116 }{
117 "v17.05.0-ce": {prepare: prepareClientServerV17050CE, wantNumCharts: len(charts) - 1}, // no container states chart
@@ -121,18 +121,18 @@ func TestDockerEngine_Charts(t *testing.T) {
121
122 for name, test := range tests {
123 t.Run(name, func(t *testing.T) {
124 - dockerEngine, srv := test.prepare(t)
124 + collr, srv := test.prepare(t)
125 defer srv.Close()
126
127 - require.NoError(t, dockerEngine.Check())
128 - assert.Len(t, *dockerEngine.Charts(), test.wantNumCharts)
127 + require.NoError(t, collr.Check())
128 + assert.Len(t, *collr.Charts(), test.wantNumCharts)
129 })
130 }
131 }
132
133 -func TestDockerEngine_Collect_ReturnsNilOnErrors(t *testing.T) {
133 +func TestCollector_Collect_ReturnsNilOnErrors(t *testing.T) {
134 tests := map[string]struct {
135 - prepare func(*testing.T) (*DockerEngine, *httptest.Server)
135 + prepare func(*testing.T) (*Collector, *httptest.Server)
136 }{
137 "non docker engine": {prepare: prepareClientServerNonDockerEngine},
138 "invalid data": {prepare: prepareClientServerInvalidData},
@@ -142,17 +142,17 @@ func TestDockerEngine_Collect_ReturnsNilOnErrors(t *testing.T) {
142
143 for name, test := range tests {
144 t.Run(name, func(t *testing.T) {
145 - dockerEngine, srv := test.prepare(t)
145 + collr, srv := test.prepare(t)
146 defer srv.Close()
147
148 - assert.Nil(t, dockerEngine.Collect())
148 + assert.Nil(t, collr.Collect())
149 })
150 }
151 }
152
153 -func TestDockerEngine_Collect(t *testing.T) {
153 +func TestCollector_Collect(t *testing.T) {
154 tests := map[string]struct {
155 - prepare func(*testing.T) (*DockerEngine, *httptest.Server)
155 + prepare func(*testing.T) (*Collector, *httptest.Server)
156 expected map[string]int64
157 }{
158 "v17.05.0-ce": {
@@ -262,97 +262,97 @@ func TestDockerEngine_Collect(t *testing.T) {
262 }
263 }
264
265 -func prepareClientServerV17050CE(t *testing.T) (*DockerEngine, *httptest.Server) {
265 +func prepareClientServerV17050CE(t *testing.T) (*Collector, *httptest.Server) {
266 t.Helper()
267 srv := httptest.NewServer(http.HandlerFunc(
268 func(w http.ResponseWriter, r *http.Request) {
269 _, _ = w.Write(dataVer17050Metrics)
270 }))
271
272 - dockerEngine := New()
273 - dockerEngine.URL = srv.URL
274 - require.NoError(t, dockerEngine.Init())
272 + collr := New()
273 + collr.URL = srv.URL
274 + require.NoError(t, collr.Init())
275
276 - return dockerEngine, srv
276 + return collr, srv
277 }
278
279 -func prepareClientServerV18093CE(t *testing.T) (*DockerEngine, *httptest.Server) {
279 +func prepareClientServerV18093CE(t *testing.T) (*Collector, *httptest.Server) {
280 t.Helper()
281 srv := httptest.NewServer(http.HandlerFunc(
282 func(w http.ResponseWriter, r *http.Request) {
283 _, _ = w.Write(dataVer18093Metrics)
284 }))
285
286 - dockerEngine := New()
287 - dockerEngine.URL = srv.URL
288 - require.NoError(t, dockerEngine.Init())
286 + collr := New()
287 + collr.URL = srv.URL
288 + require.NoError(t, collr.Init())
289
290 - return dockerEngine, srv
290 + return collr, srv
291 }
292
293 -func prepareClientServerV18093CESwarm(t *testing.T) (*DockerEngine, *httptest.Server) {
293 +func prepareClientServerV18093CESwarm(t *testing.T) (*Collector, *httptest.Server) {
294 t.Helper()
295 srv := httptest.NewServer(http.HandlerFunc(
296 func(w http.ResponseWriter, r *http.Request) {
297 _, _ = w.Write(dataVer18093SwarmMetrics)
298 }))
299
300 - dockerEngine := New()
301 - dockerEngine.URL = srv.URL
302 - require.NoError(t, dockerEngine.Init())
300 + collr := New()
301 + collr.URL = srv.URL
302 + require.NoError(t, collr.Init())
303
304 - return dockerEngine, srv
304 + return collr, srv
305 }
306
307 -func prepareClientServerNonDockerEngine(t *testing.T) (*DockerEngine, *httptest.Server) {
307 +func prepareClientServerNonDockerEngine(t *testing.T) (*Collector, *httptest.Server) {
308 t.Helper()
309 srv := httptest.NewServer(http.HandlerFunc(
310 func(w http.ResponseWriter, r *http.Request) {
311 _, _ = w.Write(dataNonDockerEngineMetrics)
312 }))
313
314 - dockerEngine := New()
315 - dockerEngine.URL = srv.URL
316 - require.NoError(t, dockerEngine.Init())
314 + collr := New()
315 + collr.URL = srv.URL
316 + require.NoError(t, collr.Init())
317
318 - return dockerEngine, srv
318 + return collr, srv
319 }
320
321 -func prepareClientServerInvalidData(t *testing.T) (*DockerEngine, *httptest.Server) {
321 +func prepareClientServerInvalidData(t *testing.T) (*Collector, *httptest.Server) {
322 t.Helper()
323 srv := httptest.NewServer(http.HandlerFunc(
324 func(w http.ResponseWriter, r *http.Request) {
325 _, _ = w.Write([]byte("hello and\n goodbye"))
326 }))
327
328 - dockerEngine := New()
329 - dockerEngine.URL = srv.URL
330 - require.NoError(t, dockerEngine.Init())
328 + collr := New()
329 + collr.URL = srv.URL
330 + require.NoError(t, collr.Init())
331
332 - return dockerEngine, srv
332 + return collr, srv
333 }
334
335 -func prepareClientServer404(t *testing.T) (*DockerEngine, *httptest.Server) {
335 +func prepareClientServer404(t *testing.T) (*Collector, *httptest.Server) {
336 t.Helper()
337 srv := httptest.NewServer(http.HandlerFunc(
338 func(w http.ResponseWriter, r *http.Request) {
339 w.WriteHeader(http.StatusNotFound)
340 }))
341
342 - dockerEngine := New()
343 - dockerEngine.URL = srv.URL
344 - require.NoError(t, dockerEngine.Init())
342 + collr := New()
343 + collr.URL = srv.URL
344 + require.NoError(t, collr.Init())
345
346 - return dockerEngine, srv
346 + return collr, srv
347 }
348
349 -func prepareClientServerConnectionRefused(t *testing.T) (*DockerEngine, *httptest.Server) {
349 +func prepareClientServerConnectionRefused(t *testing.T) (*Collector, *httptest.Server) {
350 t.Helper()
351 srv := httptest.NewServer(nil)
352
353 - dockerEngine := New()
354 - dockerEngine.URL = "http://127.0.0.1:38001/metrics"
355 - require.NoError(t, dockerEngine.Init())
353 + collr := New()
354 + collr.URL = "http://127.0.0.1:38001/metrics"
355 + require.NoError(t, collr.Init())
356
357 - return dockerEngine, srv
357 + return collr, srv
358 }
src/go/plugin/go.d/collector/docker_engine/init.go
+5 -5
@@ -9,17 +9,17 @@ import (
9 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/web"
10 )
11
12 -func (de *DockerEngine) validateConfig() error {
13 - if de.URL == "" {
12 +func (c *Collector) validateConfig() error {
13 + if c.URL == "" {
14 return errors.New("url not set")
15 }
16 return nil
17 }
18
19 -func (de *DockerEngine) initPrometheusClient() (prometheus.Prometheus, error) {
20 - client, err := web.NewHTTPClient(de.ClientConfig)
19 +func (c *Collector) initPrometheusClient() (prometheus.Prometheus, error) {
20 + client, err := web.NewHTTPClient(c.ClientConfig)
21 if err != nil {
22 return nil, err
23 }
24 - return prometheus.New(client, de.RequestConfig), nil
24 + return prometheus.New(client, c.RequestConfig), nil
25 }
src/go/plugin/go.d/collector/dockerhub/collect.go
+8 -8
@@ -7,15 +7,15 @@ import (
7 "time"
8 )
9
10 -func (dh *DockerHub) collect() (map[string]int64, error) {
10 +func (c *Collector) collect() (map[string]int64, error) {
11 var (
12 - reposNum = len(dh.Repositories)
12 + reposNum = len(c.Repositories)
13 ch = make(chan *repository, reposNum)
14 mx = make(map[string]int64)
15 )
16
17 - for _, name := range dh.Repositories {
18 - go dh.collectRepo(name, ch)
17 + for _, name := range c.Repositories {
18 + go c.collectRepo(name, ch)
19 }
20
21 var (
@@ -29,7 +29,7 @@ func (dh *DockerHub) collect() (map[string]int64, error) {
29 continue
30 }
31 if err := parseRepoTo(repo, mx); err != nil {
32 - dh.Errorf("error on parsing %s/%s : %v", repo.User, repo.Name, err)
32 + c.Errorf("error on parsing %s/%s : %v", repo.User, repo.Name, err)
33 continue
34 }
35 pullSum += repo.PullCount
@@ -44,10 +44,10 @@ func (dh *DockerHub) collect() (map[string]int64, error) {
44 return mx, nil
45 }
46
47 -func (dh *DockerHub) collectRepo(repoName string, ch chan *repository) {
48 - repo, err := dh.client.getRepository(repoName)
47 +func (c *Collector) collectRepo(repoName string, ch chan *repository) {
48 + repo, err := c.client.getRepository(repoName)
49 if err != nil {
50 - dh.Error(err)
50 + c.Error(err)
51 }
52 ch <- repo
53 }
src/go/plugin/go.d/collector/dockerhub/collector.go renamed
+19 -19
@@ -27,8 +27,8 @@ func init() {
27 })
28 }
29
30 -func New() *DockerHub {
31 - return &DockerHub{
30 +func New() *Collector {
31 + return &Collector{
32 Config: Config{
33 HTTPConfig: web.HTTPConfig{
34 RequestConfig: web.RequestConfig{
@@ -48,33 +48,33 @@ type Config struct {
48 Repositories []string `yaml:"repositories" json:"repositories"`
49 }
50
51 -type DockerHub struct {
51 +type Collector struct {
52 module.Base
53 Config `yaml:",inline" json:""`
54
55 client *apiClient
56 }
57
58 -func (dh *DockerHub) Configuration() any {
59 - return dh.Config
58 +func (c *Collector) Configuration() any {
59 + return c.Config
60 }
61
62 -func (dh *DockerHub) Init() error {
63 - if err := dh.validateConfig(); err != nil {
62 +func (c *Collector) Init() error {
63 + if err := c.validateConfig(); err != nil {
64 return fmt.Errorf("config validation: %v", err)
65 }
66
67 - client, err := dh.initApiClient()
67 + client, err := c.initApiClient()
68 if err != nil {
69 return fmt.Errorf("init api client: %v", err)
70 }
71 - dh.client = client
71 + c.client = client
72
73 return nil
74 }
75
76 -func (dh *DockerHub) Check() error {
77 - mx, err := dh.collect()
76 +func (c *Collector) Check() error {
77 + mx, err := c.collect()
78 if err != nil {
79 return err
80 }
@@ -85,25 +85,25 @@ func (dh *DockerHub) Check() error {
85 return nil
86 }
87
88 -func (dh *DockerHub) Charts() *Charts {
88 +func (c *Collector) Charts() *Charts {
89 cs := charts.Copy()
90 - addReposToCharts(dh.Repositories, cs)
90 + addReposToCharts(c.Repositories, cs)
91 return cs
92 }
93
94 -func (dh *DockerHub) Collect() map[string]int64 {
95 - mx, err := dh.collect()
94 +func (c *Collector) Collect() map[string]int64 {
95 + mx, err := c.collect()
96
97 if err != nil {
98 - dh.Error(err)
98 + c.Error(err)
99 return nil
100 }
101
102 return mx
103 }
104
105 -func (dh *DockerHub) Cleanup() {
106 - if dh.client != nil && dh.client.httpClient != nil {
107 - dh.client.httpClient.CloseIdleConnections()
105 +func (c *Collector) Cleanup() {
106 + if c.client != nil && c.client.httpClient != nil {
107 + c.client.httpClient.CloseIdleConnections()
108 }
109 }
src/go/plugin/go.d/collector/dockerhub/collector_test.go renamed
+40 -40
@@ -36,26 +36,26 @@ func Test_testDataIsValid(t *testing.T) {
36 }
37 }
38
39 -func TestDockerHub_ConfigurationSerialize(t *testing.T) {
40 - module.TestConfigurationSerialize(t, &DockerHub{}, dataConfigJSON, dataConfigYAML)
39 +func TestCollector_ConfigurationSerialize(t *testing.T) {
40 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
41 }
42
43 -func TestDockerHub_Charts(t *testing.T) { assert.NotNil(t, New().Charts()) }
43 +func TestCollector_Charts(t *testing.T) { assert.NotNil(t, New().Charts()) }
44
45 -func TestDockerHub_Cleanup(t *testing.T) { New().Cleanup() }
45 +func TestCollector_Cleanup(t *testing.T) { New().Cleanup() }
46
47 -func TestDockerHub_Init(t *testing.T) {
48 - job := New()
49 - job.Repositories = []string{"name/repo"}
50 - assert.NoError(t, job.Init())
51 - assert.NotNil(t, job.client)
47 +func TestCollector_Init(t *testing.T) {
48 + collr := New()
49 + collr.Repositories = []string{"name/repo"}
50 + assert.NoError(t, collr.Init())
51 + assert.NotNil(t, collr.client)
52 }
53
54 -func TestDockerHub_InitNG(t *testing.T) {
54 +func TestCollector_InitNG(t *testing.T) {
55 assert.Error(t, New().Init())
56 }
57
58 -func TestDockerHub_Check(t *testing.T) {
58 +func TestCollector_Check(t *testing.T) {
59 ts := httptest.NewServer(
60 http.HandlerFunc(
61 func(w http.ResponseWriter, r *http.Request) {
@@ -70,22 +70,22 @@ func TestDockerHub_Check(t *testing.T) {
70 }))
71 defer ts.Close()
72
73 - job := New()
74 - job.URL = ts.URL
75 - job.Repositories = []string{"name1/repo1", "name2/repo2", "name3/repo3"}
76 - require.NoError(t, job.Init())
77 - assert.NoError(t, job.Check())
73 + collr := New()
74 + collr.URL = ts.URL
75 + collr.Repositories = []string{"name1/repo1", "name2/repo2", "name3/repo3"}
76 + require.NoError(t, collr.Init())
77 + assert.NoError(t, collr.Check())
78 }
79
80 -func TestDockerHub_CheckNG(t *testing.T) {
81 - job := New()
82 - job.URL = "http://127.0.0.1:38001/metrics"
83 - job.Repositories = []string{"name1/repo1", "name2/repo2", "name3/repo3"}
84 - require.NoError(t, job.Init())
85 - assert.Error(t, job.Check())
80 +func TestCollector_CheckNG(t *testing.T) {
81 + collr := New()
82 + collr.URL = "http://127.0.0.1:38001/metrics"
83 + collr.Repositories = []string{"name1/repo1", "name2/repo2", "name3/repo3"}
84 + require.NoError(t, collr.Init())
85 + assert.Error(t, collr.Check())
86 }
87
88 -func TestDockerHub_Collect(t *testing.T) {
88 +func TestCollector_Collect(t *testing.T) {
89 ts := httptest.NewServer(
90 http.HandlerFunc(
91 func(w http.ResponseWriter, r *http.Request) {
@@ -100,11 +100,11 @@ func TestDockerHub_Collect(t *testing.T) {
100 }))
101 defer ts.Close()
102
103 - job := New()
104 - job.URL = ts.URL
105 - job.Repositories = []string{"name1/repo1", "name2/repo2", "name3/repo3"}
106 - require.NoError(t, job.Init())
107 - require.NoError(t, job.Check())
103 + collr := New()
104 + collr.URL = ts.URL
105 + collr.Repositories = []string{"name1/repo1", "name2/repo2", "name3/repo3"}
106 + require.NoError(t, collr.Init())
107 + require.NoError(t, collr.Check())
108
109 expected := map[string]int64{
110 "star_count_user1/name1": 45,
@@ -119,7 +119,7 @@ func TestDockerHub_Collect(t *testing.T) {
119 "pull_sum": 55620576,
120 }
121
122 - collected := job.Collect()
122 + collected := collr.Collect()
123
124 for k := range collected {
125 if strings.HasPrefix(k, "last") {
@@ -129,7 +129,7 @@ func TestDockerHub_Collect(t *testing.T) {
129 assert.Equal(t, expected, collected)
130 }
131
132 -func TestDockerHub_InvalidData(t *testing.T) {
132 +func TestCollector_InvalidData(t *testing.T) {
133 ts := httptest.NewServer(
134 http.HandlerFunc(
135 func(w http.ResponseWriter, r *http.Request) {
@@ -137,14 +137,14 @@ func TestDockerHub_InvalidData(t *testing.T) {
137 }))
138 defer ts.Close()
139
140 - job := New()
141 - job.URL = ts.URL
142 - job.Repositories = []string{"name1/repo1", "name2/repo2", "name3/repo3"}
143 - require.NoError(t, job.Init())
144 - assert.Error(t, job.Check())
140 + collr := New()
141 + collr.URL = ts.URL
142 + collr.Repositories = []string{"name1/repo1", "name2/repo2", "name3/repo3"}
143 + require.NoError(t, collr.Init())
144 + assert.Error(t, collr.Check())
145 }
146
147 -func TestDockerHub_404(t *testing.T) {
147 +func TestCollector_404(t *testing.T) {
148 ts := httptest.NewServer(
149 http.HandlerFunc(
150 func(w http.ResponseWriter, r *http.Request) {
@@ -152,8 +152,8 @@ func TestDockerHub_404(t *testing.T) {
152 }))
153 defer ts.Close()
154
155 - job := New()
156 - job.Repositories = []string{"name1/repo1", "name2/repo2", "name3/repo3"}
157 - require.NoError(t, job.Init())
158 - assert.Error(t, job.Check())
155 + collr := New()
156 + collr.Repositories = []string{"name1/repo1", "name2/repo2", "name3/repo3"}
157 + require.NoError(t, collr.Init())
158 + assert.Error(t, collr.Check())
159 }
src/go/plugin/go.d/collector/dockerhub/init.go
+6 -6
@@ -8,20 +8,20 @@ import (
8 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/web"
9 )
10
11 -func (dh *DockerHub) validateConfig() error {
12 - if dh.URL == "" {
11 +func (c *Collector) validateConfig() error {
12 + if c.URL == "" {
13 return errors.New("url not set")
14 }
15 - if len(dh.Repositories) == 0 {
15 + if len(c.Repositories) == 0 {
16 return errors.New("repositories not set")
17 }
18 return nil
19 }
20
21 -func (dh *DockerHub) initApiClient() (*apiClient, error) {
22 - client, err := web.NewHTTPClient(dh.ClientConfig)
21 +func (c *Collector) initApiClient() (*apiClient, error) {
22 + client, err := web.NewHTTPClient(c.ClientConfig)
23 if err != nil {
24 return nil, err
25 }
26 - return newAPIClient(client, dh.RequestConfig), nil
26 + return newAPIClient(client, c.RequestConfig), nil
27 }
src/go/plugin/go.d/collector/dovecot/collect.go
+12 -12
@@ -13,33 +13,33 @@ import (
13
14 // FIXME: drop using "old_stats" in favour of "stats" (https://doc.dovecot.org/configuration_manual/stats/openmetrics/).
15
16 -func (d *Dovecot) collect() (map[string]int64, error) {
17 - if d.conn == nil {
18 - conn, err := d.establishConn()
16 +func (c *Collector) collect() (map[string]int64, error) {
17 + if c.conn == nil {
18 + conn, err := c.establishConn()
19 if err != nil {
20 return nil, err
21 }
22 - d.conn = conn
22 + c.conn = conn
23 }
24
25 - stats, err := d.conn.queryExportGlobal()
25 + stats, err := c.conn.queryExportGlobal()
26 if err != nil {
27 - d.conn.disconnect()
28 - d.conn = nil
27 + c.conn.disconnect()
28 + c.conn = nil
29 return nil, err
30 }
31
32 mx := make(map[string]int64)
33
34 // https://doc.dovecot.org/configuration_manual/stats/old_statistics/#statistics-gathered
35 - if err := d.collectExportGlobal(mx, stats); err != nil {
35 + if err := c.collectExportGlobal(mx, stats); err != nil {
36 return nil, err
37 }
38
39 return mx, nil
40 }
41
42 -func (d *Dovecot) collectExportGlobal(mx map[string]int64, resp []byte) error {
42 +func (c *Collector) collectExportGlobal(mx map[string]int64, resp []byte) error {
43 sc := bufio.NewScanner(bytes.NewReader(resp))
44
45 if !sc.Scan() {
@@ -68,7 +68,7 @@ func (d *Dovecot) collectExportGlobal(mx map[string]int64, resp []byte) error {
68
69 v, err := strconv.ParseInt(val, 10, 64)
70 if err != nil {
71 - d.Debugf("failed to parse export value %s %s: %v", name, val, err)
71 + c.Debugf("failed to parse export value %s %s: %v", name, val, err)
72 continue
73 }
74
@@ -78,8 +78,8 @@ func (d *Dovecot) collectExportGlobal(mx map[string]int64, resp []byte) error {
78 return nil
79 }
80
81 -func (d *Dovecot) establishConn() (dovecotConn, error) {
82 - conn := d.newConn(d.Config)
81 +func (c *Collector) establishConn() (dovecotConn, error) {
82 + conn := c.newConn(c.Config)
83
84 if err := conn.connect(); err != nil {
85 return nil, err
src/go/plugin/go.d/collector/dovecot/collector.go renamed
+18 -18
@@ -22,8 +22,8 @@ func init() {
22 })
23 }
24
25 -func New() *Dovecot {
26 - return &Dovecot{
25 +func New() *Collector {
26 + return &Collector{
27 Config: Config{
28 Address: "127.0.0.1:24242",
29 Timeout: confopt.Duration(time.Second * 1),
@@ -39,7 +39,7 @@ type Config struct {
39 Timeout confopt.Duration `yaml:"timeout" json:"timeout"`
40 }
41
42 -type Dovecot struct {
42 +type Collector struct {
43 module.Base
44 Config `yaml:",inline" json:""`
45
@@ -49,20 +49,20 @@ type Dovecot struct {
49 conn dovecotConn
50 }
51
52 -func (d *Dovecot) Configuration() any {
53 - return d.Config
52 +func (c *Collector) Configuration() any {
53 + return c.Config
54 }
55
56 -func (d *Dovecot) Init() error {
57 - if d.Address == "" {
56 +func (c *Collector) Init() error {
57 + if c.Address == "" {
58 return errors.New("config: 'address' not set")
59 }
60
61 return nil
62 }
63
64 -func (d *Dovecot) Check() error {
65 - mx, err := d.collect()
64 +func (c *Collector) Check() error {
65 + mx, err := c.collect()
66 if err != nil {
67 return err
68 }
@@ -74,14 +74,14 @@ func (d *Dovecot) Check() error {
74 return nil
75 }
76
77 -func (d *Dovecot) Charts() *module.Charts {
78 - return d.charts
77 +func (c *Collector) Charts() *module.Charts {
78 + return c.charts
79 }
80
81 -func (d *Dovecot) Collect() map[string]int64 {
82 - mx, err := d.collect()
81 +func (c *Collector) Collect() map[string]int64 {
82 + mx, err := c.collect()
83 if err != nil {
84 - d.Error(err)
84 + c.Error(err)
85 }
86
87 if len(mx) == 0 {
@@ -91,9 +91,9 @@ func (d *Dovecot) Collect() map[string]int64 {
91 return mx
92 }
93
94 -func (d *Dovecot) Cleanup() {
95 - if d.conn != nil {
96 - d.conn.disconnect()
97 - d.conn = nil
94 +func (c *Collector) Cleanup() {
95 + if c.conn != nil {
96 + c.conn.disconnect()
97 + c.conn = nil
98 }
99 }
src/go/plugin/go.d/collector/dovecot/collector_test.go renamed
+34 -34
@@ -30,11 +30,11 @@ func Test_testDataIsValid(t *testing.T) {
30 }
31 }
32
33 -func TestDovecot_ConfigurationSerialize(t *testing.T) {
34 - module.TestConfigurationSerialize(t, &Dovecot{}, dataConfigJSON, dataConfigYAML)
33 +func TestCollector_ConfigurationSerialize(t *testing.T) {
34 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
35 }
36
37 -func TestDovecot_Init(t *testing.T) {
37 +func TestCollector_Init(t *testing.T) {
38 tests := map[string]struct {
39 config Config
40 wantFail bool
@@ -55,59 +55,59 @@ func TestDovecot_Init(t *testing.T) {
55
56 for name, test := range tests {
57 t.Run(name, func(t *testing.T) {
58 - dovecot := New()
59 - dovecot.Config = test.config
58 + collr := New()
59 + collr.Config = test.config
60
61 if test.wantFail {
62 - assert.Error(t, dovecot.Init())
62 + assert.Error(t, collr.Init())
63 } else {
64 - assert.NoError(t, dovecot.Init())
64 + assert.NoError(t, collr.Init())
65 }
66 })
67 }
68 }
69
70 -func TestDovecot_Cleanup(t *testing.T) {
70 +func TestCollector_Cleanup(t *testing.T) {
71 tests := map[string]struct {
72 - prepare func() *Dovecot
72 + prepare func() *Collector
73 }{
74 "not initialized": {
75 - prepare: func() *Dovecot {
75 + prepare: func() *Collector {
76 return New()
77 },
78 },
79 "after check": {
80 - prepare: func() *Dovecot {
81 - dovecot := New()
82 - dovecot.newConn = func(config Config) dovecotConn { return prepareMockOk() }
83 - _ = dovecot.Check()
84 - return dovecot
80 + prepare: func() *Collector {
81 + collr := New()
82 + collr.newConn = func(Config) dovecotConn { return prepareMockOk() }
83 + _ = collr.Check()
84 + return collr
85 },
86 },
87 "after collect": {
88 - prepare: func() *Dovecot {
89 - dovecot := New()
90 - dovecot.newConn = func(config Config) dovecotConn { return prepareMockOk() }
91 - _ = dovecot.Collect()
92 - return dovecot
88 + prepare: func() *Collector {
89 + collr := New()
90 + collr.newConn = func(Config) dovecotConn { return prepareMockOk() }
91 + _ = collr.Collect()
92 + return collr
93 },
94 },
95 }
96
97 for name, test := range tests {
98 t.Run(name, func(t *testing.T) {
99 - dovecot := test.prepare()
99 + collr := test.prepare()
100
101 - assert.NotPanics(t, dovecot.Cleanup)
101 + assert.NotPanics(t, collr.Cleanup)
102 })
103 }
104 }
105
106 -func TestDovecot_Charts(t *testing.T) {
106 +func TestCollector_Charts(t *testing.T) {
107 assert.NotNil(t, New().Charts())
108 }
109
110 -func TestDovecot_Check(t *testing.T) {
110 +func TestCollector_Check(t *testing.T) {
111 tests := map[string]struct {
112 prepareMock func() *mockDovecotConn
113 wantFail bool
@@ -132,20 +132,20 @@ func TestDovecot_Check(t *testing.T) {
132
133 for name, test := range tests {
134 t.Run(name, func(t *testing.T) {
135 - dovecot := New()
135 + collr := New()
136 mock := test.prepareMock()
137 - dovecot.newConn = func(config Config) dovecotConn { return mock }
137 + collr.newConn = func(Config) dovecotConn { return mock }
138
139 if test.wantFail {
140 - assert.Error(t, dovecot.Check())
140 + assert.Error(t, collr.Check())
141 } else {
142 - assert.NoError(t, dovecot.Check())
142 + assert.NoError(t, collr.Check())
143 }
144 })
145 }
146 }
147
148 -func TestDovecot_Collect(t *testing.T) {
148 +func TestCollector_Collect(t *testing.T) {
149 tests := map[string]struct {
150 prepareMock func() *mockDovecotConn
151 wantMetrics map[string]int64
@@ -208,20 +208,20 @@ func TestDovecot_Collect(t *testing.T) {
208
209 for name, test := range tests {
210 t.Run(name, func(t *testing.T) {
211 - dovecot := New()
211 + collr := New()
212 mock := test.prepareMock()
213 - dovecot.newConn = func(config Config) dovecotConn { return mock }
213 + collr.newConn = func(Config) dovecotConn { return mock }
214
215 - mx := dovecot.Collect()
215 + mx := collr.Collect()
216
217 require.Equal(t, test.wantMetrics, mx)
218
219 if len(test.wantMetrics) > 0 {
220 - module.TestMetricsHasAllChartsDims(t, dovecot.Charts(), mx)
220 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
221 }
222
223 assert.Equal(t, test.disconnectBeforeCleanup, mock.disconnectCalled, "disconnect before cleanup")
224 - dovecot.Cleanup()
224 + collr.Cleanup()
225 assert.Equal(t, test.disconnectAfterCleanup, mock.disconnectCalled, "disconnect after cleanup")
226 })
227 }
src/go/plugin/go.d/collector/elasticsearch/charts.go
+28 -28
@@ -756,43 +756,43 @@ var (
756 }
757 )
758
759 -func (es *Elasticsearch) addClusterStatsCharts() {
759 +func (c *Collector) addClusterStatsCharts() {
760 charts := clusterStatsChartsTmpl.Copy()
761
762 for _, chart := range *charts {
763 - chart.ID = fmt.Sprintf(chart.ID, es.clusterName)
763 + chart.ID = fmt.Sprintf(chart.ID, c.clusterName)
764 chart.Labels = []module.Label{
765 - {Key: "cluster_name", Value: es.clusterName},
765 + {Key: "cluster_name", Value: c.clusterName},
766 }
767 }
768
769 - if err := es.charts.Add(*charts...); err != nil {
770 - es.Warning(err)
769 + if err := c.charts.Add(*charts...); err != nil {
770 + c.Warning(err)
771 }
772 }
773
774 -func (es *Elasticsearch) addClusterHealthCharts() {
774 +func (c *Collector) addClusterHealthCharts() {
775 charts := clusterHealthChartsTmpl.Copy()
776
777 for _, chart := range *charts {
778 - chart.ID = fmt.Sprintf(chart.ID, es.clusterName)
778 + chart.ID = fmt.Sprintf(chart.ID, c.clusterName)
779 chart.Labels = []module.Label{
780 - {Key: "cluster_name", Value: es.clusterName},
780 + {Key: "cluster_name", Value: c.clusterName},
781 }
782 }
783
784 - if err := es.charts.Add(*charts...); err != nil {
785 - es.Warning(err)
784 + if err := c.charts.Add(*charts...); err != nil {
785 + c.Warning(err)
786 }
787 }
788
789 -func (es *Elasticsearch) addNodeCharts(nodeID string, node *esNodeStats) {
789 +func (c *Collector) addNodeCharts(nodeID string, node *esNodeStats) {
790 charts := nodeChartsTmpl.Copy()
791
792 for _, chart := range *charts {
793 - chart.ID = fmt.Sprintf(chart.ID, nodeID, es.clusterName)
793 + chart.ID = fmt.Sprintf(chart.ID, nodeID, c.clusterName)
794 chart.Labels = []module.Label{
795 - {Key: "cluster_name", Value: es.clusterName},
795 + {Key: "cluster_name", Value: c.clusterName},
796 {Key: "node_name", Value: node.Name},
797 {Key: "host", Value: node.Host},
798 }
@@ -801,23 +801,23 @@ func (es *Elasticsearch) addNodeCharts(nodeID string, node *esNodeStats) {
801 }
802 }
803
804 - if err := es.Charts().Add(*charts...); err != nil {
805 - es.Warning(err)
804 + if err := c.Charts().Add(*charts...); err != nil {
805 + c.Warning(err)
806 }
807 }
808
809 -func (es *Elasticsearch) removeNodeCharts(nodeID string) {
810 - px := fmt.Sprintf("node_%s_cluster_%s_", nodeID, es.clusterName)
811 - es.removeCharts(px)
809 +func (c *Collector) removeNodeCharts(nodeID string) {
810 + px := fmt.Sprintf("node_%s_cluster_%s_", nodeID, c.clusterName)
811 + c.removeCharts(px)
812 }
813
814 -func (es *Elasticsearch) addIndexCharts(index string) {
814 +func (c *Collector) addIndexCharts(index string) {
815 charts := nodeIndexChartsTmpl.Copy()
816
817 for _, chart := range *charts {
818 - chart.ID = fmt.Sprintf(chart.ID, index, es.clusterName)
818 + chart.ID = fmt.Sprintf(chart.ID, index, c.clusterName)
819 chart.Labels = []module.Label{
820 - {Key: "cluster_name", Value: es.clusterName},
820 + {Key: "cluster_name", Value: c.clusterName},
821 {Key: "index", Value: index},
822 }
823 for _, dim := range chart.Dims {
@@ -825,18 +825,18 @@ func (es *Elasticsearch) addIndexCharts(index string) {
825 }
826 }
827
828 - if err := es.Charts().Add(*charts...); err != nil {
829 - es.Warning(err)
828 + if err := c.Charts().Add(*charts...); err != nil {
829 + c.Warning(err)
830 }
831 }
832
833 -func (es *Elasticsearch) removeIndexCharts(index string) {
834 - px := fmt.Sprintf("node_index_%s_cluster_%s_", index, es.clusterName)
835 - es.removeCharts(px)
833 +func (c *Collector) removeIndexCharts(index string) {
834 + px := fmt.Sprintf("node_index_%s_cluster_%s_", index, c.clusterName)
835 + c.removeCharts(px)
836 }
837
838 -func (es *Elasticsearch) removeCharts(prefix string) {
839 - for _, chart := range *es.Charts() {
838 +func (c *Collector) removeCharts(prefix string) {
839 + for _, chart := range *c.Charts() {
840 if strings.HasPrefix(chart.ID, prefix) {
841 chart.MarkRemove()
842 chart.MarkNotCreated()
src/go/plugin/go.d/collector/elasticsearch/collect.go
+56 -56
@@ -24,31 +24,31 @@ const (
24 urlPathClusterStats = "/_cluster/stats"
25 )
26
27 -func (es *Elasticsearch) collect() (map[string]int64, error) {
28 - if es.clusterName == "" {
29 - name, err := es.getClusterName()
27 +func (c *Collector) collect() (map[string]int64, error) {
28 + if c.clusterName == "" {
29 + name, err := c.getClusterName()
30 if err != nil {
31 return nil, err
32 }
33 - es.clusterName = name
33 + c.clusterName = name
34 }
35
36 - ms := es.scrapeElasticsearch()
36 + ms := c.scrapeElasticsearch()
37 if ms.empty() {
38 return nil, nil
39 }
40
41 mx := make(map[string]int64)
42
43 - es.collectNodesStats(mx, ms)
44 - es.collectClusterHealth(mx, ms)
45 - es.collectClusterStats(mx, ms)
46 - es.collectLocalIndicesStats(mx, ms)
43 + c.collectNodesStats(mx, ms)
44 + c.collectClusterHealth(mx, ms)
45 + c.collectClusterStats(mx, ms)
46 + c.collectLocalIndicesStats(mx, ms)
47
48 return mx, nil
49 }
50
51 -func (es *Elasticsearch) collectNodesStats(mx map[string]int64, ms *esMetrics) {
51 +func (c *Collector) collectNodesStats(mx map[string]int64, ms *esMetrics) {
52 if !ms.hasNodesStats() {
53 return
54 }
@@ -58,28 +58,28 @@ func (es *Elasticsearch) collectNodesStats(mx map[string]int64, ms *esMetrics) {
58 for nodeID, node := range ms.NodesStats.Nodes {
59 seen[nodeID] = true
60
61 - if !es.nodes[nodeID] {
62 - es.nodes[nodeID] = true
63 - es.addNodeCharts(nodeID, node)
61 + if !c.nodes[nodeID] {
62 + c.nodes[nodeID] = true
63 + c.addNodeCharts(nodeID, node)
64 }
65
66 merge(mx, stm.ToMap(node), "node_"+nodeID)
67 }
68
69 - for nodeID := range es.nodes {
69 + for nodeID := range c.nodes {
70 if !seen[nodeID] {
71 - delete(es.nodes, nodeID)
72 - es.removeNodeCharts(nodeID)
71 + delete(c.nodes, nodeID)
72 + c.removeNodeCharts(nodeID)
73 }
74 }
75 }
76
77 -func (es *Elasticsearch) collectClusterHealth(mx map[string]int64, ms *esMetrics) {
77 +func (c *Collector) collectClusterHealth(mx map[string]int64, ms *esMetrics) {
78 if !ms.hasClusterHealth() {
79 return
80 }
81
82 - es.addClusterHealthChartsOnce.Do(es.addClusterHealthCharts)
82 + c.addClusterHealthChartsOnce.Do(c.addClusterHealthCharts)
83
84 merge(mx, stm.ToMap(ms.ClusterHealth), "cluster")
85
@@ -88,17 +88,17 @@ func (es *Elasticsearch) collectClusterHealth(mx map[string]int64, ms *esMetrics
88 mx["cluster_status_red"] = metrix.Bool(ms.ClusterHealth.Status == "red")
89 }
90
91 -func (es *Elasticsearch) collectClusterStats(mx map[string]int64, ms *esMetrics) {
91 +func (c *Collector) collectClusterStats(mx map[string]int64, ms *esMetrics) {
92 if !ms.hasClusterStats() {
93 return
94 }
95
96 - es.addClusterStatsChartsOnce.Do(es.addClusterStatsCharts)
96 + c.addClusterStatsChartsOnce.Do(c.addClusterStatsCharts)
97
98 merge(mx, stm.ToMap(ms.ClusterStats), "cluster")
99 }
100
101 -func (es *Elasticsearch) collectLocalIndicesStats(mx map[string]int64, ms *esMetrics) {
101 +func (c *Collector) collectLocalIndicesStats(mx map[string]int64, ms *esMetrics) {
102 if !ms.hasLocalIndicesStats() {
103 return
104 }
@@ -108,9 +108,9 @@ func (es *Elasticsearch) collectLocalIndicesStats(mx map[string]int64, ms *esMet
108 for _, v := range ms.LocalIndicesStats {
109 seen[v.Index] = true
110
111 - if !es.indices[v.Index] {
112 - es.indices[v.Index] = true
113 - es.addIndexCharts(v.Index)
111 + if !c.indices[v.Index] {
112 + c.indices[v.Index] = true
113 + c.addIndexCharts(v.Index)
114 }
115
116 px := fmt.Sprintf("node_index_%s_stats_", v.Index)
@@ -123,102 +123,102 @@ func (es *Elasticsearch) collectLocalIndicesStats(mx map[string]int64, ms *esMet
123 mx[px+"store_size_in_bytes"] = convertIndexStoreSizeToBytes(v.StoreSize)
124 }
125
126 - for index := range es.indices {
126 + for index := range c.indices {
127 if !seen[index] {
128 - delete(es.indices, index)
129 - es.removeIndexCharts(index)
128 + delete(c.indices, index)
129 + c.removeIndexCharts(index)
130 }
131 }
132 }
133
134 -func (es *Elasticsearch) scrapeElasticsearch() *esMetrics {
134 +func (c *Collector) scrapeElasticsearch() *esMetrics {
135 ms := &esMetrics{}
136 wg := &sync.WaitGroup{}
137
138 - if es.DoNodeStats {
138 + if c.DoNodeStats {
139 wg.Add(1)
140 - go func() { defer wg.Done(); es.scrapeNodesStats(ms) }()
140 + go func() { defer wg.Done(); c.scrapeNodesStats(ms) }()
141 }
142 - if es.DoClusterHealth {
142 + if c.DoClusterHealth {
143 wg.Add(1)
144 - go func() { defer wg.Done(); es.scrapeClusterHealth(ms) }()
144 + go func() { defer wg.Done(); c.scrapeClusterHealth(ms) }()
145 }
146 - if es.DoClusterStats {
146 + if c.DoClusterStats {
147 wg.Add(1)
148 - go func() { defer wg.Done(); es.scrapeClusterStats(ms) }()
148 + go func() { defer wg.Done(); c.scrapeClusterStats(ms) }()
149 }
150 - if !es.ClusterMode && es.DoIndicesStats {
150 + if !c.ClusterMode && c.DoIndicesStats {
151 wg.Add(1)
152 - go func() { defer wg.Done(); es.scrapeLocalIndicesStats(ms) }()
152 + go func() { defer wg.Done(); c.scrapeLocalIndicesStats(ms) }()
153 }
154 wg.Wait()
155
156 return ms
157 }
158
159 -func (es *Elasticsearch) scrapeNodesStats(ms *esMetrics) {
159 +func (c *Collector) scrapeNodesStats(ms *esMetrics) {
160 var p string
161 - if es.ClusterMode {
161 + if c.ClusterMode {
162 p = urlPathNodesStats
163 } else {
164 p = urlPathLocalNodeStats
165 }
166
167 - req, _ := web.NewHTTPRequestWithPath(es.RequestConfig, p)
167 + req, _ := web.NewHTTPRequestWithPath(c.RequestConfig, p)
168
169 var stats esNodesStats
170 - if err := web.DoHTTP(es.httpClient).RequestJSON(req, &stats); err != nil {
171 - es.Warning(err)
170 + if err := web.DoHTTP(c.httpClient).RequestJSON(req, &stats); err != nil {
171 + c.Warning(err)
172 return
173 }
174
175 ms.NodesStats = &stats
176 }
177
178 -func (es *Elasticsearch) scrapeClusterHealth(ms *esMetrics) {
179 - req, _ := web.NewHTTPRequestWithPath(es.RequestConfig, urlPathClusterHealth)
178 +func (c *Collector) scrapeClusterHealth(ms *esMetrics) {
179 + req, _ := web.NewHTTPRequestWithPath(c.RequestConfig, urlPathClusterHealth)
180
181 var health esClusterHealth
182 - if err := web.DoHTTP(es.httpClient).RequestJSON(req, &health); err != nil {
183 - es.Warning(err)
182 + if err := web.DoHTTP(c.httpClient).RequestJSON(req, &health); err != nil {
183 + c.Warning(err)
184 return
185 }
186
187 ms.ClusterHealth = &health
188 }
189
190 -func (es *Elasticsearch) scrapeClusterStats(ms *esMetrics) {
191 - req, _ := web.NewHTTPRequestWithPath(es.RequestConfig, urlPathClusterStats)
190 +func (c *Collector) scrapeClusterStats(ms *esMetrics) {
191 + req, _ := web.NewHTTPRequestWithPath(c.RequestConfig, urlPathClusterStats)
192
193 var stats esClusterStats
194 - if err := web.DoHTTP(es.httpClient).RequestJSON(req, &stats); err != nil {
195 - es.Warning(err)
194 + if err := web.DoHTTP(c.httpClient).RequestJSON(req, &stats); err != nil {
195 + c.Warning(err)
196 return
197 }
198
199 ms.ClusterStats = &stats
200 }
201
202 -func (es *Elasticsearch) scrapeLocalIndicesStats(ms *esMetrics) {
203 - req, _ := web.NewHTTPRequestWithPath(es.RequestConfig, urlPathIndicesStats)
202 +func (c *Collector) scrapeLocalIndicesStats(ms *esMetrics) {
203 + req, _ := web.NewHTTPRequestWithPath(c.RequestConfig, urlPathIndicesStats)
204 req.URL.RawQuery = "local=true&format=json"
205
206 var stats []esIndexStats
207 - if err := web.DoHTTP(es.httpClient).RequestJSON(req, &stats); err != nil {
208 - es.Warning(err)
207 + if err := web.DoHTTP(c.httpClient).RequestJSON(req, &stats); err != nil {
208 + c.Warning(err)
209 return
210 }
211
212 ms.LocalIndicesStats = removeSystemIndices(stats)
213 }
214
215 -func (es *Elasticsearch) getClusterName() (string, error) {
216 - req, _ := web.NewHTTPRequest(es.RequestConfig)
215 +func (c *Collector) getClusterName() (string, error) {
216 + req, _ := web.NewHTTPRequest(c.RequestConfig)
217
218 var info struct {
219 ClusterName string `json:"cluster_name"`
220 }
221 - if err := web.DoHTTP(es.httpClient).RequestJSON(req, &info); err != nil {
221 + if err := web.DoHTTP(c.httpClient).RequestJSON(req, &info); err != nil {
222 return "", err
223 }
224
src/go/plugin/go.d/collector/elasticsearch/collector.go renamed
+19 -19
@@ -29,8 +29,8 @@ func init() {
29 })
30 }
31
32 -func New() *Elasticsearch {
33 - return &Elasticsearch{
32 +func New() *Collector {
33 + return &Collector{
34 Config: Config{
35 HTTPConfig: web.HTTPConfig{
36 RequestConfig: web.RequestConfig{
@@ -66,7 +66,7 @@ type Config struct {
66 DoIndicesStats bool `yaml:"collect_indices_stats" json:"collect_indices_stats"`
67 }
68
69 -type Elasticsearch struct {
69 +type Collector struct {
70 module.Base
71 Config `yaml:",inline" json:""`
72
@@ -81,27 +81,27 @@ type Elasticsearch struct {
81 indices map[string]bool
82 }
83
84 -func (es *Elasticsearch) Configuration() any {
85 - return es.Config
84 +func (c *Collector) Configuration() any {
85 + return c.Config
86 }
87
88 -func (es *Elasticsearch) Init() error {
89 - err := es.validateConfig()
88 +func (c *Collector) Init() error {
89 + err := c.validateConfig()
90 if err != nil {
91 return fmt.Errorf("check configuration: %v", err)
92 }
93
94 - httpClient, err := es.initHTTPClient()
94 + httpClient, err := c.initHTTPClient()
95 if err != nil {
96 return fmt.Errorf("init HTTP client: %v", err)
97 }
98 - es.httpClient = httpClient
98 + c.httpClient = httpClient
99
100 return nil
101 }
102
103 -func (es *Elasticsearch) Check() error {
104 - mx, err := es.collect()
103 +func (c *Collector) Check() error {
104 + mx, err := c.collect()
105 if err != nil {
106 return err
107 }
@@ -112,14 +112,14 @@ func (es *Elasticsearch) Check() error {
112 return nil
113 }
114
115 -func (es *Elasticsearch) Charts() *module.Charts {
116 - return es.charts
115 +func (c *Collector) Charts() *module.Charts {
116 + return c.charts
117 }
118
119 -func (es *Elasticsearch) Collect() map[string]int64 {
120 - mx, err := es.collect()
119 +func (c *Collector) Collect() map[string]int64 {
120 + mx, err := c.collect()
121 if err != nil {
122 - es.Error(err)
122 + c.Error(err)
123 }
124
125 if len(mx) == 0 {
@@ -128,8 +128,8 @@ func (es *Elasticsearch) Collect() map[string]int64 {
128 return mx
129 }
130
131 -func (es *Elasticsearch) Cleanup() {
132 - if es.httpClient != nil {
133 - es.httpClient.CloseIdleConnections()
131 +func (c *Collector) Cleanup() {
132 + if c.httpClient != nil {
133 + c.httpClient.CloseIdleConnections()
134 }
135 }
src/go/plugin/go.d/collector/elasticsearch/collector_test.go renamed
+77 -77
@@ -43,11 +43,11 @@ func Test_testDataIsValid(t *testing.T) {
43 }
44 }
45
46 -func TestElasticsearch_ConfigurationSerialize(t *testing.T) {
47 - module.TestConfigurationSerialize(t, &Elasticsearch{}, dataConfigJSON, dataConfigYAML)
46 +func TestCollector_ConfigurationSerialize(t *testing.T) {
47 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
48 }
49
50 -func TestElasticsearch_Init(t *testing.T) {
50 +func TestCollector_Init(t *testing.T) {
51 tests := map[string]struct {
52 config Config
53 wantFail bool
@@ -109,21 +109,21 @@ func TestElasticsearch_Init(t *testing.T) {
109
110 for name, test := range tests {
111 t.Run(name, func(t *testing.T) {
112 - es := New()
113 - es.Config = test.config
112 + collr := New()
113 + collr.Config = test.config
114
115 if test.wantFail {
116 - assert.Error(t, es.Init())
116 + assert.Error(t, collr.Init())
117 } else {
118 - assert.NoError(t, es.Init())
118 + assert.NoError(t, collr.Init())
119 }
120 })
121 }
122 }
123
124 -func TestElasticsearch_Check(t *testing.T) {
124 +func TestCollector_Check(t *testing.T) {
125 tests := map[string]struct {
126 - prepare func(*testing.T) (es *Elasticsearch, cleanup func())
126 + prepare func(*testing.T) (collr *Collector, cleanup func())
127 wantFail bool
128 }{
129 "valid data": {prepare: prepareElasticsearchValidData},
@@ -134,41 +134,41 @@ func TestElasticsearch_Check(t *testing.T) {
134
135 for name, test := range tests {
136 t.Run(name, func(t *testing.T) {
137 - es, cleanup := test.prepare(t)
137 + collr, cleanup := test.prepare(t)
138 defer cleanup()
139
140 if test.wantFail {
141 - assert.Error(t, es.Check())
141 + assert.Error(t, collr.Check())
142 } else {
143 - assert.NoError(t, es.Check())
143 + assert.NoError(t, collr.Check())
144 }
145 })
146 }
147 }
148
149 -func TestElasticsearch_Charts(t *testing.T) {
149 +func TestCollector_Charts(t *testing.T) {
150 assert.NotNil(t, New().Charts())
151 }
152
153 -func TestElasticsearch_Cleanup(t *testing.T) {
153 +func TestCollector_Cleanup(t *testing.T) {
154 assert.NotPanics(t, New().Cleanup)
155 }
156
157 -func TestElasticsearch_Collect(t *testing.T) {
157 +func TestCollector_Collect(t *testing.T) {
158 tests := map[string]struct {
159 - prepare func() *Elasticsearch
159 + prepare func() *Collector
160 wantCollected map[string]int64
161 wantCharts int
162 }{
163 "v842: all nodes stats": {
164 - prepare: func() *Elasticsearch {
165 - es := New()
166 - es.ClusterMode = true
167 - es.DoNodeStats = true
168 - es.DoClusterHealth = false
169 - es.DoClusterStats = false
170 - es.DoIndicesStats = false
171 - return es
164 + prepare: func() *Collector {
165 + collr := New()
166 + collr.ClusterMode = true
167 + collr.DoNodeStats = true
168 + collr.DoClusterHealth = false
169 + collr.DoClusterStats = false
170 + collr.DoIndicesStats = false
171 + return collr
172 },
173 wantCharts: len(nodeChartsTmpl) * 3,
174 wantCollected: map[string]int64{
@@ -433,13 +433,13 @@ func TestElasticsearch_Collect(t *testing.T) {
433 },
434 },
435 "v842: local node stats": {
436 - prepare: func() *Elasticsearch {
437 - es := New()
438 - es.DoNodeStats = true
439 - es.DoClusterHealth = false
440 - es.DoClusterStats = false
441 - es.DoIndicesStats = false
442 - return es
436 + prepare: func() *Collector {
437 + collr := New()
438 + collr.DoNodeStats = true
439 + collr.DoClusterHealth = false
440 + collr.DoClusterStats = false
441 + collr.DoIndicesStats = false
442 + return collr
443 },
444 wantCharts: len(nodeChartsTmpl),
445 wantCollected: map[string]int64{
@@ -532,13 +532,13 @@ func TestElasticsearch_Collect(t *testing.T) {
532 },
533 },
534 "v842: only cluster_health": {
535 - prepare: func() *Elasticsearch {
536 - es := New()
537 - es.DoNodeStats = false
538 - es.DoClusterHealth = true
539 - es.DoClusterStats = false
540 - es.DoIndicesStats = false
541 - return es
535 + prepare: func() *Collector {
536 + collr := New()
537 + collr.DoNodeStats = false
538 + collr.DoClusterHealth = true
539 + collr.DoClusterStats = false
540 + collr.DoIndicesStats = false
541 + return collr
542 },
543 wantCharts: len(clusterHealthChartsTmpl),
544 wantCollected: map[string]int64{
@@ -559,13 +559,13 @@ func TestElasticsearch_Collect(t *testing.T) {
559 },
560 },
561 "v842: only cluster_stats": {
562 - prepare: func() *Elasticsearch {
563 - es := New()
564 - es.DoNodeStats = false
565 - es.DoClusterHealth = false
566 - es.DoClusterStats = true
567 - es.DoIndicesStats = false
568 - return es
562 + prepare: func() *Collector {
563 + collr := New()
564 + collr.DoNodeStats = false
565 + collr.DoClusterHealth = false
566 + collr.DoClusterStats = true
567 + collr.DoIndicesStats = false
568 + return collr
569 },
570 wantCharts: len(clusterStatsChartsTmpl),
571 wantCollected: map[string]int64{
@@ -594,13 +594,13 @@ func TestElasticsearch_Collect(t *testing.T) {
594 },
595 },
596 "v842: only indices_stats": {
597 - prepare: func() *Elasticsearch {
598 - es := New()
599 - es.DoNodeStats = false
600 - es.DoClusterHealth = false
601 - es.DoClusterStats = false
602 - es.DoIndicesStats = true
603 - return es
597 + prepare: func() *Collector {
598 + collr := New()
599 + collr.DoNodeStats = false
600 + collr.DoClusterHealth = false
601 + collr.DoClusterStats = false
602 + collr.DoIndicesStats = true
603 + return collr
604 },
605 wantCharts: len(nodeIndexChartsTmpl) * 3,
606 wantCollected: map[string]int64{
@@ -628,69 +628,69 @@ func TestElasticsearch_Collect(t *testing.T) {
628
629 for name, test := range tests {
630 t.Run(name, func(t *testing.T) {
631 - es, cleanup := prepareElasticsearch(t, test.prepare)
631 + collr, cleanup := prepareElasticsearch(t, test.prepare)
632 defer cleanup()
633
634 var mx map[string]int64
635 for i := 0; i < 10; i++ {
636 - mx = es.Collect()
636 + mx = collr.Collect()
637 }
638
639 assert.Equal(t, test.wantCollected, mx)
640 - assert.Len(t, *es.Charts(), test.wantCharts)
641 - module.TestMetricsHasAllChartsDims(t, es.Charts(), mx)
640 + assert.Len(t, *collr.Charts(), test.wantCharts)
641 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
642 })
643 }
644 }
645
646 -func prepareElasticsearch(t *testing.T, createES func() *Elasticsearch) (es *Elasticsearch, cleanup func()) {
646 +func prepareElasticsearch(t *testing.T, createES func() *Collector) (collr *Collector, cleanup func()) {
647 t.Helper()
648 srv := prepareElasticsearchEndpoint()
649
650 - es = createES()
651 - es.URL = srv.URL
652 - require.NoError(t, es.Init())
650 + collr = createES()
651 + collr.URL = srv.URL
652 + require.NoError(t, collr.Init())
653
654 - return es, srv.Close
654 + return collr, srv.Close
655 }
656
657 -func prepareElasticsearchValidData(t *testing.T) (es *Elasticsearch, cleanup func()) {
657 +func prepareElasticsearchValidData(t *testing.T) (es *Collector, cleanup func()) {
658 return prepareElasticsearch(t, New)
659 }
660
661 -func prepareElasticsearchInvalidData(t *testing.T) (*Elasticsearch, func()) {
661 +func prepareElasticsearchInvalidData(t *testing.T) (*Collector, func()) {
662 t.Helper()
663 srv := httptest.NewServer(http.HandlerFunc(
664 func(w http.ResponseWriter, r *http.Request) {
665 _, _ = w.Write([]byte("hello and\n goodbye"))
666 }))
667 - es := New()
668 - es.URL = srv.URL
669 - require.NoError(t, es.Init())
667 + collr := New()
668 + collr.URL = srv.URL
669 + require.NoError(t, collr.Init())
670
671 - return es, srv.Close
671 + return collr, srv.Close
672 }
673
674 -func prepareElasticsearch404(t *testing.T) (*Elasticsearch, func()) {
674 +func prepareElasticsearch404(t *testing.T) (*Collector, func()) {
675 t.Helper()
676 srv := httptest.NewServer(http.HandlerFunc(
677 func(w http.ResponseWriter, r *http.Request) {
678 w.WriteHeader(http.StatusNotFound)
679 }))
680 - es := New()
681 - es.URL = srv.URL
682 - require.NoError(t, es.Init())
680 + collr := New()
681 + collr.URL = srv.URL
682 + require.NoError(t, collr.Init())
683
684 - return es, srv.Close
684 + return collr, srv.Close
685 }
686
687 -func prepareElasticsearchConnectionRefused(t *testing.T) (*Elasticsearch, func()) {
687 +func prepareElasticsearchConnectionRefused(t *testing.T) (*Collector, func()) {
688 t.Helper()
689 - es := New()
690 - es.URL = "http://127.0.0.1:38001"
691 - require.NoError(t, es.Init())
689 + collr := New()
690 + collr.URL = "http://127.0.0.1:38001"
691 + require.NoError(t, collr.Init())
692
693 - return es, func() {}
693 + return collr, func() {}
694 }
695
696 func prepareElasticsearchEndpoint() *httptest.Server {
src/go/plugin/go.d/collector/elasticsearch/init.go
+6 -6
@@ -9,19 +9,19 @@ import (
9 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/web"
10 )
11
12 -func (es *Elasticsearch) validateConfig() error {
13 - if es.URL == "" {
12 +func (c *Collector) validateConfig() error {
13 + if c.URL == "" {
14 return errors.New("URL not set")
15 }
16 - if !(es.DoNodeStats || es.DoClusterHealth || es.DoClusterStats || es.DoIndicesStats) {
16 + if !(c.DoNodeStats || c.DoClusterHealth || c.DoClusterStats || c.DoIndicesStats) {
17 return errors.New("all API calls are disabled")
18 }
19 - if _, err := web.NewHTTPRequest(es.RequestConfig); err != nil {
19 + if _, err := web.NewHTTPRequest(c.RequestConfig); err != nil {
20 return err
21 }
22 return nil
23 }
24
25 -func (es *Elasticsearch) initHTTPClient() (*http.Client, error) {
26 - return web.NewHTTPClient(es.ClientConfig)
25 +func (c *Collector) initHTTPClient() (*http.Client, error) {
26 + return web.NewHTTPClient(c.ClientConfig)
27 }
src/go/plugin/go.d/collector/envoy/charts.go
+17 -17
@@ -803,31 +803,31 @@ var (
803 }
804 )
805
806 -func (e *Envoy) addServerCharts(id string, labels labels.Labels) {
807 - e.addCharts(serverChartsTmpl.Copy(), id, labels)
806 +func (c *Collector) addServerCharts(id string, labels labels.Labels) {
807 + c.addCharts(serverChartsTmpl.Copy(), id, labels)
808 }
809
810 -func (e *Envoy) addClusterManagerCharts(id string, labels labels.Labels) {
811 - e.addCharts(clusterManagerChartsTmpl.Copy(), id, labels)
810 +func (c *Collector) addClusterManagerCharts(id string, labels labels.Labels) {
811 + c.addCharts(clusterManagerChartsTmpl.Copy(), id, labels)
812 }
813
814 -func (e *Envoy) addClusterUpstreamCharts(id string, labels labels.Labels) {
815 - e.addCharts(clusterUpstreamChartsTmpl.Copy(), id, labels)
814 +func (c *Collector) addClusterUpstreamCharts(id string, labels labels.Labels) {
815 + c.addCharts(clusterUpstreamChartsTmpl.Copy(), id, labels)
816 }
817
818 -func (e *Envoy) addListenerManagerCharts(id string, labels labels.Labels) {
819 - e.addCharts(listenerManagerChartsTmpl.Copy(), id, labels)
818 +func (c *Collector) addListenerManagerCharts(id string, labels labels.Labels) {
819 + c.addCharts(listenerManagerChartsTmpl.Copy(), id, labels)
820 }
821
822 -func (e *Envoy) addListenerAdminDownstreamCharts(id string, labels labels.Labels) {
823 - e.addCharts(listenerAdminDownstreamChartsTmpl.Copy(), id, labels)
822 +func (c *Collector) addListenerAdminDownstreamCharts(id string, labels labels.Labels) {
823 + c.addCharts(listenerAdminDownstreamChartsTmpl.Copy(), id, labels)
824 }
825
826 -func (e *Envoy) addListenerDownstreamCharts(id string, labels labels.Labels) {
827 - e.addCharts(listenerDownstreamChartsTmpl.Copy(), id, labels)
826 +func (c *Collector) addListenerDownstreamCharts(id string, labels labels.Labels) {
827 + c.addCharts(listenerDownstreamChartsTmpl.Copy(), id, labels)
828 }
829
830 -func (e *Envoy) addCharts(charts *module.Charts, id string, labels labels.Labels) {
830 +func (c *Collector) addCharts(charts *module.Charts, id string, labels labels.Labels) {
831 charts = charts.Copy()
832
833 for _, chart := range *charts {
@@ -848,18 +848,18 @@ func (e *Envoy) addCharts(charts *module.Charts, id string, labels labels.Labels
848 }
849 }
850
851 - if err := e.Charts().Add(*charts...); err != nil {
852 - e.Warning(err)
851 + if err := c.Charts().Add(*charts...); err != nil {
852 + c.Warning(err)
853 }
854 }
855
856 -func (e *Envoy) removeCharts(id string) {
856 +func (c *Collector) removeCharts(id string) {
857 if id == "" {
858 return
859 }
860
861 id = dotReplacer.Replace(id)
862 - for _, chart := range *e.Charts() {
862 + for _, chart := range *c.Charts() {
863 if strings.HasSuffix(chart.ID, id) {
864 chart.MarkRemove()
865 chart.MarkNotCreated()
src/go/plugin/go.d/collector/envoy/collect.go
+89 -89
@@ -15,25 +15,25 @@ import (
15 // Server state: https://www.envoyproxy.io/docs/envoy/latest/api-v3/admin/v3/server_info.proto#enum-admin-v3-serverinfo-state
16 // Listener stats: https://www.envoyproxy.io/docs/envoy/latest/configuration/listeners/stats
17
18 -func (e *Envoy) collect() (map[string]int64, error) {
19 - mfs, err := e.prom.Scrape()
18 +func (c *Collector) collect() (map[string]int64, error) {
19 + mfs, err := c.prom.Scrape()
20 if err != nil {
21 return nil, err
22 }
23
24 mx := make(map[string]int64)
25
26 - e.collectServerStats(mx, mfs)
27 - e.collectClusterManagerStats(mx, mfs)
28 - e.collectClusterUpstreamStats(mx, mfs)
29 - e.collectListenerManagerStats(mx, mfs)
30 - e.collectListenerAdminDownstreamStats(mx, mfs)
31 - e.collectListenerDownstreamStats(mx, mfs)
26 + c.collectServerStats(mx, mfs)
27 + c.collectClusterManagerStats(mx, mfs)
28 + c.collectClusterUpstreamStats(mx, mfs)
29 + c.collectListenerManagerStats(mx, mfs)
30 + c.collectListenerAdminDownstreamStats(mx, mfs)
31 + c.collectListenerDownstreamStats(mx, mfs)
32
33 return mx, nil
34 }
35
36 -func (e *Envoy) collectServerStats(mx map[string]int64, mfs prometheus.MetricFamilies) {
36 +func (c *Collector) collectServerStats(mx map[string]int64, mfs prometheus.MetricFamilies) {
37 seen := make(map[string]bool)
38 for _, n := range []string{
39 "envoy_server_uptime",
@@ -43,21 +43,21 @@ func (e *Envoy) collectServerStats(mx map[string]int64, mfs prometheus.MetricFam
43 "envoy_server_parent_connections",
44 "envoy_server_total_connections",
45 } {
46 - e.collectGauge(mfs, n, func(name string, m prometheus.Metric) {
47 - id := e.joinLabels(m.Labels())
46 + c.collectGauge(mfs, n, func(name string, m prometheus.Metric) {
47 + id := c.joinLabels(m.Labels())
48 seen[id] = true
49
50 - if !e.servers[id] {
51 - e.servers[id] = true
52 - e.addServerCharts(id, m.Labels())
50 + if !c.servers[id] {
51 + c.servers[id] = true
52 + c.addServerCharts(id, m.Labels())
53 }
54
55 mx[join(name, id)] += int64(m.Gauge().Value())
56 })
57 }
58
59 - e.collectGauge(mfs, "envoy_server_state", func(name string, m prometheus.Metric) {
60 - id := e.joinLabels(m.Labels())
59 + c.collectGauge(mfs, "envoy_server_state", func(name string, m prometheus.Metric) {
60 + id := c.joinLabels(m.Labels())
61 for _, v := range []string{"live", "draining", "pre_initializing", "initializing"} {
62 mx[join(name, v, id)] = 0
63 }
@@ -74,15 +74,15 @@ func (e *Envoy) collectServerStats(mx map[string]int64, mfs prometheus.MetricFam
74 }
75 })
76
77 - for id := range e.servers {
77 + for id := range c.servers {
78 if id != "" && !seen[id] {
79 - delete(e.servers, id)
80 - e.removeCharts(id)
79 + delete(c.servers, id)
80 + c.removeCharts(id)
81 }
82 }
83 }
84
85 -func (e *Envoy) collectClusterManagerStats(mx map[string]int64, mfs prometheus.MetricFamilies) {
85 +func (c *Collector) collectClusterManagerStats(mx map[string]int64, mfs prometheus.MetricFamilies) {
86 seen := make(map[string]bool)
87 for _, n := range []string{
88 "envoy_cluster_manager_cluster_added",
@@ -93,13 +93,13 @@ func (e *Envoy) collectClusterManagerStats(mx map[string]int64, mfs prometheus.M
93 "envoy_cluster_manager_update_merge_cancelled",
94 "envoy_cluster_manager_update_out_of_merge_window",
95 } {
96 - e.collectCounter(mfs, n, func(name string, m prometheus.Metric) {
97 - id := e.joinLabels(m.Labels())
96 + c.collectCounter(mfs, n, func(name string, m prometheus.Metric) {
97 + id := c.joinLabels(m.Labels())
98 seen[id] = true
99
100 - if !e.clusterMgrs[id] {
101 - e.clusterMgrs[id] = true
102 - e.addClusterManagerCharts(id, m.Labels())
100 + if !c.clusterMgrs[id] {
101 + c.clusterMgrs[id] = true
102 + c.addClusterManagerCharts(id, m.Labels())
103 }
104
105 mx[join(name, id)] += int64(m.Counter().Value())
@@ -110,21 +110,21 @@ func (e *Envoy) collectClusterManagerStats(mx map[string]int64, mfs prometheus.M
110 "envoy_cluster_manager_active_clusters",
111 "envoy_cluster_manager_warming_clusters",
112 } {
113 - e.collectGauge(mfs, n, func(name string, m prometheus.Metric) {
114 - id := e.joinLabels(m.Labels())
113 + c.collectGauge(mfs, n, func(name string, m prometheus.Metric) {
114 + id := c.joinLabels(m.Labels())
115 mx[join(name, id)] += int64(m.Gauge().Value())
116 })
117 }
118
119 - for id := range e.clusterMgrs {
119 + for id := range c.clusterMgrs {
120 if id != "" && !seen[id] {
121 - delete(e.clusterMgrs, id)
122 - e.removeCharts(id)
121 + delete(c.clusterMgrs, id)
122 + c.removeCharts(id)
123 }
124 }
125 }
126
127 -func (e *Envoy) collectListenerAdminDownstreamStats(mx map[string]int64, mfs prometheus.MetricFamilies) {
127 +func (c *Collector) collectListenerAdminDownstreamStats(mx map[string]int64, mfs prometheus.MetricFamilies) {
128 seen := make(map[string]bool)
129 for _, n := range []string{
130 "envoy_listener_admin_downstream_cx_total",
@@ -137,13 +137,13 @@ func (e *Envoy) collectListenerAdminDownstreamStats(mx map[string]int64, mfs pro
137 "envoy_listener_admin_downstream_listener_filter_remote_close",
138 "envoy_listener_admin_downstream_listener_filter_error",
139 } {
140 - e.collectCounter(mfs, n, func(name string, m prometheus.Metric) {
141 - id := e.joinLabels(m.Labels())
140 + c.collectCounter(mfs, n, func(name string, m prometheus.Metric) {
141 + id := c.joinLabels(m.Labels())
142 seen[id] = true
143
144 - if !e.listenerAdminDownstream[id] {
145 - e.listenerAdminDownstream[id] = true
146 - e.addListenerAdminDownstreamCharts(id, m.Labels())
144 + if !c.listenerAdminDownstream[id] {
145 + c.listenerAdminDownstream[id] = true
146 + c.addListenerAdminDownstreamCharts(id, m.Labels())
147 }
148
149 mx[join(name, id)] += int64(m.Counter().Value())
@@ -153,28 +153,28 @@ func (e *Envoy) collectListenerAdminDownstreamStats(mx map[string]int64, mfs pro
153 "envoy_listener_admin_downstream_cx_active",
154 "envoy_listener_admin_downstream_pre_cx_active",
155 } {
156 - e.collectGauge(mfs, n, func(name string, m prometheus.Metric) {
157 - id := e.joinLabels(m.Labels())
156 + c.collectGauge(mfs, n, func(name string, m prometheus.Metric) {
157 + id := c.joinLabels(m.Labels())
158 seen[id] = true
159
160 - if !e.listenerAdminDownstream[id] {
161 - e.listenerAdminDownstream[id] = true
162 - e.addListenerAdminDownstreamCharts(id, m.Labels())
160 + if !c.listenerAdminDownstream[id] {
161 + c.listenerAdminDownstream[id] = true
162 + c.addListenerAdminDownstreamCharts(id, m.Labels())
163 }
164
165 mx[join(name, id)] += int64(m.Gauge().Value())
166 })
167 }
168
169 - for id := range e.listenerAdminDownstream {
169 + for id := range c.listenerAdminDownstream {
170 if id != "" && !seen[id] {
171 - delete(e.listenerAdminDownstream, id)
172 - e.removeCharts(id)
171 + delete(c.listenerAdminDownstream, id)
172 + c.removeCharts(id)
173 }
174 }
175 }
176
177 -func (e *Envoy) collectListenerDownstreamStats(mx map[string]int64, mfs prometheus.MetricFamilies) {
177 +func (c *Collector) collectListenerDownstreamStats(mx map[string]int64, mfs prometheus.MetricFamilies) {
178 seen := make(map[string]bool)
179 for _, n := range []string{
180 "envoy_listener_downstream_cx_total",
@@ -187,13 +187,13 @@ func (e *Envoy) collectListenerDownstreamStats(mx map[string]int64, mfs promethe
187 "envoy_listener_downstream_listener_filter_remote_close",
188 "envoy_listener_downstream_listener_filter_error",
189 } {
190 - e.collectCounter(mfs, n, func(name string, m prometheus.Metric) {
191 - id := e.joinLabels(m.Labels())
190 + c.collectCounter(mfs, n, func(name string, m prometheus.Metric) {
191 + id := c.joinLabels(m.Labels())
192 seen[id] = true
193
194 - if !e.listenerDownstream[id] {
195 - e.listenerDownstream[id] = true
196 - e.addListenerDownstreamCharts(id, m.Labels())
194 + if !c.listenerDownstream[id] {
195 + c.listenerDownstream[id] = true
196 + c.addListenerDownstreamCharts(id, m.Labels())
197 }
198
199 mx[join(name, id)] += int64(m.Counter().Value())
@@ -203,28 +203,28 @@ func (e *Envoy) collectListenerDownstreamStats(mx map[string]int64, mfs promethe
203 "envoy_listener_downstream_cx_active",
204 "envoy_listener_downstream_pre_cx_active",
205 } {
206 - e.collectGauge(mfs, n, func(name string, m prometheus.Metric) {
207 - id := e.joinLabels(m.Labels())
206 + c.collectGauge(mfs, n, func(name string, m prometheus.Metric) {
207 + id := c.joinLabels(m.Labels())
208 seen[id] = true
209
210 - if !e.listenerDownstream[id] {
211 - e.listenerDownstream[id] = true
212 - e.addListenerDownstreamCharts(id, m.Labels())
210 + if !c.listenerDownstream[id] {
211 + c.listenerDownstream[id] = true
212 + c.addListenerDownstreamCharts(id, m.Labels())
213 }
214
215 mx[join(name, id)] += int64(m.Gauge().Value())
216 })
217 }
218
219 - for id := range e.listenerDownstream {
219 + for id := range c.listenerDownstream {
220 if id != "" && !seen[id] {
221 - delete(e.listenerDownstream, id)
222 - e.removeCharts(id)
221 + delete(c.listenerDownstream, id)
222 + c.removeCharts(id)
223 }
224 }
225 }
226
227 -func (e *Envoy) collectClusterUpstreamStats(mx map[string]int64, mfs prometheus.MetricFamilies) {
227 +func (c *Collector) collectClusterUpstreamStats(mx map[string]int64, mfs prometheus.MetricFamilies) {
228 seen := make(map[string]bool)
229 for _, n := range []string{
230 "envoy_cluster_upstream_cx_total",
@@ -264,13 +264,13 @@ func (e *Envoy) collectClusterUpstreamStats(mx map[string]int64, mfs prometheus.
264 "envoy_cluster_update_empty",
265 "envoy_cluster_update_no_rebuild",
266 } {
267 - e.collectCounter(mfs, n, func(name string, m prometheus.Metric) {
268 - id := e.joinLabels(m.Labels())
267 + c.collectCounter(mfs, n, func(name string, m prometheus.Metric) {
268 + id := c.joinLabels(m.Labels())
269 seen[id] = true
270
271 - if !e.clusterUpstream[id] {
272 - e.clusterUpstream[id] = true
273 - e.addClusterUpstreamCharts(id, m.Labels())
271 + if !c.clusterUpstream[id] {
272 + c.clusterUpstream[id] = true
273 + c.addClusterUpstreamCharts(id, m.Labels())
274 }
275
276 mx[join(name, id)] += int64(m.Counter().Value())
@@ -287,28 +287,28 @@ func (e *Envoy) collectClusterUpstreamStats(mx map[string]int64, mfs prometheus.
287 "envoy_cluster_membership_degraded",
288 "envoy_cluster_membership_excluded",
289 } {
290 - e.collectGauge(mfs, n, func(name string, m prometheus.Metric) {
291 - id := e.joinLabels(m.Labels())
290 + c.collectGauge(mfs, n, func(name string, m prometheus.Metric) {
291 + id := c.joinLabels(m.Labels())
292 seen[id] = true
293
294 - if !e.clusterUpstream[id] {
295 - e.clusterUpstream[id] = true
296 - e.addClusterUpstreamCharts(id, m.Labels())
294 + if !c.clusterUpstream[id] {
295 + c.clusterUpstream[id] = true
296 + c.addClusterUpstreamCharts(id, m.Labels())
297 }
298
299 mx[join(name, id)] += int64(m.Gauge().Value())
300 })
301 }
302
303 - for id := range e.clusterUpstream {
303 + for id := range c.clusterUpstream {
304 if id != "" && !seen[id] {
305 - delete(e.clusterUpstream, id)
306 - e.removeCharts(id)
305 + delete(c.clusterUpstream, id)
306 + c.removeCharts(id)
307 }
308 }
309 }
310
311 -func (e *Envoy) collectListenerManagerStats(mx map[string]int64, mfs prometheus.MetricFamilies) {
311 +func (c *Collector) collectListenerManagerStats(mx map[string]int64, mfs prometheus.MetricFamilies) {
312 seen := make(map[string]bool)
313 for _, n := range []string{
314 "envoy_listener_manager_listener_added",
@@ -319,13 +319,13 @@ func (e *Envoy) collectListenerManagerStats(mx map[string]int64, mfs prometheus.
319 "envoy_listener_manager_listener_create_failure",
320 "envoy_listener_manager_listener_in_place_updated",
321 } {
322 - e.collectCounter(mfs, n, func(name string, m prometheus.Metric) {
323 - id := e.joinLabels(m.Labels())
322 + c.collectCounter(mfs, n, func(name string, m prometheus.Metric) {
323 + id := c.joinLabels(m.Labels())
324 seen[id] = true
325
326 - if !e.listenerMgrs[id] {
327 - e.listenerMgrs[id] = true
328 - e.addListenerManagerCharts(id, m.Labels())
326 + if !c.listenerMgrs[id] {
327 + c.listenerMgrs[id] = true
328 + c.addListenerManagerCharts(id, m.Labels())
329 }
330
331 mx[join(name, id)] += int64(m.Counter().Value())
@@ -337,28 +337,28 @@ func (e *Envoy) collectListenerManagerStats(mx map[string]int64, mfs prometheus.
337 "envoy_listener_manager_total_listeners_active",
338 "envoy_listener_manager_total_listeners_draining",
339 } {
340 - e.collectGauge(mfs, n, func(name string, m prometheus.Metric) {
341 - id := e.joinLabels(m.Labels())
340 + c.collectGauge(mfs, n, func(name string, m prometheus.Metric) {
341 + id := c.joinLabels(m.Labels())
342 seen[id] = true
343
344 - if !e.listenerMgrs[id] {
345 - e.listenerMgrs[id] = true
346 - e.addListenerManagerCharts(id, m.Labels())
344 + if !c.listenerMgrs[id] {
345 + c.listenerMgrs[id] = true
346 + c.addListenerManagerCharts(id, m.Labels())
347 }
348
349 mx[join(name, id)] += int64(m.Gauge().Value())
350 })
351 }
352
353 - for id := range e.listenerMgrs {
353 + for id := range c.listenerMgrs {
354 if id != "" && !seen[id] {
355 - delete(e.listenerMgrs, id)
356 - e.removeCharts(id)
355 + delete(c.listenerMgrs, id)
356 + c.removeCharts(id)
357 }
358 }
359 }
360
361 -func (e *Envoy) collectGauge(mfs prometheus.MetricFamilies, metric string, process func(name string, m prometheus.Metric)) {
361 +func (c *Collector) collectGauge(mfs prometheus.MetricFamilies, metric string, process func(name string, m prometheus.Metric)) {
362 if mf := mfs.GetGauge(metric); mf != nil {
363 for _, m := range mf.Metrics() {
364 process(mf.Name(), m)
@@ -366,7 +366,7 @@ func (e *Envoy) collectGauge(mfs prometheus.MetricFamilies, metric string, proce
366 }
367 }
368
369 -func (e *Envoy) collectCounter(mfs prometheus.MetricFamilies, metric string, process func(name string, m prometheus.Metric)) {
369 +func (c *Collector) collectCounter(mfs prometheus.MetricFamilies, metric string, process func(name string, m prometheus.Metric)) {
370 if mf := mfs.GetCounter(metric); mf != nil {
371 for _, m := range mf.Metrics() {
372 process(mf.Name(), m)
@@ -374,7 +374,7 @@ func (e *Envoy) collectCounter(mfs prometheus.MetricFamilies, metric string, pro
374 }
375 }
376
377 -func (e *Envoy) joinLabels(labels labels.Labels) string {
377 +func (c *Collector) joinLabels(labels labels.Labels) string {
378 var buf strings.Builder
379 first := true
380 for _, lbl := range labels {
src/go/plugin/go.d/collector/envoy/collector.go renamed
+19 -19
@@ -25,8 +25,8 @@ func init() {
25 })
26 }
27
28 -func New() *Envoy {
29 - return &Envoy{
28 +func New() *Collector {
29 + return &Collector{
30 Config: Config{
31 HTTPConfig: web.HTTPConfig{
32 RequestConfig: web.RequestConfig{
@@ -54,7 +54,7 @@ type Config struct {
54 web.HTTPConfig `yaml:",inline" json:""`
55 }
56
57 -type Envoy struct {
57 +type Collector struct {
58 module.Base
59 Config `yaml:",inline" json:""`
60
@@ -70,26 +70,26 @@ type Envoy struct {
70 listenerDownstream map[string]bool
71 }
72
73 -func (e *Envoy) Configuration() any {
74 - return e.Config
73 +func (c *Collector) Configuration() any {
74 + return c.Config
75 }
76
77 -func (e *Envoy) Init() error {
78 - if err := e.validateConfig(); err != nil {
77 +func (c *Collector) Init() error {
78 + if err := c.validateConfig(); err != nil {
79 return fmt.Errorf("config validation: %v", err)
80 }
81
82 - prom, err := e.initPrometheusClient()
82 + prom, err := c.initPrometheusClient()
83 if err != nil {
84 return fmt.Errorf("init Prometheus client: %v", err)
85 }
86 - e.prom = prom
86 + c.prom = prom
87
88 return nil
89 }
90
91 -func (e *Envoy) Check() error {
92 - mx, err := e.collect()
91 +func (c *Collector) Check() error {
92 + mx, err := c.collect()
93 if err != nil {
94 return err
95 }
@@ -100,14 +100,14 @@ func (e *Envoy) Check() error {
100 return nil
101 }
102
103 -func (e *Envoy) Charts() *module.Charts {
104 - return e.charts
103 +func (c *Collector) Charts() *module.Charts {
104 + return c.charts
105 }
106
107 -func (e *Envoy) Collect() map[string]int64 {
108 - mx, err := e.collect()
107 +func (c *Collector) Collect() map[string]int64 {
108 + mx, err := c.collect()
109 if err != nil {
110 - e.Error(err)
110 + c.Error(err)
111 }
112
113 if len(mx) == 0 {
@@ -116,10 +116,10 @@ func (e *Envoy) Collect() map[string]int64 {
116 return mx
117 }
118
119 -func (e *Envoy) Cleanup() {
120 - if e.prom == nil || e.prom.HTTPClient() == nil {
119 +func (c *Collector) Cleanup() {
120 + if c.prom == nil || c.prom.HTTPClient() == nil {
121 return
122 }
123
124 - e.prom.HTTPClient().CloseIdleConnections()
124 + c.prom.HTTPClient().CloseIdleConnections()
125 }
src/go/plugin/go.d/collector/envoy/collector_test.go renamed
+46 -46
@@ -34,11 +34,11 @@ func Test_testDataIsValid(t *testing.T) {
34 }
35 }
36
37 -func TestEnvoy_ConfigurationSerialize(t *testing.T) {
38 - module.TestConfigurationSerialize(t, &Envoy{}, dataConfigJSON, dataConfigYAML)
37 +func TestCollector_ConfigurationSerialize(t *testing.T) {
38 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
39 }
40
41 -func TestEnvoy_Init(t *testing.T) {
41 +func TestCollector_Init(t *testing.T) {
42 tests := map[string]struct {
43 wantFail bool
44 config Config
@@ -59,41 +59,41 @@ func TestEnvoy_Init(t *testing.T) {
59
60 for name, test := range tests {
61 t.Run(name, func(t *testing.T) {
62 - envoy := New()
63 - envoy.Config = test.config
62 + collr := New()
63 + collr.Config = test.config
64
65 if test.wantFail {
66 - assert.Error(t, envoy.Init())
66 + assert.Error(t, collr.Init())
67 } else {
68 - assert.NoError(t, envoy.Init())
68 + assert.NoError(t, collr.Init())
69 }
70 })
71 }
72
73 }
74
75 -func TestEnvoy_Cleanup(t *testing.T) {
76 - envoy := New()
77 - assert.NotPanics(t, envoy.Cleanup)
75 +func TestCollector_Cleanup(t *testing.T) {
76 + collr := New()
77 + assert.NotPanics(t, collr.Cleanup)
78
79 - require.NoError(t, envoy.Init())
80 - assert.NotPanics(t, envoy.Cleanup)
79 + require.NoError(t, collr.Init())
80 + assert.NotPanics(t, collr.Cleanup)
81 }
82
83 -func TestEnvoy_Charts(t *testing.T) {
84 - envoy, cleanup := prepareCaseEnvoyStats()
83 +func TestCollector_Charts(t *testing.T) {
84 + collr, cleanup := prepareCaseEnvoyStats()
85 defer cleanup()
86
87 - require.Empty(t, *envoy.Charts())
87 + require.Empty(t, *collr.Charts())
88
89 - require.NoError(t, envoy.Init())
90 - _ = envoy.Collect()
91 - require.NotEmpty(t, *envoy.Charts())
89 + require.NoError(t, collr.Init())
90 + _ = collr.Collect()
91 + require.NotEmpty(t, *collr.Charts())
92 }
93
94 -func TestEnvoy_Check(t *testing.T) {
94 +func TestCollector_Check(t *testing.T) {
95 tests := map[string]struct {
96 - prepare func() (envoy *Envoy, cleanup func())
96 + prepare func() (collr *Collector, cleanup func())
97 wantFail bool
98 }{
99 "case envoy consul dataplane": {
@@ -116,23 +116,23 @@ func TestEnvoy_Check(t *testing.T) {
116
117 for name, test := range tests {
118 t.Run(name, func(t *testing.T) {
119 - envoy, cleanup := test.prepare()
119 + collr, cleanup := test.prepare()
120 defer cleanup()
121
122 - require.NoError(t, envoy.Init())
122 + require.NoError(t, collr.Init())
123
124 if test.wantFail {
125 - assert.Error(t, envoy.Check())
125 + assert.Error(t, collr.Check())
126 } else {
127 - assert.NoError(t, envoy.Check())
127 + assert.NoError(t, collr.Check())
128 }
129 })
130 }
131 }
132
133 -func TestEnvoy_Collect(t *testing.T) {
133 +func TestCollector_Collect(t *testing.T) {
134 tests := map[string]struct {
135 - prepare func() (envoy *Envoy, cleanup func())
135 + prepare func() (collr *Collector, cleanup func())
136 wantMetrics map[string]int64
137 }{
138 "case envoy consul dataplane": {
@@ -496,59 +496,59 @@ func TestEnvoy_Collect(t *testing.T) {
496
497 for name, test := range tests {
498 t.Run(name, func(t *testing.T) {
499 - envoy, cleanup := test.prepare()
499 + collr, cleanup := test.prepare()
500 defer cleanup()
501
502 - require.NoError(t, envoy.Init())
502 + require.NoError(t, collr.Init())
503
504 - mx := envoy.Collect()
504 + mx := collr.Collect()
505
506 require.Equal(t, test.wantMetrics, mx)
507 - module.TestMetricsHasAllChartsDims(t, envoy.Charts(), mx)
507 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
508 })
509 }
510 }
511
512 -func prepareCaseEnvoyConsulDataplaneStats() (*Envoy, func()) {
512 +func prepareCaseEnvoyConsulDataplaneStats() (*Collector, func()) {
513 srv := httptest.NewServer(http.HandlerFunc(
514 func(w http.ResponseWriter, r *http.Request) {
515 _, _ = w.Write(dataEnvoyConsulDataplane)
516 }))
517 - envoy := New()
518 - envoy.URL = srv.URL
517 + collr := New()
518 + collr.URL = srv.URL
519
520 - return envoy, srv.Close
520 + return collr, srv.Close
521 }
522
523 -func prepareCaseEnvoyStats() (*Envoy, func()) {
523 +func prepareCaseEnvoyStats() (*Collector, func()) {
524 srv := httptest.NewServer(http.HandlerFunc(
525 func(w http.ResponseWriter, r *http.Request) {
526 _, _ = w.Write(dataEnvoy)
527 }))
528 - envoy := New()
529 - envoy.URL = srv.URL
528 + collr := New()
529 + collr.URL = srv.URL
530
531 - return envoy, srv.Close
531 + return collr, srv.Close
532 }
533
534 -func prepareCaseInvalidDataResponse() (*Envoy, func()) {
534 +func prepareCaseInvalidDataResponse() (*Collector, func()) {
535 srv := httptest.NewServer(http.HandlerFunc(
536 func(w http.ResponseWriter, r *http.Request) {
537 _, _ = w.Write([]byte("hello and\n goodbye"))
538 }))
539 - envoy := New()
540 - envoy.URL = srv.URL
539 + collr := New()
540 + collr.URL = srv.URL
541
542 - return envoy, srv.Close
542 + return collr, srv.Close
543 }
544
545 -func prepareCase404() (*Envoy, func()) {
545 +func prepareCase404() (*Collector, func()) {
546 srv := httptest.NewServer(http.HandlerFunc(
547 func(w http.ResponseWriter, r *http.Request) {
548 w.WriteHeader(http.StatusNotFound)
549 }))
550 - envoy := New()
551 - envoy.URL = srv.URL
550 + collr := New()
551 + collr.URL = srv.URL
552
553 - return envoy, srv.Close
553 + return collr, srv.Close
554 }
src/go/plugin/go.d/collector/envoy/init.go
+5 -5
@@ -9,18 +9,18 @@ import (
9 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/web"
10 )
11
12 -func (e *Envoy) validateConfig() error {
13 - if e.URL == "" {
12 +func (c *Collector) validateConfig() error {
13 + if c.URL == "" {
14 return errors.New("url not set")
15 }
16 return nil
17 }
18
19 -func (e *Envoy) initPrometheusClient() (prometheus.Prometheus, error) {
20 - httpClient, err := web.NewHTTPClient(e.ClientConfig)
19 +func (c *Collector) initPrometheusClient() (prometheus.Prometheus, error) {
20 + httpClient, err := web.NewHTTPClient(c.ClientConfig)
21 if err != nil {
22 return nil, err
23 }
24
25 - return prometheus.New(httpClient, e.RequestConfig), nil
25 + return prometheus.New(httpClient, c.RequestConfig), nil
26 }
src/go/plugin/go.d/collector/exim/collect.go
+2 -2
@@ -10,8 +10,8 @@ import (
10 "strings"
11 )
12
13 -func (e *Exim) collect() (map[string]int64, error) {
14 - resp, err := e.exec.countMessagesInQueue()
13 +func (c *Collector) collect() (map[string]int64, error) {
14 + resp, err := c.exec.countMessagesInQueue()
15 if err != nil {
16 return nil, err
17 }
src/go/plugin/go.d/collector/exim/collector.go renamed
+16 -16
@@ -26,8 +26,8 @@ func init() {
26 })
27 }
28
29 -func New() *Exim {
30 - return &Exim{
29 +func New() *Collector {
30 + return &Collector{
31 Config: Config{
32 Timeout: confopt.Duration(time.Second * 2),
33 },
@@ -40,7 +40,7 @@ type Config struct {
40 Timeout confopt.Duration `yaml:"timeout,omitempty" json:"timeout"`
41 }
42
43 -type Exim struct {
43 +type Collector struct {
44 module.Base
45 Config `yaml:",inline" json:""`
46
@@ -49,22 +49,22 @@ type Exim struct {
49 exec eximBinary
50 }
51
52 -func (e *Exim) Configuration() any {
53 - return e.Config
52 +func (c *Collector) Configuration() any {
53 + return c.Config
54 }
55
56 -func (e *Exim) Init() error {
57 - exim, err := e.initEximExec()
56 +func (c *Collector) Init() error {
57 + exim, err := c.initEximExec()
58 if err != nil {
59 return fmt.Errorf("exim exec initialization: %v", err)
60 }
61 - e.exec = exim
61 + c.exec = exim
62
63 return nil
64 }
65
66 -func (e *Exim) Check() error {
67 - mx, err := e.collect()
66 +func (c *Collector) Check() error {
67 + mx, err := c.collect()
68 if err != nil {
69 return err
70 }
@@ -76,14 +76,14 @@ func (e *Exim) Check() error {
76 return nil
77 }
78
79 -func (e *Exim) Charts() *module.Charts {
80 - return e.charts
79 +func (c *Collector) Charts() *module.Charts {
80 + return c.charts
81 }
82
83 -func (e *Exim) Collect() map[string]int64 {
84 - mx, err := e.collect()
83 +func (c *Collector) Collect() map[string]int64 {
84 + mx, err := c.collect()
85 if err != nil {
86 - e.Error(err)
86 + c.Error(err)
87 }
88
89 if len(mx) == 0 {
@@ -93,4 +93,4 @@ func (e *Exim) Collect() map[string]int64 {
93 return mx
94 }
95
96 -func (e *Exim) Cleanup() {}
96 +func (c *Collector) Cleanup() {}
src/go/plugin/go.d/collector/exim/collector_test.go renamed
+34 -34
@@ -28,11 +28,11 @@ func Test_testDataIsValid(t *testing.T) {
28 }
29 }
30
31 -func TestExim_Configuration(t *testing.T) {
32 - module.TestConfigurationSerialize(t, &Exim{}, dataConfigJSON, dataConfigYAML)
31 +func TestCollector_Configuration(t *testing.T) {
32 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
33 }
34
35 -func TestExim_Init(t *testing.T) {
35 +func TestCollector_Init(t *testing.T) {
36 tests := map[string]struct {
37 config Config
38 wantFail bool
@@ -45,59 +45,59 @@ func TestExim_Init(t *testing.T) {
45
46 for name, test := range tests {
47 t.Run(name, func(t *testing.T) {
48 - exim := New()
49 - exim.Config = test.config
48 + collr := New()
49 + collr.Config = test.config
50
51 if test.wantFail {
52 - assert.Error(t, exim.Init())
52 + assert.Error(t, collr.Init())
53 } else {
54 - assert.NoError(t, exim.Init())
54 + assert.NoError(t, collr.Init())
55 }
56 })
57 }
58 }
59
60 -func TestExim_Cleanup(t *testing.T) {
60 +func TestCollector_Cleanup(t *testing.T) {
61 tests := map[string]struct {
62 - prepare func() *Exim
62 + prepare func() *Collector
63 }{
64 "not initialized exec": {
65 - prepare: func() *Exim {
65 + prepare: func() *Collector {
66 return New()
67 },
68 },
69 "after check": {
70 - prepare: func() *Exim {
71 - exim := New()
72 - exim.exec = prepareMockOK()
73 - _ = exim.Check()
74 - return exim
70 + prepare: func() *Collector {
71 + collr := New()
72 + collr.exec = prepareMockOK()
73 + _ = collr.Check()
74 + return collr
75 },
76 },
77 "after collect": {
78 - prepare: func() *Exim {
79 - exim := New()
80 - exim.exec = prepareMockOK()
81 - _ = exim.Collect()
82 - return exim
78 + prepare: func() *Collector {
79 + collr := New()
80 + collr.exec = prepareMockOK()
81 + _ = collr.Collect()
82 + return collr
83 },
84 },
85 }
86
87 for name, test := range tests {
88 t.Run(name, func(t *testing.T) {
89 - exim := test.prepare()
89 + collr := test.prepare()
90
91 - assert.NotPanics(t, exim.Cleanup)
91 + assert.NotPanics(t, collr.Cleanup)
92 })
93 }
94 }
95
96 -func TestEximCharts(t *testing.T) {
96 +func TestCollectorCharts(t *testing.T) {
97 assert.NotNil(t, New().Charts())
98 }
99
100 -func TestExim_Check(t *testing.T) {
100 +func TestCollector_Check(t *testing.T) {
101 tests := map[string]struct {
102 prepareMock func() *mockEximExec
103 wantFail bool
@@ -122,20 +122,20 @@ func TestExim_Check(t *testing.T) {
122
123 for name, test := range tests {
124 t.Run(name, func(t *testing.T) {
125 - exim := New()
125 + collr := New()
126 mock := test.prepareMock()
127 - exim.exec = mock
127 + collr.exec = mock
128
129 if test.wantFail {
130 - assert.Error(t, exim.Check())
130 + assert.Error(t, collr.Check())
131 } else {
132 - assert.NoError(t, exim.Check())
132 + assert.NoError(t, collr.Check())
133 }
134 })
135 }
136 }
137
138 -func TestExim_Collect(t *testing.T) {
138 +func TestCollector_Collect(t *testing.T) {
139 tests := map[string]struct {
140 prepareMock func() *mockEximExec
141 wantMetrics map[string]int64
@@ -162,17 +162,17 @@ func TestExim_Collect(t *testing.T) {
162
163 for name, test := range tests {
164 t.Run(name, func(t *testing.T) {
165 - exim := New()
165 + collr := New()
166 mock := test.prepareMock()
167 - exim.exec = mock
167 + collr.exec = mock
168
169 - mx := exim.Collect()
169 + mx := collr.Collect()
170
171 assert.Equal(t, test.wantMetrics, mx)
172
173 if len(test.wantMetrics) > 0 {
174 - assert.Len(t, *exim.Charts(), len(charts))
175 - module.TestMetricsHasAllChartsDims(t, exim.Charts(), mx)
174 + assert.Len(t, *collr.Charts(), len(charts))
175 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
176 }
177 })
178 }
src/go/plugin/go.d/collector/exim/init.go
+2 -2
@@ -10,14 +10,14 @@ import (
10 "github.com/netdata/netdata/go/plugins/pkg/executable"
11 )
12
13 -func (e *Exim) initEximExec() (eximBinary, error) {
13 +func (c *Collector) initEximExec() (eximBinary, error) {
14 ndsudoPath := filepath.Join(executable.Directory, "ndsudo")
15 if _, err := os.Stat(ndsudoPath); err != nil {
16 return nil, fmt.Errorf("ndsudo executable not found: %v", err)
17
18 }
19
20 - exim := newEximExec(ndsudoPath, e.Timeout.Duration(), e.Logger)
20 + exim := newEximExec(ndsudoPath, c.Timeout.Duration(), c.Logger)
21
22 return exim, nil
23 }
src/go/plugin/go.d/collector/fail2ban/charts.go
+5 -5
@@ -48,7 +48,7 @@ var (
48 }
49 )
50
51 -func (f *Fail2Ban) addJailCharts(jail string) {
51 +func (c *Collector) addJailCharts(jail string) {
52 charts := jailChartsTmpl.Copy()
53
54 for _, chart := range *charts {
@@ -61,14 +61,14 @@ func (f *Fail2Ban) addJailCharts(jail string) {
61 }
62 }
63
64 - if err := f.Charts().Add(*charts...); err != nil {
65 - f.Warning(err)
64 + if err := c.Charts().Add(*charts...); err != nil {
65 + c.Warning(err)
66 }
67 }
68
69 -func (f *Fail2Ban) removeJailCharts(jail string) {
69 +func (c *Collector) removeJailCharts(jail string) {
70 px := fmt.Sprintf("jail_%s_", jail)
71 - for _, chart := range *f.Charts() {
71 + for _, chart := range *c.Charts() {
72 if strings.HasPrefix(chart.ID, px) {
73 chart.MarkRemove()
74 chart.MarkNotCreated()
src/go/plugin/go.d/collector/fail2ban/collect.go
+21 -21
@@ -14,30 +14,30 @@ import (
14 "time"
15 )
16
17 -func (f *Fail2Ban) collect() (map[string]int64, error) {
17 +func (c *Collector) collect() (map[string]int64, error) {
18 now := time.Now()
19
20 - if now.Sub(f.lastDiscoverTime) > f.discoverEvery || f.forceDiscover {
21 - jails, err := f.discoverJails()
20 + if now.Sub(c.lastDiscoverTime) > c.discoverEvery || c.forceDiscover {
21 + jails, err := c.discoverJails()
22 if err != nil {
23 return nil, err
24 }
25 - f.jails = jails
26 - f.lastDiscoverTime = now
27 - f.forceDiscover = false
25 + c.jails = jails
26 + c.lastDiscoverTime = now
27 + c.forceDiscover = false
28 }
29
30 mx := make(map[string]int64)
31
32 - if err := f.collectJails(mx); err != nil {
32 + if err := c.collectJails(mx); err != nil {
33 return nil, err
34 }
35
36 return mx, nil
37 }
38
39 -func (f *Fail2Ban) discoverJails() ([]string, error) {
40 - bs, err := f.exec.status()
39 +func (c *Collector) discoverJails() ([]string, error) {
40 + bs, err := c.exec.status()
41 if err != nil {
42 return nil, err
43 }
@@ -51,20 +51,20 @@ func (f *Fail2Ban) discoverJails() ([]string, error) {
51 return nil, errors.New("no jails found")
52 }
53
54 - f.Debugf("discovered %d jails: %v", len(jails), jails)
54 + c.Debugf("discovered %d jails: %v", len(jails), jails)
55
56 return jails, nil
57 }
58
59 -func (f *Fail2Ban) collectJails(mx map[string]int64) error {
59 +func (c *Collector) collectJails(mx map[string]int64) error {
60 seen := make(map[string]bool)
61
62 - for _, jail := range f.jails {
63 - f.Debugf("querying status for jail '%s'", jail)
64 - bs, err := f.exec.jailStatus(jail)
62 + for _, jail := range c.jails {
63 + c.Debugf("querying status for jail '%s'", jail)
64 + bs, err := c.exec.jailStatus(jail)
65 if err != nil {
66 if errors.Is(err, errJailNotExist) {
67 - f.forceDiscover = true
67 + c.forceDiscover = true
68 continue
69 }
70 return err
@@ -75,9 +75,9 @@ func (f *Fail2Ban) collectJails(mx map[string]int64) error {
75 return err
76 }
77
78 - if !f.seenJails[jail] {
79 - f.seenJails[jail] = true
80 - f.addJailCharts(jail)
78 + if !c.seenJails[jail] {
79 + c.seenJails[jail] = true
80 + c.addJailCharts(jail)
81 }
82 seen[jail] = true
83
@@ -87,10 +87,10 @@ func (f *Fail2Ban) collectJails(mx map[string]int64) error {
87 mx[px+"currently_banned"] = banned
88 }
89
90 - for jail := range f.seenJails {
90 + for jail := range c.seenJails {
91 if !seen[jail] {
92 - delete(f.seenJails, jail)
93 - f.removeJailCharts(jail)
92 + delete(c.seenJails, jail)
93 + c.removeJailCharts(jail)
94 }
95 }
96
src/go/plugin/go.d/collector/fail2ban/collector.go renamed
+26 -32
@@ -28,8 +28,8 @@ func init() {
28 })
29 }
30
31 -func New() *Fail2Ban {
32 - return &Fail2Ban{
31 +func New() *Collector {
32 + return &Collector{
33 Config: Config{
34 Timeout: confopt.Duration(time.Second * 2),
35 },
@@ -44,44 +44,38 @@ type Config struct {
44 Timeout confopt.Duration `yaml:"timeout,omitempty" json:"timeout"`
45 }
46
47 -type (
48 - Fail2Ban struct {
49 - module.Base
50 - Config `yaml:",inline" json:""`
47 +type Collector struct {
48 + module.Base
49 + Config `yaml:",inline" json:""`
50
52 - charts *module.Charts
51 + charts *module.Charts
52
54 - exec fail2banClientCli
53 + exec fail2banClientCli
54
56 - discoverEvery time.Duration
57 - lastDiscoverTime time.Time
58 - forceDiscover bool
59 - jails []string
55 + discoverEvery time.Duration
56 + lastDiscoverTime time.Time
57 + forceDiscover bool
58 + jails []string
59
61 - seenJails map[string]bool
62 - }
63 - fail2banClientCli interface {
64 - status() ([]byte, error)
65 - jailStatus(s string) ([]byte, error)
66 - }
67 -)
60 + seenJails map[string]bool
61 +}
62
69 -func (f *Fail2Ban) Configuration() any {
70 - return f.Config
63 +func (c *Collector) Configuration() any {
64 + return c.Config
65 }
66
73 -func (f *Fail2Ban) Init() error {
74 - f2bClientExec, err := f.initFail2banClientCliExec()
67 +func (c *Collector) Init() error {
68 + f2bClientExec, err := c.initFail2banClientCliExec()
69 if err != nil {
70 return fmt.Errorf("fail2ban-client exec initialization: %v", err)
71 }
78 - f.exec = f2bClientExec
72 + c.exec = f2bClientExec
73
74 return nil
75 }
76
83 -func (f *Fail2Ban) Check() error {
84 - mx, err := f.collect()
77 +func (c *Collector) Check() error {
78 + mx, err := c.collect()
79 if err != nil {
80 return err
81 }
@@ -93,14 +87,14 @@ func (f *Fail2Ban) Check() error {
87 return nil
88 }
89
96 -func (f *Fail2Ban) Charts() *module.Charts {
97 - return f.charts
90 +func (c *Collector) Charts() *module.Charts {
91 + return c.charts
92 }
93
100 -func (f *Fail2Ban) Collect() map[string]int64 {
101 - mx, err := f.collect()
94 +func (c *Collector) Collect() map[string]int64 {
95 + mx, err := c.collect()
96 if err != nil {
103 - f.Error(err)
97 + c.Error(err)
98 }
99
100 if len(mx) == 0 {
@@ -110,4 +104,4 @@ func (f *Fail2Ban) Collect() map[string]int64 {
104 return mx
105 }
106
113 -func (f *Fail2Ban) Cleanup() {}
107 +func (c *Collector) Cleanup() {}
src/go/plugin/go.d/collector/fail2ban/collector_test.go renamed
+34 -34
@@ -36,11 +36,11 @@ func Test_testDataIsValid(t *testing.T) {
36 }
37 }
38
39 -func TestFail2Ban_Configuration(t *testing.T) {
40 - module.TestConfigurationSerialize(t, &Fail2Ban{}, dataConfigJSON, dataConfigYAML)
39 +func TestCollector_Configuration(t *testing.T) {
40 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
41 }
42
43 -func TestFail2Ban_Init(t *testing.T) {
43 +func TestCollector_Init(t *testing.T) {
44 tests := map[string]struct {
45 config Config
46 wantFail bool
@@ -53,59 +53,59 @@ func TestFail2Ban_Init(t *testing.T) {
53
54 for name, test := range tests {
55 t.Run(name, func(t *testing.T) {
56 - f2b := New()
57 - f2b.Config = test.config
56 + collr := New()
57 + collr.Config = test.config
58
59 if test.wantFail {
60 - assert.Error(t, f2b.Init())
60 + assert.Error(t, collr.Init())
61 } else {
62 - assert.NoError(t, f2b.Init())
62 + assert.NoError(t, collr.Init())
63 }
64 })
65 }
66 }
67
68 -func TestFail2Ban_Cleanup(t *testing.T) {
68 +func TestCollector_Cleanup(t *testing.T) {
69 tests := map[string]struct {
70 - prepare func() *Fail2Ban
70 + prepare func() *Collector
71 }{
72 "not initialized exec": {
73 - prepare: func() *Fail2Ban {
73 + prepare: func() *Collector {
74 return New()
75 },
76 },
77 "after check": {
78 - prepare: func() *Fail2Ban {
79 - f2b := New()
80 - f2b.exec = prepareMockOk()
81 - _ = f2b.Check()
82 - return f2b
78 + prepare: func() *Collector {
79 + collr := New()
80 + collr.exec = prepareMockOk()
81 + _ = collr.Check()
82 + return collr
83 },
84 },
85 "after collect": {
86 - prepare: func() *Fail2Ban {
87 - f2b := New()
88 - f2b.exec = prepareMockOk()
89 - _ = f2b.Collect()
90 - return f2b
86 + prepare: func() *Collector {
87 + collr := New()
88 + collr.exec = prepareMockOk()
89 + _ = collr.Collect()
90 + return collr
91 },
92 },
93 }
94
95 for name, test := range tests {
96 t.Run(name, func(t *testing.T) {
97 - f2b := test.prepare()
97 + collr := test.prepare()
98
99 - assert.NotPanics(t, f2b.Cleanup)
99 + assert.NotPanics(t, collr.Cleanup)
100 })
101 }
102 }
103
104 -func TestFail2Ban_Charts(t *testing.T) {
104 +func TestCollector_Charts(t *testing.T) {
105 assert.NotNil(t, New().Charts())
106 }
107
108 -func TestFail2Ban_Check(t *testing.T) {
108 +func TestCollector_Check(t *testing.T) {
109 tests := map[string]struct {
110 prepareMock func() *mockFail2BanClientCliExec
111 wantFail bool
@@ -126,20 +126,20 @@ func TestFail2Ban_Check(t *testing.T) {
126
127 for name, test := range tests {
128 t.Run(name, func(t *testing.T) {
129 - f2b := New()
129 + collr := New()
130 mock := test.prepareMock()
131 - f2b.exec = mock
131 + collr.exec = mock
132
133 if test.wantFail {
134 - assert.Error(t, f2b.Check())
134 + assert.Error(t, collr.Check())
135 } else {
136 - assert.NoError(t, f2b.Check())
136 + assert.NoError(t, collr.Check())
137 }
138 })
139 }
140 }
141
142 -func TestFail2Ban_Collect(t *testing.T) {
142 +func TestCollector_Collect(t *testing.T) {
143 tests := map[string]struct {
144 prepareMock func() *mockFail2BanClientCliExec
145 wantMetrics map[string]int64
@@ -165,18 +165,18 @@ func TestFail2Ban_Collect(t *testing.T) {
165
166 for name, test := range tests {
167 t.Run(name, func(t *testing.T) {
168 - f2b := New()
168 + collr := New()
169 mock := test.prepareMock()
170 - f2b.exec = mock
170 + collr.exec = mock
171
172 - mx := f2b.Collect()
172 + mx := collr.Collect()
173
174 assert.Equal(t, test.wantMetrics, mx)
175
176 if len(test.wantMetrics) > 0 {
177 - assert.Len(t, *f2b.Charts(), len(jailChartsTmpl)*2, "wantCharts")
177 + assert.Len(t, *collr.Charts(), len(jailChartsTmpl)*2, "wantCharts")
178
179 - module.TestMetricsHasAllChartsDims(t, f2b.Charts(), mx)
179 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
180 }
181 })
182 }
src/go/plugin/go.d/collector/fail2ban/exec.go
+5
@@ -20,6 +20,11 @@ var errJailNotExist = errors.New("jail not exist")
20
21 const socketPathInDocker = "/host/var/run/fail2ban/fail2ban.sock"
22
23 +type fail2banClientCli interface {
24 + status() ([]byte, error)
25 + jailStatus(s string) ([]byte, error)
26 +}
27 +
28 func newFail2BanClientCliExec(ndsudoPath string, timeout time.Duration, log *logger.Logger) *fail2banClientCliExec {
29 _, err := os.Stat("/host/var/run")
30
src/go/plugin/go.d/collector/fail2ban/init.go
+2 -2
@@ -12,14 +12,14 @@ import (
12 "github.com/netdata/netdata/go/plugins/pkg/executable"
13 )
14
15 -func (f *Fail2Ban) initFail2banClientCliExec() (fail2banClientCli, error) {
15 +func (c *Collector) initFail2banClientCliExec() (fail2banClientCli, error) {
16 ndsudoPath := filepath.Join(executable.Directory, "ndsudo")
17 if _, err := os.Stat(ndsudoPath); err != nil {
18 return nil, fmt.Errorf("ndsudo executable not found: %v", err)
19
20 }
21
22 - f2bClientExec := newFail2BanClientCliExec(ndsudoPath, f.Timeout.Duration(), f.Logger)
22 + f2bClientExec := newFail2BanClientCliExec(ndsudoPath, c.Timeout.Duration(), c.Logger)
23
24 return f2bClientExec, nil
25 }
src/go/plugin/go.d/collector/filecheck/charts.go
+34 -34
@@ -107,84 +107,84 @@ var (
107 }
108 )
109
110 -func (f *Filecheck) updateFileCharts(infos []*statInfo) {
110 +func (c *Collector) updateFileCharts(infos []*statInfo) {
111 seen := make(map[string]bool)
112
113 for _, info := range infos {
114 seen[info.path] = true
115
116 - sf := f.seenFiles.getp(info.path)
116 + sf := c.seenFiles.getp(info.path)
117
118 if !sf.hasExistenceCharts {
119 sf.hasExistenceCharts = true
120 - f.addFileCharts(info.path,
120 + c.addFileCharts(info.path,
121 fileExistenceStatusChartTmpl.Copy(),
122 )
123 }
124
125 if !sf.hasOtherCharts && info.fi != nil {
126 sf.hasOtherCharts = true
127 - f.addFileCharts(info.path,
127 + c.addFileCharts(info.path,
128 fileModificationTimeAgoChartTmpl.Copy(),
129 fileSizeChartTmpl.Copy(),
130 )
131
132 } else if sf.hasOtherCharts && info.fi == nil {
133 sf.hasOtherCharts = false
134 - f.removeFileOtherCharts(info.path)
134 + c.removeFileOtherCharts(info.path)
135 }
136 }
137
138 - for path := range f.seenFiles.items {
138 + for path := range c.seenFiles.items {
139 if !seen[path] {
140 - delete(f.seenFiles.items, path)
141 - f.removeFileAllCharts(path)
140 + delete(c.seenFiles.items, path)
141 + c.removeFileAllCharts(path)
142 }
143 }
144 }
145
146 -func (f *Filecheck) updateDirCharts(infos []*statInfo) {
146 +func (c *Collector) updateDirCharts(infos []*statInfo) {
147 seen := make(map[string]bool)
148
149 for _, info := range infos {
150 seen[info.path] = true
151
152 - sd := f.seenDirs.getp(info.path)
152 + sd := c.seenDirs.getp(info.path)
153
154 if !sd.hasExistenceCharts {
155 sd.hasExistenceCharts = true
156 - f.addDirCharts(info.path,
156 + c.addDirCharts(info.path,
157 dirExistenceStatusChartTmpl.Copy(),
158 )
159 }
160
161 if !sd.hasOtherCharts && info.fi != nil {
162 sd.hasOtherCharts = true
163 - f.addDirCharts(info.path,
163 + c.addDirCharts(info.path,
164 dirModificationTimeAgoChartTmpl.Copy(),
165 dirFilesCountChartTmpl.Copy(),
166 )
167 - if f.Dirs.CollectDirSize {
168 - f.addDirCharts(info.path,
167 + if c.Dirs.CollectDirSize {
168 + c.addDirCharts(info.path,
169 dirSizeChartTmpl.Copy(),
170 )
171 }
172
173 } else if sd.hasOtherCharts && info.fi == nil {
174 sd.hasOtherCharts = false
175 - f.removeDirOtherCharts(info.path)
175 + c.removeDirOtherCharts(info.path)
176 }
177 }
178
179 - for path := range f.seenDirs.items {
179 + for path := range c.seenDirs.items {
180 if !seen[path] {
181 - delete(f.seenDirs.items, path)
182 - f.removeDirAllCharts(path)
181 + delete(c.seenDirs.items, path)
182 + c.removeDirAllCharts(path)
183 }
184 }
185 }
186
187 -func (f *Filecheck) addFileCharts(filePath string, chartsTmpl ...*module.Chart) {
187 +func (c *Collector) addFileCharts(filePath string, chartsTmpl ...*module.Chart) {
188 cs := append(module.Charts{}, chartsTmpl...)
189 charts := cs.Copy()
190
@@ -198,12 +198,12 @@ func (f *Filecheck) addFileCharts(filePath string, chartsTmpl ...*module.Chart)
198 }
199 }
200
201 - if err := f.Charts().Add(*charts...); err != nil {
202 - f.Warning(err)
201 + if err := c.Charts().Add(*charts...); err != nil {
202 + c.Warning(err)
203 }
204 }
205
206 -func (f *Filecheck) addDirCharts(dirPath string, chartsTmpl ...*module.Chart) {
206 +func (c *Collector) addDirCharts(dirPath string, chartsTmpl ...*module.Chart) {
207 cs := append(module.Charts{}, chartsTmpl...)
208 charts := cs.Copy()
209
@@ -217,41 +217,41 @@ func (f *Filecheck) addDirCharts(dirPath string, chartsTmpl ...*module.Chart) {
217 }
218 }
219
220 - if err := f.Charts().Add(*charts...); err != nil {
221 - f.Warning(err)
220 + if err := c.Charts().Add(*charts...); err != nil {
221 + c.Warning(err)
222 }
223 }
224
225 -func (f *Filecheck) removeFileAllCharts(filePath string) {
225 +func (c *Collector) removeFileAllCharts(filePath string) {
226 px := fmt.Sprintf("file_%s_", cleanPath(filePath))
227 - f.removeCharts(func(id string) bool {
227 + c.removeCharts(func(id string) bool {
228 return strings.HasPrefix(id, px)
229 })
230 }
231
232 -func (f *Filecheck) removeFileOtherCharts(filePath string) {
232 +func (c *Collector) removeFileOtherCharts(filePath string) {
233 px := fmt.Sprintf("file_%s_", cleanPath(filePath))
234 - f.removeCharts(func(id string) bool {
234 + c.removeCharts(func(id string) bool {
235 return strings.HasPrefix(id, px) && !strings.HasSuffix(id, "existence_status")
236 })
237 }
238
239 -func (f *Filecheck) removeDirAllCharts(dirPath string) {
239 +func (c *Collector) removeDirAllCharts(dirPath string) {
240 px := fmt.Sprintf("dir_%s_", cleanPath(dirPath))
241 - f.removeCharts(func(id string) bool {
241 + c.removeCharts(func(id string) bool {
242 return strings.HasPrefix(id, px)
243 })
244 }
245
246 -func (f *Filecheck) removeDirOtherCharts(dirPath string) {
246 +func (c *Collector) removeDirOtherCharts(dirPath string) {
247 px := fmt.Sprintf("dir_%s_", cleanPath(dirPath))
248 - f.removeCharts(func(id string) bool {
248 + c.removeCharts(func(id string) bool {
249 return strings.HasPrefix(id, px) && !strings.HasSuffix(id, "existence_status")
250 })
251 }
252
253 -func (f *Filecheck) removeCharts(match func(id string) bool) {
254 - for _, chart := range *f.Charts() {
253 +func (c *Collector) removeCharts(match func(id string) bool) {
254 + for _, chart := range *c.Charts() {
255 if match(chart.ID) {
256 chart.MarkRemove()
257 chart.MarkNotCreated()
src/go/plugin/go.d/collector/filecheck/collect.go
+3 -3
@@ -8,11 +8,11 @@ import (
8 "os"
9 )
10
11 -func (f *Filecheck) collect() (map[string]int64, error) {
11 +func (c *Collector) collect() (map[string]int64, error) {
12 mx := make(map[string]int64)
13
14 - f.collectFiles(mx)
15 - f.collectDirs(mx)
14 + c.collectFiles(mx)
15 + c.collectDirs(mx)
16
17 return mx, nil
18 }
src/go/plugin/go.d/collector/filecheck/collect_dirs.go
+14 -14
@@ -9,27 +9,27 @@ import (
9 "time"
10 )
11
12 -func (f *Filecheck) collectDirs(mx map[string]int64) {
12 +func (c *Collector) collectDirs(mx map[string]int64) {
13 now := time.Now()
14
15 - if f.isTimeToDiscoverDirs(now) {
16 - f.lastDiscDirsTime = now
17 - f.curDirs = f.discoveryDirs()
15 + if c.isTimeToDiscoverDirs(now) {
16 + c.lastDiscDirsTime = now
17 + c.curDirs = c.discoveryDirs()
18 }
19
20 var infos []*statInfo
21
22 - for _, dir := range f.curDirs {
22 + for _, dir := range c.curDirs {
23 si := getStatInfo(dir)
24 infos = append(infos, si)
25
26 - f.collectDir(mx, si, now)
26 + c.collectDir(mx, si, now)
27 }
28
29 - f.updateDirCharts(infos)
29 + c.updateDirCharts(infos)
30 }
31
32 -func (f *Filecheck) collectDir(mx map[string]int64, si *statInfo, now time.Time) {
32 +func (c *Collector) collectDir(mx map[string]int64, si *statInfo, now time.Time) {
33 px := fmt.Sprintf("dir_%s_", si.path)
34
35 mx[px+"existence_status_exist"] = 0
@@ -49,21 +49,21 @@ func (f *Filecheck) collectDir(mx map[string]int64, si *statInfo, now time.Time)
49 if v, err := calcFilesInDir(si.path); err == nil {
50 mx[px+"files_count"] = v
51 }
52 - if f.Dirs.CollectDirSize {
52 + if c.Dirs.CollectDirSize {
53 if v, err := calcDirSize(si.path); err == nil {
54 mx[px+"size_bytes"] = v
55 }
56 }
57 }
58
59 -func (f *Filecheck) discoveryDirs() (dirs []string) {
60 - return discoverFilesOrDirs(f.Dirs.Include, func(v string, fi os.FileInfo) bool {
61 - return fi.IsDir() && !f.dirsFilter.MatchString(v)
59 +func (c *Collector) discoveryDirs() (dirs []string) {
60 + return discoverFilesOrDirs(c.Dirs.Include, func(v string, fi os.FileInfo) bool {
61 + return fi.IsDir() && !c.dirsFilter.MatchString(v)
62 })
63 }
64
65 -func (f *Filecheck) isTimeToDiscoverDirs(now time.Time) bool {
66 - return now.After(f.lastDiscDirsTime.Add(f.DiscoveryEvery.Duration()))
65 +func (c *Collector) isTimeToDiscoverDirs(now time.Time) bool {
66 + return now.After(c.lastDiscDirsTime.Add(c.DiscoveryEvery.Duration()))
67 }
68
69 func calcFilesInDir(dirPath string) (int64, error) {
src/go/plugin/go.d/collector/filecheck/collect_files.go
+13 -13
@@ -8,28 +8,28 @@ import (
8 "time"
9 )
10
11 -func (f *Filecheck) collectFiles(mx map[string]int64) {
11 +func (c *Collector) collectFiles(mx map[string]int64) {
12 now := time.Now()
13
14 - if f.isTimeToDiscoverFiles(now) {
15 - f.lastDiscFilesTime = now
16 - f.curFiles = f.discoverFiles()
14 + if c.isTimeToDiscoverFiles(now) {
15 + c.lastDiscFilesTime = now
16 + c.curFiles = c.discoverFiles()
17 }
18
19 var infos []*statInfo
20
21 - for _, file := range f.curFiles {
21 + for _, file := range c.curFiles {
22 si := getStatInfo(file)
23
24 infos = append(infos, si)
25
26 - f.collectFile(mx, si, now)
26 + c.collectFile(mx, si, now)
27 }
28
29 - f.updateFileCharts(infos)
29 + c.updateFileCharts(infos)
30 }
31
32 -func (f *Filecheck) collectFile(mx map[string]int64, si *statInfo, now time.Time) {
32 +func (c *Collector) collectFile(mx map[string]int64, si *statInfo, now time.Time) {
33 px := fmt.Sprintf("file_%s_", si.path)
34
35 mx[px+"existence_status_exist"] = 0
@@ -48,12 +48,12 @@ func (f *Filecheck) collectFile(mx map[string]int64, si *statInfo, now time.Time
48 mx[px+"size_bytes"] = si.fi.Size()
49 }
50
51 -func (f *Filecheck) discoverFiles() (files []string) {
52 - return discoverFilesOrDirs(f.Files.Include, func(absPath string, fi os.FileInfo) bool {
53 - return fi.Mode().IsRegular() && !f.filesFilter.MatchString(absPath)
51 +func (c *Collector) discoverFiles() (files []string) {
52 + return discoverFilesOrDirs(c.Files.Include, func(absPath string, fi os.FileInfo) bool {
53 + return fi.Mode().IsRegular() && !c.filesFilter.MatchString(absPath)
54 })
55 }
56
57 -func (f *Filecheck) isTimeToDiscoverFiles(now time.Time) bool {
58 - return now.After(f.lastDiscFilesTime.Add(f.DiscoveryEvery.Duration()))
57 +func (c *Collector) isTimeToDiscoverFiles(now time.Time) bool {
58 + return now.After(c.lastDiscFilesTime.Add(c.DiscoveryEvery.Duration()))
59 }
src/go/plugin/go.d/collector/filecheck/collector.go renamed
+20 -20
@@ -26,8 +26,8 @@ func init() {
26 })
27 }
28
29 -func New() *Filecheck {
30 - return &Filecheck{
29 +func New() *Collector {
30 + return &Collector{
31 Config: Config{
32 DiscoveryEvery: confopt.Duration(time.Minute * 1),
33 Files: filesConfig{},
@@ -57,7 +57,7 @@ type (
57 }
58 )
59
60 -type Filecheck struct {
60 +type Collector struct {
61 module.Base
62 Config `yaml:",inline" json:""`
63
@@ -74,46 +74,46 @@ type Filecheck struct {
74 seenDirs *seenItems
75 }
76
77 -func (f *Filecheck) Configuration() any {
78 - return f.Config
77 +func (c *Collector) Configuration() any {
78 + return c.Config
79 }
80
81 -func (f *Filecheck) Init() error {
82 - err := f.validateConfig()
81 +func (c *Collector) Init() error {
82 + err := c.validateConfig()
83 if err != nil {
84 return fmt.Errorf("config validation: %v", err)
85 }
86
87 - ff, err := f.initFilesFilter()
87 + ff, err := c.initFilesFilter()
88 if err != nil {
89 return fmt.Errorf("files filter initialization: %v", err)
90 }
91 - f.filesFilter = ff
91 + c.filesFilter = ff
92
93 - df, err := f.initDirsFilter()
93 + df, err := c.initDirsFilter()
94 if err != nil {
95 return fmt.Errorf("dirs filter initialization: %v", err)
96 }
97 - f.dirsFilter = df
97 + c.dirsFilter = df
98
99 - f.Debugf("monitored files: %v", f.Files.Include)
100 - f.Debugf("monitored dirs: %v", f.Dirs.Include)
99 + c.Debugf("monitored files: %v", c.Files.Include)
100 + c.Debugf("monitored dirs: %v", c.Dirs.Include)
101
102 return nil
103 }
104
105 -func (f *Filecheck) Check() error {
105 +func (c *Collector) Check() error {
106 return nil
107 }
108
109 -func (f *Filecheck) Charts() *module.Charts {
110 - return f.charts
109 +func (c *Collector) Charts() *module.Charts {
110 + return c.charts
111 }
112
113 -func (f *Filecheck) Collect() map[string]int64 {
114 - mx, err := f.collect()
113 +func (c *Collector) Collect() map[string]int64 {
114 + mx, err := c.collect()
115 if err != nil {
116 - f.Error(err)
116 + c.Error(err)
117 }
118
119 if len(mx) == 0 {
@@ -123,4 +123,4 @@ func (f *Filecheck) Collect() map[string]int64 {
123 return mx
124 }
125
126 -func (f *Filecheck) Cleanup() {}
126 +func (c *Collector) Cleanup() {}
src/go/plugin/go.d/collector/filecheck/collector_test.go renamed
+53 -53
@@ -27,15 +27,15 @@ func Test_testDataIsValid(t *testing.T) {
27 }
28 }
29
30 -func TestFilecheck_ConfigurationSerialize(t *testing.T) {
31 - module.TestConfigurationSerialize(t, &Filecheck{}, dataConfigJSON, dataConfigYAML)
30 +func TestCollector_ConfigurationSerialize(t *testing.T) {
31 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
32 }
33
34 -func TestFilecheck_Cleanup(t *testing.T) {
34 +func TestCollector_Cleanup(t *testing.T) {
35 assert.NotPanics(t, New().Cleanup)
36 }
37
38 -func TestFilecheck_Init(t *testing.T) {
38 +func TestCollector_Init(t *testing.T) {
39 tests := map[string]struct {
40 config Config
41 wantFail bool
@@ -96,21 +96,21 @@ func TestFilecheck_Init(t *testing.T) {
96
97 for name, test := range tests {
98 t.Run(name, func(t *testing.T) {
99 - fc := New()
100 - fc.Config = test.config
99 + collr := New()
100 + collr.Config = test.config
101
102 if test.wantFail {
103 - assert.Error(t, fc.Init())
103 + assert.Error(t, collr.Init())
104 } else {
105 - require.NoError(t, fc.Init())
105 + require.NoError(t, collr.Init())
106 }
107 })
108 }
109 }
110
111 -func TestFilecheck_Check(t *testing.T) {
111 +func TestCollector_Check(t *testing.T) {
112 tests := map[string]struct {
113 - prepare func() *Filecheck
113 + prepare func() *Collector
114 }{
115 "collect files": {prepare: prepareFilecheckFiles},
116 "collect files filepath pattern": {prepare: prepareFilecheckGlobFiles},
@@ -123,18 +123,18 @@ func TestFilecheck_Check(t *testing.T) {
123
124 for name, test := range tests {
125 t.Run(name, func(t *testing.T) {
126 - fc := test.prepare()
127 - require.NoError(t, fc.Init())
126 + collr := test.prepare()
127 + require.NoError(t, collr.Init())
128
129 - assert.NoError(t, fc.Check())
129 + assert.NoError(t, collr.Check())
130 })
131 }
132 }
133
134 -func TestFilecheck_Collect(t *testing.T) {
134 +func TestCollector_Collect(t *testing.T) {
135 // TODO: should use TEMP dir and create files/dirs dynamically during a test case
136 tests := map[string]struct {
137 - prepare func() *Filecheck
137 + prepare func() *Collector
138 wantCollected map[string]int64
139 }{
140 "collect files": {
@@ -238,94 +238,94 @@ func TestFilecheck_Collect(t *testing.T) {
238
239 for name, test := range tests {
240 t.Run(name, func(t *testing.T) {
241 - fc := test.prepare()
242 - require.NoError(t, fc.Init())
241 + collr := test.prepare()
242 + require.NoError(t, collr.Init())
243
244 - mx := fc.Collect()
244 + mx := collr.Collect()
245
246 copyModTime(test.wantCollected, mx)
247
248 assert.Equal(t, test.wantCollected, mx)
249
250 - module.TestMetricsHasAllChartsDims(t, fc.Charts(), mx)
250 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
251 })
252 }
253 }
254
255 -func prepareFilecheckFiles() *Filecheck {
256 - fc := New()
257 - fc.Config.Files.Include = []string{
255 +func prepareFilecheckFiles() *Collector {
256 + collr := New()
257 + collr.Config.Files.Include = []string{
258 "testdata/empty_file.log",
259 "testdata/file.log",
260 "testdata/non_existent_file.log",
261 }
262 - return fc
262 + return collr
263 }
264
265 -func prepareFilecheckGlobFiles() *Filecheck {
266 - fc := New()
267 - fc.Config.Files.Include = []string{
265 +func prepareFilecheckGlobFiles() *Collector {
266 + collr := New()
267 + collr.Config.Files.Include = []string{
268 "testdata/*.log",
269 }
270 - return fc
270 + return collr
271 }
272
273 -func prepareFilecheckNonExistentFiles() *Filecheck {
274 - fc := New()
275 - fc.Config.Files.Include = []string{
273 +func prepareFilecheckNonExistentFiles() *Collector {
274 + collr := New()
275 + collr.Config.Files.Include = []string{
276 "testdata/non_existent_file.log",
277 }
278 - return fc
278 + return collr
279 }
280
281 -func prepareFilecheckDirs() *Filecheck {
282 - fc := New()
283 - fc.Config.Dirs.Include = []string{
281 +func prepareFilecheckDirs() *Collector {
282 + collr := New()
283 + collr.Config.Dirs.Include = []string{
284 "testdata/dir",
285 "testdata/non_existent_dir",
286 }
287 - return fc
287 + return collr
288 }
289
290 -func prepareFilecheckGlobDirs() *Filecheck {
291 - fc := New()
292 - fc.Config.Dirs.Include = []string{
290 +func prepareFilecheckGlobDirs() *Collector {
291 + collr := New()
292 + collr.Config.Dirs.Include = []string{
293 "testdata/*ir",
294 "testdata/non_existent_dir",
295 }
296 - return fc
296 + return collr
297 }
298
299 -func prepareFilecheckDirsWithoutSize() *Filecheck {
300 - fc := New()
301 - fc.Config.Dirs.Include = []string{
299 +func prepareFilecheckDirsWithoutSize() *Collector {
300 + collr := New()
301 + collr.Config.Dirs.Include = []string{
302 "testdata/dir",
303 "testdata/non_existent_dir",
304 }
305 - return fc
305 + return collr
306 }
307
308 -func prepareFilecheckNonExistentDirs() *Filecheck {
309 - fc := New()
310 - fc.Config.Dirs.Include = []string{
308 +func prepareFilecheckNonExistentDirs() *Collector {
309 + collr := New()
310 + collr.Config.Dirs.Include = []string{
311 "testdata/non_existent_dir",
312 }
313 - return fc
313 + return collr
314 }
315
316 -func prepareFilecheckFilesDirs() *Filecheck {
317 - fc := New()
318 - fc.Config.Dirs.CollectDirSize = true
319 - fc.Config.Files.Include = []string{
316 +func prepareFilecheckFilesDirs() *Collector {
317 + collr := New()
318 + collr.Config.Dirs.CollectDirSize = true
319 + collr.Config.Files.Include = []string{
320 "testdata/empty_file.log",
321 "testdata/file.log",
322 "testdata/non_existent_file.log",
323 }
324 - fc.Config.Dirs.Include = []string{
324 + collr.Config.Dirs.Include = []string{
325 "testdata/dir",
326 "testdata/non_existent_dir",
327 }
328 - return fc
328 + return collr
329 }
330
331 func copyModTime(dst, src map[string]int64) {
src/go/plugin/go.d/collector/filecheck/init.go
+6 -6
@@ -8,19 +8,19 @@ import (
8 "github.com/netdata/netdata/go/plugins/pkg/matcher"
9 )
10
11 -func (f *Filecheck) validateConfig() error {
12 - if len(f.Files.Include) == 0 && len(f.Dirs.Include) == 0 {
11 +func (c *Collector) validateConfig() error {
12 + if len(c.Files.Include) == 0 && len(c.Dirs.Include) == 0 {
13 return errors.New("both 'files->include' and 'dirs->include' are empty")
14 }
15 return nil
16 }
17
18 -func (f *Filecheck) initFilesFilter() (matcher.Matcher, error) {
19 - return newFilter(f.Files.Exclude)
18 +func (c *Collector) initFilesFilter() (matcher.Matcher, error) {
19 + return newFilter(c.Files.Exclude)
20 }
21
22 -func (f *Filecheck) initDirsFilter() (matcher.Matcher, error) {
23 - return newFilter(f.Dirs.Exclude)
22 +func (c *Collector) initDirsFilter() (matcher.Matcher, error) {
23 + return newFilter(c.Dirs.Exclude)
24 }
25
26 func newFilter(patterns []string) (matcher.Matcher, error) {
src/go/plugin/go.d/collector/fluentd/collect.go
+11 -11
@@ -4,8 +4,8 @@ package fluentd
4
5 import "fmt"
6
7 -func (f *Fluentd) collect() (map[string]int64, error) {
8 - info, err := f.apiClient.getPluginsInfo()
7 +func (c *Collector) collect() (map[string]int64, error) {
8 + info, err := c.apiClient.getPluginsInfo()
9 if err != nil {
10 return nil, err
11 }
@@ -18,8 +18,8 @@ func (f *Fluentd) collect() (map[string]int64, error) {
18 continue
19 }
20
21 - if f.permitPlugin != nil && !f.permitPlugin.MatchString(p.ID) {
22 - f.Debugf("plugin id: '%s', type: '%s', category: '%s' denied", p.ID, p.Type, p.Category)
21 + if c.permitPlugin != nil && !c.permitPlugin.MatchString(p.ID) {
22 + c.Debugf("plugin id: '%s', type: '%s', category: '%s' denied", p.ID, p.Type, p.Category)
23 continue
24 }
25
@@ -35,9 +35,9 @@ func (f *Fluentd) collect() (map[string]int64, error) {
35 mx[id+"_buffer_total_queued_size"] = *p.BufferTotalQueuedSize
36 }
37
38 - if !f.activePlugins[id] {
39 - f.activePlugins[id] = true
40 - f.addPluginToCharts(p)
38 + if !c.activePlugins[id] {
39 + c.activePlugins[id] = true
40 + c.addPluginToCharts(p)
41 }
42
43 }
@@ -45,21 +45,21 @@ func (f *Fluentd) collect() (map[string]int64, error) {
45 return mx, nil
46 }
47
48 -func (f *Fluentd) addPluginToCharts(p pluginData) {
48 +func (c *Collector) addPluginToCharts(p pluginData) {
49 id := fmt.Sprintf("%s_%s_%s", p.ID, p.Type, p.Category)
50
51 if p.hasCategory() {
52 - chart := f.charts.Get("retry_count")
52 + chart := c.charts.Get("retry_count")
53 _ = chart.AddDim(&Dim{ID: id + "_retry_count", Name: p.ID})
54 chart.MarkNotCreated()
55 }
56 if p.hasBufferQueueLength() {
57 - chart := f.charts.Get("buffer_queue_length")
57 + chart := c.charts.Get("buffer_queue_length")
58 _ = chart.AddDim(&Dim{ID: id + "_buffer_queue_length", Name: p.ID})
59 chart.MarkNotCreated()
60 }
61 if p.hasBufferTotalQueuedSize() {
62 - chart := f.charts.Get("buffer_total_queued_size")
62 + chart := c.charts.Get("buffer_total_queued_size")
63 _ = chart.AddDim(&Dim{ID: id + "_buffer_total_queued_size", Name: p.ID})
64 chart.MarkNotCreated()
65 }
src/go/plugin/go.d/collector/fluentd/collector.go renamed
+23 -23
@@ -25,8 +25,8 @@ func init() {
25 })
26 }
27
28 -func New() *Fluentd {
29 - return &Fluentd{
28 +func New() *Collector {
29 + return &Collector{
30 Config: Config{
31 HTTPConfig: web.HTTPConfig{
32 RequestConfig: web.RequestConfig{
@@ -47,7 +47,7 @@ type Config struct {
47 PermitPlugin string `yaml:"permit_plugin_id,omitempty" json:"permit_plugin_id"`
48 }
49
50 -type Fluentd struct {
50 +type Collector struct {
51 module.Base
52 Config `yaml:",inline" json:""`
53
@@ -59,35 +59,35 @@ type Fluentd struct {
59 activePlugins map[string]bool
60 }
61
62 -func (f *Fluentd) Configuration() any {
63 - return f.Config
62 +func (c *Collector) Configuration() any {
63 + return c.Config
64 }
65
66 -func (f *Fluentd) Init() error {
67 - if err := f.validateConfig(); err != nil {
66 +func (c *Collector) Init() error {
67 + if err := c.validateConfig(); err != nil {
68 return fmt.Errorf("invalid config: %v", err)
69 }
70
71 - pm, err := f.initPermitPluginMatcher()
71 + pm, err := c.initPermitPluginMatcher()
72 if err != nil {
73 return fmt.Errorf("init permit_plugin_id: %v", err)
74 }
75 - f.permitPlugin = pm
75 + c.permitPlugin = pm
76
77 - client, err := f.initApiClient()
77 + client, err := c.initApiClient()
78 if err != nil {
79 return fmt.Errorf("init api client: %v", err)
80 }
81 - f.apiClient = client
81 + c.apiClient = client
82
83 - f.Debugf("using URL %s", f.URL)
84 - f.Debugf("using timeout: %s", f.Timeout.Duration())
83 + c.Debugf("using URL %s", c.URL)
84 + c.Debugf("using timeout: %s", c.Timeout.Duration())
85
86 return nil
87 }
88
89 -func (f *Fluentd) Check() error {
90 - mx, err := f.collect()
89 +func (c *Collector) Check() error {
90 + mx, err := c.collect()
91 if err != nil {
92 return err
93 }
@@ -98,23 +98,23 @@ func (f *Fluentd) Check() error {
98 return nil
99 }
100
101 -func (f *Fluentd) Charts() *Charts {
102 - return f.charts
101 +func (c *Collector) Charts() *Charts {
102 + return c.charts
103 }
104
105 -func (f *Fluentd) Collect() map[string]int64 {
106 - mx, err := f.collect()
105 +func (c *Collector) Collect() map[string]int64 {
106 + mx, err := c.collect()
107
108 if err != nil {
109 - f.Error(err)
109 + c.Error(err)
110 return nil
111 }
112
113 return mx
114 }
115
116 -func (f *Fluentd) Cleanup() {
117 - if f.apiClient != nil && f.apiClient.httpClient != nil {
118 - f.apiClient.httpClient.CloseIdleConnections()
116 +func (c *Collector) Cleanup() {
117 + if c.apiClient != nil && c.apiClient.httpClient != nil {
118 + c.apiClient.httpClient.CloseIdleConnections()
119 }
120 }
src/go/plugin/go.d/collector/fluentd/collector_test.go renamed
+39 -39
@@ -31,23 +31,23 @@ func Test_testDataIsValid(t *testing.T) {
31 }
32 }
33
34 -func TestFluentd_ConfigurationSerialize(t *testing.T) {
35 - module.TestConfigurationSerialize(t, &Fluentd{}, dataConfigJSON, dataConfigYAML)
34 +func TestCollector_ConfigurationSerialize(t *testing.T) {
35 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
36 }
37
38 -func TestFluentd_Init(t *testing.T) {
38 +func TestCollector_Init(t *testing.T) {
39 // OK
40 - job := New()
41 - assert.NoError(t, job.Init())
42 - assert.NotNil(t, job.apiClient)
40 + collr := New()
41 + assert.NoError(t, collr.Init())
42 + assert.NotNil(t, collr.apiClient)
43
44 //NG
45 - job = New()
46 - job.URL = ""
47 - assert.Error(t, job.Init())
45 + collr = New()
46 + collr.URL = ""
47 + assert.Error(t, collr.Init())
48 }
49
50 -func TestFluentd_Check(t *testing.T) {
50 +func TestCollector_Check(t *testing.T) {
51 ts := httptest.NewServer(http.HandlerFunc(
52 func(w http.ResponseWriter, r *http.Request) {
53 _, _ = w.Write(dataPluginsMetrics)
@@ -55,38 +55,38 @@ func TestFluentd_Check(t *testing.T) {
55 defer ts.Close()
56
57 // OK
58 - job := New()
59 - job.URL = ts.URL
60 - require.NoError(t, job.Init())
61 - require.NoError(t, job.Check())
58 + collr := New()
59 + collr.URL = ts.URL
60 + require.NoError(t, collr.Init())
61 + require.NoError(t, collr.Check())
62
63 // NG
64 - job = New()
65 - job.URL = "http://127.0.0.1:38001/api/plugins.json"
66 - require.NoError(t, job.Init())
67 - require.Error(t, job.Check())
64 + collr = New()
65 + collr.URL = "http://127.0.0.1:38001/api/plugins.json"
66 + require.NoError(t, collr.Init())
67 + require.Error(t, collr.Check())
68 }
69
70 -func TestFluentd_Charts(t *testing.T) {
70 +func TestCollector_Charts(t *testing.T) {
71 assert.NotNil(t, New().Charts())
72 }
73
74 -func TestFluentd_Cleanup(t *testing.T) {
74 +func TestCollector_Cleanup(t *testing.T) {
75 New().Cleanup()
76 }
77
78 -func TestFluentd_Collect(t *testing.T) {
78 +func TestCollector_Collect(t *testing.T) {
79 ts := httptest.NewServer(http.HandlerFunc(
80 func(w http.ResponseWriter, r *http.Request) {
81 _, _ = w.Write(dataPluginsMetrics)
82 }))
83 defer ts.Close()
84
85 - job := New()
86 - job.URL = ts.URL
85 + collr := New()
86 + collr.URL = ts.URL
87
88 - require.NoError(t, job.Init())
89 - require.NoError(t, job.Check())
88 + require.NoError(t, collr.Init())
89 + require.NoError(t, collr.Check())
90
91 expected := map[string]int64{
92 "output_stdout_stdout_output_retry_count": 0,
@@ -94,34 +94,34 @@ func TestFluentd_Collect(t *testing.T) {
94 "output_td_tdlog_output_buffer_queue_length": 0,
95 "output_td_tdlog_output_buffer_total_queued_size": 0,
96 }
97 - assert.Equal(t, expected, job.Collect())
98 - assert.Len(t, job.charts.Get("retry_count").Dims, 2)
99 - assert.Len(t, job.charts.Get("buffer_queue_length").Dims, 1)
100 - assert.Len(t, job.charts.Get("buffer_total_queued_size").Dims, 1)
97 + assert.Equal(t, expected, collr.Collect())
98 + assert.Len(t, collr.charts.Get("retry_count").Dims, 2)
99 + assert.Len(t, collr.charts.Get("buffer_queue_length").Dims, 1)
100 + assert.Len(t, collr.charts.Get("buffer_total_queued_size").Dims, 1)
101 }
102
103 -func TestFluentd_InvalidData(t *testing.T) {
103 +func TestCollector_InvalidData(t *testing.T) {
104 ts := httptest.NewServer(http.HandlerFunc(
105 func(w http.ResponseWriter, r *http.Request) {
106 _, _ = w.Write([]byte("hello and goodbye"))
107 }))
108 defer ts.Close()
109
110 - job := New()
111 - job.URL = ts.URL
112 - require.NoError(t, job.Init())
113 - assert.Error(t, job.Check())
110 + collr := New()
111 + collr.URL = ts.URL
112 + require.NoError(t, collr.Init())
113 + assert.Error(t, collr.Check())
114 }
115
116 -func TestFluentd_404(t *testing.T) {
116 +func TestCollector_404(t *testing.T) {
117 ts := httptest.NewServer(http.HandlerFunc(
118 func(w http.ResponseWriter, r *http.Request) {
119 w.WriteHeader(404)
120 }))
121 defer ts.Close()
122
123 - job := New()
124 - job.URL = ts.URL
125 - require.NoError(t, job.Init())
126 - assert.Error(t, job.Check())
123 + collr := New()
124 + collr.URL = ts.URL
125 + require.NoError(t, collr.Init())
126 + assert.Error(t, collr.Check())
127 }
src/go/plugin/go.d/collector/fluentd/init.go
+8 -8
@@ -9,27 +9,27 @@ import (
9 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/web"
10 )
11
12 -func (f *Fluentd) validateConfig() error {
13 - if f.URL == "" {
12 +func (c *Collector) validateConfig() error {
13 + if c.URL == "" {
14 return errors.New("url not set")
15 }
16
17 return nil
18 }
19
20 -func (f *Fluentd) initPermitPluginMatcher() (matcher.Matcher, error) {
21 - if f.PermitPlugin == "" {
20 +func (c *Collector) initPermitPluginMatcher() (matcher.Matcher, error) {
21 + if c.PermitPlugin == "" {
22 return matcher.TRUE(), nil
23 }
24
25 - return matcher.NewSimplePatternsMatcher(f.PermitPlugin)
25 + return matcher.NewSimplePatternsMatcher(c.PermitPlugin)
26 }
27
28 -func (f *Fluentd) initApiClient() (*apiClient, error) {
29 - client, err := web.NewHTTPClient(f.ClientConfig)
28 +func (c *Collector) initApiClient() (*apiClient, error) {
29 + client, err := web.NewHTTPClient(c.ClientConfig)
30 if err != nil {
31 return nil, err
32 }
33
34 - return newAPIClient(client, f.RequestConfig), nil
34 + return newAPIClient(client, c.RequestConfig), nil
35 }
src/go/plugin/go.d/collector/freeradius/collect.go
+2 -2
@@ -6,8 +6,8 @@ import (
6 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/stm"
7 )
8
9 -func (f *FreeRADIUS) collect() (map[string]int64, error) {
10 - status, err := f.client.Status()
9 +func (c *Collector) collect() (map[string]int64, error) {
10 + status, err := c.client.Status()
11 if err != nil {
12 return nil, err
13 }
src/go/plugin/go.d/collector/freeradius/collector.go renamed
+19 -19
@@ -24,8 +24,8 @@ func init() {
24 })
25 }
26
27 -func New() *FreeRADIUS {
28 - return &FreeRADIUS{
27 +func New() *Collector {
28 + return &Collector{
29 Config: Config{
30 Address: "127.0.0.1",
31 Port: 18121,
@@ -44,7 +44,7 @@ type Config struct {
44 }
45
46 type (
47 - FreeRADIUS struct {
47 + Collector struct {
48 module.Base
49 Config `yaml:",inline" json:""`
50
@@ -55,27 +55,27 @@ type (
55 }
56 )
57
58 -func (f *FreeRADIUS) Configuration() any {
59 - return f.Config
58 +func (c *Collector) Configuration() any {
59 + return c.Config
60 }
61
62 -func (f *FreeRADIUS) Init() error {
63 - if err := f.validateConfig(); err != nil {
62 +func (c *Collector) Init() error {
63 + if err := c.validateConfig(); err != nil {
64 return fmt.Errorf("config validation: %v", err)
65 }
66
67 - f.client = api.New(api.Config{
68 - Address: f.Address,
69 - Port: f.Port,
70 - Secret: f.Secret,
71 - Timeout: f.Timeout.Duration(),
67 + c.client = api.New(api.Config{
68 + Address: c.Address,
69 + Port: c.Port,
70 + Secret: c.Secret,
71 + Timeout: c.Timeout.Duration(),
72 })
73
74 return nil
75 }
76
77 -func (f *FreeRADIUS) Check() error {
78 - mx, err := f.collect()
77 +func (c *Collector) Check() error {
78 + mx, err := c.collect()
79 if err != nil {
80 return err
81 }
@@ -86,14 +86,14 @@ func (f *FreeRADIUS) Check() error {
86 return nil
87 }
88
89 -func (f *FreeRADIUS) Charts() *Charts {
89 +func (c *Collector) Charts() *Charts {
90 return charts.Copy()
91 }
92
93 -func (f *FreeRADIUS) Collect() map[string]int64 {
94 - mx, err := f.collect()
93 +func (c *Collector) Collect() map[string]int64 {
94 + mx, err := c.collect()
95 if err != nil {
96 - f.Error(err)
96 + c.Error(err)
97 }
98
99 if len(mx) == 0 {
@@ -102,4 +102,4 @@ func (f *FreeRADIUS) Collect() map[string]int64 {
102 return mx
103 }
104
105 -func (f *FreeRADIUS) Cleanup() {}
105 +func (c *Collector) Cleanup() {}
src/go/plugin/go.d/collector/freeradius/collector_test.go renamed
+36 -36
@@ -28,58 +28,58 @@ func Test_testDataIsValid(t *testing.T) {
28 }
29 }
30
31 -func TestFreeRADIUS_ConfigurationSerialize(t *testing.T) {
32 - module.TestConfigurationSerialize(t, &FreeRADIUS{}, dataConfigJSON, dataConfigYAML)
31 +func TestCollector_ConfigurationSerialize(t *testing.T) {
32 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
33 }
34
35 -func TestFreeRADIUS_Init(t *testing.T) {
36 - freeRADIUS := New()
35 +func TestCollector_Init(t *testing.T) {
36 + collr := New()
37
38 - assert.NoError(t, freeRADIUS.Init())
38 + assert.NoError(t, collr.Init())
39 }
40
41 -func TestFreeRADIUS_Init_ReturnsFalseIfAddressNotSet(t *testing.T) {
42 - freeRADIUS := New()
43 - freeRADIUS.Address = ""
41 +func TestCollector_Init_ReturnsFalseIfAddressNotSet(t *testing.T) {
42 + collr := New()
43 + collr.Address = ""
44
45 - assert.Error(t, freeRADIUS.Init())
45 + assert.Error(t, collr.Init())
46 }
47
48 -func TestFreeRADIUS_Init_ReturnsFalseIfPortNotSet(t *testing.T) {
49 - freeRADIUS := New()
50 - freeRADIUS.Port = 0
48 +func TestCollector_Init_ReturnsFalseIfPortNotSet(t *testing.T) {
49 + collr := New()
50 + collr.Port = 0
51
52 - assert.Error(t, freeRADIUS.Init())
52 + assert.Error(t, collr.Init())
53 }
54
55 -func TestFreeRADIUS_Init_ReturnsFalseIfSecretNotSet(t *testing.T) {
56 - freeRADIUS := New()
57 - freeRADIUS.Secret = ""
55 +func TestCollector_Init_ReturnsFalseIfSecretNotSet(t *testing.T) {
56 + collr := New()
57 + collr.Secret = ""
58
59 - assert.Error(t, freeRADIUS.Init())
59 + assert.Error(t, collr.Init())
60 }
61
62 -func TestFreeRADIUS_Check(t *testing.T) {
63 - freeRADIUS := New()
64 - freeRADIUS.client = newOKMockClient()
62 +func TestCollector_Check(t *testing.T) {
63 + collr := New()
64 + collr.client = newOKMockClient()
65
66 - assert.NoError(t, freeRADIUS.Check())
66 + assert.NoError(t, collr.Check())
67 }
68
69 -func TestFreeRADIUS_Check_ReturnsFalseIfClientStatusReturnsError(t *testing.T) {
70 - freeRADIUS := New()
71 - freeRADIUS.client = newErrorMockClient()
69 +func TestCollector_Check_ReturnsFalseIfClientStatusReturnsError(t *testing.T) {
70 + collr := New()
71 + collr.client = newErrorMockClient()
72
73 - assert.Error(t, freeRADIUS.Check())
73 + assert.Error(t, collr.Check())
74 }
75
76 -func TestFreeRADIUS_Charts(t *testing.T) {
76 +func TestCollector_Charts(t *testing.T) {
77 assert.NotNil(t, New().Charts())
78 }
79
80 -func TestFreeRADIUS_Collect(t *testing.T) {
81 - freeRADIUS := New()
82 - freeRADIUS.client = newOKMockClient()
80 +func TestCollector_Collect(t *testing.T) {
81 + collr := New()
82 + collr.client = newOKMockClient()
83
84 expected := map[string]int64{
85 "access-requests": 1,
@@ -117,20 +117,20 @@ func TestFreeRADIUS_Collect(t *testing.T) {
117 "proxy-acct-dropped-requests": 33,
118 "proxy-acct-unknown-types": 34,
119 }
120 - mx := freeRADIUS.Collect()
120 + mx := collr.Collect()
121
122 assert.Equal(t, expected, mx)
123 - module.TestMetricsHasAllChartsDims(t, freeRADIUS.Charts(), mx)
123 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
124 }
125
126 -func TestFreeRADIUS_Collect_ReturnsNilIfClientStatusReturnsError(t *testing.T) {
127 - freeRADIUS := New()
128 - freeRADIUS.client = newErrorMockClient()
126 +func TestCollector_Collect_ReturnsNilIfClientStatusReturnsError(t *testing.T) {
127 + collr := New()
128 + collr.client = newErrorMockClient()
129
130 - assert.Nil(t, freeRADIUS.Collect())
130 + assert.Nil(t, collr.Collect())
131 }
132
133 -func TestFreeRADIUS_Cleanup(t *testing.T) {
133 +func TestCollector_Cleanup(t *testing.T) {
134 New().Cleanup()
135 }
136
src/go/plugin/go.d/collector/freeradius/init.go
+4 -4
@@ -6,14 +6,14 @@ import (
6 "errors"
7 )
8
9 -func (f *FreeRADIUS) validateConfig() error {
10 - if f.Address == "" {
9 +func (c *Collector) validateConfig() error {
10 + if c.Address == "" {
11 return errors.New("address not set")
12 }
13 - if f.Port == 0 {
13 + if c.Port == 0 {
14 return errors.New("port not set")
15 }
16 - if f.Secret == "" {
16 + if c.Secret == "" {
17 return errors.New("secret not set")
18 }
19 return nil
src/go/plugin/go.d/collector/gearman/charts.go
+13 -13
@@ -107,25 +107,25 @@ var (
107 }
108 )
109
110 -func (g *Gearman) addFunctionStatusCharts(name string) {
111 - g.addFunctionCharts(name, functionStatusChartsTmpl.Copy())
110 +func (c *Collector) addFunctionStatusCharts(name string) {
111 + c.addFunctionCharts(name, functionStatusChartsTmpl.Copy())
112 }
113
114 -func (g *Gearman) removeFunctionStatusCharts(name string) {
114 +func (c *Collector) removeFunctionStatusCharts(name string) {
115 px := fmt.Sprintf("function_%s_", cleanFunctionName(name))
116 - g.removeCharts(px)
116 + c.removeCharts(px)
117 }
118
119 -func (g *Gearman) addFunctionPriorityStatusCharts(name string) {
120 - g.addFunctionCharts(name, functionPriorityStatusChartsTmpl.Copy())
119 +func (c *Collector) addFunctionPriorityStatusCharts(name string) {
120 + c.addFunctionCharts(name, functionPriorityStatusChartsTmpl.Copy())
121 }
122
123 -func (g *Gearman) removeFunctionPriorityStatusCharts(name string) {
123 +func (c *Collector) removeFunctionPriorityStatusCharts(name string) {
124 px := fmt.Sprintf("prio_function_%s_", cleanFunctionName(name))
125 - g.removeCharts(px)
125 + c.removeCharts(px)
126 }
127
128 -func (g *Gearman) addFunctionCharts(name string, charts *module.Charts) {
128 +func (c *Collector) addFunctionCharts(name string, charts *module.Charts) {
129 charts = charts.Copy()
130
131 for _, chart := range *charts {
@@ -138,13 +138,13 @@ func (g *Gearman) addFunctionCharts(name string, charts *module.Charts) {
138 }
139 }
140
141 - if err := g.Charts().Add(*charts...); err != nil {
142 - g.Warning(err)
141 + if err := c.Charts().Add(*charts...); err != nil {
142 + c.Warning(err)
143 }
144 }
145
146 -func (g *Gearman) removeCharts(px string) {
147 - for _, chart := range *g.Charts() {
146 +func (c *Collector) removeCharts(px string) {
147 + for _, chart := range *c.Charts() {
148 if strings.HasPrefix(chart.ID, px) {
149 chart.MarkRemove()
150 chart.MarkNotCreated()
src/go/plugin/go.d/collector/gearman/collect.go
+26 -26
@@ -11,33 +11,33 @@ import (
11 "strings"
12 )
13
14 -func (g *Gearman) collect() (map[string]int64, error) {
15 - if g.conn == nil {
16 - conn, err := g.establishConn()
14 +func (c *Collector) collect() (map[string]int64, error) {
15 + if c.conn == nil {
16 + conn, err := c.establishConn()
17 if err != nil {
18 return nil, err
19 }
20 - g.conn = conn
20 + c.conn = conn
21 }
22
23 - status, err := g.conn.queryStatus()
23 + status, err := c.conn.queryStatus()
24 if err != nil {
25 - g.Cleanup()
25 + c.Cleanup()
26 return nil, fmt.Errorf("couldn't query status: %v", err)
27 }
28
29 - prioStatus, err := g.conn.queryPriorityStatus()
29 + prioStatus, err := c.conn.queryPriorityStatus()
30 if err != nil {
31 - g.Cleanup()
31 + c.Cleanup()
32 return nil, fmt.Errorf("couldn't query priority status: %v", err)
33 }
34
35 mx := make(map[string]int64)
36
37 - if err := g.collectStatus(mx, status); err != nil {
37 + if err := c.collectStatus(mx, status); err != nil {
38 return nil, fmt.Errorf("couldn't collect status: %v", err)
39 }
40 - if err := g.collectPriorityStatus(mx, prioStatus); err != nil {
40 + if err := c.collectPriorityStatus(mx, prioStatus); err != nil {
41 return nil, fmt.Errorf("couldn't collect priority status: %v", err)
42 }
43
@@ -45,7 +45,7 @@ func (g *Gearman) collect() (map[string]int64, error) {
45
46 }
47
48 -func (g *Gearman) collectStatus(mx map[string]int64, statusData []byte) error {
48 +func (c *Collector) collectStatus(mx map[string]int64, statusData []byte) error {
49 /*
50 Same output as the "gearadmin --status" command:
51
@@ -120,22 +120,22 @@ func (g *Gearman) collectStatus(mx map[string]int64, statusData []byte) error {
120 }
121
122 for name := range seen {
123 - if !g.seenTasks[name] {
124 - g.seenTasks[name] = true
125 - g.addFunctionStatusCharts(name)
123 + if !c.seenTasks[name] {
124 + c.seenTasks[name] = true
125 + c.addFunctionStatusCharts(name)
126 }
127 }
128 - for name := range g.seenTasks {
128 + for name := range c.seenTasks {
129 if !seen[name] {
130 - delete(g.seenTasks, name)
131 - g.removeFunctionStatusCharts(name)
130 + delete(c.seenTasks, name)
131 + c.removeFunctionStatusCharts(name)
132 }
133 }
134
135 return nil
136 }
137
138 -func (g *Gearman) collectPriorityStatus(mx map[string]int64, prioStatusData []byte) error {
138 +func (c *Collector) collectPriorityStatus(mx map[string]int64, prioStatusData []byte) error {
139 /*
140 Same output as the "gearadmin --priority-status" command:
141
@@ -195,23 +195,23 @@ func (g *Gearman) collectPriorityStatus(mx map[string]int64, prioStatusData []by
195 }
196
197 for name := range seen {
198 - if !g.seenPriorityTasks[name] {
199 - g.seenPriorityTasks[name] = true
200 - g.addFunctionPriorityStatusCharts(name)
198 + if !c.seenPriorityTasks[name] {
199 + c.seenPriorityTasks[name] = true
200 + c.addFunctionPriorityStatusCharts(name)
201 }
202 }
203 - for name := range g.seenPriorityTasks {
203 + for name := range c.seenPriorityTasks {
204 if !seen[name] {
205 - delete(g.seenPriorityTasks, name)
206 - g.removeFunctionPriorityStatusCharts(name)
205 + delete(c.seenPriorityTasks, name)
206 + c.removeFunctionPriorityStatusCharts(name)
207 }
208 }
209
210 return nil
211 }
212
213 -func (g *Gearman) establishConn() (gearmanConn, error) {
214 - conn := g.newConn(g.Config)
213 +func (c *Collector) establishConn() (gearmanConn, error) {
214 + conn := c.newConn(c.Config)
215
216 if err := conn.connect(); err != nil {
217 return nil, err
src/go/plugin/go.d/collector/gearman/collector.go renamed
+18 -18
@@ -22,8 +22,8 @@ func init() {
22 })
23 }
24
25 -func New() *Gearman {
26 - return &Gearman{
25 +func New() *Collector {
26 + return &Collector{
27 Config: Config{
28 Address: "127.0.0.1:4730",
29 Timeout: confopt.Duration(time.Second * 1),
@@ -41,7 +41,7 @@ type Config struct {
41 Timeout confopt.Duration `yaml:"timeout" json:"timeout"`
42 }
43
44 -type Gearman struct {
44 +type Collector struct {
45 module.Base
46 Config `yaml:",inline" json:""`
47
@@ -54,20 +54,20 @@ type Gearman struct {
54 seenPriorityTasks map[string]bool
55 }
56
57 -func (g *Gearman) Configuration() any {
58 - return g.Config
57 +func (c *Collector) Configuration() any {
58 + return c.Config
59 }
60
61 -func (g *Gearman) Init() error {
62 - if g.Address == "" {
61 +func (c *Collector) Init() error {
62 + if c.Address == "" {
63 return errors.New("config: 'address' not set")
64 }
65
66 return nil
67 }
68
69 -func (g *Gearman) Check() error {
70 - mx, err := g.collect()
69 +func (c *Collector) Check() error {
70 + mx, err := c.collect()
71 if err != nil {
72 return err
73 }
@@ -79,14 +79,14 @@ func (g *Gearman) Check() error {
79 return nil
80 }
81
82 -func (g *Gearman) Charts() *module.Charts {
83 - return g.charts
82 +func (c *Collector) Charts() *module.Charts {
83 + return c.charts
84 }
85
86 -func (g *Gearman) Collect() map[string]int64 {
87 - mx, err := g.collect()
86 +func (c *Collector) Collect() map[string]int64 {
87 + mx, err := c.collect()
88 if err != nil {
89 - g.Error(err)
89 + c.Error(err)
90 }
91
92 if len(mx) == 0 {
@@ -96,9 +96,9 @@ func (g *Gearman) Collect() map[string]int64 {
96 return mx
97 }
98
99 -func (g *Gearman) Cleanup() {
100 - if g.conn != nil {
101 - g.conn.disconnect()
102 - g.conn = nil
99 +func (c *Collector) Cleanup() {
100 + if c.conn != nil {
101 + c.conn.disconnect()
102 + c.conn = nil
103 }
104 }
src/go/plugin/go.d/collector/gearman/collector_test.go renamed
+35 -35
@@ -33,11 +33,11 @@ func Test_testDataIsValid(t *testing.T) {
33 }
34 }
35
36 -func TestGearman_ConfigurationSerialize(t *testing.T) {
37 - module.TestConfigurationSerialize(t, &Gearman{}, dataConfigJSON, dataConfigYAML)
36 +func TestCollector_ConfigurationSerialize(t *testing.T) {
37 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
38 }
39
40 -func TestGearman_Init(t *testing.T) {
40 +func TestCollector_Init(t *testing.T) {
41 tests := map[string]struct {
42 config Config
43 wantFail bool
@@ -58,59 +58,59 @@ func TestGearman_Init(t *testing.T) {
58
59 for name, test := range tests {
60 t.Run(name, func(t *testing.T) {
61 - gear := New()
62 - gear.Config = test.config
61 + collr := New()
62 + collr.Config = test.config
63
64 if test.wantFail {
65 - assert.Error(t, gear.Init())
65 + assert.Error(t, collr.Init())
66 } else {
67 - assert.NoError(t, gear.Init())
67 + assert.NoError(t, collr.Init())
68 }
69 })
70 }
71 }
72
73 -func TestGearman_Cleanup(t *testing.T) {
73 +func TestCollector_Cleanup(t *testing.T) {
74 tests := map[string]struct {
75 - prepare func() *Gearman
75 + prepare func() *Collector
76 }{
77 "not initialized": {
78 - prepare: func() *Gearman {
78 + prepare: func() *Collector {
79 return New()
80 },
81 },
82 "after check": {
83 - prepare: func() *Gearman {
84 - gear := New()
85 - gear.newConn = func(config Config) gearmanConn { return prepareMockOk() }
86 - _ = gear.Check()
87 - return gear
83 + prepare: func() *Collector {
84 + collr := New()
85 + collr.newConn = func(Config) gearmanConn { return prepareMockOk() }
86 + _ = collr.Check()
87 + return collr
88 },
89 },
90 "after collect": {
91 - prepare: func() *Gearman {
92 - gear := New()
93 - gear.newConn = func(config Config) gearmanConn { return prepareMockOk() }
94 - _ = gear.Collect()
95 - return gear
91 + prepare: func() *Collector {
92 + collr := New()
93 + collr.newConn = func(Config) gearmanConn { return prepareMockOk() }
94 + _ = collr.Collect()
95 + return collr
96 },
97 },
98 }
99
100 for name, test := range tests {
101 t.Run(name, func(t *testing.T) {
102 - gear := test.prepare()
102 + collr := test.prepare()
103
104 - assert.NotPanics(t, gear.Cleanup)
104 + assert.NotPanics(t, collr.Cleanup)
105 })
106 }
107 }
108
109 -func TestGearman_Charts(t *testing.T) {
109 +func TestCollector_Charts(t *testing.T) {
110 assert.NotNil(t, New().Charts())
111 }
112
113 -func TestGearman_Check(t *testing.T) {
113 +func TestCollector_Check(t *testing.T) {
114 tests := map[string]struct {
115 prepareMock func() *mockGearmanConn
116 wantFail bool
@@ -135,20 +135,20 @@ func TestGearman_Check(t *testing.T) {
135
136 for name, test := range tests {
137 t.Run(name, func(t *testing.T) {
138 - gear := New()
138 + collr := New()
139 mock := test.prepareMock()
140 - gear.newConn = func(config Config) gearmanConn { return mock }
140 + collr.newConn = func(Config) gearmanConn { return mock }
141
142 if test.wantFail {
143 - assert.Error(t, gear.Check())
143 + assert.Error(t, collr.Check())
144 } else {
145 - assert.NoError(t, gear.Check())
145 + assert.NoError(t, collr.Check())
146 }
147 })
148 }
149 }
150
151 -func TestGearman_Collect(t *testing.T) {
151 +func TestCollector_Collect(t *testing.T) {
152 tests := map[string]struct {
153 prepareMock func() *mockGearmanConn
154 wantMetrics map[string]int64
@@ -234,21 +234,21 @@ func TestGearman_Collect(t *testing.T) {
234
235 for name, test := range tests {
236 t.Run(name, func(t *testing.T) {
237 - gear := New()
237 + collr := New()
238 mock := test.prepareMock()
239 - gear.newConn = func(config Config) gearmanConn { return mock }
239 + collr.newConn = func(Config) gearmanConn { return mock }
240
241 - mx := gear.Collect()
241 + mx := collr.Collect()
242
243 require.Equal(t, test.wantMetrics, mx, "want metrics")
244
245 if len(test.wantMetrics) > 0 {
246 - module.TestMetricsHasAllChartsDims(t, gear.Charts(), mx)
247 - assert.Equal(t, test.wantCharts, len(*gear.Charts()), "want charts")
246 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
247 + assert.Equal(t, test.wantCharts, len(*collr.Charts()), "want charts")
248 }
249
250 assert.Equal(t, test.disconnectBeforeCleanup, mock.disconnectCalled, "disconnect before cleanup")
251 - gear.Cleanup()
251 + collr.Cleanup()
252 assert.Equal(t, test.disconnectAfterCleanup, mock.disconnectCalled, "disconnect after cleanup")
253 })
254 }
src/go/plugin/go.d/collector/geth/collect.go
+17 -17
@@ -7,26 +7,26 @@ import (
7 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/stm"
8 )
9
10 -func (g *Geth) collect() (map[string]int64, error) {
11 - pms, err := g.prom.ScrapeSeries()
10 +func (c *Collector) collect() (map[string]int64, error) {
11 + pms, err := c.prom.ScrapeSeries()
12 if err != nil {
13 return nil, err
14 }
15 - mx := g.collectGeth(pms)
15 + mx := c.collectGeth(pms)
16
17 return stm.ToMap(mx), nil
18 }
19
20 -func (g *Geth) collectGeth(pms prometheus.Series) map[string]float64 {
20 +func (c *Collector) collectGeth(pms prometheus.Series) map[string]float64 {
21 mx := make(map[string]float64)
22 - g.collectChainData(mx, pms)
23 - g.collectP2P(mx, pms)
24 - g.collectTxPool(mx, pms)
25 - g.collectRpc(mx, pms)
22 + c.collectChainData(mx, pms)
23 + c.collectP2P(mx, pms)
24 + c.collectTxPool(mx, pms)
25 + c.collectRpc(mx, pms)
26 return mx
27 }
28
29 -func (g *Geth) collectChainData(mx map[string]float64, pms prometheus.Series) {
29 +func (c *Collector) collectChainData(mx map[string]float64, pms prometheus.Series) {
30 pms = pms.FindByNames(
31 chainValidation,
32 chainWrite,
@@ -44,20 +44,20 @@ func (g *Geth) collectChainData(mx map[string]float64, pms prometheus.Series) {
44 reorgsExecuted,
45 goRoutines,
46 )
47 - g.collectEth(mx, pms)
47 + c.collectEth(mx, pms)
48
49 }
50
51 -func (g *Geth) collectRpc(mx map[string]float64, pms prometheus.Series) {
51 +func (c *Collector) collectRpc(mx map[string]float64, pms prometheus.Series) {
52 pms = pms.FindByNames(
53 rpcRequests,
54 rpcSuccess,
55 rpcFailure,
56 )
57 - g.collectEth(mx, pms)
57 + c.collectEth(mx, pms)
58 }
59
60 -func (g *Geth) collectTxPool(mx map[string]float64, pms prometheus.Series) {
60 +func (c *Collector) collectTxPool(mx map[string]float64, pms prometheus.Series) {
61 pms = pms.FindByNames(
62 txPoolInvalid,
63 txPoolPending,
@@ -71,10 +71,10 @@ func (g *Geth) collectTxPool(mx map[string]float64, pms prometheus.Series) {
71 txPoolQueuedEviction,
72 txPoolQueuedRatelimit,
73 )
74 - g.collectEth(mx, pms)
74 + c.collectEth(mx, pms)
75 }
76
77 -func (g *Geth) collectP2P(mx map[string]float64, pms prometheus.Series) {
77 +func (c *Collector) collectP2P(mx map[string]float64, pms prometheus.Series) {
78 pms = pms.FindByNames(
79 p2pDials,
80 p2pEgress,
@@ -82,10 +82,10 @@ func (g *Geth) collectP2P(mx map[string]float64, pms prometheus.Series) {
82 p2pPeers,
83 p2pServes,
84 )
85 - g.collectEth(mx, pms)
85 + c.collectEth(mx, pms)
86 }
87
88 -func (g *Geth) collectEth(mx map[string]float64, pms prometheus.Series) {
88 +func (c *Collector) collectEth(mx map[string]float64, pms prometheus.Series) {
89 for _, pm := range pms {
90 mx[pm.Name()] += pm.Value
91 }
src/go/plugin/go.d/collector/geth/collector.go renamed
+21 -21
@@ -25,8 +25,8 @@ func init() {
25 })
26 }
27
28 -func New() *Geth {
29 - return &Geth{
28 +func New() *Collector {
29 + return &Collector{
30 Config: Config{
31 HTTPConfig: web.HTTPConfig{
32 RequestConfig: web.RequestConfig{
@@ -46,7 +46,7 @@ type Config struct {
46 UpdateEvery int `yaml:"update_every" json:"update_every"`
47 }
48
49 -type Geth struct {
49 +type Collector struct {
50 module.Base
51 Config `yaml:",inline" json:""`
52
@@ -55,26 +55,26 @@ type Geth struct {
55 prom prometheus.Prometheus
56 }
57
58 -func (g *Geth) Configuration() any {
59 - return g.Config
58 +func (c *Collector) Configuration() any {
59 + return c.Config
60 }
61
62 -func (g *Geth) Init() error {
63 - if err := g.validateConfig(); err != nil {
64 - return fmt.Errorf("error on validating config: %g", err)
62 +func (c *Collector) Init() error {
63 + if err := c.validateConfig(); err != nil {
64 + return fmt.Errorf("error on validating config: %v", err)
65 }
66
67 - prom, err := g.initPrometheusClient()
67 + prom, err := c.initPrometheusClient()
68 if err != nil {
69 - return fmt.Errorf("error on initializing prometheus client: %g", err)
69 + return fmt.Errorf("error on initializing prometheus client: %v", err)
70 }
71 - g.prom = prom
71 + c.prom = prom
72
73 return nil
74 }
75
76 -func (g *Geth) Check() error {
77 - mx, err := g.collect()
76 +func (c *Collector) Check() error {
77 + mx, err := c.collect()
78 if err != nil {
79 return err
80 }
@@ -84,14 +84,14 @@ func (g *Geth) Check() error {
84 return nil
85 }
86
87 -func (g *Geth) Charts() *Charts {
88 - return g.charts
87 +func (c *Collector) Charts() *Charts {
88 + return c.charts
89 }
90
91 -func (g *Geth) Collect() map[string]int64 {
92 - mx, err := g.collect()
91 +func (c *Collector) Collect() map[string]int64 {
92 + mx, err := c.collect()
93 if err != nil {
94 - g.Error(err)
94 + c.Error(err)
95 }
96
97 if len(mx) == 0 {
@@ -100,8 +100,8 @@ func (g *Geth) Collect() map[string]int64 {
100 return mx
101 }
102
103 -func (g *Geth) Cleanup() {
104 - if g.prom != nil && g.prom.HTTPClient() != nil {
105 - g.prom.HTTPClient().CloseIdleConnections()
103 +func (c *Collector) Cleanup() {
104 + if c.prom != nil && c.prom.HTTPClient() != nil {
105 + c.prom.HTTPClient().CloseIdleConnections()
106 }
107 }
src/go/plugin/go.d/collector/geth/collector_test.go renamed
+2 -2
@@ -25,6 +25,6 @@ func Test_testDataIsValid(t *testing.T) {
25 }
26 }
27
28 -func TestGeth_ConfigurationSerialize(t *testing.T) {
29 - module.TestConfigurationSerialize(t, &Geth{}, dataConfigJSON, dataConfigYAML)
28 +func TestCollector_ConfigurationSerialize(t *testing.T) {
29 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
30 }
src/go/plugin/go.d/collector/geth/init.go
+5 -5
@@ -7,18 +7,18 @@ import (
7 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/web"
8 )
9
10 -func (g *Geth) validateConfig() error {
11 - if g.URL == "" {
10 +func (c *Collector) validateConfig() error {
11 + if c.URL == "" {
12 return errors.New("url not set")
13 }
14 return nil
15 }
16
17 -func (g *Geth) initPrometheusClient() (prometheus.Prometheus, error) {
18 - client, err := web.NewHTTPClient(g.ClientConfig)
17 +func (c *Collector) initPrometheusClient() (prometheus.Prometheus, error) {
18 + client, err := web.NewHTTPClient(c.ClientConfig)
19 if err != nil {
20 return nil, err
21 }
22
23 - return prometheus.New(client, g.RequestConfig), nil
23 + return prometheus.New(client, c.RequestConfig), nil
24 }
src/go/plugin/go.d/collector/haproxy/collect.go
+21 -21
@@ -30,16 +30,16 @@ func isHaproxyMetrics(pms prometheus.Series) bool {
30 return false
31 }
32
33 -func (h *Haproxy) collect() (map[string]int64, error) {
34 - pms, err := h.prom.ScrapeSeries()
33 +func (c *Collector) collect() (map[string]int64, error) {
34 + pms, err := c.prom.ScrapeSeries()
35 if err != nil {
36 return nil, err
37 }
38
39 - if h.validateMetrics && !isHaproxyMetrics(pms) {
39 + if c.validateMetrics && !isHaproxyMetrics(pms) {
40 return nil, errors.New("unexpected metrics (not HAProxy)")
41 }
42 - h.validateMetrics = false
42 + c.validateMetrics = false
43
44 mx := make(map[string]int64)
45 for _, pm := range pms {
@@ -48,9 +48,9 @@ func (h *Haproxy) collect() (map[string]int64, error) {
48 continue
49 }
50
51 - if !h.proxies[proxy] {
52 - h.proxies[proxy] = true
53 - h.addProxyToCharts(proxy)
51 + if !c.proxies[proxy] {
52 + c.proxies[proxy] = true
53 + c.addProxyToCharts(proxy)
54 }
55
56 mx[dimID(pm)] = int64(pm.Value * multiplier(pm))
@@ -59,47 +59,47 @@ func (h *Haproxy) collect() (map[string]int64, error) {
59 return mx, nil
60 }
61
62 -func (h *Haproxy) addProxyToCharts(proxy string) {
63 - h.addDimToChart(chartBackendCurrentSessions.ID, &module.Dim{
62 +func (c *Collector) addProxyToCharts(proxy string) {
63 + c.addDimToChart(chartBackendCurrentSessions.ID, &module.Dim{
64 ID: proxyDimID(metricBackendCurrentSessions, proxy),
65 Name: proxy,
66 })
67 - h.addDimToChart(chartBackendSessions.ID, &module.Dim{
67 + c.addDimToChart(chartBackendSessions.ID, &module.Dim{
68 ID: proxyDimID(metricBackendSessionsTotal, proxy),
69 Name: proxy,
70 Algo: module.Incremental,
71 })
72
73 - h.addDimToChart(chartBackendResponseTimeAverage.ID, &module.Dim{
73 + c.addDimToChart(chartBackendResponseTimeAverage.ID, &module.Dim{
74 ID: proxyDimID(metricBackendResponseTimeAverageSeconds, proxy),
75 Name: proxy,
76 })
77 - if err := h.Charts().Add(newChartBackendHTTPResponses(proxy)); err != nil {
78 - h.Warning(err)
77 + if err := c.Charts().Add(newChartBackendHTTPResponses(proxy)); err != nil {
78 + c.Warning(err)
79 }
80
81 - h.addDimToChart(chartBackendCurrentQueue.ID, &module.Dim{
81 + c.addDimToChart(chartBackendCurrentQueue.ID, &module.Dim{
82 ID: proxyDimID(metricBackendCurrentQueue, proxy),
83 Name: proxy,
84 })
85 - h.addDimToChart(chartBackendQueueTimeAverage.ID, &module.Dim{
85 + c.addDimToChart(chartBackendQueueTimeAverage.ID, &module.Dim{
86 ID: proxyDimID(metricBackendQueueTimeAverageSeconds, proxy),
87 Name: proxy,
88 })
89
90 - if err := h.Charts().Add(newChartBackendNetworkIO(proxy)); err != nil {
91 - h.Warning(err)
90 + if err := c.Charts().Add(newChartBackendNetworkIO(proxy)); err != nil {
91 + c.Warning(err)
92 }
93 }
94
95 -func (h *Haproxy) addDimToChart(chartID string, dim *module.Dim) {
96 - chart := h.Charts().Get(chartID)
95 +func (c *Collector) addDimToChart(chartID string, dim *module.Dim) {
96 + chart := c.Charts().Get(chartID)
97 if chart == nil {
98 - h.Warningf("error on adding '%s' dimension: can not find '%s' chart", dim.ID, chartID)
98 + c.Warningf("error on adding '%s' dimension: can not find '%s' chart", dim.ID, chartID)
99 return
100 }
101 if err := chart.AddDim(dim); err != nil {
102 - h.Warning(err)
102 + c.Warning(err)
103 return
104 }
105 chart.MarkNotCreated()
src/go/plugin/go.d/collector/haproxy/collector.go renamed
+19 -19
@@ -25,8 +25,8 @@ func init() {
25 })
26 }
27
28 -func New() *Haproxy {
29 - return &Haproxy{
28 +func New() *Collector {
29 + return &Collector{
30 Config: Config{
31 HTTPConfig: web.HTTPConfig{
32 RequestConfig: web.RequestConfig{
@@ -49,7 +49,7 @@ type Config struct {
49 UpdateEvery int `yaml:"update_every" json:"update_every"`
50 }
51
52 -type Haproxy struct {
52 +type Collector struct {
53 module.Base
54 Config `yaml:",inline" json:""`
55
@@ -61,26 +61,26 @@ type Haproxy struct {
61 proxies map[string]bool
62 }
63
64 -func (h *Haproxy) Configuration() any {
65 - return h.Config
64 +func (c *Collector) Configuration() any {
65 + return c.Config
66 }
67
68 -func (h *Haproxy) Init() error {
69 - if err := h.validateConfig(); err != nil {
68 +func (c *Collector) Init() error {
69 + if err := c.validateConfig(); err != nil {
70 return fmt.Errorf("config validation: %v", err)
71 }
72
73 - prom, err := h.initPrometheusClient()
73 + prom, err := c.initPrometheusClient()
74 if err != nil {
75 return fmt.Errorf("prometheus client initialization: %v", err)
76 }
77 - h.prom = prom
77 + c.prom = prom
78
79 return nil
80 }
81
82 -func (h *Haproxy) Check() error {
83 - mx, err := h.collect()
82 +func (c *Collector) Check() error {
83 + mx, err := c.collect()
84 if err != nil {
85 return err
86 }
@@ -90,14 +90,14 @@ func (h *Haproxy) Check() error {
90 return nil
91 }
92
93 -func (h *Haproxy) Charts() *module.Charts {
94 - return h.charts
93 +func (c *Collector) Charts() *module.Charts {
94 + return c.charts
95 }
96
97 -func (h *Haproxy) Collect() map[string]int64 {
98 - mx, err := h.collect()
97 +func (c *Collector) Collect() map[string]int64 {
98 + mx, err := c.collect()
99 if err != nil {
100 - h.Error(err)
100 + c.Error(err)
101 return nil
102 }
103
@@ -107,8 +107,8 @@ func (h *Haproxy) Collect() map[string]int64 {
107 return mx
108 }
109
110 -func (h *Haproxy) Cleanup() {
111 - if h.prom != nil && h.prom.HTTPClient() != nil {
112 - h.prom.HTTPClient().CloseIdleConnections()
110 +func (c *Collector) Cleanup() {
111 + if c.prom != nil && c.prom.HTTPClient() != nil {
112 + c.prom.HTTPClient().CloseIdleConnections()
113 }
114 }
src/go/plugin/go.d/collector/haproxy/collector_test.go renamed
+39 -39
@@ -33,11 +33,11 @@ func Test_testDataIsValid(t *testing.T) {
33 }
34 }
35
36 -func TestHaproxy_ConfigurationSerialize(t *testing.T) {
37 - module.TestConfigurationSerialize(t, &Haproxy{}, dataConfigJSON, dataConfigYAML)
36 +func TestCollector_ConfigurationSerialize(t *testing.T) {
37 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
38 }
39
40 -func TestHaproxy_Init(t *testing.T) {
40 +func TestCollector_Init(t *testing.T) {
41 tests := map[string]struct {
42 config Config
43 wantFail bool
@@ -64,30 +64,30 @@ func TestHaproxy_Init(t *testing.T) {
64
65 for name, test := range tests {
66 t.Run(name, func(t *testing.T) {
67 - rdb := New()
68 - rdb.Config = test.config
67 + collr := New()
68 + collr.Config = test.config
69
70 if test.wantFail {
71 - assert.Error(t, rdb.Init())
71 + assert.Error(t, collr.Init())
72 } else {
73 - assert.NoError(t, rdb.Init())
73 + assert.NoError(t, collr.Init())
74 }
75 })
76 }
77 }
78
79 -func TestHaproxy_Charts(t *testing.T) {
79 +func TestCollector_Charts(t *testing.T) {
80 assert.NotNil(t, New().Charts())
81 }
82
83 -func TestHaproxy_Cleanup(t *testing.T) {
83 +func TestCollector_Cleanup(t *testing.T) {
84 assert.NotPanics(t, New().Cleanup)
85 }
86
87 -func TestHaproxy_Check(t *testing.T) {
87 +func TestCollector_Check(t *testing.T) {
88 tests := map[string]struct {
89 wantFail bool
90 - prepare func(t *testing.T) (h *Haproxy, cleanup func())
90 + prepare func(t *testing.T) (h *Collector, cleanup func())
91 }{
92 "success on valid response v2.3.1": {
93 wantFail: false,
@@ -109,21 +109,21 @@ func TestHaproxy_Check(t *testing.T) {
109
110 for name, test := range tests {
111 t.Run(name, func(t *testing.T) {
112 - h, cleanup := test.prepare(t)
112 + collr, cleanup := test.prepare(t)
113 defer cleanup()
114
115 if test.wantFail {
116 - assert.Error(t, h.Check())
116 + assert.Error(t, collr.Check())
117 } else {
118 - assert.NoError(t, h.Check())
118 + assert.NoError(t, collr.Check())
119 }
120 })
121 }
122 }
123
124 -func TestHaproxy_Collect(t *testing.T) {
124 +func TestCollector_Collect(t *testing.T) {
125 tests := map[string]struct {
126 - prepare func(t *testing.T) (h *Haproxy, cleanup func())
126 + prepare func(t *testing.T) (c *Collector, cleanup func())
127 wantCollected map[string]int64
128 }{
129 "success on valid response v2.3.1": {
@@ -170,33 +170,33 @@ func TestHaproxy_Collect(t *testing.T) {
170
171 for name, test := range tests {
172 t.Run(name, func(t *testing.T) {
173 - h, cleanup := test.prepare(t)
173 + collr, cleanup := test.prepare(t)
174 defer cleanup()
175
176 - mx := h.Collect()
176 + mx := collr.Collect()
177
178 assert.Equal(t, test.wantCollected, mx)
179 if len(test.wantCollected) > 0 {
180 - module.TestMetricsHasAllChartsDims(t, h.Charts(), mx)
180 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
181 }
182 })
183 }
184 }
185
186 -func prepareCaseHaproxyV231Metrics(t *testing.T) (*Haproxy, func()) {
186 +func prepareCaseHaproxyV231Metrics(t *testing.T) (*Collector, func()) {
187 t.Helper()
188 srv := httptest.NewServer(http.HandlerFunc(
189 func(w http.ResponseWriter, r *http.Request) {
190 _, _ = w.Write(dataVer2310Metrics)
191 }))
192 - h := New()
193 - h.URL = srv.URL
194 - require.NoError(t, h.Init())
192 + collr := New()
193 + collr.URL = srv.URL
194 + require.NoError(t, collr.Init())
195
196 - return h, srv.Close
196 + return collr, srv.Close
197 }
198
199 -func prepareCaseNotHaproxyMetrics(t *testing.T) (*Haproxy, func()) {
199 +func prepareCaseNotHaproxyMetrics(t *testing.T) (*Collector, func()) {
200 t.Helper()
201 srv := httptest.NewServer(http.HandlerFunc(
202 func(w http.ResponseWriter, r *http.Request) {
@@ -217,31 +217,31 @@ application_backend_http_responses_total{proxy="infra-traefik-web",code="other"}
217 application_backend_http_responses_total{proxy="infra-vernemq-ws",code="other"} 0
218 `))
219 }))
220 - h := New()
221 - h.URL = srv.URL
222 - require.NoError(t, h.Init())
220 + collr := New()
221 + collr.URL = srv.URL
222 + require.NoError(t, collr.Init())
223
224 - return h, srv.Close
224 + return collr, srv.Close
225 }
226
227 -func prepareCase404Response(t *testing.T) (*Haproxy, func()) {
227 +func prepareCase404Response(t *testing.T) (*Collector, func()) {
228 t.Helper()
229 srv := httptest.NewServer(http.HandlerFunc(
230 func(w http.ResponseWriter, r *http.Request) {
231 w.WriteHeader(http.StatusNotFound)
232 }))
233 - h := New()
234 - h.URL = srv.URL
235 - require.NoError(t, h.Init())
233 + collr := New()
234 + collr.URL = srv.URL
235 + require.NoError(t, collr.Init())
236
237 - return h, srv.Close
237 + return collr, srv.Close
238 }
239
240 -func prepareCaseConnectionRefused(t *testing.T) (*Haproxy, func()) {
240 +func prepareCaseConnectionRefused(t *testing.T) (*Collector, func()) {
241 t.Helper()
242 - h := New()
243 - h.URL = "http://127.0.0.1:38001"
244 - require.NoError(t, h.Init())
242 + collr := New()
243 + collr.URL = "http://127.0.0.1:38001"
244 + require.NoError(t, collr.Init())
245
246 - return h, func() {}
246 + return collr, func() {}
247 }
src/go/plugin/go.d/collector/haproxy/init.go
+6 -6
@@ -10,23 +10,23 @@ import (
10 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/web"
11 )
12
13 -func (h *Haproxy) validateConfig() error {
14 - if h.URL == "" {
13 +func (c *Collector) validateConfig() error {
14 + if c.URL == "" {
15 return errors.New("'url' is not set")
16 }
17 - if _, err := web.NewHTTPRequest(h.RequestConfig); err != nil {
17 + if _, err := web.NewHTTPRequest(c.RequestConfig); err != nil {
18 return err
19 }
20 return nil
21 }
22
23 -func (h *Haproxy) initPrometheusClient() (prometheus.Prometheus, error) {
24 - httpClient, err := web.NewHTTPClient(h.ClientConfig)
23 +func (c *Collector) initPrometheusClient() (prometheus.Prometheus, error) {
24 + httpClient, err := web.NewHTTPClient(c.ClientConfig)
25 if err != nil {
26 return nil, err
27 }
28
29 - prom := prometheus.NewWithSelector(httpClient, h.RequestConfig, sr)
29 + prom := prometheus.NewWithSelector(httpClient, c.RequestConfig, sr)
30 return prom, nil
31 }
32
src/go/plugin/go.d/collector/hddtemp/charts.go
+7 -7
@@ -46,15 +46,15 @@ var (
46 }
47 )
48
49 -func (h *HddTemp) addDiskTempSensorStatusChart(id string, disk diskStats) {
50 - h.addDiskChart(id, disk, diskTemperatureSensorChartsTmpl.Copy())
49 +func (c *Collector) addDiskTempSensorStatusChart(id string, disk diskStats) {
50 + c.addDiskChart(id, disk, diskTemperatureSensorChartsTmpl.Copy())
51 }
52
53 -func (h *HddTemp) addDiskTempChart(id string, disk diskStats) {
54 - h.addDiskChart(id, disk, diskTemperatureChartsTmpl.Copy())
53 +func (c *Collector) addDiskTempChart(id string, disk diskStats) {
54 + c.addDiskChart(id, disk, diskTemperatureChartsTmpl.Copy())
55 }
56
57 -func (h *HddTemp) addDiskChart(id string, disk diskStats, chart *module.Chart) {
57 +func (c *Collector) addDiskChart(id string, disk diskStats, chart *module.Chart) {
58 chart.ID = fmt.Sprintf(chart.ID, strings.ToLower(id))
59 chart.Labels = []module.Label{
60 {Key: "disk_id", Value: id},
@@ -64,7 +64,7 @@ func (h *HddTemp) addDiskChart(id string, disk diskStats, chart *module.Chart) {
64 dim.ID = fmt.Sprintf(dim.ID, id)
65 }
66
67 - if err := h.Charts().Add(chart); err != nil {
68 - h.Warning(err)
67 + if err := c.Charts().Add(chart); err != nil {
68 + c.Warning(err)
69 }
70 }
src/go/plugin/go.d/collector/hddtemp/collect.go
+10 -10
@@ -16,13 +16,13 @@ type diskStats struct {
16 unit string
17 }
18
19 -func (h *HddTemp) collect() (map[string]int64, error) {
20 - msg, err := h.conn.queryHddTemp()
19 +func (c *Collector) collect() (map[string]int64, error) {
20 + msg, err := c.conn.queryHddTemp()
21 if err != nil {
22 return nil, err
23 }
24
25 - h.Debugf("hddtemp daemon response: %s", msg)
25 + c.Debugf("hddtemp daemon response: %s", msg)
26
27 disks, err := parseHddTempMessage(msg)
28 if err != nil {
@@ -34,13 +34,13 @@ func (h *HddTemp) collect() (map[string]int64, error) {
34 for _, disk := range disks {
35 id := getDiskID(disk)
36 if id == "" {
37 - h.Debugf("can not extract disk id from '%s'", disk.devPath)
37 + c.Debugf("can not extract disk id from '%s'", disk.devPath)
38 continue
39 }
40
41 - if !h.disks[id] {
42 - h.disks[id] = true
43 - h.addDiskTempSensorStatusChart(id, disk)
41 + if !c.disks[id] {
42 + c.disks[id] = true
43 + c.addDiskTempSensorStatusChart(id, disk)
44 }
45
46 px := fmt.Sprintf("disk_%s_", id)
@@ -61,9 +61,9 @@ func (h *HddTemp) collect() (map[string]int64, error) {
61 mx[px+"temp_sensor_status_err"] = 1
62 default:
63 if v, ok := getTemperature(disk); ok {
64 - if !h.disksTemp[id] {
65 - h.disksTemp[id] = true
66 - h.addDiskTempChart(id, disk)
64 + if !c.disksTemp[id] {
65 + c.disksTemp[id] = true
66 + c.addDiskTempChart(id, disk)
67 }
68 mx[px+"temp_sensor_status_ok"] = 1
69 mx[px+"temperature"] = v
src/go/plugin/go.d/collector/hddtemp/collector.go renamed
+16 -16
@@ -23,8 +23,8 @@ func init() {
23 })
24 }
25
26 -func New() *HddTemp {
27 - return &HddTemp{
26 +func New() *Collector {
27 + return &Collector{
28 Config: Config{
29 Address: "127.0.0.1:7634",
30 Timeout: confopt.Duration(time.Second * 1),
@@ -41,7 +41,7 @@ type Config struct {
41 Timeout confopt.Duration `yaml:"timeout" json:"timeout"`
42 }
43
44 -type HddTemp struct {
44 +type Collector struct {
45 module.Base
46 Config `yaml:",inline" json:""`
47
@@ -53,22 +53,22 @@ type HddTemp struct {
53 disksTemp map[string]bool
54 }
55
56 -func (h *HddTemp) Configuration() any {
57 - return h.Config
56 +func (c *Collector) Configuration() any {
57 + return c.Config
58 }
59
60 -func (h *HddTemp) Init() error {
61 - if h.Address == "" {
60 +func (c *Collector) Init() error {
61 + if c.Address == "" {
62 return fmt.Errorf("config: 'address' not set")
63 }
64
65 - h.conn = newHddTempConn(h.Config)
65 + c.conn = newHddTempConn(c.Config)
66
67 return nil
68 }
69
70 -func (h *HddTemp) Check() error {
71 - mx, err := h.collect()
70 +func (c *Collector) Check() error {
71 + mx, err := c.collect()
72 if err != nil {
73 return err
74 }
@@ -78,14 +78,14 @@ func (h *HddTemp) Check() error {
78 return nil
79 }
80
81 -func (h *HddTemp) Charts() *module.Charts {
82 - return h.charts
81 +func (c *Collector) Charts() *module.Charts {
82 + return c.charts
83 }
84
85 -func (h *HddTemp) Collect() map[string]int64 {
86 - mx, err := h.collect()
85 +func (c *Collector) Collect() map[string]int64 {
86 + mx, err := c.collect()
87 if err != nil {
88 - h.Error(err)
88 + c.Error(err)
89 }
90
91 if len(mx) == 0 {
@@ -94,4 +94,4 @@ func (h *HddTemp) Collect() map[string]int64 {
94 return mx
95 }
96
97 -func (h *HddTemp) Cleanup() {}
97 +func (c *Collector) Cleanup() {}
src/go/plugin/go.d/collector/hddtemp/collector_test.go renamed
+34 -34
@@ -33,11 +33,11 @@ func Test_testDataIsValid(t *testing.T) {
33 }
34 }
35
36 -func TestHddTemp_ConfigurationSerialize(t *testing.T) {
37 - module.TestConfigurationSerialize(t, &HddTemp{}, dataConfigJSON, dataConfigYAML)
36 +func TestCollector_ConfigurationSerialize(t *testing.T) {
37 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
38 }
39
40 -func TestHddTemp_Init(t *testing.T) {
40 +func TestCollector_Init(t *testing.T) {
41 tests := map[string]struct {
42 config Config
43 wantFail bool
@@ -58,59 +58,59 @@ func TestHddTemp_Init(t *testing.T) {
58
59 for name, test := range tests {
60 t.Run(name, func(t *testing.T) {
61 - hdd := New()
62 - hdd.Config = test.config
61 + collr := New()
62 + collr.Config = test.config
63
64 if test.wantFail {
65 - assert.Error(t, hdd.Init())
65 + assert.Error(t, collr.Init())
66 } else {
67 - assert.NoError(t, hdd.Init())
67 + assert.NoError(t, collr.Init())
68 }
69 })
70 }
71 }
72
73 -func TestHddTemp_Cleanup(t *testing.T) {
73 +func TestCollector_Cleanup(t *testing.T) {
74 tests := map[string]struct {
75 - prepare func() *HddTemp
75 + prepare func() *Collector
76 }{
77 "not initialized": {
78 - prepare: func() *HddTemp {
78 + prepare: func() *Collector {
79 return New()
80 },
81 },
82 "after check": {
83 - prepare: func() *HddTemp {
84 - hdd := New()
85 - hdd.conn = prepareMockAllDisksOk()
86 - _ = hdd.Check()
87 - return hdd
83 + prepare: func() *Collector {
84 + collr := New()
85 + collr.conn = prepareMockAllDisksOk()
86 + _ = collr.Check()
87 + return collr
88 },
89 },
90 "after collect": {
91 - prepare: func() *HddTemp {
92 - hdd := New()
93 - hdd.conn = prepareMockAllDisksOk()
94 - _ = hdd.Collect()
95 - return hdd
91 + prepare: func() *Collector {
92 + collr := New()
93 + collr.conn = prepareMockAllDisksOk()
94 + _ = collr.Collect()
95 + return collr
96 },
97 },
98 }
99
100 for name, test := range tests {
101 t.Run(name, func(t *testing.T) {
102 - hdd := test.prepare()
102 + collr := test.prepare()
103
104 - assert.NotPanics(t, hdd.Cleanup)
104 + assert.NotPanics(t, collr.Cleanup)
105 })
106 }
107 }
108
109 -func TestHddTemp_Charts(t *testing.T) {
109 +func TestCollector_Charts(t *testing.T) {
110 assert.NotNil(t, New().Charts())
111 }
112
113 -func TestHddTemp_Check(t *testing.T) {
113 +func TestCollector_Check(t *testing.T) {
114 tests := map[string]struct {
115 prepareMock func() *mockHddTempConn
116 wantFail bool
@@ -135,19 +135,19 @@ func TestHddTemp_Check(t *testing.T) {
135
136 for name, test := range tests {
137 t.Run(name, func(t *testing.T) {
138 - hdd := New()
139 - hdd.conn = test.prepareMock()
138 + collr := New()
139 + collr.conn = test.prepareMock()
140
141 if test.wantFail {
142 - assert.Error(t, hdd.Check())
142 + assert.Error(t, collr.Check())
143 } else {
144 - assert.NoError(t, hdd.Check())
144 + assert.NoError(t, collr.Check())
145 }
146 })
147 }
148 }
149
150 -func TestHddTemp_Collect(t *testing.T) {
150 +func TestCollector_Collect(t *testing.T) {
151 tests := map[string]struct {
152 prepareMock func() *mockHddTempConn
153 wantMetrics map[string]int64
@@ -226,16 +226,16 @@ func TestHddTemp_Collect(t *testing.T) {
226
227 for name, test := range tests {
228 t.Run(name, func(t *testing.T) {
229 - hdd := New()
230 - hdd.conn = test.prepareMock()
229 + collr := New()
230 + collr.conn = test.prepareMock()
231
232 - mx := hdd.Collect()
232 + mx := collr.Collect()
233
234 assert.Equal(t, test.wantMetrics, mx)
235
236 - assert.Len(t, *hdd.Charts(), test.wantCharts, "wantCharts")
236 + assert.Len(t, *collr.Charts(), test.wantCharts, "wantCharts")
237
238 - module.TestMetricsHasAllChartsDims(t, hdd.Charts(), mx)
238 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
239 })
240 }
241 }
src/go/plugin/go.d/collector/hdfs/collect.go
+39 -34
@@ -12,14 +12,19 @@ import (
12 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/web"
13 )
14
15 -func (h *HDFS) collect() (map[string]int64, error) {
16 - req, err := web.NewHTTPRequest(h.RequestConfig)
15 +const (
16 + dataNodeType = "DataNode"
17 + nameNodeType = "NameNode"
18 +)
19 +
20 +func (c *Collector) collect() (map[string]int64, error) {
21 + req, err := web.NewHTTPRequest(c.RequestConfig)
22 if err != nil {
23 return nil, fmt.Errorf("failed to create HTTP request: %v", err)
24 }
25
26 var raw rawJMX
22 - if err := web.DoHTTP(h.httpClient).RequestJSON(req, &raw); err != nil {
27 + if err := web.DoHTTP(c.httpClient).RequestJSON(req, &raw); err != nil {
28 return nil, err
29 }
30
@@ -27,19 +32,19 @@ func (h *HDFS) collect() (map[string]int64, error) {
32 return nil, errors.New("empty response")
33 }
34
30 - mx := h.collectRawJMX(raw)
35 + mx := c.collectRawJMX(raw)
36
37 return stm.ToMap(mx), nil
38 }
39
35 -func (h *HDFS) determineNodeType() (nodeType, error) {
36 - req, err := web.NewHTTPRequest(h.RequestConfig)
40 +func (c *Collector) determineNodeType() (string, error) {
41 + req, err := web.NewHTTPRequest(c.RequestConfig)
42 if err != nil {
43 return "", fmt.Errorf("failed to create HTTP request: %v", err)
44 }
45
46 var raw rawJMX
42 - if err := web.DoHTTP(h.httpClient).RequestJSON(req, &raw); err != nil {
47 + if err := web.DoHTTP(c.httpClient).RequestJSON(req, &raw); err != nil {
48 return "", err
49 }
50
@@ -57,59 +62,59 @@ func (h *HDFS) determineNodeType() (nodeType, error) {
62 return "", errors.New("couldn't find process name in JvmMetrics")
63 }
64
60 - t := nodeType(strings.Trim(string(v), "\""))
65 + t := strings.Trim(string(v), "\"")
66 if t == nameNodeType || t == dataNodeType {
67 return t, nil
68 }
69 return "", errors.New("unknown node type")
70 }
71
67 -func (h *HDFS) collectRawJMX(raw rawJMX) *metrics {
72 +func (c *Collector) collectRawJMX(raw rawJMX) *metrics {
73 var mx metrics
69 - switch h.nodeType {
74 + switch c.nodeType {
75 default:
71 - panic(fmt.Sprintf("unsupported node type : '%s'", h.nodeType))
76 + panic(fmt.Sprintf("unsupported node type : '%s'", c.nodeType))
77 case nameNodeType:
73 - h.collectNameNode(&mx, raw)
78 + c.collectNameNode(&mx, raw)
79 case dataNodeType:
75 - h.collectDataNode(&mx, raw)
80 + c.collectDataNode(&mx, raw)
81 }
82 return &mx
83 }
84
80 -func (h *HDFS) collectNameNode(mx *metrics, raw rawJMX) {
81 - if err := h.collectJVM(mx, raw); err != nil {
82 - h.Debugf("error on collecting jvm : %v", err)
85 +func (c *Collector) collectNameNode(mx *metrics, raw rawJMX) {
86 + if err := c.collectJVM(mx, raw); err != nil {
87 + c.Debugf("error on collecting jvm : %v", err)
88 }
89
85 - if err := h.collectRPCActivity(mx, raw); err != nil {
86 - h.Debugf("error on collecting rpc activity : %v", err)
90 + if err := c.collectRPCActivity(mx, raw); err != nil {
91 + c.Debugf("error on collecting rpc activity : %v", err)
92 }
93
89 - if err := h.collectFSNameSystem(mx, raw); err != nil {
90 - h.Debugf("error on collecting fs name system : %v", err)
94 + if err := c.collectFSNameSystem(mx, raw); err != nil {
95 + c.Debugf("error on collecting fs name system : %v", err)
96 }
97 }
98
94 -func (h *HDFS) collectDataNode(mx *metrics, raw rawJMX) {
95 - if err := h.collectJVM(mx, raw); err != nil {
96 - h.Debugf("error on collecting jvm : %v", err)
99 +func (c *Collector) collectDataNode(mx *metrics, raw rawJMX) {
100 + if err := c.collectJVM(mx, raw); err != nil {
101 + c.Debugf("error on collecting jvm : %v", err)
102 }
103
99 - if err := h.collectRPCActivity(mx, raw); err != nil {
100 - h.Debugf("error on collecting rpc activity : %v", err)
104 + if err := c.collectRPCActivity(mx, raw); err != nil {
105 + c.Debugf("error on collecting rpc activity : %v", err)
106 }
107
103 - if err := h.collectFSDatasetState(mx, raw); err != nil {
104 - h.Debugf("error on collecting fs dataset state : %v", err)
108 + if err := c.collectFSDatasetState(mx, raw); err != nil {
109 + c.Debugf("error on collecting fs dataset state : %v", err)
110 }
111
107 - if err := h.collectDataNodeActivity(mx, raw); err != nil {
108 - h.Debugf("error on collecting datanode activity state : %v", err)
112 + if err := c.collectDataNodeActivity(mx, raw); err != nil {
113 + c.Debugf("error on collecting datanode activity state : %v", err)
114 }
115 }
116
112 -func (h *HDFS) collectJVM(mx *metrics, raw rawJMX) error {
117 +func (c *Collector) collectJVM(mx *metrics, raw rawJMX) error {
118 v := raw.findJvm()
119 if v == nil {
120 return nil
@@ -125,7 +130,7 @@ func (h *HDFS) collectJVM(mx *metrics, raw rawJMX) error {
130 return nil
131 }
132
128 -func (h *HDFS) collectRPCActivity(mx *metrics, raw rawJMX) error {
133 +func (c *Collector) collectRPCActivity(mx *metrics, raw rawJMX) error {
134 v := raw.findRPCActivity()
135 if v == nil {
136 return nil
@@ -141,7 +146,7 @@ func (h *HDFS) collectRPCActivity(mx *metrics, raw rawJMX) error {
146 return nil
147 }
148
144 -func (h *HDFS) collectFSNameSystem(mx *metrics, raw rawJMX) error {
149 +func (c *Collector) collectFSNameSystem(mx *metrics, raw rawJMX) error {
150 v := raw.findFSNameSystem()
151 if v == nil {
152 return nil
@@ -159,7 +164,7 @@ func (h *HDFS) collectFSNameSystem(mx *metrics, raw rawJMX) error {
164 return nil
165 }
166
162 -func (h *HDFS) collectFSDatasetState(mx *metrics, raw rawJMX) error {
167 +func (c *Collector) collectFSDatasetState(mx *metrics, raw rawJMX) error {
168 v := raw.findFSDatasetState()
169 if v == nil {
170 return nil
@@ -178,7 +183,7 @@ func (h *HDFS) collectFSDatasetState(mx *metrics, raw rawJMX) error {
183 return nil
184 }
185
181 -func (h *HDFS) collectDataNodeActivity(mx *metrics, raw rawJMX) error {
186 +func (c *Collector) collectDataNodeActivity(mx *metrics, raw rawJMX) error {
187 v := raw.findDataNodeActivity()
188 if v == nil {
189 return nil
src/go/plugin/go.d/collector/hdfs/collector.go renamed
+25 -33
@@ -25,7 +25,7 @@ func init() {
25 })
26 }
27
28 -func New() *HDFS {
28 +func New() *Collector {
29 config := Config{
30 HTTPConfig: web.HTTPConfig{
31 RequestConfig: web.RequestConfig{
@@ -37,7 +37,7 @@ func New() *HDFS {
37 },
38 }
39
40 - return &HDFS{
40 + return &Collector{
41 Config: config,
42 }
43 }
@@ -47,49 +47,41 @@ type Config struct {
47 UpdateEvery int `yaml:"update_every" json:"update_every"`
48 }
49
50 -type (
51 - HDFS struct {
52 - module.Base
53 - Config `yaml:",inline" json:""`
50 +type Collector struct {
51 + module.Base
52 + Config `yaml:",inline" json:""`
53
55 - httpClient *http.Client
54 + httpClient *http.Client
55
57 - nodeType
58 - }
56 nodeType string
60 -)
61 -
62 -const (
63 - dataNodeType nodeType = "DataNode"
64 - nameNodeType nodeType = "NameNode"
65 -)
57 +}
58
67 -func (h *HDFS) Configuration() any {
68 - return h.Config
59 +func (c *Collector) Configuration() any {
60 + return c.Config
61 }
62
71 -func (h *HDFS) Init() error {
72 - if h.URL == "" {
63 +func (c *Collector) Init() error {
64 + if c.URL == "" {
65 return errors.New("URL is required but not set")
66 }
67
76 - httpClient, err := web.NewHTTPClient(h.ClientConfig)
68 + httpClient, err := web.NewHTTPClient(c.ClientConfig)
69 if err != nil {
70 return fmt.Errorf("failed to create HTTP client: %v", err)
71 }
80 - h.httpClient = httpClient
72 + c.httpClient = httpClient
73
74 return nil
75 }
76
85 -func (h *HDFS) Check() error {
86 - typ, err := h.determineNodeType()
77 +func (c *Collector) Check() error {
78 + typ, err := c.determineNodeType()
79 if err != nil {
80 return fmt.Errorf("error on node type determination : %v", err)
81 }
90 - h.nodeType = typ
82 + c.nodeType = typ
83
92 - mx, err := h.collect()
84 + mx, err := c.collect()
85 if err != nil {
86 return err
87 }
@@ -101,8 +93,8 @@ func (h *HDFS) Check() error {
93 return nil
94 }
95
104 -func (h *HDFS) Charts() *Charts {
105 - switch h.nodeType {
96 +func (c *Collector) Charts() *Charts {
97 + switch c.nodeType {
98 default:
99 return nil
100 case nameNodeType:
@@ -112,18 +104,18 @@ func (h *HDFS) Charts() *Charts {
104 }
105 }
106
115 -func (h *HDFS) Collect() map[string]int64 {
116 - mx, err := h.collect()
107 +func (c *Collector) Collect() map[string]int64 {
108 + mx, err := c.collect()
109 if err != nil {
118 - h.Error(err)
110 + c.Error(err)
111 return nil
112 }
113
114 return mx
115 }
116
125 -func (h *HDFS) Cleanup() {
126 - if h.httpClient != nil {
127 - h.httpClient.CloseIdleConnections()
117 +func (c *Collector) Cleanup() {
118 + if c.httpClient != nil {
119 + c.httpClient.CloseIdleConnections()
120 }
121 }
src/go/plugin/go.d/collector/hdfs/collector_test.go renamed
+82 -82
@@ -35,24 +35,24 @@ func Test_testDataIsValid(t *testing.T) {
35 }
36 }
37
38 -func TestHDFS_ConfigurationSerialize(t *testing.T) {
39 - module.TestConfigurationSerialize(t, &HDFS{}, dataConfigJSON, dataConfigYAML)
38 +func TestCollector_ConfigurationSerialize(t *testing.T) {
39 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
40 }
41
42 -func TestHDFS_Init(t *testing.T) {
43 - job := New()
42 +func TestCollector_Init(t *testing.T) {
43 + collr := New()
44
45 - assert.NoError(t, job.Init())
45 + assert.NoError(t, collr.Init())
46 }
47
48 -func TestHDFS_InitErrorOnCreatingClientWrongTLSCA(t *testing.T) {
49 - job := New()
50 - job.ClientConfig.TLSConfig.TLSCA = "testdata/tls"
48 +func TestCollector_InitErrorOnCreatingClientWrongTLSCA(t *testing.T) {
49 + collr := New()
50 + collr.ClientConfig.TLSConfig.TLSCA = "testdata/tls"
51
52 - assert.Error(t, job.Init())
52 + assert.Error(t, collr.Init())
53 }
54
55 -func TestHDFS_Check(t *testing.T) {
55 +func TestCollector_Check(t *testing.T) {
56 ts := httptest.NewServer(
57 http.HandlerFunc(
58 func(w http.ResponseWriter, r *http.Request) {
@@ -60,15 +60,15 @@ func TestHDFS_Check(t *testing.T) {
60 }))
61 defer ts.Close()
62
63 - job := New()
64 - job.URL = ts.URL
65 - require.NoError(t, job.Init())
63 + collr := New()
64 + collr.URL = ts.URL
65 + require.NoError(t, collr.Init())
66
67 - assert.NoError(t, job.Check())
68 - assert.NotZero(t, job.nodeType)
67 + assert.NoError(t, collr.Check())
68 + assert.NotZero(t, collr.nodeType)
69 }
70
71 -func TestHDFS_CheckDataNode(t *testing.T) {
71 +func TestCollector_CheckDataNode(t *testing.T) {
72 ts := httptest.NewServer(
73 http.HandlerFunc(
74 func(w http.ResponseWriter, r *http.Request) {
@@ -76,15 +76,15 @@ func TestHDFS_CheckDataNode(t *testing.T) {
76 }))
77 defer ts.Close()
78
79 - job := New()
80 - job.URL = ts.URL
81 - require.NoError(t, job.Init())
79 + collr := New()
80 + collr.URL = ts.URL
81 + require.NoError(t, collr.Init())
82
83 - assert.NoError(t, job.Check())
84 - assert.Equal(t, dataNodeType, job.nodeType)
83 + assert.NoError(t, collr.Check())
84 + assert.Equal(t, dataNodeType, collr.nodeType)
85 }
86
87 -func TestHDFS_CheckNameNode(t *testing.T) {
87 +func TestCollector_CheckNameNode(t *testing.T) {
88 ts := httptest.NewServer(
89 http.HandlerFunc(
90 func(w http.ResponseWriter, r *http.Request) {
@@ -92,15 +92,15 @@ func TestHDFS_CheckNameNode(t *testing.T) {
92 }))
93 defer ts.Close()
94
95 - job := New()
96 - job.URL = ts.URL
97 - require.NoError(t, job.Init())
95 + collr := New()
96 + collr.URL = ts.URL
97 + require.NoError(t, collr.Init())
98
99 - assert.NoError(t, job.Check())
100 - assert.Equal(t, nameNodeType, job.nodeType)
99 + assert.NoError(t, collr.Check())
100 + assert.Equal(t, nameNodeType, collr.nodeType)
101 }
102
103 -func TestHDFS_CheckErrorOnNodeTypeDetermination(t *testing.T) {
103 +func TestCollector_CheckErrorOnNodeTypeDetermination(t *testing.T) {
104 ts := httptest.NewServer(
105 http.HandlerFunc(
106 func(w http.ResponseWriter, r *http.Request) {
@@ -108,50 +108,50 @@ func TestHDFS_CheckErrorOnNodeTypeDetermination(t *testing.T) {
108 }))
109 defer ts.Close()
110
111 - job := New()
112 - job.URL = ts.URL
113 - require.NoError(t, job.Init())
111 + collr := New()
112 + collr.URL = ts.URL
113 + require.NoError(t, collr.Init())
114
115 - assert.Error(t, job.Check())
115 + assert.Error(t, collr.Check())
116 }
117
118 -func TestHDFS_CheckNoResponse(t *testing.T) {
119 - job := New()
120 - job.URL = "http://127.0.0.1:38001/jmx"
121 - require.NoError(t, job.Init())
118 +func TestCollector_CheckNoResponse(t *testing.T) {
119 + collr := New()
120 + collr.URL = "http://127.0.0.1:38001/jmx"
121 + require.NoError(t, collr.Init())
122
123 - assert.Error(t, job.Check())
123 + assert.Error(t, collr.Check())
124 }
125
126 -func TestHDFS_Charts(t *testing.T) {
126 +func TestCollector_Charts(t *testing.T) {
127 assert.Nil(t, New().Charts())
128 }
129
130 -func TestHDFS_ChartsUnknownNode(t *testing.T) {
131 - job := New()
130 +func TestCollector_ChartsUnknownNode(t *testing.T) {
131 + collr := New()
132
133 - assert.Nil(t, job.Charts())
133 + assert.Nil(t, collr.Charts())
134 }
135
136 -func TestHDFS_ChartsDataNode(t *testing.T) {
137 - job := New()
138 - job.nodeType = dataNodeType
136 +func TestCollector_ChartsDataNode(t *testing.T) {
137 + collr := New()
138 + collr.nodeType = dataNodeType
139
140 - assert.Equal(t, dataNodeCharts(), job.Charts())
140 + assert.Equal(t, dataNodeCharts(), collr.Charts())
141 }
142
143 -func TestHDFS_ChartsNameNode(t *testing.T) {
144 - job := New()
145 - job.nodeType = nameNodeType
143 +func TestCollector_ChartsNameNode(t *testing.T) {
144 + collr := New()
145 + collr.nodeType = nameNodeType
146
147 - assert.Equal(t, nameNodeCharts(), job.Charts())
147 + assert.Equal(t, nameNodeCharts(), collr.Charts())
148 }
149
150 -func TestHDFS_Cleanup(t *testing.T) {
150 +func TestCollector_Cleanup(t *testing.T) {
151 New().Cleanup()
152 }
153
154 -func TestHDFS_CollectDataNode(t *testing.T) {
154 +func TestCollector_CollectDataNode(t *testing.T) {
155 ts := httptest.NewServer(
156 http.HandlerFunc(
157 func(w http.ResponseWriter, r *http.Request) {
@@ -159,10 +159,10 @@ func TestHDFS_CollectDataNode(t *testing.T) {
159 }))
160 defer ts.Close()
161
162 - job := New()
163 - job.URL = ts.URL
164 - require.NoError(t, job.Init())
165 - require.NoError(t, job.Check())
162 + collr := New()
163 + collr.URL = ts.URL
164 + require.NoError(t, collr.Init())
165 + require.NoError(t, collr.Check())
166
167 expected := map[string]int64{
168 "dna_bytes_read": 80689178,
@@ -200,10 +200,10 @@ func TestHDFS_CollectDataNode(t *testing.T) {
200 "rpc_sent_bytes": 187,
201 }
202
203 - assert.Equal(t, expected, job.Collect())
203 + assert.Equal(t, expected, collr.Collect())
204 }
205
206 -func TestHDFS_CollectNameNode(t *testing.T) {
206 +func TestCollector_CollectNameNode(t *testing.T) {
207 ts := httptest.NewServer(
208 http.HandlerFunc(
209 func(w http.ResponseWriter, r *http.Request) {
@@ -211,10 +211,10 @@ func TestHDFS_CollectNameNode(t *testing.T) {
211 }))
212 defer ts.Close()
213
214 - job := New()
215 - job.URL = ts.URL
216 - require.NoError(t, job.Init())
217 - require.NoError(t, job.Check())
214 + collr := New()
215 + collr.URL = ts.URL
216 + require.NoError(t, collr.Init())
217 + require.NoError(t, collr.Check())
218
219 expected := map[string]int64{
220 "fsns_blocks_total": 15,
@@ -259,10 +259,10 @@ func TestHDFS_CollectNameNode(t *testing.T) {
259 "rpc_sent_bytes": 25067414,
260 }
261
262 - assert.Equal(t, expected, job.Collect())
262 + assert.Equal(t, expected, collr.Collect())
263 }
264
265 -func TestHDFS_CollectUnknownNode(t *testing.T) {
265 +func TestCollector_CollectUnknownNode(t *testing.T) {
266 ts := httptest.NewServer(
267 http.HandlerFunc(
268 func(w http.ResponseWriter, r *http.Request) {
@@ -270,22 +270,22 @@ func TestHDFS_CollectUnknownNode(t *testing.T) {
270 }))
271 defer ts.Close()
272
273 - job := New()
274 - job.URL = ts.URL
275 - require.NoError(t, job.Init())
273 + collr := New()
274 + collr.URL = ts.URL
275 + require.NoError(t, collr.Init())
276
277 - assert.Panics(t, func() { _ = job.Collect() })
277 + assert.Panics(t, func() { _ = collr.Collect() })
278 }
279
280 -func TestHDFS_CollectNoResponse(t *testing.T) {
281 - job := New()
282 - job.URL = "http://127.0.0.1:38001/jmx"
283 - require.NoError(t, job.Init())
280 +func TestCollector_CollectNoResponse(t *testing.T) {
281 + collr := New()
282 + collr.URL = "http://127.0.0.1:38001/jmx"
283 + require.NoError(t, collr.Init())
284
285 - assert.Nil(t, job.Collect())
285 + assert.Nil(t, collr.Collect())
286 }
287
288 -func TestHDFS_CollectReceiveInvalidResponse(t *testing.T) {
288 +func TestCollector_CollectReceiveInvalidResponse(t *testing.T) {
289 ts := httptest.NewServer(
290 http.HandlerFunc(
291 func(w http.ResponseWriter, r *http.Request) {
@@ -293,14 +293,14 @@ func TestHDFS_CollectReceiveInvalidResponse(t *testing.T) {
293 }))
294 defer ts.Close()
295
296 - job := New()
297 - job.URL = ts.URL
298 - require.NoError(t, job.Init())
296 + collr := New()
297 + collr.URL = ts.URL
298 + require.NoError(t, collr.Init())
299
300 - assert.Nil(t, job.Collect())
300 + assert.Nil(t, collr.Collect())
301 }
302
303 -func TestHDFS_CollectReceive404(t *testing.T) {
303 +func TestCollector_CollectReceive404(t *testing.T) {
304 ts := httptest.NewServer(
305 http.HandlerFunc(
306 func(w http.ResponseWriter, r *http.Request) {
@@ -308,9 +308,9 @@ func TestHDFS_CollectReceive404(t *testing.T) {
308 }))
309 defer ts.Close()
310
311 - job := New()
312 - job.URL = ts.URL
313 - require.NoError(t, job.Init())
311 + collr := New()
312 + collr.URL = ts.URL
313 + require.NoError(t, collr.Init())
314
315 - assert.Nil(t, job.Collect())
315 + assert.Nil(t, collr.Collect())
316 }
src/go/plugin/go.d/collector/hpssa/charts.go
+50 -50
@@ -189,7 +189,7 @@ var (
189 }
190 )
191
192 -func (h *Hpssa) updateCharts(controllers map[string]*hpssaController) {
192 +func (c *Collector) updateCharts(controllers map[string]*hpssaController) {
193 seenControllers := make(map[string]bool)
194 seenArrays := make(map[string]bool)
195 seenLDrives := make(map[string]bool)
@@ -198,75 +198,75 @@ func (h *Hpssa) updateCharts(controllers map[string]*hpssaController) {
198 for _, cntrl := range controllers {
199 key := cntrl.uniqueKey()
200 seenControllers[key] = true
201 - if _, ok := h.seenControllers[key]; !ok {
202 - h.seenControllers[key] = cntrl
203 - h.addControllerCharts(cntrl)
201 + if _, ok := c.seenControllers[key]; !ok {
202 + c.seenControllers[key] = cntrl
203 + c.addControllerCharts(cntrl)
204 }
205
206 for _, pd := range cntrl.unassignedDrives {
207 key := pd.uniqueKey()
208 seenPDrives[key] = true
209 - if _, ok := h.seenPDrives[key]; !ok {
210 - h.seenPDrives[key] = pd
211 - h.addPhysicalDriveCharts(pd)
209 + if _, ok := c.seenPDrives[key]; !ok {
210 + c.seenPDrives[key] = pd
211 + c.addPhysicalDriveCharts(pd)
212 }
213 }
214
215 for _, arr := range cntrl.arrays {
216 key := arr.uniqueKey()
217 seenArrays[key] = true
218 - if _, ok := h.seenArrays[key]; !ok {
219 - h.seenArrays[key] = arr
220 - h.addArrayCharts(arr)
218 + if _, ok := c.seenArrays[key]; !ok {
219 + c.seenArrays[key] = arr
220 + c.addArrayCharts(arr)
221 }
222
223 for _, ld := range arr.logicalDrives {
224 key := ld.uniqueKey()
225 seenLDrives[key] = true
226 - if _, ok := h.seenLDrives[key]; !ok {
227 - h.seenLDrives[key] = ld
228 - h.addLogicalDriveCharts(ld)
226 + if _, ok := c.seenLDrives[key]; !ok {
227 + c.seenLDrives[key] = ld
228 + c.addLogicalDriveCharts(ld)
229 }
230
231 for _, pd := range ld.physicalDrives {
232 key := pd.uniqueKey()
233 seenPDrives[key] = true
234 - if _, ok := h.seenPDrives[key]; !ok {
235 - h.seenPDrives[key] = pd
236 - h.addPhysicalDriveCharts(pd)
234 + if _, ok := c.seenPDrives[key]; !ok {
235 + c.seenPDrives[key] = pd
236 + c.addPhysicalDriveCharts(pd)
237 }
238 }
239 }
240 }
241 }
242
243 - for k, cntrl := range h.seenControllers {
243 + for k, cntrl := range c.seenControllers {
244 if !seenControllers[k] {
245 - delete(h.seenControllers, k)
246 - h.removeControllerCharts(cntrl)
245 + delete(c.seenControllers, k)
246 + c.removeControllerCharts(cntrl)
247 }
248 }
249 - for k, arr := range h.seenArrays {
249 + for k, arr := range c.seenArrays {
250 if !seenArrays[k] {
251 - delete(h.seenArrays, k)
252 - h.removeArrayCharts(arr)
251 + delete(c.seenArrays, k)
252 + c.removeArrayCharts(arr)
253 }
254 }
255 - for k, ld := range h.seenLDrives {
255 + for k, ld := range c.seenLDrives {
256 if !seenLDrives[k] {
257 - delete(h.seenLDrives, k)
258 - h.removeLogicalDriveCharts(ld)
257 + delete(c.seenLDrives, k)
258 + c.removeLogicalDriveCharts(ld)
259 }
260 }
261 - for k, pd := range h.seenPDrives {
261 + for k, pd := range c.seenPDrives {
262 if !seenPDrives[k] {
263 - delete(h.seenPDrives, k)
264 - h.removePhysicalDriveCharts(pd)
263 + delete(c.seenPDrives, k)
264 + c.removePhysicalDriveCharts(pd)
265 }
266 }
267 }
268
269 -func (h *Hpssa) addControllerCharts(cntrl *hpssaController) {
269 +func (c *Collector) addControllerCharts(cntrl *hpssaController) {
270 charts := controllerChartsTmpl.Copy()
271
272 if cntrl.controllerTemperatureC == "" {
@@ -296,17 +296,17 @@ func (h *Hpssa) addControllerCharts(cntrl *hpssaController) {
296 }
297 }
298
299 - if err := h.Charts().Add(*charts...); err != nil {
300 - h.Warning(err)
299 + if err := c.Charts().Add(*charts...); err != nil {
300 + c.Warning(err)
301 }
302 }
303
304 -func (h *Hpssa) removeControllerCharts(cntrl *hpssaController) {
304 +func (c *Collector) removeControllerCharts(cntrl *hpssaController) {
305 px := fmt.Sprintf("cntrl_%s_slot_%s_", strings.ToLower(cntrl.model), cntrl.slot)
306 - h.removeCharts(px)
306 + c.removeCharts(px)
307 }
308
309 -func (h *Hpssa) addArrayCharts(arr *hpssaArray) {
309 +func (c *Collector) addArrayCharts(arr *hpssaArray) {
310 charts := arrayChartsTmpl.Copy()
311
312 for _, chart := range *charts {
@@ -322,17 +322,17 @@ func (h *Hpssa) addArrayCharts(arr *hpssaArray) {
322 }
323 }
324
325 - if err := h.Charts().Add(*charts...); err != nil {
326 - h.Warning(err)
325 + if err := c.Charts().Add(*charts...); err != nil {
326 + c.Warning(err)
327 }
328 }
329
330 -func (h *Hpssa) removeArrayCharts(arr *hpssaArray) {
330 +func (c *Collector) removeArrayCharts(arr *hpssaArray) {
331 px := fmt.Sprintf("array_%s_cntrl_%s_slot_%s_", arr.id, strings.ToLower(arr.cntrl.model), arr.cntrl.slot)
332 - h.removeCharts(px)
332 + c.removeCharts(px)
333 }
334
335 -func (h *Hpssa) addLogicalDriveCharts(ld *hpssaLogicalDrive) {
335 +func (c *Collector) addLogicalDriveCharts(ld *hpssaLogicalDrive) {
336 charts := logicalDriveChartsTmpl.Copy()
337
338 for _, chart := range *charts {
@@ -349,17 +349,17 @@ func (h *Hpssa) addLogicalDriveCharts(ld *hpssaLogicalDrive) {
349 }
350 }
351
352 - if err := h.Charts().Add(*charts...); err != nil {
353 - h.Warning(err)
352 + if err := c.Charts().Add(*charts...); err != nil {
353 + c.Warning(err)
354 }
355 }
356
357 -func (h *Hpssa) removeLogicalDriveCharts(ld *hpssaLogicalDrive) {
357 +func (c *Collector) removeLogicalDriveCharts(ld *hpssaLogicalDrive) {
358 px := fmt.Sprintf("ld_%s_array_%s_cntrl_%s_slot_%s_", ld.id, ld.arr.id, strings.ToLower(ld.cntrl.model), ld.cntrl.slot)
359 - h.removeCharts(px)
359 + c.removeCharts(px)
360 }
361
362 -func (h *Hpssa) addPhysicalDriveCharts(pd *hpssaPhysicalDrive) {
362 +func (c *Collector) addPhysicalDriveCharts(pd *hpssaPhysicalDrive) {
363 charts := physicalDriveChartsTmpl.Copy()
364
365 if pd.currentTemperatureC == "" {
@@ -382,19 +382,19 @@ func (h *Hpssa) addPhysicalDriveCharts(pd *hpssaPhysicalDrive) {
382 }
383 }
384
385 - if err := h.Charts().Add(*charts...); err != nil {
386 - h.Warning(err)
385 + if err := c.Charts().Add(*charts...); err != nil {
386 + c.Warning(err)
387 }
388 }
389
390 -func (h *Hpssa) removePhysicalDriveCharts(pd *hpssaPhysicalDrive) {
390 +func (c *Collector) removePhysicalDriveCharts(pd *hpssaPhysicalDrive) {
391 px := fmt.Sprintf("pd_%s_ld_%s_array_%s_cntrl_%s_slot_%s_",
392 pd.location, pd.ldId(), pd.arrId(), strings.ToLower(pd.cntrl.model), pd.cntrl.slot)
393 - h.removeCharts(px)
393 + c.removeCharts(px)
394 }
395
396 -func (h *Hpssa) removeCharts(prefix string) {
397 - for _, chart := range *h.Charts() {
396 +func (c *Collector) removeCharts(prefix string) {
397 + for _, chart := range *c.Charts() {
398 if strings.HasPrefix(chart.ID, prefix) {
399 chart.MarkRemove()
400 chart.MarkNotCreated()
src/go/plugin/go.d/collector/hpssa/collect.go
+14 -14
@@ -8,8 +8,8 @@ import (
8 "strings"
9 )
10
11 -func (h *Hpssa) collect() (map[string]int64, error) {
12 - data, err := h.exec.controllersInfo()
11 +func (c *Collector) collect() (map[string]int64, error) {
12 + data, err := c.exec.controllersInfo()
13 if err != nil {
14 return nil, err
15 }
@@ -21,36 +21,36 @@ func (h *Hpssa) collect() (map[string]int64, error) {
21
22 mx := make(map[string]int64)
23
24 - h.collectControllers(mx, controllers)
24 + c.collectControllers(mx, controllers)
25
26 - h.updateCharts(controllers)
26 + c.updateCharts(controllers)
27
28 return mx, nil
29 }
30
31 -func (h *Hpssa) collectControllers(mx map[string]int64, controllers map[string]*hpssaController) {
31 +func (c *Collector) collectControllers(mx map[string]int64, controllers map[string]*hpssaController) {
32 for _, cntrl := range controllers {
33 - h.collectController(mx, cntrl)
33 + c.collectController(mx, cntrl)
34
35 for _, pd := range cntrl.unassignedDrives {
36 - h.collectPhysicalDrive(mx, pd)
36 + c.collectPhysicalDrive(mx, pd)
37 }
38
39 for _, arr := range cntrl.arrays {
40 - h.collectArray(mx, arr)
40 + c.collectArray(mx, arr)
41
42 for _, ld := range arr.logicalDrives {
43 - h.collectLogicalDrive(mx, ld)
43 + c.collectLogicalDrive(mx, ld)
44
45 for _, pd := range ld.physicalDrives {
46 - h.collectPhysicalDrive(mx, pd)
46 + c.collectPhysicalDrive(mx, pd)
47 }
48 }
49 }
50 }
51 }
52
53 -func (h *Hpssa) collectController(mx map[string]int64, cntrl *hpssaController) {
53 +func (c *Collector) collectController(mx map[string]int64, cntrl *hpssaController) {
54 px := fmt.Sprintf("cntrl_%s_slot_%s_", cntrl.model, cntrl.slot)
55
56 writeStatusOkNok(mx, px, cntrl.controllerStatus)
@@ -77,7 +77,7 @@ func (h *Hpssa) collectController(mx map[string]int64, cntrl *hpssaController) {
77 writeStatusOkNok(mx, px+"cache_battery_", cntrl.batteryCapacitorStatus)
78 }
79
80 -func (h *Hpssa) collectArray(mx map[string]int64, arr *hpssaArray) {
80 +func (c *Collector) collectArray(mx map[string]int64, arr *hpssaArray) {
81 if arr.cntrl == nil {
82 return
83 }
@@ -88,7 +88,7 @@ func (h *Hpssa) collectArray(mx map[string]int64, arr *hpssaArray) {
88 writeStatusOkNok(mx, px, arr.status)
89 }
90
91 -func (h *Hpssa) collectLogicalDrive(mx map[string]int64, ld *hpssaLogicalDrive) {
91 +func (c *Collector) collectLogicalDrive(mx map[string]int64, ld *hpssaLogicalDrive) {
92 if ld.cntrl == nil || ld.arr == nil {
93 return
94 }
@@ -99,7 +99,7 @@ func (h *Hpssa) collectLogicalDrive(mx map[string]int64, ld *hpssaLogicalDrive)
99 writeStatusOkNok(mx, px, ld.status)
100 }
101
102 -func (h *Hpssa) collectPhysicalDrive(mx map[string]int64, pd *hpssaPhysicalDrive) {
102 +func (c *Collector) collectPhysicalDrive(mx map[string]int64, pd *hpssaPhysicalDrive) {
103 if pd.cntrl == nil {
104 return
105 }
src/go/plugin/go.d/collector/hpssa/collector.go renamed
+25 -30
@@ -26,8 +26,8 @@ func init() {
26 })
27 }
28
29 -func New() *Hpssa {
30 - return &Hpssa{
29 +func New() *Collector {
30 + return &Collector{
31 Config: Config{
32 Timeout: confopt.Duration(time.Second * 2),
33 },
@@ -44,41 +44,36 @@ type Config struct {
44 Timeout confopt.Duration `yaml:"timeout,omitempty" json:"timeout"`
45 }
46
47 -type (
48 - Hpssa struct {
49 - module.Base
50 - Config `yaml:",inline" json:""`
47 +type Collector struct {
48 + module.Base
49 + Config `yaml:",inline" json:""`
50
52 - charts *module.Charts
51 + charts *module.Charts
52
54 - exec ssacli
53 + exec ssacliBinary
54
56 - seenControllers map[string]*hpssaController
57 - seenArrays map[string]*hpssaArray
58 - seenLDrives map[string]*hpssaLogicalDrive
59 - seenPDrives map[string]*hpssaPhysicalDrive
60 - }
61 - ssacli interface {
62 - controllersInfo() ([]byte, error)
63 - }
64 -)
55 + seenControllers map[string]*hpssaController
56 + seenArrays map[string]*hpssaArray
57 + seenLDrives map[string]*hpssaLogicalDrive
58 + seenPDrives map[string]*hpssaPhysicalDrive
59 +}
60
66 -func (h *Hpssa) Configuration() any {
67 - return h.Config
61 +func (c *Collector) Configuration() any {
62 + return c.Config
63 }
64
70 -func (h *Hpssa) Init() error {
71 - ssacli, err := h.initSsacliExec()
65 +func (c *Collector) Init() error {
66 + ssacli, err := c.initSsacliBinary()
67 if err != nil {
68 return fmt.Errorf("ssacli exec initialization: %v", err)
69 }
75 - h.exec = ssacli
70 + c.exec = ssacli
71
72 return nil
73 }
74
80 -func (h *Hpssa) Check() error {
81 - mx, err := h.collect()
75 +func (c *Collector) Check() error {
76 + mx, err := c.collect()
77 if err != nil {
78 return err
79 }
@@ -90,14 +85,14 @@ func (h *Hpssa) Check() error {
85 return nil
86 }
87
93 -func (h *Hpssa) Charts() *module.Charts {
94 - return h.charts
88 +func (c *Collector) Charts() *module.Charts {
89 + return c.charts
90 }
91
97 -func (h *Hpssa) Collect() map[string]int64 {
98 - mx, err := h.collect()
92 +func (c *Collector) Collect() map[string]int64 {
93 + mx, err := c.collect()
94 if err != nil {
100 - h.Error(err)
95 + c.Error(err)
96 }
97
98 if len(mx) == 0 {
@@ -107,4 +102,4 @@ func (h *Hpssa) Collect() map[string]int64 {
102 return mx
103 }
104
110 -func (h *Hpssa) Cleanup() {}
105 +func (c *Collector) Cleanup() {}
src/go/plugin/go.d/collector/hpssa/collector_test.go renamed
+33 -33
@@ -37,7 +37,7 @@ func Test_testDataIsValid(t *testing.T) {
37 }
38 }
39
40 -func TestHpssa_Init(t *testing.T) {
40 +func TestCollector_Init(t *testing.T) {
41 tests := map[string]struct {
42 config Config
43 wantFail bool
@@ -50,58 +50,58 @@ func TestHpssa_Init(t *testing.T) {
50
51 for name, test := range tests {
52 t.Run(name, func(t *testing.T) {
53 - hpe := New()
53 + collr := New()
54
55 if test.wantFail {
56 - assert.Error(t, hpe.Init())
56 + assert.Error(t, collr.Init())
57 } else {
58 - assert.NoError(t, hpe.Init())
58 + assert.NoError(t, collr.Init())
59 }
60 })
61 }
62 }
63
64 -func TestHpssa_Cleanup(t *testing.T) {
64 +func TestCollector_Cleanup(t *testing.T) {
65 tests := map[string]struct {
66 - prepare func() *Hpssa
66 + prepare func() *Collector
67 }{
68 "not initialized exec": {
69 - prepare: func() *Hpssa {
69 + prepare: func() *Collector {
70 return New()
71 },
72 },
73 "after check": {
74 - prepare: func() *Hpssa {
75 - hpe := New()
76 - hpe.exec = prepareMockOkP212andP410i()
77 - _ = hpe.Check()
78 - return hpe
74 + prepare: func() *Collector {
75 + collr := New()
76 + collr.exec = prepareMockOkP212andP410i()
77 + _ = collr.Check()
78 + return collr
79 },
80 },
81 "after collect": {
82 - prepare: func() *Hpssa {
83 - hpe := New()
84 - hpe.exec = prepareMockOkP212andP410i()
85 - _ = hpe.Collect()
86 - return hpe
82 + prepare: func() *Collector {
83 + collr := New()
84 + collr.exec = prepareMockOkP212andP410i()
85 + _ = collr.Collect()
86 + return collr
87 },
88 },
89 }
90
91 for name, test := range tests {
92 t.Run(name, func(t *testing.T) {
93 - hpe := test.prepare()
93 + collr := test.prepare()
94
95 - assert.NotPanics(t, hpe.Cleanup)
95 + assert.NotPanics(t, collr.Cleanup)
96 })
97 }
98 }
99
100 -func TestHpssa_Charts(t *testing.T) {
100 +func TestCollector_Charts(t *testing.T) {
101 assert.NotNil(t, New().Charts())
102 }
103
104 -func TestHpssa_Check(t *testing.T) {
104 +func TestCollector_Check(t *testing.T) {
105 tests := map[string]struct {
106 prepareMock func() *mockSsacliExec
107 wantFail bool
@@ -134,20 +134,20 @@ func TestHpssa_Check(t *testing.T) {
134
135 for name, test := range tests {
136 t.Run(name, func(t *testing.T) {
137 - hpe := New()
137 + collr := New()
138 mock := test.prepareMock()
139 - hpe.exec = mock
139 + collr.exec = mock
140
141 if test.wantFail {
142 - assert.Error(t, hpe.Check())
142 + assert.Error(t, collr.Check())
143 } else {
144 - assert.NoError(t, hpe.Check())
144 + assert.NoError(t, collr.Check())
145 }
146 })
147 }
148 }
149
150 -func TestHpssa_Collect(t *testing.T) {
150 +func TestCollector_Collect(t *testing.T) {
151 tests := map[string]struct {
152 prepareMock func() *mockSsacliExec
153 wantMetrics map[string]int64
@@ -381,23 +381,23 @@ func TestHpssa_Collect(t *testing.T) {
381
382 for name, test := range tests {
383 t.Run(name, func(t *testing.T) {
384 - hpe := New()
384 + collr := New()
385 mock := test.prepareMock()
386 - hpe.exec = mock
386 + collr.exec = mock
387
388 - mx := hpe.Collect()
388 + mx := collr.Collect()
389
390 assert.Equal(t, test.wantMetrics, mx)
391
392 - assert.Len(t, *hpe.Charts(), test.wantCharts, "wantCharts")
392 + assert.Len(t, *collr.Charts(), test.wantCharts, "wantCharts")
393
394 - module.TestMetricsHasAllChartsDims(t, hpe.Charts(), mx)
394 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
395 })
396 }
397 }
398
399 -func TestHpssa_ConfigurationSerialize(t *testing.T) {
400 - module.TestConfigurationSerialize(t, &Hpssa{}, dataConfigJSON, dataConfigYAML)
399 +func TestCollector_ConfigurationSerialize(t *testing.T) {
400 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
401 }
402
403 func prepareMockOkP212andP410i() *mockSsacliExec {
src/go/plugin/go.d/collector/hpssa/exec.go
+4
@@ -11,6 +11,10 @@ import (
11 "github.com/netdata/netdata/go/plugins/logger"
12 )
13
14 +type ssacliBinary interface {
15 + controllersInfo() ([]byte, error)
16 +}
17 +
18 func newSsacliExec(ndsudoPath string, timeout time.Duration, log *logger.Logger) *ssacliExec {
19 return &ssacliExec{
20 Logger: log,
src/go/plugin/go.d/collector/hpssa/init.go
+2 -2
@@ -10,14 +10,14 @@ import (
10 "github.com/netdata/netdata/go/plugins/pkg/executable"
11 )
12
13 -func (h *Hpssa) initSsacliExec() (ssacli, error) {
13 +func (c *Collector) initSsacliBinary() (ssacliBinary, error) {
14 ndsudoPath := filepath.Join(executable.Directory, "ndsudo")
15
16 if _, err := os.Stat(ndsudoPath); err != nil {
17 return nil, fmt.Errorf("ndsudo executable not found: %v", err)
18 }
19
20 - ssacliExec := newSsacliExec(ndsudoPath, h.Timeout.Duration(), h.Logger)
20 + ssacliExec := newSsacliExec(ndsudoPath, c.Timeout.Duration(), c.Logger)
21
22 return ssacliExec, nil
23 }
src/go/plugin/go.d/collector/httpcheck/collect.go
+36 -36
@@ -24,49 +24,49 @@ const (
24 codeNoConnection
25 )
26
27 -func (hc *HTTPCheck) collect() (map[string]int64, error) {
28 - req, err := web.NewHTTPRequest(hc.RequestConfig)
27 +func (c *Collector) collect() (map[string]int64, error) {
28 + req, err := web.NewHTTPRequest(c.RequestConfig)
29 if err != nil {
30 - return nil, fmt.Errorf("error on creating HTTP requests to %s : %v", hc.RequestConfig.URL, err)
30 + return nil, fmt.Errorf("error on creating HTTP requests to %s : %v", c.RequestConfig.URL, err)
31 }
32
33 - if hc.CookieFile != "" {
34 - if err := hc.readCookieFile(); err != nil {
35 - return nil, fmt.Errorf("error on reading cookie file '%s': %v", hc.CookieFile, err)
33 + if c.CookieFile != "" {
34 + if err := c.readCookieFile(); err != nil {
35 + return nil, fmt.Errorf("error on reading cookie file '%s': %v", c.CookieFile, err)
36 }
37 }
38
39 start := time.Now()
40 - resp, err := hc.httpClient.Do(req)
40 + resp, err := c.httpClient.Do(req)
41 dur := time.Since(start)
42
43 defer web.CloseBody(resp)
44
45 var mx metrics
46
47 - if hc.isError(err, resp) {
48 - hc.Debug(err)
49 - hc.collectErrResponse(&mx, err)
47 + if c.isError(err, resp) {
48 + c.Debug(err)
49 + c.collectErrResponse(&mx, err)
50 } else {
51 mx.ResponseTime = durationToMs(dur)
52 - hc.collectOKResponse(&mx, resp)
52 + c.collectOKResponse(&mx, resp)
53 }
54
55 - if hc.metrics.Status != mx.Status {
56 - mx.InState = hc.UpdateEvery
55 + if c.metrics.Status != mx.Status {
56 + mx.InState = c.UpdateEvery
57 } else {
58 - mx.InState = hc.metrics.InState + hc.UpdateEvery
58 + mx.InState = c.metrics.InState + c.UpdateEvery
59 }
60 - hc.metrics = mx
60 + c.metrics = mx
61
62 return stm.ToMap(mx), nil
63 }
64
65 -func (hc *HTTPCheck) isError(err error, resp *http.Response) bool {
66 - return err != nil && !(errors.Is(err, web.ErrRedirectAttempted) && hc.acceptedStatuses[resp.StatusCode])
65 +func (c *Collector) isError(err error, resp *http.Response) bool {
66 + return err != nil && !(errors.Is(err, web.ErrRedirectAttempted) && c.acceptedStatuses[resp.StatusCode])
67 }
68
69 -func (hc *HTTPCheck) collectErrResponse(mx *metrics, err error) {
69 +func (c *Collector) collectErrResponse(mx *metrics, err error) {
70 switch code := decodeReqError(err); code {
71 case codeNoConnection:
72 mx.Status.NoConnection = true
@@ -79,10 +79,10 @@ func (hc *HTTPCheck) collectErrResponse(mx *metrics, err error) {
79 }
80 }
81
82 -func (hc *HTTPCheck) collectOKResponse(mx *metrics, resp *http.Response) {
83 - hc.Debugf("endpoint '%s' returned %d (%s) HTTP status code", hc.URL, resp.StatusCode, resp.Status)
82 +func (c *Collector) collectOKResponse(mx *metrics, resp *http.Response) {
83 + c.Debugf("endpoint '%s' returned %d (%s) HTTP status code", c.URL, resp.StatusCode, resp.Status)
84
85 - if !hc.acceptedStatuses[resp.StatusCode] {
85 + if !c.acceptedStatuses[resp.StatusCode] {
86 mx.Status.BadStatusCode = true
87 return
88 }
@@ -90,19 +90,19 @@ func (hc *HTTPCheck) collectOKResponse(mx *metrics, resp *http.Response) {
90 bs, err := io.ReadAll(resp.Body)
91 // golang net/http closes body on redirect
92 if err != nil && !errors.Is(err, io.EOF) && !strings.Contains(err.Error(), "read on closed response body") {
93 - hc.Warningf("error on reading body : %v", err)
93 + c.Warningf("error on reading body : %v", err)
94 mx.Status.BadContent = true
95 return
96 }
97
98 mx.ResponseLength = len(bs)
99
100 - if hc.reResponse != nil && !hc.reResponse.Match(bs) {
100 + if c.reResponse != nil && !c.reResponse.Match(bs) {
101 mx.Status.BadContent = true
102 return
103 }
104
105 - if ok := hc.checkHeader(resp); !ok {
105 + if ok := c.checkHeader(resp); !ok {
106 mx.Status.BadHeader = true
107 return
108 }
@@ -110,8 +110,8 @@ func (hc *HTTPCheck) collectOKResponse(mx *metrics, resp *http.Response) {
110 mx.Status.Success = true
111 }
112
113 -func (hc *HTTPCheck) checkHeader(resp *http.Response) bool {
114 - for _, m := range hc.headerMatch {
113 +func (c *Collector) checkHeader(resp *http.Response) bool {
114 + for _, m := range c.headerMatch {
115 value := resp.Header.Get(m.key)
116
117 var ok bool
@@ -125,7 +125,7 @@ func (hc *HTTPCheck) checkHeader(resp *http.Response) bool {
125 }
126
127 if !ok {
128 - hc.Debugf("header match: bad header: exlude '%v' key '%s' value '%s'", m.exclude, m.key, value)
128 + c.Debugf("header match: bad header: exlude '%v' key '%s' value '%s'", m.exclude, m.key, value)
129 return false
130 }
131 }
@@ -148,30 +148,30 @@ func decodeReqError(err error) reqErrCode {
148 return codeNoConnection
149 }
150
151 -func (hc *HTTPCheck) readCookieFile() error {
152 - if hc.CookieFile == "" {
151 +func (c *Collector) readCookieFile() error {
152 + if c.CookieFile == "" {
153 return nil
154 }
155
156 - fi, err := os.Stat(hc.CookieFile)
156 + fi, err := os.Stat(c.CookieFile)
157 if err != nil {
158 return err
159 }
160
161 - if hc.cookieFileModTime.Equal(fi.ModTime()) {
162 - hc.Debugf("cookie file '%s' modification time has not changed, using previously read data", hc.CookieFile)
161 + if c.cookieFileModTime.Equal(fi.ModTime()) {
162 + c.Debugf("cookie file '%s' modification time has not changed, using previously read data", c.CookieFile)
163 return nil
164 }
165
166 - hc.Debugf("reading cookie file '%s'", hc.CookieFile)
166 + c.Debugf("reading cookie file '%s'", c.CookieFile)
167
168 - jar, err := loadCookieJar(hc.CookieFile)
168 + jar, err := loadCookieJar(c.CookieFile)
169 if err != nil {
170 return err
171 }
172
173 - hc.httpClient.Jar = jar
174 - hc.cookieFileModTime = fi.ModTime()
173 + c.httpClient.Jar = jar
174 + c.cookieFileModTime = fi.ModTime()
175
176 return nil
177 }
src/go/plugin/go.d/collector/httpcheck/collector.go renamed
+31 -31
@@ -29,8 +29,8 @@ func init() {
29 })
30 }
31
32 -func New() *HTTPCheck {
33 - return &HTTPCheck{
32 +func New() *Collector {
33 + return &Collector{
34 Config: Config{
35 HTTPConfig: web.HTTPConfig{
36 ClientConfig: web.ClientConfig{
@@ -60,7 +60,7 @@ type (
60 }
61 )
62
63 -type HTTPCheck struct {
63 +type Collector struct {
64 module.Base
65 Config `yaml:",inline" json:""`
66
@@ -76,51 +76,51 @@ type HTTPCheck struct {
76 metrics metrics
77 }
78
79 -func (hc *HTTPCheck) Configuration() any {
80 - return hc.Config
79 +func (c *Collector) Configuration() any {
80 + return c.Config
81 }
82
83 -func (hc *HTTPCheck) Init() error {
84 - if err := hc.validateConfig(); err != nil {
83 +func (c *Collector) Init() error {
84 + if err := c.validateConfig(); err != nil {
85 return fmt.Errorf("config validation: %v", err)
86 }
87
88 - hc.charts = hc.initCharts()
88 + c.charts = c.initCharts()
89
90 - httpClient, err := hc.initHTTPClient()
90 + httpClient, err := c.initHTTPClient()
91 if err != nil {
92 return fmt.Errorf("init HTTP client: %v", err)
93 }
94 - hc.httpClient = httpClient
94 + c.httpClient = httpClient
95
96 - re, err := hc.initResponseMatchRegexp()
96 + re, err := c.initResponseMatchRegexp()
97 if err != nil {
98 return fmt.Errorf("init response match regexp: %v", err)
99 }
100 - hc.reResponse = re
100 + c.reResponse = re
101
102 - hm, err := hc.initHeaderMatch()
102 + hm, err := c.initHeaderMatch()
103 if err != nil {
104 return fmt.Errorf("init header match: %v", err)
105 }
106 - hc.headerMatch = hm
106 + c.headerMatch = hm
107
108 - for _, v := range hc.AcceptedStatuses {
109 - hc.acceptedStatuses[v] = true
108 + for _, v := range c.AcceptedStatuses {
109 + c.acceptedStatuses[v] = true
110 }
111
112 - hc.Debugf("using URL %s", hc.URL)
113 - hc.Debugf("using HTTP timeout %s", hc.Timeout.Duration())
114 - hc.Debugf("using accepted HTTPConfig statuses %v", hc.AcceptedStatuses)
115 - if hc.reResponse != nil {
116 - hc.Debugf("using response match regexp %s", hc.reResponse)
112 + c.Debugf("using URL %s", c.URL)
113 + c.Debugf("using HTTP timeout %s", c.Timeout.Duration())
114 + c.Debugf("using accepted HTTPConfig statuses %v", c.AcceptedStatuses)
115 + if c.reResponse != nil {
116 + c.Debugf("using response match regexp %s", c.reResponse)
117 }
118
119 return nil
120 }
121
122 -func (hc *HTTPCheck) Check() error {
123 - mx, err := hc.collect()
122 +func (c *Collector) Check() error {
123 + mx, err := c.collect()
124 if err != nil {
125 return err
126 }
@@ -130,14 +130,14 @@ func (hc *HTTPCheck) Check() error {
130 return nil
131 }
132
133 -func (hc *HTTPCheck) Charts() *module.Charts {
134 - return hc.charts
133 +func (c *Collector) Charts() *module.Charts {
134 + return c.charts
135 }
136
137 -func (hc *HTTPCheck) Collect() map[string]int64 {
138 - mx, err := hc.collect()
137 +func (c *Collector) Collect() map[string]int64 {
138 + mx, err := c.collect()
139 if err != nil {
140 - hc.Error(err)
140 + c.Error(err)
141 }
142
143 if len(mx) == 0 {
@@ -146,8 +146,8 @@ func (hc *HTTPCheck) Collect() map[string]int64 {
146 return mx
147 }
148
149 -func (hc *HTTPCheck) Cleanup() {
150 - if hc.httpClient != nil {
151 - hc.httpClient.CloseIdleConnections()
149 +func (c *Collector) Cleanup() {
150 + if c.httpClient != nil {
151 + c.httpClient.CloseIdleConnections()
152 }
153 }
src/go/plugin/go.d/collector/httpcheck/collector_test.go renamed
+102 -102
@@ -31,11 +31,11 @@ func Test_testDataIsValid(t *testing.T) {
31 }
32 }
33
34 -func TestHTTPCheck_ConfigurationSerialize(t *testing.T) {
35 - module.TestConfigurationSerialize(t, &HTTPCheck{}, dataConfigJSON, dataConfigYAML)
34 +func TestCollector_ConfigurationSerialize(t *testing.T) {
35 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
36 }
37
38 -func TestHTTPCheck_Init(t *testing.T) {
38 +func TestCollector_Init(t *testing.T) {
39 tests := map[string]struct {
40 wantFail bool
41 config Config
@@ -73,66 +73,66 @@ func TestHTTPCheck_Init(t *testing.T) {
73
74 for name, test := range tests {
75 t.Run(name, func(t *testing.T) {
76 - httpCheck := New()
77 - httpCheck.Config = test.config
76 + collr := New()
77 + collr.Config = test.config
78
79 if test.wantFail {
80 - assert.Error(t, httpCheck.Init())
80 + assert.Error(t, collr.Init())
81 } else {
82 - assert.NoError(t, httpCheck.Init())
82 + assert.NoError(t, collr.Init())
83 }
84 })
85 }
86 }
87
88 -func TestHTTPCheck_Charts(t *testing.T) {
88 +func TestCollector_Charts(t *testing.T) {
89 tests := map[string]struct {
90 - prepare func(t *testing.T) *HTTPCheck
90 + prepare func(t *testing.T) *Collector
91 wantCharts bool
92 }{
93 "no charts if not inited": {
94 wantCharts: false,
95 - prepare: func(t *testing.T) *HTTPCheck {
95 + prepare: func(t *testing.T) *Collector {
96 return New()
97 },
98 },
99 "charts if inited": {
100 wantCharts: true,
101 - prepare: func(t *testing.T) *HTTPCheck {
102 - httpCheck := New()
103 - httpCheck.URL = "http://127.0.0.1:38001"
104 - require.NoError(t, httpCheck.Init())
101 + prepare: func(t *testing.T) *Collector {
102 + collr := New()
103 + collr.URL = "http://127.0.0.1:38001"
104 + require.NoError(t, collr.Init())
105
106 - return httpCheck
106 + return collr
107 },
108 },
109 }
110
111 for name, test := range tests {
112 t.Run(name, func(t *testing.T) {
113 - httpCheck := test.prepare(t)
113 + collr := test.prepare(t)
114
115 if test.wantCharts {
116 - assert.NotNil(t, httpCheck.Charts())
116 + assert.NotNil(t, collr.Charts())
117 } else {
118 - assert.Nil(t, httpCheck.Charts())
118 + assert.Nil(t, collr.Charts())
119 }
120 })
121 }
122 }
123
124 -func TestHTTPCheck_Cleanup(t *testing.T) {
125 - httpCheck := New()
126 - assert.NotPanics(t, httpCheck.Cleanup)
124 +func TestCollector_Cleanup(t *testing.T) {
125 + collr := New()
126 + assert.NotPanics(t, collr.Cleanup)
127
128 - httpCheck.URL = "http://127.0.0.1:38001"
129 - require.NoError(t, httpCheck.Init())
130 - assert.NotPanics(t, httpCheck.Cleanup)
128 + collr.URL = "http://127.0.0.1:38001"
129 + require.NoError(t, collr.Init())
130 + assert.NotPanics(t, collr.Cleanup)
131 }
132
133 -func TestHTTPCheck_Check(t *testing.T) {
133 +func TestCollector_Check(t *testing.T) {
134 tests := map[string]struct {
135 - prepare func() (httpCheck *HTTPCheck, cleanup func())
135 + prepare func() (collr *Collector, cleanup func())
136 wantFail bool
137 }{
138 "success case": {wantFail: false, prepare: prepareSuccessCase},
@@ -147,25 +147,25 @@ func TestHTTPCheck_Check(t *testing.T) {
147
148 for name, test := range tests {
149 t.Run(name, func(t *testing.T) {
150 - httpCheck, cleanup := test.prepare()
150 + collr, cleanup := test.prepare()
151 defer cleanup()
152
153 - require.NoError(t, httpCheck.Init())
153 + require.NoError(t, collr.Init())
154
155 if test.wantFail {
156 - assert.Error(t, httpCheck.Check())
156 + assert.Error(t, collr.Check())
157 } else {
158 - assert.NoError(t, httpCheck.Check())
158 + assert.NoError(t, collr.Check())
159 }
160 })
161 }
162
163 }
164
165 -func TestHTTPCheck_Collect(t *testing.T) {
165 +func TestCollector_Collect(t *testing.T) {
166 tests := map[string]struct {
167 - prepare func() (httpCheck *HTTPCheck, cleanup func())
168 - update func(check *HTTPCheck)
167 + prepare func() (collr *Collector, cleanup func())
168 + update func(check *Collector)
169 wantMetrics map[string]int64
170 }{
171 "success case": {
@@ -275,8 +275,8 @@ func TestHTTPCheck_Collect(t *testing.T) {
275 },
276 "header match include no value success case": {
277 prepare: prepareSuccessCase,
278 - update: func(httpCheck *HTTPCheck) {
279 - httpCheck.HeaderMatch = []headerMatchConfig{
278 + update: func(collr *Collector) {
279 + collr.HeaderMatch = []headerMatchConfig{
280 {Key: "header-key2"},
281 }
282 },
@@ -295,8 +295,8 @@ func TestHTTPCheck_Collect(t *testing.T) {
295 },
296 "header match include with value success case": {
297 prepare: prepareSuccessCase,
298 - update: func(httpCheck *HTTPCheck) {
299 - httpCheck.HeaderMatch = []headerMatchConfig{
298 + update: func(collr *Collector) {
299 + collr.HeaderMatch = []headerMatchConfig{
300 {Key: "header-key2", Value: "= header-value"},
301 }
302 },
@@ -315,8 +315,8 @@ func TestHTTPCheck_Collect(t *testing.T) {
315 },
316 "header match include no value bad headers case": {
317 prepare: prepareSuccessCase,
318 - update: func(httpCheck *HTTPCheck) {
319 - httpCheck.HeaderMatch = []headerMatchConfig{
318 + update: func(collr *Collector) {
319 + collr.HeaderMatch = []headerMatchConfig{
320 {Key: "header-key99"},
321 }
322 },
@@ -335,8 +335,8 @@ func TestHTTPCheck_Collect(t *testing.T) {
335 },
336 "header match include with value bad headers case": {
337 prepare: prepareSuccessCase,
338 - update: func(httpCheck *HTTPCheck) {
339 - httpCheck.HeaderMatch = []headerMatchConfig{
338 + update: func(collr *Collector) {
339 + collr.HeaderMatch = []headerMatchConfig{
340 {Key: "header-key2", Value: "= header-value99"},
341 }
342 },
@@ -355,8 +355,8 @@ func TestHTTPCheck_Collect(t *testing.T) {
355 },
356 "header match exclude no value success case": {
357 prepare: prepareSuccessCase,
358 - update: func(httpCheck *HTTPCheck) {
359 - httpCheck.HeaderMatch = []headerMatchConfig{
358 + update: func(collr *Collector) {
359 + collr.HeaderMatch = []headerMatchConfig{
360 {Exclude: true, Key: "header-key99"},
361 }
362 },
@@ -375,8 +375,8 @@ func TestHTTPCheck_Collect(t *testing.T) {
375 },
376 "header match exclude with value success case": {
377 prepare: prepareSuccessCase,
378 - update: func(httpCheck *HTTPCheck) {
379 - httpCheck.HeaderMatch = []headerMatchConfig{
378 + update: func(collr *Collector) {
379 + collr.HeaderMatch = []headerMatchConfig{
380 {Exclude: true, Key: "header-key2", Value: "= header-value99"},
381 }
382 },
@@ -395,8 +395,8 @@ func TestHTTPCheck_Collect(t *testing.T) {
395 },
396 "header match exclude no value bad headers case": {
397 prepare: prepareSuccessCase,
398 - update: func(httpCheck *HTTPCheck) {
399 - httpCheck.HeaderMatch = []headerMatchConfig{
398 + update: func(collr *Collector) {
399 + collr.HeaderMatch = []headerMatchConfig{
400 {Exclude: true, Key: "header-key2"},
401 }
402 },
@@ -415,8 +415,8 @@ func TestHTTPCheck_Collect(t *testing.T) {
415 },
416 "header match exclude with value bad headers case": {
417 prepare: prepareSuccessCase,
418 - update: func(httpCheck *HTTPCheck) {
419 - httpCheck.HeaderMatch = []headerMatchConfig{
418 + update: func(collr *Collector) {
419 + collr.HeaderMatch = []headerMatchConfig{
420 {Exclude: true, Key: "header-key2", Value: "= header-value"},
421 }
422 },
@@ -452,20 +452,20 @@ func TestHTTPCheck_Collect(t *testing.T) {
452
453 for name, test := range tests {
454 t.Run(name, func(t *testing.T) {
455 - httpCheck, cleanup := test.prepare()
455 + collr, cleanup := test.prepare()
456 defer cleanup()
457
458 if test.update != nil {
459 - test.update(httpCheck)
459 + test.update(collr)
460 }
461
462 - require.NoError(t, httpCheck.Init())
462 + require.NoError(t, collr.Init())
463
464 var mx map[string]int64
465
466 for i := 0; i < 2; i++ {
467 - mx = httpCheck.Collect()
468 - time.Sleep(time.Duration(httpCheck.UpdateEvery) * time.Second)
467 + mx = collr.Collect()
468 + time.Sleep(time.Duration(collr.UpdateEvery) * time.Second)
469 }
470
471 copyResponseTime(test.wantMetrics, mx)
@@ -475,10 +475,10 @@ func TestHTTPCheck_Collect(t *testing.T) {
475 }
476 }
477
478 -func prepareSuccessCase() (*HTTPCheck, func()) {
479 - httpCheck := New()
480 - httpCheck.UpdateEvery = 1
481 - httpCheck.ResponseMatch = "match"
478 +func prepareSuccessCase() (*Collector, func()) {
479 + collr := New()
480 + collr.UpdateEvery = 1
481 + collr.ResponseMatch = "match"
482
483 srv := httptest.NewServer(http.HandlerFunc(
484 func(w http.ResponseWriter, r *http.Request) {
@@ -488,75 +488,75 @@ func prepareSuccessCase() (*HTTPCheck, func()) {
488 _, _ = w.Write([]byte("match"))
489 }))
490
491 - httpCheck.URL = srv.URL
491 + collr.URL = srv.URL
492
493 - return httpCheck, srv.Close
493 + return collr, srv.Close
494 }
495
496 -func prepareTimeoutCase() (*HTTPCheck, func()) {
497 - httpCheck := New()
498 - httpCheck.UpdateEvery = 1
499 - httpCheck.Timeout = confopt.Duration(time.Millisecond * 100)
496 +func prepareTimeoutCase() (*Collector, func()) {
497 + collr := New()
498 + collr.UpdateEvery = 1
499 + collr.Timeout = confopt.Duration(time.Millisecond * 100)
500
501 srv := httptest.NewServer(http.HandlerFunc(
502 func(w http.ResponseWriter, r *http.Request) {
503 - time.Sleep(httpCheck.Timeout.Duration() + time.Millisecond*100)
503 + time.Sleep(collr.Timeout.Duration() + time.Millisecond*100)
504 }))
505
506 - httpCheck.URL = srv.URL
506 + collr.URL = srv.URL
507
508 - return httpCheck, srv.Close
508 + return collr, srv.Close
509 }
510
511 -func prepareRedirectSuccessCase() (*HTTPCheck, func()) {
512 - httpCheck := New()
513 - httpCheck.UpdateEvery = 1
514 - httpCheck.NotFollowRedirect = true
515 - httpCheck.AcceptedStatuses = []int{301}
511 +func prepareRedirectSuccessCase() (*Collector, func()) {
512 + collr := New()
513 + collr.UpdateEvery = 1
514 + collr.NotFollowRedirect = true
515 + collr.AcceptedStatuses = []int{301}
516
517 srv := httptest.NewServer(http.HandlerFunc(
518 func(w http.ResponseWriter, r *http.Request) {
519 http.Redirect(w, r, "https://example.com", http.StatusMovedPermanently)
520 }))
521
522 - httpCheck.URL = srv.URL
522 + collr.URL = srv.URL
523
524 - return httpCheck, srv.Close
524 + return collr, srv.Close
525 }
526
527 -func prepareRedirectFailCase() (*HTTPCheck, func()) {
528 - httpCheck := New()
529 - httpCheck.UpdateEvery = 1
530 - httpCheck.NotFollowRedirect = true
527 +func prepareRedirectFailCase() (*Collector, func()) {
528 + collr := New()
529 + collr.UpdateEvery = 1
530 + collr.NotFollowRedirect = true
531
532 srv := httptest.NewServer(http.HandlerFunc(
533 func(w http.ResponseWriter, r *http.Request) {
534 http.Redirect(w, r, "https://example.com", http.StatusMovedPermanently)
535 }))
536
537 - httpCheck.URL = srv.URL
537 + collr.URL = srv.URL
538
539 - return httpCheck, srv.Close
539 + return collr, srv.Close
540 }
541
542 -func prepareBadStatusCase() (*HTTPCheck, func()) {
543 - httpCheck := New()
544 - httpCheck.UpdateEvery = 1
542 +func prepareBadStatusCase() (*Collector, func()) {
543 + collr := New()
544 + collr.UpdateEvery = 1
545
546 srv := httptest.NewServer(http.HandlerFunc(
547 func(w http.ResponseWriter, r *http.Request) {
548 w.WriteHeader(http.StatusBadGateway)
549 }))
550
551 - httpCheck.URL = srv.URL
551 + collr.URL = srv.URL
552
553 - return httpCheck, srv.Close
553 + return collr, srv.Close
554 }
555
556 -func prepareBadContentCase() (*HTTPCheck, func()) {
557 - httpCheck := New()
558 - httpCheck.UpdateEvery = 1
559 - httpCheck.ResponseMatch = "no match"
556 +func prepareBadContentCase() (*Collector, func()) {
557 + collr := New()
558 + collr.UpdateEvery = 1
559 + collr.ResponseMatch = "no match"
560
561 srv := httptest.NewServer(http.HandlerFunc(
562 func(w http.ResponseWriter, r *http.Request) {
@@ -564,23 +564,23 @@ func prepareBadContentCase() (*HTTPCheck, func()) {
564 _, _ = w.Write([]byte("hello and goodbye"))
565 }))
566
567 - httpCheck.URL = srv.URL
567 + collr.URL = srv.URL
568
569 - return httpCheck, srv.Close
569 + return collr, srv.Close
570 }
571
572 -func prepareNoConnectionCase() (*HTTPCheck, func()) {
573 - httpCheck := New()
574 - httpCheck.UpdateEvery = 1
575 - httpCheck.URL = "http://127.0.0.1:38001"
572 +func prepareNoConnectionCase() (*Collector, func()) {
573 + collr := New()
574 + collr.UpdateEvery = 1
575 + collr.URL = "http://127.0.0.1:38001"
576
577 - return httpCheck, func() {}
577 + return collr, func() {}
578 }
579
580 -func prepareCookieAuthCase() (*HTTPCheck, func()) {
581 - httpCheck := New()
582 - httpCheck.UpdateEvery = 1
583 - httpCheck.CookieFile = "testdata/cookie.txt"
580 +func prepareCookieAuthCase() (*Collector, func()) {
581 + collr := New()
582 + collr.UpdateEvery = 1
583 + collr.CookieFile = "testdata/cookie.txt"
584
585 srv := httptest.NewServer(http.HandlerFunc(
586 func(w http.ResponseWriter, r *http.Request) {
@@ -591,9 +591,9 @@ func prepareCookieAuthCase() (*HTTPCheck, func()) {
591 }
592 }))
593
594 - httpCheck.URL = srv.URL
594 + collr.URL = srv.URL
595
596 - return httpCheck, srv.Close
596 + return collr, srv.Close
597 }
598
599 func copyResponseTime(dst, src map[string]int64) {
src/go/plugin/go.d/collector/httpcheck/init.go
+12 -12
@@ -19,32 +19,32 @@ type headerMatch struct {
19 valMatcher matcher.Matcher
20 }
21
22 -func (hc *HTTPCheck) validateConfig() error {
23 - if hc.URL == "" {
22 +func (c *Collector) validateConfig() error {
23 + if c.URL == "" {
24 return errors.New("'url' not set")
25 }
26 return nil
27 }
28
29 -func (hc *HTTPCheck) initHTTPClient() (*http.Client, error) {
30 - return web.NewHTTPClient(hc.ClientConfig)
29 +func (c *Collector) initHTTPClient() (*http.Client, error) {
30 + return web.NewHTTPClient(c.ClientConfig)
31 }
32
33 -func (hc *HTTPCheck) initResponseMatchRegexp() (*regexp.Regexp, error) {
34 - if hc.ResponseMatch == "" {
33 +func (c *Collector) initResponseMatchRegexp() (*regexp.Regexp, error) {
34 + if c.ResponseMatch == "" {
35 return nil, nil
36 }
37 - return regexp.Compile(hc.ResponseMatch)
37 + return regexp.Compile(c.ResponseMatch)
38 }
39
40 -func (hc *HTTPCheck) initHeaderMatch() ([]headerMatch, error) {
41 - if len(hc.HeaderMatch) == 0 {
40 +func (c *Collector) initHeaderMatch() ([]headerMatch, error) {
41 + if len(c.HeaderMatch) == 0 {
42 return nil, nil
43 }
44
45 var hms []headerMatch
46
47 - for _, v := range hc.HeaderMatch {
47 + for _, v := range c.HeaderMatch {
48 if v.Key == "" {
49 continue
50 }
@@ -72,12 +72,12 @@ func (hc *HTTPCheck) initHeaderMatch() ([]headerMatch, error) {
72 return hms, nil
73 }
74
75 -func (hc *HTTPCheck) initCharts() *module.Charts {
75 +func (c *Collector) initCharts() *module.Charts {
76 charts := httpCheckCharts.Copy()
77
78 for _, chart := range *charts {
79 chart.Labels = []module.Label{
80 - {Key: "url", Value: hc.URL},
80 + {Key: "url", Value: c.URL},
81 }
82 }
83
src/go/plugin/go.d/collector/icecast/charts.go
+5 -5
@@ -32,7 +32,7 @@ var (
32 }
33 )
34
35 -func (ic *Icecast) addSourceCharts(name string) {
35 +func (c *Collector) addSourceCharts(name string) {
36 chart := sourceListenersChartTmpl.Copy()
37
38 chart.ID = fmt.Sprintf(chart.ID, cleanSource(name))
@@ -43,15 +43,15 @@ func (ic *Icecast) addSourceCharts(name string) {
43 dim.ID = fmt.Sprintf(dim.ID, name)
44 }
45
46 - if err := ic.Charts().Add(chart); err != nil {
47 - ic.Warning(err)
46 + if err := c.Charts().Add(chart); err != nil {
47 + c.Warning(err)
48 }
49
50 }
51
52 -func (ic *Icecast) removeSourceCharts(name string) {
52 +func (c *Collector) removeSourceCharts(name string) {
53 px := fmt.Sprintf("icecast_%s_", cleanSource(name))
54 - for _, chart := range *ic.Charts() {
54 + for _, chart := range *c.Charts() {
55 if strings.HasPrefix(chart.ID, px) {
56 chart.MarkRemove()
57 chart.MarkNotCreated()
src/go/plugin/go.d/collector/icecast/collect.go
+13 -13
@@ -12,18 +12,18 @@ const (
12 urlPathServerStats = "/status-json.xsl" // https://icecast.org/docs/icecast-trunk/server_stats/
13 )
14
15 -func (ic *Icecast) collect() (map[string]int64, error) {
15 +func (c *Collector) collect() (map[string]int64, error) {
16 mx := make(map[string]int64)
17
18 - if err := ic.collectServerStats(mx); err != nil {
18 + if err := c.collectServerStats(mx); err != nil {
19 return nil, err
20 }
21
22 return mx, nil
23 }
24
25 -func (ic *Icecast) collectServerStats(mx map[string]int64) error {
26 - stats, err := ic.queryServerStats()
25 +func (c *Collector) collectServerStats(mx map[string]int64) error {
26 + stats, err := c.queryServerStats()
27 if err != nil {
28 return err
29 }
@@ -44,9 +44,9 @@ func (ic *Icecast) collectServerStats(mx map[string]int64) error {
44
45 seen[name] = true
46
47 - if !ic.seenSources[name] {
48 - ic.seenSources[name] = true
49 - ic.addSourceCharts(name)
47 + if !c.seenSources[name] {
48 + c.seenSources[name] = true
49 + c.addSourceCharts(name)
50 }
51
52 px := fmt.Sprintf("source_%s_", name)
@@ -54,24 +54,24 @@ func (ic *Icecast) collectServerStats(mx map[string]int64) error {
54 mx[px+"listeners"] = src.Listeners
55 }
56
57 - for name := range ic.seenSources {
57 + for name := range c.seenSources {
58 if !seen[name] {
59 - delete(ic.seenSources, name)
60 - ic.removeSourceCharts(name)
59 + delete(c.seenSources, name)
60 + c.removeSourceCharts(name)
61 }
62 }
63
64 return nil
65 }
66
67 -func (ic *Icecast) queryServerStats() (*serverStats, error) {
68 - req, err := web.NewHTTPRequestWithPath(ic.RequestConfig, urlPathServerStats)
67 +func (c *Collector) queryServerStats() (*serverStats, error) {
68 + req, err := web.NewHTTPRequestWithPath(c.RequestConfig, urlPathServerStats)
69 if err != nil {
70 return nil, err
71 }
72
73 var stats serverStats
74 - if err := web.DoHTTP(ic.httpClient).RequestJSON(req, &stats); err != nil {
74 + if err := web.DoHTTP(c.httpClient).RequestJSON(req, &stats); err != nil {
75 return nil, err
76 }
77
src/go/plugin/go.d/collector/icecast/collector.go renamed
+21 -21
@@ -25,8 +25,8 @@ func init() {
25 })
26 }
27
28 -func New() *Icecast {
29 - return &Icecast{
28 +func New() *Collector {
29 + return &Collector{
30 Config: Config{
31 HTTPConfig: web.HTTPConfig{
32 RequestConfig: web.RequestConfig{
@@ -48,7 +48,7 @@ type Config struct {
48 web.HTTPConfig `yaml:",inline" json:""`
49 }
50
51 -type Icecast struct {
51 +type Collector struct {
52 module.Base
53 Config `yaml:",inline" json:""`
54
@@ -59,29 +59,29 @@ type Icecast struct {
59 httpClient *http.Client
60 }
61
62 -func (ic *Icecast) Configuration() any {
63 - return ic.Config
62 +func (c *Collector) Configuration() any {
63 + return c.Config
64 }
65
66 -func (ic *Icecast) Init() error {
67 - if ic.URL == "" {
66 +func (c *Collector) Init() error {
67 + if c.URL == "" {
68 return errors.New("url not set")
69 }
70
71 - client, err := web.NewHTTPClient(ic.ClientConfig)
71 + client, err := web.NewHTTPClient(c.ClientConfig)
72 if err != nil {
73 return fmt.Errorf("creating http client: %w", err)
74 }
75 - ic.httpClient = client
75 + c.httpClient = client
76
77 - ic.Debugf("using URL %s", ic.URL)
78 - ic.Debugf("using timeout: %s", ic.Timeout)
77 + c.Debugf("using URL %s", c.URL)
78 + c.Debugf("using timeout: %s", c.Timeout)
79
80 return nil
81 }
82
83 -func (ic *Icecast) Check() error {
84 - mx, err := ic.collect()
83 +func (c *Collector) Check() error {
84 + mx, err := c.collect()
85 if err != nil {
86 return err
87 }
@@ -93,14 +93,14 @@ func (ic *Icecast) Check() error {
93 return nil
94 }
95
96 -func (ic *Icecast) Charts() *module.Charts {
97 - return ic.charts
96 +func (c *Collector) Charts() *module.Charts {
97 + return c.charts
98 }
99
100 -func (ic *Icecast) Collect() map[string]int64 {
101 - mx, err := ic.collect()
100 +func (c *Collector) Collect() map[string]int64 {
101 + mx, err := c.collect()
102 if err != nil {
103 - ic.Error(err)
103 + c.Error(err)
104 }
105
106 if len(mx) == 0 {
@@ -110,8 +110,8 @@ func (ic *Icecast) Collect() map[string]int64 {
110 return mx
111 }
112
113 -func (ic *Icecast) Cleanup() {
114 - if ic.httpClient != nil {
115 - ic.httpClient.CloseIdleConnections()
113 +func (c *Collector) Cleanup() {
114 + if c.httpClient != nil {
115 + c.httpClient.CloseIdleConnections()
116 }
117 }
src/go/plugin/go.d/collector/icecast/collector_test.go renamed
+49 -49
@@ -36,11 +36,11 @@ func Test_testDataIsValid(t *testing.T) {
36 }
37 }
38
39 -func TestIcecast_ConfigurationSerialize(t *testing.T) {
40 - module.TestConfigurationSerialize(t, &Icecast{}, dataConfigJSON, dataConfigYAML)
39 +func TestCollector_ConfigurationSerialize(t *testing.T) {
40 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
41 }
42
43 -func TestIcecast_Init(t *testing.T) {
43 +func TestCollector_Init(t *testing.T) {
44 tests := map[string]struct {
45 wantFail bool
46 config Config
@@ -61,26 +61,26 @@ func TestIcecast_Init(t *testing.T) {
61
62 for name, test := range tests {
63 t.Run(name, func(t *testing.T) {
64 - icecast := New()
65 - icecast.Config = test.config
64 + collr := New()
65 + collr.Config = test.config
66
67 if test.wantFail {
68 - assert.Error(t, icecast.Init())
68 + assert.Error(t, collr.Init())
69 } else {
70 - assert.NoError(t, icecast.Init())
70 + assert.NoError(t, collr.Init())
71 }
72 })
73 }
74 }
75
76 -func TestIcecast_Charts(t *testing.T) {
76 +func TestCollector_Charts(t *testing.T) {
77 assert.NotNil(t, New().Charts())
78 }
79
80 -func TestIcecast_Check(t *testing.T) {
80 +func TestCollector_Check(t *testing.T) {
81 tests := map[string]struct {
82 wantFail bool
83 - prepare func(t *testing.T) (*Icecast, func())
83 + prepare func(t *testing.T) (*Collector, func())
84 }{
85 "success multiple sources": {
86 wantFail: false,
@@ -110,21 +110,21 @@ func TestIcecast_Check(t *testing.T) {
110
111 for name, test := range tests {
112 t.Run(name, func(t *testing.T) {
113 - icecast, cleanup := test.prepare(t)
113 + collr, cleanup := test.prepare(t)
114 defer cleanup()
115
116 if test.wantFail {
117 - assert.Error(t, icecast.Check())
117 + assert.Error(t, collr.Check())
118 } else {
119 - assert.NoError(t, icecast.Check())
119 + assert.NoError(t, collr.Check())
120 }
121 })
122 }
123 }
124
125 -func TestIcecast_Collect(t *testing.T) {
125 +func TestCollector_Collect(t *testing.T) {
126 tests := map[string]struct {
127 - prepare func(t *testing.T) (*Icecast, func())
127 + prepare func(t *testing.T) (*Collector, func())
128 wantMetrics map[string]int64
129 wantCharts int
130 }{
@@ -159,21 +159,21 @@ func TestIcecast_Collect(t *testing.T) {
159
160 for name, test := range tests {
161 t.Run(name, func(t *testing.T) {
162 - icecast, cleanup := test.prepare(t)
162 + collr, cleanup := test.prepare(t)
163 defer cleanup()
164
165 - mx := icecast.Collect()
165 + mx := collr.Collect()
166
167 require.Equal(t, test.wantMetrics, mx)
168 if len(test.wantMetrics) > 0 {
169 - assert.Equal(t, test.wantCharts, len(*icecast.Charts()))
170 - module.TestMetricsHasAllChartsDims(t, icecast.Charts(), mx)
169 + assert.Equal(t, test.wantCharts, len(*collr.Charts()))
170 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
171 }
172 })
173 }
174 }
175
176 -func prepareCaseMultipleSources(t *testing.T) (*Icecast, func()) {
176 +func prepareCaseMultipleSources(t *testing.T) (*Collector, func()) {
177 t.Helper()
178 srv := httptest.NewServer(http.HandlerFunc(
179 func(w http.ResponseWriter, r *http.Request) {
@@ -185,14 +185,14 @@ func prepareCaseMultipleSources(t *testing.T) (*Icecast, func()) {
185 }
186 }))
187
188 - icecast := New()
189 - icecast.URL = srv.URL
190 - require.NoError(t, icecast.Init())
188 + collr := New()
189 + collr.URL = srv.URL
190 + require.NoError(t, collr.Init())
191
192 - return icecast, srv.Close
192 + return collr, srv.Close
193 }
194
195 -func prepareCaseSingleSource(t *testing.T) (*Icecast, func()) {
195 +func prepareCaseSingleSource(t *testing.T) (*Collector, func()) {
196 t.Helper()
197 srv := httptest.NewServer(http.HandlerFunc(
198 func(w http.ResponseWriter, r *http.Request) {
@@ -204,14 +204,14 @@ func prepareCaseSingleSource(t *testing.T) (*Icecast, func()) {
204 }
205 }))
206
207 - icecast := New()
208 - icecast.URL = srv.URL
209 - require.NoError(t, icecast.Init())
207 + collr := New()
208 + collr.URL = srv.URL
209 + require.NoError(t, collr.Init())
210
211 - return icecast, srv.Close
211 + return collr, srv.Close
212 }
213
214 -func prepareCaseNoSources(t *testing.T) (*Icecast, func()) {
214 +func prepareCaseNoSources(t *testing.T) (*Collector, func()) {
215 t.Helper()
216 srv := httptest.NewServer(http.HandlerFunc(
217 func(w http.ResponseWriter, r *http.Request) {
@@ -223,14 +223,14 @@ func prepareCaseNoSources(t *testing.T) (*Icecast, func()) {
223 }
224 }))
225
226 - icecast := New()
227 - icecast.URL = srv.URL
228 - require.NoError(t, icecast.Init())
226 + collr := New()
227 + collr.URL = srv.URL
228 + require.NoError(t, collr.Init())
229
230 - return icecast, srv.Close
230 + return collr, srv.Close
231 }
232
233 -func prepareCaseUnexpectedJsonResponse(t *testing.T) (*Icecast, func()) {
233 +func prepareCaseUnexpectedJsonResponse(t *testing.T) (*Collector, func()) {
234 t.Helper()
235 resp := `
236 {
@@ -254,32 +254,32 @@ func prepareCaseUnexpectedJsonResponse(t *testing.T) (*Icecast, func()) {
254 _, _ = w.Write([]byte(resp))
255 }))
256
257 - icecast := New()
258 - icecast.URL = srv.URL
259 - require.NoError(t, icecast.Init())
257 + collr := New()
258 + collr.URL = srv.URL
259 + require.NoError(t, collr.Init())
260
261 - return icecast, srv.Close
261 + return collr, srv.Close
262 }
263
264 -func prepareCaseInvalidFormatResponse(t *testing.T) (*Icecast, func()) {
264 +func prepareCaseInvalidFormatResponse(t *testing.T) (*Collector, func()) {
265 t.Helper()
266 srv := httptest.NewServer(http.HandlerFunc(
267 func(w http.ResponseWriter, r *http.Request) {
268 _, _ = w.Write([]byte("hello and\n goodbye"))
269 }))
270
271 - icecast := New()
272 - icecast.URL = srv.URL
273 - require.NoError(t, icecast.Init())
271 + collr := New()
272 + collr.URL = srv.URL
273 + require.NoError(t, collr.Init())
274
275 - return icecast, srv.Close
275 + return collr, srv.Close
276 }
277
278 -func prepareCaseConnectionRefused(t *testing.T) (*Icecast, func()) {
278 +func prepareCaseConnectionRefused(t *testing.T) (*Collector, func()) {
279 t.Helper()
280 - icecast := New()
281 - icecast.URL = "http://127.0.0.1:65001"
282 - require.NoError(t, icecast.Init())
280 + collr := New()
281 + collr.URL = "http://127.0.0.1:65001"
282 + require.NoError(t, collr.Init())
283
284 - return icecast, func() {}
284 + return collr, func() {}
285 }
src/go/plugin/go.d/collector/intelgpu/charts.go
+3 -3
@@ -60,7 +60,7 @@ var intelGPUEngineBusyPercChartTmpl = module.Chart{
60 },
61 }
62
63 -func (ig *IntelGPU) addEngineCharts(engine string) {
63 +func (c *Collector) addEngineCharts(engine string) {
64 chart := intelGPUEngineBusyPercChartTmpl.Copy()
65
66 s := strings.ToLower(engine)
@@ -75,8 +75,8 @@ func (ig *IntelGPU) addEngineCharts(engine string) {
75 dim.ID = fmt.Sprintf(dim.ID, engine)
76 }
77
78 - if err := ig.Charts().Add(chart); err != nil {
79 - ig.Warning(err)
78 + if err := c.Charts().Add(chart); err != nil {
79 + c.Warning(err)
80 }
81 }
82
src/go/plugin/go.d/collector/intelgpu/collect.go
+8 -8
@@ -25,12 +25,12 @@ type (
25
26 const precision = 100
27
28 -func (ig *IntelGPU) collect() (map[string]int64, error) {
29 - if ig.exec == nil {
28 +func (c *Collector) collect() (map[string]int64, error) {
29 + if c.exec == nil {
30 return nil, errors.New("collector not initialized")
31 }
32
33 - stats, err := ig.getGPUSummaryStats()
33 + stats, err := c.getGPUSummaryStats()
34 if err != nil {
35 return nil, err
36 }
@@ -42,9 +42,9 @@ func (ig *IntelGPU) collect() (map[string]int64, error) {
42 mx["power_package"] = int64(stats.Power.Package * precision)
43
44 for name, es := range stats.Engines {
45 - if !ig.engines[name] {
46 - ig.addEngineCharts(name)
47 - ig.engines[name] = true
45 + if !c.engines[name] {
46 + c.addEngineCharts(name)
47 + c.engines[name] = true
48 }
49
50 key := fmt.Sprintf("engine_%s_busy", name)
@@ -53,8 +53,8 @@ func (ig *IntelGPU) collect() (map[string]int64, error) {
53
54 return mx, nil
55 }
56 -func (ig *IntelGPU) getGPUSummaryStats() (*gpuSummaryStats, error) {
57 - bs, err := ig.exec.queryGPUSummaryJson()
56 +func (c *Collector) getGPUSummaryStats() (*gpuSummaryStats, error) {
57 + bs, err := c.exec.queryGPUSummaryJson()
58 if err != nil {
59 return nil, err
60 }
src/go/plugin/go.d/collector/intelgpu/collector.go renamed
+28 -33
@@ -20,8 +20,8 @@ func init() {
20 })
21 }
22
23 -func New() *IntelGPU {
24 - return &IntelGPU{
23 +func New() *Collector {
24 + return &Collector{
25 ndsudoName: "ndsudo",
26 charts: charts.Copy(),
27 engines: make(map[string]bool),
@@ -33,41 +33,36 @@ type Config struct {
33 Device string `yaml:"device,omitempty" json:"device"`
34 }
35
36 -type (
37 - IntelGPU struct {
38 - module.Base
39 - Config `yaml:",inline" json:""`
36 +type Collector struct {
37 + module.Base
38 + Config `yaml:",inline" json:""`
39
41 - charts *module.Charts
40 + charts *module.Charts
41
43 - exec intelGpuTop
44 - ndsudoName string
42 + exec intelGpuTop
43 + ndsudoName string
44
46 - engines map[string]bool
47 - }
48 - intelGpuTop interface {
49 - queryGPUSummaryJson() ([]byte, error)
50 - stop() error
51 - }
52 -)
45 + engines map[string]bool
46 +}
47
54 -func (ig *IntelGPU) Configuration() any {
55 - return ig.Config
48 +func (c *Collector) Configuration() any {
49 + return c.Config
50 }
51
58 -func (ig *IntelGPU) Init() error {
59 - topExec, err := ig.initIntelGPUTopExec()
52 +func (c *Collector) Init() error {
53 + topExec, err := c.initIntelGPUTopExec()
54 +
55 if err != nil {
56 return fmt.Errorf("init intelgpu top exec: %v", err)
57 }
58
64 - ig.exec = topExec
59 + c.exec = topExec
60
61 return nil
62 }
63
69 -func (ig *IntelGPU) Check() error {
70 - mx, err := ig.collect()
64 +func (c *Collector) Check() error {
65 + mx, err := c.collect()
66 if err != nil {
67 return err
68 }
@@ -79,14 +74,14 @@ func (ig *IntelGPU) Check() error {
74 return nil
75 }
76
82 -func (ig *IntelGPU) Charts() *module.Charts {
83 - return ig.charts
77 +func (c *Collector) Charts() *module.Charts {
78 + return c.charts
79 }
80
86 -func (ig *IntelGPU) Collect() map[string]int64 {
87 - mx, err := ig.collect()
81 +func (c *Collector) Collect() map[string]int64 {
82 + mx, err := c.collect()
83 if err != nil {
89 - ig.Error(err)
84 + c.Error(err)
85 }
86
87 if len(mx) == 0 {
@@ -96,11 +91,11 @@ func (ig *IntelGPU) Collect() map[string]int64 {
91 return mx
92 }
93
99 -func (ig *IntelGPU) Cleanup() {
100 - if ig.exec != nil {
101 - if err := ig.exec.stop(); err != nil {
102 - ig.Error(err)
94 +func (c *Collector) Cleanup() {
95 + if c.exec != nil {
96 + if err := c.exec.stop(); err != nil {
97 + c.Error(err)
98 }
104 - ig.exec = nil
99 + c.exec = nil
100 }
101 }
src/go/plugin/go.d/collector/intelgpu/collector_test.go renamed
+37 -36
@@ -21,6 +21,7 @@ var (
21 )
22
23 func Test_testDataIsValid(t *testing.T) {
24 +
25 for name, data := range map[string][]byte{
26 "dataConfigJSON": dataConfigJSON,
27 "dataConfigYAML": dataConfigYAML,
@@ -30,39 +31,39 @@ func Test_testDataIsValid(t *testing.T) {
31 }
32 }
33
33 -func TestIntelGPU_ConfigurationSerialize(t *testing.T) {
34 - module.TestConfigurationSerialize(t, &IntelGPU{}, dataConfigJSON, dataConfigYAML)
34 +func TestCollector_ConfigurationSerialize(t *testing.T) {
35 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
36 }
37
37 -func TestIntelGPU_Init(t *testing.T) {
38 +func TestCollector_Init(t *testing.T) {
39 tests := map[string]struct {
39 - prepare func(igt *IntelGPU)
40 + prepare func(collr *Collector)
41 wantFail bool
42 }{
43 "fails if can't locate ndsudo": {
44 wantFail: true,
44 - prepare: func(igt *IntelGPU) {
45 - igt.ndsudoName += "!!!"
45 + prepare: func(collr *Collector) {
46 + collr.ndsudoName += "!!!"
47 },
48 },
49 }
50
51 for name, test := range tests {
52 t.Run(name, func(t *testing.T) {
52 - igt := New()
53 + collr := New()
54
54 - test.prepare(igt)
55 + test.prepare(collr)
56
57 if test.wantFail {
57 - assert.Error(t, igt.Init())
58 + assert.Error(t, collr.Init())
59 } else {
59 - assert.NoError(t, igt.Init())
60 + assert.NoError(t, collr.Init())
61 }
62 })
63 }
64 }
65
65 -func TestIntelGPU_Check(t *testing.T) {
66 +func TestCollector_Check(t *testing.T) {
67 tests := map[string]struct {
68 prepareMock func() *mockIntelGpuTop
69 wantFail bool
@@ -79,20 +80,20 @@ func TestIntelGPU_Check(t *testing.T) {
80
81 for name, test := range tests {
82 t.Run(name, func(t *testing.T) {
82 - igt := New()
83 + collr := New()
84 mock := test.prepareMock()
84 - igt.exec = mock
85 + collr.exec = mock
86
87 if test.wantFail {
87 - assert.Error(t, igt.Check())
88 + assert.Error(t, collr.Check())
89 } else {
89 - assert.NoError(t, igt.Check())
90 + assert.NoError(t, collr.Check())
91 }
92 })
93 }
94 }
95
95 -func TestIntelGPU_Collect(t *testing.T) {
96 +func TestCollector_Collect(t *testing.T) {
97 tests := map[string]struct {
98 prepareMock func() *mockIntelGpuTop
99 wantMetrics map[string]int64
@@ -118,54 +119,54 @@ func TestIntelGPU_Collect(t *testing.T) {
119
120 for name, test := range tests {
121 t.Run(name, func(t *testing.T) {
121 - igt := New()
122 + collr := New()
123 mock := test.prepareMock()
123 - igt.exec = mock
124 + collr.exec = mock
125
125 - mx := igt.Collect()
126 + mx := collr.Collect()
127
128 assert.Equal(t, test.wantMetrics, mx)
129 if len(test.wantMetrics) > 0 {
129 - assert.Len(t, *igt.Charts(), len(charts)+len(igt.engines))
130 + assert.Len(t, *collr.Charts(), len(charts)+len(collr.engines))
131 }
132 })
133 }
134 }
135
135 -func TestIntelGPU_Cleanup(t *testing.T) {
136 +func TestCollector_Cleanup(t *testing.T) {
137 tests := map[string]struct {
137 - prepare func() *IntelGPU
138 + prepare func() *Collector
139 }{
140 "not initialized exec": {
140 - prepare: func() *IntelGPU {
141 + prepare: func() *Collector {
142 return New()
143 },
144 },
145 "after check": {
145 - prepare: func() *IntelGPU {
146 - igt := New()
147 - igt.exec = prepareMockOK()
148 - _ = igt.Check()
149 - return igt
146 + prepare: func() *Collector {
147 + collr := New()
148 + collr.exec = prepareMockOK()
149 + _ = collr.Check()
150 + return collr
151 },
152 },
153 "after collect": {
153 - prepare: func() *IntelGPU {
154 - igt := New()
155 - igt.exec = prepareMockOK()
156 - _ = igt.Collect()
157 - return igt
154 + prepare: func() *Collector {
155 + collr := New()
156 + collr.exec = prepareMockOK()
157 + _ = collr.Collect()
158 + return collr
159 },
160 },
161 }
162
163 for name, test := range tests {
164 t.Run(name, func(t *testing.T) {
164 - igt := test.prepare()
165 + collr := test.prepare()
166
166 - mock, ok := igt.exec.(*mockIntelGpuTop)
167 + mock, ok := collr.exec.(*mockIntelGpuTop)
168
168 - assert.NotPanics(t, igt.Cleanup)
169 + assert.NotPanics(t, collr.Cleanup)
170
171 if ok {
172 assert.True(t, mock.stopCalled)
src/go/plugin/go.d/collector/intelgpu/exec.go
+5
@@ -14,6 +14,11 @@ import (
14 "github.com/netdata/netdata/go/plugins/logger"
15 )
16
17 +type intelGpuTop interface {
18 + queryGPUSummaryJson() ([]byte, error)
19 + stop() error
20 +}
21 +
22 func newIntelGpuTopExec(log *logger.Logger, ndsudoPath string, updateEvery int, device string) (*intelGpuTopExec, error) {
23 topExec := &intelGpuTopExec{
24 Logger: log,
src/go/plugin/go.d/collector/intelgpu/init.go
+3 -3
@@ -10,12 +10,12 @@ import (
10 "github.com/netdata/netdata/go/plugins/pkg/executable"
11 )
12
13 -func (ig *IntelGPU) initIntelGPUTopExec() (intelGpuTop, error) {
14 - ndsudoPath := filepath.Join(executable.Directory, ig.ndsudoName)
13 +func (c *Collector) initIntelGPUTopExec() (intelGpuTop, error) {
14 + ndsudoPath := filepath.Join(executable.Directory, c.ndsudoName)
15 if _, err := os.Stat(ndsudoPath); err != nil {
16 return nil, fmt.Errorf("ndsudo executable not found: %v", err)
17
18 }
19
20 - return newIntelGpuTopExec(ig.Logger, ndsudoPath, ig.UpdateEvery, ig.Device)
20 + return newIntelGpuTopExec(c.Logger, ndsudoPath, c.UpdateEvery, c.Device)
21 }
src/go/plugin/go.d/collector/ipfs/collect.go
+27 -27
@@ -37,25 +37,25 @@ const (
37 urlPathPinLs = "/api/v0/pin/ls" // https://docs.ipfs.tech/reference/kubo/rpc/#api-v0-pin-ls
38 )
39
40 -func (ip *IPFS) collect() (map[string]int64, error) {
40 +func (c *Collector) collect() (map[string]int64, error) {
41 mx := make(map[string]int64)
42
43 - if err := ip.collectStatsBandwidth(mx); err != nil {
43 + if err := c.collectStatsBandwidth(mx); err != nil {
44 return nil, err
45 }
46 - if err := ip.collectSwarmPeers(mx); err != nil {
46 + if err := c.collectSwarmPeers(mx); err != nil {
47 return nil, err
48 }
49 - if ip.QueryRepoApi {
49 + if c.QueryRepoApi {
50 // https://github.com/netdata/netdata/pull/9687
51 // TODO: collect by default with "size-only"
52 // https://github.com/ipfs/kubo/issues/7528#issuecomment-657398332
53 - if err := ip.collectStatsRepo(mx); err != nil {
53 + if err := c.collectStatsRepo(mx); err != nil {
54 return nil, err
55 }
56 }
57 - if ip.QueryPinApi {
58 - if err := ip.collectPinLs(mx); err != nil {
57 + if c.QueryPinApi {
58 + if err := c.collectPinLs(mx); err != nil {
59 return nil, err
60 }
61 }
@@ -63,8 +63,8 @@ func (ip *IPFS) collect() (map[string]int64, error) {
63 return mx, nil
64 }
65
66 -func (ip *IPFS) collectStatsBandwidth(mx map[string]int64) error {
67 - stats, err := ip.queryStatsBandwidth()
66 +func (c *Collector) collectStatsBandwidth(mx map[string]int64) error {
67 + stats, err := c.queryStatsBandwidth()
68 if err != nil {
69 return err
70 }
@@ -75,8 +75,8 @@ func (ip *IPFS) collectStatsBandwidth(mx map[string]int64) error {
75 return nil
76 }
77
78 -func (ip *IPFS) collectSwarmPeers(mx map[string]int64) error {
79 - stats, err := ip.querySwarmPeers()
78 +func (c *Collector) collectSwarmPeers(mx map[string]int64) error {
79 + stats, err := c.querySwarmPeers()
80 if err != nil {
81 return err
82 }
@@ -86,8 +86,8 @@ func (ip *IPFS) collectSwarmPeers(mx map[string]int64) error {
86 return nil
87 }
88
89 -func (ip *IPFS) collectStatsRepo(mx map[string]int64) error {
90 - stats, err := ip.queryStatsRepo()
89 +func (c *Collector) collectStatsRepo(mx map[string]int64) error {
90 + stats, err := c.queryStatsRepo()
91 if err != nil {
92 return err
93 }
@@ -102,8 +102,8 @@ func (ip *IPFS) collectStatsRepo(mx map[string]int64) error {
102 return nil
103 }
104
105 -func (ip *IPFS) collectPinLs(mx map[string]int64) error {
106 - stats, err := ip.queryPinLs()
105 +func (c *Collector) collectPinLs(mx map[string]int64) error {
106 + stats, err := c.queryPinLs()
107 if err != nil {
108 return err
109 }
@@ -121,14 +121,14 @@ func (ip *IPFS) collectPinLs(mx map[string]int64) error {
121 return nil
122 }
123
124 -func (ip *IPFS) queryStatsBandwidth() (*ipfsStatsBw, error) {
125 - req, err := web.NewHTTPRequestWithPath(ip.RequestConfig, urlPathStatsBandwidth)
124 +func (c *Collector) queryStatsBandwidth() (*ipfsStatsBw, error) {
125 + req, err := web.NewHTTPRequestWithPath(c.RequestConfig, urlPathStatsBandwidth)
126 if err != nil {
127 return nil, err
128 }
129
130 var stats ipfsStatsBw
131 - if err := web.DoHTTP(ip.httpClient).RequestJSON(req, &stats); err != nil {
131 + if err := web.DoHTTP(c.httpClient).RequestJSON(req, &stats); err != nil {
132 return nil, err
133 }
134
@@ -139,42 +139,42 @@ func (ip *IPFS) queryStatsBandwidth() (*ipfsStatsBw, error) {
139 return &stats, nil
140 }
141
142 -func (ip *IPFS) querySwarmPeers() (*ipfsSwarmPeers, error) {
143 - req, err := web.NewHTTPRequestWithPath(ip.RequestConfig, urlPathSwarmPeers)
142 +func (c *Collector) querySwarmPeers() (*ipfsSwarmPeers, error) {
143 + req, err := web.NewHTTPRequestWithPath(c.RequestConfig, urlPathSwarmPeers)
144 if err != nil {
145 return nil, err
146 }
147
148 var stats ipfsSwarmPeers
149 - if err := web.DoHTTP(ip.httpClient).RequestJSON(req, &stats); err != nil {
149 + if err := web.DoHTTP(c.httpClient).RequestJSON(req, &stats); err != nil {
150 return nil, err
151 }
152
153 return &stats, nil
154 }
155
156 -func (ip *IPFS) queryStatsRepo() (*ipfsStatsRepo, error) {
157 - req, err := web.NewHTTPRequestWithPath(ip.RequestConfig, urlPathStatsRepo)
156 +func (c *Collector) queryStatsRepo() (*ipfsStatsRepo, error) {
157 + req, err := web.NewHTTPRequestWithPath(c.RequestConfig, urlPathStatsRepo)
158 if err != nil {
159 return nil, err
160 }
161
162 var stats ipfsStatsRepo
163 - if err := web.DoHTTP(ip.httpClient).RequestJSON(req, &stats); err != nil {
163 + if err := web.DoHTTP(c.httpClient).RequestJSON(req, &stats); err != nil {
164 return nil, err
165 }
166
167 return &stats, nil
168 }
169
170 -func (ip *IPFS) queryPinLs() (*ipfsPinsLs, error) {
171 - req, err := web.NewHTTPRequestWithPath(ip.RequestConfig, urlPathPinLs)
170 +func (c *Collector) queryPinLs() (*ipfsPinsLs, error) {
171 + req, err := web.NewHTTPRequestWithPath(c.RequestConfig, urlPathPinLs)
172 if err != nil {
173 return nil, err
174 }
175
176 var stats ipfsPinsLs
177 - if err := web.DoHTTP(ip.httpClient).RequestJSON(req, &stats); err != nil {
177 + if err := web.DoHTTP(c.httpClient).RequestJSON(req, &stats); err != nil {
178 return nil, err
179 }
180
src/go/plugin/go.d/collector/ipfs/collector.go renamed
+27 -27
@@ -25,8 +25,8 @@ func init() {
25 })
26 }
27
28 -func New() *IPFS {
29 - return &IPFS{
28 +func New() *Collector {
29 + return &Collector{
30 Config: Config{
31 HTTPConfig: web.HTTPConfig{
32 RequestConfig: web.RequestConfig{
@@ -51,7 +51,7 @@ type Config struct {
51 QueryRepoApi bool `yaml:"repoapi" json:"repoapi"`
52 }
53
54 -type IPFS struct {
54 +type Collector struct {
55 module.Base
56 Config `yaml:",inline" json:""`
57
@@ -60,38 +60,38 @@ type IPFS struct {
60 httpClient *http.Client
61 }
62
63 -func (ip *IPFS) Configuration() any {
64 - return ip.Config
63 +func (c *Collector) Configuration() any {
64 + return c.Config
65 }
66
67 -func (ip *IPFS) Init() error {
68 - if ip.URL == "" {
67 +func (c *Collector) Init() error {
68 + if c.URL == "" {
69 return errors.New("url not set")
70 }
71
72 - client, err := web.NewHTTPClient(ip.ClientConfig)
72 + client, err := web.NewHTTPClient(c.ClientConfig)
73 if err != nil {
74 return fmt.Errorf("http client init: %w", err)
75 }
76 - ip.httpClient = client
76 + c.httpClient = client
77
78 - if !ip.QueryPinApi {
79 - _ = ip.Charts().Remove(repoPinnedObjChart.ID)
78 + if !c.QueryPinApi {
79 + _ = c.Charts().Remove(repoPinnedObjChart.ID)
80 }
81 - if !ip.QueryRepoApi {
82 - _ = ip.Charts().Remove(datastoreUtilizationChart.ID)
83 - _ = ip.Charts().Remove(repoSizeChart.ID)
84 - _ = ip.Charts().Remove(repoObjChart.ID)
81 + if !c.QueryRepoApi {
82 + _ = c.Charts().Remove(datastoreUtilizationChart.ID)
83 + _ = c.Charts().Remove(repoSizeChart.ID)
84 + _ = c.Charts().Remove(repoObjChart.ID)
85 }
86
87 - ip.Debugf("using URL %s", ip.URL)
88 - ip.Debugf("using timeout: %s", ip.Timeout)
87 + c.Debugf("using URL %s", c.URL)
88 + c.Debugf("using timeout: %s", c.Timeout)
89
90 return nil
91 }
92
93 -func (ip *IPFS) Check() error {
94 - mx, err := ip.collect()
93 +func (c *Collector) Check() error {
94 + mx, err := c.collect()
95 if err != nil {
96 return err
97 }
@@ -103,14 +103,14 @@ func (ip *IPFS) Check() error {
103 return nil
104 }
105
106 -func (ip *IPFS) Charts() *module.Charts {
107 - return ip.charts
106 +func (c *Collector) Charts() *module.Charts {
107 + return c.charts
108 }
109
110 -func (ip *IPFS) Collect() map[string]int64 {
111 - mx, err := ip.collect()
110 +func (c *Collector) Collect() map[string]int64 {
111 + mx, err := c.collect()
112 if err != nil {
113 - ip.Error(err)
113 + c.Error(err)
114 }
115
116 if len(mx) == 0 {
@@ -120,8 +120,8 @@ func (ip *IPFS) Collect() map[string]int64 {
120 return mx
121 }
122
123 -func (ip *IPFS) Cleanup() {
124 - if ip.httpClient != nil {
125 - ip.httpClient.CloseIdleConnections()
123 +func (c *Collector) Cleanup() {
124 + if c.httpClient != nil {
125 + c.httpClient.CloseIdleConnections()
126 }
127 }
src/go/plugin/go.d/collector/ipfs/collector_test.go renamed
+43 -43
@@ -38,11 +38,11 @@ func Test_testDataIsValid(t *testing.T) {
38 }
39 }
40
41 -func TestIPFS_ConfigurationSerialize(t *testing.T) {
42 - module.TestConfigurationSerialize(t, &IPFS{}, dataConfigJSON, dataConfigYAML)
41 +func TestCollector_ConfigurationSerialize(t *testing.T) {
42 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
43 }
44
45 -func TestIPFS_Init(t *testing.T) {
45 +func TestCollector_Init(t *testing.T) {
46 tests := map[string]struct {
47 wantFail bool
48 config Config
@@ -63,26 +63,26 @@ func TestIPFS_Init(t *testing.T) {
63
64 for name, test := range tests {
65 t.Run(name, func(t *testing.T) {
66 - ipfs := New()
67 - ipfs.Config = test.config
66 + collr := New()
67 + collr.Config = test.config
68
69 if test.wantFail {
70 - assert.Error(t, ipfs.Init())
70 + assert.Error(t, collr.Init())
71 } else {
72 - assert.NoError(t, ipfs.Init())
72 + assert.NoError(t, collr.Init())
73 }
74 })
75 }
76 }
77
78 -func TestIPFS_Charts(t *testing.T) {
78 +func TestCollector_Charts(t *testing.T) {
79 assert.NotNil(t, New().Charts())
80 }
81
82 -func TestIPFS_Check(t *testing.T) {
82 +func TestCollector_Check(t *testing.T) {
83 tests := map[string]struct {
84 wantFail bool
85 - prepare func(t *testing.T) (*IPFS, func())
85 + prepare func(t *testing.T) (*Collector, func())
86 }{
87 "success default config": {
88 wantFail: false,
@@ -108,21 +108,21 @@ func TestIPFS_Check(t *testing.T) {
108
109 for name, test := range tests {
110 t.Run(name, func(t *testing.T) {
111 - ipfs, cleanup := test.prepare(t)
111 + collr, cleanup := test.prepare(t)
112 defer cleanup()
113
114 if test.wantFail {
115 - assert.Error(t, ipfs.Check())
115 + assert.Error(t, collr.Check())
116 } else {
117 - assert.NoError(t, ipfs.Check())
117 + assert.NoError(t, collr.Check())
118 }
119 })
120 }
121 }
122
123 -func TestIPFS_Collect(t *testing.T) {
123 +func TestCollector_Collect(t *testing.T) {
124 tests := map[string]struct {
125 - prepare func(t *testing.T) (*IPFS, func())
125 + prepare func(t *testing.T) (*Collector, func())
126 wantMetrics map[string]int64
127 }{
128 "success default config": {
@@ -159,21 +159,21 @@ func TestIPFS_Collect(t *testing.T) {
159
160 for name, test := range tests {
161 t.Run(name, func(t *testing.T) {
162 - ipfs, cleanup := test.prepare(t)
162 + collr, cleanup := test.prepare(t)
163 defer cleanup()
164
165 - mx := ipfs.Collect()
165 + mx := collr.Collect()
166
167 require.Equal(t, test.wantMetrics, mx)
168
169 if len(test.wantMetrics) > 0 {
170 - module.TestMetricsHasAllChartsDims(t, ipfs.Charts(), mx)
170 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
171 }
172 })
173 }
174 }
175
176 -func prepareCaseOkDefault(t *testing.T) (*IPFS, func()) {
176 +func prepareCaseOkDefault(t *testing.T) (*Collector, func()) {
177 t.Helper()
178 srv := httptest.NewServer(http.HandlerFunc(
179 func(w http.ResponseWriter, r *http.Request) {
@@ -191,24 +191,24 @@ func prepareCaseOkDefault(t *testing.T) (*IPFS, func()) {
191 }
192 }))
193
194 - ipfs := New()
195 - ipfs.URL = srv.URL
196 - require.NoError(t, ipfs.Init())
194 + collr := New()
195 + collr.URL = srv.URL
196 + require.NoError(t, collr.Init())
197
198 - return ipfs, srv.Close
198 + return collr, srv.Close
199 }
200
201 -func prepareCaseOkAllQueriesEnabled(t *testing.T) (*IPFS, func()) {
201 +func prepareCaseOkAllQueriesEnabled(t *testing.T) (*Collector, func()) {
202 t.Helper()
203 - ipfs, cleanup := prepareCaseOkDefault(t)
203 + collr, cleanup := prepareCaseOkDefault(t)
204
205 - ipfs.QueryRepoApi = true
206 - ipfs.QueryPinApi = true
205 + collr.QueryRepoApi = true
206 + collr.QueryPinApi = true
207
208 - return ipfs, cleanup
208 + return collr, cleanup
209 }
210
211 -func prepareCaseUnexpectedJsonResponse(t *testing.T) (*IPFS, func()) {
211 +func prepareCaseUnexpectedJsonResponse(t *testing.T) (*Collector, func()) {
212 t.Helper()
213 resp := `
214 {
@@ -232,32 +232,32 @@ func prepareCaseUnexpectedJsonResponse(t *testing.T) (*IPFS, func()) {
232 _, _ = w.Write([]byte(resp))
233 }))
234
235 - ipfs := New()
236 - ipfs.URL = srv.URL
237 - require.NoError(t, ipfs.Init())
235 + collr := New()
236 + collr.URL = srv.URL
237 + require.NoError(t, collr.Init())
238
239 - return ipfs, srv.Close
239 + return collr, srv.Close
240 }
241
242 -func prepareCaseInvalidFormatResponse(t *testing.T) (*IPFS, func()) {
242 +func prepareCaseInvalidFormatResponse(t *testing.T) (*Collector, func()) {
243 t.Helper()
244 srv := httptest.NewServer(http.HandlerFunc(
245 func(w http.ResponseWriter, r *http.Request) {
246 _, _ = w.Write([]byte("hello and\n goodbye"))
247 }))
248
249 - ipfs := New()
250 - ipfs.URL = srv.URL
251 - require.NoError(t, ipfs.Init())
249 + collr := New()
250 + collr.URL = srv.URL
251 + require.NoError(t, collr.Init())
252
253 - return ipfs, srv.Close
253 + return collr, srv.Close
254 }
255
256 -func prepareCaseConnectionRefused(t *testing.T) (*IPFS, func()) {
256 +func prepareCaseConnectionRefused(t *testing.T) (*Collector, func()) {
257 t.Helper()
258 - ipfs := New()
259 - ipfs.URL = "http://127.0.0.1:65001"
260 - require.NoError(t, ipfs.Init())
258 + collr := New()
259 + collr.URL = "http://127.0.0.1:65001"
260 + require.NoError(t, collr.Init())
261
262 - return ipfs, func() {}
262 + return collr, func() {}
263 }
src/go/plugin/go.d/collector/isc_dhcpd/collect.go
+12 -12
@@ -23,33 +23,33 @@ In order to process both DHCPv4 and DHCPv6 messages you will need to run two sep
23 Each of these instances will need its own lease file.
24 */
25
26 -func (d *DHCPd) collect() (map[string]int64, error) {
27 - fi, err := os.Stat(d.LeasesPath)
26 +func (c *Collector) collect() (map[string]int64, error) {
27 + fi, err := os.Stat(c.LeasesPath)
28 if err != nil {
29 return nil, err
30 }
31
32 - if d.leasesModTime.Equal(fi.ModTime()) {
33 - d.Debugf("leases file is not modified, returning cached metrics ('%s')", d.LeasesPath)
34 - return d.collected, nil
32 + if c.leasesModTime.Equal(fi.ModTime()) {
33 + c.Debugf("leases file is not modified, returning cached metrics ('%s')", c.LeasesPath)
34 + return c.collected, nil
35 }
36
37 - d.leasesModTime = fi.ModTime()
37 + c.leasesModTime = fi.ModTime()
38
39 - leases, err := parseDHCPdLeasesFile(d.LeasesPath)
39 + leases, err := parseDHCPdLeasesFile(c.LeasesPath)
40 if err != nil {
41 return nil, err
42 }
43
44 activeLeases := removeInactiveLeases(leases)
45 - d.Debugf("found total/active %d/%d leases ('%s')", len(leases), len(activeLeases), d.LeasesPath)
45 + c.Debugf("found total/active %d/%d leases ('%s')", len(leases), len(activeLeases), c.LeasesPath)
46
47 - for _, pool := range d.pools {
48 - collectPool(d.collected, pool, activeLeases)
47 + for _, pool := range c.pools {
48 + collectPool(c.collected, pool, activeLeases)
49 }
50 - d.collected["active_leases_total"] = int64(len(activeLeases))
50 + c.collected["active_leases_total"] = int64(len(activeLeases))
51
52 - return d.collected, nil
52 + return c.collected, nil
53 }
54
55 const precision = 100
src/go/plugin/go.d/collector/isc_dhcpd/collector.go renamed
+21 -21
@@ -27,8 +27,8 @@ func init() {
27 })
28 }
29
30 -func New() *DHCPd {
31 - return &DHCPd{
30 +func New() *Collector {
31 + return &Collector{
32 Config: Config{
33 LeasesPath: "/var/lib/dhcp/dhcpd.leases",
34 },
@@ -50,7 +50,7 @@ type (
50 }
51 )
52
53 -type DHCPd struct {
53 +type Collector struct {
54 module.Base
55 Config `yaml:",inline" json:""`
56
@@ -61,36 +61,36 @@ type DHCPd struct {
61 collected map[string]int64
62 }
63
64 -func (d *DHCPd) Configuration() any {
65 - return d.Config
64 +func (c *Collector) Configuration() any {
65 + return c.Config
66 }
67
68 -func (d *DHCPd) Init() error {
69 - err := d.validateConfig()
68 +func (c *Collector) Init() error {
69 + err := c.validateConfig()
70 if err != nil {
71 return fmt.Errorf("config validation: %v", err)
72 }
73
74 - pools, err := d.initPools()
74 + pools, err := c.initPools()
75 if err != nil {
76 return fmt.Errorf("ip pools init: %v", err)
77 }
78 - d.pools = pools
78 + c.pools = pools
79
80 - charts, err := d.initCharts(pools)
80 + charts, err := c.initCharts(pools)
81 if err != nil {
82 return fmt.Errorf("charts init: %v", err)
83 }
84 - d.charts = charts
84 + c.charts = charts
85
86 - d.Debugf("monitoring leases file: %v", d.Config.LeasesPath)
87 - d.Debugf("monitoring ip pools: %v", d.Config.Pools)
86 + c.Debugf("monitoring leases file: %v", c.Config.LeasesPath)
87 + c.Debugf("monitoring ip pools: %v", c.Config.Pools)
88
89 return nil
90 }
91
92 -func (d *DHCPd) Check() error {
93 - mx, err := d.collect()
92 +func (c *Collector) Check() error {
93 + mx, err := c.collect()
94 if err != nil {
95 return err
96 }
@@ -100,14 +100,14 @@ func (d *DHCPd) Check() error {
100 return nil
101 }
102
103 -func (d *DHCPd) Charts() *module.Charts {
104 - return d.charts
103 +func (c *Collector) Charts() *module.Charts {
104 + return c.charts
105 }
106
107 -func (d *DHCPd) Collect() map[string]int64 {
108 - mx, err := d.collect()
107 +func (c *Collector) Collect() map[string]int64 {
108 + mx, err := c.collect()
109 if err != nil {
110 - d.Error(err)
110 + c.Error(err)
111 }
112
113 if len(mx) == 0 {
@@ -117,4 +117,4 @@ func (d *DHCPd) Collect() map[string]int64 {
117 return mx
118 }
119
120 -func (d *DHCPd) Cleanup() {}
120 +func (c *Collector) Cleanup() {}
src/go/plugin/go.d/collector/isc_dhcpd/collector_test.go renamed
+50 -50
@@ -28,15 +28,15 @@ func Test_testDataIsValid(t *testing.T) {
28 }
29 }
30
31 -func TestDHCPd_ConfigurationSerialize(t *testing.T) {
32 - module.TestConfigurationSerialize(t, &DHCPd{}, dataConfigJSON, dataConfigYAML)
31 +func TestCollector_ConfigurationSerialize(t *testing.T) {
32 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
33 }
34
35 -func TestDHCPd_Cleanup(t *testing.T) {
35 +func TestCollector_Cleanup(t *testing.T) {
36 assert.NotPanics(t, New().Cleanup)
37 }
38
39 -func TestDHCPd_Init(t *testing.T) {
39 +func TestCollector_Init(t *testing.T) {
40 tests := map[string]struct {
41 config Config
42 wantFail bool
@@ -80,21 +80,21 @@ func TestDHCPd_Init(t *testing.T) {
80
81 for name, test := range tests {
82 t.Run(name, func(t *testing.T) {
83 - dhcpd := New()
84 - dhcpd.Config = test.config
83 + collr := New()
84 + collr.Config = test.config
85
86 if test.wantFail {
87 - assert.Error(t, dhcpd.Init())
87 + assert.Error(t, collr.Init())
88 } else {
89 - assert.NoError(t, dhcpd.Init())
89 + assert.NoError(t, collr.Init())
90 }
91 })
92 }
93 }
94
95 -func TestDHCPd_Check(t *testing.T) {
95 +func TestCollector_Check(t *testing.T) {
96 tests := map[string]struct {
97 - prepare func() *DHCPd
97 + prepare func() *Collector
98 wantFail bool
99 }{
100 "lease db not exists": {prepare: prepareDHCPdLeasesNotExists, wantFail: true},
@@ -107,32 +107,32 @@ func TestDHCPd_Check(t *testing.T) {
107
108 for name, test := range tests {
109 t.Run(name, func(t *testing.T) {
110 - dhcpd := test.prepare()
111 - require.NoError(t, dhcpd.Init())
110 + collr := test.prepare()
111 + require.NoError(t, collr.Init())
112
113 if test.wantFail {
114 - assert.Error(t, dhcpd.Check())
114 + assert.Error(t, collr.Check())
115 } else {
116 - assert.NoError(t, dhcpd.Check())
116 + assert.NoError(t, collr.Check())
117 }
118 })
119 }
120 }
121
122 -func TestDHCPd_Charts(t *testing.T) {
123 - dhcpd := New()
124 - dhcpd.LeasesPath = "leases_path"
125 - dhcpd.Pools = []PoolConfig{
122 +func TestCollector_Charts(t *testing.T) {
123 + collr := New()
124 + collr.LeasesPath = "leases_path"
125 + collr.Pools = []PoolConfig{
126 {Name: "name", Networks: "192.0.2.0/24"},
127 }
128 - require.NoError(t, dhcpd.Init())
128 + require.NoError(t, collr.Init())
129
130 - assert.NotNil(t, dhcpd.Charts())
130 + assert.NotNil(t, collr.Charts())
131 }
132
133 -func TestDHCPd_Collect(t *testing.T) {
133 +func TestCollector_Collect(t *testing.T) {
134 tests := map[string]struct {
135 - prepare func() *DHCPd
135 + prepare func() *Collector
136 wantCollected map[string]int64
137 }{
138 "lease db not exists": {
@@ -225,22 +225,22 @@ func TestDHCPd_Collect(t *testing.T) {
225
226 for name, test := range tests {
227 t.Run(name, func(t *testing.T) {
228 - dhcpd := test.prepare()
229 - require.NoError(t, dhcpd.Init())
228 + collr := test.prepare()
229 + require.NoError(t, collr.Init())
230
231 - mx := dhcpd.Collect()
231 + mx := collr.Collect()
232
233 assert.Equal(t, test.wantCollected, mx)
234 if len(mx) > 0 {
235 - module.TestMetricsHasAllChartsDims(t, dhcpd.Charts(), mx)
235 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
236 }
237 })
238 }
239 }
240
241 -func prepareDHCPdLeasesNotExists() *DHCPd {
242 - dhcpd := New()
243 - dhcpd.Config = Config{
241 +func prepareDHCPdLeasesNotExists() *Collector {
242 + collr := New()
243 + collr.Config = Config{
244 LeasesPath: "testdata/dhcpd.leases_not_exists",
245 Pools: []PoolConfig{
246 {Name: "net1", Networks: "192.168.3.0/25"},
@@ -251,12 +251,12 @@ func prepareDHCPdLeasesNotExists() *DHCPd {
251 {Name: "net6", Networks: "10.254.255.0/24"},
252 },
253 }
254 - return dhcpd
254 + return collr
255 }
256
257 -func prepareDHCPdLeasesEmpty() *DHCPd {
258 - dhcpd := New()
259 - dhcpd.Config = Config{
257 +func prepareDHCPdLeasesEmpty() *Collector {
258 + collr := New()
259 + collr.Config = Config{
260 LeasesPath: "testdata/dhcpd.leases_empty",
261 Pools: []PoolConfig{
262 {Name: "net1", Networks: "192.168.3.0/25"},
@@ -267,12 +267,12 @@ func prepareDHCPdLeasesEmpty() *DHCPd {
267 {Name: "net6", Networks: "10.254.255.0/24"},
268 },
269 }
270 - return dhcpd
270 + return collr
271 }
272
273 -func prepareDHCPdLeasesIPv4() *DHCPd {
274 - dhcpd := New()
275 - dhcpd.Config = Config{
273 +func prepareDHCPdLeasesIPv4() *Collector {
274 + collr := New()
275 + collr.Config = Config{
276 LeasesPath: "testdata/dhcpd.leases_ipv4",
277 Pools: []PoolConfig{
278 {Name: "net1", Networks: "192.168.3.0/25"},
@@ -283,12 +283,12 @@ func prepareDHCPdLeasesIPv4() *DHCPd {
283 {Name: "net6", Networks: "10.254.255.0/24"},
284 },
285 }
286 - return dhcpd
286 + return collr
287 }
288
289 -func prepareDHCPdLeasesIPv4Backup() *DHCPd {
290 - dhcpd := New()
291 - dhcpd.Config = Config{
289 +func prepareDHCPdLeasesIPv4Backup() *Collector {
290 + collr := New()
291 + collr.Config = Config{
292 LeasesPath: "testdata/dhcpd.leases_ipv4_backup",
293 Pools: []PoolConfig{
294 {Name: "net1", Networks: "192.168.3.0/25"},
@@ -299,12 +299,12 @@ func prepareDHCPdLeasesIPv4Backup() *DHCPd {
299 {Name: "net6", Networks: "10.254.255.0/24"},
300 },
301 }
302 - return dhcpd
302 + return collr
303 }
304
305 -func prepareDHCPdLeasesIPv4Inactive() *DHCPd {
306 - dhcpd := New()
307 - dhcpd.Config = Config{
305 +func prepareDHCPdLeasesIPv4Inactive() *Collector {
306 + collr := New()
307 + collr.Config = Config{
308 LeasesPath: "testdata/dhcpd.leases_ipv4_inactive",
309 Pools: []PoolConfig{
310 {Name: "net1", Networks: "192.168.3.0/25"},
@@ -315,17 +315,17 @@ func prepareDHCPdLeasesIPv4Inactive() *DHCPd {
315 {Name: "net6", Networks: "10.254.255.0/24"},
316 },
317 }
318 - return dhcpd
318 + return collr
319 }
320
321 -func prepareDHCPdLeasesIPv6() *DHCPd {
322 - dhcpd := New()
323 - dhcpd.Config = Config{
321 +func prepareDHCPdLeasesIPv6() *Collector {
322 + collr := New()
323 + collr.Config = Config{
324 LeasesPath: "testdata/dhcpd.leases_ipv6",
325 Pools: []PoolConfig{
326 {Name: "net1", Networks: "2001:db8::-2001:db8::a"},
327 {Name: "net2", Networks: "2001:db8:0:1::-2001:db8:0:1::a"},
328 },
329 }
330 - return dhcpd
330 + return collr
331 }
src/go/plugin/go.d/collector/isc_dhcpd/init.go
+7 -7
@@ -18,14 +18,14 @@ type ipPool struct {
18 addresses iprange.Pool
19 }
20
21 -func (d *DHCPd) validateConfig() error {
22 - if d.Config.LeasesPath == "" {
21 +func (c *Collector) validateConfig() error {
22 + if c.Config.LeasesPath == "" {
23 return errors.New("'lease_path' parameter not set")
24 }
25 - if len(d.Config.Pools) == 0 {
25 + if len(c.Config.Pools) == 0 {
26 return errors.New("'pools' parameter not set")
27 }
28 - for i, cfg := range d.Config.Pools {
28 + for i, cfg := range c.Config.Pools {
29 if cfg.Name == "" {
30 return fmt.Errorf("'pools[%d]->pool.name' parameter not set", i+1)
31 }
@@ -36,10 +36,10 @@ func (d *DHCPd) validateConfig() error {
36 return nil
37 }
38
39 -func (d *DHCPd) initPools() ([]ipPool, error) {
39 +func (c *Collector) initPools() ([]ipPool, error) {
40 var pools []ipPool
41
42 - for i, cfg := range d.Pools {
42 + for i, cfg := range c.Pools {
43 ipRange, err := iprange.ParseRanges(cfg.Networks)
44 if err != nil {
45 return nil, fmt.Errorf("parse pools[%d]->pool.networks '%s' ('%s'): %v", i+1, cfg.Name, cfg.Networks, err)
@@ -55,7 +55,7 @@ func (d *DHCPd) initPools() ([]ipPool, error) {
55 return pools, nil
56 }
57
58 -func (d *DHCPd) initCharts(pools []ipPool) (*module.Charts, error) {
58 +func (c *Collector) initCharts(pools []ipPool) (*module.Charts, error) {
59 charts := &module.Charts{}
60
61 if err := charts.Add(activeLeasesTotalChart.Copy()); err != nil {
src/go/plugin/go.d/collector/k8s_kubelet/collect.go
+36 -36
@@ -11,8 +11,8 @@ import (
11 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/stm"
12 )
13
14 -func (k *Kubelet) collect() (map[string]int64, error) {
15 - raw, err := k.prom.ScrapeSeries()
14 +func (c *Collector) collect() (map[string]int64, error) {
15 + raw, err := c.prom.ScrapeSeries()
16
17 if err != nil {
18 return nil, err
@@ -20,17 +20,17 @@ func (k *Kubelet) collect() (map[string]int64, error) {
20
21 mx := newMetrics()
22
23 - k.collectToken(raw, mx)
24 - k.collectRESTClientHTTPRequests(raw, mx)
25 - k.collectAPIServer(raw, mx)
26 - k.collectKubelet(raw, mx)
27 - k.collectVolumeManager(raw, mx)
23 + c.collectToken(raw, mx)
24 + c.collectRESTClientHTTPRequests(raw, mx)
25 + c.collectAPIServer(raw, mx)
26 + c.collectKubelet(raw, mx)
27 + c.collectVolumeManager(raw, mx)
28
29 return stm.ToMap(mx), nil
30 }
31
32 -func (k *Kubelet) collectLogsUsagePerPod(raw prometheus.Series, mx *metrics) {
33 - chart := k.charts.Get("kubelet_pods_log_filesystem_used_bytes")
32 +func (c *Collector) collectLogsUsagePerPod(raw prometheus.Series, mx *metrics) {
33 + chart := c.charts.Get("kubelet_pods_log_filesystem_used_bytes")
34 seen := make(map[string]bool)
35
36 for _, metric := range raw.FindByName("kubelet_container_log_filesystem_used_bytes") {
@@ -64,16 +64,16 @@ func (k *Kubelet) collectLogsUsagePerPod(raw prometheus.Series, mx *metrics) {
64 }
65 }
66
67 -func (k *Kubelet) collectVolumeManager(raw prometheus.Series, mx *metrics) {
67 +func (c *Collector) collectVolumeManager(raw prometheus.Series, mx *metrics) {
68 vmPlugins := make(map[string]*volumeManagerPlugin)
69
70 for _, metric := range raw.FindByName("volume_manager_total_volumes") {
71 pluginName := metric.Labels.Get("plugin_name")
72 state := metric.Labels.Get("state")
73
74 - if !k.collectedVMPlugins[pluginName] {
75 - _ = k.charts.Add(newVolumeManagerChart(pluginName))
76 - k.collectedVMPlugins[pluginName] = true
74 + if !c.collectedVMPlugins[pluginName] {
75 + _ = c.charts.Add(newVolumeManagerChart(pluginName))
76 + c.collectedVMPlugins[pluginName] = true
77 }
78 if _, ok := vmPlugins[pluginName]; !ok {
79 vmPlugins[pluginName] = &volumeManagerPlugin{}
@@ -90,7 +90,7 @@ func (k *Kubelet) collectVolumeManager(raw prometheus.Series, mx *metrics) {
90 mx.VolumeManager.Plugins = vmPlugins
91 }
92
93 -func (k *Kubelet) collectKubelet(raw prometheus.Series, mx *metrics) {
93 +func (c *Collector) collectKubelet(raw prometheus.Series, mx *metrics) {
94 value := raw.FindByName("kubelet_node_config_error").Max()
95 mx.Kubelet.NodeConfigError.Set(value)
96
@@ -123,15 +123,15 @@ func (k *Kubelet) collectKubelet(raw prometheus.Series, mx *metrics) {
123 value = raw.FindByNames("kubelet_running_pod_count", "kubelet_running_pods").Max()
124 mx.Kubelet.RunningPodCount.Set(value)
125
126 - k.collectRuntimeOperations(raw, mx)
127 - k.collectRuntimeOperationsErrors(raw, mx)
128 - k.collectDockerOperations(raw, mx)
129 - k.collectDockerOperationsErrors(raw, mx)
130 - k.collectPLEGRelisting(raw, mx)
131 - k.collectLogsUsagePerPod(raw, mx)
126 + c.collectRuntimeOperations(raw, mx)
127 + c.collectRuntimeOperationsErrors(raw, mx)
128 + c.collectDockerOperations(raw, mx)
129 + c.collectDockerOperationsErrors(raw, mx)
130 + c.collectPLEGRelisting(raw, mx)
131 + c.collectLogsUsagePerPod(raw, mx)
132 }
133
134 -func (k *Kubelet) collectAPIServer(raw prometheus.Series, mx *metrics) {
134 +func (c *Collector) collectAPIServer(raw prometheus.Series, mx *metrics) {
135 value := raw.FindByName("apiserver_audit_requests_rejected_total").Max()
136 mx.APIServer.Audit.Requests.Rejected.Set(value)
137
@@ -141,10 +141,10 @@ func (k *Kubelet) collectAPIServer(raw prometheus.Series, mx *metrics) {
141 value = raw.FindByName("apiserver_storage_envelope_transformation_cache_misses_total").Max()
142 mx.APIServer.Storage.EnvelopeTransformation.CacheMisses.Set(value)
143
144 - k.collectStorageDataKeyGenerationLatencies(raw, mx)
144 + c.collectStorageDataKeyGenerationLatencies(raw, mx)
145 }
146
147 -func (k *Kubelet) collectToken(raw prometheus.Series, mx *metrics) {
147 +func (c *Collector) collectToken(raw prometheus.Series, mx *metrics) {
148 value := raw.FindByName("get_token_count").Max()
149 mx.Token.Count.Set(value)
150
@@ -152,7 +152,7 @@ func (k *Kubelet) collectToken(raw prometheus.Series, mx *metrics) {
152 mx.Token.FailCount.Set(value)
153 }
154
155 -func (k *Kubelet) collectPLEGRelisting(raw prometheus.Series, mx *metrics) {
155 +func (c *Collector) collectPLEGRelisting(raw prometheus.Series, mx *metrics) {
156 // Summary
157 for _, metric := range raw.FindByName("kubelet_pleg_relist_interval_microseconds") {
158 if math.IsNaN(metric.Value) {
@@ -184,7 +184,7 @@ func (k *Kubelet) collectPLEGRelisting(raw prometheus.Series, mx *metrics) {
184 }
185 }
186
187 -func (k *Kubelet) collectStorageDataKeyGenerationLatencies(raw prometheus.Series, mx *metrics) {
187 +func (c *Collector) collectStorageDataKeyGenerationLatencies(raw prometheus.Series, mx *metrics) {
188 latencies := &mx.APIServer.Storage.DataKeyGeneration.Latencies
189 metricName := "apiserver_storage_data_key_generation_latencies_microseconds_bucket"
190
@@ -241,9 +241,9 @@ func (k *Kubelet) collectStorageDataKeyGenerationLatencies(raw prometheus.Series
241 latencies.LE10.Sub(latencies.LE5.Value())
242 }
243
244 -func (k *Kubelet) collectRESTClientHTTPRequests(raw prometheus.Series, mx *metrics) {
244 +func (c *Collector) collectRESTClientHTTPRequests(raw prometheus.Series, mx *metrics) {
245 metricName := "rest_client_requests_total"
246 - chart := k.charts.Get("rest_client_requests_by_code")
246 + chart := c.charts.Get("rest_client_requests_by_code")
247
248 for _, metric := range raw.FindByName(metricName) {
249 code := metric.Labels.Get("code")
@@ -258,7 +258,7 @@ func (k *Kubelet) collectRESTClientHTTPRequests(raw prometheus.Series, mx *metri
258 mx.RESTClient.Requests.ByStatusCode[code] = mtx.Gauge(metric.Value)
259 }
260
261 - chart = k.charts.Get("rest_client_requests_by_method")
261 + chart = c.charts.Get("rest_client_requests_by_method")
262
263 for _, metric := range raw.FindByName(metricName) {
264 method := metric.Labels.Get("method")
@@ -274,8 +274,8 @@ func (k *Kubelet) collectRESTClientHTTPRequests(raw prometheus.Series, mx *metri
274 }
275 }
276
277 -func (k *Kubelet) collectRuntimeOperations(raw prometheus.Series, mx *metrics) {
278 - chart := k.charts.Get("kubelet_runtime_operations")
277 +func (c *Collector) collectRuntimeOperations(raw prometheus.Series, mx *metrics) {
278 + chart := c.charts.Get("kubelet_runtime_operations")
279
280 // kubelet_runtime_operations_total
281 for _, metric := range raw.FindByNames("kubelet_runtime_operations", "kubelet_runtime_operations_total") {
@@ -292,8 +292,8 @@ func (k *Kubelet) collectRuntimeOperations(raw prometheus.Series, mx *metrics) {
292 }
293 }
294
295 -func (k *Kubelet) collectRuntimeOperationsErrors(raw prometheus.Series, mx *metrics) {
296 - chart := k.charts.Get("kubelet_runtime_operations_errors")
295 +func (c *Collector) collectRuntimeOperationsErrors(raw prometheus.Series, mx *metrics) {
296 + chart := c.charts.Get("kubelet_runtime_operations_errors")
297
298 // kubelet_runtime_operations_errors_total
299 for _, metric := range raw.FindByNames("kubelet_runtime_operations_errors", "kubelet_runtime_operations_errors_total") {
@@ -310,8 +310,8 @@ func (k *Kubelet) collectRuntimeOperationsErrors(raw prometheus.Series, mx *metr
310 }
311 }
312
313 -func (k *Kubelet) collectDockerOperations(raw prometheus.Series, mx *metrics) {
314 - chart := k.charts.Get("kubelet_docker_operations")
313 +func (c *Collector) collectDockerOperations(raw prometheus.Series, mx *metrics) {
314 + chart := c.charts.Get("kubelet_docker_operations")
315
316 // kubelet_docker_operations_total
317 for _, metric := range raw.FindByNames("kubelet_docker_operations", "kubelet_docker_operations_total") {
@@ -328,8 +328,8 @@ func (k *Kubelet) collectDockerOperations(raw prometheus.Series, mx *metrics) {
328 }
329 }
330
331 -func (k *Kubelet) collectDockerOperationsErrors(raw prometheus.Series, mx *metrics) {
332 - chart := k.charts.Get("kubelet_docker_operations_errors")
331 +func (c *Collector) collectDockerOperationsErrors(raw prometheus.Series, mx *metrics) {
332 + chart := c.charts.Get("kubelet_docker_operations_errors")
333
334 // kubelet_docker_operations_errors_total
335 for _, metric := range raw.FindByNames("kubelet_docker_operations_errors", "kubelet_docker_operations_errors_total") {
src/go/plugin/go.d/collector/k8s_kubelet/collector.go renamed
+21 -21
@@ -29,8 +29,8 @@ func init() {
29 })
30 }
31
32 -func New() *Kubelet {
33 - return &Kubelet{
32 +func New() *Collector {
33 + return &Collector{
34 Config: Config{
35 HTTPConfig: web.HTTPConfig{
36 RequestConfig: web.RequestConfig{
@@ -55,7 +55,7 @@ type Config struct {
55 TokenPath string `yaml:"token_path,omitempty" json:"token_path"`
56 }
57
58 -type Kubelet struct {
58 +type Collector struct {
59 module.Base
60 Config `yaml:",inline" json:""`
61
@@ -66,30 +66,30 @@ type Kubelet struct {
66 collectedVMPlugins map[string]bool // volume_manager_total_volumes
67 }
68
69 -func (k *Kubelet) Configuration() any {
70 - return k.Config
69 +func (c *Collector) Configuration() any {
70 + return c.Config
71 }
72
73 -func (k *Kubelet) Init() error {
74 - if err := k.validateConfig(); err != nil {
73 +func (c *Collector) Init() error {
74 + if err := c.validateConfig(); err != nil {
75 return fmt.Errorf("config validation: %v", err)
76 }
77
78 - prom, err := k.initPrometheusClient()
78 + prom, err := c.initPrometheusClient()
79 if err != nil {
80 return fmt.Errorf("init prometheus client: %v", err)
81 }
82 - k.prom = prom
82 + c.prom = prom
83
84 - if tok := k.initAuthToken(); tok != "" {
85 - k.RequestConfig.Headers["Authorization"] = "Bearer " + tok
84 + if tok := c.initAuthToken(); tok != "" {
85 + c.RequestConfig.Headers["Authorization"] = "Bearer " + tok
86 }
87
88 return nil
89 }
90
91 -func (k *Kubelet) Check() error {
92 - mx, err := k.collect()
91 +func (c *Collector) Check() error {
92 + mx, err := c.collect()
93 if err != nil {
94 return err
95 }
@@ -99,23 +99,23 @@ func (k *Kubelet) Check() error {
99 return nil
100 }
101
102 -func (k *Kubelet) Charts() *Charts {
103 - return k.charts
102 +func (c *Collector) Charts() *Charts {
103 + return c.charts
104 }
105
106 -func (k *Kubelet) Collect() map[string]int64 {
107 - mx, err := k.collect()
106 +func (c *Collector) Collect() map[string]int64 {
107 + mx, err := c.collect()
108
109 if err != nil {
110 - k.Error(err)
110 + c.Error(err)
111 return nil
112 }
113
114 return mx
115 }
116
117 -func (k *Kubelet) Cleanup() {
118 - if k.prom != nil && k.prom.HTTPClient() != nil {
119 - k.prom.HTTPClient().CloseIdleConnections()
117 +func (c *Collector) Cleanup() {
118 + if c.prom != nil && c.prom.HTTPClient() != nil {
119 + c.prom.HTTPClient().CloseIdleConnections()
120 }
121 }
src/go/plugin/go.d/collector/k8s_kubelet/collector_test.go renamed
+40 -40
@@ -33,38 +33,38 @@ func Test_testDataIsValid(t *testing.T) {
33 }
34 }
35
36 -func TestKubelet_ConfigurationSerialize(t *testing.T) {
37 - module.TestConfigurationSerialize(t, &Kubelet{}, dataConfigJSON, dataConfigYAML)
36 +func TestCollector_ConfigurationSerialize(t *testing.T) {
37 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
38 }
39
40 -func TestKubelet_Charts(t *testing.T) {
40 +func TestCollector_Charts(t *testing.T) {
41 assert.NotNil(t, New().Charts())
42 }
43
44 -func TestKubelet_Cleanup(t *testing.T) {
44 +func TestCollector_Cleanup(t *testing.T) {
45 New().Cleanup()
46 }
47
48 -func TestKubelet_Init(t *testing.T) {
48 +func TestCollector_Init(t *testing.T) {
49 assert.NoError(t, New().Init())
50 }
51
52 -func TestKubelet_Init_ReadServiceAccountToken(t *testing.T) {
53 - job := New()
54 - job.TokenPath = "testdata/token.txt"
52 +func TestCollector_Init_ReadServiceAccountToken(t *testing.T) {
53 + collr := New()
54 + collr.TokenPath = "testdata/token.txt"
55
56 - assert.NoError(t, job.Init())
57 - assert.Equal(t, "Bearer "+string(dataServiceAccountToken), job.RequestConfig.Headers["Authorization"])
56 + assert.NoError(t, collr.Init())
57 + assert.Equal(t, "Bearer "+string(dataServiceAccountToken), collr.RequestConfig.Headers["Authorization"])
58 }
59
60 -func TestKubelet_InitErrorOnCreatingClientWrongTLSCA(t *testing.T) {
61 - job := New()
62 - job.ClientConfig.TLSConfig.TLSCA = "testdata/tls"
60 +func TestCollector_InitErrorOnCreatingClientWrongTLSCA(t *testing.T) {
61 + collr := New()
62 + collr.ClientConfig.TLSConfig.TLSCA = "testdata/tls"
63
64 - assert.Error(t, job.Init())
64 + assert.Error(t, collr.Init())
65 }
66
67 -func TestKubelet_Check(t *testing.T) {
67 +func TestCollector_Check(t *testing.T) {
68 ts := httptest.NewServer(
69 http.HandlerFunc(
70 func(w http.ResponseWriter, r *http.Request) {
@@ -72,20 +72,20 @@ func TestKubelet_Check(t *testing.T) {
72 }))
73 defer ts.Close()
74
75 - job := New()
76 - job.URL = ts.URL + "/metrics"
77 - require.NoError(t, job.Init())
78 - assert.NoError(t, job.Check())
75 + collr := New()
76 + collr.URL = ts.URL + "/metrics"
77 + require.NoError(t, collr.Init())
78 + assert.NoError(t, collr.Check())
79 }
80
81 -func TestKubelet_Check_ConnectionRefused(t *testing.T) {
82 - job := New()
83 - job.URL = "http://127.0.0.1:38001/metrics"
84 - require.NoError(t, job.Init())
85 - assert.Error(t, job.Check())
81 +func TestCollector_Check_ConnectionRefused(t *testing.T) {
82 + collr := New()
83 + collr.URL = "http://127.0.0.1:38001/metrics"
84 + require.NoError(t, collr.Init())
85 + assert.Error(t, collr.Check())
86 }
87
88 -func TestKubelet_Collect(t *testing.T) {
88 +func TestCollector_Collect(t *testing.T) {
89 ts := httptest.NewServer(
90 http.HandlerFunc(
91 func(w http.ResponseWriter, r *http.Request) {
@@ -93,10 +93,10 @@ func TestKubelet_Collect(t *testing.T) {
93 }))
94 defer ts.Close()
95
96 - job := New()
97 - job.URL = ts.URL + "/metrics"
98 - require.NoError(t, job.Init())
99 - require.NoError(t, job.Check())
96 + collr := New()
97 + collr.URL = ts.URL + "/metrics"
98 + require.NoError(t, collr.Init())
99 + require.NoError(t, collr.Check())
100
101 expected := map[string]int64{
102 "apiserver_audit_requests_rejected_total": 0,
@@ -181,10 +181,10 @@ func TestKubelet_Collect(t *testing.T) {
181 "volume_manager_plugin_kubernetes.io/secret_state_desired": 4,
182 }
183
184 - assert.Equal(t, expected, job.Collect())
184 + assert.Equal(t, expected, collr.Collect())
185 }
186
187 -func TestKubelet_Collect_ReceiveInvalidResponse(t *testing.T) {
187 +func TestCollector_Collect_ReceiveInvalidResponse(t *testing.T) {
188 ts := httptest.NewServer(
189 http.HandlerFunc(
190 func(w http.ResponseWriter, r *http.Request) {
@@ -192,13 +192,13 @@ func TestKubelet_Collect_ReceiveInvalidResponse(t *testing.T) {
192 }))
193 defer ts.Close()
194
195 - job := New()
196 - job.URL = ts.URL + "/metrics"
197 - require.NoError(t, job.Init())
198 - assert.Error(t, job.Check())
195 + collr := New()
196 + collr.URL = ts.URL + "/metrics"
197 + require.NoError(t, collr.Init())
198 + assert.Error(t, collr.Check())
199 }
200
201 -func TestKubelet_Collect_Receive404(t *testing.T) {
201 +func TestCollector_Collect_Receive404(t *testing.T) {
202 ts := httptest.NewServer(
203 http.HandlerFunc(
204 func(w http.ResponseWriter, r *http.Request) {
@@ -206,8 +206,8 @@ func TestKubelet_Collect_Receive404(t *testing.T) {
206 }))
207 defer ts.Close()
208
209 - job := New()
210 - job.URL = ts.URL + "/metrics"
211 - require.NoError(t, job.Init())
212 - assert.Error(t, job.Check())
209 + collr := New()
210 + collr.URL = ts.URL + "/metrics"
211 + require.NoError(t, collr.Init())
212 + assert.Error(t, collr.Check())
213 }
src/go/plugin/go.d/collector/k8s_kubelet/init.go
+8 -8
@@ -10,26 +10,26 @@ import (
10 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/web"
11 )
12
13 -func (k *Kubelet) validateConfig() error {
14 - if k.URL == "" {
13 +func (c *Collector) validateConfig() error {
14 + if c.URL == "" {
15 return errors.New("url not set")
16 }
17 return nil
18 }
19
20 -func (k *Kubelet) initAuthToken() string {
21 - bs, err := os.ReadFile(k.TokenPath)
20 +func (c *Collector) initAuthToken() string {
21 + bs, err := os.ReadFile(c.TokenPath)
22 if err != nil {
23 - k.Warningf("error on reading service account token from '%s': %v", k.TokenPath, err)
23 + c.Warningf("error on reading service account token from '%s': %v", c.TokenPath, err)
24 }
25 return string(bs)
26 }
27
28 -func (k *Kubelet) initPrometheusClient() (prometheus.Prometheus, error) {
29 - httpClient, err := web.NewHTTPClient(k.ClientConfig)
28 +func (c *Collector) initPrometheusClient() (prometheus.Prometheus, error) {
29 + httpClient, err := web.NewHTTPClient(c.ClientConfig)
30 if err != nil {
31 return nil, err
32 }
33
34 - return prometheus.New(httpClient, k.RequestConfig), nil
34 + return prometheus.New(httpClient, c.RequestConfig), nil
35 }
src/go/plugin/go.d/collector/k8s_kubeproxy/collect.go
+12 -12
@@ -11,8 +11,8 @@ import (
11 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/stm"
12 )
13
14 -func (kp *KubeProxy) collect() (map[string]int64, error) {
15 - raw, err := kp.prom.ScrapeSeries()
14 +func (c *Collector) collect() (map[string]int64, error) {
15 + raw, err := c.prom.ScrapeSeries()
16
17 if err != nil {
18 return nil, err
@@ -20,20 +20,20 @@ func (kp *KubeProxy) collect() (map[string]int64, error) {
20
21 mx := newMetrics()
22
23 - kp.collectSyncProxyRules(raw, mx)
24 - kp.collectRESTClientHTTPRequests(raw, mx)
25 - kp.collectHTTPRequestDuration(raw, mx)
23 + c.collectSyncProxyRules(raw, mx)
24 + c.collectRESTClientHTTPRequests(raw, mx)
25 + c.collectHTTPRequestDuration(raw, mx)
26
27 return stm.ToMap(mx), nil
28 }
29
30 -func (kp *KubeProxy) collectSyncProxyRules(raw prometheus.Series, mx *metrics) {
30 +func (c *Collector) collectSyncProxyRules(raw prometheus.Series, mx *metrics) {
31 m := raw.FindByName("kubeproxy_sync_proxy_rules_latency_microseconds_count")
32 mx.SyncProxyRules.Count.Set(m.Max())
33 - kp.collectSyncProxyRulesLatency(raw, mx)
33 + c.collectSyncProxyRulesLatency(raw, mx)
34 }
35
36 -func (kp *KubeProxy) collectSyncProxyRulesLatency(raw prometheus.Series, mx *metrics) {
36 +func (c *Collector) collectSyncProxyRulesLatency(raw prometheus.Series, mx *metrics) {
37 metricName := "kubeproxy_sync_proxy_rules_latency_microseconds_bucket"
38 latency := &mx.SyncProxyRules.Latency
39
@@ -93,9 +93,9 @@ func (kp *KubeProxy) collectSyncProxyRulesLatency(raw prometheus.Series, mx *met
93 latency.LE2000.Sub(latency.LE1000.Value())
94 }
95
96 -func (kp *KubeProxy) collectRESTClientHTTPRequests(raw prometheus.Series, mx *metrics) {
96 +func (c *Collector) collectRESTClientHTTPRequests(raw prometheus.Series, mx *metrics) {
97 metricName := "rest_client_requests_total"
98 - chart := kp.charts.Get("rest_client_requests_by_code")
98 + chart := c.charts.Get("rest_client_requests_by_code")
99
100 for _, metric := range raw.FindByName(metricName) {
101 code := metric.Labels.Get("code")
@@ -110,7 +110,7 @@ func (kp *KubeProxy) collectRESTClientHTTPRequests(raw prometheus.Series, mx *me
110 mx.RESTClient.Requests.ByStatusCode[code] = mtx.Gauge(metric.Value)
111 }
112
113 - chart = kp.charts.Get("rest_client_requests_by_method")
113 + chart = c.charts.Get("rest_client_requests_by_method")
114
115 for _, metric := range raw.FindByName(metricName) {
116 method := metric.Labels.Get("method")
@@ -126,7 +126,7 @@ func (kp *KubeProxy) collectRESTClientHTTPRequests(raw prometheus.Series, mx *me
126 }
127 }
128
129 -func (kp *KubeProxy) collectHTTPRequestDuration(raw prometheus.Series, mx *metrics) {
129 +func (c *Collector) collectHTTPRequestDuration(raw prometheus.Series, mx *metrics) {
130 // Summary
131 for _, metric := range raw.FindByName("http_request_duration_microseconds") {
132 if math.IsNaN(metric.Value) {
src/go/plugin/go.d/collector/k8s_kubeproxy/collector.go renamed
+19 -19
@@ -29,8 +29,8 @@ func init() {
29 })
30 }
31
32 -func New() *KubeProxy {
33 - return &KubeProxy{
32 +func New() *Collector {
33 + return &Collector{
34 Config: Config{
35 HTTPConfig: web.HTTPConfig{
36 RequestConfig: web.RequestConfig{
@@ -50,7 +50,7 @@ type Config struct {
50 web.HTTPConfig `yaml:",inline" json:""`
51 }
52
53 -type KubeProxy struct {
53 +type Collector struct {
54 module.Base
55 Config `yaml:",inline" json:""`
56
@@ -59,26 +59,26 @@ type KubeProxy struct {
59 prom prometheus.Prometheus
60 }
61
62 -func (kp *KubeProxy) Configuration() any {
63 - return kp.Config
62 +func (c *Collector) Configuration() any {
63 + return c.Config
64 }
65
66 -func (kp *KubeProxy) Init() error {
67 - if err := kp.validateConfig(); err != nil {
66 +func (c *Collector) Init() error {
67 + if err := c.validateConfig(); err != nil {
68 return fmt.Errorf("config validation: %v", err)
69 }
70
71 - prom, err := kp.initPrometheusClient()
71 + prom, err := c.initPrometheusClient()
72 if err != nil {
73 return fmt.Errorf("init prometheus client: %v", err)
74 }
75 - kp.prom = prom
75 + c.prom = prom
76
77 return nil
78 }
79
80 -func (kp *KubeProxy) Check() error {
81 - mx, err := kp.collect()
80 +func (c *Collector) Check() error {
81 + mx, err := c.collect()
82 if err != nil {
83 return err
84 }
@@ -88,23 +88,23 @@ func (kp *KubeProxy) Check() error {
88 return nil
89 }
90
91 -func (kp *KubeProxy) Charts() *Charts {
92 - return kp.charts
91 +func (c *Collector) Charts() *Charts {
92 + return c.charts
93 }
94
95 -func (kp *KubeProxy) Collect() map[string]int64 {
96 - mx, err := kp.collect()
95 +func (c *Collector) Collect() map[string]int64 {
96 + mx, err := c.collect()
97
98 if err != nil {
99 - kp.Error(err)
99 + c.Error(err)
100 return nil
101 }
102
103 return mx
104 }
105
106 -func (kp *KubeProxy) Cleanup() {
107 - if kp.prom != nil && kp.prom.HTTPClient() != nil {
108 - kp.prom.HTTPClient().CloseIdleConnections()
106 +func (c *Collector) Cleanup() {
107 + if c.prom != nil && c.prom.HTTPClient() != nil {
108 + c.prom.HTTPClient().CloseIdleConnections()
109 }
110 }
src/go/plugin/go.d/collector/k8s_kubeproxy/collector_test.go renamed
+35 -35
@@ -31,29 +31,29 @@ func Test_testDataIsValid(t *testing.T) {
31 }
32 }
33
34 -func TestKubeProxy_ConfigurationSerialize(t *testing.T) {
35 - module.TestConfigurationSerialize(t, &KubeProxy{}, dataConfigJSON, dataConfigYAML)
34 +func TestCollector_ConfigurationSerialize(t *testing.T) {
35 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
36 }
37
38 -func TestKubeProxy_Charts(t *testing.T) {
38 +func TestCollector_Charts(t *testing.T) {
39 assert.NotNil(t, New().Charts())
40 }
41
42 -func TestKubeProxy_Cleanup(t *testing.T) {
42 +func TestCollector_Cleanup(t *testing.T) {
43 New().Cleanup()
44 }
45
46 -func TestKubeProxy_Init(t *testing.T) {
46 +func TestCollector_Init(t *testing.T) {
47 assert.NoError(t, New().Init())
48 }
49
50 -func TestKubeProxy_InitNG(t *testing.T) {
51 - job := New()
52 - job.URL = ""
53 - assert.Error(t, job.Init())
50 +func TestCollector_InitNG(t *testing.T) {
51 + collr := New()
52 + collr.URL = ""
53 + assert.Error(t, collr.Init())
54 }
55
56 -func TestKubeProxy_Check(t *testing.T) {
56 +func TestCollector_Check(t *testing.T) {
57 ts := httptest.NewServer(
58 http.HandlerFunc(
59 func(w http.ResponseWriter, r *http.Request) {
@@ -61,20 +61,20 @@ func TestKubeProxy_Check(t *testing.T) {
61 }))
62 defer ts.Close()
63
64 - job := New()
65 - job.URL = ts.URL + "/metrics"
66 - require.NoError(t, job.Init())
67 - assert.NoError(t, job.Check())
64 + collr := New()
65 + collr.URL = ts.URL + "/metrics"
66 + require.NoError(t, collr.Init())
67 + assert.NoError(t, collr.Check())
68 }
69
70 -func TestKubeProxy_CheckNG(t *testing.T) {
71 - job := New()
72 - job.URL = "http://127.0.0.1:38001/metrics"
73 - require.NoError(t, job.Init())
74 - assert.Error(t, job.Check())
70 +func TestCollector_CheckNG(t *testing.T) {
71 + collr := New()
72 + collr.URL = "http://127.0.0.1:38001/metrics"
73 + require.NoError(t, collr.Init())
74 + assert.Error(t, collr.Check())
75 }
76
77 -func TestKubeProxy_Collect(t *testing.T) {
77 +func TestCollector_Collect(t *testing.T) {
78 ts := httptest.NewServer(
79 http.HandlerFunc(
80 func(w http.ResponseWriter, r *http.Request) {
@@ -82,10 +82,10 @@ func TestKubeProxy_Collect(t *testing.T) {
82 }))
83 defer ts.Close()
84
85 - job := New()
86 - job.URL = ts.URL + "/metrics"
87 - require.NoError(t, job.Init())
88 - require.NoError(t, job.Check())
85 + collr := New()
86 + collr.URL = ts.URL + "/metrics"
87 + require.NoError(t, collr.Init())
88 + require.NoError(t, collr.Check())
89
90 expected := map[string]int64{
91 "sync_proxy_rules_count": 2669,
@@ -114,10 +114,10 @@ func TestKubeProxy_Collect(t *testing.T) {
114 "http_request_duration_099": 9464,
115 }
116
117 - assert.Equal(t, expected, job.Collect())
117 + assert.Equal(t, expected, collr.Collect())
118 }
119
120 -func TestKubeProxy_InvalidData(t *testing.T) {
120 +func TestCollector_InvalidData(t *testing.T) {
121 ts := httptest.NewServer(
122 http.HandlerFunc(
123 func(w http.ResponseWriter, r *http.Request) {
@@ -125,13 +125,13 @@ func TestKubeProxy_InvalidData(t *testing.T) {
125 }))
126 defer ts.Close()
127
128 - job := New()
129 - job.URL = ts.URL + "/metrics"
130 - require.NoError(t, job.Init())
131 - assert.Error(t, job.Check())
128 + collr := New()
129 + collr.URL = ts.URL + "/metrics"
130 + require.NoError(t, collr.Init())
131 + assert.Error(t, collr.Check())
132 }
133
134 -func TestKubeProxy_404(t *testing.T) {
134 +func TestCollector_404(t *testing.T) {
135 ts := httptest.NewServer(
136 http.HandlerFunc(
137 func(w http.ResponseWriter, r *http.Request) {
@@ -139,8 +139,8 @@ func TestKubeProxy_404(t *testing.T) {
139 }))
140 defer ts.Close()
141
142 - job := New()
143 - job.URL = ts.URL + "/metrics"
144 - require.NoError(t, job.Init())
145 - assert.Error(t, job.Check())
142 + collr := New()
143 + collr.URL = ts.URL + "/metrics"
144 + require.NoError(t, collr.Init())
145 + assert.Error(t, collr.Check())
146 }
src/go/plugin/go.d/collector/k8s_kubeproxy/init.go
+5 -5
@@ -9,18 +9,18 @@ import (
9 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/web"
10 )
11
12 -func (kp *KubeProxy) validateConfig() error {
13 - if kp.URL == "" {
12 +func (c *Collector) validateConfig() error {
13 + if c.URL == "" {
14 return errors.New("url not set")
15 }
16 return nil
17 }
18
19 -func (kp *KubeProxy) initPrometheusClient() (prometheus.Prometheus, error) {
20 - httpClient, err := web.NewHTTPClient(kp.ClientConfig)
19 +func (c *Collector) initPrometheusClient() (prometheus.Prometheus, error) {
20 + httpClient, err := web.NewHTTPClient(c.ClientConfig)
21 if err != nil {
22 return nil, err
23 }
24
25 - return prometheus.New(httpClient, kp.RequestConfig), nil
25 + return prometheus.New(httpClient, c.RequestConfig), nil
26 }
src/go/plugin/go.d/collector/k8s_state/charts.go
+43 -43
@@ -399,37 +399,37 @@ var (
399 }
400 )
401
402 -func (ks *KubeState) newNodeCharts(ns *nodeState) *module.Charts {
403 - cs := nodeChartsTmpl.Copy()
404 - for _, c := range *cs {
405 - c.ID = fmt.Sprintf(c.ID, replaceDots(ns.id()))
406 - c.Labels = ks.newNodeChartLabels(ns)
407 - for _, d := range c.Dims {
402 +func (c *Collector) newNodeCharts(ns *nodeState) *module.Charts {
403 + charts := nodeChartsTmpl.Copy()
404 + for _, chart := range *charts {
405 + chart.ID = fmt.Sprintf(chart.ID, replaceDots(ns.id()))
406 + chart.Labels = c.newNodeChartLabels(ns)
407 + for _, d := range chart.Dims {
408 d.ID = fmt.Sprintf(d.ID, ns.id())
409 }
410 }
411 - return cs
411 + return charts
412 }
413
414 -func (ks *KubeState) newNodeChartLabels(ns *nodeState) []module.Label {
414 +func (c *Collector) newNodeChartLabels(ns *nodeState) []module.Label {
415 labels := []module.Label{
416 {Key: labelKeyNodeName, Value: ns.name, Source: module.LabelSourceK8s},
417 - {Key: labelKeyClusterID, Value: ks.kubeClusterID, Source: module.LabelSourceK8s},
418 - {Key: labelKeyClusterName, Value: ks.kubeClusterName, Source: module.LabelSourceK8s},
417 + {Key: labelKeyClusterID, Value: c.kubeClusterID, Source: module.LabelSourceK8s},
418 + {Key: labelKeyClusterName, Value: c.kubeClusterName, Source: module.LabelSourceK8s},
419 }
420 return labels
421 }
422
423 -func (ks *KubeState) addNodeCharts(ns *nodeState) {
424 - cs := ks.newNodeCharts(ns)
425 - if err := ks.Charts().Add(*cs...); err != nil {
426 - ks.Warning(err)
423 +func (c *Collector) addNodeCharts(ns *nodeState) {
424 + cs := c.newNodeCharts(ns)
425 + if err := c.Charts().Add(*cs...); err != nil {
426 + c.Warning(err)
427 }
428 }
429
430 -func (ks *KubeState) removeNodeCharts(ns *nodeState) {
430 +func (c *Collector) removeNodeCharts(ns *nodeState) {
431 prefix := fmt.Sprintf("node_%s", replaceDots(ns.id()))
432 - for _, c := range *ks.Charts() {
432 + for _, c := range *c.Charts() {
433 if strings.HasPrefix(c.ID, prefix) {
434 c.MarkRemove()
435 c.MarkNotCreated()
@@ -591,19 +591,19 @@ var (
591 }
592 )
593
594 -func (ks *KubeState) newPodCharts(ps *podState) *module.Charts {
594 +func (c *Collector) newPodCharts(ps *podState) *module.Charts {
595 charts := podChartsTmpl.Copy()
596 - for _, c := range *charts {
597 - c.ID = fmt.Sprintf(c.ID, replaceDots(ps.id()))
598 - c.Labels = ks.newPodChartLabels(ps)
599 - for _, d := range c.Dims {
596 + for _, chart := range *charts {
597 + chart.ID = fmt.Sprintf(chart.ID, replaceDots(ps.id()))
598 + chart.Labels = c.newPodChartLabels(ps)
599 + for _, d := range chart.Dims {
600 d.ID = fmt.Sprintf(d.ID, ps.id())
601 }
602 }
603 return charts
604 }
605
606 -func (ks *KubeState) newPodChartLabels(ps *podState) []module.Label {
606 +func (c *Collector) newPodChartLabels(ps *podState) []module.Label {
607 labels := []module.Label{
608 {Key: labelKeyNamespace, Value: ps.namespace, Source: module.LabelSourceK8s},
609 {Key: labelKeyPodName, Value: ps.name, Source: module.LabelSourceK8s},
@@ -611,22 +611,22 @@ func (ks *KubeState) newPodChartLabels(ps *podState) []module.Label {
611 {Key: labelKeyQoSClass, Value: ps.qosClass, Source: module.LabelSourceK8s},
612 {Key: labelKeyControllerKind, Value: ps.controllerKind, Source: module.LabelSourceK8s},
613 {Key: labelKeyControllerName, Value: ps.controllerName, Source: module.LabelSourceK8s},
614 - {Key: labelKeyClusterID, Value: ks.kubeClusterID, Source: module.LabelSourceK8s},
615 - {Key: labelKeyClusterName, Value: ks.kubeClusterName, Source: module.LabelSourceK8s},
614 + {Key: labelKeyClusterID, Value: c.kubeClusterID, Source: module.LabelSourceK8s},
615 + {Key: labelKeyClusterName, Value: c.kubeClusterName, Source: module.LabelSourceK8s},
616 }
617 return labels
618 }
619
620 -func (ks *KubeState) addPodCharts(ps *podState) {
621 - charts := ks.newPodCharts(ps)
622 - if err := ks.Charts().Add(*charts...); err != nil {
623 - ks.Warning(err)
620 +func (c *Collector) addPodCharts(ps *podState) {
621 + charts := c.newPodCharts(ps)
622 + if err := c.Charts().Add(*charts...); err != nil {
623 + c.Warning(err)
624 }
625 }
626
627 -func (ks *KubeState) updatePodChartsNodeLabel(ps *podState) {
627 +func (c *Collector) updatePodChartsNodeLabel(ps *podState) {
628 prefix := fmt.Sprintf("pod_%s", replaceDots(ps.id()))
629 - for _, c := range *ks.Charts() {
629 + for _, c := range *c.Charts() {
630 if strings.HasPrefix(c.ID, prefix) {
631 updateNodeLabel(c, ps.nodeName)
632 c.MarkNotCreated()
@@ -643,9 +643,9 @@ func updateNodeLabel(c *module.Chart, nodeName string) {
643 }
644 }
645
646 -func (ks *KubeState) removePodCharts(ps *podState) {
646 +func (c *Collector) removePodCharts(ps *podState) {
647 prefix := fmt.Sprintf("pod_%s", replaceDots(ps.id()))
648 - for _, c := range *ks.Charts() {
648 + for _, c := range *c.Charts() {
649 if strings.HasPrefix(c.ID, prefix) {
650 c.MarkRemove()
651 c.MarkNotCreated()
@@ -730,30 +730,30 @@ var (
730 }()
731 )
732
733 -func (ks *KubeState) newContainerCharts(ps *podState, cs *containerState) *module.Charts {
733 +func (c *Collector) newContainerCharts(ps *podState, cs *containerState) *module.Charts {
734 charts := containerChartsTmpl.Copy()
735 - for _, c := range *charts {
736 - c.ID = fmt.Sprintf(c.ID, replaceDots(ps.id()), cs.name)
737 - c.Labels = ks.newContainerChartLabels(ps, cs)
738 - for _, d := range c.Dims {
735 + for _, chart := range *charts {
736 + chart.ID = fmt.Sprintf(chart.ID, replaceDots(ps.id()), cs.name)
737 + chart.Labels = c.newContainerChartLabels(ps, cs)
738 + for _, d := range chart.Dims {
739 d.ID = fmt.Sprintf(d.ID, ps.id(), cs.name)
740 }
741 }
742 return charts
743 }
744
745 -func (ks *KubeState) newContainerChartLabels(ps *podState, cs *containerState) []module.Label {
746 - labels := ks.newPodChartLabels(ps)
745 +func (c *Collector) newContainerChartLabels(ps *podState, cs *containerState) []module.Label {
746 + labels := c.newPodChartLabels(ps)
747 labels = append(
748 labels, module.Label{Key: labelKeyContainerName, Value: cs.name, Source: module.LabelSourceK8s},
749 )
750 return labels
751 }
752
753 -func (ks *KubeState) addContainerCharts(ps *podState, cs *containerState) {
754 - charts := ks.newContainerCharts(ps, cs)
755 - if err := ks.Charts().Add(*charts...); err != nil {
756 - ks.Warning(err)
753 +func (c *Collector) addContainerCharts(ps *podState, cs *containerState) {
754 + charts := c.newContainerCharts(ps, cs)
755 + if err := c.Charts().Add(*charts...); err != nil {
756 + c.Warning(err)
757 }
758 }
759
src/go/plugin/go.d/collector/k8s_state/cluster_meta.go
+5 -5
@@ -14,20 +14,20 @@ import (
14 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
15 )
16
17 -func (ks *KubeState) getKubeClusterID() string {
18 - ns, err := ks.client.CoreV1().Namespaces().Get(ks.ctx, "kube-system", metav1.GetOptions{})
17 +func (c *Collector) getKubeClusterID() string {
18 + ns, err := c.client.CoreV1().Namespaces().Get(c.ctx, "kube-system", metav1.GetOptions{})
19 if err != nil {
20 - ks.Warningf("error on getting 'kube-system' namespace UID: %v", err)
20 + c.Warningf("error on getting 'kube-system' namespace UID: %v", err)
21 return ""
22 }
23 return string(ns.UID)
24 }
25
26 -func (ks *KubeState) getKubeClusterName() string {
26 +func (c *Collector) getKubeClusterName() string {
27 client := &http.Client{Timeout: time.Second}
28 n, err := getGKEKubeClusterName(client)
29 if err != nil {
30 - ks.Debugf("error on getting GKE cluster name: %v", err)
30 + c.Debugf("error on getting GKE cluster name: %v", err)
31 }
32 return n
33 }
src/go/plugin/go.d/collector/k8s_state/collect.go
+34 -34
@@ -58,28 +58,28 @@ var (
58 }
59 )
60
61 -func (ks *KubeState) collect() (map[string]int64, error) {
62 - if ks.discoverer == nil {
61 +func (c *Collector) collect() (map[string]int64, error) {
62 + if c.discoverer == nil {
63 return nil, errors.New("nil discoverer")
64 }
65
66 - ks.once.Do(func() {
67 - ks.startTime = time.Now()
66 + c.once.Do(func() {
67 + c.startTime = time.Now()
68 in := make(chan resource)
69
70 - ks.wg.Add(1)
71 - go func() { defer ks.wg.Done(); ks.runUpdateState(in) }()
70 + c.wg.Add(1)
71 + go func() { defer c.wg.Done(); c.runUpdateState(in) }()
72
73 - ks.wg.Add(1)
74 - go func() { defer ks.wg.Done(); ks.discoverer.run(ks.ctx, in) }()
73 + c.wg.Add(1)
74 + go func() { defer c.wg.Done(); c.discoverer.run(c.ctx, in) }()
75
76 - ks.kubeClusterID = ks.getKubeClusterID()
77 - ks.kubeClusterName = ks.getKubeClusterName()
76 + c.kubeClusterID = c.getKubeClusterID()
77 + c.kubeClusterName = c.getKubeClusterName()
78
79 - if chart := ks.Charts().Get(discoveryStatusChart.ID); chart != nil {
79 + if chart := c.Charts().Get(discoveryStatusChart.ID); chart != nil {
80 chart.Labels = []module.Label{
81 - {Key: labelKeyClusterID, Value: ks.kubeClusterID, Source: module.LabelSourceK8s},
82 - {Key: labelKeyClusterName, Value: ks.kubeClusterName, Source: module.LabelSourceK8s},
81 + {Key: labelKeyClusterID, Value: c.kubeClusterID, Source: module.LabelSourceK8s},
82 + {Key: labelKeyClusterName, Value: c.kubeClusterName, Source: module.LabelSourceK8s},
83 }
84 }
85 })
@@ -89,29 +89,29 @@ func (ks *KubeState) collect() (map[string]int64, error) {
89 "discovery_pod_discoverer_state": 1,
90 }
91
92 - if !ks.discoverer.ready() || time.Since(ks.startTime) < ks.initDelay {
92 + if !c.discoverer.ready() || time.Since(c.startTime) < c.initDelay {
93 return mx, nil
94 }
95
96 - ks.state.Lock()
97 - defer ks.state.Unlock()
96 + c.state.Lock()
97 + defer c.state.Unlock()
98
99 - ks.collectKubeState(mx)
99 + c.collectKubeState(mx)
100
101 return mx, nil
102 }
103
104 -func (ks *KubeState) collectKubeState(mx map[string]int64) {
105 - for _, ns := range ks.state.nodes {
104 +func (c *Collector) collectKubeState(mx map[string]int64) {
105 + for _, ns := range c.state.nodes {
106 ns.resetStats()
107 }
108 - ks.collectPodsState(mx)
109 - ks.collectNodesState(mx)
108 + c.collectPodsState(mx)
109 + c.collectNodesState(mx)
110 }
111
112 -func (ks *KubeState) collectPodsState(mx map[string]int64) {
112 +func (c *Collector) collectPodsState(mx map[string]int64) {
113 now := time.Now()
114 - for _, ps := range ks.state.pods {
114 + for _, ps := range c.state.pods {
115 // Skip cronjobs (each of them is a unique container because the name contains hash)
116 // to avoid overwhelming Netdata with high cardinality metrics.
117 // Related issue https://github.com/netdata/netdata/issues/16412
@@ -120,21 +120,21 @@ func (ks *KubeState) collectPodsState(mx map[string]int64) {
120 }
121
122 if ps.deleted {
123 - delete(ks.state.pods, podSource(ps.namespace, ps.name))
124 - ks.removePodCharts(ps)
123 + delete(c.state.pods, podSource(ps.namespace, ps.name))
124 + c.removePodCharts(ps)
125 continue
126 }
127
128 if ps.new {
129 ps.new = false
130 - ks.addPodCharts(ps)
130 + c.addPodCharts(ps)
131 ps.unscheduled = ps.nodeName == ""
132 } else if ps.unscheduled && ps.nodeName != "" {
133 ps.unscheduled = false
134 - ks.updatePodChartsNodeLabel(ps)
134 + c.updatePodChartsNodeLabel(ps)
135 }
136
137 - ns := ks.state.nodes[nodeSource(ps.nodeName)]
137 + ns := c.state.nodes[nodeSource(ps.nodeName)]
138 if ns != nil {
139 ns.stats.pods++
140 ns.stats.reqCPU += ps.reqCPU
@@ -213,7 +213,7 @@ func (ks *KubeState) collectPodsState(mx map[string]int64) {
213 for _, cs := range ps.containers {
214 if cs.new {
215 cs.new = false
216 - ks.addContainerCharts(ps, cs)
216 + c.addContainerCharts(ps, cs)
217 }
218 mx[px+"containers_state_running"] += metrix.Bool(cs.stateRunning)
219 mx[px+"containers_state_waiting"] += metrix.Bool(cs.stateWaiting)
@@ -249,17 +249,17 @@ func (ks *KubeState) collectPodsState(mx map[string]int64) {
249 }
250 }
251
252 -func (ks *KubeState) collectNodesState(mx map[string]int64) {
252 +func (c *Collector) collectNodesState(mx map[string]int64) {
253 now := time.Now()
254 - for _, ns := range ks.state.nodes {
254 + for _, ns := range c.state.nodes {
255 if ns.deleted {
256 - delete(ks.state.nodes, nodeSource(ns.name))
257 - ks.removeNodeCharts(ns)
256 + delete(c.state.nodes, nodeSource(ns.name))
257 + c.removeNodeCharts(ns)
258 continue
259 }
260 if ns.new {
261 ns.new = false
262 - ks.addNodeCharts(ns)
262 + c.addNodeCharts(ns)
263 }
264
265 px := fmt.Sprintf("node_%s_", ns.id())
src/go/plugin/go.d/collector/k8s_state/collector.go new
+137
@@ -0,0 +1,137 @@
1 +// SPDX-License-Identifier: GPL-3.0-or-later
2 +
3 +package k8s_state
4 +
5 +import (
6 + "context"
7 + _ "embed"
8 + "errors"
9 + "fmt"
10 + "sync"
11 + "time"
12 +
13 + "github.com/netdata/netdata/go/plugins/plugin/go.d/agent/module"
14 +
15 + "k8s.io/client-go/kubernetes"
16 +)
17 +
18 +//go:embed "config_schema.json"
19 +var configSchema string
20 +
21 +func init() {
22 + module.Register("k8s_state", module.Creator{
23 + JobConfigSchema: configSchema,
24 + Defaults: module.Defaults{
25 + Disabled: true,
26 + },
27 + Create: func() module.Module { return New() },
28 + Config: func() any { return &Config{} },
29 + })
30 +}
31 +
32 +func New() *Collector {
33 + return &Collector{
34 + initDelay: time.Second * 3,
35 + newKubeClient: newKubeClient,
36 + charts: baseCharts.Copy(),
37 + once: &sync.Once{},
38 + wg: &sync.WaitGroup{},
39 + state: newKubeState(),
40 + }
41 +}
42 +
43 +type Config struct {
44 + UpdateEvery int `yaml:"update_every,omitempty" json:"update_every"`
45 +}
46 +
47 +type Collector struct {
48 + module.Base
49 + Config `yaml:",inline" json:""`
50 +
51 + charts *module.Charts
52 +
53 + client kubernetes.Interface
54 + newKubeClient func() (kubernetes.Interface, error)
55 +
56 + startTime time.Time
57 + initDelay time.Duration
58 + once *sync.Once
59 + wg *sync.WaitGroup
60 + discoverer discoverer
61 + ctx context.Context
62 + ctxCancel context.CancelFunc
63 + kubeClusterID string
64 + kubeClusterName string
65 +
66 + state *kubeState
67 +}
68 +
69 +func (c *Collector) Configuration() any {
70 + return c.Config
71 +}
72 +
73 +func (c *Collector) Init() error {
74 + client, err := c.initClient()
75 + if err != nil {
76 + return fmt.Errorf("init k8s client: %v", err)
77 + }
78 + c.client = client
79 +
80 + c.ctx, c.ctxCancel = context.WithCancel(context.Background())
81 +
82 + c.discoverer = c.initDiscoverer(c.client)
83 +
84 + return nil
85 +}
86 +
87 +func (c *Collector) Check() error {
88 + if c.client == nil || c.discoverer == nil {
89 + return errors.New("not initialized")
90 + }
91 +
92 + ver, err := c.client.Discovery().ServerVersion()
93 + if err != nil {
94 + return fmt.Errorf("failed to connect to K8s API server: %v", err)
95 + }
96 +
97 + c.Infof("successfully connected to the Kubernetes API server '%s'", ver)
98 +
99 + return nil
100 +}
101 +
102 +func (c *Collector) Charts() *module.Charts {
103 + return c.charts
104 +}
105 +
106 +func (c *Collector) Collect() map[string]int64 {
107 + ms, err := c.collect()
108 + if err != nil {
109 + c.Error(err)
110 + }
111 +
112 + if len(ms) == 0 {
113 + return nil
114 + }
115 + return ms
116 +}
117 +
118 +func (c *Collector) Cleanup() {
119 + if c.ctxCancel == nil {
120 + return
121 + }
122 +
123 + c.ctxCancel()
124 +
125 + done := make(chan struct{})
126 + go func() { defer close(done); c.wg.Wait() }()
127 +
128 + t := time.NewTimer(time.Second * 5)
129 + defer t.Stop()
130 +
131 + select {
132 + case <-done:
133 + return
134 + case <-t.C:
135 + return
136 + }
137 +}
src/go/plugin/go.d/collector/k8s_state/collector_test.go renamed
+93 -93
@@ -38,149 +38,149 @@ func Test_testDataIsValid(t *testing.T) {
38 }
39 }
40
41 -func TestKubeState_ConfigurationSerialize(t *testing.T) {
42 - module.TestConfigurationSerialize(t, &KubeState{}, dataConfigJSON, dataConfigYAML)
41 +func TestCollector_ConfigurationSerialize(t *testing.T) {
42 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
43 }
44
45 -func TestKubeState_Init(t *testing.T) {
45 +func TestCollector_Init(t *testing.T) {
46 tests := map[string]struct {
47 wantFail bool
48 - prepare func() *KubeState
48 + prepare func() *Collector
49 }{
50 "success when no error on initializing K8s client": {
51 wantFail: false,
52 - prepare: func() *KubeState {
53 - ks := New()
54 - ks.newKubeClient = func() (kubernetes.Interface, error) { return fake.NewClientset(), nil }
55 - return ks
52 + prepare: func() *Collector {
53 + collr := New()
54 + collr.newKubeClient = func() (kubernetes.Interface, error) { return fake.NewClientset(), nil }
55 + return collr
56 },
57 },
58 "fail when get an error on initializing K8s client": {
59 wantFail: true,
60 - prepare: func() *KubeState {
61 - ks := New()
62 - ks.newKubeClient = func() (kubernetes.Interface, error) { return nil, errors.New("newKubeClient() error") }
63 - return ks
60 + prepare: func() *Collector {
61 + collr := New()
62 + collr.newKubeClient = func() (kubernetes.Interface, error) { return nil, errors.New("newKubeClient() error") }
63 + return collr
64 },
65 },
66 }
67
68 for name, test := range tests {
69 t.Run(name, func(t *testing.T) {
70 - ks := test.prepare()
70 + collr := test.prepare()
71
72 if test.wantFail {
73 - assert.Error(t, ks.Init())
73 + assert.Error(t, collr.Init())
74 } else {
75 - assert.NoError(t, ks.Init())
75 + assert.NoError(t, collr.Init())
76 }
77 })
78 }
79 }
80
81 -func TestKubeState_Check(t *testing.T) {
81 +func TestCollector_Check(t *testing.T) {
82 tests := map[string]struct {
83 wantFail bool
84 - prepare func() *KubeState
84 + prepare func() *Collector
85 }{
86 "success when connected to the K8s API": {
87 wantFail: false,
88 - prepare: func() *KubeState {
89 - ks := New()
90 - ks.newKubeClient = func() (kubernetes.Interface, error) { return fake.NewClientset(), nil }
91 - return ks
88 + prepare: func() *Collector {
89 + collr := New()
90 + collr.newKubeClient = func() (kubernetes.Interface, error) { return fake.NewClientset(), nil }
91 + return collr
92 },
93 },
94 "fail when not connected to the K8s API": {
95 wantFail: true,
96 - prepare: func() *KubeState {
97 - ks := New()
96 + prepare: func() *Collector {
97 + collr := New()
98 client := &brokenInfoKubeClient{fake.NewClientset()}
99 - ks.newKubeClient = func() (kubernetes.Interface, error) { return client, nil }
100 - return ks
99 + collr.newKubeClient = func() (kubernetes.Interface, error) { return client, nil }
100 + return collr
101 },
102 },
103 }
104
105 for name, test := range tests {
106 t.Run(name, func(t *testing.T) {
107 - ks := test.prepare()
108 - require.NoError(t, ks.Init())
107 + collr := test.prepare()
108 + require.NoError(t, collr.Init())
109
110 if test.wantFail {
111 - assert.Error(t, ks.Check())
111 + assert.Error(t, collr.Check())
112 } else {
113 - assert.NoError(t, ks.Check())
113 + assert.NoError(t, collr.Check())
114 }
115 })
116 }
117 }
118
119 -func TestKubeState_Charts(t *testing.T) {
120 - ks := New()
119 +func TestCollector_Charts(t *testing.T) {
120 + collr := New()
121
122 - assert.NotEmpty(t, *ks.Charts())
122 + assert.NotEmpty(t, *collr.Charts())
123 }
124
125 -func TestKubeState_Cleanup(t *testing.T) {
125 +func TestCollector_Cleanup(t *testing.T) {
126 tests := map[string]struct {
127 - prepare func() *KubeState
127 + prepare func() *Collector
128 doInit bool
129 doCollect bool
130 }{
131 "before init": {
132 doInit: false,
133 doCollect: false,
134 - prepare: func() *KubeState {
135 - ks := New()
136 - ks.newKubeClient = func() (kubernetes.Interface, error) { return fake.NewClientset(), nil }
137 - return ks
134 + prepare: func() *Collector {
135 + collr := New()
136 + collr.newKubeClient = func() (kubernetes.Interface, error) { return fake.NewClientset(), nil }
137 + return collr
138 },
139 },
140 "after init": {
141 doInit: true,
142 doCollect: false,
143 - prepare: func() *KubeState {
144 - ks := New()
145 - ks.newKubeClient = func() (kubernetes.Interface, error) { return fake.NewClientset(), nil }
146 - return ks
143 + prepare: func() *Collector {
144 + collr := New()
145 + collr.newKubeClient = func() (kubernetes.Interface, error) { return fake.NewClientset(), nil }
146 + return collr
147 },
148 },
149 "after collect": {
150 doInit: true,
151 doCollect: true,
152 - prepare: func() *KubeState {
153 - ks := New()
154 - ks.newKubeClient = func() (kubernetes.Interface, error) { return fake.NewClientset(), nil }
155 - return ks
152 + prepare: func() *Collector {
153 + collr := New()
154 + collr.newKubeClient = func() (kubernetes.Interface, error) { return fake.NewClientset(), nil }
155 + return collr
156 },
157 },
158 }
159
160 for name, test := range tests {
161 t.Run(name, func(t *testing.T) {
162 - ks := test.prepare()
162 + collr := test.prepare()
163
164 if test.doInit {
165 - _ = ks.Init()
165 + _ = collr.Init()
166 }
167 if test.doCollect {
168 - _ = ks.Collect()
169 - time.Sleep(ks.initDelay)
168 + _ = collr.Collect()
169 + time.Sleep(collr.initDelay)
170 }
171
172 - assert.NotPanics(t, ks.Cleanup)
172 + assert.NotPanics(t, collr.Cleanup)
173 time.Sleep(time.Second)
174 if test.doCollect {
175 - assert.True(t, ks.discoverer.stopped())
175 + assert.True(t, collr.discoverer.stopped())
176 }
177 })
178 }
179 }
180
181 -func TestKubeState_Collect(t *testing.T) {
181 +func TestCollector_Collect(t *testing.T) {
182 type (
183 - testCaseStep func(t *testing.T, ks *KubeState)
183 + testCaseStep func(t *testing.T, ks *Collector)
184 testCase struct {
185 client kubernetes.Interface
186 steps []testCaseStep
@@ -196,8 +196,8 @@ func TestKubeState_Collect(t *testing.T) {
196 newNode("node01"),
197 )
198
199 - step1 := func(t *testing.T, ks *KubeState) {
200 - mx := ks.Collect()
199 + step1 := func(t *testing.T, collr *Collector) {
200 + mx := collr.Collect()
201 expected := map[string]int64{
202 "discovery_node_discoverer_state": 1,
203 "discovery_pod_discoverer_state": 1,
@@ -246,9 +246,9 @@ func TestKubeState_Collect(t *testing.T) {
246 assert.Equal(t, expected, mx)
247 assert.Equal(t,
248 len(nodeChartsTmpl)+len(baseCharts),
249 - len(*ks.Charts()),
249 + len(*collr.Charts()),
250 )
251 - module.TestMetricsHasAllChartsDims(t, ks.Charts(), mx)
251 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
252 }
253
254 return testCase{
@@ -264,8 +264,8 @@ func TestKubeState_Collect(t *testing.T) {
264 pod,
265 )
266
267 - step1 := func(t *testing.T, ks *KubeState) {
268 - mx := ks.Collect()
267 + step1 := func(t *testing.T, collr *Collector) {
268 + mx := collr.Collect()
269 expected := map[string]int64{
270 "discovery_node_discoverer_state": 1,
271 "discovery_pod_discoverer_state": 1,
@@ -345,9 +345,9 @@ func TestKubeState_Collect(t *testing.T) {
345 assert.Equal(t, expected, mx)
346 assert.Equal(t,
347 len(podChartsTmpl)+len(containerChartsTmpl)*len(pod.Spec.Containers)+len(baseCharts),
348 - len(*ks.Charts()),
348 + len(*collr.Charts()),
349 )
350 - module.TestMetricsHasAllChartsDims(t, ks.Charts(), mx)
350 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
351 }
352
353 return testCase{
@@ -365,8 +365,8 @@ func TestKubeState_Collect(t *testing.T) {
365 pod,
366 )
367
368 - step1 := func(t *testing.T, ks *KubeState) {
369 - mx := ks.Collect()
368 + step1 := func(t *testing.T, collr *Collector) {
369 + mx := collr.Collect()
370 expected := map[string]int64{
371 "discovery_node_discoverer_state": 1,
372 "discovery_pod_discoverer_state": 1,
@@ -484,9 +484,9 @@ func TestKubeState_Collect(t *testing.T) {
484 assert.Equal(t, expected, mx)
485 assert.Equal(t,
486 len(nodeChartsTmpl)+len(podChartsTmpl)+len(containerChartsTmpl)*len(pod.Spec.Containers)+len(baseCharts),
487 - len(*ks.Charts()),
487 + len(*collr.Charts()),
488 )
489 - module.TestMetricsHasAllChartsDims(t, ks.Charts(), mx)
489 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
490 }
491
492 return testCase{
@@ -504,13 +504,13 @@ func TestKubeState_Collect(t *testing.T) {
504 node,
505 pod,
506 )
507 - step1 := func(t *testing.T, ks *KubeState) {
508 - _ = ks.Collect()
507 + step1 := func(t *testing.T, collr *Collector) {
508 + _ = collr.Collect()
509 _ = client.CoreV1().Pods(pod.Namespace).Delete(ctx, pod.Name, metav1.DeleteOptions{})
510 }
511
512 - step2 := func(t *testing.T, ks *KubeState) {
513 - mx := ks.Collect()
512 + step2 := func(t *testing.T, collr *Collector) {
513 + mx := collr.Collect()
514 expected := map[string]int64{
515 "discovery_node_discoverer_state": 1,
516 "discovery_pod_discoverer_state": 1,
@@ -558,13 +558,13 @@ func TestKubeState_Collect(t *testing.T) {
558 assert.Equal(t, expected, mx)
559 assert.Equal(t,
560 len(nodeChartsTmpl)+len(podChartsTmpl)+len(containerChartsTmpl)*len(pod.Spec.Containers)+len(baseCharts),
561 - len(*ks.Charts()),
561 + len(*collr.Charts()),
562 )
563 assert.Equal(t,
564 len(podChartsTmpl)+len(containerChartsTmpl)*len(pod.Spec.Containers),
565 - calcObsoleteCharts(*ks.Charts()),
565 + calcObsoleteCharts(*collr.Charts()),
566 )
567 - module.TestMetricsHasAllChartsDims(t, ks.Charts(), mx)
567 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
568 }
569
570 return testCase{
@@ -585,21 +585,21 @@ func TestKubeState_Collect(t *testing.T) {
585 )
586 podUpdated := newPod(node.Name, "pod01") // with set Spec.NodeName
587
588 - step1 := func(t *testing.T, ks *KubeState) {
589 - _ = ks.Collect()
590 - for _, c := range *ks.Charts() {
588 + step1 := func(t *testing.T, collr *Collector) {
589 + _ = collr.Collect()
590 + for _, c := range *collr.Charts() {
591 if strings.HasPrefix(c.ID, "pod_") {
592 ok := isLabelValueSet(c, labelKeyNodeName)
593 assert.Falsef(t, ok, "chart '%s' has no empty %s label", c.ID, labelKeyNodeName)
594 }
595 }
596 }
597 - step2 := func(t *testing.T, ks *KubeState) {
597 + step2 := func(t *testing.T, collr *Collector) {
598 _, _ = client.CoreV1().Pods(podOrig.Namespace).Update(ctx, podUpdated, metav1.UpdateOptions{})
599 time.Sleep(time.Millisecond * 50)
600 - _ = ks.Collect()
600 + _ = collr.Collect()
601
602 - for _, c := range *ks.Charts() {
602 + for _, c := range *collr.Charts() {
603 if strings.HasPrefix(c.ID, "pod_") {
604 ok := isLabelValueSet(c, labelKeyNodeName)
605 assert.Truef(t, ok, "chart '%s' has empty %s label", c.ID, labelKeyNodeName)
@@ -623,13 +623,13 @@ func TestKubeState_Collect(t *testing.T) {
623 node,
624 pod1,
625 )
626 - step1 := func(t *testing.T, ks *KubeState) {
627 - _ = ks.Collect()
626 + step1 := func(t *testing.T, collr *Collector) {
627 + _ = collr.Collect()
628 _, _ = client.CoreV1().Pods(pod1.Namespace).Create(ctx, pod2, metav1.CreateOptions{})
629 }
630
631 - step2 := func(t *testing.T, ks *KubeState) {
632 - mx := ks.Collect()
631 + step2 := func(t *testing.T, collr *Collector) {
632 + mx := collr.Collect()
633 expected := map[string]int64{
634 "discovery_node_discoverer_state": 1,
635 "discovery_pod_discoverer_state": 1,
@@ -820,9 +820,9 @@ func TestKubeState_Collect(t *testing.T) {
820 len(containerChartsTmpl)*len(pod1.Spec.Containers)+
821 len(containerChartsTmpl)*len(pod2.Spec.Containers)+
822 len(baseCharts),
823 - len(*ks.Charts()),
823 + len(*collr.Charts()),
824 )
825 - module.TestMetricsHasAllChartsDims(t, ks.Charts(), mx)
825 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
826 }
827
828 return testCase{
@@ -837,21 +837,21 @@ func TestKubeState_Collect(t *testing.T) {
837 t.Run(name, func(t *testing.T) {
838 test := creator.create(t)
839
840 - ks := New()
841 - ks.newKubeClient = func() (kubernetes.Interface, error) { return test.client, nil }
840 + collr := New()
841 + collr.newKubeClient = func() (kubernetes.Interface, error) { return test.client, nil }
842
843 - require.NoError(t, ks.Init())
844 - require.NoError(t, ks.Check())
845 - defer ks.Cleanup()
843 + require.NoError(t, collr.Init())
844 + require.NoError(t, collr.Check())
845 + defer collr.Cleanup()
846
847 for i, executeStep := range test.steps {
848 if i == 0 {
849 - _ = ks.Collect()
850 - time.Sleep(ks.initDelay)
849 + _ = collr.Collect()
850 + time.Sleep(collr.initDelay)
851 } else {
852 time.Sleep(time.Second)
853 }
854 - executeStep(t, ks)
854 + executeStep(t, collr)
855 }
856 })
857 }
src/go/plugin/go.d/collector/k8s_state/discover_kubernetes.go
+6
@@ -19,6 +19,12 @@ import (
19 "k8s.io/client-go/util/workqueue"
20 )
21
22 +type discoverer interface {
23 + run(ctx context.Context, in chan<- resource)
24 + ready() bool
25 + stopped() bool
26 +}
27 +
28 func newKubeDiscovery(client kubernetes.Interface, l *logger.Logger) *kubeDiscovery {
29 return &kubeDiscovery{
30 client: client,
src/go/plugin/go.d/collector/k8s_state/init.go
+4 -4
@@ -6,10 +6,10 @@ import (
6 "k8s.io/client-go/kubernetes"
7 )
8
9 -func (ks *KubeState) initClient() (kubernetes.Interface, error) {
10 - return ks.newKubeClient()
9 +func (c *Collector) initClient() (kubernetes.Interface, error) {
10 + return c.newKubeClient()
11 }
12
13 -func (ks *KubeState) initDiscoverer(client kubernetes.Interface) discoverer {
14 - return newKubeDiscovery(client, ks.Logger)
13 +func (c *Collector) initDiscoverer(client kubernetes.Interface) discoverer {
14 + return newKubeDiscovery(client, c.Logger)
15 }
src/go/plugin/go.d/collector/k8s_state/kube_state.go deleted
-143
@@ -1,143 +0,0 @@
1 -// SPDX-License-Identifier: GPL-3.0-or-later
2 -
3 -package k8s_state
4 -
5 -import (
6 - "context"
7 - _ "embed"
8 - "errors"
9 - "fmt"
10 - "sync"
11 - "time"
12 -
13 - "github.com/netdata/netdata/go/plugins/plugin/go.d/agent/module"
14 -
15 - "k8s.io/client-go/kubernetes"
16 -)
17 -
18 -//go:embed "config_schema.json"
19 -var configSchema string
20 -
21 -func init() {
22 - module.Register("k8s_state", module.Creator{
23 - JobConfigSchema: configSchema,
24 - Defaults: module.Defaults{
25 - Disabled: true,
26 - },
27 - Create: func() module.Module { return New() },
28 - Config: func() any { return &Config{} },
29 - })
30 -}
31 -
32 -func New() *KubeState {
33 - return &KubeState{
34 - initDelay: time.Second * 3,
35 - newKubeClient: newKubeClient,
36 - charts: baseCharts.Copy(),
37 - once: &sync.Once{},
38 - wg: &sync.WaitGroup{},
39 - state: newKubeState(),
40 - }
41 -}
42 -
43 -type Config struct {
44 - UpdateEvery int `yaml:"update_every,omitempty" json:"update_every"`
45 -}
46 -
47 -type (
48 - KubeState struct {
49 - module.Base
50 - Config `yaml:",inline" json:""`
51 -
52 - charts *module.Charts
53 -
54 - client kubernetes.Interface
55 - newKubeClient func() (kubernetes.Interface, error)
56 -
57 - startTime time.Time
58 - initDelay time.Duration
59 - once *sync.Once
60 - wg *sync.WaitGroup
61 - discoverer discoverer
62 - ctx context.Context
63 - ctxCancel context.CancelFunc
64 - kubeClusterID string
65 - kubeClusterName string
66 -
67 - state *kubeState
68 - }
69 - discoverer interface {
70 - run(ctx context.Context, in chan<- resource)
71 - ready() bool
72 - stopped() bool
73 - }
74 -)
75 -
76 -func (ks *KubeState) Configuration() any {
77 - return ks.Config
78 -}
79 -
80 -func (ks *KubeState) Init() error {
81 - client, err := ks.initClient()
82 - if err != nil {
83 - return fmt.Errorf("init k8s client: %v", err)
84 - }
85 - ks.client = client
86 -
87 - ks.ctx, ks.ctxCancel = context.WithCancel(context.Background())
88 -
89 - ks.discoverer = ks.initDiscoverer(ks.client)
90 -
91 - return nil
92 -}
93 -
94 -func (ks *KubeState) Check() error {
95 - if ks.client == nil || ks.discoverer == nil {
96 - return errors.New("not initialized")
97 - }
98 -
99 - ver, err := ks.client.Discovery().ServerVersion()
100 - if err != nil {
101 - return fmt.Errorf("failed to connect to K8s API server: %v", err)
102 - }
103 -
104 - ks.Infof("successfully connected to the Kubernetes API server '%s'", ver)
105 -
106 - return nil
107 -}
108 -
109 -func (ks *KubeState) Charts() *module.Charts {
110 - return ks.charts
111 -}
112 -
113 -func (ks *KubeState) Collect() map[string]int64 {
114 - ms, err := ks.collect()
115 - if err != nil {
116 - ks.Error(err)
117 - }
118 -
119 - if len(ms) == 0 {
120 - return nil
121 - }
122 - return ms
123 -}
124 -
125 -func (ks *KubeState) Cleanup() {
126 - if ks.ctxCancel == nil {
127 - return
128 - }
129 - ks.ctxCancel()
130 -
131 - c := make(chan struct{})
132 - go func() { defer close(c); ks.wg.Wait() }()
133 -
134 - t := time.NewTimer(time.Second * 5)
135 - defer t.Stop()
136 -
137 - select {
138 - case <-c:
139 - return
140 - case <-t.C:
141 - return
142 - }
143 -}
src/go/plugin/go.d/collector/k8s_state/update_node_state.go
+5 -5
@@ -2,9 +2,9 @@
2
3 package k8s_state
4
5 -func (ks *KubeState) updateNodeState(r resource) {
5 +func (c *Collector) updateNodeState(r resource) {
6 if r.value() == nil {
7 - if ns, ok := ks.state.nodes[r.source()]; ok {
7 + if ns, ok := c.state.nodes[r.source()]; ok {
8 ns.deleted = true
9 }
10 return
@@ -12,7 +12,7 @@ func (ks *KubeState) updateNodeState(r resource) {
12
13 node, err := toNode(r)
14 if err != nil {
15 - ks.Warning(err)
15 + c.Warning(err)
16 return
17 }
18
@@ -20,10 +20,10 @@ func (ks *KubeState) updateNodeState(r resource) {
20 return
21 }
22
23 - ns, ok := ks.state.nodes[r.source()]
23 + ns, ok := c.state.nodes[r.source()]
24 if !ok {
25 ns = newNodeState()
26 - ks.state.nodes[r.source()] = ns
26 + c.state.nodes[r.source()] = ns
27 }
28
29 if !ok {
src/go/plugin/go.d/collector/k8s_state/update_pod_state.go
+5 -5
@@ -8,9 +8,9 @@ import (
8 corev1 "k8s.io/api/core/v1"
9 )
10
11 -func (ks *KubeState) updatePodState(r resource) {
11 +func (c *Collector) updatePodState(r resource) {
12 if r.value() == nil {
13 - if ps, ok := ks.state.pods[r.source()]; ok {
13 + if ps, ok := c.state.pods[r.source()]; ok {
14 ps.deleted = true
15 }
16 return
@@ -18,14 +18,14 @@ func (ks *KubeState) updatePodState(r resource) {
18
19 pod, err := toPod(r)
20 if err != nil {
21 - ks.Warning(err)
21 + c.Warning(err)
22 return
23 }
24
25 - ps, ok := ks.state.pods[r.source()]
25 + ps, ok := c.state.pods[r.source()]
26 if !ok {
27 ps = newPodState()
28 - ks.state.pods[r.source()] = ps
28 + c.state.pods[r.source()] = ps
29 }
30
31 if !ok {
src/go/plugin/go.d/collector/k8s_state/update_state.go
+6 -6
@@ -2,20 +2,20 @@
2
3 package k8s_state
4
5 -func (ks *KubeState) runUpdateState(in <-chan resource) {
5 +func (c *Collector) runUpdateState(in <-chan resource) {
6 for {
7 select {
8 - case <-ks.ctx.Done():
8 + case <-c.ctx.Done():
9 return
10 case r := <-in:
11 - ks.state.Lock()
11 + c.state.Lock()
12 switch r.kind() {
13 case kubeResourceNode:
14 - ks.updateNodeState(r)
14 + c.updateNodeState(r)
15 case kubeResourcePod:
16 - ks.updatePodState(r)
16 + c.updatePodState(r)
17 }
18 - ks.state.Unlock()
18 + c.state.Unlock()
19 }
20 }
21 }
src/go/plugin/go.d/collector/lighttpd/collect.go
+3 -3
@@ -10,8 +10,8 @@ import (
10 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/web"
11 )
12
13 -func (l *Lighttpd) collect() (map[string]int64, error) {
14 - req, err := web.NewHTTPRequest(l.RequestConfig)
13 +func (c *Collector) collect() (map[string]int64, error) {
14 + req, err := web.NewHTTPRequest(c.RequestConfig)
15 if err != nil {
16 return nil, fmt.Errorf("failed to create HTTP request: %v", err)
17 }
@@ -19,7 +19,7 @@ func (l *Lighttpd) collect() (map[string]int64, error) {
19 var status *serverStatus
20 var perr error
21
22 - if err := web.DoHTTP(l.httpClient).Request(req, func(body io.Reader) error {
22 + if err := web.DoHTTP(c.httpClient).Request(req, func(body io.Reader) error {
23 if status, perr = parseResponse(body); perr != nil {
24 return perr
25 }
src/go/plugin/go.d/collector/lighttpd/collector.go renamed
+23 -23
@@ -26,8 +26,8 @@ func init() {
26 })
27 }
28
29 -func New() *Lighttpd {
30 - return &Lighttpd{Config: Config{
29 +func New() *Collector {
30 + return &Collector{Config: Config{
31 HTTPConfig: web.HTTPConfig{
32 RequestConfig: web.RequestConfig{
33 URL: "http://127.0.0.1/server-status?auto",
@@ -46,7 +46,7 @@ type Config struct {
46 web.HTTPConfig `yaml:",inline" json:""`
47 }
48
49 -type Lighttpd struct {
49 +type Collector struct {
50 module.Base
51 Config `yaml:",inline" json:""`
52
@@ -55,32 +55,32 @@ type Lighttpd struct {
55 httpClient *http.Client
56 }
57
58 -func (l *Lighttpd) Configuration() any {
59 - return l.Config
58 +func (c *Collector) Configuration() any {
59 + return c.Config
60 }
61
62 -func (l *Lighttpd) Init() error {
63 - if l.URL == "" {
62 +func (c *Collector) Init() error {
63 + if c.URL == "" {
64 return errors.New("URL is required but not set")
65 }
66 - if !strings.HasSuffix(l.URL, "?auto") {
67 - return fmt.Errorf("bad URL '%s', should ends in '?auto'", l.URL)
66 + if !strings.HasSuffix(c.URL, "?auto") {
67 + return fmt.Errorf("bad URL '%s', should ends in '?auto'", c.URL)
68 }
69
70 - httpClient, err := web.NewHTTPClient(l.ClientConfig)
70 + httpClient, err := web.NewHTTPClient(c.ClientConfig)
71 if err != nil {
72 return fmt.Errorf("failed to create http client: %v", err)
73 }
74 - l.httpClient = httpClient
74 + c.httpClient = httpClient
75
76 - l.Debugf("using URL %s", l.URL)
77 - l.Debugf("using timeout: %s", l.Timeout.Duration())
76 + c.Debugf("using URL %s", c.URL)
77 + c.Debugf("using timeout: %s", c.Timeout.Duration())
78
79 return nil
80 }
81
82 -func (l *Lighttpd) Check() error {
83 - mx, err := l.collect()
82 +func (c *Collector) Check() error {
83 + mx, err := c.collect()
84 if err != nil {
85 return err
86 }
@@ -92,22 +92,22 @@ func (l *Lighttpd) Check() error {
92 return nil
93 }
94
95 -func (l *Lighttpd) Charts() *Charts {
96 - return l.charts
95 +func (c *Collector) Charts() *Charts {
96 + return c.charts
97 }
98
99 -func (l *Lighttpd) Collect() map[string]int64 {
100 - mx, err := l.collect()
99 +func (c *Collector) Collect() map[string]int64 {
100 + mx, err := c.collect()
101 if err != nil {
102 - l.Error(err)
102 + c.Error(err)
103 return nil
104 }
105
106 return mx
107 }
108
109 -func (l *Lighttpd) Cleanup() {
110 - if l.httpClient != nil {
111 - l.httpClient.CloseIdleConnections()
109 +func (c *Collector) Cleanup() {
110 + if c.httpClient != nil {
111 + c.httpClient.CloseIdleConnections()
112 }
113 }
src/go/plugin/go.d/collector/lighttpd/collector_test.go renamed
+42 -42
@@ -31,26 +31,26 @@ func Test_testDataIsValid(t *testing.T) {
31 }
32 }
33
34 -func TestLighttpd_ConfigurationSerialize(t *testing.T) {
35 - module.TestConfigurationSerialize(t, &Lighttpd{}, dataConfigJSON, dataConfigYAML)
34 +func TestCollector_ConfigurationSerialize(t *testing.T) {
35 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
36 }
37
38 -func TestLighttpd_Cleanup(t *testing.T) { New().Cleanup() }
38 +func TestCollector_Cleanup(t *testing.T) { New().Cleanup() }
39
40 -func TestLighttpd_Init(t *testing.T) {
41 - job := New()
40 +func TestCollector_Init(t *testing.T) {
41 + collr := New()
42
43 - require.NoError(t, job.Init())
43 + require.NoError(t, collr.Init())
44 }
45
46 -func TestLighttpd_InitNG(t *testing.T) {
47 - job := New()
46 +func TestCollector_InitNG(t *testing.T) {
47 + collr := New()
48
49 - job.URL = ""
50 - assert.Error(t, job.Init())
49 + collr.URL = ""
50 + assert.Error(t, collr.Init())
51 }
52
53 -func TestLighttpd_Check(t *testing.T) {
53 +func TestCollector_Check(t *testing.T) {
54 ts := httptest.NewServer(
55 http.HandlerFunc(
56 func(w http.ResponseWriter, r *http.Request) {
@@ -58,23 +58,23 @@ func TestLighttpd_Check(t *testing.T) {
58 }))
59 defer ts.Close()
60
61 - job := New()
62 - job.URL = ts.URL + "/server-status?auto"
63 - require.NoError(t, job.Init())
64 - assert.NoError(t, job.Check())
61 + collr := New()
62 + collr.URL = ts.URL + "/server-status?auto"
63 + require.NoError(t, collr.Init())
64 + assert.NoError(t, collr.Check())
65 }
66
67 -func TestLighttpd_CheckNG(t *testing.T) {
68 - job := New()
67 +func TestCollector_CheckNG(t *testing.T) {
68 + collr := New()
69
70 - job.URL = "http://127.0.0.1:38001/server-status?auto"
71 - require.NoError(t, job.Init())
72 - assert.Error(t, job.Check())
70 + collr.URL = "http://127.0.0.1:38001/server-status?auto"
71 + require.NoError(t, collr.Init())
72 + assert.Error(t, collr.Check())
73 }
74
75 -func TestLighttpd_Charts(t *testing.T) { assert.NotNil(t, New().Charts()) }
75 +func TestCollector_Charts(t *testing.T) { assert.NotNil(t, New().Charts()) }
76
77 -func TestLighttpd_Collect(t *testing.T) {
77 +func TestCollector_Collect(t *testing.T) {
78 ts := httptest.NewServer(
79 http.HandlerFunc(
80 func(w http.ResponseWriter, r *http.Request) {
@@ -82,10 +82,10 @@ func TestLighttpd_Collect(t *testing.T) {
82 }))
83 defer ts.Close()
84
85 - job := New()
86 - job.URL = ts.URL + "/server-status?auto"
87 - require.NoError(t, job.Init())
88 - require.NoError(t, job.Check())
85 + collr := New()
86 + collr.URL = ts.URL + "/server-status?auto"
87 + require.NoError(t, collr.Init())
88 + require.NoError(t, collr.Check())
89
90 expected := map[string]int64{
91 "scoreboard_waiting": 125,
@@ -108,10 +108,10 @@ func TestLighttpd_Collect(t *testing.T) {
108 "total_accesses": 12,
109 }
110
111 - assert.Equal(t, expected, job.Collect())
111 + assert.Equal(t, expected, collr.Collect())
112 }
113
114 -func TestLighttpd_InvalidData(t *testing.T) {
114 +func TestCollector_InvalidData(t *testing.T) {
115 ts := httptest.NewServer(
116 http.HandlerFunc(
117 func(w http.ResponseWriter, r *http.Request) {
@@ -119,13 +119,13 @@ func TestLighttpd_InvalidData(t *testing.T) {
119 }))
120 defer ts.Close()
121
122 - job := New()
123 - job.URL = ts.URL + "/server-status?auto"
124 - require.NoError(t, job.Init())
125 - assert.Error(t, job.Check())
122 + collr := New()
123 + collr.URL = ts.URL + "/server-status?auto"
124 + require.NoError(t, collr.Init())
125 + assert.Error(t, collr.Check())
126 }
127
128 -func TestLighttpd_ApacheData(t *testing.T) {
128 +func TestCollector_ApacheData(t *testing.T) {
129 ts := httptest.NewServer(
130 http.HandlerFunc(
131 func(w http.ResponseWriter, r *http.Request) {
@@ -133,13 +133,13 @@ func TestLighttpd_ApacheData(t *testing.T) {
133 }))
134 defer ts.Close()
135
136 - job := New()
137 - job.URL = ts.URL + "/server-status?auto"
138 - require.NoError(t, job.Init())
139 - require.Error(t, job.Check())
136 + collr := New()
137 + collr.URL = ts.URL + "/server-status?auto"
138 + require.NoError(t, collr.Init())
139 + require.Error(t, collr.Check())
140 }
141
142 -func TestLighttpd_404(t *testing.T) {
142 +func TestCollector_404(t *testing.T) {
143 ts := httptest.NewServer(
144 http.HandlerFunc(
145 func(w http.ResponseWriter, r *http.Request) {
@@ -147,8 +147,8 @@ func TestLighttpd_404(t *testing.T) {
147 }))
148 defer ts.Close()
149
150 - job := New()
151 - job.URL = ts.URL + "/server-status?auto"
152 - require.NoError(t, job.Init())
153 - assert.Error(t, job.Check())
150 + collr := New()
151 + collr.URL = ts.URL + "/server-status?auto"
152 + require.NoError(t, collr.Init())
153 + assert.Error(t, collr.Check())
154 }
src/go/plugin/go.d/collector/litespeed/collect.go
+10 -10
@@ -16,20 +16,20 @@ import (
16
17 const precision = 100
18
19 -func (l *Litespeed) collect() (map[string]int64, error) {
20 - if l.checkDir {
21 - _, err := os.Stat(l.ReportsDir)
19 +func (c *Collector) collect() (map[string]int64, error) {
20 + if c.checkDir {
21 + _, err := os.Stat(c.ReportsDir)
22 if err != nil {
23 return nil, err
24 }
25 - l.checkDir = false
25 + c.checkDir = false
26 }
27 - reports, err := filepath.Glob(filepath.Join(l.ReportsDir, ".rtreport*"))
27 + reports, err := filepath.Glob(filepath.Join(c.ReportsDir, ".rtreport*"))
28 if err != nil {
29 return nil, err
30 }
31
32 - l.Debugf("found %d reports: %v", len(reports), reports)
32 + c.Debugf("found %d reports: %v", len(reports), reports)
33
34 if len(reports) == 0 {
35 return nil, errors.New("no reports found")
@@ -38,7 +38,7 @@ func (l *Litespeed) collect() (map[string]int64, error) {
38 mx := make(map[string]int64)
39
40 for _, report := range reports {
41 - if err := l.collectReport(mx, report); err != nil {
41 + if err := c.collectReport(mx, report); err != nil {
42 return nil, err
43 }
44 }
@@ -46,7 +46,7 @@ func (l *Litespeed) collect() (map[string]int64, error) {
46 return mx, nil
47 }
48
49 -func (l *Litespeed) collectReport(mx map[string]int64, filename string) error {
49 +func (c *Collector) collectReport(mx map[string]int64, filename string) error {
50 bs, err := os.ReadFile(filename)
51 if err != nil {
52 return err
@@ -74,7 +74,7 @@ func (l *Litespeed) collectReport(mx map[string]int64, filename string) error {
74 for _, part := range parts {
75 i := strings.IndexByte(part, ':')
76 if i == -1 {
77 - l.Debugf("Skipping metric '%s': missing colon separator", part)
77 + c.Debugf("Skipping metric '%s': missing colon separator", part)
78 continue
79 }
80
@@ -82,7 +82,7 @@ func (l *Litespeed) collectReport(mx map[string]int64, filename string) error {
82
83 val, err := strconv.ParseFloat(sVal, 64)
84 if err != nil {
85 - l.Debugf("Skipping metric '%s': invalid value", part)
85 + c.Debugf("Skipping metric '%s': invalid value", part)
86 continue
87 }
88
src/go/plugin/go.d/collector/litespeed/collector.go renamed
+15 -15
@@ -25,8 +25,8 @@ func init() {
25 })
26 }
27
28 -func New() *Litespeed {
29 - return &Litespeed{
28 +func New() *Collector {
29 + return &Collector{
30 Config: Config{
31 //ReportsDir: "/tmp/lshttpd/",
32 ReportsDir: "/opt/litespeed",
@@ -41,7 +41,7 @@ type Config struct {
41 ReportsDir string `yaml:"reports_dir" json:"reports_dir"`
42 }
43
44 -type Litespeed struct {
44 +type Collector struct {
45 module.Base
46 Config `yaml:",inline" json:""`
47
@@ -50,19 +50,19 @@ type Litespeed struct {
50 charts *module.Charts
51 }
52
53 -func (l *Litespeed) Configuration() any {
54 - return l.Config
53 +func (c *Collector) Configuration() any {
54 + return c.Config
55 }
56
57 -func (l *Litespeed) Init() error {
58 - if l.ReportsDir == "" {
57 +func (c *Collector) Init() error {
58 + if c.ReportsDir == "" {
59 return errors.New("reports_dir is required")
60 }
61 return nil
62 }
63
64 -func (l *Litespeed) Check() error {
65 - mx, err := l.collect()
64 +func (c *Collector) Check() error {
65 + mx, err := c.collect()
66 if err != nil {
67 return err
68 }
@@ -74,19 +74,19 @@ func (l *Litespeed) Check() error {
74 return nil
75 }
76
77 -func (l *Litespeed) Charts() *module.Charts {
78 - return l.charts
77 +func (c *Collector) Charts() *module.Charts {
78 + return c.charts
79 }
80
81 -func (l *Litespeed) Collect() map[string]int64 {
82 - mx, err := l.collect()
81 +func (c *Collector) Collect() map[string]int64 {
82 + mx, err := c.collect()
83
84 if err != nil {
85 - l.Error(err)
85 + c.Error(err)
86 return nil
87 }
88
89 return mx
90 }
91
92 -func (l *Litespeed) Cleanup() {}
92 +func (c *Collector) Cleanup() {}
src/go/plugin/go.d/collector/litespeed/collector_test.go renamed
+26 -26
@@ -28,11 +28,11 @@ func Test_testDataIsValid(t *testing.T) {
28 }
29 }
30
31 -func TestLitespeed_ConfigurationSerialize(t *testing.T) {
32 - module.TestConfigurationSerialize(t, &Litespeed{}, dataConfigJSON, dataConfigYAML)
31 +func TestCollector_ConfigurationSerialize(t *testing.T) {
32 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
33 }
34
35 -func TestLitespeed_Init(t *testing.T) {
35 +func TestCollector_Init(t *testing.T) {
36 tests := map[string]struct {
37 wantFail bool
38 config Config
@@ -51,25 +51,25 @@ func TestLitespeed_Init(t *testing.T) {
51
52 for name, test := range tests {
53 t.Run(name, func(t *testing.T) {
54 - lite := New()
55 - lite.Config = test.config
54 + collr := New()
55 + collr.Config = test.config
56
57 if test.wantFail {
58 - assert.Error(t, lite.Init())
58 + assert.Error(t, collr.Init())
59 } else {
60 - assert.NoError(t, lite.Init())
60 + assert.NoError(t, collr.Init())
61 }
62 })
63 }
64 }
65
66 -func TestLitespeed_Charts(t *testing.T) {
66 +func TestCollector_Charts(t *testing.T) {
67 assert.NotNil(t, New().Charts())
68 }
69
70 -func TestLitespeed_Check(t *testing.T) {
70 +func TestCollector_Check(t *testing.T) {
71 tests := map[string]struct {
72 - prepareLitespeed func() *Litespeed
72 + prepareLitespeed func() *Collector
73 wantFail bool
74 }{
75 "success": {
@@ -84,20 +84,20 @@ func TestLitespeed_Check(t *testing.T) {
84
85 for name, test := range tests {
86 t.Run(name, func(t *testing.T) {
87 - lite := test.prepareLitespeed()
87 + collr := test.prepareLitespeed()
88
89 if test.wantFail {
90 - assert.Error(t, lite.Check())
90 + assert.Error(t, collr.Check())
91 } else {
92 - assert.NoError(t, lite.Check())
92 + assert.NoError(t, collr.Check())
93 }
94 })
95 }
96 }
97
98 -func TestLitespeed_Collect(t *testing.T) {
98 +func TestCollector_Collect(t *testing.T) {
99 tests := map[string]struct {
100 - prepareLitespeed func() *Litespeed
100 + prepareLitespeed func() *Collector
101 wantMetrics map[string]int64
102 }{
103 "success": {
@@ -125,27 +125,27 @@ func TestLitespeed_Collect(t *testing.T) {
125
126 for name, test := range tests {
127 t.Run(name, func(t *testing.T) {
128 - lite := test.prepareLitespeed()
128 + collr := test.prepareLitespeed()
129
130 - mx := lite.Collect()
130 + mx := collr.Collect()
131
132 assert.Equal(t, test.wantMetrics, mx)
133
134 if len(test.wantMetrics) > 0 {
135 - module.TestMetricsHasAllChartsDims(t, lite.Charts(), mx)
135 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
136 }
137 })
138 }
139 }
140
141 -func prepareLitespeedOk() *Litespeed {
142 - lite := New()
143 - lite.ReportsDir = "testdata"
144 - return lite
141 +func prepareLitespeedOk() *Collector {
142 + collr := New()
143 + collr.ReportsDir = "testdata"
144 + return collr
145 }
146
147 -func prepareLitespeedDirNotExist() *Litespeed {
148 - lite := prepareLitespeedOk()
149 - lite.ReportsDir += "!"
150 - return lite
147 +func prepareLitespeedDirNotExist() *Collector {
148 + collr := prepareLitespeedOk()
149 + collr.ReportsDir += "!"
150 + return collr
151 }
src/go/plugin/go.d/collector/logind/collect.go
+15 -15
@@ -8,31 +8,31 @@ import (
8 "strings"
9 )
10
11 -func (l *Logind) collect() (map[string]int64, error) {
12 - if l.conn == nil {
13 - conn, err := l.newLogindConn(l.Config)
11 +func (c *Collector) collect() (map[string]int64, error) {
12 + if c.conn == nil {
13 + conn, err := c.newLogindConn(c.Config)
14 if err != nil {
15 return nil, err
16 }
17 - l.conn = conn
17 + c.conn = conn
18 }
19
20 mx := make(map[string]int64)
21
22 // https://www.freedesktop.org/wiki/Software/systemd/logind/ (Session Objects)
23 - if err := l.collectSessions(mx); err != nil {
23 + if err := c.collectSessions(mx); err != nil {
24 return nil, err
25 }
26 // https://www.freedesktop.org/wiki/Software/systemd/logind/ (User Objects)
27 - if err := l.collectUsers(mx); err != nil {
27 + if err := c.collectUsers(mx); err != nil {
28 return nil, err
29 }
30
31 return mx, nil
32 }
33
34 -func (l *Logind) collectSessions(mx map[string]int64) error {
35 - sessions, err := l.conn.ListSessions()
34 +func (c *Collector) collectSessions(mx map[string]int64) error {
35 + sessions, err := c.conn.ListSessions()
36 if err != nil {
37 return err
38 }
@@ -47,7 +47,7 @@ func (l *Logind) collectSessions(mx map[string]int64) error {
47 mx["sessions_state_closing"] = 0
48
49 for _, session := range sessions {
50 - props, err := l.conn.GetSessionProperties(session.Path)
50 + props, err := c.conn.GetSessionProperties(session.Path)
51 if err != nil {
52 return err
53 }
@@ -68,7 +68,7 @@ func (l *Logind) collectSessions(mx map[string]int64) error {
68 case "unspecified":
69 mx["sessions_type_other"]++
70 default:
71 - l.Debugf("unknown session type '%s' for session '%s/%s'", typ, session.User, session.ID)
71 + c.Debugf("unknown session type '%s' for session '%s/%s'", typ, session.User, session.ID)
72 mx["sessions_type_other"]++
73 }
74 }
@@ -83,15 +83,15 @@ func (l *Logind) collectSessions(mx map[string]int64) error {
83 case "closing":
84 mx["sessions_state_closing"]++
85 default:
86 - l.Debugf("unknown session state '%s' for session '%s/%s'", state, session.User, session.ID)
86 + c.Debugf("unknown session state '%s' for session '%s/%s'", state, session.User, session.ID)
87 }
88 }
89 }
90 return nil
91 }
92
93 -func (l *Logind) collectUsers(mx map[string]int64) error {
94 - users, err := l.conn.ListUsers()
93 +func (c *Collector) collectUsers(mx map[string]int64) error {
94 + users, err := c.conn.ListUsers()
95 if err != nil {
96 return err
97 }
@@ -104,7 +104,7 @@ func (l *Logind) collectUsers(mx map[string]int64) error {
104 mx["users_state_closing"] = 0
105
106 for _, user := range users {
107 - v, err := l.conn.GetUserProperty(user.Path, "State")
107 + v, err := c.conn.GetUserProperty(user.Path, "State")
108 if err != nil {
109 return err
110 }
@@ -122,7 +122,7 @@ func (l *Logind) collectUsers(mx map[string]int64) error {
122 case "closing":
123 mx["users_state_closing"]++
124 default:
125 - l.Debugf("unknown user state '%s' for user '%s/%d'", state, user.Name, user.UID)
125 + c.Debugf("unknown user state '%s' for user '%s/%d'", state, user.Name, user.UID)
126 }
127 }
128 return nil
src/go/plugin/go.d/collector/logind/collector.go renamed
+16 -16
@@ -27,8 +27,8 @@ func init() {
27 })
28 }
29
30 -func New() *Logind {
31 - return &Logind{
30 +func New() *Collector {
31 + return &Collector{
32 Config: Config{
33 Timeout: confopt.Duration(time.Second),
34 },
@@ -44,7 +44,7 @@ type Config struct {
44 Timeout confopt.Duration `yaml:"timeout,omitempty" json:"timeout"`
45 }
46
47 -type Logind struct {
47 +type Collector struct {
48 module.Base
49 Config `yaml:",inline" json:""`
50
@@ -54,16 +54,16 @@ type Logind struct {
54 newLogindConn func(config Config) (logindConnection, error)
55 }
56
57 -func (l *Logind) Configuration() any {
58 - return l.Config
57 +func (c *Collector) Configuration() any {
58 + return c.Config
59 }
60
61 -func (l *Logind) Init() error {
61 +func (c *Collector) Init() error {
62 return nil
63 }
64
65 -func (l *Logind) Check() error {
66 - mx, err := l.collect()
65 +func (c *Collector) Check() error {
66 + mx, err := c.collect()
67 if err != nil {
68 return err
69 }
@@ -73,14 +73,14 @@ func (l *Logind) Check() error {
73 return nil
74 }
75
76 -func (l *Logind) Charts() *module.Charts {
77 - return l.charts
76 +func (c *Collector) Charts() *module.Charts {
77 + return c.charts
78 }
79
80 -func (l *Logind) Collect() map[string]int64 {
81 - mx, err := l.collect()
80 +func (c *Collector) Collect() map[string]int64 {
81 + mx, err := c.collect()
82 if err != nil {
83 - l.Error(err)
83 + c.Error(err)
84 }
85
86 if len(mx) == 0 {
@@ -89,8 +89,8 @@ func (l *Logind) Collect() map[string]int64 {
89 return mx
90 }
91
92 -func (l *Logind) Cleanup() {
93 - if l.conn != nil {
94 - l.conn.Close()
92 +func (c *Collector) Cleanup() {
93 + if c.conn != nil {
94 + c.conn.Close()
95 }
96 }
src/go/plugin/go.d/collector/logind/collector_test.go renamed
+29 -29
@@ -31,11 +31,11 @@ func Test_testDataIsValid(t *testing.T) {
31 }
32 }
33
34 -func TestLogind_ConfigurationSerialize(t *testing.T) {
35 - module.TestConfigurationSerialize(t, &Logind{}, dataConfigJSON, dataConfigYAML)
34 +func TestCollector_ConfigurationSerialize(t *testing.T) {
35 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
36 }
37
38 -func TestLogind_Init(t *testing.T) {
38 +func TestCollector_Init(t *testing.T) {
39 tests := map[string]struct {
40 config Config
41 wantFail bool
@@ -48,53 +48,53 @@ func TestLogind_Init(t *testing.T) {
48
49 for name, test := range tests {
50 t.Run(name, func(t *testing.T) {
51 - l := New()
52 - l.Config = test.config
51 + collr := New()
52 + collr.Config = test.config
53
54 if test.wantFail {
55 - assert.Error(t, l.Init())
55 + assert.Error(t, collr.Init())
56 } else {
57 - assert.NoError(t, l.Init())
57 + assert.NoError(t, collr.Init())
58 }
59 })
60 }
61 }
62
63 -func TestLogind_Charts(t *testing.T) {
63 +func TestCollector_Charts(t *testing.T) {
64 assert.Equal(t, len(charts), len(*New().Charts()))
65 }
66
67 -func TestLogind_Cleanup(t *testing.T) {
67 +func TestCollector_Cleanup(t *testing.T) {
68 tests := map[string]struct {
69 wantClose bool
70 - prepare func(l *Logind)
70 + prepare func(l *Collector)
71 }{
72 "after New": {
73 wantClose: false,
74 - prepare: func(l *Logind) {},
74 + prepare: func(l *Collector) {},
75 },
76 "after Init": {
77 wantClose: false,
78 - prepare: func(l *Logind) { _ = l.Init() },
78 + prepare: func(l *Collector) { _ = l.Init() },
79 },
80 "after Check": {
81 wantClose: true,
82 - prepare: func(l *Logind) { _ = l.Init(); _ = l.Check() },
82 + prepare: func(l *Collector) { _ = l.Init(); _ = l.Check() },
83 },
84 "after Collect": {
85 wantClose: true,
86 - prepare: func(l *Logind) { _ = l.Init(); l.Collect() },
86 + prepare: func(l *Collector) { _ = l.Init(); l.Collect() },
87 },
88 }
89
90 for name, test := range tests {
91 t.Run(name, func(t *testing.T) {
92 - l := New()
92 + collr := New()
93 m := prepareConnOK()
94 - l.newLogindConn = func(Config) (logindConnection, error) { return m, nil }
95 - test.prepare(l)
94 + collr.newLogindConn = func(Config) (logindConnection, error) { return m, nil }
95 + test.prepare(collr)
96
97 - require.NotPanics(t, l.Cleanup)
97 + require.NotPanics(t, collr.Cleanup)
98
99 if test.wantClose {
100 assert.True(t, m.closeCalled)
@@ -105,7 +105,7 @@ func TestLogind_Cleanup(t *testing.T) {
105 }
106 }
107
108 -func TestLogind_Check(t *testing.T) {
108 +func TestCollector_Check(t *testing.T) {
109 tests := map[string]struct {
110 wantFail bool
111 prepare func() *mockConn
@@ -138,20 +138,20 @@ func TestLogind_Check(t *testing.T) {
138
139 for name, test := range tests {
140 t.Run(name, func(t *testing.T) {
141 - l := New()
142 - require.NoError(t, l.Init())
143 - l.conn = test.prepare()
141 + collr := New()
142 + require.NoError(t, collr.Init())
143 + collr.conn = test.prepare()
144
145 if test.wantFail {
146 - assert.Error(t, l.Check())
146 + assert.Error(t, collr.Check())
147 } else {
148 - assert.NoError(t, l.Check())
148 + assert.NoError(t, collr.Check())
149 }
150 })
151 }
152 }
153
154 -func TestLogind_Collect(t *testing.T) {
154 +func TestCollector_Collect(t *testing.T) {
155 tests := map[string]struct {
156 prepare func() *mockConn
157 expected map[string]int64
@@ -212,11 +212,11 @@ func TestLogind_Collect(t *testing.T) {
212
213 for name, test := range tests {
214 t.Run(name, func(t *testing.T) {
215 - l := New()
216 - require.NoError(t, l.Init())
217 - l.conn = test.prepare()
215 + collr := New()
216 + require.NoError(t, collr.Init())
217 + collr.conn = test.prepare()
218
219 - mx := l.Collect()
219 + mx := collr.Collect()
220
221 assert.Equal(t, test.expected, mx)
222 })
src/go/plugin/go.d/collector/logstash/charts.go
+5 -5
@@ -208,7 +208,7 @@ var pipelineChartsTmpl = module.Charts{
208 },
209 }
210
211 -func (l *Logstash) addPipelineCharts(id string) {
211 +func (c *Collector) addPipelineCharts(id string) {
212 charts := pipelineChartsTmpl.Copy()
213
214 for _, chart := range *charts {
@@ -221,13 +221,13 @@ func (l *Logstash) addPipelineCharts(id string) {
221 }
222 }
223
224 - if err := l.Charts().Add(*charts...); err != nil {
225 - l.Warning(err)
224 + if err := c.Charts().Add(*charts...); err != nil {
225 + c.Warning(err)
226 }
227 }
228
229 -func (l *Logstash) removePipelineCharts(id string) {
230 - for _, chart := range *l.Charts() {
229 +func (c *Collector) removePipelineCharts(id string) {
230 + for _, chart := range *c.Charts() {
231 if strings.HasPrefix(chart.ID, "pipeline_"+id) {
232 chart.MarkRemove()
233 chart.MarkNotCreated()
src/go/plugin/go.d/collector/logstash/collect.go
+13 -13
@@ -11,45 +11,45 @@ import (
11
12 const urlPathNodeStatsAPI = "/_node/stats"
13
14 -func (l *Logstash) collect() (map[string]int64, error) {
15 - stats, err := l.queryNodeStats()
14 +func (c *Collector) collect() (map[string]int64, error) {
15 + stats, err := c.queryNodeStats()
16 if err != nil {
17 return nil, err
18 }
19
20 - l.updateCharts(stats.Pipelines)
20 + c.updateCharts(stats.Pipelines)
21
22 return stm.ToMap(stats), nil
23 }
24
25 -func (l *Logstash) updateCharts(pipelines map[string]pipelineStats) {
25 +func (c *Collector) updateCharts(pipelines map[string]pipelineStats) {
26 seen := make(map[string]bool)
27
28 for id := range pipelines {
29 seen[id] = true
30 - if !l.pipelines[id] {
31 - l.pipelines[id] = true
32 - l.addPipelineCharts(id)
30 + if !c.pipelines[id] {
31 + c.pipelines[id] = true
32 + c.addPipelineCharts(id)
33 }
34 }
35
36 - for id := range l.pipelines {
36 + for id := range c.pipelines {
37 if !seen[id] {
38 - delete(l.pipelines, id)
39 - l.removePipelineCharts(id)
38 + delete(c.pipelines, id)
39 + c.removePipelineCharts(id)
40 }
41 }
42 }
43
44 -func (l *Logstash) queryNodeStats() (*nodeStats, error) {
45 - req, err := web.NewHTTPRequestWithPath(l.RequestConfig, urlPathNodeStatsAPI)
44 +func (c *Collector) queryNodeStats() (*nodeStats, error) {
45 + req, err := web.NewHTTPRequestWithPath(c.RequestConfig, urlPathNodeStatsAPI)
46 if err != nil {
47 return nil, fmt.Errorf("failed to create HTTP request: %w", err)
48 }
49
50 var stats nodeStats
51
52 - if err := web.DoHTTP(l.httpClient).RequestJSON(req, &stats); err != nil {
52 + if err := web.DoHTTP(c.httpClient).RequestJSON(req, &stats); err != nil {
53 return nil, err
54 }
55
src/go/plugin/go.d/collector/logstash/collector.go renamed
+21 -21
@@ -25,8 +25,8 @@ func init() {
25 })
26 }
27
28 -func New() *Logstash {
29 - return &Logstash{
28 +func New() *Collector {
29 + return &Collector{
30 Config: Config{
31 HTTPConfig: web.HTTPConfig{
32 RequestConfig: web.RequestConfig{
@@ -47,7 +47,7 @@ type Config struct {
47 web.HTTPConfig `yaml:",inline" json:""`
48 }
49
50 -type Logstash struct {
50 +type Collector struct {
51 module.Base
52 Config `yaml:",inline" json:""`
53
@@ -58,29 +58,29 @@ type Logstash struct {
58 pipelines map[string]bool
59 }
60
61 -func (l *Logstash) Configuration() any {
62 - return l.Config
61 +func (c *Collector) Configuration() any {
62 + return c.Config
63 }
64
65 -func (l *Logstash) Init() error {
66 - if l.URL == "" {
65 +func (c *Collector) Init() error {
66 + if c.URL == "" {
67 return errors.New("config: 'url' cannot be empty")
68 }
69
70 - httpClient, err := web.NewHTTPClient(l.ClientConfig)
70 + httpClient, err := web.NewHTTPClient(c.ClientConfig)
71 if err != nil {
72 return fmt.Errorf("init HTTP client: %v", err)
73 }
74 - l.httpClient = httpClient
74 + c.httpClient = httpClient
75
76 - l.Debugf("using URL %s", l.URL)
77 - l.Debugf("using timeout: %s", l.Timeout.Duration())
76 + c.Debugf("using URL %s", c.URL)
77 + c.Debugf("using timeout: %s", c.Timeout.Duration())
78
79 return nil
80 }
81
82 -func (l *Logstash) Check() error {
83 - mx, err := l.collect()
82 +func (c *Collector) Check() error {
83 + mx, err := c.collect()
84 if err != nil {
85 return err
86 }
@@ -90,14 +90,14 @@ func (l *Logstash) Check() error {
90 return nil
91 }
92
93 -func (l *Logstash) Charts() *module.Charts {
94 - return l.charts
93 +func (c *Collector) Charts() *module.Charts {
94 + return c.charts
95 }
96
97 -func (l *Logstash) Collect() map[string]int64 {
98 - mx, err := l.collect()
97 +func (c *Collector) Collect() map[string]int64 {
98 + mx, err := c.collect()
99 if err != nil {
100 - l.Error(err)
100 + c.Error(err)
101 }
102
103 if len(mx) == 0 {
@@ -106,8 +106,8 @@ func (l *Logstash) Collect() map[string]int64 {
106 return mx
107 }
108
109 -func (l *Logstash) Cleanup() {
110 - if l.httpClient != nil {
111 - l.httpClient.CloseIdleConnections()
109 +func (c *Collector) Cleanup() {
110 + if c.httpClient != nil {
111 + c.httpClient.CloseIdleConnections()
112 }
113 }
src/go/plugin/go.d/collector/logstash/collector_test.go renamed
+40 -40
@@ -33,11 +33,11 @@ func Test_testDataIsValid(t *testing.T) {
33 }
34 }
35
36 -func TestLogstash_ConfigurationSerialize(t *testing.T) {
37 - module.TestConfigurationSerialize(t, &Logstash{}, dataConfigJSON, dataConfigYAML)
36 +func TestCollector_ConfigurationSerialize(t *testing.T) {
37 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
38 }
39
40 -func TestLogstash_Init(t *testing.T) {
40 +func TestCollector_Init(t *testing.T) {
41 tests := map[string]struct {
42 wantFail bool
43 config Config
@@ -58,30 +58,30 @@ func TestLogstash_Init(t *testing.T) {
58
59 for name, test := range tests {
60 t.Run(name, func(t *testing.T) {
61 - ls := New()
62 - ls.Config = test.config
61 + collr := New()
62 + collr.Config = test.config
63
64 if test.wantFail {
65 - assert.Error(t, ls.Init())
65 + assert.Error(t, collr.Init())
66 } else {
67 - assert.NoError(t, ls.Init())
67 + assert.NoError(t, collr.Init())
68 }
69 })
70 }
71 }
72
73 -func TestLogstash_Charts(t *testing.T) {
73 +func TestCollector_Charts(t *testing.T) {
74 assert.NotNil(t, New().Charts())
75 }
76
77 -func TestLogstash_Cleanup(t *testing.T) {
77 +func TestCollector_Cleanup(t *testing.T) {
78 assert.NotPanics(t, New().Cleanup)
79 }
80
81 -func TestLogstash_Check(t *testing.T) {
81 +func TestCollector_Check(t *testing.T) {
82 tests := map[string]struct {
83 wantFail bool
84 - prepare func(t *testing.T) (ls *Logstash, cleanup func())
84 + prepare func(t *testing.T) (ls *Collector, cleanup func())
85 }{
86 "success on valid response": {
87 wantFail: false,
@@ -103,21 +103,21 @@ func TestLogstash_Check(t *testing.T) {
103
104 for name, test := range tests {
105 t.Run(name, func(t *testing.T) {
106 - ls, cleanup := test.prepare(t)
106 + collr, cleanup := test.prepare(t)
107 defer cleanup()
108
109 if test.wantFail {
110 - assert.Error(t, ls.Check())
110 + assert.Error(t, collr.Check())
111 } else {
112 - assert.NoError(t, ls.Check())
112 + assert.NoError(t, collr.Check())
113 }
114 })
115 }
116 }
117
118 -func TestLogstash_Collect(t *testing.T) {
118 +func TestCollector_Collect(t *testing.T) {
119 tests := map[string]struct {
120 - prepare func(t *testing.T) (ls *Logstash, cleanup func())
120 + prepare func(t *testing.T) (ls *Collector, cleanup func())
121 wantNumOfCharts int
122 wantMetrics map[string]int64
123 }{
@@ -172,21 +172,21 @@ func TestLogstash_Collect(t *testing.T) {
172
173 for name, test := range tests {
174 t.Run(name, func(t *testing.T) {
175 - ls, cleanup := test.prepare(t)
175 + collr, cleanup := test.prepare(t)
176 defer cleanup()
177
178 - mx := ls.Collect()
178 + mx := collr.Collect()
179
180 require.Equal(t, test.wantMetrics, mx)
181 if len(test.wantMetrics) > 0 {
182 - assert.Equal(t, test.wantNumOfCharts, len(*ls.Charts()))
183 - module.TestMetricsHasAllChartsDims(t, ls.Charts(), mx)
182 + assert.Equal(t, test.wantNumOfCharts, len(*collr.Charts()))
183 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
184 }
185 })
186 }
187 }
188
189 -func caseValidResponse(t *testing.T) (*Logstash, func()) {
189 +func caseValidResponse(t *testing.T) (*Collector, func()) {
190 t.Helper()
191 srv := httptest.NewServer(http.HandlerFunc(
192 func(w http.ResponseWriter, r *http.Request) {
@@ -197,44 +197,44 @@ func caseValidResponse(t *testing.T) (*Logstash, func()) {
197 w.WriteHeader(http.StatusNotFound)
198 }
199 }))
200 - ls := New()
201 - ls.URL = srv.URL
202 - require.NoError(t, ls.Init())
200 + collr := New()
201 + collr.URL = srv.URL
202 + require.NoError(t, collr.Init())
203
204 - return ls, srv.Close
204 + return collr, srv.Close
205 }
206
207 -func caseInvalidDataResponse(t *testing.T) (*Logstash, func()) {
207 +func caseInvalidDataResponse(t *testing.T) (*Collector, func()) {
208 t.Helper()
209 srv := httptest.NewServer(http.HandlerFunc(
210 func(w http.ResponseWriter, r *http.Request) {
211 _, _ = w.Write([]byte("hello and\n goodbye"))
212 }))
213 - ls := New()
214 - ls.URL = srv.URL
215 - require.NoError(t, ls.Init())
213 + collr := New()
214 + collr.URL = srv.URL
215 + require.NoError(t, collr.Init())
216
217 - return ls, srv.Close
217 + return collr, srv.Close
218 }
219
220 -func caseConnectionRefused(t *testing.T) (*Logstash, func()) {
220 +func caseConnectionRefused(t *testing.T) (*Collector, func()) {
221 t.Helper()
222 - ls := New()
223 - ls.URL = "http://127.0.0.1:65001"
224 - require.NoError(t, ls.Init())
222 + collr := New()
223 + collr.URL = "http://127.0.0.1:65001"
224 + require.NoError(t, collr.Init())
225
226 - return ls, func() {}
226 + return collr, func() {}
227 }
228
229 -func case404(t *testing.T) (*Logstash, func()) {
229 +func case404(t *testing.T) (*Collector, func()) {
230 t.Helper()
231 srv := httptest.NewServer(http.HandlerFunc(
232 func(w http.ResponseWriter, r *http.Request) {
233 w.WriteHeader(http.StatusNotFound)
234 }))
235 - ls := New()
236 - ls.URL = srv.URL
237 - require.NoError(t, ls.Init())
235 + collr := New()
236 + collr.URL = srv.URL
237 + require.NoError(t, collr.Init())
238
239 - return ls, srv.Close
239 + return collr, srv.Close
240 }
src/go/plugin/go.d/collector/lvm/charts.go
+3 -3
@@ -47,7 +47,7 @@ var (
47 }
48 )
49
50 -func (l *LVM) addLVMThinPoolCharts(lvName, vgName string) {
50 +func (c *Collector) addLVMThinPoolCharts(lvName, vgName string) {
51 charts := lvThinPoolChartsTmpl.Copy()
52
53 for _, chart := range *charts {
@@ -62,7 +62,7 @@ func (l *LVM) addLVMThinPoolCharts(lvName, vgName string) {
62 }
63 }
64
65 - if err := l.Charts().Add(*charts...); err != nil {
66 - l.Warning(err)
65 + if err := c.Charts().Add(*charts...); err != nil {
66 + c.Warning(err)
67 }
68 }
src/go/plugin/go.d/collector/lvm/collect.go
+6 -6
@@ -23,8 +23,8 @@ type lvsReport struct {
23 } `json:"report"`
24 }
25
26 -func (l *LVM) collect() (map[string]int64, error) {
27 - bs, err := l.exec.lvsReportJson()
26 +func (c *Collector) collect() (map[string]int64, error) {
27 + bs, err := c.exec.lvsReportJson()
28 if err != nil {
29 return nil, err
30 }
@@ -43,14 +43,14 @@ func (l *LVM) collect() (map[string]int64, error) {
43 }
44
45 if !isThinPool(lv.LVAttr) {
46 - l.Debugf("skipping lv '%s' vg '%s': not a thin pool", lv.LVName, lv.VGName)
46 + c.Debugf("skipping lv '%s' vg '%s': not a thin pool", lv.LVName, lv.VGName)
47 continue
48 }
49
50 key := fmt.Sprintf("lv_%s_vg_%s", lv.LVName, lv.VGName)
51 - if !l.lvmThinPools[key] {
52 - l.addLVMThinPoolCharts(lv.LVName, lv.VGName)
53 - l.lvmThinPools[key] = true
51 + if !c.lvmThinPools[key] {
52 + c.addLVMThinPoolCharts(lv.LVName, lv.VGName)
53 + c.lvmThinPools[key] = true
54 }
55 if v, ok := parseFloat(lv.DataPercent); ok {
56 mx[key+"_data_percent"] = int64(v * 100)
src/go/plugin/go.d/collector/lvm/collector.go renamed
+16 -16
@@ -28,8 +28,8 @@ func init() {
28 })
29 }
30
31 -func New() *LVM {
32 - return &LVM{
31 +func New() *Collector {
32 + return &Collector{
33 Config: Config{
34 Timeout: confopt.Duration(time.Second * 2),
35 },
@@ -43,7 +43,7 @@ type Config struct {
43 Timeout confopt.Duration `yaml:"timeout,omitempty" json:"timeout"`
44 }
45
46 -type LVM struct {
46 +type Collector struct {
47 module.Base
48 Config `yaml:",inline" json:""`
49
@@ -54,22 +54,22 @@ type LVM struct {
54 lvmThinPools map[string]bool
55 }
56
57 -func (l *LVM) Configuration() any {
58 - return l.Config
57 +func (c *Collector) Configuration() any {
58 + return c.Config
59 }
60
61 -func (l *LVM) Init() error {
62 - lvmExec, err := l.initLVMCLIExec()
61 +func (c *Collector) Init() error {
62 + lvmExec, err := c.initLVMCLIExec()
63 if err != nil {
64 return fmt.Errorf("init lvm exec: %v", err)
65 }
66 - l.exec = lvmExec
66 + c.exec = lvmExec
67
68 return nil
69 }
70
71 -func (l *LVM) Check() error {
72 - mx, err := l.collect()
71 +func (c *Collector) Check() error {
72 + mx, err := c.collect()
73 if err != nil {
74 return err
75 }
@@ -81,14 +81,14 @@ func (l *LVM) Check() error {
81 return nil
82 }
83
84 -func (l *LVM) Charts() *module.Charts {
85 - return l.charts
84 +func (c *Collector) Charts() *module.Charts {
85 + return c.charts
86 }
87
88 -func (l *LVM) Collect() map[string]int64 {
89 - mx, err := l.collect()
88 +func (c *Collector) Collect() map[string]int64 {
89 + mx, err := c.collect()
90 if err != nil {
91 - l.Error(err)
91 + c.Error(err)
92 }
93
94 if len(mx) == 0 {
@@ -98,4 +98,4 @@ func (l *LVM) Collect() map[string]int64 {
98 return mx
99 }
100
101 -func (l *LVM) Cleanup() {}
101 +func (c *Collector) Cleanup() {}
src/go/plugin/go.d/collector/lvm/collector_test.go renamed
+33 -33
@@ -36,11 +36,11 @@ func Test_testDataIsValid(t *testing.T) {
36 }
37 }
38
39 -func TestLVM_Configuration(t *testing.T) {
40 - module.TestConfigurationSerialize(t, &LVM{}, dataConfigJSON, dataConfigYAML)
39 +func TestCollector_Configuration(t *testing.T) {
40 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
41 }
42
43 -func TestLVM_Init(t *testing.T) {
43 +func TestCollector_Init(t *testing.T) {
44 tests := map[string]struct {
45 config Config
46 wantFail bool
@@ -53,59 +53,59 @@ func TestLVM_Init(t *testing.T) {
53
54 for name, test := range tests {
55 t.Run(name, func(t *testing.T) {
56 - lvm := New()
57 - lvm.Config = test.config
56 + collr := New()
57 + collr.Config = test.config
58
59 if test.wantFail {
60 - assert.Error(t, lvm.Init())
60 + assert.Error(t, collr.Init())
61 } else {
62 - assert.NoError(t, lvm.Init())
62 + assert.NoError(t, collr.Init())
63 }
64 })
65 }
66 }
67
68 -func TestLVM_Cleanup(t *testing.T) {
68 +func TestCollector_Cleanup(t *testing.T) {
69 tests := map[string]struct {
70 - prepare func() *LVM
70 + prepare func() *Collector
71 }{
72 "not initialized exec": {
73 - prepare: func() *LVM {
73 + prepare: func() *Collector {
74 return New()
75 },
76 },
77 "after check": {
78 - prepare: func() *LVM {
79 - lvm := New()
80 - lvm.exec = prepareMockOK()
81 - _ = lvm.Check()
82 - return lvm
78 + prepare: func() *Collector {
79 + collr := New()
80 + collr.exec = prepareMockOK()
81 + _ = collr.Check()
82 + return collr
83 },
84 },
85 "after collect": {
86 - prepare: func() *LVM {
87 - lvm := New()
88 - lvm.exec = prepareMockOK()
89 - _ = lvm.Collect()
90 - return lvm
86 + prepare: func() *Collector {
87 + collr := New()
88 + collr.exec = prepareMockOK()
89 + _ = collr.Collect()
90 + return collr
91 },
92 },
93 }
94
95 for name, test := range tests {
96 t.Run(name, func(t *testing.T) {
97 - lvm := test.prepare()
97 + collr := test.prepare()
98
99 - assert.NotPanics(t, lvm.Cleanup)
99 + assert.NotPanics(t, collr.Cleanup)
100 })
101 }
102 }
103
104 -func TestLVM_Charts(t *testing.T) {
104 +func TestCollector_Charts(t *testing.T) {
105 assert.NotNil(t, New().Charts())
106 }
107
108 -func TestLVM_Check(t *testing.T) {
108 +func TestCollector_Check(t *testing.T) {
109 tests := map[string]struct {
110 prepareMock func() *mockLvmCliExec
111 wantFail bool
@@ -134,20 +134,20 @@ func TestLVM_Check(t *testing.T) {
134
135 for name, test := range tests {
136 t.Run(name, func(t *testing.T) {
137 - lvm := New()
137 + collr := New()
138 mock := test.prepareMock()
139 - lvm.exec = mock
139 + collr.exec = mock
140
141 if test.wantFail {
142 - assert.Error(t, lvm.Check())
142 + assert.Error(t, collr.Check())
143 } else {
144 - assert.NoError(t, lvm.Check())
144 + assert.NoError(t, collr.Check())
145 }
146 })
147 }
148 }
149
150 -func TestLVM_Collect(t *testing.T) {
150 +func TestCollector_Collect(t *testing.T) {
151 tests := map[string]struct {
152 prepareMock func() *mockLvmCliExec
153 wantMetrics map[string]int64
@@ -179,15 +179,15 @@ func TestLVM_Collect(t *testing.T) {
179
180 for name, test := range tests {
181 t.Run(name, func(t *testing.T) {
182 - lvm := New()
182 + collr := New()
183 mock := test.prepareMock()
184 - lvm.exec = mock
184 + collr.exec = mock
185
186 - mx := lvm.Collect()
186 + mx := collr.Collect()
187
188 assert.Equal(t, test.wantMetrics, mx)
189 if len(test.wantMetrics) > 0 {
190 - assert.Len(t, *lvm.Charts(), len(lvThinPoolChartsTmpl)*len(lvm.lvmThinPools))
190 + assert.Len(t, *collr.Charts(), len(lvThinPoolChartsTmpl)*len(collr.lvmThinPools))
191 }
192 })
193 }
src/go/plugin/go.d/collector/lvm/init.go
+2 -2
@@ -12,14 +12,14 @@ import (
12 "github.com/netdata/netdata/go/plugins/pkg/executable"
13 )
14
15 -func (l *LVM) initLVMCLIExec() (lvmCLI, error) {
15 +func (c *Collector) initLVMCLIExec() (lvmCLI, error) {
16 ndsudoPath := filepath.Join(executable.Directory, "ndsudo")
17 if _, err := os.Stat(ndsudoPath); err != nil {
18 return nil, fmt.Errorf("ndsudo executable not found: %v", err)
19
20 }
21
22 - lvmExec := newLVMCLIExec(ndsudoPath, l.Timeout.Duration(), l.Logger)
22 + lvmExec := newLVMCLIExec(ndsudoPath, c.Timeout.Duration(), c.Logger)
23
24 return lvmExec, nil
25 }
src/go/plugin/go.d/collector/maxscale/charts.go
+5 -5
@@ -186,7 +186,7 @@ var (
186 }
187 )
188
189 -func (m *MaxScale) addServerCharts(id, addr string) {
189 +func (c *Collector) addServerCharts(id, addr string) {
190 srvCharts := serverChartsTmpl.Copy()
191
192 for _, chart := range *srvCharts {
@@ -201,16 +201,16 @@ func (m *MaxScale) addServerCharts(id, addr string) {
201 }
202 }
203
204 - if err := m.Charts().Add(*srvCharts...); err != nil {
205 - m.Warning(err)
204 + if err := c.Charts().Add(*srvCharts...); err != nil {
205 + c.Warning(err)
206 }
207 }
208
209 -func (m *MaxScale) removeServerCharts(id string) {
209 +func (c *Collector) removeServerCharts(id string) {
210 px := fmt.Sprintf("server_%s_", id)
211 px = cleanChartID(px)
212
213 - for _, chart := range *m.Charts() {
213 + for _, chart := range *c.Charts() {
214 if strings.HasPrefix(chart.ID, px) {
215 chart.MarkRemove()
216 chart.MarkNotCreated()
src/go/plugin/go.d/collector/maxscale/collect.go
+19 -19
@@ -18,31 +18,31 @@ const (
18 urlPathServers = "/servers"
19 )
20
21 -func (m *MaxScale) collect() (map[string]int64, error) {
21 +func (c *Collector) collect() (map[string]int64, error) {
22 mx := make(map[string]int64)
23
24 - if err := m.collectMaxScaleGlobal(mx); err != nil {
24 + if err := c.collectMaxScaleGlobal(mx); err != nil {
25 return nil, err
26 }
27 - if err := m.collectMaxScaleThreads(mx); err != nil {
27 + if err := c.collectMaxScaleThreads(mx); err != nil {
28 return nil, err
29 }
30 - if err := m.collectServers(mx); err != nil {
30 + if err := c.collectServers(mx); err != nil {
31 return nil, err
32 }
33
34 return mx, nil
35 }
36
37 -func (m *MaxScale) collectMaxScaleGlobal(mx map[string]int64) error {
38 - req, err := web.NewHTTPRequestWithPath(m.RequestConfig, urlPathMaxscale)
37 +func (c *Collector) collectMaxScaleGlobal(mx map[string]int64) error {
38 + req, err := web.NewHTTPRequestWithPath(c.RequestConfig, urlPathMaxscale)
39 if err != nil {
40 return fmt.Errorf("failed to create HTTP request: %v", err)
41 }
42
43 var resp maxscaleGlobalResponse
44
45 - if err := web.DoHTTP(m.httpClient).RequestJSON(req, &resp); err != nil {
45 + if err := web.DoHTTP(c.httpClient).RequestJSON(req, &resp); err != nil {
46 return err
47 }
48
@@ -55,15 +55,15 @@ func (m *MaxScale) collectMaxScaleGlobal(mx map[string]int64) error {
55 return nil
56 }
57
58 -func (m *MaxScale) collectMaxScaleThreads(mx map[string]int64) error {
59 - req, err := web.NewHTTPRequestWithPath(m.RequestConfig, urlPathMaxscaleThreads)
58 +func (c *Collector) collectMaxScaleThreads(mx map[string]int64) error {
59 + req, err := web.NewHTTPRequestWithPath(c.RequestConfig, urlPathMaxscaleThreads)
60 if err != nil {
61 return fmt.Errorf("failed to create HTTP request: %v", err)
62 }
63
64 var resp maxscaleThreadsResponse
65
66 - if err := web.DoHTTP(m.httpClient).RequestJSON(req, &resp); err != nil {
66 + if err := web.DoHTTP(c.httpClient).RequestJSON(req, &resp); err != nil {
67 return err
68 }
69
@@ -91,15 +91,15 @@ func (m *MaxScale) collectMaxScaleThreads(mx map[string]int64) error {
91 return nil
92 }
93
94 -func (m *MaxScale) collectServers(mx map[string]int64) error {
95 - req, err := web.NewHTTPRequestWithPath(m.RequestConfig, urlPathServers)
94 +func (c *Collector) collectServers(mx map[string]int64) error {
95 + req, err := web.NewHTTPRequestWithPath(c.RequestConfig, urlPathServers)
96 if err != nil {
97 return fmt.Errorf("failed to create HTTP request: %v", err)
98 }
99
100 var resp serversResponse
101
102 - if err := web.DoHTTP(m.httpClient).RequestJSON(req, &resp); err != nil {
102 + if err := web.DoHTTP(c.httpClient).RequestJSON(req, &resp); err != nil {
103 return err
104 }
105
@@ -112,10 +112,10 @@ func (m *MaxScale) collectServers(mx map[string]int64) error {
112
113 seen[r.ID] = true
114
115 - if !m.seenServers[r.ID] {
116 - m.seenServers[r.ID] = true
115 + if !c.seenServers[r.ID] {
116 + c.seenServers[r.ID] = true
117 addr := net.JoinHostPort(r.Attrs.Params.Address, strconv.Itoa(int(r.Attrs.Params.Port)))
118 - m.addServerCharts(r.ID, addr)
118 + c.addServerCharts(r.ID, addr)
119 }
120
121 px := fmt.Sprintf("server_%s_", r.ID)
@@ -130,10 +130,10 @@ func (m *MaxScale) collectServers(mx map[string]int64) error {
130 }
131 }
132
133 - for id := range m.seenServers {
133 + for id := range c.seenServers {
134 if !seen[id] {
135 - delete(m.seenServers, id)
136 - m.removeServerCharts(id)
135 + delete(c.seenServers, id)
136 + c.removeServerCharts(id)
137 }
138 }
139
src/go/plugin/go.d/collector/maxscale/collector.go renamed
+21 -21
@@ -25,8 +25,8 @@ func init() {
25 })
26 }
27
28 -func New() *MaxScale {
29 - return &MaxScale{
28 +func New() *Collector {
29 + return &Collector{
30 Config: Config{
31 HTTPConfig: web.HTTPConfig{
32 RequestConfig: web.RequestConfig{
@@ -49,7 +49,7 @@ type Config struct {
49 web.HTTPConfig `yaml:",inline" json:""`
50 }
51
52 -type MaxScale struct {
52 +type Collector struct {
53 module.Base
54 Config `yaml:",inline" json:""`
55
@@ -60,29 +60,29 @@ type MaxScale struct {
60 seenServers map[string]bool
61 }
62
63 -func (m *MaxScale) Configuration() any {
64 - return m.Config
63 +func (c *Collector) Configuration() any {
64 + return c.Config
65 }
66
67 -func (m *MaxScale) Init() error {
68 - if m.URL == "" {
67 +func (c *Collector) Init() error {
68 + if c.URL == "" {
69 return errors.New("URL required but not set")
70 }
71
72 - httpClient, err := web.NewHTTPClient(m.ClientConfig)
72 + httpClient, err := web.NewHTTPClient(c.ClientConfig)
73 if err != nil {
74 return fmt.Errorf("failed initializing http client: %w", err)
75 }
76 - m.httpClient = httpClient
76 + c.httpClient = httpClient
77
78 - m.Debugf("using URL %s", m.URL)
79 - m.Debugf("using timeout: %s", m.Timeout)
78 + c.Debugf("using URL %s", c.URL)
79 + c.Debugf("using timeout: %s", c.Timeout)
80
81 return nil
82 }
83
84 -func (m *MaxScale) Check() error {
85 - mx, err := m.collect()
84 +func (c *Collector) Check() error {
85 + mx, err := c.collect()
86 if err != nil {
87 return err
88 }
@@ -94,22 +94,22 @@ func (m *MaxScale) Check() error {
94 return nil
95 }
96
97 -func (m *MaxScale) Charts() *module.Charts {
98 - return m.charts
97 +func (c *Collector) Charts() *module.Charts {
98 + return c.charts
99 }
100
101 -func (m *MaxScale) Collect() map[string]int64 {
102 - mx, err := m.collect()
101 +func (c *Collector) Collect() map[string]int64 {
102 + mx, err := c.collect()
103 if err != nil {
104 - m.Error(err)
104 + c.Error(err)
105 return nil
106 }
107
108 return mx
109 }
110
111 -func (m *MaxScale) Cleanup() {
112 - if m.httpClient != nil {
113 - m.httpClient.CloseIdleConnections()
111 +func (c *Collector) Cleanup() {
112 + if c.httpClient != nil {
113 + c.httpClient.CloseIdleConnections()
114 }
115 }
src/go/plugin/go.d/collector/maxscale/collector_test.go renamed
+45 -45
@@ -36,11 +36,11 @@ func Test_testDataIsValid(t *testing.T) {
36 }
37 }
38
39 -func TestMaxScale_ConfigurationSerialize(t *testing.T) {
40 - module.TestConfigurationSerialize(t, &MaxScale{}, dataConfigJSON, dataConfigYAML)
39 +func TestCollector_ConfigurationSerialize(t *testing.T) {
40 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
41 }
42
43 -func TestMaxScale_Init(t *testing.T) {
43 +func TestCollector_Init(t *testing.T) {
44 tests := map[string]struct {
45 wantFail bool
46 config Config
@@ -61,22 +61,22 @@ func TestMaxScale_Init(t *testing.T) {
61
62 for name, test := range tests {
63 t.Run(name, func(t *testing.T) {
64 - ms := New()
65 - ms.Config = test.config
64 + collr := New()
65 + collr.Config = test.config
66
67 if test.wantFail {
68 - assert.Error(t, ms.Init())
68 + assert.Error(t, collr.Init())
69 } else {
70 - assert.NoError(t, ms.Init())
70 + assert.NoError(t, collr.Init())
71 }
72 })
73 }
74 }
75
76 -func TestMaxScale_Check(t *testing.T) {
76 +func TestCollector_Check(t *testing.T) {
77 tests := map[string]struct {
78 wantFail bool
79 - prepare func(t *testing.T) (nu *MaxScale, cleanup func())
79 + prepare func(t *testing.T) (nu *Collector, cleanup func())
80 }{
81 "success on valid response": {
82 wantFail: false,
@@ -102,25 +102,25 @@ func TestMaxScale_Check(t *testing.T) {
102
103 for name, test := range tests {
104 t.Run(name, func(t *testing.T) {
105 - ms, cleanup := test.prepare(t)
105 + collr, cleanup := test.prepare(t)
106 defer cleanup()
107
108 if test.wantFail {
109 - assert.Error(t, ms.Check())
109 + assert.Error(t, collr.Check())
110 } else {
111 - assert.NoError(t, ms.Check())
111 + assert.NoError(t, collr.Check())
112 }
113 })
114 }
115 }
116
117 -func TestMaxScale_Charts(t *testing.T) {
117 +func TestCollector_Charts(t *testing.T) {
118 assert.NotNil(t, New().Charts())
119 }
120
121 -func TestMaxScale_Collect(t *testing.T) {
121 +func TestCollector_Collect(t *testing.T) {
122 tests := map[string]struct {
123 - prepare func(t *testing.T) (nu *MaxScale, cleanup func())
123 + prepare func(t *testing.T) (nu *Collector, cleanup func())
124 wantNumOfCharts int
125 wantMetrics map[string]int64
126 }{
@@ -178,25 +178,25 @@ func TestMaxScale_Collect(t *testing.T) {
178
179 for name, test := range tests {
180 t.Run(name, func(t *testing.T) {
181 - ms, cleanup := test.prepare(t)
181 + collr, cleanup := test.prepare(t)
182 defer cleanup()
183
184 - _ = ms.Check()
184 + _ = collr.Check()
185
186 - mx := ms.Collect()
186 + mx := collr.Collect()
187
188 require.Equal(t, test.wantMetrics, mx)
189
190 if len(test.wantMetrics) > 0 {
191 - assert.Equal(t, test.wantNumOfCharts, len(*ms.Charts()), "want charts")
191 + assert.Equal(t, test.wantNumOfCharts, len(*collr.Charts()), "want charts")
192
193 - module.TestMetricsHasAllChartsDims(t, ms.Charts(), mx)
193 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
194 }
195 })
196 }
197 }
198
199 -func caseOk(t *testing.T) (*MaxScale, func()) {
199 +func caseOk(t *testing.T) (*Collector, func()) {
200 t.Helper()
201 srv := httptest.NewServer(http.HandlerFunc(
202 func(w http.ResponseWriter, r *http.Request) {
@@ -211,14 +211,14 @@ func caseOk(t *testing.T) (*MaxScale, func()) {
211 w.WriteHeader(http.StatusNotFound)
212 }
213 }))
214 - ms := New()
215 - ms.URL = srv.URL
216 - require.NoError(t, ms.Init())
214 + collr := New()
215 + collr.URL = srv.URL
216 + require.NoError(t, collr.Init())
217
218 - return ms, srv.Close
218 + return collr, srv.Close
219 }
220
221 -func caseUnexpectedJsonResponse(t *testing.T) (*MaxScale, func()) {
221 +func caseUnexpectedJsonResponse(t *testing.T) (*Collector, func()) {
222 t.Helper()
223 resp := `
224 {
@@ -241,44 +241,44 @@ func caseUnexpectedJsonResponse(t *testing.T) (*MaxScale, func()) {
241 func(w http.ResponseWriter, r *http.Request) {
242 _, _ = w.Write([]byte(resp))
243 }))
244 - ms := New()
245 - ms.URL = srv.URL
246 - require.NoError(t, ms.Init())
244 + collr := New()
245 + collr.URL = srv.URL
246 + require.NoError(t, collr.Init())
247
248 - return ms, srv.Close
248 + return collr, srv.Close
249 }
250
251 -func caseInvalidDataResponse(t *testing.T) (*MaxScale, func()) {
251 +func caseInvalidDataResponse(t *testing.T) (*Collector, func()) {
252 t.Helper()
253 srv := httptest.NewServer(http.HandlerFunc(
254 func(w http.ResponseWriter, r *http.Request) {
255 _, _ = w.Write([]byte("hello and\n goodbye"))
256 }))
257 - ms := New()
258 - ms.URL = srv.URL
259 - require.NoError(t, ms.Init())
257 + collr := New()
258 + collr.URL = srv.URL
259 + require.NoError(t, collr.Init())
260
261 - return ms, srv.Close
261 + return collr, srv.Close
262 }
263
264 -func caseConnectionRefused(t *testing.T) (*MaxScale, func()) {
264 +func caseConnectionRefused(t *testing.T) (*Collector, func()) {
265 t.Helper()
266 - ms := New()
267 - ms.URL = "http://127.0.0.1:65001"
268 - require.NoError(t, ms.Init())
266 + collr := New()
267 + collr.URL = "http://127.0.0.1:65001"
268 + require.NoError(t, collr.Init())
269
270 - return ms, func() {}
270 + return collr, func() {}
271 }
272
273 -func case404(t *testing.T) (*MaxScale, func()) {
273 +func case404(t *testing.T) (*Collector, func()) {
274 t.Helper()
275 srv := httptest.NewServer(http.HandlerFunc(
276 func(w http.ResponseWriter, r *http.Request) {
277 w.WriteHeader(http.StatusNotFound)
278 }))
279 - ms := New()
280 - ms.URL = srv.URL
281 - require.NoError(t, ms.Init())
279 + collr := New()
280 + collr.URL = srv.URL
281 + require.NoError(t, collr.Init())
282
283 - return ms, srv.Close
283 + return collr, srv.Close
284 }
src/go/plugin/go.d/collector/megacli/charts.go
+9 -9
@@ -134,7 +134,7 @@ var (
134 }
135 )
136
137 -func (m *MegaCli) addAdapterCharts(ad *megaAdapter) {
137 +func (c *Collector) addAdapterCharts(ad *megaAdapter) {
138 charts := adapterChartsTmpl.Copy()
139
140 for _, chart := range *charts {
@@ -147,12 +147,12 @@ func (m *MegaCli) addAdapterCharts(ad *megaAdapter) {
147 }
148 }
149
150 - if err := m.Charts().Add(*charts...); err != nil {
151 - m.Warning(err)
150 + if err := c.Charts().Add(*charts...); err != nil {
151 + c.Warning(err)
152 }
153 }
154
155 -func (m *MegaCli) addPhysDriveCharts(pd *megaPhysDrive) {
155 +func (c *Collector) addPhysDriveCharts(pd *megaPhysDrive) {
156 charts := physDriveChartsTmpl.Copy()
157
158 for _, chart := range *charts {
@@ -169,12 +169,12 @@ func (m *MegaCli) addPhysDriveCharts(pd *megaPhysDrive) {
169 }
170 }
171
172 - if err := m.Charts().Add(*charts...); err != nil {
173 - m.Warning(err)
172 + if err := c.Charts().Add(*charts...); err != nil {
173 + c.Warning(err)
174 }
175 }
176
177 -func (m *MegaCli) addBBUCharts(bbu *megaBBU) {
177 +func (c *Collector) addBBUCharts(bbu *megaBBU) {
178 charts := bbuChartsTmpl.Copy()
179
180 if _, ok := calcCapDegradationPerc(bbu); !ok {
@@ -192,7 +192,7 @@ func (m *MegaCli) addBBUCharts(bbu *megaBBU) {
192 }
193 }
194
195 - if err := m.Charts().Add(*charts...); err != nil {
196 - m.Warning(err)
195 + if err := c.Charts().Add(*charts...); err != nil {
196 + c.Warning(err)
197 }
198 }
src/go/plugin/go.d/collector/megacli/collect.go
+3 -3
@@ -9,13 +9,13 @@ import (
9 "strings"
10 )
11
12 -func (m *MegaCli) collect() (map[string]int64, error) {
12 +func (c *Collector) collect() (map[string]int64, error) {
13 mx := make(map[string]int64)
14
15 - if err := m.collectPhysDrives(mx); err != nil {
15 + if err := c.collectPhysDrives(mx); err != nil {
16 return nil, err
17 }
18 - if err := m.collectBBU(mx); err != nil {
18 + if err := c.collectBBU(mx); err != nil {
19 return nil, err
20 }
21
src/go/plugin/go.d/collector/megacli/collect_bbu.go
+7 -7
@@ -23,8 +23,8 @@ type megaBBU struct {
23 designCap string
24 }
25
26 -func (m *MegaCli) collectBBU(mx map[string]int64) error {
27 - bs, err := m.exec.bbuInfo()
26 +func (c *Collector) collectBBU(mx map[string]int64) error {
27 + bs, err := c.exec.bbuInfo()
28 if err != nil {
29 return err
30 }
@@ -35,14 +35,14 @@ func (m *MegaCli) collectBBU(mx map[string]int64) error {
35 }
36
37 if len(bbus) == 0 {
38 - m.Debugf("no BBUs found")
38 + c.Debugf("no BBUs found")
39 return nil
40 }
41
42 for _, bbu := range bbus {
43 - if !m.bbu[bbu.adapterNumber] {
44 - m.bbu[bbu.adapterNumber] = true
45 - m.addBBUCharts(bbu)
43 + if !c.bbu[bbu.adapterNumber] {
44 + c.bbu[bbu.adapterNumber] = true
45 + c.addBBUCharts(bbu)
46 }
47
48 px := fmt.Sprintf("bbu_adapter_%s_", bbu.adapterNumber)
@@ -56,7 +56,7 @@ func (m *MegaCli) collectBBU(mx map[string]int64) error {
56 }
57 }
58
59 - m.Debugf("found %d BBUs", len(m.bbu))
59 + c.Debugf("found %d BBUs", len(c.bbu))
60
61 return nil
62 }
src/go/plugin/go.d/collector/megacli/collect_phys_drives.go
+9 -9
@@ -38,8 +38,8 @@ var adapterStates = []string{
38 "failed",
39 }
40
41 -func (m *MegaCli) collectPhysDrives(mx map[string]int64) error {
42 - bs, err := m.exec.physDrivesInfo()
41 +func (c *Collector) collectPhysDrives(mx map[string]int64) error {
42 + bs, err := c.exec.physDrivesInfo()
43 if err != nil {
44 return err
45 }
@@ -55,9 +55,9 @@ func (m *MegaCli) collectPhysDrives(mx map[string]int64) error {
55 var drives int
56
57 for _, ad := range adapters {
58 - if !m.adapters[ad.number] {
59 - m.adapters[ad.number] = true
60 - m.addAdapterCharts(ad)
58 + if !c.adapters[ad.number] {
59 + c.adapters[ad.number] = true
60 + c.addAdapterCharts(ad)
61 }
62
63 px := fmt.Sprintf("adapter_%s_health_state_", ad.number)
@@ -68,9 +68,9 @@ func (m *MegaCli) collectPhysDrives(mx map[string]int64) error {
68 mx[px+st] = 1
69
70 for _, pd := range ad.physDrives {
71 - if !m.adapters[pd.wwn] {
72 - m.adapters[pd.wwn] = true
73 - m.addPhysDriveCharts(pd)
71 + if !c.adapters[pd.wwn] {
72 + c.adapters[pd.wwn] = true
73 + c.addPhysDriveCharts(pd)
74 }
75 drives++
76
@@ -81,7 +81,7 @@ func (m *MegaCli) collectPhysDrives(mx map[string]int64) error {
81 }
82 }
83
84 - m.Debugf("found %d adapters, %d physical drives", len(m.adapters), drives)
84 + c.Debugf("found %d adapters, %d physical drives", len(c.adapters), drives)
85
86 return nil
87 }
src/go/plugin/go.d/collector/megacli/collector.go renamed
+24 -30
@@ -28,8 +28,8 @@ func init() {
28 })
29 }
30
31 -func New() *MegaCli {
32 - return &MegaCli{
31 +func New() *Collector {
32 + return &Collector{
33 Config: Config{
34 Timeout: confopt.Duration(time.Second * 2),
35 },
@@ -45,41 +45,35 @@ type Config struct {
45 Timeout confopt.Duration `yaml:"timeout,omitempty" json:"timeout"`
46 }
47
48 -type (
49 - MegaCli struct {
50 - module.Base
51 - Config `yaml:",inline" json:""`
48 +type Collector struct {
49 + module.Base
50 + Config `yaml:",inline" json:""`
51
53 - charts *module.Charts
52 + charts *module.Charts
53
55 - exec megaCli
54 + exec megaCli
55
57 - adapters map[string]bool
58 - drives map[string]bool
59 - bbu map[string]bool
60 - }
61 - megaCli interface {
62 - physDrivesInfo() ([]byte, error)
63 - bbuInfo() ([]byte, error)
64 - }
65 -)
56 + adapters map[string]bool
57 + drives map[string]bool
58 + bbu map[string]bool
59 +}
60
67 -func (m *MegaCli) Configuration() any {
68 - return m.Config
61 +func (c *Collector) Configuration() any {
62 + return c.Config
63 }
64
71 -func (m *MegaCli) Init() error {
72 - lvmExec, err := m.initMegaCliExec()
65 +func (c *Collector) Init() error {
66 + lvmExec, err := c.initMegaCliExec()
67 if err != nil {
68 return fmt.Errorf("init megacli exec: %v", err)
69 }
76 - m.exec = lvmExec
70 + c.exec = lvmExec
71
72 return nil
73 }
74
81 -func (m *MegaCli) Check() error {
82 - mx, err := m.collect()
75 +func (c *Collector) Check() error {
76 + mx, err := c.collect()
77 if err != nil {
78 return err
79 }
@@ -91,14 +85,14 @@ func (m *MegaCli) Check() error {
85 return nil
86 }
87
94 -func (m *MegaCli) Charts() *module.Charts {
95 - return m.charts
88 +func (c *Collector) Charts() *module.Charts {
89 + return c.charts
90 }
91
98 -func (m *MegaCli) Collect() map[string]int64 {
99 - mx, err := m.collect()
92 +func (c *Collector) Collect() map[string]int64 {
93 + mx, err := c.collect()
94 if err != nil {
101 - m.Error(err)
95 + c.Error(err)
96 }
97
98 if len(mx) == 0 {
@@ -108,4 +102,4 @@ func (m *MegaCli) Collect() map[string]int64 {
102 return mx
103 }
104
111 -func (m *MegaCli) Cleanup() {}
105 +func (c *Collector) Cleanup() {}
src/go/plugin/go.d/collector/megacli/collector_test.go renamed
+33 -33
@@ -37,11 +37,11 @@ func Test_testDataIsValid(t *testing.T) {
37 }
38 }
39
40 -func TestMegaCli_ConfigurationSerialize(t *testing.T) {
41 - module.TestConfigurationSerialize(t, &MegaCli{}, dataConfigJSON, dataConfigYAML)
40 +func TestCollector_ConfigurationSerialize(t *testing.T) {
41 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
42 }
43
44 -func TestMegaCli_Init(t *testing.T) {
44 +func TestCollector_Init(t *testing.T) {
45 tests := map[string]struct {
46 config Config
47 wantFail bool
@@ -54,58 +54,58 @@ func TestMegaCli_Init(t *testing.T) {
54
55 for name, test := range tests {
56 t.Run(name, func(t *testing.T) {
57 - mega := New()
57 + collr := New()
58
59 if test.wantFail {
60 - assert.Error(t, mega.Init())
60 + assert.Error(t, collr.Init())
61 } else {
62 - assert.NoError(t, mega.Init())
62 + assert.NoError(t, collr.Init())
63 }
64 })
65 }
66 }
67
68 -func TestMegaCli_Cleanup(t *testing.T) {
68 +func TestCollector_Cleanup(t *testing.T) {
69 tests := map[string]struct {
70 - prepare func() *MegaCli
70 + prepare func() *Collector
71 }{
72 "not initialized exec": {
73 - prepare: func() *MegaCli {
73 + prepare: func() *Collector {
74 return New()
75 },
76 },
77 "after check": {
78 - prepare: func() *MegaCli {
79 - mega := New()
80 - mega.exec = prepareMockOK()
81 - _ = mega.Check()
82 - return mega
78 + prepare: func() *Collector {
79 + collr := New()
80 + collr.exec = prepareMockOK()
81 + _ = collr.Check()
82 + return collr
83 },
84 },
85 "after collect": {
86 - prepare: func() *MegaCli {
87 - mega := New()
88 - mega.exec = prepareMockOK()
89 - _ = mega.Collect()
90 - return mega
86 + prepare: func() *Collector {
87 + collr := New()
88 + collr.exec = prepareMockOK()
89 + _ = collr.Collect()
90 + return collr
91 },
92 },
93 }
94
95 for name, test := range tests {
96 t.Run(name, func(t *testing.T) {
97 - mega := test.prepare()
97 + collr := test.prepare()
98
99 - assert.NotPanics(t, mega.Cleanup)
99 + assert.NotPanics(t, collr.Cleanup)
100 })
101 }
102 }
103
104 -func TestMegaCli_Charts(t *testing.T) {
104 +func TestCollector_Charts(t *testing.T) {
105 assert.NotNil(t, New().Charts())
106 }
107
108 -func TestMegaCli_Check(t *testing.T) {
108 +func TestCollector_Check(t *testing.T) {
109 tests := map[string]struct {
110 prepareMock func() *mockMegaCliExec
111 wantFail bool
@@ -134,20 +134,20 @@ func TestMegaCli_Check(t *testing.T) {
134
135 for name, test := range tests {
136 t.Run(name, func(t *testing.T) {
137 - mega := New()
137 + collr := New()
138 mock := test.prepareMock()
139 - mega.exec = mock
139 + collr.exec = mock
140
141 if test.wantFail {
142 - assert.Error(t, mega.Check())
142 + assert.Error(t, collr.Check())
143 } else {
144 - assert.NoError(t, mega.Check())
144 + assert.NoError(t, collr.Check())
145 }
146 })
147 }
148 }
149
150 -func TestMegaCli_Collect(t *testing.T) {
150 +func TestCollector_Collect(t *testing.T) {
151 tests := map[string]struct {
152 prepareMock func() *mockMegaCliExec
153 wantMetrics map[string]int64
@@ -231,16 +231,16 @@ func TestMegaCli_Collect(t *testing.T) {
231
232 for name, test := range tests {
233 t.Run(name, func(t *testing.T) {
234 - mega := New()
234 + collr := New()
235 mock := test.prepareMock()
236 - mega.exec = mock
236 + collr.exec = mock
237
238 - mx := mega.Collect()
238 + mx := collr.Collect()
239
240 assert.Equal(t, test.wantMetrics, mx)
241 - assert.Len(t, *mega.Charts(), test.wantCharts)
241 + assert.Len(t, *collr.Charts(), test.wantCharts)
242 if len(test.wantMetrics) > 0 {
243 - module.TestMetricsHasAllChartsDims(t, mega.Charts(), mx)
243 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
244 }
245 })
246 }
src/go/plugin/go.d/collector/megacli/exec.go
+5
@@ -13,6 +13,11 @@ import (
13 "github.com/netdata/netdata/go/plugins/logger"
14 )
15
16 +type megaCli interface {
17 + physDrivesInfo() ([]byte, error)
18 + bbuInfo() ([]byte, error)
19 +}
20 +
21 func newMegaCliExec(ndsudoPath string, timeout time.Duration, log *logger.Logger) *megaCliExec {
22 return &megaCliExec{
23 Logger: log,
src/go/plugin/go.d/collector/megacli/init.go
+2 -2
@@ -12,14 +12,14 @@ import (
12 "github.com/netdata/netdata/go/plugins/pkg/executable"
13 )
14
15 -func (m *MegaCli) initMegaCliExec() (megaCli, error) {
15 +func (c *Collector) initMegaCliExec() (megaCli, error) {
16 ndsudoPath := filepath.Join(executable.Directory, "ndsudo")
17
18 if _, err := os.Stat(ndsudoPath); err != nil {
19 return nil, fmt.Errorf("ndsudo executable not found: %v", err)
20 }
21
22 - megaExec := newMegaCliExec(ndsudoPath, m.Timeout.Duration(), m.Logger)
22 + megaExec := newMegaCliExec(ndsudoPath, c.Timeout.Duration(), c.Logger)
23
24 return megaExec, nil
25 }
src/go/plugin/go.d/collector/memcached/client.go
+6
@@ -9,6 +9,12 @@ import (
9 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/socket"
10 )
11
12 +type memcachedConn interface {
13 + connect() error
14 + disconnect()
15 + queryStats() ([]byte, error)
16 +}
17 +
18 func newMemcachedConn(conf Config) memcachedConn {
19 return &memcachedClient{conn: socket.New(socket.Config{
20 Address: conf.Address,
src/go/plugin/go.d/collector/memcached/collect.go
+11 -11
@@ -41,32 +41,32 @@ var statsMetrics = map[string]bool{
41 "touch_misses": true,
42 }
43
44 -func (m *Memcached) collect() (map[string]int64, error) {
45 - if m.conn == nil {
46 - conn, err := m.establishConn()
44 +func (c *Collector) collect() (map[string]int64, error) {
45 + if c.conn == nil {
46 + conn, err := c.establishConn()
47 if err != nil {
48 return nil, err
49 }
50 - m.conn = conn
50 + c.conn = conn
51 }
52
53 - stats, err := m.conn.queryStats()
53 + stats, err := c.conn.queryStats()
54 if err != nil {
55 - m.conn.disconnect()
56 - m.conn = nil
55 + c.conn.disconnect()
56 + c.conn = nil
57 return nil, err
58 }
59
60 mx := make(map[string]int64)
61
62 - if err := m.collectStats(mx, stats); err != nil {
62 + if err := c.collectStats(mx, stats); err != nil {
63 return nil, err
64 }
65
66 return mx, nil
67 }
68
69 -func (m *Memcached) collectStats(mx map[string]int64, stats []byte) error {
69 +func (c *Collector) collectStats(mx map[string]int64, stats []byte) error {
70 if len(stats) == 0 {
71 return errors.New("empty stats response")
72 }
@@ -101,8 +101,8 @@ func (m *Memcached) collectStats(mx map[string]int64, stats []byte) error {
101 return nil
102 }
103
104 -func (m *Memcached) establishConn() (memcachedConn, error) {
105 - conn := m.newMemcachedConn(m.Config)
104 +func (c *Collector) establishConn() (memcachedConn, error) {
105 + conn := c.newMemcachedConn(c.Config)
106
107 if err := conn.connect(); err != nil {
108 return nil, err
src/go/plugin/go.d/collector/memcached/collector.go renamed
+24 -31
@@ -22,8 +22,8 @@ func init() {
22 })
23 }
24
25 -func New() *Memcached {
26 - return &Memcached{
25 +func New() *Collector {
26 + return &Collector{
27 Config: Config{
28 Address: "127.0.0.1:11211",
29 Timeout: confopt.Duration(time.Second * 1),
@@ -39,37 +39,30 @@ type Config struct {
39 Timeout confopt.Duration `yaml:"timeout" json:"timeout"`
40 }
41
42 -type (
43 - Memcached struct {
44 - module.Base
45 - Config `yaml:",inline" json:""`
42 +type Collector struct {
43 + module.Base
44 + Config `yaml:",inline" json:""`
45
47 - charts *module.Charts
46 + charts *module.Charts
47
49 - newMemcachedConn func(Config) memcachedConn
50 - conn memcachedConn
51 - }
52 - memcachedConn interface {
53 - connect() error
54 - disconnect()
55 - queryStats() ([]byte, error)
56 - }
57 -)
48 + newMemcachedConn func(Config) memcachedConn
49 + conn memcachedConn
50 +}
51
59 -func (m *Memcached) Configuration() any {
60 - return m.Config
52 +func (c *Collector) Configuration() any {
53 + return c.Config
54 }
55
63 -func (m *Memcached) Init() error {
64 - if m.Address == "" {
56 +func (c *Collector) Init() error {
57 + if c.Address == "" {
58 return errors.New("config: 'address' not set")
59 }
60
61 return nil
62 }
63
71 -func (m *Memcached) Check() error {
72 - mx, err := m.collect()
64 +func (c *Collector) Check() error {
65 + mx, err := c.collect()
66 if err != nil {
67 return err
68 }
@@ -81,14 +74,14 @@ func (m *Memcached) Check() error {
74 return nil
75 }
76
84 -func (m *Memcached) Charts() *module.Charts {
85 - return m.charts
77 +func (c *Collector) Charts() *module.Charts {
78 + return c.charts
79 }
80
88 -func (m *Memcached) Collect() map[string]int64 {
89 - mx, err := m.collect()
81 +func (c *Collector) Collect() map[string]int64 {
82 + mx, err := c.collect()
83 if err != nil {
91 - m.Error(err)
84 + c.Error(err)
85 }
86
87 if len(mx) == 0 {
@@ -98,9 +91,9 @@ func (m *Memcached) Collect() map[string]int64 {
91 return mx
92 }
93
101 -func (m *Memcached) Cleanup() {
102 - if m.conn != nil {
103 - m.conn.disconnect()
104 - m.conn = nil
94 +func (c *Collector) Cleanup() {
95 + if c.conn != nil {
96 + c.conn.disconnect()
97 + c.conn = nil
98 }
99 }
src/go/plugin/go.d/collector/memcached/collector_test.go renamed
+34 -34
@@ -31,11 +31,11 @@ func Test_testDataIsValid(t *testing.T) {
31 }
32 }
33
34 -func TestMemcached_ConfigurationSerialize(t *testing.T) {
35 - module.TestConfigurationSerialize(t, &Memcached{}, dataConfigJSON, dataConfigYAML)
34 +func TestCollector_ConfigurationSerialize(t *testing.T) {
35 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
36 }
37
38 -func TestMemcached_Init(t *testing.T) {
38 +func TestCollector_Init(t *testing.T) {
39 tests := map[string]struct {
40 config Config
41 wantFail bool
@@ -56,59 +56,59 @@ func TestMemcached_Init(t *testing.T) {
56
57 for name, test := range tests {
58 t.Run(name, func(t *testing.T) {
59 - mem := New()
60 - mem.Config = test.config
59 + collr := New()
60 + collr.Config = test.config
61
62 if test.wantFail {
63 - assert.Error(t, mem.Init())
63 + assert.Error(t, collr.Init())
64 } else {
65 - assert.NoError(t, mem.Init())
65 + assert.NoError(t, collr.Init())
66 }
67 })
68 }
69 }
70
71 -func TestMemcached_Cleanup(t *testing.T) {
71 +func TestCollector_Cleanup(t *testing.T) {
72 tests := map[string]struct {
73 - prepare func() *Memcached
73 + prepare func() *Collector
74 }{
75 "not initialized": {
76 - prepare: func() *Memcached {
76 + prepare: func() *Collector {
77 return New()
78 },
79 },
80 "after check": {
81 - prepare: func() *Memcached {
82 - mem := New()
83 - mem.newMemcachedConn = func(config Config) memcachedConn { return prepareMockOk() }
84 - _ = mem.Check()
85 - return mem
81 + prepare: func() *Collector {
82 + collr := New()
83 + collr.newMemcachedConn = func(config Config) memcachedConn { return prepareMockOk() }
84 + _ = collr.Check()
85 + return collr
86 },
87 },
88 "after collect": {
89 - prepare: func() *Memcached {
90 - mem := New()
91 - mem.newMemcachedConn = func(config Config) memcachedConn { return prepareMockOk() }
92 - _ = mem.Collect()
93 - return mem
89 + prepare: func() *Collector {
90 + collr := New()
91 + collr.newMemcachedConn = func(config Config) memcachedConn { return prepareMockOk() }
92 + _ = collr.Collect()
93 + return collr
94 },
95 },
96 }
97
98 for name, test := range tests {
99 t.Run(name, func(t *testing.T) {
100 - mem := test.prepare()
100 + collr := test.prepare()
101
102 - assert.NotPanics(t, mem.Cleanup)
102 + assert.NotPanics(t, collr.Cleanup)
103 })
104 }
105 }
106
107 -func TestMemcached_Charts(t *testing.T) {
107 +func TestCollector_Charts(t *testing.T) {
108 assert.NotNil(t, New().Charts())
109 }
110
111 -func TestMemcached_Check(t *testing.T) {
111 +func TestCollector_Check(t *testing.T) {
112 tests := map[string]struct {
113 prepareMock func() *mockMemcachedConn
114 wantFail bool
@@ -133,20 +133,20 @@ func TestMemcached_Check(t *testing.T) {
133
134 for name, test := range tests {
135 t.Run(name, func(t *testing.T) {
136 - mem := New()
136 + collr := New()
137 mock := test.prepareMock()
138 - mem.newMemcachedConn = func(config Config) memcachedConn { return mock }
138 + collr.newMemcachedConn = func(config Config) memcachedConn { return mock }
139
140 if test.wantFail {
141 - assert.Error(t, mem.Check())
141 + assert.Error(t, collr.Check())
142 } else {
143 - assert.NoError(t, mem.Check())
143 + assert.NoError(t, collr.Check())
144 }
145 })
146 }
147 }
148
149 -func TestMemcached_Collect(t *testing.T) {
149 +func TestCollector_Collect(t *testing.T) {
150 tests := map[string]struct {
151 prepareMock func() *mockMemcachedConn
152 wantMetrics map[string]int64
@@ -217,20 +217,20 @@ func TestMemcached_Collect(t *testing.T) {
217
218 for name, test := range tests {
219 t.Run(name, func(t *testing.T) {
220 - mem := New()
220 + collr := New()
221 mock := test.prepareMock()
222 - mem.newMemcachedConn = func(config Config) memcachedConn { return mock }
222 + collr.newMemcachedConn = func(config Config) memcachedConn { return mock }
223
224 - mx := mem.Collect()
224 + mx := collr.Collect()
225
226 require.Equal(t, test.wantMetrics, mx)
227
228 if len(test.wantMetrics) > 0 {
229 - module.TestMetricsHasAllChartsDims(t, mem.Charts(), mx)
229 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
230 }
231
232 assert.Equal(t, test.disconnectBeforeCleanup, mock.disconnectCalled, "disconnect before cleanup")
233 - mem.Cleanup()
233 + collr.Cleanup()
234 assert.Equal(t, test.disconnectAfterCleanup, mock.disconnectCalled, "disconnect after cleanup")
235 })
236 }
src/go/plugin/go.d/collector/mongodb/collect.go
+9 -9
@@ -4,30 +4,30 @@ package mongo
4
5 import "fmt"
6
7 -func (m *Mongo) collect() (map[string]int64, error) {
8 - if err := m.conn.initClient(m.URI, m.Timeout.Duration()); err != nil {
7 +func (c *Collector) collect() (map[string]int64, error) {
8 + if err := c.conn.initClient(c.URI, c.Timeout.Duration()); err != nil {
9 return nil, fmt.Errorf("init mongo conn: %v", err)
10 }
11
12 mx := make(map[string]int64)
13
14 - if err := m.collectServerStatus(mx); err != nil {
14 + if err := c.collectServerStatus(mx); err != nil {
15 return nil, fmt.Errorf("couldn't collect server status metrics: %v", err)
16 }
17
18 - if err := m.collectDbStats(mx); err != nil {
18 + if err := c.collectDbStats(mx); err != nil {
19 return mx, fmt.Errorf("couldn't collect dbstats metrics: %v", err)
20 }
21
22 - if m.conn.isReplicaSet() {
23 - if err := m.collectReplSetStatus(mx); err != nil {
22 + if c.conn.isReplicaSet() {
23 + if err := c.collectReplSetStatus(mx); err != nil {
24 return mx, fmt.Errorf("couldn't collect documentReplSetStatus metrics: %v", err)
25 }
26 }
27
28 - if m.conn.isMongos() {
29 - m.addShardingChartsOnce.Do(m.addShardingCharts)
30 - if err := m.collectSharding(mx); err != nil {
28 + if c.conn.isMongos() {
29 + c.addShardingChartsOnce.Do(c.addShardingCharts)
30 + if err := c.collectSharding(mx); err != nil {
31 return mx, fmt.Errorf("couldn't collect sharding metrics: %v", err)
32 }
33 }
src/go/plugin/go.d/collector/mongodb/collect_dbstats.go
+21 -21
@@ -9,33 +9,33 @@ import (
9 "github.com/netdata/netdata/go/plugins/plugin/go.d/agent/module"
10 )
11
12 -func (m *Mongo) collectDbStats(mx map[string]int64) error {
13 - if m.dbSelector == nil {
14 - m.Debug("'database' selector not set, skip collecting database statistics")
12 +func (c *Collector) collectDbStats(mx map[string]int64) error {
13 + if c.dbSelector == nil {
14 + c.Debug("'database' selector not set, skip collecting database statistics")
15 return nil
16 }
17
18 - allDBs, err := m.conn.listDatabaseNames()
18 + allDBs, err := c.conn.listDatabaseNames()
19 if err != nil {
20 return fmt.Errorf("cannot get database names: %v", err)
21 }
22
23 - m.Debugf("all databases on the server: '%v'", allDBs)
23 + c.Debugf("all databases on the server: '%v'", allDBs)
24
25 var dbs []string
26 for _, db := range allDBs {
27 - if m.dbSelector.MatchString(db) {
27 + if c.dbSelector.MatchString(db) {
28 dbs = append(dbs, db)
29 }
30 }
31
32 if len(allDBs) != len(dbs) {
33 - m.Debugf("databases remaining after filtering: %v", dbs)
33 + c.Debugf("databases remaining after filtering: %v", dbs)
34 }
35
36 seen := make(map[string]bool)
37 for _, db := range dbs {
38 - s, err := m.conn.dbStats(db)
38 + s, err := c.conn.dbStats(db)
39 if err != nil {
40 return fmt.Errorf("dbStats command failed: %v", err)
41 }
@@ -52,25 +52,25 @@ func (m *Mongo) collectDbStats(mx map[string]int64) error {
52 }
53
54 for db := range seen {
55 - if !m.databases[db] {
56 - m.databases[db] = true
57 - m.Debugf("new database '%s': creating charts", db)
58 - m.addDatabaseCharts(db)
55 + if !c.databases[db] {
56 + c.databases[db] = true
57 + c.Debugf("new database '%s': creating charts", db)
58 + c.addDatabaseCharts(db)
59 }
60 }
61
62 - for db := range m.databases {
62 + for db := range c.databases {
63 if !seen[db] {
64 - delete(m.databases, db)
65 - m.Debugf("stale database '%s': removing charts", db)
66 - m.removeDatabaseCharts(db)
64 + delete(c.databases, db)
65 + c.Debugf("stale database '%s': removing charts", db)
66 + c.removeDatabaseCharts(db)
67 }
68 }
69
70 return nil
71 }
72
73 -func (m *Mongo) addDatabaseCharts(name string) {
73 +func (c *Collector) addDatabaseCharts(name string) {
74 charts := chartsTmplDatabase.Copy()
75
76 for _, chart := range *charts {
@@ -83,15 +83,15 @@ func (m *Mongo) addDatabaseCharts(name string) {
83 }
84 }
85
86 - if err := m.Charts().Add(*charts...); err != nil {
87 - m.Warning(err)
86 + if err := c.Charts().Add(*charts...); err != nil {
87 + c.Warning(err)
88 }
89 }
90
91 -func (m *Mongo) removeDatabaseCharts(name string) {
91 +func (c *Collector) removeDatabaseCharts(name string) {
92 px := fmt.Sprintf("%s%s_", chartPxDatabase, name)
93
94 - for _, chart := range *m.Charts() {
94 + for _, chart := range *c.Charts() {
95 if strings.HasPrefix(chart.ID, px) {
96 chart.MarkRemove()
97 chart.MarkNotCreated()
src/go/plugin/go.d/collector/mongodb/collect_replsetgetstatus.go
+15 -15
@@ -26,8 +26,8 @@ var replicaSetMemberStates = map[string]int{
26
27 // TODO: deal with duplicates if we collect metrics from all cluster nodes
28 // should we only collect ReplSetStatus (at least by default) from primary nodes? (db.runCommand( { isMaster: 1 } ))
29 -func (m *Mongo) collectReplSetStatus(mx map[string]int64) error {
30 - s, err := m.conn.replSetGetStatus()
29 +func (c *Collector) collectReplSetStatus(mx map[string]int64) error {
30 + s, err := c.conn.replSetGetStatus()
31 if err != nil {
32 return fmt.Errorf("error get status of the replica set from mongo: %s", err)
33 }
@@ -60,25 +60,25 @@ func (m *Mongo) collectReplSetStatus(mx map[string]int64) error {
60 }
61
62 for name, member := range seen {
63 - if !m.replSetMembers[name] {
64 - m.replSetMembers[name] = true
65 - m.Debugf("new replica set member '%s': adding charts", name)
66 - m.addReplSetMemberCharts(member)
63 + if !c.replSetMembers[name] {
64 + c.replSetMembers[name] = true
65 + c.Debugf("new replica set member '%s': adding charts", name)
66 + c.addReplSetMemberCharts(member)
67 }
68 }
69
70 - for name := range m.replSetMembers {
70 + for name := range c.replSetMembers {
71 if _, ok := seen[name]; !ok {
72 - delete(m.replSetMembers, name)
73 - m.Debugf("stale replica set member '%s': removing charts", name)
74 - m.removeReplSetMemberCharts(name)
72 + delete(c.replSetMembers, name)
73 + c.Debugf("stale replica set member '%s': removing charts", name)
74 + c.removeReplSetMemberCharts(name)
75 }
76 }
77
78 return nil
79 }
80
81 -func (m *Mongo) addReplSetMemberCharts(v documentReplSetMember) {
81 +func (c *Collector) addReplSetMemberCharts(v documentReplSetMember) {
82 charts := chartsTmplReplSetMember.Copy()
83
84 if v.Self != nil {
@@ -97,15 +97,15 @@ func (m *Mongo) addReplSetMemberCharts(v documentReplSetMember) {
97 }
98 }
99
100 - if err := m.Charts().Add(*charts...); err != nil {
101 - m.Warning(err)
100 + if err := c.Charts().Add(*charts...); err != nil {
101 + c.Warning(err)
102 }
103 }
104
105 -func (m *Mongo) removeReplSetMemberCharts(name string) {
105 +func (c *Collector) removeReplSetMemberCharts(name string) {
106 px := fmt.Sprintf("%s%s_", chartPxReplSetMember, name)
107
108 - for _, chart := range *m.Charts() {
108 + for _, chart := range *c.Charts() {
109 if strings.HasPrefix(chart.ID, px) {
110 chart.MarkRemove()
111 chart.MarkNotCreated()
src/go/plugin/go.d/collector/mongodb/collect_serverstatus.go
+28 -28
@@ -14,13 +14,13 @@ import (
14 // nil values will be ignored and not added to the map and thus metrics should not appear on the dashboard.
15 // Because mongo reports a metric only after it first appears,some dims might take a while to appear.
16 // For example, in order to report number of create commands, a document must be created first.
17 -func (m *Mongo) collectServerStatus(mx map[string]int64) error {
18 - s, err := m.conn.serverStatus()
17 +func (c *Collector) collectServerStatus(mx map[string]int64) error {
18 + s, err := c.conn.serverStatus()
19 if err != nil {
20 return fmt.Errorf("serverStatus command failed: %s", err)
21 }
22
23 - m.addOptionalCharts(s)
23 + c.addOptionalCharts(s)
24
25 for k, v := range stm.ToMap(s) {
26 mx[k] = v
@@ -40,12 +40,12 @@ func (m *Mongo) collectServerStatus(mx map[string]int64) error {
40 return nil
41 }
42
43 -func (m *Mongo) addOptionalCharts(s *documentServerStatus) {
44 - m.addOptionalChart(s.OpLatencies,
43 +func (c *Collector) addOptionalCharts(s *documentServerStatus) {
44 + c.addOptionalChart(s.OpLatencies,
45 &chartOperationsRate,
46 &chartOperationsLatencyTime,
47 )
48 - m.addOptionalChart(s.WiredTiger,
48 + c.addOptionalChart(s.WiredTiger,
49 &chartWiredTigerConcurrentReadTransactionsUsage,
50 &chartWiredTigerConcurrentWriteTransactionsUsage,
51 &chartWiredTigerCacheUsage,
@@ -53,41 +53,41 @@ func (m *Mongo) addOptionalCharts(s *documentServerStatus) {
53 &chartWiredTigerCacheIORate,
54 &chartWiredTigerCacheEvictionsRate,
55 )
56 - m.addOptionalChart(s.Tcmalloc,
56 + c.addOptionalChart(s.Tcmalloc,
57 &chartMemoryTCMallocStatsChart,
58 )
59 - m.addOptionalChart(s.GlobalLock,
59 + c.addOptionalChart(s.GlobalLock,
60 &chartGlobalLockActiveClientsCount,
61 &chartGlobalLockCurrentQueueCount,
62 )
63 - m.addOptionalChart(s.Network.NumSlowDNSOperations,
63 + c.addOptionalChart(s.Network.NumSlowDNSOperations,
64 &chartNetworkSlowDNSResolutionsRate,
65 )
66 - m.addOptionalChart(s.Network.NumSlowSSLOperations,
66 + c.addOptionalChart(s.Network.NumSlowSSLOperations,
67 &chartNetworkSlowSSLHandshakesRate,
68 )
69 - m.addOptionalChart(s.Metrics.Cursor.TotalOpened,
69 + c.addOptionalChart(s.Metrics.Cursor.TotalOpened,
70 &chartCursorsOpenedRate,
71 )
72 - m.addOptionalChart(s.Metrics.Cursor.TimedOut,
72 + c.addOptionalChart(s.Metrics.Cursor.TimedOut,
73 &chartCursorsTimedOutRate,
74 )
75 - m.addOptionalChart(s.Metrics.Cursor.Open.Total,
75 + c.addOptionalChart(s.Metrics.Cursor.Open.Total,
76 &chartCursorsOpenCount,
77 )
78 - m.addOptionalChart(s.Metrics.Cursor.Open.NoTimeout,
78 + c.addOptionalChart(s.Metrics.Cursor.Open.NoTimeout,
79 &chartCursorsOpenNoTimeoutCount,
80 )
81 - m.addOptionalChart(s.Metrics.Cursor.Lifespan,
81 + c.addOptionalChart(s.Metrics.Cursor.Lifespan,
82 &chartCursorsByLifespanCount,
83 )
84
85 if s.Transactions != nil {
86 - m.addOptionalChart(s.Transactions,
86 + c.addOptionalChart(s.Transactions,
87 &chartTransactionsCount,
88 &chartTransactionsRate,
89 )
90 - m.addOptionalChart(s.Transactions.CommitTypes,
90 + c.addOptionalChart(s.Transactions.CommitTypes,
91 &chartTransactionsNoShardsCommitsRate,
92 &chartTransactionsNoShardsCommitsDurationTime,
93 &chartTransactionsSingleShardCommitsRate,
@@ -103,27 +103,27 @@ func (m *Mongo) addOptionalCharts(s *documentServerStatus) {
103 )
104 }
105 if s.Locks != nil {
106 - m.addOptionalChart(s.Locks.Global, &chartGlobalLockAcquisitionsRate)
107 - m.addOptionalChart(s.Locks.Database, &chartDatabaseLockAcquisitionsRate)
108 - m.addOptionalChart(s.Locks.Collection, &chartCollectionLockAcquisitionsRate)
109 - m.addOptionalChart(s.Locks.Mutex, &chartMutexLockAcquisitionsRate)
110 - m.addOptionalChart(s.Locks.Metadata, &chartMetadataLockAcquisitionsRate)
111 - m.addOptionalChart(s.Locks.Oplog, &chartOpLogLockAcquisitionsRate)
106 + c.addOptionalChart(s.Locks.Global, &chartGlobalLockAcquisitionsRate)
107 + c.addOptionalChart(s.Locks.Database, &chartDatabaseLockAcquisitionsRate)
108 + c.addOptionalChart(s.Locks.Collection, &chartCollectionLockAcquisitionsRate)
109 + c.addOptionalChart(s.Locks.Mutex, &chartMutexLockAcquisitionsRate)
110 + c.addOptionalChart(s.Locks.Metadata, &chartMetadataLockAcquisitionsRate)
111 + c.addOptionalChart(s.Locks.Oplog, &chartOpLogLockAcquisitionsRate)
112 }
113 }
114
115 -func (m *Mongo) addOptionalChart(iface any, charts ...*module.Chart) {
115 +func (c *Collector) addOptionalChart(iface any, charts ...*module.Chart) {
116 if reflect.ValueOf(iface).IsNil() {
117 return
118 }
119 for _, chart := range charts {
120 - if m.optionalCharts[chart.ID] {
120 + if c.optionalCharts[chart.ID] {
121 continue
122 }
123 - m.optionalCharts[chart.ID] = true
123 + c.optionalCharts[chart.ID] = true
124
125 - if err := m.charts.Add(chart.Copy()); err != nil {
126 - m.Warning(err)
125 + if err := c.charts.Add(chart.Copy()); err != nil {
126 + c.Warning(err)
127 }
128 }
129 }
src/go/plugin/go.d/collector/mongodb/collect_sharding.go
+19 -19
@@ -9,8 +9,8 @@ import (
9 "github.com/netdata/netdata/go/plugins/plugin/go.d/agent/module"
10 )
11
12 -func (m *Mongo) collectSharding(mx map[string]int64) error {
13 - nodes, err := m.conn.shardNodes()
12 +func (c *Collector) collectSharding(mx map[string]int64) error {
13 + nodes, err := c.conn.shardNodes()
14 if err != nil {
15 return err
16 }
@@ -18,7 +18,7 @@ func (m *Mongo) collectSharding(mx map[string]int64) error {
18 mx["shard_nodes_aware"] = nodes.ShardAware
19 mx["shard_nodes_unaware"] = nodes.ShardUnaware
20
21 - dbPart, err := m.conn.shardDatabasesPartitioning()
21 + dbPart, err := c.conn.shardDatabasesPartitioning()
22 if err != nil {
23 return err
24 }
@@ -26,7 +26,7 @@ func (m *Mongo) collectSharding(mx map[string]int64) error {
26 mx["shard_databases_partitioned"] = dbPart.Partitioned
27 mx["shard_databases_unpartitioned"] = dbPart.UnPartitioned
28
29 - collPart, err := m.conn.shardCollectionsPartitioning()
29 + collPart, err := c.conn.shardCollectionsPartitioning()
30 if err != nil {
31 return err
32 }
@@ -34,7 +34,7 @@ func (m *Mongo) collectSharding(mx map[string]int64) error {
34 mx["shard_collections_partitioned"] = collPart.Partitioned
35 mx["shard_collections_unpartitioned"] = collPart.UnPartitioned
36
37 - chunksPerShard, err := m.conn.shardChunks()
37 + chunksPerShard, err := c.conn.shardChunks()
38 if err != nil {
39 return err
40 }
@@ -47,23 +47,23 @@ func (m *Mongo) collectSharding(mx map[string]int64) error {
47 }
48
49 for id := range seen {
50 - if !m.shards[id] {
51 - m.shards[id] = true
52 - m.addShardCharts(id)
50 + if !c.shards[id] {
51 + c.shards[id] = true
52 + c.addShardCharts(id)
53 }
54 }
55
56 - for id := range m.shards {
56 + for id := range c.shards {
57 if !seen[id] {
58 - delete(m.shards, id)
59 - m.removeShardCharts(id)
58 + delete(c.shards, id)
59 + c.removeShardCharts(id)
60 }
61 }
62
63 return nil
64 }
65
66 -func (m *Mongo) addShardCharts(id string) {
66 +func (c *Collector) addShardCharts(id string) {
67 charts := chartsTmplShardingShard.Copy()
68
69 for _, chart := range *charts {
@@ -76,16 +76,16 @@ func (m *Mongo) addShardCharts(id string) {
76 }
77 }
78
79 - if err := m.Charts().Add(*charts...); err != nil {
80 - m.Warning(err)
79 + if err := c.Charts().Add(*charts...); err != nil {
80 + c.Warning(err)
81 }
82
83 }
84
85 -func (m *Mongo) removeShardCharts(id string) {
85 +func (c *Collector) removeShardCharts(id string) {
86 px := fmt.Sprintf("%s%s_", chartPxShard, id)
87
88 - for _, chart := range *m.Charts() {
88 + for _, chart := range *c.Charts() {
89 if strings.HasPrefix(chart.ID, px) {
90 chart.MarkRemove()
91 chart.MarkNotCreated()
@@ -93,10 +93,10 @@ func (m *Mongo) removeShardCharts(id string) {
93 }
94 }
95
96 -func (m *Mongo) addShardingCharts() {
96 +func (c *Collector) addShardingCharts() {
97 charts := chartsSharding.Copy()
98
99 - if err := m.Charts().Add(*charts...); err != nil {
100 - m.Warning(err)
99 + if err := c.Charts().Add(*charts...); err != nil {
100 + c.Warning(err)
101 }
102 }
src/go/plugin/go.d/collector/mongodb/collector.go renamed
+20 -20
@@ -25,8 +25,8 @@ func init() {
25 })
26 }
27
28 -func New() *Mongo {
29 - return &Mongo{
28 +func New() *Collector {
29 + return &Collector{
30 Config: Config{
31 URI: "mongodb://localhost:27017",
32 Timeout: confopt.Duration(time.Second),
@@ -55,7 +55,7 @@ type Config struct {
55 Databases matcher.SimpleExpr `yaml:"databases,omitempty" json:"databases"`
56 }
57
58 -type Mongo struct {
58 +type Collector struct {
59 module.Base
60 Config `yaml:",inline" json:""`
61
@@ -71,24 +71,24 @@ type Mongo struct {
71 shards map[string]bool
72 }
73
74 -func (m *Mongo) Configuration() any {
75 - return m.Config
74 +func (c *Collector) Configuration() any {
75 + return c.Config
76 }
77
78 -func (m *Mongo) Init() error {
79 - if err := m.verifyConfig(); err != nil {
78 +func (c *Collector) Init() error {
79 + if err := c.verifyConfig(); err != nil {
80 return fmt.Errorf("config validation: %v", err)
81 }
82
83 - if err := m.initDatabaseSelector(); err != nil {
83 + if err := c.initDatabaseSelector(); err != nil {
84 return fmt.Errorf("init database selector: %v", err)
85 }
86
87 return nil
88 }
89
90 -func (m *Mongo) Check() error {
91 - mx, err := m.collect()
90 +func (c *Collector) Check() error {
91 + mx, err := c.collect()
92 if err != nil {
93 return err
94 }
@@ -98,29 +98,29 @@ func (m *Mongo) Check() error {
98 return nil
99 }
100
101 -func (m *Mongo) Charts() *module.Charts {
102 - return m.charts
101 +func (c *Collector) Charts() *module.Charts {
102 + return c.charts
103 }
104
105 -func (m *Mongo) Collect() map[string]int64 {
106 - mx, err := m.collect()
105 +func (c *Collector) Collect() map[string]int64 {
106 + mx, err := c.collect()
107 if err != nil {
108 - m.Error(err)
108 + c.Error(err)
109 }
110
111 if len(mx) == 0 {
112 - m.Warning("no values collected")
112 + c.Warning("no values collected")
113 return nil
114 }
115
116 return mx
117 }
118
119 -func (m *Mongo) Cleanup() {
120 - if m.conn == nil {
119 +func (c *Collector) Cleanup() {
120 + if c.conn == nil {
121 return
122 }
123 - if err := m.conn.close(); err != nil {
124 - m.Warningf("cleanup: error on closing mongo conn: %v", err)
123 + if err := c.conn.close(); err != nil {
124 + c.Warningf("cleanup: error on closing mongo conn: %v", err)
125 }
126 }
src/go/plugin/go.d/collector/mongodb/collector_test.go renamed
+37 -37
@@ -39,11 +39,11 @@ func Test_testDataIsValid(t *testing.T) {
39 }
40 }
41
42 -func TestMongo_ConfigurationSerialize(t *testing.T) {
43 - module.TestConfigurationSerialize(t, &Mongo{}, dataConfigJSON, dataConfigYAML)
42 +func TestCollector_ConfigurationSerialize(t *testing.T) {
43 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
44 }
45
46 -func TestMongo_Init(t *testing.T) {
46 +func TestCollector_Init(t *testing.T) {
47 tests := map[string]struct {
48 config Config
49 wantFail bool
@@ -71,60 +71,60 @@ func TestMongo_Init(t *testing.T) {
71
72 for name, test := range tests {
73 t.Run(name, func(t *testing.T) {
74 - mongo := New()
75 - mongo.Config = test.config
74 + collr := New()
75 + collr.Config = test.config
76
77 if test.wantFail {
78 - assert.Error(t, mongo.Init())
78 + assert.Error(t, collr.Init())
79 } else {
80 - assert.NoError(t, mongo.Init())
80 + assert.NoError(t, collr.Init())
81 }
82 })
83 }
84 }
85
86 -func TestMongo_Charts(t *testing.T) {
86 +func TestCollector_Charts(t *testing.T) {
87 assert.NotNil(t, New().Charts())
88 }
89
90 -func TestMongo_Cleanup(t *testing.T) {
90 +func TestCollector_Cleanup(t *testing.T) {
91 tests := map[string]struct {
92 - prepare func(t *testing.T) *Mongo
92 + prepare func(t *testing.T) *Collector
93 wantClose bool
94 }{
95 "client not initialized": {
96 wantClose: false,
97 - prepare: func(t *testing.T) *Mongo {
97 + prepare: func(t *testing.T) *Collector {
98 return New()
99 },
100 },
101 "client initialized": {
102 wantClose: true,
103 - prepare: func(t *testing.T) *Mongo {
104 - mongo := New()
105 - mongo.conn = caseMongod()
106 - _ = mongo.conn.initClient("", 0)
103 + prepare: func(t *testing.T) *Collector {
104 + collr := New()
105 + collr.conn = caseMongod()
106 + _ = collr.conn.initClient("", 0)
107
108 - return mongo
108 + return collr
109 },
110 },
111 }
112
113 for name, test := range tests {
114 t.Run(name, func(t *testing.T) {
115 - mongo := test.prepare(t)
115 + collr := test.prepare(t)
116
117 - require.NotPanics(t, mongo.Cleanup)
117 + require.NotPanics(t, collr.Cleanup)
118 if test.wantClose {
119 - mock, ok := mongo.conn.(*mockMongoClient)
119 + collr, ok := collr.conn.(*mockMongoClient)
120 require.True(t, ok)
121 - assert.True(t, mock.closeCalled)
121 + assert.True(t, collr.closeCalled)
122 }
123 })
124 }
125 }
126
127 -func TestMongo_Check(t *testing.T) {
127 +func TestCollector_Check(t *testing.T) {
128 tests := map[string]struct {
129 prepare func() *mockMongoClient
130 wantFail bool
@@ -145,22 +145,22 @@ func TestMongo_Check(t *testing.T) {
145
146 for name, test := range tests {
147 t.Run(name, func(t *testing.T) {
148 - mongo := prepareMongo()
149 - defer mongo.Cleanup()
150 - mongo.conn = test.prepare()
148 + collr := prepareMongo()
149 + defer collr.Cleanup()
150 + collr.conn = test.prepare()
151
152 - require.NoError(t, mongo.Init())
152 + require.NoError(t, collr.Init())
153
154 if test.wantFail {
155 - assert.Error(t, mongo.Check())
155 + assert.Error(t, collr.Check())
156 } else {
157 - assert.NoError(t, mongo.Check())
157 + assert.NoError(t, collr.Check())
158 }
159 })
160 }
161 }
162
163 -func TestMongo_Collect(t *testing.T) {
163 +func TestCollector_Collect(t *testing.T) {
164 tests := map[string]struct {
165 prepare func() *mockMongoClient
166 wantCollected map[string]int64
@@ -596,23 +596,23 @@ func TestMongo_Collect(t *testing.T) {
596
597 for name, test := range tests {
598 t.Run(name, func(t *testing.T) {
599 - mongo := prepareMongo()
600 - defer mongo.Cleanup()
601 - mongo.conn = test.prepare()
599 + collr := prepareMongo()
600 + defer collr.Cleanup()
601 + collr.conn = test.prepare()
602
603 - require.NoError(t, mongo.Init())
603 + require.NoError(t, collr.Init())
604
605 - mx := mongo.Collect()
605 + mx := collr.Collect()
606
607 assert.Equal(t, test.wantCollected, mx)
608 })
609 }
610 }
611
612 -func prepareMongo() *Mongo {
613 - m := New()
614 - m.Databases = matcher.SimpleExpr{Includes: []string{"* *"}}
615 - return m
612 +func prepareMongo() *Collector {
613 + collr := New()
614 + collr.Databases = matcher.SimpleExpr{Includes: []string{"* *"}}
615 + return collr
616 }
617
618 func caseMongodReplicaSet() *mockMongoClient {
src/go/plugin/go.d/collector/mongodb/init.go
+6 -6
@@ -6,24 +6,24 @@ import (
6 "errors"
7 )
8
9 -func (m *Mongo) verifyConfig() error {
10 - if m.URI == "" {
9 +func (c *Collector) verifyConfig() error {
10 + if c.URI == "" {
11 return errors.New("connection URI is empty")
12 }
13
14 return nil
15 }
16
17 -func (m *Mongo) initDatabaseSelector() error {
18 - if m.Databases.Empty() {
17 +func (c *Collector) initDatabaseSelector() error {
18 + if c.Databases.Empty() {
19 return nil
20 }
21
22 - sr, err := m.Databases.Parse()
22 + sr, err := c.Databases.Parse()
23 if err != nil {
24 return err
25 }
26 - m.dbSelector = sr
26 + c.dbSelector = sr
27
28 return nil
29 }
src/go/plugin/go.d/collector/monit/charts.go
+5 -5
@@ -53,7 +53,7 @@ var (
53 }
54 )
55
56 -func (m *Monit) addServiceCheckCharts(svc statusServiceCheck, srv *statusServer) {
56 +func (c *Collector) addServiceCheckCharts(svc statusServiceCheck, srv *statusServer) {
57 charts := serviceCheckChartsTmpl.Copy()
58
59 for _, chart := range *charts {
@@ -68,16 +68,16 @@ func (m *Monit) addServiceCheckCharts(svc statusServiceCheck, srv *statusServer)
68 }
69 }
70
71 - if err := m.Charts().Add(*charts...); err != nil {
72 - m.Warning(err)
71 + if err := c.Charts().Add(*charts...); err != nil {
72 + c.Warning(err)
73 }
74 }
75
76 -func (m *Monit) removeServiceCharts(svc statusServiceCheck) {
76 +func (c *Collector) removeServiceCharts(svc statusServiceCheck) {
77 px := fmt.Sprintf("service_check_type_%s_name_%s_", svc.svcType(), svc.Name)
78 px = cleanChartId(px)
79
80 - for _, chart := range *m.Charts() {
80 + for _, chart := range *c.Charts() {
81 if strings.HasPrefix(chart.ID, px) {
82 chart.MarkRemove()
83 chart.MarkNotCreated()
src/go/plugin/go.d/collector/monit/collect.go
+14 -14
@@ -18,25 +18,25 @@ var (
18 urlQueryStatus = url.Values{"format": {"xml"}, "level": {"full"}}.Encode()
19 )
20
21 -func (m *Monit) collect() (map[string]int64, error) {
21 +func (c *Collector) collect() (map[string]int64, error) {
22 mx := make(map[string]int64)
23
24 - if err := m.collectStatus(mx); err != nil {
24 + if err := c.collectStatus(mx); err != nil {
25 return nil, err
26 }
27
28 return mx, nil
29 }
30
31 -func (m *Monit) collectStatus(mx map[string]int64) error {
32 - status, err := m.fetchStatus()
31 +func (c *Collector) collectStatus(mx map[string]int64) error {
32 + status, err := c.fetchStatus()
33 if err != nil {
34 return err
35 }
36
37 if status.Server == nil {
38 // not Monit
39 - return errors.New("invalid Monit status response: missing server data")
39 + return errors.New("invalid Collector status response: missing server data")
40 }
41
42 mx["uptime"] = status.Server.Uptime
@@ -46,9 +46,9 @@ func (m *Monit) collectStatus(mx map[string]int64) error {
46 for _, svc := range status.Services {
47 seen[svc.id()] = true
48
49 - if _, ok := m.seenServices[svc.id()]; !ok {
50 - m.seenServices[svc.id()] = svc
51 - m.addServiceCheckCharts(svc, status.Server)
49 + if _, ok := c.seenServices[svc.id()]; !ok {
50 + c.seenServices[svc.id()] = svc
51 + c.addServiceCheckCharts(svc, status.Server)
52 }
53
54 px := fmt.Sprintf("service_check_type_%s_name_%s_status_", svc.svcType(), svc.Name)
@@ -61,25 +61,25 @@ func (m *Monit) collectStatus(mx map[string]int64) error {
61 }
62 }
63
64 - for id, svc := range m.seenServices {
64 + for id, svc := range c.seenServices {
65 if !seen[id] {
66 - delete(m.seenServices, id)
67 - m.removeServiceCharts(svc)
66 + delete(c.seenServices, id)
67 + c.removeServiceCharts(svc)
68 }
69 }
70
71 return nil
72 }
73
74 -func (m *Monit) fetchStatus() (*monitStatus, error) {
75 - req, err := web.NewHTTPRequestWithPath(m.RequestConfig, urlPathStatus)
74 +func (c *Collector) fetchStatus() (*monitStatus, error) {
75 + req, err := web.NewHTTPRequestWithPath(c.RequestConfig, urlPathStatus)
76 if err != nil {
77 return nil, err
78 }
79 req.URL.RawQuery = urlQueryStatus
80
81 var status monitStatus
82 - if err := web.DoHTTP(m.httpClient).RequestXML(req, &status, func(d *xml.Decoder) {
82 + if err := web.DoHTTP(c.httpClient).RequestXML(req, &status, func(d *xml.Decoder) {
83 d.CharsetReader = charset.NewReaderLabel
84 }); err != nil {
85 return nil, err
src/go/plugin/go.d/collector/monit/collector.go renamed
+21 -21
@@ -25,8 +25,8 @@ func init() {
25 })
26 }
27
28 -func New() *Monit {
29 - return &Monit{
28 +func New() *Collector {
29 + return &Collector{
30 Config: Config{
31 HTTPConfig: web.HTTPConfig{
32 RequestConfig: web.RequestConfig{
@@ -49,7 +49,7 @@ type Config struct {
49 web.HTTPConfig `yaml:",inline" json:""`
50 }
51
52 -type Monit struct {
52 +type Collector struct {
53 module.Base
54 Config `yaml:",inline" json:""`
55
@@ -60,29 +60,29 @@ type Monit struct {
60 seenServices map[string]statusServiceCheck
61 }
62
63 -func (m *Monit) Configuration() any {
64 - return m.Config
63 +func (c *Collector) Configuration() any {
64 + return c.Config
65 }
66
67 -func (m *Monit) Init() error {
68 - if m.URL == "" {
67 +func (c *Collector) Init() error {
68 + if c.URL == "" {
69 return fmt.Errorf("config: monit url is required but not set")
70 }
71
72 - httpClient, err := web.NewHTTPClient(m.ClientConfig)
72 + httpClient, err := web.NewHTTPClient(c.ClientConfig)
73 if err != nil {
74 return fmt.Errorf("init HTTP client: %v", err)
75 }
76 - m.httpClient = httpClient
76 + c.httpClient = httpClient
77
78 - m.Debugf("using URL %s", m.URL)
79 - m.Debugf("using timeout: %s", m.Timeout)
78 + c.Debugf("using URL %s", c.URL)
79 + c.Debugf("using timeout: %s", c.Timeout)
80
81 return nil
82 }
83
84 -func (m *Monit) Check() error {
85 - mx, err := m.collect()
84 +func (c *Collector) Check() error {
85 + mx, err := c.collect()
86 if err != nil {
87 return err
88 }
@@ -93,14 +93,14 @@ func (m *Monit) Check() error {
93 return nil
94 }
95
96 -func (m *Monit) Charts() *module.Charts {
97 - return m.charts
96 +func (c *Collector) Charts() *module.Charts {
97 + return c.charts
98 }
99
100 -func (m *Monit) Collect() map[string]int64 {
101 - mx, err := m.collect()
100 +func (c *Collector) Collect() map[string]int64 {
101 + mx, err := c.collect()
102 if err != nil {
103 - m.Error(err)
103 + c.Error(err)
104 }
105
106 if len(mx) == 0 {
@@ -109,8 +109,8 @@ func (m *Monit) Collect() map[string]int64 {
109 return mx
110 }
111
112 -func (m *Monit) Cleanup() {
113 - if m.httpClient != nil {
114 - m.httpClient.CloseIdleConnections()
112 +func (c *Collector) Cleanup() {
113 + if c.httpClient != nil {
114 + c.httpClient.CloseIdleConnections()
115 }
116 }
src/go/plugin/go.d/collector/monit/collector_test.go renamed
+45 -45
@@ -33,11 +33,11 @@ func Test_testDataIsValid(t *testing.T) {
33 }
34 }
35
36 -func TestMonit_ConfigurationSerialize(t *testing.T) {
37 - module.TestConfigurationSerialize(t, &Monit{}, dataConfigJSON, dataConfigYAML)
36 +func TestCollector_ConfigurationSerialize(t *testing.T) {
37 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
38 }
39
40 -func TestMonit_Init(t *testing.T) {
40 +func TestCollector_Init(t *testing.T) {
41 tests := map[string]struct {
42 wantFail bool
43 config Config
@@ -58,22 +58,22 @@ func TestMonit_Init(t *testing.T) {
58
59 for name, test := range tests {
60 t.Run(name, func(t *testing.T) {
61 - monit := New()
62 - monit.Config = test.config
61 + collr := New()
62 + collr.Config = test.config
63
64 if test.wantFail {
65 - assert.Error(t, monit.Init())
65 + assert.Error(t, collr.Init())
66 } else {
67 - assert.NoError(t, monit.Init())
67 + assert.NoError(t, collr.Init())
68 }
69 })
70 }
71 }
72
73 -func TestMonit_Check(t *testing.T) {
73 +func TestCollector_Check(t *testing.T) {
74 tests := map[string]struct {
75 wantFail bool
76 - prepare func(t *testing.T) (monit *Monit, cleanup func())
76 + prepare func(t *testing.T) (monit *Collector, cleanup func())
77 }{
78 "success on valid response": {
79 wantFail: false,
@@ -99,25 +99,25 @@ func TestMonit_Check(t *testing.T) {
99
100 for name, test := range tests {
101 t.Run(name, func(t *testing.T) {
102 - monit, cleanup := test.prepare(t)
102 + collr, cleanup := test.prepare(t)
103 defer cleanup()
104
105 if test.wantFail {
106 - assert.Error(t, monit.Check())
106 + assert.Error(t, collr.Check())
107 } else {
108 - assert.NoError(t, monit.Check())
108 + assert.NoError(t, collr.Check())
109 }
110 })
111 }
112 }
113
114 -func TestMonit_Charts(t *testing.T) {
114 +func TestCollector_Charts(t *testing.T) {
115 assert.NotNil(t, New().Charts())
116 }
117
118 -func TestMonit_Collect(t *testing.T) {
118 +func TestCollector_Collect(t *testing.T) {
119 tests := map[string]struct {
120 - prepare func(t *testing.T) (monit *Monit, cleanup func())
120 + prepare func(t *testing.T) (monit *Collector, cleanup func())
121 wantNumOfCharts int
122 wantMetrics map[string]int64
123 }{
@@ -252,24 +252,24 @@ func TestMonit_Collect(t *testing.T) {
252
253 for name, test := range tests {
254 t.Run(name, func(t *testing.T) {
255 - monit, cleanup := test.prepare(t)
255 + collr, cleanup := test.prepare(t)
256 defer cleanup()
257
258 - _ = monit.Check()
258 + _ = collr.Check()
259
260 - mx := monit.Collect()
260 + mx := collr.Collect()
261
262 require.Equal(t, test.wantMetrics, mx)
263
264 if len(test.wantMetrics) > 0 {
265 - module.TestMetricsHasAllChartsDims(t, monit.Charts(), mx)
266 - assert.Equal(t, test.wantNumOfCharts, len(*monit.Charts()), "want number of charts")
265 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
266 + assert.Equal(t, test.wantNumOfCharts, len(*collr.Charts()), "want number of charts")
267 }
268 })
269 }
270 }
271
272 -func caseOk(t *testing.T) (*Monit, func()) {
272 +func caseOk(t *testing.T) (*Collector, func()) {
273 t.Helper()
274 srv := httptest.NewServer(http.HandlerFunc(
275 func(w http.ResponseWriter, r *http.Request) {
@@ -279,14 +279,14 @@ func caseOk(t *testing.T) (*Monit, func()) {
279 }
280 _, _ = w.Write(dataStatus)
281 }))
282 - monit := New()
283 - monit.URL = srv.URL
284 - require.NoError(t, monit.Init())
282 + collr := New()
283 + collr.URL = srv.URL
284 + require.NoError(t, collr.Init())
285
286 - return monit, srv.Close
286 + return collr, srv.Close
287 }
288
289 -func caseUnexpectedXMLResponse(t *testing.T) (*Monit, func()) {
289 +func caseUnexpectedXMLResponse(t *testing.T) (*Collector, func()) {
290 t.Helper()
291 data := `<?xml version="1.0" encoding="UTF-8"?>
292 <Response>
@@ -328,44 +328,44 @@ func caseUnexpectedXMLResponse(t *testing.T) (*Monit, func()) {
328 func(w http.ResponseWriter, r *http.Request) {
329 _, _ = w.Write([]byte(data))
330 }))
331 - monit := New()
332 - monit.URL = srv.URL
333 - require.NoError(t, monit.Init())
331 + collr := New()
332 + collr.URL = srv.URL
333 + require.NoError(t, collr.Init())
334
335 - return monit, srv.Close
335 + return collr, srv.Close
336 }
337
338 -func caseInvalidDataResponse(t *testing.T) (*Monit, func()) {
338 +func caseInvalidDataResponse(t *testing.T) (*Collector, func()) {
339 t.Helper()
340 srv := httptest.NewServer(http.HandlerFunc(
341 func(w http.ResponseWriter, r *http.Request) {
342 _, _ = w.Write([]byte("hello and\n goodbye"))
343 }))
344 - monit := New()
345 - monit.URL = srv.URL
346 - require.NoError(t, monit.Init())
344 + collr := New()
345 + collr.URL = srv.URL
346 + require.NoError(t, collr.Init())
347
348 - return monit, srv.Close
348 + return collr, srv.Close
349 }
350
351 -func caseConnectionRefused(t *testing.T) (*Monit, func()) {
351 +func caseConnectionRefused(t *testing.T) (*Collector, func()) {
352 t.Helper()
353 - monit := New()
354 - monit.URL = "http://127.0.0.1:65001"
355 - require.NoError(t, monit.Init())
353 + collr := New()
354 + collr.URL = "http://127.0.0.1:65001"
355 + require.NoError(t, collr.Init())
356
357 - return monit, func() {}
357 + return collr, func() {}
358 }
359
360 -func case404(t *testing.T) (*Monit, func()) {
360 +func case404(t *testing.T) (*Collector, func()) {
361 t.Helper()
362 srv := httptest.NewServer(http.HandlerFunc(
363 func(w http.ResponseWriter, r *http.Request) {
364 w.WriteHeader(http.StatusNotFound)
365 }))
366 - monit := New()
367 - monit.URL = srv.URL
368 - require.NoError(t, monit.Init())
366 + collr := New()
367 + collr.URL = srv.URL
368 + require.NoError(t, collr.Init())
369
370 - return monit, srv.Close
370 + return collr, srv.Close
371 }
src/go/plugin/go.d/collector/mysql/charts.go
+30 -30
@@ -1172,68 +1172,68 @@ var (
1172 }
1173 )
1174
1175 -func (m *MySQL) addSlaveReplicationConnCharts(conn string) {
1175 +func (c *Collector) addSlaveReplicationConnCharts(conn string) {
1176 var charts *module.Charts
1177 if conn == "" {
1178 charts = chartsSlaveReplication.Copy()
1179 } else {
1180 charts = newSlaveReplConnCharts(conn)
1181 }
1182 - if err := m.Charts().Add(*charts...); err != nil {
1183 - m.Warning(err)
1182 + if err := c.Charts().Add(*charts...); err != nil {
1183 + c.Warning(err)
1184 }
1185 }
1186
1187 -func (m *MySQL) addUserStatisticsCharts(user string) {
1188 - if m.isPercona {
1189 - if err := m.Charts().Add(*newPerconaUserStatisticsCharts(user)...); err != nil {
1190 - m.Warning(err)
1187 +func (c *Collector) addUserStatisticsCharts(user string) {
1188 + if c.isPercona {
1189 + if err := c.Charts().Add(*newPerconaUserStatisticsCharts(user)...); err != nil {
1190 + c.Warning(err)
1191 }
1192 } else {
1193 - if err := m.Charts().Add(*newMariaDBUserStatisticsCharts(user)...); err != nil {
1194 - m.Warning(err)
1193 + if err := c.Charts().Add(*newMariaDBUserStatisticsCharts(user)...); err != nil {
1194 + c.Warning(err)
1195 }
1196 }
1197 }
1198
1199 -func (m *MySQL) addInnoDBOSLogCharts() {
1200 - if err := m.Charts().Add(*chartsInnoDBOSLog.Copy()...); err != nil {
1201 - m.Warning(err)
1199 +func (c *Collector) addInnoDBOSLogCharts() {
1200 + if err := c.Charts().Add(*chartsInnoDBOSLog.Copy()...); err != nil {
1201 + c.Warning(err)
1202 }
1203 }
1204
1205 -func (m *MySQL) addMyISAMCharts() {
1206 - if err := m.Charts().Add(*chartsMyISAM.Copy()...); err != nil {
1207 - m.Warning(err)
1205 +func (c *Collector) addMyISAMCharts() {
1206 + if err := c.Charts().Add(*chartsMyISAM.Copy()...); err != nil {
1207 + c.Warning(err)
1208 }
1209 }
1210
1211 -func (m *MySQL) addBinlogCharts() {
1212 - if err := m.Charts().Add(*chartsBinlog.Copy()...); err != nil {
1213 - m.Warning(err)
1211 +func (c *Collector) addBinlogCharts() {
1212 + if err := c.Charts().Add(*chartsBinlog.Copy()...); err != nil {
1213 + c.Warning(err)
1214 }
1215 }
1216
1217 -func (m *MySQL) addInnodbDeadlocksChart() {
1218 - if err := m.Charts().Add(chartInnoDBDeadlocks.Copy()); err != nil {
1219 - m.Warning(err)
1217 +func (c *Collector) addInnodbDeadlocksChart() {
1218 + if err := c.Charts().Add(chartInnoDBDeadlocks.Copy()); err != nil {
1219 + c.Warning(err)
1220 }
1221 }
1222
1223 -func (m *MySQL) addQCacheCharts() {
1224 - if err := m.Charts().Add(*chartsQCache.Copy()...); err != nil {
1225 - m.Warning(err)
1223 +func (c *Collector) addQCacheCharts() {
1224 + if err := c.Charts().Add(*chartsQCache.Copy()...); err != nil {
1225 + c.Warning(err)
1226 }
1227 }
1228
1229 -func (m *MySQL) addGaleraCharts() {
1230 - if err := m.Charts().Add(*chartsGalera.Copy()...); err != nil {
1231 - m.Warning(err)
1229 +func (c *Collector) addGaleraCharts() {
1230 + if err := c.Charts().Add(*chartsGalera.Copy()...); err != nil {
1231 + c.Warning(err)
1232 }
1233 }
1234
1235 -func (m *MySQL) addTableOpenCacheOverflowChart() {
1236 - if err := m.Charts().Add(chartTableOpenCacheOverflows.Copy()); err != nil {
1237 - m.Warning(err)
1235 +func (c *Collector) addTableOpenCacheOverflowChart() {
1236 + if err := c.Charts().Add(chartTableOpenCacheOverflows.Copy()); err != nil {
1237 + c.Warning(err)
1238 }
1239 }
src/go/plugin/go.d/collector/mysql/collect.go
+40 -40
@@ -14,100 +14,100 @@ import (
14 "github.com/blang/semver/v4"
15 )
16
17 -func (m *MySQL) collect() (map[string]int64, error) {
18 - if m.db == nil {
19 - if err := m.openConnection(); err != nil {
17 +func (c *Collector) collect() (map[string]int64, error) {
18 + if c.db == nil {
19 + if err := c.openConnection(); err != nil {
20 return nil, err
21 }
22 }
23 - if m.version == nil {
24 - if err := m.collectVersion(); err != nil {
23 + if c.version == nil {
24 + if err := c.collectVersion(); err != nil {
25 return nil, fmt.Errorf("error on collecting version: %v", err)
26 }
27 // https://mariadb.com/kb/en/user-statistics/
28 - m.doUserStatistics = m.isPercona || m.isMariaDB && m.version.GTE(semver.Version{Major: 10, Minor: 1, Patch: 1})
28 + c.doUserStatistics = c.isPercona || c.isMariaDB && c.version.GTE(semver.Version{Major: 10, Minor: 1, Patch: 1})
29 }
30
31 - m.disableSessionQueryLog()
31 + c.disableSessionQueryLog()
32
33 mx := make(map[string]int64)
34
35 - if err := m.collectGlobalStatus(mx); err != nil {
35 + if err := c.collectGlobalStatus(mx); err != nil {
36 return nil, fmt.Errorf("error on collecting global status: %v", err)
37 }
38
39 if hasInnodbOSLog(mx) {
40 - m.addInnoDBOSLogOnce.Do(m.addInnoDBOSLogCharts)
40 + c.addInnoDBOSLogOnce.Do(c.addInnoDBOSLogCharts)
41 }
42 if hasInnodbDeadlocks(mx) {
43 - m.addInnodbDeadlocksOnce.Do(m.addInnodbDeadlocksChart)
43 + c.addInnodbDeadlocksOnce.Do(c.addInnodbDeadlocksChart)
44 }
45 if hasQCacheMetrics(mx) {
46 - m.addQCacheOnce.Do(m.addQCacheCharts)
46 + c.addQCacheOnce.Do(c.addQCacheCharts)
47 }
48 if hasGaleraMetrics(mx) {
49 - m.addGaleraOnce.Do(m.addGaleraCharts)
49 + c.addGaleraOnce.Do(c.addGaleraCharts)
50 }
51 if hasTableOpenCacheOverflowsMetrics(mx) {
52 - m.addTableOpenCacheOverflowsOnce.Do(m.addTableOpenCacheOverflowChart)
52 + c.addTableOpenCacheOverflowsOnce.Do(c.addTableOpenCacheOverflowChart)
53 }
54
55 now := time.Now()
56 - if now.Sub(m.recheckGlobalVarsTime) > m.recheckGlobalVarsEvery {
57 - if err := m.collectGlobalVariables(); err != nil {
56 + if now.Sub(c.recheckGlobalVarsTime) > c.recheckGlobalVarsEvery {
57 + if err := c.collectGlobalVariables(); err != nil {
58 return nil, fmt.Errorf("error on collecting global variables: %v", err)
59 }
60 }
61 - mx["max_connections"] = m.varMaxConns
62 - mx["table_open_cache"] = m.varTableOpenCache
61 + mx["max_connections"] = c.varMaxConns
62 + mx["table_open_cache"] = c.varTableOpenCache
63
64 - if m.isMariaDB || !strings.Contains(m.varDisabledStorageEngine, "MyISAM") {
65 - m.addMyISAMOnce.Do(m.addMyISAMCharts)
64 + if c.isMariaDB || !strings.Contains(c.varDisabledStorageEngine, "MyISAM") {
65 + c.addMyISAMOnce.Do(c.addMyISAMCharts)
66 }
67 - if m.varLogBin != "OFF" {
68 - m.addBinlogOnce.Do(m.addBinlogCharts)
67 + if c.varLogBin != "OFF" {
68 + c.addBinlogOnce.Do(c.addBinlogCharts)
69 }
70
71 // TODO: perhaps make a decisions based on privileges? (SHOW GRANTS FOR CURRENT_USER();)
72 - if m.doSlaveStatus {
73 - if err := m.collectSlaveStatus(mx); err != nil {
74 - m.Warningf("error on collecting slave status: %v", err)
75 - m.doSlaveStatus = errors.Is(err, context.DeadlineExceeded)
72 + if c.doSlaveStatus {
73 + if err := c.collectSlaveStatus(mx); err != nil {
74 + c.Warningf("error on collecting slave status: %v", err)
75 + c.doSlaveStatus = errors.Is(err, context.DeadlineExceeded)
76 }
77 }
78
79 - if m.doUserStatistics {
80 - if err := m.collectUserStatistics(mx); err != nil {
81 - m.Warningf("error on collecting user statistics: %v", err)
82 - m.doUserStatistics = errors.Is(err, context.DeadlineExceeded)
79 + if c.doUserStatistics {
80 + if err := c.collectUserStatistics(mx); err != nil {
81 + c.Warningf("error on collecting user statistics: %v", err)
82 + c.doUserStatistics = errors.Is(err, context.DeadlineExceeded)
83 }
84 }
85
86 - if err := m.collectProcessListStatistics(mx); err != nil {
87 - m.Errorf("error on collecting process list statistics: %v", err)
86 + if err := c.collectProcessListStatistics(mx); err != nil {
87 + c.Errorf("error on collecting process list statistics: %v", err)
88 }
89
90 calcThreadCacheMisses(mx)
91 return mx, nil
92 }
93
94 -func (m *MySQL) openConnection() error {
95 - db, err := sql.Open("mysql", m.DSN)
94 +func (c *Collector) openConnection() error {
95 + db, err := sql.Open("mysql", c.DSN)
96 if err != nil {
97 - return fmt.Errorf("error on opening a connection with the mysql database [%s]: %v", m.safeDSN, err)
97 + return fmt.Errorf("error on opening a connection with the mysql database [%s]: %v", c.safeDSN, err)
98 }
99
100 db.SetConnMaxLifetime(10 * time.Minute)
101
102 - ctx, cancel := context.WithTimeout(context.Background(), m.Timeout.Duration())
102 + ctx, cancel := context.WithTimeout(context.Background(), c.Timeout.Duration())
103 defer cancel()
104
105 if err := db.PingContext(ctx); err != nil {
106 _ = db.Close()
107 - return fmt.Errorf("error on pinging the mysql database [%s]: %v", m.safeDSN, err)
107 + return fmt.Errorf("error on pinging the mysql database [%s]: %v", c.safeDSN, err)
108 }
109
110 - m.db = db
110 + c.db = db
111 return nil
112 }
113
@@ -146,12 +146,12 @@ func hasTableOpenCacheOverflowsMetrics(collected map[string]int64) bool {
146 return ok
147 }
148
149 -func (m *MySQL) collectQuery(query string, assign func(column, value string, lineEnd bool)) (duration int64, err error) {
150 - ctx, cancel := context.WithTimeout(context.Background(), m.Timeout.Duration())
149 +func (c *Collector) collectQuery(query string, assign func(column, value string, lineEnd bool)) (duration int64, err error) {
150 + ctx, cancel := context.WithTimeout(context.Background(), c.Timeout.Duration())
151 defer cancel()
152
153 s := time.Now()
154 - rows, err := m.db.QueryContext(ctx, query)
154 + rows, err := c.db.QueryContext(ctx, query)
155 if err != nil {
156 return 0, err
157 }
src/go/plugin/go.d/collector/mysql/collect_global_status.go
+3 -3
@@ -10,14 +10,14 @@ import (
10
11 const queryShowGlobalStatus = "SHOW GLOBAL STATUS;"
12
13 -func (m *MySQL) collectGlobalStatus(mx map[string]int64) error {
13 +func (c *Collector) collectGlobalStatus(mx map[string]int64) error {
14 // MariaDB: https://mariadb.com/kb/en/server-status-variables/
15 // MySQL: https://dev.mysql.com/doc/refman/8.0/en/server-status-variable-reference.html
16 q := queryShowGlobalStatus
17 - m.Debugf("executing query: '%s'", q)
17 + c.Debugf("executing query: '%s'", q)
18
19 var name string
20 - _, err := m.collectQuery(q, func(column, value string, _ bool) {
20 + _, err := c.collectQuery(q, func(column, value string, _ bool) {
21 switch column {
22 case "Variable_name":
23 name = value
src/go/plugin/go.d/collector/mysql/collect_global_vars.go
+8 -8
@@ -13,29 +13,29 @@ WHERE
13 OR Variable_name LIKE 'performance_schema';`
14 )
15
16 -func (m *MySQL) collectGlobalVariables() error {
16 +func (c *Collector) collectGlobalVariables() error {
17 // MariaDB: https://mariadb.com/kb/en/server-system-variables/
18 // MySQL: https://dev.mysql.com/doc/refman/8.0/en/server-system-variable-reference.html
19 q := queryShowGlobalVariables
20 - m.Debugf("executing query: '%s'", q)
20 + c.Debugf("executing query: '%s'", q)
21
22 var name string
23 - _, err := m.collectQuery(q, func(column, value string, _ bool) {
23 + _, err := c.collectQuery(q, func(column, value string, _ bool) {
24 switch column {
25 case "Variable_name":
26 name = value
27 case "Value":
28 switch name {
29 case "disabled_storage_engines":
30 - m.varDisabledStorageEngine = value
30 + c.varDisabledStorageEngine = value
31 case "log_bin":
32 - m.varLogBin = value
32 + c.varLogBin = value
33 case "max_connections":
34 - m.varMaxConns = parseInt(value)
34 + c.varMaxConns = parseInt(value)
35 case "performance_schema":
36 - m.varPerformanceSchema = value
36 + c.varPerformanceSchema = value
37 case "table_open_cache":
38 - m.varTableOpenCache = parseInt(value)
38 + c.varTableOpenCache = parseInt(value)
39 }
40 }
41 })
src/go/plugin/go.d/collector/mysql/collect_process_list.go
+4 -4
@@ -39,19 +39,19 @@ ORDER BY
39 time;`
40 )
41
42 -func (m *MySQL) collectProcessListStatistics(mx map[string]int64) error {
42 +func (c *Collector) collectProcessListStatistics(mx map[string]int64) error {
43 var q string
44 mysqlMinVer := semver.Version{Major: 8, Minor: 0, Patch: 22}
45 - if !m.isMariaDB && m.version.GTE(mysqlMinVer) && m.varPerformanceSchema == "ON" {
45 + if !c.isMariaDB && c.version.GTE(mysqlMinVer) && c.varPerformanceSchema == "ON" {
46 q = queryShowProcessListPS
47 } else {
48 q = queryShowProcessList
49 }
50 - m.Debugf("executing query: '%s'", q)
50 + c.Debugf("executing query: '%s'", q)
51
52 var maxTime int64 // slowest query milliseconds in process list
53
54 - duration, err := m.collectQuery(q, func(column, value string, _ bool) {
54 + duration, err := c.collectQuery(q, func(column, value string, _ bool) {
55 switch column {
56 case "time":
57 maxTime = parseInt(value)
src/go/plugin/go.d/collector/mysql/collect_slave_status.go
+8 -8
@@ -14,19 +14,19 @@ const (
14 queryShowAllSlavesStatus = "SHOW ALL SLAVES STATUS;"
15 )
16
17 -func (m *MySQL) collectSlaveStatus(mx map[string]int64) error {
17 +func (c *Collector) collectSlaveStatus(mx map[string]int64) error {
18 // https://mariadb.com/docs/reference/es/sql-statements/SHOW_ALL_SLAVES_STATUS/
19 mariaDBMinVer := semver.Version{Major: 10, Minor: 2, Patch: 0}
20 mysqlMinVer := semver.Version{Major: 8, Minor: 0, Patch: 22}
21 var q string
22 - if m.isMariaDB && m.version.GTE(mariaDBMinVer) {
22 + if c.isMariaDB && c.version.GTE(mariaDBMinVer) {
23 q = queryShowAllSlavesStatus
24 - } else if !m.isMariaDB && m.version.GTE(mysqlMinVer) {
24 + } else if !c.isMariaDB && c.version.GTE(mysqlMinVer) {
25 q = queryShowReplicaStatus
26 } else {
27 q = queryShowSlaveStatus
28 }
29 - m.Debugf("executing query: '%s'", q)
29 + c.Debugf("executing query: '%s'", q)
30
31 v := struct {
32 name string
@@ -35,7 +35,7 @@ func (m *MySQL) collectSlaveStatus(mx map[string]int64) error {
35 ioRunning int64
36 }{}
37
38 - _, err := m.collectQuery(q, func(column, value string, lineEnd bool) {
38 + _, err := c.collectQuery(q, func(column, value string, lineEnd bool) {
39 switch column {
40 case "Connection_name", "Channel_Name":
41 v.name = value
@@ -47,9 +47,9 @@ func (m *MySQL) collectSlaveStatus(mx map[string]int64) error {
47 v.ioRunning = parseInt(convertSlaveIORunning(value))
48 }
49 if lineEnd {
50 - if !m.collectedReplConns[v.name] {
51 - m.collectedReplConns[v.name] = true
52 - m.addSlaveReplicationConnCharts(v.name)
50 + if !c.collectedReplConns[v.name] {
51 + c.collectedReplConns[v.name] = true
52 + c.addSlaveReplicationConnCharts(v.name)
53 }
54 s := strings.ToLower(slaveMetricSuffix(v.name))
55 mx["seconds_behind_master"+s] = v.behindMaster
src/go/plugin/go.d/collector/mysql/collect_user_statistics.go
+6 -6
@@ -8,21 +8,21 @@ import (
8
9 const queryShowUserStatistics = "SHOW USER_STATISTICS;"
10
11 -func (m *MySQL) collectUserStatistics(mx map[string]int64) error {
11 +func (c *Collector) collectUserStatistics(mx map[string]int64) error {
12 // https://mariadb.com/kb/en/user-statistics/
13 // https://mariadb.com/kb/en/information-schema-user_statistics-table/
14 q := queryShowUserStatistics
15 - m.Debugf("executing query: '%s'", q)
15 + c.Debugf("executing query: '%s'", q)
16
17 var user, prefix string
18 - _, err := m.collectQuery(q, func(column, value string, _ bool) {
18 + _, err := c.collectQuery(q, func(column, value string, _ bool) {
19 switch column {
20 case "User":
21 user = value
22 prefix = "userstats_" + user + "_"
23 - if !m.collectedUsers[user] {
24 - m.collectedUsers[user] = true
25 - m.addUserStatisticsCharts(user)
23 + if !c.collectedUsers[user] {
24 + c.collectedUsers[user] = true
25 + c.addUserStatisticsCharts(user)
26 }
27 case "Cpu_time":
28 mx[strings.ToLower(prefix+column)] = int64(parseFloat(value) * 1000)
src/go/plugin/go.d/collector/mysql/collect_version.go
+7 -7
@@ -18,13 +18,13 @@ WHERE
18
19 var reVersionCore = regexp.MustCompile(`^\d+\.\d+\.\d+`)
20
21 -func (m *MySQL) collectVersion() error {
21 +func (c *Collector) collectVersion() error {
22 // https://mariadb.com/kb/en/version/
23 q := queryShowVersion
24 - m.Debugf("executing query: '%s'", queryShowVersion)
24 + c.Debugf("executing query: '%s'", queryShowVersion)
25
26 var name, version, versionComment string
27 - _, err := m.collectQuery(q, func(column, value string, _ bool) {
27 + _, err := c.collectQuery(q, func(column, value string, _ bool) {
28 switch column {
29 case "Variable_name":
30 name = value
@@ -41,7 +41,7 @@ func (m *MySQL) collectVersion() error {
41 return err
42 }
43
44 - m.Infof("application version: '%s', version_comment: '%s'", version, versionComment)
44 + c.Infof("application version: '%s', version_comment: '%s'", version, versionComment)
45
46 // version string is not always valid semver (ex.: 8.0.22-0ubuntu0.20.04.2)
47 s := reVersionCore.FindString(version)
@@ -54,9 +54,9 @@ func (m *MySQL) collectVersion() error {
54 return fmt.Errorf("couldn't parse version string '%s': %v", s, err)
55 }
56
57 - m.version = ver
58 - m.isMariaDB = strings.Contains(version, "MariaDB") || strings.Contains(versionComment, "mariadb")
59 - m.isPercona = strings.Contains(versionComment, "Percona")
57 + c.version = ver
58 + c.isMariaDB = strings.Contains(version, "MariaDB") || strings.Contains(versionComment, "mariadb")
59 + c.isPercona = strings.Contains(versionComment, "Percona")
60
61 return nil
62 }
src/go/plugin/go.d/collector/mysql/collector.go renamed
+25 -25
@@ -30,8 +30,8 @@ func init() {
30 })
31 }
32
33 -func New() *MySQL {
34 - return &MySQL{
33 +func New() *Collector {
34 + return &Collector{
35 Config: Config{
36 DSN: "root@tcp(localhost:3306)/",
37 Timeout: confopt.Duration(time.Second),
@@ -62,7 +62,7 @@ type Config struct {
62 Timeout confopt.Duration `yaml:"timeout,omitempty" json:"timeout"`
63 }
64
65 -type MySQL struct {
65 +type Collector struct {
66 module.Base
67 Config `yaml:",inline" json:""`
68
@@ -98,38 +98,38 @@ type MySQL struct {
98 varPerformanceSchema string
99 }
100
101 -func (m *MySQL) Configuration() any {
102 - return m.Config
101 +func (c *Collector) Configuration() any {
102 + return c.Config
103 }
104
105 -func (m *MySQL) Init() error {
106 - if m.MyCNF != "" {
107 - dsn, err := dsnFromFile(m.MyCNF)
105 +func (c *Collector) Init() error {
106 + if c.MyCNF != "" {
107 + dsn, err := dsnFromFile(c.MyCNF)
108 if err != nil {
109 return err
110 }
111 - m.DSN = dsn
111 + c.DSN = dsn
112 }
113
114 - if m.DSN == "" {
114 + if c.DSN == "" {
115 return errors.New("config: dsn not set")
116 }
117
118 - cfg, err := mysql.ParseDSN(m.DSN)
118 + cfg, err := mysql.ParseDSN(c.DSN)
119 if err != nil {
120 return fmt.Errorf("error on parsing DSN: %v", err)
121 }
122
123 cfg.Passwd = strings.Repeat("x", len(cfg.Passwd))
124 - m.safeDSN = cfg.FormatDSN()
124 + c.safeDSN = cfg.FormatDSN()
125
126 - m.Debugf("using DSN [%s]", m.DSN)
126 + c.Debugf("using DSN [%s]", c.DSN)
127
128 return nil
129 }
130
131 -func (m *MySQL) Check() error {
132 - mx, err := m.collect()
131 +func (c *Collector) Check() error {
132 + mx, err := c.collect()
133 if err != nil {
134 return err
135 }
@@ -139,14 +139,14 @@ func (m *MySQL) Check() error {
139 return nil
140 }
141
142 -func (m *MySQL) Charts() *module.Charts {
143 - return m.charts
142 +func (c *Collector) Charts() *module.Charts {
143 + return c.charts
144 }
145
146 -func (m *MySQL) Collect() map[string]int64 {
147 - mx, err := m.collect()
146 +func (c *Collector) Collect() map[string]int64 {
147 + mx, err := c.collect()
148 if err != nil {
149 - m.Error(err)
149 + c.Error(err)
150 }
151
152 if len(mx) == 0 {
@@ -155,12 +155,12 @@ func (m *MySQL) Collect() map[string]int64 {
155 return mx
156 }
157
158 -func (m *MySQL) Cleanup() {
159 - if m.db == nil {
158 +func (c *Collector) Cleanup() {
159 + if c.db == nil {
160 return
161 }
162 - if err := m.db.Close(); err != nil {
163 - m.Errorf("cleanup: error on closing the mysql database [%s]: %v", m.safeDSN, err)
162 + if err := c.db.Close(); err != nil {
163 + c.Errorf("cleanup: error on closing the mysql database [%s]: %v", c.safeDSN, err)
164 }
165 - m.db = nil
165 + c.db = nil
166 }
src/go/plugin/go.d/collector/mysql/collector_test.go renamed
+58 -58
@@ -96,11 +96,11 @@ func Test_testDataIsValid(t *testing.T) {
96 }
97 }
98
99 -func TestMySQL_ConfigurationSerialize(t *testing.T) {
100 - module.TestConfigurationSerialize(t, &MySQL{}, dataConfigJSON, dataConfigYAML)
99 +func TestCollector_ConfigurationSerialize(t *testing.T) {
100 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
101 }
102
103 -func TestMySQL_Init(t *testing.T) {
103 +func TestCollector_Init(t *testing.T) {
104 tests := map[string]struct {
105 config Config
106 wantFail bool
@@ -113,52 +113,52 @@ func TestMySQL_Init(t *testing.T) {
113
114 for name, test := range tests {
115 t.Run(name, func(t *testing.T) {
116 - mySQL := New()
117 - mySQL.Config = test.config
116 + collr := New()
117 + collr.Config = test.config
118
119 if test.wantFail {
120 - assert.Error(t, mySQL.Init())
120 + assert.Error(t, collr.Init())
121 } else {
122 - assert.NoError(t, mySQL.Init())
122 + assert.NoError(t, collr.Init())
123 }
124 })
125 }
126 }
127
128 -func TestMySQL_Cleanup(t *testing.T) {
129 - tests := map[string]func(t *testing.T) (mySQL *MySQL, cleanup func()){
130 - "db connection not initialized": func(t *testing.T) (mySQL *MySQL, cleanup func()) {
128 +func TestCollector_Cleanup(t *testing.T) {
129 + tests := map[string]func(t *testing.T) (collr *Collector, cleanup func()){
130 + "db connection not initialized": func(t *testing.T) (collr *Collector, cleanup func()) {
131 return New(), func() {}
132 },
133 - "db connection initialized": func(t *testing.T) (mySQL *MySQL, cleanup func()) {
133 + "db connection initialized": func(t *testing.T) (collr *Collector, cleanup func()) {
134 db, mock, err := sqlmock.New()
135 require.NoError(t, err)
136
137 mock.ExpectClose()
138 - mySQL = New()
139 - mySQL.db = db
138 + collr = New()
139 + collr.db = db
140 cleanup = func() { _ = db.Close() }
141
142 - return mySQL, cleanup
142 + return collr, cleanup
143 },
144 }
145
146 for name, prepare := range tests {
147 t.Run(name, func(t *testing.T) {
148 - mySQL, cleanup := prepare(t)
148 + collr, cleanup := prepare(t)
149 defer cleanup()
150
151 - assert.NotPanics(t, mySQL.Cleanup)
152 - assert.Nil(t, mySQL.db)
151 + assert.NotPanics(t, collr.Cleanup)
152 + assert.Nil(t, collr.db)
153 })
154 }
155 }
156
157 -func TestMySQL_Charts(t *testing.T) {
157 +func TestCollector_Charts(t *testing.T) {
158 assert.NotNil(t, New().Charts())
159 }
160
161 -func TestMySQL_Check(t *testing.T) {
161 +func TestCollector_Check(t *testing.T) {
162 tests := map[string]struct {
163 prepareMock func(t *testing.T, m sqlmock.Sqlmock)
164 wantFail bool
@@ -253,28 +253,28 @@ func TestMySQL_Check(t *testing.T) {
253 sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual),
254 )
255 require.NoError(t, err)
256 - my := New()
257 - my.db = db
256 + collr := New()
257 + collr.db = db
258 defer func() { _ = db.Close() }()
259
260 - require.NoError(t, my.Init())
260 + require.NoError(t, collr.Init())
261
262 test.prepareMock(t, mock)
263
264 if test.wantFail {
265 - assert.Error(t, my.Check())
265 + assert.Error(t, collr.Check())
266 } else {
267 - assert.NoError(t, my.Check())
267 + assert.NoError(t, collr.Check())
268 }
269 assert.NoError(t, mock.ExpectationsWereMet())
270 })
271 }
272 }
273
274 -func TestMySQL_Collect(t *testing.T) {
274 +func TestCollector_Collect(t *testing.T) {
275 type testCaseStep struct {
276 prepareMock func(t *testing.T, m sqlmock.Sqlmock)
277 - check func(t *testing.T, my *MySQL)
277 + check func(t *testing.T, my *Collector)
278 }
279 tests := map[string][]testCaseStep{
280 "MariaDB-Standalone[v5.5.46]: success on all queries": {
@@ -289,8 +289,8 @@ func TestMySQL_Collect(t *testing.T) {
289 mockExpect(t, m, queryShowSlaveStatus, nil)
290 mockExpect(t, m, queryShowProcessList, dataMariaVer5564ProcessList)
291 },
292 - check: func(t *testing.T, my *MySQL) {
293 - mx := my.Collect()
292 + check: func(t *testing.T, collr *Collector) {
293 + mx := collr.Collect()
294
295 expected := map[string]int64{
296 "aborted_connects": 0,
@@ -407,7 +407,7 @@ func TestMySQL_Collect(t *testing.T) {
407
408 copyProcessListQueryDuration(mx, expected)
409 require.Equal(t, expected, mx)
410 - ensureCollectedHasAllChartsDimsVarsIDs(t, my, mx)
410 + ensureCollectedHasAllChartsDimsVarsIDs(t, collr, mx)
411 },
412 },
413 },
@@ -424,8 +424,8 @@ func TestMySQL_Collect(t *testing.T) {
424 mockExpect(t, m, queryShowUserStatistics, dataMariaVer1084UserStatistics)
425 mockExpect(t, m, queryShowProcessList, dataMariaVer1084ProcessList)
426 },
427 - check: func(t *testing.T, my *MySQL) {
428 - mx := my.Collect()
427 + check: func(t *testing.T, collr *Collector) {
428 + mx := collr.Collect()
429
430 expected := map[string]int64{
431
@@ -589,7 +589,7 @@ func TestMySQL_Collect(t *testing.T) {
589
590 copyProcessListQueryDuration(mx, expected)
591 require.Equal(t, expected, mx)
592 - ensureCollectedHasAllChartsDimsVarsIDs(t, my, mx)
592 + ensureCollectedHasAllChartsDimsVarsIDs(t, collr, mx)
593 },
594 },
595 },
@@ -606,8 +606,8 @@ func TestMySQL_Collect(t *testing.T) {
606 mockExpect(t, m, queryShowUserStatistics, dataMariaVer1084UserStatistics)
607 mockExpect(t, m, queryShowProcessList, dataMariaVer1084ProcessList)
608 },
609 - check: func(t *testing.T, my *MySQL) {
610 - mx := my.Collect()
609 + check: func(t *testing.T, collr *Collector) {
610 + mx := collr.Collect()
611
612 expected := map[string]int64{
613 "aborted_connects": 2,
@@ -773,7 +773,7 @@ func TestMySQL_Collect(t *testing.T) {
773
774 copyProcessListQueryDuration(mx, expected)
775 require.Equal(t, expected, mx)
776 - ensureCollectedHasAllChartsDimsVarsIDs(t, my, mx)
776 + ensureCollectedHasAllChartsDimsVarsIDs(t, collr, mx)
777 },
778 },
779 },
@@ -790,8 +790,8 @@ func TestMySQL_Collect(t *testing.T) {
790 mockExpect(t, m, queryShowUserStatistics, dataMariaVer1084UserStatistics)
791 mockExpect(t, m, queryShowProcessList, dataMariaVer1084ProcessList)
792 },
793 - check: func(t *testing.T, my *MySQL) {
794 - mx := my.Collect()
793 + check: func(t *testing.T, collr *Collector) {
794 + mx := collr.Collect()
795
796 expected := map[string]int64{
797 "aborted_connects": 2,
@@ -960,7 +960,7 @@ func TestMySQL_Collect(t *testing.T) {
960
961 copyProcessListQueryDuration(mx, expected)
962 require.Equal(t, expected, mx)
963 - ensureCollectedHasAllChartsDimsVarsIDs(t, my, mx)
963 + ensureCollectedHasAllChartsDimsVarsIDs(t, collr, mx)
964 },
965 },
966 },
@@ -977,8 +977,8 @@ func TestMySQL_Collect(t *testing.T) {
977 mockExpect(t, m, queryShowUserStatistics, dataMariaVer1084UserStatistics)
978 mockExpect(t, m, queryShowProcessList, dataMariaVer1084ProcessList)
979 },
980 - check: func(t *testing.T, my *MySQL) {
981 - mx := my.Collect()
980 + check: func(t *testing.T, collr *Collector) {
981 + mx := collr.Collect()
982
983 expected := map[string]int64{
984 "aborted_connects": 2,
@@ -1141,7 +1141,7 @@ func TestMySQL_Collect(t *testing.T) {
1141
1142 copyProcessListQueryDuration(mx, expected)
1143 require.Equal(t, expected, mx)
1144 - ensureCollectedHasAllChartsDimsVarsIDs(t, my, mx)
1144 + ensureCollectedHasAllChartsDimsVarsIDs(t, collr, mx)
1145 },
1146 },
1147 },
@@ -1158,8 +1158,8 @@ func TestMySQL_Collect(t *testing.T) {
1158 mockExpect(t, m, queryShowUserStatistics, dataMariaGaleraClusterVer1084UserStatistics)
1159 mockExpect(t, m, queryShowProcessList, dataMariaGaleraClusterVer1084ProcessList)
1160 },
1161 - check: func(t *testing.T, my *MySQL) {
1162 - mx := my.Collect()
1161 + check: func(t *testing.T, collr *Collector) {
1162 + mx := collr.Collect()
1163
1164 expected := map[string]int64{
1165 "aborted_connects": 0,
@@ -1338,7 +1338,7 @@ func TestMySQL_Collect(t *testing.T) {
1338
1339 copyProcessListQueryDuration(mx, expected)
1340 require.Equal(t, expected, mx)
1341 - ensureCollectedHasAllChartsDimsVarsIDs(t, my, mx)
1341 + ensureCollectedHasAllChartsDimsVarsIDs(t, collr, mx)
1342 },
1343 },
1344 },
@@ -1354,8 +1354,8 @@ func TestMySQL_Collect(t *testing.T) {
1354 mockExpect(t, m, queryShowReplicaStatus, dataMySQLVer8030ReplicaStatusMultiSource)
1355 mockExpect(t, m, queryShowProcessListPS, dataMySQLVer8030ProcessList)
1356 },
1357 - check: func(t *testing.T, my *MySQL) {
1358 - mx := my.Collect()
1357 + check: func(t *testing.T, collr *Collector) {
1358 + mx := collr.Collect()
1359
1360 expected := map[string]int64{
1361 "aborted_connects": 0,
@@ -1476,7 +1476,7 @@ func TestMySQL_Collect(t *testing.T) {
1476
1477 copyProcessListQueryDuration(mx, expected)
1478 require.Equal(t, expected, mx)
1479 - ensureCollectedHasAllChartsDimsVarsIDs(t, my, mx)
1479 + ensureCollectedHasAllChartsDimsVarsIDs(t, collr, mx)
1480 },
1481 },
1482 },
@@ -1493,8 +1493,8 @@ func TestMySQL_Collect(t *testing.T) {
1493 mockExpect(t, m, queryShowUserStatistics, dataPerconaVer8029UserStatistics)
1494 mockExpect(t, m, queryShowProcessListPS, dataPerconaV8029ProcessList)
1495 },
1496 - check: func(t *testing.T, my *MySQL) {
1497 - mx := my.Collect()
1496 + check: func(t *testing.T, collr *Collector) {
1497 + mx := collr.Collect()
1498
1499 expected := map[string]int64{
1500 "aborted_connects": 1,
@@ -1637,7 +1637,7 @@ func TestMySQL_Collect(t *testing.T) {
1637
1638 copyProcessListQueryDuration(mx, expected)
1639 require.Equal(t, expected, mx)
1640 - ensureCollectedHasAllChartsDimsVarsIDs(t, my, mx)
1640 + ensureCollectedHasAllChartsDimsVarsIDs(t, collr, mx)
1641 },
1642 },
1643 },
@@ -1649,16 +1649,16 @@ func TestMySQL_Collect(t *testing.T) {
1649 sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual),
1650 )
1651 require.NoError(t, err)
1652 - my := New()
1653 - my.db = db
1652 + collr := New()
1653 + collr.db = db
1654 defer func() { _ = db.Close() }()
1655
1656 - require.NoError(t, my.Init())
1656 + require.NoError(t, collr.Init())
1657
1658 for i, step := range test {
1659 t.Run(fmt.Sprintf("step[%d]", i), func(t *testing.T) {
1660 step.prepareMock(t, mock)
1661 - step.check(t, my)
1661 + step.check(t, collr)
1662 })
1663 }
1664 assert.NoError(t, mock.ExpectationsWereMet())
@@ -1666,11 +1666,11 @@ func TestMySQL_Collect(t *testing.T) {
1666 }
1667 }
1668
1669 -func ensureCollectedHasAllChartsDimsVarsIDs(t *testing.T, mySQL *MySQL, mx map[string]int64) {
1670 - module.TestMetricsHasAllChartsDimsSkip(t, mySQL.Charts(), mx, func(chart *module.Chart, _ *module.Dim) bool {
1671 - if mySQL.isMariaDB {
1669 +func ensureCollectedHasAllChartsDimsVarsIDs(t *testing.T, collr *Collector, mx map[string]int64) {
1670 + module.TestMetricsHasAllChartsDimsSkip(t, collr.Charts(), mx, func(chart *module.Chart, _ *module.Dim) bool {
1671 + if collr.isMariaDB {
1672 // https://mariadb.com/kb/en/server-status-variables/#connection_errors_accept
1673 - if mySQL.version.LT(semver.Version{Major: 10, Minor: 0, Patch: 4}) && chart.ID == "connection_errors" {
1673 + if collr.version.LT(semver.Version{Major: 10, Minor: 0, Patch: 4}) && chart.ID == "connection_errors" {
1674 return true
1675 }
1676 }
src/go/plugin/go.d/collector/mysql/disable_logging.go
+12 -12
@@ -15,13 +15,13 @@ const (
15 queryDisableSessionSlowQueryLog = "SET SESSION slow_query_log='OFF';"
16 )
17
18 -func (m *MySQL) disableSessionQueryLog() {
18 +func (c *Collector) disableSessionQueryLog() {
19 q := queryShowSessionVariables
20 - m.Debugf("executing query: '%s'", q)
20 + c.Debugf("executing query: '%s'", q)
21
22 var sqlLogOff, slowQueryLog string
23 var name string
24 - _, err := m.collectQuery(q, func(column, value string, _ bool) {
24 + _, err := c.collectQuery(q, func(column, value string, _ bool) {
25 switch column {
26 case "Variable_name":
27 name = value
@@ -35,24 +35,24 @@ func (m *MySQL) disableSessionQueryLog() {
35 }
36 })
37 if err != nil {
38 - m.Debug(err)
38 + c.Debug(err)
39 return
40 }
41
42 - if sqlLogOff == "OFF" && m.doDisableSessionQueryLog {
42 + if sqlLogOff == "OFF" && c.doDisableSessionQueryLog {
43 // requires SUPER privileges
44 q = queryDisableSessionQueryLog
45 - m.Debugf("executing query: '%s'", q)
46 - if _, err := m.collectQuery(q, func(_, _ string, _ bool) {}); err != nil {
47 - m.Infof("failed to disable session query log (sql_log_off): %v", err)
48 - m.doDisableSessionQueryLog = false
45 + c.Debugf("executing query: '%s'", q)
46 + if _, err := c.collectQuery(q, func(_, _ string, _ bool) {}); err != nil {
47 + c.Infof("failed to disable session query log (sql_log_off): %v", err)
48 + c.doDisableSessionQueryLog = false
49 }
50 }
51 if slowQueryLog == "ON" {
52 q = queryDisableSessionSlowQueryLog
53 - m.Debugf("executing query: '%s'", q)
54 - if _, err := m.collectQuery(q, func(_, _ string, _ bool) {}); err != nil {
55 - m.Debugf("failed to disable session slow query log (slow_query_log): %v", err)
53 + c.Debugf("executing query: '%s'", q)
54 + if _, err := c.collectQuery(q, func(_, _ string, _ bool) {}); err != nil {
55 + c.Debugf("failed to disable session slow query log (slow_query_log): %v", err)
56 }
57 }
58 }
src/go/plugin/go.d/collector/nginx/collect.go
+4 -4
@@ -10,16 +10,16 @@ import (
10 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/web"
11 )
12
13 -func (n *Nginx) collect() (map[string]int64, error) {
14 - req, err := web.NewHTTPRequest(n.RequestConfig)
13 +func (c *Collector) collect() (map[string]int64, error) {
14 + req, err := web.NewHTTPRequest(c.RequestConfig)
15 if err != nil {
16 - return nil, fmt.Errorf("failed to create HTTP request to '%s': %w'", n.URL, err)
16 + return nil, fmt.Errorf("failed to create HTTP request to '%s': %w'", c.URL, err)
17 }
18
19 var status *stubStatus
20 var perr error
21
22 - if err := web.DoHTTP(n.httpClient).Request(req, func(body io.Reader) error {
22 + if err := web.DoHTTP(c.httpClient).Request(req, func(body io.Reader) error {
23 if status, perr = parseStubStatus(body); perr != nil {
24 return perr
25 }
src/go/plugin/go.d/collector/nginx/collector.go renamed
+21 -21
@@ -25,8 +25,8 @@ func init() {
25 })
26 }
27
28 -func New() *Nginx {
29 - return &Nginx{
28 +func New() *Collector {
29 + return &Collector{
30 Config: Config{
31 HTTPConfig: web.HTTPConfig{
32 RequestConfig: web.RequestConfig{
@@ -46,7 +46,7 @@ type Config struct {
46 web.HTTPConfig `yaml:",inline" json:""`
47 }
48
49 -type Nginx struct {
49 +type Collector struct {
50 module.Base
51 Config `yaml:",inline" json:""`
52
@@ -55,29 +55,29 @@ type Nginx struct {
55 httpClient *http.Client
56 }
57
58 -func (n *Nginx) Configuration() any {
59 - return n.Config
58 +func (c *Collector) Configuration() any {
59 + return c.Config
60 }
61
62 -func (n *Nginx) Init() error {
63 - if n.URL == "" {
62 +func (c *Collector) Init() error {
63 + if c.URL == "" {
64 return errors.New("nginx URL required but not set")
65 }
66
67 - httpClient, err := web.NewHTTPClient(n.ClientConfig)
67 + httpClient, err := web.NewHTTPClient(c.ClientConfig)
68 if err != nil {
69 return fmt.Errorf("failed initializing http client: %w", err)
70 }
71 - n.httpClient = httpClient
71 + c.httpClient = httpClient
72
73 - n.Debugf("using URL %s", n.URL)
74 - n.Debugf("using timeout: %s", n.Timeout)
73 + c.Debugf("using URL %s", c.URL)
74 + c.Debugf("using timeout: %s", c.Timeout)
75
76 return nil
77 }
78
79 -func (n *Nginx) Check() error {
80 - mx, err := n.collect()
79 +func (c *Collector) Check() error {
80 + mx, err := c.collect()
81 if err != nil {
82 return err
83 }
@@ -89,22 +89,22 @@ func (n *Nginx) Check() error {
89 return nil
90 }
91
92 -func (n *Nginx) Charts() *Charts {
93 - return n.charts
92 +func (c *Collector) Charts() *Charts {
93 + return c.charts
94 }
95
96 -func (n *Nginx) Collect() map[string]int64 {
97 - mx, err := n.collect()
96 +func (c *Collector) Collect() map[string]int64 {
97 + mx, err := c.collect()
98 if err != nil {
99 - n.Error(err)
99 + c.Error(err)
100 return nil
101 }
102
103 return mx
104 }
105
106 -func (n *Nginx) Cleanup() {
107 - if n.httpClient != nil {
108 - n.httpClient.CloseIdleConnections()
106 +func (c *Collector) Cleanup() {
107 + if c.httpClient != nil {
108 + c.httpClient.CloseIdleConnections()
109 }
110 }
src/go/plugin/go.d/collector/nginx/collector_test.go renamed
+39 -39
@@ -33,21 +33,21 @@ func Test_testDataIsValid(t *testing.T) {
33 }
34 }
35
36 -func TestNginx_ConfigurationSerialize(t *testing.T) {
37 - module.TestConfigurationSerialize(t, &Nginx{}, dataConfigJSON, dataConfigYAML)
36 +func TestCollector_ConfigurationSerialize(t *testing.T) {
37 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
38 }
39
40 -func TestNginx_Cleanup(t *testing.T) {
40 +func TestCollector_Cleanup(t *testing.T) {
41 New().Cleanup()
42 }
43
44 -func TestNginx_Init(t *testing.T) {
45 - job := New()
44 +func TestCollector_Init(t *testing.T) {
45 + collr := New()
46
47 - require.NoError(t, job.Init())
47 + require.NoError(t, collr.Init())
48 }
49
50 -func TestNginx_Check(t *testing.T) {
50 +func TestCollector_Check(t *testing.T) {
51 ts := httptest.NewServer(
52 http.HandlerFunc(
53 func(w http.ResponseWriter, r *http.Request) {
@@ -55,25 +55,25 @@ func TestNginx_Check(t *testing.T) {
55 }))
56 defer ts.Close()
57
58 - job := New()
59 - job.URL = ts.URL
60 - require.NoError(t, job.Init())
61 - assert.NoError(t, job.Check())
58 + collr := New()
59 + collr.URL = ts.URL
60 + require.NoError(t, collr.Init())
61 + assert.NoError(t, collr.Check())
62 }
63
64 -func TestNginx_CheckNG(t *testing.T) {
65 - job := New()
64 +func TestCollector_CheckNG(t *testing.T) {
65 + collr := New()
66
67 - job.URL = "http://127.0.0.1:38001/us"
68 - require.NoError(t, job.Init())
69 - assert.Error(t, job.Check())
67 + collr.URL = "http://127.0.0.1:38001/us"
68 + require.NoError(t, collr.Init())
69 + assert.Error(t, collr.Check())
70 }
71
72 -func TestNginx_Charts(t *testing.T) {
72 +func TestCollector_Charts(t *testing.T) {
73 assert.NotNil(t, New().Charts())
74 }
75
76 -func TestNginx_Collect(t *testing.T) {
76 +func TestCollector_Collect(t *testing.T) {
77 ts := httptest.NewServer(
78 http.HandlerFunc(
79 func(w http.ResponseWriter, r *http.Request) {
@@ -81,10 +81,10 @@ func TestNginx_Collect(t *testing.T) {
81 }))
82 defer ts.Close()
83
84 - job := New()
85 - job.URL = ts.URL
86 - require.NoError(t, job.Init())
87 - require.NoError(t, job.Check())
84 + collr := New()
85 + collr.URL = ts.URL
86 + require.NoError(t, collr.Init())
87 + require.NoError(t, collr.Check())
88
89 expected := map[string]int64{
90 "accepts": 36,
@@ -96,10 +96,10 @@ func TestNginx_Collect(t *testing.T) {
96 "writing": 1,
97 }
98
99 - assert.Equal(t, expected, job.Collect())
99 + assert.Equal(t, expected, collr.Collect())
100 }
101
102 -func TestNginx_CollectTengine(t *testing.T) {
102 +func TestCollector_CollectTengine(t *testing.T) {
103 ts := httptest.NewServer(
104 http.HandlerFunc(
105 func(w http.ResponseWriter, r *http.Request) {
@@ -107,10 +107,10 @@ func TestNginx_CollectTengine(t *testing.T) {
107 }))
108 defer ts.Close()
109
110 - job := New()
111 - job.URL = ts.URL
112 - require.NoError(t, job.Init())
113 - require.NoError(t, job.Check())
110 + collr := New()
111 + collr.URL = ts.URL
112 + require.NoError(t, collr.Init())
113 + require.NoError(t, collr.Check())
114
115 expected := map[string]int64{
116 "accepts": 1140,
@@ -123,10 +123,10 @@ func TestNginx_CollectTengine(t *testing.T) {
123 "writing": 1,
124 }
125
126 - assert.Equal(t, expected, job.Collect())
126 + assert.Equal(t, expected, collr.Collect())
127 }
128
129 -func TestNginx_InvalidData(t *testing.T) {
129 +func TestCollector_InvalidData(t *testing.T) {
130 ts := httptest.NewServer(
131 http.HandlerFunc(
132 func(w http.ResponseWriter, r *http.Request) {
@@ -134,13 +134,13 @@ func TestNginx_InvalidData(t *testing.T) {
134 }))
135 defer ts.Close()
136
137 - job := New()
138 - job.URL = ts.URL
139 - require.NoError(t, job.Init())
140 - assert.Error(t, job.Check())
137 + collr := New()
138 + collr.URL = ts.URL
139 + require.NoError(t, collr.Init())
140 + assert.Error(t, collr.Check())
141 }
142
143 -func TestNginx_404(t *testing.T) {
143 +func TestCollector_404(t *testing.T) {
144 ts := httptest.NewServer(
145 http.HandlerFunc(
146 func(w http.ResponseWriter, r *http.Request) {
@@ -148,8 +148,8 @@ func TestNginx_404(t *testing.T) {
148 }))
149 defer ts.Close()
150
151 - job := New()
152 - job.URL = ts.URL
153 - require.NoError(t, job.Init())
154 - assert.Error(t, job.Check())
151 + collr := New()
152 + collr.URL = ts.URL
153 + require.NoError(t, collr.Init())
154 + assert.Error(t, collr.Check())
155 }
src/go/plugin/go.d/collector/nginxplus/charts.go
+47 -47
@@ -756,7 +756,7 @@ var (
756 }
757 )
758
759 -func (n *NginxPlus) addHTTPCacheCharts(name string) {
759 +func (c *Collector) addHTTPCacheCharts(name string) {
760 charts := httpCacheChartsTmpl.Copy()
761
762 for _, chart := range *charts {
@@ -769,17 +769,17 @@ func (n *NginxPlus) addHTTPCacheCharts(name string) {
769 }
770 }
771
772 - if err := n.Charts().Add(*charts...); err != nil {
773 - n.Warning(err)
772 + if err := c.Charts().Add(*charts...); err != nil {
773 + c.Warning(err)
774 }
775 }
776
777 -func (n *NginxPlus) removeHTTPCacheCharts(name string) {
777 +func (c *Collector) removeHTTPCacheCharts(name string) {
778 px := fmt.Sprintf("http_cache_%s_", name)
779 - n.removeCharts(px)
779 + c.removeCharts(px)
780 }
781
782 -func (n *NginxPlus) addHTTPServerZoneCharts(zone string) {
782 +func (c *Collector) addHTTPServerZoneCharts(zone string) {
783 charts := httpServerZoneChartsTmpl.Copy()
784
785 for _, chart := range *charts {
@@ -792,17 +792,17 @@ func (n *NginxPlus) addHTTPServerZoneCharts(zone string) {
792 }
793 }
794
795 - if err := n.Charts().Add(*charts...); err != nil {
796 - n.Warning(err)
795 + if err := c.Charts().Add(*charts...); err != nil {
796 + c.Warning(err)
797 }
798 }
799
800 -func (n *NginxPlus) removeHTTPServerZoneCharts(zone string) {
800 +func (c *Collector) removeHTTPServerZoneCharts(zone string) {
801 px := fmt.Sprintf("http_server_zone_%s_", zone)
802 - n.removeCharts(px)
802 + c.removeCharts(px)
803 }
804
805 -func (n *NginxPlus) addHTTPLocationZoneCharts(zone string) {
805 +func (c *Collector) addHTTPLocationZoneCharts(zone string) {
806 charts := httpLocationZoneChartsTmpl.Copy()
807
808 for _, chart := range *charts {
@@ -815,17 +815,17 @@ func (n *NginxPlus) addHTTPLocationZoneCharts(zone string) {
815 }
816 }
817
818 - if err := n.Charts().Add(*charts...); err != nil {
819 - n.Warning(err)
818 + if err := c.Charts().Add(*charts...); err != nil {
819 + c.Warning(err)
820 }
821 }
822
823 -func (n *NginxPlus) removeHTTPLocationZoneCharts(zone string) {
823 +func (c *Collector) removeHTTPLocationZoneCharts(zone string) {
824 px := fmt.Sprintf("http_location_zone_%s_", zone)
825 - n.removeCharts(px)
825 + c.removeCharts(px)
826 }
827
828 -func (n *NginxPlus) addHTTPUpstreamCharts(name, zone string) {
828 +func (c *Collector) addHTTPUpstreamCharts(name, zone string) {
829 charts := httpUpstreamChartsTmpl.Copy()
830
831 for _, chart := range *charts {
@@ -839,17 +839,17 @@ func (n *NginxPlus) addHTTPUpstreamCharts(name, zone string) {
839 }
840 }
841
842 - if err := n.Charts().Add(*charts...); err != nil {
843 - n.Warning(err)
842 + if err := c.Charts().Add(*charts...); err != nil {
843 + c.Warning(err)
844 }
845 }
846
847 -func (n *NginxPlus) removeHTTPUpstreamCharts(name, zone string) {
847 +func (c *Collector) removeHTTPUpstreamCharts(name, zone string) {
848 px := fmt.Sprintf("http_upstream_%s_zone_%s", name, zone)
849 - n.removeCharts(px)
849 + c.removeCharts(px)
850 }
851
852 -func (n *NginxPlus) addHTTPUpstreamServerCharts(name, serverAddr, serverName, zone string) {
852 +func (c *Collector) addHTTPUpstreamServerCharts(name, serverAddr, serverName, zone string) {
853 charts := httpUpstreamServerChartsTmpl.Copy()
854
855 for _, chart := range *charts {
@@ -865,17 +865,17 @@ func (n *NginxPlus) addHTTPUpstreamServerCharts(name, serverAddr, serverName, zo
865 }
866 }
867
868 - if err := n.Charts().Add(*charts...); err != nil {
869 - n.Warning(err)
868 + if err := c.Charts().Add(*charts...); err != nil {
869 + c.Warning(err)
870 }
871 }
872
873 -func (n *NginxPlus) removeHTTPUpstreamServerCharts(name, serverAddr, zone string) {
873 +func (c *Collector) removeHTTPUpstreamServerCharts(name, serverAddr, zone string) {
874 px := fmt.Sprintf("http_upstream_%s_server_%s_zone_%s_", name, zone, serverAddr)
875 - n.removeCharts(px)
875 + c.removeCharts(px)
876 }
877
878 -func (n *NginxPlus) addStreamServerZoneCharts(zone string) {
878 +func (c *Collector) addStreamServerZoneCharts(zone string) {
879 charts := streamServerZoneChartsTmpl.Copy()
880
881 for _, chart := range *charts {
@@ -888,17 +888,17 @@ func (n *NginxPlus) addStreamServerZoneCharts(zone string) {
888 }
889 }
890
891 - if err := n.Charts().Add(*charts...); err != nil {
892 - n.Warning(err)
891 + if err := c.Charts().Add(*charts...); err != nil {
892 + c.Warning(err)
893 }
894 }
895
896 -func (n *NginxPlus) removeStreamServerZoneCharts(zone string) {
896 +func (c *Collector) removeStreamServerZoneCharts(zone string) {
897 px := fmt.Sprintf("stream_server_zone_%s_", zone)
898 - n.removeCharts(px)
898 + c.removeCharts(px)
899 }
900
901 -func (n *NginxPlus) addStreamUpstreamCharts(zone, name string) {
901 +func (c *Collector) addStreamUpstreamCharts(zone, name string) {
902 charts := streamUpstreamChartsTmpl.Copy()
903
904 for _, chart := range *charts {
@@ -912,17 +912,17 @@ func (n *NginxPlus) addStreamUpstreamCharts(zone, name string) {
912 }
913 }
914
915 - if err := n.Charts().Add(*charts...); err != nil {
916 - n.Warning(err)
915 + if err := c.Charts().Add(*charts...); err != nil {
916 + c.Warning(err)
917 }
918 }
919
920 -func (n *NginxPlus) removeStreamUpstreamCharts(name, zone string) {
920 +func (c *Collector) removeStreamUpstreamCharts(name, zone string) {
921 px := fmt.Sprintf("stream_upstream_%s_zone_%s_", name, zone)
922 - n.removeCharts(px)
922 + c.removeCharts(px)
923 }
924
925 -func (n *NginxPlus) addStreamUpstreamServerCharts(name, serverAddr, serverName, zone string) {
925 +func (c *Collector) addStreamUpstreamServerCharts(name, serverAddr, serverName, zone string) {
926 charts := streamUpstreamServerChartsTmpl.Copy()
927
928 for _, chart := range *charts {
@@ -938,17 +938,17 @@ func (n *NginxPlus) addStreamUpstreamServerCharts(name, serverAddr, serverName,
938 }
939 }
940
941 - if err := n.Charts().Add(*charts...); err != nil {
942 - n.Warning(err)
941 + if err := c.Charts().Add(*charts...); err != nil {
942 + c.Warning(err)
943 }
944 }
945
946 -func (n *NginxPlus) removeStreamUpstreamServerCharts(name, serverAddr, zone string) {
946 +func (c *Collector) removeStreamUpstreamServerCharts(name, serverAddr, zone string) {
947 px := fmt.Sprintf("stream_upstream_%s_server_%s_zone_%s", name, serverAddr, zone)
948 - n.removeCharts(px)
948 + c.removeCharts(px)
949 }
950
951 -func (n *NginxPlus) addResolverZoneCharts(zone string) {
951 +func (c *Collector) addResolverZoneCharts(zone string) {
952 charts := resolverZoneChartsTmpl.Copy()
953
954 for _, chart := range *charts {
@@ -961,18 +961,18 @@ func (n *NginxPlus) addResolverZoneCharts(zone string) {
961 }
962 }
963
964 - if err := n.Charts().Add(*charts...); err != nil {
965 - n.Warning(err)
964 + if err := c.Charts().Add(*charts...); err != nil {
965 + c.Warning(err)
966 }
967 }
968
969 -func (n *NginxPlus) removeResolverZoneCharts(zone string) {
969 +func (c *Collector) removeResolverZoneCharts(zone string) {
970 px := fmt.Sprintf("resolver_zone_%s_", zone)
971 - n.removeCharts(px)
971 + c.removeCharts(px)
972 }
973
974 -func (n *NginxPlus) removeCharts(prefix string) {
975 - for _, chart := range *n.Charts() {
974 +func (c *Collector) removeCharts(prefix string) {
975 + for _, chart := range *c.Charts() {
976 if strings.HasPrefix(chart.ID, prefix) {
977 chart.MarkRemove()
978 chart.MarkNotCreated()
src/go/plugin/go.d/collector/nginxplus/collect.go
+78 -78
@@ -10,54 +10,54 @@ import (
10 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/metrix"
11 )
12
13 -func (n *NginxPlus) collect() (map[string]int64, error) {
14 - if n.apiVersion == 0 {
15 - v, err := n.queryAPIVersion()
13 +func (c *Collector) collect() (map[string]int64, error) {
14 + if c.apiVersion == 0 {
15 + v, err := c.queryAPIVersion()
16 if err != nil {
17 return nil, err
18 }
19 - n.apiVersion = v
19 + c.apiVersion = v
20 }
21
22 now := time.Now()
23 - if now.Sub(n.queryEndpointsTime) > n.queryEndpointsEvery {
24 - n.queryEndpointsTime = now
25 - if err := n.queryAvailableEndpoints(); err != nil {
23 + if now.Sub(c.queryEndpointsTime) > c.queryEndpointsEvery {
24 + c.queryEndpointsTime = now
25 + if err := c.queryAvailableEndpoints(); err != nil {
26 return nil, err
27 }
28 }
29
30 - ms := n.queryMetrics()
30 + ms := c.queryMetrics()
31 if ms.empty() {
32 return nil, errors.New("no metrics collected")
33 }
34
35 mx := make(map[string]int64)
36 - n.cache.resetUpdated()
37 - n.collectInfo(mx, ms)
38 - n.collectConnections(mx, ms)
39 - n.collectSSL(mx, ms)
40 - n.collectHTTPRequests(mx, ms)
41 - n.collectHTTPCache(mx, ms)
42 - n.collectHTTPServerZones(mx, ms)
43 - n.collectHTTPLocationZones(mx, ms)
44 - n.collectHTTPUpstreams(mx, ms)
45 - n.collectStreamServerZones(mx, ms)
46 - n.collectStreamUpstreams(mx, ms)
47 - n.collectResolvers(mx, ms)
48 - n.updateCharts()
36 + c.cache.resetUpdated()
37 + c.collectInfo(mx, ms)
38 + c.collectConnections(mx, ms)
39 + c.collectSSL(mx, ms)
40 + c.collectHTTPRequests(mx, ms)
41 + c.collectHTTPCache(mx, ms)
42 + c.collectHTTPServerZones(mx, ms)
43 + c.collectHTTPLocationZones(mx, ms)
44 + c.collectHTTPUpstreams(mx, ms)
45 + c.collectStreamServerZones(mx, ms)
46 + c.collectStreamUpstreams(mx, ms)
47 + c.collectResolvers(mx, ms)
48 + c.updateCharts()
49
50 return mx, nil
51 }
52
53 -func (n *NginxPlus) collectInfo(mx map[string]int64, ms *nginxMetrics) {
53 +func (c *Collector) collectInfo(mx map[string]int64, ms *nginxMetrics) {
54 if ms.info == nil {
55 return
56 }
57 mx["uptime"] = int64(ms.info.Timestamp.Sub(ms.info.LoadTimestamp).Seconds())
58 }
59
60 -func (n *NginxPlus) collectConnections(mx map[string]int64, ms *nginxMetrics) {
60 +func (c *Collector) collectConnections(mx map[string]int64, ms *nginxMetrics) {
61 if ms.connections == nil {
62 return
63 }
@@ -67,7 +67,7 @@ func (n *NginxPlus) collectConnections(mx map[string]int64, ms *nginxMetrics) {
67 mx["connections_idle"] = ms.connections.Idle
68 }
69
70 -func (n *NginxPlus) collectSSL(mx map[string]int64, ms *nginxMetrics) {
70 +func (c *Collector) collectSSL(mx map[string]int64, ms *nginxMetrics) {
71 if ms.ssl == nil {
72 return
73 }
@@ -85,7 +85,7 @@ func (n *NginxPlus) collectSSL(mx map[string]int64, ms *nginxMetrics) {
85 mx["ssl_verify_failures_other"] = ms.ssl.VerifyFailures.Other
86 }
87
88 -func (n *NginxPlus) collectHTTPRequests(mx map[string]int64, ms *nginxMetrics) {
88 +func (c *Collector) collectHTTPRequests(mx map[string]int64, ms *nginxMetrics) {
89 if ms.httpRequests == nil {
90 return
91 }
@@ -93,12 +93,12 @@ func (n *NginxPlus) collectHTTPRequests(mx map[string]int64, ms *nginxMetrics) {
93 mx["http_requests_current"] = ms.httpRequests.Current
94 }
95
96 -func (n *NginxPlus) collectHTTPCache(mx map[string]int64, ms *nginxMetrics) {
96 +func (c *Collector) collectHTTPCache(mx map[string]int64, ms *nginxMetrics) {
97 if ms.httpCaches == nil {
98 return
99 }
100 for name, cache := range *ms.httpCaches {
101 - n.cache.putHTTPCache(name)
101 + c.cache.putHTTPCache(name)
102 px := fmt.Sprintf("http_cache_%s_", name)
103 mx[px+"state_cold"] = metrix.Bool(cache.Cold)
104 mx[px+"state_warm"] = metrix.Bool(!cache.Cold)
@@ -112,12 +112,12 @@ func (n *NginxPlus) collectHTTPCache(mx map[string]int64, ms *nginxMetrics) {
112 }
113 }
114
115 -func (n *NginxPlus) collectHTTPServerZones(mx map[string]int64, ms *nginxMetrics) {
115 +func (c *Collector) collectHTTPServerZones(mx map[string]int64, ms *nginxMetrics) {
116 if ms.httpServerZones == nil {
117 return
118 }
119 for name, zone := range *ms.httpServerZones {
120 - n.cache.putHTTPServerZone(name)
120 + c.cache.putHTTPServerZone(name)
121
122 px := fmt.Sprintf("http_server_zone_%s_", name)
123 mx[px+"requests_processing"] = zone.Processing
@@ -134,12 +134,12 @@ func (n *NginxPlus) collectHTTPServerZones(mx map[string]int64, ms *nginxMetrics
134 }
135 }
136
137 -func (n *NginxPlus) collectHTTPLocationZones(mx map[string]int64, ms *nginxMetrics) {
137 +func (c *Collector) collectHTTPLocationZones(mx map[string]int64, ms *nginxMetrics) {
138 if ms.httpLocationZones == nil {
139 return
140 }
141 for name, zone := range *ms.httpLocationZones {
142 - n.cache.putHTTPLocationZone(name)
142 + c.cache.putHTTPLocationZone(name)
143
144 px := fmt.Sprintf("http_location_zone_%s_", name)
145 mx[px+"requests"] = zone.Requests
@@ -155,12 +155,12 @@ func (n *NginxPlus) collectHTTPLocationZones(mx map[string]int64, ms *nginxMetri
155 }
156 }
157
158 -func (n *NginxPlus) collectHTTPUpstreams(mx map[string]int64, ms *nginxMetrics) {
158 +func (c *Collector) collectHTTPUpstreams(mx map[string]int64, ms *nginxMetrics) {
159 if ms.httpUpstreams == nil {
160 return
161 }
162 for name, upstream := range *ms.httpUpstreams {
163 - n.cache.putHTTPUpstream(name, upstream.Zone)
163 + c.cache.putHTTPUpstream(name, upstream.Zone)
164
165 px := fmt.Sprintf("http_upstream_%s_zone_%s_", name, upstream.Zone)
166 mx[px+"zombies"] = upstream.Zombies
@@ -168,7 +168,7 @@ func (n *NginxPlus) collectHTTPUpstreams(mx map[string]int64, ms *nginxMetrics)
168 mx[px+"peers"] = int64(len(upstream.Peers))
169
170 for _, peer := range upstream.Peers {
171 - n.cache.putHTTPUpstreamServer(name, peer.Server, peer.Name, upstream.Zone)
171 + c.cache.putHTTPUpstreamServer(name, peer.Server, peer.Name, upstream.Zone)
172
173 px = fmt.Sprintf("http_upstream_%s_server_%s_zone_%s_", name, peer.Server, upstream.Zone)
174 mx[px+"active"] = peer.Active
@@ -191,12 +191,12 @@ func (n *NginxPlus) collectHTTPUpstreams(mx map[string]int64, ms *nginxMetrics)
191 }
192 }
193
194 -func (n *NginxPlus) collectStreamServerZones(mx map[string]int64, ms *nginxMetrics) {
194 +func (c *Collector) collectStreamServerZones(mx map[string]int64, ms *nginxMetrics) {
195 if ms.streamServerZones == nil {
196 return
197 }
198 for name, zone := range *ms.streamServerZones {
199 - n.cache.putStreamServerZone(name)
199 + c.cache.putStreamServerZone(name)
200
201 px := fmt.Sprintf("stream_server_zone_%s_", name)
202 mx[px+"connections"] = zone.Connections
@@ -211,19 +211,19 @@ func (n *NginxPlus) collectStreamServerZones(mx map[string]int64, ms *nginxMetri
211 }
212 }
213
214 -func (n *NginxPlus) collectStreamUpstreams(mx map[string]int64, ms *nginxMetrics) {
214 +func (c *Collector) collectStreamUpstreams(mx map[string]int64, ms *nginxMetrics) {
215 if ms.streamUpstreams == nil {
216 return
217 }
218 for name, upstream := range *ms.streamUpstreams {
219 - n.cache.putStreamUpstream(name, upstream.Zone)
219 + c.cache.putStreamUpstream(name, upstream.Zone)
220
221 px := fmt.Sprintf("stream_upstream_%s_zone_%s_", name, upstream.Zone)
222 mx[px+"zombies"] = upstream.Zombies
223 mx[px+"peers"] = int64(len(upstream.Peers))
224
225 for _, peer := range upstream.Peers {
226 - n.cache.putStreamUpstreamServer(name, peer.Server, peer.Name, upstream.Zone)
226 + c.cache.putStreamUpstreamServer(name, peer.Server, peer.Name, upstream.Zone)
227
228 px = fmt.Sprintf("stream_upstream_%s_server_%s_zone_%s_", name, peer.Server, upstream.Zone)
229
@@ -239,12 +239,12 @@ func (n *NginxPlus) collectStreamUpstreams(mx map[string]int64, ms *nginxMetrics
239 }
240 }
241
242 -func (n *NginxPlus) collectResolvers(mx map[string]int64, ms *nginxMetrics) {
242 +func (c *Collector) collectResolvers(mx map[string]int64, ms *nginxMetrics) {
243 if ms.resolvers == nil {
244 return
245 }
246 for name, zone := range *ms.resolvers {
247 - n.cache.putResolver(name)
247 + c.cache.putResolver(name)
248
249 px := fmt.Sprintf("resolver_zone_%s_", name)
250 mx[px+"requests_name"] = zone.Requests.Name
@@ -261,123 +261,123 @@ func (n *NginxPlus) collectResolvers(mx map[string]int64, ms *nginxMetrics) {
261 }
262 }
263
264 -func (n *NginxPlus) updateCharts() {
264 +func (c *Collector) updateCharts() {
265 const notSeenLimit = 3
266
267 - for key, v := range n.cache.httpCaches {
267 + for key, v := range c.cache.httpCaches {
268 if v.updated && !v.hasCharts {
269 v.hasCharts = true
270 - n.addHTTPCacheCharts(v.name)
270 + c.addHTTPCacheCharts(v.name)
271 continue
272 }
273 if !v.updated {
274 if v.notSeenTimes++; v.notSeenTimes >= notSeenLimit {
275 - delete(n.cache.httpCaches, key)
276 - n.removeHTTPCacheCharts(v.name)
275 + delete(c.cache.httpCaches, key)
276 + c.removeHTTPCacheCharts(v.name)
277 }
278 }
279 }
280 - for key, v := range n.cache.httpServerZones {
280 + for key, v := range c.cache.httpServerZones {
281 if v.updated && !v.hasCharts {
282 v.hasCharts = true
283 - n.addHTTPServerZoneCharts(v.zone)
283 + c.addHTTPServerZoneCharts(v.zone)
284 continue
285 }
286 if !v.updated {
287 if v.notSeenTimes++; v.notSeenTimes >= notSeenLimit {
288 - delete(n.cache.httpServerZones, key)
289 - n.removeHTTPServerZoneCharts(v.zone)
288 + delete(c.cache.httpServerZones, key)
289 + c.removeHTTPServerZoneCharts(v.zone)
290 }
291 }
292 }
293 - for key, v := range n.cache.httpLocationZones {
293 + for key, v := range c.cache.httpLocationZones {
294 if v.updated && !v.hasCharts {
295 v.hasCharts = true
296 - n.addHTTPLocationZoneCharts(v.zone)
296 + c.addHTTPLocationZoneCharts(v.zone)
297 continue
298 }
299 if !v.updated {
300 if v.notSeenTimes++; v.notSeenTimes >= notSeenLimit {
301 - delete(n.cache.httpLocationZones, key)
302 - n.removeHTTPLocationZoneCharts(v.zone)
301 + delete(c.cache.httpLocationZones, key)
302 + c.removeHTTPLocationZoneCharts(v.zone)
303 }
304 }
305 }
306 - for key, v := range n.cache.httpUpstreams {
306 + for key, v := range c.cache.httpUpstreams {
307 if v.updated && !v.hasCharts {
308 v.hasCharts = true
309 - n.addHTTPUpstreamCharts(v.name, v.zone)
309 + c.addHTTPUpstreamCharts(v.name, v.zone)
310 continue
311 }
312 if !v.updated {
313 if v.notSeenTimes++; v.notSeenTimes >= notSeenLimit {
314 - delete(n.cache.httpUpstreams, key)
315 - n.removeHTTPUpstreamCharts(v.name, v.zone)
314 + delete(c.cache.httpUpstreams, key)
315 + c.removeHTTPUpstreamCharts(v.name, v.zone)
316 }
317 }
318 }
319 - for key, v := range n.cache.httpUpstreamServers {
319 + for key, v := range c.cache.httpUpstreamServers {
320 if v.updated && !v.hasCharts {
321 v.hasCharts = true
322 - n.addHTTPUpstreamServerCharts(v.name, v.serverAddr, v.serverName, v.zone)
322 + c.addHTTPUpstreamServerCharts(v.name, v.serverAddr, v.serverName, v.zone)
323 continue
324 }
325 if !v.updated {
326 if v.notSeenTimes++; v.notSeenTimes >= notSeenLimit {
327 - delete(n.cache.httpUpstreamServers, key)
328 - n.removeHTTPUpstreamServerCharts(v.name, v.serverAddr, v.zone)
327 + delete(c.cache.httpUpstreamServers, key)
328 + c.removeHTTPUpstreamServerCharts(v.name, v.serverAddr, v.zone)
329 }
330 }
331 }
332 - for key, v := range n.cache.streamServerZones {
332 + for key, v := range c.cache.streamServerZones {
333 if v.updated && !v.hasCharts {
334 v.hasCharts = true
335 - n.addStreamServerZoneCharts(v.zone)
335 + c.addStreamServerZoneCharts(v.zone)
336 continue
337 }
338 if !v.updated {
339 if v.notSeenTimes++; v.notSeenTimes >= notSeenLimit {
340 - delete(n.cache.streamServerZones, key)
341 - n.removeStreamServerZoneCharts(v.zone)
340 + delete(c.cache.streamServerZones, key)
341 + c.removeStreamServerZoneCharts(v.zone)
342 }
343 }
344 }
345 - for key, v := range n.cache.streamUpstreams {
345 + for key, v := range c.cache.streamUpstreams {
346 if v.updated && !v.hasCharts {
347 v.hasCharts = true
348 - n.addStreamUpstreamCharts(v.name, v.zone)
348 + c.addStreamUpstreamCharts(v.name, v.zone)
349 continue
350 }
351 if !v.updated {
352 if v.notSeenTimes++; v.notSeenTimes >= notSeenLimit {
353 - delete(n.cache.streamUpstreams, key)
354 - n.removeStreamUpstreamCharts(v.name, v.zone)
353 + delete(c.cache.streamUpstreams, key)
354 + c.removeStreamUpstreamCharts(v.name, v.zone)
355 }
356 }
357 }
358 - for key, v := range n.cache.streamUpstreamServers {
358 + for key, v := range c.cache.streamUpstreamServers {
359 if v.updated && !v.hasCharts {
360 v.hasCharts = true
361 - n.addStreamUpstreamServerCharts(v.name, v.serverAddr, v.serverName, v.zone)
361 + c.addStreamUpstreamServerCharts(v.name, v.serverAddr, v.serverName, v.zone)
362 continue
363 }
364 if !v.updated {
365 if v.notSeenTimes++; v.notSeenTimes >= notSeenLimit {
366 - delete(n.cache.streamUpstreamServers, key)
367 - n.removeStreamUpstreamServerCharts(v.name, v.serverAddr, v.zone)
366 + delete(c.cache.streamUpstreamServers, key)
367 + c.removeStreamUpstreamServerCharts(v.name, v.serverAddr, v.zone)
368 }
369 }
370 }
371 - for key, v := range n.cache.resolvers {
371 + for key, v := range c.cache.resolvers {
372 if v.updated && !v.hasCharts {
373 v.hasCharts = true
374 - n.addResolverZoneCharts(v.zone)
374 + c.addResolverZoneCharts(v.zone)
375 continue
376 }
377 if !v.updated {
378 if v.notSeenTimes++; v.notSeenTimes >= notSeenLimit {
379 - delete(n.cache.resolvers, key)
380 - n.removeResolverZoneCharts(v.zone)
379 + delete(c.cache.resolvers, key)
380 + c.removeResolverZoneCharts(v.zone)
381 }
382 }
383 }
src/go/plugin/go.d/collector/nginxplus/collector.go renamed
+19 -19
@@ -25,8 +25,8 @@ func init() {
25 })
26 }
27
28 -func New() *NginxPlus {
29 - return &NginxPlus{
28 +func New() *Collector {
29 + return &Collector{
30 Config: Config{
31 HTTPConfig: web.HTTPConfig{
32 RequestConfig: web.RequestConfig{
@@ -48,7 +48,7 @@ type Config struct {
48 web.HTTPConfig `yaml:",inline" json:""`
49 }
50
51 -type NginxPlus struct {
51 +type Collector struct {
52 module.Base
53 Config `yaml:",inline" json:""`
54
@@ -75,26 +75,26 @@ type NginxPlus struct {
75 cache *cache
76 }
77
78 -func (n *NginxPlus) Configuration() any {
79 - return n.Config
78 +func (c *Collector) Configuration() any {
79 + return c.Config
80 }
81
82 -func (n *NginxPlus) Init() error {
83 - if n.URL == "" {
82 +func (c *Collector) Init() error {
83 + if c.URL == "" {
84 return errors.New("config: 'url' can not be empty'")
85 }
86
87 - client, err := web.NewHTTPClient(n.ClientConfig)
87 + client, err := web.NewHTTPClient(c.ClientConfig)
88 if err != nil {
89 return fmt.Errorf("init HTTP client: %v", err)
90 }
91 - n.httpClient = client
91 + c.httpClient = client
92
93 return nil
94 }
95
96 -func (n *NginxPlus) Check() error {
97 - mx, err := n.collect()
96 +func (c *Collector) Check() error {
97 + mx, err := c.collect()
98 if err != nil {
99 return err
100 }
@@ -104,23 +104,23 @@ func (n *NginxPlus) Check() error {
104 return nil
105 }
106
107 -func (n *NginxPlus) Charts() *module.Charts {
108 - return n.charts
107 +func (c *Collector) Charts() *module.Charts {
108 + return c.charts
109 }
110
111 -func (n *NginxPlus) Collect() map[string]int64 {
112 - mx, err := n.collect()
111 +func (c *Collector) Collect() map[string]int64 {
112 + mx, err := c.collect()
113
114 if err != nil {
115 - n.Error(err)
115 + c.Error(err)
116 return nil
117 }
118
119 return mx
120 }
121
122 -func (n *NginxPlus) Cleanup() {
123 - if n.httpClient != nil {
124 - n.httpClient.CloseIdleConnections()
122 +func (c *Collector) Cleanup() {
123 + if c.httpClient != nil {
124 + c.httpClient.CloseIdleConnections()
125 }
126 }
src/go/plugin/go.d/collector/nginxplus/collector_test.go renamed
+38 -38
@@ -61,11 +61,11 @@ func Test_testDataIsValid(t *testing.T) {
61 }
62 }
63
64 -func TestNginxPlus_ConfigurationSerialize(t *testing.T) {
65 - module.TestConfigurationSerialize(t, &NginxPlus{}, dataConfigJSON, dataConfigYAML)
64 +func TestCollector_ConfigurationSerialize(t *testing.T) {
65 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
66 }
67
68 -func TestNginxPlus_Init(t *testing.T) {
68 +func TestCollector_Init(t *testing.T) {
69 tests := map[string]struct {
70 wantFail bool
71 config Config
@@ -86,22 +86,22 @@ func TestNginxPlus_Init(t *testing.T) {
86
87 for name, test := range tests {
88 t.Run(name, func(t *testing.T) {
89 - nginx := New()
90 - nginx.Config = test.config
89 + collr := New()
90 + collr.Config = test.config
91
92 if test.wantFail {
93 - assert.Error(t, nginx.Init())
93 + assert.Error(t, collr.Init())
94 } else {
95 - assert.NoError(t, nginx.Init())
95 + assert.NoError(t, collr.Init())
96 }
97 })
98 }
99 }
100
101 -func TestNginxPlus_Check(t *testing.T) {
101 +func TestCollector_Check(t *testing.T) {
102 tests := map[string]struct {
103 wantFail bool
104 - prepare func(t *testing.T) (nginx *NginxPlus, cleanup func())
104 + prepare func(t *testing.T) (collr *Collector, cleanup func())
105 }{
106 "success when all requests OK": {
107 wantFail: false,
@@ -123,21 +123,21 @@ func TestNginxPlus_Check(t *testing.T) {
123
124 for name, test := range tests {
125 t.Run(name, func(t *testing.T) {
126 - nginx, cleanup := test.prepare(t)
126 + collr, cleanup := test.prepare(t)
127 defer cleanup()
128
129 if test.wantFail {
130 - assert.Error(t, nginx.Check())
130 + assert.Error(t, collr.Check())
131 } else {
132 - assert.NoError(t, nginx.Check())
132 + assert.NoError(t, collr.Check())
133 }
134 })
135 }
136 }
137
138 -func TestNginxPlus_Collect(t *testing.T) {
138 +func TestCollector_Collect(t *testing.T) {
139 tests := map[string]struct {
140 - prepare func(t *testing.T) (nginx *NginxPlus, cleanup func())
140 + prepare func(t *testing.T) (collr *Collector, cleanup func())
141 wantNumOfCharts int
142 wantMetrics map[string]int64
143 }{
@@ -455,15 +455,15 @@ func TestNginxPlus_Collect(t *testing.T) {
455
456 for name, test := range tests {
457 t.Run(name, func(t *testing.T) {
458 - nginx, cleanup := test.prepare(t)
458 + collr, cleanup := test.prepare(t)
459 defer cleanup()
460
461 - mx := nginx.Collect()
461 + mx := collr.Collect()
462
463 require.Equal(t, test.wantMetrics, mx)
464 if len(test.wantMetrics) > 0 {
465 - assert.Equalf(t, test.wantNumOfCharts, len(*nginx.Charts()), "number of charts")
466 - module.TestMetricsHasAllChartsDimsSkip(t, nginx.Charts(), mx, func(chart *module.Chart, _ *module.Dim) bool {
465 + assert.Equalf(t, test.wantNumOfCharts, len(*collr.Charts()), "number of charts")
466 + module.TestMetricsHasAllChartsDimsSkip(t, collr.Charts(), mx, func(chart *module.Chart, _ *module.Dim) bool {
467 return chart.ID == uptimeChart.ID
468 })
469 }
@@ -471,7 +471,7 @@ func TestNginxPlus_Collect(t *testing.T) {
471 }
472 }
473
474 -func caseAPI8AllRequestsOK(t *testing.T) (*NginxPlus, func()) {
474 +func caseAPI8AllRequestsOK(t *testing.T) (*Collector, func()) {
475 t.Helper()
476 srv := httptest.NewServer(http.HandlerFunc(
477 func(w http.ResponseWriter, r *http.Request) {
@@ -510,14 +510,14 @@ func caseAPI8AllRequestsOK(t *testing.T) (*NginxPlus, func()) {
510
511 }
512 }))
513 - nginx := New()
514 - nginx.URL = srv.URL
515 - require.NoError(t, nginx.Init())
513 + collr := New()
514 + collr.URL = srv.URL
515 + require.NoError(t, collr.Init())
516
517 - return nginx, srv.Close
517 + return collr, srv.Close
518 }
519
520 -func caseAPI8AllRequestsExceptStreamOK(t *testing.T) (*NginxPlus, func()) {
520 +func caseAPI8AllRequestsExceptStreamOK(t *testing.T) (*Collector, func()) {
521 t.Helper()
522 srv := httptest.NewServer(http.HandlerFunc(
523 func(w http.ResponseWriter, r *http.Request) {
@@ -552,31 +552,31 @@ func caseAPI8AllRequestsExceptStreamOK(t *testing.T) (*NginxPlus, func()) {
552
553 }
554 }))
555 - nginx := New()
556 - nginx.URL = srv.URL
557 - require.NoError(t, nginx.Init())
555 + collr := New()
556 + collr.URL = srv.URL
557 + require.NoError(t, collr.Init())
558
559 - return nginx, srv.Close
559 + return collr, srv.Close
560 }
561
562 -func caseInvalidDataResponse(t *testing.T) (*NginxPlus, func()) {
562 +func caseInvalidDataResponse(t *testing.T) (*Collector, func()) {
563 t.Helper()
564 srv := httptest.NewServer(http.HandlerFunc(
565 func(w http.ResponseWriter, r *http.Request) {
566 _, _ = w.Write([]byte("hello and\n goodbye"))
567 }))
568 - nginx := New()
569 - nginx.URL = srv.URL
570 - require.NoError(t, nginx.Init())
568 + collr := New()
569 + collr.URL = srv.URL
570 + require.NoError(t, collr.Init())
571
572 - return nginx, srv.Close
572 + return collr, srv.Close
573 }
574
575 -func caseConnectionRefused(t *testing.T) (*NginxPlus, func()) {
575 +func caseConnectionRefused(t *testing.T) (*Collector, func()) {
576 t.Helper()
577 - nginx := New()
578 - nginx.URL = "http://127.0.0.1:65001"
579 - require.NoError(t, nginx.Init())
577 + collr := New()
578 + collr.URL = "http://127.0.0.1:65001"
579 + require.NoError(t, collr.Init())
580
581 - return nginx, func() {}
581 + return collr, func() {}
582 }
src/go/plugin/go.d/collector/nginxplus/nginx_http_api_query.go
+94 -94
@@ -43,11 +43,11 @@ type nginxMetrics struct {
43 resolvers *nginxResolvers
44 }
45
46 -func (n *NginxPlus) queryAPIVersion() (int64, error) {
47 - req, _ := web.NewHTTPRequestWithPath(n.RequestConfig, urlPathAPIVersions)
46 +func (c *Collector) queryAPIVersion() (int64, error) {
47 + req, _ := web.NewHTTPRequestWithPath(c.RequestConfig, urlPathAPIVersions)
48
49 var versions nginxAPIVersions
50 - if err := n.doHTTP(req, &versions); err != nil {
50 + if err := c.doHTTP(req, &versions); err != nil {
51 return 0, err
52 }
53
@@ -58,26 +58,26 @@ func (n *NginxPlus) queryAPIVersion() (int64, error) {
58 return versions[len(versions)-1], nil
59 }
60
61 -func (n *NginxPlus) queryAvailableEndpoints() error {
62 - req, _ := web.NewHTTPRequestWithPath(n.RequestConfig, fmt.Sprintf(urlPathAPIEndpointsRoot, n.apiVersion))
61 +func (c *Collector) queryAvailableEndpoints() error {
62 + req, _ := web.NewHTTPRequestWithPath(c.RequestConfig, fmt.Sprintf(urlPathAPIEndpointsRoot, c.apiVersion))
63
64 var endpoints []string
65 - if err := n.doHTTP(req, &endpoints); err != nil {
65 + if err := c.doHTTP(req, &endpoints); err != nil {
66 return err
67 }
68
69 - n.Debugf("discovered root endpoints: %v", endpoints)
69 + c.Debugf("discovered root endpoints: %v", endpoints)
70 var hasHTTP, hasStream bool
71 for _, v := range endpoints {
72 switch v {
73 case "nginx":
74 - n.endpoints.nginx = true
74 + c.endpoints.nginx = true
75 case "connections":
76 - n.endpoints.connections = true
76 + c.endpoints.connections = true
77 case "ssl":
78 - n.endpoints.ssl = true
78 + c.endpoints.ssl = true
79 case "resolvers":
80 - n.endpoints.resolvers = true
80 + c.endpoints.resolvers = true
81 case "http":
82 hasHTTP = true
83 case "stream":
@@ -87,44 +87,44 @@ func (n *NginxPlus) queryAvailableEndpoints() error {
87
88 if hasHTTP {
89 endpoints = endpoints[:0]
90 - req, _ = web.NewHTTPRequestWithPath(n.RequestConfig, fmt.Sprintf(urlPathAPIEndpointsHTTP, n.apiVersion))
90 + req, _ = web.NewHTTPRequestWithPath(c.RequestConfig, fmt.Sprintf(urlPathAPIEndpointsHTTP, c.apiVersion))
91
92 - if err := n.doHTTP(req, &endpoints); err != nil {
92 + if err := c.doHTTP(req, &endpoints); err != nil {
93 return err
94 }
95
96 - n.Debugf("discovered http endpoints: %v", endpoints)
96 + c.Debugf("discovered http endpoints: %v", endpoints)
97 for _, v := range endpoints {
98 switch v {
99 case "requests":
100 - n.endpoints.httpRequest = true
100 + c.endpoints.httpRequest = true
101 case "server_zones":
102 - n.endpoints.httpServerZones = true
102 + c.endpoints.httpServerZones = true
103 case "location_zones":
104 - n.endpoints.httpLocationZones = true
104 + c.endpoints.httpLocationZones = true
105 case "caches":
106 - n.endpoints.httpCaches = true
106 + c.endpoints.httpCaches = true
107 case "upstreams":
108 - n.endpoints.httpUpstreams = true
108 + c.endpoints.httpUpstreams = true
109 }
110 }
111 }
112
113 if hasStream {
114 endpoints = endpoints[:0]
115 - req, _ = web.NewHTTPRequestWithPath(n.RequestConfig, fmt.Sprintf(urlPathAPIEndpointsStream, n.apiVersion))
115 + req, _ = web.NewHTTPRequestWithPath(c.RequestConfig, fmt.Sprintf(urlPathAPIEndpointsStream, c.apiVersion))
116
117 - if err := n.doHTTP(req, &endpoints); err != nil {
117 + if err := c.doHTTP(req, &endpoints); err != nil {
118 return err
119 }
120
121 - n.Debugf("discovered stream endpoints: %v", endpoints)
121 + c.Debugf("discovered stream endpoints: %v", endpoints)
122 for _, v := range endpoints {
123 switch v {
124 case "server_zones":
125 - n.endpoints.streamServerZones = true
125 + c.endpoints.streamServerZones = true
126 case "upstreams":
127 - n.endpoints.streamUpstreams = true
127 + c.endpoints.streamUpstreams = true
128 }
129 }
130 }
@@ -132,7 +132,7 @@ func (n *NginxPlus) queryAvailableEndpoints() error {
132 return nil
133 }
134
135 -func (n *NginxPlus) queryMetrics() *nginxMetrics {
135 +func (c *Collector) queryMetrics() *nginxMetrics {
136 ms := &nginxMetrics{}
137 wg := &sync.WaitGroup{}
138
@@ -140,17 +140,17 @@ func (n *NginxPlus) queryMetrics() *nginxMetrics {
140 do bool
141 fn func(*nginxMetrics)
142 }{
143 - {do: n.endpoints.nginx, fn: n.queryNginxInfo},
144 - {do: n.endpoints.connections, fn: n.queryConnections},
145 - {do: n.endpoints.ssl, fn: n.querySSL},
146 - {do: n.endpoints.httpRequest, fn: n.queryHTTPRequests},
147 - {do: n.endpoints.httpServerZones, fn: n.queryHTTPServerZones},
148 - {do: n.endpoints.httpLocationZones, fn: n.queryHTTPLocationZones},
149 - {do: n.endpoints.httpUpstreams, fn: n.queryHTTPUpstreams},
150 - {do: n.endpoints.httpCaches, fn: n.queryHTTPCaches},
151 - {do: n.endpoints.streamServerZones, fn: n.queryStreamServerZones},
152 - {do: n.endpoints.streamUpstreams, fn: n.queryStreamUpstreams},
153 - {do: n.endpoints.resolvers, fn: n.queryResolvers},
143 + {do: c.endpoints.nginx, fn: c.queryNginxInfo},
144 + {do: c.endpoints.connections, fn: c.queryConnections},
145 + {do: c.endpoints.ssl, fn: c.querySSL},
146 + {do: c.endpoints.httpRequest, fn: c.queryHTTPRequests},
147 + {do: c.endpoints.httpServerZones, fn: c.queryHTTPServerZones},
148 + {do: c.endpoints.httpLocationZones, fn: c.queryHTTPLocationZones},
149 + {do: c.endpoints.httpUpstreams, fn: c.queryHTTPUpstreams},
150 + {do: c.endpoints.httpCaches, fn: c.queryHTTPCaches},
151 + {do: c.endpoints.streamServerZones, fn: c.queryStreamServerZones},
152 + {do: c.endpoints.streamUpstreams, fn: c.queryStreamUpstreams},
153 + {do: c.endpoints.resolvers, fn: c.queryResolvers},
154 } {
155 task := task
156 if task.do {
@@ -164,154 +164,154 @@ func (n *NginxPlus) queryMetrics() *nginxMetrics {
164 return ms
165 }
166
167 -func (n *NginxPlus) queryNginxInfo(ms *nginxMetrics) {
168 - req, _ := web.NewHTTPRequestWithPath(n.RequestConfig, fmt.Sprintf(urlPathAPINginx, n.apiVersion))
167 +func (c *Collector) queryNginxInfo(ms *nginxMetrics) {
168 + req, _ := web.NewHTTPRequestWithPath(c.RequestConfig, fmt.Sprintf(urlPathAPINginx, c.apiVersion))
169
170 var v nginxInfo
171
172 - if err := n.doHTTP(req, &v); err != nil {
173 - n.endpoints.nginx = !errors.Is(err, errPathNotFound)
174 - n.Warning(err)
172 + if err := c.doHTTP(req, &v); err != nil {
173 + c.endpoints.nginx = !errors.Is(err, errPathNotFound)
174 + c.Warning(err)
175 return
176 }
177
178 ms.info = &v
179 }
180
181 -func (n *NginxPlus) queryConnections(ms *nginxMetrics) {
182 - req, _ := web.NewHTTPRequestWithPath(n.RequestConfig, fmt.Sprintf(urlPathAPIConnections, n.apiVersion))
181 +func (c *Collector) queryConnections(ms *nginxMetrics) {
182 + req, _ := web.NewHTTPRequestWithPath(c.RequestConfig, fmt.Sprintf(urlPathAPIConnections, c.apiVersion))
183
184 var v nginxConnections
185
186 - if err := n.doHTTP(req, &v); err != nil {
187 - n.endpoints.connections = !errors.Is(err, errPathNotFound)
188 - n.Warning(err)
186 + if err := c.doHTTP(req, &v); err != nil {
187 + c.endpoints.connections = !errors.Is(err, errPathNotFound)
188 + c.Warning(err)
189 return
190 }
191
192 ms.connections = &v
193 }
194
195 -func (n *NginxPlus) querySSL(ms *nginxMetrics) {
196 - req, _ := web.NewHTTPRequestWithPath(n.RequestConfig, fmt.Sprintf(urlPathAPISSL, n.apiVersion))
195 +func (c *Collector) querySSL(ms *nginxMetrics) {
196 + req, _ := web.NewHTTPRequestWithPath(c.RequestConfig, fmt.Sprintf(urlPathAPISSL, c.apiVersion))
197
198 var v nginxSSL
199
200 - if err := n.doHTTP(req, &v); err != nil {
201 - n.endpoints.ssl = !errors.Is(err, errPathNotFound)
202 - n.Warning(err)
200 + if err := c.doHTTP(req, &v); err != nil {
201 + c.endpoints.ssl = !errors.Is(err, errPathNotFound)
202 + c.Warning(err)
203 return
204 }
205
206 ms.ssl = &v
207 }
208
209 -func (n *NginxPlus) queryHTTPRequests(ms *nginxMetrics) {
210 - req, _ := web.NewHTTPRequestWithPath(n.RequestConfig, fmt.Sprintf(urlPathAPIHTTPRequests, n.apiVersion))
209 +func (c *Collector) queryHTTPRequests(ms *nginxMetrics) {
210 + req, _ := web.NewHTTPRequestWithPath(c.RequestConfig, fmt.Sprintf(urlPathAPIHTTPRequests, c.apiVersion))
211
212 var v nginxHTTPRequests
213
214 - if err := n.doHTTP(req, &v); err != nil {
215 - n.endpoints.httpRequest = !errors.Is(err, errPathNotFound)
216 - n.Warning(err)
214 + if err := c.doHTTP(req, &v); err != nil {
215 + c.endpoints.httpRequest = !errors.Is(err, errPathNotFound)
216 + c.Warning(err)
217 return
218 }
219
220 ms.httpRequests = &v
221 }
222
223 -func (n *NginxPlus) queryHTTPServerZones(ms *nginxMetrics) {
224 - req, _ := web.NewHTTPRequestWithPath(n.RequestConfig, fmt.Sprintf(urlPathAPIHTTPServerZones, n.apiVersion))
223 +func (c *Collector) queryHTTPServerZones(ms *nginxMetrics) {
224 + req, _ := web.NewHTTPRequestWithPath(c.RequestConfig, fmt.Sprintf(urlPathAPIHTTPServerZones, c.apiVersion))
225
226 var v nginxHTTPServerZones
227
228 - if err := n.doHTTP(req, &v); err != nil {
229 - n.endpoints.httpServerZones = !errors.Is(err, errPathNotFound)
230 - n.Warning(err)
228 + if err := c.doHTTP(req, &v); err != nil {
229 + c.endpoints.httpServerZones = !errors.Is(err, errPathNotFound)
230 + c.Warning(err)
231 return
232 }
233
234 ms.httpServerZones = &v
235 }
236
237 -func (n *NginxPlus) queryHTTPLocationZones(ms *nginxMetrics) {
238 - req, _ := web.NewHTTPRequestWithPath(n.RequestConfig, fmt.Sprintf(urlPathAPIHTTPLocationZones, n.apiVersion))
237 +func (c *Collector) queryHTTPLocationZones(ms *nginxMetrics) {
238 + req, _ := web.NewHTTPRequestWithPath(c.RequestConfig, fmt.Sprintf(urlPathAPIHTTPLocationZones, c.apiVersion))
239
240 var v nginxHTTPLocationZones
241
242 - if err := n.doHTTP(req, &v); err != nil {
243 - n.endpoints.httpLocationZones = !errors.Is(err, errPathNotFound)
244 - n.Warning(err)
242 + if err := c.doHTTP(req, &v); err != nil {
243 + c.endpoints.httpLocationZones = !errors.Is(err, errPathNotFound)
244 + c.Warning(err)
245 return
246 }
247
248 ms.httpLocationZones = &v
249 }
250
251 -func (n *NginxPlus) queryHTTPUpstreams(ms *nginxMetrics) {
252 - req, _ := web.NewHTTPRequestWithPath(n.RequestConfig, fmt.Sprintf(urlPathAPIHTTPUpstreams, n.apiVersion))
251 +func (c *Collector) queryHTTPUpstreams(ms *nginxMetrics) {
252 + req, _ := web.NewHTTPRequestWithPath(c.RequestConfig, fmt.Sprintf(urlPathAPIHTTPUpstreams, c.apiVersion))
253
254 var v nginxHTTPUpstreams
255
256 - if err := n.doHTTP(req, &v); err != nil {
257 - n.endpoints.httpUpstreams = !errors.Is(err, errPathNotFound)
258 - n.Warning(err)
256 + if err := c.doHTTP(req, &v); err != nil {
257 + c.endpoints.httpUpstreams = !errors.Is(err, errPathNotFound)
258 + c.Warning(err)
259 return
260 }
261
262 ms.httpUpstreams = &v
263 }
264
265 -func (n *NginxPlus) queryHTTPCaches(ms *nginxMetrics) {
266 - req, _ := web.NewHTTPRequestWithPath(n.RequestConfig, fmt.Sprintf(urlPathAPIHTTPCaches, n.apiVersion))
265 +func (c *Collector) queryHTTPCaches(ms *nginxMetrics) {
266 + req, _ := web.NewHTTPRequestWithPath(c.RequestConfig, fmt.Sprintf(urlPathAPIHTTPCaches, c.apiVersion))
267
268 var v nginxHTTPCaches
269
270 - if err := n.doHTTP(req, &v); err != nil {
271 - n.endpoints.httpCaches = !errors.Is(err, errPathNotFound)
272 - n.Warning(err)
270 + if err := c.doHTTP(req, &v); err != nil {
271 + c.endpoints.httpCaches = !errors.Is(err, errPathNotFound)
272 + c.Warning(err)
273 return
274 }
275
276 ms.httpCaches = &v
277 }
278
279 -func (n *NginxPlus) queryStreamServerZones(ms *nginxMetrics) {
280 - req, _ := web.NewHTTPRequestWithPath(n.RequestConfig, fmt.Sprintf(urlPathAPIStreamServerZones, n.apiVersion))
279 +func (c *Collector) queryStreamServerZones(ms *nginxMetrics) {
280 + req, _ := web.NewHTTPRequestWithPath(c.RequestConfig, fmt.Sprintf(urlPathAPIStreamServerZones, c.apiVersion))
281
282 var v nginxStreamServerZones
283
284 - if err := n.doHTTP(req, &v); err != nil {
285 - n.endpoints.streamServerZones = !errors.Is(err, errPathNotFound)
286 - n.Warning(err)
284 + if err := c.doHTTP(req, &v); err != nil {
285 + c.endpoints.streamServerZones = !errors.Is(err, errPathNotFound)
286 + c.Warning(err)
287 return
288 }
289
290 ms.streamServerZones = &v
291 }
292
293 -func (n *NginxPlus) queryStreamUpstreams(ms *nginxMetrics) {
294 - req, _ := web.NewHTTPRequestWithPath(n.RequestConfig, fmt.Sprintf(urlPathAPIStreamUpstreams, n.apiVersion))
293 +func (c *Collector) queryStreamUpstreams(ms *nginxMetrics) {
294 + req, _ := web.NewHTTPRequestWithPath(c.RequestConfig, fmt.Sprintf(urlPathAPIStreamUpstreams, c.apiVersion))
295
296 var v nginxStreamUpstreams
297
298 - if err := n.doHTTP(req, &v); err != nil {
299 - n.endpoints.streamUpstreams = !errors.Is(err, errPathNotFound)
300 - n.Warning(err)
298 + if err := c.doHTTP(req, &v); err != nil {
299 + c.endpoints.streamUpstreams = !errors.Is(err, errPathNotFound)
300 + c.Warning(err)
301 return
302 }
303
304 ms.streamUpstreams = &v
305 }
306
307 -func (n *NginxPlus) queryResolvers(ms *nginxMetrics) {
308 - req, _ := web.NewHTTPRequestWithPath(n.RequestConfig, fmt.Sprintf(urlPathAPIResolvers, n.apiVersion))
307 +func (c *Collector) queryResolvers(ms *nginxMetrics) {
308 + req, _ := web.NewHTTPRequestWithPath(c.RequestConfig, fmt.Sprintf(urlPathAPIResolvers, c.apiVersion))
309
310 var v nginxResolvers
311
312 - if err := n.doHTTP(req, &v); err != nil {
313 - n.endpoints.resolvers = !errors.Is(err, errPathNotFound)
314 - n.Warning(err)
312 + if err := c.doHTTP(req, &v); err != nil {
313 + c.endpoints.resolvers = !errors.Is(err, errPathNotFound)
314 + c.Warning(err)
315 return
316 }
317
@@ -322,10 +322,10 @@ var (
322 errPathNotFound = errors.New("path not found")
323 )
324
325 -func (n *NginxPlus) doHTTP(req *http.Request, dst any) error {
326 - n.Debugf("executing %s '%s'", req.Method, req.URL)
325 +func (c *Collector) doHTTP(req *http.Request, dst any) error {
326 + c.Debugf("executing %s '%s'", req.Method, req.URL)
327
328 - cl := web.DoHTTP(n.httpClient).OnNokCode(func(resp *http.Response) (bool, error) {
328 + cl := web.DoHTTP(c.httpClient).OnNokCode(func(resp *http.Response) (bool, error) {
329 if resp.StatusCode == http.StatusNotFound {
330 return false, errPathNotFound
331 }
src/go/plugin/go.d/collector/nginxunit/collect.go
+4 -4
@@ -29,15 +29,15 @@ type nuStatus struct {
29 } `json:"requests" stm:"requests"`
30 }
31
32 -func (n *NginxUnit) collect() (map[string]int64, error) {
33 - req, err := web.NewHTTPRequestWithPath(n.RequestConfig, urlPathStatus)
32 +func (c *Collector) collect() (map[string]int64, error) {
33 + req, err := web.NewHTTPRequestWithPath(c.RequestConfig, urlPathStatus)
34 if err != nil {
35 - return nil, fmt.Errorf("failed to create HTTP request to '%s': %v", n.URL, err)
35 + return nil, fmt.Errorf("failed to create HTTP request to '%s': %v", c.URL, err)
36 }
37
38 var status nuStatus
39
40 - wc := web.DoHTTP(n.httpClient).OnNokCode(func(resp *http.Response) (bool, error) {
40 + wc := web.DoHTTP(c.httpClient).OnNokCode(func(resp *http.Response) (bool, error) {
41 var msg struct {
42 Error string `json:"error"`
43 }
src/go/plugin/go.d/collector/nginxunit/collector.go renamed
+21 -21
@@ -25,8 +25,8 @@ func init() {
25 })
26 }
27
28 -func New() *NginxUnit {
29 - return &NginxUnit{
28 +func New() *Collector {
29 + return &Collector{
30 Config: Config{
31 HTTPConfig: web.HTTPConfig{
32 RequestConfig: web.RequestConfig{
@@ -46,7 +46,7 @@ type Config struct {
46 web.HTTPConfig `yaml:",inline" json:""`
47 }
48
49 -type NginxUnit struct {
49 +type Collector struct {
50 module.Base
51 Config `yaml:",inline" json:""`
52
@@ -55,29 +55,29 @@ type NginxUnit struct {
55 httpClient *http.Client
56 }
57
58 -func (n *NginxUnit) Configuration() any {
59 - return n.Config
58 +func (c *Collector) Configuration() any {
59 + return c.Config
60 }
61
62 -func (n *NginxUnit) Init() error {
63 - if n.URL == "" {
62 +func (c *Collector) Init() error {
63 + if c.URL == "" {
64 return errors.New("URL required but not set")
65 }
66
67 - httpClient, err := web.NewHTTPClient(n.ClientConfig)
67 + httpClient, err := web.NewHTTPClient(c.ClientConfig)
68 if err != nil {
69 return fmt.Errorf("failed initializing http client: %w", err)
70 }
71 - n.httpClient = httpClient
71 + c.httpClient = httpClient
72
73 - n.Debugf("using URL %s", n.URL)
74 - n.Debugf("using timeout: %s", n.Timeout)
73 + c.Debugf("using URL %s", c.URL)
74 + c.Debugf("using timeout: %s", c.Timeout)
75
76 return nil
77 }
78
79 -func (n *NginxUnit) Check() error {
80 - mx, err := n.collect()
79 +func (c *Collector) Check() error {
80 + mx, err := c.collect()
81 if err != nil {
82 return err
83 }
@@ -89,22 +89,22 @@ func (n *NginxUnit) Check() error {
89 return nil
90 }
91
92 -func (n *NginxUnit) Charts() *module.Charts {
93 - return n.charts
92 +func (c *Collector) Charts() *module.Charts {
93 + return c.charts
94 }
95
96 -func (n *NginxUnit) Collect() map[string]int64 {
97 - mx, err := n.collect()
96 +func (c *Collector) Collect() map[string]int64 {
97 + mx, err := c.collect()
98 if err != nil {
99 - n.Error(err)
99 + c.Error(err)
100 return nil
101 }
102
103 return mx
104 }
105
106 -func (n *NginxUnit) Cleanup() {
107 - if n.httpClient != nil {
108 - n.httpClient.CloseIdleConnections()
106 +func (c *Collector) Cleanup() {
107 + if c.httpClient != nil {
108 + c.httpClient.CloseIdleConnections()
109 }
110 }
src/go/plugin/go.d/collector/nginxunit/collector_test.go renamed
+45 -45
@@ -33,11 +33,11 @@ func Test_testDataIsValid(t *testing.T) {
33 }
34 }
35
36 -func TestNginxUnit_ConfigurationSerialize(t *testing.T) {
37 - module.TestConfigurationSerialize(t, &NginxUnit{}, dataConfigJSON, dataConfigYAML)
36 +func TestCollector_ConfigurationSerialize(t *testing.T) {
37 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
38 }
39
40 -func TestNginxUnit_Init(t *testing.T) {
40 +func TestCollector_Init(t *testing.T) {
41 tests := map[string]struct {
42 wantFail bool
43 config Config
@@ -58,22 +58,22 @@ func TestNginxUnit_Init(t *testing.T) {
58
59 for name, test := range tests {
60 t.Run(name, func(t *testing.T) {
61 - nu := New()
62 - nu.Config = test.config
61 + collr := New()
62 + collr.Config = test.config
63
64 if test.wantFail {
65 - assert.Error(t, nu.Init())
65 + assert.Error(t, collr.Init())
66 } else {
67 - assert.NoError(t, nu.Init())
67 + assert.NoError(t, collr.Init())
68 }
69 })
70 }
71 }
72
73 -func TestNginxUnit_Check(t *testing.T) {
73 +func TestCollector_Check(t *testing.T) {
74 tests := map[string]struct {
75 wantFail bool
76 - prepare func(t *testing.T) (nu *NginxUnit, cleanup func())
76 + prepare func(t *testing.T) (collr *Collector, cleanup func())
77 }{
78 "success on valid response": {
79 wantFail: false,
@@ -99,25 +99,25 @@ func TestNginxUnit_Check(t *testing.T) {
99
100 for name, test := range tests {
101 t.Run(name, func(t *testing.T) {
102 - nu, cleanup := test.prepare(t)
102 + collr, cleanup := test.prepare(t)
103 defer cleanup()
104
105 if test.wantFail {
106 - assert.Error(t, nu.Check())
106 + assert.Error(t, collr.Check())
107 } else {
108 - assert.NoError(t, nu.Check())
108 + assert.NoError(t, collr.Check())
109 }
110 })
111 }
112 }
113
114 -func TestNginxUnit_Charts(t *testing.T) {
114 +func TestCollector_Charts(t *testing.T) {
115 assert.NotNil(t, New().Charts())
116 }
117
118 -func TestNginxUnit_Collect(t *testing.T) {
118 +func TestCollector_Collect(t *testing.T) {
119 tests := map[string]struct {
120 - prepare func(t *testing.T) (nu *NginxUnit, cleanup func())
120 + prepare func(t *testing.T) (collr *Collector, cleanup func())
121 wantNumOfCharts int
122 wantMetrics map[string]int64
123 }{
@@ -152,25 +152,25 @@ func TestNginxUnit_Collect(t *testing.T) {
152
153 for name, test := range tests {
154 t.Run(name, func(t *testing.T) {
155 - nu, cleanup := test.prepare(t)
155 + collr, cleanup := test.prepare(t)
156 defer cleanup()
157
158 - _ = nu.Check()
158 + _ = collr.Check()
159
160 - mx := nu.Collect()
160 + mx := collr.Collect()
161
162 require.Equal(t, test.wantMetrics, mx)
163
164 if len(test.wantMetrics) > 0 {
165 - assert.Equal(t, test.wantNumOfCharts, len(*nu.Charts()), "want charnu")
165 + assert.Equal(t, test.wantNumOfCharts, len(*collr.Charts()), "want charts")
166
167 - module.TestMetricsHasAllChartsDims(t, nu.Charts(), mx)
167 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
168 }
169 })
170 }
171 }
172
173 -func caseOk(t *testing.T) (*NginxUnit, func()) {
173 +func caseOk(t *testing.T) (*Collector, func()) {
174 t.Helper()
175 srv := httptest.NewServer(http.HandlerFunc(
176 func(w http.ResponseWriter, r *http.Request) {
@@ -181,14 +181,14 @@ func caseOk(t *testing.T) (*NginxUnit, func()) {
181 w.WriteHeader(http.StatusNotFound)
182 }
183 }))
184 - nu := New()
185 - nu.URL = srv.URL
186 - require.NoError(t, nu.Init())
184 + collr := New()
185 + collr.URL = srv.URL
186 + require.NoError(t, collr.Init())
187
188 - return nu, srv.Close
188 + return collr, srv.Close
189 }
190
191 -func caseUnexpectedJsonResponse(t *testing.T) (*NginxUnit, func()) {
191 +func caseUnexpectedJsonResponse(t *testing.T) (*Collector, func()) {
192 t.Helper()
193 resp := `
194 {
@@ -211,44 +211,44 @@ func caseUnexpectedJsonResponse(t *testing.T) (*NginxUnit, func()) {
211 func(w http.ResponseWriter, r *http.Request) {
212 _, _ = w.Write([]byte(resp))
213 }))
214 - nu := New()
215 - nu.URL = srv.URL
216 - require.NoError(t, nu.Init())
214 + collr := New()
215 + collr.URL = srv.URL
216 + require.NoError(t, collr.Init())
217
218 - return nu, srv.Close
218 + return collr, srv.Close
219 }
220
221 -func caseInvalidDataResponse(t *testing.T) (*NginxUnit, func()) {
221 +func caseInvalidDataResponse(t *testing.T) (*Collector, func()) {
222 t.Helper()
223 srv := httptest.NewServer(http.HandlerFunc(
224 func(w http.ResponseWriter, r *http.Request) {
225 _, _ = w.Write([]byte("hello and\n goodbye"))
226 }))
227 - nu := New()
228 - nu.URL = srv.URL
229 - require.NoError(t, nu.Init())
227 + collr := New()
228 + collr.URL = srv.URL
229 + require.NoError(t, collr.Init())
230
231 - return nu, srv.Close
231 + return collr, srv.Close
232 }
233
234 -func caseConnectionRefused(t *testing.T) (*NginxUnit, func()) {
234 +func caseConnectionRefused(t *testing.T) (*Collector, func()) {
235 t.Helper()
236 - nu := New()
237 - nu.URL = "http://127.0.0.1:65001"
238 - require.NoError(t, nu.Init())
236 + collr := New()
237 + collr.URL = "http://127.0.0.1:65001"
238 + require.NoError(t, collr.Init())
239
240 - return nu, func() {}
240 + return collr, func() {}
241 }
242
243 -func case404(t *testing.T) (*NginxUnit, func()) {
243 +func case404(t *testing.T) (*Collector, func()) {
244 t.Helper()
245 srv := httptest.NewServer(http.HandlerFunc(
246 func(w http.ResponseWriter, r *http.Request) {
247 w.WriteHeader(http.StatusNotFound)
248 }))
249 - nu := New()
250 - nu.URL = srv.URL
251 - require.NoError(t, nu.Init())
249 + collr := New()
250 + collr.URL = srv.URL
251 + require.NoError(t, collr.Init())
252
253 - return nu, srv.Close
253 + return collr, srv.Close
254 }
src/go/plugin/go.d/collector/nginxvts/collect.go
+12 -12
@@ -7,30 +7,30 @@ import (
7 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/web"
8 )
9
10 -func (vts *NginxVTS) collect() (map[string]int64, error) {
11 - ms, err := vts.scapeVTS()
10 +func (c *Collector) collect() (map[string]int64, error) {
11 + ms, err := c.scapeVTS()
12 if err != nil {
13 return nil, nil
14 }
15
16 collected := make(map[string]any)
17 - vts.collectMain(collected, ms)
18 - vts.collectSharedZones(collected, ms)
19 - vts.collectServerZones(collected, ms)
17 + c.collectMain(collected, ms)
18 + c.collectSharedZones(collected, ms)
19 + c.collectServerZones(collected, ms)
20
21 return stm.ToMap(collected), nil
22 }
23
24 -func (vts *NginxVTS) collectMain(collected map[string]any, ms *vtsMetrics) {
24 +func (c *Collector) collectMain(collected map[string]any, ms *vtsMetrics) {
25 collected["uptime"] = (ms.NowMsec - ms.LoadMsec) / 1000
26 collected["connections"] = ms.Connections
27 }
28
29 -func (vts *NginxVTS) collectSharedZones(collected map[string]any, ms *vtsMetrics) {
29 +func (c *Collector) collectSharedZones(collected map[string]any, ms *vtsMetrics) {
30 collected["sharedzones"] = ms.SharedZones
31 }
32
33 -func (vts *NginxVTS) collectServerZones(collected map[string]any, ms *vtsMetrics) {
33 +func (c *Collector) collectServerZones(collected map[string]any, ms *vtsMetrics) {
34 if !ms.hasServerZones() {
35 return
36 }
@@ -39,12 +39,12 @@ func (vts *NginxVTS) collectServerZones(collected map[string]any, ms *vtsMetrics
39 collected["total"] = ms.ServerZones["*"]
40 }
41
42 -func (vts *NginxVTS) scapeVTS() (*vtsMetrics, error) {
43 - req, _ := web.NewHTTPRequest(vts.RequestConfig)
42 +func (c *Collector) scapeVTS() (*vtsMetrics, error) {
43 + req, _ := web.NewHTTPRequest(c.RequestConfig)
44
45 var total vtsMetrics
46 - if err := web.DoHTTP(vts.httpClient).RequestJSON(req, &total); err != nil {
47 - vts.Warning(err)
46 + if err := web.DoHTTP(c.httpClient).RequestJSON(req, &total); err != nil {
47 + c.Warning(err)
48 return nil, err
49 }
50
src/go/plugin/go.d/collector/nginxvts/collector.go renamed
+21 -21
@@ -28,8 +28,8 @@ func init() {
28 })
29 }
30
31 -func New() *NginxVTS {
32 - return &NginxVTS{
31 +func New() *Collector {
32 + return &Collector{
33 Config: Config{
34 HTTPConfig: web.HTTPConfig{
35 RequestConfig: web.RequestConfig{
@@ -48,7 +48,7 @@ type Config struct {
48 web.HTTPConfig `yaml:",inline" json:""`
49 }
50
51 -type NginxVTS struct {
51 +type Collector struct {
52 module.Base
53 Config `yaml:",inline" json:""`
54
@@ -57,40 +57,40 @@ type NginxVTS struct {
57 httpClient *http.Client
58 }
59
60 -func (vts *NginxVTS) Configuration() any {
61 - return vts.Config
60 +func (c *Collector) Configuration() any {
61 + return c.Config
62 }
63
64 -func (vts *NginxVTS) Cleanup() {
65 - if vts.httpClient == nil {
64 +func (c *Collector) Cleanup() {
65 + if c.httpClient == nil {
66 return
67 }
68 - vts.httpClient.CloseIdleConnections()
68 + c.httpClient.CloseIdleConnections()
69 }
70
71 -func (vts *NginxVTS) Init() error {
72 - err := vts.validateConfig()
71 +func (c *Collector) Init() error {
72 + err := c.validateConfig()
73 if err != nil {
74 return fmt.Errorf("config: %v", err)
75 }
76
77 - httpClient, err := vts.initHTTPClient()
77 + httpClient, err := c.initHTTPClient()
78 if err != nil {
79 return fmt.Errorf("init HTTP client: %v", err)
80 }
81 - vts.httpClient = httpClient
81 + c.httpClient = httpClient
82
83 - charts, err := vts.initCharts()
83 + charts, err := c.initCharts()
84 if err != nil {
85 return fmt.Errorf("init charts: %v", err)
86 }
87 - vts.charts = charts
87 + c.charts = charts
88
89 return nil
90 }
91
92 -func (vts *NginxVTS) Check() error {
93 - mx, err := vts.collect()
92 +func (c *Collector) Check() error {
93 + mx, err := c.collect()
94 if err != nil {
95 return err
96 }
@@ -100,14 +100,14 @@ func (vts *NginxVTS) Check() error {
100 return nil
101 }
102
103 -func (vts *NginxVTS) Charts() *module.Charts {
104 - return vts.charts
103 +func (c *Collector) Charts() *module.Charts {
104 + return c.charts
105 }
106
107 -func (vts *NginxVTS) Collect() map[string]int64 {
108 - mx, err := vts.collect()
107 +func (c *Collector) Collect() map[string]int64 {
108 + mx, err := c.collect()
109 if err != nil {
110 - vts.Error(err)
110 + c.Error(err)
111 return nil
112 }
113 if len(mx) == 0 {
src/go/plugin/go.d/collector/nginxvts/collector_test.go renamed
+41 -42
@@ -33,11 +33,11 @@ func Test_testDataIsValid(t *testing.T) {
33 }
34 }
35
36 -func TestNginxVTS_ConfigurationSerialize(t *testing.T) {
37 - module.TestConfigurationSerialize(t, &NginxVTS{}, dataConfigJSON, dataConfigYAML)
36 +func TestCollector_ConfigurationSerialize(t *testing.T) {
37 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
38 }
39
40 -func TestNginxVTS_Init(t *testing.T) {
40 +func TestCollector_Init(t *testing.T) {
41 tests := map[string]struct {
42 config Config
43 wantNumOfCharts int
@@ -71,22 +71,22 @@ func TestNginxVTS_Init(t *testing.T) {
71
72 for name, test := range tests {
73 t.Run(name, func(t *testing.T) {
74 - es := New()
75 - es.Config = test.config
74 + collr := New()
75 + collr.Config = test.config
76
77 if test.wantFail {
78 - assert.Error(t, es.Init())
78 + assert.Error(t, collr.Init())
79 } else {
80 - assert.NoError(t, es.Init())
81 - assert.Equal(t, test.wantNumOfCharts, len(*es.Charts()))
80 + assert.NoError(t, collr.Init())
81 + assert.Equal(t, test.wantNumOfCharts, len(*collr.Charts()))
82 }
83 })
84 }
85 }
86
87 -func TestNginxVTS_Check(t *testing.T) {
87 +func TestCollector_Check(t *testing.T) {
88 tests := map[string]struct {
89 - prepare func(*testing.T) (vts *NginxVTS, cleanup func())
89 + prepare func(*testing.T) (collr *Collector, cleanup func())
90 wantFail bool
91 }{
92 "valid data": {prepare: prepareNginxVTSValidData},
@@ -97,30 +97,29 @@ func TestNginxVTS_Check(t *testing.T) {
97
98 for name, test := range tests {
99 t.Run(name, func(t *testing.T) {
100 - vts, cleanup := test.prepare(t)
100 + collr, cleanup := test.prepare(t)
101 defer cleanup()
102
103 if test.wantFail {
104 - assert.Error(t, vts.Check())
104 + assert.Error(t, collr.Check())
105 } else {
106 - assert.NoError(t, vts.Check())
106 + assert.NoError(t, collr.Check())
107 }
108 })
109 }
110 }
111
112 -func TestNginxVTS_Charts(t *testing.T) {
112 +func TestCollector_Charts(t *testing.T) {
113 assert.Nil(t, New().Charts())
114 }
115
116 -func TestNginxVTS_Cleanup(t *testing.T) {
116 +func TestCollector_Cleanup(t *testing.T) {
117 assert.NotPanics(t, New().Cleanup)
118 }
119
120 -func TestNginxVTS_Collect(t *testing.T) {
120 +func TestCollector_Collect(t *testing.T) {
121 tests := map[string]struct {
122 - // prepare func() *NginxVTS
123 - prepare func(t *testing.T) (vts *NginxVTS, cleanup func())
122 + prepare func(t *testing.T) (collr *Collector, cleanup func())
123 wantCollected map[string]int64
124 checkCharts bool
125 }{
@@ -167,67 +166,67 @@ func TestNginxVTS_Collect(t *testing.T) {
166
167 for name, test := range tests {
168 t.Run(name, func(t *testing.T) {
170 - vts, cleanup := test.prepare(t)
169 + collr, cleanup := test.prepare(t)
170 defer cleanup()
171
173 - mx := vts.Collect()
172 + mx := collr.Collect()
173
174 assert.Equal(t, test.wantCollected, mx)
175 if test.checkCharts {
177 - module.TestMetricsHasAllChartsDims(t, vts.Charts(), mx)
176 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
177 }
178 })
179 }
180 }
181
183 -func prepareNginxVTS(t *testing.T, createNginxVTS func() *NginxVTS) (vts *NginxVTS, cleanup func()) {
182 +func prepareNginxVTS(t *testing.T, createNginxVTS func() *Collector) (collr *Collector, cleanup func()) {
183 t.Helper()
185 - vts = createNginxVTS()
184 + collr = createNginxVTS()
185 srv := prepareNginxVTSEndpoint()
187 - vts.URL = srv.URL
186 + collr.URL = srv.URL
187
189 - require.NoError(t, vts.Init())
188 + require.NoError(t, collr.Init())
189
191 - return vts, srv.Close
190 + return collr, srv.Close
191 }
192
194 -func prepareNginxVTSValidData(t *testing.T) (vts *NginxVTS, cleanup func()) {
193 +func prepareNginxVTSValidData(t *testing.T) (collr *Collector, cleanup func()) {
194 return prepareNginxVTS(t, New)
195 }
196
198 -func prepareNginxVTSInvalidData(t *testing.T) (*NginxVTS, func()) {
197 +func prepareNginxVTSInvalidData(t *testing.T) (*Collector, func()) {
198 t.Helper()
199 srv := httptest.NewServer(http.HandlerFunc(
200 func(w http.ResponseWriter, r *http.Request) {
201 _, _ = w.Write([]byte("hello and\n goodbye"))
202 }))
204 - vts := New()
205 - vts.URL = srv.URL
206 - require.NoError(t, vts.Init())
203 + collr := New()
204 + collr.URL = srv.URL
205 + require.NoError(t, collr.Init())
206
208 - return vts, srv.Close
207 + return collr, srv.Close
208 }
209
211 -func prepareNginxVTS404(t *testing.T) (*NginxVTS, func()) {
210 +func prepareNginxVTS404(t *testing.T) (*Collector, func()) {
211 t.Helper()
212 srv := httptest.NewServer(http.HandlerFunc(
213 func(w http.ResponseWriter, r *http.Request) {
214 w.WriteHeader(http.StatusNotFound)
215 }))
217 - vts := New()
218 - vts.URL = srv.URL
219 - require.NoError(t, vts.Init())
216 + collr := New()
217 + collr.URL = srv.URL
218 + require.NoError(t, collr.Init())
219
221 - return vts, srv.Close
220 + return collr, srv.Close
221 }
222
224 -func prepareNginxVTSConnectionRefused(t *testing.T) (*NginxVTS, func()) {
223 +func prepareNginxVTSConnectionRefused(t *testing.T) (*Collector, func()) {
224 t.Helper()
226 - vts := New()
227 - vts.URL = "http://127.0.0.1:18080"
228 - require.NoError(t, vts.Init())
225 + collr := New()
226 + collr.URL = "http://127.0.0.1:18080"
227 + require.NoError(t, collr.Init())
228
230 - return vts, func() {}
229 + return collr, func() {}
230 }
231
232 func prepareNginxVTSEndpoint() *httptest.Server {
src/go/plugin/go.d/collector/nginxvts/init.go
+6 -6
@@ -10,22 +10,22 @@ import (
10 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/web"
11 )
12
13 -func (vts *NginxVTS) validateConfig() error {
14 - if vts.URL == "" {
13 +func (c *Collector) validateConfig() error {
14 + if c.URL == "" {
15 return errors.New("URL not set")
16 }
17
18 - if _, err := web.NewHTTPRequest(vts.RequestConfig); err != nil {
18 + if _, err := web.NewHTTPRequest(c.RequestConfig); err != nil {
19 return err
20 }
21 return nil
22 }
23
24 -func (vts *NginxVTS) initHTTPClient() (*http.Client, error) {
25 - return web.NewHTTPClient(vts.ClientConfig)
24 +func (c *Collector) initHTTPClient() (*http.Client, error) {
25 + return web.NewHTTPClient(c.ClientConfig)
26 }
27
28 -func (vts *NginxVTS) initCharts() (*module.Charts, error) {
28 +func (c *Collector) initCharts() (*module.Charts, error) {
29 charts := module.Charts{}
30
31 if err := charts.Add(*mainCharts.Copy()...); err != nil {
src/go/plugin/go.d/collector/nsd/collect.go
+6 -6
@@ -12,8 +12,8 @@ import (
12 "strings"
13 )
14
15 -func (n *Nsd) collect() (map[string]int64, error) {
16 - stats, err := n.exec.stats()
15 +func (c *Collector) collect() (map[string]int64, error) {
16 + stats, err := c.exec.stats()
17 if err != nil {
18 return nil, err
19 }
@@ -27,7 +27,7 @@ func (n *Nsd) collect() (map[string]int64, error) {
27 sc := bufio.NewScanner(bytes.NewReader(stats))
28
29 for sc.Scan() {
30 - n.collectStatsLine(mx, sc.Text())
30 + c.collectStatsLine(mx, sc.Text())
31 }
32
33 if len(mx) == 0 {
@@ -42,14 +42,14 @@ func (n *Nsd) collect() (map[string]int64, error) {
42 return mx, nil
43 }
44
45 -func (n *Nsd) collectStatsLine(mx map[string]int64, line string) {
45 +func (c *Collector) collectStatsLine(mx map[string]int64, line string) {
46 if line = strings.TrimSpace(line); line == "" {
47 return
48 }
49
50 key, value, ok := strings.Cut(line, "=")
51 if !ok {
52 - n.Debugf("invalid line in stats: '%s'", line)
52 + c.Debugf("invalid line in stats: '%s'", line)
53 return
54 }
55
@@ -66,7 +66,7 @@ func (n *Nsd) collectStatsLine(mx map[string]int64, line string) {
66 }
67
68 if err != nil {
69 - n.Debugf("invalid value in stats line '%s': '%s'", line, value)
69 + c.Debugf("invalid value in stats line '%s': '%s'", line, value)
70 return
71 }
72
src/go/plugin/go.d/collector/nsd/collector.go renamed
+16 -16
@@ -28,8 +28,8 @@ func init() {
28 })
29 }
30
31 -func New() *Nsd {
32 - return &Nsd{
31 +func New() *Collector {
32 + return &Collector{
33 Config: Config{
34 Timeout: confopt.Duration(time.Second * 2),
35 },
@@ -42,7 +42,7 @@ type Config struct {
42 Timeout confopt.Duration `yaml:"timeout,omitempty" json:"timeout"`
43 }
44
45 -type Nsd struct {
45 +type Collector struct {
46 module.Base
47 Config `yaml:",inline" json:""`
48
@@ -51,22 +51,22 @@ type Nsd struct {
51 exec nsdControlBinary
52 }
53
54 -func (n *Nsd) Configuration() any {
55 - return n.Config
54 +func (c *Collector) Configuration() any {
55 + return c.Config
56 }
57
58 -func (n *Nsd) Init() error {
59 - nsdControl, err := n.initNsdControlExec()
58 +func (c *Collector) Init() error {
59 + nsdControl, err := c.initNsdControlExec()
60 if err != nil {
61 return fmt.Errorf("nsd-control exec initialization: %v", err)
62 }
63 - n.exec = nsdControl
63 + c.exec = nsdControl
64
65 return nil
66 }
67
68 -func (n *Nsd) Check() error {
69 - mx, err := n.collect()
68 +func (c *Collector) Check() error {
69 + mx, err := c.collect()
70 if err != nil {
71 return err
72 }
@@ -78,14 +78,14 @@ func (n *Nsd) Check() error {
78 return nil
79 }
80
81 -func (n *Nsd) Charts() *module.Charts {
82 - return n.charts
81 +func (c *Collector) Charts() *module.Charts {
82 + return c.charts
83 }
84
85 -func (n *Nsd) Collect() map[string]int64 {
86 - mx, err := n.collect()
85 +func (c *Collector) Collect() map[string]int64 {
86 + mx, err := c.collect()
87 if err != nil {
88 - n.Error(err)
88 + c.Error(err)
89 }
90
91 if len(mx) == 0 {
@@ -95,4 +95,4 @@ func (n *Nsd) Collect() map[string]int64 {
95 return mx
96 }
97
98 -func (n *Nsd) Cleanup() {}
98 +func (c *Collector) Cleanup() {}
src/go/plugin/go.d/collector/nsd/collector_test.go renamed
+34 -34
@@ -33,11 +33,11 @@ func Test_testDataIsValid(t *testing.T) {
33 }
34 }
35
36 -func TestNsd_Configuration(t *testing.T) {
37 - module.TestConfigurationSerialize(t, &Nsd{}, dataConfigJSON, dataConfigYAML)
36 +func TestCollector_Configuration(t *testing.T) {
37 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
38 }
39
40 -func TestNsd_Init(t *testing.T) {
40 +func TestCollector_Init(t *testing.T) {
41 tests := map[string]struct {
42 config Config
43 wantFail bool
@@ -50,59 +50,59 @@ func TestNsd_Init(t *testing.T) {
50
51 for name, test := range tests {
52 t.Run(name, func(t *testing.T) {
53 - nsd := New()
54 - nsd.Config = test.config
53 + collr := New()
54 + collr.Config = test.config
55
56 if test.wantFail {
57 - assert.Error(t, nsd.Init())
57 + assert.Error(t, collr.Init())
58 } else {
59 - assert.NoError(t, nsd.Init())
59 + assert.NoError(t, collr.Init())
60 }
61 })
62 }
63 }
64
65 -func TestNsd_Cleanup(t *testing.T) {
65 +func TestCollector_Cleanup(t *testing.T) {
66 tests := map[string]struct {
67 - prepare func() *Nsd
67 + prepare func() *Collector
68 }{
69 "not initialized exec": {
70 - prepare: func() *Nsd {
70 + prepare: func() *Collector {
71 return New()
72 },
73 },
74 "after check": {
75 - prepare: func() *Nsd {
76 - nsd := New()
77 - nsd.exec = prepareMockOK()
78 - _ = nsd.Check()
79 - return nsd
75 + prepare: func() *Collector {
76 + collr := New()
77 + collr.exec = prepareMockOK()
78 + _ = collr.Check()
79 + return collr
80 },
81 },
82 "after collect": {
83 - prepare: func() *Nsd {
84 - nsd := New()
85 - nsd.exec = prepareMockOK()
86 - _ = nsd.Collect()
87 - return nsd
83 + prepare: func() *Collector {
84 + collr := New()
85 + collr.exec = prepareMockOK()
86 + _ = collr.Collect()
87 + return collr
88 },
89 },
90 }
91
92 for name, test := range tests {
93 t.Run(name, func(t *testing.T) {
94 - nsd := test.prepare()
94 + collr := test.prepare()
95
96 - assert.NotPanics(t, nsd.Cleanup)
96 + assert.NotPanics(t, collr.Cleanup)
97 })
98 }
99 }
100
101 -func TestNsd_Charts(t *testing.T) {
101 +func TestCollector_Charts(t *testing.T) {
102 assert.NotNil(t, New().Charts())
103 }
104
105 -func TestNsd_Check(t *testing.T) {
105 +func TestCollector_Check(t *testing.T) {
106 tests := map[string]struct {
107 prepareMock func() *mockNsdControl
108 wantFail bool
@@ -127,20 +127,20 @@ func TestNsd_Check(t *testing.T) {
127
128 for name, test := range tests {
129 t.Run(name, func(t *testing.T) {
130 - nsd := New()
130 + collr := New()
131 mock := test.prepareMock()
132 - nsd.exec = mock
132 + collr.exec = mock
133
134 if test.wantFail {
135 - assert.Error(t, nsd.Check())
135 + assert.Error(t, collr.Check())
136 } else {
137 - assert.NoError(t, nsd.Check())
137 + assert.NoError(t, collr.Check())
138 }
139 })
140 }
141 }
142
143 -func TestNsd_Collect(t *testing.T) {
143 +func TestCollector_Collect(t *testing.T) {
144 tests := map[string]struct {
145 prepareMock func() *mockNsdControl
146 wantMetrics map[string]int64
@@ -284,17 +284,17 @@ func TestNsd_Collect(t *testing.T) {
284
285 for name, test := range tests {
286 t.Run(name, func(t *testing.T) {
287 - nsd := New()
287 + collr := New()
288 mock := test.prepareMock()
289 - nsd.exec = mock
289 + collr.exec = mock
290
291 - mx := nsd.Collect()
291 + mx := collr.Collect()
292
293 assert.Equal(t, test.wantMetrics, mx)
294
295 if len(test.wantMetrics) > 0 {
296 - assert.Len(t, *nsd.Charts(), len(charts))
297 - module.TestMetricsHasAllChartsDims(t, nsd.Charts(), mx)
296 + assert.Len(t, *collr.Charts(), len(charts))
297 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
298 }
299 })
300 }
src/go/plugin/go.d/collector/nsd/init.go
+2 -2
@@ -12,14 +12,14 @@ import (
12 "github.com/netdata/netdata/go/plugins/pkg/executable"
13 )
14
15 -func (n *Nsd) initNsdControlExec() (nsdControlBinary, error) {
15 +func (c *Collector) initNsdControlExec() (nsdControlBinary, error) {
16 ndsudoPath := filepath.Join(executable.Directory, "ndsudo")
17 if _, err := os.Stat(ndsudoPath); err != nil {
18 return nil, fmt.Errorf("ndsudo executable not found: %v", err)
19
20 }
21
22 - nsdControl := newNsdControlExec(ndsudoPath, n.Timeout.Duration(), n.Logger)
22 + nsdControl := newNsdControlExec(ndsudoPath, c.Timeout.Duration(), c.Logger)
23
24 return nsdControl, nil
25 }
src/go/plugin/go.d/collector/ntpd/charts.go
+5 -5
@@ -316,7 +316,7 @@ var (
316 }
317 )
318
319 -func (n *NTPd) addPeerCharts(addr string) {
319 +func (c *Collector) addPeerCharts(addr string) {
320 charts := peerChartsTmpl.Copy()
321
322 for _, chart := range *charts {
@@ -329,15 +329,15 @@ func (n *NTPd) addPeerCharts(addr string) {
329 }
330 }
331
332 - if err := n.Charts().Add(*charts...); err != nil {
333 - n.Warning(err)
332 + if err := c.Charts().Add(*charts...); err != nil {
333 + c.Warning(err)
334 }
335 }
336
337 -func (n *NTPd) removePeerCharts(addr string) {
337 +func (c *Collector) removePeerCharts(addr string) {
338 px := fmt.Sprintf("peer_%s", strings.ReplaceAll(addr, ".", "_"))
339
340 - for _, chart := range *n.Charts() {
340 + for _, chart := range *c.Charts() {
341 if strings.HasPrefix(chart.ID, px) {
342 chart.MarkRemove()
343 chart.MarkNotCreated()
src/go/plugin/go.d/collector/ntpd/client.go
+7
@@ -9,6 +9,13 @@ import (
9 "github.com/facebook/time/ntp/control"
10 )
11
12 +type ntpConn interface {
13 + systemInfo() (map[string]string, error)
14 + peerInfo(id uint16) (map[string]string, error)
15 + peerIDs() ([]uint16, error)
16 + close()
17 +}
18 +
19 func newNTPClient(c Config) (ntpConn, error) {
20 conn, err := net.DialTimeout("udp", c.Address, c.Timeout.Duration())
21 if err != nil {
src/go/plugin/go.d/collector/ntpd/collect.go
+35 -35
@@ -13,36 +13,36 @@ const (
13 precision = 1000000
14 )
15
16 -func (n *NTPd) collect() (map[string]int64, error) {
17 - if n.client == nil {
18 - client, err := n.newClient(n.Config)
16 +func (c *Collector) collect() (map[string]int64, error) {
17 + if c.client == nil {
18 + client, err := c.newClient(c.Config)
19 if err != nil {
20 return nil, fmt.Errorf("creating NTP client: %v", err)
21 }
22 - n.client = client
22 + c.client = client
23 }
24
25 mx := make(map[string]int64)
26
27 - if err := n.collectInfo(mx); err != nil {
27 + if err := c.collectInfo(mx); err != nil {
28 return nil, err
29 }
30
31 - if n.CollectPeers {
32 - if now := time.Now(); now.Sub(n.findPeersTime) > n.findPeersEvery {
33 - n.findPeersTime = now
34 - if err := n.findPeers(); err != nil {
35 - n.Warning(err)
31 + if c.CollectPeers {
32 + if now := time.Now(); now.Sub(c.findPeersTime) > c.findPeersEvery {
33 + c.findPeersTime = now
34 + if err := c.findPeers(); err != nil {
35 + c.Warning(err)
36 }
37 }
38 - n.collectPeersInfo(mx)
38 + c.collectPeersInfo(mx)
39 }
40
41 return mx, nil
42 }
43
44 -func (n *NTPd) collectInfo(mx map[string]int64) error {
45 - info, err := n.client.systemInfo()
44 +func (c *Collector) collectInfo(mx map[string]int64) error {
45 + info, err := c.client.systemInfo()
46 if err != nil {
47 return fmt.Errorf("error on querying system info: %v", err)
48 }
@@ -69,11 +69,11 @@ func (n *NTPd) collectInfo(mx map[string]int64) error {
69 return nil
70 }
71
72 -func (n *NTPd) collectPeersInfo(mx map[string]int64) {
73 - for _, id := range n.peerIDs {
74 - info, err := n.client.peerInfo(id)
72 +func (c *Collector) collectPeersInfo(mx map[string]int64) {
73 + for _, id := range c.peerIDs {
74 + info, err := c.client.peerInfo(id)
75 if err != nil {
76 - n.Warningf("error on querying NTP peer info id='%d': %v", id, err)
76 + c.Warningf("error on querying NTP peer info id='%d': %v", id, err)
77 continue
78 }
79
@@ -106,47 +106,47 @@ func (n *NTPd) collectPeersInfo(mx map[string]int64) {
106 }
107 }
108
109 -func (n *NTPd) findPeers() error {
110 - n.peerIDs = n.peerIDs[:0]
109 +func (c *Collector) findPeers() error {
110 + c.peerIDs = c.peerIDs[:0]
111
112 - n.Debug("querying NTP peers")
113 - peers, err := n.client.peerIDs()
112 + c.Debug("querying NTP peers")
113 + peers, err := c.client.peerIDs()
114 if err != nil {
115 return fmt.Errorf("querying NTP peers: %v", err)
116 }
117
118 - n.Debugf("found %d NTP peers (ids: %v)", len(peers), peers)
118 + c.Debugf("found %d NTP peers (ids: %v)", len(peers), peers)
119 seen := make(map[string]bool)
120
121 for _, id := range peers {
122 - info, err := n.client.peerInfo(id)
122 + info, err := c.client.peerInfo(id)
123 if err != nil {
124 - n.Debugf("error on querying NTP peer info id='%d': %v", id, err)
124 + c.Debugf("error on querying NTP peer info id='%d': %v", id, err)
125 continue
126 }
127
128 addr, ok := info["srcadr"]
129 - if ip := net.ParseIP(addr); !ok || ip == nil || n.peerIPAddrFilter.Contains(ip) {
130 - n.Debugf("skipping NTP peer id='%d', srcadr='%s'", id, addr)
129 + if ip := net.ParseIP(addr); !ok || ip == nil || c.peerIPAddrFilter.Contains(ip) {
130 + c.Debugf("skipping NTP peer id='%d', srcadr='%s'", id, addr)
131 continue
132 }
133
134 seen[addr] = true
135
136 - if !n.peerAddr[addr] {
137 - n.peerAddr[addr] = true
138 - n.Debugf("new NTP peer id='%d', srcadr='%s': creating charts", id, addr)
139 - n.addPeerCharts(addr)
136 + if !c.peerAddr[addr] {
137 + c.peerAddr[addr] = true
138 + c.Debugf("new NTP peer id='%d', srcadr='%s': creating charts", id, addr)
139 + c.addPeerCharts(addr)
140 }
141
142 - n.peerIDs = append(n.peerIDs, id)
142 + c.peerIDs = append(c.peerIDs, id)
143 }
144
145 - for addr := range n.peerAddr {
145 + for addr := range c.peerAddr {
146 if !seen[addr] {
147 - delete(n.peerAddr, addr)
148 - n.Debugf("stale NTP peer srcadr='%s': removing charts", addr)
149 - n.removePeerCharts(addr)
147 + delete(c.peerAddr, addr)
148 + c.Debugf("stale NTP peer srcadr='%s': removing charts", addr)
149 + c.removePeerCharts(addr)
150 }
151 }
152
src/go/plugin/go.d/collector/ntpd/collector.go renamed
+30 -38
@@ -24,8 +24,8 @@ func init() {
24 })
25 }
26
27 -func New() *NTPd {
28 - return &NTPd{
27 +func New() *Collector {
28 + return &Collector{
29 Config: Config{
30 Address: "127.0.0.1:123",
31 Timeout: confopt.Duration(time.Second),
@@ -45,36 +45,28 @@ type Config struct {
45 CollectPeers bool `yaml:"collect_peers" json:"collect_peers"`
46 }
47
48 -type (
49 - NTPd struct {
50 - module.Base
51 - Config `yaml:",inline" json:""`
48 +type Collector struct {
49 + module.Base
50 + Config `yaml:",inline" json:""`
51
53 - charts *module.Charts
52 + charts *module.Charts
53
55 - client ntpConn
56 - newClient func(c Config) (ntpConn, error)
54 + client ntpConn
55 + newClient func(c Config) (ntpConn, error)
56
58 - findPeersTime time.Time
59 - findPeersEvery time.Duration
60 - peerAddr map[string]bool
61 - peerIDs []uint16
62 - peerIPAddrFilter iprange.Pool
63 - }
64 - ntpConn interface {
65 - systemInfo() (map[string]string, error)
66 - peerInfo(id uint16) (map[string]string, error)
67 - peerIDs() ([]uint16, error)
68 - close()
69 - }
70 -)
57 + findPeersTime time.Time
58 + findPeersEvery time.Duration
59 + peerAddr map[string]bool
60 + peerIDs []uint16
61 + peerIPAddrFilter iprange.Pool
62 +}
63
72 -func (n *NTPd) Configuration() any {
73 - return n.Config
64 +func (c *Collector) Configuration() any {
65 + return c.Config
66 }
67
76 -func (n *NTPd) Init() error {
77 - if n.Address == "" {
68 +func (c *Collector) Init() error {
69 + if c.Address == "" {
70 return errors.New("config: 'address' can not be empty")
71 }
72
@@ -84,13 +76,13 @@ func (n *NTPd) Init() error {
76 return fmt.Errorf("error on parsing ip range '%s': %v", txt, err)
77 }
78
87 - n.peerIPAddrFilter = r
79 + c.peerIPAddrFilter = r
80
81 return nil
82 }
83
92 -func (n *NTPd) Check() error {
93 - mx, err := n.collect()
84 +func (c *Collector) Check() error {
85 + mx, err := c.collect()
86 if err != nil {
87 return err
88 }
@@ -100,14 +92,14 @@ func (n *NTPd) Check() error {
92 return nil
93 }
94
103 -func (n *NTPd) Charts() *module.Charts {
104 - return n.charts
95 +func (c *Collector) Charts() *module.Charts {
96 + return c.charts
97 }
98
107 -func (n *NTPd) Collect() map[string]int64 {
108 - mx, err := n.collect()
99 +func (c *Collector) Collect() map[string]int64 {
100 + mx, err := c.collect()
101 if err != nil {
110 - n.Error(err)
102 + c.Error(err)
103 }
104
105 if len(mx) == 0 {
@@ -116,9 +108,9 @@ func (n *NTPd) Collect() map[string]int64 {
108 return mx
109 }
110
119 -func (n *NTPd) Cleanup() {
120 - if n.client != nil {
121 - n.client.close()
122 - n.client = nil
111 +func (c *Collector) Cleanup() {
112 + if c.client != nil {
113 + c.client.close()
114 + c.client = nil
115 }
116 }
src/go/plugin/go.d/collector/ntpd/collector_test.go renamed
+46 -46
@@ -28,11 +28,11 @@ func Test_testDataIsValid(t *testing.T) {
28 }
29 }
30
31 -func TestNTPd_ConfigurationSerialize(t *testing.T) {
32 - module.TestConfigurationSerialize(t, &NTPd{}, dataConfigJSON, dataConfigYAML)
31 +func TestCollector_ConfigurationSerialize(t *testing.T) {
32 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
33 }
34
35 -func TestNTPd_Init(t *testing.T) {
35 +func TestCollector_Init(t *testing.T) {
36 tests := map[string]struct {
37 config Config
38 wantFail bool
@@ -50,52 +50,52 @@ func TestNTPd_Init(t *testing.T) {
50
51 for name, test := range tests {
52 t.Run(name, func(t *testing.T) {
53 - n := New()
54 - n.Config = test.config
53 + collr := New()
54 + collr.Config = test.config
55
56 if test.wantFail {
57 - assert.Error(t, n.Init())
57 + assert.Error(t, collr.Init())
58 } else {
59 - assert.NoError(t, n.Init())
59 + assert.NoError(t, collr.Init())
60 }
61 })
62 }
63 }
64
65 -func TestNTPd_Charts(t *testing.T) {
65 +func TestCollector_Charts(t *testing.T) {
66 assert.Equal(t, len(systemCharts), len(*New().Charts()))
67 }
68
69 -func TestNTPd_Cleanup(t *testing.T) {
69 +func TestCollector_Cleanup(t *testing.T) {
70 tests := map[string]struct {
71 - prepare func(*NTPd)
71 + prepare func(*Collector)
72 wantClose bool
73 }{
74 "after New": {
75 wantClose: false,
76 - prepare: func(*NTPd) {},
76 + prepare: func(*Collector) {},
77 },
78 "after Init": {
79 wantClose: false,
80 - prepare: func(n *NTPd) { _ = n.Init() },
80 + prepare: func(n *Collector) { _ = n.Init() },
81 },
82 "after Check": {
83 wantClose: true,
84 - prepare: func(n *NTPd) { _ = n.Init(); _ = n.Check() },
84 + prepare: func(n *Collector) { _ = n.Init(); _ = n.Check() },
85 },
86 "after Collect": {
87 wantClose: true,
88 - prepare: func(n *NTPd) { _ = n.Init(); n.Collect() },
88 + prepare: func(n *Collector) { _ = n.Init(); n.Collect() },
89 },
90 }
91
92 for name, test := range tests {
93 t.Run(name, func(t *testing.T) {
94 m := &mockClient{}
95 - n := prepareNTPdWithMock(m, true)
96 - test.prepare(n)
95 + collr := prepareNTPdWithMock(m, true)
96 + test.prepare(collr)
97
98 - require.NotPanics(t, n.Cleanup)
98 + require.NotPanics(t, collr.Cleanup)
99
100 if test.wantClose {
101 assert.True(t, m.closeCalled)
@@ -106,57 +106,57 @@ func TestNTPd_Cleanup(t *testing.T) {
106 }
107 }
108
109 -func TestNTPd_Check(t *testing.T) {
109 +func TestCollector_Check(t *testing.T) {
110 tests := map[string]struct {
111 - prepare func() *NTPd
111 + prepare func() *Collector
112 wantFail bool
113 }{
114 "system: success, peers: success": {
115 wantFail: false,
116 - prepare: func() *NTPd { return prepareNTPdWithMock(&mockClient{}, true) },
116 + prepare: func() *Collector { return prepareNTPdWithMock(&mockClient{}, true) },
117 },
118 "system: success, list peers: fails": {
119 wantFail: false,
120 - prepare: func() *NTPd { return prepareNTPdWithMock(&mockClient{errOnPeerIDs: true}, true) },
120 + prepare: func() *Collector { return prepareNTPdWithMock(&mockClient{errOnPeerIDs: true}, true) },
121 },
122 "system: success, peers info: fails": {
123 wantFail: false,
124 - prepare: func() *NTPd { return prepareNTPdWithMock(&mockClient{errOnPeerInfo: true}, true) },
124 + prepare: func() *Collector { return prepareNTPdWithMock(&mockClient{errOnPeerInfo: true}, true) },
125 },
126 "system: fails": {
127 wantFail: true,
128 - prepare: func() *NTPd { return prepareNTPdWithMock(&mockClient{errOnSystemInfo: true}, true) },
128 + prepare: func() *Collector { return prepareNTPdWithMock(&mockClient{errOnSystemInfo: true}, true) },
129 },
130 "fail on creating client": {
131 wantFail: true,
132 - prepare: func() *NTPd { return prepareNTPdWithMock(nil, true) },
132 + prepare: func() *Collector { return prepareNTPdWithMock(nil, true) },
133 },
134 }
135
136 for name, test := range tests {
137 t.Run(name, func(t *testing.T) {
138 - n := test.prepare()
138 + collr := test.prepare()
139
140 - require.NoError(t, n.Init())
140 + require.NoError(t, collr.Init())
141
142 if test.wantFail {
143 - assert.Error(t, n.Check())
143 + assert.Error(t, collr.Check())
144 } else {
145 - assert.NoError(t, n.Check())
145 + assert.NoError(t, collr.Check())
146 }
147 })
148 }
149
150 }
151
152 -func TestNTPd_Collect(t *testing.T) {
152 +func TestCollector_Collect(t *testing.T) {
153 tests := map[string]struct {
154 - prepare func() *NTPd
154 + prepare func() *Collector
155 expected map[string]int64
156 expectedCharts int
157 }{
158 "system: success, peers: success": {
159 - prepare: func() *NTPd { return prepareNTPdWithMock(&mockClient{}, true) },
159 + prepare: func() *Collector { return prepareNTPdWithMock(&mockClient{}, true) },
160 expected: map[string]int64{
161 "clk_jitter": 626000,
162 "clk_wander": 81000,
@@ -211,7 +211,7 @@ func TestNTPd_Collect(t *testing.T) {
211 expectedCharts: len(systemCharts) + len(peerChartsTmpl)*3,
212 },
213 "system: success, list peers: fails": {
214 - prepare: func() *NTPd { return prepareNTPdWithMock(&mockClient{errOnPeerIDs: true}, true) },
214 + prepare: func() *Collector { return prepareNTPdWithMock(&mockClient{errOnPeerIDs: true}, true) },
215 expected: map[string]int64{
216 "clk_jitter": 626000,
217 "clk_wander": 81000,
@@ -227,7 +227,7 @@ func TestNTPd_Collect(t *testing.T) {
227 expectedCharts: len(systemCharts),
228 },
229 "system: success, peers info: fails": {
230 - prepare: func() *NTPd { return prepareNTPdWithMock(&mockClient{errOnPeerInfo: true}, true) },
230 + prepare: func() *Collector { return prepareNTPdWithMock(&mockClient{errOnPeerInfo: true}, true) },
231 expected: map[string]int64{
232 "clk_jitter": 626000,
233 "clk_wander": 81000,
@@ -243,12 +243,12 @@ func TestNTPd_Collect(t *testing.T) {
243 expectedCharts: len(systemCharts),
244 },
245 "system: fails": {
246 - prepare: func() *NTPd { return prepareNTPdWithMock(&mockClient{errOnSystemInfo: true}, true) },
246 + prepare: func() *Collector { return prepareNTPdWithMock(&mockClient{errOnSystemInfo: true}, true) },
247 expected: nil,
248 expectedCharts: len(systemCharts),
249 },
250 "fail on creating client": {
251 - prepare: func() *NTPd { return prepareNTPdWithMock(nil, true) },
251 + prepare: func() *Collector { return prepareNTPdWithMock(nil, true) },
252 expected: nil,
253 expectedCharts: len(systemCharts),
254 },
@@ -256,28 +256,28 @@ func TestNTPd_Collect(t *testing.T) {
256
257 for name, test := range tests {
258 t.Run(name, func(t *testing.T) {
259 - n := test.prepare()
259 + collr := test.prepare()
260
261 - require.NoError(t, n.Init())
262 - _ = n.Check()
261 + require.NoError(t, collr.Init())
262 + _ = collr.Check()
263
264 - mx := n.Collect()
264 + mx := collr.Collect()
265
266 assert.Equal(t, test.expected, mx)
267 - assert.Equal(t, test.expectedCharts, len(*n.Charts()))
267 + assert.Equal(t, test.expectedCharts, len(*collr.Charts()))
268 })
269 }
270 }
271
272 -func prepareNTPdWithMock(m *mockClient, collectPeers bool) *NTPd {
273 - n := New()
274 - n.CollectPeers = collectPeers
272 +func prepareNTPdWithMock(m *mockClient, collectPeers bool) *Collector {
273 + collr := New()
274 + collr.CollectPeers = collectPeers
275 if m == nil {
276 - n.newClient = func(_ Config) (ntpConn, error) { return nil, errors.New("mock.newClient error") }
276 + collr.newClient = func(_ Config) (ntpConn, error) { return nil, errors.New("mock.newClient error") }
277 } else {
278 - n.newClient = func(_ Config) (ntpConn, error) { return m, nil }
278 + collr.newClient = func(_ Config) (ntpConn, error) { return m, nil }
279 }
280 - return n
280 + return collr
281 }
282
283 type mockClient struct {
src/go/plugin/go.d/collector/nvidia_smi/charts.go
+8 -8
@@ -262,7 +262,7 @@ var (
262 }
263 )
264
265 -func (nv *NvidiaSmi) addGpuCharts(gpu gpuInfo, index int) {
265 +func (c *Collector) addGpuCharts(gpu gpuInfo, index int) {
266 charts := gpuXMLCharts.Copy()
267
268 if !isValidValue(gpu.Utilization.GpuUtil) {
@@ -304,8 +304,8 @@ func (nv *NvidiaSmi) addGpuCharts(gpu gpuInfo, index int) {
304 }
305 }
306
307 - if err := nv.Charts().Add(*charts...); err != nil {
308 - nv.Warning(err)
307 + if err := c.Charts().Add(*charts...); err != nil {
308 + c.Warning(err)
309 }
310 }
311
@@ -339,7 +339,7 @@ var (
339 }
340 )
341
342 -func (nv *NvidiaSmi) addMIGDeviceCharts(gpu gpuInfo, mig gpuMIGDeviceInfo) {
342 +func (c *Collector) addMIGDeviceCharts(gpu gpuInfo, mig gpuMIGDeviceInfo) {
343 charts := migDeviceXMLCharts.Copy()
344
345 for _, c := range *charts {
@@ -354,15 +354,15 @@ func (nv *NvidiaSmi) addMIGDeviceCharts(gpu gpuInfo, mig gpuMIGDeviceInfo) {
354 }
355 }
356
357 - if err := nv.Charts().Add(*charts...); err != nil {
358 - nv.Warning(err)
357 + if err := c.Charts().Add(*charts...); err != nil {
358 + c.Warning(err)
359 }
360 }
361
362 -func (nv *NvidiaSmi) removeCharts(prefix string) {
362 +func (c *Collector) removeCharts(prefix string) {
363 prefix = strings.ToLower(prefix)
364
365 - for _, c := range *nv.Charts() {
365 + for _, c := range *c.Charts() {
366 if strings.HasPrefix(c.ID, prefix) {
367 c.MarkRemove()
368 c.MarkNotCreated()
src/go/plugin/go.d/collector/nvidia_smi/collect.go
+17 -17
@@ -12,22 +12,22 @@ import (
12 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/metrix"
13 )
14
15 -func (nv *NvidiaSmi) collect() (map[string]int64, error) {
16 - if nv.exec == nil {
15 +func (c *Collector) collect() (map[string]int64, error) {
16 + if c.exec == nil {
17 return nil, errors.New("nvidia-smi exec is not initialized")
18 }
19
20 mx := make(map[string]int64)
21
22 - if err := nv.collectGPUInfo(mx); err != nil {
22 + if err := c.collectGPUInfo(mx); err != nil {
23 return nil, err
24 }
25
26 return mx, nil
27 }
28
29 -func (nv *NvidiaSmi) collectGPUInfo(mx map[string]int64) error {
30 - bs, err := nv.exec.queryGPUInfo()
29 +func (c *Collector) collectGPUInfo(mx map[string]int64) error {
30 + bs, err := c.exec.queryGPUInfo()
31 if err != nil {
32 return fmt.Errorf("error on quering XML GPU info: %v", err)
33 }
@@ -49,9 +49,9 @@ func (nv *NvidiaSmi) collectGPUInfo(mx map[string]int64) error {
49
50 seenGPU[px] = true
51
52 - if !nv.gpus[px] {
53 - nv.gpus[px] = true
54 - nv.addGpuCharts(gpu, i)
52 + if !c.gpus[px] {
53 + c.gpus[px] = true
54 + c.addGpuCharts(gpu, i)
55 }
56
57 addMetric(mx, px+"pcie_bandwidth_usage_rx", gpu.PCI.RxUtil, 1024) // KB => bytes
@@ -103,9 +103,9 @@ func (nv *NvidiaSmi) collectGPUInfo(mx map[string]int64) error {
103
104 seenMIG[px] = true
105
106 - if !nv.migs[px] {
107 - nv.migs[px] = true
108 - nv.addMIGDeviceCharts(gpu, mig)
106 + if !c.migs[px] {
107 + c.migs[px] = true
108 + c.addMIGDeviceCharts(gpu, mig)
109 }
110
111 addMetric(mx, px+"ecc_error_sram_uncorrectable", mig.ECCErrorCount.VolatileCount.SRAMUncorrectable, 0)
@@ -117,17 +117,17 @@ func (nv *NvidiaSmi) collectGPUInfo(mx map[string]int64) error {
117 }
118 }
119
120 - for px := range nv.gpus {
120 + for px := range c.gpus {
121 if !seenGPU[px] {
122 - delete(nv.gpus, px)
123 - nv.removeCharts(px)
122 + delete(c.gpus, px)
123 + c.removeCharts(px)
124 }
125 }
126
127 - for px := range nv.migs {
127 + for px := range c.migs {
128 if !seenMIG[px] {
129 - delete(nv.migs, px)
130 - nv.removeCharts(px)
129 + delete(c.migs, px)
130 + c.removeCharts(px)
131 }
132 }
133
src/go/plugin/go.d/collector/nvidia_smi/collector.go renamed
+23 -23
@@ -26,8 +26,8 @@ func init() {
26 })
27 }
28
29 -func New() *NvidiaSmi {
30 - return &NvidiaSmi{
29 +func New() *Collector {
30 + return &Collector{
31 Config: Config{
32 Timeout: confopt.Duration(time.Second * 10),
33 // Disable loop mode on Windows due to go.d.plugin's non-graceful exit
@@ -49,7 +49,7 @@ type Config struct {
49 LoopMode bool `yaml:"loop_mode,omitempty" json:"loop_mode"`
50 }
51
52 -type NvidiaSmi struct {
52 +type Collector struct {
53 module.Base
54 Config `yaml:",inline" json:""`
55
@@ -62,27 +62,27 @@ type NvidiaSmi struct {
62 migs map[string]bool
63 }
64
65 -func (nv *NvidiaSmi) Configuration() any {
66 - return nv.Config
65 +func (c *Collector) Configuration() any {
66 + return c.Config
67 }
68
69 -func (nv *NvidiaSmi) Init() error {
70 - if nv.exec == nil {
71 - if runtime.GOOS == "windows" && nv.LoopMode {
72 - nv.LoopMode = false
69 +func (c *Collector) Init() error {
70 + if c.exec == nil {
71 + if runtime.GOOS == "windows" && c.LoopMode {
72 + c.LoopMode = false
73 }
74 - smi, err := nv.initNvidiaSmiExec()
74 + smi, err := c.initNvidiaSmiExec()
75 if err != nil {
76 return err
77 }
78 - nv.exec = smi
78 + c.exec = smi
79 }
80
81 return nil
82 }
83
84 -func (nv *NvidiaSmi) Check() error {
85 - mx, err := nv.collect()
84 +func (c *Collector) Check() error {
85 + mx, err := c.collect()
86 if err != nil {
87 return err
88 }
@@ -92,14 +92,14 @@ func (nv *NvidiaSmi) Check() error {
92 return nil
93 }
94
95 -func (nv *NvidiaSmi) Charts() *module.Charts {
96 - return nv.charts
95 +func (c *Collector) Charts() *module.Charts {
96 + return c.charts
97 }
98
99 -func (nv *NvidiaSmi) Collect() map[string]int64 {
100 - mx, err := nv.collect()
99 +func (c *Collector) Collect() map[string]int64 {
100 + mx, err := c.collect()
101 if err != nil {
102 - nv.Error(err)
102 + c.Error(err)
103 }
104
105 if len(mx) == 0 {
@@ -108,11 +108,11 @@ func (nv *NvidiaSmi) Collect() map[string]int64 {
108 return mx
109 }
110
111 -func (nv *NvidiaSmi) Cleanup() {
112 - if nv.exec != nil {
113 - if err := nv.exec.stop(); err != nil {
114 - nv.Errorf("cleanup: %v", err)
111 +func (c *Collector) Cleanup() {
112 + if c.exec != nil {
113 + if err := c.exec.stop(); err != nil {
114 + c.Errorf("cleanup: %v", err)
115 }
116 - nv.exec = nil
116 + c.exec = nil
117 }
118 }
src/go/plugin/go.d/collector/nvidia_smi/collector_test.go renamed
+47 -47
@@ -40,45 +40,45 @@ func Test_testDataIsValid(t *testing.T) {
40 }
41 }
42
43 -func TestNvidiaSmi_ConfigurationSerialize(t *testing.T) {
44 - module.TestConfigurationSerialize(t, &NvidiaSmi{}, dataConfigJSON, dataConfigYAML)
43 +func TestCollector_ConfigurationSerialize(t *testing.T) {
44 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
45 }
46
47 -func TestNvidiaSmi_Init(t *testing.T) {
47 +func TestCollector_Init(t *testing.T) {
48 tests := map[string]struct {
49 - prepare func(nv *NvidiaSmi)
49 + prepare func(*Collector)
50 wantFail bool
51 }{
52 "fails if can't local nvidia-smi": {
53 wantFail: true,
54 - prepare: func(nv *NvidiaSmi) {
55 - nv.binName += "!!!"
54 + prepare: func(collr *Collector) {
55 + collr.binName += "!!!"
56 },
57 },
58 }
59
60 for name, test := range tests {
61 t.Run(name, func(t *testing.T) {
62 - nv := New()
62 + collr := New()
63
64 - test.prepare(nv)
64 + test.prepare(collr)
65
66 if test.wantFail {
67 - assert.Error(t, nv.Init())
67 + assert.Error(t, collr.Init())
68 } else {
69 - assert.NoError(t, nv.Init())
69 + assert.NoError(t, collr.Init())
70 }
71 })
72 }
73 }
74
75 -func TestNvidiaSmi_Charts(t *testing.T) {
75 +func TestCollector_Charts(t *testing.T) {
76 assert.NotNil(t, New().Charts())
77 }
78
79 -func TestNvidiaSmi_Check(t *testing.T) {
79 +func TestCollector_Check(t *testing.T) {
80 tests := map[string]struct {
81 - prepare func(nv *NvidiaSmi)
81 + prepare func(*Collector)
82 wantFail bool
83 }{
84 "success A100-SXM4 MIG": {
@@ -105,30 +105,30 @@ func TestNvidiaSmi_Check(t *testing.T) {
105
106 for name, test := range tests {
107 t.Run(name, func(t *testing.T) {
108 - nv := New()
108 + collr := New()
109
110 - test.prepare(nv)
110 + test.prepare(collr)
111
112 if test.wantFail {
113 - assert.Error(t, nv.Check())
113 + assert.Error(t, collr.Check())
114 } else {
115 - assert.NoError(t, nv.Check())
115 + assert.NoError(t, collr.Check())
116 }
117 })
118 }
119 }
120
121 -func TestNvidiaSmi_Collect(t *testing.T) {
121 +func TestCollector_Collect(t *testing.T) {
122 type testCaseStep struct {
123 - prepare func(nv *NvidiaSmi)
124 - check func(t *testing.T, nv *NvidiaSmi)
123 + prepare func(*Collector)
124 + check func(*testing.T, *Collector)
125 }
126 tests := map[string][]testCaseStep{
127 "success A100-SXM4 MIG": {
128 {
129 prepare: prepareCaseMIGA100,
130 - check: func(t *testing.T, nv *NvidiaSmi) {
131 - mx := nv.Collect()
130 + check: func(t *testing.T, collr *Collector) {
131 + mx := collr.Collect()
132
133 expected := map[string]int64{
134 "gpu_GPU-27b94a00-ed54-5c24-b1fd-1054085de32a_bar1_memory_usage_free": 68718428160,
@@ -187,8 +187,8 @@ func TestNvidiaSmi_Collect(t *testing.T) {
187 "success RTX 4090 Driver 535": {
188 {
189 prepare: prepareCaseRTX4090Driver535,
190 - check: func(t *testing.T, nv *NvidiaSmi) {
191 - mx := nv.Collect()
190 + check: func(t *testing.T, collr *Collector) {
191 + mx := collr.Collect()
192
193 expected := map[string]int64{
194 "gpu_GPU-71d1acc2-662d-2166-bf9f-65272d2fc437_bar1_memory_usage_free": 267386880,
@@ -237,8 +237,8 @@ func TestNvidiaSmi_Collect(t *testing.T) {
237 "success RTX 3060": {
238 {
239 prepare: prepareCaseRTX3060,
240 - check: func(t *testing.T, nv *NvidiaSmi) {
241 - mx := nv.Collect()
240 + check: func(t *testing.T, collr *Collector) {
241 + mx := collr.Collect()
242
243 expected := map[string]int64{
244 "gpu_GPU-473d8d0f-d462-185c-6b36-6fc23e23e571_bar1_memory_usage_free": 8586788864,
@@ -286,8 +286,8 @@ func TestNvidiaSmi_Collect(t *testing.T) {
286 "success Tesla P100": {
287 {
288 prepare: prepareCaseTeslaP100,
289 - check: func(t *testing.T, nv *NvidiaSmi) {
290 - mx := nv.Collect()
289 + check: func(t *testing.T, collr *Collector) {
290 + mx := collr.Collect()
291
292 expected := map[string]int64{
293 "gpu_GPU-d3da8716-eaab-75db-efc1-60e88e1cd55e_bar1_memory_usage_free": 17177772032,
@@ -334,8 +334,8 @@ func TestNvidiaSmi_Collect(t *testing.T) {
334 "success RTX 2080 Win": {
335 {
336 prepare: prepareCaseRTX2080Win,
337 - check: func(t *testing.T, nv *NvidiaSmi) {
338 - mx := nv.Collect()
337 + check: func(t *testing.T, collr *Collector) {
338 + mx := collr.Collect()
339
340 expected := map[string]int64{
341 "gpu_GPU-fbd55ed4-1eec-4423-0a47-ad594b4333e3_bar1_memory_usage_free": 266338304,
@@ -383,8 +383,8 @@ func TestNvidiaSmi_Collect(t *testing.T) {
383 "fails on queryGPUInfo error": {
384 {
385 prepare: prepareCaseErrOnQueryGPUInfo,
386 - check: func(t *testing.T, nv *NvidiaSmi) {
387 - mx := nv.Collect()
386 + check: func(t *testing.T, collr *Collector) {
387 + mx := collr.Collect()
388
389 assert.Equal(t, map[string]int64(nil), mx)
390 },
@@ -394,12 +394,12 @@ func TestNvidiaSmi_Collect(t *testing.T) {
394
395 for name, test := range tests {
396 t.Run(name, func(t *testing.T) {
397 - nv := New()
397 + collr := New()
398
399 for i, step := range test {
400 t.Run(fmt.Sprintf("step[%d]", i), func(t *testing.T) {
401 - step.prepare(nv)
402 - step.check(t, nv)
401 + step.prepare(collr)
402 + step.check(t, collr)
403 })
404 }
405 })
@@ -422,26 +422,26 @@ func (m *mockNvidiaSmi) stop() error {
422 return nil
423 }
424
425 -func prepareCaseMIGA100(nv *NvidiaSmi) {
426 - nv.exec = &mockNvidiaSmi{gpuInfo: dataXMLA100SXM4MIG}
425 +func prepareCaseMIGA100(collr *Collector) {
426 + collr.exec = &mockNvidiaSmi{gpuInfo: dataXMLA100SXM4MIG}
427 }
428
429 -func prepareCaseRTX3060(nv *NvidiaSmi) {
430 - nv.exec = &mockNvidiaSmi{gpuInfo: dataXMLRTX3060}
429 +func prepareCaseRTX3060(collr *Collector) {
430 + collr.exec = &mockNvidiaSmi{gpuInfo: dataXMLRTX3060}
431 }
432
433 -func prepareCaseRTX4090Driver535(nv *NvidiaSmi) {
434 - nv.exec = &mockNvidiaSmi{gpuInfo: dataXMLRTX4090Driver535}
433 +func prepareCaseRTX4090Driver535(collr *Collector) {
434 + collr.exec = &mockNvidiaSmi{gpuInfo: dataXMLRTX4090Driver535}
435 }
436
437 -func prepareCaseTeslaP100(nv *NvidiaSmi) {
438 - nv.exec = &mockNvidiaSmi{gpuInfo: dataXMLTeslaP100}
437 +func prepareCaseTeslaP100(collr *Collector) {
438 + collr.exec = &mockNvidiaSmi{gpuInfo: dataXMLTeslaP100}
439 }
440
441 -func prepareCaseRTX2080Win(nv *NvidiaSmi) {
442 - nv.exec = &mockNvidiaSmi{gpuInfo: dataXMLRTX2080Win}
441 +func prepareCaseRTX2080Win(collr *Collector) {
442 + collr.exec = &mockNvidiaSmi{gpuInfo: dataXMLRTX2080Win}
443 }
444
445 -func prepareCaseErrOnQueryGPUInfo(nv *NvidiaSmi) {
446 - nv.exec = &mockNvidiaSmi{errOnQueryGPUInfo: true}
445 +func prepareCaseErrOnQueryGPUInfo(collr *Collector) {
446 + collr.exec = &mockNvidiaSmi{errOnQueryGPUInfo: true}
447 }
src/go/plugin/go.d/collector/nvidia_smi/init.go
+5 -5
@@ -8,15 +8,15 @@ import (
8 "os/exec"
9 )
10
11 -func (nv *NvidiaSmi) initNvidiaSmiExec() (nvidiaSmiBinary, error) {
12 - binPath := nv.BinaryPath
11 +func (c *Collector) initNvidiaSmiExec() (nvidiaSmiBinary, error) {
12 + binPath := c.BinaryPath
13 if _, err := os.Stat(binPath); os.IsNotExist(err) {
14 - path, err := exec.LookPath(nv.binName)
14 + path, err := exec.LookPath(c.binName)
15 if err != nil {
16 - return nil, fmt.Errorf("error on lookup '%s': %v", nv.binName, err)
16 + return nil, fmt.Errorf("error on lookup '%s': %v", c.binName, err)
17 }
18 binPath = path
19 }
20
21 - return newNvidiaSmiBinary(binPath, nv.Config, nv.Logger)
21 + return newNvidiaSmiBinary(binPath, c.Config, c.Logger)
22 }
src/go/plugin/go.d/collector/nvme/charts.go
+5 -5
@@ -239,7 +239,7 @@ var (
239 }
240 )
241
242 -func (n *NVMe) addDeviceCharts(devicePath, model string) {
242 +func (c *Collector) addDeviceCharts(devicePath, model string) {
243 device := extractDeviceFromPath(devicePath)
244
245 charts := deviceChartsTmpl.Copy()
@@ -255,17 +255,17 @@ func (n *NVMe) addDeviceCharts(devicePath, model string) {
255 }
256 }
257
258 - if err := n.Charts().Add(*charts...); err != nil {
259 - n.Warning(err)
258 + if err := c.Charts().Add(*charts...); err != nil {
259 + c.Warning(err)
260 }
261 }
262
263 -func (n *NVMe) removeDeviceCharts(devicePath string) {
263 +func (c *Collector) removeDeviceCharts(devicePath string) {
264 device := extractDeviceFromPath(devicePath)
265
266 px := fmt.Sprintf("device_%s", device)
267
268 - for _, chart := range *n.Charts() {
268 + for _, chart := range *c.Charts() {
269 if strings.HasPrefix(chart.ID, px) {
270 chart.MarkRemove()
271 chart.MarkNotCreated()
src/go/plugin/go.d/collector/nvme/collect.go
+21 -21
@@ -14,26 +14,26 @@ import (
14 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/metrix"
15 )
16
17 -func (n *NVMe) collect() (map[string]int64, error) {
18 - if n.exec == nil {
17 +func (c *Collector) collect() (map[string]int64, error) {
18 + if c.exec == nil {
19 return nil, errors.New("nvme-cli is not initialized (nil)")
20 }
21
22 now := time.Now()
23 - if n.forceListDevices || now.Sub(n.listDevicesTime) > n.listDevicesEvery {
24 - n.forceListDevices = false
25 - n.listDevicesTime = now
26 - if err := n.listNVMeDevices(); err != nil {
23 + if c.forceListDevices || now.Sub(c.listDevicesTime) > c.listDevicesEvery {
24 + c.forceListDevices = false
25 + c.listDevicesTime = now
26 + if err := c.listNVMeDevices(); err != nil {
27 return nil, err
28 }
29 }
30
31 mx := make(map[string]int64)
32
33 - for path := range n.devicePaths {
34 - if err := n.collectNVMeDevice(mx, path); err != nil {
35 - n.Error(err)
36 - n.forceListDevices = true
33 + for path := range c.devicePaths {
34 + if err := c.collectNVMeDevice(mx, path); err != nil {
35 + c.Error(err)
36 + c.forceListDevices = true
37 continue
38 }
39 }
@@ -41,8 +41,8 @@ func (n *NVMe) collect() (map[string]int64, error) {
41 return mx, nil
42 }
43
44 -func (n *NVMe) collectNVMeDevice(mx map[string]int64, devicePath string) error {
45 - stats, err := n.exec.smartLog(devicePath)
44 +func (c *Collector) collectNVMeDevice(mx map[string]int64, devicePath string) error {
45 + stats, err := c.exec.smartLog(devicePath)
46 if err != nil {
47 return fmt.Errorf("exec nvme smart-log for '%s': %v", devicePath, err)
48 }
@@ -79,28 +79,28 @@ func (n *NVMe) collectNVMeDevice(mx map[string]int64, devicePath string) error {
79 return nil
80 }
81
82 -func (n *NVMe) listNVMeDevices() error {
83 - devList, err := n.exec.list()
82 +func (c *Collector) listNVMeDevices() error {
83 + devList, err := c.exec.list()
84 if err != nil {
85 return fmt.Errorf("exec nvme list: %v", err)
86 }
87
88 - n.Debugf("found %d NVMe devices (%v)", len(devList.Devices), devList.Devices)
88 + c.Debugf("found %d NVMe devices (%v)", len(devList.Devices), devList.Devices)
89
90 seen := make(map[string]bool)
91
92 for _, dev := range devList.Devices {
93 path := dev.DevicePath
94 seen[path] = true
95 - if !n.devicePaths[path] {
96 - n.devicePaths[path] = true
97 - n.addDeviceCharts(path, dev.ModelNumber)
95 + if !c.devicePaths[path] {
96 + c.devicePaths[path] = true
97 + c.addDeviceCharts(path, dev.ModelNumber)
98 }
99 }
100 - for path := range n.devicePaths {
100 + for path := range c.devicePaths {
101 if !seen[path] {
102 - delete(n.devicePaths, path)
103 - n.removeDeviceCharts(path)
102 + delete(c.devicePaths, path)
103 + c.removeDeviceCharts(path)
104 }
105 }
106
src/go/plugin/go.d/collector/nvme/collector.go renamed
+25 -31
@@ -28,8 +28,8 @@ func init() {
28 })
29 }
30
31 -func New() *NVMe {
32 - return &NVMe{
31 +func New() *Collector {
32 + return &Collector{
33 Config: Config{
34 Timeout: confopt.Duration(time.Second * 2),
35 },
@@ -46,42 +46,36 @@ type Config struct {
46 Timeout confopt.Duration `yaml:"timeout,omitempty" json:"timeout"`
47 }
48
49 -type (
50 - NVMe struct {
51 - module.Base
52 - Config `yaml:",inline" json:""`
49 +type Collector struct {
50 + module.Base
51 + Config `yaml:",inline" json:""`
52
54 - charts *module.Charts
53 + charts *module.Charts
54
56 - exec nvmeCLI
55 + exec nvmeCli
56
58 - devicePaths map[string]bool
59 - listDevicesTime time.Time
60 - listDevicesEvery time.Duration
61 - forceListDevices bool
62 - }
63 - nvmeCLI interface {
64 - list() (*nvmeDeviceList, error)
65 - smartLog(devicePath string) (*nvmeDeviceSmartLog, error)
66 - }
67 -)
57 + devicePaths map[string]bool
58 + listDevicesTime time.Time
59 + listDevicesEvery time.Duration
60 + forceListDevices bool
61 +}
62
69 -func (n *NVMe) Configuration() any {
70 - return n.Config
63 +func (c *Collector) Configuration() any {
64 + return c.Config
65 }
66
73 -func (n *NVMe) Init() error {
74 - nvmeExec, err := n.initNVMeCLIExec()
67 +func (c *Collector) Init() error {
68 + nvmeExec, err := c.initNVMeCLIExec()
69 if err != nil {
70 return fmt.Errorf("init nvme-cli exec: %v", err)
71 }
78 - n.exec = nvmeExec
72 + c.exec = nvmeExec
73
74 return nil
75 }
76
83 -func (n *NVMe) Check() error {
84 - mx, err := n.collect()
77 +func (c *Collector) Check() error {
78 + mx, err := c.collect()
79 if err != nil {
80 return err
81 }
@@ -91,14 +85,14 @@ func (n *NVMe) Check() error {
85 return nil
86 }
87
94 -func (n *NVMe) Charts() *module.Charts {
95 - return n.charts
88 +func (c *Collector) Charts() *module.Charts {
89 + return c.charts
90 }
91
98 -func (n *NVMe) Collect() map[string]int64 {
99 - mx, err := n.collect()
92 +func (c *Collector) Collect() map[string]int64 {
93 + mx, err := c.collect()
94 if err != nil {
101 - n.Error(err)
95 + c.Error(err)
96 }
97
98 if len(mx) == 0 {
@@ -107,4 +101,4 @@ func (n *NVMe) Collect() map[string]int64 {
101 return mx
102 }
103
110 -func (n *NVMe) Cleanup() {}
104 +func (c *Collector) Cleanup() {}
src/go/plugin/go.d/collector/nvme/collector_test.go renamed
+44 -44
@@ -41,11 +41,11 @@ func Test_testDataIsValid(t *testing.T) {
41 }
42 }
43
44 -func TestNVMe_ConfigurationSerialize(t *testing.T) {
45 - module.TestConfigurationSerialize(t, &NVMe{}, dataConfigJSON, dataConfigYAML)
44 +func TestCollector_ConfigurationSerialize(t *testing.T) {
45 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
46 }
47
48 -func TestNVMe_Init(t *testing.T) {
48 +func TestCollector_Init(t *testing.T) {
49 tests := map[string]struct {
50 config Config
51 wantFail bool
@@ -58,29 +58,29 @@ func TestNVMe_Init(t *testing.T) {
58
59 for name, test := range tests {
60 t.Run(name, func(t *testing.T) {
61 - nv := New()
61 + collr := New()
62
63 if test.wantFail {
64 - assert.Error(t, nv.Init())
64 + assert.Error(t, collr.Init())
65 } else {
66 - assert.NoError(t, nv.Init())
66 + assert.NoError(t, collr.Init())
67 }
68 })
69 }
70 }
71
72 -func TestNVMe_Charts(t *testing.T) {
72 +func TestCollector_Charts(t *testing.T) {
73 assert.NotNil(t, New().Charts())
74 }
75
76 -func TestNVMe_Cleanup(t *testing.T) {
76 +func TestCollector_Cleanup(t *testing.T) {
77 assert.NotPanics(t, New().Cleanup)
78 }
79
80 -func TestNVMe_Check(t *testing.T) {
80 +func TestCollector_Check(t *testing.T) {
81 tests := map[string]struct {
82 wantFail bool
83 - prepare func(n *NVMe)
83 + prepare func(*Collector)
84 }{
85 "success if all calls successful": {
86 wantFail: false,
@@ -102,31 +102,31 @@ func TestNVMe_Check(t *testing.T) {
102
103 for name, test := range tests {
104 t.Run(name, func(t *testing.T) {
105 - n := New()
105 + collr := New()
106
107 - test.prepare(n)
107 + test.prepare(collr)
108
109 if test.wantFail {
110 - assert.Error(t, n.Check())
110 + assert.Error(t, collr.Check())
111 } else {
112 - assert.NoError(t, n.Check())
112 + assert.NoError(t, collr.Check())
113 }
114 })
115 }
116 }
117
118 -func TestNVMe_Collect(t *testing.T) {
118 +func TestCollector_Collect(t *testing.T) {
119 type testCaseStep struct {
120 - prepare func(n *NVMe)
121 - check func(t *testing.T, n *NVMe)
120 + prepare func(*Collector)
121 + check func(*testing.T, *Collector)
122 }
123
124 tests := map[string][]testCaseStep{
125 "success if all calls successful": {
126 {
127 prepare: prepareCaseOK,
128 - check: func(t *testing.T, n *NVMe) {
129 - mx := n.Collect()
128 + check: func(t *testing.T, collr *Collector) {
129 + mx := collr.Collect()
130
131 expected := map[string]int64{
132 "device_nvme0n1_available_spare": 100,
@@ -188,8 +188,8 @@ func TestNVMe_Collect(t *testing.T) {
188 "success if all calls successful with string values": {
189 {
190 prepare: prepareCaseStringValuesOK,
191 - check: func(t *testing.T, n *NVMe) {
192 - mx := n.Collect()
191 + check: func(t *testing.T, collr *Collector) {
192 + mx := collr.Collect()
193
194 expected := map[string]int64{
195 "device_nvme0n1_available_spare": 100,
@@ -251,8 +251,8 @@ func TestNVMe_Collect(t *testing.T) {
251 "success if all calls successful with float values": {
252 {
253 prepare: prepareCaseFloatValuesOK,
254 - check: func(t *testing.T, n *NVMe) {
255 - mx := n.Collect()
254 + check: func(t *testing.T, collr *Collector) {
255 + mx := collr.Collect()
256
257 expected := map[string]int64{
258 "device_nvme0n1_available_spare": 100,
@@ -314,8 +314,8 @@ func TestNVMe_Collect(t *testing.T) {
314 "fail if 'nvme list' returns an empty list": {
315 {
316 prepare: prepareCaseEmptyList,
317 - check: func(t *testing.T, n *NVMe) {
318 - mx := n.Collect()
317 + check: func(t *testing.T, collr *Collector) {
318 + mx := collr.Collect()
319
320 assert.Equal(t, (map[string]int64)(nil), mx)
321 },
@@ -324,8 +324,8 @@ func TestNVMe_Collect(t *testing.T) {
324 "fail if 'nvme list' returns an error": {
325 {
326 prepare: prepareCaseErrOnList,
327 - check: func(t *testing.T, n *NVMe) {
328 - mx := n.Collect()
327 + check: func(t *testing.T, collr *Collector) {
328 + mx := collr.Collect()
329
330 assert.Equal(t, (map[string]int64)(nil), mx)
331 },
@@ -334,8 +334,8 @@ func TestNVMe_Collect(t *testing.T) {
334 "fail if 'nvme smart-log' returns an error": {
335 {
336 prepare: prepareCaseErrOnSmartLog,
337 - check: func(t *testing.T, n *NVMe) {
338 - mx := n.Collect()
337 + check: func(t *testing.T, collr *Collector) {
338 + mx := collr.Collect()
339
340 assert.Equal(t, (map[string]int64)(nil), mx)
341 },
@@ -345,40 +345,40 @@ func TestNVMe_Collect(t *testing.T) {
345
346 for name, test := range tests {
347 t.Run(name, func(t *testing.T) {
348 - n := New()
348 + collr := New()
349
350 for i, step := range test {
351 t.Run(fmt.Sprintf("step[%d]", i), func(t *testing.T) {
352 - step.prepare(n)
353 - step.check(t, n)
352 + step.prepare(collr)
353 + step.check(t, collr)
354 })
355 }
356 })
357 }
358 }
359
360 -func prepareCaseOK(n *NVMe) {
361 - n.exec = &mockNVMeCLIExec{}
360 +func prepareCaseOK(collr *Collector) {
361 + collr.exec = &mockNVMeCLIExec{}
362 }
363
364 -func prepareCaseStringValuesOK(n *NVMe) {
365 - n.exec = &mockNVMeCLIExec{smartLogString: true}
364 +func prepareCaseStringValuesOK(collr *Collector) {
365 + collr.exec = &mockNVMeCLIExec{smartLogString: true}
366 }
367
368 -func prepareCaseFloatValuesOK(n *NVMe) {
369 - n.exec = &mockNVMeCLIExec{smartLogFloat: true}
368 +func prepareCaseFloatValuesOK(collr *Collector) {
369 + collr.exec = &mockNVMeCLIExec{smartLogFloat: true}
370 }
371
372 -func prepareCaseEmptyList(n *NVMe) {
373 - n.exec = &mockNVMeCLIExec{emptyList: true}
372 +func prepareCaseEmptyList(collr *Collector) {
373 + collr.exec = &mockNVMeCLIExec{emptyList: true}
374 }
375
376 -func prepareCaseErrOnList(n *NVMe) {
377 - n.exec = &mockNVMeCLIExec{errOnList: true}
376 +func prepareCaseErrOnList(collr *Collector) {
377 + collr.exec = &mockNVMeCLIExec{errOnList: true}
378 }
379
380 -func prepareCaseErrOnSmartLog(n *NVMe) {
381 - n.exec = &mockNVMeCLIExec{errOnSmartLog: true}
380 +func prepareCaseErrOnSmartLog(collr *Collector) {
381 + collr.exec = &mockNVMeCLIExec{errOnSmartLog: true}
382 }
383
384 type mockNVMeCLIExec struct {
src/go/plugin/go.d/collector/nvme/exec.go
+5
@@ -55,6 +55,11 @@ func (n *nvmeNumber) UnmarshalJSON(b []byte) error {
55 return nil
56 }
57
58 +type nvmeCli interface {
59 + list() (*nvmeDeviceList, error)
60 + smartLog(devicePath string) (*nvmeDeviceSmartLog, error)
61 +}
62 +
63 type nvmeCLIExec struct {
64 ndsudoPath string
65 timeout time.Duration
src/go/plugin/go.d/collector/nvme/init.go
+2 -2
@@ -12,7 +12,7 @@ import (
12 "github.com/netdata/netdata/go/plugins/pkg/executable"
13 )
14
15 -func (n *NVMe) initNVMeCLIExec() (nvmeCLI, error) {
15 +func (c *Collector) initNVMeCLIExec() (nvmeCli, error) {
16 ndsudoPath := filepath.Join(executable.Directory, "ndsudo")
17
18 if _, err := os.Stat(ndsudoPath); err != nil {
@@ -21,7 +21,7 @@ func (n *NVMe) initNVMeCLIExec() (nvmeCLI, error) {
21
22 nvmeExec := &nvmeCLIExec{
23 ndsudoPath: ndsudoPath,
24 - timeout: n.Timeout.Duration(),
24 + timeout: c.Timeout.Duration(),
25 }
26
27 return nvmeExec, nil
src/go/plugin/go.d/collector/openldap/collect.go
+12 -12
@@ -6,31 +6,31 @@ import (
6 "github.com/go-ldap/ldap/v3"
7 )
8
9 -func (l *OpenLDAP) collect() (map[string]int64, error) {
10 - if l.conn == nil {
11 - conn, err := l.establishConn()
9 +func (c *Collector) collect() (map[string]int64, error) {
10 + if c.conn == nil {
11 + conn, err := c.establishConn()
12 if err != nil {
13 return nil, err
14 }
15 - l.conn = conn
15 + c.conn = conn
16 }
17
18 mx := make(map[string]int64)
19
20 - if err := l.collectMonitorCounters(mx); err != nil {
21 - l.Cleanup()
20 + if err := c.collectMonitorCounters(mx); err != nil {
21 + c.Cleanup()
22 return nil, err
23 }
24 - if err := l.collectOperations(mx); err != nil {
25 - l.Cleanup()
24 + if err := c.collectOperations(mx); err != nil {
25 + c.Cleanup()
26 return nil, err
27 }
28
29 return mx, nil
30 }
31
32 -func (l *OpenLDAP) doSearchRequest(req *ldap.SearchRequest, fn func(*ldap.Entry)) error {
33 - resp, err := l.conn.search(req)
32 +func (c *Collector) doSearchRequest(req *ldap.SearchRequest, fn func(*ldap.Entry)) error {
33 + resp, err := c.conn.search(req)
34 if err != nil {
35 return err
36 }
@@ -44,8 +44,8 @@ func (l *OpenLDAP) doSearchRequest(req *ldap.SearchRequest, fn func(*ldap.Entry)
44 return nil
45 }
46
47 -func (l *OpenLDAP) establishConn() (ldapConn, error) {
48 - conn := l.newConn(l.Config)
47 +func (c *Collector) establishConn() (ldapConn, error) {
48 + conn := c.newConn(c.Config)
49
50 if err := conn.connect(); err != nil {
51 return nil, err
src/go/plugin/go.d/collector/openldap/collect_mon_counters.go
+5 -5
@@ -12,7 +12,7 @@ const (
12 attrMonitorCounter = "monitorCounter"
13 )
14
15 -func (l *OpenLDAP) collectMonitorCounters(mx map[string]int64) error {
15 +func (c *Collector) collectMonitorCounters(mx map[string]int64) error {
16 req := newLdapMonitorCountersSearchRequest()
17
18 dnMetricMap := map[string]string{
@@ -25,22 +25,22 @@ func (l *OpenLDAP) collectMonitorCounters(mx map[string]int64) error {
25 "cn=Read,cn=Waiters,cn=Monitor": "read_waiters",
26 }
27
28 - return l.doSearchRequest(req, func(entry *ldap.Entry) {
28 + return c.doSearchRequest(req, func(entry *ldap.Entry) {
29 metric := dnMetricMap[entry.DN]
30 if metric == "" {
31 - l.Debugf("skipping entry '%s'", entry.DN)
31 + c.Debugf("skipping entry '%s'", entry.DN)
32 return
33 }
34
35 s := entry.GetAttributeValue(attrMonitorCounter)
36 if s == "" {
37 - l.Debugf("entry '%s' does not have attribute '%s'", entry.DN, attrMonitorCounter)
37 + c.Debugf("entry '%s' does not have attribute '%s'", entry.DN, attrMonitorCounter)
38 return
39 }
40
41 v, err := strconv.ParseInt(s, 10, 64)
42 if err != nil {
43 - l.Debugf("failed to parse entry '%s' value '%s': %v", entry.DN, s, err)
43 + c.Debugf("failed to parse entry '%s' value '%s': %v", entry.DN, s, err)
44 return
45 }
46
src/go/plugin/go.d/collector/openldap/collect_operations.go
+5 -5
@@ -13,7 +13,7 @@ const (
13 attrMonitorOpCompleted = "monitorOpCompleted"
14 )
15
16 -func (l *OpenLDAP) collectOperations(mx map[string]int64) error {
16 +func (c *Collector) collectOperations(mx map[string]int64) error {
17 req := newLdapOperationsSearchRequest()
18
19 dnMetricMap := map[string]string{
@@ -26,10 +26,10 @@ func (l *OpenLDAP) collectOperations(mx map[string]int64) error {
26 "cn=Search,cn=Operations,cn=Monitor": "search_operations",
27 }
28
29 - return l.doSearchRequest(req, func(entry *ldap.Entry) {
29 + return c.doSearchRequest(req, func(entry *ldap.Entry) {
30 metric := dnMetricMap[entry.DN]
31 if metric == "" {
32 - l.Debugf("skipping entry '%s'", entry.DN)
32 + c.Debugf("skipping entry '%s'", entry.DN)
33 return
34 }
35
@@ -41,12 +41,12 @@ func (l *OpenLDAP) collectOperations(mx map[string]int64) error {
41 for prefix, attr := range attrs {
42 s := entry.GetAttributeValue(attr)
43 if s == "" {
44 - l.Debugf("entry '%s' does not have attribute '%s'", entry.DN, attr)
44 + c.Debugf("entry '%s' does not have attribute '%s'", entry.DN, attr)
45 continue
46 }
47 v, err := strconv.ParseInt(s, 10, 64)
48 if err != nil {
49 - l.Debugf("failed to parse entry '%s' value '%s': %v", entry.DN, s, err)
49 + c.Debugf("failed to parse entry '%s' value '%s': %v", entry.DN, s, err)
50 continue
51 }
52
src/go/plugin/go.d/collector/openldap/collector.go renamed
+20 -20
@@ -26,8 +26,8 @@ func init() {
26 })
27 }
28
29 -func New() *OpenLDAP {
30 - return &OpenLDAP{
29 +func New() *Collector {
30 + return &Collector{
31 Config: Config{
32 URL: "ldap://127.0.0.1:389",
33 Timeout: confopt.Duration(time.Second * 2),
@@ -49,7 +49,7 @@ type Config struct {
49 tlscfg.TLSConfig `yaml:",inline" json:""`
50 }
51
52 -type OpenLDAP struct {
52 +type Collector struct {
53 module.Base
54 Config `yaml:",inline" json:""`
55
@@ -59,23 +59,23 @@ type OpenLDAP struct {
59 newConn func(Config) ldapConn
60 }
61
62 -func (l *OpenLDAP) Configuration() any {
63 - return l.Config
62 +func (c *Collector) Configuration() any {
63 + return c.Config
64 }
65
66 -func (l *OpenLDAP) Init() error {
67 - if l.URL == "" {
66 +func (c *Collector) Init() error {
67 + if c.URL == "" {
68 return errors.New("empty LDAP server url")
69 }
70 - if l.Username == "" {
70 + if c.Username == "" {
71 return errors.New("empty LDAP username")
72 }
73
74 return nil
75 }
76
77 -func (l *OpenLDAP) Check() error {
78 - mx, err := l.collect()
77 +func (c *Collector) Check() error {
78 + mx, err := c.collect()
79 if err != nil {
80 return err
81 }
@@ -87,14 +87,14 @@ func (l *OpenLDAP) Check() error {
87 return nil
88 }
89
90 -func (l *OpenLDAP) Charts() *module.Charts {
91 - return l.charts
90 +func (c *Collector) Charts() *module.Charts {
91 + return c.charts
92 }
93
94 -func (l *OpenLDAP) Collect() map[string]int64 {
95 - mx, err := l.collect()
94 +func (c *Collector) Collect() map[string]int64 {
95 + mx, err := c.collect()
96 if err != nil {
97 - l.Error(err)
97 + c.Error(err)
98 }
99
100 if len(mx) == 0 {
@@ -104,11 +104,11 @@ func (l *OpenLDAP) Collect() map[string]int64 {
104 return mx
105 }
106
107 -func (l *OpenLDAP) Cleanup() {
108 - if l.conn != nil {
109 - if err := l.conn.disconnect(); err != nil {
110 - l.Warningf("error disconnecting ldap client: %v", err)
107 +func (c *Collector) Cleanup() {
108 + if c.conn != nil {
109 + if err := c.conn.disconnect(); err != nil {
110 + c.Warningf("error disconnecting ldap client: %v", err)
111 }
112 - l.conn = nil
112 + c.conn = nil
113 }
114 }
src/go/plugin/go.d/collector/openldap/collector_test.go renamed
+34 -34
@@ -29,11 +29,11 @@ func Test_testDataIsValid(t *testing.T) {
29 }
30 }
31
32 -func TestOpenLDAP_ConfigurationSerialize(t *testing.T) {
33 - module.TestConfigurationSerialize(t, &OpenLDAP{}, dataConfigJSON, dataConfigYAML)
32 +func TestCollector_ConfigurationSerialize(t *testing.T) {
33 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
34 }
35
36 -func TestOpenLDAP_Init(t *testing.T) {
36 +func TestCollector_Init(t *testing.T) {
37 tests := map[string]struct {
38 config Config
39 wantFail bool
@@ -54,59 +54,59 @@ func TestOpenLDAP_Init(t *testing.T) {
54
55 for name, test := range tests {
56 t.Run(name, func(t *testing.T) {
57 - oldap := New()
58 - oldap.Config = test.config
57 + collr := New()
58 + collr.Config = test.config
59
60 if test.wantFail {
61 - assert.Error(t, oldap.Init())
61 + assert.Error(t, collr.Init())
62 } else {
63 - assert.NoError(t, oldap.Init())
63 + assert.NoError(t, collr.Init())
64 }
65 })
66 }
67 }
68
69 -func TestOpenLDAP_Cleanup(t *testing.T) {
69 +func TestCollector_Cleanup(t *testing.T) {
70 tests := map[string]struct {
71 - prepare func() *OpenLDAP
71 + prepare func() *Collector
72 }{
73 "not initialized": {
74 - prepare: func() *OpenLDAP {
74 + prepare: func() *Collector {
75 return New()
76 },
77 },
78 "after check": {
79 - prepare: func() *OpenLDAP {
80 - oldap := New()
81 - oldap.newConn = func(Config) ldapConn { return prepareMockOk() }
82 - _ = oldap.Check()
83 - return oldap
79 + prepare: func() *Collector {
80 + collr := New()
81 + collr.newConn = func(Config) ldapConn { return prepareMockOk() }
82 + _ = collr.Check()
83 + return collr
84 },
85 },
86 "after collect": {
87 - prepare: func() *OpenLDAP {
88 - oldap := New()
89 - oldap.newConn = func(Config) ldapConn { return prepareMockOk() }
90 - _ = oldap.Collect()
91 - return oldap
87 + prepare: func() *Collector {
88 + collr := New()
89 + collr.newConn = func(Config) ldapConn { return prepareMockOk() }
90 + _ = collr.Collect()
91 + return collr
92 },
93 },
94 }
95
96 for name, test := range tests {
97 t.Run(name, func(t *testing.T) {
98 - oldap := test.prepare()
98 + collr := test.prepare()
99
100 - assert.NotPanics(t, oldap.Cleanup)
100 + assert.NotPanics(t, collr.Cleanup)
101 })
102 }
103 }
104
105 -func TestOpenLDAP_Charts(t *testing.T) {
105 +func TestCollector_Charts(t *testing.T) {
106 assert.NotNil(t, New().Charts())
107 }
108
109 -func TestOpenLDAP_Check(t *testing.T) {
109 +func TestCollector_Check(t *testing.T) {
110 tests := map[string]struct {
111 prepareMock func() *mockOpenLDAPConn
112 wantFail bool
@@ -127,20 +127,20 @@ func TestOpenLDAP_Check(t *testing.T) {
127
128 for name, test := range tests {
129 t.Run(name, func(t *testing.T) {
130 - oldap := New()
130 + collr := New()
131 mock := test.prepareMock()
132 - oldap.newConn = func(Config) ldapConn { return mock }
132 + collr.newConn = func(Config) ldapConn { return mock }
133
134 if test.wantFail {
135 - assert.Error(t, oldap.Check())
135 + assert.Error(t, collr.Check())
136 } else {
137 - assert.NoError(t, oldap.Check())
137 + assert.NoError(t, collr.Check())
138 }
139 })
140 }
141 }
142
143 -func TestOpenLDAP_Collect(t *testing.T) {
143 +func TestCollector_Collect(t *testing.T) {
144 tests := map[string]struct {
145 prepareMock func() *mockOpenLDAPConn
146 wantMetrics map[string]int64
@@ -191,20 +191,20 @@ func TestOpenLDAP_Collect(t *testing.T) {
191
192 for name, test := range tests {
193 t.Run(name, func(t *testing.T) {
194 - oldap := New()
194 + collr := New()
195 mock := test.prepareMock()
196 - oldap.newConn = func(Config) ldapConn { return mock }
196 + collr.newConn = func(Config) ldapConn { return mock }
197
198 - mx := oldap.Collect()
198 + mx := collr.Collect()
199
200 require.Equal(t, test.wantMetrics, mx)
201
202 if len(test.wantMetrics) > 0 {
203 - module.TestMetricsHasAllChartsDims(t, oldap.Charts(), mx)
203 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
204 }
205
206 assert.Equal(t, test.disconnectBeforeCleanup, mock.disconnectCalled, "disconnect before cleanup")
207 - oldap.Cleanup()
207 + collr.Cleanup()
208 assert.Equal(t, test.disconnectAfterCleanup, mock.disconnectCalled, "disconnect after cleanup")
209 })
210 }
src/go/plugin/go.d/collector/openvpn/collect.go
+17 -17
@@ -7,22 +7,22 @@ import (
7 "time"
8 )
9
10 -func (o *OpenVPN) collect() (map[string]int64, error) {
10 +func (c *Collector) collect() (map[string]int64, error) {
11 var err error
12
13 - if err := o.client.Connect(); err != nil {
13 + if err := c.client.Connect(); err != nil {
14 return nil, err
15 }
16 - defer func() { _ = o.client.Disconnect() }()
16 + defer func() { _ = c.client.Disconnect() }()
17
18 mx := make(map[string]int64)
19
20 - if err = o.collectLoadStats(mx); err != nil {
20 + if err = c.collectLoadStats(mx); err != nil {
21 return nil, err
22 }
23
24 - if o.perUserMatcher != nil {
25 - if err = o.collectUsers(mx); err != nil {
24 + if c.perUserMatcher != nil {
25 + if err = c.collectUsers(mx); err != nil {
26 return nil, err
27 }
28 }
@@ -30,8 +30,8 @@ func (o *OpenVPN) collect() (map[string]int64, error) {
30 return mx, nil
31 }
32
33 -func (o *OpenVPN) collectLoadStats(mx map[string]int64) error {
34 - stats, err := o.client.LoadStats()
33 +func (c *Collector) collectLoadStats(mx map[string]int64) error {
34 + stats, err := c.client.LoadStats()
35 if err != nil {
36 return err
37 }
@@ -42,8 +42,8 @@ func (o *OpenVPN) collectLoadStats(mx map[string]int64) error {
42 return nil
43 }
44
45 -func (o *OpenVPN) collectUsers(mx map[string]int64) error {
46 - users, err := o.client.Users()
45 +func (c *Collector) collectUsers(mx map[string]int64) error {
46 + users, err := c.client.Users()
47 if err != nil {
48 return err
49 }
@@ -58,13 +58,13 @@ func (o *OpenVPN) collectUsers(mx map[string]int64) error {
58 name = user.Username
59 }
60
61 - if !o.perUserMatcher.MatchString(name) {
61 + if !c.perUserMatcher.MatchString(name) {
62 continue
63 }
64 - if !o.collectedUsers[name] {
65 - o.collectedUsers[name] = true
66 - if err := o.addUserCharts(name); err != nil {
67 - o.Warning(err)
64 + if !c.collectedUsers[name] {
65 + c.collectedUsers[name] = true
66 + if err := c.addUserCharts(name); err != nil {
67 + c.Warning(err)
68 }
69 }
70 mx[name+"_bytes_received"] = user.BytesReceived
@@ -74,7 +74,7 @@ func (o *OpenVPN) collectUsers(mx map[string]int64) error {
74 return nil
75 }
76
77 -func (o *OpenVPN) addUserCharts(userName string) error {
77 +func (c *Collector) addUserCharts(userName string) error {
78 cs := userCharts.Copy()
79
80 for _, chart := range *cs {
@@ -86,5 +86,5 @@ func (o *OpenVPN) addUserCharts(userName string) error {
86 }
87 chart.MarkNotCreated()
88 }
89 - return o.charts.Add(*cs...)
89 + return c.charts.Add(*cs...)
90 }
src/go/plugin/go.d/collector/openvpn/collector.go renamed
+24 -24
@@ -24,8 +24,8 @@ func init() {
24 })
25 }
26
27 -func New() *OpenVPN {
28 - return &OpenVPN{
27 +func New() *Collector {
28 + return &Collector{
29 Config: Config{
30 Address: "127.0.0.1:7505",
31 Timeout: confopt.Duration(time.Second),
@@ -44,7 +44,7 @@ type Config struct {
44 }
45
46 type (
47 - OpenVPN struct {
47 + Collector struct {
48 module.Base
49 Config `yaml:",inline" json:""`
50
@@ -63,51 +63,51 @@ type (
63 }
64 )
65
66 -func (o *OpenVPN) Configuration() any {
67 - return o.Config
66 +func (c *Collector) Configuration() any {
67 + return c.Config
68 }
69
70 -func (o *OpenVPN) Init() error {
71 - if err := o.validateConfig(); err != nil {
70 +func (c *Collector) Init() error {
71 + if err := c.validateConfig(); err != nil {
72 return err
73 }
74
75 - m, err := o.initPerUserMatcher()
75 + m, err := c.initPerUserMatcher()
76 if err != nil {
77 return err
78 }
79 - o.perUserMatcher = m
79 + c.perUserMatcher = m
80
81 - o.client = o.initClient()
81 + c.client = c.initClient()
82
83 - o.Infof("using address: %s, timeout: %s", o.Address, o.Timeout)
83 + c.Infof("using address: %s, timeout: %s", c.Address, c.Timeout)
84
85 return nil
86 }
87
88 -func (o *OpenVPN) Check() error {
89 - if err := o.client.Connect(); err != nil {
88 +func (c *Collector) Check() error {
89 + if err := c.client.Connect(); err != nil {
90 return err
91 }
92 - defer func() { _ = o.client.Disconnect() }()
92 + defer func() { _ = c.client.Disconnect() }()
93
94 - ver, err := o.client.Version()
94 + ver, err := c.client.Version()
95 if err != nil {
96 - o.Cleanup()
96 + c.Cleanup()
97 return err
98 }
99
100 - o.Infof("connected to OpenVPN v%d.%d.%d, Management v%d", ver.Major, ver.Minor, ver.Patch, ver.Management)
100 + c.Infof("connected to OpenVPN v%d.%d.%d, Management v%d", ver.Major, ver.Minor, ver.Patch, ver.Management)
101
102 return nil
103 }
104
105 -func (o *OpenVPN) Charts() *Charts { return o.charts }
105 +func (c *Collector) Charts() *Charts { return c.charts }
106
107 -func (o *OpenVPN) Collect() map[string]int64 {
108 - mx, err := o.collect()
107 +func (c *Collector) Collect() map[string]int64 {
108 + mx, err := c.collect()
109 if err != nil {
110 - o.Error(err)
110 + c.Error(err)
111 }
112
113 if len(mx) == 0 {
@@ -116,9 +116,9 @@ func (o *OpenVPN) Collect() map[string]int64 {
116 return mx
117 }
118
119 -func (o *OpenVPN) Cleanup() {
120 - if o.client == nil {
119 +func (c *Collector) Cleanup() {
120 + if c.client == nil {
121 return
122 }
123 - _ = o.client.Disconnect()
123 + _ = c.client.Disconnect()
124 }
src/go/plugin/go.d/collector/openvpn/collector_test.go renamed
+31 -30
@@ -29,43 +29,43 @@ func Test_testDataIsValid(t *testing.T) {
29 }
30 }
31
32 -func TestOpenVPN_ConfigurationSerialize(t *testing.T) {
33 - module.TestConfigurationSerialize(t, &OpenVPN{}, dataConfigJSON, dataConfigYAML)
32 +func TestCollector_ConfigurationSerialize(t *testing.T) {
33 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
34 }
35
36 -func TestOpenVPN_Init(t *testing.T) {
36 +func TestCollector_Init(t *testing.T) {
37 assert.NoError(t, New().Init())
38 }
39
40 -func TestOpenVPN_Check(t *testing.T) {
41 - job := New()
40 +func TestCollector_Check(t *testing.T) {
41 + collr := New()
42
43 - require.NoError(t, job.Init())
44 - job.client = prepareMockOpenVPNClient()
45 - require.NoError(t, job.Check())
43 + require.NoError(t, collr.Init())
44 + collr.client = prepareMockOpenVPNClient()
45 + require.NoError(t, collr.Check())
46 }
47
48 -func TestOpenVPN_Charts(t *testing.T) {
48 +func TestCollector_Charts(t *testing.T) {
49 assert.NotNil(t, New().Charts())
50 }
51
52 -func TestOpenVPN_Cleanup(t *testing.T) {
53 - job := New()
52 +func TestCollector_Cleanup(t *testing.T) {
53 + collr := New()
54
55 - assert.NotPanics(t, job.Cleanup)
56 - require.NoError(t, job.Init())
57 - job.client = prepareMockOpenVPNClient()
58 - require.NoError(t, job.Check())
59 - job.Cleanup()
55 + assert.NotPanics(t, collr.Cleanup)
56 + require.NoError(t, collr.Init())
57 + collr.client = prepareMockOpenVPNClient()
58 + require.NoError(t, collr.Check())
59 + collr.Cleanup()
60 }
61
62 -func TestOpenVPN_Collect(t *testing.T) {
63 - job := New()
62 +func TestCollector_Collect(t *testing.T) {
63 + collr := New()
64
65 - require.NoError(t, job.Init())
66 - job.perUserMatcher = matcher.TRUE()
67 - job.client = prepareMockOpenVPNClient()
68 - require.NoError(t, job.Check())
65 + require.NoError(t, collr.Init())
66 + collr.perUserMatcher = matcher.TRUE()
67 + collr.client = prepareMockOpenVPNClient()
68 + require.NoError(t, collr.Check())
69
70 expected := map[string]int64{
71 "bytes_in": 1,
@@ -75,21 +75,21 @@ func TestOpenVPN_Collect(t *testing.T) {
75 "name_bytes_sent": 2,
76 }
77
78 - mx := job.Collect()
78 + mx := collr.Collect()
79 require.NotNil(t, mx)
80 delete(mx, "name_connection_time")
81 assert.Equal(t, expected, mx)
82 }
83
84 -func TestOpenVPN_Collect_UNDEFUsername(t *testing.T) {
85 - job := New()
84 +func TestCollector_Collect_UNDEFUsername(t *testing.T) {
85 + collr := New()
86
87 - require.NoError(t, job.Init())
88 - job.perUserMatcher = matcher.TRUE()
87 + require.NoError(t, collr.Init())
88 + collr.perUserMatcher = matcher.TRUE()
89 cl := prepareMockOpenVPNClient()
90 cl.users = testUsersUNDEF
91 - job.client = cl
92 - require.NoError(t, job.Check())
91 + collr.client = cl
92 + require.NoError(t, collr.Check())
93
94 expected := map[string]int64{
95 "bytes_in": 1,
@@ -99,8 +99,9 @@ func TestOpenVPN_Collect_UNDEFUsername(t *testing.T) {
99 "common_name_bytes_sent": 2,
100 }
101
102 - mx := job.Collect()
102 + mx := collr.Collect()
103 require.NotNil(t, mx)
104 +
105 delete(mx, "common_name_connection_time")
106 assert.Equal(t, expected, mx)
107 }
src/go/plugin/go.d/collector/openvpn/init.go
+7 -7
@@ -8,21 +8,21 @@ import (
8 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/socket"
9 )
10
11 -func (o *OpenVPN) validateConfig() error {
11 +func (c *Collector) validateConfig() error {
12 return nil
13 }
14
15 -func (o *OpenVPN) initPerUserMatcher() (matcher.Matcher, error) {
16 - if o.PerUserStats.Empty() {
15 +func (c *Collector) initPerUserMatcher() (matcher.Matcher, error) {
16 + if c.PerUserStats.Empty() {
17 return nil, nil
18 }
19 - return o.PerUserStats.Parse()
19 + return c.PerUserStats.Parse()
20 }
21
22 -func (o *OpenVPN) initClient() *client.Client {
22 +func (c *Collector) initClient() *client.Client {
23 config := socket.Config{
24 - Address: o.Address,
25 - Timeout: o.Timeout.Duration(),
24 + Address: c.Address,
25 + Timeout: c.Timeout.Duration(),
26 }
27 return &client.Client{Client: socket.New(config)}
28 }
src/go/plugin/go.d/collector/openvpn_status_log/charts.go
+2 -2
@@ -58,7 +58,7 @@ var userCharts = module.Charts{
58 },
59 }
60
61 -func (o *OpenVPNStatusLog) addUserCharts(userName string) error {
61 +func (c *Collector) addUserCharts(userName string) error {
62 cs := userCharts.Copy()
63
64 for _, chart := range *cs {
@@ -68,5 +68,5 @@ func (o *OpenVPNStatusLog) addUserCharts(userName string) error {
68 }
69 chart.MarkNotCreated()
70 }
71 - return o.charts.Add(*cs...)
71 + return c.charts.Add(*cs...)
72 }
src/go/plugin/go.d/collector/openvpn_status_log/collect.go
+10 -10
@@ -6,8 +6,8 @@ import (
6 "time"
7 )
8
9 -func (o *OpenVPNStatusLog) collect() (map[string]int64, error) {
10 - clients, err := parse(o.LogPath)
9 +func (c *Collector) collect() (map[string]int64, error) {
10 + clients, err := parse(c.LogPath)
11 if err != nil {
12 return nil, err
13 }
@@ -16,8 +16,8 @@ func (o *OpenVPNStatusLog) collect() (map[string]int64, error) {
16
17 collectTotalStats(mx, clients)
18
19 - if o.perUserMatcher != nil && numOfClients(clients) > 0 {
20 - o.collectUsers(mx, clients)
19 + if c.perUserMatcher != nil && numOfClients(clients) > 0 {
20 + c.collectUsers(mx, clients)
21 }
22
23 return mx, nil
@@ -34,18 +34,18 @@ func collectTotalStats(mx map[string]int64, clients []clientInfo) {
34 mx["bytes_out"] = out
35 }
36
37 -func (o *OpenVPNStatusLog) collectUsers(mx map[string]int64, clients []clientInfo) {
37 +func (c *Collector) collectUsers(mx map[string]int64, clients []clientInfo) {
38 now := time.Now().Unix()
39
40 for _, user := range clients {
41 name := user.commonName
42 - if !o.perUserMatcher.MatchString(name) {
42 + if !c.perUserMatcher.MatchString(name) {
43 continue
44 }
45 - if !o.collectedUsers[name] {
46 - o.collectedUsers[name] = true
47 - if err := o.addUserCharts(name); err != nil {
48 - o.Warning(err)
45 + if !c.collectedUsers[name] {
46 + c.collectedUsers[name] = true
47 + if err := c.addUserCharts(name); err != nil {
48 + c.Warning(err)
49 }
50 }
51 mx[name+"_bytes_in"] = user.bytesReceived
src/go/plugin/go.d/collector/openvpn_status_log/collector.go renamed
+17 -17
@@ -22,8 +22,8 @@ func init() {
22 })
23 }
24
25 -func New() *OpenVPNStatusLog {
26 - return &OpenVPNStatusLog{
25 +func New() *Collector {
26 + return &Collector{
27 Config: Config{
28 LogPath: "/var/log/openvpn/status.log",
29 },
@@ -38,7 +38,7 @@ type Config struct {
38 PerUserStats matcher.SimpleExpr `yaml:"per_user_stats,omitempty" json:"per_user_stats"`
39 }
40
41 -type OpenVPNStatusLog struct {
41 +type Collector struct {
42 module.Base
43 Config `yaml:",inline" json:""`
44
@@ -48,28 +48,28 @@ type OpenVPNStatusLog struct {
48 collectedUsers map[string]bool
49 }
50
51 -func (o *OpenVPNStatusLog) Configuration() any {
52 - return o.Config
51 +func (c *Collector) Configuration() any {
52 + return c.Config
53 }
54
55 -func (o *OpenVPNStatusLog) Init() error {
56 - if err := o.validateConfig(); err != nil {
55 +func (c *Collector) Init() error {
56 + if err := c.validateConfig(); err != nil {
57 return fmt.Errorf("error on validating config: %v", err)
58 }
59
60 - m, err := o.initPerUserStatsMatcher()
60 + m, err := c.initPerUserStatsMatcher()
61 if err != nil {
62 return fmt.Errorf("error on creating 'per_user_stats' matcher: %v", err)
63 }
64 if m != nil {
65 - o.perUserMatcher = m
65 + c.perUserMatcher = m
66 }
67
68 return nil
69 }
70
71 -func (o *OpenVPNStatusLog) Check() error {
72 - mx, err := o.collect()
71 +func (c *Collector) Check() error {
72 + mx, err := c.collect()
73 if err != nil {
74 return err
75 }
@@ -79,14 +79,14 @@ func (o *OpenVPNStatusLog) Check() error {
79 return nil
80 }
81
82 -func (o *OpenVPNStatusLog) Charts() *module.Charts {
83 - return o.charts
82 +func (c *Collector) Charts() *module.Charts {
83 + return c.charts
84 }
85
86 -func (o *OpenVPNStatusLog) Collect() map[string]int64 {
87 - mx, err := o.collect()
86 +func (c *Collector) Collect() map[string]int64 {
87 + mx, err := c.collect()
88 if err != nil {
89 - o.Error(err)
89 + c.Error(err)
90 }
91
92 if len(mx) == 0 {
@@ -95,4 +95,4 @@ func (o *OpenVPNStatusLog) Collect() map[string]int64 {
95 return mx
96 }
97
98 -func (o *OpenVPNStatusLog) Cleanup() {}
98 +func (c *Collector) Cleanup() {}
src/go/plugin/go.d/collector/openvpn_status_log/collector_test.go renamed
+77 -77
@@ -40,11 +40,11 @@ func Test_testDataIsValid(t *testing.T) {
40 }
41 }
42
43 -func TestOpenVPNStatusLog_ConfigurationSerialize(t *testing.T) {
44 - module.TestConfigurationSerialize(t, &OpenVPNStatusLog{}, dataConfigJSON, dataConfigYAML)
43 +func TestCollector_ConfigurationSerialize(t *testing.T) {
44 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
45 }
46
47 -func TestOpenVPNStatusLog_Init(t *testing.T) {
47 +func TestCollector_Init(t *testing.T) {
48 tests := map[string]struct {
49 config Config
50 wantFail bool
@@ -62,21 +62,21 @@ func TestOpenVPNStatusLog_Init(t *testing.T) {
62
63 for name, test := range tests {
64 t.Run(name, func(t *testing.T) {
65 - ovpn := New()
66 - ovpn.Config = test.config
65 + collr := New()
66 + collr.Config = test.config
67
68 if test.wantFail {
69 - assert.Error(t, ovpn.Init())
69 + assert.Error(t, collr.Init())
70 } else {
71 - assert.NoError(t, ovpn.Init())
71 + assert.NoError(t, collr.Init())
72 }
73 })
74 }
75 }
76
77 -func TestOpenVPNStatusLog_Check(t *testing.T) {
77 +func TestCollector_Check(t *testing.T) {
78 tests := map[string]struct {
79 - prepare func() *OpenVPNStatusLog
79 + prepare func() *Collector
80 wantFail bool
81 }{
82 "status version 1": {prepare: prepareCaseStatusVersion1},
@@ -91,22 +91,22 @@ func TestOpenVPNStatusLog_Check(t *testing.T) {
91
92 for name, test := range tests {
93 t.Run(name, func(t *testing.T) {
94 - ovpn := test.prepare()
94 + collr := test.prepare()
95
96 - require.NoError(t, ovpn.Init())
96 + require.NoError(t, collr.Init())
97
98 if test.wantFail {
99 - assert.Error(t, ovpn.Check())
99 + assert.Error(t, collr.Check())
100 } else {
101 - assert.NoError(t, ovpn.Check())
101 + assert.NoError(t, collr.Check())
102 }
103 })
104 }
105 }
106
107 -func TestOpenVPNStatusLog_Charts(t *testing.T) {
107 +func TestCollector_Charts(t *testing.T) {
108 tests := map[string]struct {
109 - prepare func() *OpenVPNStatusLog
109 + prepare func() *Collector
110 wantNumCharts int
111 }{
112 "status version 1 with user stats": {
@@ -129,20 +129,20 @@ func TestOpenVPNStatusLog_Charts(t *testing.T) {
129
130 for name, test := range tests {
131 t.Run(name, func(t *testing.T) {
132 - ovpn := test.prepare()
132 + collr := test.prepare()
133
134 - require.NoError(t, ovpn.Init())
135 - _ = ovpn.Check()
136 - _ = ovpn.Collect()
134 + require.NoError(t, collr.Init())
135 + _ = collr.Check()
136 + _ = collr.Collect()
137
138 - assert.Equal(t, test.wantNumCharts, len(*ovpn.Charts()))
138 + assert.Equal(t, test.wantNumCharts, len(*collr.Charts()))
139 })
140 }
141 }
142
143 -func TestOpenVPNStatusLog_Collect(t *testing.T) {
143 +func TestCollector_Collect(t *testing.T) {
144 tests := map[string]struct {
145 - prepare func() *OpenVPNStatusLog
145 + prepare func() *Collector
146 expected map[string]int64
147 }{
148 "status version 1": {
@@ -255,12 +255,12 @@ func TestOpenVPNStatusLog_Collect(t *testing.T) {
255
256 for name, test := range tests {
257 t.Run(name, func(t *testing.T) {
258 - ovpn := test.prepare()
258 + collr := test.prepare()
259
260 - require.NoError(t, ovpn.Init())
261 - _ = ovpn.Check()
260 + require.NoError(t, collr.Init())
261 + _ = collr.Check()
262
263 - collected := ovpn.Collect()
263 + collected := collr.Collect()
264
265 copyConnTime(collected, test.expected)
266 assert.Equal(t, test.expected, collected)
@@ -268,85 +268,85 @@ func TestOpenVPNStatusLog_Collect(t *testing.T) {
268 }
269 }
270
271 -func prepareCaseStatusVersion1() *OpenVPNStatusLog {
272 - ovpn := New()
273 - ovpn.LogPath = pathStatusVersion1
274 - return ovpn
271 +func prepareCaseStatusVersion1() *Collector {
272 + collr := New()
273 + collr.LogPath = pathStatusVersion1
274 + return collr
275 }
276
277 -func prepareCaseStatusVersion1WithUserStats() *OpenVPNStatusLog {
278 - ovpn := New()
279 - ovpn.LogPath = pathStatusVersion1
280 - ovpn.PerUserStats = matcher.SimpleExpr{
277 +func prepareCaseStatusVersion1WithUserStats() *Collector {
278 + collr := New()
279 + collr.LogPath = pathStatusVersion1
280 + collr.PerUserStats = matcher.SimpleExpr{
281 Includes: []string{"* *"},
282 }
283 - return ovpn
283 + return collr
284 }
285
286 -func prepareCaseStatusVersion1NoClients() *OpenVPNStatusLog {
287 - ovpn := New()
288 - ovpn.LogPath = pathStatusVersion1NoClients
289 - return ovpn
286 +func prepareCaseStatusVersion1NoClients() *Collector {
287 + collr := New()
288 + collr.LogPath = pathStatusVersion1NoClients
289 + return collr
290 }
291
292 -func prepareCaseStatusVersion2() *OpenVPNStatusLog {
293 - ovpn := New()
294 - ovpn.LogPath = pathStatusVersion2
295 - return ovpn
292 +func prepareCaseStatusVersion2() *Collector {
293 + collr := New()
294 + collr.LogPath = pathStatusVersion2
295 + return collr
296 }
297
298 -func prepareCaseStatusVersion2WithUserStats() *OpenVPNStatusLog {
299 - ovpn := New()
300 - ovpn.LogPath = pathStatusVersion2
301 - ovpn.PerUserStats = matcher.SimpleExpr{
298 +func prepareCaseStatusVersion2WithUserStats() *Collector {
299 + collr := New()
300 + collr.LogPath = pathStatusVersion2
301 + collr.PerUserStats = matcher.SimpleExpr{
302 Includes: []string{"* *"},
303 }
304 - return ovpn
304 + return collr
305 }
306
307 -func prepareCaseStatusVersion2NoClients() *OpenVPNStatusLog {
308 - ovpn := New()
309 - ovpn.LogPath = pathStatusVersion2NoClients
310 - return ovpn
307 +func prepareCaseStatusVersion2NoClients() *Collector {
308 + collr := New()
309 + collr.LogPath = pathStatusVersion2NoClients
310 + return collr
311 }
312
313 -func prepareCaseStatusVersion3() *OpenVPNStatusLog {
314 - ovpn := New()
315 - ovpn.LogPath = pathStatusVersion3
316 - return ovpn
313 +func prepareCaseStatusVersion3() *Collector {
314 + collr := New()
315 + collr.LogPath = pathStatusVersion3
316 + return collr
317 }
318
319 -func prepareCaseStatusVersion3WithUserStats() *OpenVPNStatusLog {
320 - ovpn := New()
321 - ovpn.LogPath = pathStatusVersion3
322 - ovpn.PerUserStats = matcher.SimpleExpr{
319 +func prepareCaseStatusVersion3WithUserStats() *Collector {
320 + collr := New()
321 + collr.LogPath = pathStatusVersion3
322 + collr.PerUserStats = matcher.SimpleExpr{
323 Includes: []string{"* *"},
324 }
325 - return ovpn
325 + return collr
326 }
327
328 -func prepareCaseStatusVersion3NoClients() *OpenVPNStatusLog {
329 - ovpn := New()
330 - ovpn.LogPath = pathStatusVersion3NoClients
331 - return ovpn
328 +func prepareCaseStatusVersion3NoClients() *Collector {
329 + collr := New()
330 + collr.LogPath = pathStatusVersion3NoClients
331 + return collr
332 }
333
334 -func prepareCaseStatusStaticKey() *OpenVPNStatusLog {
335 - ovpn := New()
336 - ovpn.LogPath = pathStaticKey
337 - return ovpn
334 +func prepareCaseStatusStaticKey() *Collector {
335 + collr := New()
336 + collr.LogPath = pathStaticKey
337 + return collr
338 }
339
340 -func prepareCaseEmptyFile() *OpenVPNStatusLog {
341 - ovpn := New()
342 - ovpn.LogPath = pathEmptyFile
343 - return ovpn
340 +func prepareCaseEmptyFile() *Collector {
341 + collr := New()
342 + collr.LogPath = pathEmptyFile
343 + return collr
344 }
345
346 -func prepareCaseNonExistentFile() *OpenVPNStatusLog {
347 - ovpn := New()
348 - ovpn.LogPath = pathNonExistentFile
349 - return ovpn
346 +func prepareCaseNonExistentFile() *Collector {
347 + collr := New()
348 + collr.LogPath = pathNonExistentFile
349 + return collr
350 }
351
352 func copyConnTime(dst, src map[string]int64) {
src/go/plugin/go.d/collector/openvpn_status_log/init.go
+5 -5
@@ -8,18 +8,18 @@ import (
8 "github.com/netdata/netdata/go/plugins/pkg/matcher"
9 )
10
11 -func (o *OpenVPNStatusLog) validateConfig() error {
12 - if o.LogPath == "" {
11 +func (c *Collector) validateConfig() error {
12 + if c.LogPath == "" {
13 return errors.New("empty 'log_path'")
14 }
15 return nil
16 }
17
18 -func (o *OpenVPNStatusLog) initPerUserStatsMatcher() (matcher.Matcher, error) {
19 - if o.PerUserStats.Empty() {
18 +func (c *Collector) initPerUserStatsMatcher() (matcher.Matcher, error) {
19 + if c.PerUserStats.Empty() {
20 return nil, nil
21 }
22 - m, err := o.PerUserStats.Parse()
22 + m, err := c.PerUserStats.Parse()
23 if err != nil {
24 return nil, err
25 }
src/go/plugin/go.d/collector/oracledb/charts.go
+7 -7
@@ -319,7 +319,7 @@ var (
319 }
320 )
321
322 -func (o *OracleDB) addTablespaceCharts(tablespace string) {
322 +func (c *Collector) addTablespaceCharts(tablespace string) {
323 charts := tablespaceChartsTmpl.Copy()
324
325 for _, chart := range *charts {
@@ -332,14 +332,14 @@ func (o *OracleDB) addTablespaceCharts(tablespace string) {
332 }
333 }
334
335 - if err := o.Charts().Add(*charts...); err != nil {
336 - o.Warningf("failed to add tablespace '%s' charts: %v", tablespace, err)
335 + if err := c.Charts().Add(*charts...); err != nil {
336 + c.Warningf("failed to add tablespace '%s' charts: %v", tablespace, err)
337 }
338 }
339
340 -func (o *OracleDB) removeTablespaceChart(tablespace string) {}
340 +func (c *Collector) removeTablespaceChart(tablespace string) {}
341
342 -func (o *OracleDB) addWaitClassCharts(waitClass string) {
342 +func (c *Collector) addWaitClassCharts(waitClass string) {
343 charts := waitClassChartsTmpl.Copy()
344
345 for _, chart := range *charts {
@@ -352,8 +352,8 @@ func (o *OracleDB) addWaitClassCharts(waitClass string) {
352 }
353 }
354
355 - if err := o.Charts().Add(*charts...); err != nil {
356 - o.Warningf("failed to add wait class '%s' charts: %v", waitClass, err)
355 + if err := c.Charts().Add(*charts...); err != nil {
356 + c.Warningf("failed to add wait class '%s' charts: %v", waitClass, err)
357 }
358 }
359
src/go/plugin/go.d/collector/oracledb/collect.go
+14 -14
@@ -11,9 +11,9 @@ import (
11
12 const precision = 1000
13
14 -func (o *OracleDB) collect() (map[string]int64, error) {
15 - if o.db == nil {
16 - if err := o.openConnection(); err != nil {
14 +func (c *Collector) collect() (map[string]int64, error) {
15 + if c.db == nil {
16 + if err := c.openConnection(); err != nil {
17 return nil, fmt.Errorf("failed to open connection: %v", err)
18 }
19 }
@@ -22,27 +22,27 @@ func (o *OracleDB) collect() (map[string]int64, error) {
22
23 // TODO: https://www.oracle.com/technical-resources/articles/schumacher-analysis.html
24
25 - if err := o.collectSysMetrics(mx); err != nil {
25 + if err := c.collectSysMetrics(mx); err != nil {
26 return nil, fmt.Errorf("failed to collect system metrics: %v", err)
27 }
28 - if err := o.collectSysStat(mx); err != nil {
28 + if err := c.collectSysStat(mx); err != nil {
29 return nil, fmt.Errorf("failed to collect activities: %v", err)
30 }
31 - if err := o.collectWaitClass(mx); err != nil {
31 + if err := c.collectWaitClass(mx); err != nil {
32 return nil, fmt.Errorf("failed to collect wait time: %v", err)
33 }
34 - if err := o.collectTablespace(mx); err != nil {
34 + if err := c.collectTablespace(mx); err != nil {
35 return nil, fmt.Errorf("failed to collect tablespace: %v", err)
36 }
37
38 return mx, nil
39 }
40
41 -func (o *OracleDB) doQuery(query string, assign func(column, value string, lineEnd bool) error) error {
42 - ctx, cancel := context.WithTimeout(context.Background(), o.Timeout.Duration())
41 +func (c *Collector) doQuery(query string, assign func(column, value string, lineEnd bool) error) error {
42 + ctx, cancel := context.WithTimeout(context.Background(), c.Timeout.Duration())
43 defer cancel()
44
45 - rows, err := o.db.QueryContext(ctx, query)
45 + rows, err := c.db.QueryContext(ctx, query)
46 if err != nil {
47 return err
48 }
@@ -69,15 +69,15 @@ func (o *OracleDB) doQuery(query string, assign func(column, value string, lineE
69 return rows.Err()
70 }
71
72 -func (o *OracleDB) openConnection() error {
73 - db, err := sql.Open("oracle", o.DSN)
72 +func (c *Collector) openConnection() error {
73 + db, err := sql.Open("oracle", c.DSN)
74 if err != nil {
75 return fmt.Errorf("error on sql open: %v", err)
76 }
77
78 db.SetConnMaxLifetime(10 * time.Minute)
79
80 - ctx, cancel := context.WithTimeout(context.Background(), o.Timeout.Duration())
80 + ctx, cancel := context.WithTimeout(context.Background(), c.Timeout.Duration())
81 defer cancel()
82
83 if err := db.PingContext(ctx); err != nil {
@@ -85,7 +85,7 @@ func (o *OracleDB) openConnection() error {
85 return fmt.Errorf("error on pinging: %v", err)
86 }
87
88 - o.db = db
88 + c.db = db
89
90 return nil
91 }
src/go/plugin/go.d/collector/oracledb/collect_sysmetric.go
+3 -3
@@ -32,13 +32,13 @@ WHERE
32 = (SELECT max(intsize_csec) FROM sys.v_$sysmetric)
33 `
34
35 -func (o *OracleDB) collectSysMetrics(mx map[string]int64) error {
35 +func (c *Collector) collectSysMetrics(mx map[string]int64) error {
36 q := querySysMetrics
37 - o.Debugf("executing query: %s", q)
37 + c.Debugf("executing query: %s", q)
38
39 var name, val string
40
41 - return o.doQuery(q, func(column, value string, lineEnd bool) error {
41 + return c.doQuery(q, func(column, value string, lineEnd bool) error {
42 switch column {
43 case "METRIC_NAME":
44 name = value
src/go/plugin/go.d/collector/oracledb/collect_sysstat.go
+3 -3
@@ -33,13 +33,13 @@ WHERE
33 )
34 `
35
36 -func (o *OracleDB) collectSysStat(mx map[string]int64) error {
36 +func (c *Collector) collectSysStat(mx map[string]int64) error {
37 q := querySysStat
38 - o.Debugf("executing query: %s", q)
38 + c.Debugf("executing query: %s", q)
39
40 var name, val string
41
42 - return o.doQuery(q, func(column, value string, lineEnd bool) error {
42 + return c.doQuery(q, func(column, value string, lineEnd bool) error {
43 switch column {
44 case "NAME":
45 name = value
src/go/plugin/go.d/collector/oracledb/collect_tablespace.go
+9 -9
@@ -31,9 +31,9 @@ GROUP BY
31 f.tablespace_name, f.autoextensible
32 `
33
34 -func (o *OracleDB) collectTablespace(mx map[string]int64) error {
34 +func (c *Collector) collectTablespace(mx map[string]int64) error {
35 q := queryTablespace
36 - o.Debugf("executing query: %s", q)
36 + c.Debugf("executing query: %s", q)
37
38 var ts struct {
39 name string
@@ -45,7 +45,7 @@ func (o *OracleDB) collectTablespace(mx map[string]int64) error {
45
46 seen := make(map[string]bool)
47
48 - err := o.doQuery(q, func(column, value string, lineEnd bool) error {
48 + err := c.doQuery(q, func(column, value string, lineEnd bool) error {
49 var err error
50
51 switch column {
@@ -90,15 +90,15 @@ func (o *OracleDB) collectTablespace(mx map[string]int64) error {
90 }
91
92 for name := range seen {
93 - if !o.seenTablespaces[name] {
94 - o.seenTablespaces[name] = true
95 - o.addTablespaceCharts(name)
93 + if !c.seenTablespaces[name] {
94 + c.seenTablespaces[name] = true
95 + c.addTablespaceCharts(name)
96 }
97 }
98 - for name := range o.seenTablespaces {
98 + for name := range c.seenTablespaces {
99 if !seen[name] {
100 - delete(o.seenTablespaces, name)
101 - o.removeTablespaceChart(name)
100 + delete(c.seenTablespaces, name)
101 + c.removeTablespaceChart(name)
102 }
103 }
104
src/go/plugin/go.d/collector/oracledb/collect_wait_class.go
+6 -6
@@ -19,14 +19,14 @@ WHERE
19 AND n.wait_class != 'Idle'
20 `
21
22 -func (o *OracleDB) collectWaitClass(mx map[string]int64) error {
22 +func (c *Collector) collectWaitClass(mx map[string]int64) error {
23 q := queryWaitClass
24 - o.Debugf("executing query: %s", q)
24 + c.Debugf("executing query: %s", q)
25
26 seen := make(map[string]bool)
27 var wclass, wtime string
28
29 - err := o.doQuery(q, func(column, value string, lineEnd bool) error {
29 + err := c.doQuery(q, func(column, value string, lineEnd bool) error {
30 switch column {
31 case "WAIT_CLASS":
32 wclass = value
@@ -50,9 +50,9 @@ func (o *OracleDB) collectWaitClass(mx map[string]int64) error {
50 }
51
52 for name := range seen {
53 - if !o.seenWaitClasses[name] {
54 - o.seenWaitClasses[name] = true
55 - o.addWaitClassCharts(name)
53 + if !c.seenWaitClasses[name] {
54 + c.seenWaitClasses[name] = true
55 + c.addWaitClassCharts(name)
56 }
57 }
58
src/go/plugin/go.d/collector/oracledb/collector.go renamed
+21 -21
@@ -24,8 +24,8 @@ func init() {
24 })
25 }
26
27 -func New() *OracleDB {
28 - return &OracleDB{
27 +func New() *Collector {
28 + return &Collector{
29 Config: Config{
30 Timeout: confopt.Duration(time.Second * 2),
31 charts: globalCharts.Copy(),
@@ -48,32 +48,32 @@ type Config struct {
48 seenWaitClasses map[string]bool
49 }
50
51 -type OracleDB struct {
51 +type Collector struct {
52 module.Base
53 Config `yaml:",inline" json:""`
54
55 db *sql.DB
56 }
57
58 -func (o *OracleDB) Configuration() any {
59 - return o.Config
58 +func (c *Collector) Configuration() any {
59 + return c.Config
60 }
61
62 -func (o *OracleDB) Init() error {
63 - dsn, err := o.validateDSN()
62 +func (c *Collector) Init() error {
63 + dsn, err := c.validateDSN()
64 if err != nil {
65 return fmt.Errorf("invalid oracle DSN: %w", err)
66 }
67
68 - o.publicDSN = dsn
68 + c.publicDSN = dsn
69
70 return nil
71 }
72
73 -func (o *OracleDB) Check() error {
74 - mx, err := o.collect()
73 +func (c *Collector) Check() error {
74 + mx, err := c.collect()
75 if err != nil {
76 - return fmt.Errorf("failed to collect metrics [%s]: %w", o.publicDSN, err)
76 + return fmt.Errorf("failed to collect metrics [%s]: %w", c.publicDSN, err)
77 }
78 if len(mx) == 0 {
79 return errors.New("no metrics collected")
@@ -82,14 +82,14 @@ func (o *OracleDB) Check() error {
82 return nil
83 }
84
85 -func (o *OracleDB) Charts() *module.Charts {
86 - return o.charts
85 +func (c *Collector) Charts() *module.Charts {
86 + return c.charts
87 }
88
89 -func (o *OracleDB) Collect() map[string]int64 {
90 - mx, err := o.collect()
89 +func (c *Collector) Collect() map[string]int64 {
90 + mx, err := c.collect()
91 if err != nil {
92 - o.Error(fmt.Sprintf("failed to collect metrics [%s]: %s", o.publicDSN, err))
92 + c.Error(fmt.Sprintf("failed to collect metrics [%s]: %s", c.publicDSN, err))
93 }
94
95 if len(mx) == 0 {
@@ -99,11 +99,11 @@ func (o *OracleDB) Collect() map[string]int64 {
99 return mx
100 }
101
102 -func (o *OracleDB) Cleanup() {
103 - if o.db != nil {
104 - if err := o.db.Close(); err != nil {
105 - o.Errorf("cleanup: error on closing connection [%s]: %v", o.publicDSN, err)
102 +func (c *Collector) Cleanup() {
103 + if c.db != nil {
104 + if err := c.db.Close(); err != nil {
105 + c.Errorf("cleanup: error on closing connection [%s]: %v", c.publicDSN, err)
106 }
107 - o.db = nil
107 + c.db = nil
108 }
109 }
src/go/plugin/go.d/collector/oracledb/collector_test.go renamed
+33 -33
@@ -46,15 +46,15 @@ func Test_testDataIsValid(t *testing.T) {
46 }
47 }
48
49 -func TestOracleDB_ConfigurationSerialize(t *testing.T) {
50 - module.TestConfigurationSerialize(t, &OracleDB{}, dataConfigJSON, dataConfigYAML)
49 +func TestCollector_ConfigurationSerialize(t *testing.T) {
50 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
51 }
52
53 -func TestOracleDB_Charts(t *testing.T) {
53 +func TestCollector_Charts(t *testing.T) {
54 assert.NotNil(t, New().Charts())
55 }
56
57 -func TestOracleDB_Init(t *testing.T) {
57 +func TestCollector_Init(t *testing.T) {
58 tests := map[string]struct {
59 config Config
60 wantFail bool
@@ -67,49 +67,49 @@ func TestOracleDB_Init(t *testing.T) {
67
68 for name, test := range tests {
69 t.Run(name, func(t *testing.T) {
70 - ora := New()
71 - ora.Config = test.config
70 + collr := New()
71 + collr.Config = test.config
72
73 if test.wantFail {
74 - assert.Error(t, ora.Init())
74 + assert.Error(t, collr.Init())
75 } else {
76 - assert.NoError(t, ora.Init())
76 + assert.NoError(t, collr.Init())
77 }
78 })
79 }
80 }
81
82 -func TestOracleDB_Cleanup(t *testing.T) {
83 - tests := map[string]func(t *testing.T) (ora *OracleDB, cleanup func()){
84 - "db connection not initialized": func(t *testing.T) (ora *OracleDB, cleanup func()) {
82 +func TestCollector_Cleanup(t *testing.T) {
83 + tests := map[string]func(t *testing.T) (collr *Collector, cleanup func()){
84 + "db connection not initialized": func(t *testing.T) (collr *Collector, cleanup func()) {
85 return New(), func() {}
86 },
87 - "db connection initialized": func(t *testing.T) (ora *OracleDB, cleanup func()) {
87 + "db connection initialized": func(t *testing.T) (collr *Collector, cleanup func()) {
88 db, mock, err := sqlmock.New()
89 require.NoError(t, err)
90
91 mock.ExpectClose()
92 - ora = New()
93 - ora.db = db
92 + collr = New()
93 + collr.db = db
94 cleanup = func() { _ = db.Close() }
95
96 - return ora, cleanup
96 + return collr, cleanup
97 },
98 }
99
100 for name, prepare := range tests {
101 t.Run(name, func(t *testing.T) {
102 - ora, cleanup := prepare(t)
102 + collr, cleanup := prepare(t)
103 defer cleanup()
104
105 - assert.NotPanics(t, ora.Cleanup)
106 - assert.Nil(t, ora.db)
105 + assert.NotPanics(t, collr.Cleanup)
106 + assert.Nil(t, collr.db)
107 })
108 }
109
110 }
111
112 -func TestOracleDB_Check(t *testing.T) {
112 +func TestCollector_Check(t *testing.T) {
113 tests := map[string]struct {
114 prepareMock func(t *testing.T, m sqlmock.Sqlmock)
115 wantFail bool
@@ -137,26 +137,26 @@ func TestOracleDB_Check(t *testing.T) {
137 sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual),
138 )
139 require.NoError(t, err)
140 - ora := New()
141 - ora.DSN = "oracle://user:pass@127.0.0.1:32001/XE"
142 - ora.db = db
140 + collr := New()
141 + collr.DSN = "oracle://user:pass@127.0.0.1:32001/XE"
142 + collr.db = db
143 defer func() { _ = db.Close() }()
144
145 - require.NoError(t, ora.Init())
145 + require.NoError(t, collr.Init())
146
147 test.prepareMock(t, mock)
148
149 if test.wantFail {
150 - assert.Error(t, ora.Check())
150 + assert.Error(t, collr.Check())
151 } else {
152 - assert.NoError(t, ora.Check())
152 + assert.NoError(t, collr.Check())
153 }
154 assert.NoError(t, mock.ExpectationsWereMet())
155 })
156 }
157 }
158
159 -func TestOracleDB_Collect(t *testing.T) {
159 +func TestCollector_Collect(t *testing.T) {
160 tests := map[string]struct {
161 prepareMock func(t *testing.T, m sqlmock.Sqlmock)
162 wantCharts int
@@ -238,21 +238,21 @@ func TestOracleDB_Collect(t *testing.T) {
238 sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual),
239 )
240 require.NoError(t, err)
241 - ora := New()
242 - ora.DSN = "oracle://user:pass@127.0.0.1:32001/XE"
243 - ora.db = db
241 + collr := New()
242 + collr.DSN = "oracle://user:pass@127.0.0.1:32001/XE"
243 + collr.db = db
244 defer func() { _ = db.Close() }()
245
246 - require.NoError(t, ora.Init())
246 + require.NoError(t, collr.Init())
247
248 test.prepareMock(t, mock)
249
250 - mx := ora.Collect()
250 + mx := collr.Collect()
251
252 require.Equal(t, test.wantMetrics, mx)
253 if len(test.wantMetrics) > 0 {
254 - assert.Equal(t, test.wantCharts, len(*ora.Charts()), "wantCharts")
255 - module.TestMetricsHasAllChartsDims(t, ora.Charts(), mx)
254 + assert.Equal(t, test.wantCharts, len(*collr.Charts()), "wantCharts")
255 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
256 }
257
258 assert.NoError(t, mock.ExpectationsWereMet())
src/go/plugin/go.d/collector/oracledb/init.go
+4 -4
@@ -10,15 +10,15 @@ import (
10 goora "github.com/sijms/go-ora/v2"
11 )
12
13 -func (o *OracleDB) validateDSN() (string, error) {
14 - if o.DSN == "" {
13 +func (c *Collector) validateDSN() (string, error) {
14 + if c.DSN == "" {
15 return "", errors.New("dsn required but not set")
16 }
17 - if _, err := goora.ParseConfig(o.DSN); err != nil {
17 + if _, err := goora.ParseConfig(c.DSN); err != nil {
18 return "", err
19 }
20
21 - u, err := url.Parse(o.DSN)
21 + u, err := url.Parse(c.DSN)
22 if err != nil {
23 return "", err
24 }
src/go/plugin/go.d/collector/pgbouncer/charts.go
+5 -5
@@ -229,16 +229,16 @@ func newDatabaseCharts(dbname, pgDBName string) *module.Charts {
229 return charts
230 }
231
232 -func (p *PgBouncer) addNewDatabaseCharts(dbname, pgDBName string) {
232 +func (c *Collector) addNewDatabaseCharts(dbname, pgDBName string) {
233 charts := newDatabaseCharts(dbname, pgDBName)
234 - if err := p.Charts().Add(*charts...); err != nil {
235 - p.Warning(err)
234 + if err := c.Charts().Add(*charts...); err != nil {
235 + c.Warning(err)
236 }
237 }
238
239 -func (p *PgBouncer) removeDatabaseCharts(dbname string) {
239 +func (c *Collector) removeDatabaseCharts(dbname string) {
240 prefix := fmt.Sprintf("db_%s_", dbname)
241 - for _, c := range *p.Charts() {
241 + for _, c := range *c.Charts() {
242 if strings.HasPrefix(c.ID, prefix) {
243 c.MarkRemove()
244 c.MarkNotCreated()
src/go/plugin/go.d/collector/pgbouncer/collect.go
+77 -77
@@ -28,64 +28,64 @@ const (
28 queryShowPools = "SHOW POOLS;"
29 )
30
31 -func (p *PgBouncer) collect() (map[string]int64, error) {
32 - if p.db == nil {
33 - if err := p.openConnection(); err != nil {
31 +func (c *Collector) collect() (map[string]int64, error) {
32 + if c.db == nil {
33 + if err := c.openConnection(); err != nil {
34 return nil, err
35 }
36 }
37 - if p.version == nil {
38 - ver, err := p.queryVersion()
37 + if c.version == nil {
38 + ver, err := c.queryVersion()
39 if err != nil {
40 return nil, err
41 }
42 - p.Debugf("connected to PgBouncer v%s", ver)
42 + c.Debugf("connected to PgBouncer v%s", ver)
43 if ver.LE(minSupportedVersion) {
44 return nil, fmt.Errorf("unsupported version: v%s, required v%s+", ver, minSupportedVersion)
45 }
46 - p.version = ver
46 + c.version = ver
47 }
48
49 now := time.Now()
50 - if now.Sub(p.recheckSettingsTime) > p.recheckSettingsEvery {
51 - v, err := p.queryMaxClientConn()
50 + if now.Sub(c.recheckSettingsTime) > c.recheckSettingsEvery {
51 + v, err := c.queryMaxClientConn()
52 if err != nil {
53 return nil, err
54 }
55 - p.maxClientConn = v
55 + c.maxClientConn = v
56 }
57
58 // http://www.pgbouncer.org/usage.html
59
60 - p.resetMetrics()
60 + c.resetMetrics()
61
62 - if err := p.collectDatabases(); err != nil {
62 + if err := c.collectDatabases(); err != nil {
63 return nil, err
64 }
65 - if err := p.collectStats(); err != nil {
65 + if err := c.collectStats(); err != nil {
66 return nil, err
67 }
68 - if err := p.collectPools(); err != nil {
68 + if err := c.collectPools(); err != nil {
69 return nil, err
70 }
71
72 mx := make(map[string]int64)
73 - p.collectMetrics(mx)
73 + c.collectMetrics(mx)
74
75 return mx, nil
76 }
77
78 -func (p *PgBouncer) collectMetrics(mx map[string]int64) {
78 +func (c *Collector) collectMetrics(mx map[string]int64) {
79 var clientConns int64
80 - for name, db := range p.metrics.dbs {
80 + for name, db := range c.metrics.dbs {
81 if !db.updated {
82 - delete(p.metrics.dbs, name)
83 - p.removeDatabaseCharts(name)
82 + delete(c.metrics.dbs, name)
83 + c.removeDatabaseCharts(name)
84 continue
85 }
86 if !db.hasCharts {
87 db.hasCharts = true
88 - p.addNewDatabaseCharts(name, db.pgDBName)
88 + c.addNewDatabaseCharts(name, db.pgDBName)
89 }
90
91 mx["db_"+name+"_total_xact_count"] = db.totalXactCount
@@ -116,107 +116,107 @@ func (p *PgBouncer) collectMetrics(mx map[string]int64) {
116 mx["db_"+name+"_sv_conns_utilization"] = calcPercentage(db.currentConnections, db.maxConnections)
117 }
118
119 - mx["cl_conns_utilization"] = calcPercentage(clientConns, p.maxClientConn)
119 + mx["cl_conns_utilization"] = calcPercentage(clientConns, c.maxClientConn)
120 }
121
122 -func (p *PgBouncer) collectDatabases() error {
122 +func (c *Collector) collectDatabases() error {
123 q := queryShowDatabases
124 - p.Debugf("executing query: %v", q)
124 + c.Debugf("executing query: %v", q)
125
126 var db string
127 - return p.collectQuery(q, func(column, value string) {
127 + return c.collectQuery(q, func(column, value string) {
128 switch column {
129 case "name":
130 db = value
131 - p.getDBMetrics(db).updated = true
131 + c.getDBMetrics(db).updated = true
132 case "database":
133 - p.getDBMetrics(db).pgDBName = value
133 + c.getDBMetrics(db).pgDBName = value
134 case "max_connections":
135 - p.getDBMetrics(db).maxConnections = parseInt(value)
135 + c.getDBMetrics(db).maxConnections = parseInt(value)
136 case "current_connections":
137 - p.getDBMetrics(db).currentConnections = parseInt(value)
137 + c.getDBMetrics(db).currentConnections = parseInt(value)
138 case "paused":
139 - p.getDBMetrics(db).paused = parseInt(value)
139 + c.getDBMetrics(db).paused = parseInt(value)
140 case "disabled":
141 - p.getDBMetrics(db).disabled = parseInt(value)
141 + c.getDBMetrics(db).disabled = parseInt(value)
142 }
143 })
144 }
145
146 -func (p *PgBouncer) collectStats() error {
146 +func (c *Collector) collectStats() error {
147 q := queryShowStats
148 - p.Debugf("executing query: %v", q)
148 + c.Debugf("executing query: %v", q)
149
150 var db string
151 - return p.collectQuery(q, func(column, value string) {
151 + return c.collectQuery(q, func(column, value string) {
152 switch column {
153 case "database":
154 db = value
155 - p.getDBMetrics(db).updated = true
155 + c.getDBMetrics(db).updated = true
156 case "total_xact_count":
157 - p.getDBMetrics(db).totalXactCount = parseInt(value)
157 + c.getDBMetrics(db).totalXactCount = parseInt(value)
158 case "total_query_count":
159 - p.getDBMetrics(db).totalQueryCount = parseInt(value)
159 + c.getDBMetrics(db).totalQueryCount = parseInt(value)
160 case "total_received":
161 - p.getDBMetrics(db).totalReceived = parseInt(value)
161 + c.getDBMetrics(db).totalReceived = parseInt(value)
162 case "total_sent":
163 - p.getDBMetrics(db).totalSent = parseInt(value)
163 + c.getDBMetrics(db).totalSent = parseInt(value)
164 case "total_xact_time":
165 - p.getDBMetrics(db).totalXactTime = parseInt(value)
165 + c.getDBMetrics(db).totalXactTime = parseInt(value)
166 case "total_query_time":
167 - p.getDBMetrics(db).totalQueryTime = parseInt(value)
167 + c.getDBMetrics(db).totalQueryTime = parseInt(value)
168 case "total_wait_time":
169 - p.getDBMetrics(db).totalWaitTime = parseInt(value)
169 + c.getDBMetrics(db).totalWaitTime = parseInt(value)
170 case "avg_xact_time":
171 - p.getDBMetrics(db).avgXactTime = parseInt(value)
171 + c.getDBMetrics(db).avgXactTime = parseInt(value)
172 case "avg_query_time":
173 - p.getDBMetrics(db).avgQueryTime = parseInt(value)
173 + c.getDBMetrics(db).avgQueryTime = parseInt(value)
174 }
175 })
176 }
177
178 -func (p *PgBouncer) collectPools() error {
178 +func (c *Collector) collectPools() error {
179 q := queryShowPools
180 - p.Debugf("executing query: %v", q)
180 + c.Debugf("executing query: %v", q)
181
182 // an entry is made for each couple of (database, user).
183 var db string
184 - return p.collectQuery(q, func(column, value string) {
184 + return c.collectQuery(q, func(column, value string) {
185 switch column {
186 case "database":
187 db = value
188 - p.getDBMetrics(db).updated = true
188 + c.getDBMetrics(db).updated = true
189 case "cl_active":
190 - p.getDBMetrics(db).clActive += parseInt(value)
190 + c.getDBMetrics(db).clActive += parseInt(value)
191 case "cl_waiting":
192 - p.getDBMetrics(db).clWaiting += parseInt(value)
192 + c.getDBMetrics(db).clWaiting += parseInt(value)
193 case "cl_cancel_req":
194 - p.getDBMetrics(db).clCancelReq += parseInt(value)
194 + c.getDBMetrics(db).clCancelReq += parseInt(value)
195 case "sv_active":
196 - p.getDBMetrics(db).svActive += parseInt(value)
196 + c.getDBMetrics(db).svActive += parseInt(value)
197 case "sv_idle":
198 - p.getDBMetrics(db).svIdle += parseInt(value)
198 + c.getDBMetrics(db).svIdle += parseInt(value)
199 case "sv_used":
200 - p.getDBMetrics(db).svUsed += parseInt(value)
200 + c.getDBMetrics(db).svUsed += parseInt(value)
201 case "sv_tested":
202 - p.getDBMetrics(db).svTested += parseInt(value)
202 + c.getDBMetrics(db).svTested += parseInt(value)
203 case "sv_login":
204 - p.getDBMetrics(db).svLogin += parseInt(value)
204 + c.getDBMetrics(db).svLogin += parseInt(value)
205 case "maxwait":
206 - p.getDBMetrics(db).maxWait += parseInt(value)
206 + c.getDBMetrics(db).maxWait += parseInt(value)
207 case "maxwait_us":
208 - p.getDBMetrics(db).maxWaitUS += parseInt(value)
208 + c.getDBMetrics(db).maxWaitUS += parseInt(value)
209 }
210 })
211 }
212
213 -func (p *PgBouncer) queryMaxClientConn() (int64, error) {
213 +func (c *Collector) queryMaxClientConn() (int64, error) {
214 q := queryShowConfig
215 - p.Debugf("executing query: %v", q)
215 + c.Debugf("executing query: %v", q)
216
217 var v int64
218 var key string
219 - err := p.collectQuery(q, func(column, value string) {
219 + err := c.collectQuery(q, func(column, value string) {
220 switch column {
221 case "key":
222 key = value
@@ -231,14 +231,14 @@ func (p *PgBouncer) queryMaxClientConn() (int64, error) {
231
232 var reVersion = regexp.MustCompile(`\d+\.\d+\.\d+`)
233
234 -func (p *PgBouncer) queryVersion() (*semver.Version, error) {
234 +func (c *Collector) queryVersion() (*semver.Version, error) {
235 q := queryShowVersion
236 - p.Debugf("executing query: %v", q)
236 + c.Debugf("executing query: %v", q)
237
238 var resp string
239 - ctx, cancel := context.WithTimeout(context.Background(), p.Timeout.Duration())
239 + ctx, cancel := context.WithTimeout(context.Background(), c.Timeout.Duration())
240 defer cancel()
241 - if err := p.db.QueryRowContext(ctx, q).Scan(&resp); err != nil {
241 + if err := c.db.QueryRowContext(ctx, q).Scan(&resp); err != nil {
242 return nil, err
243 }
244
@@ -259,8 +259,8 @@ func (p *PgBouncer) queryVersion() (*semver.Version, error) {
259 return v, nil
260 }
261
262 -func (p *PgBouncer) openConnection() error {
263 - cfg, err := pgx.ParseConfig(p.DSN)
262 +func (c *Collector) openConnection() error {
263 + cfg, err := pgx.ParseConfig(c.DSN)
264 if err != nil {
265 return err
266 }
@@ -268,22 +268,22 @@ func (p *PgBouncer) openConnection() error {
268
269 db, err := sql.Open("pgx", stdlib.RegisterConnConfig(cfg))
270 if err != nil {
271 - return fmt.Errorf("error on opening a connection with the PgBouncer database [%s]: %v", p.DSN, err)
271 + return fmt.Errorf("error on opening a connection with the PgBouncer database [%s]: %v", c.DSN, err)
272 }
273
274 db.SetMaxOpenConns(1)
275 db.SetMaxIdleConns(1)
276 db.SetConnMaxLifetime(10 * time.Minute)
277
278 - p.db = db
278 + c.db = db
279
280 return nil
281 }
282
283 -func (p *PgBouncer) collectQuery(query string, assign func(column, value string)) error {
284 - ctx, cancel := context.WithTimeout(context.Background(), p.Timeout.Duration())
283 +func (c *Collector) collectQuery(query string, assign func(column, value string)) error {
284 + ctx, cancel := context.WithTimeout(context.Background(), c.Timeout.Duration())
285 defer cancel()
286 - rows, err := p.db.QueryContext(ctx, query)
286 + rows, err := c.db.QueryContext(ctx, query)
287 if err != nil {
288 return err
289 }
@@ -306,18 +306,18 @@ func (p *PgBouncer) collectQuery(query string, assign func(column, value string)
306 return rows.Err()
307 }
308
309 -func (p *PgBouncer) getDBMetrics(dbname string) *dbMetrics {
310 - db, ok := p.metrics.dbs[dbname]
309 +func (c *Collector) getDBMetrics(dbname string) *dbMetrics {
310 + db, ok := c.metrics.dbs[dbname]
311 if !ok {
312 db = &dbMetrics{name: dbname}
313 - p.metrics.dbs[dbname] = db
313 + c.metrics.dbs[dbname] = db
314 }
315 return db
316 }
317
318 -func (p *PgBouncer) resetMetrics() {
319 - for name, db := range p.metrics.dbs {
320 - p.metrics.dbs[name] = &dbMetrics{
318 +func (c *Collector) resetMetrics() {
319 + for name, db := range c.metrics.dbs {
320 + c.metrics.dbs[name] = &dbMetrics{
321 name: db.name,
322 pgDBName: db.pgDBName,
323 hasCharts: db.hasCharts,
src/go/plugin/go.d/collector/pgbouncer/collector.go renamed
+19 -19
@@ -27,8 +27,8 @@ func init() {
27 })
28 }
29
30 -func New() *PgBouncer {
31 - return &PgBouncer{
30 +func New() *Collector {
31 + return &Collector{
32 Config: Config{
33 Timeout: confopt.Duration(time.Second),
34 DSN: "postgres://postgres:postgres@127.0.0.1:6432/pgbouncer",
@@ -47,7 +47,7 @@ type Config struct {
47 Timeout confopt.Duration `yaml:"timeout,omitempty" json:"timeout"`
48 }
49
50 -type PgBouncer struct {
50 +type Collector struct {
51 module.Base
52 Config `yaml:",inline" json:""`
53
@@ -63,12 +63,12 @@ type PgBouncer struct {
63 metrics *metrics
64 }
65
66 -func (p *PgBouncer) Configuration() any {
67 - return p.Config
66 +func (c *Collector) Configuration() any {
67 + return c.Config
68 }
69
70 -func (p *PgBouncer) Init() error {
71 - err := p.validateConfig()
70 +func (c *Collector) Init() error {
71 + err := c.validateConfig()
72 if err != nil {
73 return fmt.Errorf("config validation: %v", err)
74 }
@@ -76,8 +76,8 @@ func (p *PgBouncer) Init() error {
76 return nil
77 }
78
79 -func (p *PgBouncer) Check() error {
80 - mx, err := p.collect()
79 +func (c *Collector) Check() error {
80 + mx, err := c.collect()
81 if err != nil {
82 return err
83 }
@@ -87,14 +87,14 @@ func (p *PgBouncer) Check() error {
87 return nil
88 }
89
90 -func (p *PgBouncer) Charts() *module.Charts {
91 - return p.charts
90 +func (c *Collector) Charts() *module.Charts {
91 + return c.charts
92 }
93
94 -func (p *PgBouncer) Collect() map[string]int64 {
95 - mx, err := p.collect()
94 +func (c *Collector) Collect() map[string]int64 {
95 + mx, err := c.collect()
96 if err != nil {
97 - p.Error(err)
97 + c.Error(err)
98 }
99
100 if len(mx) == 0 {
@@ -103,12 +103,12 @@ func (p *PgBouncer) Collect() map[string]int64 {
103 return mx
104 }
105
106 -func (p *PgBouncer) Cleanup() {
107 - if p.db == nil {
106 +func (c *Collector) Cleanup() {
107 + if c.db == nil {
108 return
109 }
110 - if err := p.db.Close(); err != nil {
111 - p.Warningf("cleanup: error on closing the PgBouncer database [%s]: %v", p.DSN, err)
110 + if err := c.db.Close(); err != nil {
111 + c.Warningf("cleanup: error on closing the PgBouncer database [%s]: %v", c.DSN, err)
112 }
113 - p.db = nil
113 + c.db = nil
114 }
src/go/plugin/go.d/collector/pgbouncer/collector_test.go renamed
+29 -29
@@ -46,11 +46,11 @@ func Test_testDataIsValid(t *testing.T) {
46 }
47 }
48
49 -func TestPgBouncer_ConfigurationSerialize(t *testing.T) {
50 - module.TestConfigurationSerialize(t, &PgBouncer{}, dataConfigJSON, dataConfigYAML)
49 +func TestCollector_ConfigurationSerialize(t *testing.T) {
50 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
51 }
52
53 -func TestPgBouncer_Init(t *testing.T) {
53 +func TestCollector_Init(t *testing.T) {
54 tests := map[string]struct {
55 wantFail bool
56 config Config
@@ -67,23 +67,23 @@ func TestPgBouncer_Init(t *testing.T) {
67
68 for name, test := range tests {
69 t.Run(name, func(t *testing.T) {
70 - p := New()
71 - p.Config = test.config
70 + collr := New()
71 + collr.Config = test.config
72
73 if test.wantFail {
74 - assert.Error(t, p.Init())
74 + assert.Error(t, collr.Init())
75 } else {
76 - assert.NoError(t, p.Init())
76 + assert.NoError(t, collr.Init())
77 }
78 })
79 }
80 }
81
82 -func TestPgBouncer_Charts(t *testing.T) {
82 +func TestCollector_Charts(t *testing.T) {
83 assert.NotNil(t, New().Charts())
84 }
85
86 -func TestPgBouncer_Check(t *testing.T) {
86 +func TestCollector_Check(t *testing.T) {
87 tests := map[string]struct {
88 prepareMock func(t *testing.T, m sqlmock.Sqlmock)
89 wantFail bool
@@ -125,28 +125,28 @@ func TestPgBouncer_Check(t *testing.T) {
125 sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual),
126 )
127 require.NoError(t, err)
128 - p := New()
129 - p.db = db
128 + collr := New()
129 + collr.db = db
130 defer func() { _ = db.Close() }()
131
132 - require.NoError(t, p.Init())
132 + require.NoError(t, collr.Init())
133
134 test.prepareMock(t, mock)
135
136 if test.wantFail {
137 - assert.Error(t, p.Check())
137 + assert.Error(t, collr.Check())
138 } else {
139 - assert.NoError(t, p.Check())
139 + assert.NoError(t, collr.Check())
140 }
141 assert.NoError(t, mock.ExpectationsWereMet())
142 })
143 }
144 }
145
146 -func TestPgBouncer_Collect(t *testing.T) {
146 +func TestCollector_Collect(t *testing.T) {
147 type testCaseStep struct {
148 - prepareMock func(t *testing.T, m sqlmock.Sqlmock)
149 - check func(t *testing.T, p *PgBouncer)
148 + prepareMock func(*testing.T, sqlmock.Sqlmock)
149 + check func(*testing.T, *Collector)
150 }
151 tests := map[string][]testCaseStep{
152 "Success on all queries (v1.17.0)": {
@@ -158,8 +158,8 @@ func TestPgBouncer_Collect(t *testing.T) {
158 mockExpect(t, m, queryShowStats, dataVer1170Stats)
159 mockExpect(t, m, queryShowPools, dataVer1170Pools)
160 },
161 - check: func(t *testing.T, p *PgBouncer) {
162 - mx := p.Collect()
161 + check: func(t *testing.T, collr *Collector) {
162 + mx := collr.Collect()
163
164 expected := map[string]int64{
165 "cl_conns_utilization": 47,
@@ -250,8 +250,8 @@ func TestPgBouncer_Collect(t *testing.T) {
250 prepareMock: func(t *testing.T, m sqlmock.Sqlmock) {
251 mockExpectErr(m, queryShowVersion)
252 },
253 - check: func(t *testing.T, p *PgBouncer) {
254 - mx := p.Collect()
253 + check: func(t *testing.T, collr *Collector) {
254 + mx := collr.Collect()
255 var expected map[string]int64
256 assert.Equal(t, expected, mx)
257 },
@@ -262,8 +262,8 @@ func TestPgBouncer_Collect(t *testing.T) {
262 prepareMock: func(t *testing.T, m sqlmock.Sqlmock) {
263 mockExpect(t, m, queryShowVersion, dataVer170Version)
264 },
265 - check: func(t *testing.T, p *PgBouncer) {
266 - mx := p.Collect()
265 + check: func(t *testing.T, collr *Collector) {
266 + mx := collr.Collect()
267 var expected map[string]int64
268 assert.Equal(t, expected, mx)
269 },
@@ -275,8 +275,8 @@ func TestPgBouncer_Collect(t *testing.T) {
275 mockExpect(t, m, queryShowVersion, dataVer1170Version)
276 mockExpectErr(m, queryShowConfig)
277 },
278 - check: func(t *testing.T, p *PgBouncer) {
279 - mx := p.Collect()
278 + check: func(t *testing.T, collr *Collector) {
279 + mx := collr.Collect()
280 var expected map[string]int64
281 assert.Equal(t, expected, mx)
282 },
@@ -290,16 +290,16 @@ func TestPgBouncer_Collect(t *testing.T) {
290 sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual),
291 )
292 require.NoError(t, err)
293 - p := New()
294 - p.db = db
293 + collr := New()
294 + collr.db = db
295 defer func() { _ = db.Close() }()
296
297 - require.NoError(t, p.Init())
297 + require.NoError(t, collr.Init())
298
299 for i, step := range test {
300 t.Run(fmt.Sprintf("step[%d]", i), func(t *testing.T) {
301 step.prepareMock(t, mock)
302 - step.check(t, p)
302 + step.check(t, collr)
303 })
304 }
305 assert.NoError(t, mock.ExpectationsWereMet())
src/go/plugin/go.d/collector/pgbouncer/init.go
+2 -2
@@ -4,8 +4,8 @@ package pgbouncer
4
5 import "errors"
6
7 -func (p *PgBouncer) validateConfig() error {
8 - if p.DSN == "" {
7 +func (c *Collector) validateConfig() error {
8 + if c.DSN == "" {
9 return errors.New("DSN not set")
10 }
11 return nil
src/go/plugin/go.d/collector/phpdaemon/collect.go
+6 -6
@@ -34,15 +34,15 @@ type fullStatus struct {
34 Uptime *int64 `json:"uptime" stm:"uptime"`
35 }
36
37 -func (p *PHPDaemon) collect() (map[string]int64, error) {
38 - req, err := web.NewHTTPRequest(p.RequestConfig)
37 +func (c *Collector) collect() (map[string]int64, error) {
38 + req, err := web.NewHTTPRequest(c.RequestConfig)
39 if err != nil {
40 - return nil, fmt.Errorf("failed to create HTTP request to '%s': %w", p.URL, err)
40 + return nil, fmt.Errorf("failed to create HTTP request to '%s': %w", c.URL, err)
41 }
42
43 var st fullStatus
44
45 - if err := web.DoHTTP(p.httpClient).RequestJSON(req, &st); err != nil {
45 + if err := web.DoHTTP(c.httpClient).RequestJSON(req, &st); err != nil {
46 return nil, err
47 }
48
@@ -52,9 +52,9 @@ func (p *PHPDaemon) collect() (map[string]int64, error) {
52
53 mx := stm.ToMap(st)
54
55 - p.once.Do(func() {
55 + c.once.Do(func() {
56 if _, ok := mx["uptime"]; ok {
57 - _ = p.charts.Add(uptimeChart.Copy())
57 + _ = c.charts.Add(uptimeChart.Copy())
58 }
59 })
60
src/go/plugin/go.d/collector/phpdaemon/collector.go renamed
+21 -21
@@ -26,8 +26,8 @@ func init() {
26 })
27 }
28
29 -func New() *PHPDaemon {
30 - return &PHPDaemon{
29 +func New() *Collector {
30 + return &Collector{
31 Config: Config{
32 HTTPConfig: web.HTTPConfig{
33 RequestConfig: web.RequestConfig{
@@ -47,7 +47,7 @@ type Config struct {
47 web.HTTPConfig `yaml:",inline" json:""`
48 }
49
50 -type PHPDaemon struct {
50 +type Collector struct {
51 module.Base
52 Config `yaml:",inline" json:""`
53
@@ -57,29 +57,29 @@ type PHPDaemon struct {
57 httpClient *http.Client
58 }
59
60 -func (p *PHPDaemon) Configuration() any {
61 - return p.Config
60 +func (c *Collector) Configuration() any {
61 + return c.Config
62 }
63
64 -func (p *PHPDaemon) Init() error {
65 - if p.URL == "" {
64 +func (c *Collector) Init() error {
65 + if c.URL == "" {
66 return errors.New("phpDaemon URL is required but not set")
67 }
68
69 - httpClient, err := web.NewHTTPClient(p.ClientConfig)
69 + httpClient, err := web.NewHTTPClient(c.ClientConfig)
70 if err != nil {
71 return fmt.Errorf("failed to initialize http client: %w", err)
72 }
73 - p.httpClient = httpClient
73 + c.httpClient = httpClient
74
75 - p.Debugf("using URL %s", p.URL)
76 - p.Debugf("using timeout: %s", p.Timeout)
75 + c.Debugf("using URL %s", c.URL)
76 + c.Debugf("using timeout: %s", c.Timeout)
77
78 return nil
79 }
80
81 -func (p *PHPDaemon) Check() error {
82 - mx, err := p.collect()
81 +func (c *Collector) Check() error {
82 + mx, err := c.collect()
83 if err != nil {
84 return err
85 }
@@ -91,22 +91,22 @@ func (p *PHPDaemon) Check() error {
91 return nil
92 }
93
94 -func (p *PHPDaemon) Charts() *Charts {
95 - return p.charts
94 +func (c *Collector) Charts() *Charts {
95 + return c.charts
96 }
97
98 -func (p *PHPDaemon) Collect() map[string]int64 {
99 - mx, err := p.collect()
98 +func (c *Collector) Collect() map[string]int64 {
99 + mx, err := c.collect()
100 if err != nil {
101 - p.Error(err)
101 + c.Error(err)
102 return nil
103 }
104
105 return mx
106 }
107
108 -func (p *PHPDaemon) Cleanup() {
109 - if p.httpClient != nil {
110 - p.httpClient.CloseIdleConnections()
108 +func (c *Collector) Cleanup() {
109 + if c.httpClient != nil {
110 + c.httpClient.CloseIdleConnections()
111 }
112 }
src/go/plugin/go.d/collector/phpdaemon/collector_test.go renamed
+40 -40
@@ -31,17 +31,17 @@ func Test_testDataIsValid(t *testing.T) {
31 }
32 }
33
34 -func TestPHPDaemon_ConfigurationSerialize(t *testing.T) {
35 - module.TestConfigurationSerialize(t, &PHPDaemon{}, dataConfigJSON, dataConfigYAML)
34 +func TestCollector_ConfigurationSerialize(t *testing.T) {
35 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
36 }
37
38 -func TestPHPDaemon_Init(t *testing.T) {
39 - job := New()
38 +func TestCollector_Init(t *testing.T) {
39 + collr := New()
40
41 - require.NoError(t, job.Init())
41 + require.NoError(t, collr.Init())
42 }
43
44 -func TestPHPDaemon_Check(t *testing.T) {
44 +func TestCollector_Check(t *testing.T) {
45 ts := httptest.NewServer(
46 http.HandlerFunc(
47 func(w http.ResponseWriter, r *http.Request) {
@@ -49,24 +49,24 @@ func TestPHPDaemon_Check(t *testing.T) {
49 }))
50 defer ts.Close()
51
52 - job := New()
53 - job.URL = ts.URL
54 - require.NoError(t, job.Init())
55 - assert.NoError(t, job.Check())
52 + collr := New()
53 + collr.URL = ts.URL
54 + require.NoError(t, collr.Init())
55 + assert.NoError(t, collr.Check())
56 }
57
58 -func TestPHPDaemon_CheckNG(t *testing.T) {
59 - job := New()
60 - job.URL = "http://127.0.0.1:38001"
61 - require.NoError(t, job.Init())
62 - assert.Error(t, job.Check())
58 +func TestCollector_CheckNG(t *testing.T) {
59 + collr := New()
60 + collr.URL = "http://127.0.0.1:38001"
61 + require.NoError(t, collr.Init())
62 + assert.Error(t, collr.Check())
63 }
64
65 -func TestPHPDaemon_Charts(t *testing.T) {
66 - job := New()
65 +func TestCollector_Charts(t *testing.T) {
66 + collr := New()
67
68 - assert.NotNil(t, job.Charts())
69 - assert.False(t, job.charts.Has(uptimeChart.ID))
68 + assert.NotNil(t, collr.Charts())
69 + assert.False(t, collr.charts.Has(uptimeChart.ID))
70
71 ts := httptest.NewServer(
72 http.HandlerFunc(
@@ -75,17 +75,17 @@ func TestPHPDaemon_Charts(t *testing.T) {
75 }))
76 defer ts.Close()
77
78 - job.URL = ts.URL
79 - require.NoError(t, job.Init())
80 - assert.NoError(t, job.Check())
81 - assert.True(t, job.charts.Has(uptimeChart.ID))
78 + collr.URL = ts.URL
79 + require.NoError(t, collr.Init())
80 + assert.NoError(t, collr.Check())
81 + assert.True(t, collr.charts.Has(uptimeChart.ID))
82 }
83
84 -func TestPHPDaemon_Cleanup(t *testing.T) {
84 +func TestCollector_Cleanup(t *testing.T) {
85 assert.NotPanics(t, New().Cleanup)
86 }
87
88 -func TestPHPDaemon_Collect(t *testing.T) {
88 +func TestCollector_Collect(t *testing.T) {
89 ts := httptest.NewServer(
90 http.HandlerFunc(
91 func(w http.ResponseWriter, r *http.Request) {
@@ -93,10 +93,10 @@ func TestPHPDaemon_Collect(t *testing.T) {
93 }))
94 defer ts.Close()
95
96 - job := New()
97 - job.URL = ts.URL
98 - require.NoError(t, job.Init())
99 - assert.NoError(t, job.Check())
96 + collr := New()
97 + collr.URL = ts.URL
98 + require.NoError(t, collr.Init())
99 + assert.NoError(t, collr.Check())
100
101 expected := map[string]int64{
102 "alive": 350,
@@ -110,11 +110,11 @@ func TestPHPDaemon_Collect(t *testing.T) {
110 "uptime": 15765,
111 }
112
113 - assert.Equal(t, expected, job.Collect())
113 + assert.Equal(t, expected, collr.Collect())
114
115 }
116
117 -func TestPHPDaemon_InvalidData(t *testing.T) {
117 +func TestCollector_InvalidData(t *testing.T) {
118 ts := httptest.NewServer(
119 http.HandlerFunc(
120 func(w http.ResponseWriter, r *http.Request) {
@@ -122,13 +122,13 @@ func TestPHPDaemon_InvalidData(t *testing.T) {
122 }))
123 defer ts.Close()
124
125 - job := New()
126 - job.URL = ts.URL
127 - require.NoError(t, job.Init())
128 - assert.Error(t, job.Check())
125 + collr := New()
126 + collr.URL = ts.URL
127 + require.NoError(t, collr.Init())
128 + assert.Error(t, collr.Check())
129 }
130
131 -func TestPHPDaemon_404(t *testing.T) {
131 +func TestCollector_404(t *testing.T) {
132 ts := httptest.NewServer(
133 http.HandlerFunc(
134 func(w http.ResponseWriter, r *http.Request) {
@@ -136,8 +136,8 @@ func TestPHPDaemon_404(t *testing.T) {
136 }))
137 defer ts.Close()
138
139 - job := New()
140 - job.URL = ts.URL
141 - require.NoError(t, job.Init())
142 - assert.Error(t, job.Check())
139 + collr := New()
140 + collr.URL = ts.URL
141 + require.NoError(t, collr.Init())
142 + assert.Error(t, collr.Check())
143 }
src/go/plugin/go.d/collector/phpfpm/collect.go
+2 -2
@@ -8,8 +8,8 @@ import (
8 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/stm"
9 )
10
11 -func (p *Phpfpm) collect() (map[string]int64, error) {
12 - st, err := p.client.getStatus()
11 +func (c *Collector) collect() (map[string]int64, error) {
12 + st, err := c.client.getStatus()
13 if err != nil {
14 return nil, err
15 }
src/go/plugin/go.d/collector/phpfpm/collector.go renamed
+15 -15
@@ -24,8 +24,8 @@ func init() {
24 })
25 }
26
27 -func New() *Phpfpm {
28 - return &Phpfpm{
27 +func New() *Collector {
28 + return &Collector{
29 Config: Config{
30 HTTPConfig: web.HTTPConfig{
31 RequestConfig: web.RequestConfig{
@@ -48,29 +48,29 @@ type Config struct {
48 FcgiPath string `yaml:"fcgi_path,omitempty" json:"fcgi_path"`
49 }
50
51 -type Phpfpm struct {
51 +type Collector struct {
52 module.Base
53 Config `yaml:",inline" json:""`
54
55 client client
56 }
57
58 -func (p *Phpfpm) Configuration() any {
59 - return p.Config
58 +func (c *Collector) Configuration() any {
59 + return c.Config
60 }
61
62 -func (p *Phpfpm) Init() error {
63 - c, err := p.initClient()
62 +func (c *Collector) Init() error {
63 + cli, err := c.initClient()
64 if err != nil {
65 return fmt.Errorf("init client: %v", err)
66 }
67 - p.client = c
67 + c.client = cli
68
69 return nil
70 }
71
72 -func (p *Phpfpm) Check() error {
73 - mx, err := p.collect()
72 +func (c *Collector) Check() error {
73 + mx, err := c.collect()
74 if err != nil {
75 return err
76 }
@@ -80,14 +80,14 @@ func (p *Phpfpm) Check() error {
80 return nil
81 }
82
83 -func (p *Phpfpm) Charts() *Charts {
83 +func (c *Collector) Charts() *Charts {
84 return charts.Copy()
85 }
86
87 -func (p *Phpfpm) Collect() map[string]int64 {
88 - mx, err := p.collect()
87 +func (c *Collector) Collect() map[string]int64 {
88 + mx, err := c.collect()
89 if err != nil {
90 - p.Error(err)
90 + c.Error(err)
91 }
92
93 if len(mx) == 0 {
@@ -96,4 +96,4 @@ func (p *Phpfpm) Collect() map[string]int64 {
96 return mx
97 }
98
99 -func (p *Phpfpm) Cleanup() {}
99 +func (c *Collector) Cleanup() {}
src/go/plugin/go.d/collector/phpfpm/collector_test.go renamed
+60 -60
@@ -39,18 +39,18 @@ func Test_testDataIsValid(t *testing.T) {
39 }
40 }
41
42 -func TestPhpfpm_ConfigurationSerialize(t *testing.T) {
43 - module.TestConfigurationSerialize(t, &Phpfpm{}, dataConfigJSON, dataConfigYAML)
42 +func TestCollector_ConfigurationSerialize(t *testing.T) {
43 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
44 }
45
46 -func TestPhpfpm_Init(t *testing.T) {
47 - job := New()
46 +func TestCollector_Init(t *testing.T) {
47 + collr := New()
48
49 - require.NoError(t, job.Init())
50 - assert.NotNil(t, job.client)
49 + require.NoError(t, collr.Init())
50 + assert.NotNil(t, collr.client)
51 }
52
53 -func TestPhpfpm_Check(t *testing.T) {
53 +func TestCollector_Check(t *testing.T) {
54 ts := httptest.NewServer(
55 http.HandlerFunc(
56 func(w http.ResponseWriter, r *http.Request) {
@@ -58,28 +58,28 @@ func TestPhpfpm_Check(t *testing.T) {
58 }))
59 defer ts.Close()
60
61 - job := New()
62 - job.URL = ts.URL
63 - require.NoError(t, job.Init())
61 + collr := New()
62 + collr.URL = ts.URL
63 + require.NoError(t, collr.Init())
64
65 - assert.NoError(t, job.Check())
65 + assert.NoError(t, collr.Check())
66 }
67
68 -func TestPhpfpm_CheckReturnsFalseOnFailure(t *testing.T) {
69 - job := New()
70 - job.URL = "http://127.0.0.1:38001/us"
71 - require.NoError(t, job.Init())
68 +func TestCollector_CheckReturnsFalseOnFailure(t *testing.T) {
69 + collr := New()
70 + collr.URL = "http://127.0.0.1:38001/us"
71 + require.NoError(t, collr.Init())
72
73 - assert.Error(t, job.Check())
73 + assert.Error(t, collr.Check())
74 }
75
76 -func TestPhpfpm_Charts(t *testing.T) {
77 - job := New()
76 +func TestCollector_Charts(t *testing.T) {
77 + collr := New()
78
79 - assert.NotNil(t, job.Charts())
79 + assert.NotNil(t, collr.Charts())
80 }
81
82 -func TestPhpfpm_CollectJSON(t *testing.T) {
82 +func TestCollector_CollectJSON(t *testing.T) {
83 ts := httptest.NewServer(
84 http.HandlerFunc(
85 func(w http.ResponseWriter, r *http.Request) {
@@ -87,11 +87,11 @@ func TestPhpfpm_CollectJSON(t *testing.T) {
87 }))
88 defer ts.Close()
89
90 - job := New()
91 - job.URL = ts.URL + "/?json"
92 - require.NoError(t, job.Init())
90 + collr := New()
91 + collr.URL = ts.URL + "/?json"
92 + require.NoError(t, collr.Init())
93
94 - got := job.Collect()
94 + got := collr.Collect()
95
96 want := map[string]int64{
97 "active": 1,
@@ -104,7 +104,7 @@ func TestPhpfpm_CollectJSON(t *testing.T) {
104 assert.Equal(t, want, got)
105 }
106
107 -func TestPhpfpm_CollectJSONFull(t *testing.T) {
107 +func TestCollector_CollectJSONFull(t *testing.T) {
108 ts := httptest.NewServer(
109 http.HandlerFunc(
110 func(w http.ResponseWriter, r *http.Request) {
@@ -112,11 +112,11 @@ func TestPhpfpm_CollectJSONFull(t *testing.T) {
112 }))
113 defer ts.Close()
114
115 - job := New()
116 - job.URL = ts.URL + "/?json"
117 - require.NoError(t, job.Init())
115 + collr := New()
116 + collr.URL = ts.URL + "/?json"
117 + require.NoError(t, collr.Init())
118
119 - got := job.Collect()
119 + got := collr.Collect()
120
121 want := map[string]int64{
122 "active": 1,
@@ -138,7 +138,7 @@ func TestPhpfpm_CollectJSONFull(t *testing.T) {
138 assert.Equal(t, want, got)
139 }
140
141 -func TestPhpfpm_CollectNoIdleProcessesJSONFull(t *testing.T) {
141 +func TestCollector_CollectNoIdleProcessesJSONFull(t *testing.T) {
142 ts := httptest.NewServer(
143 http.HandlerFunc(
144 func(w http.ResponseWriter, r *http.Request) {
@@ -146,11 +146,11 @@ func TestPhpfpm_CollectNoIdleProcessesJSONFull(t *testing.T) {
146 }))
147 defer ts.Close()
148
149 - job := New()
150 - job.URL = ts.URL + "/?json"
151 - require.NoError(t, job.Init())
149 + collr := New()
150 + collr.URL = ts.URL + "/?json"
151 + require.NoError(t, collr.Init())
152
153 - got := job.Collect()
153 + got := collr.Collect()
154
155 want := map[string]int64{
156 "active": 1,
@@ -163,7 +163,7 @@ func TestPhpfpm_CollectNoIdleProcessesJSONFull(t *testing.T) {
163 assert.Equal(t, want, got)
164 }
165
166 -func TestPhpfpm_CollectText(t *testing.T) {
166 +func TestCollector_CollectText(t *testing.T) {
167 ts := httptest.NewServer(
168 http.HandlerFunc(
169 func(w http.ResponseWriter, r *http.Request) {
@@ -171,11 +171,11 @@ func TestPhpfpm_CollectText(t *testing.T) {
171 }))
172 defer ts.Close()
173
174 - job := New()
175 - job.URL = ts.URL
176 - require.NoError(t, job.Init())
174 + collr := New()
175 + collr.URL = ts.URL
176 + require.NoError(t, collr.Init())
177
178 - got := job.Collect()
178 + got := collr.Collect()
179
180 want := map[string]int64{
181 "active": 1,
@@ -188,7 +188,7 @@ func TestPhpfpm_CollectText(t *testing.T) {
188 assert.Equal(t, want, got)
189 }
190
191 -func TestPhpfpm_CollectTextFull(t *testing.T) {
191 +func TestCollector_CollectTextFull(t *testing.T) {
192 ts := httptest.NewServer(
193 http.HandlerFunc(
194 func(w http.ResponseWriter, r *http.Request) {
@@ -196,11 +196,11 @@ func TestPhpfpm_CollectTextFull(t *testing.T) {
196 }))
197 defer ts.Close()
198
199 - job := New()
200 - job.URL = ts.URL
201 - require.NoError(t, job.Init())
199 + collr := New()
200 + collr.URL = ts.URL
201 + require.NoError(t, collr.Init())
202
203 - got := job.Collect()
203 + got := collr.Collect()
204
205 want := map[string]int64{
206 "active": 1,
@@ -222,7 +222,7 @@ func TestPhpfpm_CollectTextFull(t *testing.T) {
222 assert.Equal(t, want, got)
223 }
224
225 -func TestPhpfpm_CollectReturnsNothingWhenInvalidData(t *testing.T) {
225 +func TestCollector_CollectReturnsNothingWhenInvalidData(t *testing.T) {
226 ts := httptest.NewServer(
227 http.HandlerFunc(
228 func(w http.ResponseWriter, r *http.Request) {
@@ -230,14 +230,14 @@ func TestPhpfpm_CollectReturnsNothingWhenInvalidData(t *testing.T) {
230 }))
231 defer ts.Close()
232
233 - job := New()
234 - job.URL = ts.URL
235 - require.NoError(t, job.Init())
233 + collr := New()
234 + collr.URL = ts.URL
235 + require.NoError(t, collr.Init())
236
237 - assert.Len(t, job.Collect(), 0)
237 + assert.Len(t, collr.Collect(), 0)
238 }
239
240 -func TestPhpfpm_CollectReturnsNothingWhenEmptyData(t *testing.T) {
240 +func TestCollector_CollectReturnsNothingWhenEmptyData(t *testing.T) {
241 ts := httptest.NewServer(
242 http.HandlerFunc(
243 func(w http.ResponseWriter, r *http.Request) {
@@ -245,14 +245,14 @@ func TestPhpfpm_CollectReturnsNothingWhenEmptyData(t *testing.T) {
245 }))
246 defer ts.Close()
247
248 - job := New()
249 - job.URL = ts.URL
250 - require.NoError(t, job.Init())
248 + collr := New()
249 + collr.URL = ts.URL
250 + require.NoError(t, collr.Init())
251
252 - assert.Len(t, job.Collect(), 0)
252 + assert.Len(t, collr.Collect(), 0)
253 }
254
255 -func TestPhpfpm_CollectReturnsNothingWhenBadStatusCode(t *testing.T) {
255 +func TestCollector_CollectReturnsNothingWhenBadStatusCode(t *testing.T) {
256 ts := httptest.NewServer(
257 http.HandlerFunc(
258 func(w http.ResponseWriter, r *http.Request) {
@@ -260,13 +260,13 @@ func TestPhpfpm_CollectReturnsNothingWhenBadStatusCode(t *testing.T) {
260 }))
261 defer ts.Close()
262
263 - job := New()
264 - job.URL = ts.URL
265 - require.NoError(t, job.Init())
263 + collr := New()
264 + collr.URL = ts.URL
265 + require.NoError(t, collr.Init())
266
267 - assert.Len(t, job.Collect(), 0)
267 + assert.Len(t, collr.Collect(), 0)
268 }
269
270 -func TestPhpfpm_Cleanup(t *testing.T) {
270 +func TestCollector_Cleanup(t *testing.T) {
271 New().Cleanup()
272 }
src/go/plugin/go.d/collector/phpfpm/init.go
+19 -19
@@ -10,43 +10,43 @@ import (
10 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/web"
11 )
12
13 -func (p *Phpfpm) initClient() (client, error) {
14 - if p.Socket != "" {
15 - return p.initSocketClient()
13 +func (c *Collector) initClient() (client, error) {
14 + if c.Socket != "" {
15 + return c.initSocketClient()
16 }
17 - if p.Address != "" {
18 - return p.initTcpClient()
17 + if c.Address != "" {
18 + return c.initTcpClient()
19 }
20 - if p.URL != "" {
21 - return p.initHTTPClient()
20 + if c.URL != "" {
21 + return c.initHTTPClient()
22 }
23
24 return nil, errors.New("neither 'socket' nor 'url' set")
25 }
26
27 -func (p *Phpfpm) initHTTPClient() (*httpClient, error) {
28 - c, err := web.NewHTTPClient(p.ClientConfig)
27 +func (c *Collector) initHTTPClient() (*httpClient, error) {
28 + cli, err := web.NewHTTPClient(c.ClientConfig)
29 if err != nil {
30 return nil, fmt.Errorf("create HTTP client: %v", err)
31 }
32
33 - p.Debugf("using HTTP client: url='%s', timeout='%s'", p.URL, p.Timeout)
33 + c.Debugf("using HTTP client: url='%s', timeout='%s'", c.URL, c.Timeout)
34
35 - return newHTTPClient(c, p.RequestConfig)
35 + return newHTTPClient(cli, c.RequestConfig)
36 }
37
38 -func (p *Phpfpm) initSocketClient() (*socketClient, error) {
39 - if _, err := os.Stat(p.Socket); err != nil {
40 - return nil, fmt.Errorf("the socket '%s' does not exist: %v", p.Socket, err)
38 +func (c *Collector) initSocketClient() (*socketClient, error) {
39 + if _, err := os.Stat(c.Socket); err != nil {
40 + return nil, fmt.Errorf("the socket '%s' does not exist: %v", c.Socket, err)
41 }
42
43 - p.Debugf("using socket client: socket='%s', timeout='%s', fcgi_path='%s'", p.Socket, p.Timeout, p.FcgiPath)
43 + c.Debugf("using socket client: socket='%s', timeout='%s', fcgi_path='%s'", c.Socket, c.Timeout, c.FcgiPath)
44
45 - return newSocketClient(p.Logger, p.Socket, p.Timeout.Duration(), p.FcgiPath), nil
45 + return newSocketClient(c.Logger, c.Socket, c.Timeout.Duration(), c.FcgiPath), nil
46 }
47
48 -func (p *Phpfpm) initTcpClient() (*tcpClient, error) {
49 - p.Debugf("using tcp client: address='%s', timeout='%s', fcgi_path='%s'", p.Address, p.Timeout, p.FcgiPath)
48 +func (c *Collector) initTcpClient() (*tcpClient, error) {
49 + c.Debugf("using tcp client: address='%s', timeout='%s', fcgi_path='%s'", c.Address, c.Timeout, c.FcgiPath)
50
51 - return newTcpClient(p.Logger, p.Address, p.Timeout.Duration(), p.FcgiPath), nil
51 + return newTcpClient(c.Logger, c.Address, c.Timeout.Duration(), c.FcgiPath), nil
52 }
src/go/plugin/go.d/collector/pihole/charts.go
+6 -6
@@ -151,16 +151,16 @@ var (
151 }
152 )
153
154 -func (p *Pihole) addChartDNSQueriesType() {
154 +func (c *Collector) addChartDNSQueriesType() {
155 chart := chartDNSQueriesTypes.Copy()
156 - if err := p.Charts().Add(chart); err != nil {
157 - p.Warning(err)
156 + if err := c.Charts().Add(chart); err != nil {
157 + c.Warning(err)
158 }
159 }
160
161 -func (p *Pihole) addChartDNSQueriesForwardedDestinations() {
161 +func (c *Collector) addChartDNSQueriesForwardedDestinations() {
162 chart := chartDNSQueriesForwardedDestination.Copy()
163 - if err := p.Charts().Add(chart); err != nil {
164 - p.Warning(err)
163 + if err := c.Charts().Add(chart); err != nil {
164 + c.Warning(err)
165 }
166 }
src/go/plugin/go.d/collector/pihole/collect.go
+39 -39
@@ -32,35 +32,35 @@ const (
32 precision = 1000
33 )
34
35 -func (p *Pihole) collect() (map[string]int64, error) {
36 - if p.checkVersion {
37 - ver, err := p.queryAPIVersion()
35 +func (c *Collector) collect() (map[string]int64, error) {
36 + if c.checkVersion {
37 + ver, err := c.queryAPIVersion()
38 if err != nil {
39 return nil, err
40 }
41 if ver != wantAPIVersion {
42 return nil, fmt.Errorf("API version: %d, supported version: %d", ver, wantAPIVersion)
43 }
44 - p.checkVersion = false
44 + c.checkVersion = false
45 }
46
47 pmx := new(piholeMetrics)
48 - p.queryMetrics(pmx, true)
48 + c.queryMetrics(pmx, true)
49
50 if pmx.hasQueryTypes() {
51 - p.addQueriesTypesOnce.Do(p.addChartDNSQueriesType)
51 + c.addQueriesTypesOnce.Do(c.addChartDNSQueriesType)
52 }
53 if pmx.hasForwarders() {
54 - p.addFwsDestinationsOnce.Do(p.addChartDNSQueriesForwardedDestinations)
54 + c.addFwsDestinationsOnce.Do(c.addChartDNSQueriesForwardedDestinations)
55 }
56
57 mx := make(map[string]int64)
58 - p.collectMetrics(mx, pmx)
58 + c.collectMetrics(mx, pmx)
59
60 return mx, nil
61 }
62
63 -func (p *Pihole) collectMetrics(mx map[string]int64, pmx *piholeMetrics) {
63 +func (c *Collector) collectMetrics(mx map[string]int64, pmx *piholeMetrics) {
64 if pmx.hasSummary() {
65 mx["ads_blocked_today"] = pmx.summary.AdsBlockedToday
66 mx["ads_percentage_today"] = int64(pmx.summary.AdsPercentageToday * 100)
@@ -100,16 +100,16 @@ func (p *Pihole) collectMetrics(mx map[string]int64, pmx *piholeMetrics) {
100 }
101 }
102
103 -func (p *Pihole) queryMetrics(pmx *piholeMetrics, doConcurrently bool) {
103 +func (c *Collector) queryMetrics(pmx *piholeMetrics, doConcurrently bool) {
104 type task func(*piholeMetrics)
105
106 - var tasks = []task{p.querySummary}
106 + var tasks = []task{c.querySummary}
107
108 - if p.Password != "" {
108 + if c.Password != "" {
109 tasks = []task{
110 - p.querySummary,
111 - p.queryQueryTypes,
112 - p.queryForwardedDestinations,
110 + c.querySummary,
111 + c.queryQueryTypes,
112 + c.queryForwardedDestinations,
113 }
114 }
115
@@ -132,84 +132,84 @@ func (p *Pihole) queryMetrics(pmx *piholeMetrics, doConcurrently bool) {
132 wg.Wait()
133 }
134
135 -func (p *Pihole) querySummary(pmx *piholeMetrics) {
136 - req, err := web.NewHTTPRequestWithPath(p.RequestConfig, urlPathAPI)
135 +func (c *Collector) querySummary(pmx *piholeMetrics) {
136 + req, err := web.NewHTTPRequestWithPath(c.RequestConfig, urlPathAPI)
137 if err != nil {
138 - p.Error(err)
138 + c.Error(err)
139 return
140 }
141
142 req.URL.RawQuery = url.Values{
143 - urlQueryKeyAuth: []string{p.Password},
143 + urlQueryKeyAuth: []string{c.Password},
144 urlQueryKeySummaryRaw: []string{"true"},
145 }.Encode()
146
147 var v summaryRawMetrics
148 - if err = p.doHTTP(req, &v); err != nil {
149 - p.Error(err)
148 + if err = c.doHTTP(req, &v); err != nil {
149 + c.Error(err)
150 return
151 }
152
153 pmx.summary = &v
154 }
155
156 -func (p *Pihole) queryQueryTypes(pmx *piholeMetrics) {
157 - req, err := web.NewHTTPRequestWithPath(p.RequestConfig, urlPathAPI)
156 +func (c *Collector) queryQueryTypes(pmx *piholeMetrics) {
157 + req, err := web.NewHTTPRequestWithPath(c.RequestConfig, urlPathAPI)
158 if err != nil {
159 - p.Error(err)
159 + c.Error(err)
160 return
161 }
162
163 req.URL.RawQuery = url.Values{
164 - urlQueryKeyAuth: []string{p.Password},
164 + urlQueryKeyAuth: []string{c.Password},
165 urlQueryKeyGetQueryTypes: []string{"true"},
166 }.Encode()
167
168 var v queryTypesMetrics
169 - err = p.doHTTP(req, &v)
169 + err = c.doHTTP(req, &v)
170 if err != nil {
171 - p.Error(err)
171 + c.Error(err)
172 return
173 }
174
175 pmx.queryTypes = &v
176 }
177
178 -func (p *Pihole) queryForwardedDestinations(pmx *piholeMetrics) {
179 - req, err := web.NewHTTPRequestWithPath(p.RequestConfig, urlPathAPI)
178 +func (c *Collector) queryForwardedDestinations(pmx *piholeMetrics) {
179 + req, err := web.NewHTTPRequestWithPath(c.RequestConfig, urlPathAPI)
180 if err != nil {
181 - p.Error(err)
181 + c.Error(err)
182 return
183 }
184
185 req.URL.RawQuery = url.Values{
186 - urlQueryKeyAuth: []string{p.Password},
186 + urlQueryKeyAuth: []string{c.Password},
187 urlQueryKeyGetForwardDestinations: []string{"true"},
188 }.Encode()
189
190 var v forwardDestinations
191 - err = p.doHTTP(req, &v)
191 + err = c.doHTTP(req, &v)
192 if err != nil {
193 - p.Error(err)
193 + c.Error(err)
194 return
195 }
196
197 pmx.forwarders = &v
198 }
199
200 -func (p *Pihole) queryAPIVersion() (int, error) {
201 - req, err := web.NewHTTPRequestWithPath(p.RequestConfig, urlPathAPI)
200 +func (c *Collector) queryAPIVersion() (int, error) {
201 + req, err := web.NewHTTPRequestWithPath(c.RequestConfig, urlPathAPI)
202 if err != nil {
203 return 0, err
204 }
205
206 req.URL.RawQuery = url.Values{
207 - urlQueryKeyAuth: []string{p.Password},
207 + urlQueryKeyAuth: []string{c.Password},
208 urlQueryKeyAPIVersion: []string{"true"},
209 }.Encode()
210
211 var v piholeAPIVersion
212 - err = p.doHTTP(req, &v)
212 + err = c.doHTTP(req, &v)
213 if err != nil {
214 return 0, err
215 }
@@ -217,8 +217,8 @@ func (p *Pihole) queryAPIVersion() (int, error) {
217 return v.Version, nil
218 }
219
220 -func (p *Pihole) doHTTP(req *http.Request, dst any) error {
221 - return web.DoHTTP(p.httpClient).Request(req, func(body io.Reader) error {
220 +func (c *Collector) doHTTP(req *http.Request, dst any) error {
221 + return web.DoHTTP(c.httpClient).Request(req, func(body io.Reader) error {
222 content, err := io.ReadAll(body)
223 if err != nil {
224 return fmt.Errorf("failed to read response: %v", err)
src/go/plugin/go.d/collector/pihole/collector.go renamed
+23 -23
@@ -29,8 +29,8 @@ func init() {
29 })
30 }
31
32 -func New() *Pihole {
33 - return &Pihole{
32 +func New() *Collector {
33 + return &Collector{
34 Config: Config{
35 HTTPConfig: web.HTTPConfig{
36 RequestConfig: web.RequestConfig{
@@ -55,7 +55,7 @@ type Config struct {
55 SetupVarsPath string `yaml:"setup_vars_path" json:"setup_vars_path"`
56 }
57
58 -type Pihole struct {
58 +type Collector struct {
59 module.Base
60 Config `yaml:",inline" json:""`
61
@@ -68,33 +68,33 @@ type Pihole struct {
68 checkVersion bool
69 }
70
71 -func (p *Pihole) Configuration() any {
72 - return p.Config
71 +func (c *Collector) Configuration() any {
72 + return c.Config
73 }
74
75 -func (p *Pihole) Init() error {
76 - if err := p.validateConfig(); err != nil {
75 +func (c *Collector) Init() error {
76 + if err := c.validateConfig(); err != nil {
77 return fmt.Errorf("config validation: %v", err)
78 }
79
80 - httpClient, err := p.initHTTPClient()
80 + httpClient, err := c.initHTTPClient()
81 if err != nil {
82 return fmt.Errorf("init http client: %v", err)
83 }
84 - p.httpClient = httpClient
84 + c.httpClient = httpClient
85
86 - p.Password = p.getWebPassword()
87 - if p.Password == "" {
88 - p.Warning("no web password, not all metrics available")
86 + c.Password = c.getWebPassword()
87 + if c.Password == "" {
88 + c.Warning("no web password, not all metrics available")
89 } else {
90 - p.Debugf("web password: %s", p.Password)
90 + c.Debugf("web password: %s", c.Password)
91 }
92
93 return nil
94 }
95
96 -func (p *Pihole) Check() error {
97 - mx, err := p.collect()
96 +func (c *Collector) Check() error {
97 + mx, err := c.collect()
98 if err != nil {
99 return err
100 }
@@ -104,14 +104,14 @@ func (p *Pihole) Check() error {
104 return nil
105 }
106
107 -func (p *Pihole) Charts() *module.Charts {
108 - return p.charts
107 +func (c *Collector) Charts() *module.Charts {
108 + return c.charts
109 }
110
111 -func (p *Pihole) Collect() map[string]int64 {
112 - mx, err := p.collect()
111 +func (c *Collector) Collect() map[string]int64 {
112 + mx, err := c.collect()
113 if err != nil {
114 - p.Error(err)
114 + c.Error(err)
115 }
116
117 if len(mx) == 0 {
@@ -121,8 +121,8 @@ func (p *Pihole) Collect() map[string]int64 {
121 return mx
122 }
123
124 -func (p *Pihole) Cleanup() {
125 - if p.httpClient != nil {
126 - p.httpClient.CloseIdleConnections()
124 +func (c *Collector) Cleanup() {
125 + if c.httpClient != nil {
126 + c.httpClient.CloseIdleConnections()
127 }
128 }
src/go/plugin/go.d/collector/pihole/collector_test.go renamed
+36 -36
@@ -44,11 +44,11 @@ func Test_testDataIsValid(t *testing.T) {
44 }
45 }
46
47 -func TestPihole_ConfigurationSerialize(t *testing.T) {
48 - module.TestConfigurationSerialize(t, &Pihole{}, dataConfigJSON, dataConfigYAML)
47 +func TestCollector_ConfigurationSerialize(t *testing.T) {
48 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
49 }
50
51 -func TestPihole_Init(t *testing.T) {
51 +func TestCollector_Init(t *testing.T) {
52 tests := map[string]struct {
53 wantFail bool
54 config Config
@@ -69,22 +69,22 @@ func TestPihole_Init(t *testing.T) {
69
70 for name, test := range tests {
71 t.Run(name, func(t *testing.T) {
72 - p := New()
73 - p.Config = test.config
72 + collr := New()
73 + collr.Config = test.config
74
75 if test.wantFail {
76 - assert.Error(t, p.Init())
76 + assert.Error(t, collr.Init())
77 } else {
78 - assert.NoError(t, p.Init())
78 + assert.NoError(t, collr.Init())
79 }
80 })
81 }
82 }
83
84 -func TestPihole_Check(t *testing.T) {
84 +func TestCollector_Check(t *testing.T) {
85 tests := map[string]struct {
86 wantFail bool
87 - prepare func(t *testing.T) (p *Pihole, cleanup func())
87 + prepare func(t *testing.T) (collr *Collector, cleanup func())
88 }{
89 "success with web password": {
90 wantFail: false,
@@ -102,25 +102,25 @@ func TestPihole_Check(t *testing.T) {
102
103 for name, test := range tests {
104 t.Run(name, func(t *testing.T) {
105 - p, cleanup := test.prepare(t)
105 + collr, cleanup := test.prepare(t)
106 defer cleanup()
107
108 if test.wantFail {
109 - assert.Error(t, p.Check())
109 + assert.Error(t, collr.Check())
110 } else {
111 - assert.NoError(t, p.Check())
111 + assert.NoError(t, collr.Check())
112 }
113 })
114 }
115 }
116
117 -func TestPihole_Charts(t *testing.T) {
117 +func TestCollector_Charts(t *testing.T) {
118 assert.NotNil(t, New().Charts())
119 }
120
121 -func TestPihole_Collect(t *testing.T) {
121 +func TestCollector_Collect(t *testing.T) {
122 tests := map[string]struct {
123 - prepare func(t *testing.T) (p *Pihole, cleanup func())
123 + prepare func(t *testing.T) (collr *Collector, cleanup func())
124 wantMetrics map[string]int64
125 wantNumCharts int
126 }{
@@ -165,51 +165,51 @@ func TestPihole_Collect(t *testing.T) {
165
166 for name, test := range tests {
167 t.Run(name, func(t *testing.T) {
168 - p, cleanup := test.prepare(t)
168 + collr, cleanup := test.prepare(t)
169 defer cleanup()
170
171 - mx := p.Collect()
171 + mx := collr.Collect()
172
173 copyBlockListLastUpdate(mx, test.wantMetrics)
174 require.Equal(t, test.wantMetrics, mx)
175 if len(test.wantMetrics) > 0 {
176 - assert.Len(t, *p.Charts(), test.wantNumCharts)
176 + assert.Len(t, *collr.Charts(), test.wantNumCharts)
177 }
178 })
179 }
180 }
181
182 -func caseSuccessWithWebPassword(t *testing.T) (*Pihole, func()) {
183 - p, srv := New(), mockPiholeServer{}.newPiholeHTTPServer()
182 +func caseSuccessWithWebPassword(t *testing.T) (*Collector, func()) {
183 + collr, srv := New(), mockPiholeServer{}.newPiholeHTTPServer()
184
185 - p.SetupVarsPath = pathSetupVarsOK
186 - p.URL = srv.URL
185 + collr.SetupVarsPath = pathSetupVarsOK
186 + collr.URL = srv.URL
187
188 - require.NoError(t, p.Init())
188 + require.NoError(t, collr.Init())
189
190 - return p, srv.Close
190 + return collr, srv.Close
191 }
192
193 -func caseFailNoWebPassword(t *testing.T) (*Pihole, func()) {
194 - p, srv := New(), mockPiholeServer{}.newPiholeHTTPServer()
193 +func caseFailNoWebPassword(t *testing.T) (*Collector, func()) {
194 + collr, srv := New(), mockPiholeServer{}.newPiholeHTTPServer()
195
196 - p.SetupVarsPath = pathSetupVarsWrong
197 - p.URL = srv.URL
196 + collr.SetupVarsPath = pathSetupVarsWrong
197 + collr.URL = srv.URL
198
199 - require.NoError(t, p.Init())
199 + require.NoError(t, collr.Init())
200
201 - return p, srv.Close
201 + return collr, srv.Close
202 }
203
204 -func caseFailUnsupportedVersion(t *testing.T) (*Pihole, func()) {
205 - p, srv := New(), mockPiholeServer{unsupportedVersion: true}.newPiholeHTTPServer()
204 +func caseFailUnsupportedVersion(t *testing.T) (*Collector, func()) {
205 + collr, srv := New(), mockPiholeServer{unsupportedVersion: true}.newPiholeHTTPServer()
206
207 - p.SetupVarsPath = pathSetupVarsOK
208 - p.URL = srv.URL
207 + collr.SetupVarsPath = pathSetupVarsOK
208 + collr.URL = srv.URL
209
210 - require.NoError(t, p.Init())
210 + require.NoError(t, collr.Init())
211
212 - return p, srv.Close
212 + return collr, srv.Close
213 }
214
215 type mockPiholeServer struct {
src/go/plugin/go.d/collector/pihole/init.go
+12 -12
@@ -13,31 +13,31 @@ import (
13 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/web"
14 )
15
16 -func (p *Pihole) validateConfig() error {
17 - if p.URL == "" {
16 +func (c *Collector) validateConfig() error {
17 + if c.URL == "" {
18 return errors.New("url not set")
19 }
20 return nil
21 }
22
23 -func (p *Pihole) initHTTPClient() (*http.Client, error) {
24 - return web.NewHTTPClient(p.ClientConfig)
23 +func (c *Collector) initHTTPClient() (*http.Client, error) {
24 + return web.NewHTTPClient(c.ClientConfig)
25 }
26
27 -func (p *Pihole) getWebPassword() string {
27 +func (c *Collector) getWebPassword() string {
28 // do no read setupVarsPath is password is set in the configuration file
29 - if p.Password != "" {
30 - return p.Password
29 + if c.Password != "" {
30 + return c.Password
31 }
32 - if !isLocalHost(p.URL) {
33 - p.Info("abort web password auto detection, host is not localhost")
32 + if !isLocalHost(c.URL) {
33 + c.Info("abort web password auto detection, host is not localhost")
34 return ""
35 }
36
37 - p.Infof("starting web password auto detection, reading : %s", p.SetupVarsPath)
38 - pass, err := getWebPassword(p.SetupVarsPath)
37 + c.Infof("starting web password auto detection, reading : %s", c.SetupVarsPath)
38 + pass, err := getWebPassword(c.SetupVarsPath)
39 if err != nil {
40 - p.Warningf("error during reading '%s' : %v", p.SetupVarsPath, err)
40 + c.Warningf("error during reading '%s' : %v", c.SetupVarsPath, err)
41 }
42
43 return pass
src/go/plugin/go.d/collector/pika/collect.go
+8 -8
@@ -15,27 +15,27 @@ import (
15
16 const precision = 1000 // float values multiplier and dimensions divisor
17
18 -func (p *Pika) collect() (map[string]int64, error) {
19 - info, err := p.pdb.Info(context.Background(), "all").Result()
18 +func (c *Collector) collect() (map[string]int64, error) {
19 + info, err := c.pdb.Info(context.Background(), "all").Result()
20 if err != nil {
21 return nil, err
22 }
23
24 - if p.server == "" {
24 + if c.server == "" {
25 s, v, err := extractServerVersion(info)
26 if err != nil {
27 return nil, fmt.Errorf("can not extract server app and version: %v", err)
28 }
29 - p.server, p.version = s, v
30 - p.Debugf(`server="%s",version="%s"`, s, v)
29 + c.server, c.version = s, v
30 + c.Debugf(`server="%s",version="%s"`, s, v)
31 }
32
33 - if p.server != "pika" {
34 - return nil, fmt.Errorf("unsupported server app, want=pika, got=%s", p.server)
33 + if c.server != "pika" {
34 + return nil, fmt.Errorf("unsupported server app, want=pika, got=%s", c.server)
35 }
36
37 ms := make(map[string]int64)
38 - p.collectInfo(ms, info)
38 + c.collectInfo(ms, info)
39
40 return ms, nil
41 }
src/go/plugin/go.d/collector/pika/collect_info.go
+33 -33
@@ -42,7 +42,7 @@ var infoSections = map[string]struct{}{
42
43 func isInfoSection(line string) bool { _, ok := infoSections[line]; return ok }
44
45 -func (p *Pika) collectInfo(ms map[string]int64, info string) {
45 +func (c *Collector) collectInfo(ms map[string]int64, info string) {
46 var curSection string
47
48 sc := bufio.NewScanner(strings.NewReader(info))
@@ -66,9 +66,9 @@ func (p *Pika) collectInfo(ms map[string]int64, info string) {
66
67 switch curSection {
68 case infoSectionCommandExecCount:
69 - p.collectInfoCommandExecCountProperty(ms, field, value)
69 + c.collectInfoCommandExecCountProperty(ms, field, value)
70 case infoSectionKeyspace:
71 - p.collectInfoKeyspaceProperty(ms, field, value)
71 + c.collectInfoKeyspaceProperty(ms, field, value)
72 default:
73 collectNumericValue(ms, field, value)
74 }
@@ -77,7 +77,7 @@ func (p *Pika) collectInfo(ms map[string]int64, info string) {
77
78 var reKeyspaceValue = regexp.MustCompile(`^(.+)_keys=(\d+), expires=(\d+), invalid_keys=(\d+)`)
79
80 -func (p *Pika) collectInfoKeyspaceProperty(ms map[string]int64, field, value string) {
80 +func (c *Collector) collectInfoKeyspaceProperty(ms map[string]int64, field, value string) {
81 match := reKeyspaceValue.FindStringSubmatch(value)
82 if match == nil {
83 return
@@ -88,104 +88,104 @@ func (p *Pika) collectInfoKeyspaceProperty(ms map[string]int64, field, value str
88 collectNumericValue(ms, field+"_"+dataType+"_expires_keys", expires)
89 collectNumericValue(ms, field+"_"+dataType+"_invalid_keys", invalid)
90
91 - if !p.collectedDbs[field] {
92 - p.collectedDbs[field] = true
93 - p.addDbToKeyspaceCharts(field)
91 + if !c.collectedDbs[field] {
92 + c.collectedDbs[field] = true
93 + c.addDbToKeyspaceCharts(field)
94 }
95 }
96
97 -func (p *Pika) collectInfoCommandExecCountProperty(ms map[string]int64, field, value string) {
97 +func (c *Collector) collectInfoCommandExecCountProperty(ms map[string]int64, field, value string) {
98 collectNumericValue(ms, "cmd_"+field+"_calls", value)
99
100 - if !p.collectedCommands[field] {
101 - p.collectedCommands[field] = true
102 - p.addCmdToCommandsCharts(field)
100 + if !c.collectedCommands[field] {
101 + c.collectedCommands[field] = true
102 + c.addCmdToCommandsCharts(field)
103 }
104 }
105
106 -func (p *Pika) addCmdToCommandsCharts(cmd string) {
107 - p.addDimToChart(chartCommandsCalls.ID, &module.Dim{
106 +func (c *Collector) addCmdToCommandsCharts(cmd string) {
107 + c.addDimToChart(chartCommandsCalls.ID, &module.Dim{
108 ID: "cmd_" + cmd + "_calls",
109 Name: cmd,
110 Algo: module.Incremental,
111 })
112 }
113
114 -func (p *Pika) addDbToKeyspaceCharts(db string) {
115 - p.addDimToChart(chartDbStringsKeys.ID, &module.Dim{
114 +func (c *Collector) addDbToKeyspaceCharts(db string) {
115 + c.addDimToChart(chartDbStringsKeys.ID, &module.Dim{
116 ID: db + "_strings_keys",
117 Name: db,
118 })
119 - p.addDimToChart(chartDbStringsExpiresKeys.ID, &module.Dim{
119 + c.addDimToChart(chartDbStringsExpiresKeys.ID, &module.Dim{
120 ID: db + "_strings_expires_keys",
121 Name: db,
122 })
123 - p.addDimToChart(chartDbStringsInvalidKeys.ID, &module.Dim{
123 + c.addDimToChart(chartDbStringsInvalidKeys.ID, &module.Dim{
124 ID: db + "_strings_invalid_keys",
125 Name: db,
126 })
127
128 - p.addDimToChart(chartDbHashesKeys.ID, &module.Dim{
128 + c.addDimToChart(chartDbHashesKeys.ID, &module.Dim{
129 ID: db + "_hashes_keys",
130 Name: db,
131 })
132 - p.addDimToChart(chartDbHashesExpiresKeys.ID, &module.Dim{
132 + c.addDimToChart(chartDbHashesExpiresKeys.ID, &module.Dim{
133 ID: db + "_hashes_expires_keys",
134 Name: db,
135 })
136 - p.addDimToChart(chartDbHashesInvalidKeys.ID, &module.Dim{
136 + c.addDimToChart(chartDbHashesInvalidKeys.ID, &module.Dim{
137 ID: db + "_hashes_invalid_keys",
138 Name: db,
139 })
140
141 - p.addDimToChart(chartDbListsKeys.ID, &module.Dim{
141 + c.addDimToChart(chartDbListsKeys.ID, &module.Dim{
142 ID: db + "_lists_keys",
143 Name: db,
144 })
145 - p.addDimToChart(chartDbListsExpiresKeys.ID, &module.Dim{
145 + c.addDimToChart(chartDbListsExpiresKeys.ID, &module.Dim{
146 ID: db + "_lists_expires_keys",
147 Name: db,
148 })
149 - p.addDimToChart(chartDbListsInvalidKeys.ID, &module.Dim{
149 + c.addDimToChart(chartDbListsInvalidKeys.ID, &module.Dim{
150 ID: db + "_lists_invalid_keys",
151 Name: db,
152 })
153
154 - p.addDimToChart(chartDbZsetsKeys.ID, &module.Dim{
154 + c.addDimToChart(chartDbZsetsKeys.ID, &module.Dim{
155 ID: db + "_zsets_keys",
156 Name: db,
157 })
158 - p.addDimToChart(chartDbZsetsExpiresKeys.ID, &module.Dim{
158 + c.addDimToChart(chartDbZsetsExpiresKeys.ID, &module.Dim{
159 ID: db + "_zsets_expires_keys",
160 Name: db,
161 })
162 - p.addDimToChart(chartDbZsetsInvalidKeys.ID, &module.Dim{
162 + c.addDimToChart(chartDbZsetsInvalidKeys.ID, &module.Dim{
163 ID: db + "_zsets_invalid_keys",
164 Name: db,
165 })
166
167 - p.addDimToChart(chartDbSetsKeys.ID, &module.Dim{
167 + c.addDimToChart(chartDbSetsKeys.ID, &module.Dim{
168 ID: db + "_sets_keys",
169 Name: db,
170 })
171 - p.addDimToChart(chartDbSetsExpiresKeys.ID, &module.Dim{
171 + c.addDimToChart(chartDbSetsExpiresKeys.ID, &module.Dim{
172 ID: db + "_sets_expires_keys",
173 Name: db,
174 })
175 - p.addDimToChart(chartDbSetsInvalidKeys.ID, &module.Dim{
175 + c.addDimToChart(chartDbSetsInvalidKeys.ID, &module.Dim{
176 ID: db + "_sets_invalid_keys",
177 Name: db,
178 })
179 }
180
181 -func (p *Pika) addDimToChart(chartID string, dim *module.Dim) {
182 - chart := p.Charts().Get(chartID)
181 +func (c *Collector) addDimToChart(chartID string, dim *module.Dim) {
182 + chart := c.Charts().Get(chartID)
183 if chart == nil {
184 - p.Warningf("error on adding '%s' dimension: can not find '%s' chart", dim.ID, chartID)
184 + c.Warningf("error on adding '%s' dimension: can not find '%s' chart", dim.ID, chartID)
185 return
186 }
187 if err := chart.AddDim(dim); err != nil {
188 - p.Warning(err)
188 + c.Warning(err)
189 return
190 }
191 chart.MarkNotCreated()
src/go/plugin/go.d/collector/pika/collector.go renamed
+23 -23
@@ -28,8 +28,8 @@ func init() {
28 })
29 }
30
31 -func New() *Pika {
32 - return &Pika{
31 +func New() *Collector {
32 + return &Collector{
33 Config: Config{
34 Address: "redis://@localhost:9221",
35 Timeout: confopt.Duration(time.Second),
@@ -48,7 +48,7 @@ type Config struct {
48 }
49
50 type (
51 - Pika struct {
51 + Collector struct {
52 module.Base
53 Config `yaml:",inline" json:""`
54
@@ -67,33 +67,33 @@ type (
67 }
68 )
69
70 -func (p *Pika) Configuration() any {
71 - return p.Config
70 +func (c *Collector) Configuration() any {
71 + return c.Config
72 }
73
74 -func (p *Pika) Init() error {
75 - err := p.validateConfig()
74 +func (c *Collector) Init() error {
75 + err := c.validateConfig()
76 if err != nil {
77 return fmt.Errorf("config validation: %v", err)
78 }
79
80 - pdb, err := p.initRedisClient()
80 + pdb, err := c.initRedisClient()
81 if err != nil {
82 return fmt.Errorf("init redis client: %v", err)
83 }
84 - p.pdb = pdb
84 + c.pdb = pdb
85
86 - charts, err := p.initCharts()
86 + charts, err := c.initCharts()
87 if err != nil {
88 return fmt.Errorf("init charts: %v", err)
89 }
90 - p.charts = charts
90 + c.charts = charts
91
92 return nil
93 }
94
95 -func (p *Pika) Check() error {
96 - mx, err := p.collect()
95 +func (c *Collector) Check() error {
96 + mx, err := c.collect()
97 if err != nil {
98 return err
99 }
@@ -103,14 +103,14 @@ func (p *Pika) Check() error {
103 return nil
104 }
105
106 -func (p *Pika) Charts() *module.Charts {
107 - return p.charts
106 +func (c *Collector) Charts() *module.Charts {
107 + return c.charts
108 }
109
110 -func (p *Pika) Collect() map[string]int64 {
111 - ms, err := p.collect()
110 +func (c *Collector) Collect() map[string]int64 {
111 + ms, err := c.collect()
112 if err != nil {
113 - p.Error(err)
113 + c.Error(err)
114 }
115
116 if len(ms) == 0 {
@@ -119,13 +119,13 @@ func (p *Pika) Collect() map[string]int64 {
119 return ms
120 }
121
122 -func (p *Pika) Cleanup() {
123 - if p.pdb == nil {
122 +func (c *Collector) Cleanup() {
123 + if c.pdb == nil {
124 return
125 }
126 - err := p.pdb.Close()
126 + err := c.pdb.Close()
127 if err != nil {
128 - p.Warningf("cleanup: error on closing redis client [%s]: %v", p.Address, err)
128 + c.Warningf("cleanup: error on closing redis client [%s]: %v", c.Address, err)
129 }
130 - p.pdb = nil
130 + c.pdb = nil
131 }
src/go/plugin/go.d/collector/pika/collector_test.go renamed
+50 -50
@@ -35,11 +35,11 @@ func Test_testDataIsValid(t *testing.T) {
35 }
36 }
37
38 -func TestPika_ConfigurationSerialize(t *testing.T) {
39 - module.TestConfigurationSerialize(t, &Pika{}, dataConfigJSON, dataConfigYAML)
38 +func TestCollector_ConfigurationSerialize(t *testing.T) {
39 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
40 }
41
42 -func TestPika_Init(t *testing.T) {
42 +func TestCollector_Init(t *testing.T) {
43 tests := map[string]struct {
44 config Config
45 wantFail bool
@@ -66,21 +66,21 @@ func TestPika_Init(t *testing.T) {
66
67 for name, test := range tests {
68 t.Run(name, func(t *testing.T) {
69 - pika := New()
70 - pika.Config = test.config
69 + collr := New()
70 + collr.Config = test.config
71
72 if test.wantFail {
73 - assert.Error(t, pika.Init())
73 + assert.Error(t, collr.Init())
74 } else {
75 - assert.NoError(t, pika.Init())
75 + assert.NoError(t, collr.Init())
76 }
77 })
78 }
79 }
80
81 -func TestPika_Check(t *testing.T) {
81 +func TestCollector_Check(t *testing.T) {
82 tests := map[string]struct {
83 - prepare func(t *testing.T) *Pika
83 + prepare func(t *testing.T) *Collector
84 wantFail bool
85 }{
86 "success on valid response v3.4.0": {
@@ -98,40 +98,40 @@ func TestPika_Check(t *testing.T) {
98
99 for name, test := range tests {
100 t.Run(name, func(t *testing.T) {
101 - pika := test.prepare(t)
101 + collr := test.prepare(t)
102
103 if test.wantFail {
104 - assert.Error(t, pika.Check())
104 + assert.Error(t, collr.Check())
105 } else {
106 - assert.NoError(t, pika.Check())
106 + assert.NoError(t, collr.Check())
107 }
108 })
109 }
110 }
111
112 -func TestPika_Charts(t *testing.T) {
113 - pika := New()
114 - require.NoError(t, pika.Init())
112 +func TestCollector_Charts(t *testing.T) {
113 + collr := New()
114 + require.NoError(t, collr.Init())
115
116 - assert.NotNil(t, pika.Charts())
116 + assert.NotNil(t, collr.Charts())
117 }
118
119 -func TestPika_Cleanup(t *testing.T) {
120 - pika := New()
121 - assert.NotPanics(t, pika.Cleanup)
119 +func TestCollector_Cleanup(t *testing.T) {
120 + collr := New()
121 + assert.NotPanics(t, collr.Cleanup)
122
123 - require.NoError(t, pika.Init())
123 + require.NoError(t, collr.Init())
124 m := &mockRedisClient{}
125 - pika.pdb = m
125 + collr.pdb = m
126
127 - pika.Cleanup()
127 + collr.Cleanup()
128
129 assert.True(t, m.calledClose)
130 }
131
132 -func TestPika_Collect(t *testing.T) {
132 +func TestCollector_Collect(t *testing.T) {
133 tests := map[string]struct {
134 - prepare func(t *testing.T) *Pika
134 + prepare func(t *testing.T) *Collector
135 wantCollected map[string]int64
136 }{
137 "success on valid response v3.4.0": {
@@ -185,59 +185,59 @@ func TestPika_Collect(t *testing.T) {
185
186 for name, test := range tests {
187 t.Run(name, func(t *testing.T) {
188 - pika := test.prepare(t)
188 + collr := test.prepare(t)
189
190 - mx := pika.Collect()
190 + mx := collr.Collect()
191
192 assert.Equal(t, test.wantCollected, mx)
193 if len(test.wantCollected) > 0 {
194 - module.TestMetricsHasAllChartsDims(t, pika.Charts(), mx)
195 - ensureCollectedCommandsAddedToCharts(t, pika)
196 - ensureCollectedDbsAddedToCharts(t, pika)
194 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
195 + ensureCollectedCommandsAddedToCharts(t, collr)
196 + ensureCollectedDbsAddedToCharts(t, collr)
197 }
198 })
199 }
200 }
201
202 -func preparePikaV340(t *testing.T) *Pika {
203 - pika := New()
204 - require.NoError(t, pika.Init())
205 - pika.pdb = &mockRedisClient{
202 +func preparePikaV340(t *testing.T) *Collector {
203 + collr := New()
204 + require.NoError(t, collr.Init())
205 + collr.pdb = &mockRedisClient{
206 result: dataVer340InfoAll,
207 }
208 - return pika
208 + return collr
209 }
210
211 -func preparePikaErrorOnInfo(t *testing.T) *Pika {
212 - pika := New()
213 - require.NoError(t, pika.Init())
214 - pika.pdb = &mockRedisClient{
211 +func preparePikaErrorOnInfo(t *testing.T) *Collector {
212 + collr := New()
213 + require.NoError(t, collr.Init())
214 + collr.pdb = &mockRedisClient{
215 errOnInfo: true,
216 }
217 - return pika
217 + return collr
218 }
219
220 -func preparePikaWithRedisMetrics(t *testing.T) *Pika {
221 - pika := New()
222 - require.NoError(t, pika.Init())
223 - pika.pdb = &mockRedisClient{
220 +func preparePikaWithRedisMetrics(t *testing.T) *Collector {
221 + collr := New()
222 + require.NoError(t, collr.Init())
223 + collr.pdb = &mockRedisClient{
224 result: dataRedisInfoAll,
225 }
226 - return pika
226 + return collr
227 }
228
229 -func ensureCollectedCommandsAddedToCharts(t *testing.T, pika *Pika) {
229 +func ensureCollectedCommandsAddedToCharts(t *testing.T, collr *Collector) {
230 for _, id := range []string{
231 chartCommandsCalls.ID,
232 } {
233 - chart := pika.Charts().Get(id)
233 + chart := collr.Charts().Get(id)
234 require.NotNilf(t, chart, "'%s' chart is not in charts", id)
235 - assert.Lenf(t, chart.Dims, len(pika.collectedCommands),
235 + assert.Lenf(t, chart.Dims, len(collr.collectedCommands),
236 "'%s' chart unexpected number of dimensions", id)
237 }
238 }
239
240 -func ensureCollectedDbsAddedToCharts(t *testing.T, pika *Pika) {
240 +func ensureCollectedDbsAddedToCharts(t *testing.T, collr *Collector) {
241 for _, id := range []string{
242 chartDbStringsKeys.ID,
243 chartDbStringsExpiresKeys.ID,
@@ -255,9 +255,9 @@ func ensureCollectedDbsAddedToCharts(t *testing.T, pika *Pika) {
255 chartDbSetsExpiresKeys.ID,
256 chartDbSetsInvalidKeys.ID,
257 } {
258 - chart := pika.Charts().Get(id)
258 + chart := collr.Charts().Get(id)
259 require.NotNilf(t, chart, "'%s' chart is not in charts", id)
260 - assert.Lenf(t, chart.Dims, len(pika.collectedDbs),
260 + assert.Lenf(t, chart.Dims, len(collr.collectedDbs),
261 "'%s' chart unexpected number of dimensions", id)
262 }
263 }
src/go/plugin/go.d/collector/pika/init.go
+9 -9
@@ -11,20 +11,20 @@ import (
11 "github.com/redis/go-redis/v9"
12 )
13
14 -func (p *Pika) validateConfig() error {
15 - if p.Address == "" {
14 +func (c *Collector) validateConfig() error {
15 + if c.Address == "" {
16 return errors.New("'address' not set")
17 }
18 return nil
19 }
20
21 -func (p *Pika) initRedisClient() (*redis.Client, error) {
22 - opts, err := redis.ParseURL(p.Address)
21 +func (c *Collector) initRedisClient() (*redis.Client, error) {
22 + opts, err := redis.ParseURL(c.Address)
23 if err != nil {
24 return nil, err
25 }
26
27 - tlsConfig, err := tlscfg.NewTLSConfig(p.TLSConfig)
27 + tlsConfig, err := tlscfg.NewTLSConfig(c.TLSConfig)
28 if err != nil {
29 return nil, err
30 }
@@ -35,13 +35,13 @@ func (p *Pika) initRedisClient() (*redis.Client, error) {
35
36 opts.PoolSize = 1
37 opts.TLSConfig = tlsConfig
38 - opts.DialTimeout = p.Timeout.Duration()
39 - opts.ReadTimeout = p.Timeout.Duration()
40 - opts.WriteTimeout = p.Timeout.Duration()
38 + opts.DialTimeout = c.Timeout.Duration()
39 + opts.ReadTimeout = c.Timeout.Duration()
40 + opts.WriteTimeout = c.Timeout.Duration()
41
42 return redis.NewClient(opts), nil
43 }
44
45 -func (p *Pika) initCharts() (*module.Charts, error) {
45 +func (c *Collector) initCharts() (*module.Charts, error) {
46 return pikaCharts.Copy(), nil
47 }
src/go/plugin/go.d/collector/ping/charts.go
+3 -3
@@ -92,10 +92,10 @@ func newHostCharts(host string) *module.Charts {
92 return charts
93 }
94
95 -func (p *Ping) addHostCharts(host string) {
95 +func (c *Collector) addHostCharts(host string) {
96 charts := newHostCharts(host)
97
98 - if err := p.Charts().Add(*charts...); err != nil {
99 - p.Warning(err)
98 + if err := c.Charts().Add(*charts...); err != nil {
99 + c.Warning(err)
100 }
101 }
src/go/plugin/go.d/collector/ping/collect.go
+9 -9
@@ -7,33 +7,33 @@ import (
7 "sync"
8 )
9
10 -func (p *Ping) collect() (map[string]int64, error) {
10 +func (c *Collector) collect() (map[string]int64, error) {
11 mu := &sync.Mutex{}
12 mx := make(map[string]int64)
13 var wg sync.WaitGroup
14
15 - for _, v := range p.Hosts {
15 + for _, v := range c.Hosts {
16 wg.Add(1)
17 - go func(v string) { defer wg.Done(); p.pingHost(v, mx, mu) }(v)
17 + go func(v string) { defer wg.Done(); c.pingHost(v, mx, mu) }(v)
18 }
19 wg.Wait()
20
21 return mx, nil
22 }
23
24 -func (p *Ping) pingHost(host string, mx map[string]int64, mu *sync.Mutex) {
25 - stats, err := p.prober.ping(host)
24 +func (c *Collector) pingHost(host string, mx map[string]int64, mu *sync.Mutex) {
25 + stats, err := c.prober.ping(host)
26 if err != nil {
27 - p.Error(err)
27 + c.Error(err)
28 return
29 }
30
31 mu.Lock()
32 defer mu.Unlock()
33
34 - if !p.hosts[host] {
35 - p.hosts[host] = true
36 - p.addHostCharts(host)
34 + if !c.hosts[host] {
35 + c.hosts[host] = true
36 + c.addHostCharts(host)
37 }
38
39 px := fmt.Sprintf("host_%s_", host)
src/go/plugin/go.d/collector/ping/collector.go renamed
+24 -31
@@ -11,8 +11,6 @@ import (
11 "github.com/netdata/netdata/go/plugins/logger"
12 "github.com/netdata/netdata/go/plugins/plugin/go.d/agent/module"
13 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/confopt"
14 -
15 - probing "github.com/prometheus-community/pro-bing"
14 )
15
16 //go:embed "config_schema.json"
@@ -29,8 +27,8 @@ func init() {
27 })
28 }
29
32 -func New() *Ping {
33 - return &Ping{
30 +func New() *Collector {
31 + return &Collector{
32 Config: Config{
33 Network: "ip",
34 Privileged: true,
@@ -54,44 +52,39 @@ type Config struct {
52 Interface string `yaml:"interface,omitempty" json:"interface"`
53 }
54
57 -type (
58 - Ping struct {
59 - module.Base
60 - Config `yaml:",inline" json:""`
55 +type Collector struct {
56 + module.Base
57 + Config `yaml:",inline" json:""`
58
62 - charts *module.Charts
59 + charts *module.Charts
60
64 - prober prober
65 - newProber func(pingProberConfig, *logger.Logger) prober
61 + prober prober
62 + newProber func(pingProberConfig, *logger.Logger) prober
63
67 - hosts map[string]bool
68 - }
69 - prober interface {
70 - ping(host string) (*probing.Statistics, error)
71 - }
72 -)
64 + hosts map[string]bool
65 +}
66
74 -func (p *Ping) Configuration() any {
75 - return p.Config
67 +func (c *Collector) Configuration() any {
68 + return c.Config
69 }
70
78 -func (p *Ping) Init() error {
79 - err := p.validateConfig()
71 +func (c *Collector) Init() error {
72 + err := c.validateConfig()
73 if err != nil {
74 return fmt.Errorf("config validation: %v", err)
75 }
76
84 - pr, err := p.initProber()
77 + pr, err := c.initProber()
78 if err != nil {
79 return fmt.Errorf("init prober: %v", err)
80 }
88 - p.prober = pr
81 + c.prober = pr
82
83 return nil
84 }
85
93 -func (p *Ping) Check() error {
94 - mx, err := p.collect()
86 +func (c *Collector) Check() error {
87 + mx, err := c.collect()
88 if err != nil {
89 return err
90 }
@@ -102,14 +95,14 @@ func (p *Ping) Check() error {
95 return nil
96 }
97
105 -func (p *Ping) Charts() *module.Charts {
106 - return p.charts
98 +func (c *Collector) Charts() *module.Charts {
99 + return c.charts
100 }
101
109 -func (p *Ping) Collect() map[string]int64 {
110 - mx, err := p.collect()
102 +func (c *Collector) Collect() map[string]int64 {
103 + mx, err := c.collect()
104 if err != nil {
112 - p.Error(err)
105 + c.Error(err)
106 }
107
108 if len(mx) == 0 {
@@ -118,4 +111,4 @@ func (p *Ping) Collect() map[string]int64 {
111 return mx
112 }
113
121 -func (p *Ping) Cleanup() {}
114 +func (c *Collector) Cleanup() {}
src/go/plugin/go.d/collector/ping/collector_test.go renamed
+34 -34
@@ -30,11 +30,11 @@ func Test_testDataIsValid(t *testing.T) {
30 }
31 }
32
33 -func TestPing_ConfigurationSerialize(t *testing.T) {
34 - module.TestConfigurationSerialize(t, &Ping{}, dataConfigJSON, dataConfigYAML)
33 +func TestCollector_ConfigurationSerialize(t *testing.T) {
34 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
35 }
36
37 -func TestPing_Init(t *testing.T) {
37 +func TestCollector_Init(t *testing.T) {
38 tests := map[string]struct {
39 wantFail bool
40 config Config
@@ -54,31 +54,31 @@ func TestPing_Init(t *testing.T) {
54
55 for name, test := range tests {
56 t.Run(name, func(t *testing.T) {
57 - ping := New()
58 - ping.Config = test.config
59 - ping.UpdateEvery = 1
57 + collr := New()
58 + collr.Config = test.config
59 + collr.UpdateEvery = 1
60
61 if test.wantFail {
62 - assert.Error(t, ping.Init())
62 + assert.Error(t, collr.Init())
63 } else {
64 - assert.NoError(t, ping.Init())
64 + assert.NoError(t, collr.Init())
65 }
66 })
67 }
68 }
69
70 -func TestPing_Charts(t *testing.T) {
70 +func TestCollector_Charts(t *testing.T) {
71 assert.NotNil(t, New().Charts())
72 }
73
74 -func TestPing_Cleanup(t *testing.T) {
74 +func TestCollector_Cleanup(t *testing.T) {
75 assert.NotPanics(t, New().Cleanup)
76 }
77
78 -func TestPing_Check(t *testing.T) {
78 +func TestCollector_Check(t *testing.T) {
79 tests := map[string]struct {
80 wantFail bool
81 - prepare func(t *testing.T) *Ping
81 + prepare func(t *testing.T) *Collector
82 }{
83 "success when ping does not return an error": {
84 wantFail: false,
@@ -92,20 +92,20 @@ func TestPing_Check(t *testing.T) {
92
93 for name, test := range tests {
94 t.Run(name, func(t *testing.T) {
95 - ping := test.prepare(t)
95 + collr := test.prepare(t)
96
97 if test.wantFail {
98 - assert.Error(t, ping.Check())
98 + assert.Error(t, collr.Check())
99 } else {
100 - assert.NoError(t, ping.Check())
100 + assert.NoError(t, collr.Check())
101 }
102 })
103 }
104 }
105
106 -func TestPing_Collect(t *testing.T) {
106 +func TestCollector_Collect(t *testing.T) {
107 tests := map[string]struct {
108 - prepare func(t *testing.T) *Ping
108 + prepare func(t *testing.T) *Collector
109 wantMetrics map[string]int64
110 wantNumCharts int
111 }{
@@ -145,39 +145,39 @@ func TestPing_Collect(t *testing.T) {
145
146 for name, test := range tests {
147 t.Run(name, func(t *testing.T) {
148 - ping := test.prepare(t)
148 + collr := test.prepare(t)
149
150 - mx := ping.Collect()
150 + mx := collr.Collect()
151
152 require.Equal(t, test.wantMetrics, mx)
153
154 if len(test.wantMetrics) > 0 {
155 - assert.Len(t, *ping.Charts(), test.wantNumCharts)
155 + assert.Len(t, *collr.Charts(), test.wantNumCharts)
156 }
157 })
158 }
159 }
160
161 -func casePingSuccess(t *testing.T) *Ping {
162 - ping := New()
163 - ping.UpdateEvery = 1
164 - ping.Hosts = []string{"192.0.2.1", "192.0.2.2", "example.com"}
165 - ping.newProber = func(_ pingProberConfig, _ *logger.Logger) prober {
161 +func casePingSuccess(t *testing.T) *Collector {
162 + collr := New()
163 + collr.UpdateEvery = 1
164 + collr.Hosts = []string{"192.0.2.1", "192.0.2.2", "example.com"}
165 + collr.newProber = func(_ pingProberConfig, _ *logger.Logger) prober {
166 return &mockProber{}
167 }
168 - require.NoError(t, ping.Init())
169 - return ping
168 + require.NoError(t, collr.Init())
169 + return collr
170 }
171
172 -func casePingError(t *testing.T) *Ping {
173 - ping := New()
174 - ping.UpdateEvery = 1
175 - ping.Hosts = []string{"192.0.2.1", "192.0.2.2", "example.com"}
176 - ping.newProber = func(_ pingProberConfig, _ *logger.Logger) prober {
172 +func casePingError(t *testing.T) *Collector {
173 + collr := New()
174 + collr.UpdateEvery = 1
175 + collr.Hosts = []string{"192.0.2.1", "192.0.2.2", "example.com"}
176 + collr.newProber = func(_ pingProberConfig, _ *logger.Logger) prober {
177 return &mockProber{errOnPing: true}
178 }
179 - require.NoError(t, ping.Init())
180 - return ping
179 + require.NoError(t, collr.Init())
180 + return collr
181 }
182
183 type mockProber struct {
src/go/plugin/go.d/collector/ping/init.go
+11 -11
@@ -7,33 +7,33 @@ import (
7 "time"
8 )
9
10 -func (p *Ping) validateConfig() error {
11 - if len(p.Hosts) == 0 {
10 +func (c *Collector) validateConfig() error {
11 + if len(c.Hosts) == 0 {
12 return errors.New("'hosts' can't be empty")
13 }
14 - if p.SendPackets <= 0 {
14 + if c.SendPackets <= 0 {
15 return errors.New("'send_packets' can't be <= 0")
16 }
17 return nil
18 }
19
20 -func (p *Ping) initProber() (prober, error) {
20 +func (c *Collector) initProber() (prober, error) {
21 mul := 0.9
22 - if p.UpdateEvery > 1 {
22 + if c.UpdateEvery > 1 {
23 mul = 0.95
24 }
25 - deadline := time.Millisecond * time.Duration(float64(p.UpdateEvery)*mul*1000)
25 + deadline := time.Millisecond * time.Duration(float64(c.UpdateEvery)*mul*1000)
26 if deadline.Milliseconds() == 0 {
27 return nil, errors.New("zero ping deadline")
28 }
29
30 conf := pingProberConfig{
31 - privileged: p.Privileged,
32 - packets: p.SendPackets,
33 - ifaceName: p.Interface,
34 - interval: p.Interval.Duration(),
31 + privileged: c.Privileged,
32 + packets: c.SendPackets,
33 + ifaceName: c.Interface,
34 + interval: c.Interval.Duration(),
35 deadline: deadline,
36 }
37
38 - return p.newProber(conf, p.Logger), nil
38 + return c.newProber(conf, c.Logger), nil
39 }
src/go/plugin/go.d/collector/ping/prober.go
+4
@@ -11,6 +11,10 @@ import (
11 probing "github.com/prometheus-community/pro-bing"
12 )
13
14 +type prober interface {
15 + ping(host string) (*probing.Statistics, error)
16 +}
17 +
18 func newPingProber(conf pingProberConfig, log *logger.Logger) prober {
19 return &pingProber{
20 network: conf.network,
src/go/plugin/go.d/collector/portcheck/charts.go
+8 -8
@@ -93,19 +93,19 @@ var (
93 }
94 )
95
96 -func (pc *PortCheck) addTCPPortCharts(port *tcpPort) {
97 - charts := newPortCharts(pc.Host, port.number, tcpPortChartsTmpl.Copy())
96 +func (c *Collector) addTCPPortCharts(port *tcpPort) {
97 + charts := newPortCharts(c.Host, port.number, tcpPortChartsTmpl.Copy())
98
99 - if err := pc.Charts().Add(*charts...); err != nil {
100 - pc.Warning(err)
99 + if err := c.Charts().Add(*charts...); err != nil {
100 + c.Warning(err)
101 }
102 }
103
104 -func (pc *PortCheck) addUDPPortCharts(port *udpPort) {
105 - charts := newPortCharts(pc.Host, port.number, udpPortChartsTmpl.Copy())
104 +func (c *Collector) addUDPPortCharts(port *udpPort) {
105 + charts := newPortCharts(c.Host, port.number, udpPortChartsTmpl.Copy())
106
107 - if err := pc.Charts().Add(*charts...); err != nil {
108 - pc.Warning(err)
107 + if err := c.Charts().Add(*charts...); err != nil {
108 + c.Warning(err)
109 }
110 }
111
src/go/plugin/go.d/collector/portcheck/check_tcp_port.go
+7 -7
@@ -19,11 +19,11 @@ type tcpPort struct {
19 latency int
20 }
21
22 -func (pc *PortCheck) checkTCPPort(port *tcpPort) {
22 +func (c *Collector) checkTCPPort(port *tcpPort) {
23 start := time.Now()
24
25 - addr := pc.address(port.number)
26 - conn, err := pc.dialTCP("tcp", addr, pc.Timeout.Duration())
25 + addr := c.address(port.number)
26 + conn, err := c.dialTCP("tcp", addr, c.Timeout.Duration())
27
28 dur := time.Since(start)
29
@@ -35,18 +35,18 @@ func (pc *PortCheck) checkTCPPort(port *tcpPort) {
35
36 if err != nil {
37 if v, ok := err.(interface{ Timeout() bool }); ok && v.Timeout() {
38 - pc.setTcpPortCheckState(port, tcpPortCheckStateTimeout)
38 + c.setTcpPortCheckState(port, tcpPortCheckStateTimeout)
39 } else {
40 - pc.setTcpPortCheckState(port, tcpPortCheckStateFailed)
40 + c.setTcpPortCheckState(port, tcpPortCheckStateFailed)
41 }
42 return
43 }
44
45 - pc.setTcpPortCheckState(port, tcpPortCheckStateSuccess)
45 + c.setTcpPortCheckState(port, tcpPortCheckStateSuccess)
46 port.latency = durationToMs(dur)
47 }
48
49 -func (pc *PortCheck) setTcpPortCheckState(port *tcpPort, state string) {
49 +func (c *Collector) setTcpPortCheckState(port *tcpPort, state string) {
50 if port.status != state {
51 port.status = state
52 port.statusChangeTs = time.Now()
src/go/plugin/go.d/collector/portcheck/check_udp_port.go
+7 -7
@@ -26,15 +26,15 @@ type udpPort struct {
26 err error
27 }
28
29 -func (pc *PortCheck) checkUDPPort(port *udpPort) {
29 +func (c *Collector) checkUDPPort(port *udpPort) {
30 port.err = nil
31
32 - timeout := time.Duration(max(float64(100*time.Millisecond), float64(pc.Timeout.Duration())*0.7))
33 - addr := pc.address(port.number)
32 + timeout := time.Duration(max(float64(100*time.Millisecond), float64(c.Timeout.Duration())*0.7))
33 + addr := c.address(port.number)
34
35 - open, err := pc.scanUDP(addr, timeout)
35 + open, err := c.scanUDP(addr, timeout)
36 if err != nil {
37 - pc.Warningf("UDP port check failed for '%s': %v", addr, err)
37 + c.Warningf("UDP port check failed for '%s': %v", addr, err)
38 port.err = err
39 return
40 }
@@ -44,10 +44,10 @@ func (pc *PortCheck) checkUDPPort(port *udpPort) {
44 state = udpPortCheckStateClosed
45 }
46
47 - pc.setUDPPortCheckState(port, state)
47 + c.setUDPPortCheckState(port, state)
48 }
49
50 -func (pc *PortCheck) setUDPPortCheckState(port *udpPort, state string) {
50 +func (c *Collector) setUDPPortCheckState(port *udpPort, state string) {
51 if port.status != state {
52 port.status = state
53 port.statusChangeTs = time.Now()
src/go/plugin/go.d/collector/portcheck/collect.go
+18 -18
@@ -12,20 +12,20 @@ import (
12 "time"
13 )
14
15 -func (pc *PortCheck) collect() (map[string]int64, error) {
15 +func (c *Collector) collect() (map[string]int64, error) {
16 wg := &sync.WaitGroup{}
17
18 - for _, port := range pc.tcpPorts {
18 + for _, port := range c.tcpPorts {
19 wg.Add(1)
20 port := port
21 - go func() { defer wg.Done(); pc.checkTCPPort(port) }()
21 + go func() { defer wg.Done(); c.checkTCPPort(port) }()
22 }
23
24 - if pc.doUdpPorts {
25 - for _, port := range pc.udpPorts {
24 + if c.doUdpPorts {
25 + for _, port := range c.udpPorts {
26 wg.Add(1)
27 port := port
28 - go func() { defer wg.Done(); pc.checkUDPPort(port) }()
28 + go func() { defer wg.Done(); c.checkUDPPort(port) }()
29 }
30 }
31
@@ -35,10 +35,10 @@ func (pc *PortCheck) collect() (map[string]int64, error) {
35
36 now := time.Now()
37
38 - for _, p := range pc.tcpPorts {
39 - if !pc.seenTcpPorts[p.number] {
40 - pc.seenTcpPorts[p.number] = true
41 - pc.addTCPPortCharts(p)
38 + for _, p := range c.tcpPorts {
39 + if !c.seenTcpPorts[p.number] {
40 + c.seenTcpPorts[p.number] = true
41 + c.addTCPPortCharts(p)
42 }
43
44 px := fmt.Sprintf("tcp_port_%d_", p.number)
@@ -51,19 +51,19 @@ func (pc *PortCheck) collect() (map[string]int64, error) {
51 mx[px+p.status] = 1
52 }
53
54 - if pc.doUdpPorts {
55 - for _, p := range pc.udpPorts {
54 + if c.doUdpPorts {
55 + for _, p := range c.udpPorts {
56 if p.err != nil {
57 if isListenOpNotPermittedError(p.err) {
58 - pc.doUdpPorts = false
58 + c.doUdpPorts = false
59 break
60 }
61 continue
62 }
63
64 - if !pc.seenUdpPorts[p.number] {
65 - pc.seenUdpPorts[p.number] = true
66 - pc.addUDPPortCharts(p)
64 + if !c.seenUdpPorts[p.number] {
65 + c.seenUdpPorts[p.number] = true
66 + c.addUDPPortCharts(p)
67 }
68
69 px := fmt.Sprintf("udp_port_%d_", p.number)
@@ -78,9 +78,9 @@ func (pc *PortCheck) collect() (map[string]int64, error) {
78 return mx, nil
79 }
80
81 -func (pc *PortCheck) address(port int) string {
81 +func (c *Collector) address(port int) string {
82 // net.JoinHostPort expects literal IPv6 address, it adds []
83 - host := strings.Trim(pc.Host, "[]")
83 + host := strings.Trim(c.Host, "[]")
84 return net.JoinHostPort(host, strconv.Itoa(port))
85 }
86
src/go/plugin/go.d/collector/portcheck/collector.go renamed
+19 -19
@@ -27,8 +27,8 @@ func init() {
27 })
28 }
29
30 -func New() *PortCheck {
31 - return &PortCheck{
30 +func New() *Collector {
31 + return &Collector{
32 Config: Config{
33 Timeout: confopt.Duration(time.Second * 2),
34 },
@@ -52,7 +52,7 @@ type Config struct {
52 Timeout confopt.Duration `yaml:"timeout,omitempty" json:"timeout"`
53 }
54
55 -type PortCheck struct {
55 +type Collector struct {
56 module.Base
57 Config `yaml:",inline" json:""`
58
@@ -69,26 +69,26 @@ type PortCheck struct {
69 doUdpPorts bool
70 }
71
72 -func (pc *PortCheck) Configuration() any {
73 - return pc.Config
72 +func (c *Collector) Configuration() any {
73 + return c.Config
74 }
75
76 -func (pc *PortCheck) Init() error {
77 - if err := pc.validateConfig(); err != nil {
76 +func (c *Collector) Init() error {
77 + if err := c.validateConfig(); err != nil {
78 return fmt.Errorf("config validation: %v", err)
79 }
80
81 - pc.tcpPorts, pc.udpPorts = pc.initPorts()
81 + c.tcpPorts, c.udpPorts = c.initPorts()
82
83 - pc.Debugf("using host: %s", pc.Host)
84 - pc.Debugf("using ports: tcp %v udp %v", pc.Ports, pc.UDPPorts)
85 - pc.Debugf("using connection timeout: %s", pc.Timeout)
83 + c.Debugf("using host: %s", c.Host)
84 + c.Debugf("using ports: tcp %v udp %v", c.Ports, c.UDPPorts)
85 + c.Debugf("using connection timeout: %s", c.Timeout)
86
87 return nil
88 }
89
90 -func (pc *PortCheck) Check() error {
91 - mx, err := pc.collect()
90 +func (c *Collector) Check() error {
91 + mx, err := c.collect()
92 if err != nil {
93 return err
94 }
@@ -100,14 +100,14 @@ func (pc *PortCheck) Check() error {
100 return nil
101 }
102
103 -func (pc *PortCheck) Charts() *module.Charts {
104 - return pc.charts
103 +func (c *Collector) Charts() *module.Charts {
104 + return c.charts
105 }
106
107 -func (pc *PortCheck) Collect() map[string]int64 {
108 - mx, err := pc.collect()
107 +func (c *Collector) Collect() map[string]int64 {
108 + mx, err := c.collect()
109 if err != nil {
110 - pc.Error(err)
110 + c.Error(err)
111 }
112
113 if len(mx) == 0 {
@@ -117,4 +117,4 @@ func (pc *PortCheck) Collect() map[string]int64 {
117 return mx
118 }
119
120 -func (pc *PortCheck) Cleanup() {}
120 +func (c *Collector) Cleanup() {}
src/go/plugin/go.d/collector/portcheck/collector_test.go renamed
+45 -45
@@ -30,52 +30,52 @@ func Test_testDataIsValid(t *testing.T) {
30 }
31 }
32
33 -func TestPortCheck_ConfigurationSerialize(t *testing.T) {
34 - module.TestConfigurationSerialize(t, &PortCheck{}, dataConfigJSON, dataConfigYAML)
33 +func TestCollector_ConfigurationSerialize(t *testing.T) {
34 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
35 }
36
37 -func TestPortCheck_Init(t *testing.T) {
38 - job := New()
37 +func TestCollector_Init(t *testing.T) {
38 + collr := New()
39
40 - job.Host = "127.0.0.1"
41 - job.Ports = []int{39001, 39002}
42 - assert.NoError(t, job.Init())
43 - assert.Len(t, job.tcpPorts, 2)
40 + collr.Host = "127.0.0.1"
41 + collr.Ports = []int{39001, 39002}
42 + assert.NoError(t, collr.Init())
43 + assert.Len(t, collr.tcpPorts, 2)
44 }
45 -func TestPortCheck_InitNG(t *testing.T) {
46 - job := New()
47 -
48 - assert.Error(t, job.Init())
49 - job.Host = "127.0.0.1"
50 - assert.Error(t, job.Init())
51 - job.Ports = []int{39001, 39002}
52 - assert.NoError(t, job.Init())
45 +func TestCollector_InitNG(t *testing.T) {
46 + collr := New()
47 +
48 + assert.Error(t, collr.Init())
49 + collr.Host = "127.0.0.1"
50 + assert.Error(t, collr.Init())
51 + collr.Ports = []int{39001, 39002}
52 + assert.NoError(t, collr.Init())
53 }
54
55 -func TestPortCheck_Check(t *testing.T) {
55 +func TestCollector_Check(t *testing.T) {
56 assert.Error(t, New().Check())
57 }
58
59 -func TestPortCheck_Cleanup(t *testing.T) {
59 +func TestCollector_Cleanup(t *testing.T) {
60 New().Cleanup()
61 }
62
63 -func TestPortCheck_Charts(t *testing.T) {
64 - job := New()
65 - job.Ports = []int{1, 2}
66 - job.Host = "localhost"
67 - require.NoError(t, job.Init())
63 +func TestCollector_Charts(t *testing.T) {
64 + collr := New()
65 + collr.Ports = []int{1, 2}
66 + collr.Host = "localhost"
67 + require.NoError(t, collr.Init())
68 }
69
70 -func TestPortCheck_Collect(t *testing.T) {
71 - job := New()
70 +func TestCollector_Collect(t *testing.T) {
71 + collr := New()
72
73 - job.Host = "127.0.0.1"
74 - job.Ports = []int{39001, 39002}
75 - job.UpdateEvery = 5
76 - job.dialTCP = testDial(nil)
77 - require.NoError(t, job.Init())
78 - require.NoError(t, job.Check())
73 + collr.Host = "127.0.0.1"
74 + collr.Ports = []int{39001, 39002}
75 + collr.UpdateEvery = 5
76 + collr.dialTCP = testDial(nil)
77 + require.NoError(t, collr.Init())
78 + require.NoError(t, collr.Check())
79
80 copyLatencyDuration := func(dst, src map[string]int64) {
81 for k := range dst {
@@ -86,73 +86,73 @@ func TestPortCheck_Collect(t *testing.T) {
86 }
87
88 expected := map[string]int64{
89 - "tcp_port_39001_current_state_duration": int64(job.UpdateEvery * 2),
89 + "tcp_port_39001_current_state_duration": int64(collr.UpdateEvery * 2),
90 "tcp_port_39001_failed": 0,
91 "tcp_port_39001_latency": 0,
92 "tcp_port_39001_success": 1,
93 "tcp_port_39001_timeout": 0,
94 - "tcp_port_39002_current_state_duration": int64(job.UpdateEvery * 2),
94 + "tcp_port_39002_current_state_duration": int64(collr.UpdateEvery * 2),
95 "tcp_port_39002_failed": 0,
96 "tcp_port_39002_latency": 0,
97 "tcp_port_39002_success": 1,
98 "tcp_port_39002_timeout": 0,
99 }
100 - mx := job.Collect()
100 + mx := collr.Collect()
101 copyLatencyDuration(expected, mx)
102
103 assert.Equal(t, expected, mx)
104
105 expected = map[string]int64{
106 - "tcp_port_39001_current_state_duration": int64(job.UpdateEvery) * 3,
106 + "tcp_port_39001_current_state_duration": int64(collr.UpdateEvery) * 3,
107 "tcp_port_39001_failed": 0,
108 "tcp_port_39001_latency": 0,
109 "tcp_port_39001_success": 1,
110 "tcp_port_39001_timeout": 0,
111 - "tcp_port_39002_current_state_duration": int64(job.UpdateEvery) * 3,
111 + "tcp_port_39002_current_state_duration": int64(collr.UpdateEvery) * 3,
112 "tcp_port_39002_failed": 0,
113 "tcp_port_39002_latency": 0,
114 "tcp_port_39002_success": 1,
115 "tcp_port_39002_timeout": 0,
116 }
117 - mx = job.Collect()
117 + mx = collr.Collect()
118 copyLatencyDuration(expected, mx)
119
120 assert.Equal(t, expected, mx)
121
122 - job.dialTCP = testDial(errors.New("checkStateFailed"))
122 + collr.dialTCP = testDial(errors.New("checkStateFailed"))
123
124 expected = map[string]int64{
125 - "tcp_port_39001_current_state_duration": int64(job.UpdateEvery),
125 + "tcp_port_39001_current_state_duration": int64(collr.UpdateEvery),
126 "tcp_port_39001_failed": 1,
127 "tcp_port_39001_latency": 0,
128 "tcp_port_39001_success": 0,
129 "tcp_port_39001_timeout": 0,
130 - "tcp_port_39002_current_state_duration": int64(job.UpdateEvery),
130 + "tcp_port_39002_current_state_duration": int64(collr.UpdateEvery),
131 "tcp_port_39002_failed": 1,
132 "tcp_port_39002_latency": 0,
133 "tcp_port_39002_success": 0,
134 "tcp_port_39002_timeout": 0,
135 }
136 - mx = job.Collect()
136 + mx = collr.Collect()
137 copyLatencyDuration(expected, mx)
138
139 assert.Equal(t, expected, mx)
140
141 - job.dialTCP = testDial(timeoutError{})
141 + collr.dialTCP = testDial(timeoutError{})
142
143 expected = map[string]int64{
144 - "tcp_port_39001_current_state_duration": int64(job.UpdateEvery),
144 + "tcp_port_39001_current_state_duration": int64(collr.UpdateEvery),
145 "tcp_port_39001_failed": 0,
146 "tcp_port_39001_latency": 0,
147 "tcp_port_39001_success": 0,
148 "tcp_port_39001_timeout": 1,
149 - "tcp_port_39002_current_state_duration": int64(job.UpdateEvery),
149 + "tcp_port_39002_current_state_duration": int64(collr.UpdateEvery),
150 "tcp_port_39002_latency": 0,
151 "tcp_port_39002_success": 0,
152 "tcp_port_39002_timeout": 1,
153 "tcp_port_39002_failed": 0,
154 }
155 - mx = job.Collect()
155 + mx = collr.Collect()
156 copyLatencyDuration(expected, mx)
157
158 assert.Equal(t, expected, mx)
src/go/plugin/go.d/collector/portcheck/init.go
+6 -6
@@ -10,21 +10,21 @@ import (
10
11 type dialTCPFunc func(network, address string, timeout time.Duration) (net.Conn, error)
12
13 -func (pc *PortCheck) validateConfig() error {
14 - if pc.Host == "" {
13 +func (c *Collector) validateConfig() error {
14 + if c.Host == "" {
15 return errors.New("missing required parameter: 'host' must be specified")
16 }
17 - if len(pc.Ports) == 0 && len(pc.UDPPorts) == 0 {
17 + if len(c.Ports) == 0 && len(c.UDPPorts) == 0 {
18 return errors.New("missing required parameters: at least one of 'ports' (TCP) or 'udp_ports' (UDP) must be specified")
19 }
20 return nil
21 }
22
23 -func (pc *PortCheck) initPorts() (tcpPorts []*tcpPort, udpPorts []*udpPort) {
24 - for _, p := range pc.Ports {
23 +func (c *Collector) initPorts() (tcpPorts []*tcpPort, udpPorts []*udpPort) {
24 + for _, p := range c.Ports {
25 tcpPorts = append(tcpPorts, &tcpPort{number: p})
26 }
27 - for _, p := range pc.UDPPorts {
27 + for _, p := range c.UDPPorts {
28 udpPorts = append(udpPorts, &udpPort{number: p})
29 }
30
src/go/plugin/go.d/collector/postfix/collect.go
+2 -2
@@ -16,8 +16,8 @@ type postqueueStats struct {
16 requests int64
17 }
18
19 -func (p *Postfix) collect() (map[string]int64, error) {
20 - bs, err := p.exec.list()
19 +func (c *Collector) collect() (map[string]int64, error) {
20 + bs, err := c.exec.list()
21 if err != nil {
22 return nil, err
23 }
src/go/plugin/go.d/collector/postfix/collector.go renamed
+22 -27
@@ -26,8 +26,8 @@ func init() {
26 })
27 }
28
29 -func New() *Postfix {
30 - return &Postfix{
29 +func New() *Collector {
30 + return &Collector{
31 Config: Config{
32 BinaryPath: "/usr/sbin/postqueue",
33 Timeout: confopt.Duration(time.Second * 2),
@@ -42,40 +42,35 @@ type Config struct {
42 BinaryPath string `yaml:"binary_path,omitempty" json:"binary_path"`
43 }
44
45 -type (
46 - Postfix struct {
47 - module.Base
48 - Config `yaml:",inline" json:""`
45 +type Collector struct {
46 + module.Base
47 + Config `yaml:",inline" json:""`
48
50 - charts *module.Charts
49 + charts *module.Charts
50
52 - exec postqueueBinary
53 - }
54 - postqueueBinary interface {
55 - list() ([]byte, error)
56 - }
57 -)
51 + exec postqueueBinary
52 +}
53
59 -func (p *Postfix) Configuration() any {
60 - return p.Config
54 +func (c *Collector) Configuration() any {
55 + return c.Config
56 }
57
63 -func (p *Postfix) Init() error {
64 - if err := p.validateConfig(); err != nil {
58 +func (c *Collector) Init() error {
59 + if err := c.validateConfig(); err != nil {
60 return fmt.Errorf("config validation: %s", err)
61 }
62
68 - pq, err := p.initPostqueueExec()
63 + pq, err := c.initPostqueueExec()
64 if err != nil {
65 return fmt.Errorf("postqueue exec initialization: %v", err)
66 }
72 - p.exec = pq
67 + c.exec = pq
68
69 return nil
70 }
71
77 -func (p *Postfix) Check() error {
78 - mx, err := p.collect()
72 +func (c *Collector) Check() error {
73 + mx, err := c.collect()
74 if err != nil {
75 return err
76 }
@@ -87,14 +82,14 @@ func (p *Postfix) Check() error {
82 return nil
83 }
84
90 -func (p *Postfix) Charts() *module.Charts {
91 - return p.charts
85 +func (c *Collector) Charts() *module.Charts {
86 + return c.charts
87 }
88
94 -func (p *Postfix) Collect() map[string]int64 {
95 - mx, err := p.collect()
89 +func (c *Collector) Collect() map[string]int64 {
90 + mx, err := c.collect()
91 if err != nil {
97 - p.Error(err)
92 + c.Error(err)
93 }
94
95 if len(mx) == 0 {
@@ -104,4 +99,4 @@ func (p *Postfix) Collect() map[string]int64 {
99 return mx
100 }
101
107 -func (p *Postfix) Cleanup() {}
102 +func (c *Collector) Cleanup() {}
src/go/plugin/go.d/collector/postfix/collector_test.go renamed
+24 -24
@@ -30,11 +30,11 @@ func Test_testDataIsValid(t *testing.T) {
30 }
31 }
32
33 -func TestPostfix_Configuration(t *testing.T) {
34 - module.TestConfigurationSerialize(t, &Postfix{}, dataConfigJSON, dataConfigYAML)
33 +func TestCollector_Configuration(t *testing.T) {
34 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
35 }
36
37 -func TestPostfix_Init(t *testing.T) {
37 +func TestCollector_Init(t *testing.T) {
38 tests := map[string]struct {
39 config Config
40 wantFail bool
@@ -55,29 +55,29 @@ func TestPostfix_Init(t *testing.T) {
55
56 for name, test := range tests {
57 t.Run(name, func(t *testing.T) {
58 - pf := New()
59 - pf.Config = test.config
58 + collr := New()
59 + collr.Config = test.config
60
61 if test.wantFail {
62 - assert.Error(t, pf.Init())
62 + assert.Error(t, collr.Init())
63 } else {
64 - assert.NoError(t, pf.Init())
64 + assert.NoError(t, collr.Init())
65 }
66 })
67 }
68 }
69
70 -func TestPostfix_Cleanup(t *testing.T) {
70 +func TestCollector_Cleanup(t *testing.T) {
71 tests := map[string]struct {
72 - prepare func() *Postfix
72 + prepare func() *Collector
73 }{
74 "not initialized exec": {
75 - prepare: func() *Postfix {
75 + prepare: func() *Collector {
76 return New()
77 },
78 },
79 "after check": {
80 - prepare: func() *Postfix {
80 + prepare: func() *Collector {
81 pf := New()
82 pf.exec = prepareMockOK()
83 _ = pf.Check()
@@ -85,7 +85,7 @@ func TestPostfix_Cleanup(t *testing.T) {
85 },
86 },
87 "after collect": {
88 - prepare: func() *Postfix {
88 + prepare: func() *Collector {
89 pf := New()
90 pf.exec = prepareMockOK()
91 _ = pf.Collect()
@@ -96,18 +96,18 @@ func TestPostfix_Cleanup(t *testing.T) {
96
97 for name, test := range tests {
98 t.Run(name, func(t *testing.T) {
99 - pf := test.prepare()
99 + collr := test.prepare()
100
101 - assert.NotPanics(t, pf.Cleanup)
101 + assert.NotPanics(t, collr.Cleanup)
102 })
103 }
104 }
105
106 -func TestPostfix_Charts(t *testing.T) {
106 +func TestCollector_Charts(t *testing.T) {
107 assert.NotNil(t, New().Charts())
108 }
109
110 -func TestPostfix_Check(t *testing.T) {
110 +func TestCollector_Check(t *testing.T) {
111 tests := map[string]struct {
112 prepareMock func() *mockPostqueueExec
113 wantFail bool
@@ -136,20 +136,20 @@ func TestPostfix_Check(t *testing.T) {
136
137 for name, test := range tests {
138 t.Run(name, func(t *testing.T) {
139 - pf := New()
139 + collr := New()
140 mock := test.prepareMock()
141 - pf.exec = mock
141 + collr.exec = mock
142
143 if test.wantFail {
144 - assert.Error(t, pf.Check())
144 + assert.Error(t, collr.Check())
145 } else {
146 - assert.NoError(t, pf.Check())
146 + assert.NoError(t, collr.Check())
147 }
148 })
149 }
150 }
151
152 -func TestPostfix_Collect(t *testing.T) {
152 +func TestCollector_Collect(t *testing.T) {
153 tests := map[string]struct {
154 prepareMock func() *mockPostqueueExec
155 wantMetrics map[string]int64
@@ -184,11 +184,11 @@ func TestPostfix_Collect(t *testing.T) {
184
185 for name, test := range tests {
186 t.Run(name, func(t *testing.T) {
187 - pf := New()
187 + collr := New()
188 mock := test.prepareMock()
189 - pf.exec = mock
189 + collr.exec = mock
190
191 - mx := pf.Collect()
191 + mx := collr.Collect()
192
193 assert.Equal(t, test.wantMetrics, mx)
194 })
src/go/plugin/go.d/collector/postfix/exec.go
+4
@@ -11,6 +11,10 @@ import (
11 "github.com/netdata/netdata/go/plugins/logger"
12 )
13
14 +type postqueueBinary interface {
15 + list() ([]byte, error)
16 +}
17 +
18 func newPostqueueExec(binPath string, timeout time.Duration) *postqueueExec {
19 return &postqueueExec{
20 binPath: binPath,
src/go/plugin/go.d/collector/postfix/init.go
+6 -6
@@ -9,15 +9,15 @@ import (
9 "strings"
10 )
11
12 -func (p *Postfix) validateConfig() error {
13 - if p.BinaryPath == "" {
12 +func (c *Collector) validateConfig() error {
13 + if c.BinaryPath == "" {
14 return errors.New("no postqueue binary path specified")
15 }
16 return nil
17 }
18
19 -func (p *Postfix) initPostqueueExec() (postqueueBinary, error) {
20 - binPath := p.BinaryPath
19 +func (c *Collector) initPostqueueExec() (postqueueBinary, error) {
20 + binPath := c.BinaryPath
21
22 if !strings.HasPrefix(binPath, "/") {
23 path, err := exec.LookPath(binPath)
@@ -31,8 +31,8 @@ func (p *Postfix) initPostqueueExec() (postqueueBinary, error) {
31 return nil, err
32 }
33
34 - pq := newPostqueueExec(binPath, p.Timeout.Duration())
35 - pq.Logger = p.Logger
34 + pq := newPostqueueExec(binPath, c.Timeout.Duration())
35 + pq.Logger = c.Logger
36
37 return pq, nil
38 }
src/go/plugin/go.d/collector/postgres/charts.go
+65 -65
@@ -124,11 +124,11 @@ var walFilesCharts = module.Charts{
124 walArchivingFilesCountChart.Copy(),
125 }
126
127 -func (p *Postgres) addWALFilesCharts() {
127 +func (c *Collector) addWALFilesCharts() {
128 charts := walFilesCharts.Copy()
129
130 - if err := p.Charts().Add(*charts...); err != nil {
131 - p.Warning(err)
130 + if err := c.Charts().Add(*charts...); err != nil {
131 + c.Warning(err)
132 }
133 }
134
@@ -465,33 +465,33 @@ func newRunningTimeHistogramChart(tmpl module.Chart, prefix string, buckets []fl
465 return chart, nil
466 }
467
468 -func (p *Postgres) addTransactionsRunTimeHistogramChart() {
468 +func (c *Collector) addTransactionsRunTimeHistogramChart() {
469 chart, err := newRunningTimeHistogramChart(
470 transactionsDurationChartTmpl,
471 "transaction_running_time",
472 - p.XactTimeHistogram,
472 + c.XactTimeHistogram,
473 )
474 if err != nil {
475 - p.Warning(err)
475 + c.Warning(err)
476 return
477 }
478 - if err := p.Charts().Add(chart); err != nil {
479 - p.Warning(err)
478 + if err := c.Charts().Add(chart); err != nil {
479 + c.Warning(err)
480 }
481 }
482
483 -func (p *Postgres) addQueriesRunTimeHistogramChart() {
483 +func (c *Collector) addQueriesRunTimeHistogramChart() {
484 chart, err := newRunningTimeHistogramChart(
485 queriesDurationChartTmpl,
486 "query_running_time",
487 - p.QueryTimeHistogram,
487 + c.QueryTimeHistogram,
488 )
489 if err != nil {
490 - p.Warning(err)
490 + c.Warning(err)
491 return
492 }
493 - if err := p.Charts().Add(chart); err != nil {
494 - p.Warning(err)
493 + if err := c.Charts().Add(chart); err != nil {
494 + c.Warning(err)
495 }
496 }
497
@@ -543,16 +543,16 @@ func newReplicationStandbyAppCharts(app string) *module.Charts {
543 return charts
544 }
545
546 -func (p *Postgres) addNewReplicationStandbyAppCharts(app string) {
546 +func (c *Collector) addNewReplicationStandbyAppCharts(app string) {
547 charts := newReplicationStandbyAppCharts(app)
548 - if err := p.Charts().Add(*charts...); err != nil {
549 - p.Warning(err)
548 + if err := c.Charts().Add(*charts...); err != nil {
549 + c.Warning(err)
550 }
551 }
552
553 -func (p *Postgres) removeReplicationStandbyAppCharts(app string) {
553 +func (c *Collector) removeReplicationStandbyAppCharts(app string) {
554 prefix := fmt.Sprintf("replication_standby_app_%s_", app)
555 - for _, c := range *p.Charts() {
555 + for _, c := range *c.Charts() {
556 if strings.HasPrefix(c.ID, prefix) {
557 c.MarkRemove()
558 c.MarkNotCreated()
@@ -592,16 +592,16 @@ func newReplicationSlotCharts(slot string) *module.Charts {
592 return charts
593 }
594
595 -func (p *Postgres) addNewReplicationSlotCharts(slot string) {
595 +func (c *Collector) addNewReplicationSlotCharts(slot string) {
596 charts := newReplicationSlotCharts(slot)
597 - if err := p.Charts().Add(*charts...); err != nil {
598 - p.Warning(err)
597 + if err := c.Charts().Add(*charts...); err != nil {
598 + c.Warning(err)
599 }
600 }
601
602 -func (p *Postgres) removeReplicationSlotCharts(slot string) {
602 +func (c *Collector) removeReplicationSlotCharts(slot string) {
603 prefix := fmt.Sprintf("replication_slot_%s_", slot)
604 - for _, c := range *p.Charts() {
604 + for _, c := range *c.Charts() {
605 if strings.HasPrefix(c.ID, prefix) {
606 c.MarkRemove()
607 c.MarkNotCreated()
@@ -844,15 +844,15 @@ var (
844 }
845 )
846
847 -func (p *Postgres) addDBConflictsCharts(db *dbMetrics) {
847 +func (c *Collector) addDBConflictsCharts(db *dbMetrics) {
848 tmpl := module.Charts{
849 dbConflictsRateChartTmpl.Copy(),
850 dbConflictsReasonRateChartTmpl.Copy(),
851 }
852 charts := newDatabaseCharts(tmpl.Copy(), db)
853
854 - if err := p.Charts().Add(*charts...); err != nil {
855 - p.Warning(err)
854 + if err := c.Charts().Add(*charts...); err != nil {
855 + c.Warning(err)
856 }
857 }
858
@@ -870,21 +870,21 @@ func newDatabaseCharts(tmpl *module.Charts, db *dbMetrics) *module.Charts {
870 return charts
871 }
872
873 -func (p *Postgres) addNewDatabaseCharts(db *dbMetrics) {
873 +func (c *Collector) addNewDatabaseCharts(db *dbMetrics) {
874 charts := newDatabaseCharts(dbChartsTmpl.Copy(), db)
875
876 if db.size == nil {
877 _ = charts.Remove(fmt.Sprintf(dbSizeChartTmpl.ID, db.name))
878 }
879
880 - if err := p.Charts().Add(*charts...); err != nil {
881 - p.Warning(err)
880 + if err := c.Charts().Add(*charts...); err != nil {
881 + c.Warning(err)
882 }
883 }
884
885 -func (p *Postgres) removeDatabaseCharts(db *dbMetrics) {
885 +func (c *Collector) removeDatabaseCharts(db *dbMetrics) {
886 prefix := fmt.Sprintf("db_%s_", db.name)
887 - for _, c := range *p.Charts() {
887 + for _, c := range *c.Charts() {
888 if strings.HasPrefix(c.ID, prefix) {
889 c.MarkRemove()
890 c.MarkNotCreated()
@@ -1209,92 +1209,92 @@ func newTableChart(chart *module.Chart, tbl *tableMetrics) *module.Chart {
1209 return chart
1210 }
1211
1212 -func (p *Postgres) addNewTableCharts(tbl *tableMetrics) {
1212 +func (c *Collector) addNewTableCharts(tbl *tableMetrics) {
1213 charts := newTableCharts(tbl)
1214 - if err := p.Charts().Add(*charts...); err != nil {
1215 - p.Warning(err)
1214 + if err := c.Charts().Add(*charts...); err != nil {
1215 + c.Warning(err)
1216 }
1217 }
1218
1219 -func (p *Postgres) addTableLastAutoVacuumAgoChart(tbl *tableMetrics) {
1219 +func (c *Collector) addTableLastAutoVacuumAgoChart(tbl *tableMetrics) {
1220 chart := newTableChart(tableAutoVacuumSinceTimeChartTmpl.Copy(), tbl)
1221
1222 - if err := p.Charts().Add(chart); err != nil {
1223 - p.Warning(err)
1222 + if err := c.Charts().Add(chart); err != nil {
1223 + c.Warning(err)
1224 }
1225 }
1226
1227 -func (p *Postgres) addTableLastVacuumAgoChart(tbl *tableMetrics) {
1227 +func (c *Collector) addTableLastVacuumAgoChart(tbl *tableMetrics) {
1228 chart := newTableChart(tableVacuumSinceTimeChartTmpl.Copy(), tbl)
1229
1230 - if err := p.Charts().Add(chart); err != nil {
1231 - p.Warning(err)
1230 + if err := c.Charts().Add(chart); err != nil {
1231 + c.Warning(err)
1232 }
1233 }
1234
1235 -func (p *Postgres) addTableLastAutoAnalyzeAgoChart(tbl *tableMetrics) {
1235 +func (c *Collector) addTableLastAutoAnalyzeAgoChart(tbl *tableMetrics) {
1236 chart := newTableChart(tableAutoAnalyzeSinceTimeChartTmpl.Copy(), tbl)
1237
1238 - if err := p.Charts().Add(chart); err != nil {
1239 - p.Warning(err)
1238 + if err := c.Charts().Add(chart); err != nil {
1239 + c.Warning(err)
1240 }
1241 }
1242
1243 -func (p *Postgres) addTableLastAnalyzeAgoChart(tbl *tableMetrics) {
1243 +func (c *Collector) addTableLastAnalyzeAgoChart(tbl *tableMetrics) {
1244 chart := newTableChart(tableAnalyzeSinceTimeChartTmpl.Copy(), tbl)
1245
1246 - if err := p.Charts().Add(chart); err != nil {
1247 - p.Warning(err)
1246 + if err := c.Charts().Add(chart); err != nil {
1247 + c.Warning(err)
1248 }
1249 }
1250
1251 -func (p *Postgres) addTableIOChartsCharts(tbl *tableMetrics) {
1251 +func (c *Collector) addTableIOChartsCharts(tbl *tableMetrics) {
1252 charts := module.Charts{
1253 newTableChart(tableCacheIORatioChartTmpl.Copy(), tbl),
1254 newTableChart(tableIORateChartTmpl.Copy(), tbl),
1255 }
1256
1257 - if err := p.Charts().Add(charts...); err != nil {
1258 - p.Warning(err)
1257 + if err := c.Charts().Add(charts...); err != nil {
1258 + c.Warning(err)
1259 }
1260 }
1261
1262 -func (p *Postgres) addTableIndexIOCharts(tbl *tableMetrics) {
1262 +func (c *Collector) addTableIndexIOCharts(tbl *tableMetrics) {
1263 charts := module.Charts{
1264 newTableChart(tableIndexCacheIORatioChartTmpl.Copy(), tbl),
1265 newTableChart(tableIndexIORateChartTmpl.Copy(), tbl),
1266 }
1267
1268 - if err := p.Charts().Add(charts...); err != nil {
1269 - p.Warning(err)
1268 + if err := c.Charts().Add(charts...); err != nil {
1269 + c.Warning(err)
1270 }
1271 }
1272
1273 -func (p *Postgres) addTableTOASTIOCharts(tbl *tableMetrics) {
1273 +func (c *Collector) addTableTOASTIOCharts(tbl *tableMetrics) {
1274 charts := module.Charts{
1275 newTableChart(tableTOASCacheIORatioChartTmpl.Copy(), tbl),
1276 newTableChart(tableTOASTIORateChartTmpl.Copy(), tbl),
1277 }
1278
1279 - if err := p.Charts().Add(charts...); err != nil {
1280 - p.Warning(err)
1279 + if err := c.Charts().Add(charts...); err != nil {
1280 + c.Warning(err)
1281 }
1282 }
1283
1284 -func (p *Postgres) addTableTOASTIndexIOCharts(tbl *tableMetrics) {
1284 +func (c *Collector) addTableTOASTIndexIOCharts(tbl *tableMetrics) {
1285 charts := module.Charts{
1286 newTableChart(tableTOASTIndexCacheIORatioChartTmpl.Copy(), tbl),
1287 newTableChart(tableTOASTIndexIORateChartTmpl.Copy(), tbl),
1288 }
1289
1290 - if err := p.Charts().Add(charts...); err != nil {
1291 - p.Warning(err)
1290 + if err := c.Charts().Add(charts...); err != nil {
1291 + c.Warning(err)
1292 }
1293 }
1294
1295 -func (p *Postgres) removeTableCharts(tbl *tableMetrics) {
1295 +func (c *Collector) removeTableCharts(tbl *tableMetrics) {
1296 prefix := fmt.Sprintf("table_%s_db_%s_schema_%s", tbl.name, tbl.db, tbl.schema)
1297 - for _, c := range *p.Charts() {
1297 + for _, c := range *c.Charts() {
1298 if strings.HasPrefix(c.ID, prefix) {
1299 c.MarkRemove()
1300 c.MarkNotCreated()
@@ -1359,7 +1359,7 @@ var (
1359 }
1360 )
1361
1362 -func (p *Postgres) addNewIndexCharts(idx *indexMetrics) {
1362 +func (c *Collector) addNewIndexCharts(idx *indexMetrics) {
1363 charts := indexChartsTmpl.Copy()
1364
1365 if idx.bloatSize == nil {
@@ -1384,14 +1384,14 @@ func (p *Postgres) addNewIndexCharts(idx *indexMetrics) {
1384 }
1385 }
1386
1387 - if err := p.Charts().Add(*charts...); err != nil {
1388 - p.Warning(err)
1387 + if err := c.Charts().Add(*charts...); err != nil {
1388 + c.Warning(err)
1389 }
1390 }
1391
1392 -func (p *Postgres) removeIndexCharts(idx *indexMetrics) {
1392 +func (c *Collector) removeIndexCharts(idx *indexMetrics) {
1393 prefix := fmt.Sprintf("index_%s_table_%s_db_%s_schema_%s", idx.name, idx.table, idx.db, idx.schema)
1394 - for _, c := range *p.Charts() {
1394 + for _, c := range *c.Charts() {
1395 if strings.HasPrefix(c.ID, prefix) {
1396 c.MarkRemove()
1397 c.MarkNotCreated()
src/go/plugin/go.d/collector/postgres/collect.go
+71 -71
@@ -21,134 +21,134 @@ const (
21 pgVersion17 = 17_00_00
22 )
23
24 -func (p *Postgres) collect() (map[string]int64, error) {
25 - if p.db == nil {
26 - db, err := p.openPrimaryConnection()
24 +func (c *Collector) collect() (map[string]int64, error) {
25 + if c.db == nil {
26 + db, err := c.openPrimaryConnection()
27 if err != nil {
28 return nil, err
29 }
30 - p.db = db
30 + c.db = db
31 }
32
33 - if p.pgVersion == 0 {
34 - ver, err := p.doQueryServerVersion()
33 + if c.pgVersion == 0 {
34 + ver, err := c.doQueryServerVersion()
35 if err != nil {
36 return nil, fmt.Errorf("querying server version error: %v", err)
37 }
38 - p.pgVersion = ver
39 - p.Debugf("connected to PostgreSQL v%d", p.pgVersion)
38 + c.pgVersion = ver
39 + c.Debugf("connected to PostgreSQL v%d", c.pgVersion)
40 }
41
42 - if p.superUser == nil {
43 - v, err := p.doQueryIsSuperUser()
42 + if c.superUser == nil {
43 + v, err := c.doQueryIsSuperUser()
44 if err != nil {
45 return nil, fmt.Errorf("querying is super user error: %v", err)
46 }
47 - p.superUser = &v
48 - p.Debugf("connected as super user: %v", *p.superUser)
47 + c.superUser = &v
48 + c.Debugf("connected as super user: %v", *c.superUser)
49 }
50
51 - if p.pgIsInRecovery == nil {
52 - v, err := p.doQueryPGIsInRecovery()
51 + if c.pgIsInRecovery == nil {
52 + v, err := c.doQueryPGIsInRecovery()
53 if err != nil {
54 return nil, fmt.Errorf("querying recovery status error: %v", err)
55 }
56 - p.pgIsInRecovery = &v
57 - p.Debugf("the instance is in recovery mode: %v", *p.pgIsInRecovery)
56 + c.pgIsInRecovery = &v
57 + c.Debugf("the instance is in recovery mode: %v", *c.pgIsInRecovery)
58 }
59
60 now := time.Now()
61
62 - if now.Sub(p.recheckSettingsTime) > p.recheckSettingsEvery {
63 - p.recheckSettingsTime = now
64 - maxConn, err := p.doQuerySettingsMaxConnections()
62 + if now.Sub(c.recheckSettingsTime) > c.recheckSettingsEvery {
63 + c.recheckSettingsTime = now
64 + maxConn, err := c.doQuerySettingsMaxConnections()
65 if err != nil {
66 return nil, fmt.Errorf("querying settings max connections error: %v", err)
67 }
68 - p.mx.maxConnections = maxConn
68 + c.mx.maxConnections = maxConn
69
70 - maxLocks, err := p.doQuerySettingsMaxLocksHeld()
70 + maxLocks, err := c.doQuerySettingsMaxLocksHeld()
71 if err != nil {
72 return nil, fmt.Errorf("querying settings max locks held error: %v", err)
73 }
74 - p.mx.maxLocksHeld = maxLocks
74 + c.mx.maxLocksHeld = maxLocks
75 }
76
77 - p.resetMetrics()
77 + c.resetMetrics()
78
79 - if p.pgVersion >= pgVersion10 {
79 + if c.pgVersion >= pgVersion10 {
80 // need 'backend_type' in pg_stat_activity
81 - p.addXactQueryRunningTimeChartsOnce.Do(func() {
82 - p.addTransactionsRunTimeHistogramChart()
83 - p.addQueriesRunTimeHistogramChart()
81 + c.addXactQueryRunningTimeChartsOnce.Do(func() {
82 + c.addTransactionsRunTimeHistogramChart()
83 + c.addQueriesRunTimeHistogramChart()
84 })
85 }
86 - if p.isSuperUser() {
87 - p.addWALFilesChartsOnce.Do(p.addWALFilesCharts)
86 + if c.isSuperUser() {
87 + c.addWALFilesChartsOnce.Do(c.addWALFilesCharts)
88 }
89
90 - if err := p.doQueryGlobalMetrics(); err != nil {
90 + if err := c.doQueryGlobalMetrics(); err != nil {
91 return nil, err
92 }
93 - if err := p.doQueryReplicationMetrics(); err != nil {
93 + if err := c.doQueryReplicationMetrics(); err != nil {
94 return nil, err
95 }
96 - if err := p.doQueryDatabasesMetrics(); err != nil {
96 + if err := c.doQueryDatabasesMetrics(); err != nil {
97 return nil, err
98 }
99 - if p.dbSr != nil {
100 - if err := p.doQueryQueryableDatabases(); err != nil {
99 + if c.dbSr != nil {
100 + if err := c.doQueryQueryableDatabases(); err != nil {
101 return nil, err
102 }
103 }
104 - if err := p.doQueryTablesMetrics(); err != nil {
104 + if err := c.doQueryTablesMetrics(); err != nil {
105 return nil, err
106 }
107 - if err := p.doQueryIndexesMetrics(); err != nil {
107 + if err := c.doQueryIndexesMetrics(); err != nil {
108 return nil, err
109 }
110
111 - if now.Sub(p.doSlowTime) > p.doSlowEvery {
112 - p.doSlowTime = now
113 - if err := p.doQueryBloat(); err != nil {
111 + if now.Sub(c.doSlowTime) > c.doSlowEvery {
112 + c.doSlowTime = now
113 + if err := c.doQueryBloat(); err != nil {
114 return nil, err
115 }
116 - if err := p.doQueryColumns(); err != nil {
116 + if err := c.doQueryColumns(); err != nil {
117 return nil, err
118 }
119 }
120
121 mx := make(map[string]int64)
122 - p.collectMetrics(mx)
122 + c.collectMetrics(mx)
123
124 return mx, nil
125 }
126
127 -func (p *Postgres) openPrimaryConnection() (*sql.DB, error) {
128 - db, err := sql.Open("pgx", p.DSN)
127 +func (c *Collector) openPrimaryConnection() (*sql.DB, error) {
128 + db, err := sql.Open("pgx", c.DSN)
129 if err != nil {
130 - return nil, fmt.Errorf("error on opening a connection with the Postgres database [%s]: %v", p.DSN, err)
130 + return nil, fmt.Errorf("error on opening a connection with the Postgres database [%s]: %v", c.DSN, err)
131 }
132
133 db.SetMaxOpenConns(1)
134 db.SetMaxIdleConns(1)
135 db.SetConnMaxLifetime(10 * time.Minute)
136
137 - ctx, cancel := context.WithTimeout(context.Background(), p.Timeout.Duration())
137 + ctx, cancel := context.WithTimeout(context.Background(), c.Timeout.Duration())
138 defer cancel()
139
140 if err := db.PingContext(ctx); err != nil {
141 _ = db.Close()
142 - return nil, fmt.Errorf("error on pinging the Postgres database [%s]: %v", p.DSN, err)
142 + return nil, fmt.Errorf("error on pinging the Postgres database [%s]: %v", c.DSN, err)
143 }
144
145 return db, nil
146 }
147
148 -func (p *Postgres) openSecondaryConnection(dbname string) (*sql.DB, string, error) {
149 - cfg, err := pgx.ParseConfig(p.DSN)
148 +func (c *Collector) openSecondaryConnection(dbname string) (*sql.DB, string, error) {
149 + cfg, err := pgx.ParseConfig(c.DSN)
150 if err != nil {
151 - return nil, "", fmt.Errorf("error on parsing DSN [%s]: %v", p.DSN, err)
151 + return nil, "", fmt.Errorf("error on parsing DSN [%s]: %v", c.DSN, err)
152 }
153
154 cfg.Database = dbname
@@ -164,7 +164,7 @@ func (p *Postgres) openSecondaryConnection(dbname string) (*sql.DB, string, erro
164 db.SetMaxIdleConns(1)
165 db.SetConnMaxLifetime(10 * time.Minute)
166
167 - ctx, cancel := context.WithTimeout(context.Background(), p.Timeout.Duration())
167 + ctx, cancel := context.WithTimeout(context.Background(), c.Timeout.Duration())
168 defer cancel()
169
170 if err := db.PingContext(ctx); err != nil {
@@ -176,65 +176,65 @@ func (p *Postgres) openSecondaryConnection(dbname string) (*sql.DB, string, erro
176 return db, connStr, nil
177 }
178
179 -func (p *Postgres) isSuperUser() bool { return p.superUser != nil && *p.superUser }
179 +func (c *Collector) isSuperUser() bool { return c.superUser != nil && *c.superUser }
180
181 -func (p *Postgres) isPGInRecovery() bool { return p.pgIsInRecovery != nil && *p.pgIsInRecovery }
181 +func (c *Collector) isPGInRecovery() bool { return c.pgIsInRecovery != nil && *c.pgIsInRecovery }
182
183 -func (p *Postgres) getDBMetrics(name string) *dbMetrics {
184 - db, ok := p.mx.dbs[name]
183 +func (c *Collector) getDBMetrics(name string) *dbMetrics {
184 + db, ok := c.mx.dbs[name]
185 if !ok {
186 db = &dbMetrics{name: name}
187 - p.mx.dbs[name] = db
187 + c.mx.dbs[name] = db
188 }
189 return db
190 }
191
192 -func (p *Postgres) getTableMetrics(name, db, schema string) *tableMetrics {
192 +func (c *Collector) getTableMetrics(name, db, schema string) *tableMetrics {
193 key := name + "_" + db + "_" + schema
194 - m, ok := p.mx.tables[key]
194 + m, ok := c.mx.tables[key]
195 if !ok {
196 m = &tableMetrics{db: db, schema: schema, name: name}
197 - p.mx.tables[key] = m
197 + c.mx.tables[key] = m
198 }
199 return m
200 }
201
202 -func (p *Postgres) hasTableMetrics(name, db, schema string) bool {
202 +func (c *Collector) hasTableMetrics(name, db, schema string) bool {
203 key := name + "_" + db + "_" + schema
204 - _, ok := p.mx.tables[key]
204 + _, ok := c.mx.tables[key]
205 return ok
206 }
207
208 -func (p *Postgres) getIndexMetrics(name, table, db, schema string) *indexMetrics {
208 +func (c *Collector) getIndexMetrics(name, table, db, schema string) *indexMetrics {
209 key := name + "_" + table + "_" + db + "_" + schema
210 - m, ok := p.mx.indexes[key]
210 + m, ok := c.mx.indexes[key]
211 if !ok {
212 m = &indexMetrics{name: name, db: db, schema: schema, table: table}
213 - p.mx.indexes[key] = m
213 + c.mx.indexes[key] = m
214 }
215 return m
216 }
217
218 -func (p *Postgres) hasIndexMetrics(name, table, db, schema string) bool {
218 +func (c *Collector) hasIndexMetrics(name, table, db, schema string) bool {
219 key := name + "_" + table + "_" + db + "_" + schema
220 - _, ok := p.mx.indexes[key]
220 + _, ok := c.mx.indexes[key]
221 return ok
222 }
223
224 -func (p *Postgres) getReplAppMetrics(name string) *replStandbyAppMetrics {
225 - app, ok := p.mx.replApps[name]
224 +func (c *Collector) getReplAppMetrics(name string) *replStandbyAppMetrics {
225 + app, ok := c.mx.replApps[name]
226 if !ok {
227 app = &replStandbyAppMetrics{name: name}
228 - p.mx.replApps[name] = app
228 + c.mx.replApps[name] = app
229 }
230 return app
231 }
232
233 -func (p *Postgres) getReplSlotMetrics(name string) *replSlotMetrics {
234 - slot, ok := p.mx.replSlots[name]
233 +func (c *Collector) getReplSlotMetrics(name string) *replSlotMetrics {
234 + slot, ok := c.mx.replSlots[name]
235 if !ok {
236 slot = &replSlotMetrics{name: name}
237 - p.mx.replSlots[name] = slot
237 + c.mx.replSlots[name] = slot
238 }
239 return slot
240 }
src/go/plugin/go.d/collector/postgres/collect_metrics.go
+106 -106
@@ -4,83 +4,83 @@ package postgres
4
5 import "fmt"
6
7 -func (p *Postgres) collectMetrics(mx map[string]int64) {
8 - mx["server_connections_used"] = p.mx.connUsed
9 - if p.mx.maxConnections > 0 {
10 - mx["server_connections_available"] = p.mx.maxConnections - p.mx.connUsed
11 - mx["server_connections_utilization"] = calcPercentage(p.mx.connUsed, p.mx.maxConnections)
7 +func (c *Collector) collectMetrics(mx map[string]int64) {
8 + mx["server_connections_used"] = c.mx.connUsed
9 + if c.mx.maxConnections > 0 {
10 + mx["server_connections_available"] = c.mx.maxConnections - c.mx.connUsed
11 + mx["server_connections_utilization"] = calcPercentage(c.mx.connUsed, c.mx.maxConnections)
12 }
13 - p.mx.xactTimeHist.WriteTo(mx, "transaction_running_time_hist", 1, 1)
14 - p.mx.queryTimeHist.WriteTo(mx, "query_running_time_hist", 1, 1)
15 - mx["server_uptime"] = p.mx.uptime
16 - mx["server_connections_state_active"] = p.mx.connStateActive
17 - mx["server_connections_state_idle"] = p.mx.connStateIdle
18 - mx["server_connections_state_idle_in_transaction"] = p.mx.connStateIdleInTrans
19 - mx["server_connections_state_idle_in_transaction_aborted"] = p.mx.connStateIdleInTransAborted
20 - mx["server_connections_state_fastpath_function_call"] = p.mx.connStateFastpathFunctionCall
21 - mx["server_connections_state_disabled"] = p.mx.connStateDisabled
22 - mx["checkpoints_timed"] = p.mx.checkpointsTimed
23 - mx["checkpoints_req"] = p.mx.checkpointsReq
24 - mx["checkpoint_write_time"] = p.mx.checkpointWriteTime
25 - mx["checkpoint_sync_time"] = p.mx.checkpointSyncTime
26 - mx["buffers_checkpoint"] = p.mx.buffersCheckpoint
27 - mx["buffers_clean"] = p.mx.buffersClean
28 - mx["maxwritten_clean"] = p.mx.maxwrittenClean
29 - mx["buffers_backend"] = p.mx.buffersBackend
30 - mx["buffers_backend_fsync"] = p.mx.buffersBackendFsync
31 - mx["buffers_alloc"] = p.mx.buffersAlloc
32 - mx["oldest_current_xid"] = p.mx.oldestXID
33 - mx["percent_towards_wraparound"] = p.mx.percentTowardsWraparound
34 - mx["percent_towards_emergency_autovacuum"] = p.mx.percentTowardsEmergencyAutovacuum
35 - mx["wal_writes"] = p.mx.walWrites
36 - mx["wal_recycled_files"] = p.mx.walRecycledFiles
37 - mx["wal_written_files"] = p.mx.walWrittenFiles
38 - mx["wal_archive_files_ready_count"] = p.mx.walArchiveFilesReady
39 - mx["wal_archive_files_done_count"] = p.mx.walArchiveFilesDone
40 - mx["catalog_relkind_r_count"] = p.mx.relkindOrdinaryTable
41 - mx["catalog_relkind_i_count"] = p.mx.relkindIndex
42 - mx["catalog_relkind_S_count"] = p.mx.relkindSequence
43 - mx["catalog_relkind_t_count"] = p.mx.relkindTOASTTable
44 - mx["catalog_relkind_v_count"] = p.mx.relkindView
45 - mx["catalog_relkind_m_count"] = p.mx.relkindMatView
46 - mx["catalog_relkind_c_count"] = p.mx.relkindCompositeType
47 - mx["catalog_relkind_f_count"] = p.mx.relkindForeignTable
48 - mx["catalog_relkind_p_count"] = p.mx.relkindPartitionedTable
49 - mx["catalog_relkind_I_count"] = p.mx.relkindPartitionedIndex
50 - mx["catalog_relkind_r_size"] = p.mx.relkindOrdinaryTableSize
51 - mx["catalog_relkind_i_size"] = p.mx.relkindIndexSize
52 - mx["catalog_relkind_S_size"] = p.mx.relkindSequenceSize
53 - mx["catalog_relkind_t_size"] = p.mx.relkindTOASTTableSize
54 - mx["catalog_relkind_v_size"] = p.mx.relkindViewSize
55 - mx["catalog_relkind_m_size"] = p.mx.relkindMatViewSize
56 - mx["catalog_relkind_c_size"] = p.mx.relkindCompositeTypeSize
57 - mx["catalog_relkind_f_size"] = p.mx.relkindForeignTableSize
58 - mx["catalog_relkind_p_size"] = p.mx.relkindPartitionedTableSize
59 - mx["catalog_relkind_I_size"] = p.mx.relkindPartitionedIndexSize
60 - mx["autovacuum_analyze"] = p.mx.autovacuumWorkersAnalyze
61 - mx["autovacuum_vacuum_analyze"] = p.mx.autovacuumWorkersVacuumAnalyze
62 - mx["autovacuum_vacuum"] = p.mx.autovacuumWorkersVacuum
63 - mx["autovacuum_vacuum_freeze"] = p.mx.autovacuumWorkersVacuumFreeze
64 - mx["autovacuum_brin_summarize"] = p.mx.autovacuumWorkersBrinSummarize
13 + c.mx.xactTimeHist.WriteTo(mx, "transaction_running_time_hist", 1, 1)
14 + c.mx.queryTimeHist.WriteTo(mx, "query_running_time_hist", 1, 1)
15 + mx["server_uptime"] = c.mx.uptime
16 + mx["server_connections_state_active"] = c.mx.connStateActive
17 + mx["server_connections_state_idle"] = c.mx.connStateIdle
18 + mx["server_connections_state_idle_in_transaction"] = c.mx.connStateIdleInTrans
19 + mx["server_connections_state_idle_in_transaction_aborted"] = c.mx.connStateIdleInTransAborted
20 + mx["server_connections_state_fastpath_function_call"] = c.mx.connStateFastpathFunctionCall
21 + mx["server_connections_state_disabled"] = c.mx.connStateDisabled
22 + mx["checkpoints_timed"] = c.mx.checkpointsTimed
23 + mx["checkpoints_req"] = c.mx.checkpointsReq
24 + mx["checkpoint_write_time"] = c.mx.checkpointWriteTime
25 + mx["checkpoint_sync_time"] = c.mx.checkpointSyncTime
26 + mx["buffers_checkpoint"] = c.mx.buffersCheckpoint
27 + mx["buffers_clean"] = c.mx.buffersClean
28 + mx["maxwritten_clean"] = c.mx.maxwrittenClean
29 + mx["buffers_backend"] = c.mx.buffersBackend
30 + mx["buffers_backend_fsync"] = c.mx.buffersBackendFsync
31 + mx["buffers_alloc"] = c.mx.buffersAlloc
32 + mx["oldest_current_xid"] = c.mx.oldestXID
33 + mx["percent_towards_wraparound"] = c.mx.percentTowardsWraparound
34 + mx["percent_towards_emergency_autovacuum"] = c.mx.percentTowardsEmergencyAutovacuum
35 + mx["wal_writes"] = c.mx.walWrites
36 + mx["wal_recycled_files"] = c.mx.walRecycledFiles
37 + mx["wal_written_files"] = c.mx.walWrittenFiles
38 + mx["wal_archive_files_ready_count"] = c.mx.walArchiveFilesReady
39 + mx["wal_archive_files_done_count"] = c.mx.walArchiveFilesDone
40 + mx["catalog_relkind_r_count"] = c.mx.relkindOrdinaryTable
41 + mx["catalog_relkind_i_count"] = c.mx.relkindIndex
42 + mx["catalog_relkind_S_count"] = c.mx.relkindSequence
43 + mx["catalog_relkind_t_count"] = c.mx.relkindTOASTTable
44 + mx["catalog_relkind_v_count"] = c.mx.relkindView
45 + mx["catalog_relkind_m_count"] = c.mx.relkindMatView
46 + mx["catalog_relkind_c_count"] = c.mx.relkindCompositeType
47 + mx["catalog_relkind_f_count"] = c.mx.relkindForeignTable
48 + mx["catalog_relkind_p_count"] = c.mx.relkindPartitionedTable
49 + mx["catalog_relkind_I_count"] = c.mx.relkindPartitionedIndex
50 + mx["catalog_relkind_r_size"] = c.mx.relkindOrdinaryTableSize
51 + mx["catalog_relkind_i_size"] = c.mx.relkindIndexSize
52 + mx["catalog_relkind_S_size"] = c.mx.relkindSequenceSize
53 + mx["catalog_relkind_t_size"] = c.mx.relkindTOASTTableSize
54 + mx["catalog_relkind_v_size"] = c.mx.relkindViewSize
55 + mx["catalog_relkind_m_size"] = c.mx.relkindMatViewSize
56 + mx["catalog_relkind_c_size"] = c.mx.relkindCompositeTypeSize
57 + mx["catalog_relkind_f_size"] = c.mx.relkindForeignTableSize
58 + mx["catalog_relkind_p_size"] = c.mx.relkindPartitionedTableSize
59 + mx["catalog_relkind_I_size"] = c.mx.relkindPartitionedIndexSize
60 + mx["autovacuum_analyze"] = c.mx.autovacuumWorkersAnalyze
61 + mx["autovacuum_vacuum_analyze"] = c.mx.autovacuumWorkersVacuumAnalyze
62 + mx["autovacuum_vacuum"] = c.mx.autovacuumWorkersVacuum
63 + mx["autovacuum_vacuum_freeze"] = c.mx.autovacuumWorkersVacuumFreeze
64 + mx["autovacuum_brin_summarize"] = c.mx.autovacuumWorkersBrinSummarize
65
66 var locksHeld int64
67 - for name, m := range p.mx.dbs {
67 + for name, m := range c.mx.dbs {
68 if !m.updated {
69 - delete(p.mx.dbs, name)
70 - p.removeDatabaseCharts(m)
69 + delete(c.mx.dbs, name)
70 + c.removeDatabaseCharts(m)
71 continue
72 }
73 if !m.hasCharts {
74 m.hasCharts = true
75 - p.addNewDatabaseCharts(m)
76 - if p.isPGInRecovery() {
77 - p.addDBConflictsCharts(m)
75 + c.addNewDatabaseCharts(m)
76 + if c.isPGInRecovery() {
77 + c.addDBConflictsCharts(m)
78 }
79 }
80 px := "db_" + m.name + "_"
81 mx[px+"numbackends"] = m.numBackends
82 if m.datConnLimit <= 0 {
83 - mx[px+"numbackends_utilization"] = calcPercentage(m.numBackends, p.mx.maxConnections)
83 + mx[px+"numbackends_utilization"] = calcPercentage(m.numBackends, c.mx.maxConnections)
84 } else {
85 mx[px+"numbackends_utilization"] = calcPercentage(m.numBackends, m.datConnLimit)
86 }
@@ -130,50 +130,50 @@ func (p *Postgres) collectMetrics(mx map[string]int64) {
130 m.shareLockHeld + m.shareRowExclusiveLockHeld +
131 m.exclusiveLockHeld + m.accessExclusiveLockHeld
132 }
133 - mx["databases_count"] = int64(len(p.mx.dbs))
134 - mx["locks_utilization"] = calcPercentage(locksHeld, p.mx.maxLocksHeld)
133 + mx["databases_count"] = int64(len(c.mx.dbs))
134 + mx["locks_utilization"] = calcPercentage(locksHeld, c.mx.maxLocksHeld)
135
136 - for name, m := range p.mx.tables {
136 + for name, m := range c.mx.tables {
137 if !m.updated {
138 - delete(p.mx.tables, name)
139 - p.removeTableCharts(m)
138 + delete(c.mx.tables, name)
139 + c.removeTableCharts(m)
140 continue
141 }
142 if !m.hasCharts {
143 m.hasCharts = true
144 - p.addNewTableCharts(m)
144 + c.addNewTableCharts(m)
145 }
146 if !m.hasLastAutoVacuumChart && m.lastAutoVacuumAgo > 0 {
147 m.hasLastAutoVacuumChart = true
148 - p.addTableLastAutoVacuumAgoChart(m)
148 + c.addTableLastAutoVacuumAgoChart(m)
149 }
150 if !m.hasLastVacuumChart && m.lastVacuumAgo > 0 {
151 m.hasLastVacuumChart = true
152 - p.addTableLastVacuumAgoChart(m)
152 + c.addTableLastVacuumAgoChart(m)
153 }
154 if !m.hasLastAutoAnalyzeChart && m.lastAutoAnalyzeAgo > 0 {
155 m.hasLastAutoAnalyzeChart = true
156 - p.addTableLastAutoAnalyzeAgoChart(m)
156 + c.addTableLastAutoAnalyzeAgoChart(m)
157 }
158 if !m.hasLastAnalyzeChart && m.lastAnalyzeAgo > 0 {
159 m.hasLastAnalyzeChart = true
160 - p.addTableLastAnalyzeAgoChart(m)
160 + c.addTableLastAnalyzeAgoChart(m)
161 }
162 if !m.hasTableIOCharts && m.heapBlksRead.last != -1 {
163 m.hasTableIOCharts = true
164 - p.addTableIOChartsCharts(m)
164 + c.addTableIOChartsCharts(m)
165 }
166 if !m.hasTableIdxIOCharts && m.idxBlksRead.last != -1 {
167 m.hasTableIdxIOCharts = true
168 - p.addTableIndexIOCharts(m)
168 + c.addTableIndexIOCharts(m)
169 }
170 if !m.hasTableTOASTIOCharts && m.toastBlksRead.last != -1 {
171 m.hasTableTOASTIOCharts = true
172 - p.addTableTOASTIOCharts(m)
172 + c.addTableTOASTIOCharts(m)
173 }
174 if !m.hasTableTOASTIdxIOCharts && m.tidxBlksRead.last != -1 {
175 m.hasTableTOASTIdxIOCharts = true
176 - p.addTableTOASTIndexIOCharts(m)
176 + c.addTableTOASTIndexIOCharts(m)
177 }
178
179 px := fmt.Sprintf("table_%s_db_%s_schema_%s_", m.name, m.db, m.schema)
@@ -234,15 +234,15 @@ func (p *Postgres) collectMetrics(mx map[string]int64) {
234 m.tidxBlksHit.prev, m.tidxBlksRead.prev = m.tidxBlksHit.last, m.tidxBlksRead.last
235 }
236
237 - for name, m := range p.mx.indexes {
237 + for name, m := range c.mx.indexes {
238 if !m.updated {
239 - delete(p.mx.indexes, name)
240 - p.removeIndexCharts(m)
239 + delete(c.mx.indexes, name)
240 + c.removeIndexCharts(m)
241 continue
242 }
243 if !m.hasCharts {
244 m.hasCharts = true
245 - p.addNewIndexCharts(m)
245 + c.addNewIndexCharts(m)
246 }
247
248 px := fmt.Sprintf("index_%s_table_%s_db_%s_schema_%s_", m.name, m.table, m.db, m.schema)
@@ -258,15 +258,15 @@ func (p *Postgres) collectMetrics(mx map[string]int64) {
258 }
259 }
260
261 - for name, m := range p.mx.replApps {
261 + for name, m := range c.mx.replApps {
262 if !m.updated {
263 - delete(p.mx.replApps, name)
264 - p.removeReplicationStandbyAppCharts(name)
263 + delete(c.mx.replApps, name)
264 + c.removeReplicationStandbyAppCharts(name)
265 continue
266 }
267 if !m.hasCharts {
268 m.hasCharts = true
269 - p.addNewReplicationStandbyAppCharts(name)
269 + c.addNewReplicationStandbyAppCharts(name)
270 }
271 px := "repl_standby_app_" + m.name + "_wal_"
272 mx[px+"sent_lag_size"] = m.walSentDelta
@@ -278,15 +278,15 @@ func (p *Postgres) collectMetrics(mx map[string]int64) {
278 mx[px+"replay_lag_time"] = m.walReplayLag
279 }
280
281 - for name, m := range p.mx.replSlots {
281 + for name, m := range c.mx.replSlots {
282 if !m.updated {
283 - delete(p.mx.replSlots, name)
284 - p.removeReplicationSlotCharts(name)
283 + delete(c.mx.replSlots, name)
284 + c.removeReplicationSlotCharts(name)
285 continue
286 }
287 if !m.hasCharts {
288 m.hasCharts = true
289 - p.addNewReplicationSlotCharts(name)
289 + c.addNewReplicationSlotCharts(name)
290 }
291 px := "repl_slot_" + m.name + "_"
292 mx[px+"replslot_wal_keep"] = m.walKeep
@@ -294,15 +294,15 @@ func (p *Postgres) collectMetrics(mx map[string]int64) {
294 }
295 }
296
297 -func (p *Postgres) resetMetrics() {
298 - p.mx.srvMetrics = srvMetrics{
299 - xactTimeHist: p.mx.xactTimeHist,
300 - queryTimeHist: p.mx.queryTimeHist,
301 - maxConnections: p.mx.maxConnections,
302 - maxLocksHeld: p.mx.maxLocksHeld,
297 +func (c *Collector) resetMetrics() {
298 + c.mx.srvMetrics = srvMetrics{
299 + xactTimeHist: c.mx.xactTimeHist,
300 + queryTimeHist: c.mx.queryTimeHist,
301 + maxConnections: c.mx.maxConnections,
302 + maxLocksHeld: c.mx.maxLocksHeld,
303 }
304 - for name, m := range p.mx.dbs {
305 - p.mx.dbs[name] = &dbMetrics{
304 + for name, m := range c.mx.dbs {
305 + c.mx.dbs[name] = &dbMetrics{
306 name: m.name,
307 hasCharts: m.hasCharts,
308 blksRead: incDelta{prev: m.blksRead.prev},
@@ -311,8 +311,8 @@ func (p *Postgres) resetMetrics() {
311 tupFetched: incDelta{prev: m.tupFetched.prev},
312 }
313 }
314 - for name, m := range p.mx.tables {
315 - p.mx.tables[name] = &tableMetrics{
314 + for name, m := range c.mx.tables {
315 + c.mx.tables[name] = &tableMetrics{
316 db: m.db,
317 schema: m.schema,
318 name: m.name,
@@ -340,8 +340,8 @@ func (p *Postgres) resetMetrics() {
340 nullColumns: m.nullColumns,
341 }
342 }
343 - for name, m := range p.mx.indexes {
344 - p.mx.indexes[name] = &indexMetrics{
343 + for name, m := range c.mx.indexes {
344 + c.mx.indexes[name] = &indexMetrics{
345 name: m.name,
346 db: m.db,
347 schema: m.schema,
@@ -352,14 +352,14 @@ func (p *Postgres) resetMetrics() {
352 bloatSizePerc: m.bloatSizePerc,
353 }
354 }
355 - for name, m := range p.mx.replApps {
356 - p.mx.replApps[name] = &replStandbyAppMetrics{
355 + for name, m := range c.mx.replApps {
356 + c.mx.replApps[name] = &replStandbyAppMetrics{
357 name: m.name,
358 hasCharts: m.hasCharts,
359 }
360 }
361 - for name, m := range p.mx.replSlots {
362 - p.mx.replSlots[name] = &replSlotMetrics{
361 + for name, m := range c.mx.replSlots {
362 + c.mx.replSlots[name] = &replSlotMetrics{
363 name: m.name,
364 hasCharts: m.hasCharts,
365 }
src/go/plugin/go.d/collector/postgres/collector.go renamed
+25 -25
@@ -30,8 +30,8 @@ func init() {
30 })
31 }
32
33 -func New() *Postgres {
34 - return &Postgres{
33 +func New() *Collector {
34 + return &Collector{
35 Config: Config{
36 Timeout: confopt.Duration(time.Second * 2),
37 DSN: "postgres://postgres:postgres@127.0.0.1:5432/postgres",
@@ -70,7 +70,7 @@ type Config struct {
70 }
71
72 type (
73 - Postgres struct {
73 + Collector struct {
74 module.Base
75 Config `yaml:",inline" json:""`
76
@@ -99,30 +99,30 @@ type (
99 }
100 )
101
102 -func (p *Postgres) Configuration() any {
103 - return p.Config
102 +func (c *Collector) Configuration() any {
103 + return c.Config
104 }
105
106 -func (p *Postgres) Init() error {
107 - err := p.validateConfig()
106 +func (c *Collector) Init() error {
107 + err := c.validateConfig()
108 if err != nil {
109 return fmt.Errorf("config validation: %v", err)
110 }
111
112 - sr, err := p.initDBSelector()
112 + sr, err := c.initDBSelector()
113 if err != nil {
114 return fmt.Errorf("config validation: %v", err)
115 }
116 - p.dbSr = sr
116 + c.dbSr = sr
117
118 - p.mx.xactTimeHist = metrix.NewHistogramWithRangeBuckets(p.XactTimeHistogram)
119 - p.mx.queryTimeHist = metrix.NewHistogramWithRangeBuckets(p.QueryTimeHistogram)
118 + c.mx.xactTimeHist = metrix.NewHistogramWithRangeBuckets(c.XactTimeHistogram)
119 + c.mx.queryTimeHist = metrix.NewHistogramWithRangeBuckets(c.QueryTimeHistogram)
120
121 return nil
122 }
123
124 -func (p *Postgres) Check() error {
125 - mx, err := p.collect()
124 +func (c *Collector) Check() error {
125 + mx, err := c.collect()
126 if err != nil {
127 return err
128 }
@@ -132,14 +132,14 @@ func (p *Postgres) Check() error {
132 return nil
133 }
134
135 -func (p *Postgres) Charts() *module.Charts {
136 - return p.charts
135 +func (c *Collector) Charts() *module.Charts {
136 + return c.charts
137 }
138
139 -func (p *Postgres) Collect() map[string]int64 {
140 - mx, err := p.collect()
139 +func (c *Collector) Collect() map[string]int64 {
140 + mx, err := c.collect()
141 if err != nil {
142 - p.Error(err)
142 + c.Error(err)
143 }
144
145 if len(mx) == 0 {
@@ -148,17 +148,17 @@ func (p *Postgres) Collect() map[string]int64 {
148 return mx
149 }
150
151 -func (p *Postgres) Cleanup() {
152 - if p.db == nil {
151 +func (c *Collector) Cleanup() {
152 + if c.db == nil {
153 return
154 }
155 - if err := p.db.Close(); err != nil {
156 - p.Warningf("cleanup: error on closing the Postgres database [%s]: %v", p.DSN, err)
155 + if err := c.db.Close(); err != nil {
156 + c.Warningf("cleanup: error on closing the Postgres database [%s]: %v", c.DSN, err)
157 }
158 - p.db = nil
158 + c.db = nil
159
160 - for dbname, conn := range p.dbConns {
161 - delete(p.dbConns, dbname)
160 + for dbname, conn := range c.dbConns {
161 + delete(c.dbConns, dbname)
162 if conn.connStr != "" {
163 stdlib.UnregisterConnConfig(conn.connStr)
164 }
src/go/plugin/go.d/collector/postgres/collector_test.go renamed
+45 -43
@@ -95,11 +95,11 @@ func Test_testDataIsValid(t *testing.T) {
95 }
96 }
97
98 -func TestPostgres_ConfigurationSerialize(t *testing.T) {
99 - module.TestConfigurationSerialize(t, &Postgres{}, dataConfigJSON, dataConfigYAML)
98 +func TestCollector_ConfigurationSerialize(t *testing.T) {
99 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
100 }
101
102 -func TestPostgres_Init(t *testing.T) {
102 +func TestCollector_Init(t *testing.T) {
103 tests := map[string]struct {
104 wantFail bool
105 config Config
@@ -116,35 +116,35 @@ func TestPostgres_Init(t *testing.T) {
116
117 for name, test := range tests {
118 t.Run(name, func(t *testing.T) {
119 - pg := New()
120 - pg.Config = test.config
119 + collr := New()
120 + collr.Config = test.config
121
122 if test.wantFail {
123 - assert.Error(t, pg.Init())
123 + assert.Error(t, collr.Init())
124 } else {
125 - assert.NoError(t, pg.Init())
125 + assert.NoError(t, collr.Init())
126 }
127 })
128 }
129 }
130
131 -func TestPostgres_Cleanup(t *testing.T) {
131 +func TestCollector_Cleanup(t *testing.T) {
132
133 }
134
135 -func TestPostgres_Charts(t *testing.T) {
135 +func TestCollector_Charts(t *testing.T) {
136 assert.NotNil(t, New().Charts())
137 }
138
139 -func TestPostgres_Check(t *testing.T) {
139 +func TestCollector_Check(t *testing.T) {
140 tests := map[string]struct {
141 - prepareMock func(t *testing.T, pg *Postgres, mock sqlmock.Sqlmock)
141 + prepareMock func(*testing.T, *Collector, sqlmock.Sqlmock)
142 wantFail bool
143 }{
144 "Success when all queries are successful (v14.4)": {
145 wantFail: false,
146 - prepareMock: func(t *testing.T, pg *Postgres, m sqlmock.Sqlmock) {
147 - pg.dbSr = matcher.TRUE()
146 + prepareMock: func(t *testing.T, collr *Collector, m sqlmock.Sqlmock) {
147 + collr.dbSr = matcher.TRUE()
148
149 mockExpect(t, m, queryServerVersion(), dataVer140004ServerVersionNum)
150 mockExpect(t, m, queryIsSuperUser(), dataVer140004IsSuperUserTrue)
@@ -185,7 +185,7 @@ func TestPostgres_Check(t *testing.T) {
185 },
186 "Fail when the second query unsuccessful (v14.4)": {
187 wantFail: true,
188 - prepareMock: func(t *testing.T, pg *Postgres, m sqlmock.Sqlmock) {
188 + prepareMock: func(t *testing.T, collr *Collector, m sqlmock.Sqlmock) {
189 mockExpect(t, m, queryServerVersion(), dataVer140004ServerVersionNum)
190 mockExpect(t, m, queryIsSuperUser(), dataVer140004IsSuperUserTrue)
191 mockExpect(t, m, queryPGIsInRecovery(), dataVer140004PGIsInRecoveryTrue)
@@ -199,13 +199,13 @@ func TestPostgres_Check(t *testing.T) {
199 },
200 "Fail when querying the database version returns an error": {
201 wantFail: true,
202 - prepareMock: func(t *testing.T, pg *Postgres, m sqlmock.Sqlmock) {
202 + prepareMock: func(t *testing.T, collr *Collector, m sqlmock.Sqlmock) {
203 mockExpectErr(m, queryServerVersion())
204 },
205 },
206 "Fail when querying settings max connection returns an error": {
207 wantFail: true,
208 - prepareMock: func(t *testing.T, pg *Postgres, m sqlmock.Sqlmock) {
208 + prepareMock: func(t *testing.T, collr *Collector, m sqlmock.Sqlmock) {
209 mockExpect(t, m, queryServerVersion(), dataVer140004ServerVersionNum)
210 mockExpect(t, m, queryIsSuperUser(), dataVer140004IsSuperUserTrue)
211 mockExpect(t, m, queryPGIsInRecovery(), dataVer140004PGIsInRecoveryTrue)
@@ -221,34 +221,35 @@ func TestPostgres_Check(t *testing.T) {
221 sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual),
222 )
223 require.NoError(t, err)
224 - pg := New()
225 - pg.db = db
224 +
225 + collr := New()
226 + collr.db = db
227 defer func() { _ = db.Close() }()
228
228 - require.NoError(t, pg.Init())
229 + require.NoError(t, collr.Init())
230
230 - test.prepareMock(t, pg, mock)
231 + test.prepareMock(t, collr, mock)
232
233 if test.wantFail {
233 - assert.Error(t, pg.Check())
234 + assert.Error(t, collr.Check())
235 } else {
235 - assert.NoError(t, pg.Check())
236 + assert.NoError(t, collr.Check())
237 }
238 assert.NoError(t, mock.ExpectationsWereMet())
239 })
240 }
241 }
242
242 -func TestPostgres_Collect(t *testing.T) {
243 +func TestCollector_Collect(t *testing.T) {
244 type testCaseStep struct {
244 - prepareMock func(t *testing.T, pg *Postgres, mock sqlmock.Sqlmock)
245 - check func(t *testing.T, pg *Postgres)
245 + prepareMock func(*testing.T, *Collector, sqlmock.Sqlmock)
246 + check func(*testing.T, *Collector)
247 }
248 tests := map[string][]testCaseStep{
249 "Success on all queries, collect all dbs (v14.4)": {
250 {
250 - prepareMock: func(t *testing.T, pg *Postgres, m sqlmock.Sqlmock) {
251 - pg.dbSr = matcher.TRUE()
251 + prepareMock: func(t *testing.T, collr *Collector, m sqlmock.Sqlmock) {
252 + collr.dbSr = matcher.TRUE()
253 mockExpect(t, m, queryServerVersion(), dataVer140004ServerVersionNum)
254 mockExpect(t, m, queryIsSuperUser(), dataVer140004IsSuperUserTrue)
255 mockExpect(t, m, queryPGIsInRecovery(), dataVer140004PGIsInRecoveryTrue)
@@ -285,8 +286,8 @@ func TestPostgres_Collect(t *testing.T) {
286 mockExpect(t, m, queryBloat(), dataVer140004Bloat)
287 mockExpect(t, m, queryColumnsStats(), dataVer140004ColumnsStats)
288 },
288 - check: func(t *testing.T, pg *Postgres) {
289 - mx := pg.Collect()
289 + check: func(t *testing.T, collr *Collector) {
290 + mx := collr.Collect()
291
292 expected := map[string]int64{
293 "autovacuum_analyze": 0,
@@ -604,11 +605,11 @@ func TestPostgres_Collect(t *testing.T) {
605 },
606 "Fail when querying the database version returns an error": {
607 {
607 - prepareMock: func(t *testing.T, pg *Postgres, m sqlmock.Sqlmock) {
608 + prepareMock: func(t *testing.T, collr *Collector, m sqlmock.Sqlmock) {
609 mockExpectErr(m, queryServerVersion())
610 },
610 - check: func(t *testing.T, pg *Postgres) {
611 - mx := pg.Collect()
611 + check: func(t *testing.T, collr *Collector) {
612 + mx := collr.Collect()
613 var expected map[string]int64
614 assert.Equal(t, expected, mx)
615 },
@@ -616,15 +617,15 @@ func TestPostgres_Collect(t *testing.T) {
617 },
618 "Fail when querying settings max connections returns an error": {
619 {
619 - prepareMock: func(t *testing.T, pg *Postgres, m sqlmock.Sqlmock) {
620 + prepareMock: func(t *testing.T, collr *Collector, m sqlmock.Sqlmock) {
621 mockExpect(t, m, queryServerVersion(), dataVer140004ServerVersionNum)
622 mockExpect(t, m, queryIsSuperUser(), dataVer140004IsSuperUserTrue)
623 mockExpect(t, m, queryPGIsInRecovery(), dataVer140004PGIsInRecoveryTrue)
624
625 mockExpectErr(m, querySettingsMaxConnections())
626 },
626 - check: func(t *testing.T, pg *Postgres) {
627 - mx := pg.Collect()
627 + check: func(t *testing.T, collr *Collector) {
628 + mx := collr.Collect()
629 var expected map[string]int64
630 assert.Equal(t, expected, mx)
631 },
@@ -632,7 +633,7 @@ func TestPostgres_Collect(t *testing.T) {
633 },
634 "Fail when querying the server connections returns an error": {
635 {
635 - prepareMock: func(t *testing.T, pg *Postgres, m sqlmock.Sqlmock) {
636 + prepareMock: func(t *testing.T, collr *Collector, m sqlmock.Sqlmock) {
637 mockExpect(t, m, queryServerVersion(), dataVer140004ServerVersionNum)
638 mockExpect(t, m, queryIsSuperUser(), dataVer140004IsSuperUserTrue)
639 mockExpect(t, m, queryPGIsInRecovery(), dataVer140004PGIsInRecoveryTrue)
@@ -642,8 +643,8 @@ func TestPostgres_Collect(t *testing.T) {
643
644 mockExpectErr(m, queryServerCurrentConnectionsUsed())
645 },
645 - check: func(t *testing.T, pg *Postgres) {
646 - mx := pg.Collect()
646 + check: func(t *testing.T, collr *Collector) {
647 + mx := collr.Collect()
648 var expected map[string]int64
649 assert.Equal(t, expected, mx)
650 },
@@ -657,16 +658,17 @@ func TestPostgres_Collect(t *testing.T) {
658 sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual),
659 )
660 require.NoError(t, err)
660 - pg := New()
661 - pg.db = db
661 +
662 + collr := New()
663 + collr.db = db
664 defer func() { _ = db.Close() }()
665
664 - require.NoError(t, pg.Init())
666 + require.NoError(t, collr.Init())
667
668 for i, step := range test {
669 t.Run(fmt.Sprintf("step[%d]", i), func(t *testing.T) {
668 - step.prepareMock(t, pg, mock)
669 - step.check(t, pg)
670 + step.prepareMock(t, collr, mock)
671 + step.check(t, collr)
672 })
673 }
674 assert.NoError(t, mock.ExpectationsWereMet())
src/go/plugin/go.d/collector/postgres/do_query.go
+9 -9
@@ -7,26 +7,26 @@ import (
7 "database/sql"
8 )
9
10 -func (p *Postgres) doQueryRow(query string, v any) error {
11 - ctx, cancel := context.WithTimeout(context.Background(), p.Timeout.Duration())
10 +func (c *Collector) doQueryRow(query string, v any) error {
11 + ctx, cancel := context.WithTimeout(context.Background(), c.Timeout.Duration())
12 defer cancel()
13
14 - return p.db.QueryRowContext(ctx, query).Scan(v)
14 + return c.db.QueryRowContext(ctx, query).Scan(v)
15 }
16
17 -func (p *Postgres) doDBQueryRow(db *sql.DB, query string, v any) error {
18 - ctx, cancel := context.WithTimeout(context.Background(), p.Timeout.Duration())
17 +func (c *Collector) doDBQueryRow(db *sql.DB, query string, v any) error {
18 + ctx, cancel := context.WithTimeout(context.Background(), c.Timeout.Duration())
19 defer cancel()
20
21 return db.QueryRowContext(ctx, query).Scan(v)
22 }
23
24 -func (p *Postgres) doQuery(query string, assign func(column, value string, rowEnd bool)) error {
25 - return p.doDBQuery(p.db, query, assign)
24 +func (c *Collector) doQuery(query string, assign func(column, value string, rowEnd bool)) error {
25 + return c.doDBQuery(c.db, query, assign)
26 }
27
28 -func (p *Postgres) doDBQuery(db *sql.DB, query string, assign func(column, value string, rowEnd bool)) error {
29 - ctx, cancel := context.WithTimeout(context.Background(), p.Timeout.Duration())
28 +func (c *Collector) doDBQuery(db *sql.DB, query string, assign func(column, value string, rowEnd bool)) error {
29 + ctx, cancel := context.WithTimeout(context.Background(), c.Timeout.Duration())
30 defer cancel()
31
32 rows, err := db.QueryContext(ctx, query)
src/go/plugin/go.d/collector/postgres/do_query_bloat.go
+14 -14
@@ -4,25 +4,25 @@ package postgres
4
5 import "database/sql"
6
7 -func (p *Postgres) doQueryBloat() error {
8 - if err := p.doDBQueryBloat(p.db); err != nil {
9 - p.Warning(err)
7 +func (c *Collector) doQueryBloat() error {
8 + if err := c.doDBQueryBloat(c.db); err != nil {
9 + c.Warning(err)
10 }
11 - for _, conn := range p.dbConns {
11 + for _, conn := range c.dbConns {
12 if conn.db == nil {
13 continue
14 }
15 - if err := p.doDBQueryBloat(conn.db); err != nil {
16 - p.Warning(err)
15 + if err := c.doDBQueryBloat(conn.db); err != nil {
16 + c.Warning(err)
17 }
18 }
19 return nil
20 }
21
22 -func (p *Postgres) doDBQueryBloat(db *sql.DB) error {
22 +func (c *Collector) doDBQueryBloat(db *sql.DB) error {
23 q := queryBloat()
24
25 - for _, m := range p.mx.tables {
25 + for _, m := range c.mx.tables {
26 if m.bloatSize != nil {
27 m.bloatSize = newInt(0)
28 }
@@ -30,7 +30,7 @@ func (p *Postgres) doDBQueryBloat(db *sql.DB) error {
30 m.bloatSizePerc = newInt(0)
31 }
32 }
33 - for _, m := range p.mx.indexes {
33 + for _, m := range c.mx.indexes {
34 if m.bloatSize != nil {
35 m.bloatSize = newInt(0)
36 }
@@ -41,7 +41,7 @@ func (p *Postgres) doDBQueryBloat(db *sql.DB) error {
41
42 var dbname, schema, table, iname string
43 var tableWasted, idxWasted int64
44 - return p.doDBQuery(db, q, func(column, value string, rowEnd bool) {
44 + return c.doDBQuery(db, q, func(column, value string, rowEnd bool) {
45 switch column {
46 case "db":
47 dbname = value
@@ -59,13 +59,13 @@ func (p *Postgres) doDBQueryBloat(db *sql.DB) error {
59 if !rowEnd {
60 return
61 }
62 - if p.hasTableMetrics(table, dbname, schema) {
63 - v := p.getTableMetrics(table, dbname, schema)
62 + if c.hasTableMetrics(table, dbname, schema) {
63 + v := c.getTableMetrics(table, dbname, schema)
64 v.bloatSize = newInt(tableWasted)
65 v.bloatSizePerc = newInt(calcPercentage(tableWasted, v.totalSize))
66 }
67 - if iname != "?" && p.hasIndexMetrics(iname, table, dbname, schema) {
68 - v := p.getIndexMetrics(iname, table, dbname, schema)
67 + if iname != "?" && c.hasIndexMetrics(iname, table, dbname, schema) {
68 + v := c.getIndexMetrics(iname, table, dbname, schema)
69 v.bloatSize = newInt(idxWasted)
70 v.bloatSizePerc = newInt(calcPercentage(idxWasted, v.size))
71 }
src/go/plugin/go.d/collector/postgres/do_query_columns.go
+11 -11
@@ -4,25 +4,25 @@ package postgres
4
5 import "database/sql"
6
7 -func (p *Postgres) doQueryColumns() error {
8 - if err := p.doDBQueryColumns(p.db); err != nil {
9 - p.Warning(err)
7 +func (c *Collector) doQueryColumns() error {
8 + if err := c.doDBQueryColumns(c.db); err != nil {
9 + c.Warning(err)
10 }
11 - for _, conn := range p.dbConns {
11 + for _, conn := range c.dbConns {
12 if conn.db == nil {
13 continue
14 }
15 - if err := p.doDBQueryColumns(conn.db); err != nil {
16 - p.Warning(err)
15 + if err := c.doDBQueryColumns(conn.db); err != nil {
16 + c.Warning(err)
17 }
18 }
19 return nil
20 }
21
22 -func (p *Postgres) doDBQueryColumns(db *sql.DB) error {
22 +func (c *Collector) doDBQueryColumns(db *sql.DB) error {
23 q := queryColumnsStats()
24
25 - for _, m := range p.mx.tables {
25 + for _, m := range c.mx.tables {
26 if m.nullColumns != nil {
27 m.nullColumns = newInt(0)
28 }
@@ -30,7 +30,7 @@ func (p *Postgres) doDBQueryColumns(db *sql.DB) error {
30
31 var dbname, schema, table string
32 var nullPerc int64
33 - return p.doDBQuery(db, q, func(column, value string, rowEnd bool) {
33 + return c.doDBQuery(db, q, func(column, value string, rowEnd bool) {
34 switch column {
35 case "datname":
36 dbname = value
@@ -44,8 +44,8 @@ func (p *Postgres) doDBQueryColumns(db *sql.DB) error {
44 if !rowEnd {
45 return
46 }
47 - if nullPerc == 100 && p.hasTableMetrics(table, dbname, schema) {
48 - v := p.getTableMetrics(table, dbname, schema)
47 + if nullPerc == 100 && c.hasTableMetrics(table, dbname, schema) {
48 + v := c.getTableMetrics(table, dbname, schema)
49 if v.nullColumns == nil {
50 v.nullColumns = newInt(0)
51 }
src/go/plugin/go.d/collector/postgres/do_query_databases.go
+55 -55
@@ -6,114 +6,114 @@ import (
6 "fmt"
7 )
8
9 -func (p *Postgres) doQueryDatabasesMetrics() error {
10 - if err := p.doQueryDatabaseStats(); err != nil {
9 +func (c *Collector) doQueryDatabasesMetrics() error {
10 + if err := c.doQueryDatabaseStats(); err != nil {
11 return fmt.Errorf("querying database stats error: %v", err)
12 }
13 - if err := p.doQueryDatabaseSize(); err != nil {
13 + if err := c.doQueryDatabaseSize(); err != nil {
14 return fmt.Errorf("querying database size error: %v", err)
15 }
16 - if p.isPGInRecovery() {
17 - if err := p.doQueryDatabaseConflicts(); err != nil {
16 + if c.isPGInRecovery() {
17 + if err := c.doQueryDatabaseConflicts(); err != nil {
18 return fmt.Errorf("querying database conflicts error: %v", err)
19 }
20 }
21 - if err := p.doQueryDatabaseLocks(); err != nil {
21 + if err := c.doQueryDatabaseLocks(); err != nil {
22 return fmt.Errorf("querying database locks error: %v", err)
23 }
24 return nil
25 }
26
27 -func (p *Postgres) doQueryDatabaseStats() error {
27 +func (c *Collector) doQueryDatabaseStats() error {
28 q := queryDatabaseStats()
29
30 var db string
31 - return p.doQuery(q, func(column, value string, _ bool) {
31 + return c.doQuery(q, func(column, value string, _ bool) {
32 switch column {
33 case "datname":
34 db = value
35 - p.getDBMetrics(db).updated = true
35 + c.getDBMetrics(db).updated = true
36 case "numbackends":
37 - p.getDBMetrics(db).numBackends = parseInt(value)
37 + c.getDBMetrics(db).numBackends = parseInt(value)
38 case "datconnlimit":
39 - p.getDBMetrics(db).datConnLimit = parseInt(value)
39 + c.getDBMetrics(db).datConnLimit = parseInt(value)
40 case "xact_commit":
41 - p.getDBMetrics(db).xactCommit = parseInt(value)
41 + c.getDBMetrics(db).xactCommit = parseInt(value)
42 case "xact_rollback":
43 - p.getDBMetrics(db).xactRollback = parseInt(value)
43 + c.getDBMetrics(db).xactRollback = parseInt(value)
44 case "blks_read_bytes":
45 - p.getDBMetrics(db).blksRead.last = parseInt(value)
45 + c.getDBMetrics(db).blksRead.last = parseInt(value)
46 case "blks_hit_bytes":
47 - p.getDBMetrics(db).blksHit.last = parseInt(value)
47 + c.getDBMetrics(db).blksHit.last = parseInt(value)
48 case "tup_returned":
49 - p.getDBMetrics(db).tupReturned.last = parseInt(value)
49 + c.getDBMetrics(db).tupReturned.last = parseInt(value)
50 case "tup_fetched":
51 - p.getDBMetrics(db).tupFetched.last = parseInt(value)
51 + c.getDBMetrics(db).tupFetched.last = parseInt(value)
52 case "tup_inserted":
53 - p.getDBMetrics(db).tupInserted = parseInt(value)
53 + c.getDBMetrics(db).tupInserted = parseInt(value)
54 case "tup_updated":
55 - p.getDBMetrics(db).tupUpdated = parseInt(value)
55 + c.getDBMetrics(db).tupUpdated = parseInt(value)
56 case "tup_deleted":
57 - p.getDBMetrics(db).tupDeleted = parseInt(value)
57 + c.getDBMetrics(db).tupDeleted = parseInt(value)
58 case "conflicts":
59 - p.getDBMetrics(db).conflicts = parseInt(value)
59 + c.getDBMetrics(db).conflicts = parseInt(value)
60 case "temp_files":
61 - p.getDBMetrics(db).tempFiles = parseInt(value)
61 + c.getDBMetrics(db).tempFiles = parseInt(value)
62 case "temp_bytes":
63 - p.getDBMetrics(db).tempBytes = parseInt(value)
63 + c.getDBMetrics(db).tempBytes = parseInt(value)
64 case "deadlocks":
65 - p.getDBMetrics(db).deadlocks = parseInt(value)
65 + c.getDBMetrics(db).deadlocks = parseInt(value)
66 }
67 })
68 }
69
70 -func (p *Postgres) doQueryDatabaseSize() error {
71 - q := queryDatabaseSize(p.pgVersion)
70 +func (c *Collector) doQueryDatabaseSize() error {
71 + q := queryDatabaseSize(c.pgVersion)
72
73 var db string
74 - return p.doQuery(q, func(column, value string, _ bool) {
74 + return c.doQuery(q, func(column, value string, _ bool) {
75 switch column {
76 case "datname":
77 db = value
78 case "size":
79 - p.getDBMetrics(db).size = newInt(parseInt(value))
79 + c.getDBMetrics(db).size = newInt(parseInt(value))
80 }
81 })
82 }
83
84 -func (p *Postgres) doQueryDatabaseConflicts() error {
84 +func (c *Collector) doQueryDatabaseConflicts() error {
85 q := queryDatabaseConflicts()
86
87 var db string
88 - return p.doQuery(q, func(column, value string, _ bool) {
88 + return c.doQuery(q, func(column, value string, _ bool) {
89 switch column {
90 case "datname":
91 db = value
92 - p.getDBMetrics(db).updated = true
92 + c.getDBMetrics(db).updated = true
93 case "confl_tablespace":
94 - p.getDBMetrics(db).conflTablespace = parseInt(value)
94 + c.getDBMetrics(db).conflTablespace = parseInt(value)
95 case "confl_lock":
96 - p.getDBMetrics(db).conflLock = parseInt(value)
96 + c.getDBMetrics(db).conflLock = parseInt(value)
97 case "confl_snapshot":
98 - p.getDBMetrics(db).conflSnapshot = parseInt(value)
98 + c.getDBMetrics(db).conflSnapshot = parseInt(value)
99 case "confl_bufferpin":
100 - p.getDBMetrics(db).conflBufferpin = parseInt(value)
100 + c.getDBMetrics(db).conflBufferpin = parseInt(value)
101 case "confl_deadlock":
102 - p.getDBMetrics(db).conflDeadlock = parseInt(value)
102 + c.getDBMetrics(db).conflDeadlock = parseInt(value)
103 }
104 })
105 }
106
107 -func (p *Postgres) doQueryDatabaseLocks() error {
107 +func (c *Collector) doQueryDatabaseLocks() error {
108 q := queryDatabaseLocks()
109
110 var db, mode string
111 var granted bool
112 - return p.doQuery(q, func(column, value string, _ bool) {
112 + return c.doQuery(q, func(column, value string, _ bool) {
113 switch column {
114 case "datname":
115 db = value
116 - p.getDBMetrics(db).updated = true
116 + c.getDBMetrics(db).updated = true
117 case "mode":
118 mode = value
119 case "granted":
@@ -123,37 +123,37 @@ func (p *Postgres) doQueryDatabaseLocks() error {
123 // https://www.postgresql.org/docs/7.2/locking-tables.html
124 switch {
125 case mode == "AccessShareLock" && granted:
126 - p.getDBMetrics(db).accessShareLockHeld = parseInt(value)
126 + c.getDBMetrics(db).accessShareLockHeld = parseInt(value)
127 case mode == "AccessShareLock":
128 - p.getDBMetrics(db).accessShareLockAwaited = parseInt(value)
128 + c.getDBMetrics(db).accessShareLockAwaited = parseInt(value)
129 case mode == "RowShareLock" && granted:
130 - p.getDBMetrics(db).rowShareLockHeld = parseInt(value)
130 + c.getDBMetrics(db).rowShareLockHeld = parseInt(value)
131 case mode == "RowShareLock":
132 - p.getDBMetrics(db).rowShareLockAwaited = parseInt(value)
132 + c.getDBMetrics(db).rowShareLockAwaited = parseInt(value)
133 case mode == "RowExclusiveLock" && granted:
134 - p.getDBMetrics(db).rowExclusiveLockHeld = parseInt(value)
134 + c.getDBMetrics(db).rowExclusiveLockHeld = parseInt(value)
135 case mode == "RowExclusiveLock":
136 - p.getDBMetrics(db).rowExclusiveLockAwaited = parseInt(value)
136 + c.getDBMetrics(db).rowExclusiveLockAwaited = parseInt(value)
137 case mode == "ShareUpdateExclusiveLock" && granted:
138 - p.getDBMetrics(db).shareUpdateExclusiveLockHeld = parseInt(value)
138 + c.getDBMetrics(db).shareUpdateExclusiveLockHeld = parseInt(value)
139 case mode == "ShareUpdateExclusiveLock":
140 - p.getDBMetrics(db).shareUpdateExclusiveLockAwaited = parseInt(value)
140 + c.getDBMetrics(db).shareUpdateExclusiveLockAwaited = parseInt(value)
141 case mode == "ShareLock" && granted:
142 - p.getDBMetrics(db).shareLockHeld = parseInt(value)
142 + c.getDBMetrics(db).shareLockHeld = parseInt(value)
143 case mode == "ShareLock":
144 - p.getDBMetrics(db).shareLockAwaited = parseInt(value)
144 + c.getDBMetrics(db).shareLockAwaited = parseInt(value)
145 case mode == "ShareRowExclusiveLock" && granted:
146 - p.getDBMetrics(db).shareRowExclusiveLockHeld = parseInt(value)
146 + c.getDBMetrics(db).shareRowExclusiveLockHeld = parseInt(value)
147 case mode == "ShareRowExclusiveLock":
148 - p.getDBMetrics(db).shareRowExclusiveLockAwaited = parseInt(value)
148 + c.getDBMetrics(db).shareRowExclusiveLockAwaited = parseInt(value)
149 case mode == "ExclusiveLock" && granted:
150 - p.getDBMetrics(db).exclusiveLockHeld = parseInt(value)
150 + c.getDBMetrics(db).exclusiveLockHeld = parseInt(value)
151 case mode == "ExclusiveLock":
152 - p.getDBMetrics(db).exclusiveLockAwaited = parseInt(value)
152 + c.getDBMetrics(db).exclusiveLockAwaited = parseInt(value)
153 case mode == "AccessExclusiveLock" && granted:
154 - p.getDBMetrics(db).accessExclusiveLockHeld = parseInt(value)
154 + c.getDBMetrics(db).accessExclusiveLockHeld = parseInt(value)
155 case mode == "AccessExclusiveLock":
156 - p.getDBMetrics(db).accessExclusiveLockAwaited = parseInt(value)
156 + c.getDBMetrics(db).accessExclusiveLockAwaited = parseInt(value)
157 }
158 }
159 })
src/go/plugin/go.d/collector/postgres/do_query_global.go
+95 -95
@@ -7,197 +7,197 @@ import (
7 "strconv"
8 )
9
10 -func (p *Postgres) doQueryGlobalMetrics() error {
11 - if err := p.doQueryConnectionsUsed(); err != nil {
10 +func (c *Collector) doQueryGlobalMetrics() error {
11 + if err := c.doQueryConnectionsUsed(); err != nil {
12 return fmt.Errorf("querying server connections used error: %v", err)
13 }
14 - if err := p.doQueryConnectionsState(); err != nil {
14 + if err := c.doQueryConnectionsState(); err != nil {
15 return fmt.Errorf("querying server connections state error: %v", err)
16 }
17 - if err := p.doQueryCheckpoints(); err != nil {
17 + if err := c.doQueryCheckpoints(); err != nil {
18 return fmt.Errorf("querying database conflicts error: %v", err)
19 }
20 - if err := p.doQueryUptime(); err != nil {
20 + if err := c.doQueryUptime(); err != nil {
21 return fmt.Errorf("querying server uptime error: %v", err)
22 }
23 - if err := p.doQueryTXIDWraparound(); err != nil {
23 + if err := c.doQueryTXIDWraparound(); err != nil {
24 return fmt.Errorf("querying txid wraparound error: %v", err)
25 }
26 - if err := p.doQueryWALWrites(); err != nil {
26 + if err := c.doQueryWALWrites(); err != nil {
27 return fmt.Errorf("querying wal writes error: %v", err)
28 }
29 - if err := p.doQueryCatalogRelations(); err != nil {
29 + if err := c.doQueryCatalogRelations(); err != nil {
30 return fmt.Errorf("querying catalog relations error: %v", err)
31 }
32 - if p.pgVersion >= pgVersion94 {
33 - if err := p.doQueryAutovacuumWorkers(); err != nil {
32 + if c.pgVersion >= pgVersion94 {
33 + if err := c.doQueryAutovacuumWorkers(); err != nil {
34 return fmt.Errorf("querying autovacuum workers error: %v", err)
35 }
36 }
37 - if p.pgVersion >= pgVersion10 {
38 - if err := p.doQueryXactQueryRunningTime(); err != nil {
37 + if c.pgVersion >= pgVersion10 {
38 + if err := c.doQueryXactQueryRunningTime(); err != nil {
39 return fmt.Errorf("querying xact/query running time: %v", err)
40 }
41 }
42
43 - if !p.isSuperUser() {
43 + if !c.isSuperUser() {
44 return nil
45 }
46
47 - if p.pgVersion >= pgVersion94 {
48 - if err := p.doQueryWALFiles(); err != nil {
47 + if c.pgVersion >= pgVersion94 {
48 + if err := c.doQueryWALFiles(); err != nil {
49 return fmt.Errorf("querying wal files error: %v", err)
50 }
51 }
52 - if err := p.doQueryWALArchiveFiles(); err != nil {
52 + if err := c.doQueryWALArchiveFiles(); err != nil {
53 return fmt.Errorf("querying wal archive files error: %v", err)
54 }
55
56 return nil
57 }
58
59 -func (p *Postgres) doQueryConnectionsUsed() error {
59 +func (c *Collector) doQueryConnectionsUsed() error {
60 q := queryServerCurrentConnectionsUsed()
61
62 var v string
63 - if err := p.doQueryRow(q, &v); err != nil {
63 + if err := c.doQueryRow(q, &v); err != nil {
64 return err
65 }
66
67 - p.mx.connUsed = parseInt(v)
67 + c.mx.connUsed = parseInt(v)
68
69 return nil
70 }
71
72 -func (p *Postgres) doQueryConnectionsState() error {
72 +func (c *Collector) doQueryConnectionsState() error {
73 q := queryServerConnectionsState()
74
75 var state string
76 - return p.doQuery(q, func(column, value string, rowEnd bool) {
76 + return c.doQuery(q, func(column, value string, rowEnd bool) {
77 switch column {
78 case "state":
79 state = value
80 case "count":
81 switch state {
82 case "active":
83 - p.mx.connStateActive = parseInt(value)
83 + c.mx.connStateActive = parseInt(value)
84 case "idle":
85 - p.mx.connStateIdle = parseInt(value)
85 + c.mx.connStateIdle = parseInt(value)
86 case "idle in transaction":
87 - p.mx.connStateIdleInTrans = parseInt(value)
87 + c.mx.connStateIdleInTrans = parseInt(value)
88 case "idle in transaction (aborted)":
89 - p.mx.connStateIdleInTransAborted = parseInt(value)
89 + c.mx.connStateIdleInTransAborted = parseInt(value)
90 case "fastpath function call":
91 - p.mx.connStateFastpathFunctionCall = parseInt(value)
91 + c.mx.connStateFastpathFunctionCall = parseInt(value)
92 case "disabled":
93 - p.mx.connStateDisabled = parseInt(value)
93 + c.mx.connStateDisabled = parseInt(value)
94 }
95 }
96 })
97 }
98
99 -func (p *Postgres) doQueryCheckpoints() error {
100 - q := queryCheckpoints(p.pgVersion)
99 +func (c *Collector) doQueryCheckpoints() error {
100 + q := queryCheckpoints(c.pgVersion)
101
102 - return p.doQuery(q, func(column, value string, _ bool) {
102 + return c.doQuery(q, func(column, value string, _ bool) {
103 switch column {
104 case "checkpoints_timed":
105 - p.mx.checkpointsTimed = parseInt(value)
105 + c.mx.checkpointsTimed = parseInt(value)
106 case "checkpoints_req":
107 - p.mx.checkpointsReq = parseInt(value)
107 + c.mx.checkpointsReq = parseInt(value)
108 case "checkpoint_write_time":
109 - p.mx.checkpointWriteTime = parseInt(value)
109 + c.mx.checkpointWriteTime = parseInt(value)
110 case "checkpoint_sync_time":
111 - p.mx.checkpointSyncTime = parseInt(value)
111 + c.mx.checkpointSyncTime = parseInt(value)
112 case "buffers_checkpoint_bytes":
113 - p.mx.buffersCheckpoint = parseInt(value)
113 + c.mx.buffersCheckpoint = parseInt(value)
114 case "buffers_clean_bytes":
115 - p.mx.buffersClean = parseInt(value)
115 + c.mx.buffersClean = parseInt(value)
116 case "maxwritten_clean":
117 - p.mx.maxwrittenClean = parseInt(value)
117 + c.mx.maxwrittenClean = parseInt(value)
118 case "buffers_backend_bytes":
119 - p.mx.buffersBackend = parseInt(value)
119 + c.mx.buffersBackend = parseInt(value)
120 case "buffers_backend_fsync":
121 - p.mx.buffersBackendFsync = parseInt(value)
121 + c.mx.buffersBackendFsync = parseInt(value)
122 case "buffers_alloc_bytes":
123 - p.mx.buffersAlloc = parseInt(value)
123 + c.mx.buffersAlloc = parseInt(value)
124 }
125 })
126 }
127
128 -func (p *Postgres) doQueryUptime() error {
128 +func (c *Collector) doQueryUptime() error {
129 q := queryServerUptime()
130
131 var s string
132 - if err := p.doQueryRow(q, &s); err != nil {
132 + if err := c.doQueryRow(q, &s); err != nil {
133 return err
134 }
135
136 - p.mx.uptime = parseFloat(s)
136 + c.mx.uptime = parseFloat(s)
137
138 return nil
139 }
140
141 -func (p *Postgres) doQueryTXIDWraparound() error {
141 +func (c *Collector) doQueryTXIDWraparound() error {
142 q := queryTXIDWraparound()
143
144 - return p.doQuery(q, func(column, value string, _ bool) {
144 + return c.doQuery(q, func(column, value string, _ bool) {
145 switch column {
146 case "oldest_current_xid":
147 - p.mx.oldestXID = parseInt(value)
147 + c.mx.oldestXID = parseInt(value)
148 case "percent_towards_wraparound":
149 - p.mx.percentTowardsWraparound = parseInt(value)
149 + c.mx.percentTowardsWraparound = parseInt(value)
150 case "percent_towards_emergency_autovacuum":
151 - p.mx.percentTowardsEmergencyAutovacuum = parseInt(value)
151 + c.mx.percentTowardsEmergencyAutovacuum = parseInt(value)
152 }
153 })
154 }
155
156 -func (p *Postgres) doQueryWALWrites() error {
157 - q := queryWALWrites(p.pgVersion)
156 +func (c *Collector) doQueryWALWrites() error {
157 + q := queryWALWrites(c.pgVersion)
158
159 var v int64
160 - if err := p.doQueryRow(q, &v); err != nil {
160 + if err := c.doQueryRow(q, &v); err != nil {
161 return err
162 }
163
164 - p.mx.walWrites = v
164 + c.mx.walWrites = v
165
166 return nil
167 }
168
169 -func (p *Postgres) doQueryWALFiles() error {
170 - q := queryWALFiles(p.pgVersion)
169 +func (c *Collector) doQueryWALFiles() error {
170 + q := queryWALFiles(c.pgVersion)
171
172 - return p.doQuery(q, func(column, value string, _ bool) {
172 + return c.doQuery(q, func(column, value string, _ bool) {
173 switch column {
174 case "wal_recycled_files":
175 - p.mx.walRecycledFiles = parseInt(value)
175 + c.mx.walRecycledFiles = parseInt(value)
176 case "wal_written_files":
177 - p.mx.walWrittenFiles = parseInt(value)
177 + c.mx.walWrittenFiles = parseInt(value)
178 }
179 })
180 }
181
182 -func (p *Postgres) doQueryWALArchiveFiles() error {
183 - q := queryWALArchiveFiles(p.pgVersion)
182 +func (c *Collector) doQueryWALArchiveFiles() error {
183 + q := queryWALArchiveFiles(c.pgVersion)
184
185 - return p.doQuery(q, func(column, value string, _ bool) {
185 + return c.doQuery(q, func(column, value string, _ bool) {
186 switch column {
187 case "wal_archive_files_ready_count":
188 - p.mx.walArchiveFilesReady = parseInt(value)
188 + c.mx.walArchiveFilesReady = parseInt(value)
189 case "wal_archive_files_done_count":
190 - p.mx.walArchiveFilesDone = parseInt(value)
190 + c.mx.walArchiveFilesDone = parseInt(value)
191 }
192 })
193 }
194
195 -func (p *Postgres) doQueryCatalogRelations() error {
195 +func (c *Collector) doQueryCatalogRelations() error {
196 q := queryCatalogRelations()
197
198 var kind string
199 var count, size int64
200 - return p.doQuery(q, func(column, value string, rowEnd bool) {
200 + return c.doQuery(q, func(column, value string, rowEnd bool) {
201 switch column {
202 case "relkind":
203 kind = value
@@ -212,73 +212,73 @@ func (p *Postgres) doQueryCatalogRelations() error {
212 // https://www.postgresql.org/docs/current/catalog-pg-class.html
213 switch kind {
214 case "r":
215 - p.mx.relkindOrdinaryTable = count
216 - p.mx.relkindOrdinaryTableSize = size
215 + c.mx.relkindOrdinaryTable = count
216 + c.mx.relkindOrdinaryTableSize = size
217 case "i":
218 - p.mx.relkindIndex = count
219 - p.mx.relkindIndexSize = size
218 + c.mx.relkindIndex = count
219 + c.mx.relkindIndexSize = size
220 case "S":
221 - p.mx.relkindSequence = count
222 - p.mx.relkindSequenceSize = size
221 + c.mx.relkindSequence = count
222 + c.mx.relkindSequenceSize = size
223 case "t":
224 - p.mx.relkindTOASTTable = count
225 - p.mx.relkindTOASTTableSize = size
224 + c.mx.relkindTOASTTable = count
225 + c.mx.relkindTOASTTableSize = size
226 case "v":
227 - p.mx.relkindView = count
228 - p.mx.relkindViewSize = size
227 + c.mx.relkindView = count
228 + c.mx.relkindViewSize = size
229 case "m":
230 - p.mx.relkindMatView = count
231 - p.mx.relkindMatViewSize = size
230 + c.mx.relkindMatView = count
231 + c.mx.relkindMatViewSize = size
232 case "c":
233 - p.mx.relkindCompositeType = count
234 - p.mx.relkindCompositeTypeSize = size
233 + c.mx.relkindCompositeType = count
234 + c.mx.relkindCompositeTypeSize = size
235 case "f":
236 - p.mx.relkindForeignTable = count
237 - p.mx.relkindForeignTableSize = size
236 + c.mx.relkindForeignTable = count
237 + c.mx.relkindForeignTableSize = size
238 case "p":
239 - p.mx.relkindPartitionedTable = count
240 - p.mx.relkindPartitionedTableSize = size
239 + c.mx.relkindPartitionedTable = count
240 + c.mx.relkindPartitionedTableSize = size
241 case "I":
242 - p.mx.relkindPartitionedIndex = count
243 - p.mx.relkindPartitionedIndexSize = size
242 + c.mx.relkindPartitionedIndex = count
243 + c.mx.relkindPartitionedIndexSize = size
244 }
245 })
246 }
247
248 -func (p *Postgres) doQueryAutovacuumWorkers() error {
248 +func (c *Collector) doQueryAutovacuumWorkers() error {
249 q := queryAutovacuumWorkers()
250
251 - return p.doQuery(q, func(column, value string, _ bool) {
251 + return c.doQuery(q, func(column, value string, _ bool) {
252 switch column {
253 case "autovacuum_analyze":
254 - p.mx.autovacuumWorkersAnalyze = parseInt(value)
254 + c.mx.autovacuumWorkersAnalyze = parseInt(value)
255 case "autovacuum_vacuum_analyze":
256 - p.mx.autovacuumWorkersVacuumAnalyze = parseInt(value)
256 + c.mx.autovacuumWorkersVacuumAnalyze = parseInt(value)
257 case "autovacuum_vacuum":
258 - p.mx.autovacuumWorkersVacuum = parseInt(value)
258 + c.mx.autovacuumWorkersVacuum = parseInt(value)
259 case "autovacuum_vacuum_freeze":
260 - p.mx.autovacuumWorkersVacuumFreeze = parseInt(value)
260 + c.mx.autovacuumWorkersVacuumFreeze = parseInt(value)
261 case "autovacuum_brin_summarize":
262 - p.mx.autovacuumWorkersBrinSummarize = parseInt(value)
262 + c.mx.autovacuumWorkersBrinSummarize = parseInt(value)
263 }
264 })
265 }
266
267 -func (p *Postgres) doQueryXactQueryRunningTime() error {
267 +func (c *Collector) doQueryXactQueryRunningTime() error {
268 q := queryXactQueryRunningTime()
269
270 var state string
271 - return p.doQuery(q, func(column, value string, _ bool) {
271 + return c.doQuery(q, func(column, value string, _ bool) {
272 switch column {
273 case "state":
274 state = value
275 case "xact_running_time":
276 v, _ := strconv.ParseFloat(value, 64)
277 - p.mx.xactTimeHist.Observe(v)
277 + c.mx.xactTimeHist.Observe(v)
278 case "query_running_time":
279 if state == "active" {
280 v, _ := strconv.ParseFloat(value, 64)
281 - p.mx.queryTimeHist.Observe(v)
281 + c.mx.queryTimeHist.Observe(v)
282 }
283 }
284 })
src/go/plugin/go.d/collector/postgres/do_query_indexes.go
+16 -16
@@ -6,34 +6,34 @@ import (
6 "database/sql"
7 )
8
9 -func (p *Postgres) doQueryIndexesMetrics() error {
10 - if err := p.doQueryStatUserIndexes(); err != nil {
9 +func (c *Collector) doQueryIndexesMetrics() error {
10 + if err := c.doQueryStatUserIndexes(); err != nil {
11 return err
12 }
13
14 return nil
15 }
16
17 -func (p *Postgres) doQueryStatUserIndexes() error {
18 - if err := p.doDBQueryStatUserIndexes(p.db); err != nil {
19 - p.Warning(err)
17 +func (c *Collector) doQueryStatUserIndexes() error {
18 + if err := c.doDBQueryStatUserIndexes(c.db); err != nil {
19 + c.Warning(err)
20 }
21 - for _, conn := range p.dbConns {
21 + for _, conn := range c.dbConns {
22 if conn.db == nil {
23 continue
24 }
25 - if err := p.doDBQueryStatUserIndexes(conn.db); err != nil {
26 - p.Warning(err)
25 + if err := c.doDBQueryStatUserIndexes(conn.db); err != nil {
26 + c.Warning(err)
27 }
28 }
29 return nil
30 }
31
32 -func (p *Postgres) doDBQueryStatUserIndexes(db *sql.DB) error {
32 +func (c *Collector) doDBQueryStatUserIndexes(db *sql.DB) error {
33 q := queryStatUserIndexes()
34
35 var dbname, schema, table, name string
36 - return p.doDBQuery(db, q, func(column, value string, _ bool) {
36 + return c.doDBQuery(db, q, func(column, value string, _ bool) {
37 switch column {
38 case "datname":
39 dbname = value
@@ -43,17 +43,17 @@ func (p *Postgres) doDBQueryStatUserIndexes(db *sql.DB) error {
43 table = value
44 case "indexrelname":
45 name = removeSpaces(value)
46 - p.getIndexMetrics(name, table, dbname, schema).updated = true
46 + c.getIndexMetrics(name, table, dbname, schema).updated = true
47 case "parent_relname":
48 - p.getIndexMetrics(name, table, dbname, schema).parentTable = value
48 + c.getIndexMetrics(name, table, dbname, schema).parentTable = value
49 case "idx_scan":
50 - p.getIndexMetrics(name, table, dbname, schema).idxScan = parseInt(value)
50 + c.getIndexMetrics(name, table, dbname, schema).idxScan = parseInt(value)
51 case "idx_tup_read":
52 - p.getIndexMetrics(name, table, dbname, schema).idxTupRead = parseInt(value)
52 + c.getIndexMetrics(name, table, dbname, schema).idxTupRead = parseInt(value)
53 case "idx_tup_fetch":
54 - p.getIndexMetrics(name, table, dbname, schema).idxTupFetch = parseInt(value)
54 + c.getIndexMetrics(name, table, dbname, schema).idxTupFetch = parseInt(value)
55 case "size":
56 - p.getIndexMetrics(name, table, dbname, schema).size = parseInt(value)
56 + c.getIndexMetrics(name, table, dbname, schema).size = parseInt(value)
57 }
58 })
59 }
src/go/plugin/go.d/collector/postgres/do_query_misc.go
+30 -30
@@ -9,55 +9,55 @@ import (
9 "github.com/jackc/pgx/v5/stdlib"
10 )
11
12 -func (p *Postgres) doQueryServerVersion() (int, error) {
12 +func (c *Collector) doQueryServerVersion() (int, error) {
13 q := queryServerVersion()
14
15 var s string
16 - if err := p.doQueryRow(q, &s); err != nil {
16 + if err := c.doQueryRow(q, &s); err != nil {
17 return 0, err
18 }
19
20 return strconv.Atoi(s)
21 }
22
23 -func (p *Postgres) doQueryIsSuperUser() (bool, error) {
23 +func (c *Collector) doQueryIsSuperUser() (bool, error) {
24 q := queryIsSuperUser()
25
26 var v bool
27 - if err := p.doQueryRow(q, &v); err != nil {
27 + if err := c.doQueryRow(q, &v); err != nil {
28 return false, err
29 }
30
31 return v, nil
32 }
33
34 -func (p *Postgres) doQueryPGIsInRecovery() (bool, error) {
34 +func (c *Collector) doQueryPGIsInRecovery() (bool, error) {
35 q := queryPGIsInRecovery()
36
37 var v bool
38 - if err := p.doQueryRow(q, &v); err != nil {
38 + if err := c.doQueryRow(q, &v); err != nil {
39 return false, err
40 }
41
42 return v, nil
43 }
44
45 -func (p *Postgres) doQuerySettingsMaxConnections() (int64, error) {
45 +func (c *Collector) doQuerySettingsMaxConnections() (int64, error) {
46 q := querySettingsMaxConnections()
47
48 var s string
49 - if err := p.doQueryRow(q, &s); err != nil {
49 + if err := c.doQueryRow(q, &s); err != nil {
50 return 0, err
51 }
52
53 return strconv.ParseInt(s, 10, 64)
54 }
55
56 -func (p *Postgres) doQuerySettingsMaxLocksHeld() (int64, error) {
56 +func (c *Collector) doQuerySettingsMaxLocksHeld() (int64, error) {
57 q := querySettingsMaxLocksHeld()
58
59 var s string
60 - if err := p.doQueryRow(q, &s); err != nil {
60 + if err := c.doQueryRow(q, &s); err != nil {
61 return 0, err
62 }
63
@@ -66,12 +66,12 @@ func (p *Postgres) doQuerySettingsMaxLocksHeld() (int64, error) {
66
67 const connErrMax = 3
68
69 -func (p *Postgres) doQueryQueryableDatabases() error {
69 +func (c *Collector) doQueryQueryableDatabases() error {
70 q := queryQueryableDatabaseList()
71
72 var dbs []string
73 - err := p.doQuery(q, func(_, value string, _ bool) {
74 - if p.dbSr != nil && p.dbSr.MatchString(value) {
73 + err := c.doQuery(q, func(_, value string, _ bool) {
74 + if c.dbSr != nil && c.dbSr.MatchString(value) {
75 dbs = append(dbs, value)
76 }
77 })
@@ -84,44 +84,44 @@ func (p *Postgres) doQueryQueryableDatabases() error {
84 for _, dbname := range dbs {
85 seen[dbname] = true
86
87 - conn, ok := p.dbConns[dbname]
87 + conn, ok := c.dbConns[dbname]
88 if !ok {
89 conn = &dbConn{}
90 - p.dbConns[dbname] = conn
90 + c.dbConns[dbname] = conn
91 }
92
93 if conn.db != nil || conn.connErrors >= connErrMax {
94 continue
95 }
96
97 - db, connStr, err := p.openSecondaryConnection(dbname)
97 + db, connStr, err := c.openSecondaryConnection(dbname)
98 if err != nil {
99 - p.Warning(err)
99 + c.Warning(err)
100 conn.connErrors++
101 continue
102 }
103
104 - tables, err := p.doDBQueryUserTablesCount(db)
104 + tables, err := c.doDBQueryUserTablesCount(db)
105 if err != nil {
106 - p.Warning(err)
106 + c.Warning(err)
107 conn.connErrors++
108 _ = db.Close()
109 stdlib.UnregisterConnConfig(connStr)
110 continue
111 }
112
113 - indexes, err := p.doDBQueryUserIndexesCount(db)
113 + indexes, err := c.doDBQueryUserIndexesCount(db)
114 if err != nil {
115 - p.Warning(err)
115 + c.Warning(err)
116 conn.connErrors++
117 _ = db.Close()
118 stdlib.UnregisterConnConfig(connStr)
119 continue
120 }
121
122 - if (p.MaxDBTables != 0 && tables > p.MaxDBTables) || (p.MaxDBIndexes != 0 && indexes > p.MaxDBIndexes) {
123 - p.Warningf("database '%s' has too many user tables(%d/%d)/indexes(%d/%d), skipping it",
124 - dbname, tables, p.MaxDBTables, indexes, p.MaxDBIndexes)
122 + if (c.MaxDBTables != 0 && tables > c.MaxDBTables) || (c.MaxDBIndexes != 0 && indexes > c.MaxDBIndexes) {
123 + c.Warningf("database '%s' has too many user tables(%d/%d)/indexes(%d/%d), skipping it",
124 + dbname, tables, c.MaxDBTables, indexes, c.MaxDBIndexes)
125 conn.connErrors = connErrMax
126 _ = db.Close()
127 stdlib.UnregisterConnConfig(connStr)
@@ -131,11 +131,11 @@ func (p *Postgres) doQueryQueryableDatabases() error {
131 conn.db, conn.connStr = db, connStr
132 }
133
134 - for dbname, conn := range p.dbConns {
134 + for dbname, conn := range c.dbConns {
135 if seen[dbname] {
136 continue
137 }
138 - delete(p.dbConns, dbname)
138 + delete(c.dbConns, dbname)
139 if conn.connStr != "" {
140 stdlib.UnregisterConnConfig(conn.connStr)
141 }
@@ -147,22 +147,22 @@ func (p *Postgres) doQueryQueryableDatabases() error {
147 return nil
148 }
149
150 -func (p *Postgres) doDBQueryUserTablesCount(db *sql.DB) (int64, error) {
150 +func (c *Collector) doDBQueryUserTablesCount(db *sql.DB) (int64, error) {
151 q := queryUserTablesCount()
152
153 var v string
154 - if err := p.doDBQueryRow(db, q, &v); err != nil {
154 + if err := c.doDBQueryRow(db, q, &v); err != nil {
155 return 0, err
156 }
157
158 return parseInt(v), nil
159 }
160
161 -func (p *Postgres) doDBQueryUserIndexesCount(db *sql.DB) (int64, error) {
161 +func (c *Collector) doDBQueryUserIndexesCount(db *sql.DB) (int64, error) {
162 q := queryUserIndexesCount()
163
164 var v string
165 - if err := p.doDBQueryRow(db, q, &v); err != nil {
165 + if err := c.doDBQueryRow(db, q, &v); err != nil {
166 return 0, err
167 }
168
src/go/plugin/go.d/collector/postgres/do_query_replication.go
+26 -26
@@ -6,19 +6,19 @@ import (
6 "fmt"
7 )
8
9 -func (p *Postgres) doQueryReplicationMetrics() error {
10 - if err := p.doQueryReplStandbyAppWALDelta(); err != nil {
9 +func (c *Collector) doQueryReplicationMetrics() error {
10 + if err := c.doQueryReplStandbyAppWALDelta(); err != nil {
11 return fmt.Errorf("querying replication standby app wal delta error: %v", err)
12 }
13
14 - if p.pgVersion >= pgVersion10 {
15 - if err := p.doQueryReplStandbyAppWALLag(); err != nil {
14 + if c.pgVersion >= pgVersion10 {
15 + if err := c.doQueryReplStandbyAppWALLag(); err != nil {
16 return fmt.Errorf("querying replication standby app wal lag error: %v", err)
17 }
18 }
19
20 - if p.pgVersion >= pgVersion10 && p.isSuperUser() {
21 - if err := p.doQueryReplSlotFiles(); err != nil {
20 + if c.pgVersion >= pgVersion10 && c.isSuperUser() {
21 + if err := c.doQueryReplSlotFiles(); err != nil {
22 return fmt.Errorf("querying replication slot files error: %v", err)
23 }
24 }
@@ -26,15 +26,15 @@ func (p *Postgres) doQueryReplicationMetrics() error {
26 return nil
27 }
28
29 -func (p *Postgres) doQueryReplStandbyAppWALDelta() error {
30 - q := queryReplicationStandbyAppDelta(p.pgVersion)
29 +func (c *Collector) doQueryReplStandbyAppWALDelta() error {
30 + q := queryReplicationStandbyAppDelta(c.pgVersion)
31
32 var app string
33 - return p.doQuery(q, func(column, value string, _ bool) {
33 + return c.doQuery(q, func(column, value string, _ bool) {
34 switch column {
35 case "application_name":
36 app = value
37 - p.getReplAppMetrics(app).updated = true
37 + c.getReplAppMetrics(app).updated = true
38 default:
39 // TODO: delta calculation was changed in https://github.com/netdata/netdata/go/plugins/plugin/go.d/pull/1039
40 // - 'replay_delta' (probably other deltas too?) can be negative
@@ -45,50 +45,50 @@ func (p *Postgres) doQueryReplStandbyAppWALDelta() error {
45 }
46 switch column {
47 case "sent_delta":
48 - p.getReplAppMetrics(app).walSentDelta += v
48 + c.getReplAppMetrics(app).walSentDelta += v
49 case "write_delta":
50 - p.getReplAppMetrics(app).walWriteDelta += v
50 + c.getReplAppMetrics(app).walWriteDelta += v
51 case "flush_delta":
52 - p.getReplAppMetrics(app).walFlushDelta += v
52 + c.getReplAppMetrics(app).walFlushDelta += v
53 case "replay_delta":
54 - p.getReplAppMetrics(app).walReplayDelta += v
54 + c.getReplAppMetrics(app).walReplayDelta += v
55 }
56 }
57 })
58 }
59
60 -func (p *Postgres) doQueryReplStandbyAppWALLag() error {
60 +func (c *Collector) doQueryReplStandbyAppWALLag() error {
61 q := queryReplicationStandbyAppLag()
62
63 var app string
64 - return p.doQuery(q, func(column, value string, _ bool) {
64 + return c.doQuery(q, func(column, value string, _ bool) {
65 switch column {
66 case "application_name":
67 app = value
68 - p.getReplAppMetrics(app).updated = true
68 + c.getReplAppMetrics(app).updated = true
69 case "write_lag":
70 - p.getReplAppMetrics(app).walWriteLag += parseInt(value)
70 + c.getReplAppMetrics(app).walWriteLag += parseInt(value)
71 case "flush_lag":
72 - p.getReplAppMetrics(app).walFlushLag += parseInt(value)
72 + c.getReplAppMetrics(app).walFlushLag += parseInt(value)
73 case "replay_lag":
74 - p.getReplAppMetrics(app).walReplayLag += parseInt(value)
74 + c.getReplAppMetrics(app).walReplayLag += parseInt(value)
75 }
76 })
77 }
78
79 -func (p *Postgres) doQueryReplSlotFiles() error {
80 - q := queryReplicationSlotFiles(p.pgVersion)
79 +func (c *Collector) doQueryReplSlotFiles() error {
80 + q := queryReplicationSlotFiles(c.pgVersion)
81
82 var slot string
83 - return p.doQuery(q, func(column, value string, _ bool) {
83 + return c.doQuery(q, func(column, value string, _ bool) {
84 switch column {
85 case "slot_name":
86 slot = value
87 - p.getReplSlotMetrics(slot).updated = true
87 + c.getReplSlotMetrics(slot).updated = true
88 case "replslot_wal_keep":
89 - p.getReplSlotMetrics(slot).walKeep += parseInt(value)
89 + c.getReplSlotMetrics(slot).walKeep += parseInt(value)
90 case "replslot_files":
91 - p.getReplSlotMetrics(slot).files += parseInt(value)
91 + c.getReplSlotMetrics(slot).files += parseInt(value)
92 }
93 })
94 }
src/go/plugin/go.d/collector/postgres/do_query_tables.go
+50 -50
@@ -7,52 +7,52 @@ import (
7 "strings"
8 )
9
10 -func (p *Postgres) doQueryTablesMetrics() error {
11 - if err := p.doQueryStatUserTable(); err != nil {
10 +func (c *Collector) doQueryTablesMetrics() error {
11 + if err := c.doQueryStatUserTable(); err != nil {
12 return err
13 }
14 - if err := p.doQueryStatIOUserTables(); err != nil {
14 + if err := c.doQueryStatIOUserTables(); err != nil {
15 return err
16 }
17
18 return nil
19 }
20
21 -func (p *Postgres) doQueryStatUserTable() error {
22 - if err := p.doDBQueryStatUserTables(p.db); err != nil {
23 - p.Warning(err)
21 +func (c *Collector) doQueryStatUserTable() error {
22 + if err := c.doDBQueryStatUserTables(c.db); err != nil {
23 + c.Warning(err)
24 }
25 - for _, conn := range p.dbConns {
25 + for _, conn := range c.dbConns {
26 if conn.db == nil {
27 continue
28 }
29 - if err := p.doDBQueryStatUserTables(conn.db); err != nil {
30 - p.Warning(err)
29 + if err := c.doDBQueryStatUserTables(conn.db); err != nil {
30 + c.Warning(err)
31 }
32 }
33 return nil
34 }
35
36 -func (p *Postgres) doQueryStatIOUserTables() error {
37 - if err := p.doDBQueryStatIOUserTables(p.db); err != nil {
38 - p.Warning(err)
36 +func (c *Collector) doQueryStatIOUserTables() error {
37 + if err := c.doDBQueryStatIOUserTables(c.db); err != nil {
38 + c.Warning(err)
39 }
40 - for _, conn := range p.dbConns {
40 + for _, conn := range c.dbConns {
41 if conn.db == nil {
42 continue
43 }
44 - if err := p.doDBQueryStatIOUserTables(conn.db); err != nil {
45 - p.Warning(err)
44 + if err := c.doDBQueryStatIOUserTables(conn.db); err != nil {
45 + c.Warning(err)
46 }
47 }
48 return nil
49 }
50
51 -func (p *Postgres) doDBQueryStatUserTables(db *sql.DB) error {
51 +func (c *Collector) doDBQueryStatUserTables(db *sql.DB) error {
52 q := queryStatUserTables()
53
54 var dbname, schema, name string
55 - return p.doDBQuery(db, q, func(column, value string, _ bool) {
55 + return c.doDBQuery(db, q, func(column, value string, _ bool) {
56 if value == "" && strings.HasPrefix(column, "last_") {
57 value = "-1"
58 }
@@ -63,56 +63,56 @@ func (p *Postgres) doDBQueryStatUserTables(db *sql.DB) error {
63 schema = value
64 case "relname":
65 name = value
66 - p.getTableMetrics(name, dbname, schema).updated = true
66 + c.getTableMetrics(name, dbname, schema).updated = true
67 case "parent_relname":
68 - p.getTableMetrics(name, dbname, schema).parentName = value
68 + c.getTableMetrics(name, dbname, schema).parentName = value
69 case "seq_scan":
70 - p.getTableMetrics(name, dbname, schema).seqScan = parseInt(value)
70 + c.getTableMetrics(name, dbname, schema).seqScan = parseInt(value)
71 case "seq_tup_read":
72 - p.getTableMetrics(name, dbname, schema).seqTupRead = parseInt(value)
72 + c.getTableMetrics(name, dbname, schema).seqTupRead = parseInt(value)
73 case "idx_scan":
74 - p.getTableMetrics(name, dbname, schema).idxScan = parseInt(value)
74 + c.getTableMetrics(name, dbname, schema).idxScan = parseInt(value)
75 case "idx_tup_fetch":
76 - p.getTableMetrics(name, dbname, schema).idxTupFetch = parseInt(value)
76 + c.getTableMetrics(name, dbname, schema).idxTupFetch = parseInt(value)
77 case "n_tup_ins":
78 - p.getTableMetrics(name, dbname, schema).nTupIns = parseInt(value)
78 + c.getTableMetrics(name, dbname, schema).nTupIns = parseInt(value)
79 case "n_tup_upd":
80 - p.getTableMetrics(name, dbname, schema).nTupUpd.last = parseInt(value)
80 + c.getTableMetrics(name, dbname, schema).nTupUpd.last = parseInt(value)
81 case "n_tup_del":
82 - p.getTableMetrics(name, dbname, schema).nTupDel = parseInt(value)
82 + c.getTableMetrics(name, dbname, schema).nTupDel = parseInt(value)
83 case "n_tup_hot_upd":
84 - p.getTableMetrics(name, dbname, schema).nTupHotUpd.last = parseInt(value)
84 + c.getTableMetrics(name, dbname, schema).nTupHotUpd.last = parseInt(value)
85 case "n_live_tup":
86 - p.getTableMetrics(name, dbname, schema).nLiveTup = parseInt(value)
86 + c.getTableMetrics(name, dbname, schema).nLiveTup = parseInt(value)
87 case "n_dead_tup":
88 - p.getTableMetrics(name, dbname, schema).nDeadTup = parseInt(value)
88 + c.getTableMetrics(name, dbname, schema).nDeadTup = parseInt(value)
89 case "last_vacuum":
90 - p.getTableMetrics(name, dbname, schema).lastVacuumAgo = parseFloat(value)
90 + c.getTableMetrics(name, dbname, schema).lastVacuumAgo = parseFloat(value)
91 case "last_autovacuum":
92 - p.getTableMetrics(name, dbname, schema).lastAutoVacuumAgo = parseFloat(value)
92 + c.getTableMetrics(name, dbname, schema).lastAutoVacuumAgo = parseFloat(value)
93 case "last_analyze":
94 - p.getTableMetrics(name, dbname, schema).lastAnalyzeAgo = parseFloat(value)
94 + c.getTableMetrics(name, dbname, schema).lastAnalyzeAgo = parseFloat(value)
95 case "last_autoanalyze":
96 - p.getTableMetrics(name, dbname, schema).lastAutoAnalyzeAgo = parseFloat(value)
96 + c.getTableMetrics(name, dbname, schema).lastAutoAnalyzeAgo = parseFloat(value)
97 case "vacuum_count":
98 - p.getTableMetrics(name, dbname, schema).vacuumCount = parseInt(value)
98 + c.getTableMetrics(name, dbname, schema).vacuumCount = parseInt(value)
99 case "autovacuum_count":
100 - p.getTableMetrics(name, dbname, schema).autovacuumCount = parseInt(value)
100 + c.getTableMetrics(name, dbname, schema).autovacuumCount = parseInt(value)
101 case "analyze_count":
102 - p.getTableMetrics(name, dbname, schema).analyzeCount = parseInt(value)
102 + c.getTableMetrics(name, dbname, schema).analyzeCount = parseInt(value)
103 case "autoanalyze_count":
104 - p.getTableMetrics(name, dbname, schema).autoAnalyzeCount = parseInt(value)
104 + c.getTableMetrics(name, dbname, schema).autoAnalyzeCount = parseInt(value)
105 case "total_relation_size":
106 - p.getTableMetrics(name, dbname, schema).totalSize = parseInt(value)
106 + c.getTableMetrics(name, dbname, schema).totalSize = parseInt(value)
107 }
108 })
109 }
110
111 -func (p *Postgres) doDBQueryStatIOUserTables(db *sql.DB) error {
111 +func (c *Collector) doDBQueryStatIOUserTables(db *sql.DB) error {
112 q := queryStatIOUserTables()
113
114 var dbname, schema, name string
115 - return p.doDBQuery(db, q, func(column, value string, rowEnd bool) {
115 + return c.doDBQuery(db, q, func(column, value string, rowEnd bool) {
116 if value == "" && column != "parent_relname" {
117 value = "-1"
118 }
@@ -123,25 +123,25 @@ func (p *Postgres) doDBQueryStatIOUserTables(db *sql.DB) error {
123 schema = value
124 case "relname":
125 name = value
126 - p.getTableMetrics(name, dbname, schema).updated = true
126 + c.getTableMetrics(name, dbname, schema).updated = true
127 case "parent_relname":
128 - p.getTableMetrics(name, dbname, schema).parentName = value
128 + c.getTableMetrics(name, dbname, schema).parentName = value
129 case "heap_blks_read_bytes":
130 - p.getTableMetrics(name, dbname, schema).heapBlksRead.last = parseInt(value)
130 + c.getTableMetrics(name, dbname, schema).heapBlksRead.last = parseInt(value)
131 case "heap_blks_hit_bytes":
132 - p.getTableMetrics(name, dbname, schema).heapBlksHit.last = parseInt(value)
132 + c.getTableMetrics(name, dbname, schema).heapBlksHit.last = parseInt(value)
133 case "idx_blks_read_bytes":
134 - p.getTableMetrics(name, dbname, schema).idxBlksRead.last = parseInt(value)
134 + c.getTableMetrics(name, dbname, schema).idxBlksRead.last = parseInt(value)
135 case "idx_blks_hit_bytes":
136 - p.getTableMetrics(name, dbname, schema).idxBlksHit.last = parseInt(value)
136 + c.getTableMetrics(name, dbname, schema).idxBlksHit.last = parseInt(value)
137 case "toast_blks_read_bytes":
138 - p.getTableMetrics(name, dbname, schema).toastBlksRead.last = parseInt(value)
138 + c.getTableMetrics(name, dbname, schema).toastBlksRead.last = parseInt(value)
139 case "toast_blks_hit_bytes":
140 - p.getTableMetrics(name, dbname, schema).toastBlksHit.last = parseInt(value)
140 + c.getTableMetrics(name, dbname, schema).toastBlksHit.last = parseInt(value)
141 case "tidx_blks_read_bytes":
142 - p.getTableMetrics(name, dbname, schema).tidxBlksRead.last = parseInt(value)
142 + c.getTableMetrics(name, dbname, schema).tidxBlksRead.last = parseInt(value)
143 case "tidx_blks_hit_bytes":
144 - p.getTableMetrics(name, dbname, schema).tidxBlksHit.last = parseInt(value)
144 + c.getTableMetrics(name, dbname, schema).tidxBlksHit.last = parseInt(value)
145 }
146 })
147 }
src/go/plugin/go.d/collector/postgres/init.go
+5 -5
@@ -8,17 +8,17 @@ import (
8 "github.com/netdata/netdata/go/plugins/pkg/matcher"
9 )
10
11 -func (p *Postgres) validateConfig() error {
12 - if p.DSN == "" {
11 +func (c *Collector) validateConfig() error {
12 + if c.DSN == "" {
13 return errors.New("DSN not set")
14 }
15 return nil
16 }
17
18 -func (p *Postgres) initDBSelector() (matcher.Matcher, error) {
19 - if p.DBSelector == "" {
18 +func (c *Collector) initDBSelector() (matcher.Matcher, error) {
19 + if c.DBSelector == "" {
20 return nil, nil
21 }
22
23 - return matcher.NewSimplePatternsMatcher(p.DBSelector)
23 + return matcher.NewSimplePatternsMatcher(c.DBSelector)
24 }
src/go/plugin/go.d/collector/powerdns/collect.go
+9 -9
@@ -13,15 +13,15 @@ const (
13 urlPathLocalStatistics = "/api/v1/servers/localhost/statistics"
14 )
15
16 -func (ns *AuthoritativeNS) collect() (map[string]int64, error) {
17 - statistics, err := ns.scrapeStatistics()
16 +func (c *Collector) collect() (map[string]int64, error) {
17 + statistics, err := c.scrapeStatistics()
18 if err != nil {
19 return nil, err
20 }
21
22 collected := make(map[string]int64)
23
24 - ns.collectStatistics(collected, statistics)
24 + c.collectStatistics(collected, statistics)
25
26 if !isPowerDNSAuthoritativeNSMetrics(collected) {
27 return nil, errors.New("returned metrics aren't PowerDNS Authoritative Server metrics")
@@ -37,7 +37,7 @@ func isPowerDNSAuthoritativeNSMetrics(collected map[string]int64) bool {
37 return !ok1 && !ok2
38 }
39
40 -func (ns *AuthoritativeNS) collectStatistics(collected map[string]int64, statistics statisticMetrics) {
40 +func (c *Collector) collectStatistics(collected map[string]int64, statistics statisticMetrics) {
41 for _, s := range statistics {
42 // https://doc.powerdns.com/authoritative/http-api/statistics.html#statisticitem
43 if s.Type != "StatisticItem" {
@@ -46,13 +46,13 @@ func (ns *AuthoritativeNS) collectStatistics(collected map[string]int64, statist
46
47 value, ok := s.Value.(string)
48 if !ok {
49 - ns.Debugf("%s value (%v) unexpected type: want=string, got=%T.", s.Name, s.Value, s.Value)
49 + c.Debugf("%s value (%v) unexpected type: want=string, got=%T.", s.Name, s.Value, s.Value)
50 continue
51 }
52
53 v, err := strconv.ParseInt(value, 10, 64)
54 if err != nil {
55 - ns.Debugf("%s value (%v) parse error: %v", s.Name, s.Value, err)
55 + c.Debugf("%s value (%v) parse error: %v", s.Name, s.Value, err)
56 continue
57 }
58
@@ -60,11 +60,11 @@ func (ns *AuthoritativeNS) collectStatistics(collected map[string]int64, statist
60 }
61 }
62
63 -func (ns *AuthoritativeNS) scrapeStatistics() ([]statisticMetric, error) {
64 - req, _ := web.NewHTTPRequestWithPath(ns.RequestConfig, urlPathLocalStatistics)
63 +func (c *Collector) scrapeStatistics() ([]statisticMetric, error) {
64 + req, _ := web.NewHTTPRequestWithPath(c.RequestConfig, urlPathLocalStatistics)
65
66 var stats statisticMetrics
67 - if err := web.DoHTTP(ns.httpClient).RequestJSON(req, &stats); err != nil {
67 + if err := web.DoHTTP(c.httpClient).RequestJSON(req, &stats); err != nil {
68 return nil, err
69 }
70
src/go/plugin/go.d/collector/powerdns/collector.go renamed
+21 -21
@@ -25,8 +25,8 @@ func init() {
25 })
26 }
27
28 -func New() *AuthoritativeNS {
29 - return &AuthoritativeNS{
28 +func New() *Collector {
29 + return &Collector{
30 Config: Config{
31 HTTPConfig: web.HTTPConfig{
32 RequestConfig: web.RequestConfig{
@@ -45,7 +45,7 @@ type Config struct {
45 web.HTTPConfig `yaml:",inline" json:""`
46 }
47
48 -type AuthoritativeNS struct {
48 +type Collector struct {
49 module.Base
50 Config `yaml:",inline" json:""`
51
@@ -54,33 +54,33 @@ type AuthoritativeNS struct {
54 httpClient *http.Client
55 }
56
57 -func (ns *AuthoritativeNS) Configuration() any {
58 - return ns.Config
57 +func (c *Collector) Configuration() any {
58 + return c.Config
59 }
60
61 -func (ns *AuthoritativeNS) Init() error {
62 - err := ns.validateConfig()
61 +func (c *Collector) Init() error {
62 + err := c.validateConfig()
63 if err != nil {
64 return fmt.Errorf("config validation: %v", err)
65 }
66
67 - client, err := ns.initHTTPClient()
67 + client, err := c.initHTTPClient()
68 if err != nil {
69 return fmt.Errorf("init HTTP client: %v", err)
70 }
71 - ns.httpClient = client
71 + c.httpClient = client
72
73 - cs, err := ns.initCharts()
73 + cs, err := c.initCharts()
74 if err != nil {
75 return fmt.Errorf("init charts: %v", err)
76 }
77 - ns.charts = cs
77 + c.charts = cs
78
79 return nil
80 }
81
82 -func (ns *AuthoritativeNS) Check() error {
83 - mx, err := ns.collect()
82 +func (c *Collector) Check() error {
83 + mx, err := c.collect()
84 if err != nil {
85 return err
86 }
@@ -90,14 +90,14 @@ func (ns *AuthoritativeNS) Check() error {
90 return nil
91 }
92
93 -func (ns *AuthoritativeNS) Charts() *module.Charts {
94 - return ns.charts
93 +func (c *Collector) Charts() *module.Charts {
94 + return c.charts
95 }
96
97 -func (ns *AuthoritativeNS) Collect() map[string]int64 {
98 - ms, err := ns.collect()
97 +func (c *Collector) Collect() map[string]int64 {
98 + ms, err := c.collect()
99 if err != nil {
100 - ns.Error(err)
100 + c.Error(err)
101 }
102
103 if len(ms) == 0 {
@@ -106,9 +106,9 @@ func (ns *AuthoritativeNS) Collect() map[string]int64 {
106 return ms
107 }
108
109 -func (ns *AuthoritativeNS) Cleanup() {
110 - if ns.httpClient == nil {
109 +func (c *Collector) Cleanup() {
110 + if c.httpClient == nil {
111 return
112 }
113 - ns.httpClient.CloseIdleConnections()
113 + c.httpClient.CloseIdleConnections()
114 }
src/go/plugin/go.d/collector/powerdns/collector_test.go renamed
+44 -44
@@ -35,11 +35,11 @@ func Test_testDataIsValid(t *testing.T) {
35 }
36 }
37
38 -func TestAuthoritativeNS_ConfigurationSerialize(t *testing.T) {
39 - module.TestConfigurationSerialize(t, &AuthoritativeNS{}, dataConfigJSON, dataConfigYAML)
38 +func TestCollector_ConfigurationSerialize(t *testing.T) {
39 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
40 }
41
42 -func TestAuthoritativeNS_Init(t *testing.T) {
42 +func TestCollector_Init(t *testing.T) {
43 tests := map[string]struct {
44 config Config
45 wantFail bool
@@ -72,21 +72,21 @@ func TestAuthoritativeNS_Init(t *testing.T) {
72
73 for name, test := range tests {
74 t.Run(name, func(t *testing.T) {
75 - ns := New()
76 - ns.Config = test.config
75 + collr := New()
76 + collr.Config = test.config
77
78 if test.wantFail {
79 - assert.Error(t, ns.Init())
79 + assert.Error(t, collr.Init())
80 } else {
81 - assert.NoError(t, ns.Init())
81 + assert.NoError(t, collr.Init())
82 }
83 })
84 }
85 }
86
87 -func TestAuthoritativeNS_Check(t *testing.T) {
87 +func TestCollector_Check(t *testing.T) {
88 tests := map[string]struct {
89 - prepare func() (ns *AuthoritativeNS, cleanup func())
89 + prepare func() (collr *Collector, cleanup func())
90 wantFail bool
91 }{
92 "success on valid response v4.3.0": {
@@ -112,32 +112,32 @@ func TestAuthoritativeNS_Check(t *testing.T) {
112
113 for name, test := range tests {
114 t.Run(name, func(t *testing.T) {
115 - ns, cleanup := test.prepare()
115 + collr, cleanup := test.prepare()
116 defer cleanup()
117 - require.NoError(t, ns.Init())
117 + require.NoError(t, collr.Init())
118
119 if test.wantFail {
120 - assert.Error(t, ns.Check())
120 + assert.Error(t, collr.Check())
121 } else {
122 - assert.NoError(t, ns.Check())
122 + assert.NoError(t, collr.Check())
123 }
124 })
125 }
126 }
127
128 -func TestAuthoritativeNS_Charts(t *testing.T) {
129 - ns := New()
130 - require.NoError(t, ns.Init())
131 - assert.NotNil(t, ns.Charts())
128 +func TestCollector_Charts(t *testing.T) {
129 + collr := New()
130 + require.NoError(t, collr.Init())
131 + assert.NotNil(t, collr.Charts())
132 }
133
134 -func TestAuthoritativeNS_Cleanup(t *testing.T) {
134 +func TestCollector_Cleanup(t *testing.T) {
135 assert.NotPanics(t, New().Cleanup)
136 }
137
138 -func TestAuthoritativeNS_Collect(t *testing.T) {
138 +func TestCollector_Collect(t *testing.T) {
139 tests := map[string]struct {
140 - prepare func() (p *AuthoritativeNS, cleanup func())
140 + prepare func() (collr *Collector, cleanup func())
141 wantCollected map[string]int64
142 }{
143 "success on valid response v4.3.0": {
@@ -240,63 +240,63 @@ func TestAuthoritativeNS_Collect(t *testing.T) {
240
241 for name, test := range tests {
242 t.Run(name, func(t *testing.T) {
243 - ns, cleanup := test.prepare()
243 + collr, cleanup := test.prepare()
244 defer cleanup()
245 - require.NoError(t, ns.Init())
245 + require.NoError(t, collr.Init())
246
247 - mx := ns.Collect()
247 + mx := collr.Collect()
248
249 assert.Equal(t, test.wantCollected, mx)
250 if len(test.wantCollected) > 0 {
251 - module.TestMetricsHasAllChartsDims(t, ns.Charts(), mx)
251 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
252 }
253 })
254 }
255 }
256
257 -func preparePowerDNSAuthoritativeNSV430() (*AuthoritativeNS, func()) {
257 +func preparePowerDNSAuthoritativeNSV430() (*Collector, func()) {
258 srv := preparePowerDNSAuthoritativeNSEndpoint()
259 - ns := New()
260 - ns.URL = srv.URL
259 + collr := New()
260 + collr.URL = srv.URL
261
262 - return ns, srv.Close
262 + return collr, srv.Close
263 }
264
265 -func preparePowerDNSAuthoritativeNSRecursorData() (*AuthoritativeNS, func()) {
265 +func preparePowerDNSAuthoritativeNSRecursorData() (*Collector, func()) {
266 srv := preparePowerDNSRecursorEndpoint()
267 - ns := New()
268 - ns.URL = srv.URL
267 + collr := New()
268 + collr.URL = srv.URL
269
270 - return ns, srv.Close
270 + return collr, srv.Close
271 }
272
273 -func preparePowerDNSAuthoritativeNSInvalidData() (*AuthoritativeNS, func()) {
273 +func preparePowerDNSAuthoritativeNSInvalidData() (*Collector, func()) {
274 srv := httptest.NewServer(http.HandlerFunc(
275 func(w http.ResponseWriter, r *http.Request) {
276 _, _ = w.Write([]byte("hello and\n goodbye"))
277 }))
278 - ns := New()
279 - ns.URL = srv.URL
278 + collr := New()
279 + collr.URL = srv.URL
280
281 - return ns, srv.Close
281 + return collr, srv.Close
282 }
283
284 -func preparePowerDNSAuthoritativeNS404() (*AuthoritativeNS, func()) {
284 +func preparePowerDNSAuthoritativeNS404() (*Collector, func()) {
285 srv := httptest.NewServer(http.HandlerFunc(
286 func(w http.ResponseWriter, r *http.Request) {
287 w.WriteHeader(http.StatusNotFound)
288 }))
289 - ns := New()
290 - ns.URL = srv.URL
289 + collr := New()
290 + collr.URL = srv.URL
291
292 - return ns, srv.Close
292 + return collr, srv.Close
293 }
294
295 -func preparePowerDNSAuthoritativeNSConnectionRefused() (*AuthoritativeNS, func()) {
296 - ns := New()
297 - ns.URL = "http://127.0.0.1:38001"
295 +func preparePowerDNSAuthoritativeNSConnectionRefused() (*Collector, func()) {
296 + collr := New()
297 + collr.URL = "http://127.0.0.1:38001"
298
299 - return ns, func() {}
299 + return collr, func() {}
300 }
301
302 func preparePowerDNSAuthoritativeNSEndpoint() *httptest.Server {
src/go/plugin/go.d/collector/powerdns/init.go
+6 -6
@@ -10,20 +10,20 @@ import (
10 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/web"
11 )
12
13 -func (ns *AuthoritativeNS) validateConfig() error {
14 - if ns.URL == "" {
13 +func (c *Collector) validateConfig() error {
14 + if c.URL == "" {
15 return errors.New("URL not set")
16 }
17 - if _, err := web.NewHTTPRequest(ns.RequestConfig); err != nil {
17 + if _, err := web.NewHTTPRequest(c.RequestConfig); err != nil {
18 return err
19 }
20 return nil
21 }
22
23 -func (ns *AuthoritativeNS) initHTTPClient() (*http.Client, error) {
24 - return web.NewHTTPClient(ns.ClientConfig)
23 +func (c *Collector) initHTTPClient() (*http.Client, error) {
24 + return web.NewHTTPClient(c.ClientConfig)
25 }
26
27 -func (ns *AuthoritativeNS) initCharts() (*module.Charts, error) {
27 +func (c *Collector) initCharts() (*module.Charts, error) {
28 return charts.Copy(), nil
29 }
src/go/plugin/go.d/collector/powerdns_recursor/collect.go
+9 -9
@@ -13,15 +13,15 @@ const (
13 urlPathLocalStatistics = "/api/v1/servers/localhost/statistics"
14 )
15
16 -func (r *Recursor) collect() (map[string]int64, error) {
17 - statistics, err := r.scrapeStatistics()
16 +func (c *Collector) collect() (map[string]int64, error) {
17 + statistics, err := c.scrapeStatistics()
18 if err != nil {
19 return nil, err
20 }
21
22 collected := make(map[string]int64)
23
24 - r.collectStatistics(collected, statistics)
24 + c.collectStatistics(collected, statistics)
25
26 if !isPowerDNSRecursorMetrics(collected) {
27 return nil, errors.New("returned metrics aren't PowerDNS Recursor metrics")
@@ -37,7 +37,7 @@ func isPowerDNSRecursorMetrics(collected map[string]int64) bool {
37 return ok1 && ok2
38 }
39
40 -func (r *Recursor) collectStatistics(collected map[string]int64, statistics statisticMetrics) {
40 +func (c *Collector) collectStatistics(collected map[string]int64, statistics statisticMetrics) {
41 for _, s := range statistics {
42 // https://doc.powerdns.com/authoritative/http-api/statistics.html#statisticitem
43 if s.Type != "StatisticItem" {
@@ -46,13 +46,13 @@ func (r *Recursor) collectStatistics(collected map[string]int64, statistics stat
46
47 value, ok := s.Value.(string)
48 if !ok {
49 - r.Debugf("%s value (%v) unexpected type: want=string, got=%T.", s.Name, s.Value, s.Value)
49 + c.Debugf("%s value (%v) unexpected type: want=string, got=%T.", s.Name, s.Value, s.Value)
50 continue
51 }
52
53 v, err := strconv.ParseInt(value, 10, 64)
54 if err != nil {
55 - r.Debugf("%s value (%v) parse error: %v", s.Name, s.Value, err)
55 + c.Debugf("%s value (%v) parse error: %v", s.Name, s.Value, err)
56 continue
57 }
58
@@ -60,11 +60,11 @@ func (r *Recursor) collectStatistics(collected map[string]int64, statistics stat
60 }
61 }
62
63 -func (r *Recursor) scrapeStatistics() ([]statisticMetric, error) {
64 - req, _ := web.NewHTTPRequestWithPath(r.RequestConfig, urlPathLocalStatistics)
63 +func (c *Collector) scrapeStatistics() ([]statisticMetric, error) {
64 + req, _ := web.NewHTTPRequestWithPath(c.RequestConfig, urlPathLocalStatistics)
65
66 var stats statisticMetrics
67 - if err := web.DoHTTP(r.httpClient).RequestJSON(req, &stats); err != nil {
67 + if err := web.DoHTTP(c.httpClient).RequestJSON(req, &stats); err != nil {
68 return nil, err
69 }
70
src/go/plugin/go.d/collector/powerdns_recursor/collector.go renamed
+21 -21
@@ -25,8 +25,8 @@ func init() {
25 })
26 }
27
28 -func New() *Recursor {
29 - return &Recursor{
28 +func New() *Collector {
29 + return &Collector{
30 Config: Config{
31 HTTPConfig: web.HTTPConfig{
32 RequestConfig: web.RequestConfig{
@@ -45,7 +45,7 @@ type Config struct {
45 web.HTTPConfig `yaml:",inline" json:""`
46 }
47
48 -type Recursor struct {
48 +type Collector struct {
49 module.Base
50 Config `yaml:",inline" json:""`
51
@@ -54,33 +54,33 @@ type Recursor struct {
54 httpClient *http.Client
55 }
56
57 -func (r *Recursor) Configuration() any {
58 - return r.Config
57 +func (c *Collector) Configuration() any {
58 + return c.Config
59 }
60
61 -func (r *Recursor) Init() error {
62 - err := r.validateConfig()
61 +func (c *Collector) Init() error {
62 + err := c.validateConfig()
63 if err != nil {
64 return fmt.Errorf("config validation: %v", err)
65 }
66
67 - client, err := r.initHTTPClient()
67 + client, err := c.initHTTPClient()
68 if err != nil {
69 return fmt.Errorf("init HTTP client: %v", err)
70 }
71 - r.httpClient = client
71 + c.httpClient = client
72
73 - cs, err := r.initCharts()
73 + cs, err := c.initCharts()
74 if err != nil {
75 return fmt.Errorf("init charts: %v", err)
76 }
77 - r.charts = cs
77 + c.charts = cs
78
79 return nil
80 }
81
82 -func (r *Recursor) Check() error {
83 - mx, err := r.collect()
82 +func (c *Collector) Check() error {
83 + mx, err := c.collect()
84 if err != nil {
85 return err
86 }
@@ -90,14 +90,14 @@ func (r *Recursor) Check() error {
90 return nil
91 }
92
93 -func (r *Recursor) Charts() *module.Charts {
94 - return r.charts
93 +func (c *Collector) Charts() *module.Charts {
94 + return c.charts
95 }
96
97 -func (r *Recursor) Collect() map[string]int64 {
98 - ms, err := r.collect()
97 +func (c *Collector) Collect() map[string]int64 {
98 + ms, err := c.collect()
99 if err != nil {
100 - r.Error(err)
100 + c.Error(err)
101 }
102
103 if len(ms) == 0 {
@@ -106,9 +106,9 @@ func (r *Recursor) Collect() map[string]int64 {
106 return ms
107 }
108
109 -func (r *Recursor) Cleanup() {
110 - if r.httpClient == nil {
109 +func (c *Collector) Cleanup() {
110 + if c.httpClient == nil {
111 return
112 }
113 - r.httpClient.CloseIdleConnections()
113 + c.httpClient.CloseIdleConnections()
114 }
src/go/plugin/go.d/collector/powerdns_recursor/collector_test.go renamed
+44 -44
@@ -35,11 +35,11 @@ func Test_testDataIsValid(t *testing.T) {
35 }
36 }
37
38 -func TestRecursor_ConfigurationSerialize(t *testing.T) {
39 - module.TestConfigurationSerialize(t, &Recursor{}, dataConfigJSON, dataConfigYAML)
38 +func TestCollector_ConfigurationSerialize(t *testing.T) {
39 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
40 }
41
42 -func TestRecursor_Init(t *testing.T) {
42 +func TestCollector_Init(t *testing.T) {
43 tests := map[string]struct {
44 config Config
45 wantFail bool
@@ -72,21 +72,21 @@ func TestRecursor_Init(t *testing.T) {
72
73 for name, test := range tests {
74 t.Run(name, func(t *testing.T) {
75 - recursor := New()
76 - recursor.Config = test.config
75 + collr := New()
76 + collr.Config = test.config
77
78 if test.wantFail {
79 - assert.Error(t, recursor.Init())
79 + assert.Error(t, collr.Init())
80 } else {
81 - assert.NoError(t, recursor.Init())
81 + assert.NoError(t, collr.Init())
82 }
83 })
84 }
85 }
86
87 -func TestRecursor_Check(t *testing.T) {
87 +func TestCollector_Check(t *testing.T) {
88 tests := map[string]struct {
89 - prepare func() (r *Recursor, cleanup func())
89 + prepare func() (collr *Collector, cleanup func())
90 wantFail bool
91 }{
92 "success on valid response v4.3.1": {
@@ -112,32 +112,32 @@ func TestRecursor_Check(t *testing.T) {
112
113 for name, test := range tests {
114 t.Run(name, func(t *testing.T) {
115 - recursor, cleanup := test.prepare()
115 + collr, cleanup := test.prepare()
116 defer cleanup()
117 - require.NoError(t, recursor.Init())
117 + require.NoError(t, collr.Init())
118
119 if test.wantFail {
120 - assert.Error(t, recursor.Check())
120 + assert.Error(t, collr.Check())
121 } else {
122 - assert.NoError(t, recursor.Check())
122 + assert.NoError(t, collr.Check())
123 }
124 })
125 }
126 }
127
128 -func TestRecursor_Charts(t *testing.T) {
129 - recursor := New()
130 - require.NoError(t, recursor.Init())
131 - assert.NotNil(t, recursor.Charts())
128 +func TestCollector_Charts(t *testing.T) {
129 + collr := New()
130 + require.NoError(t, collr.Init())
131 + assert.NotNil(t, collr.Charts())
132 }
133
134 -func TestRecursor_Cleanup(t *testing.T) {
134 +func TestCollector_Cleanup(t *testing.T) {
135 assert.NotPanics(t, New().Cleanup)
136 }
137
138 -func TestRecursor_Collect(t *testing.T) {
138 +func TestCollector_Collect(t *testing.T) {
139 tests := map[string]struct {
140 - prepare func() (r *Recursor, cleanup func())
140 + prepare func() (collr *Collector, cleanup func())
141 wantCollected map[string]int64
142 }{
143 "success on valid response v4.3.1": {
@@ -275,63 +275,63 @@ func TestRecursor_Collect(t *testing.T) {
275
276 for name, test := range tests {
277 t.Run(name, func(t *testing.T) {
278 - recursor, cleanup := test.prepare()
278 + collr, cleanup := test.prepare()
279 defer cleanup()
280 - require.NoError(t, recursor.Init())
280 + require.NoError(t, collr.Init())
281
282 - mx := recursor.Collect()
282 + mx := collr.Collect()
283
284 assert.Equal(t, test.wantCollected, mx)
285 if len(test.wantCollected) > 0 {
286 - module.TestMetricsHasAllChartsDims(t, recursor.Charts(), mx)
286 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
287 }
288 })
289 }
290 }
291
292 -func preparePowerDNSRecursorV431() (*Recursor, func()) {
292 +func preparePowerDNSRecursorV431() (*Collector, func()) {
293 srv := preparePowerDNSRecursorEndpoint()
294 - recursor := New()
295 - recursor.URL = srv.URL
294 + collr := New()
295 + collr.URL = srv.URL
296
297 - return recursor, srv.Close
297 + return collr, srv.Close
298 }
299
300 -func preparePowerDNSRecursorAuthoritativeData() (*Recursor, func()) {
300 +func preparePowerDNSRecursorAuthoritativeData() (*Collector, func()) {
301 srv := preparePowerDNSAuthoritativeEndpoint()
302 - recursor := New()
303 - recursor.URL = srv.URL
302 + collr := New()
303 + collr.URL = srv.URL
304
305 - return recursor, srv.Close
305 + return collr, srv.Close
306 }
307
308 -func preparePowerDNSRecursorInvalidData() (*Recursor, func()) {
308 +func preparePowerDNSRecursorInvalidData() (*Collector, func()) {
309 srv := httptest.NewServer(http.HandlerFunc(
310 func(w http.ResponseWriter, r *http.Request) {
311 _, _ = w.Write([]byte("hello and\n goodbye"))
312 }))
313 - recursor := New()
314 - recursor.URL = srv.URL
313 + collr := New()
314 + collr.URL = srv.URL
315
316 - return recursor, srv.Close
316 + return collr, srv.Close
317 }
318
319 -func preparePowerDNSRecursor404() (*Recursor, func()) {
319 +func preparePowerDNSRecursor404() (*Collector, func()) {
320 srv := httptest.NewServer(http.HandlerFunc(
321 func(w http.ResponseWriter, r *http.Request) {
322 w.WriteHeader(http.StatusNotFound)
323 }))
324 - recursor := New()
325 - recursor.URL = srv.URL
324 + collr := New()
325 + collr.URL = srv.URL
326
327 - return recursor, srv.Close
327 + return collr, srv.Close
328 }
329
330 -func preparePowerDNSRecursorConnectionRefused() (*Recursor, func()) {
331 - recursor := New()
332 - recursor.URL = "http://127.0.0.1:38001"
330 +func preparePowerDNSRecursorConnectionRefused() (*Collector, func()) {
331 + collr := New()
332 + collr.URL = "http://127.0.0.1:38001"
333
334 - return recursor, func() {}
334 + return collr, func() {}
335 }
336
337 func preparePowerDNSRecursorEndpoint() *httptest.Server {
src/go/plugin/go.d/collector/powerdns_recursor/init.go
+6 -6
@@ -10,20 +10,20 @@ import (
10 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/web"
11 )
12
13 -func (r *Recursor) validateConfig() error {
14 - if r.URL == "" {
13 +func (c *Collector) validateConfig() error {
14 + if c.URL == "" {
15 return errors.New("URL not set")
16 }
17 - if _, err := web.NewHTTPRequest(r.RequestConfig); err != nil {
17 + if _, err := web.NewHTTPRequest(c.RequestConfig); err != nil {
18 return err
19 }
20 return nil
21 }
22
23 -func (r *Recursor) initHTTPClient() (*http.Client, error) {
24 - return web.NewHTTPClient(r.ClientConfig)
23 +func (c *Collector) initHTTPClient() (*http.Client, error) {
24 + return web.NewHTTPClient(c.ClientConfig)
25 }
26
27 -func (r *Recursor) initCharts() (*module.Charts, error) {
27 +func (c *Collector) initCharts() (*module.Charts, error) {
28 return charts.Copy(), nil
29 }
src/go/plugin/go.d/collector/prometheus/charts.go
+35 -35
@@ -17,7 +17,7 @@ const (
17 prioGORuntime = prioDefault + 10
18 )
19
20 -func (p *Prometheus) addGaugeChart(id, name, help string, labels labels.Labels) {
20 +func (c *Collector) addGaugeChart(id, name, help string, labels labels.Labels) {
21 units := getChartUnits(name)
22
23 cType := module.Line
@@ -30,7 +30,7 @@ func (p *Prometheus) addGaugeChart(id, name, help string, labels labels.Labels)
30 Title: getChartTitle(name, help),
31 Units: units,
32 Fam: getChartFamily(name),
33 - Ctx: getChartContext(p.application(), name),
33 + Ctx: getChartContext(c.application(), name),
34 Type: cType,
35 Priority: getChartPriority(name),
36 Dims: module.Dims{
@@ -41,21 +41,21 @@ func (p *Prometheus) addGaugeChart(id, name, help string, labels labels.Labels)
41 for _, lbl := range labels {
42 chart.Labels = append(chart.Labels,
43 module.Label{
44 - Key: p.labelName(lbl.Name),
44 + Key: c.labelName(lbl.Name),
45 Value: apostropheReplacer.Replace(lbl.Value),
46 },
47 )
48 }
49
50 - if err := p.Charts().Add(chart); err != nil {
51 - p.Warning(err)
50 + if err := c.Charts().Add(chart); err != nil {
51 + c.Warning(err)
52 return
53 }
54
55 - p.cache.addChart(id, chart)
55 + c.cache.addChart(id, chart)
56 }
57
58 -func (p *Prometheus) addCounterChart(id, name, help string, labels labels.Labels) {
58 +func (c *Collector) addCounterChart(id, name, help string, labels labels.Labels) {
59 units := getChartUnits(name)
60
61 switch units {
@@ -74,7 +74,7 @@ func (p *Prometheus) addCounterChart(id, name, help string, labels labels.Labels
74 Title: getChartTitle(name, help),
75 Units: units,
76 Fam: getChartFamily(name),
77 - Ctx: getChartContext(p.application(), name),
77 + Ctx: getChartContext(c.application(), name),
78 Type: cType,
79 Priority: getChartPriority(name),
80 Dims: module.Dims{
@@ -84,21 +84,21 @@ func (p *Prometheus) addCounterChart(id, name, help string, labels labels.Labels
84 for _, lbl := range labels {
85 chart.Labels = append(chart.Labels,
86 module.Label{
87 - Key: p.labelName(lbl.Name),
87 + Key: c.labelName(lbl.Name),
88 Value: apostropheReplacer.Replace(lbl.Value),
89 },
90 )
91 }
92
93 - if err := p.Charts().Add(chart); err != nil {
94 - p.Warning(err)
93 + if err := c.Charts().Add(chart); err != nil {
94 + c.Warning(err)
95 return
96 }
97
98 - p.cache.addChart(id, chart)
98 + c.cache.addChart(id, chart)
99 }
100
101 -func (p *Prometheus) addSummaryCharts(id, name, help string, labels labels.Labels, quantiles []prometheus.Quantile) {
101 +func (c *Collector) addSummaryCharts(id, name, help string, labels labels.Labels, quantiles []prometheus.Quantile) {
102 units := getChartUnits(name)
103
104 switch units {
@@ -113,7 +113,7 @@ func (p *Prometheus) addSummaryCharts(id, name, help string, labels labels.Label
113 Title: getChartTitle(name, help),
114 Units: units,
115 Fam: getChartFamily(name),
116 - Ctx: getChartContext(p.application(), name),
116 + Ctx: getChartContext(c.application(), name),
117 Priority: getChartPriority(name),
118 Dims: func() (dims module.Dims) {
119 for _, v := range quantiles {
@@ -132,7 +132,7 @@ func (p *Prometheus) addSummaryCharts(id, name, help string, labels labels.Label
132 Title: getChartTitle(name, help),
133 Units: units,
134 Fam: getChartFamily(name),
135 - Ctx: getChartContext(p.application(), name) + "_sum",
135 + Ctx: getChartContext(c.application(), name) + "_sum",
136 Priority: getChartPriority(name),
137 Dims: module.Dims{
138 {ID: id + "_sum", Name: name + "_sum", Algo: module.Incremental, Div: precision},
@@ -143,7 +143,7 @@ func (p *Prometheus) addSummaryCharts(id, name, help string, labels labels.Label
143 Title: getChartTitle(name, help),
144 Units: "events/s",
145 Fam: getChartFamily(name),
146 - Ctx: getChartContext(p.application(), name) + "_count",
146 + Ctx: getChartContext(c.application(), name) + "_count",
147 Priority: getChartPriority(name),
148 Dims: module.Dims{
149 {ID: id + "_count", Name: name + "_count", Algo: module.Incremental},
@@ -154,19 +154,19 @@ func (p *Prometheus) addSummaryCharts(id, name, help string, labels labels.Label
154 for _, chart := range charts {
155 for _, lbl := range labels {
156 chart.Labels = append(chart.Labels, module.Label{
157 - Key: p.labelName(lbl.Name),
157 + Key: c.labelName(lbl.Name),
158 Value: apostropheReplacer.Replace(lbl.Value),
159 })
160 }
161 - if err := p.Charts().Add(chart); err != nil {
162 - p.Warning(err)
161 + if err := c.Charts().Add(chart); err != nil {
162 + c.Warning(err)
163 continue
164 }
165 - p.cache.addChart(id, chart)
165 + c.cache.addChart(id, chart)
166 }
167 }
168
169 -func (p *Prometheus) addHistogramCharts(id, name, help string, labels labels.Labels, buckets []prometheus.Bucket) {
169 +func (c *Collector) addHistogramCharts(id, name, help string, labels labels.Labels, buckets []prometheus.Bucket) {
170 units := getChartUnits(name)
171
172 switch units {
@@ -181,7 +181,7 @@ func (p *Prometheus) addHistogramCharts(id, name, help string, labels labels.Lab
181 Title: getChartTitle(name, help),
182 Units: "observations/s",
183 Fam: getChartFamily(name),
184 - Ctx: getChartContext(p.application(), name),
184 + Ctx: getChartContext(c.application(), name),
185 Priority: getChartPriority(name),
186 Dims: func() (dims module.Dims) {
187 for _, v := range buckets {
@@ -200,7 +200,7 @@ func (p *Prometheus) addHistogramCharts(id, name, help string, labels labels.Lab
200 Title: getChartTitle(name, help),
201 Units: units,
202 Fam: getChartFamily(name),
203 - Ctx: getChartContext(p.application(), name) + "_sum",
203 + Ctx: getChartContext(c.application(), name) + "_sum",
204 Priority: getChartPriority(name),
205 Dims: module.Dims{
206 {ID: id + "_sum", Name: name + "_sum", Algo: module.Incremental, Div: precision},
@@ -211,7 +211,7 @@ func (p *Prometheus) addHistogramCharts(id, name, help string, labels labels.Lab
211 Title: getChartTitle(name, help),
212 Units: "events/s",
213 Fam: getChartFamily(name),
214 - Ctx: getChartContext(p.application(), name) + "_count",
214 + Ctx: getChartContext(c.application(), name) + "_count",
215 Priority: getChartPriority(name),
216 Dims: module.Dims{
217 {ID: id + "_count", Name: name + "_count", Algo: module.Incremental},
@@ -222,30 +222,30 @@ func (p *Prometheus) addHistogramCharts(id, name, help string, labels labels.Lab
222 for _, chart := range charts {
223 for _, lbl := range labels {
224 chart.Labels = append(chart.Labels, module.Label{
225 - Key: p.labelName(lbl.Name),
225 + Key: c.labelName(lbl.Name),
226 Value: apostropheReplacer.Replace(lbl.Value),
227 })
228 }
229 - if err := p.Charts().Add(chart); err != nil {
230 - p.Warning(err)
229 + if err := c.Charts().Add(chart); err != nil {
230 + c.Warning(err)
231 continue
232 }
233 - p.cache.addChart(id, chart)
233 + c.cache.addChart(id, chart)
234 }
235 }
236
237 -func (p *Prometheus) application() string {
238 - if p.Application != "" {
239 - return p.Application
237 +func (c *Collector) application() string {
238 + if c.Application != "" {
239 + return c.Application
240 }
241 - return p.Name
241 + return c.Name
242 }
243
244 -func (p *Prometheus) labelName(lblName string) string {
245 - if p.LabelPrefix == "" {
244 +func (c *Collector) labelName(lblName string) string {
245 + if c.LabelPrefix == "" {
246 return lblName
247 }
248 - return p.LabelPrefix + "_" + lblName
248 + return c.LabelPrefix + "_" + lblName
249 }
250
251 func getChartTitle(name, help string) string {
src/go/plugin/go.d/collector/prometheus/collect.go
+56 -56
@@ -18,107 +18,107 @@ const (
18 precision = 1000
19 )
20
21 -func (p *Prometheus) collect() (map[string]int64, error) {
22 - mfs, err := p.prom.Scrape()
21 +func (c *Collector) collect() (map[string]int64, error) {
22 + mfs, err := c.prom.Scrape()
23 if err != nil {
24 return nil, err
25 }
26
27 if mfs.Len() == 0 {
28 - p.Warningf("endpoint '%s' returned 0 metric families", p.URL)
28 + c.Warningf("endpoint '%s' returned 0 metric families", c.URL)
29 return nil, nil
30 }
31
32 // TODO: shouldn't modify the value from Config
33 - if p.ExpectedPrefix != "" {
34 - if !hasPrefix(mfs, p.ExpectedPrefix) {
35 - return nil, fmt.Errorf("'%s' metrics have no expected prefix (%s)", p.URL, p.ExpectedPrefix)
33 + if c.ExpectedPrefix != "" {
34 + if !hasPrefix(mfs, c.ExpectedPrefix) {
35 + return nil, fmt.Errorf("'%s' metrics have no expected prefix (%s)", c.URL, c.ExpectedPrefix)
36 }
37 - p.ExpectedPrefix = ""
37 + c.ExpectedPrefix = ""
38 }
39
40 // TODO: shouldn't modify the value from Config
41 - if p.MaxTS > 0 {
42 - if n := calcMetrics(mfs); n > p.MaxTS {
43 - return nil, fmt.Errorf("'%s' num of time series (%d) > limit (%d)", p.URL, n, p.MaxTS)
41 + if c.MaxTS > 0 {
42 + if n := calcMetrics(mfs); n > c.MaxTS {
43 + return nil, fmt.Errorf("'%s' num of time series (%d) > limit (%d)", c.URL, n, c.MaxTS)
44 }
45 - p.MaxTS = 0
45 + c.MaxTS = 0
46 }
47
48 mx := make(map[string]int64)
49
50 - p.resetCache()
51 - defer p.removeStaleCharts()
50 + c.resetCache()
51 + defer c.removeStaleCharts()
52
53 for _, mf := range mfs {
54 if strings.HasSuffix(mf.Name(), "_info") {
55 continue
56 }
57 - if p.MaxTSPerMetric > 0 && len(mf.Metrics()) > p.MaxTSPerMetric {
58 - p.Debugf("metric '%s' num of time series (%d) > limit (%d), skipping it",
59 - mf.Name(), len(mf.Metrics()), p.MaxTSPerMetric)
57 + if c.MaxTSPerMetric > 0 && len(mf.Metrics()) > c.MaxTSPerMetric {
58 + c.Debugf("metric '%s' num of time series (%d) > limit (%d), skipping it",
59 + mf.Name(), len(mf.Metrics()), c.MaxTSPerMetric)
60 continue
61 }
62
63 switch mf.Type() {
64 case model.MetricTypeGauge:
65 - p.collectGauge(mx, mf)
65 + c.collectGauge(mx, mf)
66 case model.MetricTypeCounter:
67 - p.collectCounter(mx, mf)
67 + c.collectCounter(mx, mf)
68 case model.MetricTypeSummary:
69 - p.collectSummary(mx, mf)
69 + c.collectSummary(mx, mf)
70 case model.MetricTypeHistogram:
71 - p.collectHistogram(mx, mf)
71 + c.collectHistogram(mx, mf)
72 case model.MetricTypeUnknown:
73 - p.collectUntyped(mx, mf)
73 + c.collectUntyped(mx, mf)
74 }
75 }
76
77 return mx, nil
78 }
79
80 -func (p *Prometheus) collectGauge(mx map[string]int64, mf *prometheus.MetricFamily) {
80 +func (c *Collector) collectGauge(mx map[string]int64, mf *prometheus.MetricFamily) {
81 for _, m := range mf.Metrics() {
82 if m.Gauge() == nil || math.IsNaN(m.Gauge().Value()) {
83 continue
84 }
85
86 - id := mf.Name() + p.joinLabels(m.Labels())
86 + id := mf.Name() + c.joinLabels(m.Labels())
87
88 - if !p.cache.hasP(id) {
89 - p.addGaugeChart(id, mf.Name(), mf.Help(), m.Labels())
88 + if !c.cache.hasP(id) {
89 + c.addGaugeChart(id, mf.Name(), mf.Help(), m.Labels())
90 }
91
92 mx[id] = int64(m.Gauge().Value() * precision)
93 }
94 }
95
96 -func (p *Prometheus) collectCounter(mx map[string]int64, mf *prometheus.MetricFamily) {
96 +func (c *Collector) collectCounter(mx map[string]int64, mf *prometheus.MetricFamily) {
97 for _, m := range mf.Metrics() {
98 if m.Counter() == nil || math.IsNaN(m.Counter().Value()) {
99 continue
100 }
101
102 - id := mf.Name() + p.joinLabels(m.Labels())
102 + id := mf.Name() + c.joinLabels(m.Labels())
103
104 - if !p.cache.hasP(id) {
105 - p.addCounterChart(id, mf.Name(), mf.Help(), m.Labels())
104 + if !c.cache.hasP(id) {
105 + c.addCounterChart(id, mf.Name(), mf.Help(), m.Labels())
106 }
107
108 mx[id] = int64(m.Counter().Value() * precision)
109 }
110 }
111
112 -func (p *Prometheus) collectSummary(mx map[string]int64, mf *prometheus.MetricFamily) {
112 +func (c *Collector) collectSummary(mx map[string]int64, mf *prometheus.MetricFamily) {
113 for _, m := range mf.Metrics() {
114 if m.Summary() == nil || len(m.Summary().Quantiles()) == 0 {
115 continue
116 }
117
118 - id := mf.Name() + p.joinLabels(m.Labels())
118 + id := mf.Name() + c.joinLabels(m.Labels())
119
120 - if !p.cache.hasP(id) {
121 - p.addSummaryCharts(id, mf.Name(), mf.Help(), m.Labels(), m.Summary().Quantiles())
120 + if !c.cache.hasP(id) {
121 + c.addSummaryCharts(id, mf.Name(), mf.Help(), m.Labels(), m.Summary().Quantiles())
122 }
123
124 for _, v := range m.Summary().Quantiles() {
@@ -133,16 +133,16 @@ func (p *Prometheus) collectSummary(mx map[string]int64, mf *prometheus.MetricFa
133 }
134 }
135
136 -func (p *Prometheus) collectHistogram(mx map[string]int64, mf *prometheus.MetricFamily) {
136 +func (c *Collector) collectHistogram(mx map[string]int64, mf *prometheus.MetricFamily) {
137 for _, m := range mf.Metrics() {
138 if m.Histogram() == nil || len(m.Histogram().Buckets()) == 0 {
139 continue
140 }
141
142 - id := mf.Name() + p.joinLabels(m.Labels())
142 + id := mf.Name() + c.joinLabels(m.Labels())
143
144 - if !p.cache.hasP(id) {
145 - p.addHistogramCharts(id, mf.Name(), mf.Help(), m.Labels(), m.Histogram().Buckets())
144 + if !c.cache.hasP(id) {
145 + c.addHistogramCharts(id, mf.Name(), mf.Help(), m.Labels(), m.Histogram().Buckets())
146 }
147
148 for _, v := range m.Histogram().Buckets() {
@@ -157,27 +157,27 @@ func (p *Prometheus) collectHistogram(mx map[string]int64, mf *prometheus.Metric
157 }
158 }
159
160 -func (p *Prometheus) collectUntyped(mx map[string]int64, mf *prometheus.MetricFamily) {
160 +func (c *Collector) collectUntyped(mx map[string]int64, mf *prometheus.MetricFamily) {
161 for _, m := range mf.Metrics() {
162 if m.Untyped() == nil || math.IsNaN(m.Untyped().Value()) {
163 continue
164 }
165
166 - if p.isFallbackTypeGauge(mf.Name()) {
167 - id := mf.Name() + p.joinLabels(m.Labels())
166 + if c.isFallbackTypeGauge(mf.Name()) {
167 + id := mf.Name() + c.joinLabels(m.Labels())
168
169 - if !p.cache.hasP(id) {
170 - p.addGaugeChart(id, mf.Name(), mf.Help(), m.Labels())
169 + if !c.cache.hasP(id) {
170 + c.addGaugeChart(id, mf.Name(), mf.Help(), m.Labels())
171 }
172
173 mx[id] = int64(m.Untyped().Value() * precision)
174 }
175
176 - if p.isFallbackTypeCounter(mf.Name()) || strings.HasSuffix(mf.Name(), "_total") {
177 - id := mf.Name() + p.joinLabels(m.Labels())
176 + if c.isFallbackTypeCounter(mf.Name()) || strings.HasSuffix(mf.Name(), "_total") {
177 + id := mf.Name() + c.joinLabels(m.Labels())
178
179 - if !p.cache.hasP(id) {
180 - p.addCounterChart(id, mf.Name(), mf.Help(), m.Labels())
179 + if !c.cache.hasP(id) {
180 + c.addCounterChart(id, mf.Name(), mf.Help(), m.Labels())
181 }
182
183 mx[id] = int64(m.Untyped().Value() * precision)
@@ -185,15 +185,15 @@ func (p *Prometheus) collectUntyped(mx map[string]int64, mf *prometheus.MetricFa
185 }
186 }
187
188 -func (p *Prometheus) isFallbackTypeGauge(name string) bool {
189 - return p.fallbackType.gauge != nil && p.fallbackType.gauge.MatchString(name)
188 +func (c *Collector) isFallbackTypeGauge(name string) bool {
189 + return c.fallbackType.gauge != nil && c.fallbackType.gauge.MatchString(name)
190 }
191
192 -func (p *Prometheus) isFallbackTypeCounter(name string) bool {
193 - return p.fallbackType.counter != nil && p.fallbackType.counter.MatchString(name)
192 +func (c *Collector) isFallbackTypeCounter(name string) bool {
193 + return c.fallbackType.counter != nil && c.fallbackType.counter.MatchString(name)
194 }
195
196 -func (p *Prometheus) joinLabels(labels labels.Labels) string {
196 +func (c *Collector) joinLabels(labels labels.Labels) string {
197 var sb strings.Builder
198 for _, lbl := range labels {
199 name, val := lbl.Name, lbl.Value
@@ -218,16 +218,16 @@ func (p *Prometheus) joinLabels(labels labels.Labels) string {
218 return sb.String()
219 }
220
221 -func (p *Prometheus) resetCache() {
222 - for _, v := range p.cache.entries {
221 +func (c *Collector) resetCache() {
222 + for _, v := range c.cache.entries {
223 v.seen = false
224 }
225 }
226
227 const maxNotSeenTimes = 10
228
229 -func (p *Prometheus) removeStaleCharts() {
230 - for k, v := range p.cache.entries {
229 +func (c *Collector) removeStaleCharts() {
230 + for k, v := range c.cache.entries {
231 if v.seen {
232 continue
233 }
@@ -236,7 +236,7 @@ func (p *Prometheus) removeStaleCharts() {
236 chart.MarkRemove()
237 chart.MarkNotCreated()
238 }
239 - delete(p.cache.entries, k)
239 + delete(c.cache.entries, k)
240 }
241 }
242 }
src/go/plugin/go.d/collector/prometheus/collector.go renamed
+23 -23
@@ -30,8 +30,8 @@ func init() {
30 })
31 }
32
33 -func New() *Prometheus {
34 - return &Prometheus{
33 +func New() *Collector {
34 + return &Collector{
35 Config: Config{
36 HTTPConfig: web.HTTPConfig{
37 ClientConfig: web.ClientConfig{
@@ -63,7 +63,7 @@ type Config struct {
63 } `yaml:"fallback_type,omitempty" json:"fallback_type"`
64 }
65
66 -type Prometheus struct {
66 +type Collector struct {
67 module.Base
68 Config `yaml:",inline" json:""`
69
@@ -78,38 +78,38 @@ type Prometheus struct {
78 }
79 }
80
81 -func (p *Prometheus) Configuration() any {
82 - return p.Config
81 +func (c *Collector) Configuration() any {
82 + return c.Config
83 }
84
85 -func (p *Prometheus) Init() error {
86 - if err := p.validateConfig(); err != nil {
85 +func (c *Collector) Init() error {
86 + if err := c.validateConfig(); err != nil {
87 return fmt.Errorf("validating config: %v", err)
88 }
89
90 - prom, err := p.initPrometheusClient()
90 + prom, err := c.initPrometheusClient()
91 if err != nil {
92 return fmt.Errorf("init prometheus client: %v", err)
93 }
94 - p.prom = prom
94 + c.prom = prom
95
96 - m, err := p.initFallbackTypeMatcher(p.FallbackType.Counter)
96 + m, err := c.initFallbackTypeMatcher(c.FallbackType.Counter)
97 if err != nil {
98 return fmt.Errorf("init counter fallback type matcher: %v", err)
99 }
100 - p.fallbackType.counter = m
100 + c.fallbackType.counter = m
101
102 - m, err = p.initFallbackTypeMatcher(p.FallbackType.Gauge)
102 + m, err = c.initFallbackTypeMatcher(c.FallbackType.Gauge)
103 if err != nil {
104 return fmt.Errorf("init counter fallback type matcher: %v", err)
105 }
106 - p.fallbackType.gauge = m
106 + c.fallbackType.gauge = m
107
108 return nil
109 }
110
111 -func (p *Prometheus) Check() error {
112 - mx, err := p.collect()
111 +func (c *Collector) Check() error {
112 + mx, err := c.collect()
113 if err != nil {
114 return err
115 }
@@ -119,14 +119,14 @@ func (p *Prometheus) Check() error {
119 return nil
120 }
121
122 -func (p *Prometheus) Charts() *module.Charts {
123 - return p.charts
122 +func (c *Collector) Charts() *module.Charts {
123 + return c.charts
124 }
125
126 -func (p *Prometheus) Collect() map[string]int64 {
127 - mx, err := p.collect()
126 +func (c *Collector) Collect() map[string]int64 {
127 + mx, err := c.collect()
128 if err != nil {
129 - p.Error(err)
129 + c.Error(err)
130 }
131
132 if len(mx) == 0 {
@@ -135,8 +135,8 @@ func (p *Prometheus) Collect() map[string]int64 {
135 return mx
136 }
137
138 -func (p *Prometheus) Cleanup() {
139 - if p.prom != nil && p.prom.HTTPClient() != nil {
140 - p.prom.HTTPClient().CloseIdleConnections()
138 +func (c *Collector) Cleanup() {
139 + if c.prom != nil && c.prom.HTTPClient() != nil {
140 + c.prom.HTTPClient().CloseIdleConnections()
141 }
142 }
src/go/plugin/go.d/collector/prometheus/collector_test.go renamed
+65 -65
@@ -31,11 +31,11 @@ func Test_testDataIsValid(t *testing.T) {
31 }
32 }
33
34 -func TestPrometheus_ConfigurationSerialize(t *testing.T) {
35 - module.TestConfigurationSerialize(t, &Prometheus{}, dataConfigJSON, dataConfigYAML)
34 +func TestCollector_ConfigurationSerialize(t *testing.T) {
35 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
36 }
37
38 -func TestPrometheus_Init(t *testing.T) {
38 +func TestCollector_Init(t *testing.T) {
39 tests := map[string]struct {
40 config Config
41 wantFail bool
@@ -59,48 +59,48 @@ func TestPrometheus_Init(t *testing.T) {
59
60 for name, test := range tests {
61 t.Run(name, func(t *testing.T) {
62 - prom := New()
63 - prom.Config = test.config
62 + collr := New()
63 + collr.Config = test.config
64
65 if test.wantFail {
66 - assert.Error(t, prom.Init())
66 + assert.Error(t, collr.Init())
67 } else {
68 - assert.NoError(t, prom.Init())
68 + assert.NoError(t, collr.Init())
69 }
70 })
71 }
72 }
73
74 -func TestPrometheus_Cleanup(t *testing.T) {
74 +func TestCollector_Cleanup(t *testing.T) {
75 assert.NotPanics(t, New().Cleanup)
76
77 - prom := New()
78 - prom.URL = "http://127.0.0.1"
79 - require.NoError(t, prom.Init())
80 - assert.NotPanics(t, prom.Cleanup)
77 + collr := New()
78 + collr.URL = "http://127.0.0.1"
79 + require.NoError(t, collr.Init())
80 + assert.NotPanics(t, collr.Cleanup)
81 }
82
83 -func TestPrometheus_Check(t *testing.T) {
83 +func TestCollector_Check(t *testing.T) {
84 tests := map[string]struct {
85 - prepare func() (prom *Prometheus, cleanup func())
85 + prepare func() (collr *Collector, cleanup func())
86 wantFail bool
87 }{
88 "success if endpoint returns valid metrics in prometheus format": {
89 wantFail: false,
90 - prepare: func() (prom *Prometheus, cleanup func()) {
90 + prepare: func() (collr *Collector, cleanup func()) {
91 srv := httptest.NewServer(http.HandlerFunc(
92 func(w http.ResponseWriter, r *http.Request) {
93 _, _ = w.Write([]byte(`test_counter_no_meta_metric_1_total{label1="value1"} 11`))
94 }))
95 - prom = New()
96 - prom.URL = srv.URL
95 + collr = New()
96 + collr.URL = srv.URL
97
98 - return prom, srv.Close
98 + return collr, srv.Close
99 },
100 },
101 "fail if the total num of metrics exceeds the limit": {
102 wantFail: true,
103 - prepare: func() (prom *Prometheus, cleanup func()) {
103 + prepare: func() (collr *Collector, cleanup func()) {
104 srv := httptest.NewServer(http.HandlerFunc(
105 func(w http.ResponseWriter, r *http.Request) {
106 _, _ = w.Write([]byte(`
@@ -108,16 +108,16 @@ test_counter_no_meta_metric_1_total{label1="value1"} 11
108 test_counter_no_meta_metric_1_total{label1="value2"} 11
109 `))
110 }))
111 - prom = New()
112 - prom.URL = srv.URL
113 - prom.MaxTS = 1
111 + collr = New()
112 + collr.URL = srv.URL
113 + collr.MaxTS = 1
114
115 - return prom, srv.Close
115 + return collr, srv.Close
116 },
117 },
118 "fail if the num time series in the metric exceeds the limit": {
119 wantFail: true,
120 - prepare: func() (prom *Prometheus, cleanup func()) {
120 + prepare: func() (collr *Collector, cleanup func()) {
121 srv := httptest.NewServer(http.HandlerFunc(
122 func(w http.ResponseWriter, r *http.Request) {
123 _, _ = w.Write([]byte(`
@@ -125,81 +125,81 @@ test_counter_no_meta_metric_1_total{label1="value1"} 11
125 test_counter_no_meta_metric_1_total{label1="value2"} 11
126 `))
127 }))
128 - prom = New()
129 - prom.URL = srv.URL
130 - prom.MaxTSPerMetric = 1
128 + collr = New()
129 + collr.URL = srv.URL
130 + collr.MaxTSPerMetric = 1
131
132 - return prom, srv.Close
132 + return collr, srv.Close
133 },
134 },
135 "fail if metrics have no expected prefix": {
136 wantFail: true,
137 - prepare: func() (prom *Prometheus, cleanup func()) {
137 + prepare: func() (collr *Collector, cleanup func()) {
138 srv := httptest.NewServer(http.HandlerFunc(
139 func(w http.ResponseWriter, r *http.Request) {
140 _, _ = w.Write([]byte(`test_counter_no_meta_metric_1_total{label1="value1"} 11`))
141 }))
142 - prom = New()
143 - prom.URL = srv.URL
144 - prom.ExpectedPrefix = "prefix_"
142 + collr = New()
143 + collr.URL = srv.URL
144 + collr.ExpectedPrefix = "prefix_"
145
146 - return prom, srv.Close
146 + return collr, srv.Close
147 },
148 },
149 "fail if endpoint returns data not in prometheus format": {
150 wantFail: true,
151 - prepare: func() (prom *Prometheus, cleanup func()) {
151 + prepare: func() (collr *Collector, cleanup func()) {
152 srv := httptest.NewServer(http.HandlerFunc(
153 func(w http.ResponseWriter, r *http.Request) {
154 _, _ = w.Write([]byte("hello and\n goodbye"))
155 }))
156 - prom = New()
157 - prom.URL = srv.URL
156 + collr = New()
157 + collr.URL = srv.URL
158
159 - return prom, srv.Close
159 + return collr, srv.Close
160 },
161 },
162 "fail if connection refused": {
163 wantFail: true,
164 - prepare: func() (prom *Prometheus, cleanup func()) {
165 - prom = New()
166 - prom.URL = "http://127.0.0.1:38001/metrics"
164 + prepare: func() (collr *Collector, cleanup func()) {
165 + collr = New()
166 + collr.URL = "http://127.0.0.1:38001/metrics"
167
168 - return prom, func() {}
168 + return collr, func() {}
169 },
170 },
171 "fail if endpoint returns 404": {
172 wantFail: true,
173 - prepare: func() (prom *Prometheus, cleanup func()) {
173 + prepare: func() (collr *Collector, cleanup func()) {
174 srv := httptest.NewServer(http.HandlerFunc(
175 func(w http.ResponseWriter, r *http.Request) {
176 w.WriteHeader(http.StatusNotFound)
177 }))
178 - prom = New()
179 - prom.URL = srv.URL
178 + collr = New()
179 + collr.URL = srv.URL
180
181 - return prom, srv.Close
181 + return collr, srv.Close
182 },
183 },
184 }
185
186 for name, test := range tests {
187 t.Run(name, func(t *testing.T) {
188 - prom, cleanup := test.prepare()
188 + collr, cleanup := test.prepare()
189 defer cleanup()
190
191 - require.NoError(t, prom.Init())
191 + require.NoError(t, collr.Init())
192
193 if test.wantFail {
194 - assert.Error(t, prom.Check())
194 + assert.Error(t, collr.Check())
195 } else {
196 - assert.NoError(t, prom.Check())
196 + assert.NoError(t, collr.Check())
197 }
198 })
199 }
200 }
201
202 -func TestPrometheus_Collect(t *testing.T) {
202 +func TestCollector_Collect(t *testing.T) {
203 type testCaseStep struct {
204 desc string
205 input string
@@ -207,7 +207,7 @@ func TestPrometheus_Collect(t *testing.T) {
207 wantCharts int
208 }
209 tests := map[string]struct {
210 - prepare func() *Prometheus
210 + prepare func() *Collector
211 steps []testCaseStep
212 }{
213 "Gauge": {
@@ -510,10 +510,10 @@ test_histogram_no_meta_1_duration_seconds_count{label1="value1"} 6
510 },
511 },
512 "match Untyped as Gauge": {
513 - prepare: func() *Prometheus {
514 - prom := New()
515 - prom.FallbackType.Gauge = []string{"test_gauge_no_meta*"}
516 - return prom
513 + prepare: func() *Collector {
514 + collr := New()
515 + collr.FallbackType.Gauge = []string{"test_gauge_no_meta*"}
516 + return collr
517 },
518 steps: []testCaseStep{
519 {
@@ -537,10 +537,10 @@ test_gauge_no_meta_metric_1{label1="value2"} 12
537 },
538 },
539 "match Untyped as Counter": {
540 - prepare: func() *Prometheus {
541 - prom := New()
542 - prom.FallbackType.Counter = []string{"test_gauge_no_meta*"}
543 - return prom
540 + prepare: func() *Collector {
541 + collr := New()
542 + collr.FallbackType.Counter = []string{"test_gauge_no_meta*"}
543 + return collr
544 },
545 steps: []testCaseStep{
546 {
@@ -567,7 +567,7 @@ test_gauge_no_meta_metric_1{label1="value2"} 12
567
568 for name, test := range tests {
569 t.Run(name, func(t *testing.T) {
570 - prom := test.prepare()
570 + collr := test.prepare()
571
572 var metrics []byte
573 srv := httptest.NewServer(http.HandlerFunc(
@@ -576,8 +576,8 @@ test_gauge_no_meta_metric_1{label1="value2"} 12
576 }))
577 defer srv.Close()
578
579 - prom.URL = srv.URL
580 - require.NoError(t, prom.Init())
579 + collr.URL = srv.URL
580 + require.NoError(t, collr.Init())
581
582 for num, step := range test.steps {
583 t.Run(fmt.Sprintf("step num %d ('%s')", num+1, step.desc), func(t *testing.T) {
@@ -587,12 +587,12 @@ test_gauge_no_meta_metric_1{label1="value2"} 12
587 var mx map[string]int64
588
589 for i := 0; i < maxNotSeenTimes+1; i++ {
590 - mx = prom.Collect()
590 + mx = collr.Collect()
591 }
592
593 assert.Equal(t, step.wantCollected, mx)
594 - removeObsoleteCharts(prom.Charts())
595 - assert.Len(t, *prom.Charts(), step.wantCharts)
594 + removeObsoleteCharts(collr.Charts())
595 + assert.Len(t, *collr.Charts(), step.wantCharts)
596 })
597 }
598 })
src/go/plugin/go.d/collector/prometheus/init.go
+9 -9
@@ -12,29 +12,29 @@ import (
12 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/web"
13 )
14
15 -func (p *Prometheus) validateConfig() error {
16 - if p.URL == "" {
15 +func (c *Collector) validateConfig() error {
16 + if c.URL == "" {
17 return errors.New("'url' can not be empty")
18 }
19 return nil
20 }
21
22 -func (p *Prometheus) initPrometheusClient() (prometheus.Prometheus, error) {
23 - httpClient, err := web.NewHTTPClient(p.ClientConfig)
22 +func (c *Collector) initPrometheusClient() (prometheus.Prometheus, error) {
23 + httpClient, err := web.NewHTTPClient(c.ClientConfig)
24 if err != nil {
25 return nil, fmt.Errorf("init HTTP client: %v", err)
26 }
27
28 - req := p.RequestConfig.Copy()
29 - if p.BearerTokenFile != "" {
30 - token, err := os.ReadFile(p.BearerTokenFile)
28 + req := c.RequestConfig.Copy()
29 + if c.BearerTokenFile != "" {
30 + token, err := os.ReadFile(c.BearerTokenFile)
31 if err != nil {
32 return nil, fmt.Errorf("bearer token file: %v", err)
33 }
34 req.Headers["Authorization"] = "Bearer " + string(token)
35 }
36
37 - sr, err := p.Selector.Parse()
37 + sr, err := c.Selector.Parse()
38 if err != nil {
39 return nil, fmt.Errorf("parsing selector: %v", err)
40 }
@@ -45,7 +45,7 @@ func (p *Prometheus) initPrometheusClient() (prometheus.Prometheus, error) {
45 return prometheus.New(httpClient, req), nil
46 }
47
48 -func (p *Prometheus) initFallbackTypeMatcher(expr []string) (matcher.Matcher, error) {
48 +func (c *Collector) initFallbackTypeMatcher(expr []string) (matcher.Matcher, error) {
49 if len(expr) == 0 {
50 return nil, nil
51 }
src/go/plugin/go.d/collector/proxysql/charts.go
+15 -15
@@ -522,18 +522,18 @@ func newMySQLCommandCountersCharts(command string) *module.Charts {
522 return charts
523 }
524
525 -func (p *ProxySQL) addMySQLCommandCountersCharts(command string) {
525 +func (c *Collector) addMySQLCommandCountersCharts(command string) {
526 charts := newMySQLCommandCountersCharts(command)
527
528 - if err := p.Charts().Add(*charts...); err != nil {
529 - p.Warning(err)
528 + if err := c.Charts().Add(*charts...); err != nil {
529 + c.Warning(err)
530 }
531 }
532
533 -func (p *ProxySQL) removeMySQLCommandCountersCharts(command string) {
533 +func (c *Collector) removeMySQLCommandCountersCharts(command string) {
534 prefix := "mysql_command_" + strings.ToLower(command)
535
536 - for _, chart := range *p.Charts() {
536 + for _, chart := range *c.Charts() {
537 if strings.HasPrefix(chart.ID, prefix) {
538 chart.MarkRemove()
539 chart.MarkNotCreated()
@@ -585,18 +585,18 @@ func newMySQLUserCharts(username string) *module.Charts {
585 return charts
586 }
587
588 -func (p *ProxySQL) addMySQLUsersCharts(username string) {
588 +func (c *Collector) addMySQLUsersCharts(username string) {
589 charts := newMySQLUserCharts(username)
590
591 - if err := p.Charts().Add(*charts...); err != nil {
592 - p.Warning(err)
591 + if err := c.Charts().Add(*charts...); err != nil {
592 + c.Warning(err)
593 }
594 }
595
596 -func (p *ProxySQL) removeMySQLUserCharts(user string) {
596 +func (c *Collector) removeMySQLUserCharts(user string) {
597 prefix := "mysql_user_" + user
598
599 - for _, chart := range *p.Charts() {
599 + for _, chart := range *c.Charts() {
600 if strings.HasPrefix(chart.ID, prefix) {
601 chart.MarkRemove()
602 chart.MarkNotCreated()
@@ -706,18 +706,18 @@ func newBackendCharts(hg, host, port string) *module.Charts {
706 return charts
707 }
708
709 -func (p *ProxySQL) addBackendCharts(hg, host, port string) {
709 +func (c *Collector) addBackendCharts(hg, host, port string) {
710 charts := newBackendCharts(hg, host, port)
711
712 - if err := p.Charts().Add(*charts...); err != nil {
713 - p.Warning(err)
712 + if err := c.Charts().Add(*charts...); err != nil {
713 + c.Warning(err)
714 }
715 }
716
717 -func (p *ProxySQL) removeBackendCharts(hg, host, port string) {
717 +func (c *Collector) removeBackendCharts(hg, host, port string) {
718 prefix := "backend_" + backendID(hg, host, port)
719
720 - for _, chart := range *p.Charts() {
720 + for _, chart := range *c.Charts() {
721 if strings.HasPrefix(chart.ID, prefix) {
722 chart.MarkRemove()
723 chart.MarkNotCreated()
src/go/plugin/go.d/collector/proxysql/collect.go
+59 -59
@@ -22,66 +22,66 @@ const (
22 queryStatsMySQLConnectionPool = "SELECT * FROM stats_mysql_connection_pool;"
23 )
24
25 -func (p *ProxySQL) collect() (map[string]int64, error) {
26 - if p.db == nil {
27 - if err := p.openConnection(); err != nil {
25 +func (c *Collector) collect() (map[string]int64, error) {
26 + if c.db == nil {
27 + if err := c.openConnection(); err != nil {
28 return nil, err
29 }
30 }
31
32 - p.once.Do(func() {
33 - v, err := p.doQueryVersion()
32 + c.once.Do(func() {
33 + v, err := c.doQueryVersion()
34 if err != nil {
35 - p.Warningf("error on querying version: %v", err)
35 + c.Warningf("error on querying version: %v", err)
36 } else {
37 - p.Debugf("connected to ProxySQL version: %s", v)
37 + c.Debugf("connected to ProxySQL version: %s", v)
38 }
39 })
40
41 - p.cache.reset()
41 + c.cache.reset()
42
43 mx := make(map[string]int64)
44
45 - if err := p.collectStatsMySQLGlobal(mx); err != nil {
45 + if err := c.collectStatsMySQLGlobal(mx); err != nil {
46 return nil, fmt.Errorf("error on collecting mysql global status: %v", err)
47 }
48 - if err := p.collectStatsMySQLMemoryMetrics(mx); err != nil {
48 + if err := c.collectStatsMySQLMemoryMetrics(mx); err != nil {
49 return nil, fmt.Errorf("error on collecting memory metrics: %v", err)
50 }
51 - if err := p.collectStatsMySQLCommandsCounters(mx); err != nil {
51 + if err := c.collectStatsMySQLCommandsCounters(mx); err != nil {
52 return nil, fmt.Errorf("error on collecting mysql command counters: %v", err)
53 }
54 - if err := p.collectStatsMySQLUsers(mx); err != nil {
54 + if err := c.collectStatsMySQLUsers(mx); err != nil {
55 return nil, fmt.Errorf("error on collecting mysql users: %v", err)
56 }
57 - if err := p.collectStatsMySQLConnectionPool(mx); err != nil {
57 + if err := c.collectStatsMySQLConnectionPool(mx); err != nil {
58 return nil, fmt.Errorf("error on collecting mysql connection pool: %v", err)
59 }
60
61 - p.updateCharts()
61 + c.updateCharts()
62
63 return mx, nil
64 }
65
66 -func (p *ProxySQL) doQueryVersion() (string, error) {
66 +func (c *Collector) doQueryVersion() (string, error) {
67 q := queryVersion
68 - p.Debugf("executing query: '%s'", q)
68 + c.Debugf("executing query: '%s'", q)
69
70 var v string
71 - if err := p.doQueryRow(q, &v); err != nil {
71 + if err := c.doQueryRow(q, &v); err != nil {
72 return "", err
73 }
74
75 return v, nil
76 }
77
78 -func (p *ProxySQL) collectStatsMySQLGlobal(mx map[string]int64) error {
78 +func (c *Collector) collectStatsMySQLGlobal(mx map[string]int64) error {
79 // https://proxysql.com/documentation/stats-statistics/#stats_mysql_global
80 q := queryStatsMySQLGlobal
81 - p.Debugf("executing query: '%s'", q)
81 + c.Debugf("executing query: '%s'", q)
82
83 var name string
84 - return p.doQuery(q, func(column, value string, rowEnd bool) {
84 + return c.doQuery(q, func(column, value string, rowEnd bool) {
85 switch column {
86 case "Variable_Name":
87 name = value
@@ -91,13 +91,13 @@ func (p *ProxySQL) collectStatsMySQLGlobal(mx map[string]int64) error {
91 })
92 }
93
94 -func (p *ProxySQL) collectStatsMySQLMemoryMetrics(mx map[string]int64) error {
94 +func (c *Collector) collectStatsMySQLMemoryMetrics(mx map[string]int64) error {
95 // https://proxysql.com/documentation/stats-statistics/#stats_mysql_memory_metrics
96 q := queryStatsMySQLMemoryMetrics
97 - p.Debugf("executing query: '%s'", q)
97 + c.Debugf("executing query: '%s'", q)
98
99 var name string
100 - return p.doQuery(q, func(column, value string, rowEnd bool) {
100 + return c.doQuery(q, func(column, value string, rowEnd bool) {
101 switch column {
102 case "Variable_Name":
103 name = value
@@ -107,35 +107,35 @@ func (p *ProxySQL) collectStatsMySQLMemoryMetrics(mx map[string]int64) error {
107 })
108 }
109
110 -func (p *ProxySQL) collectStatsMySQLCommandsCounters(mx map[string]int64) error {
110 +func (c *Collector) collectStatsMySQLCommandsCounters(mx map[string]int64) error {
111 // https://proxysql.com/documentation/stats-statistics/#stats_mysql_commands_counters
112 q := queryStatsMySQLCommandsCounters
113 - p.Debugf("executing query: '%s'", q)
113 + c.Debugf("executing query: '%s'", q)
114
115 var command string
116 - return p.doQuery(q, func(column, value string, rowEnd bool) {
116 + return c.doQuery(q, func(column, value string, rowEnd bool) {
117 switch column {
118 case "Command":
119 command = value
120 - p.cache.getCommand(command).updated = true
120 + c.cache.getCommand(command).updated = true
121 default:
122 mx["mysql_command_"+command+"_"+column] = parseInt(value)
123 }
124 })
125 }
126
127 -func (p *ProxySQL) collectStatsMySQLUsers(mx map[string]int64) error {
127 +func (c *Collector) collectStatsMySQLUsers(mx map[string]int64) error {
128 // https://proxysql.com/documentation/stats-statistics/#stats_mysql_users
129 q := queryStatsMySQLUsers
130 - p.Debugf("executing query: '%s'", q)
130 + c.Debugf("executing query: '%s'", q)
131
132 var user string
133 var used int64
134 - return p.doQuery(q, func(column, value string, rowEnd bool) {
134 + return c.doQuery(q, func(column, value string, rowEnd bool) {
135 switch column {
136 case "username":
137 user = value
138 - p.cache.getUser(user).updated = true
138 + c.cache.getUser(user).updated = true
139 case "frontend_connections":
140 used = parseInt(value)
141 mx["mysql_user_"+user+"_"+column] = used
@@ -145,14 +145,14 @@ func (p *ProxySQL) collectStatsMySQLUsers(mx map[string]int64) error {
145 })
146 }
147
148 -func (p *ProxySQL) collectStatsMySQLConnectionPool(mx map[string]int64) error {
148 +func (c *Collector) collectStatsMySQLConnectionPool(mx map[string]int64) error {
149 // https://proxysql.com/documentation/stats-statistics/#stats_mysql_connection_pool
150 q := queryStatsMySQLConnectionPool
151 - p.Debugf("executing query: '%s'", q)
151 + c.Debugf("executing query: '%s'", q)
152
153 var hg, host, port string
154 var px string
155 - return p.doQuery(q, func(column, value string, rowEnd bool) {
155 + return c.doQuery(q, func(column, value string, rowEnd bool) {
156 switch column {
157 case "hg", "hostgroup":
158 hg = value
@@ -160,7 +160,7 @@ func (p *ProxySQL) collectStatsMySQLConnectionPool(mx map[string]int64) error {
160 host = value
161 case "srv_port":
162 port = value
163 - p.cache.getBackend(hg, host, port).updated = true
163 + c.cache.getBackend(hg, host, port).updated = true
164 px = "backend_" + backendID(hg, host, port) + "_"
165 case "status":
166 mx[px+"status_ONLINE"] = metrix.Bool(value == "1")
@@ -173,71 +173,71 @@ func (p *ProxySQL) collectStatsMySQLConnectionPool(mx map[string]int64) error {
173 })
174 }
175
176 -func (p *ProxySQL) updateCharts() {
177 - for k, m := range p.cache.commands {
176 +func (c *Collector) updateCharts() {
177 + for k, m := range c.cache.commands {
178 if !m.updated {
179 - delete(p.cache.commands, k)
180 - p.removeMySQLCommandCountersCharts(m.command)
179 + delete(c.cache.commands, k)
180 + c.removeMySQLCommandCountersCharts(m.command)
181 continue
182 }
183 if !m.hasCharts {
184 m.hasCharts = true
185 - p.addMySQLCommandCountersCharts(m.command)
185 + c.addMySQLCommandCountersCharts(m.command)
186 }
187 }
188 - for k, m := range p.cache.users {
188 + for k, m := range c.cache.users {
189 if !m.updated {
190 - delete(p.cache.users, k)
191 - p.removeMySQLUserCharts(m.user)
190 + delete(c.cache.users, k)
191 + c.removeMySQLUserCharts(m.user)
192 continue
193 }
194 if !m.hasCharts {
195 m.hasCharts = true
196 - p.addMySQLUsersCharts(m.user)
196 + c.addMySQLUsersCharts(m.user)
197 }
198 }
199 - for k, m := range p.cache.backends {
199 + for k, m := range c.cache.backends {
200 if !m.updated {
201 - delete(p.cache.backends, k)
202 - p.removeBackendCharts(m.hg, m.host, m.port)
201 + delete(c.cache.backends, k)
202 + c.removeBackendCharts(m.hg, m.host, m.port)
203 continue
204 }
205 if !m.hasCharts {
206 m.hasCharts = true
207 - p.addBackendCharts(m.hg, m.host, m.port)
207 + c.addBackendCharts(m.hg, m.host, m.port)
208 }
209 }
210 }
211
212 -func (p *ProxySQL) openConnection() error {
213 - db, err := sql.Open("mysql", p.DSN)
212 +func (c *Collector) openConnection() error {
213 + db, err := sql.Open("mysql", c.DSN)
214 if err != nil {
215 - return fmt.Errorf("error on opening a connection with the proxysql instance [%s]: %v", p.DSN, err)
215 + return fmt.Errorf("error on opening a connection with the proxysql instance [%s]: %v", c.DSN, err)
216 }
217
218 db.SetConnMaxLifetime(10 * time.Minute)
219
220 if err := db.Ping(); err != nil {
221 _ = db.Close()
222 - return fmt.Errorf("error on pinging the proxysql instance [%s]: %v", p.DSN, err)
222 + return fmt.Errorf("error on pinging the proxysql instance [%s]: %v", c.DSN, err)
223 }
224
225 - p.db = db
225 + c.db = db
226 return nil
227 }
228
229 -func (p *ProxySQL) doQueryRow(query string, v any) error {
230 - ctx, cancel := context.WithTimeout(context.Background(), p.Timeout.Duration())
229 +func (c *Collector) doQueryRow(query string, v any) error {
230 + ctx, cancel := context.WithTimeout(context.Background(), c.Timeout.Duration())
231 defer cancel()
232
233 - return p.db.QueryRowContext(ctx, query).Scan(v)
233 + return c.db.QueryRowContext(ctx, query).Scan(v)
234 }
235
236 -func (p *ProxySQL) doQuery(query string, assign func(column, value string, rowEnd bool)) error {
237 - ctx, cancel := context.WithTimeout(context.Background(), p.Timeout.Duration())
236 +func (c *Collector) doQuery(query string, assign func(column, value string, rowEnd bool)) error {
237 + ctx, cancel := context.WithTimeout(context.Background(), c.Timeout.Duration())
238 defer cancel()
239
240 - rows, err := p.db.QueryContext(ctx, query)
240 + rows, err := c.db.QueryContext(ctx, query)
241 if err != nil {
242 return err
243 }
src/go/plugin/go.d/collector/proxysql/collector.go renamed
+20 -20
@@ -26,8 +26,8 @@ func init() {
26 })
27 }
28
29 -func New() *ProxySQL {
30 - return &ProxySQL{
29 +func New() *Collector {
30 + return &Collector{
31 Config: Config{
32 DSN: "stats:stats@tcp(127.0.0.1:6032)/",
33 Timeout: confopt.Duration(time.Second),
@@ -49,7 +49,7 @@ type Config struct {
49 Timeout confopt.Duration `yaml:"timeout,omitempty" json:"timeout"`
50 }
51
52 -type ProxySQL struct {
52 +type Collector struct {
53 module.Base
54 Config `yaml:",inline" json:""`
55
@@ -61,22 +61,22 @@ type ProxySQL struct {
61 cache *cache
62 }
63
64 -func (p *ProxySQL) Configuration() any {
65 - return p.Config
64 +func (c *Collector) Configuration() any {
65 + return c.Config
66 }
67
68 -func (p *ProxySQL) Init() error {
69 - if p.DSN == "" {
68 +func (c *Collector) Init() error {
69 + if c.DSN == "" {
70 return errors.New("dsn not set")
71 }
72
73 - p.Debugf("using DSN [%s]", p.DSN)
73 + c.Debugf("using DSN [%s]", c.DSN)
74
75 return nil
76 }
77
78 -func (p *ProxySQL) Check() error {
79 - mx, err := p.collect()
78 +func (c *Collector) Check() error {
79 + mx, err := c.collect()
80 if err != nil {
81 return err
82 }
@@ -86,14 +86,14 @@ func (p *ProxySQL) Check() error {
86 return nil
87 }
88
89 -func (p *ProxySQL) Charts() *module.Charts {
90 - return p.charts
89 +func (c *Collector) Charts() *module.Charts {
90 + return c.charts
91 }
92
93 -func (p *ProxySQL) Collect() map[string]int64 {
94 - mx, err := p.collect()
93 +func (c *Collector) Collect() map[string]int64 {
94 + mx, err := c.collect()
95 if err != nil {
96 - p.Error(err)
96 + c.Error(err)
97 }
98
99 if len(mx) == 0 {
@@ -102,12 +102,12 @@ func (p *ProxySQL) Collect() map[string]int64 {
102 return mx
103 }
104
105 -func (p *ProxySQL) Cleanup() {
106 - if p.db == nil {
105 +func (c *Collector) Cleanup() {
106 + if c.db == nil {
107 return
108 }
109 - if err := p.db.Close(); err != nil {
110 - p.Errorf("cleanup: error on closing the ProxySQL instance [%s]: %v", p.DSN, err)
109 + if err := c.db.Close(); err != nil {
110 + c.Errorf("cleanup: error on closing the ProxySQL instance [%s]: %v", c.DSN, err)
111 }
112 - p.db = nil
112 + c.db = nil
113 }
src/go/plugin/go.d/collector/proxysql/collector_test.go renamed
+27 -27
@@ -48,11 +48,11 @@ func Test_testDataIsValid(t *testing.T) {
48 }
49 }
50
51 -func TestProxySQL_ConfigurationSerialize(t *testing.T) {
52 - module.TestConfigurationSerialize(t, &ProxySQL{}, dataConfigJSON, dataConfigYAML)
51 +func TestCollector_ConfigurationSerialize(t *testing.T) {
52 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
53 }
54
55 -func TestProxySQL_Init(t *testing.T) {
55 +func TestCollector_Init(t *testing.T) {
56 tests := map[string]struct {
57 config Config
58 wantFail bool
@@ -69,52 +69,52 @@ func TestProxySQL_Init(t *testing.T) {
69
70 for name, test := range tests {
71 t.Run(name, func(t *testing.T) {
72 - proxySQL := New()
73 - proxySQL.Config = test.config
72 + collr := New()
73 + collr.Config = test.config
74
75 if test.wantFail {
76 - assert.Error(t, proxySQL.Init())
76 + assert.Error(t, collr.Init())
77 } else {
78 - assert.NoError(t, proxySQL.Init())
78 + assert.NoError(t, collr.Init())
79 }
80 })
81 }
82 }
83
84 -func TestProxySQL_Cleanup(t *testing.T) {
85 - tests := map[string]func(t *testing.T) (proxySQL *ProxySQL, cleanup func()){
86 - "db connection not initialized": func(t *testing.T) (proxySQL *ProxySQL, cleanup func()) {
84 +func TestCollector_Cleanup(t *testing.T) {
85 + tests := map[string]func(t *testing.T) (collr *Collector, cleanup func()){
86 + "db connection not initialized": func(t *testing.T) (collr *Collector, cleanup func()) {
87 return New(), func() {}
88 },
89 - "db connection initialized": func(t *testing.T) (proxySQL *ProxySQL, cleanup func()) {
89 + "db connection initialized": func(t *testing.T) (collr *Collector, cleanup func()) {
90 db, mock, err := sqlmock.New()
91 require.NoError(t, err)
92
93 mock.ExpectClose()
94 - proxySQL = New()
95 - proxySQL.db = db
94 + collr = New()
95 + collr.db = db
96 cleanup = func() { _ = db.Close() }
97
98 - return proxySQL, cleanup
98 + return collr, cleanup
99 },
100 }
101
102 for name, prepare := range tests {
103 t.Run(name, func(t *testing.T) {
104 - proxySQL, cleanup := prepare(t)
104 + collr, cleanup := prepare(t)
105 defer cleanup()
106
107 - assert.NotPanics(t, proxySQL.Cleanup)
108 - assert.Nil(t, proxySQL.db)
107 + assert.NotPanics(t, collr.Cleanup)
108 + assert.Nil(t, collr.db)
109 })
110 }
111 }
112
113 -func TestProxySQL_Charts(t *testing.T) {
113 +func TestCollector_Charts(t *testing.T) {
114 assert.NotNil(t, New().Charts())
115 }
116
117 -func TestProxySQL_Check(t *testing.T) {
117 +func TestCollector_Check(t *testing.T) {
118 tests := map[string]struct {
119 prepareMock func(t *testing.T, m sqlmock.Sqlmock)
120 wantFail bool
@@ -172,28 +172,28 @@ func TestProxySQL_Check(t *testing.T) {
172 sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual),
173 )
174 require.NoError(t, err)
175 - proxySQL := New()
176 - proxySQL.db = db
175 + collr := New()
176 + collr.db = db
177 defer func() { _ = db.Close() }()
178
179 - require.NoError(t, proxySQL.Init())
179 + require.NoError(t, collr.Init())
180
181 test.prepareMock(t, mock)
182
183 if test.wantFail {
184 - assert.Error(t, proxySQL.Check())
184 + assert.Error(t, collr.Check())
185 } else {
186 - assert.NoError(t, proxySQL.Check())
186 + assert.NoError(t, collr.Check())
187 }
188 assert.NoError(t, mock.ExpectationsWereMet())
189 })
190 }
191 }
192
193 -func TestProxySQL_Collect(t *testing.T) {
193 +func TestCollector_Collect(t *testing.T) {
194 type testCaseStep struct {
195 prepareMock func(t *testing.T, m sqlmock.Sqlmock)
196 - check func(t *testing.T, my *ProxySQL)
196 + check func(t *testing.T, my *Collector)
197 }
198 tests := map[string][]testCaseStep{
199
@@ -207,7 +207,7 @@ func TestProxySQL_Collect(t *testing.T) {
207 mockExpect(t, m, queryStatsMySQLUsers, dataVer2010StatsMySQLUsers)
208 mockExpect(t, m, queryStatsMySQLConnectionPool, dataVer2010StatsMySQLConnectionPool)
209 },
210 - check: func(t *testing.T, my *ProxySQL) {
210 + check: func(t *testing.T, my *Collector) {
211 mx := my.Collect()
212
213 expected := map[string]int64{
src/go/plugin/go.d/collector/pulsar/charts.go
+72 -72
@@ -474,89 +474,89 @@ var (
474 }
475 )
476
477 -func (p *Pulsar) adjustCharts(pms prometheus.Series) {
477 +func (c *Collector) adjustCharts(pms prometheus.Series) {
478 if pms := pms.FindByName(metricPulsarStorageReadRate); pms.Len() == 0 || pms[0].Labels.Get("namespace") == "" {
479 - p.removeSummaryChart(sumStorageOperationsRateChart.ID)
480 - p.removeNamespaceChart(nsStorageOperationsChart.ID)
481 - p.removeNamespaceChart(topicStorageReadRateChart.ID)
482 - p.removeNamespaceChart(topicStorageWriteRateChart.ID)
483 - delete(p.topicChartsMapping, topicStorageReadRateChart.ID)
484 - delete(p.topicChartsMapping, topicStorageWriteRateChart.ID)
479 + c.removeSummaryChart(sumStorageOperationsRateChart.ID)
480 + c.removeNamespaceChart(nsStorageOperationsChart.ID)
481 + c.removeNamespaceChart(topicStorageReadRateChart.ID)
482 + c.removeNamespaceChart(topicStorageWriteRateChart.ID)
483 + delete(c.topicChartsMapping, topicStorageReadRateChart.ID)
484 + delete(c.topicChartsMapping, topicStorageWriteRateChart.ID)
485 }
486 if pms.FindByName(metricPulsarSubscriptionMsgRateRedeliver).Len() == 0 {
487 - p.removeSummaryChart(sumSubsMsgRateRedeliverChart.ID)
488 - p.removeSummaryChart(sumSubsBlockedOnUnackedMsgChart.ID)
489 - p.removeNamespaceChart(nsSubsMsgRateRedeliverChart.ID)
490 - p.removeNamespaceChart(nsSubsBlockedOnUnackedMsgChart.ID)
491 - p.removeNamespaceChart(topicSubsMsgRateRedeliverChart.ID)
492 - p.removeNamespaceChart(topicSubsBlockedOnUnackedMsgChart.ID)
493 - delete(p.topicChartsMapping, topicSubsMsgRateRedeliverChart.ID)
494 - delete(p.topicChartsMapping, topicSubsBlockedOnUnackedMsgChart.ID)
487 + c.removeSummaryChart(sumSubsMsgRateRedeliverChart.ID)
488 + c.removeSummaryChart(sumSubsBlockedOnUnackedMsgChart.ID)
489 + c.removeNamespaceChart(nsSubsMsgRateRedeliverChart.ID)
490 + c.removeNamespaceChart(nsSubsBlockedOnUnackedMsgChart.ID)
491 + c.removeNamespaceChart(topicSubsMsgRateRedeliverChart.ID)
492 + c.removeNamespaceChart(topicSubsBlockedOnUnackedMsgChart.ID)
493 + delete(c.topicChartsMapping, topicSubsMsgRateRedeliverChart.ID)
494 + delete(c.topicChartsMapping, topicSubsBlockedOnUnackedMsgChart.ID)
495 }
496 if pms.FindByName(metricPulsarReplicationBacklog).Len() == 0 {
497 - p.removeSummaryChart(sumReplicationRateChart.ID)
498 - p.removeSummaryChart(sumReplicationThroughputRateChart.ID)
499 - p.removeSummaryChart(sumReplicationBacklogChart.ID)
500 - p.removeNamespaceChart(nsReplicationRateChart.ID)
501 - p.removeNamespaceChart(nsReplicationThroughputChart.ID)
502 - p.removeNamespaceChart(nsReplicationBacklogChart.ID)
503 - p.removeNamespaceChart(topicReplicationRateInChart.ID)
504 - p.removeNamespaceChart(topicReplicationRateOutChart.ID)
505 - p.removeNamespaceChart(topicReplicationThroughputRateInChart.ID)
506 - p.removeNamespaceChart(topicReplicationThroughputRateOutChart.ID)
507 - p.removeNamespaceChart(topicReplicationBacklogChart.ID)
508 - delete(p.topicChartsMapping, topicReplicationRateInChart.ID)
509 - delete(p.topicChartsMapping, topicReplicationRateOutChart.ID)
510 - delete(p.topicChartsMapping, topicReplicationThroughputRateInChart.ID)
511 - delete(p.topicChartsMapping, topicReplicationThroughputRateOutChart.ID)
512 - delete(p.topicChartsMapping, topicReplicationBacklogChart.ID)
497 + c.removeSummaryChart(sumReplicationRateChart.ID)
498 + c.removeSummaryChart(sumReplicationThroughputRateChart.ID)
499 + c.removeSummaryChart(sumReplicationBacklogChart.ID)
500 + c.removeNamespaceChart(nsReplicationRateChart.ID)
501 + c.removeNamespaceChart(nsReplicationThroughputChart.ID)
502 + c.removeNamespaceChart(nsReplicationBacklogChart.ID)
503 + c.removeNamespaceChart(topicReplicationRateInChart.ID)
504 + c.removeNamespaceChart(topicReplicationRateOutChart.ID)
505 + c.removeNamespaceChart(topicReplicationThroughputRateInChart.ID)
506 + c.removeNamespaceChart(topicReplicationThroughputRateOutChart.ID)
507 + c.removeNamespaceChart(topicReplicationBacklogChart.ID)
508 + delete(c.topicChartsMapping, topicReplicationRateInChart.ID)
509 + delete(c.topicChartsMapping, topicReplicationRateOutChart.ID)
510 + delete(c.topicChartsMapping, topicReplicationThroughputRateInChart.ID)
511 + delete(c.topicChartsMapping, topicReplicationThroughputRateOutChart.ID)
512 + delete(c.topicChartsMapping, topicReplicationBacklogChart.ID)
513 }
514 }
515
516 -func (p *Pulsar) removeSummaryChart(chartID string) {
517 - if err := p.Charts().Remove(chartID); err != nil {
518 - p.Warning(err)
516 +func (c *Collector) removeSummaryChart(chartID string) {
517 + if err := c.Charts().Remove(chartID); err != nil {
518 + c.Warning(err)
519 }
520 }
521
522 -func (p *Pulsar) removeNamespaceChart(chartID string) {
523 - if err := p.nsCharts.Remove(chartID); err != nil {
524 - p.Warning(err)
522 +func (c *Collector) removeNamespaceChart(chartID string) {
523 + if err := c.nsCharts.Remove(chartID); err != nil {
524 + c.Warning(err)
525 }
526 }
527
528 -func (p *Pulsar) updateCharts() {
528 +func (c *Collector) updateCharts() {
529 // NOTE: order is important
530 - for ns := range p.curCache.namespaces {
531 - if !p.cache.namespaces[ns] {
532 - p.cache.namespaces[ns] = true
533 - p.addNamespaceCharts(ns)
530 + for ns := range c.curCache.namespaces {
531 + if !c.cache.namespaces[ns] {
532 + c.cache.namespaces[ns] = true
533 + c.addNamespaceCharts(ns)
534 }
535 }
536 - for top := range p.curCache.topics {
537 - if !p.cache.topics[top] {
538 - p.cache.topics[top] = true
539 - p.addTopicToCharts(top)
536 + for top := range c.curCache.topics {
537 + if !c.cache.topics[top] {
538 + c.cache.topics[top] = true
539 + c.addTopicToCharts(top)
540 }
541 }
542 - for top := range p.cache.topics {
543 - if p.curCache.topics[top] {
542 + for top := range c.cache.topics {
543 + if c.curCache.topics[top] {
544 continue
545 }
546 - delete(p.cache.topics, top)
547 - p.removeTopicFromCharts(top)
546 + delete(c.cache.topics, top)
547 + c.removeTopicFromCharts(top)
548 }
549 - for ns := range p.cache.namespaces {
550 - if p.curCache.namespaces[ns] {
549 + for ns := range c.cache.namespaces {
550 + if c.curCache.namespaces[ns] {
551 continue
552 }
553 - delete(p.cache.namespaces, ns)
554 - p.removeNamespaceFromCharts(ns)
553 + delete(c.cache.namespaces, ns)
554 + c.removeNamespaceFromCharts(ns)
555 }
556 }
557
558 -func (p *Pulsar) addNamespaceCharts(ns namespace) {
559 - charts := p.nsCharts.Copy()
558 +func (c *Collector) addNamespaceCharts(ns namespace) {
559 + charts := c.nsCharts.Copy()
560 for _, chart := range *charts {
561 chart.ID = fmt.Sprintf(chart.ID, ns.name)
562 chart.Fam = fmt.Sprintf(chart.Fam, ns.name)
@@ -564,28 +564,28 @@ func (p *Pulsar) addNamespaceCharts(ns namespace) {
564 dim.ID = fmt.Sprintf(dim.ID, ns.name)
565 }
566 }
567 - if err := p.Charts().Add(*charts...); err != nil {
568 - p.Warning(err)
567 + if err := c.Charts().Add(*charts...); err != nil {
568 + c.Warning(err)
569 }
570 }
571
572 -func (p *Pulsar) removeNamespaceFromCharts(ns namespace) {
573 - for _, chart := range *p.nsCharts {
572 +func (c *Collector) removeNamespaceFromCharts(ns namespace) {
573 + for _, chart := range *c.nsCharts {
574 id := fmt.Sprintf(chart.ID, ns.name)
575 - if chart = p.Charts().Get(id); chart != nil {
575 + if chart = c.Charts().Get(id); chart != nil {
576 chart.MarkRemove()
577 } else {
578 - p.Warningf("could not remove namespace chart '%s'", id)
578 + c.Warningf("could not remove namespace chart '%s'", id)
579 }
580 }
581 }
582
583 -func (p *Pulsar) addTopicToCharts(top topic) {
584 - for id, metric := range p.topicChartsMapping {
583 +func (c *Collector) addTopicToCharts(top topic) {
584 + for id, metric := range c.topicChartsMapping {
585 id = fmt.Sprintf(id, top.namespace)
586 - chart := p.Charts().Get(id)
586 + chart := c.Charts().Get(id)
587 if chart == nil {
588 - p.Warningf("could not add topic '%s' to chart '%s': chart not found", top.name, id)
588 + c.Warningf("could not add topic '%s' to chart '%s': chart not found", top.name, id)
589 continue
590 }
591
@@ -609,23 +609,23 @@ func (p *Pulsar) addTopicToCharts(top topic) {
609 }
610
611 if err := chart.AddDim(&dim); err != nil {
612 - p.Warning(err)
612 + c.Warning(err)
613 }
614 chart.MarkNotCreated()
615 }
616 }
617
618 -func (p *Pulsar) removeTopicFromCharts(top topic) {
619 - for id, metric := range p.topicChartsMapping {
618 +func (c *Collector) removeTopicFromCharts(top topic) {
619 + for id, metric := range c.topicChartsMapping {
620 id = fmt.Sprintf(id, top.namespace)
621 - chart := p.Charts().Get(id)
621 + chart := c.Charts().Get(id)
622 if chart == nil {
623 - p.Warningf("could not remove topic '%s' from chart '%s': chart not found", top.name, id)
623 + c.Warningf("could not remove topic '%s' from chart '%s': chart not found", top.name, id)
624 continue
625 }
626
627 if err := chart.MarkDimRemove(metric+"_"+top.name, true); err != nil {
628 - p.Warning(err)
628 + c.Warning(err)
629 }
630 chart.MarkNotCreated()
631 }
src/go/plugin/go.d/collector/pulsar/collect.go
+19 -19
@@ -14,17 +14,17 @@ func isValidPulsarMetrics(pms prometheus.Series) bool {
14 return pms.FindByName(metricPulsarTopicsCount).Len() > 0
15 }
16
17 -func (p *Pulsar) resetCurCache() {
18 - for ns := range p.curCache.namespaces {
19 - delete(p.curCache.namespaces, ns)
17 +func (c *Collector) resetCurCache() {
18 + for ns := range c.curCache.namespaces {
19 + delete(c.curCache.namespaces, ns)
20 }
21 - for top := range p.curCache.topics {
22 - delete(p.curCache.topics, top)
21 + for top := range c.curCache.topics {
22 + delete(c.curCache.topics, top)
23 }
24 }
25
26 -func (p *Pulsar) collect() (map[string]int64, error) {
27 - pms, err := p.prom.ScrapeSeries()
26 +func (c *Collector) collect() (map[string]int64, error) {
27 + pms, err := c.prom.ScrapeSeries()
28 if err != nil {
29 return nil, err
30 }
@@ -33,24 +33,24 @@ func (p *Pulsar) collect() (map[string]int64, error) {
33 return nil, errors.New("returned metrics aren't Apache Pulsar metrics")
34 }
35
36 - p.once.Do(func() {
37 - p.adjustCharts(pms)
36 + c.once.Do(func() {
37 + c.adjustCharts(pms)
38 })
39
40 - mx := p.collectMetrics(pms)
41 - p.updateCharts()
42 - p.resetCurCache()
40 + mx := c.collectMetrics(pms)
41 + c.updateCharts()
42 + c.resetCurCache()
43
44 return stm.ToMap(mx), nil
45 }
46
47 -func (p *Pulsar) collectMetrics(pms prometheus.Series) map[string]float64 {
47 +func (c *Collector) collectMetrics(pms prometheus.Series) map[string]float64 {
48 mx := make(map[string]float64)
49 - p.collectBroker(mx, pms)
49 + c.collectBroker(mx, pms)
50 return mx
51 }
52
53 -func (p *Pulsar) collectBroker(mx map[string]float64, pms prometheus.Series) {
53 +func (c *Collector) collectBroker(mx map[string]float64, pms prometheus.Series) {
54 pms = findPulsarMetrics(pms)
55 for _, pm := range pms {
56 ns, top := newNamespace(pm), newTopic(pm)
@@ -58,20 +58,20 @@ func (p *Pulsar) collectBroker(mx map[string]float64, pms prometheus.Series) {
58 continue
59 }
60
61 - p.curCache.namespaces[ns] = true
61 + c.curCache.namespaces[ns] = true
62
63 value := pm.Value * precision(pm.Name())
64 mx[pm.Name()] += value
65 mx[pm.Name()+"_"+ns.name] += value
66
67 - if top.name == "" || !p.topicFilter.MatchString(top.name) {
67 + if top.name == "" || !c.topicFilter.MatchString(top.name) {
68 continue
69 }
70
71 - p.curCache.topics[top] = true
71 + c.curCache.topics[top] = true
72 mx[pm.Name()+"_"+top.name] += value
73 }
74 - mx["pulsar_namespaces_count"] = float64(len(p.curCache.namespaces))
74 + mx["pulsar_namespaces_count"] = float64(len(c.curCache.namespaces))
75 }
76
77 func newNamespace(pm prometheus.SeriesSample) namespace {
src/go/plugin/go.d/collector/pulsar/collector.go renamed
+21 -21
@@ -30,8 +30,8 @@ func init() {
30 })
31 }
32
33 -func New() *Pulsar {
34 - return &Pulsar{
33 +func New() *Collector {
34 + return &Collector{
35 Config: Config{
36 HTTPConfig: web.HTTPConfig{
37 RequestConfig: web.RequestConfig{
@@ -61,7 +61,7 @@ type Config struct {
61 TopicFilter matcher.SimpleExpr `yaml:"topic_filter,omitempty" json:"topic_filter"`
62 }
63
64 -type Pulsar struct {
64 +type Collector struct {
65 module.Base
66 Config `yaml:",inline" json:""`
67
@@ -77,32 +77,32 @@ type Pulsar struct {
77 topicChartsMapping map[string]string
78 }
79
80 -func (p *Pulsar) Configuration() any {
81 - return p.Config
80 +func (c *Collector) Configuration() any {
81 + return c.Config
82 }
83
84 -func (p *Pulsar) Init() error {
85 - if err := p.validateConfig(); err != nil {
84 +func (c *Collector) Init() error {
85 + if err := c.validateConfig(); err != nil {
86 return fmt.Errorf("config validation: %v", err)
87 }
88
89 - prom, err := p.initPrometheusClient()
89 + prom, err := c.initPrometheusClient()
90 if err != nil {
91 return fmt.Errorf("init prometheus client: %v", err)
92 }
93 - p.prom = prom
93 + c.prom = prom
94
95 - m, err := p.initTopicFilerMatcher()
95 + m, err := c.initTopicFilerMatcher()
96 if err != nil {
97 return fmt.Errorf("init topic filer: %v", err)
98 }
99 - p.topicFilter = m
99 + c.topicFilter = m
100
101 return nil
102 }
103
104 -func (p *Pulsar) Check() error {
105 - mx, err := p.collect()
104 +func (c *Collector) Check() error {
105 + mx, err := c.collect()
106 if err != nil {
107 return err
108 }
@@ -112,14 +112,14 @@ func (p *Pulsar) Check() error {
112 return nil
113 }
114
115 -func (p *Pulsar) Charts() *Charts {
116 - return p.charts
115 +func (c *Collector) Charts() *Charts {
116 + return c.charts
117 }
118
119 -func (p *Pulsar) Collect() map[string]int64 {
120 - mx, err := p.collect()
119 +func (c *Collector) Collect() map[string]int64 {
120 + mx, err := c.collect()
121 if err != nil {
122 - p.Error(err)
122 + c.Error(err)
123 }
124
125 if len(mx) == 0 {
@@ -128,8 +128,8 @@ func (p *Pulsar) Collect() map[string]int64 {
128 return mx
129 }
130
131 -func (p *Pulsar) Cleanup() {
132 - if p.prom != nil && p.prom.HTTPClient() != nil {
133 - p.prom.HTTPClient().CloseIdleConnections()
131 +func (c *Collector) Cleanup() {
132 + if c.prom != nil && c.prom.HTTPClient() != nil {
133 + c.prom.HTTPClient().CloseIdleConnections()
134 }
135 }
src/go/plugin/go.d/collector/pulsar/collector_test.go renamed
+72 -72
@@ -41,11 +41,11 @@ func Test_testDataIsValid(t *testing.T) {
41 }
42 }
43
44 -func TestPulsar_ConfigurationSerialize(t *testing.T) {
45 - module.TestConfigurationSerialize(t, &Pulsar{}, dataConfigJSON, dataConfigYAML)
44 +func TestCollector_ConfigurationSerialize(t *testing.T) {
45 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
46 }
47
48 -func TestPulsar_Init(t *testing.T) {
48 +func TestCollector_Init(t *testing.T) {
49 tests := map[string]struct {
50 config Config
51 wantFail bool
@@ -76,25 +76,25 @@ func TestPulsar_Init(t *testing.T) {
76
77 for name, test := range tests {
78 t.Run(name, func(t *testing.T) {
79 - pulsar := New()
80 - pulsar.Config = test.config
79 + collr := New()
80 + collr.Config = test.config
81
82 if test.wantFail {
83 - assert.Error(t, pulsar.Init())
83 + assert.Error(t, collr.Init())
84 } else {
85 - assert.NoError(t, pulsar.Init())
85 + assert.NoError(t, collr.Init())
86 }
87 })
88 }
89 }
90
91 -func TestPulsar_Cleanup(t *testing.T) {
91 +func TestCollector_Cleanup(t *testing.T) {
92 assert.NotPanics(t, New().Cleanup)
93 }
94
95 -func TestPulsar_Check(t *testing.T) {
95 +func TestCollector_Check(t *testing.T) {
96 tests := map[string]struct {
97 - prepare func(*testing.T) (*Pulsar, *httptest.Server)
97 + prepare func(*testing.T) (*Collector, *httptest.Server)
98 wantFail bool
99 }{
100 "standalone v2.5.0 namespaces": {prepare: prepareClientServerStdV250Namespaces},
@@ -107,26 +107,26 @@ func TestPulsar_Check(t *testing.T) {
107
108 for name, test := range tests {
109 t.Run(name, func(t *testing.T) {
110 - pulsar, srv := test.prepare(t)
110 + collr, srv := test.prepare(t)
111 defer srv.Close()
112
113 if test.wantFail {
114 - assert.Error(t, pulsar.Check())
114 + assert.Error(t, collr.Check())
115 } else {
116 - assert.NoError(t, pulsar.Check())
116 + assert.NoError(t, collr.Check())
117 }
118 })
119 }
120 }
121
122 -func TestPulsar_Charts(t *testing.T) {
122 +func TestCollector_Charts(t *testing.T) {
123 assert.NotNil(t, New().Charts())
124
125 }
126
127 -func TestPulsar_Collect_ReturnsNilOnErrors(t *testing.T) {
127 +func TestCollector_Collect_ReturnsNilOnErrors(t *testing.T) {
128 tests := map[string]struct {
129 - prepare func(*testing.T) (*Pulsar, *httptest.Server)
129 + prepare func(*testing.T) (*Collector, *httptest.Server)
130 }{
131 "non pulsar": {prepare: prepareClientServerNonPulsar},
132 "invalid data": {prepare: prepareClientServerInvalidData},
@@ -136,17 +136,17 @@ func TestPulsar_Collect_ReturnsNilOnErrors(t *testing.T) {
136
137 for name, test := range tests {
138 t.Run(name, func(t *testing.T) {
139 - pulsar, srv := test.prepare(t)
139 + collr, srv := test.prepare(t)
140 defer srv.Close()
141
142 - assert.Nil(t, pulsar.Collect())
142 + assert.Nil(t, collr.Collect())
143 })
144 }
145 }
146
147 -func TestPulsar_Collect(t *testing.T) {
147 +func TestCollector_Collect(t *testing.T) {
148 tests := map[string]struct {
149 - prepare func(*testing.T) (*Pulsar, *httptest.Server)
149 + prepare func(*testing.T) (*Collector, *httptest.Server)
150 expected map[string]int64
151 }{
152 "standalone v2.5.0 namespaces": {
@@ -165,42 +165,42 @@ func TestPulsar_Collect(t *testing.T) {
165
166 for name, test := range tests {
167 t.Run(name, func(t *testing.T) {
168 - pulsar, srv := test.prepare(t)
168 + collr, srv := test.prepare(t)
169 defer srv.Close()
170
171 for i := 0; i < 10; i++ {
172 - _ = pulsar.Collect()
172 + _ = collr.Collect()
173 }
174 - mx := pulsar.Collect()
174 + mx := collr.Collect()
175
176 require.NotNil(t, mx)
177 require.Equal(t, test.expected, mx)
178 - module.TestMetricsHasAllChartsDims(t, pulsar.Charts(), mx)
178 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
179 })
180 }
181 }
182
183 -func TestPulsar_Collect_RemoveAddNamespacesTopicsInRuntime(t *testing.T) {
184 - pulsar, srv := prepareClientServersDynamicStdV250Topics(t)
183 +func TestCollector_Collect_RemoveAddNamespacesTopicsInRuntime(t *testing.T) {
184 + collr, srv := prepareClientServersDynamicStdV250Topics(t)
185 defer srv.Close()
186
187 oldNsCharts := Charts{}
188
189 - require.NotNil(t, pulsar.Collect())
190 - oldLength := len(*pulsar.Charts())
189 + require.NotNil(t, collr.Collect())
190 + oldLength := len(*collr.Charts())
191
192 - for _, chart := range *pulsar.Charts() {
193 - for ns := range pulsar.cache.namespaces {
192 + for _, chart := range *collr.Charts() {
193 + for ns := range collr.cache.namespaces {
194 if ns.name != "public/functions" && chart.Fam == "ns "+ns.name {
195 _ = oldNsCharts.Add(chart)
196 }
197 }
198 }
199
200 - require.NotNil(t, pulsar.Collect())
200 + require.NotNil(t, collr.Collect())
201
202 - l := oldLength + len(*pulsar.nsCharts)*2 // 2 new namespaces
203 - assert.Truef(t, len(*pulsar.Charts()) == l, "expected %d charts, but got %d", l, len(*pulsar.Charts()))
202 + l := oldLength + len(*collr.nsCharts)*2 // 2 new namespaces
203 + assert.Truef(t, len(*collr.Charts()) == l, "expected %d charts, but got %d", l, len(*collr.Charts()))
204
205 for _, chart := range oldNsCharts {
206 assert.Truef(t, chart.Obsolete, "expected chart '%s' Obsolete flag is set", chart.ID)
@@ -212,43 +212,43 @@ func TestPulsar_Collect_RemoveAddNamespacesTopicsInRuntime(t *testing.T) {
212 }
213 }
214
215 -func prepareClientServerStdV250Namespaces(t *testing.T) (*Pulsar, *httptest.Server) {
215 +func prepareClientServerStdV250Namespaces(t *testing.T) (*Collector, *httptest.Server) {
216 t.Helper()
217 srv := httptest.NewServer(http.HandlerFunc(
218 func(w http.ResponseWriter, r *http.Request) {
219 _, _ = w.Write(dataVer250Namespaces)
220 }))
221
222 - pulsar := New()
223 - pulsar.URL = srv.URL
224 - require.NoError(t, pulsar.Init())
222 + collr := New()
223 + collr.URL = srv.URL
224 + require.NoError(t, collr.Init())
225
226 - return pulsar, srv
226 + return collr, srv
227 }
228
229 -func prepareClientServerStdV250Topics(t *testing.T) (*Pulsar, *httptest.Server) {
229 +func prepareClientServerStdV250Topics(t *testing.T) (*Collector, *httptest.Server) {
230 t.Helper()
231 srv := httptest.NewServer(http.HandlerFunc(
232 func(w http.ResponseWriter, r *http.Request) {
233 _, _ = w.Write(dataVer250Topics)
234 }))
235
236 - pulsar := New()
237 - pulsar.URL = srv.URL
238 - require.NoError(t, pulsar.Init())
236 + collr := New()
237 + collr.URL = srv.URL
238 + require.NoError(t, collr.Init())
239
240 - return pulsar, srv
240 + return collr, srv
241 }
242
243 -func prepareClientServerStdV250TopicsFiltered(t *testing.T) (*Pulsar, *httptest.Server) {
243 +func prepareClientServerStdV250TopicsFiltered(t *testing.T) (*Collector, *httptest.Server) {
244 t.Helper()
245 - pulsar, srv := prepareClientServerStdV250Topics(t)
246 - pulsar.topicFilter = matcher.FALSE()
245 + collr, srv := prepareClientServerStdV250Topics(t)
246 + collr.topicFilter = matcher.FALSE()
247
248 - return pulsar, srv
248 + return collr, srv
249 }
250
251 -func prepareClientServersDynamicStdV250Topics(t *testing.T) (*Pulsar, *httptest.Server) {
251 +func prepareClientServersDynamicStdV250Topics(t *testing.T) (*Collector, *httptest.Server) {
252 t.Helper()
253 var i int
254 srv := httptest.NewServer(http.HandlerFunc(
@@ -261,64 +261,64 @@ func prepareClientServersDynamicStdV250Topics(t *testing.T) (*Pulsar, *httptest.
261 i++
262 }))
263
264 - pulsar := New()
265 - pulsar.URL = srv.URL
266 - require.NoError(t, pulsar.Init())
264 + collr := New()
265 + collr.URL = srv.URL
266 + require.NoError(t, collr.Init())
267
268 - return pulsar, srv
268 + return collr, srv
269 }
270
271 -func prepareClientServerNonPulsar(t *testing.T) (*Pulsar, *httptest.Server) {
271 +func prepareClientServerNonPulsar(t *testing.T) (*Collector, *httptest.Server) {
272 t.Helper()
273 srv := httptest.NewServer(http.HandlerFunc(
274 func(w http.ResponseWriter, r *http.Request) {
275 _, _ = w.Write(dataNonPulsarMetrics)
276 }))
277
278 - pulsar := New()
279 - pulsar.URL = srv.URL
280 - require.NoError(t, pulsar.Init())
278 + collr := New()
279 + collr.URL = srv.URL
280 + require.NoError(t, collr.Init())
281
282 - return pulsar, srv
282 + return collr, srv
283 }
284
285 -func prepareClientServerInvalidData(t *testing.T) (*Pulsar, *httptest.Server) {
285 +func prepareClientServerInvalidData(t *testing.T) (*Collector, *httptest.Server) {
286 t.Helper()
287 srv := httptest.NewServer(http.HandlerFunc(
288 func(w http.ResponseWriter, r *http.Request) {
289 _, _ = w.Write([]byte("hello and\n goodbye"))
290 }))
291
292 - pulsar := New()
293 - pulsar.URL = srv.URL
294 - require.NoError(t, pulsar.Init())
292 + collr := New()
293 + collr.URL = srv.URL
294 + require.NoError(t, collr.Init())
295
296 - return pulsar, srv
296 + return collr, srv
297 }
298
299 -func prepareClientServer404(t *testing.T) (*Pulsar, *httptest.Server) {
299 +func prepareClientServer404(t *testing.T) (*Collector, *httptest.Server) {
300 t.Helper()
301 srv := httptest.NewServer(http.HandlerFunc(
302 func(w http.ResponseWriter, r *http.Request) {
303 w.WriteHeader(http.StatusNotFound)
304 }))
305
306 - pulsar := New()
307 - pulsar.URL = srv.URL
308 - require.NoError(t, pulsar.Init())
306 + collr := New()
307 + collr.URL = srv.URL
308 + require.NoError(t, collr.Init())
309
310 - return pulsar, srv
310 + return collr, srv
311 }
312
313 -func prepareClientServerConnectionRefused(t *testing.T) (*Pulsar, *httptest.Server) {
313 +func prepareClientServerConnectionRefused(t *testing.T) (*Collector, *httptest.Server) {
314 t.Helper()
315 srv := httptest.NewServer(nil)
316
317 - pulsar := New()
318 - pulsar.URL = "http://127.0.0.1:38001/metrics"
319 - require.NoError(t, pulsar.Init())
317 + collr := New()
318 + collr.URL = "http://127.0.0.1:38001/metrics"
319 + require.NoError(t, collr.Init())
320
321 - return pulsar, srv
321 + return collr, srv
322 }
323
324 var expectedStandaloneV250Namespaces = map[string]int64{
src/go/plugin/go.d/collector/pulsar/init.go
+8 -8
@@ -10,25 +10,25 @@ import (
10 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/web"
11 )
12
13 -func (p *Pulsar) validateConfig() error {
14 - if p.URL == "" {
13 +func (c *Collector) validateConfig() error {
14 + if c.URL == "" {
15 return errors.New("url not set")
16 }
17 return nil
18 }
19
20 -func (p *Pulsar) initPrometheusClient() (prometheus.Prometheus, error) {
21 - client, err := web.NewHTTPClient(p.ClientConfig)
20 +func (c *Collector) initPrometheusClient() (prometheus.Prometheus, error) {
21 + client, err := web.NewHTTPClient(c.ClientConfig)
22 if err != nil {
23 return nil, err
24 }
25
26 - return prometheus.New(client, p.RequestConfig), nil
26 + return prometheus.New(client, c.RequestConfig), nil
27 }
28
29 -func (p *Pulsar) initTopicFilerMatcher() (matcher.Matcher, error) {
30 - if p.TopicFilter.Empty() {
29 +func (c *Collector) initTopicFilerMatcher() (matcher.Matcher, error) {
30 + if c.TopicFilter.Empty() {
31 return matcher.FALSE(), nil
32 }
33 - return p.TopicFilter.Parse()
33 + return c.TopicFilter.Parse()
34 }
src/go/plugin/go.d/collector/puppet/collect.go
+5 -5
@@ -16,8 +16,8 @@ var (
16 urlQueryStatusService = url.Values{"level": {"debug"}}.Encode()
17 )
18
19 -func (p *Puppet) collect() (map[string]int64, error) {
20 - stats, err := p.queryStatsService()
19 +func (c *Collector) collect() (map[string]int64, error) {
20 + stats, err := c.queryStatsService()
21 if err != nil {
22 return nil, err
23 }
@@ -27,8 +27,8 @@ func (p *Puppet) collect() (map[string]int64, error) {
27 return mx, nil
28 }
29
30 -func (p *Puppet) queryStatsService() (*statusServiceResponse, error) {
31 - req, err := web.NewHTTPRequestWithPath(p.RequestConfig, urlPathStatusService)
30 +func (c *Collector) queryStatsService() (*statusServiceResponse, error) {
31 + req, err := web.NewHTTPRequestWithPath(c.RequestConfig, urlPathStatusService)
32 if err != nil {
33 return nil, err
34 }
@@ -36,7 +36,7 @@ func (p *Puppet) queryStatsService() (*statusServiceResponse, error) {
36 req.URL.RawQuery = urlQueryStatusService
37
38 var stats statusServiceResponse
39 - if err := web.DoHTTP(p.httpClient).RequestJSON(req, &stats); err != nil {
39 + if err := web.DoHTTP(c.httpClient).RequestJSON(req, &stats); err != nil {
40 return nil, err
41 }
42
src/go/plugin/go.d/collector/puppet/collector.go renamed
+21 -21
@@ -25,8 +25,8 @@ func init() {
25 })
26 }
27
28 -func New() *Puppet {
29 - return &Puppet{
28 +func New() *Collector {
29 + return &Collector{
30 Config: Config{
31 HTTPConfig: web.HTTPConfig{
32 RequestConfig: web.RequestConfig{
@@ -46,7 +46,7 @@ type Config struct {
46 web.HTTPConfig `yaml:",inline" json:""`
47 }
48
49 -type Puppet struct {
49 +type Collector struct {
50 module.Base
51 Config `yaml:",inline" json:""`
52
@@ -55,29 +55,29 @@ type Puppet struct {
55 httpClient *http.Client
56 }
57
58 -func (p *Puppet) Configuration() any {
59 - return p.Config
58 +func (c *Collector) Configuration() any {
59 + return c.Config
60 }
61
62 -func (p *Puppet) Init() error {
63 - if p.URL == "" {
62 +func (c *Collector) Init() error {
63 + if c.URL == "" {
64 return errors.New("url not set")
65 }
66
67 - client, err := web.NewHTTPClient(p.ClientConfig)
67 + client, err := web.NewHTTPClient(c.ClientConfig)
68 if err != nil {
69 return fmt.Errorf("create http client: %v", err)
70 }
71 - p.httpClient = client
71 + c.httpClient = client
72
73 - p.Debugf("using URL %s", p.URL)
74 - p.Debugf("using timeout: %s", p.Timeout)
73 + c.Debugf("using URL %s", c.URL)
74 + c.Debugf("using timeout: %s", c.Timeout)
75
76 return nil
77 }
78
79 -func (p *Puppet) Check() error {
80 - mx, err := p.collect()
79 +func (c *Collector) Check() error {
80 + mx, err := c.collect()
81 if err != nil {
82 return err
83 }
@@ -89,14 +89,14 @@ func (p *Puppet) Check() error {
89 return nil
90 }
91
92 -func (p *Puppet) Charts() *module.Charts {
93 - return p.charts
92 +func (c *Collector) Charts() *module.Charts {
93 + return c.charts
94 }
95
96 -func (p *Puppet) Collect() map[string]int64 {
97 - mx, err := p.collect()
96 +func (c *Collector) Collect() map[string]int64 {
97 + mx, err := c.collect()
98 if err != nil {
99 - p.Error(err)
99 + c.Error(err)
100 }
101
102 if len(mx) == 0 {
@@ -106,8 +106,8 @@ func (p *Puppet) Collect() map[string]int64 {
106 return mx
107 }
108
109 -func (p *Puppet) Cleanup() {
110 - if p.httpClient != nil {
111 - p.httpClient.CloseIdleConnections()
109 +func (c *Collector) Cleanup() {
110 + if c.httpClient != nil {
111 + c.httpClient.CloseIdleConnections()
112 }
113 }
src/go/plugin/go.d/collector/puppet/collector_test.go renamed
+38 -38
@@ -32,11 +32,11 @@ func Test_testDataIsValid(t *testing.T) {
32 }
33 }
34
35 -func TestPuppet_ConfigurationSerialize(t *testing.T) {
36 - module.TestConfigurationSerialize(t, &Puppet{}, dataConfigJSON, dataConfigYAML)
35 +func TestCollector_ConfigurationSerialize(t *testing.T) {
36 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
37 }
38
39 -func TestPuppet_Init(t *testing.T) {
39 +func TestCollector_Init(t *testing.T) {
40 tests := map[string]struct {
41 wantFail bool
42 config Config
@@ -57,26 +57,26 @@ func TestPuppet_Init(t *testing.T) {
57
58 for name, test := range tests {
59 t.Run(name, func(t *testing.T) {
60 - puppet := New()
61 - puppet.Config = test.config
60 + collr := New()
61 + collr.Config = test.config
62
63 if test.wantFail {
64 - assert.Error(t, puppet.Init())
64 + assert.Error(t, collr.Init())
65 } else {
66 - assert.NoError(t, puppet.Init())
66 + assert.NoError(t, collr.Init())
67 }
68 })
69 }
70 }
71
72 -func TestPuppet_Charts(t *testing.T) {
72 +func TestCollector_Charts(t *testing.T) {
73 assert.NotNil(t, New().Charts())
74 }
75
76 -func TestPuppet_Check(t *testing.T) {
76 +func TestCollector_Check(t *testing.T) {
77 tests := map[string]struct {
78 wantFail bool
79 - prepare func(t *testing.T) (*Puppet, func())
79 + prepare func(t *testing.T) (*Collector, func())
80 }{
81 "success default config": {
82 wantFail: false,
@@ -98,21 +98,21 @@ func TestPuppet_Check(t *testing.T) {
98
99 for name, test := range tests {
100 t.Run(name, func(t *testing.T) {
101 - puppet, cleanup := test.prepare(t)
101 + collr, cleanup := test.prepare(t)
102 defer cleanup()
103
104 if test.wantFail {
105 - assert.Error(t, puppet.Check())
105 + assert.Error(t, collr.Check())
106 } else {
107 - assert.NoError(t, puppet.Check())
107 + assert.NoError(t, collr.Check())
108 }
109 })
110 }
111 }
112
113 -func TestPuppet_Collect(t *testing.T) {
113 +func TestCollector_Collect(t *testing.T) {
114 tests := map[string]struct {
115 - prepare func(t *testing.T) (*Puppet, func())
115 + prepare func(t *testing.T) (*Collector, func())
116 wantMetrics map[string]int64
117 }{
118 "success default config": {
@@ -145,21 +145,21 @@ func TestPuppet_Collect(t *testing.T) {
145
146 for name, test := range tests {
147 t.Run(name, func(t *testing.T) {
148 - puppet, cleanup := test.prepare(t)
148 + collr, cleanup := test.prepare(t)
149 defer cleanup()
150
151 - mx := puppet.Collect()
151 + mx := collr.Collect()
152
153 require.Equal(t, test.wantMetrics, mx)
154
155 if len(test.wantMetrics) > 0 {
156 - module.TestMetricsHasAllChartsDims(t, puppet.Charts(), mx)
156 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
157 }
158 })
159 }
160 }
161
162 -func prepareCaseOkDefault(t *testing.T) (*Puppet, func()) {
162 +func prepareCaseOkDefault(t *testing.T) (*Collector, func()) {
163 t.Helper()
164 srv := httptest.NewServer(http.HandlerFunc(
165 func(w http.ResponseWriter, r *http.Request) {
@@ -175,14 +175,14 @@ func prepareCaseOkDefault(t *testing.T) (*Puppet, func()) {
175 }
176 }))
177
178 - puppet := New()
179 - puppet.URL = srv.URL
180 - require.NoError(t, puppet.Init())
178 + collr := New()
179 + collr.URL = srv.URL
180 + require.NoError(t, collr.Init())
181
182 - return puppet, srv.Close
182 + return collr, srv.Close
183 }
184
185 -func prepareCaseUnexpectedJsonResponse(t *testing.T) (*Puppet, func()) {
185 +func prepareCaseUnexpectedJsonResponse(t *testing.T) (*Collector, func()) {
186 t.Helper()
187 resp := `
188 {
@@ -206,32 +206,32 @@ func prepareCaseUnexpectedJsonResponse(t *testing.T) (*Puppet, func()) {
206 _, _ = w.Write([]byte(resp))
207 }))
208
209 - puppet := New()
210 - puppet.URL = srv.URL
211 - require.NoError(t, puppet.Init())
209 + collr := New()
210 + collr.URL = srv.URL
211 + require.NoError(t, collr.Init())
212
213 - return puppet, srv.Close
213 + return collr, srv.Close
214 }
215
216 -func prepareCaseInvalidFormatResponse(t *testing.T) (*Puppet, func()) {
216 +func prepareCaseInvalidFormatResponse(t *testing.T) (*Collector, func()) {
217 t.Helper()
218 srv := httptest.NewServer(http.HandlerFunc(
219 func(w http.ResponseWriter, r *http.Request) {
220 _, _ = w.Write([]byte("hello and\n goodbye"))
221 }))
222
223 - puppet := New()
224 - puppet.URL = srv.URL
225 - require.NoError(t, puppet.Init())
223 + collr := New()
224 + collr.URL = srv.URL
225 + require.NoError(t, collr.Init())
226
227 - return puppet, srv.Close
227 + return collr, srv.Close
228 }
229
230 -func prepareCaseConnectionRefused(t *testing.T) (*Puppet, func()) {
230 +func prepareCaseConnectionRefused(t *testing.T) (*Collector, func()) {
231 t.Helper()
232 - puppet := New()
233 - puppet.URL = "http://127.0.0.1:65001"
234 - require.NoError(t, puppet.Init())
232 + collr := New()
233 + collr.URL = "http://127.0.0.1:65001"
234 + require.NoError(t, collr.Init())
235
236 - return puppet, func() {}
236 + return collr, func() {}
237 }
src/go/plugin/go.d/collector/rabbitmq/charts.go
+50 -50
@@ -430,83 +430,83 @@ var (
430 }
431 )
432
433 -func (r *RabbitMQ) updateCharts() {
434 - if !r.cache.overview.hasCharts {
435 - r.cache.overview.hasCharts = true
436 - r.addOverviewCharts()
433 +func (c *Collector) updateCharts() {
434 + if !c.cache.overview.hasCharts {
435 + c.cache.overview.hasCharts = true
436 + c.addOverviewCharts()
437 }
438
439 - maps.DeleteFunc(r.cache.nodes, func(_ string, node *nodeCacheItem) bool {
439 + maps.DeleteFunc(c.cache.nodes, func(_ string, node *nodeCacheItem) bool {
440 if !node.seen {
441 - r.removeNodeCharts(node)
441 + c.removeNodeCharts(node)
442 return true
443 }
444 if !node.hasCharts {
445 node.hasCharts = true
446 - r.addNodeCharts(node)
446 + c.addNodeCharts(node)
447 }
448 maps.DeleteFunc(node.peers, func(_ string, peer *peerCacheItem) bool {
449 if !peer.seen {
450 - r.removeNodeClusterPeerCharts(peer)
450 + c.removeNodeClusterPeerCharts(peer)
451 return true
452 }
453 if !peer.hasCharts {
454 peer.hasCharts = true
455 - r.addNodeClusterPeerCharts(peer)
455 + c.addNodeClusterPeerCharts(peer)
456 }
457 return false
458 })
459 return false
460 })
461
462 - maps.DeleteFunc(r.cache.vhosts, func(_ string, vhost *vhostCacheItem) bool {
462 + maps.DeleteFunc(c.cache.vhosts, func(_ string, vhost *vhostCacheItem) bool {
463 if !vhost.seen {
464 - r.removeVhostCharts(vhost)
464 + c.removeVhostCharts(vhost)
465 return true
466 }
467 if !vhost.hasCharts {
468 vhost.hasCharts = true
469 - r.addVhostCharts(vhost)
469 + c.addVhostCharts(vhost)
470 }
471 return false
472 })
473
474 - maps.DeleteFunc(r.cache.queues, func(_ string, queue *queueCacheItem) bool {
474 + maps.DeleteFunc(c.cache.queues, func(_ string, queue *queueCacheItem) bool {
475 if !queue.seen {
476 - r.removeQueueCharts(queue)
476 + c.removeQueueCharts(queue)
477 return true
478 }
479 if !queue.hasCharts {
480 queue.hasCharts = true
481 - r.addQueueCharts(queue)
481 + c.addQueueCharts(queue)
482 }
483 return false
484 })
485 }
486
487 -func (r *RabbitMQ) addOverviewCharts() {
487 +func (c *Collector) addOverviewCharts() {
488 charts := overviewCharts.Copy()
489
490 for _, chart := range *charts {
491 chart.Labels = []module.Label{
492 - {Key: "cluster_id", Value: r.clusterId},
493 - {Key: "cluster_name", Value: r.clusterName},
492 + {Key: "cluster_id", Value: c.clusterId},
493 + {Key: "cluster_name", Value: c.clusterName},
494 }
495 }
496
497 - if err := r.Charts().Add(*charts...); err != nil {
498 - r.Warningf("failed to add overview charts: %v", err)
497 + if err := c.Charts().Add(*charts...); err != nil {
498 + c.Warningf("failed to add overview charts: %v", err)
499 }
500 }
501
502 -func (r *RabbitMQ) addNodeCharts(node *nodeCacheItem) {
502 +func (c *Collector) addNodeCharts(node *nodeCacheItem) {
503 charts := nodeChartsTmpl.Copy()
504
505 for _, chart := range *charts {
506 chart.ID = cleanChartId(fmt.Sprintf(chart.ID, node.name))
507 chart.Labels = []module.Label{
508 - {Key: "cluster_id", Value: r.clusterId},
509 - {Key: "cluster_name", Value: r.clusterName},
508 + {Key: "cluster_id", Value: c.clusterId},
509 + {Key: "cluster_name", Value: c.clusterName},
510 {Key: "node", Value: node.name},
511 }
512 for _, dim := range chart.Dims {
@@ -514,24 +514,24 @@ func (r *RabbitMQ) addNodeCharts(node *nodeCacheItem) {
514 }
515 }
516
517 - if err := r.Charts().Add(*charts...); err != nil {
518 - r.Warningf("failed to add node charts: %v", err)
517 + if err := c.Charts().Add(*charts...); err != nil {
518 + c.Warningf("failed to add node charts: %v", err)
519 }
520 }
521
522 -func (r *RabbitMQ) removeNodeCharts(node *nodeCacheItem) {
522 +func (c *Collector) removeNodeCharts(node *nodeCacheItem) {
523 px := fmt.Sprintf("node_%s_", node.name)
524 - r.removeCharts(px)
524 + c.removeCharts(px)
525 }
526
527 -func (r *RabbitMQ) addNodeClusterPeerCharts(peer *peerCacheItem) {
527 +func (c *Collector) addNodeClusterPeerCharts(peer *peerCacheItem) {
528 charts := nodeClusterPeerChartsTmpl.Copy()
529
530 for _, chart := range *charts {
531 chart.ID = cleanChartId(fmt.Sprintf(chart.ID, peer.node, peer.name))
532 chart.Labels = []module.Label{
533 - {Key: "cluster_id", Value: r.clusterId},
534 - {Key: "cluster_name", Value: r.clusterName},
533 + {Key: "cluster_id", Value: c.clusterId},
534 + {Key: "cluster_name", Value: c.clusterName},
535 {Key: "node", Value: peer.node},
536 {Key: "peer", Value: peer.name},
537 }
@@ -540,25 +540,25 @@ func (r *RabbitMQ) addNodeClusterPeerCharts(peer *peerCacheItem) {
540 }
541 }
542
543 - if err := r.Charts().Add(*charts...); err != nil {
544 - r.Warningf("failed to add node cluster peer charts: %v", err)
543 + if err := c.Charts().Add(*charts...); err != nil {
544 + c.Warningf("failed to add node cluster peer charts: %v", err)
545 }
546
547 }
548
549 -func (r *RabbitMQ) removeNodeClusterPeerCharts(peer *peerCacheItem) {
549 +func (c *Collector) removeNodeClusterPeerCharts(peer *peerCacheItem) {
550 px := fmt.Sprintf("node_%s_peer_%s_", peer.node, peer.name)
551 - r.removeCharts(px)
551 + c.removeCharts(px)
552 }
553
554 -func (r *RabbitMQ) addVhostCharts(vhost *vhostCacheItem) {
554 +func (c *Collector) addVhostCharts(vhost *vhostCacheItem) {
555 charts := vhostChartsTmpl.Copy()
556
557 for _, chart := range *charts {
558 chart.ID = cleanChartId(fmt.Sprintf(chart.ID, vhost.name))
559 chart.Labels = []module.Label{
560 - {Key: "cluster_id", Value: r.clusterId},
561 - {Key: "cluster_name", Value: r.clusterName},
560 + {Key: "cluster_id", Value: c.clusterId},
561 + {Key: "cluster_name", Value: c.clusterName},
562 {Key: "vhost", Value: vhost.name},
563 }
564 for _, dim := range chart.Dims {
@@ -566,25 +566,25 @@ func (r *RabbitMQ) addVhostCharts(vhost *vhostCacheItem) {
566 }
567 }
568
569 - if err := r.Charts().Add(*charts...); err != nil {
570 - r.Warningf("failed to add vhost charts: %v", err)
569 + if err := c.Charts().Add(*charts...); err != nil {
570 + c.Warningf("failed to add vhost charts: %v", err)
571 }
572 }
573
574 -func (r *RabbitMQ) removeVhostCharts(vhost *vhostCacheItem) {
574 +func (c *Collector) removeVhostCharts(vhost *vhostCacheItem) {
575 px := fmt.Sprintf("vhost_%s_", vhost.name)
576 - r.removeCharts(px)
576 + c.removeCharts(px)
577 }
578
579 -func (r *RabbitMQ) addQueueCharts(q *queueCacheItem) {
579 +func (c *Collector) addQueueCharts(q *queueCacheItem) {
580 charts := queueChartsTmpl.Copy()
581
582 for _, chart := range *charts {
583 chart.ID = fmt.Sprintf(chart.ID, q.name, q.vhost, q.node)
584 chart.ID = cleanChartId(chart.ID)
585 chart.Labels = []module.Label{
586 - {Key: "cluster_id", Value: r.clusterId},
587 - {Key: "cluster_name", Value: r.clusterName},
586 + {Key: "cluster_id", Value: c.clusterId},
587 + {Key: "cluster_name", Value: c.clusterName},
588 {Key: "node", Value: q.node},
589 {Key: "queue", Value: q.name},
590 {Key: "vhost", Value: q.vhost},
@@ -595,19 +595,19 @@ func (r *RabbitMQ) addQueueCharts(q *queueCacheItem) {
595 }
596 }
597
598 - if err := r.Charts().Add(*charts...); err != nil {
599 - r.Warning(err)
598 + if err := c.Charts().Add(*charts...); err != nil {
599 + c.Warning(err)
600 }
601 }
602
603 -func (r *RabbitMQ) removeQueueCharts(q *queueCacheItem) {
603 +func (c *Collector) removeQueueCharts(q *queueCacheItem) {
604 px := fmt.Sprintf("queue_%s_vhost_%s_node_%s_", q.name, q.vhost, q.node)
605 - r.removeCharts(px)
605 + c.removeCharts(px)
606 }
607
608 -func (r *RabbitMQ) removeCharts(prefix string) {
608 +func (c *Collector) removeCharts(prefix string) {
609 prefix = cleanChartId(prefix)
610 - for _, chart := range *r.Charts() {
610 + for _, chart := range *c.Charts() {
611 if strings.HasPrefix(chart.ID, prefix) {
612 chart.MarkRemove()
613 chart.MarkNotCreated()
src/go/plugin/go.d/collector/rabbitmq/collect.go
+17 -17
@@ -11,49 +11,49 @@ import (
11 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/web"
12 )
13
14 -func (r *RabbitMQ) collect() (map[string]int64, error) {
15 - if r.clusterName == "" {
16 - id, name, err := r.getClusterMeta()
14 +func (c *Collector) collect() (map[string]int64, error) {
15 + if c.clusterName == "" {
16 + id, name, err := c.getClusterMeta()
17 if err != nil {
18 return nil, err
19 }
20 - r.clusterId = id
21 - r.clusterName = name
20 + c.clusterId = id
21 + c.clusterName = name
22 }
23
24 - r.cache.resetSeen()
24 + c.cache.resetSeen()
25
26 mx := make(map[string]int64)
27
28 - if err := r.collectOverview(mx); err != nil {
28 + if err := c.collectOverview(mx); err != nil {
29 return nil, err
30 }
31 - if err := r.collectNodes(mx); err != nil {
31 + if err := c.collectNodes(mx); err != nil {
32 return mx, err
33 }
34 - if err := r.collectVhosts(mx); err != nil {
34 + if err := c.collectVhosts(mx); err != nil {
35 return mx, err
36 }
37 - if r.CollectQueues {
38 - if err := r.collectQueues(mx); err != nil {
37 + if c.CollectQueues {
38 + if err := c.collectQueues(mx); err != nil {
39 return mx, err
40 }
41 }
42
43 - r.updateCharts()
43 + c.updateCharts()
44
45 return mx, nil
46 }
47
48 -func (r *RabbitMQ) getClusterMeta() (id string, name string, err error) {
49 - req, err := web.NewHTTPRequestWithPath(r.RequestConfig, urlPathAPIDefinitions)
48 +func (c *Collector) getClusterMeta() (id string, name string, err error) {
49 + req, err := web.NewHTTPRequestWithPath(c.RequestConfig, urlPathAPIDefinitions)
50 if err != nil {
51 return "", "", fmt.Errorf("failed to create definitions request: %w", err)
52 }
53
54 var resp apiDefinitionsResp
55
56 - if err := r.webClient().RequestJSON(req, &resp); err != nil {
56 + if err := c.webClient().RequestJSON(req, &resp); err != nil {
57 return "", "", err
58 }
59
@@ -77,8 +77,8 @@ func (r *RabbitMQ) getClusterMeta() (id string, name string, err error) {
77 return id, name, nil
78 }
79
80 -func (r *RabbitMQ) webClient() *web.Client {
81 - return web.DoHTTP(r.httpClient).OnNokCode(func(resp *http.Response) (bool, error) {
80 +func (c *Collector) webClient() *web.Client {
81 + return web.DoHTTP(c.httpClient).OnNokCode(func(resp *http.Response) (bool, error) {
82 var msg struct {
83 Error string `json:"error"`
84 Reason string `json:"reason"`
src/go/plugin/go.d/collector/rabbitmq/collect_nodes.go
+5 -5
@@ -9,20 +9,20 @@ import (
9 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/web"
10 )
11
12 -func (r *RabbitMQ) collectNodes(mx map[string]int64) error {
13 - req, err := web.NewHTTPRequestWithPath(r.RequestConfig, urlPathAPINodes)
12 +func (c *Collector) collectNodes(mx map[string]int64) error {
13 + req, err := web.NewHTTPRequestWithPath(c.RequestConfig, urlPathAPINodes)
14 if err != nil {
15 return fmt.Errorf("failed to create node stats request: %w", err)
16 }
17
18 var resp []apiNodeResp
19
20 - if err := r.webClient().RequestJSON(req, &resp); err != nil {
20 + if err := c.webClient().RequestJSON(req, &resp); err != nil {
21 return err
22 }
23
24 for _, node := range resp {
25 - r.cache.getNode(node).seen = true
25 + c.cache.getNode(node).seen = true
26
27 px := fmt.Sprintf("node_%s_", node.Name)
28
@@ -57,7 +57,7 @@ func (r *RabbitMQ) collectNodes(mx map[string]int64) error {
57 mx[px+"uptime"] = node.Uptime / 1000 // ms to seconds
58
59 for _, peer := range node.ClusterLinks {
60 - r.cache.getNodeClusterPeer(node, peer).seen = true
60 + c.cache.getNodeClusterPeer(node, peer).seen = true
61
62 mx[px+"peer_"+peer.Name+"_cluster_link_recv_bytes"] = peer.RecvBytes
63 mx[px+"peer_"+peer.Name+"_cluster_link_send_bytes"] = peer.SendBytes
src/go/plugin/go.d/collector/rabbitmq/collect_overview.go
+3 -3
@@ -9,15 +9,15 @@ import (
9 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/web"
10 )
11
12 -func (r *RabbitMQ) collectOverview(mx map[string]int64) error {
13 - req, err := web.NewHTTPRequestWithPath(r.RequestConfig, urlPathAPIOverview)
12 +func (c *Collector) collectOverview(mx map[string]int64) error {
13 + req, err := web.NewHTTPRequestWithPath(c.RequestConfig, urlPathAPIOverview)
14 if err != nil {
15 return fmt.Errorf("failed to create overview stats request: %w", err)
16 }
17
18 var resp apiOverviewResp
19
20 - if err := r.webClient().RequestJSON(req, &resp); err != nil {
20 + if err := c.webClient().RequestJSON(req, &resp); err != nil {
21 return err
22 }
23
src/go/plugin/go.d/collector/rabbitmq/collect_queues.go
+4 -4
@@ -10,20 +10,20 @@ import (
10 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/web"
11 )
12
13 -func (r *RabbitMQ) collectQueues(mx map[string]int64) error {
14 - req, err := web.NewHTTPRequestWithPath(r.RequestConfig, urlPathAPIQueues)
13 +func (c *Collector) collectQueues(mx map[string]int64) error {
14 + req, err := web.NewHTTPRequestWithPath(c.RequestConfig, urlPathAPIQueues)
15 if err != nil {
16 return fmt.Errorf("failed to create queues stats request: %w", err)
17 }
18
19 var resp []apiQueueResp
20
21 - if err := r.webClient().RequestJSON(req, &resp); err != nil {
21 + if err := c.webClient().RequestJSON(req, &resp); err != nil {
22 return err
23 }
24
25 for _, q := range resp {
26 - r.cache.getQueue(q).seen = true
26 + c.cache.getQueue(q).seen = true
27
28 px := fmt.Sprintf("queue_%s_vhost_%s_node_%s_", q.Name, q.Vhost, q.Node)
29
src/go/plugin/go.d/collector/rabbitmq/collect_vhosts.go
+4 -4
@@ -10,20 +10,20 @@ import (
10 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/web"
11 )
12
13 -func (r *RabbitMQ) collectVhosts(mx map[string]int64) error {
14 - req, err := web.NewHTTPRequestWithPath(r.RequestConfig, urlPathAPIVhosts)
13 +func (c *Collector) collectVhosts(mx map[string]int64) error {
14 + req, err := web.NewHTTPRequestWithPath(c.RequestConfig, urlPathAPIVhosts)
15 if err != nil {
16 return fmt.Errorf("failed to create vhosts stats request: %w", err)
17 }
18
19 var resp []apiVhostResp
20
21 - if err := r.webClient().RequestJSON(req, &resp); err != nil {
21 + if err := c.webClient().RequestJSON(req, &resp); err != nil {
22 return err
23 }
24
25 for _, vhost := range resp {
26 - r.cache.getVhost(vhost.Name).seen = true
26 + c.cache.getVhost(vhost.Name).seen = true
27
28 px := fmt.Sprintf("vhost_%s_", vhost.Name)
29
src/go/plugin/go.d/collector/rabbitmq/collector.go renamed
+29 -31
@@ -25,8 +25,8 @@ func init() {
25 })
26 }
27
28 -func New() *RabbitMQ {
29 - return &RabbitMQ{
28 +func New() *Collector {
29 + return &Collector{
30 Config: Config{
31 HTTPConfig: web.HTTPConfig{
32 RequestConfig: web.RequestConfig{
@@ -52,44 +52,42 @@ type Config struct {
52 CollectQueues bool `yaml:"collect_queues_metrics" json:"collect_queues_metrics"`
53 }
54
55 -type (
56 - RabbitMQ struct {
57 - module.Base
58 - Config `yaml:",inline" json:""`
55 +type Collector struct {
56 + module.Base
57 + Config `yaml:",inline" json:""`
58
60 - charts *module.Charts
59 + charts *module.Charts
60
62 - httpClient *http.Client
61 + httpClient *http.Client
62
64 - clusterName string
65 - clusterId string
66 - cache *cache
67 - }
68 -)
63 + clusterName string
64 + clusterId string
65 + cache *cache
66 +}
67
70 -func (r *RabbitMQ) Configuration() any {
71 - return r.Config
68 +func (c *Collector) Configuration() any {
69 + return c.Config
70 }
71
74 -func (r *RabbitMQ) Init() error {
75 - if r.URL == "" {
72 +func (c *Collector) Init() error {
73 + if c.URL == "" {
74 return errors.New("config: url not set")
75 }
76
79 - client, err := web.NewHTTPClient(r.ClientConfig)
77 + client, err := web.NewHTTPClient(c.ClientConfig)
78 if err != nil {
79 return fmt.Errorf("init HTTP client: %v", err)
80 }
83 - r.httpClient = client
81 + c.httpClient = client
82
85 - r.Debugf("using URL %s", r.URL)
86 - r.Debugf("using timeout: %s", r.Timeout)
83 + c.Debugf("using URL %s", c.URL)
84 + c.Debugf("using timeout: %s", c.Timeout)
85
86 return nil
87 }
88
91 -func (r *RabbitMQ) Check() error {
92 - mx, err := r.collect()
89 +func (c *Collector) Check() error {
90 + mx, err := c.collect()
91 if err != nil {
92 return err
93 }
@@ -99,14 +97,14 @@ func (r *RabbitMQ) Check() error {
97 return nil
98 }
99
102 -func (r *RabbitMQ) Charts() *module.Charts {
103 - return r.charts
100 +func (c *Collector) Charts() *module.Charts {
101 + return c.charts
102 }
103
106 -func (r *RabbitMQ) Collect() map[string]int64 {
107 - mx, err := r.collect()
104 +func (c *Collector) Collect() map[string]int64 {
105 + mx, err := c.collect()
106 if err != nil {
109 - r.Error(err)
107 + c.Error(err)
108 }
109
110 if len(mx) == 0 {
@@ -116,8 +114,8 @@ func (r *RabbitMQ) Collect() map[string]int64 {
114 return mx
115 }
116
119 -func (r *RabbitMQ) Cleanup() {
120 - if r.httpClient != nil {
121 - r.httpClient.CloseIdleConnections()
117 +func (c *Collector) Cleanup() {
118 + if c.httpClient != nil {
119 + c.httpClient.CloseIdleConnections()
120 }
121 }
src/go/plugin/go.d/collector/rabbitmq/collector_test.go renamed
+42 -42
@@ -40,11 +40,11 @@ func Test_testDataIsValid(t *testing.T) {
40 }
41 }
42
43 -func TestRabbitMQ_ConfigurationSerialize(t *testing.T) {
44 - module.TestConfigurationSerialize(t, &RabbitMQ{}, dataConfigJSON, dataConfigYAML)
43 +func TestCollector_ConfigurationSerialize(t *testing.T) {
44 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
45 }
46
47 -func TestRabbitMQ_Init(t *testing.T) {
47 +func TestCollector_Init(t *testing.T) {
48 tests := map[string]struct {
49 wantFail bool
50 config Config
@@ -65,34 +65,34 @@ func TestRabbitMQ_Init(t *testing.T) {
65
66 for name, test := range tests {
67 t.Run(name, func(t *testing.T) {
68 - rmq := New()
69 - rmq.Config = test.config
68 + collr := New()
69 + collr.Config = test.config
70
71 if test.wantFail {
72 - assert.Error(t, rmq.Init())
72 + assert.Error(t, collr.Init())
73 } else {
74 - assert.NoError(t, rmq.Init())
74 + assert.NoError(t, collr.Init())
75 }
76 })
77 }
78 }
79
80 -func TestRabbitMQ_Charts(t *testing.T) {
80 +func TestCollector_Charts(t *testing.T) {
81 assert.NotNil(t, New().Charts())
82 }
83
84 -func TestRabbitMQ_Cleanup(t *testing.T) {
84 +func TestCollector_Cleanup(t *testing.T) {
85 assert.NotPanics(t, New().Cleanup)
86
87 - rmq := New()
88 - require.NoError(t, rmq.Init())
87 + collr := New()
88 + require.NoError(t, collr.Init())
89
90 - assert.NotPanics(t, rmq.Cleanup)
90 + assert.NotPanics(t, collr.Cleanup)
91 }
92
93 -func TestRabbitMQ_Check(t *testing.T) {
93 +func TestCollector_Check(t *testing.T) {
94 tests := map[string]struct {
95 - prepare func() (*RabbitMQ, func())
95 + prepare func() (*Collector, func())
96 wantFail bool
97 }{
98 "success on valid response": {wantFail: false, prepare: caseClusterOk},
@@ -102,23 +102,23 @@ func TestRabbitMQ_Check(t *testing.T) {
102
103 for name, test := range tests {
104 t.Run(name, func(t *testing.T) {
105 - rmq, cleanup := test.prepare()
105 + collr, cleanup := test.prepare()
106 defer cleanup()
107
108 - require.NoError(t, rmq.Init())
108 + require.NoError(t, collr.Init())
109
110 if test.wantFail {
111 - assert.Error(t, rmq.Check())
111 + assert.Error(t, collr.Check())
112 } else {
113 - assert.NoError(t, rmq.Check())
113 + assert.NoError(t, collr.Check())
114 }
115 })
116 }
117 }
118
119 -func TestRabbitMQ_Collect(t *testing.T) {
119 +func TestCollector_Collect(t *testing.T) {
120 tests := map[string]struct {
121 - prepare func() (*RabbitMQ, func())
121 + prepare func() (*Collector, func())
122 wantCollected map[string]int64
123 wantCharts int
124 }{
@@ -356,24 +356,24 @@ func TestRabbitMQ_Collect(t *testing.T) {
356
357 for name, test := range tests {
358 t.Run(name, func(t *testing.T) {
359 - rmq, cleanup := test.prepare()
359 + collr, cleanup := test.prepare()
360 defer cleanup()
361
362 - require.NoError(t, rmq.Init())
362 + require.NoError(t, collr.Init())
363
364 - mx := rmq.Collect()
364 + mx := collr.Collect()
365
366 assert.Equal(t, test.wantCollected, mx)
367
368 if len(test.wantCollected) > 0 {
369 - assert.Equal(t, test.wantCharts, len(*rmq.Charts()))
370 - module.TestMetricsHasAllChartsDims(t, rmq.Charts(), mx)
369 + assert.Equal(t, test.wantCharts, len(*collr.Charts()))
370 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
371 }
372 })
373 }
374 }
375
376 -func caseClusterOk() (*RabbitMQ, func()) {
376 +func caseClusterOk() (*Collector, func()) {
377 srv := httptest.NewServer(
378 http.HandlerFunc(
379 func(w http.ResponseWriter, r *http.Request) {
@@ -392,14 +392,14 @@ func caseClusterOk() (*RabbitMQ, func()) {
392 w.WriteHeader(404)
393 }
394 }))
395 - rmq := New()
396 - rmq.URL = srv.URL
397 - rmq.CollectQueues = true
395 + collr := New()
396 + collr.URL = srv.URL
397 + collr.CollectQueues = true
398
399 - return rmq, srv.Close
399 + return collr, srv.Close
400 }
401
402 -func caseUnexpectedJsonResponse() (*RabbitMQ, func()) {
402 +func caseUnexpectedJsonResponse() (*Collector, func()) {
403 resp := `
404 {
405 "elephant": {
@@ -421,30 +421,30 @@ func caseUnexpectedJsonResponse() (*RabbitMQ, func()) {
421 func(w http.ResponseWriter, r *http.Request) {
422 _, _ = w.Write([]byte(resp))
423 }))
424 - rmq := New()
425 - rmq.URL = srv.URL
424 + collr := New()
425 + collr.URL = srv.URL
426
427 - return rmq, srv.Close
427 + return collr, srv.Close
428 }
429
430 -func caseInvalidDataResponse() (*RabbitMQ, func()) {
430 +func caseInvalidDataResponse() (*Collector, func()) {
431 srv := httptest.NewServer(http.HandlerFunc(
432 func(w http.ResponseWriter, r *http.Request) {
433 _, _ = w.Write([]byte("hello and\n goodbye"))
434 }))
435 - rmq := New()
436 - rmq.URL = srv.URL
435 + collr := New()
436 + collr.URL = srv.URL
437
438 - return rmq, srv.Close
438 + return collr, srv.Close
439 }
440
441 -func case404() (*RabbitMQ, func()) {
441 +func case404() (*Collector, func()) {
442 srv := httptest.NewServer(http.HandlerFunc(
443 func(w http.ResponseWriter, r *http.Request) {
444 w.WriteHeader(http.StatusNotFound)
445 }))
446 - rmq := New()
447 - rmq.URL = srv.URL
446 + collr := New()
447 + collr.URL = srv.URL
448
449 - return rmq, srv.Close
449 + return collr, srv.Close
450 }
src/go/plugin/go.d/collector/redis/collect.go
+9 -9
@@ -15,28 +15,28 @@ import (
15
16 const precision = 1000 // float values multiplier and dimensions divisor
17
18 -func (r *Redis) collect() (map[string]int64, error) {
19 - info, err := r.rdb.Info(context.Background(), "all").Result()
18 +func (c *Collector) collect() (map[string]int64, error) {
19 + info, err := c.rdb.Info(context.Background(), "all").Result()
20 if err != nil {
21 return nil, err
22 }
23
24 - if r.server == "" {
24 + if c.server == "" {
25 s, v, err := extractServerVersion(info)
26 if err != nil {
27 return nil, fmt.Errorf("can not extract server app and version: %v", err)
28 }
29 - r.server, r.version = s, v
30 - r.Debugf(`server="%s",version="%s"`, s, v)
29 + c.server, c.version = s, v
30 + c.Debugf(`server="%s",version="%s"`, s, v)
31 }
32
33 - if r.server != "redis" {
34 - return nil, fmt.Errorf("unsupported server app, want=redis, got=%s", r.server)
33 + if c.server != "redis" {
34 + return nil, fmt.Errorf("unsupported server app, want=redis, got=%s", c.server)
35 }
36
37 mx := make(map[string]int64)
38 - r.collectInfo(mx, info)
39 - r.collectPingLatency(mx)
38 + c.collectInfo(mx, info)
39 + c.collectPingLatency(mx)
40
41 return mx, nil
42 }
src/go/plugin/go.d/collector/redis/collect_info.go
+34 -34
@@ -37,7 +37,7 @@ var infoSections = map[string]struct{}{
37
38 func isInfoSection(line string) bool { _, ok := infoSections[line]; return ok }
39
40 -func (r *Redis) collectInfo(mx map[string]int64, info string) {
40 +func (c *Collector) collectInfo(mx map[string]int64, info string) {
41 // https://redis.io/commands/info
42 // Lines can contain a section name (starting with a # character) or a property.
43 // All the properties are in the form of field:value terminated by \r\n.
@@ -64,9 +64,9 @@ func (r *Redis) collectInfo(mx map[string]int64, info string) {
64
65 switch {
66 case curSection == infoSectionCommandstats:
67 - r.collectInfoCommandstatsProperty(mx, field, value)
67 + c.collectInfoCommandstatsProperty(mx, field, value)
68 case curSection == infoSectionKeyspace:
69 - r.collectInfoKeyspaceProperty(mx, field, value)
69 + c.collectInfoKeyspaceProperty(mx, field, value)
70 case field == "rdb_last_bgsave_status":
71 collectNumericValue(mx, field, convertBgSaveStatus(value))
72 case field == "rdb_current_bgsave_time_sec" && value == "-1":
@@ -80,7 +80,7 @@ func (r *Redis) collectInfo(mx map[string]int64, info string) {
80 v, _ := strconv.ParseInt(value, 10, 64)
81 mx[field] = int64(time.Since(time.Unix(v, 0)).Seconds())
82 case field == "aof_enabled" && value == "1":
83 - r.addAOFChartsOnce.Do(r.addAOFCharts)
83 + c.addAOFChartsOnce.Do(c.addAOFCharts)
84 case field == "master_link_status":
85 mx["master_link_status_up"] = metrix.Bool(value == "up")
86 mx["master_link_status_down"] = metrix.Bool(value == "down")
@@ -93,7 +93,7 @@ func (r *Redis) collectInfo(mx map[string]int64, info string) {
93 mx["keyspace_hit_rate"] = int64(calcKeyspaceHitRate(mx) * precision)
94 }
95 if has(mx, "master_last_io_seconds_ago") {
96 - r.addReplSlaveChartsOnce.Do(r.addReplSlaveCharts)
96 + c.addReplSlaveChartsOnce.Do(c.addReplSlaveCharts)
97 if !has(mx, "master_link_down_since_seconds") {
98 mx["master_link_down_since_seconds"] = 0
99 }
@@ -102,7 +102,7 @@ func (r *Redis) collectInfo(mx map[string]int64, info string) {
102
103 var reKeyspaceValue = regexp.MustCompile(`^keys=(\d+),expires=(\d+)`)
104
105 -func (r *Redis) collectInfoKeyspaceProperty(ms map[string]int64, field, value string) {
105 +func (c *Collector) collectInfoKeyspaceProperty(ms map[string]int64, field, value string) {
106 match := reKeyspaceValue.FindStringSubmatch(value)
107 if match == nil {
108 return
@@ -112,15 +112,15 @@ func (r *Redis) collectInfoKeyspaceProperty(ms map[string]int64, field, value st
112 collectNumericValue(ms, field+"_keys", keys)
113 collectNumericValue(ms, field+"_expires_keys", expires)
114
115 - if !r.collectedDbs[field] {
116 - r.collectedDbs[field] = true
117 - r.addDbToKeyspaceCharts(field)
115 + if !c.collectedDbs[field] {
116 + c.collectedDbs[field] = true
117 + c.addDbToKeyspaceCharts(field)
118 }
119 }
120
121 var reCommandstatsValue = regexp.MustCompile(`^calls=(\d+),usec=(\d+),usec_per_call=([\d.]+)`)
122
123 -func (r *Redis) collectInfoCommandstatsProperty(ms map[string]int64, field, value string) {
123 +func (c *Collector) collectInfoCommandstatsProperty(ms map[string]int64, field, value string) {
124 if !strings.HasPrefix(field, "cmdstat_") {
125 return
126 }
@@ -136,9 +136,9 @@ func (r *Redis) collectInfoCommandstatsProperty(ms map[string]int64, field, valu
136 collectNumericValue(ms, "cmd_"+cmd+"_usec", usec)
137 collectNumericValue(ms, "cmd_"+cmd+"_usec_per_call", usecPerCall)
138
139 - if !r.collectedCommands[cmd] {
140 - r.collectedCommands[cmd] = true
141 - r.addCmdToCommandsCharts(cmd)
139 + if !c.collectedCommands[cmd] {
140 + c.collectedCommands[cmd] = true
141 + c.addCmdToCommandsCharts(cmd)
142 }
143 }
144
@@ -181,64 +181,64 @@ func calcKeyspaceHitRate(ms map[string]int64) float64 {
181 return float64(hits) * 100 / float64(hits+misses)
182 }
183
184 -func (r *Redis) addCmdToCommandsCharts(cmd string) {
185 - r.addDimToChart(chartCommandsCalls.ID, &module.Dim{
184 +func (c *Collector) addCmdToCommandsCharts(cmd string) {
185 + c.addDimToChart(chartCommandsCalls.ID, &module.Dim{
186 ID: "cmd_" + cmd + "_calls",
187 Name: strings.ToUpper(cmd),
188 Algo: module.Incremental,
189 })
190 - r.addDimToChart(chartCommandsUsec.ID, &module.Dim{
190 + c.addDimToChart(chartCommandsUsec.ID, &module.Dim{
191 ID: "cmd_" + cmd + "_usec",
192 Name: strings.ToUpper(cmd),
193 Algo: module.Incremental,
194 })
195 - r.addDimToChart(chartCommandsUsecPerSec.ID, &module.Dim{
195 + c.addDimToChart(chartCommandsUsecPerSec.ID, &module.Dim{
196 ID: "cmd_" + cmd + "_usec_per_call",
197 Name: strings.ToUpper(cmd),
198 Div: precision,
199 })
200 }
201
202 -func (r *Redis) addDbToKeyspaceCharts(db string) {
203 - r.addDimToChart(chartKeys.ID, &module.Dim{
202 +func (c *Collector) addDbToKeyspaceCharts(db string) {
203 + c.addDimToChart(chartKeys.ID, &module.Dim{
204 ID: db + "_keys",
205 Name: db,
206 })
207 - r.addDimToChart(chartExpiresKeys.ID, &module.Dim{
207 + c.addDimToChart(chartExpiresKeys.ID, &module.Dim{
208 ID: db + "_expires_keys",
209 Name: db,
210 })
211 }
212
213 -func (r *Redis) addDimToChart(chartID string, dim *module.Dim) {
214 - chart := r.Charts().Get(chartID)
213 +func (c *Collector) addDimToChart(chartID string, dim *module.Dim) {
214 + chart := c.Charts().Get(chartID)
215 if chart == nil {
216 - r.Warningf("error on adding '%s' dimension: can not find '%s' chart", dim.ID, chartID)
216 + c.Warningf("error on adding '%s' dimension: can not find '%s' chart", dim.ID, chartID)
217 return
218 }
219 if err := chart.AddDim(dim); err != nil {
220 - r.Warning(err)
220 + c.Warning(err)
221 return
222 }
223 chart.MarkNotCreated()
224 }
225
226 -func (r *Redis) addAOFCharts() {
227 - err := r.Charts().Add(chartPersistenceAOFSize.Copy())
226 +func (c *Collector) addAOFCharts() {
227 + err := c.Charts().Add(chartPersistenceAOFSize.Copy())
228 if err != nil {
229 - r.Warningf("error on adding '%s' chart", chartPersistenceAOFSize.ID)
229 + c.Warningf("error on adding '%s' chart", chartPersistenceAOFSize.ID)
230 }
231 }
232
233 -func (r *Redis) addReplSlaveCharts() {
234 - if err := r.Charts().Add(masterLinkStatusChart.Copy()); err != nil {
235 - r.Warningf("error on adding '%s' chart", masterLinkStatusChart.ID)
233 +func (c *Collector) addReplSlaveCharts() {
234 + if err := c.Charts().Add(masterLinkStatusChart.Copy()); err != nil {
235 + c.Warningf("error on adding '%s' chart", masterLinkStatusChart.ID)
236 }
237 - if err := r.Charts().Add(masterLastIOSinceTimeChart.Copy()); err != nil {
238 - r.Warningf("error on adding '%s' chart", masterLastIOSinceTimeChart.ID)
237 + if err := c.Charts().Add(masterLastIOSinceTimeChart.Copy()); err != nil {
238 + c.Warningf("error on adding '%s' chart", masterLastIOSinceTimeChart.ID)
239 }
240 - if err := r.Charts().Add(masterLinkDownSinceTimeChart.Copy()); err != nil {
241 - r.Warningf("error on adding '%s' chart", masterLinkDownSinceTimeChart.ID)
240 + if err := c.Charts().Add(masterLinkDownSinceTimeChart.Copy()); err != nil {
241 + c.Warningf("error on adding '%s' chart", masterLinkDownSinceTimeChart.ID)
242 }
243 }
244
src/go/plugin/go.d/collector/redis/collect_ping_latency.go
+7 -7
@@ -7,21 +7,21 @@ import (
7 "time"
8 )
9
10 -func (r *Redis) collectPingLatency(mx map[string]int64) {
11 - r.pingSummary.Reset()
10 +func (c *Collector) collectPingLatency(mx map[string]int64) {
11 + c.pingSummary.Reset()
12
13 - for i := 0; i < r.PingSamples; i++ {
13 + for i := 0; i < c.PingSamples; i++ {
14 now := time.Now()
15 - _, err := r.rdb.Ping(context.Background()).Result()
15 + _, err := c.rdb.Ping(context.Background()).Result()
16 elapsed := time.Since(now)
17
18 if err != nil {
19 - r.Debug(err)
19 + c.Debug(err)
20 continue
21 }
22
23 - r.pingSummary.Observe(float64(elapsed.Microseconds()))
23 + c.pingSummary.Observe(float64(elapsed.Microseconds()))
24 }
25
26 - r.pingSummary.WriteTo(mx, "ping_latency", 1, 1)
26 + c.pingSummary.WriteTo(mx, "ping_latency", 1, 1)
27 }
src/go/plugin/go.d/collector/redis/collector.go renamed
+23 -23
@@ -30,8 +30,8 @@ func init() {
30 })
31 }
32
33 -func New() *Redis {
34 - return &Redis{
33 +func New() *Collector {
34 + return &Collector{
35 Config: Config{
36 Address: "redis://@localhost:6379",
37 Timeout: confopt.Duration(time.Second),
@@ -57,7 +57,7 @@ type Config struct {
57 }
58
59 type (
60 - Redis struct {
60 + Collector struct {
61 module.Base
62 Config `yaml:",inline" json:""`
63
@@ -80,33 +80,33 @@ type (
80 }
81 )
82
83 -func (r *Redis) Configuration() any {
84 - return r.Config
83 +func (c *Collector) Configuration() any {
84 + return c.Config
85 }
86
87 -func (r *Redis) Init() error {
88 - err := r.validateConfig()
87 +func (c *Collector) Init() error {
88 + err := c.validateConfig()
89 if err != nil {
90 return fmt.Errorf("config validation: %v", err)
91 }
92
93 - rdb, err := r.initRedisClient()
93 + rdb, err := c.initRedisClient()
94 if err != nil {
95 return fmt.Errorf("init redis client: %v", err)
96 }
97 - r.rdb = rdb
97 + c.rdb = rdb
98
99 - charts, err := r.initCharts()
99 + charts, err := c.initCharts()
100 if err != nil {
101 return fmt.Errorf("init charts: %v", err)
102 }
103 - r.charts = charts
103 + c.charts = charts
104
105 return nil
106 }
107
108 -func (r *Redis) Check() error {
109 - mx, err := r.collect()
108 +func (c *Collector) Check() error {
109 + mx, err := c.collect()
110 if err != nil {
111 return err
112 }
@@ -116,14 +116,14 @@ func (r *Redis) Check() error {
116 return nil
117 }
118
119 -func (r *Redis) Charts() *module.Charts {
120 - return r.charts
119 +func (c *Collector) Charts() *module.Charts {
120 + return c.charts
121 }
122
123 -func (r *Redis) Collect() map[string]int64 {
124 - ms, err := r.collect()
123 +func (c *Collector) Collect() map[string]int64 {
124 + ms, err := c.collect()
125 if err != nil {
126 - r.Error(err)
126 + c.Error(err)
127 }
128
129 if len(ms) == 0 {
@@ -132,13 +132,13 @@ func (r *Redis) Collect() map[string]int64 {
132 return ms
133 }
134
135 -func (r *Redis) Cleanup() {
136 - if r.rdb == nil {
135 +func (c *Collector) Cleanup() {
136 + if c.rdb == nil {
137 return
138 }
139 - err := r.rdb.Close()
139 + err := c.rdb.Close()
140 if err != nil {
141 - r.Warningf("cleanup: error on closing redis client [%s]: %v", r.Address, err)
141 + c.Warningf("cleanup: error on closing redis client [%s]: %v", c.Address, err)
142 }
143 - r.rdb = nil
143 + c.rdb = nil
144 }
src/go/plugin/go.d/collector/redis/collector_test.go renamed
+51 -51
@@ -36,11 +36,11 @@ func Test_testDataIsValid(t *testing.T) {
36 }
37 }
38
39 -func TestRedis_ConfigurationSerialize(t *testing.T) {
40 - module.TestConfigurationSerialize(t, &Redis{}, dataConfigJSON, dataConfigYAML)
39 +func TestCollector_ConfigurationSerialize(t *testing.T) {
40 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
41 }
42
43 -func TestRedis_Init(t *testing.T) {
43 +func TestCollector_Init(t *testing.T) {
44 tests := map[string]struct {
45 config Config
46 wantFail bool
@@ -67,21 +67,21 @@ func TestRedis_Init(t *testing.T) {
67
68 for name, test := range tests {
69 t.Run(name, func(t *testing.T) {
70 - rdb := New()
71 - rdb.Config = test.config
70 + collr := New()
71 + collr.Config = test.config
72
73 if test.wantFail {
74 - assert.Error(t, rdb.Init())
74 + assert.Error(t, collr.Init())
75 } else {
76 - assert.NoError(t, rdb.Init())
76 + assert.NoError(t, collr.Init())
77 }
78 })
79 }
80 }
81
82 -func TestRedis_Check(t *testing.T) {
82 +func TestCollector_Check(t *testing.T) {
83 tests := map[string]struct {
84 - prepare func(t *testing.T) *Redis
84 + prepare func(t *testing.T) *Collector
85 wantFail bool
86 }{
87 "success on valid response v6.0.9": {
@@ -99,40 +99,40 @@ func TestRedis_Check(t *testing.T) {
99
100 for name, test := range tests {
101 t.Run(name, func(t *testing.T) {
102 - rdb := test.prepare(t)
102 + collr := test.prepare(t)
103
104 if test.wantFail {
105 - assert.Error(t, rdb.Check())
105 + assert.Error(t, collr.Check())
106 } else {
107 - assert.NoError(t, rdb.Check())
107 + assert.NoError(t, collr.Check())
108 }
109 })
110 }
111 }
112
113 -func TestRedis_Charts(t *testing.T) {
114 - rdb := New()
115 - require.NoError(t, rdb.Init())
113 +func TestCollector_Charts(t *testing.T) {
114 + collr := New()
115 + require.NoError(t, collr.Init())
116
117 - assert.NotNil(t, rdb.Charts())
117 + assert.NotNil(t, collr.Charts())
118 }
119
120 -func TestRedis_Cleanup(t *testing.T) {
121 - rdb := New()
122 - assert.NotPanics(t, rdb.Cleanup)
120 +func TestCollector_Cleanup(t *testing.T) {
121 + collr := New()
122 + assert.NotPanics(t, collr.Cleanup)
123
124 - require.NoError(t, rdb.Init())
124 + require.NoError(t, collr.Init())
125 m := &mockRedisClient{}
126 - rdb.rdb = m
126 + collr.rdb = m
127
128 - rdb.Cleanup()
128 + collr.Cleanup()
129
130 assert.True(t, m.calledClose)
131 }
132
133 -func TestRedis_Collect(t *testing.T) {
133 +func TestCollector_Collect(t *testing.T) {
134 tests := map[string]struct {
135 - prepare func(t *testing.T) *Redis
135 + prepare func(t *testing.T) *Collector
136 wantCollected map[string]int64
137 }{
138 "success on valid response v6.0.9": {
@@ -242,7 +242,7 @@ func TestRedis_Collect(t *testing.T) {
242 "rdb_last_bgsave_status": 0,
243 "rdb_last_bgsave_time_sec": 0,
244 "rdb_last_cow_size": 290816,
245 - "rdb_last_save_time": 56978305,
245 + "rdb_last_save_time": 125697993,
246 "redis_git_dirty": 0,
247 "redis_git_sha1": 0,
248 "rejected_connections": 0,
@@ -296,69 +296,69 @@ func TestRedis_Collect(t *testing.T) {
296
297 for name, test := range tests {
298 t.Run(name, func(t *testing.T) {
299 - rdb := test.prepare(t)
299 + collr := test.prepare(t)
300
301 - mx := rdb.Collect()
301 + mx := collr.Collect()
302
303 copyTimeRelatedMetrics(mx, test.wantCollected)
304
305 assert.Equal(t, test.wantCollected, mx)
306 if len(test.wantCollected) > 0 {
307 - module.TestMetricsHasAllChartsDims(t, rdb.Charts(), mx)
308 - ensureCollectedCommandsAddedToCharts(t, rdb)
309 - ensureCollectedDbsAddedToCharts(t, rdb)
307 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
308 + ensureCollectedCommandsAddedToCharts(t, collr)
309 + ensureCollectedDbsAddedToCharts(t, collr)
310 }
311 })
312 }
313 }
314
315 -func prepareRedisV609(t *testing.T) *Redis {
316 - rdb := New()
317 - require.NoError(t, rdb.Init())
318 - rdb.rdb = &mockRedisClient{
315 +func prepareRedisV609(t *testing.T) *Collector {
316 + collr := New()
317 + require.NoError(t, collr.Init())
318 + collr.rdb = &mockRedisClient{
319 result: dataVer609InfoAll,
320 }
321 - return rdb
321 + return collr
322 }
323
324 -func prepareRedisErrorOnInfo(t *testing.T) *Redis {
325 - rdb := New()
326 - require.NoError(t, rdb.Init())
327 - rdb.rdb = &mockRedisClient{
324 +func prepareRedisErrorOnInfo(t *testing.T) *Collector {
325 + collr := New()
326 + require.NoError(t, collr.Init())
327 + collr.rdb = &mockRedisClient{
328 errOnInfo: true,
329 }
330 - return rdb
330 + return collr
331 }
332
333 -func prepareRedisWithPikaMetrics(t *testing.T) *Redis {
334 - rdb := New()
335 - require.NoError(t, rdb.Init())
336 - rdb.rdb = &mockRedisClient{
333 +func prepareRedisWithPikaMetrics(t *testing.T) *Collector {
334 + collr := New()
335 + require.NoError(t, collr.Init())
336 + collr.rdb = &mockRedisClient{
337 result: dataPikaInfoAll,
338 }
339 - return rdb
339 + return collr
340 }
341 -func ensureCollectedCommandsAddedToCharts(t *testing.T, rdb *Redis) {
341 +func ensureCollectedCommandsAddedToCharts(t *testing.T, collr *Collector) {
342 for _, id := range []string{
343 chartCommandsCalls.ID,
344 chartCommandsUsec.ID,
345 chartCommandsUsecPerSec.ID,
346 } {
347 - chart := rdb.Charts().Get(id)
347 + chart := collr.Charts().Get(id)
348 require.NotNilf(t, chart, "'%s' chart is not in charts", id)
349 - assert.Lenf(t, chart.Dims, len(rdb.collectedCommands),
349 + assert.Lenf(t, chart.Dims, len(collr.collectedCommands),
350 "'%s' chart unexpected number of dimensions", id)
351 }
352 }
353
354 -func ensureCollectedDbsAddedToCharts(t *testing.T, rdb *Redis) {
354 +func ensureCollectedDbsAddedToCharts(t *testing.T, collr *Collector) {
355 for _, id := range []string{
356 chartKeys.ID,
357 chartExpiresKeys.ID,
358 } {
359 - chart := rdb.Charts().Get(id)
359 + chart := collr.Charts().Get(id)
360 require.NotNilf(t, chart, "'%s' chart is not in charts", id)
361 - assert.Lenf(t, chart.Dims, len(rdb.collectedDbs),
361 + assert.Lenf(t, chart.Dims, len(collr.collectedDbs),
362 "'%s' chart unexpected number of dimensions", id)
363 }
364 }
src/go/plugin/go.d/collector/redis/init.go
+13 -13
@@ -11,20 +11,20 @@ import (
11 "github.com/redis/go-redis/v9"
12 )
13
14 -func (r *Redis) validateConfig() error {
15 - if r.Address == "" {
14 +func (c *Collector) validateConfig() error {
15 + if c.Address == "" {
16 return errors.New("'address' not set")
17 }
18 return nil
19 }
20
21 -func (r *Redis) initRedisClient() (*redis.Client, error) {
22 - opts, err := redis.ParseURL(r.Address)
21 +func (c *Collector) initRedisClient() (*redis.Client, error) {
22 + opts, err := redis.ParseURL(c.Address)
23 if err != nil {
24 return nil, err
25 }
26
27 - tlsConfig, err := tlscfg.NewTLSConfig(r.TLSConfig)
27 + tlsConfig, err := tlscfg.NewTLSConfig(c.TLSConfig)
28 if err != nil {
29 return nil, err
30 }
@@ -33,22 +33,22 @@ func (r *Redis) initRedisClient() (*redis.Client, error) {
33 tlsConfig.ServerName = opts.TLSConfig.ServerName
34 }
35
36 - if opts.Username == "" && r.Username != "" {
37 - opts.Username = r.Username
36 + if opts.Username == "" && c.Username != "" {
37 + opts.Username = c.Username
38 }
39 - if opts.Password == "" && r.Password != "" {
40 - opts.Password = r.Password
39 + if opts.Password == "" && c.Password != "" {
40 + opts.Password = c.Password
41 }
42
43 opts.PoolSize = 1
44 opts.TLSConfig = tlsConfig
45 - opts.DialTimeout = r.Timeout.Duration()
46 - opts.ReadTimeout = r.Timeout.Duration()
47 - opts.WriteTimeout = r.Timeout.Duration()
45 + opts.DialTimeout = c.Timeout.Duration()
46 + opts.ReadTimeout = c.Timeout.Duration()
47 + opts.WriteTimeout = c.Timeout.Duration()
48
49 return redis.NewClient(opts), nil
50 }
51
52 -func (r *Redis) initCharts() (*module.Charts, error) {
52 +func (c *Collector) initCharts() (*module.Charts, error) {
53 return redisCharts.Copy(), nil
54 }
src/go/plugin/go.d/collector/rethinkdb/charts.go
+5 -5
@@ -159,7 +159,7 @@ var (
159 }
160 )
161
162 -func (r *Rethinkdb) addServerCharts(srvUUID, srvName string) {
162 +func (c *Collector) addServerCharts(srvUUID, srvName string) {
163 charts := serverChartsTmpl.Copy()
164
165 for _, chart := range *charts {
@@ -173,14 +173,14 @@ func (r *Rethinkdb) addServerCharts(srvUUID, srvName string) {
173 }
174 }
175
176 - if err := r.Charts().Add(*charts...); err != nil {
177 - r.Warningf("failed to add chart for '%s' server: %v", srvName, err)
176 + if err := c.Charts().Add(*charts...); err != nil {
177 + c.Warningf("failed to add chart for '%s' server: %v", srvName, err)
178 }
179 }
180
181 -func (r *Rethinkdb) removeServerCharts(srvUUID string) {
181 +func (c *Collector) removeServerCharts(srvUUID string) {
182 px := fmt.Sprintf("server_%s_", srvUUID)
183 - for _, chart := range *r.Charts() {
183 + for _, chart := range *c.Charts() {
184 if strings.HasPrefix(chart.ID, px) {
185 chart.MarkRemove()
186 chart.MarkNotCreated()
src/go/plugin/go.d/collector/rethinkdb/collect.go
+13 -13
@@ -27,26 +27,26 @@ type (
27 }
28 )
29
30 -func (r *Rethinkdb) collect() (map[string]int64, error) {
31 - if r.rdb == nil {
32 - conn, err := r.newConn(r.Config)
30 +func (c *Collector) collect() (map[string]int64, error) {
31 + if c.rdb == nil {
32 + conn, err := c.newConn(c.Config)
33 if err != nil {
34 return nil, err
35 }
36 - r.rdb = conn
36 + c.rdb = conn
37 }
38
39 mx := make(map[string]int64)
40
41 - if err := r.collectStats(mx); err != nil {
41 + if err := c.collectStats(mx); err != nil {
42 return nil, err
43 }
44
45 return mx, nil
46 }
47
48 -func (r *Rethinkdb) collectStats(mx map[string]int64) error {
49 - resp, err := r.rdb.stats()
48 +func (c *Collector) collectStats(mx map[string]int64) error {
49 + resp, err := c.rdb.stats()
50 if err != nil {
51 return err
52 }
@@ -89,9 +89,9 @@ func (r *Rethinkdb) collectStats(mx map[string]int64) error {
89
90 seen[srvUUID] = true
91
92 - if !r.seenServers[srvUUID] {
93 - r.seenServers[srvUUID] = true
94 - r.addServerCharts(srvUUID, srv.Server)
92 + if !c.seenServers[srvUUID] {
93 + c.seenServers[srvUUID] = true
94 + c.addServerCharts(srvUUID, srv.Server)
95 }
96
97 px := fmt.Sprintf("server_%s_", srv.ID[1]) // uuid
@@ -112,10 +112,10 @@ func (r *Rethinkdb) collectStats(mx map[string]int64) error {
112 }
113 }
114
115 - for k := range r.seenServers {
115 + for k := range c.seenServers {
116 if !seen[k] {
117 - delete(r.seenServers, k)
118 - r.removeServerCharts(k)
117 + delete(c.seenServers, k)
118 + c.removeServerCharts(k)
119 }
120 }
121
src/go/plugin/go.d/collector/rethinkdb/collector.go renamed
+26 -28
@@ -22,8 +22,8 @@ func init() {
22 })
23 }
24
25 -func New() *Rethinkdb {
26 - return &Rethinkdb{
25 +func New() *Collector {
26 + return &Collector{
27 Config: Config{
28 Address: "127.0.0.1:28015",
29 Timeout: confopt.Duration(time.Second * 1),
@@ -43,33 +43,31 @@ type Config struct {
43 Password string `yaml:"password,omitempty" json:"password"`
44 }
45
46 -type (
47 - Rethinkdb struct {
48 - module.Base
49 - Config `yaml:",inline" json:""`
46 +type Collector struct {
47 + module.Base
48 + Config `yaml:",inline" json:""`
49
51 - charts *module.Charts
50 + charts *module.Charts
51
53 - newConn func(cfg Config) (rdbConn, error)
54 - rdb rdbConn
52 + newConn func(cfg Config) (rdbConn, error)
53 + rdb rdbConn
54
56 - seenServers map[string]bool
57 - }
58 -)
55 + seenServers map[string]bool
56 +}
57
60 -func (r *Rethinkdb) Configuration() any {
61 - return r.Config
58 +func (c *Collector) Configuration() any {
59 + return c.Config
60 }
61
64 -func (r *Rethinkdb) Init() error {
65 - if r.Address == "" {
62 +func (c *Collector) Init() error {
63 + if c.Address == "" {
64 return errors.New("config: address is not set")
65 }
66 return nil
67 }
68
71 -func (r *Rethinkdb) Check() error {
72 - mx, err := r.collect()
69 +func (c *Collector) Check() error {
70 + mx, err := c.collect()
71 if err != nil {
72 return err
73 }
@@ -79,14 +77,14 @@ func (r *Rethinkdb) Check() error {
77 return nil
78 }
79
82 -func (r *Rethinkdb) Charts() *module.Charts {
83 - return r.charts
80 +func (c *Collector) Charts() *module.Charts {
81 + return c.charts
82 }
83
86 -func (r *Rethinkdb) Collect() map[string]int64 {
87 - ms, err := r.collect()
84 +func (c *Collector) Collect() map[string]int64 {
85 + ms, err := c.collect()
86 if err != nil {
89 - r.Error(err)
87 + c.Error(err)
88 }
89
90 if len(ms) == 0 {
@@ -95,11 +93,11 @@ func (r *Rethinkdb) Collect() map[string]int64 {
93 return ms
94 }
95
98 -func (r *Rethinkdb) Cleanup() {
99 - if r.rdb != nil {
100 - if err := r.rdb.close(); err != nil {
101 - r.Warningf("cleanup: error on closing client [%s]: %v", r.Address, err)
96 +func (c *Collector) Cleanup() {
97 + if c.rdb != nil {
98 + if err := c.rdb.close(); err != nil {
99 + c.Warningf("cleanup: error on closing client [%s]: %v", c.Address, err)
100 }
103 - r.rdb = nil
101 + c.rdb = nil
102 }
103 }
src/go/plugin/go.d/collector/rethinkdb/collector_test.go renamed
+50 -50
@@ -34,11 +34,11 @@ func Test_testDataIsValid(t *testing.T) {
34 }
35 }
36
37 -func TestRethinkdb_ConfigurationSerialize(t *testing.T) {
38 - module.TestConfigurationSerialize(t, &Rethinkdb{}, dataConfigJSON, dataConfigYAML)
37 +func TestCollector_ConfigurationSerialize(t *testing.T) {
38 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
39 }
40
41 -func TestRethinkdb_Init(t *testing.T) {
41 +func TestCollector_Init(t *testing.T) {
42 tests := map[string]struct {
43 config Config
44 wantFail bool
@@ -59,61 +59,61 @@ func TestRethinkdb_Init(t *testing.T) {
59
60 for name, test := range tests {
61 t.Run(name, func(t *testing.T) {
62 - rdb := New()
63 - rdb.Config = test.config
62 + collr := New()
63 + collr.Config = test.config
64
65 if test.wantFail {
66 - assert.Error(t, rdb.Init())
66 + assert.Error(t, collr.Init())
67 } else {
68 - assert.NoError(t, rdb.Init())
68 + assert.NoError(t, collr.Init())
69 }
70 })
71 }
72 }
73
74 -func TestRethinkdb_Cleanup(t *testing.T) {
74 +func TestCollector_Cleanup(t *testing.T) {
75 tests := map[string]struct {
76 - prepare func() *Rethinkdb
76 + prepare func() *Collector
77 }{
78 "not initialized": {
79 - prepare: func() *Rethinkdb {
79 + prepare: func() *Collector {
80 return New()
81 },
82 },
83 "after check": {
84 - prepare: func() *Rethinkdb {
85 - rdb := New()
86 - rdb.newConn = func(config Config) (rdbConn, error) {
84 + prepare: func() *Collector {
85 + collr := New()
86 + collr.newConn = func(config Config) (rdbConn, error) {
87 return &mockRethinkdbConn{dataStats: dataStats}, nil
88 }
89 - _ = rdb.Check()
90 - return rdb
89 + _ = collr.Check()
90 + return collr
91 },
92 },
93 "after collect": {
94 - prepare: func() *Rethinkdb {
95 - rdb := New()
96 - rdb.newConn = func(config Config) (rdbConn, error) {
94 + prepare: func() *Collector {
95 + collr := New()
96 + collr.newConn = func(config Config) (rdbConn, error) {
97 return &mockRethinkdbConn{dataStats: dataStats}, nil
98 }
99 - _ = rdb.Check()
100 - return rdb
99 + _ = collr.Check()
100 + return collr
101 },
102 },
103 }
104
105 for name, test := range tests {
106 t.Run(name, func(t *testing.T) {
107 - rdb := test.prepare()
107 + collr := test.prepare()
108
109 - assert.NotPanics(t, rdb.Cleanup)
109 + assert.NotPanics(t, collr.Cleanup)
110 })
111 }
112 }
113
114 -func TestRethinkdb_Check(t *testing.T) {
114 +func TestCollector_Check(t *testing.T) {
115 tests := map[string]struct {
116 - prepare func() *Rethinkdb
116 + prepare func() *Collector
117 wantFail bool
118 }{
119 "success on valid response": {
@@ -132,26 +132,26 @@ func TestRethinkdb_Check(t *testing.T) {
132
133 for name, test := range tests {
134 t.Run(name, func(t *testing.T) {
135 - rdb := test.prepare()
135 + collr := test.prepare()
136
137 if test.wantFail {
138 - assert.Error(t, rdb.Check())
138 + assert.Error(t, collr.Check())
139 } else {
140 - assert.NoError(t, rdb.Check())
140 + assert.NoError(t, collr.Check())
141 }
142
143 - if m, ok := rdb.rdb.(*mockRethinkdbConn); ok {
143 + if m, ok := collr.rdb.(*mockRethinkdbConn); ok {
144 assert.False(t, m.disconnectCalled, "rdb close before cleanup")
145 - rdb.Cleanup()
145 + collr.Cleanup()
146 assert.True(t, m.disconnectCalled, "rdb close after cleanup")
147 }
148 })
149 }
150 }
151
152 -func TestRethinkdb_Collect(t *testing.T) {
152 +func TestCollector_Collect(t *testing.T) {
153 tests := map[string]struct {
154 - prepare func() *Rethinkdb
154 + prepare func() *Collector
155 wantMetrics map[string]int64
156 wantCharts int
157 skipChart func(chart *module.Chart, dim *module.Dim) bool
@@ -201,51 +201,51 @@ func TestRethinkdb_Collect(t *testing.T) {
201
202 for name, test := range tests {
203 t.Run(name, func(t *testing.T) {
204 - rdb := test.prepare()
204 + collr := test.prepare()
205
206 - require.NoError(t, rdb.Init())
206 + require.NoError(t, collr.Init())
207
208 - mx := rdb.Collect()
208 + mx := collr.Collect()
209
210 require.Equal(t, test.wantMetrics, mx)
211
212 - assert.Equal(t, test.wantCharts, len(*rdb.Charts()))
212 + assert.Equal(t, test.wantCharts, len(*collr.Charts()))
213
214 if len(test.wantMetrics) > 0 {
215 - module.TestMetricsHasAllChartsDimsSkip(t, rdb.Charts(), mx, test.skipChart)
215 + module.TestMetricsHasAllChartsDimsSkip(t, collr.Charts(), mx, test.skipChart)
216 }
217
218 - if m, ok := rdb.rdb.(*mockRethinkdbConn); ok {
218 + if m, ok := collr.rdb.(*mockRethinkdbConn); ok {
219 assert.False(t, m.disconnectCalled, "rdb close before cleanup")
220 - rdb.Cleanup()
220 + collr.Cleanup()
221 assert.True(t, m.disconnectCalled, "rdb close after cleanup")
222 }
223 })
224 }
225 }
226
227 -func prepareCaseOk() *Rethinkdb {
228 - rdb := New()
229 - rdb.newConn = func(cfg Config) (rdbConn, error) {
227 +func prepareCaseOk() *Collector {
228 + collr := New()
229 + collr.newConn = func(cfg Config) (rdbConn, error) {
230 return &mockRethinkdbConn{dataStats: dataStats}, nil
231 }
232 - return rdb
232 + return collr
233 }
234
235 -func prepareCaseErrOnStats() *Rethinkdb {
236 - rdb := New()
237 - rdb.newConn = func(cfg Config) (rdbConn, error) {
235 +func prepareCaseErrOnStats() *Collector {
236 + collr := New()
237 + collr.newConn = func(cfg Config) (rdbConn, error) {
238 return &mockRethinkdbConn{errOnStats: true}, nil
239 }
240 - return rdb
240 + return collr
241 }
242
243 -func prepareCaseErrOnConnect() *Rethinkdb {
244 - rdb := New()
245 - rdb.newConn = func(cfg Config) (rdbConn, error) {
243 +func prepareCaseErrOnConnect() *Collector {
244 + collr := New()
245 + collr.newConn = func(cfg Config) (rdbConn, error) {
246 return nil, errors.New("mock failed to connect")
247 }
248 - return rdb
248 + return collr
249 }
250
251 type mockRethinkdbConn struct {
src/go/plugin/go.d/collector/riakkv/charts.go
+5 -5
@@ -439,23 +439,23 @@ var (
439 }
440 )
441
442 -func (r *RiakKv) adjustCharts(mx map[string]int64) {
442 +func (c *Collector) adjustCharts(mx map[string]int64) {
443 var i int
444 - for _, chart := range *r.Charts() {
444 + for _, chart := range *c.Charts() {
445 chart.Dims = slices.DeleteFunc(chart.Dims, func(dim *module.Dim) bool {
446 _, ok := mx[dim.ID]
447 if !ok {
448 - r.Debugf("removing dimension '%s' from chart '%s': metric not found", dim.ID, chart.ID)
448 + c.Debugf("removing dimension '%s' from chart '%s': metric not found", dim.ID, chart.ID)
449 }
450 return !ok
451 })
452
453 if len(chart.Dims) == 0 {
454 - r.Debugf("removing chart '%s': no metrics found", chart.ID)
454 + c.Debugf("removing chart '%s': no metrics found", chart.ID)
455 continue
456 }
457
458 - (*r.Charts())[i] = chart
458 + (*c.Charts())[i] = chart
459 i++
460 }
461 }
src/go/plugin/go.d/collector/riakkv/collect.go
+8 -8
@@ -10,8 +10,8 @@ import (
10 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/web"
11 )
12
13 -func (r *RiakKv) collect() (map[string]int64, error) {
14 - stats, err := r.getStats()
13 +func (c *Collector) collect() (map[string]int64, error) {
14 + stats, err := c.getStats()
15 if err != nil {
16 return nil, err
17 }
@@ -22,27 +22,27 @@ func (r *RiakKv) collect() (map[string]int64, error) {
22 return nil, errors.New("no stats")
23 }
24
25 - r.once.Do(func() { r.adjustCharts(mx) })
25 + c.once.Do(func() { c.adjustCharts(mx) })
26
27 return mx, nil
28 }
29
30 -func (r *RiakKv) getStats() (*riakStats, error) {
31 - req, err := web.NewHTTPRequest(r.RequestConfig)
30 +func (c *Collector) getStats() (*riakStats, error) {
31 + req, err := web.NewHTTPRequest(c.RequestConfig)
32 if err != nil {
33 return nil, err
34 }
35
36 var stats riakStats
37 - if err := r.client().RequestJSON(req, &stats); err != nil {
37 + if err := c.client().RequestJSON(req, &stats); err != nil {
38 return nil, err
39 }
40
41 return &stats, nil
42 }
43
44 -func (r *RiakKv) client() *web.Client {
45 - return web.DoHTTP(r.httpClient).OnNokCode(func(resp *http.Response) (bool, error) {
44 +func (c *Collector) client() *web.Client {
45 + return web.DoHTTP(c.httpClient).OnNokCode(func(resp *http.Response) (bool, error) {
46 if resp.StatusCode == http.StatusNotFound {
47 return false, errors.New("riak_kv_stat is not enabled)")
48 }
src/go/plugin/go.d/collector/riakkv/collector.go renamed
+21 -21
@@ -32,8 +32,8 @@ func init() {
32 })
33 }
34
35 -func New() *RiakKv {
36 - return &RiakKv{
35 +func New() *Collector {
36 + return &Collector{
37 Config: Config{
38 HTTPConfig: web.HTTPConfig{
39 RequestConfig: web.RequestConfig{
@@ -55,7 +55,7 @@ type Config struct {
55 web.HTTPConfig `yaml:",inline" json:""`
56 }
57
58 -type RiakKv struct {
58 +type Collector struct {
59 module.Base
60 Config `yaml:",inline" json:""`
61
@@ -65,29 +65,29 @@ type RiakKv struct {
65 httpClient *http.Client
66 }
67
68 -func (r *RiakKv) Configuration() any {
69 - return r.Config
68 +func (c *Collector) Configuration() any {
69 + return c.Config
70 }
71
72 -func (r *RiakKv) Init() error {
73 - if r.URL == "" {
72 +func (c *Collector) Init() error {
73 + if c.URL == "" {
74 return errors.New("config: url not set")
75 }
76
77 - httpClient, err := web.NewHTTPClient(r.ClientConfig)
77 + httpClient, err := web.NewHTTPClient(c.ClientConfig)
78 if err != nil {
79 return fmt.Errorf("init HTTP client: %v", err)
80 }
81 - r.httpClient = httpClient
81 + c.httpClient = httpClient
82
83 - r.Debugf("using URL %s", r.URL)
84 - r.Debugf("using timeout: %s", r.Timeout)
83 + c.Debugf("using URL %s", c.URL)
84 + c.Debugf("using timeout: %s", c.Timeout)
85
86 return nil
87 }
88
89 -func (r *RiakKv) Check() error {
90 - mx, err := r.collect()
89 +func (c *Collector) Check() error {
90 + mx, err := c.collect()
91 if err != nil {
92 return err
93 }
@@ -98,14 +98,14 @@ func (r *RiakKv) Check() error {
98 return nil
99 }
100
101 -func (r *RiakKv) Charts() *module.Charts {
102 - return r.charts
101 +func (c *Collector) Charts() *module.Charts {
102 + return c.charts
103 }
104
105 -func (r *RiakKv) Collect() map[string]int64 {
106 - mx, err := r.collect()
105 +func (c *Collector) Collect() map[string]int64 {
106 + mx, err := c.collect()
107 if err != nil {
108 - r.Error(err)
108 + c.Error(err)
109 }
110
111 if len(mx) == 0 {
@@ -114,8 +114,8 @@ func (r *RiakKv) Collect() map[string]int64 {
114 return mx
115 }
116
117 -func (r *RiakKv) Cleanup() {
118 - if r.httpClient != nil {
119 - r.httpClient.CloseIdleConnections()
117 +func (c *Collector) Cleanup() {
118 + if c.httpClient != nil {
119 + c.httpClient.CloseIdleConnections()
120 }
121 }
src/go/plugin/go.d/collector/riakkv/collector_test.go renamed
+40 -40
@@ -33,11 +33,11 @@ func Test_testDataIsValid(t *testing.T) {
33 }
34 }
35
36 -func TestRiakKv_ConfigurationSerialize(t *testing.T) {
37 - module.TestConfigurationSerialize(t, &RiakKv{}, dataConfigJSON, dataConfigYAML)
36 +func TestCollector_ConfigurationSerialize(t *testing.T) {
37 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
38 }
39
40 -func TestRiakKv_Init(t *testing.T) {
40 +func TestCollector_Init(t *testing.T) {
41 tests := map[string]struct {
42 wantFail bool
43 config Config
@@ -58,22 +58,22 @@ func TestRiakKv_Init(t *testing.T) {
58
59 for name, test := range tests {
60 t.Run(name, func(t *testing.T) {
61 - riak := New()
62 - riak.Config = test.config
61 + collr := New()
62 + collr.Config = test.config
63
64 if test.wantFail {
65 - assert.Error(t, riak.Init())
65 + assert.Error(t, collr.Init())
66 } else {
67 - assert.NoError(t, riak.Init())
67 + assert.NoError(t, collr.Init())
68 }
69 })
70 }
71 }
72
73 -func TestRiakKv_Check(t *testing.T) {
73 +func TestCollector_Check(t *testing.T) {
74 tests := map[string]struct {
75 wantFail bool
76 - prepare func(t *testing.T) (riak *RiakKv, cleanup func())
76 + prepare func(t *testing.T) (collr *Collector, cleanup func())
77 }{
78 "success on valid response": {
79 wantFail: false,
@@ -95,25 +95,25 @@ func TestRiakKv_Check(t *testing.T) {
95
96 for name, test := range tests {
97 t.Run(name, func(t *testing.T) {
98 - riak, cleanup := test.prepare(t)
98 + collr, cleanup := test.prepare(t)
99 defer cleanup()
100
101 if test.wantFail {
102 - assert.Error(t, riak.Check())
102 + assert.Error(t, collr.Check())
103 } else {
104 - assert.NoError(t, riak.Check())
104 + assert.NoError(t, collr.Check())
105 }
106 })
107 }
108 }
109
110 -func TestRiakKv_Charts(t *testing.T) {
110 +func TestCollector_Charts(t *testing.T) {
111 assert.NotNil(t, New().Charts())
112 }
113
114 -func TestRiakKv_Collect(t *testing.T) {
114 +func TestCollector_Collect(t *testing.T) {
115 tests := map[string]struct {
116 - prepare func(t *testing.T) (riak *RiakKv, cleanup func())
116 + prepare func(t *testing.T) (collr *Collector, cleanup func())
117 wantMetrics map[string]int64
118 }{
119 "success on valid response": {
@@ -199,67 +199,67 @@ func TestRiakKv_Collect(t *testing.T) {
199
200 for name, test := range tests {
201 t.Run(name, func(t *testing.T) {
202 - riak, cleanup := test.prepare(t)
202 + collr, cleanup := test.prepare(t)
203 defer cleanup()
204
205 - _ = riak.Check()
205 + _ = collr.Check()
206
207 - mx := riak.Collect()
207 + mx := collr.Collect()
208
209 require.Equal(t, test.wantMetrics, mx)
210
211 if len(test.wantMetrics) > 0 {
212 - require.True(t, len(*riak.Charts()) > 0, "charts > 0")
213 - module.TestMetricsHasAllChartsDims(t, riak.Charts(), mx)
212 + require.True(t, len(*collr.Charts()) > 0, "charts > 0")
213 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
214 }
215 })
216 }
217 }
218
219 -func caseOkResponse(t *testing.T) (*RiakKv, func()) {
219 +func caseOkResponse(t *testing.T) (*Collector, func()) {
220 t.Helper()
221 srv := httptest.NewServer(http.HandlerFunc(
222 func(w http.ResponseWriter, r *http.Request) {
223 _, _ = w.Write(dataStats)
224 }))
225 - riak := New()
226 - riak.URL = srv.URL
227 - require.NoError(t, riak.Init())
225 + collr := New()
226 + collr.URL = srv.URL
227 + require.NoError(t, collr.Init())
228
229 - return riak, srv.Close
229 + return collr, srv.Close
230 }
231
232 -func caseInvalidDataResponse(t *testing.T) (*RiakKv, func()) {
232 +func caseInvalidDataResponse(t *testing.T) (*Collector, func()) {
233 t.Helper()
234 srv := httptest.NewServer(http.HandlerFunc(
235 func(w http.ResponseWriter, r *http.Request) {
236 _, _ = w.Write([]byte("hello and\n goodbye"))
237 }))
238 - riak := New()
239 - riak.URL = srv.URL
240 - require.NoError(t, riak.Init())
238 + collr := New()
239 + collr.URL = srv.URL
240 + require.NoError(t, collr.Init())
241
242 - return riak, srv.Close
242 + return collr, srv.Close
243 }
244
245 -func caseConnectionRefused(t *testing.T) (*RiakKv, func()) {
245 +func caseConnectionRefused(t *testing.T) (*Collector, func()) {
246 t.Helper()
247 - rk := New()
248 - rk.URL = "http://127.0.0.1:65001"
249 - require.NoError(t, rk.Init())
247 + collr := New()
248 + collr.URL = "http://127.0.0.1:65001"
249 + require.NoError(t, collr.Init())
250
251 - return rk, func() {}
251 + return collr, func() {}
252 }
253
254 -func case404(t *testing.T) (*RiakKv, func()) {
254 +func case404(t *testing.T) (*Collector, func()) {
255 t.Helper()
256 srv := httptest.NewServer(http.HandlerFunc(
257 func(w http.ResponseWriter, r *http.Request) {
258 w.WriteHeader(http.StatusNotFound)
259 }))
260 - riak := New()
261 - riak.URL = srv.URL
262 - require.NoError(t, riak.Init())
260 + collr := New()
261 + collr.URL = srv.URL
262 + require.NoError(t, collr.Init())
263
264 - return riak, srv.Close
264 + return collr, srv.Close
265 }
src/go/plugin/go.d/collector/rspamd/collect.go
+5 -5
@@ -35,8 +35,8 @@ type rspamdStats struct {
35 FuzzyHashes map[string]int64 `json:"fuzzy_hashes"`
36 }
37
38 -func (r *Rspamd) collect() (map[string]int64, error) {
39 - stats, err := r.queryRspamdStats()
38 +func (c *Collector) collect() (map[string]int64, error) {
39 + stats, err := c.queryRspamdStats()
40 if err != nil {
41 return nil, err
42 }
@@ -46,14 +46,14 @@ func (r *Rspamd) collect() (map[string]int64, error) {
46 return mx, nil
47 }
48
49 -func (r *Rspamd) queryRspamdStats() (*rspamdStats, error) {
50 - req, err := web.NewHTTPRequestWithPath(r.RequestConfig, "/stat")
49 +func (c *Collector) queryRspamdStats() (*rspamdStats, error) {
50 + req, err := web.NewHTTPRequestWithPath(c.RequestConfig, "/stat")
51 if err != nil {
52 return nil, err
53 }
54
55 var stats rspamdStats
56 - if err := web.DoHTTP(r.httpClient).RequestJSON(req, &stats); err != nil {
56 + if err := web.DoHTTP(c.httpClient).RequestJSON(req, &stats); err != nil {
57 return nil, err
58 }
59
src/go/plugin/go.d/collector/rspamd/collector.go renamed
+21 -21
@@ -25,8 +25,8 @@ func init() {
25 })
26 }
27
28 -func New() *Rspamd {
29 - return &Rspamd{
28 +func New() *Collector {
29 + return &Collector{
30 Config: Config{
31 HTTPConfig: web.HTTPConfig{
32 RequestConfig: web.RequestConfig{
@@ -46,7 +46,7 @@ type Config struct {
46 web.HTTPConfig `yaml:",inline" json:""`
47 }
48
49 -type Rspamd struct {
49 +type Collector struct {
50 module.Base
51 Config `yaml:",inline" json:""`
52
@@ -55,29 +55,29 @@ type Rspamd struct {
55 httpClient *http.Client
56 }
57
58 -func (r *Rspamd) Configuration() any {
59 - return r.Config
58 +func (c *Collector) Configuration() any {
59 + return c.Config
60 }
61
62 -func (r *Rspamd) Init() error {
63 - if r.URL == "" {
62 +func (c *Collector) Init() error {
63 + if c.URL == "" {
64 return errors.New("config: url not set")
65 }
66
67 - client, err := web.NewHTTPClient(r.ClientConfig)
67 + client, err := web.NewHTTPClient(c.ClientConfig)
68 if err != nil {
69 return fmt.Errorf("create http client: %v", err)
70 }
71 - r.httpClient = client
71 + c.httpClient = client
72
73 - r.Debugf("using URL %s", r.URL)
74 - r.Debugf("using timeout: %s", r.Timeout)
73 + c.Debugf("using URL %s", c.URL)
74 + c.Debugf("using timeout: %s", c.Timeout)
75
76 return nil
77 }
78
79 -func (r *Rspamd) Check() error {
80 - mx, err := r.collect()
79 +func (c *Collector) Check() error {
80 + mx, err := c.collect()
81 if err != nil {
82 return err
83 }
@@ -89,14 +89,14 @@ func (r *Rspamd) Check() error {
89 return nil
90 }
91
92 -func (r *Rspamd) Charts() *module.Charts {
93 - return r.charts
92 +func (c *Collector) Charts() *module.Charts {
93 + return c.charts
94 }
95
96 -func (r *Rspamd) Collect() map[string]int64 {
97 - mx, err := r.collect()
96 +func (c *Collector) Collect() map[string]int64 {
97 + mx, err := c.collect()
98 if err != nil {
99 - r.Error(err)
99 + c.Error(err)
100 }
101
102 if len(mx) == 0 {
@@ -106,8 +106,8 @@ func (r *Rspamd) Collect() map[string]int64 {
106 return mx
107 }
108
109 -func (r *Rspamd) Cleanup() {
110 - if r.httpClient != nil {
111 - r.httpClient.CloseIdleConnections()
109 +func (c *Collector) Cleanup() {
110 + if c.httpClient != nil {
111 + c.httpClient.CloseIdleConnections()
112 }
113 }
src/go/plugin/go.d/collector/rspamd/collector_test.go renamed
+38 -38
@@ -32,11 +32,11 @@ func Test_testDataIsValid(t *testing.T) {
32 }
33 }
34
35 -func TestRspamd_ConfigurationSerialize(t *testing.T) {
36 - module.TestConfigurationSerialize(t, &Rspamd{}, dataConfigJSON, dataConfigYAML)
35 +func TestCollector_ConfigurationSerialize(t *testing.T) {
36 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
37 }
38
39 -func TestRspamd_Init(t *testing.T) {
39 +func TestCollector_Init(t *testing.T) {
40 tests := map[string]struct {
41 wantFail bool
42 config Config
@@ -57,26 +57,26 @@ func TestRspamd_Init(t *testing.T) {
57
58 for name, test := range tests {
59 t.Run(name, func(t *testing.T) {
60 - rsp := New()
61 - rsp.Config = test.config
60 + collr := New()
61 + collr.Config = test.config
62
63 if test.wantFail {
64 - assert.Error(t, rsp.Init())
64 + assert.Error(t, collr.Init())
65 } else {
66 - assert.NoError(t, rsp.Init())
66 + assert.NoError(t, collr.Init())
67 }
68 })
69 }
70 }
71
72 -func TestRspamd_Charts(t *testing.T) {
72 +func TestCollector_Charts(t *testing.T) {
73 assert.NotNil(t, New().Charts())
74 }
75
76 -func TestRspamd_Check(t *testing.T) {
76 +func TestCollector_Check(t *testing.T) {
77 tests := map[string]struct {
78 wantFail bool
79 - prepare func(t *testing.T) (*Rspamd, func())
79 + prepare func(t *testing.T) (*Collector, func())
80 }{
81 "success on valid response": {
82 wantFail: false,
@@ -98,21 +98,21 @@ func TestRspamd_Check(t *testing.T) {
98
99 for name, test := range tests {
100 t.Run(name, func(t *testing.T) {
101 - rsp, cleanup := test.prepare(t)
101 + collr, cleanup := test.prepare(t)
102 defer cleanup()
103
104 if test.wantFail {
105 - assert.Error(t, rsp.Check())
105 + assert.Error(t, collr.Check())
106 } else {
107 - assert.NoError(t, rsp.Check())
107 + assert.NoError(t, collr.Check())
108 }
109 })
110 }
111 }
112
113 -func TestRspamd_Collect(t *testing.T) {
113 +func TestCollector_Collect(t *testing.T) {
114 tests := map[string]struct {
115 - prepare func(t *testing.T) (*Rspamd, func())
115 + prepare func(t *testing.T) (*Collector, func())
116 wantMetrics map[string]int64
117 }{
118 "success on valid response": {
@@ -150,21 +150,21 @@ func TestRspamd_Collect(t *testing.T) {
150
151 for name, test := range tests {
152 t.Run(name, func(t *testing.T) {
153 - rsp, cleanup := test.prepare(t)
153 + collr, cleanup := test.prepare(t)
154 defer cleanup()
155
156 - mx := rsp.Collect()
156 + mx := collr.Collect()
157
158 require.Equal(t, test.wantMetrics, mx)
159
160 if len(test.wantMetrics) > 0 {
161 - module.TestMetricsHasAllChartsDims(t, rsp.Charts(), mx)
161 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
162 }
163 })
164 }
165 }
166
167 -func prepareCaseOk(t *testing.T) (*Rspamd, func()) {
167 +func prepareCaseOk(t *testing.T) (*Collector, func()) {
168 t.Helper()
169 srv := httptest.NewServer(http.HandlerFunc(
170 func(w http.ResponseWriter, r *http.Request) {
@@ -176,14 +176,14 @@ func prepareCaseOk(t *testing.T) (*Rspamd, func()) {
176 }
177 }))
178
179 - rsp := New()
180 - rsp.URL = srv.URL
181 - require.NoError(t, rsp.Init())
179 + collr := New()
180 + collr.URL = srv.URL
181 + require.NoError(t, collr.Init())
182
183 - return rsp, srv.Close
183 + return collr, srv.Close
184 }
185
186 -func prepareCaseUnexpectedJsonResponse(t *testing.T) (*Rspamd, func()) {
186 +func prepareCaseUnexpectedJsonResponse(t *testing.T) (*Collector, func()) {
187 t.Helper()
188 resp := `
189 {
@@ -212,32 +212,32 @@ func prepareCaseUnexpectedJsonResponse(t *testing.T) (*Rspamd, func()) {
212 }
213 }))
214
215 - rsp := New()
216 - rsp.URL = srv.URL
217 - require.NoError(t, rsp.Init())
215 + collr := New()
216 + collr.URL = srv.URL
217 + require.NoError(t, collr.Init())
218
219 - return rsp, srv.Close
219 + return collr, srv.Close
220 }
221
222 -func prepareCaseInvalidFormatResponse(t *testing.T) (*Rspamd, func()) {
222 +func prepareCaseInvalidFormatResponse(t *testing.T) (*Collector, func()) {
223 t.Helper()
224 srv := httptest.NewServer(http.HandlerFunc(
225 func(w http.ResponseWriter, r *http.Request) {
226 _, _ = w.Write([]byte("hello and\n goodbye"))
227 }))
228
229 - rsp := New()
230 - rsp.URL = srv.URL
231 - require.NoError(t, rsp.Init())
229 + collr := New()
230 + collr.URL = srv.URL
231 + require.NoError(t, collr.Init())
232
233 - return rsp, srv.Close
233 + return collr, srv.Close
234 }
235
236 -func prepareCaseConnectionRefused(t *testing.T) (*Rspamd, func()) {
236 +func prepareCaseConnectionRefused(t *testing.T) (*Collector, func()) {
237 t.Helper()
238 - rsp := New()
239 - rsp.URL = "http://127.0.0.1:65001/stat"
240 - require.NoError(t, rsp.Init())
238 + collr := New()
239 + collr.URL = "http://127.0.0.1:65001/stat"
240 + require.NoError(t, collr.Init())
241
242 - return rsp, func() {}
242 + return collr, func() {}
243 }
src/go/plugin/go.d/collector/samba/charts.go
+11 -11
@@ -70,21 +70,21 @@ var (
70 }
71 )
72
73 -func (s *Samba) addCharts(mx map[string]int64) {
73 +func (c *Collector) addCharts(mx map[string]int64) {
74 for k := range mx {
75 if name, ok := extractCallName(k, "syscall_", "_count"); ok {
76 - s.addSysCallChart(name, syscallCallsChartTmpl.Copy())
76 + c.addSysCallChart(name, syscallCallsChartTmpl.Copy())
77 } else if name, ok := extractCallName(k, "syscall_", "_bytes"); ok {
78 - s.addSysCallChart(name, syscallTransferredDataChartTmpl.Copy())
78 + c.addSysCallChart(name, syscallTransferredDataChartTmpl.Copy())
79 } else if name, ok := extractCallName(k, "smb2_", "_count"); ok {
80 - s.addSmb2CallChart(name, smb2CallCallsChartTmpl.Copy())
80 + c.addSmb2CallChart(name, smb2CallCallsChartTmpl.Copy())
81 // all smb2* metrics have inbytes and outbytes
82 - s.addSmb2CallChart(name, smb2CallTransferredDataChartTmpl.Copy())
82 + c.addSmb2CallChart(name, smb2CallTransferredDataChartTmpl.Copy())
83 }
84 }
85 }
86
87 -func (s *Samba) addSysCallChart(syscall string, chart *module.Chart) {
87 +func (c *Collector) addSysCallChart(syscall string, chart *module.Chart) {
88 chart = chart.Copy()
89 chart.ID = fmt.Sprintf(chart.ID, syscall)
90 chart.Labels = []module.Label{
@@ -94,12 +94,12 @@ func (s *Samba) addSysCallChart(syscall string, chart *module.Chart) {
94 dim.ID = fmt.Sprintf(dim.ID, syscall)
95 }
96
97 - if err := s.Charts().Add(chart); err != nil {
98 - s.Warning(err)
97 + if err := c.Charts().Add(chart); err != nil {
98 + c.Warning(err)
99 }
100 }
101
102 -func (s *Samba) addSmb2CallChart(smb2Call string, chart *module.Chart) {
102 +func (c *Collector) addSmb2CallChart(smb2Call string, chart *module.Chart) {
103 chart = chart.Copy()
104 chart.ID = fmt.Sprintf(chart.ID, smb2Call)
105 chart.Labels = []module.Label{
@@ -109,8 +109,8 @@ func (s *Samba) addSmb2CallChart(smb2Call string, chart *module.Chart) {
109 dim.ID = fmt.Sprintf(dim.ID, smb2Call)
110 }
111
112 - if err := s.Charts().Add(chart); err != nil {
113 - s.Warning(err)
112 + if err := c.Charts().Add(chart); err != nil {
113 + c.Warning(err)
114 }
115 }
116
src/go/plugin/go.d/collector/samba/collect.go
+8 -8
@@ -10,26 +10,26 @@ import (
10 "strings"
11 )
12
13 -func (s *Samba) collect() (map[string]int64, error) {
14 - bs, err := s.exec.profile()
13 +func (c *Collector) collect() (map[string]int64, error) {
14 + bs, err := c.exec.profile()
15 if err != nil {
16 return nil, err
17 }
18
19 mx := make(map[string]int64)
20
21 - if err := s.collectSmbStatusProfile(mx, bs); err != nil {
21 + if err := c.collectSmbStatusProfile(mx, bs); err != nil {
22 return nil, err
23 }
24
25 - s.once.Do(func() {
26 - s.addCharts(mx)
25 + c.once.Do(func() {
26 + c.addCharts(mx)
27 })
28
29 return mx, nil
30 }
31
32 -func (s *Samba) collectSmbStatusProfile(mx map[string]int64, profileData []byte) error {
32 +func (c *Collector) collectSmbStatusProfile(mx map[string]int64, profileData []byte) error {
33 sc := bufio.NewScanner(bytes.NewReader(profileData))
34
35 for sc.Scan() {
@@ -44,7 +44,7 @@ func (s *Samba) collectSmbStatusProfile(mx map[string]int64, profileData []byte)
44
45 key, value, ok := strings.Cut(line, ":")
46 if !ok {
47 - s.Debugf("failed to parse line: '%s'", line)
47 + c.Debugf("failed to parse line: '%s'", line)
48 continue
49 }
50
@@ -56,7 +56,7 @@ func (s *Samba) collectSmbStatusProfile(mx map[string]int64, profileData []byte)
56
57 v, err := strconv.ParseInt(value, 10, 64)
58 if err != nil {
59 - s.Debugf("failed to parse value in '%s': %v", line, err)
59 + c.Debugf("failed to parse value in '%s': %v", line, err)
60 continue
61 }
62
src/go/plugin/go.d/collector/samba/collector.go renamed
+16 -16
@@ -27,8 +27,8 @@ func init() {
27 })
28 }
29
30 -func New() *Samba {
31 - return &Samba{
30 +func New() *Collector {
31 + return &Collector{
32 Config: Config{
33 Timeout: confopt.Duration(time.Second * 2),
34 },
@@ -42,7 +42,7 @@ type Config struct {
42 Timeout confopt.Duration `yaml:"timeout,omitempty" json:"timeout"`
43 }
44
45 -type Samba struct {
45 +type Collector struct {
46 module.Base
47 Config `yaml:",inline" json:""`
48
@@ -52,22 +52,22 @@ type Samba struct {
52 exec smbStatusBinary
53 }
54
55 -func (s *Samba) Configuration() any {
56 - return s.Config
55 +func (c *Collector) Configuration() any {
56 + return c.Config
57 }
58
59 -func (s *Samba) Init() error {
60 - smbStatus, err := s.initSmbStatusBinary()
59 +func (c *Collector) Init() error {
60 + smbStatus, err := c.initSmbStatusBinary()
61 if err != nil {
62 return fmt.Errorf("smbstatus exec initialization: %v", err)
63 }
64 - s.exec = smbStatus
64 + c.exec = smbStatus
65
66 return nil
67 }
68
69 -func (s *Samba) Check() error {
70 - mx, err := s.collect()
69 +func (c *Collector) Check() error {
70 + mx, err := c.collect()
71 if err != nil {
72 return err
73 }
@@ -79,14 +79,14 @@ func (s *Samba) Check() error {
79 return nil
80 }
81
82 -func (s *Samba) Charts() *module.Charts {
83 - return s.charts
82 +func (c *Collector) Charts() *module.Charts {
83 + return c.charts
84 }
85
86 -func (s *Samba) Collect() map[string]int64 {
87 - mx, err := s.collect()
86 +func (c *Collector) Collect() map[string]int64 {
87 + mx, err := c.collect()
88 if err != nil {
89 - s.Error(err)
89 + c.Error(err)
90 }
91
92 if len(mx) == 0 {
@@ -96,4 +96,4 @@ func (s *Samba) Collect() map[string]int64 {
96 return mx
97 }
98
99 -func (s *Samba) Cleanup() {}
99 +func (c *Collector) Cleanup() {}
src/go/plugin/go.d/collector/samba/collector_test.go renamed
+34 -34
@@ -31,11 +31,11 @@ func Test_testDataIsValid(t *testing.T) {
31 }
32 }
33
34 -func TestSamba_Configuration(t *testing.T) {
35 - module.TestConfigurationSerialize(t, &Samba{}, dataConfigJSON, dataConfigYAML)
34 +func TestCollector_Configuration(t *testing.T) {
35 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
36 }
37
38 -func TestSamba_Init(t *testing.T) {
38 +func TestCollector_Init(t *testing.T) {
39 tests := map[string]struct {
40 config Config
41 wantFail bool
@@ -48,59 +48,59 @@ func TestSamba_Init(t *testing.T) {
48
49 for name, test := range tests {
50 t.Run(name, func(t *testing.T) {
51 - smb := New()
52 - smb.Config = test.config
51 + collr := New()
52 + collr.Config = test.config
53
54 if test.wantFail {
55 - assert.Error(t, smb.Init())
55 + assert.Error(t, collr.Init())
56 } else {
57 - assert.NoError(t, smb.Init())
57 + assert.NoError(t, collr.Init())
58 }
59 })
60 }
61 }
62
63 -func TestSamba_Cleanup(t *testing.T) {
63 +func TestCollector_Cleanup(t *testing.T) {
64 tests := map[string]struct {
65 - prepare func() *Samba
65 + prepare func() *Collector
66 }{
67 "not initialized exec": {
68 - prepare: func() *Samba {
68 + prepare: func() *Collector {
69 return New()
70 },
71 },
72 "after check": {
73 - prepare: func() *Samba {
74 - smb := New()
75 - smb.exec = prepareMockOk()
76 - _ = smb.Check()
77 - return smb
73 + prepare: func() *Collector {
74 + collr := New()
75 + collr.exec = prepareMockOk()
76 + _ = collr.Check()
77 + return collr
78 },
79 },
80 "after collect": {
81 - prepare: func() *Samba {
82 - smb := New()
83 - smb.exec = prepareMockOk()
84 - _ = smb.Collect()
85 - return smb
81 + prepare: func() *Collector {
82 + collr := New()
83 + collr.exec = prepareMockOk()
84 + _ = collr.Collect()
85 + return collr
86 },
87 },
88 }
89
90 for name, test := range tests {
91 t.Run(name, func(t *testing.T) {
92 - smb := test.prepare()
92 + collr := test.prepare()
93
94 - assert.NotPanics(t, smb.Cleanup)
94 + assert.NotPanics(t, collr.Cleanup)
95 })
96 }
97 }
98
99 -func TestSambaCharts(t *testing.T) {
99 +func TestCollectorCharts(t *testing.T) {
100 assert.NotNil(t, New().Charts())
101 }
102
103 -func TestSamba_Check(t *testing.T) {
103 +func TestCollector_Check(t *testing.T) {
104 tests := map[string]struct {
105 prepareMock func() *mockSmbStatusBinary
106 wantFail bool
@@ -125,20 +125,20 @@ func TestSamba_Check(t *testing.T) {
125
126 for name, test := range tests {
127 t.Run(name, func(t *testing.T) {
128 - smb := New()
128 + collr := New()
129 mock := test.prepareMock()
130 - smb.exec = mock
130 + collr.exec = mock
131
132 if test.wantFail {
133 - assert.Error(t, smb.Check())
133 + assert.Error(t, collr.Check())
134 } else {
135 - assert.NoError(t, smb.Check())
135 + assert.NoError(t, collr.Check())
136 }
137 })
138 }
139 }
140
141 -func TestSamba_Collect(t *testing.T) {
141 +func TestCollector_Collect(t *testing.T) {
142 tests := map[string]struct {
143 prepareMock func() *mockSmbStatusBinary
144 wantMetrics map[string]int64
@@ -284,17 +284,17 @@ func TestSamba_Collect(t *testing.T) {
284
285 for name, test := range tests {
286 t.Run(name, func(t *testing.T) {
287 - smb := New()
287 + collr := New()
288 mock := test.prepareMock()
289 - smb.exec = mock
289 + collr.exec = mock
290
291 - mx := smb.Collect()
291 + mx := collr.Collect()
292
293 assert.Equal(t, test.wantMetrics, mx)
294
295 if len(test.wantMetrics) > 0 {
296 - assert.Len(t, *smb.Charts(), test.wantCharts, "want charts")
297 - module.TestMetricsHasAllChartsDims(t, smb.Charts(), mx)
296 + assert.Len(t, *collr.Charts(), test.wantCharts, "want charts")
297 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
298 }
299 })
300 }
src/go/plugin/go.d/collector/samba/init.go
+2 -2
@@ -10,14 +10,14 @@ import (
10 "github.com/netdata/netdata/go/plugins/pkg/executable"
11 )
12
13 -func (s *Samba) initSmbStatusBinary() (smbStatusBinary, error) {
13 +func (c *Collector) initSmbStatusBinary() (smbStatusBinary, error) {
14 ndsudoPath := filepath.Join(executable.Directory, "ndsudo")
15 if _, err := os.Stat(ndsudoPath); err != nil {
16 return nil, fmt.Errorf("ndsudo executable not found: %v", err)
17
18 }
19
20 - smbStatus := newSmbStatusBinary(ndsudoPath, s.Timeout.Duration(), s.Logger)
20 + smbStatus := newSmbStatusBinary(ndsudoPath, c.Timeout.Duration(), c.Logger)
21
22 return smbStatus, nil
23 }
src/go/plugin/go.d/collector/scaleio/charts.go
+19 -19
@@ -425,41 +425,41 @@ func newSdcCharts(sdc client.Sdc) *Charts {
425 }
426
427 // TODO: remove stale charts?
428 -func (s *ScaleIO) updateCharts() {
429 - s.updateStoragePoolCharts()
430 - s.updateSdcCharts()
428 +func (c *Collector) updateCharts() {
429 + c.updateStoragePoolCharts()
430 + c.updateSdcCharts()
431 }
432
433 -func (s *ScaleIO) updateStoragePoolCharts() {
434 - for _, pool := range s.discovered.pool {
435 - if s.charted[pool.ID] {
433 +func (c *Collector) updateStoragePoolCharts() {
434 + for _, pool := range c.discovered.pool {
435 + if c.charted[pool.ID] {
436 continue
437 }
438 - s.charted[pool.ID] = true
439 - s.addStoragePoolCharts(pool)
438 + c.charted[pool.ID] = true
439 + c.addStoragePoolCharts(pool)
440 }
441 }
442
443 -func (s *ScaleIO) updateSdcCharts() {
444 - for _, sdc := range s.discovered.sdc {
445 - if s.charted[sdc.ID] {
443 +func (c *Collector) updateSdcCharts() {
444 + for _, sdc := range c.discovered.sdc {
445 + if c.charted[sdc.ID] {
446 continue
447 }
448 - s.charted[sdc.ID] = true
449 - s.addSdcCharts(sdc)
448 + c.charted[sdc.ID] = true
449 + c.addSdcCharts(sdc)
450 }
451 }
452
453 -func (s *ScaleIO) addStoragePoolCharts(pool client.StoragePool) {
453 +func (c *Collector) addStoragePoolCharts(pool client.StoragePool) {
454 charts := newStoragePoolCharts(pool)
455 - if err := s.Charts().Add(*charts...); err != nil {
456 - s.Warningf("couldn't add charts for storage pool '%s(%s)': %v", pool.ID, pool.Name, err)
455 + if err := c.Charts().Add(*charts...); err != nil {
456 + c.Warningf("couldn't add charts for storage pool '%s(%s)': %v", pool.ID, pool.Name, err)
457 }
458 }
459
460 -func (s *ScaleIO) addSdcCharts(sdc client.Sdc) {
460 +func (c *Collector) addSdcCharts(sdc client.Sdc) {
461 charts := newSdcCharts(sdc)
462 - if err := s.Charts().Add(*charts...); err != nil {
463 - s.Warningf("couldn't add charts for sdc '%s(%s)': %v", sdc.ID, sdc.SdcIp, err)
462 + if err := c.Charts().Add(*charts...); err != nil {
463 + c.Warningf("couldn't add charts for sdc '%s(%s)': %v", sdc.ID, sdc.SdcIp, err)
464 }
465 }
src/go/plugin/go.d/collector/scaleio/collect.go
+19 -19
@@ -11,48 +11,48 @@ import (
11
12 const discoveryEvery = 5
13
14 -func (s *ScaleIO) collect() (map[string]int64, error) {
15 - s.runs += 1
16 - if !s.lastDiscoveryOK || s.runs%discoveryEvery == 0 {
17 - if err := s.discovery(); err != nil {
14 +func (c *Collector) collect() (map[string]int64, error) {
15 + c.runs += 1
16 + if !c.lastDiscoveryOK || c.runs%discoveryEvery == 0 {
17 + if err := c.discovery(); err != nil {
18 return nil, err
19 }
20 }
21
22 - stats, err := s.client.SelectedStatistics(query)
22 + stats, err := c.client.SelectedStatistics(query)
23 if err != nil {
24 return nil, err
25 }
26
27 mx := metrics{
28 - System: s.collectSystem(stats.System),
29 - StoragePool: s.collectStoragePool(stats.StoragePool),
30 - Sdc: s.collectSdc(stats.Sdc),
28 + System: c.collectSystem(stats.System),
29 + StoragePool: c.collectStoragePool(stats.StoragePool),
30 + Sdc: c.collectSdc(stats.Sdc),
31 }
32
33 - s.updateCharts()
33 + c.updateCharts()
34 return stm.ToMap(mx), nil
35 }
36
37 -func (s *ScaleIO) discovery() error {
37 +func (c *Collector) discovery() error {
38 start := time.Now()
39 - s.Debugf("starting discovery")
40 - ins, err := s.client.Instances()
39 + c.Debugf("starting discovery")
40 + ins, err := c.client.Instances()
41 if err != nil {
42 - s.lastDiscoveryOK = false
42 + c.lastDiscoveryOK = false
43 return err
44 }
45 - s.Debugf("discovering: discovered %d storage pools, %d sdcs, it took %s",
45 + c.Debugf("discovering: discovered %d storage pools, %d sdcs, it took %s",
46 len(ins.StoragePoolList), len(ins.SdcList), time.Since(start))
47
48 - s.discovered.pool = make(map[string]client.StoragePool, len(ins.StoragePoolList))
48 + c.discovered.pool = make(map[string]client.StoragePool, len(ins.StoragePoolList))
49 for _, pool := range ins.StoragePoolList {
50 - s.discovered.pool[pool.ID] = pool
50 + c.discovered.pool[pool.ID] = pool
51 }
52 - s.discovered.sdc = make(map[string]client.Sdc, len(ins.SdcList))
52 + c.discovered.sdc = make(map[string]client.Sdc, len(ins.SdcList))
53 for _, sdc := range ins.SdcList {
54 - s.discovered.sdc[sdc.ID] = sdc
54 + c.discovered.sdc[sdc.ID] = sdc
55 }
56 - s.lastDiscoveryOK = true
56 + c.lastDiscoveryOK = true
57 return nil
58 }
src/go/plugin/go.d/collector/scaleio/collect_sdc.go
+2 -2
@@ -4,11 +4,11 @@ package scaleio
4
5 import "github.com/netdata/netdata/go/plugins/plugin/go.d/collector/scaleio/client"
6
7 -func (s *ScaleIO) collectSdc(ss map[string]client.SdcStatistics) map[string]sdcMetrics {
7 +func (c *Collector) collectSdc(ss map[string]client.SdcStatistics) map[string]sdcMetrics {
8 ms := make(map[string]sdcMetrics, len(ss))
9
10 for id, stats := range ss {
11 - sdc, ok := s.discovered.sdc[id]
11 + sdc, ok := c.discovered.sdc[id]
12 if !ok {
13 continue
14 }
src/go/plugin/go.d/collector/scaleio/collect_storage_pool.go
+2 -2
@@ -4,11 +4,11 @@ package scaleio
4
5 import "github.com/netdata/netdata/go/plugins/plugin/go.d/collector/scaleio/client"
6
7 -func (s *ScaleIO) collectStoragePool(ss map[string]client.StoragePoolStatistics) map[string]storagePoolMetrics {
7 +func (c *Collector) collectStoragePool(ss map[string]client.StoragePoolStatistics) map[string]storagePoolMetrics {
8 ms := make(map[string]storagePoolMetrics, len(ss))
9
10 for id, stats := range ss {
11 - pool, ok := s.discovered.pool[id]
11 + pool, ok := c.discovered.pool[id]
12 if !ok {
13 continue
14 }
src/go/plugin/go.d/collector/scaleio/collect_system.go
+1 -1
@@ -4,7 +4,7 @@ package scaleio
4
5 import "github.com/netdata/netdata/go/plugins/plugin/go.d/collector/scaleio/client"
6
7 -func (s *ScaleIO) collectSystem(ss client.SystemStatistics) systemMetrics {
7 +func (c *Collector) collectSystem(ss client.SystemStatistics) systemMetrics {
8 var sm systemMetrics
9 collectSystemCapacity(&sm, ss)
10 collectSystemWorkload(&sm, ss)
src/go/plugin/go.d/collector/scaleio/collector.go renamed
+22 -22
@@ -25,8 +25,8 @@ func init() {
25 })
26 }
27
28 -func New() *ScaleIO {
29 - return &ScaleIO{
28 +func New() *Collector {
29 + return &Collector{
30 Config: Config{
31 HTTPConfig: web.HTTPConfig{
32 RequestConfig: web.RequestConfig{
@@ -48,7 +48,7 @@ type Config struct {
48 }
49
50 type (
51 - ScaleIO struct {
51 + Collector struct {
52 module.Base
53 Config `yaml:",inline" json:""`
54
@@ -67,32 +67,32 @@ type (
67 }
68 )
69
70 -func (s *ScaleIO) Configuration() any {
71 - return s.Config
70 +func (c *Collector) Configuration() any {
71 + return c.Config
72 }
73
74 -func (s *ScaleIO) Init() error {
75 - if s.Username == "" || s.Password == "" {
74 +func (c *Collector) Init() error {
75 + if c.Username == "" || c.Password == "" {
76 return errors.New("config: username and password aren't set")
77 }
78
79 - c, err := client.New(s.ClientConfig, s.RequestConfig)
79 + cli, err := client.New(c.ClientConfig, c.RequestConfig)
80 if err != nil {
81 return fmt.Errorf("error on creating ScaleIO client: %v", err)
82 }
83 - s.client = c
83 + c.client = cli
84
85 - s.Debugf("using URL %s", s.URL)
86 - s.Debugf("using timeout: %s", s.Timeout)
85 + c.Debugf("using URL %s", c.URL)
86 + c.Debugf("using timeout: %s", c.Timeout)
87
88 return nil
89 }
90
91 -func (s *ScaleIO) Check() error {
92 - if err := s.client.Login(); err != nil {
91 +func (c *Collector) Check() error {
92 + if err := c.client.Login(); err != nil {
93 return err
94 }
95 - mx, err := s.collect()
95 + mx, err := c.collect()
96 if err != nil {
97 return err
98 }
@@ -102,14 +102,14 @@ func (s *ScaleIO) Check() error {
102 return nil
103 }
104
105 -func (s *ScaleIO) Charts() *module.Charts {
106 - return s.charts
105 +func (c *Collector) Charts() *module.Charts {
106 + return c.charts
107 }
108
109 -func (s *ScaleIO) Collect() map[string]int64 {
110 - mx, err := s.collect()
109 +func (c *Collector) Collect() map[string]int64 {
110 + mx, err := c.collect()
111 if err != nil {
112 - s.Error(err)
112 + c.Error(err)
113 return nil
114 }
115
@@ -119,9 +119,9 @@ func (s *ScaleIO) Collect() map[string]int64 {
119 return mx
120 }
121
122 -func (s *ScaleIO) Cleanup() {
123 - if s.client == nil {
122 +func (c *Collector) Cleanup() {
123 + if c.client == nil {
124 return
125 }
126 - _ = s.client.Logout()
126 + _ = c.client.Logout()
127 }
src/go/plugin/go.d/collector/scaleio/collector_test.go renamed
+57 -57
@@ -34,66 +34,66 @@ func Test_testDataIsValid(t *testing.T) {
34 }
35 }
36
37 -func TestScaleIO_ConfigurationSerialize(t *testing.T) {
38 - module.TestConfigurationSerialize(t, &ScaleIO{}, dataConfigJSON, dataConfigYAML)
37 +func TestCollector_ConfigurationSerialize(t *testing.T) {
38 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
39 }
40
41 -func TestScaleIO_Init(t *testing.T) {
42 - scaleIO := New()
43 - scaleIO.Username = "username"
44 - scaleIO.Password = "password"
41 +func TestCollector_Init(t *testing.T) {
42 + collr := New()
43 + collr.Username = "username"
44 + collr.Password = "password"
45
46 - assert.NoError(t, scaleIO.Init())
46 + assert.NoError(t, collr.Init())
47 }
48 -func TestScaleIO_Init_UsernameAndPasswordNotSet(t *testing.T) {
48 +func TestCollector_Init_UsernameAndPasswordNotSet(t *testing.T) {
49 assert.Error(t, New().Init())
50 }
51
52 -func TestScaleIO_Init_ErrorOnCreatingClientWrongTLSCA(t *testing.T) {
53 - job := New()
54 - job.Username = "username"
55 - job.Password = "password"
56 - job.ClientConfig.TLSConfig.TLSCA = "testdata/tls"
52 +func TestCollector_Init_ErrorOnCreatingClientWrongTLSCA(t *testing.T) {
53 + collr := New()
54 + collr.Username = "username"
55 + collr.Password = "password"
56 + collr.ClientConfig.TLSConfig.TLSCA = "testdata/tls"
57
58 - assert.Error(t, job.Init())
58 + assert.Error(t, collr.Init())
59 }
60
61 -func TestScaleIO_Check(t *testing.T) {
62 - srv, _, scaleIO := prepareSrvMockScaleIO(t)
61 +func TestCollector_Check(t *testing.T) {
62 + srv, _, collr := prepareSrvMockScaleIO(t)
63 defer srv.Close()
64 - require.NoError(t, scaleIO.Init())
64 + require.NoError(t, collr.Init())
65
66 - assert.NoError(t, scaleIO.Check())
66 + assert.NoError(t, collr.Check())
67 }
68
69 -func TestScaleIO_Check_ErrorOnLogin(t *testing.T) {
70 - srv, mock, scaleIO := prepareSrvMockScaleIO(t)
69 +func TestCollector_Check_ErrorOnLogin(t *testing.T) {
70 + srv, mock, collr := prepareSrvMockScaleIO(t)
71 defer srv.Close()
72 - require.NoError(t, scaleIO.Init())
72 + require.NoError(t, collr.Init())
73 mock.Password = "new password"
74
75 - assert.Error(t, scaleIO.Check())
75 + assert.Error(t, collr.Check())
76 }
77
78 -func TestScaleIO_Charts(t *testing.T) {
78 +func TestCollector_Charts(t *testing.T) {
79 assert.NotNil(t, New().Charts())
80 }
81
82 -func TestScaleIO_Cleanup(t *testing.T) {
83 - srv, _, scaleIO := prepareSrvMockScaleIO(t)
82 +func TestCollector_Cleanup(t *testing.T) {
83 + srv, _, collr := prepareSrvMockScaleIO(t)
84 defer srv.Close()
85 - require.NoError(t, scaleIO.Init())
86 - require.NoError(t, scaleIO.Check())
85 + require.NoError(t, collr.Init())
86 + require.NoError(t, collr.Check())
87
88 - scaleIO.Cleanup()
89 - assert.False(t, scaleIO.client.LoggedIn())
88 + collr.Cleanup()
89 + assert.False(t, collr.client.LoggedIn())
90 }
91
92 -func TestScaleIO_Collect(t *testing.T) {
93 - srv, _, scaleIO := prepareSrvMockScaleIO(t)
92 +func TestCollector_Collect(t *testing.T) {
93 + srv, _, collr := prepareSrvMockScaleIO(t)
94 defer srv.Close()
95 - require.NoError(t, scaleIO.Init())
96 - require.NoError(t, scaleIO.Check())
95 + require.NoError(t, collr.Init())
96 + require.NoError(t, collr.Check())
97
98 expected := map[string]int64{
99 "sdc_6076fd0f00000000_bandwidth_read": 0,
@@ -298,47 +298,47 @@ func TestScaleIO_Collect(t *testing.T) {
298 "system_total_iops_write": 617200,
299 }
300
301 - mx := scaleIO.Collect()
301 + mx := collr.Collect()
302
303 assert.Equal(t, expected, mx)
304
305 - testCharts(t, scaleIO, mx)
305 + testCharts(t, collr, mx)
306 }
307
308 -func TestScaleIO_Collect_ConnectionRefused(t *testing.T) {
309 - srv, _, scaleIO := prepareSrvMockScaleIO(t)
308 +func TestCollector_Collect_ConnectionRefused(t *testing.T) {
309 + srv, _, collr := prepareSrvMockScaleIO(t)
310 defer srv.Close()
311 - require.NoError(t, scaleIO.Init())
312 - require.NoError(t, scaleIO.Check())
313 - scaleIO.client.Request.URL = "http://127.0.0.1:38001"
311 + require.NoError(t, collr.Init())
312 + require.NoError(t, collr.Check())
313 + collr.client.Request.URL = "http://127.0.0.1:38001"
314
315 - assert.Nil(t, scaleIO.Collect())
315 + assert.Nil(t, collr.Collect())
316 }
317
318 -func testCharts(t *testing.T, scaleIO *ScaleIO, collected map[string]int64) {
318 +func testCharts(t *testing.T, collr *Collector, collected map[string]int64) {
319 t.Helper()
320 - ensureStoragePoolChartsAreCreated(t, scaleIO)
321 - ensureSdcChartsAreCreated(t, scaleIO)
322 - module.TestMetricsHasAllChartsDims(t, scaleIO.Charts(), collected)
320 + ensureStoragePoolChartsAreCreated(t, collr)
321 + ensureSdcChartsAreCreated(t, collr)
322 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), collected)
323 }
324
325 -func ensureStoragePoolChartsAreCreated(t *testing.T, scaleIO *ScaleIO) {
326 - for _, pool := range scaleIO.discovered.pool {
325 +func ensureStoragePoolChartsAreCreated(t *testing.T, collr *Collector) {
326 + for _, pool := range collr.discovered.pool {
327 for _, chart := range *newStoragePoolCharts(pool) {
328 - assert.Truef(t, scaleIO.Charts().Has(chart.ID), "chart '%s' is not created", chart.ID)
328 + assert.Truef(t, collr.Charts().Has(chart.ID), "chart '%s' is not created", chart.ID)
329 }
330 }
331 }
332
333 -func ensureSdcChartsAreCreated(t *testing.T, scaleIO *ScaleIO) {
334 - for _, sdc := range scaleIO.discovered.sdc {
333 +func ensureSdcChartsAreCreated(t *testing.T, collr *Collector) {
334 + for _, sdc := range collr.discovered.sdc {
335 for _, chart := range *newSdcCharts(sdc) {
336 - assert.Truef(t, scaleIO.Charts().Has(chart.ID), "chart '%s' is not created", chart.ID)
336 + assert.Truef(t, collr.Charts().Has(chart.ID), "chart '%s' is not created", chart.ID)
337 }
338 }
339 }
340
341 -func prepareSrvMockScaleIO(t *testing.T) (*httptest.Server, *client.MockScaleIOAPIServer, *ScaleIO) {
341 +func prepareSrvMockScaleIO(t *testing.T) (*httptest.Server, *client.MockScaleIOAPIServer, *Collector) {
342 t.Helper()
343 const (
344 user = "user"
@@ -365,9 +365,9 @@ func prepareSrvMockScaleIO(t *testing.T) (*httptest.Server, *client.MockScaleIOA
365 srv := httptest.NewServer(&mock)
366 require.NoError(t, err)
367
368 - scaleIO := New()
369 - scaleIO.URL = srv.URL
370 - scaleIO.Username = user
371 - scaleIO.Password = password
372 - return srv, &mock, scaleIO
368 + collr := New()
369 + collr.URL = srv.URL
370 + collr.Username = user
371 + collr.Password = password
372 + return srv, &mock, collr
373 }
src/go/plugin/go.d/collector/sensors/charts.go
+53 -53
@@ -301,85 +301,85 @@ var (
301 }
302 )
303
304 -func (s *Sensors) updateCharts(chips []*lmsensors.Chip) {
304 +func (c *Collector) updateCharts(chips []*lmsensors.Chip) {
305 seen := make(map[string]bool)
306
307 for _, chip := range chips {
308 for _, sn := range chip.Sensors.Voltage {
309 key := chip.UniqueName + "_" + sn.Name
310 seen[key] = true
311 - if !s.seenSensors[key] {
312 - s.seenSensors[key] = true
313 - s.addVoltageCharts(chip, sn)
311 + if !c.seenSensors[key] {
312 + c.seenSensors[key] = true
313 + c.addVoltageCharts(chip, sn)
314 }
315 }
316 for _, sn := range chip.Sensors.Fan {
317 key := chip.UniqueName + "_" + sn.Name
318 seen[key] = true
319 - if !s.seenSensors[key] {
320 - s.seenSensors[key] = true
321 - s.addFanCharts(chip, sn)
319 + if !c.seenSensors[key] {
320 + c.seenSensors[key] = true
321 + c.addFanCharts(chip, sn)
322 }
323 }
324 for _, sn := range chip.Sensors.Temperature {
325 key := chip.UniqueName + "_" + sn.Name
326 seen[key] = true
327 - if !s.seenSensors[key] {
328 - s.seenSensors[key] = true
329 - s.addTemperatureCharts(chip, sn)
327 + if !c.seenSensors[key] {
328 + c.seenSensors[key] = true
329 + c.addTemperatureCharts(chip, sn)
330 }
331 }
332 for _, sn := range chip.Sensors.Current {
333 key := chip.UniqueName + "_" + sn.Name
334 seen[key] = true
335 - if !s.seenSensors[key] {
336 - s.seenSensors[key] = true
337 - s.addCurrentCharts(chip, sn)
335 + if !c.seenSensors[key] {
336 + c.seenSensors[key] = true
337 + c.addCurrentCharts(chip, sn)
338 }
339 }
340 for _, sn := range chip.Sensors.Power {
341 key := chip.UniqueName + "_" + sn.Name
342 seen[key] = true
343 - if !s.seenSensors[key] {
344 - s.seenSensors[key] = true
345 - s.addPowerCharts(chip, sn)
343 + if !c.seenSensors[key] {
344 + c.seenSensors[key] = true
345 + c.addPowerCharts(chip, sn)
346 }
347 }
348 for _, sn := range chip.Sensors.Energy {
349 key := chip.UniqueName + "_" + sn.Name
350 seen[key] = true
351 - if !s.seenSensors[key] {
352 - s.seenSensors[key] = true
353 - s.addEnergyCharts(chip, sn)
351 + if !c.seenSensors[key] {
352 + c.seenSensors[key] = true
353 + c.addEnergyCharts(chip, sn)
354 }
355 }
356 for _, sn := range chip.Sensors.Humidity {
357 key := chip.UniqueName + "_" + sn.Name
358 seen[key] = true
359 - if !s.seenSensors[key] {
360 - s.seenSensors[key] = true
361 - s.addHumidityCharts(chip, sn)
359 + if !c.seenSensors[key] {
360 + c.seenSensors[key] = true
361 + c.addHumidityCharts(chip, sn)
362 }
363 }
364 for _, sn := range chip.Sensors.Intrusion {
365 key := chip.UniqueName + "_" + sn.Name
366 seen[key] = true
367 - if !s.seenSensors[key] {
368 - s.seenSensors[key] = true
369 - s.addIntrusionCharts(chip, sn)
367 + if !c.seenSensors[key] {
368 + c.seenSensors[key] = true
369 + c.addIntrusionCharts(chip, sn)
370 }
371 }
372 }
373
374 - for key := range s.seenSensors {
374 + for key := range c.seenSensors {
375 if !seen[key] {
376 - delete(s.seenSensors, key)
377 - s.removeSensorChart(key)
376 + delete(c.seenSensors, key)
377 + c.removeSensorChart(key)
378 }
379 }
380 }
381
382 -func (s *Sensors) addTemperatureCharts(chip *lmsensors.Chip, sn *lmsensors.TemperatureSensor) {
382 +func (c *Collector) addTemperatureCharts(chip *lmsensors.Chip, sn *lmsensors.TemperatureSensor) {
383 charts := temperatureSensorChartsTmpl.Copy()
384
385 if sn.Input == nil {
@@ -389,10 +389,10 @@ func (s *Sensors) addTemperatureCharts(chip *lmsensors.Chip, sn *lmsensors.Tempe
389 _ = charts.Remove(temperatureSensorAlarmChartTmpl.ID)
390 }
391
392 - s.addCharts(charts, chip.UniqueName, chip.SysDevice, sn.Name, sn.Label)
392 + c.addCharts(charts, chip.UniqueName, chip.SysDevice, sn.Name, sn.Label)
393 }
394
395 -func (s *Sensors) addVoltageCharts(chip *lmsensors.Chip, sn *lmsensors.VoltageSensor) {
395 +func (c *Collector) addVoltageCharts(chip *lmsensors.Chip, sn *lmsensors.VoltageSensor) {
396 charts := voltageSensorChartsTmpl.Copy()
397
398 if sn.Input == nil {
@@ -405,10 +405,10 @@ func (s *Sensors) addVoltageCharts(chip *lmsensors.Chip, sn *lmsensors.VoltageSe
405 _ = charts.Remove(voltageSensorAlarmChartTmpl.ID)
406 }
407
408 - s.addCharts(charts, chip.UniqueName, chip.SysDevice, sn.Name, sn.Label)
408 + c.addCharts(charts, chip.UniqueName, chip.SysDevice, sn.Name, sn.Label)
409 }
410
411 -func (s *Sensors) addFanCharts(chip *lmsensors.Chip, sn *lmsensors.FanSensor) {
411 +func (c *Collector) addFanCharts(chip *lmsensors.Chip, sn *lmsensors.FanSensor) {
412 charts := fanSensorChartsTmpl.Copy()
413
414 if sn.Input == nil {
@@ -418,10 +418,10 @@ func (s *Sensors) addFanCharts(chip *lmsensors.Chip, sn *lmsensors.FanSensor) {
418 _ = charts.Remove(fanSensorAlarmChartTmpl.ID)
419 }
420
421 - s.addCharts(charts, chip.UniqueName, chip.SysDevice, sn.Name, sn.Label)
421 + c.addCharts(charts, chip.UniqueName, chip.SysDevice, sn.Name, sn.Label)
422 }
423
424 -func (s *Sensors) addCurrentCharts(chip *lmsensors.Chip, sn *lmsensors.CurrentSensor) {
424 +func (c *Collector) addCurrentCharts(chip *lmsensors.Chip, sn *lmsensors.CurrentSensor) {
425 charts := currentSensorChartsTmpl.Copy()
426
427 if sn.Input == nil {
@@ -434,10 +434,10 @@ func (s *Sensors) addCurrentCharts(chip *lmsensors.Chip, sn *lmsensors.CurrentSe
434 _ = charts.Remove(currentSensorAlarmChartTmpl.ID)
435 }
436
437 - s.addCharts(charts, chip.UniqueName, chip.SysDevice, sn.Name, sn.Label)
437 + c.addCharts(charts, chip.UniqueName, chip.SysDevice, sn.Name, sn.Label)
438 }
439
440 -func (s *Sensors) addPowerCharts(chip *lmsensors.Chip, sn *lmsensors.PowerSensor) {
440 +func (c *Collector) addPowerCharts(chip *lmsensors.Chip, sn *lmsensors.PowerSensor) {
441 charts := powerSensorChartsTmpl.Copy()
442
443 if sn.Input == nil {
@@ -450,45 +450,45 @@ func (s *Sensors) addPowerCharts(chip *lmsensors.Chip, sn *lmsensors.PowerSensor
450 _ = charts.Remove(powerSensorAlarmChartTmpl.ID)
451 }
452
453 - s.addCharts(charts, chip.UniqueName, chip.SysDevice, sn.Name, sn.Label)
453 + c.addCharts(charts, chip.UniqueName, chip.SysDevice, sn.Name, sn.Label)
454 }
455
456 -func (s *Sensors) addEnergyCharts(chip *lmsensors.Chip, sn *lmsensors.EnergySensor) {
456 +func (c *Collector) addEnergyCharts(chip *lmsensors.Chip, sn *lmsensors.EnergySensor) {
457 charts := energySensorChartsTmpl.Copy()
458
459 if sn.Input == nil {
460 _ = charts.Remove(energySensorInputChartTmpl.ID)
461 }
462
463 - s.addCharts(charts, chip.UniqueName, chip.SysDevice, sn.Name, sn.Label)
463 + c.addCharts(charts, chip.UniqueName, chip.SysDevice, sn.Name, sn.Label)
464 }
465
466 -func (s *Sensors) addHumidityCharts(chip *lmsensors.Chip, sn *lmsensors.HumiditySensor) {
466 +func (c *Collector) addHumidityCharts(chip *lmsensors.Chip, sn *lmsensors.HumiditySensor) {
467 charts := humiditySensorChartsTmpl.Copy()
468
469 if sn.Input == nil {
470 _ = charts.Remove(humiditySensorInputChartTmpl.ID)
471 }
472
473 - s.addCharts(charts, chip.UniqueName, chip.SysDevice, sn.Name, sn.Label)
473 + c.addCharts(charts, chip.UniqueName, chip.SysDevice, sn.Name, sn.Label)
474 }
475
476 -func (s *Sensors) addIntrusionCharts(chip *lmsensors.Chip, sn *lmsensors.IntrusionSensor) {
476 +func (c *Collector) addIntrusionCharts(chip *lmsensors.Chip, sn *lmsensors.IntrusionSensor) {
477 charts := intrusionSensorChartsTmpl.Copy()
478
479 if sn.Alarm == nil {
480 _ = charts.Remove(intrusionSensorAlarmChartTmpl.ID)
481 }
482
483 - s.addCharts(charts, chip.UniqueName, chip.SysDevice, sn.Name, sn.Label)
483 + c.addCharts(charts, chip.UniqueName, chip.SysDevice, sn.Name, sn.Label)
484 }
485
486 -func (s *Sensors) addCharts(charts *module.Charts, chipUniqueName, chipSysDevice, snName, snLabel string) {
486 +func (c *Collector) addCharts(charts *module.Charts, chipUniqueName, chipSysDevice, snName, snLabel string) {
487 if len(*charts) == 0 {
488 return
489 }
490
491 - if lbl := s.relabel(chipUniqueName, snName); lbl != "" {
491 + if lbl := c.relabel(chipUniqueName, snName); lbl != "" {
492 snLabel = lbl
493 }
494
@@ -506,15 +506,15 @@ func (s *Sensors) addCharts(charts *module.Charts, chipUniqueName, chipSysDevice
506 }
507 }
508
509 - if err := s.Charts().Add(*charts...); err != nil {
510 - s.Warning(err)
509 + if err := c.Charts().Add(*charts...); err != nil {
510 + c.Warning(err)
511 }
512 }
513
514 -func (s *Sensors) removeSensorChart(px string) {
514 +func (c *Collector) removeSensorChart(px string) {
515 px = cleanChartId(px)
516
517 - for _, chart := range *s.Charts() {
517 + for _, chart := range *c.Charts() {
518 if strings.HasPrefix(chart.ID, px) {
519 chart.MarkRemove()
520 chart.MarkNotCreated()
@@ -523,15 +523,15 @@ func (s *Sensors) removeSensorChart(px string) {
523 }
524 }
525
526 -func (s *Sensors) relabel(chipUniqueName, snName string) string {
527 - for _, rv := range s.Relabel {
526 +func (c *Collector) relabel(chipUniqueName, snName string) string {
527 + for _, rv := range c.Relabel {
528 if rv.Chip == "" {
529 return ""
530 }
531
532 mr, err := matcher.NewSimplePatternsMatcher(rv.Chip)
533 if err != nil {
534 - s.Debugf("failed to create simple pattern matcher from '%s': %v", rv.Chip, err)
534 + c.Debugf("failed to create simple pattern matcher from '%s': %v", rv.Chip, err)
535 return ""
536 }
537
src/go/plugin/go.d/collector/sensors/collect.go
+4 -4
@@ -14,12 +14,12 @@ import (
14
15 const precision = 1000
16
17 -func (s *Sensors) collect() (map[string]int64, error) {
18 - if s.sc == nil {
17 +func (c *Collector) collect() (map[string]int64, error) {
18 + if c.sc == nil {
19 return nil, errors.New("sysfs scanner is not initialized")
20 }
21
22 - chips, err := s.sc.Scan()
22 + chips, err := c.sc.Scan()
23 if err != nil {
24 return nil, err
25 }
@@ -57,7 +57,7 @@ func (s *Sensors) collect() (map[string]int64, error) {
57 }
58 }
59
60 - s.updateCharts(chips)
60 + c.updateCharts(chips)
61
62 return mx, nil
63 }
src/go/plugin/go.d/collector/sensors/collector.go renamed
+16 -16
@@ -26,8 +26,8 @@ func init() {
26 })
27 }
28
29 -func New() *Sensors {
30 - return &Sensors{
29 +func New() *Collector {
30 + return &Collector{
31 Config: Config{},
32 charts: &module.Charts{},
33 seenSensors: make(map[string]bool),
@@ -46,7 +46,7 @@ type Config struct {
46 }
47
48 type (
49 - Sensors struct {
49 + Collector struct {
50 module.Base
51 Config `yaml:",inline" json:""`
52
@@ -61,20 +61,20 @@ type (
61 }
62 )
63
64 -func (s *Sensors) Configuration() any {
65 - return s.Config
64 +func (c *Collector) Configuration() any {
65 + return c.Config
66 }
67
68 -func (s *Sensors) Init() error {
68 +func (c *Collector) Init() error {
69 sc := lmsensors.New()
70 - sc.Logger = s.Logger
71 - s.sc = sc
70 + sc.Logger = c.Logger
71 + c.sc = sc
72
73 return nil
74 }
75
76 -func (s *Sensors) Check() error {
77 - mx, err := s.collect()
76 +func (c *Collector) Check() error {
77 + mx, err := c.collect()
78 if err != nil {
79 return err
80 }
@@ -86,14 +86,14 @@ func (s *Sensors) Check() error {
86 return nil
87 }
88
89 -func (s *Sensors) Charts() *module.Charts {
90 - return s.charts
89 +func (c *Collector) Charts() *module.Charts {
90 + return c.charts
91 }
92
93 -func (s *Sensors) Collect() map[string]int64 {
94 - mx, err := s.collect()
93 +func (c *Collector) Collect() map[string]int64 {
94 + mx, err := c.collect()
95 if err != nil {
96 - s.Error(err)
96 + c.Error(err)
97 }
98
99 if len(mx) == 0 {
@@ -103,4 +103,4 @@ func (s *Sensors) Collect() map[string]int64 {
103 return mx
104 }
105
106 -func (s *Sensors) Cleanup() {}
106 +func (c *Collector) Cleanup() {}
src/go/plugin/go.d/collector/sensors/collector_test.go renamed
+34 -34
@@ -31,11 +31,11 @@ func Test_testDataIsValid(t *testing.T) {
31 }
32 }
33
34 -func TestSensors_Configuration(t *testing.T) {
35 - module.TestConfigurationSerialize(t, &Sensors{}, dataConfigJSON, dataConfigYAML)
34 +func TestCollector_Configuration(t *testing.T) {
35 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
36 }
37
38 -func TestSensors_Init(t *testing.T) {
38 +func TestCollector_Init(t *testing.T) {
39 tests := map[string]struct {
40 config Config
41 wantFail bool
@@ -48,59 +48,59 @@ func TestSensors_Init(t *testing.T) {
48
49 for name, test := range tests {
50 t.Run(name, func(t *testing.T) {
51 - sensors := New()
52 - sensors.Config = test.config
51 + collr := New()
52 + collr.Config = test.config
53
54 if test.wantFail {
55 - assert.Error(t, sensors.Init())
55 + assert.Error(t, collr.Init())
56 } else {
57 - assert.NoError(t, sensors.Init())
57 + assert.NoError(t, collr.Init())
58 }
59 })
60 }
61 }
62
63 -func TestSensors_Cleanup(t *testing.T) {
63 +func TestCollector_Cleanup(t *testing.T) {
64 tests := map[string]struct {
65 - prepare func() *Sensors
65 + prepare func() *Collector
66 }{
67 "not initialized exec": {
68 - prepare: func() *Sensors {
68 + prepare: func() *Collector {
69 return New()
70 },
71 },
72 "after check": {
73 - prepare: func() *Sensors {
74 - sensors := New()
75 - sensors.sc = prepareMockScannerOk()
76 - _ = sensors.Check()
77 - return sensors
73 + prepare: func() *Collector {
74 + collr := New()
75 + collr.sc = prepareMockScannerOk()
76 + _ = collr.Check()
77 + return collr
78 },
79 },
80 "after collect": {
81 - prepare: func() *Sensors {
82 - sensors := New()
83 - sensors.sc = prepareMockScannerOk()
84 - _ = sensors.Collect()
85 - return sensors
81 + prepare: func() *Collector {
82 + collr := New()
83 + collr.sc = prepareMockScannerOk()
84 + _ = collr.Collect()
85 + return collr
86 },
87 },
88 }
89
90 for name, test := range tests {
91 t.Run(name, func(t *testing.T) {
92 - sensors := test.prepare()
92 + collr := test.prepare()
93
94 - assert.NotPanics(t, sensors.Cleanup)
94 + assert.NotPanics(t, collr.Cleanup)
95 })
96 }
97 }
98
99 -func TestSensors_Charts(t *testing.T) {
99 +func TestCollector_Charts(t *testing.T) {
100 assert.NotNil(t, New().Charts())
101 }
102
103 -func TestSensors_Check(t *testing.T) {
103 +func TestCollector_Check(t *testing.T) {
104 tests := map[string]struct {
105 prepareMock func() *mockScanner
106 wantFail bool
@@ -117,19 +117,19 @@ func TestSensors_Check(t *testing.T) {
117
118 for name, test := range tests {
119 t.Run(name, func(t *testing.T) {
120 - sensors := New()
121 - sensors.sc = test.prepareMock()
120 + collr := New()
121 + collr.sc = test.prepareMock()
122
123 if test.wantFail {
124 - assert.Error(t, sensors.Check())
124 + assert.Error(t, collr.Check())
125 } else {
126 - assert.NoError(t, sensors.Check())
126 + assert.NoError(t, collr.Check())
127 }
128 })
129 }
130 }
131
132 -func TestSensors_Collect(t *testing.T) {
132 +func TestCollector_Collect(t *testing.T) {
133 tests := map[string]struct {
134 prepareScanner func() *mockScanner
135 wantMetrics map[string]int64
@@ -264,21 +264,21 @@ func TestSensors_Collect(t *testing.T) {
264
265 for name, test := range tests {
266 t.Run(name, func(t *testing.T) {
267 - sensors := New()
268 - sensors.sc = test.prepareScanner()
267 + collr := New()
268 + collr.sc = test.prepareScanner()
269
270 var mx map[string]int64
271
272 for i := 0; i < 10; i++ {
273 - mx = sensors.Collect()
273 + mx = collr.Collect()
274 }
275
276 assert.Equal(t, test.wantMetrics, mx)
277
278 - assert.Len(t, *sensors.Charts(), test.wantCharts)
278 + assert.Len(t, *collr.Charts(), test.wantCharts)
279
280 if len(test.wantMetrics) > 0 {
281 - module.TestMetricsHasAllChartsDims(t, sensors.Charts(), mx)
281 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
282 }
283 })
284 }
src/go/plugin/go.d/collector/smartctl/charts.go
+15 -15
@@ -173,34 +173,34 @@ var (
173 }
174 )
175
176 -func (s *Smartctl) addDeviceCharts(dev *smartDevice) {
176 +func (c *Collector) addDeviceCharts(dev *smartDevice) {
177 charts := module.Charts{}
178
179 - if cs := s.newDeviceCharts(dev); cs != nil && len(*cs) > 0 {
179 + if cs := c.newDeviceCharts(dev); cs != nil && len(*cs) > 0 {
180 if err := charts.Add(*cs...); err != nil {
181 - s.Warning(err)
181 + c.Warning(err)
182 }
183 }
184 - if cs := s.newDeviceSmartAttrCharts(dev); cs != nil && len(*cs) > 0 {
184 + if cs := c.newDeviceSmartAttrCharts(dev); cs != nil && len(*cs) > 0 {
185 if err := charts.Add(*cs...); err != nil {
186 - s.Warning(err)
186 + c.Warning(err)
187 }
188 }
189 - if cs := s.newDeviceScsiErrorLogCharts(dev); cs != nil && len(*cs) > 0 {
189 + if cs := c.newDeviceScsiErrorLogCharts(dev); cs != nil && len(*cs) > 0 {
190 if err := charts.Add(*cs...); err != nil {
191 - s.Warning(err)
191 + c.Warning(err)
192 }
193 }
194
195 - if err := s.Charts().Add(charts...); err != nil {
196 - s.Warning(err)
195 + if err := c.Charts().Add(charts...); err != nil {
196 + c.Warning(err)
197 }
198 }
199
200 -func (s *Smartctl) removeDeviceCharts(scanDev *scanDevice) {
200 +func (c *Collector) removeDeviceCharts(scanDev *scanDevice) {
201 px := fmt.Sprintf("device_%s_%s_", scanDev.shortName(), scanDev.typ)
202
203 - for _, chart := range *s.Charts() {
203 + for _, chart := range *c.Charts() {
204 if strings.HasPrefix(chart.ID, px) {
205 chart.MarkRemove()
206 chart.MarkNotCreated()
@@ -208,7 +208,7 @@ func (s *Smartctl) removeDeviceCharts(scanDev *scanDevice) {
208 }
209 }
210
211 -func (s *Smartctl) newDeviceCharts(dev *smartDevice) *module.Charts {
211 +func (c *Collector) newDeviceCharts(dev *smartDevice) *module.Charts {
212
213 charts := deviceChartsTmpl.Copy()
214
@@ -244,7 +244,7 @@ func (s *Smartctl) newDeviceCharts(dev *smartDevice) *module.Charts {
244 return charts
245 }
246
247 -func (s *Smartctl) newDeviceSmartAttrCharts(dev *smartDevice) *module.Charts {
247 +func (c *Collector) newDeviceSmartAttrCharts(dev *smartDevice) *module.Charts {
248 attrs, ok := dev.ataSmartAttributeTable()
249 if !ok {
250 return nil
@@ -287,14 +287,14 @@ func (s *Smartctl) newDeviceSmartAttrCharts(dev *smartDevice) *module.Charts {
287 }
288
289 if err := charts.Add(cs...); err != nil {
290 - s.Warning(err)
290 + c.Warning(err)
291 }
292 }
293
294 return &charts
295 }
296
297 -func (s *Smartctl) newDeviceScsiErrorLogCharts(dev *smartDevice) *module.Charts {
297 +func (c *Collector) newDeviceScsiErrorLogCharts(dev *smartDevice) *module.Charts {
298 if dev.deviceType() != "scsi" || !dev.data.Get("scsi_error_counter_log").Exists() {
299 return nil
300 }
src/go/plugin/go.d/collector/smartctl/collect.go
+33 -33
@@ -15,61 +15,61 @@ import (
15 "github.com/tidwall/gjson"
16 )
17
18 -func (s *Smartctl) collect() (map[string]int64, error) {
18 +func (c *Collector) collect() (map[string]int64, error) {
19 now := time.Now()
20
21 - if s.forceScan || s.isTimeToScan(now) {
22 - devices, err := s.scanDevices()
21 + if c.forceScan || c.isTimeToScan(now) {
22 + devices, err := c.scanDevices()
23 if err != nil {
24 return nil, err
25 }
26
27 - for k, dev := range s.scannedDevices {
27 + for k, dev := range c.scannedDevices {
28 if _, ok := devices[k]; !ok {
29 - delete(s.scannedDevices, k)
30 - delete(s.seenDevices, k)
31 - s.removeDeviceCharts(dev)
29 + delete(c.scannedDevices, k)
30 + delete(c.seenDevices, k)
31 + c.removeDeviceCharts(dev)
32 }
33 }
34
35 - s.forceDevicePoll = !maps.Equal(s.scannedDevices, devices)
36 - s.scannedDevices = devices
37 - s.lastScanTime = now
38 - s.forceScan = false
35 + c.forceDevicePoll = !maps.Equal(c.scannedDevices, devices)
36 + c.scannedDevices = devices
37 + c.lastScanTime = now
38 + c.forceScan = false
39 }
40
41 - if s.forceDevicePoll || s.isTimeToPollDevices(now) {
41 + if c.forceDevicePoll || c.isTimeToPollDevices(now) {
42 mx := make(map[string]int64)
43
44 // TODO: make it concurrent
45 - for _, d := range s.scannedDevices {
46 - if err := s.collectScannedDevice(mx, d); err != nil {
47 - s.Warning(err)
45 + for _, d := range c.scannedDevices {
46 + if err := c.collectScannedDevice(mx, d); err != nil {
47 + c.Warning(err)
48 continue
49 }
50 }
51
52 - s.forceDevicePoll = false
53 - s.lastDevicePollTime = now
54 - s.mx = mx
52 + c.forceDevicePoll = false
53 + c.lastDevicePollTime = now
54 + c.mx = mx
55 }
56
57 - return s.mx, nil
57 + return c.mx, nil
58 }
59
60 -func (s *Smartctl) collectScannedDevice(mx map[string]int64, scanDev *scanDevice) error {
61 - resp, err := s.exec.deviceInfo(scanDev.name, scanDev.typ, s.NoCheckPowerMode)
60 +func (c *Collector) collectScannedDevice(mx map[string]int64, scanDev *scanDevice) error {
61 + resp, err := c.exec.deviceInfo(scanDev.name, scanDev.typ, c.NoCheckPowerMode)
62 if err != nil {
63 if resp != nil && isDeviceOpenFailedNoSuchDevice(resp) && !scanDev.extra {
64 - s.Infof("smartctl reported that device '%s' type '%s' no longer exists", scanDev.name, scanDev.typ)
65 - s.forceScan = true
64 + c.Infof("smartctl reported that device '%s' type '%s' no longer exists", scanDev.name, scanDev.typ)
65 + c.forceScan = true
66 return nil
67 }
68 return fmt.Errorf("failed to get device info for '%s' type '%s': %v", scanDev.name, scanDev.typ, err)
69 }
70
71 if isDeviceInLowerPowerMode(resp) {
72 - s.Debugf("device '%s' type '%s' is in a low-power mode, skipping", scanDev.name, scanDev.typ)
72 + c.Debugf("device '%s' type '%s' is in a low-power mode, skipping", scanDev.name, scanDev.typ)
73 return nil
74 }
75
@@ -78,17 +78,17 @@ func (s *Smartctl) collectScannedDevice(mx map[string]int64, scanDev *scanDevice
78 return nil
79 }
80
81 - if !s.seenDevices[scanDev.key()] {
82 - s.seenDevices[scanDev.key()] = true
83 - s.addDeviceCharts(dev)
81 + if !c.seenDevices[scanDev.key()] {
82 + c.seenDevices[scanDev.key()] = true
83 + c.addDeviceCharts(dev)
84 }
85
86 - s.collectSmartDevice(mx, dev)
86 + c.collectSmartDevice(mx, dev)
87
88 return nil
89 }
90
91 -func (s *Smartctl) collectSmartDevice(mx map[string]int64, dev *smartDevice) {
91 +func (c *Collector) collectSmartDevice(mx map[string]int64, dev *smartDevice) {
92 px := fmt.Sprintf("device_%s_type_%s_", dev.deviceName(), dev.deviceType())
93
94 if v, ok := dev.powerOnTime(); ok {
@@ -165,12 +165,12 @@ func (s *Smartctl) collectSmartDevice(mx map[string]int64, dev *smartDevice) {
165 }
166 }
167
168 -func (s *Smartctl) isTimeToScan(now time.Time) bool {
169 - return s.ScanEvery.Duration().Seconds() != 0 && now.After(s.lastScanTime.Add(s.ScanEvery.Duration()))
168 +func (c *Collector) isTimeToScan(now time.Time) bool {
169 + return c.ScanEvery.Duration().Seconds() != 0 && now.After(c.lastScanTime.Add(c.ScanEvery.Duration()))
170 }
171
172 -func (s *Smartctl) isTimeToPollDevices(now time.Time) bool {
173 - return now.After(s.lastDevicePollTime.Add(s.PollDevicesEvery.Duration()))
172 +func (c *Collector) isTimeToPollDevices(now time.Time) bool {
173 + return now.After(c.lastDevicePollTime.Add(c.PollDevicesEvery.Duration()))
174
175 }
176
src/go/plugin/go.d/collector/smartctl/collector.go renamed
+32 -40
@@ -13,8 +13,6 @@ import (
13 "github.com/netdata/netdata/go/plugins/pkg/matcher"
14 "github.com/netdata/netdata/go/plugins/plugin/go.d/agent/module"
15 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/confopt"
16 -
17 - "github.com/tidwall/gjson"
16 )
17
18 //go:embed "config_schema.json"
@@ -31,8 +29,8 @@ func init() {
29 })
30 }
31
34 -func New() *Smartctl {
35 - return &Smartctl{
32 +func New() *Collector {
33 + return &Collector{
34 Config: Config{
35 Timeout: confopt.Duration(time.Second * 5),
36 ScanEvery: confopt.Duration(time.Minute * 15),
@@ -63,59 +61,53 @@ type (
61 }
62 )
63
66 -type (
67 - Smartctl struct {
68 - module.Base
69 - Config `yaml:",inline" data:""`
64 +type Collector struct {
65 + module.Base
66 + Config `yaml:",inline" data:""`
67
71 - charts *module.Charts
68 + charts *module.Charts
69
73 - exec smartctlCli
70 + exec smartctlCli
71
75 - deviceSr matcher.Matcher
72 + deviceSr matcher.Matcher
73
77 - lastScanTime time.Time
78 - forceScan bool
79 - scannedDevices map[string]*scanDevice
74 + lastScanTime time.Time
75 + forceScan bool
76 + scannedDevices map[string]*scanDevice
77
81 - lastDevicePollTime time.Time
82 - forceDevicePoll bool
78 + lastDevicePollTime time.Time
79 + forceDevicePoll bool
80
84 - seenDevices map[string]bool
85 - mx map[string]int64
86 - }
87 - smartctlCli interface {
88 - scan(open bool) (*gjson.Result, error)
89 - deviceInfo(deviceName, deviceType, powerMode string) (*gjson.Result, error)
90 - }
91 -)
81 + seenDevices map[string]bool
82 + mx map[string]int64
83 +}
84
93 -func (s *Smartctl) Configuration() any {
94 - return s.Config
85 +func (c *Collector) Configuration() any {
86 + return c.Config
87 }
88
97 -func (s *Smartctl) Init() error {
98 - if err := s.validateConfig(); err != nil {
89 +func (c *Collector) Init() error {
90 + if err := c.validateConfig(); err != nil {
91 return fmt.Errorf("config validation: %s", err)
92 }
93
102 - sr, err := s.initDeviceSelector()
94 + sr, err := c.initDeviceSelector()
95 if err != nil {
96 return fmt.Errorf("device selector initialization: %v", err)
97 }
106 - s.deviceSr = sr
98 + c.deviceSr = sr
99
108 - smartctlExec, err := s.initSmartctlCli()
100 + smartctlExec, err := c.initSmartctlCli()
101 if err != nil {
102 return fmt.Errorf("smartctl exec initialization: %v", err)
103 }
112 - s.exec = smartctlExec
104 + c.exec = smartctlExec
105
106 return nil
107 }
108
117 -func (s *Smartctl) Check() error {
118 - mx, err := s.collect()
109 +func (c *Collector) Check() error {
110 + mx, err := c.collect()
111 if err != nil {
112 return err
113 }
@@ -127,14 +119,14 @@ func (s *Smartctl) Check() error {
119 return nil
120 }
121
130 -func (s *Smartctl) Charts() *module.Charts {
131 - return s.charts
122 +func (c *Collector) Charts() *module.Charts {
123 + return c.charts
124 }
125
134 -func (s *Smartctl) Collect() map[string]int64 {
135 - mx, err := s.collect()
126 +func (c *Collector) Collect() map[string]int64 {
127 + mx, err := c.collect()
128 if err != nil {
137 - s.Error(err)
129 + c.Error(err)
130 }
131
132 if len(mx) == 0 {
@@ -144,4 +136,4 @@ func (s *Smartctl) Collect() map[string]int64 {
136 return mx
137 }
138
147 -func (s *Smartctl) Cleanup() {}
139 +func (c *Collector) Cleanup() {}
src/go/plugin/go.d/collector/smartctl/collector_test.go renamed
+35 -35
@@ -54,11 +54,11 @@ func Test_testDataIsValid(t *testing.T) {
54 }
55 }
56
57 -func TestSmartctl_ConfigurationSerialize(t *testing.T) {
58 - module.TestConfigurationSerialize(t, &Smartctl{}, dataConfigJSON, dataConfigYAML)
57 +func TestCollector_ConfigurationSerialize(t *testing.T) {
58 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
59 }
60
61 -func TestSmartctl_Init(t *testing.T) {
61 +func TestCollector_Init(t *testing.T) {
62 tests := map[string]struct {
63 config Config
64 wantFail bool
@@ -79,54 +79,54 @@ func TestSmartctl_Init(t *testing.T) {
79
80 for name, test := range tests {
81 t.Run(name, func(t *testing.T) {
82 - smart := New()
82 + collr := New()
83
84 if test.wantFail {
85 - assert.Error(t, smart.Init())
85 + assert.Error(t, collr.Init())
86 } else {
87 - assert.NoError(t, smart.Init())
87 + assert.NoError(t, collr.Init())
88 }
89 })
90 }
91 }
92
93 -func TestSmartctl_Cleanup(t *testing.T) {
93 +func TestCollector_Cleanup(t *testing.T) {
94 tests := map[string]struct {
95 - prepare func() *Smartctl
95 + prepare func() *Collector
96 }{
97 "not initialized exec": {
98 - prepare: func() *Smartctl {
98 + prepare: func() *Collector {
99 return New()
100 },
101 },
102 "after check": {
103 - prepare: func() *Smartctl {
104 - smart := New()
105 - smart.exec = prepareMockOkTypeSata()
106 - _ = smart.Check()
107 - return smart
103 + prepare: func() *Collector {
104 + collr := New()
105 + collr.exec = prepareMockOkTypeSata()
106 + _ = collr.Check()
107 + return collr
108 },
109 },
110 "after collect": {
111 - prepare: func() *Smartctl {
112 - smart := New()
113 - smart.exec = prepareMockOkTypeSata()
114 - _ = smart.Collect()
115 - return smart
111 + prepare: func() *Collector {
112 + collr := New()
113 + collr.exec = prepareMockOkTypeSata()
114 + _ = collr.Collect()
115 + return collr
116 },
117 },
118 }
119
120 for name, test := range tests {
121 t.Run(name, func(t *testing.T) {
122 - smart := test.prepare()
122 + collr := test.prepare()
123
124 - assert.NotPanics(t, smart.Cleanup)
124 + assert.NotPanics(t, collr.Cleanup)
125 })
126 }
127 }
128
129 -func TestSmartctl_Check(t *testing.T) {
129 +func TestCollector_Check(t *testing.T) {
130 tests := map[string]struct {
131 prepareMock func() *mockSmartctlCliExec
132 wantFail bool
@@ -155,20 +155,20 @@ func TestSmartctl_Check(t *testing.T) {
155
156 for name, test := range tests {
157 t.Run(name, func(t *testing.T) {
158 - smart := New()
158 + collr := New()
159 mock := test.prepareMock()
160 - smart.exec = mock
160 + collr.exec = mock
161
162 if test.wantFail {
163 - assert.Error(t, smart.Check())
163 + assert.Error(t, collr.Check())
164 } else {
165 - assert.NoError(t, smart.Check())
165 + assert.NoError(t, collr.Check())
166 }
167 })
168 }
169 }
170
171 -func TestSmartctl_Collect(t *testing.T) {
171 +func TestCollector_Collect(t *testing.T) {
172 tests := map[string]struct {
173 prepareMock func() *mockSmartctlCliExec
174 prepareConfig func() Config
@@ -353,25 +353,25 @@ func TestSmartctl_Collect(t *testing.T) {
353
354 for name, test := range tests {
355 t.Run(name, func(t *testing.T) {
356 - smart := New()
356 + collr := New()
357 if test.prepareConfig != nil {
358 - smart.Config = test.prepareConfig()
358 + collr.Config = test.prepareConfig()
359 }
360 mock := test.prepareMock()
361 - smart.exec = mock
362 - smart.ScanEvery = confopt.Duration(time.Microsecond * 1)
363 - smart.PollDevicesEvery = confopt.Duration(time.Microsecond * 1)
361 + collr.exec = mock
362 + collr.ScanEvery = confopt.Duration(time.Microsecond * 1)
363 + collr.PollDevicesEvery = confopt.Duration(time.Microsecond * 1)
364
365 var mx map[string]int64
366 for i := 0; i < 10; i++ {
367 - mx = smart.Collect()
367 + mx = collr.Collect()
368 }
369
370 assert.Equal(t, test.wantMetrics, mx)
371
372 - assert.Len(t, *smart.Charts(), test.wantCharts, "wantCharts")
372 + assert.Len(t, *collr.Charts(), test.wantCharts, "wantCharts")
373
374 - module.TestMetricsHasAllChartsDims(t, smart.Charts(), mx)
374 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
375 })
376 }
377 }
src/go/plugin/go.d/collector/smartctl/exec.go
+5
@@ -16,6 +16,11 @@ import (
16 "github.com/tidwall/gjson"
17 )
18
19 +type smartctlCli interface {
20 + scan(open bool) (*gjson.Result, error)
21 + deviceInfo(deviceName, deviceType, powerMode string) (*gjson.Result, error)
22 +}
23 +
24 func newSmartctlCliExec(ndsudoPath string, timeout time.Duration, log *logger.Logger) *smartctlCliExec {
25 return &smartctlCliExec{
26 Logger: log,
src/go/plugin/go.d/collector/smartctl/init.go
+9 -9
@@ -13,14 +13,14 @@ import (
13 "github.com/netdata/netdata/go/plugins/pkg/matcher"
14 )
15
16 -func (s *Smartctl) validateConfig() error {
17 - switch s.NoCheckPowerMode {
16 +func (c *Collector) validateConfig() error {
17 + switch c.NoCheckPowerMode {
18 case "never", "sleep", "standby", "idle":
19 default:
20 - return fmt.Errorf("invalid power mode '%s'", s.NoCheckPowerMode)
20 + return fmt.Errorf("invalid power mode '%s'", c.NoCheckPowerMode)
21 }
22
23 - for _, v := range s.ExtraDevices {
23 + for _, v := range c.ExtraDevices {
24 if v.Name == "" || v.Type == "" {
25 return fmt.Errorf("invalid extra device: name and type must both be provided, got name='%s' type='%s'", v.Name, v.Type)
26 }
@@ -29,12 +29,12 @@ func (s *Smartctl) validateConfig() error {
29 return nil
30 }
31
32 -func (s *Smartctl) initDeviceSelector() (matcher.Matcher, error) {
33 - if s.DeviceSelector == "" {
32 +func (c *Collector) initDeviceSelector() (matcher.Matcher, error) {
33 + if c.DeviceSelector == "" {
34 return matcher.TRUE(), nil
35 }
36
37 - m, err := matcher.NewSimplePatternsMatcher(s.DeviceSelector)
37 + m, err := matcher.NewSimplePatternsMatcher(c.DeviceSelector)
38 if err != nil {
39 return nil, err
40 }
@@ -42,14 +42,14 @@ func (s *Smartctl) initDeviceSelector() (matcher.Matcher, error) {
42 return m, nil
43 }
44
45 -func (s *Smartctl) initSmartctlCli() (smartctlCli, error) {
45 +func (c *Collector) initSmartctlCli() (smartctlCli, error) {
46 ndsudoPath := filepath.Join(executable.Directory, "ndsudo")
47 if _, err := os.Stat(ndsudoPath); err != nil {
48 return nil, fmt.Errorf("ndsudo executable not found: %v", err)
49
50 }
51
52 - smartctlExec := newSmartctlCliExec(ndsudoPath, s.Timeout.Duration(), s.Logger)
52 + smartctlExec := newSmartctlCliExec(ndsudoPath, c.Timeout.Duration(), c.Logger)
53
54 return smartctlExec, nil
55 }
src/go/plugin/go.d/collector/smartctl/scan.go
+17 -17
@@ -25,16 +25,16 @@ func (s *scanDevice) shortName() string {
25 return strings.TrimPrefix(s.name, "/dev/")
26 }
27
28 -func (s *Smartctl) scanDevices() (map[string]*scanDevice, error) {
28 +func (c *Collector) scanDevices() (map[string]*scanDevice, error) {
29 // Issue on Discord: https://discord.com/channels/847502280503590932/1261747175361347644/1261747175361347644
30 // "sat" devices being identified as "scsi" with --scan, and then later
31 // code attempts to validate the type by calling `smartctl` with the "scsi" type.
32 // This validation can trigger unintended "Enabling discard_zeroes_data" messages in system logs (dmesg).
33 // To address this specific issue we use `smartctl --scan-open` as a workaround.
34 // This method reliably identifies device types.
35 - scanOpen := s.NoCheckPowerMode == "never"
35 + scanOpen := c.NoCheckPowerMode == "never"
36
37 - resp, err := s.exec.scan(scanOpen)
37 + resp, err := c.exec.scan(scanOpen)
38 if err != nil {
39 return nil, fmt.Errorf("failed to scan devices: %v", err)
40 }
@@ -49,12 +49,12 @@ func (s *Smartctl) scanDevices() (map[string]*scanDevice, error) {
49 }
50
51 if dev.name == "" || dev.typ == "" {
52 - s.Warningf("device info missing required fields (name: '%s', type: '%s'), skipping", dev.name, dev.typ)
52 + c.Warningf("device info missing required fields (name: '%s', type: '%s'), skipping", dev.name, dev.typ)
53 continue
54 }
55
56 - if !s.deviceSr.MatchString(dev.infoName) {
57 - s.Debugf("device %s does not match selector, skipping it", dev.infoName)
56 + if !c.deviceSr.MatchString(dev.infoName) {
57 + c.Debugf("device %s does not match selector, skipping it", dev.infoName)
58 continue
59 }
60
@@ -64,17 +64,17 @@ func (s *Smartctl) scanDevices() (map[string]*scanDevice, error) {
64 // Using the wrong type can lead to issues.
65 // For example, using 'scsi' for 'sat' devices prevents `smartctl` from issuing the necessary ATA commands.
66
67 - s.handleGuessedScsiScannedDevice(dev)
67 + c.handleGuessedScsiScannedDevice(dev)
68 }
69
70 - s.Debugf("smartctl scan found device '%s' type '%s' info_name '%s'", dev.name, dev.typ, dev.infoName)
70 + c.Debugf("smartctl scan found device '%s' type '%s' info_name '%s'", dev.name, dev.typ, dev.infoName)
71
72 devices[dev.key()] = dev
73 }
74
75 - s.Debugf("smartctl scan found %d devices", len(devices))
75 + c.Debugf("smartctl scan found %d devices", len(devices))
76
77 - for _, v := range s.ExtraDevices {
77 + for _, v := range c.ExtraDevices {
78 dev := &scanDevice{name: v.Name, typ: v.Type, extra: true}
79
80 if _, ok := devices[dev.key()]; !ok {
@@ -89,19 +89,19 @@ func (s *Smartctl) scanDevices() (map[string]*scanDevice, error) {
89 return devices, nil
90 }
91
92 -func (s *Smartctl) handleGuessedScsiScannedDevice(dev *scanDevice) {
93 - if dev.typ != "scsi" || s.hasScannedDevice(dev) {
92 +func (c *Collector) handleGuessedScsiScannedDevice(dev *scanDevice) {
93 + if dev.typ != "scsi" || c.hasScannedDevice(dev) {
94 return
95 }
96
97 d := &scanDevice{name: dev.name, typ: "sat"}
98
99 - if s.hasScannedDevice(d) {
99 + if c.hasScannedDevice(d) {
100 dev.typ = d.typ
101 return
102 }
103
104 - resp, _ := s.exec.deviceInfo(dev.name, "sat", s.NoCheckPowerMode)
104 + resp, _ := c.exec.deviceInfo(dev.name, "sat", c.NoCheckPowerMode)
105 if resp == nil || isExitStatusHasAnyBit(resp, 0, 1, 2) {
106 return
107 }
@@ -111,11 +111,11 @@ func (s *Smartctl) handleGuessedScsiScannedDevice(dev *scanDevice) {
111 return
112 }
113
114 - s.Debugf("changing device '%s' type 'scsi' -> 'sat'", dev.name)
114 + c.Debugf("changing device '%s' type 'scsi' -> 'sat'", dev.name)
115 dev.typ = "sat"
116 }
117
118 -func (s *Smartctl) hasScannedDevice(d *scanDevice) bool {
119 - _, ok := s.scannedDevices[d.key()]
118 +func (c *Collector) hasScannedDevice(d *scanDevice) bool {
119 + _, ok := c.scannedDevices[d.key()]
120 return ok
121 }
src/go/plugin/go.d/collector/snmp/charts.go
+12 -12
@@ -156,14 +156,14 @@ var (
156 }
157 )
158
159 -func (s *SNMP) addNetIfaceCharts(iface *netInterface) {
159 +func (c *Collector) addNetIfaceCharts(iface *netInterface) {
160 charts := netIfaceChartsTmpl.Copy()
161
162 for _, chart := range *charts {
163 chart.ID = fmt.Sprintf(chart.ID, cleanIfaceName(iface.ifName))
164 chart.Labels = []module.Label{
165 - {Key: "vendor", Value: s.sysInfo.organization},
166 - {Key: "sysName", Value: s.sysInfo.name},
165 + {Key: "vendor", Value: c.sysInfo.organization},
166 + {Key: "sysName", Value: c.sysInfo.name},
167 {Key: "ifDescr", Value: iface.ifDescr},
168 {Key: "ifName", Value: iface.ifName},
169 {Key: "ifType", Value: ifTypeMapping[iface.ifType]},
@@ -173,14 +173,14 @@ func (s *SNMP) addNetIfaceCharts(iface *netInterface) {
173 }
174 }
175
176 - if err := s.Charts().Add(*charts...); err != nil {
177 - s.Warning(err)
176 + if err := c.Charts().Add(*charts...); err != nil {
177 + c.Warning(err)
178 }
179 }
180
181 -func (s *SNMP) removeNetIfaceCharts(iface *netInterface) {
181 +func (c *Collector) removeNetIfaceCharts(iface *netInterface) {
182 px := fmt.Sprintf("snmp_device_net_iface_%s_", cleanIfaceName(iface.ifName))
183 - for _, chart := range *s.Charts() {
183 + for _, chart := range *c.Charts() {
184 if strings.HasPrefix(chart.ID, px) {
185 chart.MarkRemove()
186 chart.MarkNotCreated()
@@ -188,14 +188,14 @@ func (s *SNMP) removeNetIfaceCharts(iface *netInterface) {
188 }
189 }
190
191 -func (s *SNMP) addSysUptimeChart() {
191 +func (c *Collector) addSysUptimeChart() {
192 chart := uptimeChart.Copy()
193 chart.Labels = []module.Label{
194 - {Key: "vendor", Value: s.sysInfo.organization},
195 - {Key: "sysName", Value: s.sysInfo.name},
194 + {Key: "vendor", Value: c.sysInfo.organization},
195 + {Key: "sysName", Value: c.sysInfo.name},
196 }
197 - if err := s.Charts().Add(chart); err != nil {
198 - s.Warning(err)
197 + if err := c.Charts().Add(chart); err != nil {
198 + c.Warning(err)
199 }
200 }
201
src/go/plugin/go.d/collector/snmp/collect.go
+24 -24
@@ -13,35 +13,35 @@ import (
13 "github.com/gosnmp/gosnmp"
14 )
15
16 -func (s *SNMP) collect() (map[string]int64, error) {
17 - if s.sysInfo == nil {
18 - si, err := s.getSysInfo()
16 +func (c *Collector) collect() (map[string]int64, error) {
17 + if c.sysInfo == nil {
18 + si, err := c.getSysInfo()
19 if err != nil {
20 return nil, err
21 }
22
23 - s.sysInfo = si
24 - s.addSysUptimeChart()
23 + c.sysInfo = si
24 + c.addSysUptimeChart()
25
26 - if s.CreateVnode {
27 - s.vnode = s.setupVnode(si)
26 + if c.CreateVnode {
27 + c.vnode = c.setupVnode(si)
28 }
29 }
30
31 mx := make(map[string]int64)
32
33 - if err := s.collectSysUptime(mx); err != nil {
33 + if err := c.collectSysUptime(mx); err != nil {
34 return nil, err
35 }
36
37 - if s.collectIfMib {
38 - if err := s.collectNetworkInterfaces(mx); err != nil {
37 + if c.collectIfMib {
38 + if err := c.collectNetworkInterfaces(mx); err != nil {
39 return nil, err
40 }
41 }
42
43 - if len(s.customOids) > 0 {
44 - if err := s.collectOIDs(mx); err != nil {
43 + if len(c.customOids) > 0 {
44 + if err := c.collectOIDs(mx); err != nil {
45 return nil, err
46 }
47 }
@@ -49,26 +49,26 @@ func (s *SNMP) collect() (map[string]int64, error) {
49 return mx, nil
50 }
51
52 -func (s *SNMP) walkAll(rootOid string) ([]gosnmp.SnmpPDU, error) {
53 - if s.snmpClient.Version() == gosnmp.Version1 {
54 - return s.snmpClient.WalkAll(rootOid)
52 +func (c *Collector) walkAll(rootOid string) ([]gosnmp.SnmpPDU, error) {
53 + if c.snmpClient.Version() == gosnmp.Version1 {
54 + return c.snmpClient.WalkAll(rootOid)
55 }
56 - return s.snmpClient.BulkWalkAll(rootOid)
56 + return c.snmpClient.BulkWalkAll(rootOid)
57 }
58
59 -func (s *SNMP) setupVnode(si *sysInfo) *vnodes.VirtualNode {
60 - if s.Vnode.GUID == "" {
61 - s.Vnode.GUID = uuid.NewSHA1(uuid.NameSpaceDNS, []byte(s.Hostname)).String()
59 +func (c *Collector) setupVnode(si *sysInfo) *vnodes.VirtualNode {
60 + if c.Vnode.GUID == "" {
61 + c.Vnode.GUID = uuid.NewSHA1(uuid.NameSpaceDNS, []byte(c.Hostname)).String()
62 }
63
64 - hostnames := []string{s.Vnode.Hostname, si.name, "snmp-device"}
64 + hostnames := []string{c.Vnode.Hostname, si.name, "snmp-device"}
65 i := slices.IndexFunc(hostnames, func(s string) bool { return s != "" })
66
67 - s.Vnode.Hostname = fmt.Sprintf("%s(%s)", hostnames[i], s.Hostname)
67 + c.Vnode.Hostname = fmt.Sprintf("%s(%s)", hostnames[i], c.Hostname)
68
69 labels := make(map[string]string)
70
71 - for k, v := range s.Vnode.Labels {
71 + for k, v := range c.Vnode.Labels {
72 labels[k] = v
73 }
74 if si.descr != "" {
@@ -84,8 +84,8 @@ func (s *SNMP) setupVnode(si *sysInfo) *vnodes.VirtualNode {
84 labels["vendor"] = si.organization
85
86 return &vnodes.VirtualNode{
87 - GUID: s.Vnode.GUID,
88 - Hostname: s.Vnode.Hostname,
87 + GUID: c.Vnode.GUID,
88 + Hostname: c.Vnode.Hostname,
89 Labels: labels,
90 }
91 }
src/go/plugin/go.d/collector/snmp/collect_custom_oids.go
+8 -8
@@ -6,16 +6,16 @@ import (
6 "github.com/gosnmp/gosnmp"
7 )
8
9 -func (s *SNMP) collectOIDs(mx map[string]int64) error {
10 - for i, end := 0, 0; i < len(s.customOids); i += s.Options.MaxOIDs {
11 - if end = i + s.Options.MaxOIDs; end > len(s.customOids) {
12 - end = len(s.customOids)
9 +func (c *Collector) collectOIDs(mx map[string]int64) error {
10 + for i, end := 0, 0; i < len(c.customOids); i += c.Options.MaxOIDs {
11 + if end = i + c.Options.MaxOIDs; end > len(c.customOids) {
12 + end = len(c.customOids)
13 }
14
15 - oids := s.customOids[i:end]
16 - resp, err := s.snmpClient.Get(oids)
15 + oids := c.customOids[i:end]
16 + resp, err := c.snmpClient.Get(oids)
17 if err != nil {
18 - s.Errorf("cannot get SNMP data: %v", err)
18 + c.Errorf("cannot get SNMP data: %v", err)
19 return err
20 }
21
@@ -36,7 +36,7 @@ func (s *SNMP) collectOIDs(mx map[string]int64) error {
36 gosnmp.Integer:
37 mx[oid] = gosnmp.ToBigInt(v.Value).Int64()
38 default:
39 - s.Debugf("skipping OID '%s' (unsupported type '%s')", oid, v.Type)
39 + c.Debugf("skipping OID '%s' (unsupported type '%s')", oid, v.Type)
40 }
41 }
42 }
src/go/plugin/go.d/collector/snmp/collect_if_mib.go
+29 -29
@@ -19,44 +19,44 @@ const (
19 rootOidIfMibIfXTable = "1.3.6.1.2.1.31.1.1"
20 )
21
22 -func (s *SNMP) collectNetworkInterfaces(mx map[string]int64) error {
23 - if s.checkMaxReps {
24 - ok, err := s.adjustMaxRepetitions()
22 +func (c *Collector) collectNetworkInterfaces(mx map[string]int64) error {
23 + if c.checkMaxReps {
24 + ok, err := c.adjustMaxRepetitions()
25 if err != nil {
26 return err
27 }
28
29 - s.checkMaxReps = false
29 + c.checkMaxReps = false
30
31 if !ok {
32 - s.collectIfMib = false
32 + c.collectIfMib = false
33
34 - if len(s.customOids) == 0 {
34 + if len(c.customOids) == 0 {
35 return errors.New("no IF-MIB data returned")
36 }
37
38 - s.Warning("no IF-MIB data returned")
38 + c.Warning("no IF-MIB data returned")
39 return nil
40 }
41 }
42
43 - ifMibTable, err := s.walkAll(rootOidIfMibIfTable)
43 + ifMibTable, err := c.walkAll(rootOidIfMibIfTable)
44 if err != nil {
45 return err
46 }
47
48 - ifMibXTable, err := s.walkAll(rootOidIfMibIfXTable)
48 + ifMibXTable, err := c.walkAll(rootOidIfMibIfXTable)
49 if err != nil {
50 return err
51 }
52
53 if len(ifMibTable) == 0 && len(ifMibXTable) == 0 {
54 - s.Warning("no IF-MIB data returned")
55 - s.collectIfMib = false
54 + c.Warning("no IF-MIB data returned")
55 + c.collectIfMib = false
56 return nil
57 }
58
59 - for _, i := range s.netInterfaces {
59 + for _, i := range c.netInterfaces {
60 i.updated = false
61 }
62
@@ -73,7 +73,7 @@ func (s *SNMP) collectNetworkInterfaces(mx map[string]int64) error {
73 idx := pdu.Name[i+1:]
74 oid := strings.TrimPrefix(pdu.Name[:i], ".")
75
76 - iface, ok := s.netInterfaces[idx]
76 + iface, ok := c.netInterfaces[idx]
77 if !ok {
78 iface = &netInterface{idx: idx}
79 }
@@ -153,30 +153,30 @@ func (s *SNMP) collectNetworkInterfaces(mx map[string]int64) error {
153 return fmt.Errorf("OID '%s': %v", pdu.Name, err)
154 }
155
156 - s.netInterfaces[idx] = iface
156 + c.netInterfaces[idx] = iface
157 iface.updated = true
158 }
159
160 - for _, iface := range s.netInterfaces {
160 + for _, iface := range c.netInterfaces {
161 if iface.ifName == "" {
162 continue
163 }
164
165 typeStr := ifTypeMapping[iface.ifType]
166 - if s.netIfaceFilterByName.MatchString(iface.ifName) || s.netIfaceFilterByType.MatchString(typeStr) {
166 + if c.netIfaceFilterByName.MatchString(iface.ifName) || c.netIfaceFilterByType.MatchString(typeStr) {
167 continue
168 }
169
170 if !iface.updated {
171 - delete(s.netInterfaces, iface.idx)
171 + delete(c.netInterfaces, iface.idx)
172 if iface.hasCharts {
173 - s.removeNetIfaceCharts(iface)
173 + c.removeNetIfaceCharts(iface)
174 }
175 continue
176 }
177 if !iface.hasCharts {
178 iface.hasCharts = true
179 - s.addNetIfaceCharts(iface)
179 + c.addNetIfaceCharts(iface)
180 }
181
182 px := fmt.Sprintf("net_iface_%s_", iface.ifName)
@@ -205,32 +205,32 @@ func (s *SNMP) collectNetworkInterfaces(mx map[string]int64) error {
205 }
206
207 if logger.Level.Enabled(slog.LevelDebug) {
208 - ifaces := make([]*netInterface, 0, len(s.netInterfaces))
209 - for _, nif := range s.netInterfaces {
208 + ifaces := make([]*netInterface, 0, len(c.netInterfaces))
209 + for _, nif := range c.netInterfaces {
210 ifaces = append(ifaces, nif)
211 }
212 sort.Slice(ifaces, func(i, j int) bool { return ifaces[i].ifIndex < ifaces[j].ifIndex })
213 for _, iface := range ifaces {
214 - s.Debugf("found %s", iface)
214 + c.Debugf("found %s", iface)
215 }
216 }
217
218 return nil
219 }
220
221 -func (s *SNMP) adjustMaxRepetitions() (bool, error) {
222 - orig := s.Config.Options.MaxRepetitions
223 - maxReps := s.Config.Options.MaxRepetitions
221 +func (c *Collector) adjustMaxRepetitions() (bool, error) {
222 + orig := c.Config.Options.MaxRepetitions
223 + maxReps := c.Config.Options.MaxRepetitions
224
225 for {
226 - v, err := s.walkAll(oidIfIndex)
226 + v, err := c.walkAll(oidIfIndex)
227 if err != nil {
228 return false, err
229 }
230
231 if len(v) > 0 {
232 if orig != maxReps {
233 - s.Infof("changed 'max_repetitions' %d => %d", orig, maxReps)
233 + c.Infof("changed 'max_repetitions' %d => %d", orig, maxReps)
234 }
235 return true, nil
236 }
@@ -245,7 +245,7 @@ func (s *SNMP) adjustMaxRepetitions() (bool, error) {
245 return false, nil
246 }
247
248 - s.Debugf("no IF-MIB data returned, trying to decrese 'max_repetitions' to %d", maxReps)
249 - s.snmpClient.SetMaxRepetitions(uint32(maxReps))
248 + c.Debugf("no IF-MIB data returned, trying to decrese 'max_repetitions' to %d", maxReps)
249 + c.snmpClient.SetMaxRepetitions(uint32(maxReps))
250 }
251 }
src/go/plugin/go.d/collector/snmp/collect_sys_info.go
+5 -5
@@ -29,8 +29,8 @@ type sysInfo struct {
29 organization string
30 }
31
32 -func (s *SNMP) getSysInfo() (*sysInfo, error) {
33 - pdus, err := s.snmpClient.WalkAll(rootOidMibSystem)
32 +func (c *Collector) getSysInfo() (*sysInfo, error) {
33 + pdus, err := c.snmpClient.WalkAll(rootOidMibSystem)
34 if err != nil {
35 return nil, err
36 }
@@ -54,7 +54,7 @@ func (s *SNMP) getSysInfo() (*sysInfo, error) {
54 var sysObj string
55 if sysObj, err = pduToString(pdu); err == nil {
56 si.organization = entnum.LookupBySysObject(sysObj)
57 - s.Debugf("device sysObject '%s', organization '%s'", sysObj, si.organization)
57 + c.Debugf("device sysObject '%s', organization '%s'", sysObj, si.organization)
58 }
59 case oidSysContact:
60 si.contact, err = pduToString(pdu)
@@ -71,8 +71,8 @@ func (s *SNMP) getSysInfo() (*sysInfo, error) {
71 return si, nil
72 }
73
74 -func (s *SNMP) collectSysUptime(mx map[string]int64) error {
75 - resp, err := s.snmpClient.Get([]string{oidSysUptime})
74 +func (c *Collector) collectSysUptime(mx map[string]int64) error {
75 + resp, err := c.snmpClient.Get([]string{oidSysUptime})
76 if err != nil {
77 return err
78 }
src/go/plugin/go.d/collector/snmp/collector.go renamed
+27 -27
@@ -28,8 +28,8 @@ func init() {
28 })
29 }
30
31 -func New() *SNMP {
32 - return &SNMP{
31 +func New() *Collector {
32 + return &Collector{
33 Config: Config{
34 Community: "public",
35 Options: Options{
@@ -55,7 +55,7 @@ func New() *SNMP {
55 }
56 }
57
58 -type SNMP struct {
58 +type Collector struct {
59 module.Base
60 Config `yaml:",inline" json:""`
61
@@ -79,17 +79,17 @@ type SNMP struct {
79 customOids []string
80 }
81
82 -func (s *SNMP) Configuration() any {
83 - return s.Config
82 +func (c *Collector) Configuration() any {
83 + return c.Config
84 }
85
86 -func (s *SNMP) Init() error {
87 - err := s.validateConfig()
86 +func (c *Collector) Init() error {
87 + err := c.validateConfig()
88 if err != nil {
89 return fmt.Errorf("config validation failed: %v", err)
90 }
91
92 - snmpClient, err := s.initSNMPClient()
92 + snmpClient, err := c.initSNMPClient()
93 if err != nil {
94 return fmt.Errorf("failed to initialize SNMP client: %v", err)
95 }
@@ -98,28 +98,28 @@ func (s *SNMP) Init() error {
98 if err != nil {
99 return fmt.Errorf("SNMP client connection failed: %v", err)
100 }
101 - s.snmpClient = snmpClient
101 + c.snmpClient = snmpClient
102
103 - byName, byType, err := s.initNetIfaceFilters()
103 + byName, byType, err := c.initNetIfaceFilters()
104 if err != nil {
105 return fmt.Errorf("failed to initialize network interface filters: %v", err)
106 }
107 - s.netIfaceFilterByName = byName
108 - s.netIfaceFilterByType = byType
107 + c.netIfaceFilterByName = byName
108 + c.netIfaceFilterByType = byType
109
110 - charts, err := newUserInputCharts(s.ChartsInput)
110 + charts, err := newUserInputCharts(c.ChartsInput)
111 if err != nil {
112 return fmt.Errorf("failed to create user charts: %v", err)
113 }
114 - s.charts = charts
114 + c.charts = charts
115
116 - s.customOids = s.initOIDs()
116 + c.customOids = c.initOIDs()
117
118 return nil
119 }
120
121 -func (s *SNMP) Check() error {
122 - mx, err := s.collect()
121 +func (c *Collector) Check() error {
122 + mx, err := c.collect()
123 if err != nil {
124 return err
125 }
@@ -131,14 +131,14 @@ func (s *SNMP) Check() error {
131 return nil
132 }
133
134 -func (s *SNMP) Charts() *module.Charts {
135 - return s.charts
134 +func (c *Collector) Charts() *module.Charts {
135 + return c.charts
136 }
137
138 -func (s *SNMP) Collect() map[string]int64 {
139 - mx, err := s.collect()
138 +func (c *Collector) Collect() map[string]int64 {
139 + mx, err := c.collect()
140 if err != nil {
141 - s.Error(err)
141 + c.Error(err)
142 }
143
144 if len(mx) == 0 {
@@ -148,12 +148,12 @@ func (s *SNMP) Collect() map[string]int64 {
148 return mx
149 }
150
151 -func (s *SNMP) Cleanup() {
152 - if s.snmpClient != nil {
153 - _ = s.snmpClient.Close()
151 +func (c *Collector) Cleanup() {
152 + if c.snmpClient != nil {
153 + _ = c.snmpClient.Close()
154 }
155 }
156
157 -func (s *SNMP) VirtualNode() *vnodes.VirtualNode {
158 - return s.vnode
157 +func (c *Collector) VirtualNode() *vnodes.VirtualNode {
158 + return c.vnode
159 }
src/go/plugin/go.d/collector/snmp/collector_test.go renamed
+104 -104
@@ -33,99 +33,99 @@ func Test_testDataIsValid(t *testing.T) {
33 }
34 }
35
36 -func TestSNMP_ConfigurationSerialize(t *testing.T) {
37 - module.TestConfigurationSerialize(t, &SNMP{}, dataConfigJSON, dataConfigYAML)
36 +func TestCollector_ConfigurationSerialize(t *testing.T) {
37 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
38 }
39
40 -func TestSNMP_Init(t *testing.T) {
40 +func TestCollector_Init(t *testing.T) {
41 tests := map[string]struct {
42 - prepareSNMP func() *SNMP
42 + prepareSNMP func() *Collector
43 wantFail bool
44 }{
45 "fail with default config": {
46 wantFail: true,
47 - prepareSNMP: func() *SNMP {
47 + prepareSNMP: func() *Collector {
48 return New()
49 },
50 },
51 "fail when using SNMPv3 but 'user.name' not set": {
52 wantFail: true,
53 - prepareSNMP: func() *SNMP {
54 - snmp := New()
55 - snmp.Config = prepareV3Config()
56 - snmp.User.Name = ""
57 - return snmp
53 + prepareSNMP: func() *Collector {
54 + collr := New()
55 + collr.Config = prepareV3Config()
56 + collr.User.Name = ""
57 + return collr
58 },
59 },
60 "success when using SNMPv1 with valid config": {
61 wantFail: false,
62 - prepareSNMP: func() *SNMP {
63 - snmp := New()
64 - snmp.Config = prepareV1Config()
65 - return snmp
62 + prepareSNMP: func() *Collector {
63 + collr := New()
64 + collr.Config = prepareV1Config()
65 + return collr
66 },
67 },
68 "success when using SNMPv2 with valid config": {
69 wantFail: false,
70 - prepareSNMP: func() *SNMP {
71 - snmp := New()
72 - snmp.Config = prepareV2Config()
73 - return snmp
70 + prepareSNMP: func() *Collector {
71 + collr := New()
72 + collr.Config = prepareV2Config()
73 + return collr
74 },
75 },
76 "success when using SNMPv3 with valid config": {
77 wantFail: false,
78 - prepareSNMP: func() *SNMP {
79 - snmp := New()
80 - snmp.Config = prepareV3Config()
81 - return snmp
78 + prepareSNMP: func() *Collector {
79 + collr := New()
80 + collr.Config = prepareV3Config()
81 + return collr
82 },
83 },
84 }
85
86 for name, test := range tests {
87 t.Run(name, func(t *testing.T) {
88 - snmp := test.prepareSNMP()
88 + collr := test.prepareSNMP()
89
90 if test.wantFail {
91 - assert.Error(t, snmp.Init())
91 + assert.Error(t, collr.Init())
92 } else {
93 - assert.NoError(t, snmp.Init())
93 + assert.NoError(t, collr.Init())
94 }
95 })
96 }
97 }
98
99 -func TestSNMP_Cleanup(t *testing.T) {
99 +func TestCollector_Cleanup(t *testing.T) {
100 tests := map[string]struct {
101 - prepareSNMP func(t *testing.T, m *snmpmock.MockHandler) *SNMP
101 + prepareSNMP func(t *testing.T, m *snmpmock.MockHandler) *Collector
102 }{
103 "cleanup call if snmpClient initialized": {
104 - prepareSNMP: func(t *testing.T, m *snmpmock.MockHandler) *SNMP {
105 - snmp := New()
106 - snmp.Config = prepareV2Config()
107 - snmp.newSnmpClient = func() gosnmp.Handler { return m }
104 + prepareSNMP: func(t *testing.T, m *snmpmock.MockHandler) *Collector {
105 + collr := New()
106 + collr.Config = prepareV2Config()
107 + collr.newSnmpClient = func() gosnmp.Handler { return m }
108 setMockClientInitExpect(m)
109
110 - require.NoError(t, snmp.Init())
110 + require.NoError(t, collr.Init())
111
112 m.EXPECT().Close().Times(1)
113
114 - return snmp
114 + return collr
115 },
116 },
117 "cleanup call does not panic if snmpClient not initialized": {
118 - prepareSNMP: func(t *testing.T, m *snmpmock.MockHandler) *SNMP {
119 - snmp := New()
120 - snmp.Config = prepareV2Config()
121 - snmp.newSnmpClient = func() gosnmp.Handler { return m }
118 + prepareSNMP: func(t *testing.T, m *snmpmock.MockHandler) *Collector {
119 + collr := New()
120 + collr.Config = prepareV2Config()
121 + collr.newSnmpClient = func() gosnmp.Handler { return m }
122 setMockClientInitExpect(m)
123
124 - require.NoError(t, snmp.Init())
124 + require.NoError(t, collr.Init())
125
126 - snmp.snmpClient = nil
126 + collr.snmpClient = nil
127
128 - return snmp
128 + return collr
129 },
130 },
131 }
@@ -135,39 +135,39 @@ func TestSNMP_Cleanup(t *testing.T) {
135 mockSNMP, cleanup := mockInit(t)
136 defer cleanup()
137
138 - snmp := test.prepareSNMP(t, mockSNMP)
138 + collr := test.prepareSNMP(t, mockSNMP)
139
140 - assert.NotPanics(t, snmp.Cleanup)
140 + assert.NotPanics(t, collr.Cleanup)
141 })
142 }
143 }
144
145 -func TestSNMP_Charts(t *testing.T) {
145 +func TestCollector_Charts(t *testing.T) {
146 tests := map[string]struct {
147 - prepareSNMP func(t *testing.T, m *snmpmock.MockHandler) *SNMP
147 + prepareSNMP func(t *testing.T, m *snmpmock.MockHandler) *Collector
148 wantNumCharts int
149 doCollect bool
150 }{
151 "if-mib, no custom": {
152 doCollect: true,
153 wantNumCharts: len(netIfaceChartsTmpl)*4 + 1,
154 - prepareSNMP: func(t *testing.T, m *snmpmock.MockHandler) *SNMP {
155 - snmp := New()
156 - snmp.Config = prepareV2Config()
154 + prepareSNMP: func(t *testing.T, m *snmpmock.MockHandler) *Collector {
155 + collr := New()
156 + collr.Config = prepareV2Config()
157 setMockClientSysExpect(m)
158 setMockClientIfMibExpect(m)
159
160 - return snmp
160 + return collr
161 },
162 },
163 "custom, no if-mib": {
164 wantNumCharts: 10,
165 - prepareSNMP: func(t *testing.T, m *snmpmock.MockHandler) *SNMP {
166 - snmp := New()
167 - snmp.Config = prepareConfigWithUserCharts(prepareV2Config(), 0, 9)
168 - snmp.collectIfMib = false
165 + prepareSNMP: func(t *testing.T, m *snmpmock.MockHandler) *Collector {
166 + collr := New()
167 + collr.Config = prepareConfigWithUserCharts(prepareV2Config(), 0, 9)
168 + collr.collectIfMib = false
169
170 - return snmp
170 + return collr
171 },
172 },
173 }
@@ -179,41 +179,41 @@ func TestSNMP_Charts(t *testing.T) {
179
180 setMockClientInitExpect(mockSNMP)
181
182 - snmp := test.prepareSNMP(t, mockSNMP)
183 - snmp.newSnmpClient = func() gosnmp.Handler { return mockSNMP }
182 + collr := test.prepareSNMP(t, mockSNMP)
183 + collr.newSnmpClient = func() gosnmp.Handler { return mockSNMP }
184
185 - require.NoError(t, snmp.Init())
185 + require.NoError(t, collr.Init())
186
187 if test.doCollect {
188 - _ = snmp.Collect()
188 + _ = collr.Collect()
189 }
190
191 - assert.Equal(t, test.wantNumCharts, len(*snmp.Charts()))
191 + assert.Equal(t, test.wantNumCharts, len(*collr.Charts()))
192 })
193 }
194 }
195
196 -func TestSNMP_Check(t *testing.T) {
196 +func TestCollector_Check(t *testing.T) {
197 tests := map[string]struct {
198 wantFail bool
199 - prepareSNMP func(m *snmpmock.MockHandler) *SNMP
199 + prepareSNMP func(m *snmpmock.MockHandler) *Collector
200 }{
201 "success when collecting IF-MIB": {
202 wantFail: false,
203 - prepareSNMP: func(m *snmpmock.MockHandler) *SNMP {
204 - snmp := New()
205 - snmp.Config = prepareV2Config()
203 + prepareSNMP: func(m *snmpmock.MockHandler) *Collector {
204 + collr := New()
205 + collr.Config = prepareV2Config()
206 setMockClientIfMibExpect(m)
207
208 - return snmp
208 + return collr
209 },
210 },
211 "success only custom OIDs supported type": {
212 wantFail: false,
213 - prepareSNMP: func(m *snmpmock.MockHandler) *SNMP {
214 - snmp := New()
215 - snmp.Config = prepareConfigWithUserCharts(prepareV2Config(), 0, 3)
216 - snmp.collectIfMib = false
213 + prepareSNMP: func(m *snmpmock.MockHandler) *Collector {
214 + collr := New()
215 + collr.Config = prepareConfigWithUserCharts(prepareV2Config(), 0, 3)
216 + collr.collectIfMib = false
217
218 m.EXPECT().Get(gomock.Any()).Return(&gosnmp.SnmpPacket{
219 Variables: []gosnmp.SnmpPDU{
@@ -228,19 +228,19 @@ func TestSNMP_Check(t *testing.T) {
228 },
229 }, nil).Times(1)
230
231 - return snmp
231 + return collr
232 },
233 },
234 "fail when snmp client Get fails": {
235 wantFail: true,
236 - prepareSNMP: func(m *snmpmock.MockHandler) *SNMP {
237 - snmp := New()
238 - snmp.Config = prepareConfigWithUserCharts(prepareV2Config(), 0, 3)
239 - snmp.collectIfMib = false
236 + prepareSNMP: func(m *snmpmock.MockHandler) *Collector {
237 + collr := New()
238 + collr.Config = prepareConfigWithUserCharts(prepareV2Config(), 0, 3)
239 + collr.collectIfMib = false
240
241 m.EXPECT().Get(gomock.Any()).Return(nil, errors.New("mock Get() error")).Times(1)
242
243 - return snmp
243 + return collr
244 },
245 },
246 }
@@ -253,33 +253,33 @@ func TestSNMP_Check(t *testing.T) {
253 setMockClientInitExpect(mockSNMP)
254 setMockClientSysExpect(mockSNMP)
255
256 - snmp := test.prepareSNMP(mockSNMP)
257 - snmp.newSnmpClient = func() gosnmp.Handler { return mockSNMP }
256 + collr := test.prepareSNMP(mockSNMP)
257 + collr.newSnmpClient = func() gosnmp.Handler { return mockSNMP }
258
259 - require.NoError(t, snmp.Init())
259 + require.NoError(t, collr.Init())
260
261 if test.wantFail {
262 - assert.Error(t, snmp.Check())
262 + assert.Error(t, collr.Check())
263 } else {
264 - assert.NoError(t, snmp.Check())
264 + assert.NoError(t, collr.Check())
265 }
266 })
267 }
268 }
269
270 -func TestSNMP_Collect(t *testing.T) {
270 +func TestCollector_Collect(t *testing.T) {
271 tests := map[string]struct {
272 - prepareSNMP func(m *snmpmock.MockHandler) *SNMP
272 + prepareSNMP func(m *snmpmock.MockHandler) *Collector
273 wantCollected map[string]int64
274 }{
275 "success only IF-MIB": {
276 - prepareSNMP: func(m *snmpmock.MockHandler) *SNMP {
277 - snmp := New()
278 - snmp.Config = prepareV2Config()
276 + prepareSNMP: func(m *snmpmock.MockHandler) *Collector {
277 + collr := New()
278 + collr.Config = prepareV2Config()
279
280 setMockClientIfMibExpect(m)
281
282 - return snmp
282 + return collr
283 },
284 wantCollected: map[string]int64{
285 "net_iface_ether1_admin_status_down": 0,
@@ -374,10 +374,10 @@ func TestSNMP_Collect(t *testing.T) {
374 },
375 },
376 "success only custom OIDs supported type": {
377 - prepareSNMP: func(m *snmpmock.MockHandler) *SNMP {
378 - snmp := New()
379 - snmp.Config = prepareConfigWithUserCharts(prepareV2Config(), 0, 3)
380 - snmp.collectIfMib = false
377 + prepareSNMP: func(m *snmpmock.MockHandler) *Collector {
378 + collr := New()
379 + collr.Config = prepareConfigWithUserCharts(prepareV2Config(), 0, 3)
380 + collr.collectIfMib = false
381
382 m.EXPECT().Get(gomock.Any()).Return(&gosnmp.SnmpPacket{
383 Variables: []gosnmp.SnmpPDU{
@@ -392,7 +392,7 @@ func TestSNMP_Collect(t *testing.T) {
392 },
393 }, nil).Times(1)
394
395 - return snmp
395 + return collr
396 },
397 wantCollected: map[string]int64{
398 "1.3.6.1.2.1.2.2.1.10.0": 10,
@@ -407,10 +407,10 @@ func TestSNMP_Collect(t *testing.T) {
407 },
408 },
409 "success only custom OIDs supported and unsupported type": {
410 - prepareSNMP: func(m *snmpmock.MockHandler) *SNMP {
411 - snmp := New()
412 - snmp.Config = prepareConfigWithUserCharts(prepareV2Config(), 0, 2)
413 - snmp.collectIfMib = false
410 + prepareSNMP: func(m *snmpmock.MockHandler) *Collector {
411 + collr := New()
412 + collr.Config = prepareConfigWithUserCharts(prepareV2Config(), 0, 2)
413 + collr.collectIfMib = false
414
415 m.EXPECT().Get(gomock.Any()).Return(&gosnmp.SnmpPacket{
416 Variables: []gosnmp.SnmpPDU{
@@ -423,7 +423,7 @@ func TestSNMP_Collect(t *testing.T) {
423 },
424 }, nil).Times(1)
425
426 - return snmp
426 + return collr
427 },
428 wantCollected: map[string]int64{
429 "1.3.6.1.2.1.2.2.1.10.0": 10,
@@ -433,10 +433,10 @@ func TestSNMP_Collect(t *testing.T) {
433 },
434 },
435 "success only custom OIDs unsupported type": {
436 - prepareSNMP: func(m *snmpmock.MockHandler) *SNMP {
437 - snmp := New()
438 - snmp.Config = prepareConfigWithUserCharts(prepareV2Config(), 0, 2)
439 - snmp.collectIfMib = false
436 + prepareSNMP: func(m *snmpmock.MockHandler) *Collector {
437 + collr := New()
438 + collr.Config = prepareConfigWithUserCharts(prepareV2Config(), 0, 2)
439 + collr.collectIfMib = false
440
441 m.EXPECT().Get(gomock.Any()).Return(&gosnmp.SnmpPacket{
442 Variables: []gosnmp.SnmpPDU{
@@ -449,7 +449,7 @@ func TestSNMP_Collect(t *testing.T) {
449 },
450 }, nil).Times(1)
451
452 - return snmp
452 + return collr
453 },
454 wantCollected: map[string]int64{
455 "uptime": 60,
@@ -465,12 +465,12 @@ func TestSNMP_Collect(t *testing.T) {
465 setMockClientInitExpect(mockSNMP)
466 setMockClientSysExpect(mockSNMP)
467
468 - snmp := test.prepareSNMP(mockSNMP)
469 - snmp.newSnmpClient = func() gosnmp.Handler { return mockSNMP }
468 + collr := test.prepareSNMP(mockSNMP)
469 + collr.newSnmpClient = func() gosnmp.Handler { return mockSNMP }
470
471 - require.NoError(t, snmp.Init())
471 + require.NoError(t, collr.Init())
472
473 - mx := snmp.Collect()
473 + mx := collr.Collect()
474
475 assert.Equal(t, test.wantCollected, mx)
476 })
src/go/plugin/go.d/collector/snmp/init.go
+28 -28
@@ -14,30 +14,30 @@ import (
14 "github.com/netdata/netdata/go/plugins/pkg/matcher"
15 )
16
17 -func (s *SNMP) validateConfig() error {
18 - if s.Hostname == "" {
17 +func (c *Collector) validateConfig() error {
18 + if c.Hostname == "" {
19 return errors.New("SNMP hostname is required")
20 }
21 - if s.Vnode.GUID != "" {
22 - if err := uuid.Validate(s.Vnode.GUID); err != nil {
21 + if c.Vnode.GUID != "" {
22 + if err := uuid.Validate(c.Vnode.GUID); err != nil {
23 return fmt.Errorf("invalid Vnode GUID: %v", err)
24 }
25 }
26 return nil
27 }
28
29 -func (s *SNMP) initSNMPClient() (gosnmp.Handler, error) {
30 - client := s.newSnmpClient()
29 +func (c *Collector) initSNMPClient() (gosnmp.Handler, error) {
30 + client := c.newSnmpClient()
31
32 - client.SetTarget(s.Hostname)
33 - client.SetPort(uint16(s.Options.Port))
34 - client.SetRetries(s.Options.Retries)
35 - client.SetTimeout(time.Duration(s.Options.Timeout) * time.Second)
36 - client.SetMaxOids(s.Options.MaxOIDs)
37 - client.SetMaxRepetitions(uint32(s.Options.MaxRepetitions))
32 + client.SetTarget(c.Hostname)
33 + client.SetPort(uint16(c.Options.Port))
34 + client.SetRetries(c.Options.Retries)
35 + client.SetTimeout(time.Duration(c.Options.Timeout) * time.Second)
36 + client.SetMaxOids(c.Options.MaxOIDs)
37 + client.SetMaxRepetitions(uint32(c.Options.MaxRepetitions))
38
39 - ver := parseSNMPVersion(s.Options.Version)
40 - comm := s.Community
39 + ver := parseSNMPVersion(c.Options.Version)
40 + comm := c.Community
41
42 switch ver {
43 case gosnmp.Version1:
@@ -47,32 +47,32 @@ func (s *SNMP) initSNMPClient() (gosnmp.Handler, error) {
47 client.SetCommunity(comm)
48 client.SetVersion(gosnmp.Version2c)
49 case gosnmp.Version3:
50 - if s.User.Name == "" {
50 + if c.User.Name == "" {
51 return nil, errors.New("username is required for SNMPv3")
52 }
53 client.SetVersion(gosnmp.Version3)
54 client.SetSecurityModel(gosnmp.UserSecurityModel)
55 - client.SetMsgFlags(parseSNMPv3SecurityLevel(s.User.SecurityLevel))
55 + client.SetMsgFlags(parseSNMPv3SecurityLevel(c.User.SecurityLevel))
56 client.SetSecurityParameters(&gosnmp.UsmSecurityParameters{
57 - UserName: s.User.Name,
58 - AuthenticationProtocol: parseSNMPv3AuthProtocol(s.User.AuthProto),
59 - AuthenticationPassphrase: s.User.AuthKey,
60 - PrivacyProtocol: parseSNMPv3PrivProtocol(s.User.PrivProto),
61 - PrivacyPassphrase: s.User.PrivKey,
57 + UserName: c.User.Name,
58 + AuthenticationProtocol: parseSNMPv3AuthProtocol(c.User.AuthProto),
59 + AuthenticationPassphrase: c.User.AuthKey,
60 + PrivacyProtocol: parseSNMPv3PrivProtocol(c.User.PrivProto),
61 + PrivacyPassphrase: c.User.PrivKey,
62 })
63 default:
64 - return nil, fmt.Errorf("invalid SNMP version: %s", s.Options.Version)
64 + return nil, fmt.Errorf("invalid SNMP version: %s", c.Options.Version)
65 }
66
67 - s.Info(snmpClientConnInfo(client))
67 + c.Info(snmpClientConnInfo(client))
68
69 return client, nil
70 }
71
72 -func (s *SNMP) initNetIfaceFilters() (matcher.Matcher, matcher.Matcher, error) {
72 +func (c *Collector) initNetIfaceFilters() (matcher.Matcher, matcher.Matcher, error) {
73 byName, byType := matcher.FALSE(), matcher.FALSE()
74
75 - if v := s.NetworkInterfaceFilter.ByName; v != "" {
75 + if v := c.NetworkInterfaceFilter.ByName; v != "" {
76 m, err := matcher.NewSimplePatternsMatcher(v)
77 if err != nil {
78 return nil, nil, err
@@ -80,7 +80,7 @@ func (s *SNMP) initNetIfaceFilters() (matcher.Matcher, matcher.Matcher, error) {
80 byName = m
81 }
82
83 - if v := s.NetworkInterfaceFilter.ByType; v != "" {
83 + if v := c.NetworkInterfaceFilter.ByType; v != "" {
84 m, err := matcher.NewSimplePatternsMatcher(v)
85 if err != nil {
86 return nil, nil, err
@@ -91,8 +91,8 @@ func (s *SNMP) initNetIfaceFilters() (matcher.Matcher, matcher.Matcher, error) {
91 return byName, byType, nil
92 }
93
94 -func (s *SNMP) initOIDs() (oids []string) {
95 - for _, c := range *s.charts {
94 +func (c *Collector) initOIDs() (oids []string) {
95 + for _, c := range *c.charts {
96 for _, d := range c.Dims {
97 oids = append(oids, d.ID)
98 }
src/go/plugin/go.d/collector/spigotmc/collect.go
+16 -16
@@ -18,36 +18,36 @@ var (
18 reCleanResp = regexp.MustCompile(`§.`)
19 )
20
21 -func (s *SpigotMC) collect() (map[string]int64, error) {
22 - if s.conn == nil {
23 - conn, err := s.establishConn()
21 +func (c *Collector) collect() (map[string]int64, error) {
22 + if c.conn == nil {
23 + conn, err := c.establishConn()
24 if err != nil {
25 return nil, err
26 }
27 - s.conn = conn
27 + c.conn = conn
28 }
29
30 mx := make(map[string]int64)
31
32 - if err := s.collectTPS(mx); err != nil {
33 - s.Cleanup()
32 + if err := c.collectTPS(mx); err != nil {
33 + c.Cleanup()
34 return nil, fmt.Errorf("failed to collect '%s': %v", cmdTPS, err)
35 }
36 - if err := s.collectList(mx); err != nil {
37 - s.Cleanup()
36 + if err := c.collectList(mx); err != nil {
37 + c.Cleanup()
38 return nil, fmt.Errorf("failed to collect '%s': %v", cmdList, err)
39 }
40
41 return mx, nil
42 }
43
44 -func (s *SpigotMC) collectTPS(mx map[string]int64) error {
45 - resp, err := s.conn.queryTps()
44 +func (c *Collector) collectTPS(mx map[string]int64) error {
45 + resp, err := c.conn.queryTps()
46 if err != nil {
47 return err
48 }
49
50 - s.Debugf("cmd '%s' response: %s", cmdTPS, resp)
50 + c.Debugf("cmd '%s' response: %s", cmdTPS, resp)
51
52 if err := parseResponse(resp, reTPS, func(s string, f float64) {
53 switch {
@@ -64,12 +64,12 @@ func (s *SpigotMC) collectTPS(mx map[string]int64) error {
64 return nil
65 }
66
67 -func (s *SpigotMC) collectList(mx map[string]int64) error {
68 - resp, err := s.conn.queryList()
67 +func (c *Collector) collectList(mx map[string]int64) error {
68 + resp, err := c.conn.queryList()
69 if err != nil {
70 return err
71 }
72 - s.Debugf("cmd '%s' response: %s", cmdList, resp)
72 + c.Debugf("cmd '%s' response: %s", cmdList, resp)
73
74 var players int64
75 if err := parseResponse(resp, reList, func(s string, f float64) {
@@ -115,8 +115,8 @@ func parseResponse(resp string, re *regexp.Regexp, fn func(string, float64)) err
115 return nil
116 }
117
118 -func (s *SpigotMC) establishConn() (rconConn, error) {
119 - conn := s.newConn(s.Config)
118 +func (c *Collector) establishConn() (rconConn, error) {
119 + conn := c.newConn(c.Config)
120
121 if err := conn.connect(); err != nil {
122 return nil, err
src/go/plugin/go.d/collector/spigotmc/collector.go renamed
+20 -20
@@ -22,8 +22,8 @@ func init() {
22 })
23 }
24
25 -func New() *SpigotMC {
26 - return &SpigotMC{
25 +func New() *Collector {
26 + return &Collector{
27 Config: Config{
28 Address: "127.0.0.1:25575",
29 Timeout: confopt.Duration(time.Second * 1),
@@ -40,7 +40,7 @@ type Config struct {
40 Timeout confopt.Duration `yaml:"timeout,omitempty" json:"timeout"`
41 }
42
43 -type SpigotMC struct {
43 +type Collector struct {
44 module.Base
45 Config `yaml:",inline" json:""`
46
@@ -50,22 +50,22 @@ type SpigotMC struct {
50 conn rconConn
51 }
52
53 -func (s *SpigotMC) Configuration() any {
54 - return s.Config
53 +func (c *Collector) Configuration() any {
54 + return c.Config
55 }
56
57 -func (s *SpigotMC) Init() error {
58 - if s.Address == "" {
57 +func (c *Collector) Init() error {
58 + if c.Address == "" {
59 return errors.New("config: 'address' required but not set")
60 }
61 - if s.Password == "" {
61 + if c.Password == "" {
62 return errors.New("config: 'password' required but not set")
63 }
64 return nil
65 }
66
67 -func (s *SpigotMC) Check() error {
68 - mx, err := s.collect()
67 +func (c *Collector) Check() error {
68 + mx, err := c.collect()
69 if err != nil {
70 return err
71 }
@@ -77,14 +77,14 @@ func (s *SpigotMC) Check() error {
77 return nil
78 }
79
80 -func (s *SpigotMC) Charts() *module.Charts {
81 - return s.charts
80 +func (c *Collector) Charts() *module.Charts {
81 + return c.charts
82 }
83
84 -func (s *SpigotMC) Collect() map[string]int64 {
85 - mx, err := s.collect()
84 +func (c *Collector) Collect() map[string]int64 {
85 + mx, err := c.collect()
86 if err != nil {
87 - s.Error(err)
87 + c.Error(err)
88 }
89
90 if len(mx) == 0 {
@@ -94,11 +94,11 @@ func (s *SpigotMC) Collect() map[string]int64 {
94 return mx
95 }
96
97 -func (s *SpigotMC) Cleanup() {
98 - if s.conn != nil {
99 - if err := s.conn.disconnect(); err != nil {
100 - s.Warningf("error on disconnect: %s", err)
97 +func (c *Collector) Cleanup() {
98 + if c.conn != nil {
99 + if err := c.conn.disconnect(); err != nil {
100 + c.Warningf("error on disconnect: %s", err)
101 }
102 - s.conn = nil
102 + c.conn = nil
103 }
104 }
src/go/plugin/go.d/collector/spigotmc/collector_test.go renamed
+35 -35
@@ -36,11 +36,11 @@ func Test_testDataIsValid(t *testing.T) {
36 }
37 }
38
39 -func TestSpigotMC_ConfigurationSerialize(t *testing.T) {
40 - module.TestConfigurationSerialize(t, &SpigotMC{}, dataConfigJSON, dataConfigYAML)
39 +func TestCollector_ConfigurationSerialize(t *testing.T) {
40 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
41 }
42
43 -func TestSpigotMC_Init(t *testing.T) {
43 +func TestCollector_Init(t *testing.T) {
44 tests := map[string]struct {
45 config Config
46 wantFail bool
@@ -62,59 +62,59 @@ func TestSpigotMC_Init(t *testing.T) {
62
63 for name, test := range tests {
64 t.Run(name, func(t *testing.T) {
65 - smc := New()
66 - smc.Config = test.config
65 + collr := New()
66 + collr.Config = test.config
67
68 if test.wantFail {
69 - assert.Error(t, smc.Init())
69 + assert.Error(t, collr.Init())
70 } else {
71 - assert.NoError(t, smc.Init())
71 + assert.NoError(t, collr.Init())
72 }
73 })
74 }
75 }
76
77 -func TestSpigotMC_Cleanup(t *testing.T) {
77 +func TestCollector_Cleanup(t *testing.T) {
78 tests := map[string]struct {
79 - prepare func() *SpigotMC
79 + prepare func() *Collector
80 }{
81 "not initialized": {
82 - prepare: func() *SpigotMC {
82 + prepare: func() *Collector {
83 return New()
84 },
85 },
86 "after check": {
87 - prepare: func() *SpigotMC {
88 - smc := New()
89 - smc.newConn = func(config Config) rconConn { return prepareMockOk() }
90 - _ = smc.Check()
91 - return smc
87 + prepare: func() *Collector {
88 + collr := New()
89 + collr.newConn = func(Config) rconConn { return prepareMockOk() }
90 + _ = collr.Check()
91 + return collr
92 },
93 },
94 "after collect": {
95 - prepare: func() *SpigotMC {
96 - smc := New()
97 - smc.newConn = func(config Config) rconConn { return prepareMockOk() }
98 - _ = smc.Collect()
99 - return smc
95 + prepare: func() *Collector {
96 + collr := New()
97 + collr.newConn = func(Config) rconConn { return prepareMockOk() }
98 + _ = collr.Collect()
99 + return collr
100 },
101 },
102 }
103
104 for name, test := range tests {
105 t.Run(name, func(t *testing.T) {
106 - smc := test.prepare()
106 + collr := test.prepare()
107
108 - assert.NotPanics(t, smc.Cleanup)
108 + assert.NotPanics(t, collr.Cleanup)
109 })
110 }
111 }
112
113 -func TestSpigotMC_Charts(t *testing.T) {
113 +func TestCollector_Charts(t *testing.T) {
114 assert.NotNil(t, New().Charts())
115 }
116
117 -func TestSpigotMC_Check(t *testing.T) {
117 +func TestCollector_Check(t *testing.T) {
118 tests := map[string]struct {
119 prepareMock func() *mockRcon
120 wantFail bool
@@ -139,20 +139,20 @@ func TestSpigotMC_Check(t *testing.T) {
139
140 for name, test := range tests {
141 t.Run(name, func(t *testing.T) {
142 - smc := New()
142 + collr := New()
143 mock := test.prepareMock()
144 - smc.newConn = func(config Config) rconConn { return mock }
144 + collr.newConn = func(Config) rconConn { return mock }
145
146 if test.wantFail {
147 - assert.Error(t, smc.Check())
147 + assert.Error(t, collr.Check())
148 } else {
149 - assert.NoError(t, smc.Check())
149 + assert.NoError(t, collr.Check())
150 }
151 })
152 }
153 }
154
155 -func TestSpigotMC_Collect(t *testing.T) {
155 +func TestCollector_Collect(t *testing.T) {
156 tests := map[string]struct {
157 prepareMock func() *mockRcon
158 wantMetrics map[string]int64
@@ -240,21 +240,21 @@ func TestSpigotMC_Collect(t *testing.T) {
240
241 for name, test := range tests {
242 t.Run(name, func(t *testing.T) {
243 - smc := New()
243 + collr := New()
244 mock := test.prepareMock()
245 - smc.newConn = func(config Config) rconConn { return mock }
245 + collr.newConn = func(Config) rconConn { return mock }
246
247 - mx := smc.Collect()
247 + mx := collr.Collect()
248
249 require.Equal(t, test.wantMetrics, mx, "want metrics")
250
251 if len(test.wantMetrics) > 0 {
252 - module.TestMetricsHasAllChartsDims(t, smc.Charts(), mx)
253 - assert.Equal(t, len(charts), len(*smc.Charts()), "want charts")
252 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
253 + assert.Equal(t, len(charts), len(*collr.Charts()), "want charts")
254 }
255
256 assert.Equal(t, test.disconnectBeforeCleanup, mock.disconnectCalled, "disconnect before cleanup")
257 - smc.Cleanup()
257 + collr.Cleanup()
258 assert.Equal(t, test.disconnectAfterCleanup, mock.disconnectCalled, "disconnect after cleanup")
259 })
260 }
src/go/plugin/go.d/collector/squid/collect.go
+6 -6
@@ -30,23 +30,23 @@ var statsCounters = map[string]bool{
30 "client_http.hit_kbytes_out": true,
31 }
32
33 -func (s *Squid) collect() (map[string]int64, error) {
33 +func (c *Collector) collect() (map[string]int64, error) {
34 mx := make(map[string]int64)
35
36 - if err := s.collectCounters(mx); err != nil {
36 + if err := c.collectCounters(mx); err != nil {
37 return nil, err
38 }
39
40 return mx, nil
41 }
42
43 -func (s *Squid) collectCounters(mx map[string]int64) error {
44 - req, err := web.NewHTTPRequestWithPath(s.RequestConfig, urlPathServerStats)
43 +func (c *Collector) collectCounters(mx map[string]int64) error {
44 + req, err := web.NewHTTPRequestWithPath(c.RequestConfig, urlPathServerStats)
45 if err != nil {
46 return fmt.Errorf("failed to create '%s' request: %w", urlPathServerStats, err)
47 }
48
49 - return web.DoHTTP(s.httpClient).Request(req, func(body io.Reader) error {
49 + return web.DoHTTP(c.httpClient).Request(req, func(body io.Reader) error {
50 sc := bufio.NewScanner(body)
51
52 for sc.Scan() {
@@ -63,7 +63,7 @@ func (s *Squid) collectCounters(mx map[string]int64) error {
63
64 v, err := strconv.ParseInt(value, 10, 64)
65 if err != nil {
66 - s.Debugf("failed to parse key %s value %s: %v", key, value, err)
66 + c.Debugf("failed to parse key %s value %s: %v", key, value, err)
67 continue
68 }
69
src/go/plugin/go.d/collector/squid/collector.go renamed
+21 -21
@@ -25,8 +25,8 @@ func init() {
25 })
26 }
27
28 -func New() *Squid {
29 - return &Squid{
28 +func New() *Collector {
29 + return &Collector{
30 Config: Config{
31 HTTPConfig: web.HTTPConfig{
32 RequestConfig: web.RequestConfig{
@@ -46,7 +46,7 @@ type Config struct {
46 web.HTTPConfig `yaml:",inline" json:""`
47 }
48
49 -type Squid struct {
49 +type Collector struct {
50 module.Base
51 Config `yaml:",inline" json:""`
52
@@ -55,29 +55,29 @@ type Squid struct {
55 httpClient *http.Client
56 }
57
58 -func (s *Squid) Configuration() any {
59 - return s.Config
58 +func (c *Collector) Configuration() any {
59 + return c.Config
60 }
61
62 -func (s *Squid) Init() error {
63 - if s.URL == "" {
62 +func (c *Collector) Init() error {
63 + if c.URL == "" {
64 return errors.New("config: url not set")
65 }
66
67 - client, err := web.NewHTTPClient(s.ClientConfig)
67 + client, err := web.NewHTTPClient(c.ClientConfig)
68 if err != nil {
69 return fmt.Errorf("init http client: %w", err)
70 }
71 - s.httpClient = client
71 + c.httpClient = client
72
73 - s.Debugf("using URL %s", s.URL)
74 - s.Debugf("using timeout: %s", s.Timeout)
73 + c.Debugf("using URL %s", c.URL)
74 + c.Debugf("using timeout: %s", c.Timeout)
75
76 return nil
77 }
78
79 -func (s *Squid) Check() error {
80 - mx, err := s.collect()
79 +func (c *Collector) Check() error {
80 + mx, err := c.collect()
81 if err != nil {
82 return err
83 }
@@ -89,14 +89,14 @@ func (s *Squid) Check() error {
89 return nil
90 }
91
92 -func (s *Squid) Charts() *module.Charts {
93 - return s.charts
92 +func (c *Collector) Charts() *module.Charts {
93 + return c.charts
94 }
95
96 -func (s *Squid) Collect() map[string]int64 {
97 - mx, err := s.collect()
96 +func (c *Collector) Collect() map[string]int64 {
97 + mx, err := c.collect()
98 if err != nil {
99 - s.Error(err)
99 + c.Error(err)
100 }
101
102 if len(mx) == 0 {
@@ -106,8 +106,8 @@ func (s *Squid) Collect() map[string]int64 {
106 return mx
107 }
108
109 -func (s *Squid) Cleanup() {
110 - if s.httpClient != nil {
111 - s.httpClient.CloseIdleConnections()
109 +func (c *Collector) Cleanup() {
110 + if c.httpClient != nil {
111 + c.httpClient.CloseIdleConnections()
112 }
113 }
src/go/plugin/go.d/collector/squid/collector_test.go renamed
+39 -39
@@ -31,11 +31,11 @@ func Test_testDataIsValid(t *testing.T) {
31 }
32 }
33
34 -func TestSquid_ConfigurationSerialize(t *testing.T) {
35 - module.TestConfigurationSerialize(t, &Squid{}, dataConfigJSON, dataConfigYAML)
34 +func TestCollector_ConfigurationSerialize(t *testing.T) {
35 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
36 }
37
38 -func TestSquid_Init(t *testing.T) {
38 +func TestCollector_Init(t *testing.T) {
39 tests := map[string]struct {
40 wantFail bool
41 config Config
@@ -56,26 +56,26 @@ func TestSquid_Init(t *testing.T) {
56
57 for name, test := range tests {
58 t.Run(name, func(t *testing.T) {
59 - squid := New()
60 - squid.Config = test.config
59 + collr := New()
60 + collr.Config = test.config
61
62 if test.wantFail {
63 - assert.Error(t, squid.Init())
63 + assert.Error(t, collr.Init())
64 } else {
65 - assert.NoError(t, squid.Init())
65 + assert.NoError(t, collr.Init())
66 }
67 })
68 }
69 }
70
71 -func TestSquid_Charts(t *testing.T) {
71 +func TestCollector_Charts(t *testing.T) {
72 assert.NotNil(t, New().Charts())
73 }
74
75 -func TestSquid_Check(t *testing.T) {
75 +func TestCollector_Check(t *testing.T) {
76 tests := map[string]struct {
77 wantFail bool
78 - prepare func(t *testing.T) (*Squid, func())
78 + prepare func(t *testing.T) (*Collector, func())
79 }{
80 "success case": {
81 wantFail: false,
@@ -97,21 +97,21 @@ func TestSquid_Check(t *testing.T) {
97
98 for name, test := range tests {
99 t.Run(name, func(t *testing.T) {
100 - squid, cleanup := test.prepare(t)
100 + collr, cleanup := test.prepare(t)
101 defer cleanup()
102
103 if test.wantFail {
104 - assert.Error(t, squid.Check())
104 + assert.Error(t, collr.Check())
105 } else {
106 - assert.NoError(t, squid.Check())
106 + assert.NoError(t, collr.Check())
107 }
108 })
109 }
110 }
111
112 -func TestSquid_Collect(t *testing.T) {
112 +func TestCollector_Collect(t *testing.T) {
113 tests := map[string]struct {
114 - prepare func(t *testing.T) (*Squid, func())
114 + prepare func(t *testing.T) (*Collector, func())
115 wantMetrics map[string]int64
116 wantCharts int
117 }{
@@ -144,22 +144,22 @@ func TestSquid_Collect(t *testing.T) {
144
145 for name, test := range tests {
146 t.Run(name, func(t *testing.T) {
147 - squid, cleanup := test.prepare(t)
147 + collr, cleanup := test.prepare(t)
148 defer cleanup()
149
150 - mx := squid.Collect()
150 + mx := collr.Collect()
151
152 require.Equal(t, test.wantMetrics, mx)
153
154 if len(test.wantMetrics) > 0 {
155 - assert.Equal(t, test.wantCharts, len(*squid.Charts()))
156 - module.TestMetricsHasAllChartsDims(t, squid.Charts(), mx)
155 + assert.Equal(t, test.wantCharts, len(*collr.Charts()))
156 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
157 }
158 })
159 }
160 }
161
162 -func prepareCaseSuccess(t *testing.T) (*Squid, func()) {
162 +func prepareCaseSuccess(t *testing.T) (*Collector, func()) {
163 t.Helper()
164 srv := httptest.NewServer(http.HandlerFunc(
165 func(w http.ResponseWriter, r *http.Request) {
@@ -171,14 +171,14 @@ func prepareCaseSuccess(t *testing.T) (*Squid, func()) {
171 }
172 }))
173
174 - squid := New()
175 - squid.URL = srv.URL
176 - require.NoError(t, squid.Init())
174 + collr := New()
175 + collr.URL = srv.URL
176 + require.NoError(t, collr.Init())
177
178 - return squid, srv.Close
178 + return collr, srv.Close
179 }
180
181 -func prepareCaseUnexpectedResponse(t *testing.T) (*Squid, func()) {
181 +func prepareCaseUnexpectedResponse(t *testing.T) (*Collector, func()) {
182 t.Helper()
183 resp := []byte(`
184 Lorem ipsum dolor sit amet, consectetur adipiscing elit.
@@ -190,14 +190,14 @@ Fusce et felis pulvinar, posuere sem non, porttitor eros.`)
190 _, _ = w.Write(resp)
191 }))
192
193 - squid := New()
194 - squid.URL = srv.URL
195 - require.NoError(t, squid.Init())
193 + collr := New()
194 + collr.URL = srv.URL
195 + require.NoError(t, collr.Init())
196
197 - return squid, srv.Close
197 + return collr, srv.Close
198 }
199
200 -func prepareCaseEmptyResponse(t *testing.T) (*Squid, func()) {
200 +func prepareCaseEmptyResponse(t *testing.T) (*Collector, func()) {
201 t.Helper()
202 resp := []byte(``)
203
@@ -206,18 +206,18 @@ func prepareCaseEmptyResponse(t *testing.T) (*Squid, func()) {
206 _, _ = w.Write(resp)
207 }))
208
209 - squid := New()
210 - squid.URL = srv.URL
211 - require.NoError(t, squid.Init())
209 + collr := New()
210 + collr.URL = srv.URL
211 + require.NoError(t, collr.Init())
212
213 - return squid, srv.Close
213 + return collr, srv.Close
214 }
215
216 -func prepareCaseConnectionRefused(t *testing.T) (*Squid, func()) {
216 +func prepareCaseConnectionRefused(t *testing.T) (*Collector, func()) {
217 t.Helper()
218 - squid := New()
219 - squid.URL = "http://127.0.0.1:65001"
220 - require.NoError(t, squid.Init())
218 + collr := New()
219 + collr.URL = "http://127.0.0.1:65001"
220 + require.NoError(t, collr.Init())
221
222 - return squid, func() {}
222 + return collr, func() {}
223 }
src/go/plugin/go.d/collector/squidlog/charts.go
+2 -2
@@ -253,7 +253,7 @@ var (
253 }
254 )
255
256 -func (s *SquidLog) createCharts(line *logLine) error {
256 +func (c *Collector) createCharts(line *logLine) error {
257 if line.empty() {
258 return errors.New("empty line")
259 }
@@ -306,7 +306,7 @@ func (s *SquidLog) createCharts(line *logLine) error {
306 return err
307 }
308 }
309 - s.charts = charts
309 + c.charts = charts
310 return nil
311 }
312
src/go/plugin/go.d/collector/squidlog/collect.go
+131 -131
@@ -14,41 +14,41 @@ import (
14 "github.com/netdata/netdata/go/plugins/plugin/go.d/agent/module"
15 )
16
17 -func (s *SquidLog) logPanicStackIfAny() {
17 +func (c *Collector) logPanicStackIfAny() {
18 err := recover()
19 if err == nil {
20 return
21 }
22 - s.Errorf("[ERROR] %s\n", err)
22 + c.Errorf("[ERROR] %s\n", err)
23 for depth := 0; ; depth++ {
24 _, file, line, ok := runtime.Caller(depth)
25 if !ok {
26 break
27 }
28 - s.Errorf("======> %d: %v:%d", depth, file, line)
28 + c.Errorf("======> %d: %v:%d", depth, file, line)
29 }
30 panic(err)
31 }
32
33 -func (s *SquidLog) collect() (map[string]int64, error) {
34 - defer s.logPanicStackIfAny()
35 - s.mx.reset()
33 +func (c *Collector) collect() (map[string]int64, error) {
34 + defer c.logPanicStackIfAny()
35 + c.mx.reset()
36
37 var mx map[string]int64
38
39 - n, err := s.collectLogLines()
39 + n, err := c.collectLogLines()
40
41 if n > 0 || err == nil {
42 - mx = stm.ToMap(s.mx)
42 + mx = stm.ToMap(c.mx)
43 }
44 return mx, err
45 }
46
47 -func (s *SquidLog) collectLogLines() (int, error) {
47 +func (c *Collector) collectLogLines() (int, error) {
48 var n int
49 for {
50 - s.line.reset()
51 - err := s.parser.ReadLine(s.line)
50 + c.line.reset()
51 + err := c.parser.ReadLine(c.line)
52 if err != nil {
53 if err == io.EOF {
54 return n, nil
@@ -57,296 +57,296 @@ func (s *SquidLog) collectLogLines() (int, error) {
57 return n, err
58 }
59 n++
60 - s.collectUnmatched()
60 + c.collectUnmatched()
61 continue
62 }
63 n++
64 - if s.line.empty() {
65 - s.collectUnmatched()
64 + if c.line.empty() {
65 + c.collectUnmatched()
66 } else {
67 - s.collectLogLine()
67 + c.collectLogLine()
68 }
69 }
70 }
71
72 -func (s *SquidLog) collectLogLine() {
73 - s.mx.Requests.Inc()
74 - s.collectRespTime()
75 - s.collectClientAddress()
76 - s.collectCacheCode()
77 - s.collectHTTPCode()
78 - s.collectRespSize()
79 - s.collectReqMethod()
80 - s.collectHierCode()
81 - s.collectServerAddress()
82 - s.collectMimeType()
72 +func (c *Collector) collectLogLine() {
73 + c.mx.Requests.Inc()
74 + c.collectRespTime()
75 + c.collectClientAddress()
76 + c.collectCacheCode()
77 + c.collectHTTPCode()
78 + c.collectRespSize()
79 + c.collectReqMethod()
80 + c.collectHierCode()
81 + c.collectServerAddress()
82 + c.collectMimeType()
83 }
84
85 -func (s *SquidLog) collectUnmatched() {
86 - s.mx.Requests.Inc()
87 - s.mx.Unmatched.Inc()
85 +func (c *Collector) collectUnmatched() {
86 + c.mx.Requests.Inc()
87 + c.mx.Unmatched.Inc()
88 }
89
90 -func (s *SquidLog) collectRespTime() {
91 - if !s.line.hasRespTime() {
90 +func (c *Collector) collectRespTime() {
91 + if !c.line.hasRespTime() {
92 return
93 }
94 - s.mx.RespTime.Observe(float64(s.line.respTime))
94 + c.mx.RespTime.Observe(float64(c.line.respTime))
95 }
96
97 -func (s *SquidLog) collectClientAddress() {
98 - if !s.line.hasClientAddress() {
97 +func (c *Collector) collectClientAddress() {
98 + if !c.line.hasClientAddress() {
99 return
100 }
101 - s.mx.UniqueClients.Insert(s.line.clientAddr)
101 + c.mx.UniqueClients.Insert(c.line.clientAddr)
102 }
103
104 -func (s *SquidLog) collectCacheCode() {
105 - if !s.line.hasCacheCode() {
104 +func (c *Collector) collectCacheCode() {
105 + if !c.line.hasCacheCode() {
106 return
107 }
108
109 - c, ok := s.mx.CacheCode.GetP(s.line.cacheCode)
109 + cntr, ok := c.mx.CacheCode.GetP(c.line.cacheCode)
110 if !ok {
111 - s.addDimToCacheCodeChart(s.line.cacheCode)
111 + c.addDimToCacheCodeChart(c.line.cacheCode)
112 }
113 - c.Inc()
113 + cntr.Inc()
114
115 - tags := strings.Split(s.line.cacheCode, "_")
115 + tags := strings.Split(c.line.cacheCode, "_")
116 for _, tag := range tags {
117 - s.collectCacheCodeTag(tag)
117 + c.collectCacheCodeTag(tag)
118 }
119 }
120
121 -func (s *SquidLog) collectHTTPCode() {
122 - if !s.line.hasHTTPCode() {
121 +func (c *Collector) collectHTTPCode() {
122 + if !c.line.hasHTTPCode() {
123 return
124 }
125
126 - code := s.line.httpCode
126 + code := c.line.httpCode
127 switch {
128 case code >= 100 && code < 300, code == 0, code == 304, code == 401:
129 - s.mx.ReqSuccess.Inc()
129 + c.mx.ReqSuccess.Inc()
130 case code >= 300 && code < 400:
131 - s.mx.ReqRedirect.Inc()
131 + c.mx.ReqRedirect.Inc()
132 case code >= 400 && code < 500:
133 - s.mx.ReqBad.Inc()
133 + c.mx.ReqBad.Inc()
134 case code >= 500 && code <= 603:
135 - s.mx.ReqError.Inc()
135 + c.mx.ReqError.Inc()
136 }
137
138 switch code / 100 {
139 case 0:
140 - s.mx.HTTPResp0xx.Inc()
140 + c.mx.HTTPResp0xx.Inc()
141 case 1:
142 - s.mx.HTTPResp1xx.Inc()
142 + c.mx.HTTPResp1xx.Inc()
143 case 2:
144 - s.mx.HTTPResp2xx.Inc()
144 + c.mx.HTTPResp2xx.Inc()
145 case 3:
146 - s.mx.HTTPResp3xx.Inc()
146 + c.mx.HTTPResp3xx.Inc()
147 case 4:
148 - s.mx.HTTPResp4xx.Inc()
148 + c.mx.HTTPResp4xx.Inc()
149 case 5:
150 - s.mx.HTTPResp5xx.Inc()
150 + c.mx.HTTPResp5xx.Inc()
151 case 6:
152 - s.mx.HTTPResp6xx.Inc()
152 + c.mx.HTTPResp6xx.Inc()
153 }
154
155 codeStr := strconv.Itoa(code)
156 - c, ok := s.mx.HTTPRespCode.GetP(codeStr)
156 + cntr, ok := c.mx.HTTPRespCode.GetP(codeStr)
157 if !ok {
158 - s.addDimToHTTPRespCodesChart(codeStr)
158 + c.addDimToHTTPRespCodesChart(codeStr)
159 }
160 - c.Inc()
160 + cntr.Inc()
161 }
162
163 -func (s *SquidLog) collectRespSize() {
164 - if !s.line.hasRespSize() {
163 +func (c *Collector) collectRespSize() {
164 + if !c.line.hasRespSize() {
165 return
166 }
167 - s.mx.BytesSent.Add(float64(s.line.respSize))
167 + c.mx.BytesSent.Add(float64(c.line.respSize))
168 }
169
170 -func (s *SquidLog) collectReqMethod() {
171 - if !s.line.hasReqMethod() {
170 +func (c *Collector) collectReqMethod() {
171 + if !c.line.hasReqMethod() {
172 return
173 }
174 - c, ok := s.mx.ReqMethod.GetP(s.line.reqMethod)
174 + cntr, ok := c.mx.ReqMethod.GetP(c.line.reqMethod)
175 if !ok {
176 - s.addDimToReqMethodChart(s.line.reqMethod)
176 + c.addDimToReqMethodChart(c.line.reqMethod)
177 }
178 - c.Inc()
178 + cntr.Inc()
179 }
180
181 -func (s *SquidLog) collectHierCode() {
182 - if !s.line.hasHierCode() {
181 +func (c *Collector) collectHierCode() {
182 + if !c.line.hasHierCode() {
183 return
184 }
185 - c, ok := s.mx.HierCode.GetP(s.line.hierCode)
185 + cntr, ok := c.mx.HierCode.GetP(c.line.hierCode)
186 if !ok {
187 - s.addDimToHierCodeChart(s.line.hierCode)
187 + c.addDimToHierCodeChart(c.line.hierCode)
188 }
189 - c.Inc()
189 + cntr.Inc()
190 }
191
192 -func (s *SquidLog) collectServerAddress() {
193 - if !s.line.hasServerAddress() {
192 +func (c *Collector) collectServerAddress() {
193 + if !c.line.hasServerAddress() {
194 return
195 }
196 - c, ok := s.mx.Server.GetP(s.line.serverAddr)
196 + cntr, ok := c.mx.Server.GetP(c.line.serverAddr)
197 if !ok {
198 - s.addDimToServerAddressChart(s.line.serverAddr)
198 + c.addDimToServerAddressChart(c.line.serverAddr)
199 }
200 - c.Inc()
200 + cntr.Inc()
201 }
202
203 -func (s *SquidLog) collectMimeType() {
204 - if !s.line.hasMimeType() {
203 +func (c *Collector) collectMimeType() {
204 + if !c.line.hasMimeType() {
205 return
206 }
207 - c, ok := s.mx.MimeType.GetP(s.line.mimeType)
207 + cntr, ok := c.mx.MimeType.GetP(c.line.mimeType)
208 if !ok {
209 - s.addDimToMimeTypeChart(s.line.mimeType)
209 + c.addDimToMimeTypeChart(c.line.mimeType)
210 }
211 - c.Inc()
211 + cntr.Inc()
212 }
213
214 -func (s *SquidLog) collectCacheCodeTag(tag string) {
214 +func (c *Collector) collectCacheCodeTag(tag string) {
215 // https://wiki.squid-cache.org/SquidFaq/SquidLogs#Squid_result_codes
216 switch tag {
217 default:
218 case "TCP", "UDP", "NONE":
219 - c, ok := s.mx.CacheCodeTransportTag.GetP(tag)
219 + cntr, ok := c.mx.CacheCodeTransportTag.GetP(tag)
220 if !ok {
221 - s.addDimToCacheCodeTransportTagChart(tag)
221 + c.addDimToCacheCodeTransportTagChart(tag)
222 }
223 - c.Inc()
223 + cntr.Inc()
224 case "CF", "CLIENT", "IMS", "ASYNC", "SWAPFAIL", "REFRESH", "SHARED", "REPLY":
225 - c, ok := s.mx.CacheCodeHandlingTag.GetP(tag)
225 + cntr, ok := c.mx.CacheCodeHandlingTag.GetP(tag)
226 if !ok {
227 - s.addDimToCacheCodeHandlingTagChart(tag)
227 + c.addDimToCacheCodeHandlingTagChart(tag)
228 }
229 - c.Inc()
229 + cntr.Inc()
230 case "NEGATIVE", "STALE", "OFFLINE", "INVALID", "FAIL", "MODIFIED", "UNMODIFIED", "REDIRECT":
231 - c, ok := s.mx.CacheCodeObjectTag.GetP(tag)
231 + cntr, ok := c.mx.CacheCodeObjectTag.GetP(tag)
232 if !ok {
233 - s.addDimToCacheCodeObjectTagChart(tag)
233 + c.addDimToCacheCodeObjectTagChart(tag)
234 }
235 - c.Inc()
235 + cntr.Inc()
236 case "HIT", "MEM", "MISS", "DENIED", "NOFETCH", "TUNNEL":
237 - c, ok := s.mx.CacheCodeLoadSourceTag.GetP(tag)
237 + cntr, ok := c.mx.CacheCodeLoadSourceTag.GetP(tag)
238 if !ok {
239 - s.addDimToCacheCodeLoadSourceTagChart(tag)
239 + c.addDimToCacheCodeLoadSourceTagChart(tag)
240 }
241 - c.Inc()
241 + cntr.Inc()
242 case "ABORTED", "TIMEOUT", "IGNORED":
243 - c, ok := s.mx.CacheCodeErrorTag.GetP(tag)
243 + cntr, ok := c.mx.CacheCodeErrorTag.GetP(tag)
244 if !ok {
245 - s.addDimToCacheCodeErrorTagChart(tag)
245 + c.addDimToCacheCodeErrorTagChart(tag)
246 }
247 - c.Inc()
247 + cntr.Inc()
248 }
249 }
250
251 -func (s *SquidLog) addDimToCacheCodeChart(code string) {
251 +func (c *Collector) addDimToCacheCodeChart(code string) {
252 chartID := cacheCodeChart.ID
253 dimID := pxCacheCode + code
254 - s.addDimToChart(chartID, dimID, code)
254 + c.addDimToChart(chartID, dimID, code)
255 }
256
257 -func (s *SquidLog) addDimToCacheCodeTransportTagChart(tag string) {
257 +func (c *Collector) addDimToCacheCodeTransportTagChart(tag string) {
258 chartID := cacheCodeTransportTagChart.ID
259 dimID := pxTransportTag + tag
260 - s.addDimToChart(chartID, dimID, tag)
260 + c.addDimToChart(chartID, dimID, tag)
261 }
262
263 -func (s *SquidLog) addDimToCacheCodeHandlingTagChart(tag string) {
263 +func (c *Collector) addDimToCacheCodeHandlingTagChart(tag string) {
264 chartID := cacheCodeHandlingTagChart.ID
265 dimID := pxHandlingTag + tag
266 - s.addDimToChart(chartID, dimID, tag)
266 + c.addDimToChart(chartID, dimID, tag)
267 }
268
269 -func (s *SquidLog) addDimToCacheCodeObjectTagChart(tag string) {
269 +func (c *Collector) addDimToCacheCodeObjectTagChart(tag string) {
270 chartID := cacheCodeObjectTagChart.ID
271 dimID := pxObjectTag + tag
272 - s.addDimToChart(chartID, dimID, tag)
272 + c.addDimToChart(chartID, dimID, tag)
273 }
274
275 -func (s *SquidLog) addDimToCacheCodeLoadSourceTagChart(tag string) {
275 +func (c *Collector) addDimToCacheCodeLoadSourceTagChart(tag string) {
276 chartID := cacheCodeLoadSourceTagChart.ID
277 dimID := pxSourceTag + tag
278 - s.addDimToChart(chartID, dimID, tag)
278 + c.addDimToChart(chartID, dimID, tag)
279 }
280
281 -func (s *SquidLog) addDimToCacheCodeErrorTagChart(tag string) {
281 +func (c *Collector) addDimToCacheCodeErrorTagChart(tag string) {
282 chartID := cacheCodeErrorTagChart.ID
283 dimID := pxErrorTag + tag
284 - s.addDimToChart(chartID, dimID, tag)
284 + c.addDimToChart(chartID, dimID, tag)
285 }
286
287 -func (s *SquidLog) addDimToHTTPRespCodesChart(tag string) {
287 +func (c *Collector) addDimToHTTPRespCodesChart(tag string) {
288 chartID := httpRespCodesChart.ID
289 dimID := pxHTTPCode + tag
290 - s.addDimToChart(chartID, dimID, tag)
290 + c.addDimToChart(chartID, dimID, tag)
291 }
292
293 -func (s *SquidLog) addDimToReqMethodChart(method string) {
293 +func (c *Collector) addDimToReqMethodChart(method string) {
294 chartID := reqMethodChart.ID
295 dimID := pxReqMethod + method
296 - s.addDimToChart(chartID, dimID, method)
296 + c.addDimToChart(chartID, dimID, method)
297 }
298
299 -func (s *SquidLog) addDimToHierCodeChart(code string) {
299 +func (c *Collector) addDimToHierCodeChart(code string) {
300 chartID := hierCodeChart.ID
301 dimID := pxHierCode + code
302 dimName := code[5:] // remove "HIER_"
303 - s.addDimToChart(chartID, dimID, dimName)
303 + c.addDimToChart(chartID, dimID, dimName)
304 }
305
306 -func (s *SquidLog) addDimToServerAddressChart(address string) {
306 +func (c *Collector) addDimToServerAddressChart(address string) {
307 chartID := serverAddrChart.ID
308 dimID := pxSrvAddr + address
309 - s.addDimToChartOrCreateIfNotExist(chartID, dimID, address)
309 + c.addDimToChartOrCreateIfNotExist(chartID, dimID, address)
310 }
311
312 -func (s *SquidLog) addDimToMimeTypeChart(mimeType string) {
312 +func (c *Collector) addDimToMimeTypeChart(mimeType string) {
313 chartID := mimeTypeChart.ID
314 dimID := pxMimeType + mimeType
315 - s.addDimToChartOrCreateIfNotExist(chartID, dimID, mimeType)
315 + c.addDimToChartOrCreateIfNotExist(chartID, dimID, mimeType)
316 }
317
318 -func (s *SquidLog) addDimToChart(chartID, dimID, dimName string) {
319 - chart := s.Charts().Get(chartID)
318 +func (c *Collector) addDimToChart(chartID, dimID, dimName string) {
319 + chart := c.Charts().Get(chartID)
320 if chart == nil {
321 - s.Warningf("add '%s' dim: couldn't find '%s' chart in charts", dimID, chartID)
321 + c.Warningf("add '%s' dim: couldn't find '%s' chart in charts", dimID, chartID)
322 return
323 }
324
325 dim := &Dim{ID: dimID, Name: dimName, Algo: module.Incremental}
326
327 if err := chart.AddDim(dim); err != nil {
328 - s.Warningf("add '%s' dim: %v", dimID, err)
328 + c.Warningf("add '%s' dim: %v", dimID, err)
329 return
330 }
331 chart.MarkNotCreated()
332 }
333
334 -func (s *SquidLog) addDimToChartOrCreateIfNotExist(chartID, dimID, dimName string) {
335 - if s.Charts().Has(chartID) {
336 - s.addDimToChart(chartID, dimID, dimName)
334 +func (c *Collector) addDimToChartOrCreateIfNotExist(chartID, dimID, dimName string) {
335 + if c.Charts().Has(chartID) {
336 + c.addDimToChart(chartID, dimID, dimName)
337 return
338 }
339
340 chart := newChartByID(chartID)
341 if chart == nil {
342 - s.Warningf("add '%s' dim: couldn't create '%s' chart", dimID, chartID)
342 + c.Warningf("add '%s' dim: couldn't create '%s' chart", dimID, chartID)
343 return
344 }
345 - if err := s.Charts().Add(chart); err != nil {
346 - s.Warning(err)
345 + if err := c.Charts().Add(chart); err != nil {
346 + c.Warning(err)
347 return
348 }
349 - s.addDimToChart(chartID, dimID, dimName)
349 + c.addDimToChart(chartID, dimID, dimName)
350 }
351
352 func newChartByID(chartID string) *Chart {
src/go/plugin/go.d/collector/squidlog/collector.go renamed
+20 -20
@@ -21,8 +21,8 @@ func init() {
21 })
22 }
23
24 -func New() *SquidLog {
25 - return &SquidLog{
24 +func New() *Collector {
25 + return &Collector{
26 Config: Config{
27 Path: "/var/log/squid/access.log",
28 ExcludePath: "*.gz",
@@ -47,7 +47,7 @@ type Config struct {
47 logs.ParserConfig `yaml:",inline" json:""`
48 }
49
50 -type SquidLog struct {
50 +type Collector struct {
51 module.Base
52 Config `yaml:",inline" json:""`
53
@@ -60,41 +60,41 @@ type SquidLog struct {
60 mx *metricsData
61 }
62
63 -func (s *SquidLog) Configuration() any {
64 - return s.Config
63 +func (c *Collector) Configuration() any {
64 + return c.Config
65 }
66
67 -func (s *SquidLog) Init() error {
68 - s.line = newEmptyLogLine()
69 - s.mx = newMetricsData()
67 +func (c *Collector) Init() error {
68 + c.line = newEmptyLogLine()
69 + c.mx = newMetricsData()
70 return nil
71 }
72
73 -func (s *SquidLog) Check() error {
73 +func (c *Collector) Check() error {
74 // Note: these inits are here to make auto-detection retry working
75 - if err := s.createLogReader(); err != nil {
75 + if err := c.createLogReader(); err != nil {
76 return fmt.Errorf("failed to create log reader: %v", err)
77 }
78
79 - if err := s.createParser(); err != nil {
79 + if err := c.createParser(); err != nil {
80 return fmt.Errorf("failed to create log parser: %v", err)
81 }
82
83 - if err := s.createCharts(s.line); err != nil {
83 + if err := c.createCharts(c.line); err != nil {
84 return fmt.Errorf("failed to create log charts: %v", err)
85 }
86
87 return nil
88 }
89
90 -func (s *SquidLog) Charts() *module.Charts {
91 - return s.charts
90 +func (c *Collector) Charts() *module.Charts {
91 + return c.charts
92 }
93
94 -func (s *SquidLog) Collect() map[string]int64 {
95 - mx, err := s.collect()
94 +func (c *Collector) Collect() map[string]int64 {
95 + mx, err := c.collect()
96 if err != nil {
97 - s.Error(err)
97 + c.Error(err)
98 }
99
100 if len(mx) == 0 {
@@ -103,8 +103,8 @@ func (s *SquidLog) Collect() map[string]int64 {
103 return mx
104 }
105
106 -func (s *SquidLog) Cleanup() {
107 - if s.file != nil {
108 - _ = s.file.Close()
106 +func (c *Collector) Cleanup() {
107 + if c.file != nil {
108 + _ = c.file.Close()
109 }
110 }
src/go/plugin/go.d/collector/squidlog/collector_test.go renamed
+62 -62
@@ -31,65 +31,65 @@ func Test_testDataIsValid(t *testing.T) {
31 }
32 }
33
34 -func TestSquidLog_ConfigurationSerialize(t *testing.T) {
35 - module.TestConfigurationSerialize(t, &SquidLog{}, dataConfigJSON, dataConfigYAML)
34 +func TestCollector_ConfigurationSerialize(t *testing.T) {
35 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
36 }
37
38 func TestNew(t *testing.T) {
39 assert.Implements(t, (*module.Module)(nil), New())
40 }
41
42 -func TestSquidLog_Init(t *testing.T) {
43 - squidlog := New()
42 +func TestCollector_Init(t *testing.T) {
43 + collr := New()
44
45 - assert.NoError(t, squidlog.Init())
45 + assert.NoError(t, collr.Init())
46 }
47
48 -func TestSquidLog_Check(t *testing.T) {
48 +func TestCollector_Check(t *testing.T) {
49 }
50
51 -func TestSquidLog_Check_ErrorOnCreatingLogReaderNoLogFile(t *testing.T) {
52 - squid := New()
53 - defer squid.Cleanup()
54 - squid.Path = "testdata/not_exists.log"
55 - require.NoError(t, squid.Init())
51 +func TestCollector_Check_ErrorOnCreatingLogReaderNoLogFile(t *testing.T) {
52 + collr := New()
53 + defer collr.Cleanup()
54 + collr.Path = "testdata/not_exists.log"
55 + require.NoError(t, collr.Init())
56
57 - assert.Error(t, squid.Check())
57 + assert.Error(t, collr.Check())
58 }
59
60 func TestSquid_Check_ErrorOnCreatingParserUnknownFormat(t *testing.T) {
61 - squid := New()
62 - defer squid.Cleanup()
63 - squid.Path = "testdata/unknown.log"
64 - require.NoError(t, squid.Init())
61 + collr := New()
62 + defer collr.Cleanup()
63 + collr.Path = "testdata/unknown.log"
64 + require.NoError(t, collr.Init())
65
66 - assert.Error(t, squid.Check())
66 + assert.Error(t, collr.Check())
67 }
68
69 func TestSquid_Check_ErrorOnCreatingParserZeroKnownFields(t *testing.T) {
70 - squid := New()
71 - defer squid.Cleanup()
72 - squid.Path = "testdata/access.log"
73 - squid.ParserConfig.CSV.Format = "$one $two"
74 - require.NoError(t, squid.Init())
70 + collr := New()
71 + defer collr.Cleanup()
72 + collr.Path = "testdata/access.log"
73 + collr.ParserConfig.CSV.Format = "$one $two"
74 + require.NoError(t, collr.Init())
75
76 - assert.Error(t, squid.Check())
76 + assert.Error(t, collr.Check())
77 }
78
79 -func TestSquidLog_Charts(t *testing.T) {
79 +func TestCollector_Charts(t *testing.T) {
80 assert.Nil(t, New().Charts())
81
82 - squid := prepareSquidCollect(t)
83 - assert.NotNil(t, squid.Charts())
82 + collr := prepareSquidCollect(t)
83 + assert.NotNil(t, collr.Charts())
84
85 }
86
87 -func TestSquidLog_Cleanup(t *testing.T) {
87 +func TestCollector_Cleanup(t *testing.T) {
88 New().Cleanup()
89 }
90
91 -func TestSquidLog_Collect(t *testing.T) {
92 - squid := prepareSquidCollect(t)
91 +func TestCollector_Collect(t *testing.T) {
92 + collr := prepareSquidCollect(t)
93
94 expected := map[string]int64{
95 "bytes_sent": 6827357,
@@ -159,14 +159,14 @@ func TestSquidLog_Collect(t *testing.T) {
159 "unmatched": 16,
160 }
161
162 - collected := squid.Collect()
162 + collected := collr.Collect()
163
164 assert.Equal(t, expected, collected)
165 - testCharts(t, squid, collected)
165 + testCharts(t, collr, collected)
166 }
167
168 -func TestSquidLog_Collect_ReturnOldDataIfNothingRead(t *testing.T) {
169 - squid := prepareSquidCollect(t)
168 +func TestCollector_Collect_ReturnOldDataIfNothingRead(t *testing.T) {
169 + collr := prepareSquidCollect(t)
170
171 expected := map[string]int64{
172 "bytes_sent": 6827357,
@@ -236,37 +236,37 @@ func TestSquidLog_Collect_ReturnOldDataIfNothingRead(t *testing.T) {
236 "unmatched": 16,
237 }
238
239 - _ = squid.Collect()
239 + _ = collr.Collect()
240
241 - mx := squid.Collect()
241 + mx := collr.Collect()
242
243 assert.Equal(t, expected, mx)
244
245 - testCharts(t, squid, mx)
245 + testCharts(t, collr, mx)
246 }
247
248 -func testCharts(t *testing.T, squidlog *SquidLog, mx map[string]int64) {
248 +func testCharts(t *testing.T, collr *Collector, mx map[string]int64) {
249 t.Helper()
250 - ensureChartsDynamicDimsCreated(t, squidlog)
251 - module.TestMetricsHasAllChartsDims(t, squidlog.Charts(), mx)
250 + ensureChartsDynamicDimsCreated(t, collr)
251 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
252 }
253
254 -func ensureChartsDynamicDimsCreated(t *testing.T, squid *SquidLog) {
255 - ensureDynamicDimsCreated(t, squid, cacheCodeChart.ID, pxCacheCode, squid.mx.CacheCode)
256 - ensureDynamicDimsCreated(t, squid, cacheCodeTransportTagChart.ID, pxTransportTag, squid.mx.CacheCodeTransportTag)
257 - ensureDynamicDimsCreated(t, squid, cacheCodeHandlingTagChart.ID, pxHandlingTag, squid.mx.CacheCodeHandlingTag)
258 - ensureDynamicDimsCreated(t, squid, cacheCodeObjectTagChart.ID, pxObjectTag, squid.mx.CacheCodeObjectTag)
259 - ensureDynamicDimsCreated(t, squid, cacheCodeLoadSourceTagChart.ID, pxSourceTag, squid.mx.CacheCodeLoadSourceTag)
260 - ensureDynamicDimsCreated(t, squid, cacheCodeErrorTagChart.ID, pxErrorTag, squid.mx.CacheCodeErrorTag)
261 - ensureDynamicDimsCreated(t, squid, httpRespCodesChart.ID, pxHTTPCode, squid.mx.HTTPRespCode)
262 - ensureDynamicDimsCreated(t, squid, reqMethodChart.ID, pxReqMethod, squid.mx.ReqMethod)
263 - ensureDynamicDimsCreated(t, squid, hierCodeChart.ID, pxHierCode, squid.mx.HierCode)
264 - ensureDynamicDimsCreated(t, squid, serverAddrChart.ID, pxSrvAddr, squid.mx.Server)
265 - ensureDynamicDimsCreated(t, squid, mimeTypeChart.ID, pxMimeType, squid.mx.MimeType)
254 +func ensureChartsDynamicDimsCreated(t *testing.T, collr *Collector) {
255 + ensureDynamicDimsCreated(t, collr, cacheCodeChart.ID, pxCacheCode, collr.mx.CacheCode)
256 + ensureDynamicDimsCreated(t, collr, cacheCodeTransportTagChart.ID, pxTransportTag, collr.mx.CacheCodeTransportTag)
257 + ensureDynamicDimsCreated(t, collr, cacheCodeHandlingTagChart.ID, pxHandlingTag, collr.mx.CacheCodeHandlingTag)
258 + ensureDynamicDimsCreated(t, collr, cacheCodeObjectTagChart.ID, pxObjectTag, collr.mx.CacheCodeObjectTag)
259 + ensureDynamicDimsCreated(t, collr, cacheCodeLoadSourceTagChart.ID, pxSourceTag, collr.mx.CacheCodeLoadSourceTag)
260 + ensureDynamicDimsCreated(t, collr, cacheCodeErrorTagChart.ID, pxErrorTag, collr.mx.CacheCodeErrorTag)
261 + ensureDynamicDimsCreated(t, collr, httpRespCodesChart.ID, pxHTTPCode, collr.mx.HTTPRespCode)
262 + ensureDynamicDimsCreated(t, collr, reqMethodChart.ID, pxReqMethod, collr.mx.ReqMethod)
263 + ensureDynamicDimsCreated(t, collr, hierCodeChart.ID, pxHierCode, collr.mx.HierCode)
264 + ensureDynamicDimsCreated(t, collr, serverAddrChart.ID, pxSrvAddr, collr.mx.Server)
265 + ensureDynamicDimsCreated(t, collr, mimeTypeChart.ID, pxMimeType, collr.mx.MimeType)
266 }
267
268 -func ensureDynamicDimsCreated(t *testing.T, squid *SquidLog, chartID, dimPrefix string, data metrix.CounterVec) {
269 - chart := squid.Charts().Get(chartID)
268 +func ensureDynamicDimsCreated(t *testing.T, collr *Collector, chartID, dimPrefix string, data metrix.CounterVec) {
269 + chart := collr.Charts().Get(chartID)
270 assert.NotNilf(t, chart, "chart '%s' is not created", chartID)
271 if chart == nil {
272 return
@@ -277,18 +277,18 @@ func ensureDynamicDimsCreated(t *testing.T, squid *SquidLog, chartID, dimPrefix
277 }
278 }
279
280 -func prepareSquidCollect(t *testing.T) *SquidLog {
280 +func prepareSquidCollect(t *testing.T) *Collector {
281 t.Helper()
282 - squid := New()
283 - squid.Path = "testdata/access.log"
284 - require.NoError(t, squid.Init())
285 - require.NoError(t, squid.Check())
286 - defer squid.Cleanup()
282 + collr := New()
283 + collr.Path = "testdata/access.log"
284 + require.NoError(t, collr.Init())
285 + require.NoError(t, collr.Check())
286 + defer collr.Cleanup()
287
288 - p, err := logs.NewCSVParser(squid.ParserConfig.CSV, bytes.NewReader(dataNativeFormatAccessLog))
288 + p, err := logs.NewCSVParser(collr.ParserConfig.CSV, bytes.NewReader(dataNativeFormatAccessLog))
289 require.NoError(t, err)
290 - squid.parser = p
291 - return squid
290 + collr.parser = p
291 + return collr
292 }
293
294 // generateLogs is used to populate 'testdata/access.log'
src/go/plugin/go.d/collector/squidlog/init.go
+18 -18
@@ -9,26 +9,26 @@ import (
9 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/logs"
10 )
11
12 -func (s *SquidLog) createLogReader() error {
13 - s.Cleanup()
14 - s.Debug("starting log reader creating")
12 +func (c *Collector) createLogReader() error {
13 + c.Cleanup()
14 + c.Debug("starting log reader creating")
15
16 - reader, err := logs.Open(s.Path, s.ExcludePath, s.Logger)
16 + reader, err := logs.Open(c.Path, c.ExcludePath, c.Logger)
17 if err != nil {
18 return fmt.Errorf("creating log reader: %v", err)
19 }
20
21 - s.Debugf("created log reader, current file '%s'", reader.CurrentFilename())
22 - s.file = reader
21 + c.Debugf("created log reader, current file '%s'", reader.CurrentFilename())
22 + c.file = reader
23 return nil
24 }
25
26 -func (s *SquidLog) createParser() error {
27 - s.Debug("starting parser creating")
26 +func (c *Collector) createParser() error {
27 + c.Debug("starting parser creating")
28
29 const readLastLinesNum = 100
30
31 - lines, err := logs.ReadLastLines(s.file.CurrentFilename(), readLastLinesNum)
31 + lines, err := logs.ReadLastLines(c.file.CurrentFilename(), readLastLinesNum)
32 if err != nil {
33 return fmt.Errorf("failed to read last lines: %v", err)
34 }
@@ -39,23 +39,23 @@ func (s *SquidLog) createParser() error {
39 continue
40 }
41
42 - s.Debugf("last line: '%s'", line)
42 + c.Debugf("last line: '%s'", line)
43
44 - s.parser, err = logs.NewParser(s.ParserConfig, s.file)
44 + c.parser, err = logs.NewParser(c.ParserConfig, c.file)
45 if err != nil {
46 - s.Debugf("failed to create parser from line: %v", err)
46 + c.Debugf("failed to create parser from line: %v", err)
47 continue
48 }
49
50 - s.line.reset()
50 + c.line.reset()
51
52 - if err = s.parser.Parse([]byte(line), s.line); err != nil {
53 - s.Debugf("failed to parse line: %v", err)
52 + if err = c.parser.Parse([]byte(line), c.line); err != nil {
53 + c.Debugf("failed to parse line: %v", err)
54 continue
55 }
56
57 - if err = s.line.verify(); err != nil {
58 - s.Debugf("failed to verify line: %v", err)
57 + if err = c.line.verify(); err != nil {
58 + c.Debugf("failed to verify line: %v", err)
59 continue
60 }
61
@@ -64,7 +64,7 @@ func (s *SquidLog) createParser() error {
64 }
65
66 if !found {
67 - return fmt.Errorf("failed to create log parser (file '%s')", s.file.CurrentFilename())
67 + return fmt.Errorf("failed to create log parser (file '%s')", c.file.CurrentFilename())
68 }
69
70 return nil
src/go/plugin/go.d/collector/storcli/charts.go
+9 -9
@@ -173,7 +173,7 @@ var (
173 }
174 )
175
176 -func (s *StorCli) addControllerCharts(cntrl controllerInfo) {
176 +func (c *Collector) addControllerCharts(cntrl controllerInfo) {
177 var charts *module.Charts
178
179 switch cntrl.Version.DriverName {
@@ -202,12 +202,12 @@ func (s *StorCli) addControllerCharts(cntrl controllerInfo) {
202 }
203 }
204
205 - if err := s.Charts().Add(*charts...); err != nil {
206 - s.Warning(err)
205 + if err := c.Charts().Add(*charts...); err != nil {
206 + c.Warning(err)
207 }
208 }
209
210 -func (s *StorCli) addPhysDriveCharts(cntrlNum int, di *driveInfo, ds *driveState, da *driveAttrs) {
210 +func (c *Collector) addPhysDriveCharts(cntrlNum int, di *driveInfo, ds *driveState, da *driveAttrs) {
211 charts := physDriveChartsTmpl.Copy()
212
213 if _, ok := parseInt(getTemperature(ds.DriveTemperature)); !ok {
@@ -234,12 +234,12 @@ func (s *StorCli) addPhysDriveCharts(cntrlNum int, di *driveInfo, ds *driveState
234 }
235 }
236
237 - if err := s.Charts().Add(*charts...); err != nil {
238 - s.Warning(err)
237 + if err := c.Charts().Add(*charts...); err != nil {
238 + c.Warning(err)
239 }
240 }
241
242 -func (s *StorCli) addBBUCharts(cntrlNum, bbuNum, model string) {
242 +func (c *Collector) addBBUCharts(cntrlNum, bbuNum, model string) {
243 charts := bbuChartsTmpl.Copy()
244
245 for _, chart := range *charts {
@@ -254,7 +254,7 @@ func (s *StorCli) addBBUCharts(cntrlNum, bbuNum, model string) {
254 }
255 }
256
257 - if err := s.Charts().Add(*charts...); err != nil {
258 - s.Warning(err)
257 + if err := c.Charts().Add(*charts...); err != nil {
258 + c.Warning(err)
259 }
260 }
src/go/plugin/go.d/collector/storcli/collect.go
+6 -6
@@ -11,8 +11,8 @@ const (
11 driverNameSas = "mpt3sas"
12 )
13
14 -func (s *StorCli) collect() (map[string]int64, error) {
15 - cntrlResp, err := s.queryControllersInfo()
14 +func (c *Collector) collect() (map[string]int64, error) {
15 + cntrlResp, err := c.queryControllersInfo()
16 if err != nil {
17 return nil, err
18 }
@@ -23,20 +23,20 @@ func (s *StorCli) collect() (map[string]int64, error) {
23
24 switch driver {
25 case driverNameMegaraid:
26 - if err := s.collectMegaraidControllersInfo(mx, cntrlResp); err != nil {
26 + if err := c.collectMegaraidControllersInfo(mx, cntrlResp); err != nil {
27 return nil, fmt.Errorf("failed to collect megaraid controller info: %s", err)
28 }
29 if len(cntrlResp.Controllers[0].ResponseData.PDList) > 0 {
30 - drivesResp, err := s.queryDrivesInfo()
30 + drivesResp, err := c.queryDrivesInfo()
31 if err != nil {
32 return nil, fmt.Errorf("failed to collect megaraid drive info: %s", err)
33 }
34 - if err := s.collectMegaRaidDrives(mx, drivesResp); err != nil {
34 + if err := c.collectMegaRaidDrives(mx, drivesResp); err != nil {
35 return nil, err
36 }
37 }
38 case driverNameSas:
39 - if err := s.collectMpt3sasControllersInfo(mx, cntrlResp); err != nil {
39 + if err := c.collectMpt3sasControllersInfo(mx, cntrlResp); err != nil {
40 return nil, fmt.Errorf("failed to collect mpt3sas controller info: %s", err)
41 }
42 default:
src/go/plugin/go.d/collector/storcli/collect_controllers.go
+13 -13
@@ -49,15 +49,15 @@ type (
49 }
50 )
51
52 -func (s *StorCli) collectMegaraidControllersInfo(mx map[string]int64, resp *controllersInfoResponse) error {
52 +func (c *Collector) collectMegaraidControllersInfo(mx map[string]int64, resp *controllersInfoResponse) error {
53 for _, v := range resp.Controllers {
54 cntrl := v.ResponseData
55
56 cntrlNum := strconv.Itoa(cntrl.Basics.Controller)
57
58 - if !s.controllers[cntrlNum] {
59 - s.controllers[cntrlNum] = true
60 - s.addControllerCharts(cntrl)
58 + if !c.controllers[cntrlNum] {
59 + c.controllers[cntrlNum] = true
60 + c.addControllerCharts(cntrl)
61 }
62
63 px := fmt.Sprintf("cntrl_%s_", cntrlNum)
@@ -93,9 +93,9 @@ func (s *StorCli) collectMegaraidControllersInfo(mx map[string]int64, resp *cont
93
94 for i, bbu := range cntrl.BBUInfo {
95 bbuNum := strconv.Itoa(i)
96 - if k := cntrlNum + bbuNum; !s.bbu[k] {
97 - s.bbu[k] = true
98 - s.addBBUCharts(cntrlNum, bbuNum, bbu.Model)
96 + if k := cntrlNum + bbuNum; !c.bbu[k] {
97 + c.bbu[k] = true
98 + c.addBBUCharts(cntrlNum, bbuNum, bbu.Model)
99 }
100
101 px := fmt.Sprintf("bbu_%s_cntrl_%s_", bbuNum, cntrlNum)
@@ -109,15 +109,15 @@ func (s *StorCli) collectMegaraidControllersInfo(mx map[string]int64, resp *cont
109 return nil
110 }
111
112 -func (s *StorCli) collectMpt3sasControllersInfo(mx map[string]int64, resp *controllersInfoResponse) error {
112 +func (c *Collector) collectMpt3sasControllersInfo(mx map[string]int64, resp *controllersInfoResponse) error {
113 for _, v := range resp.Controllers {
114 cntrl := v.ResponseData
115
116 cntrlNum := strconv.Itoa(cntrl.Basics.Controller)
117
118 - if !s.controllers[cntrlNum] {
119 - s.controllers[cntrlNum] = true
120 - s.addControllerCharts(cntrl)
118 + if !c.controllers[cntrlNum] {
119 + c.controllers[cntrlNum] = true
120 + c.addControllerCharts(cntrl)
121 }
122
123 px := fmt.Sprintf("cntrl_%s_", cntrlNum)
@@ -140,8 +140,8 @@ func (s *StorCli) collectMpt3sasControllersInfo(mx map[string]int64, resp *contr
140 return nil
141 }
142
143 -func (s *StorCli) queryControllersInfo() (*controllersInfoResponse, error) {
144 - bs, err := s.exec.controllersInfo()
143 +func (c *Collector) queryControllersInfo() (*controllersInfoResponse, error) {
144 + bs, err := c.exec.controllersInfo()
145 if err != nil {
146 return nil, err
147 }
src/go/plugin/go.d/collector/storcli/collect_drives.go
+6 -6
@@ -56,7 +56,7 @@ type storNumber string // some int values can be 'N/A'
56
57 func (n *storNumber) UnmarshalJSON(b []byte) error { *n = storNumber(b); return nil }
58
59 -func (s *StorCli) collectMegaRaidDrives(mx map[string]int64, resp *drivesInfoResponse) error {
59 +func (c *Collector) collectMegaRaidDrives(mx map[string]int64, resp *drivesInfoResponse) error {
60 if resp == nil {
61 return nil
62 }
@@ -102,9 +102,9 @@ func (s *StorCli) collectMegaRaidDrives(mx map[string]int64, resp *drivesInfoRes
102 continue
103 }
104
105 - if !s.drives[attrs.WWN] {
106 - s.drives[attrs.WWN] = true
107 - s.addPhysDriveCharts(cntrlIdx, info, state, attrs)
105 + if !c.drives[attrs.WWN] {
106 + c.drives[attrs.WWN] = true
107 + c.addPhysDriveCharts(cntrlIdx, info, state, attrs)
108 }
109
110 px := fmt.Sprintf("phys_drive_%s_cntrl_%d_", attrs.WWN, cntrlIdx)
@@ -135,8 +135,8 @@ func (s *StorCli) collectMegaRaidDrives(mx map[string]int64, resp *drivesInfoRes
135 return nil
136 }
137
138 -func (s *StorCli) queryDrivesInfo() (*drivesInfoResponse, error) {
139 - bs, err := s.exec.drivesInfo()
138 +func (c *Collector) queryDrivesInfo() (*drivesInfoResponse, error) {
139 + bs, err := c.exec.drivesInfo()
140 if err != nil {
141 return nil, err
142 }
src/go/plugin/go.d/collector/storcli/collector.go renamed
+24 -30
@@ -28,8 +28,8 @@ func init() {
28 })
29 }
30
31 -func New() *StorCli {
32 - return &StorCli{
31 +func New() *Collector {
32 + return &Collector{
33 Config: Config{
34 Timeout: confopt.Duration(time.Second * 2),
35 },
@@ -45,41 +45,35 @@ type Config struct {
45 Timeout confopt.Duration `yaml:"timeout,omitempty" json:"timeout"`
46 }
47
48 -type (
49 - StorCli struct {
50 - module.Base
51 - Config `yaml:",inline" json:""`
48 +type Collector struct {
49 + module.Base
50 + Config `yaml:",inline" json:""`
51
53 - charts *module.Charts
52 + charts *module.Charts
53
55 - exec storCli
54 + exec storCli
55
57 - controllers map[string]bool
58 - drives map[string]bool
59 - bbu map[string]bool
60 - }
61 - storCli interface {
62 - controllersInfo() ([]byte, error)
63 - drivesInfo() ([]byte, error)
64 - }
65 -)
56 + controllers map[string]bool
57 + drives map[string]bool
58 + bbu map[string]bool
59 +}
60
67 -func (s *StorCli) Configuration() any {
68 - return s.Config
61 +func (c *Collector) Configuration() any {
62 + return c.Config
63 }
64
71 -func (s *StorCli) Init() error {
72 - storExec, err := s.initStorCliExec()
65 +func (c *Collector) Init() error {
66 + storExec, err := c.initStorCliExec()
67 if err != nil {
68 return fmt.Errorf("storcli exec initialization: %v", err)
69 }
76 - s.exec = storExec
70 + c.exec = storExec
71
72 return nil
73 }
74
81 -func (s *StorCli) Check() error {
82 - mx, err := s.collect()
75 +func (c *Collector) Check() error {
76 + mx, err := c.collect()
77 if err != nil {
78 return err
79 }
@@ -91,14 +85,14 @@ func (s *StorCli) Check() error {
85 return nil
86 }
87
94 -func (s *StorCli) Charts() *module.Charts {
95 - return s.charts
88 +func (c *Collector) Charts() *module.Charts {
89 + return c.charts
90 }
91
98 -func (s *StorCli) Collect() map[string]int64 {
99 - mx, err := s.collect()
92 +func (c *Collector) Collect() map[string]int64 {
93 + mx, err := c.collect()
94 if err != nil {
101 - s.Error(err)
95 + c.Error(err)
96 }
97
98 if len(mx) == 0 {
@@ -108,4 +102,4 @@ func (s *StorCli) Collect() map[string]int64 {
102 return mx
103 }
104
111 -func (s *StorCli) Cleanup() {}
105 +func (c *Collector) Cleanup() {}
src/go/plugin/go.d/collector/storcli/collector_test.go renamed
+33 -33
@@ -37,11 +37,11 @@ func Test_testDataIsValid(t *testing.T) {
37 }
38 }
39
40 -func TestStorCli_ConfigurationSerialize(t *testing.T) {
41 - module.TestConfigurationSerialize(t, &StorCli{}, dataConfigJSON, dataConfigYAML)
40 +func TestCollector_ConfigurationSerialize(t *testing.T) {
41 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
42 }
43
44 -func TestStorCli_Init(t *testing.T) {
44 +func TestCollector_Init(t *testing.T) {
45 tests := map[string]struct {
46 config Config
47 wantFail bool
@@ -54,58 +54,58 @@ func TestStorCli_Init(t *testing.T) {
54
55 for name, test := range tests {
56 t.Run(name, func(t *testing.T) {
57 - stor := New()
57 + collr := New()
58
59 if test.wantFail {
60 - assert.Error(t, stor.Init())
60 + assert.Error(t, collr.Init())
61 } else {
62 - assert.NoError(t, stor.Init())
62 + assert.NoError(t, collr.Init())
63 }
64 })
65 }
66 }
67
68 -func TestStorCli_Cleanup(t *testing.T) {
68 +func TestCollector_Cleanup(t *testing.T) {
69 tests := map[string]struct {
70 - prepare func() *StorCli
70 + prepare func() *Collector
71 }{
72 "not initialized exec": {
73 - prepare: func() *StorCli {
73 + prepare: func() *Collector {
74 return New()
75 },
76 },
77 "after check": {
78 - prepare: func() *StorCli {
79 - stor := New()
80 - stor.exec = prepareMockMegaRaidOK()
81 - _ = stor.Check()
82 - return stor
78 + prepare: func() *Collector {
79 + collr := New()
80 + collr.exec = prepareMockMegaRaidOK()
81 + _ = collr.Check()
82 + return collr
83 },
84 },
85 "after collect": {
86 - prepare: func() *StorCli {
87 - stor := New()
88 - stor.exec = prepareMockMegaRaidOK()
89 - _ = stor.Collect()
90 - return stor
86 + prepare: func() *Collector {
87 + collr := New()
88 + collr.exec = prepareMockMegaRaidOK()
89 + _ = collr.Collect()
90 + return collr
91 },
92 },
93 }
94
95 for name, test := range tests {
96 t.Run(name, func(t *testing.T) {
97 - stor := test.prepare()
97 + collr := test.prepare()
98
99 - assert.NotPanics(t, stor.Cleanup)
99 + assert.NotPanics(t, collr.Cleanup)
100 })
101 }
102 }
103
104 -func TestStorCli_Charts(t *testing.T) {
104 +func TestCollector_Charts(t *testing.T) {
105 assert.NotNil(t, New().Charts())
106 }
107
108 -func TestStorCli_Check(t *testing.T) {
108 +func TestCollector_Check(t *testing.T) {
109 tests := map[string]struct {
110 prepareMock func() *mockStorCliExec
111 wantFail bool
@@ -130,20 +130,20 @@ func TestStorCli_Check(t *testing.T) {
130
131 for name, test := range tests {
132 t.Run(name, func(t *testing.T) {
133 - stor := New()
133 + collr := New()
134 mock := test.prepareMock()
135 - stor.exec = mock
135 + collr.exec = mock
136
137 if test.wantFail {
138 - assert.Error(t, stor.Check())
138 + assert.Error(t, collr.Check())
139 } else {
140 - assert.NoError(t, stor.Check())
140 + assert.NoError(t, collr.Check())
141 }
142 })
143 }
144 }
145
146 -func TestStorCli_Collect(t *testing.T) {
146 +func TestCollector_Collect(t *testing.T) {
147 tests := map[string]struct {
148 prepareMock func() *mockStorCliExec
149 wantMetrics map[string]int64
@@ -226,17 +226,17 @@ func TestStorCli_Collect(t *testing.T) {
226
227 for name, test := range tests {
228 t.Run(name, func(t *testing.T) {
229 - stor := New()
229 + collr := New()
230 mock := test.prepareMock()
231 - stor.exec = mock
231 + collr.exec = mock
232
233 - mx := stor.Collect()
233 + mx := collr.Collect()
234
235 assert.Equal(t, test.wantMetrics, mx)
236
237 - assert.Len(t, *stor.Charts(), test.wantCharts, "wantCharts")
237 + assert.Len(t, *collr.Charts(), test.wantCharts, "wantCharts")
238
239 - module.TestMetricsHasAllChartsDims(t, stor.Charts(), mx)
239 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
240 })
241 }
242 }
src/go/plugin/go.d/collector/storcli/exec.go
+5
@@ -13,6 +13,11 @@ import (
13 "github.com/netdata/netdata/go/plugins/logger"
14 )
15
16 +type storCli interface {
17 + controllersInfo() ([]byte, error)
18 + drivesInfo() ([]byte, error)
19 +}
20 +
21 func newStorCliExec(ndsudoPath string, timeout time.Duration, log *logger.Logger) *storCliExec {
22 return &storCliExec{
23 Logger: log,
src/go/plugin/go.d/collector/storcli/init.go
+2 -2
@@ -12,14 +12,14 @@ import (
12 "github.com/netdata/netdata/go/plugins/pkg/executable"
13 )
14
15 -func (s *StorCli) initStorCliExec() (storCli, error) {
15 +func (c *Collector) initStorCliExec() (storCli, error) {
16 ndsudoPath := filepath.Join(executable.Directory, "ndsudo")
17
18 if _, err := os.Stat(ndsudoPath); err != nil {
19 return nil, fmt.Errorf("ndsudo executable not found: %v", err)
20 }
21
22 - storExec := newStorCliExec(ndsudoPath, s.Timeout.Duration(), s.Logger)
22 + storExec := newStorCliExec(ndsudoPath, c.Timeout.Duration(), c.Logger)
23
24 return storExec, nil
25 }
src/go/plugin/go.d/collector/supervisord/client.go
+5
@@ -14,6 +14,11 @@ import (
14 "github.com/mattn/go-xmlrpc"
15 )
16
17 +type supervisorClient interface {
18 + getAllProcessInfo() ([]processStatus, error)
19 + closeIdleConnections()
20 +}
21 +
22 type supervisorRPCClient struct {
23 client *xmlrpc.Client
24 }
src/go/plugin/go.d/collector/supervisord/collect.go
+38 -38
@@ -9,31 +9,31 @@ import (
9 "github.com/netdata/netdata/go/plugins/plugin/go.d/agent/module"
10 )
11
12 -func (s *Supervisord) collect() (map[string]int64, error) {
13 - info, err := s.client.getAllProcessInfo()
12 +func (c *Collector) collect() (map[string]int64, error) {
13 + info, err := c.client.getAllProcessInfo()
14 if err != nil {
15 return nil, err
16 }
17
18 ms := make(map[string]int64)
19 - s.collectAllProcessInfo(ms, info)
19 + c.collectAllProcessInfo(ms, info)
20
21 return ms, nil
22 }
23
24 -func (s *Supervisord) collectAllProcessInfo(ms map[string]int64, info []processStatus) {
25 - s.resetCache()
24 +func (c *Collector) collectAllProcessInfo(ms map[string]int64, info []processStatus) {
25 + c.resetCache()
26 ms["running_processes"] = 0
27 ms["non_running_processes"] = 0
28 for _, p := range info {
29 - if _, ok := s.cache[p.group]; !ok {
30 - s.cache[p.group] = make(map[string]bool)
31 - s.addProcessGroupCharts(p)
29 + if _, ok := c.cache[p.group]; !ok {
30 + c.cache[p.group] = make(map[string]bool)
31 + c.addProcessGroupCharts(p)
32 }
33 - if _, ok := s.cache[p.group][p.name]; !ok {
34 - s.addProcessToCharts(p)
33 + if _, ok := c.cache[p.group][p.name]; !ok {
34 + c.addProcessToCharts(p)
35 }
36 - s.cache[p.group][p.name] = true
36 + c.cache[p.group][p.name] = true
37
38 ms["group_"+p.group+"_running_processes"] += 0
39 ms["group_"+p.group+"_non_running_processes"] += 0
@@ -50,28 +50,28 @@ func (s *Supervisord) collectAllProcessInfo(ms map[string]int64, info []processS
50 ms[id+"_uptime"] = calcProcessUptime(p)
51 ms[id+"_downtime"] = calcProcessDowntime(p)
52 }
53 - s.cleanupCache()
53 + c.cleanupCache()
54 }
55
56 -func (s *Supervisord) resetCache() {
57 - for _, procs := range s.cache {
56 +func (c *Collector) resetCache() {
57 + for _, procs := range c.cache {
58 for name := range procs {
59 procs[name] = false
60 }
61 }
62 }
63
64 -func (s *Supervisord) cleanupCache() {
65 - for group, procs := range s.cache {
64 +func (c *Collector) cleanupCache() {
65 + for group, procs := range c.cache {
66 for name, ok := range procs {
67 if !ok {
68 - s.removeProcessFromCharts(group, name)
69 - delete(s.cache[group], name)
68 + c.removeProcessFromCharts(group, name)
69 + delete(c.cache[group], name)
70 }
71 }
72 - if len(s.cache[group]) == 0 {
73 - s.removeProcessGroupCharts(group)
74 - delete(s.cache, group)
72 + if len(c.cache[group]) == 0 {
73 + c.removeProcessGroupCharts(group)
74 + delete(c.cache, group)
75 }
76 }
77 }
@@ -90,18 +90,18 @@ func calcProcessDowntime(p processStatus) int64 {
90 return int64(p.now - p.stop)
91 }
92
93 -func (s *Supervisord) addProcessGroupCharts(p processStatus) {
93 +func (c *Collector) addProcessGroupCharts(p processStatus) {
94 charts := newProcGroupCharts(p.group)
95 - if err := s.Charts().Add(*charts...); err != nil {
96 - s.Warning(err)
95 + if err := c.Charts().Add(*charts...); err != nil {
96 + c.Warning(err)
97 }
98 }
99
100 -func (s *Supervisord) addProcessToCharts(p processStatus) {
100 +func (c *Collector) addProcessToCharts(p processStatus) {
101 id := procID(p)
102 - for _, c := range *s.Charts() {
102 + for _, chart := range *c.Charts() {
103 var dimID string
104 - switch c.ID {
104 + switch chart.ID {
105 case fmt.Sprintf(groupProcessesStateCodeChartTmpl.ID, p.group):
106 dimID = id + "_state_code"
107 case fmt.Sprintf(groupProcessesExitStatusChartTmpl.ID, p.group):
@@ -114,17 +114,17 @@ func (s *Supervisord) addProcessToCharts(p processStatus) {
114 continue
115 }
116 dim := &module.Dim{ID: dimID, Name: p.name}
117 - if err := c.AddDim(dim); err != nil {
118 - s.Warning(err)
117 + if err := chart.AddDim(dim); err != nil {
118 + c.Warning(err)
119 return
120 }
121 - c.MarkNotCreated()
121 + chart.MarkNotCreated()
122 }
123 }
124
125 -func (s *Supervisord) removeProcessGroupCharts(group string) {
125 +func (c *Collector) removeProcessGroupCharts(group string) {
126 prefix := "group_" + group
127 - for _, c := range *s.Charts() {
127 + for _, c := range *c.Charts() {
128 if strings.HasPrefix(c.ID, prefix) {
129 c.MarkRemove()
130 c.MarkNotCreated()
@@ -132,11 +132,11 @@ func (s *Supervisord) removeProcessGroupCharts(group string) {
132 }
133 }
134
135 -func (s *Supervisord) removeProcessFromCharts(group, name string) {
135 +func (c *Collector) removeProcessFromCharts(group, name string) {
136 id := procID(processStatus{name: name, group: group})
137 - for _, c := range *s.Charts() {
137 + for _, chart := range *c.Charts() {
138 var dimID string
139 - switch c.ID {
139 + switch chart.ID {
140 case fmt.Sprintf(groupProcessesStateCodeChartTmpl.ID, group):
141 dimID = id + "_state_code"
142 case fmt.Sprintf(groupProcessesExitStatusChartTmpl.ID, group):
@@ -148,11 +148,11 @@ func (s *Supervisord) removeProcessFromCharts(group, name string) {
148 default:
149 continue
150 }
151 - if err := c.MarkDimRemove(dimID, true); err != nil {
152 - s.Warning(err)
151 + if err := chart.MarkDimRemove(dimID, true); err != nil {
152 + c.Warning(err)
153 return
154 }
155 - c.MarkNotCreated()
155 + chart.MarkNotCreated()
156 }
157 }
158
src/go/plugin/go.d/collector/supervisord/collector.go renamed
+25 -31
@@ -24,8 +24,8 @@ func init() {
24 })
25 }
26
27 -func New() *Supervisord {
28 - return &Supervisord{
27 +func New() *Collector {
28 + return &Collector{
29 Config: Config{
30 URL: "http://127.0.0.1:9001/RPC2",
31 ClientConfig: web.ClientConfig{
@@ -44,44 +44,38 @@ type Config struct {
44 web.ClientConfig `yaml:",inline" json:""`
45 }
46
47 -type (
48 - Supervisord struct {
49 - module.Base
50 - Config `yaml:",inline" json:""`
47 +type Collector struct {
48 + module.Base
49 + Config `yaml:",inline" json:""`
50
52 - charts *module.Charts
51 + charts *module.Charts
52
54 - client supervisorClient
53 + client supervisorClient
54
56 - cache map[string]map[string]bool // map[group][procName]collected
57 - }
58 - supervisorClient interface {
59 - getAllProcessInfo() ([]processStatus, error)
60 - closeIdleConnections()
61 - }
62 -)
55 + cache map[string]map[string]bool // map[group][procName]collected
56 +}
57
64 -func (s *Supervisord) Configuration() any {
65 - return s.Config
58 +func (c *Collector) Configuration() any {
59 + return c.Config
60 }
61
68 -func (s *Supervisord) Init() error {
69 - err := s.verifyConfig()
62 +func (c *Collector) Init() error {
63 + err := c.verifyConfig()
64 if err != nil {
65 return fmt.Errorf("verify config: %v", err)
66 }
67
74 - client, err := s.initSupervisorClient()
68 + client, err := c.initSupervisorClient()
69 if err != nil {
70 return fmt.Errorf("init supervisord client: %v", err)
71 }
78 - s.client = client
72 + c.client = client
73
74 return nil
75 }
76
83 -func (s *Supervisord) Check() error {
84 - mx, err := s.collect()
77 +func (c *Collector) Check() error {
78 + mx, err := c.collect()
79 if err != nil {
80 return err
81 }
@@ -91,14 +85,14 @@ func (s *Supervisord) Check() error {
85 return nil
86 }
87
94 -func (s *Supervisord) Charts() *module.Charts {
95 - return s.charts
88 +func (c *Collector) Charts() *module.Charts {
89 + return c.charts
90 }
91
98 -func (s *Supervisord) Collect() map[string]int64 {
99 - ms, err := s.collect()
92 +func (c *Collector) Collect() map[string]int64 {
93 + ms, err := c.collect()
94 if err != nil {
101 - s.Error(err)
95 + c.Error(err)
96 }
97
98 if len(ms) == 0 {
@@ -107,8 +101,8 @@ func (s *Supervisord) Collect() map[string]int64 {
101 return ms
102 }
103
110 -func (s *Supervisord) Cleanup() {
111 - if s.client != nil {
112 - s.client.closeIdleConnections()
104 +func (c *Collector) Cleanup() {
105 + if c.client != nil {
106 + c.client.closeIdleConnections()
107 }
108 }
src/go/plugin/go.d/collector/supervisord/collector_test.go renamed
+44 -44
@@ -27,11 +27,11 @@ func Test_testDataIsValid(t *testing.T) {
27 }
28 }
29
30 -func TestSupervisord_ConfigurationSerialize(t *testing.T) {
31 - module.TestConfigurationSerialize(t, &Supervisord{}, dataConfigJSON, dataConfigYAML)
30 +func TestCollector_ConfigurationSerialize(t *testing.T) {
31 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
32 }
33
34 -func TestSupervisord_Init(t *testing.T) {
34 +func TestCollector_Init(t *testing.T) {
35 tests := map[string]struct {
36 config Config
37 wantFail bool
@@ -51,21 +51,21 @@ func TestSupervisord_Init(t *testing.T) {
51
52 for name, test := range tests {
53 t.Run(name, func(t *testing.T) {
54 - supvr := New()
55 - supvr.Config = test.config
54 + collr := New()
55 + collr.Config = test.config
56
57 if test.wantFail {
58 - assert.Error(t, supvr.Init())
58 + assert.Error(t, collr.Init())
59 } else {
60 - assert.NoError(t, supvr.Init())
60 + assert.NoError(t, collr.Init())
61 }
62 })
63 }
64 }
65
66 -func TestSupervisord_Check(t *testing.T) {
66 +func TestCollector_Check(t *testing.T) {
67 tests := map[string]struct {
68 - prepare func(t *testing.T) *Supervisord
68 + prepare func(t *testing.T) *Collector
69 wantFail bool
70 }{
71 "success on valid response": {
@@ -82,41 +82,41 @@ func TestSupervisord_Check(t *testing.T) {
82
83 for name, test := range tests {
84 t.Run(name, func(t *testing.T) {
85 - supvr := test.prepare(t)
86 - defer supvr.Cleanup()
85 + collr := test.prepare(t)
86 + defer collr.Cleanup()
87
88 if test.wantFail {
89 - assert.Error(t, supvr.Check())
89 + assert.Error(t, collr.Check())
90 } else {
91 - assert.NoError(t, supvr.Check())
91 + assert.NoError(t, collr.Check())
92 }
93 })
94 }
95 }
96
97 -func TestSupervisord_Charts(t *testing.T) {
98 - supvr := New()
99 - require.NoError(t, supvr.Init())
97 +func TestCollector_Charts(t *testing.T) {
98 + collr := New()
99 + require.NoError(t, collr.Init())
100
101 - assert.NotNil(t, supvr.Charts())
101 + assert.NotNil(t, collr.Charts())
102 }
103
104 -func TestSupervisord_Cleanup(t *testing.T) {
105 - supvr := New()
106 - assert.NotPanics(t, supvr.Cleanup)
104 +func TestCollector_Cleanup(t *testing.T) {
105 + collr := New()
106 + assert.NotPanics(t, collr.Cleanup)
107
108 - require.NoError(t, supvr.Init())
108 + require.NoError(t, collr.Init())
109 m := &mockSupervisorClient{}
110 - supvr.client = m
110 + collr.client = m
111
112 - supvr.Cleanup()
112 + collr.Cleanup()
113
114 assert.True(t, m.calledCloseIdleConnections)
115 }
116
117 -func TestSupervisord_Collect(t *testing.T) {
117 +func TestCollector_Collect(t *testing.T) {
118 tests := map[string]struct {
119 - prepare func(t *testing.T) *Supervisord
119 + prepare func(t *testing.T) *Collector
120 wantCollected map[string]int64
121 }{
122 "success on valid response": {
@@ -166,37 +166,37 @@ func TestSupervisord_Collect(t *testing.T) {
166
167 for name, test := range tests {
168 t.Run(name, func(t *testing.T) {
169 - supvr := test.prepare(t)
170 - defer supvr.Cleanup()
169 + collr := test.prepare(t)
170 + defer collr.Cleanup()
171
172 - mx := supvr.Collect()
172 + mx := collr.Collect()
173 assert.Equal(t, test.wantCollected, mx)
174 if len(test.wantCollected) > 0 {
175 - module.TestMetricsHasAllChartsDims(t, supvr.Charts(), mx)
175 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
176 }
177 })
178 }
179 }
180
181 -func prepareSupervisordSuccessOnGetAllProcessInfo(t *testing.T) *Supervisord {
182 - supvr := New()
183 - require.NoError(t, supvr.Init())
184 - supvr.client = &mockSupervisorClient{}
185 - return supvr
181 +func prepareSupervisordSuccessOnGetAllProcessInfo(t *testing.T) *Collector {
182 + collr := New()
183 + require.NoError(t, collr.Init())
184 + collr.client = &mockSupervisorClient{}
185 + return collr
186 }
187
188 -func prepareSupervisordZeroProcessesOnGetAllProcessInfo(t *testing.T) *Supervisord {
189 - supvr := New()
190 - require.NoError(t, supvr.Init())
191 - supvr.client = &mockSupervisorClient{returnZeroProcesses: true}
192 - return supvr
188 +func prepareSupervisordZeroProcessesOnGetAllProcessInfo(t *testing.T) *Collector {
189 + collr := New()
190 + require.NoError(t, collr.Init())
191 + collr.client = &mockSupervisorClient{returnZeroProcesses: true}
192 + return collr
193 }
194
195 -func prepareSupervisordErrorOnGetAllProcessInfo(t *testing.T) *Supervisord {
196 - supvr := New()
197 - require.NoError(t, supvr.Init())
198 - supvr.client = &mockSupervisorClient{errOnGetAllProcessInfo: true}
199 - return supvr
195 +func prepareSupervisordErrorOnGetAllProcessInfo(t *testing.T) *Collector {
196 + collr := New()
197 + require.NoError(t, collr.Init())
198 + collr.client = &mockSupervisorClient{errOnGetAllProcessInfo: true}
199 + return collr
200 }
201
202 type mockSupervisorClient struct {
src/go/plugin/go.d/collector/supervisord/init.go
+6 -6
@@ -10,19 +10,19 @@ import (
10 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/web"
11 )
12
13 -func (s *Supervisord) verifyConfig() error {
14 - if s.URL == "" {
13 +func (c *Collector) verifyConfig() error {
14 + if c.URL == "" {
15 return errors.New("'url' not set")
16 }
17 return nil
18 }
19
20 -func (s *Supervisord) initSupervisorClient() (supervisorClient, error) {
21 - u, err := url.Parse(s.URL)
20 +func (c *Collector) initSupervisorClient() (supervisorClient, error) {
21 + u, err := url.Parse(c.URL)
22 if err != nil {
23 - return nil, fmt.Errorf("parse 'url': %v (%s)", err, s.URL)
23 + return nil, fmt.Errorf("parse 'url': %v (%s)", err, c.URL)
24 }
25 - httpClient, err := web.NewHTTPClient(s.ClientConfig)
25 + httpClient, err := web.NewHTTPClient(c.ClientConfig)
26 if err != nil {
27 return nil, fmt.Errorf("create HTTP client: %v", err)
28 }
src/go/plugin/go.d/collector/systemdunits/charts.go
+12 -12
@@ -20,7 +20,7 @@ const (
20 prioUnitFileState
21 )
22
23 -func (s *SystemdUnits) addUnitCharts(name, typ string) {
23 +func (c *Collector) addUnitCharts(name, typ string) {
24 chart := module.Chart{
25 ID: "unit_%s_%s_state",
26 Title: "%s Unit State",
@@ -49,17 +49,17 @@ func (s *SystemdUnits) addUnitCharts(name, typ string) {
49 d.ID = fmt.Sprintf(d.ID, name, typ, d.Name)
50 }
51
52 - if err := s.Charts().Add(&chart); err != nil {
53 - s.Warning(err)
52 + if err := c.Charts().Add(&chart); err != nil {
53 + c.Warning(err)
54 }
55 }
56
57 -func (s *SystemdUnits) removeUnitCharts(name, typ string) {
57 +func (c *Collector) removeUnitCharts(name, typ string) {
58 px := fmt.Sprintf("unit_%s_%s_", name, typ)
59 - s.removeCharts(px)
59 + c.removeCharts(px)
60 }
61
62 -func (s *SystemdUnits) addUnitFileCharts(unitPath string) {
62 +func (c *Collector) addUnitFileCharts(unitPath string) {
63 _, unitName := filepath.Split(unitPath)
64 unitType := strings.TrimPrefix(filepath.Ext(unitPath), ".")
65
@@ -97,18 +97,18 @@ func (s *SystemdUnits) addUnitFileCharts(unitPath string) {
97 dim.ID = fmt.Sprintf(dim.ID, unitPath)
98 }
99
100 - if err := s.Charts().Add(&chart); err != nil {
101 - s.Warning(err)
100 + if err := c.Charts().Add(&chart); err != nil {
101 + c.Warning(err)
102 }
103 }
104
105 -func (s *SystemdUnits) removeUnitFileCharts(unitPath string) {
105 +func (c *Collector) removeUnitFileCharts(unitPath string) {
106 px := fmt.Sprintf("unit_file_%s_", strings.ReplaceAll(unitPath, ".", "_"))
107 - s.removeCharts(px)
107 + c.removeCharts(px)
108 }
109
110 -func (s *SystemdUnits) removeCharts(prefix string) {
111 - for _, chart := range *s.Charts() {
110 +func (c *Collector) removeCharts(prefix string) {
111 + for _, chart := range *c.Charts() {
112 if strings.HasPrefix(chart.ID, prefix) {
113 chart.MarkRemove()
114 chart.MarkNotCreated()
src/go/plugin/go.d/collector/systemdunits/collect.go
+23 -23
@@ -10,31 +10,31 @@ import (
10 "strconv"
11 )
12
13 -func (s *SystemdUnits) collect() (map[string]int64, error) {
14 - conn, err := s.getConnection()
13 +func (c *Collector) collect() (map[string]int64, error) {
14 + conn, err := c.getConnection()
15 if err != nil {
16 return nil, err
17 }
18
19 - if s.systemdVersion == 0 {
20 - ver, err := s.getSystemdVersion(conn)
19 + if c.systemdVersion == 0 {
20 + ver, err := c.getSystemdVersion(conn)
21 if err != nil {
22 - s.closeConnection()
22 + c.closeConnection()
23 return nil, err
24 }
25 - s.systemdVersion = ver
25 + c.systemdVersion = ver
26 }
27
28 mx := make(map[string]int64)
29
30 - if err := s.collectUnits(mx, conn); err != nil {
31 - s.closeConnection()
30 + if err := c.collectUnits(mx, conn); err != nil {
31 + c.closeConnection()
32 return nil, err
33 }
34
35 - if s.CollectUnitFiles && len(s.IncludeUnitFiles) > 0 {
36 - if err := s.collectUnitFiles(mx, conn); err != nil {
37 - s.closeConnection()
35 + if c.CollectUnitFiles && len(c.IncludeUnitFiles) > 0 {
36 + if err := c.collectUnitFiles(mx, conn); err != nil {
37 + c.closeConnection()
38 return mx, err
39 }
40 }
@@ -42,21 +42,21 @@ func (s *SystemdUnits) collect() (map[string]int64, error) {
42 return mx, nil
43 }
44
45 -func (s *SystemdUnits) getConnection() (systemdConnection, error) {
46 - if s.conn == nil {
47 - conn, err := s.client.connect()
45 +func (c *Collector) getConnection() (systemdConnection, error) {
46 + if c.conn == nil {
47 + conn, err := c.client.connect()
48 if err != nil {
49 return nil, fmt.Errorf("error on creating a connection: %v", err)
50 }
51 - s.conn = conn
51 + c.conn = conn
52 }
53 - return s.conn, nil
53 + return c.conn, nil
54 }
55
56 -func (s *SystemdUnits) closeConnection() {
57 - if s.conn != nil {
58 - s.conn.Close()
59 - s.conn = nil
56 +func (c *Collector) closeConnection() {
57 + if c.conn != nil {
58 + c.conn.Close()
59 + c.conn = nil
60 }
61 }
62
@@ -64,14 +64,14 @@ var reVersion = regexp.MustCompile(`[0-9][0-9][0-9]`)
64
65 const versionProperty = "Version"
66
67 -func (s *SystemdUnits) getSystemdVersion(conn systemdConnection) (int, error) {
68 - s.Debugf("calling function 'GetManagerProperty'")
67 +func (c *Collector) getSystemdVersion(conn systemdConnection) (int, error) {
68 + c.Debugf("calling function 'GetManagerProperty'")
69 version, err := conn.GetManagerProperty(versionProperty)
70 if err != nil {
71 return 0, fmt.Errorf("error on getting '%s' manager property: %v", versionProperty, err)
72 }
73
74 - s.Debugf("systemd version: %s", version)
74 + c.Debugf("systemd version: %s", version)
75
76 major := reVersion.FindString(version)
77 if major == "" {
src/go/plugin/go.d/collector/systemdunits/collect_unit_files.go
+18 -18
@@ -31,28 +31,28 @@ var unitFileStates = []string{
31 "bad",
32 }
33
34 -func (s *SystemdUnits) collectUnitFiles(mx map[string]int64, conn systemdConnection) error {
35 - if s.systemdVersion < 230 {
34 +func (c *Collector) collectUnitFiles(mx map[string]int64, conn systemdConnection) error {
35 + if c.systemdVersion < 230 {
36 return nil
37 }
38
39 - if now := time.Now(); now.After(s.lastListUnitFilesTime.Add(s.CollectUnitFilesEvery.Duration())) {
40 - unitFiles, err := s.getUnitFilesByPatterns(conn)
39 + if now := time.Now(); now.After(c.lastListUnitFilesTime.Add(c.CollectUnitFilesEvery.Duration())) {
40 + unitFiles, err := c.getUnitFilesByPatterns(conn)
41 if err != nil {
42 return err
43 }
44 - s.lastListUnitFilesTime = now
45 - s.cachedUnitFiles = unitFiles
44 + c.lastListUnitFilesTime = now
45 + c.cachedUnitFiles = unitFiles
46 }
47
48 seen := make(map[string]bool)
49
50 - for _, unitFile := range s.cachedUnitFiles {
50 + for _, unitFile := range c.cachedUnitFiles {
51 seen[unitFile.Path] = true
52
53 - if !s.seenUnitFiles[unitFile.Path] {
54 - s.seenUnitFiles[unitFile.Path] = true
55 - s.addUnitFileCharts(unitFile.Path)
53 + if !c.seenUnitFiles[unitFile.Path] {
54 + c.seenUnitFiles[unitFile.Path] = true
55 + c.addUnitFileCharts(unitFile.Path)
56 }
57
58 px := fmt.Sprintf("unit_file_%s_state_", unitFile.Path)
@@ -62,23 +62,23 @@ func (s *SystemdUnits) collectUnitFiles(mx map[string]int64, conn systemdConnect
62 mx[px+strings.ToLower(unitFile.Type)] = 1
63 }
64
65 - for k := range s.seenUnitFiles {
65 + for k := range c.seenUnitFiles {
66 if !seen[k] {
67 - delete(s.seenUnitFiles, k)
68 - s.removeUnitFileCharts(k)
67 + delete(c.seenUnitFiles, k)
68 + c.removeUnitFileCharts(k)
69 }
70 }
71
72 return nil
73 }
74
75 -func (s *SystemdUnits) getUnitFilesByPatterns(conn systemdConnection) ([]dbus.UnitFile, error) {
76 - ctx, cancel := context.WithTimeout(context.Background(), s.Timeout.Duration())
75 +func (c *Collector) getUnitFilesByPatterns(conn systemdConnection) ([]dbus.UnitFile, error) {
76 + ctx, cancel := context.WithTimeout(context.Background(), c.Timeout.Duration())
77 defer cancel()
78
79 - s.Debugf("calling function 'ListUnitFilesByPatterns'")
79 + c.Debugf("calling function 'ListUnitFilesByPatterns'")
80
81 - unitFiles, err := conn.ListUnitFilesByPatternsContext(ctx, nil, s.IncludeUnitFiles)
81 + unitFiles, err := conn.ListUnitFilesByPatternsContext(ctx, nil, c.IncludeUnitFiles)
82 if err != nil {
83 return nil, fmt.Errorf("error on ListUnitFilesByPatterns: %v", err)
84 }
@@ -87,7 +87,7 @@ func (s *SystemdUnits) getUnitFilesByPatterns(conn systemdConnection) ([]dbus.Un
87 unitFiles[i].Path = cleanUnitName(unitFiles[i].Path)
88 }
89
90 - s.Debugf("got %d unit files", len(unitFiles))
90 + c.Debugf("got %d unit files", len(unitFiles))
91
92 return unitFiles, nil
93 }
src/go/plugin/go.d/collector/systemdunits/collect_units.go
+30 -30
@@ -32,15 +32,15 @@ var unitStates = []string{
32 unitStateDeactivating,
33 }
34
35 -func (s *SystemdUnits) collectUnits(mx map[string]int64, conn systemdConnection) error {
35 +func (c *Collector) collectUnits(mx map[string]int64, conn systemdConnection) error {
36 var units []dbus.UnitStatus
37 var err error
38
39 - if s.systemdVersion >= 230 {
39 + if c.systemdVersion >= 230 {
40 // https://github.com/systemd/systemd/pull/3142
41 - units, err = s.getLoadedUnitsByPatterns(conn)
41 + units, err = c.getLoadedUnitsByPatterns(conn)
42 } else {
43 - units, err = s.getLoadedUnits(conn)
43 + units, err = c.getLoadedUnits(conn)
44 }
45 if err != nil {
46 return err
@@ -56,23 +56,23 @@ func (s *SystemdUnits) collectUnits(mx map[string]int64, conn systemdConnection)
56
57 seen[unit.Name] = true
58
59 - if s.SkipTransient {
60 - if _, ok := s.unitTransient[unit.Name]; !ok {
61 - prop, err := s.getUnitTransientProperty(conn, unit.Name)
59 + if c.SkipTransient {
60 + if _, ok := c.unitTransient[unit.Name]; !ok {
61 + prop, err := c.getUnitTransientProperty(conn, unit.Name)
62 if err != nil {
63 return err
64 }
65 prop = strings.Trim(prop, "\"")
66 - s.unitTransient[unit.Name] = prop == "true"
66 + c.unitTransient[unit.Name] = prop == "true"
67 }
68 - if s.unitTransient[unit.Name] {
68 + if c.unitTransient[unit.Name] {
69 continue
70 }
71 }
72
73 - if !s.seenUnits[unit.Name] {
74 - s.seenUnits[unit.Name] = true
75 - s.addUnitCharts(name, typ)
73 + if !c.seenUnits[unit.Name] {
74 + c.seenUnits[unit.Name] = true
75 + c.addUnitCharts(name, typ)
76 }
77
78 for _, s := range unitStates {
@@ -81,29 +81,29 @@ func (s *SystemdUnits) collectUnits(mx map[string]int64, conn systemdConnection)
81 mx[fmt.Sprintf("unit_%s_%s_state_%s", name, typ, unit.ActiveState)] = 1
82 }
83
84 - for k := range s.seenUnits {
84 + for k := range c.seenUnits {
85 if !seen[k] {
86 - delete(s.seenUnits, k)
86 + delete(c.seenUnits, k)
87 if name, typ, ok := extractUnitNameType(k); ok {
88 - s.removeUnitCharts(name, typ)
88 + c.removeUnitCharts(name, typ)
89 }
90 }
91 }
92
93 - for k := range s.unitTransient {
93 + for k := range c.unitTransient {
94 if !seen[k] {
95 - delete(s.unitTransient, k)
95 + delete(c.unitTransient, k)
96 }
97 }
98
99 return nil
100 }
101
102 -func (s *SystemdUnits) getLoadedUnits(conn systemdConnection) ([]dbus.UnitStatus, error) {
103 - ctx, cancel := context.WithTimeout(context.Background(), s.Timeout.Duration())
102 +func (c *Collector) getLoadedUnits(conn systemdConnection) ([]dbus.UnitStatus, error) {
103 + ctx, cancel := context.WithTimeout(context.Background(), c.Timeout.Duration())
104 defer cancel()
105
106 - s.Debugf("calling function 'ListUnits'")
106 + c.Debugf("calling function 'ListUnits'")
107 units, err := conn.ListUnitsContext(ctx)
108 if err != nil {
109 return nil, fmt.Errorf("error on ListUnits: %v", err)
@@ -115,23 +115,23 @@ func (s *SystemdUnits) getLoadedUnits(conn systemdConnection) ([]dbus.UnitStatus
115
116 loaded := units[:0]
117 for _, unit := range units {
118 - if unit.LoadState == "loaded" && s.unitSr.MatchString(unit.Name) {
118 + if unit.LoadState == "loaded" && c.unitSr.MatchString(unit.Name) {
119 loaded = append(loaded, unit)
120 }
121 }
122
123 - s.Debugf("got total/loaded %d/%d units", len(units), len(loaded))
123 + c.Debugf("got total/loaded %d/%d units", len(units), len(loaded))
124
125 return loaded, nil
126 }
127
128 -func (s *SystemdUnits) getLoadedUnitsByPatterns(conn systemdConnection) ([]dbus.UnitStatus, error) {
129 - ctx, cancel := context.WithTimeout(context.Background(), s.Timeout.Duration())
128 +func (c *Collector) getLoadedUnitsByPatterns(conn systemdConnection) ([]dbus.UnitStatus, error) {
129 + ctx, cancel := context.WithTimeout(context.Background(), c.Timeout.Duration())
130 defer cancel()
131
132 - s.Debugf("calling function 'ListUnitsByPatterns'")
132 + c.Debugf("calling function 'ListUnitsByPatterns'")
133
134 - units, err := conn.ListUnitsByPatternsContext(ctx, unitStates, s.Include)
134 + units, err := conn.ListUnitsByPatternsContext(ctx, unitStates, c.Include)
135 if err != nil {
136 return nil, fmt.Errorf("error on ListUnitsByPatterns: %v", err)
137 }
@@ -146,16 +146,16 @@ func (s *SystemdUnits) getLoadedUnitsByPatterns(conn systemdConnection) ([]dbus.
146 loaded = append(loaded, unit)
147 }
148 }
149 - s.Debugf("got total/loaded %d/%d units", len(units), len(loaded))
149 + c.Debugf("got total/loaded %d/%d units", len(units), len(loaded))
150
151 return loaded, nil
152 }
153
154 -func (s *SystemdUnits) getUnitTransientProperty(conn systemdConnection, unit string) (string, error) {
155 - ctx, cancel := context.WithTimeout(context.Background(), s.Timeout.Duration())
154 +func (c *Collector) getUnitTransientProperty(conn systemdConnection, unit string) (string, error) {
155 + ctx, cancel := context.WithTimeout(context.Background(), c.Timeout.Duration())
156 defer cancel()
157
158 - s.Debugf("calling function 'GetUnitProperty' for unit '%s'", unit)
158 + c.Debugf("calling function 'GetUnitProperty' for unit '%s'", unit)
159
160 prop, err := conn.GetUnitPropertyContext(ctx, unit, transientProperty)
161 if err != nil {
src/go/plugin/go.d/collector/systemdunits/collector.go renamed
+22 -22
@@ -31,8 +31,8 @@ func init() {
31 })
32 }
33
34 -func New() *SystemdUnits {
35 - return &SystemdUnits{
34 +func New() *Collector {
35 + return &Collector{
36 Config: Config{
37 Timeout: confopt.Duration(time.Second * 2),
38 Include: []string{"*.service"},
@@ -59,7 +59,7 @@ type Config struct {
59 CollectUnitFilesEvery confopt.Duration `yaml:"collect_unit_files_every,omitempty" json:"collect_unit_files_every"`
60 }
61
62 -type SystemdUnits struct {
62 +type Collector struct {
63 module.Base
64 Config `yaml:",inline" json:""`
65
@@ -79,31 +79,31 @@ type SystemdUnits struct {
79 charts *module.Charts
80 }
81
82 -func (s *SystemdUnits) Configuration() any {
83 - return s.Config
82 +func (c *Collector) Configuration() any {
83 + return c.Config
84 }
85
86 -func (s *SystemdUnits) Init() error {
87 - if err := s.validateConfig(); err != nil {
86 +func (c *Collector) Init() error {
87 + if err := c.validateConfig(); err != nil {
88 return fmt.Errorf("config validation: %v", err)
89 }
90
91 - sr, err := s.initUnitSelector()
91 + sr, err := c.initUnitSelector()
92 if err != nil {
93 return fmt.Errorf("init unit selector: %v", err)
94 }
95 - s.unitSr = sr
95 + c.unitSr = sr
96
97 - s.Debugf("timeout: %s", s.Timeout)
98 - s.Debugf("units: patterns '%v'", s.Include)
99 - s.Debugf("unit files: enabled '%v', every '%s', patterns: %v",
100 - s.CollectUnitFiles, s.CollectUnitFilesEvery, s.IncludeUnitFiles)
97 + c.Debugf("timeout: %s", c.Timeout)
98 + c.Debugf("units: patterns '%v'", c.Include)
99 + c.Debugf("unit files: enabled '%v', every '%s', patterns: %v",
100 + c.CollectUnitFiles, c.CollectUnitFilesEvery, c.IncludeUnitFiles)
101
102 return nil
103 }
104
105 -func (s *SystemdUnits) Check() error {
106 - mx, err := s.collect()
105 +func (c *Collector) Check() error {
106 + mx, err := c.collect()
107 if err != nil {
108 return err
109 }
@@ -115,14 +115,14 @@ func (s *SystemdUnits) Check() error {
115 return nil
116 }
117
118 -func (s *SystemdUnits) Charts() *module.Charts {
119 - return s.charts
118 +func (c *Collector) Charts() *module.Charts {
119 + return c.charts
120 }
121
122 -func (s *SystemdUnits) Collect() map[string]int64 {
123 - mx, err := s.collect()
122 +func (c *Collector) Collect() map[string]int64 {
123 + mx, err := c.collect()
124 if err != nil {
125 - s.Error(err)
125 + c.Error(err)
126 }
127
128 if len(mx) == 0 {
@@ -131,6 +131,6 @@ func (s *SystemdUnits) Collect() map[string]int64 {
131 return mx
132 }
133
134 -func (s *SystemdUnits) Cleanup() {
135 - s.closeConnection()
134 +func (c *Collector) Cleanup() {
135 + c.closeConnection()
136 }
src/go/plugin/go.d/collector/systemdunits/collector_test.go renamed
+115 -115
@@ -35,11 +35,11 @@ func Test_testDataIsValid(t *testing.T) {
35 }
36 }
37
38 -func TestSystemdUnits_ConfigurationSerialize(t *testing.T) {
39 - module.TestConfigurationSerialize(t, &SystemdUnits{}, dataConfigJSON, dataConfigYAML)
38 +func TestCollector_ConfigurationSerialize(t *testing.T) {
39 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
40 }
41
42 -func TestSystemdUnits_Init(t *testing.T) {
42 +func TestCollector_Init(t *testing.T) {
43 tests := map[string]struct {
44 config Config
45 wantFail bool
@@ -60,121 +60,121 @@ func TestSystemdUnits_Init(t *testing.T) {
60
61 for name, test := range tests {
62 t.Run(name, func(t *testing.T) {
63 - systemd := New()
64 - systemd.Config = test.config
63 + collr := New()
64 + collr.Config = test.config
65
66 if test.wantFail {
67 - assert.Error(t, systemd.Init())
67 + assert.Error(t, collr.Init())
68 } else {
69 - assert.NoError(t, systemd.Init())
69 + assert.NoError(t, collr.Init())
70 }
71 })
72 }
73 }
74
75 -func TestSystemdUnits_Check(t *testing.T) {
75 +func TestCollector_Check(t *testing.T) {
76 tests := map[string]struct {
77 - prepare func() *SystemdUnits
77 + prepare func() *Collector
78 wantFail bool
79 }{
80 "success on systemd v230+": {
81 - prepare: func() *SystemdUnits {
82 - systemd := New()
83 - systemd.Include = []string{"*"}
84 - systemd.client = prepareOKClient(230)
85 - return systemd
81 + prepare: func() *Collector {
82 + collr := New()
83 + collr.Include = []string{"*"}
84 + collr.client = prepareOKClient(230)
85 + return collr
86 },
87 },
88 "success on systemd v230-": {
89 - prepare: func() *SystemdUnits {
90 - systemd := New()
91 - systemd.Include = []string{"*"}
92 - systemd.client = prepareOKClient(220)
93 - return systemd
89 + prepare: func() *Collector {
90 + collr := New()
91 + collr.Include = []string{"*"}
92 + collr.client = prepareOKClient(220)
93 + return collr
94 },
95 },
96 "fails when all unites are filtered": {
97 wantFail: true,
98 - prepare: func() *SystemdUnits {
99 - systemd := New()
100 - systemd.Include = []string{"*.not_exists"}
101 - systemd.client = prepareOKClient(230)
102 - return systemd
98 + prepare: func() *Collector {
99 + collr := New()
100 + collr.Include = []string{"*.not_exists"}
101 + collr.client = prepareOKClient(230)
102 + return collr
103 },
104 },
105 "fails on error on connect": {
106 wantFail: true,
107 - prepare: func() *SystemdUnits {
108 - systemd := New()
109 - systemd.client = prepareClientErrOnConnect()
110 - return systemd
107 + prepare: func() *Collector {
108 + collr := New()
109 + collr.client = prepareClientErrOnConnect()
110 + return collr
111 },
112 },
113 "fails on error on get manager property": {
114 wantFail: true,
115 - prepare: func() *SystemdUnits {
116 - systemd := New()
117 - systemd.client = prepareClientErrOnGetManagerProperty()
118 - return systemd
115 + prepare: func() *Collector {
116 + collr := New()
117 + collr.client = prepareClientErrOnGetManagerProperty()
118 + return collr
119 },
120 },
121 "fails on error on list units": {
122 wantFail: true,
123 - prepare: func() *SystemdUnits {
124 - systemd := New()
125 - systemd.client = prepareClientErrOnListUnits()
126 - return systemd
123 + prepare: func() *Collector {
124 + collr := New()
125 + collr.client = prepareClientErrOnListUnits()
126 + return collr
127 },
128 },
129 }
130
131 for name, test := range tests {
132 t.Run(name, func(t *testing.T) {
133 - systemd := test.prepare()
134 - require.NoError(t, systemd.Init())
133 + collr := test.prepare()
134 + require.NoError(t, collr.Init())
135
136 if test.wantFail {
137 - assert.Error(t, systemd.Check())
137 + assert.Error(t, collr.Check())
138 } else {
139 - assert.NoError(t, systemd.Check())
139 + assert.NoError(t, collr.Check())
140 }
141 })
142 }
143 }
144
145 -func TestSystemdUnits_Charts(t *testing.T) {
146 - systemd := New()
147 - require.NoError(t, systemd.Init())
148 - assert.NotNil(t, systemd.Charts())
145 +func TestCollector_Charts(t *testing.T) {
146 + collr := New()
147 + require.NoError(t, collr.Init())
148 + assert.NotNil(t, collr.Charts())
149 }
150
151 -func TestSystemdUnits_Cleanup(t *testing.T) {
152 - systemd := New()
153 - systemd.Include = []string{"*"}
151 +func TestCollector_Cleanup(t *testing.T) {
152 + collr := New()
153 + collr.Include = []string{"*"}
154 client := prepareOKClient(230)
155 - systemd.client = client
155 + collr.client = client
156
157 - require.NoError(t, systemd.Init())
158 - require.NotNil(t, systemd.Collect())
159 - conn := systemd.conn
160 - systemd.Cleanup()
157 + require.NoError(t, collr.Init())
158 + require.NotNil(t, collr.Collect())
159 + conn := collr.conn
160 + collr.Cleanup()
161
162 - assert.Nil(t, systemd.conn)
162 + assert.Nil(t, collr.conn)
163 v, _ := conn.(*mockConn)
164 assert.True(t, v.closeCalled)
165 }
166
167 -func TestSystemdUnits_Collect(t *testing.T) {
167 +func TestCollector_Collect(t *testing.T) {
168 tests := map[string]struct {
169 - prepare func() *SystemdUnits
169 + prepare func() *Collector
170 wantCollected map[string]int64
171 }{
172 "success v230+ on collecting all unit type": {
173 - prepare: func() *SystemdUnits {
174 - systemd := New()
175 - systemd.Include = []string{"*"}
176 - systemd.client = prepareOKClient(230)
177 - return systemd
173 + prepare: func() *Collector {
174 + collr := New()
175 + collr.Include = []string{"*"}
176 + collr.client = prepareOKClient(230)
177 + return collr
178 },
179 wantCollected: map[string]int64{
180 "unit_dbus_socket_state_activating": 0,
@@ -385,12 +385,12 @@ func TestSystemdUnits_Collect(t *testing.T) {
385 },
386 },
387 "success v230+ on collecting all unit type with skip transient": {
388 - prepare: func() *SystemdUnits {
389 - systemd := New()
390 - systemd.Include = []string{"*"}
391 - systemd.SkipTransient = true
392 - systemd.client = prepareOKClient(230)
393 - return systemd
388 + prepare: func() *Collector {
389 + collr := New()
390 + collr.Include = []string{"*"}
391 + collr.SkipTransient = true
392 + collr.client = prepareOKClient(230)
393 + return collr
394 },
395 wantCollected: map[string]int64{
396 "unit_systemd-ask-password-wall_service_state_activating": 0,
@@ -416,11 +416,11 @@ func TestSystemdUnits_Collect(t *testing.T) {
416 },
417 },
418 "success v230- on collecting all unit types": {
419 - prepare: func() *SystemdUnits {
420 - systemd := New()
421 - systemd.Include = []string{"*"}
422 - systemd.client = prepareOKClient(220)
423 - return systemd
419 + prepare: func() *Collector {
420 + collr := New()
421 + collr.Include = []string{"*"}
422 + collr.client = prepareOKClient(220)
423 + return collr
424 },
425 wantCollected: map[string]int64{
426 "unit_dbus_socket_state_activating": 0,
@@ -631,11 +631,11 @@ func TestSystemdUnits_Collect(t *testing.T) {
631 },
632 },
633 "success v230+ on collecting only 'service' units": {
634 - prepare: func() *SystemdUnits {
635 - systemd := New()
636 - systemd.Include = []string{"*.service"}
637 - systemd.client = prepareOKClient(230)
638 - return systemd
634 + prepare: func() *Collector {
635 + collr := New()
636 + collr.Include = []string{"*.service"}
637 + collr.client = prepareOKClient(230)
638 + return collr
639 },
640 wantCollected: map[string]int64{
641 "unit_systemd-ask-password-wall_service_state_activating": 0,
@@ -661,11 +661,11 @@ func TestSystemdUnits_Collect(t *testing.T) {
661 },
662 },
663 "success v230- on collecting only 'service' units": {
664 - prepare: func() *SystemdUnits {
665 - systemd := New()
666 - systemd.Include = []string{"*.service"}
667 - systemd.client = prepareOKClient(220)
668 - return systemd
664 + prepare: func() *Collector {
665 + collr := New()
666 + collr.Include = []string{"*.service"}
667 + collr.client = prepareOKClient(220)
668 + return collr
669 },
670 wantCollected: map[string]int64{
671 "unit_systemd-ask-password-wall_service_state_activating": 0,
@@ -691,13 +691,13 @@ func TestSystemdUnits_Collect(t *testing.T) {
691 },
692 },
693 "success v230+ on collecting only 'service' units and files": {
694 - prepare: func() *SystemdUnits {
695 - systemd := New()
696 - systemd.Include = []string{"*.service"}
697 - systemd.IncludeUnitFiles = []string{"*.service", "*.slice"}
698 - systemd.CollectUnitFiles = true
699 - systemd.client = prepareOKClient(230)
700 - return systemd
694 + prepare: func() *Collector {
695 + collr := New()
696 + collr.Include = []string{"*.service"}
697 + collr.IncludeUnitFiles = []string{"*.service", "*.slice"}
698 + collr.CollectUnitFiles = true
699 + collr.client = prepareOKClient(230)
700 + return collr
701 },
702 wantCollected: map[string]int64{
703 "unit_file_/lib/systemd/system/machine.slice_state_alias": 0,
@@ -814,35 +814,35 @@ func TestSystemdUnits_Collect(t *testing.T) {
814 },
815 },
816 "fails when all unites are filtered": {
817 - prepare: func() *SystemdUnits {
818 - systemd := New()
819 - systemd.Include = []string{"*.not_exists"}
820 - systemd.client = prepareOKClient(230)
821 - return systemd
817 + prepare: func() *Collector {
818 + collr := New()
819 + collr.Include = []string{"*.not_exists"}
820 + collr.client = prepareOKClient(230)
821 + return collr
822 },
823 wantCollected: nil,
824 },
825 "fails on error on connect": {
826 - prepare: func() *SystemdUnits {
827 - systemd := New()
828 - systemd.client = prepareClientErrOnConnect()
829 - return systemd
826 + prepare: func() *Collector {
827 + collr := New()
828 + collr.client = prepareClientErrOnConnect()
829 + return collr
830 },
831 wantCollected: nil,
832 },
833 "fails on error on get manager property": {
834 - prepare: func() *SystemdUnits {
835 - systemd := New()
836 - systemd.client = prepareClientErrOnGetManagerProperty()
837 - return systemd
834 + prepare: func() *Collector {
835 + collr := New()
836 + collr.client = prepareClientErrOnGetManagerProperty()
837 + return collr
838 },
839 wantCollected: nil,
840 },
841 "fails on error on list units": {
842 - prepare: func() *SystemdUnits {
843 - systemd := New()
844 - systemd.client = prepareClientErrOnListUnits()
845 - return systemd
842 + prepare: func() *Collector {
843 + collr := New()
844 + collr.client = prepareClientErrOnListUnits()
845 + return collr
846 },
847 wantCollected: nil,
848 },
@@ -850,33 +850,33 @@ func TestSystemdUnits_Collect(t *testing.T) {
850
851 for name, test := range tests {
852 t.Run(name, func(t *testing.T) {
853 - systemd := test.prepare()
854 - require.NoError(t, systemd.Init())
853 + collr := test.prepare()
854 + require.NoError(t, collr.Init())
855
856 var mx map[string]int64
857
858 for i := 0; i < 10; i++ {
859 - mx = systemd.Collect()
859 + mx = collr.Collect()
860 }
861
862 assert.Equal(t, test.wantCollected, mx)
863 if len(test.wantCollected) > 0 {
864 - module.TestMetricsHasAllChartsDims(t, systemd.Charts(), mx)
864 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
865 }
866 })
867 }
868 }
869
870 -func TestSystemdUnits_connectionReuse(t *testing.T) {
871 - systemd := New()
872 - systemd.Include = []string{"*"}
870 +func TestCollector_connectionReuse(t *testing.T) {
871 + collr := New()
872 + collr.Include = []string{"*"}
873 client := prepareOKClient(230)
874 - systemd.client = client
875 - require.NoError(t, systemd.Init())
874 + collr.client = client
875 + require.NoError(t, collr.Init())
876
877 var collected map[string]int64
878 for i := 0; i < 10; i++ {
879 - collected = systemd.Collect()
879 + collected = collr.Collect()
880 }
881
882 assert.NotEmpty(t, collected)
src/go/plugin/go.d/collector/systemdunits/init.go
+5 -5
@@ -11,18 +11,18 @@ import (
11 "github.com/netdata/netdata/go/plugins/pkg/matcher"
12 )
13
14 -func (s *SystemdUnits) validateConfig() error {
15 - if len(s.Include) == 0 {
14 +func (c *Collector) validateConfig() error {
15 + if len(c.Include) == 0 {
16 return errors.New("'include' option not set")
17 }
18 return nil
19 }
20
21 -func (s *SystemdUnits) initUnitSelector() (matcher.Matcher, error) {
22 - if len(s.Include) == 0 {
21 +func (c *Collector) initUnitSelector() (matcher.Matcher, error) {
22 + if len(c.Include) == 0 {
23 return matcher.TRUE(), nil
24 }
25
26 - expr := strings.Join(s.Include, " ")
26 + expr := strings.Join(c.Include, " ")
27 return matcher.NewSimplePatternsMatcher(expr)
28 }
src/go/plugin/go.d/collector/tengine/collect.go
+3 -3
@@ -10,8 +10,8 @@ import (
10 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/web"
11 )
12
13 -func (t *Tengine) collect() (map[string]int64, error) {
14 - req, err := web.NewHTTPRequest(t.RequestConfig)
13 +func (c *Collector) collect() (map[string]int64, error) {
14 + req, err := web.NewHTTPRequest(c.RequestConfig)
15 if err != nil {
16 return nil, fmt.Errorf("failed to create HTTP request: %w", err)
17 }
@@ -19,7 +19,7 @@ func (t *Tengine) collect() (map[string]int64, error) {
19 var status *tengineStatus
20 var perr error
21
22 - if err := web.DoHTTP(t.httpClient).Request(req, func(body io.Reader) error {
22 + if err := web.DoHTTP(c.httpClient).Request(req, func(body io.Reader) error {
23 if status, perr = parseStatus(body); perr != nil {
24 return perr
25 }
src/go/plugin/go.d/collector/tengine/collector.go renamed
+21 -21
@@ -25,8 +25,8 @@ func init() {
25 })
26 }
27
28 -func New() *Tengine {
29 - return &Tengine{
28 +func New() *Collector {
29 + return &Collector{
30 Config: Config{
31 HTTPConfig: web.HTTPConfig{
32 RequestConfig: web.RequestConfig{
@@ -46,7 +46,7 @@ type Config struct {
46 web.HTTPConfig `yaml:",inline" json:""`
47 }
48
49 -type Tengine struct {
49 +type Collector struct {
50 module.Base
51 Config `yaml:",inline" json:""`
52
@@ -55,29 +55,29 @@ type Tengine struct {
55 httpClient *http.Client
56 }
57
58 -func (t *Tengine) Configuration() any {
59 - return t.Config
58 +func (c *Collector) Configuration() any {
59 + return c.Config
60 }
61
62 -func (t *Tengine) Init() error {
63 - if t.URL == "" {
62 +func (c *Collector) Init() error {
63 + if c.URL == "" {
64 return errors.New("config: url not set")
65 }
66
67 - httpClient, err := web.NewHTTPClient(t.ClientConfig)
67 + httpClient, err := web.NewHTTPClient(c.ClientConfig)
68 if err != nil {
69 return fmt.Errorf("error on creating http client : %v", err)
70 }
71 - t.httpClient = httpClient
71 + c.httpClient = httpClient
72
73 - t.Debugf("using URL: %s", t.URL)
74 - t.Debugf("using timeout: %s", t.Timeout)
73 + c.Debugf("using URL: %s", c.URL)
74 + c.Debugf("using timeout: %s", c.Timeout)
75
76 return nil
77 }
78
79 -func (t *Tengine) Check() error {
80 - mx, err := t.collect()
79 +func (c *Collector) Check() error {
80 + mx, err := c.collect()
81 if err != nil {
82 return err
83 }
@@ -89,14 +89,14 @@ func (t *Tengine) Check() error {
89 return nil
90 }
91
92 -func (t *Tengine) Charts() *module.Charts {
93 - return t.charts
92 +func (c *Collector) Charts() *module.Charts {
93 + return c.charts
94 }
95
96 -func (t *Tengine) Collect() map[string]int64 {
97 - mx, err := t.collect()
96 +func (c *Collector) Collect() map[string]int64 {
97 + mx, err := c.collect()
98 if err != nil {
99 - t.Error(err)
99 + c.Error(err)
100 return nil
101 }
102
@@ -107,8 +107,8 @@ func (t *Tengine) Collect() map[string]int64 {
107 return mx
108 }
109
110 -func (t *Tengine) Cleanup() {
111 - if t.httpClient != nil {
112 - t.httpClient.CloseIdleConnections()
110 +func (c *Collector) Cleanup() {
111 + if c.httpClient != nil {
112 + c.httpClient.CloseIdleConnections()
113 }
114 }
src/go/plugin/go.d/collector/tengine/collector_test.go renamed
+33 -33
@@ -31,21 +31,21 @@ func Test_testDataIsValid(t *testing.T) {
31 }
32 }
33
34 -func TestTengine_ConfigurationSerialize(t *testing.T) {
35 - module.TestConfigurationSerialize(t, &Tengine{}, dataConfigJSON, dataConfigYAML)
34 +func TestCollector_ConfigurationSerialize(t *testing.T) {
35 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
36 }
37
38 -func TestTengine_Cleanup(t *testing.T) {
38 +func TestCollector_Cleanup(t *testing.T) {
39 New().Cleanup()
40 }
41
42 -func TestTengine_Init(t *testing.T) {
43 - job := New()
42 +func TestCollector_Init(t *testing.T) {
43 + collr := New()
44
45 - require.NoError(t, job.Init())
45 + require.NoError(t, collr.Init())
46 }
47
48 -func TestTengine_Check(t *testing.T) {
48 +func TestCollector_Check(t *testing.T) {
49 ts := httptest.NewServer(
50 http.HandlerFunc(
51 func(w http.ResponseWriter, r *http.Request) {
@@ -53,23 +53,23 @@ func TestTengine_Check(t *testing.T) {
53 }))
54 defer ts.Close()
55
56 - job := New()
57 - job.URL = ts.URL
58 - require.NoError(t, job.Init())
59 - assert.NoError(t, job.Check())
56 + collr := New()
57 + collr.URL = ts.URL
58 + require.NoError(t, collr.Init())
59 + assert.NoError(t, collr.Check())
60 }
61
62 -func TestTengine_CheckNG(t *testing.T) {
63 - job := New()
62 +func TestCollector_CheckNG(t *testing.T) {
63 + collr := New()
64
65 - job.URL = "http://127.0.0.1:38001/us"
66 - require.NoError(t, job.Init())
67 - assert.Error(t, job.Check())
65 + collr.URL = "http://127.0.0.1:38001/us"
66 + require.NoError(t, collr.Init())
67 + assert.Error(t, collr.Check())
68 }
69
70 -func TestTengine_Charts(t *testing.T) { assert.NotNil(t, New().Charts()) }
70 +func TestCollector_Charts(t *testing.T) { assert.NotNil(t, New().Charts()) }
71
72 -func TestTengine_Collect(t *testing.T) {
72 +func TestCollector_Collect(t *testing.T) {
73 ts := httptest.NewServer(
74 http.HandlerFunc(
75 func(w http.ResponseWriter, r *http.Request) {
@@ -77,10 +77,10 @@ func TestTengine_Collect(t *testing.T) {
77 }))
78 defer ts.Close()
79
80 - job := New()
81 - job.URL = ts.URL
82 - require.NoError(t, job.Init())
83 - require.NoError(t, job.Check())
80 + collr := New()
81 + collr.URL = ts.URL
82 + require.NoError(t, collr.Init())
83 + require.NoError(t, collr.Check())
84
85 expected := map[string]int64{
86 "bytes_in": 5944,
@@ -114,10 +114,10 @@ func TestTengine_Collect(t *testing.T) {
114 "ups_tries": 268,
115 }
116
117 - assert.Equal(t, expected, job.Collect())
117 + assert.Equal(t, expected, collr.Collect())
118 }
119
120 -func TestTengine_InvalidData(t *testing.T) {
120 +func TestCollector_InvalidData(t *testing.T) {
121 ts := httptest.NewServer(
122 http.HandlerFunc(
123 func(w http.ResponseWriter, r *http.Request) {
@@ -125,13 +125,13 @@ func TestTengine_InvalidData(t *testing.T) {
125 }))
126 defer ts.Close()
127
128 - job := New()
129 - job.URL = ts.URL
130 - require.NoError(t, job.Init())
131 - assert.Error(t, job.Check())
128 + collr := New()
129 + collr.URL = ts.URL
130 + require.NoError(t, collr.Init())
131 + assert.Error(t, collr.Check())
132 }
133
134 -func TestTengine_404(t *testing.T) {
134 +func TestCollector_404(t *testing.T) {
135 ts := httptest.NewServer(
136 http.HandlerFunc(
137 func(w http.ResponseWriter, r *http.Request) {
@@ -139,8 +139,8 @@ func TestTengine_404(t *testing.T) {
139 }))
140 defer ts.Close()
141
142 - job := New()
143 - job.URL = ts.URL
144 - require.NoError(t, job.Init())
145 - assert.Error(t, job.Check())
142 + collr := New()
143 + collr.URL = ts.URL
144 + require.NoError(t, collr.Init())
145 + assert.Error(t, collr.Check())
146 }
src/go/plugin/go.d/collector/testrandom/collect.go
+11 -11
@@ -8,40 +8,40 @@ import (
8 "github.com/netdata/netdata/go/plugins/plugin/go.d/agent/module"
9 )
10
11 -func (tr *TestRandom) collect() (map[string]int64, error) {
11 +func (c *Collector) collect() (map[string]int64, error) {
12 collected := make(map[string]int64)
13
14 - for _, chart := range *tr.Charts() {
15 - tr.collectChart(collected, chart)
14 + for _, chart := range *c.Charts() {
15 + c.collectChart(collected, chart)
16 }
17 return collected, nil
18 }
19
20 -func (tr *TestRandom) collectChart(collected map[string]int64, chart *module.Chart) {
20 +func (c *Collector) collectChart(collected map[string]int64, chart *module.Chart) {
21 var num int
22 if chart.Opts.Hidden {
23 - num = tr.Config.HiddenCharts.Dims
23 + num = c.Config.HiddenCharts.Dims
24 } else {
25 - num = tr.Config.Charts.Dims
25 + num = c.Config.Charts.Dims
26 }
27
28 for i := 0; i < num; i++ {
29 name := fmt.Sprintf("random%d", i)
30 id := fmt.Sprintf("%s_%s", chart.ID, name)
31
32 - if !tr.collectedDims[id] {
33 - tr.collectedDims[id] = true
32 + if !c.collectedDims[id] {
33 + c.collectedDims[id] = true
34
35 dim := &module.Dim{ID: id, Name: name}
36 if err := chart.AddDim(dim); err != nil {
37 - tr.Warning(err)
37 + c.Warning(err)
38 }
39 chart.MarkNotCreated()
40 }
41 if i%2 == 0 {
42 - collected[id] = tr.randInt()
42 + collected[id] = c.randInt()
43 } else {
44 - collected[id] = -tr.randInt()
44 + collected[id] = -c.randInt()
45 }
46 }
47 }
src/go/plugin/go.d/collector/testrandom/collector.go renamed
+16 -16
@@ -26,8 +26,8 @@ func init() {
26 })
27 }
28
29 -func New() *TestRandom {
30 - return &TestRandom{
29 +func New() *Collector {
30 + return &Collector{
31 Config: Config{
32 Charts: ConfigCharts{
33 Num: 1,
@@ -59,7 +59,7 @@ type (
59 }
60 )
61
62 -type TestRandom struct {
62 +type Collector struct {
63 module.Base // should be embedded by every module
64 Config `yaml:",inline"`
65
@@ -68,36 +68,36 @@ type TestRandom struct {
68 collectedDims map[string]bool
69 }
70
71 -func (tr *TestRandom) Configuration() any {
72 - return tr.Config
71 +func (c *Collector) Configuration() any {
72 + return c.Config
73 }
74
75 -func (tr *TestRandom) Init() error {
76 - err := tr.validateConfig()
75 +func (c *Collector) Init() error {
76 + err := c.validateConfig()
77 if err != nil {
78 return fmt.Errorf("config validation: %v", err)
79 }
80
81 - charts, err := tr.initCharts()
81 + charts, err := c.initCharts()
82 if err != nil {
83 return fmt.Errorf("charts init: %v", err)
84 }
85 - tr.charts = charts
85 + c.charts = charts
86 return nil
87 }
88
89 -func (tr *TestRandom) Check() error {
89 +func (c *Collector) Check() error {
90 return nil
91 }
92
93 -func (tr *TestRandom) Charts() *module.Charts {
94 - return tr.charts
93 +func (c *Collector) Charts() *module.Charts {
94 + return c.charts
95 }
96
97 -func (tr *TestRandom) Collect() map[string]int64 {
98 - mx, err := tr.collect()
97 +func (c *Collector) Collect() map[string]int64 {
98 + mx, err := c.collect()
99 if err != nil {
100 - tr.Error(err)
100 + c.Error(err)
101 }
102
103 if len(mx) == 0 {
@@ -106,4 +106,4 @@ func (tr *TestRandom) Collect() map[string]int64 {
106 return mx
107 }
108
109 -func (tr *TestRandom) Cleanup() {}
109 +func (c *Collector) Cleanup() {}
src/go/plugin/go.d/collector/testrandom/collector_test.go renamed
+40 -40
@@ -26,15 +26,15 @@ func Test_testDataIsValid(t *testing.T) {
26 }
27 }
28
29 -func TestTestRandom_ConfigurationSerialize(t *testing.T) {
30 - module.TestConfigurationSerialize(t, &TestRandom{}, dataConfigJSON, dataConfigYAML)
29 +func TestCollector_ConfigurationSerialize(t *testing.T) {
30 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
31 }
32
33 func TestNew(t *testing.T) {
34 - assert.IsType(t, (*TestRandom)(nil), New())
34 + assert.IsType(t, (*Collector)(nil), New())
35 }
36
37 -func TestTestRandom_Init(t *testing.T) {
37 +func TestCollector_Init(t *testing.T) {
38 tests := map[string]struct {
39 config Config
40 wantFail bool
@@ -105,21 +105,21 @@ func TestTestRandom_Init(t *testing.T) {
105
106 for name, test := range tests {
107 t.Run(name, func(t *testing.T) {
108 - tr := New()
109 - tr.Config = test.config
108 + collr := New()
109 + collr.Config = test.config
110
111 if test.wantFail {
112 - assert.Error(t, tr.Init())
112 + assert.Error(t, collr.Init())
113 } else {
114 - assert.NoError(t, tr.Init())
114 + assert.NoError(t, collr.Init())
115 }
116 })
117 }
118 }
119
120 -func TestTestRandom_Check(t *testing.T) {
120 +func TestCollector_Check(t *testing.T) {
121 tests := map[string]struct {
122 - prepare func() *TestRandom
122 + prepare func() *Collector
123 wantFail bool
124 }{
125 "success on default": {prepare: prepareTRDefault},
@@ -130,58 +130,58 @@ func TestTestRandom_Check(t *testing.T) {
130
131 for name, test := range tests {
132 t.Run(name, func(t *testing.T) {
133 - tr := test.prepare()
134 - require.NoError(t, tr.Init())
133 + collr := test.prepare()
134 + require.NoError(t, collr.Init())
135
136 if test.wantFail {
137 - assert.Error(t, tr.Check())
137 + assert.Error(t, collr.Check())
138 } else {
139 - assert.NoError(t, tr.Check())
139 + assert.NoError(t, collr.Check())
140 }
141 })
142 }
143 }
144
145 -func TestTestRandom_Charts(t *testing.T) {
145 +func TestCollector_Charts(t *testing.T) {
146 tests := map[string]struct {
147 - prepare func(t *testing.T) *TestRandom
147 + prepare func(t *testing.T) *Collector
148 wantNil bool
149 }{
150 "not initialized collector": {
151 wantNil: true,
152 - prepare: func(t *testing.T) *TestRandom {
152 + prepare: func(t *testing.T) *Collector {
153 return New()
154 },
155 },
156 "initialized collector": {
157 - prepare: func(t *testing.T) *TestRandom {
158 - tr := New()
159 - require.NoError(t, tr.Init())
160 - return tr
157 + prepare: func(t *testing.T) *Collector {
158 + collr := New()
159 + require.NoError(t, collr.Init())
160 + return collr
161 },
162 },
163 }
164
165 for name, test := range tests {
166 t.Run(name, func(t *testing.T) {
167 - tr := test.prepare(t)
167 + collr := test.prepare(t)
168
169 if test.wantNil {
170 - assert.Nil(t, tr.Charts())
170 + assert.Nil(t, collr.Charts())
171 } else {
172 - assert.NotNil(t, tr.Charts())
172 + assert.NotNil(t, collr.Charts())
173 }
174 })
175 }
176 }
177
178 -func TestTestRandom_Cleanup(t *testing.T) {
178 +func TestCollector_Cleanup(t *testing.T) {
179 assert.NotPanics(t, New().Cleanup)
180 }
181
182 -func TestTestRandom_Collect(t *testing.T) {
182 +func TestCollector_Collect(t *testing.T) {
183 tests := map[string]struct {
184 - prepare func() *TestRandom
184 + prepare func() *Collector
185 wantCollected map[string]int64
186 }{
187 "default config": {
@@ -252,22 +252,22 @@ func TestTestRandom_Collect(t *testing.T) {
252
253 for name, test := range tests {
254 t.Run(name, func(t *testing.T) {
255 - tr := test.prepare()
256 - require.NoError(t, tr.Init())
255 + collr := test.prepare()
256 + require.NoError(t, collr.Init())
257
258 - mx := tr.Collect()
258 + mx := collr.Collect()
259
260 assert.Equal(t, test.wantCollected, mx)
261 - module.TestMetricsHasAllChartsDims(t, tr.Charts(), mx)
261 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
262 })
263 }
264 }
265
266 -func prepareTRDefault() *TestRandom {
266 +func prepareTRDefault() *Collector {
267 return prepareTR(New().Config)
268 }
269
270 -func prepareTROnlyCharts() *TestRandom {
270 +func prepareTROnlyCharts() *Collector {
271 return prepareTR(Config{
272 Charts: ConfigCharts{
273 Num: 2,
@@ -276,7 +276,7 @@ func prepareTROnlyCharts() *TestRandom {
276 })
277 }
278
279 -func prepareTROnlyHiddenCharts() *TestRandom {
279 +func prepareTROnlyHiddenCharts() *Collector {
280 return prepareTR(Config{
281 HiddenCharts: ConfigCharts{
282 Num: 2,
@@ -285,7 +285,7 @@ func prepareTROnlyHiddenCharts() *TestRandom {
285 })
286 }
287
288 -func prepareTRChartsAndHiddenCharts() *TestRandom {
288 +func prepareTRChartsAndHiddenCharts() *Collector {
289 return prepareTR(Config{
290 Charts: ConfigCharts{
291 Num: 2,
@@ -298,9 +298,9 @@ func prepareTRChartsAndHiddenCharts() *TestRandom {
298 })
299 }
300
301 -func prepareTR(cfg Config) *TestRandom {
302 - tr := New()
303 - tr.Config = cfg
304 - tr.randInt = func() int64 { return 1 }
305 - return tr
301 +func prepareTR(cfg Config) *Collector {
302 + collr := New()
303 + collr.Config = cfg
304 + collr.randInt = func() int64 { return 1 }
305 + return collr
306 }
src/go/plugin/go.d/collector/testrandom/init.go
+13 -13
@@ -8,29 +8,29 @@ import (
8 "github.com/netdata/netdata/go/plugins/plugin/go.d/agent/module"
9 )
10
11 -func (tr *TestRandom) validateConfig() error {
12 - if tr.Config.Charts.Num <= 0 && tr.Config.HiddenCharts.Num <= 0 {
11 +func (c *Collector) validateConfig() error {
12 + if c.Config.Charts.Num <= 0 && c.Config.HiddenCharts.Num <= 0 {
13 return errors.New("'charts->num' or `hidden_charts->num` must be > 0")
14 }
15 - if tr.Config.Charts.Num > 0 && tr.Config.Charts.Dims <= 0 {
15 + if c.Config.Charts.Num > 0 && c.Config.Charts.Dims <= 0 {
16 return errors.New("'charts->dimensions' must be > 0")
17 }
18 - if tr.Config.HiddenCharts.Num > 0 && tr.Config.HiddenCharts.Dims <= 0 {
18 + if c.Config.HiddenCharts.Num > 0 && c.Config.HiddenCharts.Dims <= 0 {
19 return errors.New("'hidden_charts->dimensions' must be > 0")
20 }
21 return nil
22 }
23
24 -func (tr *TestRandom) initCharts() (*module.Charts, error) {
24 +func (c *Collector) initCharts() (*module.Charts, error) {
25 charts := &module.Charts{}
26
27 var ctx int
28 - v := calcContextEvery(tr.Config.Charts.Num, tr.Config.Charts.Contexts)
29 - for i := 0; i < tr.Config.Charts.Num; i++ {
30 - if i != 0 && v != 0 && ctx < (tr.Config.Charts.Contexts-1) && i%v == 0 {
28 + v := calcContextEvery(c.Config.Charts.Num, c.Config.Charts.Contexts)
29 + for i := 0; i < c.Config.Charts.Num; i++ {
30 + if i != 0 && v != 0 && ctx < (c.Config.Charts.Contexts-1) && i%v == 0 {
31 ctx++
32 }
33 - chart := newChart(i, ctx, tr.Config.Charts.Labels, module.ChartType(tr.Config.Charts.Type))
33 + chart := newChart(i, ctx, c.Config.Charts.Labels, module.ChartType(c.Config.Charts.Type))
34
35 if err := charts.Add(chart); err != nil {
36 return nil, err
@@ -38,12 +38,12 @@ func (tr *TestRandom) initCharts() (*module.Charts, error) {
38 }
39
40 ctx = 0
41 - v = calcContextEvery(tr.Config.HiddenCharts.Num, tr.Config.HiddenCharts.Contexts)
42 - for i := 0; i < tr.Config.HiddenCharts.Num; i++ {
43 - if i != 0 && v != 0 && ctx < (tr.Config.HiddenCharts.Contexts-1) && i%v == 0 {
41 + v = calcContextEvery(c.Config.HiddenCharts.Num, c.Config.HiddenCharts.Contexts)
42 + for i := 0; i < c.Config.HiddenCharts.Num; i++ {
43 + if i != 0 && v != 0 && ctx < (c.Config.HiddenCharts.Contexts-1) && i%v == 0 {
44 ctx++
45 }
46 - chart := newHiddenChart(i, ctx, tr.Config.HiddenCharts.Labels, module.ChartType(tr.Config.HiddenCharts.Type))
46 + chart := newHiddenChart(i, ctx, c.Config.HiddenCharts.Labels, module.ChartType(c.Config.HiddenCharts.Type))
47
48 if err := charts.Add(chart); err != nil {
49 return nil, err
src/go/plugin/go.d/collector/tomcat/charts.go
+12 -12
@@ -137,7 +137,7 @@ var (
137 }
138 )
139
140 -func (t *Tomcat) addConnectorCharts(name string) {
140 +func (c *Collector) addConnectorCharts(name string) {
141 charts := connectorChartsTmpl.Copy()
142
143 for _, chart := range *charts {
@@ -150,12 +150,12 @@ func (t *Tomcat) addConnectorCharts(name string) {
150 }
151 }
152
153 - if err := t.Charts().Add(*charts...); err != nil {
154 - t.Warning(err)
153 + if err := c.Charts().Add(*charts...); err != nil {
154 + c.Warning(err)
155 }
156 }
157
158 -func (t *Tomcat) addMemPoolCharts(name, typ string) {
158 +func (c *Collector) addMemPoolCharts(name, typ string) {
159 name = strings.ReplaceAll(name, "'", "")
160
161 charts := jvmMemoryPoolChartsTmpl.Copy()
@@ -171,23 +171,23 @@ func (t *Tomcat) addMemPoolCharts(name, typ string) {
171 }
172 }
173
174 - if err := t.Charts().Add(*charts...); err != nil {
175 - t.Warning(err)
174 + if err := c.Charts().Add(*charts...); err != nil {
175 + c.Warning(err)
176 }
177 }
178
179 -func (t *Tomcat) removeConnectorCharts(name string) {
179 +func (c *Collector) removeConnectorCharts(name string) {
180 px := fmt.Sprintf("connector_%s_", cleanName(name))
181 - t.removeCharts(px)
181 + c.removeCharts(px)
182 }
183
184 -func (t *Tomcat) removeMemoryPoolCharts(name string) {
184 +func (c *Collector) removeMemoryPoolCharts(name string) {
185 px := fmt.Sprintf("jvm_mem_pool_%s_", cleanName(name))
186 - t.removeCharts(px)
186 + c.removeCharts(px)
187 }
188
189 -func (t *Tomcat) removeCharts(prefix string) {
190 - for _, chart := range *t.Charts() {
189 +func (c *Collector) removeCharts(prefix string) {
190 + for _, chart := range *c.Charts() {
191 if strings.HasPrefix(chart.ID, prefix) {
192 chart.MarkRemove()
193 chart.MarkNotCreated()
src/go/plugin/go.d/collector/tomcat/collect.go
+19 -19
@@ -16,8 +16,8 @@ var (
16 urlQueryServerStatus = url.Values{"XML": {"true"}}.Encode()
17 )
18
19 -func (t *Tomcat) collect() (map[string]int64, error) {
20 - mx, err := t.collectServerStatus()
19 +func (c *Collector) collect() (map[string]int64, error) {
20 + mx, err := c.collectServerStatus()
21 if err != nil {
22 return nil, err
23 }
@@ -25,8 +25,8 @@ func (t *Tomcat) collect() (map[string]int64, error) {
25 return mx, nil
26 }
27
28 -func (t *Tomcat) collectServerStatus() (map[string]int64, error) {
29 - resp, err := t.queryServerStatus()
28 +func (c *Collector) collectServerStatus() (map[string]int64, error) {
29 + resp, err := c.queryServerStatus()
30 if err != nil {
31 return nil, err
32 }
@@ -43,9 +43,9 @@ func (t *Tomcat) collectServerStatus() (map[string]int64, error) {
43 ti.CurrentThreadsIdle = ti.CurrentThreadCount - ti.CurrentThreadsBusy
44
45 seenConns[v.Name] = true
46 - if !t.seenConnectors[v.Name] {
47 - t.seenConnectors[v.Name] = true
48 - t.addConnectorCharts(v.Name)
46 + if !c.seenConnectors[v.Name] {
47 + c.seenConnectors[v.Name] = true
48 + c.addConnectorCharts(v.Name)
49 }
50 }
51
@@ -53,23 +53,23 @@ func (t *Tomcat) collectServerStatus() (map[string]int64, error) {
53 resp.JVM.MemoryPools[i].STMKey = cleanName(v.Name)
54
55 seenPools[v.Name] = true
56 - if !t.seenMemPools[v.Name] {
57 - t.seenMemPools[v.Name] = true
58 - t.addMemPoolCharts(v.Name, v.Type)
56 + if !c.seenMemPools[v.Name] {
57 + c.seenMemPools[v.Name] = true
58 + c.addMemPoolCharts(v.Name, v.Type)
59 }
60 }
61
62 - for name := range t.seenConnectors {
62 + for name := range c.seenConnectors {
63 if !seenConns[name] {
64 - delete(t.seenConnectors, name)
65 - t.removeConnectorCharts(name)
64 + delete(c.seenConnectors, name)
65 + c.removeConnectorCharts(name)
66 }
67 }
68
69 - for name := range t.seenMemPools {
69 + for name := range c.seenMemPools {
70 if !seenPools[name] {
71 - delete(t.seenMemPools, name)
72 - t.removeMemoryPoolCharts(name)
71 + delete(c.seenMemPools, name)
72 + c.removeMemoryPoolCharts(name)
73 }
74 }
75
@@ -83,8 +83,8 @@ func cleanName(name string) string {
83 return strings.ToLower(r.Replace(name))
84 }
85
86 -func (t *Tomcat) queryServerStatus() (*serverStatusResponse, error) {
87 - req, err := web.NewHTTPRequestWithPath(t.RequestConfig, urlPathServerStatus)
86 +func (c *Collector) queryServerStatus() (*serverStatusResponse, error) {
87 + req, err := web.NewHTTPRequestWithPath(c.RequestConfig, urlPathServerStatus)
88 if err != nil {
89 return nil, err
90 }
@@ -92,7 +92,7 @@ func (t *Tomcat) queryServerStatus() (*serverStatusResponse, error) {
92 req.URL.RawQuery = urlQueryServerStatus
93
94 var status serverStatusResponse
95 - if err := web.DoHTTP(t.httpClient).RequestXML(req, &status); err != nil {
95 + if err := web.DoHTTP(c.httpClient).RequestXML(req, &status); err != nil {
96 return nil, err
97 }
98
src/go/plugin/go.d/collector/tomcat/collector.go renamed
+21 -21
@@ -25,8 +25,8 @@ func init() {
25 })
26 }
27
28 -func New() *Tomcat {
29 - return &Tomcat{
28 +func New() *Collector {
29 + return &Collector{
30 Config: Config{
31 HTTPConfig: web.HTTPConfig{
32 RequestConfig: web.RequestConfig{
@@ -48,7 +48,7 @@ type Config struct {
48 web.HTTPConfig `yaml:",inline" json:""`
49 }
50
51 -type Tomcat struct {
51 +type Collector struct {
52 module.Base
53 Config `yaml:",inline" json:""`
54
@@ -60,30 +60,30 @@ type Tomcat struct {
60 seenMemPools map[string]bool
61 }
62
63 -func (t *Tomcat) Configuration() any {
64 - return t.Config
63 +func (c *Collector) Configuration() any {
64 + return c.Config
65 }
66
67 -func (t *Tomcat) Init() error {
68 - if err := t.validateConfig(); err != nil {
67 +func (c *Collector) Init() error {
68 + if err := c.validateConfig(); err != nil {
69 return fmt.Errorf("config validation: %v", err)
70 }
71
72 - httpClient, err := t.initHTTPClient()
72 + httpClient, err := c.initHTTPClient()
73 if err != nil {
74 return fmt.Errorf("init HTTP client: %v", err)
75 }
76
77 - t.httpClient = httpClient
77 + c.httpClient = httpClient
78
79 - t.Debugf("using URL %s", t.URL)
80 - t.Debugf("using timeout: %s", t.Timeout)
79 + c.Debugf("using URL %s", c.URL)
80 + c.Debugf("using timeout: %s", c.Timeout)
81
82 return nil
83 }
84
85 -func (t *Tomcat) Check() error {
86 - mx, err := t.collect()
85 +func (c *Collector) Check() error {
86 + mx, err := c.collect()
87 if err != nil {
88 return err
89 }
@@ -95,14 +95,14 @@ func (t *Tomcat) Check() error {
95 return nil
96 }
97
98 -func (t *Tomcat) Charts() *module.Charts {
99 - return t.charts
98 +func (c *Collector) Charts() *module.Charts {
99 + return c.charts
100 }
101
102 -func (t *Tomcat) Collect() map[string]int64 {
103 - mx, err := t.collect()
102 +func (c *Collector) Collect() map[string]int64 {
103 + mx, err := c.collect()
104 if err != nil {
105 - t.Error(err)
105 + c.Error(err)
106 }
107
108 if len(mx) == 0 {
@@ -112,8 +112,8 @@ func (t *Tomcat) Collect() map[string]int64 {
112 return mx
113 }
114
115 -func (t *Tomcat) Cleanup() {
116 - if t.httpClient != nil {
117 - t.httpClient.CloseIdleConnections()
115 +func (c *Collector) Cleanup() {
116 + if c.httpClient != nil {
117 + c.httpClient.CloseIdleConnections()
118 }
119 }
src/go/plugin/go.d/collector/tomcat/collector_test.go renamed
+39 -39
@@ -32,11 +32,11 @@ func Test_testDataIsValid(t *testing.T) {
32 }
33 }
34
35 -func TestTomcat_ConfigurationSerialize(t *testing.T) {
36 - module.TestConfigurationSerialize(t, &Tomcat{}, dataConfigJSON, dataConfigYAML)
35 +func TestCollector_ConfigurationSerialize(t *testing.T) {
36 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
37 }
38
39 -func TestTomcat_Init(t *testing.T) {
39 +func TestCollector_Init(t *testing.T) {
40 tests := map[string]struct {
41 wantFail bool
42 config Config
@@ -57,26 +57,26 @@ func TestTomcat_Init(t *testing.T) {
57
58 for name, test := range tests {
59 t.Run(name, func(t *testing.T) {
60 - tomcat := New()
61 - tomcat.Config = test.config
60 + collr := New()
61 + collr.Config = test.config
62
63 if test.wantFail {
64 - assert.Error(t, tomcat.Init())
64 + assert.Error(t, collr.Init())
65 } else {
66 - assert.NoError(t, tomcat.Init())
66 + assert.NoError(t, collr.Init())
67 }
68 })
69 }
70 }
71
72 -func TestTomcat_Charts(t *testing.T) {
72 +func TestCollector_Charts(t *testing.T) {
73 assert.NotNil(t, New().Charts())
74 }
75
76 -func TestTomcat_Check(t *testing.T) {
76 +func TestCollector_Check(t *testing.T) {
77 tests := map[string]struct {
78 wantFail bool
79 - prepare func(t *testing.T) (*Tomcat, func())
79 + prepare func(t *testing.T) (*Collector, func())
80 }{
81 "success case": {
82 wantFail: false,
@@ -98,21 +98,21 @@ func TestTomcat_Check(t *testing.T) {
98
99 for name, test := range tests {
100 t.Run(name, func(t *testing.T) {
101 - tomcat, cleanup := test.prepare(t)
101 + collr, cleanup := test.prepare(t)
102 defer cleanup()
103
104 if test.wantFail {
105 - assert.Error(t, tomcat.Check())
105 + assert.Error(t, collr.Check())
106 } else {
107 - assert.NoError(t, tomcat.Check())
107 + assert.NoError(t, collr.Check())
108 }
109 })
110 }
111 }
112
113 -func TestTomcat_Collect(t *testing.T) {
113 +func TestCollector_Collect(t *testing.T) {
114 tests := map[string]struct {
115 - prepare func(t *testing.T) (tomcat *Tomcat, cleanup func())
115 + prepare func(t *testing.T) (collr *Collector, cleanup func())
116 wantMetrics map[string]int64
117 wantCharts int
118 }{
@@ -178,22 +178,22 @@ func TestTomcat_Collect(t *testing.T) {
178
179 for name, test := range tests {
180 t.Run(name, func(t *testing.T) {
181 - tomcat, cleanup := test.prepare(t)
181 + collr, cleanup := test.prepare(t)
182 defer cleanup()
183
184 - mx := tomcat.Collect()
184 + mx := collr.Collect()
185
186 require.Equal(t, test.wantMetrics, mx)
187
188 if len(test.wantMetrics) > 0 {
189 - assert.Equal(t, test.wantCharts, len(*tomcat.Charts()))
190 - module.TestMetricsHasAllChartsDims(t, tomcat.Charts(), mx)
189 + assert.Equal(t, test.wantCharts, len(*collr.Charts()))
190 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
191 }
192 })
193 }
194 }
195
196 -func prepareCaseSuccess(t *testing.T) (*Tomcat, func()) {
196 +func prepareCaseSuccess(t *testing.T) (*Collector, func()) {
197 t.Helper()
198 srv := httptest.NewServer(http.HandlerFunc(
199 func(w http.ResponseWriter, r *http.Request) {
@@ -208,23 +208,23 @@ func prepareCaseSuccess(t *testing.T) (*Tomcat, func()) {
208 w.WriteHeader(http.StatusNotFound)
209 }
210 }))
211 - tomcat := New()
212 - tomcat.URL = srv.URL
213 - require.NoError(t, tomcat.Init())
211 + collr := New()
212 + collr.URL = srv.URL
213 + require.NoError(t, collr.Init())
214
215 - return tomcat, srv.Close
215 + return collr, srv.Close
216 }
217
218 -func prepareCaseConnectionRefused(t *testing.T) (*Tomcat, func()) {
218 +func prepareCaseConnectionRefused(t *testing.T) (*Collector, func()) {
219 t.Helper()
220 - tomcat := New()
221 - tomcat.URL = "http://127.0.0.1:65001"
222 - require.NoError(t, tomcat.Init())
220 + collr := New()
221 + collr.URL = "http://127.0.0.1:65001"
222 + require.NoError(t, collr.Init())
223
224 - return tomcat, func() {}
224 + return collr, func() {}
225 }
226
227 -func prepareCaseUnexpectedXMLResponse(t *testing.T) (*Tomcat, func()) {
227 +func prepareCaseUnexpectedXMLResponse(t *testing.T) (*Collector, func()) {
228 t.Helper()
229 resp := `
230 <?xml version="1.0" encoding="UTF-8" ?>
@@ -250,23 +250,23 @@ func prepareCaseUnexpectedXMLResponse(t *testing.T) (*Tomcat, func()) {
250 _, _ = w.Write([]byte(resp))
251 }))
252
253 - tomcat := New()
254 - tomcat.URL = srv.URL
255 - require.NoError(t, tomcat.Init())
253 + collr := New()
254 + collr.URL = srv.URL
255 + require.NoError(t, collr.Init())
256
257 - return tomcat, srv.Close
257 + return collr, srv.Close
258 }
259
260 -func prepareCaseInvalidFormatResponse(t *testing.T) (*Tomcat, func()) {
260 +func prepareCaseInvalidFormatResponse(t *testing.T) (*Collector, func()) {
261 t.Helper()
262 srv := httptest.NewServer(http.HandlerFunc(
263 func(w http.ResponseWriter, r *http.Request) {
264 _, _ = w.Write([]byte("hello and\n goodbye"))
265 }))
266
267 - tomcat := New()
268 - tomcat.URL = srv.URL
269 - require.NoError(t, tomcat.Init())
267 + collr := New()
268 + collr.URL = srv.URL
269 + require.NoError(t, collr.Init())
270
271 - return tomcat, srv.Close
271 + return collr, srv.Close
272 }
src/go/plugin/go.d/collector/tomcat/init.go
+4 -4
@@ -9,13 +9,13 @@ import (
9 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/web"
10 )
11
12 -func (t *Tomcat) validateConfig() error {
13 - if t.URL == "" {
12 +func (c *Collector) validateConfig() error {
13 + if c.URL == "" {
14 return fmt.Errorf("url not set")
15 }
16 return nil
17 }
18
19 -func (t *Tomcat) initHTTPClient() (*http.Client, error) {
20 - return web.NewHTTPClient(t.ClientConfig)
19 +func (c *Collector) initHTTPClient() (*http.Client, error) {
20 + return web.NewHTTPClient(c.ClientConfig)
21 }
src/go/plugin/go.d/collector/tor/collect.go
+10 -10
@@ -10,26 +10,26 @@ import (
10 "strings"
11 )
12
13 -func (t *Tor) collect() (map[string]int64, error) {
14 - if t.conn == nil {
15 - conn, err := t.establishConnection()
13 +func (c *Collector) collect() (map[string]int64, error) {
14 + if c.conn == nil {
15 + conn, err := c.establishConnection()
16 if err != nil {
17 return nil, err
18 }
19 - t.conn = conn
19 + c.conn = conn
20 }
21
22 mx := make(map[string]int64)
23 - if err := t.collectServerInfo(mx); err != nil {
24 - t.Cleanup()
23 + if err := c.collectServerInfo(mx); err != nil {
24 + c.Cleanup()
25 return nil, err
26 }
27
28 return mx, nil
29 }
30
31 -func (t *Tor) collectServerInfo(mx map[string]int64) error {
32 - resp, err := t.conn.getInfo("traffic/read", "traffic/written", "uptime")
31 +func (c *Collector) collectServerInfo(mx map[string]int64) error {
32 + resp, err := c.conn.getInfo("traffic/read", "traffic/written", "uptime")
33 if err != nil {
34 return err
35 }
@@ -54,8 +54,8 @@ func (t *Tor) collectServerInfo(mx map[string]int64) error {
54 return nil
55 }
56
57 -func (t *Tor) establishConnection() (controlConn, error) {
58 - conn := t.newConn(t.Config)
57 +func (c *Collector) establishConnection() (controlConn, error) {
58 + conn := c.newConn(c.Config)
59
60 if err := conn.connect(); err != nil {
61 return nil, err
src/go/plugin/go.d/collector/tor/collector.go renamed
+18 -18
@@ -22,8 +22,8 @@ func init() {
22 })
23 }
24
25 -func New() *Tor {
26 - return &Tor{
25 +func New() *Collector {
26 + return &Collector{
27 Config: Config{
28 Address: "127.0.0.1:9051",
29 Timeout: confopt.Duration(time.Second * 1),
@@ -40,7 +40,7 @@ type Config struct {
40 Password string `yaml:"password" json:"password"`
41 }
42
43 -type Tor struct {
43 +type Collector struct {
44 module.Base
45 Config `yaml:",inline" json:""`
46
@@ -50,20 +50,20 @@ type Tor struct {
50 conn controlConn
51 }
52
53 -func (t *Tor) Configuration() any {
54 - return t.Config
53 +func (c *Collector) Configuration() any {
54 + return c.Config
55 }
56
57 -func (t *Tor) Init() error {
58 - if t.Address == "" {
57 +func (c *Collector) Init() error {
58 + if c.Address == "" {
59 return errors.New("config: address not set")
60 }
61
62 return nil
63 }
64
65 -func (t *Tor) Check() error {
66 - mx, err := t.collect()
65 +func (c *Collector) Check() error {
66 + mx, err := c.collect()
67 if err != nil {
68 return err
69 }
@@ -75,14 +75,14 @@ func (t *Tor) Check() error {
75 return nil
76 }
77
78 -func (t *Tor) Charts() *module.Charts {
79 - return t.charts
78 +func (c *Collector) Charts() *module.Charts {
79 + return c.charts
80 }
81
82 -func (t *Tor) Collect() map[string]int64 {
83 - mx, err := t.collect()
82 +func (c *Collector) Collect() map[string]int64 {
83 + mx, err := c.collect()
84 if err != nil {
85 - t.Error(err)
85 + c.Error(err)
86 }
87
88 if len(mx) == 0 {
@@ -92,9 +92,9 @@ func (t *Tor) Collect() map[string]int64 {
92 return mx
93 }
94
95 -func (t *Tor) Cleanup() {
96 - if t.conn != nil {
97 - t.conn.disconnect()
98 - t.conn = nil
95 +func (c *Collector) Cleanup() {
96 + if c.conn != nil {
97 + c.conn.disconnect()
98 + c.conn = nil
99 }
100 }
src/go/plugin/go.d/collector/tor/collector_test.go renamed
+31 -31
@@ -33,11 +33,11 @@ func Test_testDataIsValid(t *testing.T) {
33 }
34 }
35
36 -func TestTor_ConfigurationSerialize(t *testing.T) {
37 - module.TestConfigurationSerialize(t, &Tor{}, dataConfigJSON, dataConfigYAML)
36 +func TestCollector_ConfigurationSerialize(t *testing.T) {
37 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
38 }
39
40 -func TestTor_Init(t *testing.T) {
40 +func TestCollector_Init(t *testing.T) {
41 tests := map[string]struct {
42 config Config
43 wantFail bool
@@ -58,25 +58,25 @@ func TestTor_Init(t *testing.T) {
58
59 for name, test := range tests {
60 t.Run(name, func(t *testing.T) {
61 - tor := New()
62 - tor.Config = test.config
61 + collr := New()
62 + collr.Config = test.config
63
64 if test.wantFail {
65 - assert.Error(t, tor.Init())
65 + assert.Error(t, collr.Init())
66 } else {
67 - assert.NoError(t, tor.Init())
67 + assert.NoError(t, collr.Init())
68 }
69 })
70 }
71 }
72
73 -func TestTor_Charts(t *testing.T) {
73 +func TestCollector_Charts(t *testing.T) {
74 assert.NotNil(t, New().Charts())
75 }
76
77 -func TestTor_Check(t *testing.T) {
77 +func TestCollector_Check(t *testing.T) {
78 tests := map[string]struct {
79 - prepare func() (*Tor, *mockTorDaemon)
79 + prepare func() (*Collector, *mockTorDaemon)
80 wantFail bool
81 }{
82 "success on valid response": {
@@ -90,7 +90,7 @@ func TestTor_Check(t *testing.T) {
90 }
91 for name, test := range tests {
92 t.Run(name, func(t *testing.T) {
93 - tor, daemon := test.prepare()
93 + collr, daemon := test.prepare()
94
95 defer func() {
96 assert.NoError(t, daemon.Close(), "daemon.Close()")
@@ -105,15 +105,15 @@ func TestTor_Check(t *testing.T) {
105 t.Errorf("mock tor daemon start timed out")
106 }
107
108 - require.NoError(t, tor.Init())
108 + require.NoError(t, collr.Init())
109
110 if test.wantFail {
111 - assert.Error(t, tor.Check())
111 + assert.Error(t, collr.Check())
112 } else {
113 - assert.NoError(t, tor.Check())
113 + assert.NoError(t, collr.Check())
114 }
115
116 - tor.Cleanup()
116 + collr.Cleanup()
117
118 select {
119 case <-daemon.stopped:
@@ -124,9 +124,9 @@ func TestTor_Check(t *testing.T) {
124 }
125 }
126
127 -func TestTor_Collect(t *testing.T) {
127 +func TestCollector_Collect(t *testing.T) {
128 tests := map[string]struct {
129 - prepare func() (*Tor, *mockTorDaemon)
129 + prepare func() (*Collector, *mockTorDaemon)
130 wantMetrics map[string]int64
131 wantCharts int
132 }{
@@ -147,7 +147,7 @@ func TestTor_Collect(t *testing.T) {
147
148 for name, test := range tests {
149 t.Run(name, func(t *testing.T) {
150 - tor, daemon := test.prepare()
150 + collr, daemon := test.prepare()
151
152 defer func() {
153 assert.NoError(t, daemon.Close(), "daemon.Close()")
@@ -162,19 +162,19 @@ func TestTor_Collect(t *testing.T) {
162 t.Errorf("mock tor daemon start timed out")
163 }
164
165 - require.NoError(t, tor.Init())
165 + require.NoError(t, collr.Init())
166
167 - mx := tor.Collect()
167 + mx := collr.Collect()
168
169 require.Equal(t, test.wantMetrics, mx)
170
171 - assert.Equal(t, test.wantCharts, len(*tor.Charts()), "want charts")
171 + assert.Equal(t, test.wantCharts, len(*collr.Charts()), "want charts")
172
173 if len(test.wantMetrics) > 0 {
174 - module.TestMetricsHasAllChartsDims(t, tor.Charts(), mx)
174 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
175 }
176
177 - tor.Cleanup()
177 + collr.Cleanup()
178
179 select {
180 case <-daemon.stopped:
@@ -185,20 +185,20 @@ func TestTor_Collect(t *testing.T) {
185 }
186 }
187
188 -func prepareCaseOk() (*Tor, *mockTorDaemon) {
188 +func prepareCaseOk() (*Collector, *mockTorDaemon) {
189 daemon := &mockTorDaemon{
190 addr: "127.0.0.1:65001",
191 started: make(chan struct{}),
192 stopped: make(chan struct{}),
193 }
194
195 - tor := New()
196 - tor.Address = daemon.addr
195 + collr := New()
196 + collr.Address = daemon.addr
197
198 - return tor, daemon
198 + return collr, daemon
199 }
200
201 -func prepareCaseConnectionRefused() (*Tor, *mockTorDaemon) {
201 +func prepareCaseConnectionRefused() (*Collector, *mockTorDaemon) {
202 ch := make(chan struct{})
203 close(ch)
204
@@ -209,10 +209,10 @@ func prepareCaseConnectionRefused() (*Tor, *mockTorDaemon) {
209 stopped: ch,
210 }
211
212 - tor := New()
213 - tor.Address = daemon.addr
212 + collr := New()
213 + collr.Address = daemon.addr
214
215 - return tor, daemon
215 + return collr, daemon
216 }
217
218 type mockTorDaemon struct {
src/go/plugin/go.d/collector/traefik/collect.go
+28 -28
@@ -32,28 +32,28 @@ func isTraefikMetrics(pms prometheus.Series) bool {
32 return false
33 }
34
35 -func (t *Traefik) collect() (map[string]int64, error) {
36 - pms, err := t.prom.ScrapeSeries()
35 +func (c *Collector) collect() (map[string]int64, error) {
36 + pms, err := c.prom.ScrapeSeries()
37 if err != nil {
38 return nil, err
39 }
40
41 - if t.checkMetrics && !isTraefikMetrics(pms) {
41 + if c.checkMetrics && !isTraefikMetrics(pms) {
42 return nil, errors.New("unexpected metrics (not Traefik)")
43 }
44 - t.checkMetrics = false
44 + c.checkMetrics = false
45
46 mx := make(map[string]int64)
47
48 - t.collectEntrypointRequestsTotal(mx, pms)
49 - t.collectEntrypointRequestDuration(mx, pms)
50 - t.collectEntrypointOpenConnections(mx, pms)
51 - t.updateCodeClassMetrics(mx)
48 + c.collectEntrypointRequestsTotal(mx, pms)
49 + c.collectEntrypointRequestDuration(mx, pms)
50 + c.collectEntrypointOpenConnections(mx, pms)
51 + c.updateCodeClassMetrics(mx)
52
53 return mx, nil
54 }
55
56 -func (t *Traefik) collectEntrypointRequestsTotal(mx map[string]int64, pms prometheus.Series) {
56 +func (c *Collector) collectEntrypointRequestsTotal(mx map[string]int64, pms prometheus.Series) {
57 if pms = pms.FindByName(metricEntrypointRequestsTotal); pms.Len() == 0 {
58 return
59 }
@@ -71,18 +71,18 @@ func (t *Traefik) collectEntrypointRequestsTotal(mx map[string]int64, pms promet
71 mx[key] += int64(pm.Value)
72
73 id := ep + "_" + proto
74 - ce := t.cacheGetOrPutEntrypoint(id)
74 + ce := c.cacheGetOrPutEntrypoint(id)
75 if ce.requests == nil {
76 chart := newChartEntrypointRequests(ep, proto)
77 ce.requests = chart
78 - if err := t.Charts().Add(chart); err != nil {
79 - t.Warning(err)
78 + if err := c.Charts().Add(chart); err != nil {
79 + c.Warning(err)
80 }
81 }
82 }
83 }
84
85 -func (t *Traefik) collectEntrypointRequestDuration(mx map[string]int64, pms prometheus.Series) {
85 +func (c *Collector) collectEntrypointRequestDuration(mx map[string]int64, pms prometheus.Series) {
86 if pms = pms.FindByNames(
87 metricEntrypointRequestDurationSecondsCount,
88 metricEntrypointRequestDurationSecondsSum,
@@ -100,7 +100,7 @@ func (t *Traefik) collectEntrypointRequestDuration(mx map[string]int64, pms prom
100 }
101
102 id := ep + "_" + proto
103 - ce := t.cacheGetOrPutEntrypoint(id)
103 + ce := c.cacheGetOrPutEntrypoint(id)
104 v := ce.reqDurData[codeClass]
105 if pm.Name() == metricEntrypointRequestDurationSecondsSum {
106 v.cur.secs += pm.Value
@@ -110,12 +110,12 @@ func (t *Traefik) collectEntrypointRequestDuration(mx map[string]int64, pms prom
110 ce.reqDurData[codeClass] = v
111 }
112
113 - for id, ce := range t.cache.entrypoints {
113 + for id, ce := range c.cache.entrypoints {
114 if ce.reqDur == nil {
115 chart := newChartEntrypointRequestDuration(ce.name, ce.proto)
116 ce.reqDur = chart
117 - if err := t.Charts().Add(chart); err != nil {
118 - t.Warning(err)
117 + if err := c.Charts().Add(chart); err != nil {
118 + c.Warning(err)
119 }
120 }
121 for codeClass, v := range ce.reqDurData {
@@ -134,7 +134,7 @@ func (t *Traefik) collectEntrypointRequestDuration(mx map[string]int64, pms prom
134 }
135 }
136
137 -func (t *Traefik) collectEntrypointOpenConnections(mx map[string]int64, pms prometheus.Series) {
137 +func (c *Collector) collectEntrypointOpenConnections(mx map[string]int64, pms prometheus.Series) {
138 if pms = pms.FindByName(metricEntrypointOpenConnections); pms.Len() == 0 {
139 return
140 }
@@ -151,12 +151,12 @@ func (t *Traefik) collectEntrypointOpenConnections(mx map[string]int64, pms prom
151 mx[key] += int64(pm.Value)
152
153 id := ep + "_" + proto
154 - ce := t.cacheGetOrPutEntrypoint(id)
154 + ce := c.cacheGetOrPutEntrypoint(id)
155 if ce.openConn == nil {
156 chart := newChartEntrypointOpenConnections(ep, proto)
157 ce.openConn = chart
158 - if err := t.Charts().Add(chart); err != nil {
159 - t.Warning(err)
158 + if err := c.Charts().Add(chart); err != nil {
159 + c.Warning(err)
160 }
161 }
162
@@ -164,7 +164,7 @@ func (t *Traefik) collectEntrypointOpenConnections(mx map[string]int64, pms prom
164 ce.openConnMethods[method] = true
165 dim := &module.Dim{ID: key, Name: method}
166 if err := ce.openConn.AddDim(dim); err != nil {
167 - t.Warning(err)
167 + c.Warning(err)
168 }
169 ce.openConn.MarkNotCreated()
170 }
@@ -173,8 +173,8 @@ func (t *Traefik) collectEntrypointOpenConnections(mx map[string]int64, pms prom
173
174 var httpRespCodeClasses = []string{"1xx", "2xx", "3xx", "4xx", "5xx"}
175
176 -func (t *Traefik) updateCodeClassMetrics(mx map[string]int64) {
177 - for id, ce := range t.cache.entrypoints {
176 +func (c *Collector) updateCodeClassMetrics(mx map[string]int64) {
177 + for id, ce := range c.cache.entrypoints {
178 if ce.requests != nil {
179 for _, c := range httpRespCodeClasses {
180 key := prefixEntrypointRequests + id + "_" + c
@@ -197,18 +197,18 @@ func getCodeClass(code string) string {
197 return string(code[0]) + "xx"
198 }
199
200 -func (t *Traefik) cacheGetOrPutEntrypoint(id string) *cacheEntrypoint {
201 - if _, ok := t.cache.entrypoints[id]; !ok {
200 +func (c *Collector) cacheGetOrPutEntrypoint(id string) *cacheEntrypoint {
201 + if _, ok := c.cache.entrypoints[id]; !ok {
202 name, proto := id, id
203 if idx := strings.LastIndexByte(id, '_'); idx != -1 {
204 name, proto = id[:idx], id[idx+1:]
205 }
206 - t.cache.entrypoints[id] = &cacheEntrypoint{
206 + c.cache.entrypoints[id] = &cacheEntrypoint{
207 name: name,
208 proto: proto,
209 reqDurData: make(map[string]cacheEntrypointReqDur),
210 openConnMethods: make(map[string]bool),
211 }
212 }
213 - return t.cache.entrypoints[id]
213 + return c.cache.entrypoints[id]
214 }
src/go/plugin/go.d/collector/traefik/collector.go renamed
+17 -17
@@ -25,8 +25,8 @@ func init() {
25 })
26 }
27
28 -func New() *Traefik {
29 - return &Traefik{
28 +func New() *Collector {
29 + return &Collector{
30 Config: Config{
31 HTTPConfig: web.HTTPConfig{
32 RequestConfig: web.RequestConfig{
@@ -52,7 +52,7 @@ type Config struct {
52 }
53
54 type (
55 - Traefik struct {
55 + Collector struct {
56 module.Base
57 Config `yaml:",inline" json:""`
58
@@ -80,26 +80,26 @@ type (
80 }
81 )
82
83 -func (t *Traefik) Configuration() any {
84 - return t.Config
83 +func (c *Collector) Configuration() any {
84 + return c.Config
85 }
86
87 -func (t *Traefik) Init() error {
88 - if err := t.validateConfig(); err != nil {
87 +func (c *Collector) Init() error {
88 + if err := c.validateConfig(); err != nil {
89 return fmt.Errorf("config validation: %v", err)
90 }
91
92 - prom, err := t.initPrometheusClient()
92 + prom, err := c.initPrometheusClient()
93 if err != nil {
94 return fmt.Errorf("prometheus client initialization: %v", err)
95 }
96 - t.prom = prom
96 + c.prom = prom
97
98 return nil
99 }
100
101 -func (t *Traefik) Check() error {
102 - mx, err := t.collect()
101 +func (c *Collector) Check() error {
102 + mx, err := c.collect()
103 if err != nil {
104 return err
105 }
@@ -109,14 +109,14 @@ func (t *Traefik) Check() error {
109 return nil
110 }
111
112 -func (t *Traefik) Charts() *module.Charts {
113 - return t.charts
112 +func (c *Collector) Charts() *module.Charts {
113 + return c.charts
114 }
115
116 -func (t *Traefik) Collect() map[string]int64 {
117 - mx, err := t.collect()
116 +func (c *Collector) Collect() map[string]int64 {
117 + mx, err := c.collect()
118 if err != nil {
119 - t.Error(err)
119 + c.Error(err)
120 return nil
121 }
122
@@ -126,4 +126,4 @@ func (t *Traefik) Collect() map[string]int64 {
126 return mx
127 }
128
129 -func (t *Traefik) Cleanup() {}
129 +func (c *Collector) Cleanup() {}
src/go/plugin/go.d/collector/traefik/collector_test.go renamed
+44 -44
@@ -33,11 +33,11 @@ func Test_testDataIsValid(t *testing.T) {
33 }
34 }
35
36 -func TestTraefik_ConfigurationSerialize(t *testing.T) {
37 - module.TestConfigurationSerialize(t, &Traefik{}, dataConfigJSON, dataConfigYAML)
36 +func TestCollector_ConfigurationSerialize(t *testing.T) {
37 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
38 }
39
40 -func TestTraefik_Init(t *testing.T) {
40 +func TestCollector_Init(t *testing.T) {
41 tests := map[string]struct {
42 config Config
43 wantFail bool
@@ -64,30 +64,30 @@ func TestTraefik_Init(t *testing.T) {
64
65 for name, test := range tests {
66 t.Run(name, func(t *testing.T) {
67 - rdb := New()
68 - rdb.Config = test.config
67 + collr := New()
68 + collr.Config = test.config
69
70 if test.wantFail {
71 - assert.Error(t, rdb.Init())
71 + assert.Error(t, collr.Init())
72 } else {
73 - assert.NoError(t, rdb.Init())
73 + assert.NoError(t, collr.Init())
74 }
75 })
76 }
77 }
78
79 -func TestTraefik_Charts(t *testing.T) {
79 +func TestCollector_Charts(t *testing.T) {
80 assert.NotNil(t, New().Charts())
81 }
82
83 -func TestTraefik_Cleanup(t *testing.T) {
83 +func TestCollector_Cleanup(t *testing.T) {
84 assert.NotPanics(t, New().Cleanup)
85 }
86
87 -func TestTraefik_Check(t *testing.T) {
87 +func TestCollector_Check(t *testing.T) {
88 tests := map[string]struct {
89 wantFail bool
90 - prepare func(t *testing.T) (tk *Traefik, cleanup func())
90 + prepare func(t *testing.T) (collr *Collector, cleanup func())
91 }{
92 "success on valid response v2.3.1": {
93 wantFail: false,
@@ -109,21 +109,21 @@ func TestTraefik_Check(t *testing.T) {
109
110 for name, test := range tests {
111 t.Run(name, func(t *testing.T) {
112 - tk, cleanup := test.prepare(t)
112 + collr, cleanup := test.prepare(t)
113 defer cleanup()
114
115 if test.wantFail {
116 - assert.Error(t, tk.Check())
116 + assert.Error(t, collr.Check())
117 } else {
118 - assert.NoError(t, tk.Check())
118 + assert.NoError(t, collr.Check())
119 }
120 })
121 }
122 }
123
124 -func TestTraefik_Collect(t *testing.T) {
124 +func TestCollector_Collect(t *testing.T) {
125 tests := map[string]struct {
126 - prepare func(t *testing.T) (tk *Traefik, cleanup func())
126 + prepare func(t *testing.T) (collr *Collector, cleanup func())
127 wantCollected []map[string]int64
128 }{
129 "success on valid response v2.2.1": {
@@ -238,35 +238,35 @@ func TestTraefik_Collect(t *testing.T) {
238
239 for name, test := range tests {
240 t.Run(name, func(t *testing.T) {
241 - tk, cleanup := test.prepare(t)
241 + collr, cleanup := test.prepare(t)
242 defer cleanup()
243
244 var mx map[string]int64
245 for _, want := range test.wantCollected {
246 - mx = tk.Collect()
246 + mx = collr.Collect()
247 assert.Equal(t, want, mx)
248 }
249 if len(test.wantCollected) > 0 {
250 - module.TestMetricsHasAllChartsDims(t, tk.Charts(), mx)
250 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
251 }
252 })
253 }
254 }
255
256 -func prepareCaseTraefikV221Metrics(t *testing.T) (*Traefik, func()) {
256 +func prepareCaseTraefikV221Metrics(t *testing.T) (*Collector, func()) {
257 t.Helper()
258 srv := httptest.NewServer(http.HandlerFunc(
259 func(w http.ResponseWriter, r *http.Request) {
260 _, _ = w.Write(dataVer221Metrics)
261 }))
262 - h := New()
263 - h.URL = srv.URL
264 - require.NoError(t, h.Init())
262 + collr := New()
263 + collr.URL = srv.URL
264 + require.NoError(t, collr.Init())
265
266 - return h, srv.Close
266 + return collr, srv.Close
267 }
268
269 -func prepareCaseTraefikEntrypointRequestDuration(t *testing.T) (*Traefik, func()) {
269 +func prepareCaseTraefikEntrypointRequestDuration(t *testing.T) (*Collector, func()) {
270 t.Helper()
271 var num int
272 srv := httptest.NewServer(http.HandlerFunc(
@@ -296,14 +296,14 @@ traefik_entrypoint_request_duration_seconds_count{code="300",entrypoint="web",me
296 `))
297 }
298 }))
299 - h := New()
300 - h.URL = srv.URL
301 - require.NoError(t, h.Init())
299 + collr := New()
300 + collr.URL = srv.URL
301 + require.NoError(t, collr.Init())
302
303 - return h, srv.Close
303 + return collr, srv.Close
304 }
305
306 -func prepareCaseNotTraefikMetrics(t *testing.T) (*Traefik, func()) {
306 +func prepareCaseNotTraefikMetrics(t *testing.T) (*Collector, func()) {
307 t.Helper()
308 srv := httptest.NewServer(http.HandlerFunc(
309 func(w http.ResponseWriter, r *http.Request) {
@@ -324,31 +324,31 @@ application_backend_http_responses_total{proxy="infra-traefik-web",code="other"}
324 application_backend_http_responses_total{proxy="infra-vernemq-ws",code="other"} 0
325 `))
326 }))
327 - h := New()
328 - h.URL = srv.URL
329 - require.NoError(t, h.Init())
327 + collr := New()
328 + collr.URL = srv.URL
329 + require.NoError(t, collr.Init())
330
331 - return h, srv.Close
331 + return collr, srv.Close
332 }
333
334 -func prepareCase404Response(t *testing.T) (*Traefik, func()) {
334 +func prepareCase404Response(t *testing.T) (*Collector, func()) {
335 t.Helper()
336 srv := httptest.NewServer(http.HandlerFunc(
337 func(w http.ResponseWriter, r *http.Request) {
338 w.WriteHeader(http.StatusNotFound)
339 }))
340 - h := New()
341 - h.URL = srv.URL
342 - require.NoError(t, h.Init())
340 + collr := New()
341 + collr.URL = srv.URL
342 + require.NoError(t, collr.Init())
343
344 - return h, srv.Close
344 + return collr, srv.Close
345 }
346
347 -func prepareCaseConnectionRefused(t *testing.T) (*Traefik, func()) {
347 +func prepareCaseConnectionRefused(t *testing.T) (*Collector, func()) {
348 t.Helper()
349 - h := New()
350 - h.URL = "http://127.0.0.1:38001"
351 - require.NoError(t, h.Init())
349 + collr := New()
350 + collr.URL = "http://127.0.0.1:38001"
351 + require.NoError(t, collr.Init())
352
353 - return h, func() {}
353 + return collr, func() {}
354 }
src/go/plugin/go.d/collector/traefik/init.go
+5 -5
@@ -10,20 +10,20 @@ import (
10 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/web"
11 )
12
13 -func (t *Traefik) validateConfig() error {
14 - if t.URL == "" {
13 +func (c *Collector) validateConfig() error {
14 + if c.URL == "" {
15 return errors.New("'url' is not set")
16 }
17 return nil
18 }
19
20 -func (t *Traefik) initPrometheusClient() (prometheus.Prometheus, error) {
21 - httpClient, err := web.NewHTTPClient(t.ClientConfig)
20 +func (c *Collector) initPrometheusClient() (prometheus.Prometheus, error) {
21 + httpClient, err := web.NewHTTPClient(c.ClientConfig)
22 if err != nil {
23 return nil, err
24 }
25
26 - prom := prometheus.NewWithSelector(httpClient, t.RequestConfig, sr)
26 + prom := prometheus.NewWithSelector(httpClient, c.RequestConfig, sr)
27 return prom, nil
28 }
29
src/go/plugin/go.d/collector/typesense/charts.go
+3 -3
@@ -98,8 +98,8 @@ var (
98 }
99 )
100
101 -func (ts *Typesense) addStatsCharts() {
102 - if err := ts.charts.Add(*statsCharts.Copy()...); err != nil {
103 - ts.Warningf("error adding stats charts: %v", err)
101 +func (c *Collector) addStatsCharts() {
102 + if err := c.charts.Add(*statsCharts.Copy()...); err != nil {
103 + c.Warningf("error adding stats charts: %v", err)
104 }
105 }
src/go/plugin/go.d/collector/typesense/collect.go
+16 -16
@@ -38,28 +38,28 @@ type statsResponse struct {
38 WriteRequestsPerSecond float64 `json:"write_requests_per_second" stm:"write_requests_per_second,1000,1"`
39 }
40
41 -func (ts *Typesense) collect() (map[string]int64, error) {
41 +func (c *Collector) collect() (map[string]int64, error) {
42 mx := make(map[string]int64)
43
44 - if err := ts.collectHealth(mx); err != nil {
44 + if err := c.collectHealth(mx); err != nil {
45 return nil, err
46 }
47
48 - if err := ts.collectStats(mx); err != nil {
48 + if err := c.collectStats(mx); err != nil {
49 return nil, err
50 }
51
52 return mx, nil
53 }
54
55 -func (ts *Typesense) collectHealth(mx map[string]int64) error {
56 - req, err := web.NewHTTPRequestWithPath(ts.RequestConfig, urlPathHealth)
55 +func (c *Collector) collectHealth(mx map[string]int64) error {
56 + req, err := web.NewHTTPRequestWithPath(c.RequestConfig, urlPathHealth)
57 if err != nil {
58 return fmt.Errorf("creating health request: %w", err)
59 }
60
61 var resp healthResponse
62 - if err := ts.client().RequestJSON(req, &resp); err != nil {
62 + if err := c.client().RequestJSON(req, &resp); err != nil {
63 return err
64 }
65
@@ -82,31 +82,31 @@ func (ts *Typesense) collectHealth(mx map[string]int64) error {
82 return nil
83 }
84
85 -func (ts *Typesense) collectStats(mx map[string]int64) error {
86 - if !ts.doStats || ts.APIKey == "" {
85 +func (c *Collector) collectStats(mx map[string]int64) error {
86 + if !c.doStats || c.APIKey == "" {
87 return nil
88 }
89
90 - req, err := web.NewHTTPRequestWithPath(ts.RequestConfig, urlPathStats)
90 + req, err := web.NewHTTPRequestWithPath(c.RequestConfig, urlPathStats)
91 if err != nil {
92 return fmt.Errorf("creating stats request: %w", err)
93 }
94
95 - req.Header.Set("X-TYPESENSE-API-KEY", ts.APIKey)
95 + req.Header.Set("X-TYPESENSE-API-KEY", c.APIKey)
96
97 var resp statsResponse
98 - if err := ts.client().RequestJSON(req, &resp); err != nil {
98 + if err := c.client().RequestJSON(req, &resp); err != nil {
99 if !strings.Contains(err.Error(), "code: 401") {
100 return err
101 }
102
103 - ts.doStats = false
104 - ts.Warning(err)
103 + c.doStats = false
104 + c.Warning(err)
105
106 return nil
107 }
108
109 - ts.once.Do(ts.addStatsCharts)
109 + c.once.Do(c.addStatsCharts)
110
111 for k, v := range stm.ToMap(resp) {
112 mx[k] = v
@@ -115,8 +115,8 @@ func (ts *Typesense) collectStats(mx map[string]int64) error {
115 return nil
116 }
117
118 -func (ts *Typesense) client() *web.Client {
119 - return web.DoHTTP(ts.httpClient).OnNokCode(func(resp *http.Response) (bool, error) {
118 +func (c *Collector) client() *web.Client {
119 + return web.DoHTTP(c.httpClient).OnNokCode(func(resp *http.Response) (bool, error) {
120 // {"message": "Forbidden - a valid `x-typesense-api-key` header must be sent."}
121 var msg struct {
122 Msg string `json:"message"`
src/go/plugin/go.d/collector/typesense/collector.go renamed
+23 -23
@@ -26,8 +26,8 @@ func init() {
26 })
27 }
28
29 -func New() *Typesense {
30 - return &Typesense{
29 +func New() *Collector {
30 + return &Collector{
31 Config: Config{
32 HTTPConfig: web.HTTPConfig{
33 RequestConfig: web.RequestConfig{
@@ -49,7 +49,7 @@ type Config struct {
49 APIKey string `yaml:"api_key,omitempty" json:"api_key"`
50 }
51
52 -type Typesense struct {
52 +type Collector struct {
53 module.Base
54 Config `yaml:",inline" json:""`
55
@@ -61,33 +61,33 @@ type Typesense struct {
61 doStats bool
62 }
63
64 -func (ts *Typesense) Configuration() any {
65 - return ts.Config
64 +func (c *Collector) Configuration() any {
65 + return c.Config
66 }
67
68 -func (ts *Typesense) Init() error {
69 - if ts.URL == "" {
68 +func (c *Collector) Init() error {
69 + if c.URL == "" {
70 return errors.New("configL: url not configured")
71 }
72
73 - httpClient, err := web.NewHTTPClient(ts.ClientConfig)
73 + httpClient, err := web.NewHTTPClient(c.ClientConfig)
74 if err != nil {
75 return fmt.Errorf("init http client: %w", err)
76 }
77
78 - ts.httpClient = httpClient
78 + c.httpClient = httpClient
79
80 - if ts.APIKey == "" {
81 - ts.Warning("API key not set in configuration. Only health status will be collected.")
80 + if c.APIKey == "" {
81 + c.Warning("API key not set in configuration. Only health status will be collected.")
82 }
83 - ts.Debugf("using URL %s", ts.URL)
84 - ts.Debugf("using timeout: %s", ts.Timeout)
83 + c.Debugf("using URL %s", c.URL)
84 + c.Debugf("using timeout: %s", c.Timeout)
85
86 return nil
87 }
88
89 -func (ts *Typesense) Check() error {
90 - mx, err := ts.collect()
89 +func (c *Collector) Check() error {
90 + mx, err := c.collect()
91 if err != nil {
92 return err
93 }
@@ -98,14 +98,14 @@ func (ts *Typesense) Check() error {
98 return nil
99 }
100
101 -func (ts *Typesense) Charts() *module.Charts {
102 - return ts.charts
101 +func (c *Collector) Charts() *module.Charts {
102 + return c.charts
103 }
104
105 -func (ts *Typesense) Collect() map[string]int64 {
106 - mx, err := ts.collect()
105 +func (c *Collector) Collect() map[string]int64 {
106 + mx, err := c.collect()
107 if err != nil {
108 - ts.Error(err)
108 + c.Error(err)
109 }
110
111 if len(mx) == 0 {
@@ -114,8 +114,8 @@ func (ts *Typesense) Collect() map[string]int64 {
114 return mx
115 }
116
117 -func (ts *Typesense) Cleanup() {
118 - if ts.httpClient != nil {
119 - ts.httpClient.CloseIdleConnections()
117 +func (c *Collector) Cleanup() {
118 + if c.httpClient != nil {
119 + c.httpClient.CloseIdleConnections()
120 }
121 }
src/go/plugin/go.d/collector/typesense/collector_test.go renamed
+52 -52
@@ -39,11 +39,11 @@ func Test_testDataIsValid(t *testing.T) {
39 }
40 }
41
42 -func TestTypesense_ConfigurationSerialize(t *testing.T) {
43 - module.TestConfigurationSerialize(t, &Typesense{}, dataConfigJSON, dataConfigYAML)
42 +func TestCollector_ConfigurationSerialize(t *testing.T) {
43 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
44 }
45
46 -func TestTypesense_Init(t *testing.T) {
46 +func TestCollector_Init(t *testing.T) {
47 tests := map[string]struct {
48 wantFail bool
49 config Config
@@ -64,22 +64,22 @@ func TestTypesense_Init(t *testing.T) {
64
65 for name, test := range tests {
66 t.Run(name, func(t *testing.T) {
67 - ts := New()
68 - ts.Config = test.config
67 + collr := New()
68 + collr.Config = test.config
69
70 if test.wantFail {
71 - assert.Error(t, ts.Init())
71 + assert.Error(t, collr.Init())
72 } else {
73 - assert.NoError(t, ts.Init())
73 + assert.NoError(t, collr.Init())
74 }
75 })
76 }
77 }
78
79 -func TestTypesense_Check(t *testing.T) {
79 +func TestCollector_Check(t *testing.T) {
80 tests := map[string]struct {
81 wantFail bool
82 - prepare func(t *testing.T) (ts *Typesense, cleanup func())
82 + prepare func(t *testing.T) (collr *Collector, cleanup func())
83 }{
84 "success with valid API key": {
85 wantFail: false,
@@ -109,25 +109,25 @@ func TestTypesense_Check(t *testing.T) {
109
110 for name, test := range tests {
111 t.Run(name, func(t *testing.T) {
112 - ts, cleanup := test.prepare(t)
112 + collr, cleanup := test.prepare(t)
113 defer cleanup()
114
115 if test.wantFail {
116 - assert.Error(t, ts.Check())
116 + assert.Error(t, collr.Check())
117 } else {
118 - assert.NoError(t, ts.Check())
118 + assert.NoError(t, collr.Check())
119 }
120 })
121 }
122 }
123
124 -func TestTypesense_Charts(t *testing.T) {
124 +func TestCollector_Charts(t *testing.T) {
125 assert.NotNil(t, New().Charts())
126 }
127
128 -func TestTypesense_Collect(t *testing.T) {
128 +func TestCollector_Collect(t *testing.T) {
129 tests := map[string]struct {
130 - prepare func(t *testing.T) (ts *Typesense, cleanup func())
130 + prepare func(t *testing.T) (collr *Collector, cleanup func())
131 wantNumOfCharts int
132 wantMetrics map[string]int64
133 }{
@@ -180,25 +180,25 @@ func TestTypesense_Collect(t *testing.T) {
180
181 for name, test := range tests {
182 t.Run(name, func(t *testing.T) {
183 - ts, cleanup := test.prepare(t)
183 + collr, cleanup := test.prepare(t)
184 defer cleanup()
185
186 - _ = ts.Check()
186 + _ = collr.Check()
187
188 - mx := ts.Collect()
188 + mx := collr.Collect()
189
190 require.Equal(t, test.wantMetrics, mx)
191
192 if len(test.wantMetrics) > 0 {
193 - assert.Equal(t, test.wantNumOfCharts, len(*ts.Charts()), "want charts")
193 + assert.Equal(t, test.wantNumOfCharts, len(*collr.Charts()), "want charts")
194
195 - module.TestMetricsHasAllChartsDims(t, ts.Charts(), mx)
195 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
196 }
197 })
198 }
199 }
200
201 -func caseOk(t *testing.T) (*Typesense, func()) {
201 +func caseOk(t *testing.T) (*Collector, func()) {
202 t.Helper()
203 srv := httptest.NewServer(http.HandlerFunc(
204 func(w http.ResponseWriter, r *http.Request) {
@@ -217,15 +217,15 @@ func caseOk(t *testing.T) (*Typesense, func()) {
217 w.WriteHeader(http.StatusNotFound)
218 }
219 }))
220 - ts := New()
221 - ts.URL = srv.URL
222 - ts.APIKey = testApiKey
223 - require.NoError(t, ts.Init())
220 + collr := New()
221 + collr.URL = srv.URL
222 + collr.APIKey = testApiKey
223 + require.NoError(t, collr.Init())
224
225 - return ts, srv.Close
225 + return collr, srv.Close
226 }
227
228 -func caseOkNoApiKey(t *testing.T) (*Typesense, func()) {
228 +func caseOkNoApiKey(t *testing.T) (*Collector, func()) {
229 t.Helper()
230 srv := httptest.NewServer(http.HandlerFunc(
231 func(w http.ResponseWriter, r *http.Request) {
@@ -244,15 +244,15 @@ func caseOkNoApiKey(t *testing.T) (*Typesense, func()) {
244 w.WriteHeader(http.StatusNotFound)
245 }
246 }))
247 - ts := New()
248 - ts.URL = srv.URL
249 - ts.APIKey = ""
250 - require.NoError(t, ts.Init())
247 + collr := New()
248 + collr.URL = srv.URL
249 + collr.APIKey = ""
250 + require.NoError(t, collr.Init())
251
252 - return ts, srv.Close
252 + return collr, srv.Close
253 }
254
255 -func caseUnexpectedJsonResponse(t *testing.T) (*Typesense, func()) {
255 +func caseUnexpectedJsonResponse(t *testing.T) (*Collector, func()) {
256 t.Helper()
257 resp := `
258 {
@@ -275,44 +275,44 @@ func caseUnexpectedJsonResponse(t *testing.T) (*Typesense, func()) {
275 func(w http.ResponseWriter, r *http.Request) {
276 _, _ = w.Write([]byte(resp))
277 }))
278 - ts := New()
279 - ts.URL = srv.URL
280 - require.NoError(t, ts.Init())
278 + collr := New()
279 + collr.URL = srv.URL
280 + require.NoError(t, collr.Init())
281
282 - return ts, srv.Close
282 + return collr, srv.Close
283 }
284
285 -func caseInvalidDataResponse(t *testing.T) (*Typesense, func()) {
285 +func caseInvalidDataResponse(t *testing.T) (*Collector, func()) {
286 t.Helper()
287 srv := httptest.NewServer(http.HandlerFunc(
288 func(w http.ResponseWriter, r *http.Request) {
289 _, _ = w.Write([]byte("hello and\n goodbye"))
290 }))
291 - ts := New()
292 - ts.URL = srv.URL
293 - require.NoError(t, ts.Init())
291 + collr := New()
292 + collr.URL = srv.URL
293 + require.NoError(t, collr.Init())
294
295 - return ts, srv.Close
295 + return collr, srv.Close
296 }
297
298 -func caseConnectionRefused(t *testing.T) (*Typesense, func()) {
298 +func caseConnectionRefused(t *testing.T) (*Collector, func()) {
299 t.Helper()
300 - ts := New()
301 - ts.URL = "http://127.0.0.1:65001"
302 - require.NoError(t, ts.Init())
300 + collr := New()
301 + collr.URL = "http://127.0.0.1:65001"
302 + require.NoError(t, collr.Init())
303
304 - return ts, func() {}
304 + return collr, func() {}
305 }
306
307 -func case404(t *testing.T) (*Typesense, func()) {
307 +func case404(t *testing.T) (*Collector, func()) {
308 t.Helper()
309 srv := httptest.NewServer(http.HandlerFunc(
310 func(w http.ResponseWriter, r *http.Request) {
311 w.WriteHeader(http.StatusNotFound)
312 }))
313 - ts := New()
314 - ts.URL = srv.URL
315 - require.NoError(t, ts.Init())
313 + collr := New()
314 + collr.URL = srv.URL
315 + require.NoError(t, collr.Init())
316
317 - return ts, srv.Close
317 + return collr, srv.Close
318 }
src/go/plugin/go.d/collector/unbound/charts.go
+45 -45
@@ -420,86 +420,86 @@ var (
420 }
421 )
422
423 -func (u *Unbound) updateCharts() {
424 - if len(u.curCache.threads) > 1 {
425 - for v := range u.curCache.threads {
426 - if !u.cache.threads[v] {
427 - u.cache.threads[v] = true
428 - u.addThreadCharts(v)
423 +func (c *Collector) updateCharts() {
424 + if len(c.curCache.threads) > 1 {
425 + for v := range c.curCache.threads {
426 + if !c.cache.threads[v] {
427 + c.cache.threads[v] = true
428 + c.addThreadCharts(v)
429 }
430 }
431 }
432 // 0-6 rcodes always included
433 - if hasExtendedData := len(u.curCache.answerRCode) > 0; !hasExtendedData {
433 + if hasExtendedData := len(c.curCache.answerRCode) > 0; !hasExtendedData {
434 return
435 }
436
437 - if !u.extChartsCreated {
438 - charts := extendedCharts(u.Cumulative)
439 - if err := u.Charts().Add(*charts...); err != nil {
440 - u.Warningf("add extended charts: %v", err)
437 + if !c.extChartsCreated {
438 + charts := extendedCharts(c.Cumulative)
439 + if err := c.Charts().Add(*charts...); err != nil {
440 + c.Warningf("add extended charts: %v", err)
441 }
442 - u.extChartsCreated = true
442 + c.extChartsCreated = true
443 }
444
445 - for v := range u.curCache.queryType {
446 - if !u.cache.queryType[v] {
447 - u.cache.queryType[v] = true
448 - u.addDimToQueryTypeChart(v)
445 + for v := range c.curCache.queryType {
446 + if !c.cache.queryType[v] {
447 + c.cache.queryType[v] = true
448 + c.addDimToQueryTypeChart(v)
449 }
450 }
451 - for v := range u.curCache.queryClass {
452 - if !u.cache.queryClass[v] {
453 - u.cache.queryClass[v] = true
454 - u.addDimToQueryClassChart(v)
451 + for v := range c.curCache.queryClass {
452 + if !c.cache.queryClass[v] {
453 + c.cache.queryClass[v] = true
454 + c.addDimToQueryClassChart(v)
455 }
456 }
457 - for v := range u.curCache.queryOpCode {
458 - if !u.cache.queryOpCode[v] {
459 - u.cache.queryOpCode[v] = true
460 - u.addDimToQueryOpCodeChart(v)
457 + for v := range c.curCache.queryOpCode {
458 + if !c.cache.queryOpCode[v] {
459 + c.cache.queryOpCode[v] = true
460 + c.addDimToQueryOpCodeChart(v)
461 }
462 }
463 - for v := range u.curCache.answerRCode {
464 - if !u.cache.answerRCode[v] {
465 - u.cache.answerRCode[v] = true
466 - u.addDimToAnswerRcodeChart(v)
463 + for v := range c.curCache.answerRCode {
464 + if !c.cache.answerRCode[v] {
465 + c.cache.answerRCode[v] = true
466 + c.addDimToAnswerRcodeChart(v)
467 }
468 }
469 }
470
471 -func (u *Unbound) addThreadCharts(thread string) {
472 - charts := threadCharts(thread, u.Cumulative)
473 - if err := u.Charts().Add(*charts...); err != nil {
474 - u.Warningf("add '%s' charts: %v", thread, err)
471 +func (c *Collector) addThreadCharts(thread string) {
472 + charts := threadCharts(thread, c.Cumulative)
473 + if err := c.Charts().Add(*charts...); err != nil {
474 + c.Warningf("add '%s' charts: %v", thread, err)
475 }
476 }
477
478 -func (u *Unbound) addDimToQueryTypeChart(typ string) {
479 - u.addDimToChart(queryTypeChart.ID, "num.query.type."+typ, typ)
478 +func (c *Collector) addDimToQueryTypeChart(typ string) {
479 + c.addDimToChart(queryTypeChart.ID, "num.query.type."+typ, typ)
480 }
481 -func (u *Unbound) addDimToQueryClassChart(class string) {
482 - u.addDimToChart(queryClassChart.ID, "num.query.class."+class, class)
481 +func (c *Collector) addDimToQueryClassChart(class string) {
482 + c.addDimToChart(queryClassChart.ID, "num.query.class."+class, class)
483 }
484 -func (u *Unbound) addDimToQueryOpCodeChart(opcode string) {
485 - u.addDimToChart(queryOpCodeChart.ID, "num.query.opcode."+opcode, opcode)
484 +func (c *Collector) addDimToQueryOpCodeChart(opcode string) {
485 + c.addDimToChart(queryOpCodeChart.ID, "num.query.opcode."+opcode, opcode)
486 }
487 -func (u *Unbound) addDimToAnswerRcodeChart(rcode string) {
488 - u.addDimToChart(answerRCodeChart.ID, "num.answer.rcode."+rcode, rcode)
487 +func (c *Collector) addDimToAnswerRcodeChart(rcode string) {
488 + c.addDimToChart(answerRCodeChart.ID, "num.answer.rcode."+rcode, rcode)
489 }
490
491 -func (u *Unbound) addDimToChart(chartID, dimID, dimName string) {
492 - chart := u.Charts().Get(chartID)
491 +func (c *Collector) addDimToChart(chartID, dimID, dimName string) {
492 + chart := c.Charts().Get(chartID)
493 if chart == nil {
494 - u.Warningf("add '%s' dim: couldn't find '%s' chart", dimID, chartID)
494 + c.Warningf("add '%s' dim: couldn't find '%s' chart", dimID, chartID)
495 return
496 }
497 dim := &Dim{ID: dimID, Name: dimName}
498 - if u.Cumulative {
498 + if c.Cumulative {
499 dim.Algo = module.Incremental
500 }
501 if err := chart.AddDim(dim); err != nil {
502 - u.Warningf("add '%s' dim: %v", dimID, err)
502 + c.Warningf("add '%s' dim: %v", dimID, err)
503 return
504 }
505 chart.MarkNotCreated()
src/go/plugin/go.d/collector/unbound/collect.go
+34 -34
@@ -13,30 +13,30 @@ import (
13 // https://docs.datadoghq.com/integrations/unbound/#metrics (stats description)
14 // https://docs.menandmice.com/display/MM/Unbound+request-list+demystified (request lists explanation)
15
16 -func (u *Unbound) collect() (map[string]int64, error) {
17 - stats, err := u.scrapeUnboundStats()
16 +func (c *Collector) collect() (map[string]int64, error) {
17 + stats, err := c.scrapeUnboundStats()
18 if err != nil {
19 return nil, err
20 }
21
22 - mx := u.collectStats(stats)
23 - u.updateCharts()
22 + mx := c.collectStats(stats)
23 + c.updateCharts()
24 return mx, nil
25 }
26
27 -func (u *Unbound) scrapeUnboundStats() ([]entry, error) {
27 +func (c *Collector) scrapeUnboundStats() ([]entry, error) {
28 var output []string
29 var command = "UBCT1 stats"
30 - if u.Cumulative {
30 + if c.Cumulative {
31 command = "UBCT1 stats_noreset"
32 }
33
34 - if err := u.client.Connect(); err != nil {
34 + if err := c.client.Connect(); err != nil {
35 return nil, fmt.Errorf("failed to connect: %v", err)
36 }
37 - defer func() { _ = u.client.Disconnect() }()
37 + defer func() { _ = c.client.Disconnect() }()
38
39 - err := u.client.Command(command+"\n", func(bytes []byte) bool {
39 + err := c.client.Command(command+"\n", func(bytes []byte) bool {
40 output = append(output, string(bytes))
41 return true
42 })
@@ -54,31 +54,31 @@ func (u *Unbound) scrapeUnboundStats() ([]entry, error) {
54 return parseStatsOutput(output)
55 }
56
57 -func (u *Unbound) collectStats(stats []entry) map[string]int64 {
58 - if u.Cumulative {
59 - return u.collectCumulativeStats(stats)
57 +func (c *Collector) collectStats(stats []entry) map[string]int64 {
58 + if c.Cumulative {
59 + return c.collectCumulativeStats(stats)
60 }
61 - return u.collectNonCumulativeStats(stats)
61 + return c.collectNonCumulativeStats(stats)
62 }
63
64 -func (u *Unbound) collectCumulativeStats(stats []entry) map[string]int64 {
64 +func (c *Collector) collectCumulativeStats(stats []entry) map[string]int64 {
65 mul := float64(1000)
66 // following stats change only on cachemiss event in cumulative mode
67 // - *.requestlist.avg,
68 // - *.recursion.time.avg
69 // - *.recursion.time.median
70 v := findEntry("total.num.cachemiss", stats)
71 - if v == u.prevCacheMiss {
71 + if v == c.prevCacheMiss {
72 // so we need to reset them if there is no such event
73 mul = 0
74 }
75 - u.prevCacheMiss = v
76 - return u.processStats(stats, mul)
75 + c.prevCacheMiss = v
76 + return c.processStats(stats, mul)
77 }
78
79 -func (u *Unbound) collectNonCumulativeStats(stats []entry) map[string]int64 {
79 +func (c *Collector) collectNonCumulativeStats(stats []entry) map[string]int64 {
80 mul := float64(1000)
81 - mx := u.processStats(stats, mul)
81 + mx := c.processStats(stats, mul)
82
83 // see 'static int print_ext(RES* ssl, struct ub_stats_info* s)' in
84 // https://github.com/NLnetLabs/unbound/blob/master/daemon/remote.c
@@ -86,31 +86,31 @@ func (u *Unbound) collectNonCumulativeStats(stats []entry) map[string]int64 {
86 // - zero value queries class not included
87 // - zero value queries opcode not included
88 // - only 0-6 rcodes answers always included, other zero value rcodes not included
89 - for k := range u.cache.queryType {
90 - if _, ok := u.curCache.queryType[k]; !ok {
89 + for k := range c.cache.queryType {
90 + if _, ok := c.curCache.queryType[k]; !ok {
91 mx["num.query.type."+k] = 0
92 }
93 }
94 - for k := range u.cache.queryClass {
95 - if _, ok := u.curCache.queryClass[k]; !ok {
94 + for k := range c.cache.queryClass {
95 + if _, ok := c.curCache.queryClass[k]; !ok {
96 mx["num.query.class."+k] = 0
97 }
98 }
99 - for k := range u.cache.queryOpCode {
100 - if _, ok := u.curCache.queryOpCode[k]; !ok {
99 + for k := range c.cache.queryOpCode {
100 + if _, ok := c.curCache.queryOpCode[k]; !ok {
101 mx["num.query.opcode."+k] = 0
102 }
103 }
104 - for k := range u.cache.answerRCode {
105 - if _, ok := u.curCache.answerRCode[k]; !ok {
104 + for k := range c.cache.answerRCode {
105 + if _, ok := c.curCache.answerRCode[k]; !ok {
106 mx["num.answer.rcode."+k] = 0
107 }
108 }
109 return mx
110 }
111
112 -func (u *Unbound) processStats(stats []entry, mul float64) map[string]int64 {
113 - u.curCache.clear()
112 +func (c *Collector) processStats(stats []entry, mul float64) map[string]int64 {
113 + c.curCache.clear()
114 mx := make(map[string]int64, len(stats))
115 for _, e := range stats {
116 switch {
@@ -119,19 +119,19 @@ func (u *Unbound) processStats(stats []entry, mul float64) map[string]int64 {
119 e.value *= mul
120 case e.hasPrefix("thread") && e.hasSuffix("num.queries"):
121 v := extractThread(e.key)
122 - u.curCache.threads[v] = true
122 + c.curCache.threads[v] = true
123 case e.hasPrefix("num.query.type"):
124 v := extractQueryType(e.key)
125 - u.curCache.queryType[v] = true
125 + c.curCache.queryType[v] = true
126 case e.hasPrefix("num.query.class"):
127 v := extractQueryClass(e.key)
128 - u.curCache.queryClass[v] = true
128 + c.curCache.queryClass[v] = true
129 case e.hasPrefix("num.query.opcode"):
130 v := extractQueryOpCode(e.key)
131 - u.curCache.queryOpCode[v] = true
131 + c.curCache.queryOpCode[v] = true
132 case e.hasPrefix("num.answer.rcode"):
133 v := extractAnswerRCode(e.key)
134 - u.curCache.answerRCode[v] = true
134 + c.curCache.answerRCode[v] = true
135 }
136 mx[e.key] = int64(e.value)
137 }
src/go/plugin/go.d/collector/unbound/collector.go renamed
+22 -22
@@ -25,8 +25,8 @@ func init() {
25 })
26 }
27
28 -func New() *Unbound {
29 - return &Unbound{
28 +func New() *Collector {
29 + return &Collector{
30 Config: Config{
31 Address: "127.0.0.1:8953",
32 ConfPath: "/etc/unbound/unbound.conf",
@@ -54,7 +54,7 @@ type Config struct {
54 tlscfg.TLSConfig `yaml:",inline" json:""`
55 }
56
57 -type Unbound struct {
57 +type Collector struct {
58 module.Base
59 Config `yaml:",inline" json:""`
60
@@ -68,31 +68,31 @@ type Unbound struct {
68 extChartsCreated bool
69 }
70
71 -func (u *Unbound) Configuration() any {
72 - return u.Config
71 +func (c *Collector) Configuration() any {
72 + return c.Config
73 }
74
75 -func (u *Unbound) Init() error {
76 - if enabled := u.initConfig(); !enabled {
75 +func (c *Collector) Init() error {
76 + if enabled := c.initConfig(); !enabled {
77 return errors.New("remote control is disabled in the configuration file")
78 }
79
80 - if err := u.initClient(); err != nil {
80 + if err := c.initClient(); err != nil {
81 return fmt.Errorf("creating client: %v", err)
82 }
83
84 - u.charts = charts(u.Cumulative)
84 + c.charts = charts(c.Cumulative)
85
86 - u.Debugf("using address: %s, cumulative: %v, use_tls: %v, timeout: %s", u.Address, u.Cumulative, u.UseTLS, u.Timeout)
87 - if u.UseTLS {
88 - u.Debugf("using tls_skip_verify: %v, tls_key: %s, tls_cert: %s", u.InsecureSkipVerify, u.TLSKey, u.TLSCert)
86 + c.Debugf("using address: %s, cumulative: %v, use_tls: %v, timeout: %s", c.Address, c.Cumulative, c.UseTLS, c.Timeout)
87 + if c.UseTLS {
88 + c.Debugf("using tls_skip_verify: %v, tls_key: %s, tls_cert: %s", c.InsecureSkipVerify, c.TLSKey, c.TLSCert)
89 }
90
91 return nil
92 }
93
94 -func (u *Unbound) Check() error {
95 - mx, err := u.collect()
94 +func (c *Collector) Check() error {
95 + mx, err := c.collect()
96 if err != nil {
97 return err
98 }
@@ -102,14 +102,14 @@ func (u *Unbound) Check() error {
102 return nil
103 }
104
105 -func (u *Unbound) Charts() *module.Charts {
106 - return u.charts
105 +func (c *Collector) Charts() *module.Charts {
106 + return c.charts
107 }
108
109 -func (u *Unbound) Collect() map[string]int64 {
110 - mx, err := u.collect()
109 +func (c *Collector) Collect() map[string]int64 {
110 + mx, err := c.collect()
111 if err != nil {
112 - u.Error(err)
112 + c.Error(err)
113 }
114
115 if len(mx) == 0 {
@@ -118,8 +118,8 @@ func (u *Unbound) Collect() map[string]int64 {
118 return mx
119 }
120
121 -func (u *Unbound) Cleanup() {
122 - if u.client != nil {
123 - _ = u.client.Disconnect()
121 +func (c *Collector) Cleanup() {
122 + if c.client != nil {
123 + _ = c.client.Disconnect()
124 }
125 }
src/go/plugin/go.d/collector/unbound/collector_test.go renamed
+103 -103
@@ -50,105 +50,105 @@ func Test_testDataIsValid(t *testing.T) {
50 }
51 }
52
53 -func TestUnbound_ConfigurationSerialize(t *testing.T) {
54 - module.TestConfigurationSerialize(t, &Unbound{}, dataConfigJSON, dataConfigYAML)
53 +func TestCollector_ConfigurationSerialize(t *testing.T) {
54 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
55 }
56
57 -func TestUnbound_Init(t *testing.T) {
58 - unbound := prepareNonTLSUnbound()
57 +func TestCollector_Init(t *testing.T) {
58 + collr := prepareNonTLSUnbound()
59
60 - assert.NoError(t, unbound.Init())
60 + assert.NoError(t, collr.Init())
61 }
62
63 -func TestUnbound_Init_SetEverythingFromUnboundConf(t *testing.T) {
64 - unbound := New()
65 - unbound.ConfPath = "testdata/unbound.conf"
63 +func TestCollector_Init_SetEverythingFromUnboundConf(t *testing.T) {
64 + collr := New()
65 + collr.ConfPath = "testdata/unbound.conf"
66 expectedConfig := Config{
67 Address: "10.0.0.1:8954",
68 - ConfPath: unbound.ConfPath,
69 - Timeout: unbound.Timeout,
68 + ConfPath: collr.ConfPath,
69 + Timeout: collr.Timeout,
70 Cumulative: true,
71 UseTLS: false,
72 TLSConfig: tlscfg.TLSConfig{
73 TLSCert: "/etc/unbound/unbound_control_other.pem",
74 TLSKey: "/etc/unbound/unbound_control_other.key",
75 - InsecureSkipVerify: unbound.TLSConfig.InsecureSkipVerify,
75 + InsecureSkipVerify: collr.TLSConfig.InsecureSkipVerify,
76 },
77 }
78
79 - assert.NoError(t, unbound.Init())
80 - assert.Equal(t, expectedConfig, unbound.Config)
79 + assert.NoError(t, collr.Init())
80 + assert.Equal(t, expectedConfig, collr.Config)
81 }
82
83 -func TestUnbound_Init_DisabledInUnboundConf(t *testing.T) {
84 - unbound := prepareNonTLSUnbound()
85 - unbound.ConfPath = "testdata/unbound_disabled.conf"
83 +func TestCollector_Init_DisabledInUnboundConf(t *testing.T) {
84 + collr := prepareNonTLSUnbound()
85 + collr.ConfPath = "testdata/unbound_disabled.conf"
86
87 - assert.Error(t, unbound.Init())
87 + assert.Error(t, collr.Init())
88 }
89
90 -func TestUnbound_Init_HandleEmptyConfig(t *testing.T) {
91 - unbound := prepareNonTLSUnbound()
92 - unbound.ConfPath = "testdata/unbound_empty.conf"
90 +func TestCollector_Init_HandleEmptyConfig(t *testing.T) {
91 + collr := prepareNonTLSUnbound()
92 + collr.ConfPath = "testdata/unbound_empty.conf"
93
94 - assert.NoError(t, unbound.Init())
94 + assert.NoError(t, collr.Init())
95 }
96
97 -func TestUnbound_Init_HandleNonExistentConfig(t *testing.T) {
98 - unbound := prepareNonTLSUnbound()
99 - unbound.ConfPath = "testdata/unbound_non_existent.conf"
97 +func TestCollector_Init_HandleNonExistentConfig(t *testing.T) {
98 + collr := prepareNonTLSUnbound()
99 + collr.ConfPath = "testdata/unbound_non_existent.conf"
100
101 - assert.NoError(t, unbound.Init())
101 + assert.NoError(t, collr.Init())
102 }
103
104 -func TestUnbound_Check(t *testing.T) {
105 - unbound := prepareNonTLSUnbound()
106 - require.NoError(t, unbound.Init())
107 - unbound.client = mockUnboundClient{data: dataCommonStats, err: false}
104 +func TestCollector_Check(t *testing.T) {
105 + collr := prepareNonTLSUnbound()
106 + require.NoError(t, collr.Init())
107 + collr.client = mockUnboundClient{data: dataCommonStats, err: false}
108
109 - assert.NoError(t, unbound.Check())
109 + assert.NoError(t, collr.Check())
110 }
111
112 -func TestUnbound_Check_ErrorDuringScrapingUnbound(t *testing.T) {
113 - unbound := prepareNonTLSUnbound()
114 - require.NoError(t, unbound.Init())
115 - unbound.client = mockUnboundClient{err: true}
112 +func TestCollector_Check_ErrorDuringScrapingUnbound(t *testing.T) {
113 + collr := prepareNonTLSUnbound()
114 + require.NoError(t, collr.Init())
115 + collr.client = mockUnboundClient{err: true}
116
117 - assert.Error(t, unbound.Check())
117 + assert.Error(t, collr.Check())
118 }
119
120 -func TestUnbound_Cleanup(t *testing.T) {
120 +func TestCollector_Cleanup(t *testing.T) {
121 New().Cleanup()
122 }
123
124 -func TestUnbound_Charts(t *testing.T) {
125 - unbound := prepareNonTLSUnbound()
126 - require.NoError(t, unbound.Init())
124 +func TestCollector_Charts(t *testing.T) {
125 + collr := prepareNonTLSUnbound()
126 + require.NoError(t, collr.Init())
127
128 - assert.NotNil(t, unbound.Charts())
128 + assert.NotNil(t, collr.Charts())
129 }
130
131 -func TestUnbound_Collect(t *testing.T) {
132 - unbound := prepareNonTLSUnbound()
133 - require.NoError(t, unbound.Init())
134 - unbound.client = mockUnboundClient{data: dataCommonStats, err: false}
131 +func TestCollector_Collect(t *testing.T) {
132 + collr := prepareNonTLSUnbound()
133 + require.NoError(t, collr.Init())
134 + collr.client = mockUnboundClient{data: dataCommonStats, err: false}
135
136 - collected := unbound.Collect()
137 - assert.Equal(t, expectedCommon, collected)
138 - testCharts(t, unbound, collected)
136 + mx := collr.Collect()
137 + assert.Equal(t, expectedCommon, mx)
138 + testCharts(t, collr, mx)
139 }
140
141 -func TestUnbound_Collect_ExtendedStats(t *testing.T) {
142 - unbound := prepareNonTLSUnbound()
143 - require.NoError(t, unbound.Init())
144 - unbound.client = mockUnboundClient{data: dataExtendedStats, err: false}
141 +func TestCollector_Collect_ExtendedStats(t *testing.T) {
142 + collr := prepareNonTLSUnbound()
143 + require.NoError(t, collr.Init())
144 + collr.client = mockUnboundClient{data: dataExtendedStats, err: false}
145
146 - collected := unbound.Collect()
147 - assert.Equal(t, expectedExtended, collected)
148 - testCharts(t, unbound, collected)
146 + mx := collr.Collect()
147 + assert.Equal(t, expectedExtended, mx)
148 + testCharts(t, collr, mx)
149 }
150
151 -func TestUnbound_Collect_LifeCycleCumulativeExtendedStats(t *testing.T) {
151 +func TestCollector_Collect_LifeCycleCumulativeExtendedStats(t *testing.T) {
152 tests := []struct {
153 input []byte
154 expected map[string]int64
@@ -158,25 +158,25 @@ func TestUnbound_Collect_LifeCycleCumulativeExtendedStats(t *testing.T) {
158 {input: dataLifeCycleCumulative3, expected: expectedCumulative3},
159 }
160
161 - unbound := prepareNonTLSUnbound()
162 - unbound.Cumulative = true
163 - require.NoError(t, unbound.Init())
161 + collr := prepareNonTLSUnbound()
162 + collr.Cumulative = true
163 + require.NoError(t, collr.Init())
164 ubClient := &mockUnboundClient{err: false}
165 - unbound.client = ubClient
165 + collr.client = ubClient
166
167 - var collected map[string]int64
167 + var mx map[string]int64
168 for i, test := range tests {
169 t.Run(fmt.Sprintf("run %d", i+1), func(t *testing.T) {
170 ubClient.data = test.input
171 - collected = unbound.Collect()
172 - assert.Equal(t, test.expected, collected)
171 + mx = collr.Collect()
172 + assert.Equal(t, test.expected, mx)
173 })
174 }
175
176 - testCharts(t, unbound, collected)
176 + testCharts(t, collr, mx)
177 }
178
179 -func TestUnbound_Collect_LifeCycleResetExtendedStats(t *testing.T) {
179 +func TestCollector_Collect_LifeCycleResetExtendedStats(t *testing.T) {
180 tests := []struct {
181 input []byte
182 expected map[string]int64
@@ -186,63 +186,63 @@ func TestUnbound_Collect_LifeCycleResetExtendedStats(t *testing.T) {
186 {input: dataLifeCycleReset3, expected: expectedReset3},
187 }
188
189 - unbound := prepareNonTLSUnbound()
190 - unbound.Cumulative = false
191 - require.NoError(t, unbound.Init())
189 + collr := prepareNonTLSUnbound()
190 + collr.Cumulative = false
191 + require.NoError(t, collr.Init())
192 ubClient := &mockUnboundClient{err: false}
193 - unbound.client = ubClient
193 + collr.client = ubClient
194
195 - var collected map[string]int64
195 + var mx map[string]int64
196 for i, test := range tests {
197 t.Run(fmt.Sprintf("run %d", i+1), func(t *testing.T) {
198 ubClient.data = test.input
199 - collected = unbound.Collect()
200 - assert.Equal(t, test.expected, collected)
199 + mx = collr.Collect()
200 + assert.Equal(t, test.expected, mx)
201 })
202 }
203
204 - testCharts(t, unbound, collected)
204 + testCharts(t, collr, mx)
205 }
206
207 -func TestUnbound_Collect_EmptyResponse(t *testing.T) {
208 - unbound := prepareNonTLSUnbound()
209 - require.NoError(t, unbound.Init())
210 - unbound.client = mockUnboundClient{data: []byte{}, err: false}
207 +func TestCollector_Collect_EmptyResponse(t *testing.T) {
208 + collr := prepareNonTLSUnbound()
209 + require.NoError(t, collr.Init())
210 + collr.client = mockUnboundClient{data: []byte{}, err: false}
211
212 - assert.Nil(t, unbound.Collect())
212 + assert.Nil(t, collr.Collect())
213 }
214
215 -func TestUnbound_Collect_ErrorResponse(t *testing.T) {
216 - unbound := prepareNonTLSUnbound()
217 - require.NoError(t, unbound.Init())
218 - unbound.client = mockUnboundClient{data: []byte("error unknown command 'unknown'"), err: false}
215 +func TestCollector_Collect_ErrorResponse(t *testing.T) {
216 + collr := prepareNonTLSUnbound()
217 + require.NoError(t, collr.Init())
218 + collr.client = mockUnboundClient{data: []byte("error unknown command 'unknown'"), err: false}
219
220 - assert.Nil(t, unbound.Collect())
220 + assert.Nil(t, collr.Collect())
221 }
222
223 -func TestUnbound_Collect_ErrorOnSend(t *testing.T) {
224 - unbound := prepareNonTLSUnbound()
225 - require.NoError(t, unbound.Init())
226 - unbound.client = mockUnboundClient{err: true}
223 +func TestCollector_Collect_ErrorOnSend(t *testing.T) {
224 + collr := prepareNonTLSUnbound()
225 + require.NoError(t, collr.Init())
226 + collr.client = mockUnboundClient{err: true}
227
228 - assert.Nil(t, unbound.Collect())
228 + assert.Nil(t, collr.Collect())
229 }
230
231 -func TestUnbound_Collect_ErrorOnParseBadSyntax(t *testing.T) {
232 - unbound := prepareNonTLSUnbound()
233 - require.NoError(t, unbound.Init())
231 +func TestCollector_Collect_ErrorOnParseBadSyntax(t *testing.T) {
232 + collr := prepareNonTLSUnbound()
233 + require.NoError(t, collr.Init())
234 data := strings.Repeat("zk_avg_latency 0\nzk_min_latency 0\nzk_mix_latency 0\n", 10)
235 - unbound.client = mockUnboundClient{data: []byte(data), err: false}
235 + collr.client = mockUnboundClient{data: []byte(data), err: false}
236
237 - assert.Nil(t, unbound.Collect())
237 + assert.Nil(t, collr.Collect())
238 }
239
240 -func prepareNonTLSUnbound() *Unbound {
241 - unbound := New()
242 - unbound.ConfPath = ""
243 - unbound.UseTLS = false
240 +func prepareNonTLSUnbound() *Collector {
241 + collr := New()
242 + collr.ConfPath = ""
243 + collr.UseTLS = false
244
245 - return unbound
245 + return collr
246 }
247
248 type mockUnboundClient struct {
@@ -269,16 +269,16 @@ func (m mockUnboundClient) Command(_ string, process socket.Processor) error {
269 return nil
270 }
271
272 -func testCharts(t *testing.T, unbound *Unbound, mx map[string]int64) {
272 +func testCharts(t *testing.T, collr *Collector, mx map[string]int64) {
273 t.Helper()
274 - ensureChartsCreatedForEveryThread(t, unbound)
275 - ensureExtendedChartsCreated(t, unbound)
276 - module.TestMetricsHasAllChartsDimsSkip(t, unbound.Charts(), mx, func(_ *module.Chart, dim *module.Dim) bool {
274 + ensureChartsCreatedForEveryThread(t, collr)
275 + ensureExtendedChartsCreated(t, collr)
276 + module.TestMetricsHasAllChartsDimsSkip(t, collr.Charts(), mx, func(_ *module.Chart, dim *module.Dim) bool {
277 return dim.ID == "mem.mod.ipsecmod"
278 })
279 }
280
281 -func ensureChartsCreatedForEveryThread(t *testing.T, u *Unbound) {
281 +func ensureChartsCreatedForEveryThread(t *testing.T, u *Collector) {
282 for thread := range u.cache.threads {
283 for _, chart := range *threadCharts(thread, u.Cumulative) {
284 assert.Truef(t, u.Charts().Has(chart.ID), "chart '%s' is not created for '%s' thread", chart.ID, thread)
@@ -286,7 +286,7 @@ func ensureChartsCreatedForEveryThread(t *testing.T, u *Unbound) {
286 }
287 }
288
289 -func ensureExtendedChartsCreated(t *testing.T, u *Unbound) {
289 +func ensureExtendedChartsCreated(t *testing.T, u *Collector) {
290 if len(u.cache.answerRCode) == 0 {
291 return
292 }
src/go/plugin/go.d/collector/unbound/init.go
+37 -37
@@ -12,82 +12,82 @@ import (
12 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/tlscfg"
13 )
14
15 -func (u *Unbound) initConfig() (enabled bool) {
16 - if u.ConfPath == "" {
17 - u.Info("'conf_path' not set, skipping parameters auto detection")
15 +func (c *Collector) initConfig() (enabled bool) {
16 + if c.ConfPath == "" {
17 + c.Info("'conf_path' not set, skipping parameters auto detection")
18 return true
19 }
20
21 - u.Infof("reading '%s'", u.ConfPath)
22 - cfg, err := config.Parse(u.ConfPath)
21 + c.Infof("reading '%s'", c.ConfPath)
22 + cfg, err := config.Parse(c.ConfPath)
23 if err != nil {
24 - u.Warningf("%v, skipping parameters auto detection", err)
24 + c.Warningf("%v, skipping parameters auto detection", err)
25 return true
26 }
27
28 if cfg.Empty() {
29 - u.Debug("empty configuration")
29 + c.Debug("empty configuration")
30 return true
31 }
32
33 if enabled, ok := cfg.ControlEnabled(); ok && !enabled {
34 - u.Info("remote control is disabled in the configuration file")
34 + c.Info("remote control is disabled in the configuration file")
35 return false
36 }
37
38 - u.applyConfig(cfg)
38 + c.applyConfig(cfg)
39 return true
40 }
41
42 -func (u *Unbound) applyConfig(cfg *config.UnboundConfig) {
43 - u.Infof("applying configuration: %s", cfg)
44 - if cumulative, ok := cfg.Cumulative(); ok && cumulative != u.Cumulative {
45 - u.Debugf("changing 'cumulative_stats': %v => %v", u.Cumulative, cumulative)
46 - u.Cumulative = cumulative
42 +func (c *Collector) applyConfig(cfg *config.UnboundConfig) {
43 + c.Infof("applying configuration: %s", cfg)
44 + if cumulative, ok := cfg.Cumulative(); ok && cumulative != c.Cumulative {
45 + c.Debugf("changing 'cumulative_stats': %v => %v", c.Cumulative, cumulative)
46 + c.Cumulative = cumulative
47 }
48 - if useCert, ok := cfg.ControlUseCert(); ok && useCert != u.UseTLS {
49 - u.Debugf("changing 'use_tls': %v => %v", u.UseTLS, useCert)
50 - u.UseTLS = useCert
48 + if useCert, ok := cfg.ControlUseCert(); ok && useCert != c.UseTLS {
49 + c.Debugf("changing 'use_tls': %v => %v", c.UseTLS, useCert)
50 + c.UseTLS = useCert
51 }
52 - if keyFile, ok := cfg.ControlKeyFile(); ok && keyFile != u.TLSKey {
53 - u.Debugf("changing 'tls_key': '%s' => '%s'", u.TLSKey, keyFile)
54 - u.TLSKey = keyFile
52 + if keyFile, ok := cfg.ControlKeyFile(); ok && keyFile != c.TLSKey {
53 + c.Debugf("changing 'tls_key': '%s' => '%s'", c.TLSKey, keyFile)
54 + c.TLSKey = keyFile
55 }
56 - if certFile, ok := cfg.ControlCertFile(); ok && certFile != u.TLSCert {
57 - u.Debugf("changing 'tls_cert': '%s' => '%s'", u.TLSCert, certFile)
58 - u.TLSCert = certFile
56 + if certFile, ok := cfg.ControlCertFile(); ok && certFile != c.TLSCert {
57 + c.Debugf("changing 'tls_cert': '%s' => '%s'", c.TLSCert, certFile)
58 + c.TLSCert = certFile
59 }
60 - if iface, ok := cfg.ControlInterface(); ok && adjustControlInterface(iface) != u.Address {
60 + if iface, ok := cfg.ControlInterface(); ok && adjustControlInterface(iface) != c.Address {
61 address := adjustControlInterface(iface)
62 - u.Debugf("changing 'address': '%s' => '%s'", u.Address, address)
63 - u.Address = address
62 + c.Debugf("changing 'address': '%s' => '%s'", c.Address, address)
63 + c.Address = address
64 }
65 - if port, ok := cfg.ControlPort(); ok && !socket.IsUnixSocket(u.Address) {
66 - if host, curPort, err := net.SplitHostPort(u.Address); err == nil && curPort != port {
65 + if port, ok := cfg.ControlPort(); ok && !socket.IsUnixSocket(c.Address) {
66 + if host, curPort, err := net.SplitHostPort(c.Address); err == nil && curPort != port {
67 address := net.JoinHostPort(host, port)
68 - u.Debugf("changing 'address': '%s' => '%s'", u.Address, address)
69 - u.Address = address
68 + c.Debugf("changing 'address': '%s' => '%s'", c.Address, address)
69 + c.Address = address
70 }
71 }
72 }
73
74 -func (u *Unbound) initClient() (err error) {
74 +func (c *Collector) initClient() (err error) {
75 var tlsCfg *tls.Config
76 - useTLS := !socket.IsUnixSocket(u.Address) && u.UseTLS
76 + useTLS := !socket.IsUnixSocket(c.Address) && c.UseTLS
77
78 - if useTLS && (u.TLSConfig.TLSCert == "" || u.TLSConfig.TLSKey == "") {
78 + if useTLS && (c.TLSConfig.TLSCert == "" || c.TLSConfig.TLSKey == "") {
79 return errors.New("'tls_cert' or 'tls_key' is missing")
80 }
81
82 if useTLS {
83 - if tlsCfg, err = tlscfg.NewTLSConfig(u.TLSConfig); err != nil {
83 + if tlsCfg, err = tlscfg.NewTLSConfig(c.TLSConfig); err != nil {
84 return err
85 }
86 }
87
88 - u.client = socket.New(socket.Config{
89 - Address: u.Address,
90 - Timeout: u.Timeout.Duration(),
88 + c.client = socket.New(socket.Config{
89 + Address: c.Address,
90 + Timeout: c.Timeout.Duration(),
91 TLSConf: tlsCfg,
92 })
93 return nil
src/go/plugin/go.d/collector/upsd/charts.go
+6 -6
@@ -329,7 +329,7 @@ var (
329 }
330 )
331
332 -func (u *Upsd) addUPSCharts(ups upsUnit) {
332 +func (c *Collector) addUPSCharts(ups upsUnit) {
333 charts := upsChartsTmpl.Copy()
334
335 var removed []string
@@ -359,7 +359,7 @@ func (u *Upsd) addUPSCharts(ups upsUnit) {
359 }
360 }
361
362 - u.Debugf("UPS '%s' no metrics: %v", ups.name, removed)
362 + c.Debugf("UPS '%s' no metrics: %v", ups.name, removed)
363
364 name := cleanUpsName(ups.name)
365 for _, chart := range *charts {
@@ -377,14 +377,14 @@ func (u *Upsd) addUPSCharts(ups upsUnit) {
377 }
378 }
379
380 - if err := u.Charts().Add(*charts...); err != nil {
381 - u.Warning(err)
380 + if err := c.Charts().Add(*charts...); err != nil {
381 + c.Warning(err)
382 }
383 }
384
385 -func (u *Upsd) removeUPSCharts(name string) {
385 +func (c *Collector) removeUPSCharts(name string) {
386 name = cleanUpsName(name)
387 - for _, chart := range *u.Charts() {
387 + for _, chart := range *c.Charts() {
388 if strings.HasPrefix(chart.ID, name) {
389 chart.MarkRemove()
390 chart.MarkNotCreated()
src/go/plugin/go.d/collector/upsd/client.go
+7
@@ -22,6 +22,13 @@ const (
22 // https://github.com/networkupstools/nut/blob/81fca30b2998fa73085ce4654f075605ff0b9e01/docs/net-protocol.txt#L647
23 var errUpsdCommand = errors.New("upsd command error")
24
25 +type upsdConn interface {
26 + connect() error
27 + disconnect() error
28 + authenticate(string, string) error
29 + upsUnits() ([]upsUnit, error)
30 +}
31 +
32 type upsUnit struct {
33 name string
34 vars map[string]string
src/go/plugin/go.d/collector/upsd/collect.go
+21 -21
@@ -8,42 +8,42 @@ import (
8 "strings"
9 )
10
11 -func (u *Upsd) collect() (map[string]int64, error) {
12 - if u.conn == nil {
13 - conn, err := u.establishConnection()
11 +func (c *Collector) collect() (map[string]int64, error) {
12 + if c.conn == nil {
13 + conn, err := c.establishConnection()
14 if err != nil {
15 return nil, err
16 }
17 - u.conn = conn
17 + c.conn = conn
18 }
19
20 - upsUnits, err := u.conn.upsUnits()
20 + upsUnits, err := c.conn.upsUnits()
21 if err != nil {
22 if !errors.Is(err, errUpsdCommand) {
23 - _ = u.conn.disconnect()
24 - u.conn = nil
23 + _ = c.conn.disconnect()
24 + c.conn = nil
25 }
26 return nil, err
27 }
28
29 - u.Debugf("found %d UPS units", len(upsUnits))
29 + c.Debugf("found %d UPS units", len(upsUnits))
30
31 mx := make(map[string]int64)
32
33 - u.collectUPSUnits(mx, upsUnits)
33 + c.collectUPSUnits(mx, upsUnits)
34
35 return mx, nil
36 }
37
38 -func (u *Upsd) establishConnection() (upsdConn, error) {
39 - conn := u.newUpsdConn(u.Config)
38 +func (c *Collector) establishConnection() (upsdConn, error) {
39 + conn := c.newUpsdConn(c.Config)
40
41 if err := conn.connect(); err != nil {
42 return nil, err
43 }
44
45 - if u.Username != "" && u.Password != "" {
46 - if err := conn.authenticate(u.Username, u.Password); err != nil {
45 + if c.Username != "" && c.Password != "" {
46 + if err := conn.authenticate(c.Username, c.Password); err != nil {
47 _ = conn.disconnect()
48 return nil, err
49 }
@@ -52,16 +52,16 @@ func (u *Upsd) establishConnection() (upsdConn, error) {
52 return conn, nil
53 }
54
55 -func (u *Upsd) collectUPSUnits(mx map[string]int64, upsUnits []upsUnit) {
55 +func (c *Collector) collectUPSUnits(mx map[string]int64, upsUnits []upsUnit) {
56 seen := make(map[string]bool)
57
58 for _, ups := range upsUnits {
59 seen[ups.name] = true
60 - u.Debugf("collecting metrics UPS '%s'", ups.name)
60 + c.Debugf("collecting metrics UPS '%s'", ups.name)
61
62 - if !u.upsUnits[ups.name] {
63 - u.upsUnits[ups.name] = true
64 - u.addUPSCharts(ups)
62 + if !c.upsUnits[ups.name] {
63 + c.upsUnits[ups.name] = true
64 + c.addUPSCharts(ups)
65 }
66
67 writeVar(mx, ups, varBatteryCharge)
@@ -90,10 +90,10 @@ func (u *Upsd) collectUPSUnits(mx map[string]int64, upsUnits []upsUnit) {
90 writeUpsStatus(mx, ups)
91 }
92
93 - for name := range u.upsUnits {
93 + for name := range c.upsUnits {
94 if !seen[name] {
95 - delete(u.upsUnits, name)
96 - u.removeUPSCharts(name)
95 + delete(c.upsUnits, name)
96 + c.removeUPSCharts(name)
97 }
98 }
99 }
src/go/plugin/go.d/collector/upsd/collector.go renamed
+26 -35
@@ -22,8 +22,8 @@ func init() {
22 })
23 }
24
25 -func New() *Upsd {
26 - return &Upsd{
25 +func New() *Collector {
26 + return &Collector{
27 Config: Config{
28 Address: "127.0.0.1:3493",
29 Timeout: confopt.Duration(time.Second * 2),
@@ -42,41 +42,32 @@ type Config struct {
42 Password string `yaml:"password,omitempty" json:"password"`
43 }
44
45 -type (
46 - Upsd struct {
47 - module.Base
48 - Config `yaml:",inline" json:""`
45 +type Collector struct {
46 + module.Base
47 + Config `yaml:",inline" json:""`
48
50 - charts *module.Charts
49 + charts *module.Charts
50
52 - conn upsdConn
53 - newUpsdConn func(Config) upsdConn
51 + conn upsdConn
52 + newUpsdConn func(Config) upsdConn
53
55 - upsUnits map[string]bool
56 - }
57 -
58 - upsdConn interface {
59 - connect() error
60 - disconnect() error
61 - authenticate(string, string) error
62 - upsUnits() ([]upsUnit, error)
63 - }
64 -)
54 + upsUnits map[string]bool
55 +}
56
66 -func (u *Upsd) Configuration() any {
67 - return u.Config
57 +func (c *Collector) Configuration() any {
58 + return c.Config
59 }
60
70 -func (u *Upsd) Init() error {
71 - if u.Address == "" {
61 +func (c *Collector) Init() error {
62 + if c.Address == "" {
63 return errors.New("config: 'address' not set")
64 }
65
66 return nil
67 }
68
78 -func (u *Upsd) Check() error {
79 - mx, err := u.collect()
69 +func (c *Collector) Check() error {
70 + mx, err := c.collect()
71 if err != nil {
72 return err
73 }
@@ -86,14 +77,14 @@ func (u *Upsd) Check() error {
77 return nil
78 }
79
89 -func (u *Upsd) Charts() *module.Charts {
90 - return u.charts
80 +func (c *Collector) Charts() *module.Charts {
81 + return c.charts
82 }
83
93 -func (u *Upsd) Collect() map[string]int64 {
94 - mx, err := u.collect()
84 +func (c *Collector) Collect() map[string]int64 {
85 + mx, err := c.collect()
86 if err != nil {
96 - u.Error(err)
87 + c.Error(err)
88 }
89
90 if len(mx) == 0 {
@@ -102,12 +93,12 @@ func (u *Upsd) Collect() map[string]int64 {
93 return mx
94 }
95
105 -func (u *Upsd) Cleanup() {
106 - if u.conn == nil {
96 +func (c *Collector) Cleanup() {
97 + if c.conn == nil {
98 return
99 }
109 - if err := u.conn.disconnect(); err != nil {
110 - u.Warningf("error on disconnect: %v", err)
100 + if err := c.conn.disconnect(); err != nil {
101 + c.Warningf("error on disconnect: %v", err)
102 }
112 - u.conn = nil
103 + c.conn = nil
104 }
src/go/plugin/go.d/collector/upsd/collector_test.go renamed
+45 -45
@@ -28,25 +28,25 @@ func Test_testDataIsValid(t *testing.T) {
28 }
29 }
30
31 -func TestUpsd_ConfigurationSerialize(t *testing.T) {
32 - module.TestConfigurationSerialize(t, &Upsd{}, dataConfigJSON, dataConfigYAML)
31 +func TestCollector_ConfigurationSerialize(t *testing.T) {
32 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
33 }
34
35 -func TestUpsd_Cleanup(t *testing.T) {
36 - upsd := New()
35 +func TestCollector_Cleanup(t *testing.T) {
36 + upcollrd := New()
37
38 - require.NotPanics(t, upsd.Cleanup)
38 + require.NotPanics(t, upcollrd.Cleanup)
39
40 mock := prepareMockConnOK()
41 - upsd.newUpsdConn = func(Config) upsdConn { return mock }
41 + upcollrd.newUpsdConn = func(Config) upsdConn { return mock }
42
43 - require.NoError(t, upsd.Init())
44 - _ = upsd.Collect()
45 - require.NotPanics(t, upsd.Cleanup)
43 + require.NoError(t, upcollrd.Init())
44 + _ = upcollrd.Collect()
45 + require.NotPanics(t, upcollrd.Cleanup)
46 assert.True(t, mock.calledDisconnect)
47 }
48
49 -func TestUpsd_Init(t *testing.T) {
49 +func TestCollector_Init(t *testing.T) {
50 tests := map[string]struct {
51 config Config
52 wantFail bool
@@ -63,21 +63,21 @@ func TestUpsd_Init(t *testing.T) {
63
64 for name, test := range tests {
65 t.Run(name, func(t *testing.T) {
66 - upsd := New()
67 - upsd.Config = test.config
66 + collr := New()
67 + collr.Config = test.config
68
69 if test.wantFail {
70 - assert.Error(t, upsd.Init())
70 + assert.Error(t, collr.Init())
71 } else {
72 - assert.NoError(t, upsd.Init())
72 + assert.NoError(t, collr.Init())
73 }
74 })
75 }
76 }
77
78 -func TestUpsd_Check(t *testing.T) {
78 +func TestCollector_Check(t *testing.T) {
79 tests := map[string]struct {
80 - prepareUpsd func() *Upsd
80 + prepareUpsd func() *Collector
81 prepareMock func() *mockUpsdConn
82 wantFail bool
83 }{
@@ -93,11 +93,11 @@ func TestUpsd_Check(t *testing.T) {
93 },
94 "error on authenticate()": {
95 wantFail: true,
96 - prepareUpsd: func() *Upsd {
97 - upsd := New()
98 - upsd.Username = "user"
99 - upsd.Password = "pass"
100 - return upsd
96 + prepareUpsd: func() *Collector {
97 + collr := New()
98 + collr.Username = "user"
99 + collr.Password = "pass"
100 + return collr
101 },
102 prepareMock: prepareMockConnErrOnAuthenticate,
103 },
@@ -110,29 +110,29 @@ func TestUpsd_Check(t *testing.T) {
110
111 for name, test := range tests {
112 t.Run(name, func(t *testing.T) {
113 - upsd := test.prepareUpsd()
114 - upsd.newUpsdConn = func(Config) upsdConn { return test.prepareMock() }
113 + collr := test.prepareUpsd()
114 + collr.newUpsdConn = func(Config) upsdConn { return test.prepareMock() }
115
116 - require.NoError(t, upsd.Init())
116 + require.NoError(t, collr.Init())
117
118 if test.wantFail {
119 - assert.Error(t, upsd.Check())
119 + assert.Error(t, collr.Check())
120 } else {
121 - assert.NoError(t, upsd.Check())
121 + assert.NoError(t, collr.Check())
122 }
123 })
124 }
125 }
126
127 -func TestUpsd_Charts(t *testing.T) {
128 - upsd := New()
129 - require.NoError(t, upsd.Init())
130 - assert.NotNil(t, upsd.Charts())
127 +func TestCollector_Charts(t *testing.T) {
128 + collr := New()
129 + require.NoError(t, collr.Init())
130 + assert.NotNil(t, collr.Charts())
131 }
132
133 -func TestUpsd_Collect(t *testing.T) {
133 +func TestCollector_Collect(t *testing.T) {
134 tests := map[string]struct {
135 - prepareUpsd func() *Upsd
135 + prepareUpsd func() *Collector
136 prepareMock func() *mockUpsdConn
137 wantCollected map[string]int64
138 wantCharts int
@@ -210,11 +210,11 @@ func TestUpsd_Collect(t *testing.T) {
210 wantConnAuthenticate: false,
211 },
212 "error on authenticate()": {
213 - prepareUpsd: func() *Upsd {
214 - upsd := New()
215 - upsd.Username = "user"
216 - upsd.Password = "pass"
217 - return upsd
213 + prepareUpsd: func() *Collector {
214 + collr := New()
215 + collr.Username = "user"
216 + collr.Password = "pass"
217 + return collr
218 },
219 prepareMock: prepareMockConnErrOnAuthenticate,
220 wantCollected: nil,
@@ -245,18 +245,18 @@ func TestUpsd_Collect(t *testing.T) {
245
246 for name, test := range tests {
247 t.Run(name, func(t *testing.T) {
248 - upsd := test.prepareUpsd()
249 - require.NoError(t, upsd.Init())
248 + collr := test.prepareUpsd()
249 + require.NoError(t, collr.Init())
250
251 mock := test.prepareMock()
252 - upsd.newUpsdConn = func(Config) upsdConn { return mock }
252 + collr.newUpsdConn = func(Config) upsdConn { return mock }
253
254 - mx := upsd.Collect()
254 + mx := collr.Collect()
255
256 assert.Equal(t, test.wantCollected, mx)
257 - assert.Equalf(t, test.wantCharts, len(*upsd.Charts()), "number of charts")
257 + assert.Equalf(t, test.wantCharts, len(*collr.Charts()), "number of charts")
258 if len(test.wantCollected) > 0 {
259 - ensureCollectedHasAllChartsDims(t, upsd, mx)
259 + ensureCollectedHasAllChartsDims(t, collr, mx)
260 }
261 assert.Equalf(t, test.wantConnConnect, mock.calledConnect, "calledConnect")
262 assert.Equalf(t, test.wantConnDisconnect, mock.calledDisconnect, "calledDisconnect")
@@ -265,8 +265,8 @@ func TestUpsd_Collect(t *testing.T) {
265 }
266 }
267
268 -func ensureCollectedHasAllChartsDims(t *testing.T, upsd *Upsd, mx map[string]int64) {
269 - for _, chart := range *upsd.Charts() {
268 +func ensureCollectedHasAllChartsDims(t *testing.T, collr *Collector, mx map[string]int64) {
269 + for _, chart := range *collr.Charts() {
270 if chart.Obsolete {
271 continue
272 }
src/go/plugin/go.d/collector/uwsgi/charts.go
+5 -5
@@ -243,7 +243,7 @@ var (
243 }
244 )
245
246 -func (u *Uwsgi) addWorkerCharts(workerID int) {
246 +func (c *Collector) addWorkerCharts(workerID int) {
247 charts := workerChartsTmpl.Copy()
248
249 id := strconv.Itoa(workerID)
@@ -258,15 +258,15 @@ func (u *Uwsgi) addWorkerCharts(workerID int) {
258 }
259 }
260
261 - if err := u.Charts().Add(*charts...); err != nil {
262 - u.Warning(err)
261 + if err := c.Charts().Add(*charts...); err != nil {
262 + c.Warning(err)
263 }
264 }
265
266 -func (u *Uwsgi) removeWorkerCharts(workerID int) {
266 +func (c *Collector) removeWorkerCharts(workerID int) {
267 px := fmt.Sprintf("worker_%d_", workerID)
268
269 - for _, chart := range *u.Charts() {
269 + for _, chart := range *c.Charts() {
270 if strings.HasPrefix(chart.ID, px) {
271 chart.MarkRemove()
272 chart.MarkNotCreated()
src/go/plugin/go.d/collector/uwsgi/collect.go
+10 -10
@@ -28,22 +28,22 @@ type workerStats struct {
28 AvgRT int64 `json:"avg_rt"`
29 }
30
31 -func (u *Uwsgi) collect() (map[string]int64, error) {
32 - stats, err := u.conn.queryStats()
31 +func (c *Collector) collect() (map[string]int64, error) {
32 + stats, err := c.conn.queryStats()
33 if err != nil {
34 return nil, fmt.Errorf("failed to query stats: %v", err)
35 }
36
37 mx := make(map[string]int64)
38
39 - if err := u.collectStats(mx, stats); err != nil {
39 + if err := c.collectStats(mx, stats); err != nil {
40 return nil, err
41 }
42
43 return mx, nil
44 }
45
46 -func (u *Uwsgi) collectStats(mx map[string]int64, stats []byte) error {
46 +func (c *Collector) collectStats(mx map[string]int64, stats []byte) error {
47 var resp statsResponse
48 if err := json.Unmarshal(stats, &resp); err != nil {
49 return fmt.Errorf("failed to json decode stats response: %v", err)
@@ -71,9 +71,9 @@ func (u *Uwsgi) collectStats(mx map[string]int64, stats []byte) error {
71
72 seen[w.ID] = true
73
74 - if !u.seenWorkers[w.ID] {
75 - u.seenWorkers[w.ID] = true
76 - u.addWorkerCharts(w.ID)
74 + if !c.seenWorkers[w.ID] {
75 + c.seenWorkers[w.ID] = true
76 + c.addWorkerCharts(w.ID)
77 }
78
79 px := fmt.Sprintf("worker_%d_", w.ID)
@@ -95,10 +95,10 @@ func (u *Uwsgi) collectStats(mx map[string]int64, stats []byte) error {
95 mx[px+"request_handling_status_not_accepting"] = metrix.Bool(w.Accepting == 0)
96 }
97
98 - for id := range u.seenWorkers {
98 + for id := range c.seenWorkers {
99 if !seen[id] {
100 - delete(u.seenWorkers, id)
101 - u.removeWorkerCharts(id)
100 + delete(c.seenWorkers, id)
101 + c.removeWorkerCharts(id)
102 }
103 }
104
src/go/plugin/go.d/collector/uwsgi/collector.go renamed
+16 -16
@@ -22,8 +22,8 @@ func init() {
22 })
23 }
24
25 -func New() *Uwsgi {
26 - return &Uwsgi{
25 +func New() *Collector {
26 + return &Collector{
27 Config: Config{
28 Address: "127.0.0.1:1717",
29 Timeout: confopt.Duration(time.Second * 1),
@@ -39,7 +39,7 @@ type Config struct {
39 Timeout confopt.Duration `yaml:"timeout" json:"timeout"`
40 }
41
42 -type Uwsgi struct {
42 +type Collector struct {
43 module.Base
44 Config `yaml:",inline" json:""`
45
@@ -50,22 +50,22 @@ type Uwsgi struct {
50 seenWorkers map[int]bool
51 }
52
53 -func (u *Uwsgi) Configuration() any {
54 - return u.Config
53 +func (c *Collector) Configuration() any {
54 + return c.Config
55 }
56
57 -func (u *Uwsgi) Init() error {
58 - if u.Address == "" {
57 +func (c *Collector) Init() error {
58 + if c.Address == "" {
59 return errors.New("config: 'address' not set")
60 }
61
62 - u.conn = newUwsgiConn(u.Config)
62 + c.conn = newUwsgiConn(c.Config)
63
64 return nil
65 }
66
67 -func (u *Uwsgi) Check() error {
68 - mx, err := u.collect()
67 +func (c *Collector) Check() error {
68 + mx, err := c.collect()
69 if err != nil {
70 return err
71 }
@@ -77,14 +77,14 @@ func (u *Uwsgi) Check() error {
77 return nil
78 }
79
80 -func (u *Uwsgi) Charts() *module.Charts {
81 - return u.charts
80 +func (c *Collector) Charts() *module.Charts {
81 + return c.charts
82 }
83
84 -func (u *Uwsgi) Collect() map[string]int64 {
85 - mx, err := u.collect()
84 +func (c *Collector) Collect() map[string]int64 {
85 + mx, err := c.collect()
86 if err != nil {
87 - u.Error(err)
87 + c.Error(err)
88 }
89
90 if len(mx) == 0 {
@@ -94,4 +94,4 @@ func (u *Uwsgi) Collect() map[string]int64 {
94 return mx
95 }
96
97 -func (u *Uwsgi) Cleanup() {}
97 +func (c *Collector) Cleanup() {}
src/go/plugin/go.d/collector/uwsgi/collector_test.go renamed
+34 -34
@@ -32,11 +32,11 @@ func Test_testDataIsValid(t *testing.T) {
32 }
33 }
34
35 -func TestUwsgi_ConfigurationSerialize(t *testing.T) {
36 - module.TestConfigurationSerialize(t, &Uwsgi{}, dataConfigJSON, dataConfigYAML)
35 +func TestCollector_ConfigurationSerialize(t *testing.T) {
36 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
37 }
38
39 -func TestUwsgi_Init(t *testing.T) {
39 +func TestCollector_Init(t *testing.T) {
40 tests := map[string]struct {
41 config Config
42 wantFail bool
@@ -57,59 +57,59 @@ func TestUwsgi_Init(t *testing.T) {
57
58 for name, test := range tests {
59 t.Run(name, func(t *testing.T) {
60 - uw := New()
61 - uw.Config = test.config
60 + collr := New()
61 + collr.Config = test.config
62
63 if test.wantFail {
64 - assert.Error(t, uw.Init())
64 + assert.Error(t, collr.Init())
65 } else {
66 - assert.NoError(t, uw.Init())
66 + assert.NoError(t, collr.Init())
67 }
68 })
69 }
70 }
71
72 -func TestUwsgi_Cleanup(t *testing.T) {
72 +func TestCollector_Cleanup(t *testing.T) {
73 tests := map[string]struct {
74 - prepare func() *Uwsgi
74 + prepare func() *Collector
75 }{
76 "not initialized": {
77 - prepare: func() *Uwsgi {
77 + prepare: func() *Collector {
78 return New()
79 },
80 },
81 "after check": {
82 - prepare: func() *Uwsgi {
83 - uw := New()
84 - uw.conn = prepareMockOk()
85 - _ = uw.Check()
86 - return uw
82 + prepare: func() *Collector {
83 + collr := New()
84 + collr.conn = prepareMockOk()
85 + _ = collr.Check()
86 + return collr
87 },
88 },
89 "after collect": {
90 - prepare: func() *Uwsgi {
91 - uw := New()
92 - uw.conn = prepareMockOk()
93 - _ = uw.Collect()
94 - return uw
90 + prepare: func() *Collector {
91 + collr := New()
92 + collr.conn = prepareMockOk()
93 + _ = collr.Collect()
94 + return collr
95 },
96 },
97 }
98
99 for name, test := range tests {
100 t.Run(name, func(t *testing.T) {
101 - uw := test.prepare()
101 + collr := test.prepare()
102
103 - assert.NotPanics(t, uw.Cleanup)
103 + assert.NotPanics(t, collr.Cleanup)
104 })
105 }
106 }
107
108 -func TestUwsgi_Charts(t *testing.T) {
108 +func TestCollector_Charts(t *testing.T) {
109 assert.NotNil(t, New().Charts())
110 }
111
112 -func TestUwsgi_Check(t *testing.T) {
112 +func TestCollector_Check(t *testing.T) {
113 tests := map[string]struct {
114 prepareMock func() *mockUwsgiConn
115 wantFail bool
@@ -134,20 +134,20 @@ func TestUwsgi_Check(t *testing.T) {
134
135 for name, test := range tests {
136 t.Run(name, func(t *testing.T) {
137 - uw := New()
137 + collr := New()
138 mock := test.prepareMock()
139 - uw.conn = mock
139 + collr.conn = mock
140
141 if test.wantFail {
142 - assert.Error(t, uw.Check())
142 + assert.Error(t, collr.Check())
143 } else {
144 - assert.NoError(t, uw.Check())
144 + assert.NoError(t, collr.Check())
145 }
146 })
147 }
148 }
149
150 -func TestUwsgi_Collect(t *testing.T) {
150 +func TestCollector_Collect(t *testing.T) {
151 tests := map[string]struct {
152 prepareMock func() *mockUwsgiConn
153 wantMetrics map[string]int64
@@ -235,18 +235,18 @@ func TestUwsgi_Collect(t *testing.T) {
235
236 for name, test := range tests {
237 t.Run(name, func(t *testing.T) {
238 - uw := New()
238 + collr := New()
239 mock := test.prepareMock()
240 - uw.conn = mock
240 + collr.conn = mock
241
242 - mx := uw.Collect()
242 + mx := collr.Collect()
243
244 require.Equal(t, test.wantMetrics, mx)
245
246 if len(test.wantMetrics) > 0 {
247 - module.TestMetricsHasAllChartsDims(t, uw.Charts(), mx)
247 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
248 }
249 - assert.Equal(t, test.wantCharts, len(*uw.Charts()), "want charts")
249 + assert.Equal(t, test.wantCharts, len(*collr.Charts()), "want charts")
250 })
251 }
252 }
src/go/plugin/go.d/collector/varnish/charts.go
+12 -12
@@ -324,7 +324,7 @@ var (
324 }
325 )
326
327 -func (v *Varnish) addBackendCharts(fullName string) {
327 +func (c *Collector) addBackendCharts(fullName string) {
328 charts := backendChartsTmpl.Copy()
329
330 for _, chart := range *charts {
@@ -337,13 +337,13 @@ func (v *Varnish) addBackendCharts(fullName string) {
337 }
338 }
339
340 - if err := v.Charts().Add(*charts...); err != nil {
341 - v.Warning(err)
340 + if err := c.Charts().Add(*charts...); err != nil {
341 + c.Warning(err)
342 }
343
344 }
345
346 -func (v *Varnish) addStorageCharts(name string) {
346 +func (c *Collector) addStorageCharts(name string) {
347 charts := storageChartsTmpl.Copy()
348
349 for _, chart := range *charts {
@@ -356,24 +356,24 @@ func (v *Varnish) addStorageCharts(name string) {
356 }
357 }
358
359 - if err := v.Charts().Add(*charts...); err != nil {
360 - v.Warning(err)
359 + if err := c.Charts().Add(*charts...); err != nil {
360 + c.Warning(err)
361 }
362
363 }
364
365 -func (v *Varnish) removeBackendCharts(name string) {
365 +func (c *Collector) removeBackendCharts(name string) {
366 px := fmt.Sprintf("backend_%s_", name)
367 - v.removeCharts(cleanChartID(px))
367 + c.removeCharts(cleanChartID(px))
368 }
369
370 -func (v *Varnish) removeStorageCharts(name string) {
370 +func (c *Collector) removeStorageCharts(name string) {
371 px := fmt.Sprintf("storage_%s_", name)
372 - v.removeCharts(cleanChartID(px))
372 + c.removeCharts(cleanChartID(px))
373 }
374
375 -func (v *Varnish) removeCharts(prefix string) {
376 - for _, chart := range *v.Charts() {
375 +func (c *Collector) removeCharts(prefix string) {
376 + for _, chart := range *c.Charts() {
377 if strings.HasPrefix(chart.ID, prefix) {
378 chart.MarkRemove()
379 chart.MarkNotCreated()
src/go/plugin/go.d/collector/varnish/collect.go
+21 -21
@@ -9,22 +9,22 @@ import (
9 "strings"
10 )
11
12 -func (v *Varnish) collect() (map[string]int64, error) {
13 - bs, err := v.exec.statistics()
12 +func (c *Collector) collect() (map[string]int64, error) {
13 + bs, err := c.exec.statistics()
14 if err != nil {
15 return nil, err
16 }
17
18 mx := make(map[string]int64)
19
20 - if err := v.collectStatistics(mx, bs); err != nil {
20 + if err := c.collectStatistics(mx, bs); err != nil {
21 return nil, err
22 }
23
24 return mx, nil
25 }
26
27 -func (v *Varnish) collectStatistics(mx map[string]int64, bs []byte) error {
27 +func (c *Collector) collectStatistics(mx map[string]int64, bs []byte) error {
28 seenBackends, seenStorages := make(map[string]bool), make(map[string]bool)
29
30 sc := bufio.NewScanner(bytes.NewReader(bs))
@@ -37,7 +37,7 @@ func (v *Varnish) collectStatistics(mx map[string]int64, bs []byte) error {
37
38 parts := strings.Fields(line)
39 if len(parts) < 4 {
40 - v.Debugf("invalid line format: '%s'. Expected at least 4 fields, skipping line.", line)
40 + c.Debugf("invalid line format: '%s'. Expected at least 4 fields, skipping line.", line)
41 continue
42 }
43
@@ -46,12 +46,12 @@ func (v *Varnish) collectStatistics(mx map[string]int64, bs []byte) error {
46
47 category, metric, ok := strings.Cut(fullMetric, ".")
48 if !ok {
49 - v.Debugf("invalid metric format: '%s'. Expected 'category.metric', skipping metric.", fullMetric)
49 + c.Debugf("invalid metric format: '%s'. Expected 'category.metric', skipping metric.", fullMetric)
50 continue
51 }
52 value, err := strconv.ParseInt(valueStr, 10, 64)
53 if err != nil {
54 - v.Debugf("failed to parse metric '%s' value '%s': %v, skipping metric", fullMetric, valueStr, err)
54 + c.Debugf("failed to parse metric '%s' value '%s': %v, skipping metric", fullMetric, valueStr, err)
55 continue
56 }
57
@@ -67,7 +67,7 @@ func (v *Varnish) collectStatistics(mx map[string]int64, bs []byte) error {
67 case "SMA", "SMF", "MSE":
68 storage, sMetric, ok := strings.Cut(metric, ".")
69 if !ok {
70 - v.Debugf("invalid metric format: '%s'. Expected 'type.storage.metric', skipping metric.", fullMetric)
70 + c.Debugf("invalid metric format: '%s'. Expected 'type.storage.metric', skipping metric.", fullMetric)
71 continue
72 }
73
@@ -81,7 +81,7 @@ func (v *Varnish) collectStatistics(mx map[string]int64, bs []byte) error {
81 // Varnish 4.0.x is not supported (values are 'VBE.default(127.0.0.1,,81).happy')
82 parts := strings.Split(metric, ".")
83 if len(parts) != 3 {
84 - v.Debugf("invalid metric format: '%s'. Expected 'VBE.vcl.backend.metric', skipping metric.", fullMetric)
84 + c.Debugf("invalid metric format: '%s'. Expected 'VBE.vcl.backend.metric', skipping metric.", fullMetric)
85 continue
86 }
87
@@ -99,28 +99,28 @@ func (v *Varnish) collectStatistics(mx map[string]int64, bs []byte) error {
99 }
100
101 for name := range seenStorages {
102 - if !v.seenStorages[name] {
103 - v.seenStorages[name] = true
104 - v.addStorageCharts(name)
102 + if !c.seenStorages[name] {
103 + c.seenStorages[name] = true
104 + c.addStorageCharts(name)
105 }
106 }
107 - for name := range v.seenStorages {
107 + for name := range c.seenStorages {
108 if !seenStorages[name] {
109 - delete(v.seenStorages, name)
110 - v.removeBackendCharts(name)
109 + delete(c.seenStorages, name)
110 + c.removeBackendCharts(name)
111 }
112 }
113
114 for fullName := range seenBackends {
115 - if !v.seenBackends[fullName] {
116 - v.seenBackends[fullName] = true
117 - v.addBackendCharts(fullName)
115 + if !c.seenBackends[fullName] {
116 + c.seenBackends[fullName] = true
117 + c.addBackendCharts(fullName)
118 }
119 }
120 - for fullName := range v.seenBackends {
120 + for fullName := range c.seenBackends {
121 if !seenBackends[fullName] {
122 - delete(v.seenBackends, fullName)
123 - v.removeBackendCharts(fullName)
122 + delete(c.seenBackends, fullName)
123 + c.removeBackendCharts(fullName)
124 }
125 }
126
src/go/plugin/go.d/collector/varnish/collector.go renamed
+16 -16
@@ -26,8 +26,8 @@ func init() {
26 })
27 }
28
29 -func New() *Varnish {
30 - return &Varnish{
29 +func New() *Collector {
30 + return &Collector{
31 Config: Config{
32 Timeout: confopt.Duration(time.Second * 2),
33 },
@@ -46,7 +46,7 @@ type Config struct {
46 DockerContainer string `yaml:"docker_container,omitempty" json:"docker_container,omitempty"`
47 }
48
49 -type Varnish struct {
49 +type Collector struct {
50 module.Base
51 Config `yaml:",inline" json:""`
52
@@ -58,22 +58,22 @@ type Varnish struct {
58 seenStorages map[string]bool
59 }
60
61 -func (v *Varnish) Configuration() any {
62 - return v.Config
61 +func (c *Collector) Configuration() any {
62 + return c.Config
63 }
64
65 -func (v *Varnish) Init() error {
66 - vs, err := v.initVarnishstatBinary()
65 +func (c *Collector) Init() error {
66 + vs, err := c.initVarnishstatBinary()
67 if err != nil {
68 return fmt.Errorf("init varnishstat exec: %v", err)
69 }
70 - v.exec = vs
70 + c.exec = vs
71
72 return nil
73 }
74
75 -func (v *Varnish) Check() error {
76 - mx, err := v.collect()
75 +func (c *Collector) Check() error {
76 + mx, err := c.collect()
77 if err != nil {
78 return err
79 }
@@ -85,14 +85,14 @@ func (v *Varnish) Check() error {
85 return nil
86 }
87
88 -func (v *Varnish) Charts() *module.Charts {
89 - return v.charts
88 +func (c *Collector) Charts() *module.Charts {
89 + return c.charts
90 }
91
92 -func (v *Varnish) Collect() map[string]int64 {
93 - mx, err := v.collect()
92 +func (c *Collector) Collect() map[string]int64 {
93 + mx, err := c.collect()
94 if err != nil {
95 - v.Error(err)
95 + c.Error(err)
96 }
97
98 if len(mx) == 0 {
@@ -102,4 +102,4 @@ func (v *Varnish) Collect() map[string]int64 {
102 return mx
103 }
104
105 -func (v *Varnish) Cleanup() {}
105 +func (c *Collector) Cleanup() {}
src/go/plugin/go.d/collector/varnish/collector_test.go renamed
+34 -34
@@ -30,11 +30,11 @@ func Test_testDataIsValid(t *testing.T) {
30 }
31 }
32
33 -func TestVarnish_Configuration(t *testing.T) {
34 - module.TestConfigurationSerialize(t, &Varnish{}, dataConfigJSON, dataConfigYAML)
33 +func TestCollector_Configuration(t *testing.T) {
34 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
35 }
36
37 -func TestVarnish_Init(t *testing.T) {
37 +func TestCollector_Init(t *testing.T) {
38 tests := map[string]struct {
39 config Config
40 wantFail bool
@@ -47,59 +47,59 @@ func TestVarnish_Init(t *testing.T) {
47
48 for name, test := range tests {
49 t.Run(name, func(t *testing.T) {
50 - varnish := New()
51 - varnish.Config = test.config
50 + collr := New()
51 + collr.Config = test.config
52
53 if test.wantFail {
54 - assert.Error(t, varnish.Init())
54 + assert.Error(t, collr.Init())
55 } else {
56 - assert.NoError(t, varnish.Init())
56 + assert.NoError(t, collr.Init())
57 }
58 })
59 }
60 }
61
62 -func TestVarnish_Cleanup(t *testing.T) {
62 +func TestCollector_Cleanup(t *testing.T) {
63 tests := map[string]struct {
64 - prepare func() *Varnish
64 + prepare func() *Collector
65 }{
66 "not initialized exec": {
67 - prepare: func() *Varnish {
67 + prepare: func() *Collector {
68 return New()
69 },
70 },
71 "after check": {
72 - prepare: func() *Varnish {
73 - varnish := New()
74 - varnish.exec = prepareMockOkVer71()
75 - _ = varnish.Check()
76 - return varnish
72 + prepare: func() *Collector {
73 + collr := New()
74 + collr.exec = prepareMockOkVer71()
75 + _ = collr.Check()
76 + return collr
77 },
78 },
79 "after collect": {
80 - prepare: func() *Varnish {
81 - varnish := New()
82 - varnish.exec = prepareMockOkVer71()
83 - _ = varnish.Collect()
84 - return varnish
80 + prepare: func() *Collector {
81 + collr := New()
82 + collr.exec = prepareMockOkVer71()
83 + _ = collr.Collect()
84 + return collr
85 },
86 },
87 }
88
89 for name, test := range tests {
90 t.Run(name, func(t *testing.T) {
91 - varnish := test.prepare()
91 + collr := test.prepare()
92
93 - assert.NotPanics(t, varnish.Cleanup)
93 + assert.NotPanics(t, collr.Cleanup)
94 })
95 }
96 }
97
98 -func TestVarnish_Charts(t *testing.T) {
98 +func TestCollector_Charts(t *testing.T) {
99 assert.NotNil(t, New().Charts())
100 }
101
102 -func TestVarnish_Check(t *testing.T) {
102 +func TestCollector_Check(t *testing.T) {
103 tests := map[string]struct {
104 prepareMock func() *mockVarnishstatExec
105 wantFail bool
@@ -120,19 +120,19 @@ func TestVarnish_Check(t *testing.T) {
120
121 for name, test := range tests {
122 t.Run(name, func(t *testing.T) {
123 - varnish := New()
124 - varnish.exec = test.prepareMock()
123 + collr := New()
124 + collr.exec = test.prepareMock()
125
126 if test.wantFail {
127 - assert.Error(t, varnish.Check())
127 + assert.Error(t, collr.Check())
128 } else {
129 - assert.NoError(t, varnish.Check())
129 + assert.NoError(t, collr.Check())
130 }
131 })
132 }
133 }
134
135 -func TestVarnish_Collect(t *testing.T) {
135 +func TestCollector_Collect(t *testing.T) {
136 tests := map[string]struct {
137 prepareMock func() *mockVarnishstatExec
138 wantMetrics map[string]int64
@@ -203,16 +203,16 @@ func TestVarnish_Collect(t *testing.T) {
203
204 for name, test := range tests {
205 t.Run(name, func(t *testing.T) {
206 - varnish := New()
207 - varnish.exec = test.prepareMock()
206 + collr := New()
207 + collr.exec = test.prepareMock()
208
209 - mx := varnish.Collect()
209 + mx := collr.Collect()
210
211 assert.Equal(t, test.wantMetrics, mx)
212
213 if len(test.wantMetrics) > 0 {
214 - assert.Equal(t, test.wantCharts, len(*varnish.Charts()))
215 - module.TestMetricsHasAllChartsDims(t, varnish.Charts(), mx)
214 + assert.Equal(t, test.wantCharts, len(*collr.Charts()))
215 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
216 }
217 })
218 }
src/go/plugin/go.d/collector/varnish/init.go
+4 -4
@@ -10,9 +10,9 @@ import (
10 "github.com/netdata/netdata/go/plugins/pkg/executable"
11 )
12
13 -func (v *Varnish) initVarnishstatBinary() (varnishstatBinary, error) {
14 - if v.Config.DockerContainer != "" {
15 - return newVarnishstatDockerExecBinary(v.Config, v.Logger), nil
13 +func (c *Collector) initVarnishstatBinary() (varnishstatBinary, error) {
14 + if c.Config.DockerContainer != "" {
15 + return newVarnishstatDockerExecBinary(c.Config, c.Logger), nil
16 }
17
18 ndsudoPath := filepath.Join(executable.Directory, "ndsudo")
@@ -22,7 +22,7 @@ func (v *Varnish) initVarnishstatBinary() (varnishstatBinary, error) {
22
23 }
24
25 - varnishstat := newVarnishstatExecBinary(ndsudoPath, v.Config, v.Logger)
25 + varnishstat := newVarnishstatExecBinary(ndsudoPath, c.Config, c.Logger)
26
27 return varnishstat, nil
28 }
src/go/plugin/go.d/collector/vcsa/collect.go
+13 -13
@@ -22,14 +22,14 @@ type vcsaHealthStatus struct {
22 SoftwarePackages *string
23 }
24
25 -func (vc *VCSA) collect() (map[string]int64, error) {
26 - err := vc.client.Ping()
25 +func (c *Collector) collect() (map[string]int64, error) {
26 + err := c.client.Ping()
27 if err != nil {
28 return nil, err
29 }
30
31 var status vcsaHealthStatus
32 - vc.scrapeHealth(&status)
32 + c.scrapeHealth(&status)
33
34 mx := make(map[string]int64)
35
@@ -45,27 +45,27 @@ func (vc *VCSA) collect() (map[string]int64, error) {
45 return mx, nil
46 }
47
48 -func (vc *VCSA) scrapeHealth(status *vcsaHealthStatus) {
48 +func (c *Collector) scrapeHealth(status *vcsaHealthStatus) {
49 wg := &sync.WaitGroup{}
50
51 scrape := func(fn func() (string, error), value **string) {
52 v, err := fn()
53 if err != nil {
54 - vc.Error(err)
54 + c.Error(err)
55 return
56 }
57 *value = &v
58 }
59
60 for _, fn := range []func(){
61 - func() { scrape(vc.client.System, &status.System) },
62 - func() { scrape(vc.client.ApplMgmt, &status.ApplMgmt) },
63 - func() { scrape(vc.client.Load, &status.Load) },
64 - func() { scrape(vc.client.DatabaseStorage, &status.DatabaseStorage) },
65 - func() { scrape(vc.client.Storage, &status.Storage) },
66 - func() { scrape(vc.client.Mem, &status.Mem) },
67 - func() { scrape(vc.client.Swap, &status.Swap) },
68 - func() { scrape(vc.client.SoftwarePackages, &status.SoftwarePackages) },
61 + func() { scrape(c.client.System, &status.System) },
62 + func() { scrape(c.client.ApplMgmt, &status.ApplMgmt) },
63 + func() { scrape(c.client.Load, &status.Load) },
64 + func() { scrape(c.client.DatabaseStorage, &status.DatabaseStorage) },
65 + func() { scrape(c.client.Storage, &status.Storage) },
66 + func() { scrape(c.client.Mem, &status.Mem) },
67 + func() { scrape(c.client.Swap, &status.Swap) },
68 + func() { scrape(c.client.SoftwarePackages, &status.SoftwarePackages) },
69 } {
70 fn := fn
71
src/go/plugin/go.d/collector/vcsa/collector.go renamed
+23 -23
@@ -27,8 +27,8 @@ func init() {
27 })
28 }
29
30 -func New() *VCSA {
31 - return &VCSA{
30 +func New() *Collector {
31 + return &Collector{
32 Config: Config{
33 HTTPConfig: web.HTTPConfig{
34 ClientConfig: web.ClientConfig{
@@ -46,7 +46,7 @@ type Config struct {
46 }
47
48 type (
49 - VCSA struct {
49 + Collector struct {
50 module.Base
51 Config `yaml:",inline" json:""`
52
@@ -70,34 +70,34 @@ type (
70 }
71 )
72
73 -func (vc *VCSA) Configuration() any {
74 - return vc.Config
73 +func (c *Collector) Configuration() any {
74 + return c.Config
75 }
76
77 -func (vc *VCSA) Init() error {
78 - if err := vc.validateConfig(); err != nil {
77 +func (c *Collector) Init() error {
78 + if err := c.validateConfig(); err != nil {
79 return fmt.Errorf("invalid config: %v", err)
80 }
81
82 - c, err := vc.initHealthClient()
82 + cli, err := c.initHealthClient()
83 if err != nil {
84 return fmt.Errorf("error on creating health client : %vc", err)
85 }
86 - vc.client = c
86 + c.client = cli
87
88 - vc.Debugf("using URL %s", vc.URL)
89 - vc.Debugf("using timeout: %s", vc.Timeout)
88 + c.Debugf("using URL %s", c.URL)
89 + c.Debugf("using timeout: %s", c.Timeout)
90
91 return nil
92 }
93
94 -func (vc *VCSA) Check() error {
95 - err := vc.client.Login()
94 +func (c *Collector) Check() error {
95 + err := c.client.Login()
96 if err != nil {
97 return err
98 }
99
100 - mx, err := vc.collect()
100 + mx, err := c.collect()
101 if err != nil {
102 return err
103 }
@@ -109,14 +109,14 @@ func (vc *VCSA) Check() error {
109 return nil
110 }
111
112 -func (vc *VCSA) Charts() *module.Charts {
113 - return vc.charts
112 +func (c *Collector) Charts() *module.Charts {
113 + return c.charts
114 }
115
116 -func (vc *VCSA) Collect() map[string]int64 {
117 - mx, err := vc.collect()
116 +func (c *Collector) Collect() map[string]int64 {
117 + mx, err := c.collect()
118 if err != nil {
119 - vc.Error(err)
119 + c.Error(err)
120 }
121
122 if len(mx) == 0 {
@@ -125,12 +125,12 @@ func (vc *VCSA) Collect() map[string]int64 {
125 return mx
126 }
127
128 -func (vc *VCSA) Cleanup() {
129 - if vc.client == nil {
128 +func (c *Collector) Cleanup() {
129 + if c.client == nil {
130 return
131 }
132 - err := vc.client.Logout()
132 + err := c.client.Logout()
133 if err != nil {
134 - vc.Errorf("error on logout : %v", err)
134 + c.Errorf("error on logout : %v", err)
135 }
136 }
src/go/plugin/go.d/collector/vcsa/collector_test.go renamed
+58 -58
@@ -27,83 +27,83 @@ func Test_testDataIsValid(t *testing.T) {
27 }
28 }
29
30 -func TestVCSA_ConfigurationSerialize(t *testing.T) {
31 - module.TestConfigurationSerialize(t, &VCSA{}, dataConfigJSON, dataConfigYAML)
30 +func TestCollector_ConfigurationSerialize(t *testing.T) {
31 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
32 }
33
34 -func TestVCSA_Init(t *testing.T) {
35 - job := prepareVCSA()
34 +func TestCollector_Init(t *testing.T) {
35 + collr := prepareVCSA()
36
37 - assert.NoError(t, job.Init())
38 - assert.NotNil(t, job.client)
37 + assert.NoError(t, collr.Init())
38 + assert.NotNil(t, collr.client)
39 }
40
41 -func TestVCenter_InitErrorOnValidatingInitParameters(t *testing.T) {
42 - job := New()
41 +func TestCollector_InitErrorOnValidatingInitParameters(t *testing.T) {
42 + collr := New()
43
44 - assert.Error(t, job.Init())
44 + assert.Error(t, collr.Init())
45 }
46
47 -func TestVCenter_InitErrorOnCreatingClient(t *testing.T) {
48 - job := prepareVCSA()
49 - job.ClientConfig.TLSConfig.TLSCA = "testdata/tls"
47 +func TestCollector_InitErrorOnCreatingClient(t *testing.T) {
48 + collr := prepareVCSA()
49 + collr.ClientConfig.TLSConfig.TLSCA = "testdata/tls"
50
51 - assert.Error(t, job.Init())
51 + assert.Error(t, collr.Init())
52 }
53
54 -func TestVCenter_Check(t *testing.T) {
55 - job := prepareVCSA()
56 - require.NoError(t, job.Init())
57 - job.client = &mockVCenterHealthClient{}
54 +func TestCollector_Check(t *testing.T) {
55 + collr := prepareVCSA()
56 + require.NoError(t, collr.Init())
57 + collr.client = &mockVCenterHealthClient{}
58
59 - assert.NoError(t, job.Check())
59 + assert.NoError(t, collr.Check())
60 }
61
62 -func TestVCenter_CheckErrorOnLogin(t *testing.T) {
63 - job := prepareVCSA()
64 - require.NoError(t, job.Init())
65 - job.client = &mockVCenterHealthClient{
62 +func TestCollector_CheckErrorOnLogin(t *testing.T) {
63 + collr := prepareVCSA()
64 + require.NoError(t, collr.Init())
65 + collr.client = &mockVCenterHealthClient{
66 login: func() error { return errors.New("login mock error") },
67 }
68
69 - assert.Error(t, job.Check())
69 + assert.Error(t, collr.Check())
70 }
71
72 -func TestVCenter_CheckEnsureLoggedIn(t *testing.T) {
73 - job := prepareVCSA()
74 - require.NoError(t, job.Init())
72 +func TestCollector_CheckEnsureLoggedIn(t *testing.T) {
73 + collr := prepareVCSA()
74 + require.NoError(t, collr.Init())
75 mock := &mockVCenterHealthClient{}
76 - job.client = mock
76 + collr.client = mock
77
78 - assert.NoError(t, job.Check())
78 + assert.NoError(t, collr.Check())
79 assert.True(t, mock.loginCalls == 1)
80 }
81
82 -func TestVCenter_Cleanup(t *testing.T) {
83 - job := prepareVCSA()
84 - require.NoError(t, job.Init())
82 +func TestCollector_Cleanup(t *testing.T) {
83 + collr := prepareVCSA()
84 + require.NoError(t, collr.Init())
85 mock := &mockVCenterHealthClient{}
86 - job.client = mock
87 - job.Cleanup()
86 + collr.client = mock
87 + collr.Cleanup()
88
89 assert.True(t, mock.logoutCalls == 1)
90 }
91
92 -func TestVCenter_CleanupWithNilClient(t *testing.T) {
93 - job := prepareVCSA()
92 +func TestCollector_CleanupWithNilClient(t *testing.T) {
93 + collr := prepareVCSA()
94
95 - assert.NotPanics(t, job.Cleanup)
95 + assert.NotPanics(t, collr.Cleanup)
96 }
97
98 -func TestVCenter_Charts(t *testing.T) {
98 +func TestCollector_Charts(t *testing.T) {
99 assert.NotNil(t, New().Charts())
100 }
101
102 -func TestVCenter_Collect(t *testing.T) {
103 - job := prepareVCSA()
104 - require.NoError(t, job.Init())
102 +func TestCollector_Collect(t *testing.T) {
103 + collr := prepareVCSA()
104 + require.NoError(t, collr.Init())
105 mock := &mockVCenterHealthClient{}
106 - job.client = mock
106 + collr.client = mock
107
108 expected := map[string]int64{
109 "applmgmt_status_gray": 0,
@@ -155,33 +155,33 @@ func TestVCenter_Collect(t *testing.T) {
155 "system_status_yellow": 0,
156 }
157
158 - assert.Equal(t, expected, job.Collect())
158 + assert.Equal(t, expected, collr.Collect())
159 }
160
161 -func TestVCenter_CollectEnsurePingIsCalled(t *testing.T) {
162 - job := prepareVCSA()
163 - require.NoError(t, job.Init())
161 +func TestCollector_CollectEnsurePingIsCalled(t *testing.T) {
162 + collr := prepareVCSA()
163 + require.NoError(t, collr.Init())
164 mock := &mockVCenterHealthClient{}
165 - job.client = mock
166 - job.Collect()
165 + collr.client = mock
166 + collr.Collect()
167
168 assert.True(t, mock.pingCalls == 1)
169 }
170
171 -func TestVCenter_CollectErrorOnPing(t *testing.T) {
172 - job := prepareVCSA()
173 - require.NoError(t, job.Init())
171 +func TestCollector_CollectErrorOnPing(t *testing.T) {
172 + collr := prepareVCSA()
173 + require.NoError(t, collr.Init())
174 mock := &mockVCenterHealthClient{
175 ping: func() error { return errors.New("ping mock error") },
176 }
177 - job.client = mock
177 + collr.client = mock
178
179 - assert.Zero(t, job.Collect())
179 + assert.Zero(t, collr.Collect())
180 }
181
182 -func TestVCenter_CollectErrorOnHealthCalls(t *testing.T) {
183 - job := prepareVCSA()
184 - require.NoError(t, job.Init())
182 +func TestCollector_CollectErrorOnHealthCalls(t *testing.T) {
183 + collr := prepareVCSA()
184 + require.NoError(t, collr.Init())
185 mock := &mockVCenterHealthClient{
186 applMgmt: func() (string, error) { return "", errors.New("applMgmt mock error") },
187 databaseStorage: func() (string, error) { return "", errors.New("databaseStorage mock error") },
@@ -192,12 +192,12 @@ func TestVCenter_CollectErrorOnHealthCalls(t *testing.T) {
192 swap: func() (string, error) { return "", errors.New("swap mock error") },
193 system: func() (string, error) { return "", errors.New("system mock error") },
194 }
195 - job.client = mock
195 + collr.client = mock
196
197 - assert.Zero(t, job.Collect())
197 + assert.Zero(t, collr.Collect())
198 }
199
200 -func prepareVCSA() *VCSA {
200 +func prepareVCSA() *Collector {
201 vc := New()
202 vc.URL = "https://127.0.0.1:38001"
203 vc.Username = "user"
src/go/plugin/go.d/collector/vcsa/init.go
+6 -6
@@ -9,21 +9,21 @@ import (
9 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/web"
10 )
11
12 -func (vc *VCSA) validateConfig() error {
13 - if vc.URL == "" {
12 +func (c *Collector) validateConfig() error {
13 + if c.URL == "" {
14 return errors.New("URL not set")
15 }
16 - if vc.Username == "" || vc.Password == "" {
16 + if c.Username == "" || c.Password == "" {
17 return errors.New("username or password not set")
18 }
19 return nil
20 }
21
22 -func (vc *VCSA) initHealthClient() (*client.Client, error) {
23 - httpClient, err := web.NewHTTPClient(vc.ClientConfig)
22 +func (c *Collector) initHealthClient() (*client.Client, error) {
23 + httpClient, err := web.NewHTTPClient(c.ClientConfig)
24 if err != nil {
25 return nil, err
26 }
27
28 - return client.New(httpClient, vc.URL, vc.Username, vc.Password), nil
28 + return client.New(httpClient, c.URL, c.Username, c.Password), nil
29 }
src/go/plugin/go.d/collector/vernemq/charts.go
+9 -9
@@ -1099,26 +1099,26 @@ var (
1099 }
1100 )
1101
1102 -func (v *VerneMQ) addNodeCharts(node string, nst *nodeStats) {
1103 - if err := v.Charts().Add(*newNodeCharts(node)...); err != nil {
1104 - v.Warningf("error on adding node '%s' charts: %v", node, err)
1102 +func (c *Collector) addNodeCharts(node string, nst *nodeStats) {
1103 + if err := c.Charts().Add(*newNodeCharts(node)...); err != nil {
1104 + c.Warningf("error on adding node '%s' charts: %v", node, err)
1105 }
1106 if len(nst.mqtt4) > 0 {
1107 - if err := v.Charts().Add(*newNodeMqttCharts(node, "4")...); err != nil {
1108 - v.Warningf("error on adding node '%s' mqtt v4 charts: %v", node, err)
1107 + if err := c.Charts().Add(*newNodeMqttCharts(node, "4")...); err != nil {
1108 + c.Warningf("error on adding node '%s' mqtt v4 charts: %v", node, err)
1109 }
1110 }
1111 if len(nst.mqtt5) > 0 {
1112 - if err := v.Charts().Add(*newNodeMqttCharts(node, "5")...); err != nil {
1113 - v.Warningf("error on adding node '%s' mqtt 5 charts: %v", node, err)
1112 + if err := c.Charts().Add(*newNodeMqttCharts(node, "5")...); err != nil {
1113 + c.Warningf("error on adding node '%s' mqtt 5 charts: %v", node, err)
1114 }
1115 }
1116 }
1117
1118 -func (v *VerneMQ) removeNodeCharts(node string) {
1118 +func (c *Collector) removeNodeCharts(node string) {
1119 px := cleanChartID(fmt.Sprintf("node_%s_", node))
1120
1121 - for _, chart := range *v.Charts() {
1121 + for _, chart := range *c.Charts() {
1122 if strings.HasPrefix(chart.ID, px) {
1123 chart.MarkRemove()
1124 chart.MarkNotCreated()
src/go/plugin/go.d/collector/vernemq/collect.go
+18 -18
@@ -12,35 +12,35 @@ import (
12 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/prometheus"
13 )
14
15 -func (v *VerneMQ) collect() (map[string]int64, error) {
16 - mfs, err := v.prom.Scrape()
15 +func (c *Collector) collect() (map[string]int64, error) {
16 + mfs, err := c.prom.Scrape()
17 if err != nil {
18 return nil, err
19 }
20
21 - if !v.namespace.found {
22 - name, err := v.getMetricNamespace(mfs)
21 + if !c.namespace.found {
22 + name, err := c.getMetricNamespace(mfs)
23 if err != nil {
24 return nil, err
25 }
26 - v.namespace.found = true
27 - v.namespace.name = name
26 + c.namespace.found = true
27 + c.namespace.name = name
28 }
29
30 mx := make(map[string]int64)
31
32 - v.collectMetrics(mx, mfs)
32 + c.collectMetrics(mx, mfs)
33
34 return mx, nil
35 }
36
37 -func (v *VerneMQ) collectMetrics(mx map[string]int64, mfs prometheus.MetricFamilies) {
38 - nodes := v.getNodesStats(mfs)
37 +func (c *Collector) collectMetrics(mx map[string]int64, mfs prometheus.MetricFamilies) {
38 + nodes := c.getNodesStats(mfs)
39
40 for node, st := range nodes {
41 - if !v.seenNodes[node] {
42 - v.seenNodes[node] = true
43 - v.addNodeCharts(node, st)
41 + if !c.seenNodes[node] {
42 + c.seenNodes[node] = true
43 + c.addNodeCharts(node, st)
44 }
45
46 st.stats["open_sockets"] = st.stats[metricSocketOpen] - st.stats[metricSocketClose]
@@ -62,20 +62,20 @@ func (v *VerneMQ) collectMetrics(mx map[string]int64, mfs prometheus.MetricFamil
62 }
63 }
64
65 - for node := range v.seenNodes {
65 + for node := range c.seenNodes {
66 if _, ok := nodes[node]; !ok {
67 - delete(v.seenNodes, node)
68 - v.removeNodeCharts(node)
67 + delete(c.seenNodes, node)
68 + c.removeNodeCharts(node)
69 }
70 }
71
72 }
73
74 -func (v *VerneMQ) getNodesStats(mfs prometheus.MetricFamilies) map[string]*nodeStats {
74 +func (c *Collector) getNodesStats(mfs prometheus.MetricFamilies) map[string]*nodeStats {
75 nodes := make(map[string]*nodeStats)
76
77 for _, mf := range mfs {
78 - name, _ := strings.CutPrefix(mf.Name(), v.namespace.name+"_")
78 + name, _ := strings.CutPrefix(mf.Name(), c.namespace.name+"_")
79 if isSchedulerUtilizationMetric(name) {
80 continue
81 }
@@ -134,7 +134,7 @@ func (v *VerneMQ) getNodesStats(mfs prometheus.MetricFamilies) map[string]*nodeS
134 return nodes
135 }
136
137 -func (v *VerneMQ) getMetricNamespace(mfs prometheus.MetricFamilies) (string, error) {
137 +func (c *Collector) getMetricNamespace(mfs prometheus.MetricFamilies) (string, error) {
138 want := metricPUBLISHError
139 for _, mf := range mfs {
140 if strings.HasSuffix(mf.Name(), want) {
src/go/plugin/go.d/collector/vernemq/collector.go renamed
+19 -19
@@ -25,8 +25,8 @@ func init() {
25 })
26 }
27
28 -func New() *VerneMQ {
29 - return &VerneMQ{
28 +func New() *Collector {
29 + return &Collector{
30 Config: Config{
31 HTTPConfig: web.HTTPConfig{
32 RequestConfig: web.RequestConfig{
@@ -47,7 +47,7 @@ type Config struct {
47 web.HTTPConfig `yaml:",inline" json:""`
48 }
49
50 -type VerneMQ struct {
50 +type Collector struct {
51 module.Base
52 Config `yaml:",inline" json:""`
53
@@ -63,26 +63,26 @@ type VerneMQ struct {
63 seenNodes map[string]bool
64 }
65
66 -func (v *VerneMQ) Configuration() any {
67 - return v.Config
66 +func (c *Collector) Configuration() any {
67 + return c.Config
68 }
69
70 -func (v *VerneMQ) Init() error {
71 - if err := v.validateConfig(); err != nil {
70 +func (c *Collector) Init() error {
71 + if err := c.validateConfig(); err != nil {
72 return fmt.Errorf("config validation: %v", err)
73 }
74
75 - prom, err := v.initPrometheusClient()
75 + prom, err := c.initPrometheusClient()
76 if err != nil {
77 return fmt.Errorf("init prometheus client: %v", err)
78 }
79 - v.prom = prom
79 + c.prom = prom
80
81 return nil
82 }
83
84 -func (v *VerneMQ) Check() error {
85 - mx, err := v.collect()
84 +func (c *Collector) Check() error {
85 + mx, err := c.collect()
86 if err != nil {
87 return err
88 }
@@ -94,14 +94,14 @@ func (v *VerneMQ) Check() error {
94 return nil
95 }
96
97 -func (v *VerneMQ) Charts() *module.Charts {
98 - return v.charts
97 +func (c *Collector) Charts() *module.Charts {
98 + return c.charts
99 }
100
101 -func (v *VerneMQ) Collect() map[string]int64 {
102 - mx, err := v.collect()
101 +func (c *Collector) Collect() map[string]int64 {
102 + mx, err := c.collect()
103 if err != nil {
104 - v.Error(err)
104 + c.Error(err)
105 }
106
107 if len(mx) == 0 {
@@ -111,8 +111,8 @@ func (v *VerneMQ) Collect() map[string]int64 {
111 return mx
112 }
113
114 -func (v *VerneMQ) Cleanup() {
115 - if v.prom != nil && v.prom.HTTPClient() != nil {
116 - v.prom.HTTPClient().CloseIdleConnections()
114 +func (c *Collector) Cleanup() {
115 + if c.prom != nil && c.prom.HTTPClient() != nil {
116 + c.prom.HTTPClient().CloseIdleConnections()
117 }
118 }
src/go/plugin/go.d/collector/vernemq/collector_test.go renamed
+50 -50
@@ -34,11 +34,11 @@ func Test_testDataIsValid(t *testing.T) {
34 }
35 }
36
37 -func TestVerneMQ_ConfigurationSerialize(t *testing.T) {
38 - module.TestConfigurationSerialize(t, &VerneMQ{}, dataConfigJSON, dataConfigYAML)
37 +func TestCollector_ConfigurationSerialize(t *testing.T) {
38 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
39 }
40
41 -func TestVerneMQ_Init(t *testing.T) {
41 +func TestCollector_Init(t *testing.T) {
42 tests := map[string]struct {
43 wantFail bool
44 config Config
@@ -59,30 +59,30 @@ func TestVerneMQ_Init(t *testing.T) {
59
60 for name, test := range tests {
61 t.Run(name, func(t *testing.T) {
62 - vmq := New()
63 - vmq.Config = test.config
62 + collr := New()
63 + collr.Config = test.config
64
65 if test.wantFail {
66 - assert.Error(t, vmq.Init())
66 + assert.Error(t, collr.Init())
67 } else {
68 - assert.NoError(t, vmq.Init())
68 + assert.NoError(t, collr.Init())
69 }
70 })
71 }
72 }
73
74 -func TestVerneMQ_Charts(t *testing.T) {
74 +func TestCollector_Charts(t *testing.T) {
75 assert.NotNil(t, New().Charts())
76 }
77
78 -func TestVerneMQ_Cleanup(t *testing.T) {
78 +func TestCollector_Cleanup(t *testing.T) {
79 assert.NotPanics(t, New().Cleanup)
80 }
81
82 -func TestVerneMQ_Check(t *testing.T) {
82 +func TestCollector_Check(t *testing.T) {
83 tests := map[string]struct {
84 wantFail bool
85 - prepare func(t *testing.T) (vmq *VerneMQ, cleanup func())
85 + prepare func(t *testing.T) (collr *Collector, cleanup func())
86 }{
87 "success on valid response v1.10.1": {
88 wantFail: false,
@@ -112,21 +112,21 @@ func TestVerneMQ_Check(t *testing.T) {
112
113 for name, test := range tests {
114 t.Run(name, func(t *testing.T) {
115 - vmq, cleanup := test.prepare(t)
115 + collr, cleanup := test.prepare(t)
116 defer cleanup()
117
118 if test.wantFail {
119 - assert.Error(t, vmq.Check())
119 + assert.Error(t, collr.Check())
120 } else {
121 - assert.NoError(t, vmq.Check())
121 + assert.NoError(t, collr.Check())
122 }
123 })
124 }
125 }
126
127 -func TestVerneMQ_Collect(t *testing.T) {
127 +func TestCollector_Collect(t *testing.T) {
128 tests := map[string]struct {
129 - prepare func(t *testing.T) (vmq *VerneMQ, cleanup func())
129 + prepare func(t *testing.T) (collr *Collector, cleanup func())
130 wantNumOfCharts int
131 wantMetrics map[string]int64
132 }{
@@ -639,51 +639,51 @@ func TestVerneMQ_Collect(t *testing.T) {
639
640 for name, test := range tests {
641 t.Run(name, func(t *testing.T) {
642 - vmq, cleanup := test.prepare(t)
642 + collr, cleanup := test.prepare(t)
643 defer cleanup()
644
645 - mx := vmq.Collect()
645 + mx := collr.Collect()
646
647 require.Equal(t, test.wantMetrics, mx)
648
649 if len(test.wantMetrics) > 0 {
650 - assert.Equal(t, test.wantNumOfCharts, len(*vmq.Charts()), "want charts")
650 + assert.Equal(t, test.wantNumOfCharts, len(*collr.Charts()), "want charts")
651
652 - module.TestMetricsHasAllChartsDims(t, vmq.Charts(), mx)
652 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
653 }
654 })
655 }
656 }
657
658 -func caseOkVer201(t *testing.T) (*VerneMQ, func()) {
658 +func caseOkVer201(t *testing.T) (*Collector, func()) {
659 t.Helper()
660 srv := httptest.NewServer(http.HandlerFunc(
661 func(w http.ResponseWriter, r *http.Request) {
662 _, _ = w.Write(dataVer201Metrics)
663 }))
664
665 - vmq := New()
666 - vmq.URL = srv.URL
667 - require.NoError(t, vmq.Init())
665 + collr := New()
666 + collr.URL = srv.URL
667 + require.NoError(t, collr.Init())
668
669 - return vmq, srv.Close
669 + return collr, srv.Close
670 }
671
672 -func caseOkVer1101(t *testing.T) (*VerneMQ, func()) {
672 +func caseOkVer1101(t *testing.T) (*Collector, func()) {
673 t.Helper()
674 srv := httptest.NewServer(http.HandlerFunc(
675 func(w http.ResponseWriter, r *http.Request) {
676 _, _ = w.Write(dataVer1101Metrics)
677 }))
678
679 - vmq := New()
680 - vmq.URL = srv.URL
681 - require.NoError(t, vmq.Init())
679 + collr := New()
680 + collr.URL = srv.URL
681 + require.NoError(t, collr.Init())
682
683 - return vmq, srv.Close
683 + return collr, srv.Close
684 }
685
686 -func caseUnexpectedPrometheusMetrics(t *testing.T) (*VerneMQ, func()) {
686 +func caseUnexpectedPrometheusMetrics(t *testing.T) (*Collector, func()) {
687 data := `
688 # HELP wmi_os_process_memory_limix_bytes OperatingSystem.MaxProcessMemorySize
689 # TYPE wmi_os_process_memory_limix_bytes gauge
@@ -701,45 +701,45 @@ wmi_os_processes_limit 4.294967295e+09
701 _, _ = w.Write([]byte(data))
702 }))
703
704 - vmq := New()
705 - vmq.URL = srv.URL
706 - require.NoError(t, vmq.Init())
704 + collr := New()
705 + collr.URL = srv.URL
706 + require.NoError(t, collr.Init())
707
708 - return vmq, srv.Close
708 + return collr, srv.Close
709 }
710
711 -func caseInvalidDataResponse(t *testing.T) (*VerneMQ, func()) {
711 +func caseInvalidDataResponse(t *testing.T) (*Collector, func()) {
712 t.Helper()
713 srv := httptest.NewServer(http.HandlerFunc(
714 func(w http.ResponseWriter, r *http.Request) {
715 _, _ = w.Write([]byte("hello and\n goodbye"))
716 }))
717 - vmq := New()
718 - vmq.URL = srv.URL
719 - require.NoError(t, vmq.Init())
717 + collr := New()
718 + collr.URL = srv.URL
719 + require.NoError(t, collr.Init())
720
721 - return vmq, srv.Close
721 + return collr, srv.Close
722 }
723
724 -func caseConnectionRefused(t *testing.T) (*VerneMQ, func()) {
724 +func caseConnectionRefused(t *testing.T) (*Collector, func()) {
725 t.Helper()
726 - vmq := New()
727 - vmq.URL = "http://127.0.0.1:65001"
728 - require.NoError(t, vmq.Init())
726 + collr := New()
727 + collr.URL = "http://127.0.0.1:65001"
728 + require.NoError(t, collr.Init())
729
730 - return vmq, func() {}
730 + return collr, func() {}
731 }
732
733 -func case404(t *testing.T) (*VerneMQ, func()) {
733 +func case404(t *testing.T) (*Collector, func()) {
734 t.Helper()
735 srv := httptest.NewServer(http.HandlerFunc(
736 func(w http.ResponseWriter, r *http.Request) {
737 w.WriteHeader(http.StatusNotFound)
738 }))
739
740 - vmq := New()
741 - vmq.URL = srv.URL
742 - require.NoError(t, vmq.Init())
740 + collr := New()
741 + collr.URL = srv.URL
742 + require.NoError(t, collr.Init())
743
744 - return vmq, srv.Close
744 + return collr, srv.Close
745 }
src/go/plugin/go.d/collector/vernemq/init.go
+5 -5
@@ -9,18 +9,18 @@ import (
9 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/web"
10 )
11
12 -func (v *VerneMQ) validateConfig() error {
13 - if v.URL == "" {
12 +func (c *Collector) validateConfig() error {
13 + if c.URL == "" {
14 return errors.New("url is required but not set")
15 }
16 return nil
17 }
18
19 -func (v *VerneMQ) initPrometheusClient() (prometheus.Prometheus, error) {
20 - client, err := web.NewHTTPClient(v.ClientConfig)
19 +func (c *Collector) initPrometheusClient() (prometheus.Prometheus, error) {
20 + client, err := web.NewHTTPClient(c.ClientConfig)
21 if err != nil {
22 return nil, err
23 }
24
25 - return prometheus.New(client, v.RequestConfig), nil
25 + return prometheus.New(client, c.RequestConfig), nil
26 }
src/go/plugin/go.d/collector/vsphere/charts.go
+21 -21
@@ -388,44 +388,44 @@ var (
388
389 const failedUpdatesLimit = 10
390
391 -func (vs *VSphere) updateCharts() {
392 - for id, fails := range vs.discoveredHosts {
391 +func (c *Collector) updateCharts() {
392 + for id, fails := range c.discoveredHosts {
393 if fails >= failedUpdatesLimit {
394 - vs.removeFromCharts(id)
395 - delete(vs.charted, id)
396 - delete(vs.discoveredHosts, id)
394 + c.removeFromCharts(id)
395 + delete(c.charted, id)
396 + delete(c.discoveredHosts, id)
397 continue
398 }
399
400 - host := vs.resources.Hosts.Get(id)
401 - if host == nil || vs.charted[id] || fails != 0 {
400 + host := c.resources.Hosts.Get(id)
401 + if host == nil || c.charted[id] || fails != 0 {
402 continue
403 }
404
405 - vs.charted[id] = true
405 + c.charted[id] = true
406 charts := newHostCharts(host)
407 - if err := vs.Charts().Add(*charts...); err != nil {
408 - vs.Error(err)
407 + if err := c.Charts().Add(*charts...); err != nil {
408 + c.Error(err)
409 }
410 }
411
412 - for id, fails := range vs.discoveredVMs {
412 + for id, fails := range c.discoveredVMs {
413 if fails >= failedUpdatesLimit {
414 - vs.removeFromCharts(id)
415 - delete(vs.charted, id)
416 - delete(vs.discoveredVMs, id)
414 + c.removeFromCharts(id)
415 + delete(c.charted, id)
416 + delete(c.discoveredVMs, id)
417 continue
418 }
419
420 - vm := vs.resources.VMs.Get(id)
421 - if vm == nil || vs.charted[id] || fails != 0 {
420 + vm := c.resources.VMs.Get(id)
421 + if vm == nil || c.charted[id] || fails != 0 {
422 continue
423 }
424
425 - vs.charted[id] = true
425 + c.charted[id] = true
426 charts := newVMCHarts(vm)
427 - if err := vs.Charts().Add(*charts...); err != nil {
428 - vs.Error(err)
427 + if err := c.Charts().Add(*charts...); err != nil {
428 + c.Error(err)
429 }
430 }
431 }
@@ -482,8 +482,8 @@ func getHostClusterName(host *rs.Host) string {
482 return host.Hier.Cluster.Name
483 }
484
485 -func (vs *VSphere) removeFromCharts(prefix string) {
486 - for _, c := range *vs.Charts() {
485 +func (c *Collector) removeFromCharts(prefix string) {
486 + for _, c := range *c.Charts() {
487 if strings.HasPrefix(c.ID, prefix) {
488 c.MarkRemove()
489 c.MarkNotCreated()
src/go/plugin/go.d/collector/vsphere/collect.go
+26 -26
@@ -16,54 +16,54 @@ import (
16 // ManagedEntityStatus
17 var overallStatuses = []string{"green", "red", "yellow", "gray"}
18
19 -func (vs *VSphere) collect() (map[string]int64, error) {
20 - vs.collectionLock.Lock()
21 - defer vs.collectionLock.Unlock()
19 +func (c *Collector) collect() (map[string]int64, error) {
20 + c.collectionLock.Lock()
21 + defer c.collectionLock.Unlock()
22
23 - vs.Debug("starting collection process")
23 + c.Debug("starting collection process")
24 t := time.Now()
25 mx := make(map[string]int64)
26
27 - err := vs.collectHosts(mx)
27 + err := c.collectHosts(mx)
28 if err != nil {
29 return nil, err
30 }
31
32 - err = vs.collectVMs(mx)
32 + err = c.collectVMs(mx)
33 if err != nil {
34 return nil, err
35 }
36
37 - vs.updateCharts()
37 + c.updateCharts()
38
39 - vs.Debugf("metrics collected, process took %s", time.Since(t))
39 + c.Debugf("metrics collected, process took %s", time.Since(t))
40
41 return mx, nil
42 }
43
44 -func (vs *VSphere) collectHosts(mx map[string]int64) error {
45 - if len(vs.resources.Hosts) == 0 {
44 +func (c *Collector) collectHosts(mx map[string]int64) error {
45 + if len(c.resources.Hosts) == 0 {
46 return nil
47 }
48 // NOTE: returns unsorted if at least one types.PerfMetricId Instance is not ""
49 - metrics := vs.ScrapeHosts(vs.resources.Hosts)
49 + metrics := c.ScrapeHosts(c.resources.Hosts)
50 if len(metrics) == 0 {
51 return errors.New("failed to scrape hosts metrics")
52 }
53
54 - vs.collectHostsMetrics(mx, metrics)
54 + c.collectHostsMetrics(mx, metrics)
55
56 return nil
57 }
58
59 -func (vs *VSphere) collectHostsMetrics(mx map[string]int64, metrics []performance.EntityMetric) {
60 - for k := range vs.discoveredHosts {
61 - vs.discoveredHosts[k]++
59 +func (c *Collector) collectHostsMetrics(mx map[string]int64, metrics []performance.EntityMetric) {
60 + for k := range c.discoveredHosts {
61 + c.discoveredHosts[k]++
62 }
63
64 for _, metric := range metrics {
65 - if host := vs.resources.Hosts.Get(metric.Entity.Value); host != nil {
66 - vs.discoveredHosts[host.ID] = 0
65 + if host := c.resources.Hosts.Get(metric.Entity.Value); host != nil {
66 + c.discoveredHosts[host.ID] = 0
67 writeHostMetrics(mx, host, metric.Value)
68 }
69 }
@@ -83,30 +83,30 @@ func writeHostMetrics(mx map[string]int64, host *rs.Host, metrics []performance.
83 }
84 }
85
86 -func (vs *VSphere) collectVMs(mx map[string]int64) error {
87 - if len(vs.resources.VMs) == 0 {
86 +func (c *Collector) collectVMs(mx map[string]int64) error {
87 + if len(c.resources.VMs) == 0 {
88 return nil
89 }
90 // NOTE: returns unsorted if at least one types.PerfMetricId Instance is not ""
91 - ems := vs.ScrapeVMs(vs.resources.VMs)
91 + ems := c.ScrapeVMs(c.resources.VMs)
92 if len(ems) == 0 {
93 return errors.New("failed to scrape vms metrics")
94 }
95
96 - vs.collectVMsMetrics(mx, ems)
96 + c.collectVMsMetrics(mx, ems)
97
98 return nil
99 }
100
101 -func (vs *VSphere) collectVMsMetrics(mx map[string]int64, metrics []performance.EntityMetric) {
102 - for id := range vs.discoveredVMs {
103 - vs.discoveredVMs[id]++
101 +func (c *Collector) collectVMsMetrics(mx map[string]int64, metrics []performance.EntityMetric) {
102 + for id := range c.discoveredVMs {
103 + c.discoveredVMs[id]++
104 }
105
106 for _, metric := range metrics {
107 - if vm := vs.resources.VMs.Get(metric.Entity.Value); vm != nil {
107 + if vm := c.resources.VMs.Get(metric.Entity.Value); vm != nil {
108 writeVMMetrics(mx, vm, metric.Value)
109 - vs.discoveredVMs[vm.ID] = 0
109 + c.discoveredVMs[vm.ID] = 0
110 }
111 }
112 }
src/go/plugin/go.d/collector/vsphere/collector.go renamed
+21 -21
@@ -31,8 +31,8 @@ func init() {
31 })
32 }
33
34 -func New() *VSphere {
35 - return &VSphere{
34 +func New() *Collector {
35 + return &Collector{
36 Config: Config{
37 HTTPConfig: web.HTTPConfig{
38 ClientConfig: web.ClientConfig{
@@ -60,7 +60,7 @@ type Config struct {
60 }
61
62 type (
63 - VSphere struct {
63 + Collector struct {
64 module.Base
65 Config `yaml:",inline" json:""`
66
@@ -85,47 +85,47 @@ type (
85 }
86 )
87
88 -func (vs *VSphere) Configuration() any {
89 - return vs.Config
88 +func (c *Collector) Configuration() any {
89 + return c.Config
90 }
91
92 -func (vs *VSphere) Init() error {
93 - if err := vs.validateConfig(); err != nil {
92 +func (c *Collector) Init() error {
93 + if err := c.validateConfig(); err != nil {
94 return fmt.Errorf("error on validating config: %v", err)
95 }
96
97 - vsClient, err := vs.initClient()
97 + vsClient, err := c.initClient()
98 if err != nil {
99 return fmt.Errorf("error on creating vsphere client: %v", err)
100 }
101
102 - if err := vs.initDiscoverer(vsClient); err != nil {
102 + if err := c.initDiscoverer(vsClient); err != nil {
103 return fmt.Errorf("error on creating vsphere discoverer: %v", err)
104 }
105
106 - vs.initScraper(vsClient)
106 + c.initScraper(vsClient)
107
108 - if err := vs.discoverOnce(); err != nil {
108 + if err := c.discoverOnce(); err != nil {
109 return fmt.Errorf("error on discovering: %v", err)
110 }
111
112 - vs.goDiscovery()
112 + c.goDiscovery()
113
114 return nil
115 }
116
117 -func (vs *VSphere) Check() error {
117 +func (c *Collector) Check() error {
118 return nil
119 }
120
121 -func (vs *VSphere) Charts() *module.Charts {
122 - return vs.charts
121 +func (c *Collector) Charts() *module.Charts {
122 + return c.charts
123 }
124
125 -func (vs *VSphere) Collect() map[string]int64 {
126 - mx, err := vs.collect()
125 +func (c *Collector) Collect() map[string]int64 {
126 + mx, err := c.collect()
127 if err != nil {
128 - vs.Error(err)
128 + c.Error(err)
129 }
130
131 if len(mx) == 0 {
@@ -134,9 +134,9 @@ func (vs *VSphere) Collect() map[string]int64 {
134 return mx
135 }
136
137 -func (vs *VSphere) Cleanup() {
138 - if vs.discoveryTask == nil {
137 +func (c *Collector) Cleanup() {
138 + if c.discoveryTask == nil {
139 return
140 }
141 - vs.discoveryTask.stop()
141 + c.discoveryTask.stop()
142 }
src/go/plugin/go.d/collector/vsphere/collector_test.go renamed
+91 -91
@@ -34,106 +34,106 @@ func Test_testDataIsValid(t *testing.T) {
34 }
35 }
36
37 -func TestVSphere_ConfigurationSerialize(t *testing.T) {
38 - module.TestConfigurationSerialize(t, &VSphere{}, dataConfigJSON, dataConfigYAML)
37 +func TestCollector_ConfigurationSerialize(t *testing.T) {
38 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
39 }
40
41 -func TestVSphere_Init(t *testing.T) {
42 - vSphere, _, teardown := prepareVSphereSim(t)
41 +func TestCollector_Init(t *testing.T) {
42 + collr, _, teardown := prepareVSphereSim(t)
43 defer teardown()
44
45 - assert.NoError(t, vSphere.Init())
46 - assert.NotNil(t, vSphere.discoverer)
47 - assert.NotNil(t, vSphere.scraper)
48 - assert.NotNil(t, vSphere.resources)
49 - assert.NotNil(t, vSphere.discoveryTask)
50 - assert.True(t, vSphere.discoveryTask.isRunning())
45 + assert.NoError(t, collr.Init())
46 + assert.NotNil(t, collr.discoverer)
47 + assert.NotNil(t, collr.scraper)
48 + assert.NotNil(t, collr.resources)
49 + assert.NotNil(t, collr.discoveryTask)
50 + assert.True(t, collr.discoveryTask.isRunning())
51 }
52
53 -func TestVSphere_Init_ReturnsFalseIfURLNotSet(t *testing.T) {
54 - vSphere, _, teardown := prepareVSphereSim(t)
53 +func TestCollector_Init_ReturnsFalseIfURLNotSet(t *testing.T) {
54 + collr, _, teardown := prepareVSphereSim(t)
55 defer teardown()
56 - vSphere.URL = ""
56 + collr.URL = ""
57
58 - assert.Error(t, vSphere.Init())
58 + assert.Error(t, collr.Init())
59 }
60
61 -func TestVSphere_Init_ReturnsFalseIfUsernameNotSet(t *testing.T) {
62 - vSphere, _, teardown := prepareVSphereSim(t)
61 +func TestCollector_Init_ReturnsFalseIfUsernameNotSet(t *testing.T) {
62 + collr, _, teardown := prepareVSphereSim(t)
63 defer teardown()
64 - vSphere.Username = ""
64 + collr.Username = ""
65
66 - assert.Error(t, vSphere.Init())
66 + assert.Error(t, collr.Init())
67 }
68
69 -func TestVSphere_Init_ReturnsFalseIfPasswordNotSet(t *testing.T) {
70 - vSphere, _, teardown := prepareVSphereSim(t)
69 +func TestCollector_Init_ReturnsFalseIfPasswordNotSet(t *testing.T) {
70 + collr, _, teardown := prepareVSphereSim(t)
71 defer teardown()
72 - vSphere.Password = ""
72 + collr.Password = ""
73
74 - assert.Error(t, vSphere.Init())
74 + assert.Error(t, collr.Init())
75 }
76
77 -func TestVSphere_Init_ReturnsFalseIfClientWrongTLSCA(t *testing.T) {
78 - vSphere, _, teardown := prepareVSphereSim(t)
77 +func TestCollector_Init_ReturnsFalseIfClientWrongTLSCA(t *testing.T) {
78 + collr, _, teardown := prepareVSphereSim(t)
79 defer teardown()
80 - vSphere.ClientConfig.TLSConfig.TLSCA = "testdata/tls"
80 + collr.ClientConfig.TLSConfig.TLSCA = "testdata/tls"
81
82 - assert.Error(t, vSphere.Init())
82 + assert.Error(t, collr.Init())
83 }
84
85 -func TestVSphere_Init_ReturnsFalseIfConnectionRefused(t *testing.T) {
86 - vSphere, _, teardown := prepareVSphereSim(t)
85 +func TestCollector_Init_ReturnsFalseIfConnectionRefused(t *testing.T) {
86 + collr, _, teardown := prepareVSphereSim(t)
87 defer teardown()
88 - vSphere.URL = "http://127.0.0.1:32001"
88 + collr.URL = "http://127.0.0.1:32001"
89
90 - assert.Error(t, vSphere.Init())
90 + assert.Error(t, collr.Init())
91 }
92
93 -func TestVSphere_Init_ReturnsFalseIfInvalidHostVMIncludeFormat(t *testing.T) {
94 - vSphere, _, teardown := prepareVSphereSim(t)
93 +func TestCollector_Init_ReturnsFalseIfInvalidHostVMIncludeFormat(t *testing.T) {
94 + collr, _, teardown := prepareVSphereSim(t)
95 defer teardown()
96
97 - vSphere.HostsInclude = match.HostIncludes{"invalid"}
98 - assert.Error(t, vSphere.Init())
97 + collr.HostsInclude = match.HostIncludes{"invalid"}
98 + assert.Error(t, collr.Init())
99
100 - vSphere.HostsInclude = vSphere.HostsInclude[:0]
100 + collr.HostsInclude = collr.HostsInclude[:0]
101
102 - vSphere.VMsInclude = match.VMIncludes{"invalid"}
103 - assert.Error(t, vSphere.Init())
102 + collr.VMsInclude = match.VMIncludes{"invalid"}
103 + assert.Error(t, collr.Init())
104 }
105
106 -func TestVSphere_Check(t *testing.T) {
106 +func TestCollector_Check(t *testing.T) {
107 assert.NoError(t, New().Check())
108 }
109
110 -func TestVSphere_Charts(t *testing.T) {
110 +func TestCollector_Charts(t *testing.T) {
111 assert.NotNil(t, New().Charts())
112 }
113
114 -func TestVSphere_Cleanup(t *testing.T) {
115 - vSphere, _, teardown := prepareVSphereSim(t)
114 +func TestCollector_Cleanup(t *testing.T) {
115 + collr, _, teardown := prepareVSphereSim(t)
116 defer teardown()
117
118 - require.NoError(t, vSphere.Init())
118 + require.NoError(t, collr.Init())
119
120 - vSphere.Cleanup()
120 + collr.Cleanup()
121 time.Sleep(time.Second)
122 - assert.True(t, vSphere.discoveryTask.isStopped())
123 - assert.False(t, vSphere.discoveryTask.isRunning())
122 + assert.True(t, collr.discoveryTask.isStopped())
123 + assert.False(t, collr.discoveryTask.isRunning())
124 }
125
126 -func TestVSphere_Cleanup_NotPanicsIfNotInitialized(t *testing.T) {
126 +func TestCollector_Cleanup_NotPanicsIfNotInitialized(t *testing.T) {
127 assert.NotPanics(t, New().Cleanup)
128 }
129
130 -func TestVSphere_Collect(t *testing.T) {
131 - vSphere, model, teardown := prepareVSphereSim(t)
130 +func TestCollector_Collect(t *testing.T) {
131 + collr, model, teardown := prepareVSphereSim(t)
132 defer teardown()
133
134 - require.NoError(t, vSphere.Init())
134 + require.NoError(t, collr.Init())
135
136 - vSphere.scraper = mockScraper{vSphere.scraper}
136 + collr.scraper = mockScraper{collr.scraper}
137
138 expected := map[string]int64{
139 "host-22_cpu.usage.average": 100,
@@ -330,40 +330,40 @@ func TestVSphere_Collect(t *testing.T) {
330 "vm-72_sys.uptime.latest": 200,
331 }
332
333 - mx := vSphere.Collect()
333 + mx := collr.Collect()
334
335 require.Equal(t, expected, mx)
336
337 count := model.Count()
338 - assert.Len(t, vSphere.discoveredHosts, count.Host)
339 - assert.Len(t, vSphere.discoveredVMs, count.Machine)
340 - assert.Len(t, vSphere.charted, count.Host+count.Machine)
338 + assert.Len(t, collr.discoveredHosts, count.Host)
339 + assert.Len(t, collr.discoveredVMs, count.Machine)
340 + assert.Len(t, collr.charted, count.Host+count.Machine)
341
342 - assert.Len(t, *vSphere.Charts(), count.Host*len(hostChartsTmpl)+count.Machine*len(vmChartsTmpl))
343 - module.TestMetricsHasAllChartsDims(t, vSphere.Charts(), mx)
342 + assert.Len(t, *collr.Charts(), count.Host*len(hostChartsTmpl)+count.Machine*len(vmChartsTmpl))
343 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
344 }
345
346 -func TestVSphere_Collect_RemoveHostsVMsInRuntime(t *testing.T) {
347 - vSphere, _, teardown := prepareVSphereSim(t)
346 +func TestCollector_Collect_RemoveHostsVMsInRuntime(t *testing.T) {
347 + collr, _, teardown := prepareVSphereSim(t)
348 defer teardown()
349
350 - require.NoError(t, vSphere.Init())
351 - require.NoError(t, vSphere.Check())
350 + require.NoError(t, collr.Init())
351 + require.NoError(t, collr.Check())
352
353 okHostID := "host-58"
354 okVMID := "vm-63"
355 - vSphere.discoverer.(*discover.Discoverer).HostMatcher = mockHostMatcher{okHostID}
356 - vSphere.discoverer.(*discover.Discoverer).VMMatcher = mockVMMatcher{okVMID}
355 + collr.discoverer.(*discover.Discoverer).HostMatcher = mockHostMatcher{okHostID}
356 + collr.discoverer.(*discover.Discoverer).VMMatcher = mockVMMatcher{okVMID}
357
358 - require.NoError(t, vSphere.discoverOnce())
358 + require.NoError(t, collr.discoverOnce())
359
360 numOfRuns := 5
361 for i := 0; i < numOfRuns; i++ {
362 - vSphere.Collect()
362 + collr.Collect()
363 }
364
365 - host := vSphere.resources.Hosts.Get(okHostID)
366 - for k, v := range vSphere.discoveredHosts {
365 + host := collr.resources.Hosts.Get(okHostID)
366 + for k, v := range collr.discoveredHosts {
367 if k == host.ID {
368 assert.Equal(t, 0, v)
369 } else {
@@ -371,8 +371,8 @@ func TestVSphere_Collect_RemoveHostsVMsInRuntime(t *testing.T) {
371 }
372 }
373
374 - vm := vSphere.resources.VMs.Get(okVMID)
375 - for id, fails := range vSphere.discoveredVMs {
374 + vm := collr.resources.VMs.Get(okVMID)
375 + for id, fails := range collr.discoveredVMs {
376 if id == vm.ID {
377 assert.Equal(t, 0, fails)
378 } else {
@@ -382,14 +382,14 @@ func TestVSphere_Collect_RemoveHostsVMsInRuntime(t *testing.T) {
382 }
383
384 for i := numOfRuns; i < failedUpdatesLimit; i++ {
385 - vSphere.Collect()
385 + collr.Collect()
386 }
387
388 - assert.Len(t, vSphere.discoveredHosts, 1)
389 - assert.Len(t, vSphere.discoveredVMs, 1)
390 - assert.Len(t, vSphere.charted, 2)
388 + assert.Len(t, collr.discoveredHosts, 1)
389 + assert.Len(t, collr.discoveredVMs, 1)
390 + assert.Len(t, collr.charted, 2)
391
392 - for _, c := range *vSphere.Charts() {
392 + for _, c := range *collr.Charts() {
393 if strings.HasPrefix(c.ID, okHostID) || strings.HasPrefix(c.ID, okVMID) {
394 assert.False(t, c.Obsolete)
395 } else {
@@ -398,40 +398,40 @@ func TestVSphere_Collect_RemoveHostsVMsInRuntime(t *testing.T) {
398 }
399 }
400
401 -func TestVSphere_Collect_Run(t *testing.T) {
402 - vSphere, model, teardown := prepareVSphereSim(t)
401 +func TestCollector_Collect_Run(t *testing.T) {
402 + collr, model, teardown := prepareVSphereSim(t)
403 defer teardown()
404
405 - vSphere.DiscoveryInterval = confopt.Duration(time.Second * 2)
406 - require.NoError(t, vSphere.Init())
407 - require.NoError(t, vSphere.Check())
405 + collr.DiscoveryInterval = confopt.Duration(time.Second * 2)
406 + require.NoError(t, collr.Init())
407 + require.NoError(t, collr.Check())
408
409 runs := 20
410 for i := 0; i < runs; i++ {
411 - assert.True(t, len(vSphere.Collect()) > 0)
411 + assert.True(t, len(collr.Collect()) > 0)
412 if i < 6 {
413 time.Sleep(time.Second)
414 }
415 }
416
417 count := model.Count()
418 - assert.Len(t, vSphere.discoveredHosts, count.Host)
419 - assert.Len(t, vSphere.discoveredVMs, count.Machine)
420 - assert.Len(t, vSphere.charted, count.Host+count.Machine)
421 - assert.Len(t, *vSphere.charts, count.Host*len(hostChartsTmpl)+count.Machine*len(vmChartsTmpl))
418 + assert.Len(t, collr.discoveredHosts, count.Host)
419 + assert.Len(t, collr.discoveredVMs, count.Machine)
420 + assert.Len(t, collr.charted, count.Host+count.Machine)
421 + assert.Len(t, *collr.charts, count.Host*len(hostChartsTmpl)+count.Machine*len(vmChartsTmpl))
422 }
423
424 -func prepareVSphereSim(t *testing.T) (vSphere *VSphere, model *simulator.Model, teardown func()) {
424 +func prepareVSphereSim(t *testing.T) (collr *Collector, model *simulator.Model, teardown func()) {
425 model, srv := createSim(t)
426 - vSphere = New()
427 - teardown = func() { model.Remove(); srv.Close(); vSphere.Cleanup() }
426 + collr = New()
427 + teardown = func() { model.Remove(); srv.Close(); collr.Cleanup() }
428
429 - vSphere.Username = "administrator"
430 - vSphere.Password = "password"
431 - vSphere.URL = srv.URL.String()
432 - vSphere.TLSConfig.InsecureSkipVerify = true
429 + collr.Username = "administrator"
430 + collr.Password = "password"
431 + collr.URL = srv.URL.String()
432 + collr.TLSConfig.InsecureSkipVerify = true
433
434 - return vSphere, model, teardown
434 + return collr, model, teardown
435 }
436
437 func createSim(t *testing.T) (*simulator.Model, *simulator.Server) {
src/go/plugin/go.d/collector/vsphere/discover.go
+12 -12
@@ -2,30 +2,30 @@
2
3 package vsphere
4
5 -func (vs *VSphere) goDiscovery() {
6 - if vs.discoveryTask != nil {
7 - vs.discoveryTask.stop()
5 +func (c *Collector) goDiscovery() {
6 + if c.discoveryTask != nil {
7 + c.discoveryTask.stop()
8 }
9 - vs.Infof("starting discovery process, will do discovery every %s", vs.DiscoveryInterval)
9 + c.Infof("starting discovery process, will do discovery every %s", c.DiscoveryInterval)
10
11 job := func() {
12 - err := vs.discoverOnce()
12 + err := c.discoverOnce()
13 if err != nil {
14 - vs.Errorf("error on discovering : %v", err)
14 + c.Errorf("error on discovering : %v", err)
15 }
16 }
17 - vs.discoveryTask = newTask(job, vs.DiscoveryInterval.Duration())
17 + c.discoveryTask = newTask(job, c.DiscoveryInterval.Duration())
18 }
19
20 -func (vs *VSphere) discoverOnce() error {
21 - res, err := vs.Discover()
20 +func (c *Collector) discoverOnce() error {
21 + res, err := c.Discover()
22 if err != nil {
23 return err
24 }
25
26 - vs.collectionLock.Lock()
27 - vs.resources = res
28 - vs.collectionLock.Unlock()
26 + c.collectionLock.Lock()
27 + c.resources = res
28 + c.collectionLock.Unlock()
29
30 return nil
31 }
src/go/plugin/go.d/collector/vsphere/init.go
+21 -21
@@ -10,44 +10,44 @@ import (
10 "github.com/netdata/netdata/go/plugins/plugin/go.d/collector/vsphere/scrape"
11 )
12
13 -func (vs *VSphere) validateConfig() error {
13 +func (c *Collector) validateConfig() error {
14 const minRecommendedUpdateEvery = 20
15
16 - if vs.URL == "" {
16 + if c.URL == "" {
17 return errors.New("URL is not set")
18 }
19 - if vs.Username == "" || vs.Password == "" {
19 + if c.Username == "" || c.Password == "" {
20 return errors.New("username or password not set")
21 }
22 - if vs.UpdateEvery < minRecommendedUpdateEvery {
23 - vs.Warningf("update_every is to low, minimum recommended is %d", minRecommendedUpdateEvery)
22 + if c.UpdateEvery < minRecommendedUpdateEvery {
23 + c.Warningf("update_every is to low, minimum recommended is %d", minRecommendedUpdateEvery)
24 }
25 return nil
26 }
27
28 -func (vs *VSphere) initClient() (*client.Client, error) {
28 +func (c *Collector) initClient() (*client.Client, error) {
29 config := client.Config{
30 - URL: vs.URL,
31 - User: vs.Username,
32 - Password: vs.Password,
33 - Timeout: vs.Timeout.Duration(),
34 - TLSConfig: vs.ClientConfig.TLSConfig,
30 + URL: c.URL,
31 + User: c.Username,
32 + Password: c.Password,
33 + Timeout: c.Timeout.Duration(),
34 + TLSConfig: c.ClientConfig.TLSConfig,
35 }
36 return client.New(config)
37 }
38
39 -func (vs *VSphere) initDiscoverer(c *client.Client) error {
40 - d := discover.New(c)
41 - d.Logger = vs.Logger
39 +func (c *Collector) initDiscoverer(cli *client.Client) error {
40 + d := discover.New(cli)
41 + d.Logger = c.Logger
42
43 - hm, err := vs.HostsInclude.Parse()
43 + hm, err := c.HostsInclude.Parse()
44 if err != nil {
45 return err
46 }
47 if hm != nil {
48 d.HostMatcher = hm
49 }
50 - vmm, err := vs.VMsInclude.Parse()
50 + vmm, err := c.VMsInclude.Parse()
51 if err != nil {
52 return err
53 }
@@ -55,12 +55,12 @@ func (vs *VSphere) initDiscoverer(c *client.Client) error {
55 d.VMMatcher = vmm
56 }
57
58 - vs.discoverer = d
58 + c.discoverer = d
59 return nil
60 }
61
62 -func (vs *VSphere) initScraper(c *client.Client) {
63 - ms := scrape.New(c)
64 - ms.Logger = vs.Logger
65 - vs.scraper = ms
62 +func (c *Collector) initScraper(cli *client.Client) {
63 + ms := scrape.New(cli)
64 + ms.Logger = c.Logger
65 + c.scraper = ms
66 }
src/go/plugin/go.d/collector/w1sensor/charts.go
+5 -5
@@ -30,7 +30,7 @@ var (
30 }
31 )
32
33 -func (w *W1sensor) addSensorChart(id string) {
33 +func (c *Collector) addSensorChart(id string) {
34 chart := sensorChartTmpl.Copy()
35
36 chart.ID = fmt.Sprintf(chart.ID, id)
@@ -42,15 +42,15 @@ func (w *W1sensor) addSensorChart(id string) {
42 dim.ID = fmt.Sprintf(dim.ID, id)
43 }
44
45 - if err := w.Charts().Add(chart); err != nil {
46 - w.Warning(err)
45 + if err := c.Charts().Add(chart); err != nil {
46 + c.Warning(err)
47 }
48
49 }
50
51 -func (w *W1sensor) removeSensorChart(id string) {
51 +func (c *Collector) removeSensorChart(id string) {
52 px := fmt.Sprintf("w1sensor_%s", id)
53 - for _, chart := range *w.Charts() {
53 + for _, chart := range *c.Charts() {
54 if strings.HasPrefix(chart.ID, px) {
55 chart.MarkRemove()
56 chart.MarkNotCreated()
src/go/plugin/go.d/collector/w1sensor/collect.go
+10 -10
@@ -17,8 +17,8 @@ import (
17
18 const precision = 10
19
20 -func (w *W1sensor) collect() (map[string]int64, error) {
21 - des, err := os.ReadDir(w.SensorsPath)
20 +func (c *Collector) collect() (map[string]int64, error) {
21 + des, err := os.ReadDir(c.SensorsPath)
22 if err != nil {
23 return nil, err
24 }
@@ -31,34 +31,34 @@ func (w *W1sensor) collect() (map[string]int64, error) {
31 continue
32 }
33 if !isW1sensorDir(de.Name()) {
34 - w.Debugf("'%s' is not a w1sensor directory, skipping it", filepath.Join(w.SensorsPath, de.Name()))
34 + c.Debugf("'%s' is not a w1sensor directory, skipping it", filepath.Join(c.SensorsPath, de.Name()))
35 continue
36 }
37
38 - filename := filepath.Join(w.SensorsPath, de.Name(), "w1_slave")
38 + filename := filepath.Join(c.SensorsPath, de.Name(), "w1_slave")
39
40 temp, err := readW1sensorTemperature(filename)
41 if err != nil {
42 if errors.Is(err, fs.ErrNotExist) {
43 - w.Debugf("'%s' doesn't have 'w1_slave', skipping it", filepath.Join(w.SensorsPath, de.Name()))
43 + c.Debugf("'%s' doesn't have 'w1_slave', skipping it", filepath.Join(c.SensorsPath, de.Name()))
44 continue
45 }
46 return nil, fmt.Errorf("failed to read temperature from '%s': %w", filename, err)
47 }
48
49 seen[de.Name()] = true
50 - if !w.seenSensors[de.Name()] {
51 - w.addSensorChart(de.Name())
50 + if !c.seenSensors[de.Name()] {
51 + c.addSensorChart(de.Name())
52
53 }
54
55 mx[fmt.Sprintf("w1sensor_%s_temperature", de.Name())] = temp
56 }
57
58 - for id := range w.seenSensors {
58 + for id := range c.seenSensors {
59 if !seen[id] {
60 - delete(w.seenSensors, id)
61 - w.removeSensorChart(id)
60 + delete(c.seenSensors, id)
61 + c.removeSensorChart(id)
62 }
63 }
64
src/go/plugin/go.d/collector/w1sensor/collector.go renamed
+20 -22
@@ -25,8 +25,8 @@ func init() {
25 })
26 }
27
28 -func New() *W1sensor {
29 - return &W1sensor{
28 +func New() *Collector {
29 + return &Collector{
30 Config: Config{
31 SensorsPath: "/sys/bus/w1/devices",
32 },
@@ -40,31 +40,29 @@ type Config struct {
40 SensorsPath string `yaml:"sensors_path,omitempty" json:"sensors_path"`
41 }
42
43 -type (
44 - W1sensor struct {
45 - module.Base
46 - Config `yaml:",inline" json:""`
43 +type Collector struct {
44 + module.Base
45 + Config `yaml:",inline" json:""`
46
48 - charts *module.Charts
47 + charts *module.Charts
48
50 - seenSensors map[string]bool
51 - }
52 -)
49 + seenSensors map[string]bool
50 +}
51
54 -func (w *W1sensor) Configuration() any {
55 - return w.Config
52 +func (c *Collector) Configuration() any {
53 + return c.Config
54 }
55
58 -func (w *W1sensor) Init() error {
59 - if w.SensorsPath == "" {
56 +func (c *Collector) Init() error {
57 + if c.SensorsPath == "" {
58 return errors.New("config: no sensors path specified")
59 }
60
61 return nil
62 }
63
66 -func (w *W1sensor) Check() error {
67 - mx, err := w.collect()
64 +func (c *Collector) Check() error {
65 + mx, err := c.collect()
66 if err != nil {
67 return err
68 }
@@ -76,14 +74,14 @@ func (w *W1sensor) Check() error {
74 return nil
75 }
76
79 -func (w *W1sensor) Charts() *module.Charts {
80 - return w.charts
77 +func (c *Collector) Charts() *module.Charts {
78 + return c.charts
79 }
80
83 -func (w *W1sensor) Collect() map[string]int64 {
84 - mx, err := w.collect()
81 +func (c *Collector) Collect() map[string]int64 {
82 + mx, err := c.collect()
83 if err != nil {
86 - w.Error(err)
84 + c.Error(err)
85 }
86
87 if len(mx) == 0 {
@@ -93,4 +91,4 @@ func (w *W1sensor) Collect() map[string]int64 {
91 return mx
92 }
93
96 -func (w *W1sensor) Cleanup() {}
94 +func (c *Collector) Cleanup() {}
src/go/plugin/go.d/collector/w1sensor/collector_test.go renamed
+38 -38
@@ -28,11 +28,11 @@ func Test_testDataIsValid(t *testing.T) {
28 }
29 }
30
31 -func TestW1sensor_Configuration(t *testing.T) {
32 - module.TestConfigurationSerialize(t, &W1sensor{}, dataConfigJSON, dataConfigYAML)
31 +func TestCollector_Configuration(t *testing.T) {
32 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
33 }
34
35 -func TestW1sensor_Init(t *testing.T) {
35 +func TestCollector_Init(t *testing.T) {
36 tests := map[string]struct {
37 config Config
38 wantFail bool
@@ -47,13 +47,13 @@ func TestW1sensor_Init(t *testing.T) {
47
48 for name, test := range tests {
49 t.Run(name, func(t *testing.T) {
50 - w1 := New()
51 - w1.Config = test.config
50 + collr := New()
51 + collr.Config = test.config
52
53 if test.wantFail {
54 - assert.Error(t, w1.Init())
54 + assert.Error(t, collr.Init())
55 } else {
56 - assert.NoError(t, w1.Init())
56 + assert.NoError(t, collr.Init())
57 }
58 })
59 }
@@ -61,45 +61,45 @@ func TestW1sensor_Init(t *testing.T) {
61
62 func TestAP_Cleanup(t *testing.T) {
63 tests := map[string]struct {
64 - prepare func() *W1sensor
64 + prepare func() *Collector
65 }{
66 "not initialized exec": {
67 - prepare: func() *W1sensor {
67 + prepare: func() *Collector {
68 return New()
69 },
70 },
71 "after check": {
72 - prepare: func() *W1sensor {
73 - w1 := prepareCaseOk()
74 - _ = w1.Check()
75 - return w1
72 + prepare: func() *Collector {
73 + collr := prepareCaseOk()
74 + _ = collr.Check()
75 + return collr
76 },
77 },
78 "after collect": {
79 - prepare: func() *W1sensor {
80 - w1 := prepareCaseOk()
81 - _ = w1.Collect()
82 - return w1
79 + prepare: func() *Collector {
80 + collr := prepareCaseOk()
81 + _ = collr.Collect()
82 + return collr
83 },
84 },
85 }
86
87 for name, test := range tests {
88 t.Run(name, func(t *testing.T) {
89 - w1 := test.prepare()
89 + collr := test.prepare()
90
91 - assert.NotPanics(t, w1.Cleanup)
91 + assert.NotPanics(t, collr.Cleanup)
92 })
93 }
94 }
95
96 -func TestW1sensor_Charts(t *testing.T) {
96 +func TestCollector_Charts(t *testing.T) {
97 assert.NotNil(t, New().Charts())
98 }
99
100 -func TestW1sensor_Check(t *testing.T) {
100 +func TestCollector_Check(t *testing.T) {
101 tests := map[string]struct {
102 - prepareMock func() *W1sensor
102 + prepareMock func() *Collector
103 wantFail bool
104 }{
105 "success case": {
@@ -114,12 +114,12 @@ func TestW1sensor_Check(t *testing.T) {
114
115 for name, test := range tests {
116 t.Run(name, func(t *testing.T) {
117 - w1 := test.prepareMock()
117 + collr := test.prepareMock()
118
119 if test.wantFail {
120 - assert.Error(t, w1.Check())
120 + assert.Error(t, collr.Check())
121 } else {
122 - assert.NoError(t, w1.Check())
122 + assert.NoError(t, collr.Check())
123 }
124 })
125 }
@@ -127,7 +127,7 @@ func TestW1sensor_Check(t *testing.T) {
127
128 func TestW1Sensors_Collect(t *testing.T) {
129 tests := map[string]struct {
130 - prepareMock func() *W1sensor
130 + prepareMock func() *Collector
131 wantMetrics map[string]int64
132 wantCharts int
133 }{
@@ -149,27 +149,27 @@ func TestW1Sensors_Collect(t *testing.T) {
149
150 for name, test := range tests {
151 t.Run(name, func(t *testing.T) {
152 - w1 := test.prepareMock()
152 + collr := test.prepareMock()
153
154 - mx := w1.Collect()
154 + mx := collr.Collect()
155
156 assert.Equal(t, test.wantMetrics, mx)
157
158 - assert.Equal(t, test.wantCharts, len(*w1.Charts()), "wantCharts")
158 + assert.Equal(t, test.wantCharts, len(*collr.Charts()), "wantCharts")
159
160 - module.TestMetricsHasAllChartsDims(t, w1.Charts(), mx)
160 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
161 })
162 }
163 }
164
165 -func prepareCaseOk() *W1sensor {
166 - w1 := New()
167 - w1.SensorsPath = "testdata/devices"
168 - return w1
165 +func prepareCaseOk() *Collector {
166 + collr := New()
167 + collr.SensorsPath = "testdata/devices"
168 + return collr
169 }
170
171 -func prepareCaseNoSensorsDir() *W1sensor {
172 - w1 := New()
173 - w1.SensorsPath = "testdata/devices!"
174 - return w1
171 +func prepareCaseNoSensorsDir() *Collector {
172 + collr := New()
173 + collr.SensorsPath = "testdata/devices!"
174 + return collr
175 }
src/go/plugin/go.d/collector/weblog/charts.go
+15 -15
@@ -641,11 +641,11 @@ func newCustomTimeFieldHistChart(f customTimeField) (*Chart, error) {
641 return chart, nil
642 }
643
644 -func (w *WebLog) createCharts(line *logLine) error {
644 +func (c *Collector) createCharts(line *logLine) error {
645 if line.empty() {
646 return errors.New("empty line")
647 }
648 - w.charts = nil
648 + c.charts = nil
649 // Following charts are created during runtime:
650 // - reqBySSLProto, reqBySSLCipherSuite - it is likely line has no SSL stuff at this moment
651 charts := &Charts{
@@ -673,12 +673,12 @@ func (w *WebLog) createCharts(line *logLine) error {
673 }
674 }
675 if line.hasReqMethod() {
676 - if err := addMethodCharts(charts, w.URLPatterns); err != nil {
676 + if err := addMethodCharts(charts, c.URLPatterns); err != nil {
677 return err
678 }
679 }
680 if line.hasReqURL() {
681 - if err := addURLCharts(charts, w.URLPatterns); err != nil {
681 + if err := addURLCharts(charts, c.URLPatterns); err != nil {
682 return err
683 }
684 }
@@ -688,44 +688,44 @@ func (w *WebLog) createCharts(line *logLine) error {
688 }
689 }
690 if line.hasRespCode() {
691 - if err := addRespCodesCharts(charts, w.GroupRespCodes); err != nil {
691 + if err := addRespCodesCharts(charts, c.GroupRespCodes); err != nil {
692 return err
693 }
694 }
695 if line.hasReqSize() || line.hasRespSize() {
696 - if err := addBandwidthCharts(charts, w.URLPatterns); err != nil {
696 + if err := addBandwidthCharts(charts, c.URLPatterns); err != nil {
697 return err
698 }
699 }
700 if line.hasReqProcTime() {
701 - if err := addReqProcTimeCharts(charts, w.Histogram, w.URLPatterns); err != nil {
701 + if err := addReqProcTimeCharts(charts, c.Histogram, c.URLPatterns); err != nil {
702 return err
703 }
704 }
705 if line.hasUpsRespTime() {
706 - if err := addUpstreamRespTimeCharts(charts, w.Histogram); err != nil {
706 + if err := addUpstreamRespTimeCharts(charts, c.Histogram); err != nil {
707 return err
708 }
709 }
710 if line.hasCustomFields() {
711 - if len(w.CustomFields) > 0 {
712 - if err := addCustomFieldsCharts(charts, w.CustomFields); err != nil {
711 + if len(c.CustomFields) > 0 {
712 + if err := addCustomFieldsCharts(charts, c.CustomFields); err != nil {
713 return err
714 }
715 }
716 - if len(w.CustomTimeFields) > 0 {
717 - if err := addCustomTimeFieldsCharts(charts, w.CustomTimeFields); err != nil {
716 + if len(c.CustomTimeFields) > 0 {
717 + if err := addCustomTimeFieldsCharts(charts, c.CustomTimeFields); err != nil {
718 return err
719 }
720 }
721 - if len(w.CustomNumericFields) > 0 {
722 - if err := addCustomNumericFieldsCharts(charts, w.CustomNumericFields); err != nil {
721 + if len(c.CustomNumericFields) > 0 {
722 + if err := addCustomNumericFieldsCharts(charts, c.CustomNumericFields); err != nil {
723 return err
724 }
725 }
726 }
727
728 - w.charts = charts
728 + c.charts = charts
729
730 return nil
731 }
src/go/plugin/go.d/collector/weblog/collect.go
+187 -187
@@ -16,42 +16,42 @@ import (
16 "github.com/netdata/netdata/go/plugins/plugin/go.d/agent/module"
17 )
18
19 -func (w *WebLog) logPanicStackIfAny() {
19 +func (c *Collector) logPanicStackIfAny() {
20 err := recover()
21 if err == nil {
22 return
23 }
24 - w.Errorf("[ERROR] %s\n", err)
24 + c.Errorf("[ERROR] %s\n", err)
25 for depth := 0; ; depth++ {
26 _, file, line, ok := runtime.Caller(depth)
27 if !ok {
28 break
29 }
30 - w.Errorf("======> %d: %v:%d", depth, file, line)
30 + c.Errorf("======> %d: %v:%d", depth, file, line)
31 }
32 panic(err)
33 }
34
35 -func (w *WebLog) collect() (map[string]int64, error) {
36 - defer w.logPanicStackIfAny()
37 - w.mx.reset()
35 +func (c *Collector) collect() (map[string]int64, error) {
36 + defer c.logPanicStackIfAny()
37 + c.mx.reset()
38
39 var mx map[string]int64
40
41 - n, err := w.collectLogLines()
41 + n, err := c.collectLogLines()
42
43 if n > 0 || err == nil {
44 - mx = stm.ToMap(w.mx)
44 + mx = stm.ToMap(c.mx)
45 }
46 return mx, err
47 }
48
49 -func (w *WebLog) collectLogLines() (int, error) {
49 +func (c *Collector) collectLogLines() (int, error) {
50 logOnce := true
51 var n int
52 for {
53 - w.line.reset()
54 - err := w.parser.ReadLine(w.line)
53 + c.line.reset()
54 + err := c.parser.ReadLine(c.line)
55 if err != nil {
56 if err == io.EOF {
57 return n, nil
@@ -61,278 +61,278 @@ func (w *WebLog) collectLogLines() (int, error) {
61 }
62 n++
63 if logOnce {
64 - w.Infof("unmatched line: %v (parser: %s)", err, w.parser.Info())
64 + c.Infof("unmatched line: %v (parser: %s)", err, c.parser.Info())
65 logOnce = false
66 }
67 - w.collectUnmatched()
67 + c.collectUnmatched()
68 continue
69 }
70 n++
71 - if w.line.empty() {
72 - w.collectUnmatched()
71 + if c.line.empty() {
72 + c.collectUnmatched()
73 } else {
74 - w.collectLogLine()
74 + c.collectLogLine()
75 }
76 }
77 }
78
79 -func (w *WebLog) collectLogLine() {
79 +func (c *Collector) collectLogLine() {
80 // https://github.com/netdata/netdata/issues/17716
81 - if w.line.hasReqProcTime() && w.line.respCode == http.StatusSwitchingProtocols {
82 - w.line.reqProcTime = emptyNumber
83 - }
84 - w.mx.Requests.Inc()
85 - w.collectVhost()
86 - w.collectPort()
87 - w.collectReqScheme()
88 - w.collectReqClient()
89 - w.collectReqMethod()
90 - w.collectReqURL()
91 - w.collectReqProto()
92 - w.collectRespCode()
93 - w.collectReqSize()
94 - w.collectRespSize()
95 - w.collectReqProcTime()
96 - w.collectUpsRespTime()
97 - w.collectSSLProto()
98 - w.collectSSLCipherSuite()
99 - w.collectCustomFields()
81 + if c.line.hasReqProcTime() && c.line.respCode == http.StatusSwitchingProtocols {
82 + c.line.reqProcTime = emptyNumber
83 + }
84 + c.mx.Requests.Inc()
85 + c.collectVhost()
86 + c.collectPort()
87 + c.collectReqScheme()
88 + c.collectReqClient()
89 + c.collectReqMethod()
90 + c.collectReqURL()
91 + c.collectReqProto()
92 + c.collectRespCode()
93 + c.collectReqSize()
94 + c.collectRespSize()
95 + c.collectReqProcTime()
96 + c.collectUpsRespTime()
97 + c.collectSSLProto()
98 + c.collectSSLCipherSuite()
99 + c.collectCustomFields()
100 }
101
102 -func (w *WebLog) collectUnmatched() {
103 - w.mx.Requests.Inc()
104 - w.mx.ReqUnmatched.Inc()
102 +func (c *Collector) collectUnmatched() {
103 + c.mx.Requests.Inc()
104 + c.mx.ReqUnmatched.Inc()
105 }
106
107 -func (w *WebLog) collectVhost() {
108 - if !w.line.hasVhost() {
107 +func (c *Collector) collectVhost() {
108 + if !c.line.hasVhost() {
109 return
110 }
111 - c, ok := w.mx.ReqVhost.GetP(w.line.vhost)
111 + cntr, ok := c.mx.ReqVhost.GetP(c.line.vhost)
112 if !ok {
113 - w.addDimToVhostChart(w.line.vhost)
113 + c.addDimToVhostChart(c.line.vhost)
114 }
115 - c.Inc()
115 + cntr.Inc()
116 }
117
118 -func (w *WebLog) collectPort() {
119 - if !w.line.hasPort() {
118 +func (c *Collector) collectPort() {
119 + if !c.line.hasPort() {
120 return
121 }
122 - c, ok := w.mx.ReqPort.GetP(w.line.port)
122 + cntr, ok := c.mx.ReqPort.GetP(c.line.port)
123 if !ok {
124 - w.addDimToPortChart(w.line.port)
124 + c.addDimToPortChart(c.line.port)
125 }
126 - c.Inc()
126 + cntr.Inc()
127 }
128
129 -func (w *WebLog) collectReqClient() {
130 - if !w.line.hasReqClient() {
129 +func (c *Collector) collectReqClient() {
130 + if !c.line.hasReqClient() {
131 return
132 }
133 - if strings.ContainsRune(w.line.reqClient, ':') {
134 - w.mx.ReqIPv6.Inc()
135 - w.mx.UniqueIPv6.Insert(w.line.reqClient)
133 + if strings.ContainsRune(c.line.reqClient, ':') {
134 + c.mx.ReqIPv6.Inc()
135 + c.mx.UniqueIPv6.Insert(c.line.reqClient)
136 return
137 }
138 // NOTE: count hostname as IPv4 address
139 - w.mx.ReqIPv4.Inc()
140 - w.mx.UniqueIPv4.Insert(w.line.reqClient)
139 + c.mx.ReqIPv4.Inc()
140 + c.mx.UniqueIPv4.Insert(c.line.reqClient)
141 }
142
143 -func (w *WebLog) collectReqScheme() {
144 - if !w.line.hasReqScheme() {
143 +func (c *Collector) collectReqScheme() {
144 + if !c.line.hasReqScheme() {
145 return
146 }
147 - if w.line.reqScheme == "https" {
148 - w.mx.ReqHTTPSScheme.Inc()
147 + if c.line.reqScheme == "https" {
148 + c.mx.ReqHTTPSScheme.Inc()
149 } else {
150 - w.mx.ReqHTTPScheme.Inc()
150 + c.mx.ReqHTTPScheme.Inc()
151 }
152 }
153
154 -func (w *WebLog) collectReqMethod() {
155 - if !w.line.hasReqMethod() {
154 +func (c *Collector) collectReqMethod() {
155 + if !c.line.hasReqMethod() {
156 return
157 }
158 - c, ok := w.mx.ReqMethod.GetP(w.line.reqMethod)
158 + cntr, ok := c.mx.ReqMethod.GetP(c.line.reqMethod)
159 if !ok {
160 - w.addDimToReqMethodChart(w.line.reqMethod)
160 + c.addDimToReqMethodChart(c.line.reqMethod)
161 }
162 - c.Inc()
162 + cntr.Inc()
163 }
164
165 -func (w *WebLog) collectReqURL() {
166 - if !w.line.hasReqURL() {
165 +func (c *Collector) collectReqURL() {
166 + if !c.line.hasReqURL() {
167 return
168 }
169 - for _, p := range w.urlPatterns {
170 - if !p.MatchString(w.line.reqURL) {
169 + for _, p := range c.urlPatterns {
170 + if !p.MatchString(c.line.reqURL) {
171 continue
172 }
173 - c, _ := w.mx.ReqURLPattern.GetP(p.name)
174 - c.Inc()
173 + cntr, _ := c.mx.ReqURLPattern.GetP(p.name)
174 + cntr.Inc()
175
176 - w.collectURLPatternStats(p.name)
176 + c.collectURLPatternStats(p.name)
177 return
178 }
179 }
180
181 -func (w *WebLog) collectReqProto() {
182 - if !w.line.hasReqProto() {
181 +func (c *Collector) collectReqProto() {
182 + if !c.line.hasReqProto() {
183 return
184 }
185 - c, ok := w.mx.ReqVersion.GetP(w.line.reqProto)
185 + cntr, ok := c.mx.ReqVersion.GetP(c.line.reqProto)
186 if !ok {
187 - w.addDimToReqVersionChart(w.line.reqProto)
187 + c.addDimToReqVersionChart(c.line.reqProto)
188 }
189 - c.Inc()
189 + cntr.Inc()
190 }
191
192 -func (w *WebLog) collectRespCode() {
193 - if !w.line.hasRespCode() {
192 +func (c *Collector) collectRespCode() {
193 + if !c.line.hasRespCode() {
194 return
195 }
196
197 - code := w.line.respCode
197 + code := c.line.respCode
198 switch {
199 case code >= 100 && code < 300, code == 304, code == 401:
200 - w.mx.ReqSuccess.Inc()
200 + c.mx.ReqSuccess.Inc()
201 case code >= 300 && code < 400:
202 - w.mx.ReqRedirect.Inc()
202 + c.mx.ReqRedirect.Inc()
203 case code >= 400 && code < 500:
204 - w.mx.ReqBad.Inc()
204 + c.mx.ReqBad.Inc()
205 case code >= 500 && code < 600:
206 - w.mx.ReqError.Inc()
206 + c.mx.ReqError.Inc()
207 }
208
209 switch code / 100 {
210 case 1:
211 - w.mx.Resp1xx.Inc()
211 + c.mx.Resp1xx.Inc()
212 case 2:
213 - w.mx.Resp2xx.Inc()
213 + c.mx.Resp2xx.Inc()
214 case 3:
215 - w.mx.Resp3xx.Inc()
215 + c.mx.Resp3xx.Inc()
216 case 4:
217 - w.mx.Resp4xx.Inc()
217 + c.mx.Resp4xx.Inc()
218 case 5:
219 - w.mx.Resp5xx.Inc()
219 + c.mx.Resp5xx.Inc()
220 }
221
222 codeStr := strconv.Itoa(code)
223 - c, ok := w.mx.RespCode.GetP(codeStr)
223 + cntr, ok := c.mx.RespCode.GetP(codeStr)
224 if !ok {
225 - w.addDimToRespCodesChart(codeStr)
225 + c.addDimToRespCodesChart(codeStr)
226 }
227 - c.Inc()
227 + cntr.Inc()
228 }
229
230 -func (w *WebLog) collectReqSize() {
231 - if !w.line.hasReqSize() {
230 +func (c *Collector) collectReqSize() {
231 + if !c.line.hasReqSize() {
232 return
233 }
234 - w.mx.BytesReceived.Add(float64(w.line.reqSize))
234 + c.mx.BytesReceived.Add(float64(c.line.reqSize))
235 }
236
237 -func (w *WebLog) collectRespSize() {
238 - if !w.line.hasRespSize() {
237 +func (c *Collector) collectRespSize() {
238 + if !c.line.hasRespSize() {
239 return
240 }
241 - w.mx.BytesSent.Add(float64(w.line.respSize))
241 + c.mx.BytesSent.Add(float64(c.line.respSize))
242 }
243
244 -func (w *WebLog) collectReqProcTime() {
245 - if !w.line.hasReqProcTime() {
244 +func (c *Collector) collectReqProcTime() {
245 + if !c.line.hasReqProcTime() {
246 return
247 }
248 - w.mx.ReqProcTime.Observe(w.line.reqProcTime)
249 - if w.mx.ReqProcTimeHist == nil {
248 + c.mx.ReqProcTime.Observe(c.line.reqProcTime)
249 + if c.mx.ReqProcTimeHist == nil {
250 return
251 }
252 - w.mx.ReqProcTimeHist.Observe(w.line.reqProcTime)
252 + c.mx.ReqProcTimeHist.Observe(c.line.reqProcTime)
253 }
254
255 -func (w *WebLog) collectUpsRespTime() {
256 - if !w.line.hasUpsRespTime() {
255 +func (c *Collector) collectUpsRespTime() {
256 + if !c.line.hasUpsRespTime() {
257 return
258 }
259 - w.mx.UpsRespTime.Observe(w.line.upsRespTime)
260 - if w.mx.UpsRespTimeHist == nil {
259 + c.mx.UpsRespTime.Observe(c.line.upsRespTime)
260 + if c.mx.UpsRespTimeHist == nil {
261 return
262 }
263 - w.mx.UpsRespTimeHist.Observe(w.line.upsRespTime)
263 + c.mx.UpsRespTimeHist.Observe(c.line.upsRespTime)
264 }
265
266 -func (w *WebLog) collectSSLProto() {
267 - if !w.line.hasSSLProto() {
266 +func (c *Collector) collectSSLProto() {
267 + if !c.line.hasSSLProto() {
268 return
269 }
270 - c, ok := w.mx.ReqSSLProto.GetP(w.line.sslProto)
270 + cntr, ok := c.mx.ReqSSLProto.GetP(c.line.sslProto)
271 if !ok {
272 - w.addDimToSSLProtoChart(w.line.sslProto)
272 + c.addDimToSSLProtoChart(c.line.sslProto)
273 }
274 - c.Inc()
274 + cntr.Inc()
275 }
276
277 -func (w *WebLog) collectSSLCipherSuite() {
278 - if !w.line.hasSSLCipherSuite() {
277 +func (c *Collector) collectSSLCipherSuite() {
278 + if !c.line.hasSSLCipherSuite() {
279 return
280 }
281 - c, ok := w.mx.ReqSSLCipherSuite.GetP(w.line.sslCipherSuite)
281 + cntr, ok := c.mx.ReqSSLCipherSuite.GetP(c.line.sslCipherSuite)
282 if !ok {
283 - w.addDimToSSLCipherSuiteChart(w.line.sslCipherSuite)
283 + c.addDimToSSLCipherSuiteChart(c.line.sslCipherSuite)
284 }
285 - c.Inc()
285 + cntr.Inc()
286 }
287
288 -func (w *WebLog) collectURLPatternStats(name string) {
289 - v, ok := w.mx.URLPatternStats[name]
288 +func (c *Collector) collectURLPatternStats(name string) {
289 + v, ok := c.mx.URLPatternStats[name]
290 if !ok {
291 return
292 }
293 - if w.line.hasRespCode() {
294 - status := strconv.Itoa(w.line.respCode)
295 - c, ok := v.RespCode.GetP(status)
293 + if c.line.hasRespCode() {
294 + status := strconv.Itoa(c.line.respCode)
295 + cntr, ok := v.RespCode.GetP(status)
296 if !ok {
297 - w.addDimToURLPatternRespCodesChart(name, status)
297 + c.addDimToURLPatternRespCodesChart(name, status)
298 }
299 - c.Inc()
299 + cntr.Inc()
300 }
301
302 - if w.line.hasReqMethod() {
303 - c, ok := v.ReqMethod.GetP(w.line.reqMethod)
302 + if c.line.hasReqMethod() {
303 + cntr, ok := v.ReqMethod.GetP(c.line.reqMethod)
304 if !ok {
305 - w.addDimToURLPatternReqMethodsChart(name, w.line.reqMethod)
305 + c.addDimToURLPatternReqMethodsChart(name, c.line.reqMethod)
306 }
307 - c.Inc()
307 + cntr.Inc()
308 }
309
310 - if w.line.hasReqSize() {
311 - v.BytesReceived.Add(float64(w.line.reqSize))
310 + if c.line.hasReqSize() {
311 + v.BytesReceived.Add(float64(c.line.reqSize))
312 }
313
314 - if w.line.hasRespSize() {
315 - v.BytesSent.Add(float64(w.line.respSize))
314 + if c.line.hasRespSize() {
315 + v.BytesSent.Add(float64(c.line.respSize))
316 }
317 - if w.line.hasReqProcTime() {
318 - v.ReqProcTime.Observe(w.line.reqProcTime)
317 + if c.line.hasReqProcTime() {
318 + v.ReqProcTime.Observe(c.line.reqProcTime)
319 }
320 }
321
322 -func (w *WebLog) collectCustomFields() {
323 - if !w.line.hasCustomFields() {
322 +func (c *Collector) collectCustomFields() {
323 + if !c.line.hasCustomFields() {
324 return
325 }
326
327 - for _, cv := range w.line.custom.values {
327 + for _, cv := range c.line.custom.values {
328 _, _ = cv.name, cv.value
329
330 - if patterns, ok := w.customFields[cv.name]; ok {
330 + if patterns, ok := c.customFields[cv.name]; ok {
331 for _, pattern := range patterns {
332 if !pattern.MatchString(cv.value) {
333 continue
334 }
335 - v, ok := w.mx.ReqCustomField[cv.name]
335 + v, ok := c.mx.ReqCustomField[cv.name]
336 if !ok {
337 break
338 }
@@ -340,8 +340,8 @@ func (w *WebLog) collectCustomFields() {
340 c.Inc()
341 break
342 }
343 - } else if histogram, ok := w.customTimeFields[cv.name]; ok {
344 - v, ok := w.mx.ReqCustomTimeField[cv.name]
343 + } else if histogram, ok := c.customTimeFields[cv.name]; ok {
344 + v, ok := c.mx.ReqCustomTimeField[cv.name]
345 if !ok {
346 continue
347 }
@@ -353,8 +353,8 @@ func (w *WebLog) collectCustomFields() {
353 if histogram != nil {
354 v.TimeHist.Observe(ctf * timeMultiplier(cv.value))
355 }
356 - } else if w.customNumericFields[cv.name] {
357 - m, ok := w.mx.ReqCustomNumericField[cv.name]
356 + } else if c.customNumericFields[cv.name] {
357 + m, ok := c.mx.ReqCustomNumericField[cv.name]
358 if !ok {
359 continue
360 }
@@ -368,10 +368,10 @@ func (w *WebLog) collectCustomFields() {
368 }
369 }
370
371 -func (w *WebLog) addDimToVhostChart(vhost string) {
372 - chart := w.Charts().Get(reqByVhost.ID)
371 +func (c *Collector) addDimToVhostChart(vhost string) {
372 + chart := c.Charts().Get(reqByVhost.ID)
373 if chart == nil {
374 - w.Warningf("add dimension: no '%s' chart", reqByVhost.ID)
374 + c.Warningf("add dimension: no '%s' chart", reqByVhost.ID)
375 return
376 }
377 dim := &Dim{
@@ -380,16 +380,16 @@ func (w *WebLog) addDimToVhostChart(vhost string) {
380 Algo: module.Incremental,
381 }
382 if err := chart.AddDim(dim); err != nil {
383 - w.Warning(err)
383 + c.Warning(err)
384 return
385 }
386 chart.MarkNotCreated()
387 }
388
389 -func (w *WebLog) addDimToPortChart(port string) {
390 - chart := w.Charts().Get(reqByPort.ID)
389 +func (c *Collector) addDimToPortChart(port string) {
390 + chart := c.Charts().Get(reqByPort.ID)
391 if chart == nil {
392 - w.Warningf("add dimension: no '%s' chart", reqByPort.ID)
392 + c.Warningf("add dimension: no '%s' chart", reqByPort.ID)
393 return
394 }
395 dim := &Dim{
@@ -398,16 +398,16 @@ func (w *WebLog) addDimToPortChart(port string) {
398 Algo: module.Incremental,
399 }
400 if err := chart.AddDim(dim); err != nil {
401 - w.Warning(err)
401 + c.Warning(err)
402 return
403 }
404 chart.MarkNotCreated()
405 }
406
407 -func (w *WebLog) addDimToReqMethodChart(method string) {
408 - chart := w.Charts().Get(reqByMethod.ID)
407 +func (c *Collector) addDimToReqMethodChart(method string) {
408 + chart := c.Charts().Get(reqByMethod.ID)
409 if chart == nil {
410 - w.Warningf("add dimension: no '%s' chart", reqByMethod.ID)
410 + c.Warningf("add dimension: no '%s' chart", reqByMethod.ID)
411 return
412 }
413 dim := &Dim{
@@ -416,16 +416,16 @@ func (w *WebLog) addDimToReqMethodChart(method string) {
416 Algo: module.Incremental,
417 }
418 if err := chart.AddDim(dim); err != nil {
419 - w.Warning(err)
419 + c.Warning(err)
420 return
421 }
422 chart.MarkNotCreated()
423 }
424
425 -func (w *WebLog) addDimToReqVersionChart(version string) {
426 - chart := w.Charts().Get(reqByVersion.ID)
425 +func (c *Collector) addDimToReqVersionChart(version string) {
426 + chart := c.Charts().Get(reqByVersion.ID)
427 if chart == nil {
428 - w.Warningf("add dimension: no '%s' chart", reqByVersion.ID)
428 + c.Warningf("add dimension: no '%s' chart", reqByVersion.ID)
429 return
430 }
431 dim := &Dim{
@@ -434,18 +434,18 @@ func (w *WebLog) addDimToReqVersionChart(version string) {
434 Algo: module.Incremental,
435 }
436 if err := chart.AddDim(dim); err != nil {
437 - w.Warning(err)
437 + c.Warning(err)
438 return
439 }
440 chart.MarkNotCreated()
441 }
442
443 -func (w *WebLog) addDimToSSLProtoChart(proto string) {
444 - chart := w.Charts().Get(reqBySSLProto.ID)
443 +func (c *Collector) addDimToSSLProtoChart(proto string) {
444 + chart := c.Charts().Get(reqBySSLProto.ID)
445 if chart == nil {
446 chart = reqBySSLProto.Copy()
447 - if err := w.Charts().Add(chart); err != nil {
448 - w.Warning(err)
447 + if err := c.Charts().Add(chart); err != nil {
448 + c.Warning(err)
449 return
450 }
451 }
@@ -455,18 +455,18 @@ func (w *WebLog) addDimToSSLProtoChart(proto string) {
455 Algo: module.Incremental,
456 }
457 if err := chart.AddDim(dim); err != nil {
458 - w.Warning(err)
458 + c.Warning(err)
459 return
460 }
461 chart.MarkNotCreated()
462 }
463
464 -func (w *WebLog) addDimToSSLCipherSuiteChart(cipher string) {
465 - chart := w.Charts().Get(reqBySSLCipherSuite.ID)
464 +func (c *Collector) addDimToSSLCipherSuiteChart(cipher string) {
465 + chart := c.Charts().Get(reqBySSLCipherSuite.ID)
466 if chart == nil {
467 chart = reqBySSLCipherSuite.Copy()
468 - if err := w.Charts().Add(chart); err != nil {
469 - w.Warning(err)
468 + if err := c.Charts().Add(chart); err != nil {
469 + c.Warning(err)
470 return
471 }
472 }
@@ -476,16 +476,16 @@ func (w *WebLog) addDimToSSLCipherSuiteChart(cipher string) {
476 Algo: module.Incremental,
477 }
478 if err := chart.AddDim(dim); err != nil {
479 - w.Warning(err)
479 + c.Warning(err)
480 return
481 }
482 chart.MarkNotCreated()
483 }
484
485 -func (w *WebLog) addDimToRespCodesChart(code string) {
486 - chart := w.findRespCodesChart(code)
485 +func (c *Collector) addDimToRespCodesChart(code string) {
486 + chart := c.findRespCodesChart(code)
487 if chart == nil {
488 - w.Warning("add dimension: cant find resp codes chart")
488 + c.Warning("add dimension: cant find resp codes chart")
489 return
490 }
491 dim := &Dim{
@@ -494,17 +494,17 @@ func (w *WebLog) addDimToRespCodesChart(code string) {
494 Algo: module.Incremental,
495 }
496 if err := chart.AddDim(dim); err != nil {
497 - w.Warning(err)
497 + c.Warning(err)
498 return
499 }
500 chart.MarkNotCreated()
501 }
502
503 -func (w *WebLog) addDimToURLPatternRespCodesChart(name, code string) {
503 +func (c *Collector) addDimToURLPatternRespCodesChart(name, code string) {
504 id := fmt.Sprintf(urlPatternRespCodes.ID, name)
505 - chart := w.Charts().Get(id)
505 + chart := c.Charts().Get(id)
506 if chart == nil {
507 - w.Warningf("add dimension: no '%s' chart", id)
507 + c.Warningf("add dimension: no '%s' chart", id)
508 return
509 }
510 dim := &Dim{
@@ -514,17 +514,17 @@ func (w *WebLog) addDimToURLPatternRespCodesChart(name, code string) {
514 }
515
516 if err := chart.AddDim(dim); err != nil {
517 - w.Warning(err)
517 + c.Warning(err)
518 return
519 }
520 chart.MarkNotCreated()
521 }
522
523 -func (w *WebLog) addDimToURLPatternReqMethodsChart(name, method string) {
523 +func (c *Collector) addDimToURLPatternReqMethodsChart(name, method string) {
524 id := fmt.Sprintf(urlPatternReqMethods.ID, name)
525 - chart := w.Charts().Get(id)
525 + chart := c.Charts().Get(id)
526 if chart == nil {
527 - w.Warningf("add dimension: no '%s' chart", id)
527 + c.Warningf("add dimension: no '%s' chart", id)
528 return
529 }
530 dim := &Dim{
@@ -534,15 +534,15 @@ func (w *WebLog) addDimToURLPatternReqMethodsChart(name, method string) {
534 }
535
536 if err := chart.AddDim(dim); err != nil {
537 - w.Warning(err)
537 + c.Warning(err)
538 return
539 }
540 chart.MarkNotCreated()
541 }
542
543 -func (w *WebLog) findRespCodesChart(code string) *Chart {
544 - if !w.GroupRespCodes {
545 - return w.Charts().Get(respCodes.ID)
543 +func (c *Collector) findRespCodesChart(code string) *Chart {
544 + if !c.GroupRespCodes {
545 + return c.Charts().Get(respCodes.ID)
546 }
547
548 var id string
@@ -560,5 +560,5 @@ func (w *WebLog) findRespCodesChart(code string) *Chart {
560 default:
561 return nil
562 }
563 - return w.Charts().Get(id)
563 + return c.Charts().Get(id)
564 }
src/go/plugin/go.d/collector/weblog/collector.go renamed
+25 -25
@@ -21,8 +21,8 @@ func init() {
21 })
22 }
23
24 -func New() *WebLog {
25 - return &WebLog{
24 +func New() *Collector {
25 + return &Collector{
26 Config: Config{
27 ExcludePath: "*.gz",
28 GroupRespCodes: true,
@@ -78,7 +78,7 @@ type (
78 }
79 )
80
81 -type WebLog struct {
81 +type Collector struct {
82 module.Base
83 Config `yaml:",inline" json:""`
84
@@ -96,58 +96,58 @@ type WebLog struct {
96 mx *metricsData
97 }
98
99 -func (w *WebLog) Configuration() any {
100 - return w.Config
99 +func (c *Collector) Configuration() any {
100 + return c.Config
101 }
102
103 -func (w *WebLog) Init() error {
104 - if err := w.createURLPatterns(); err != nil {
103 +func (c *Collector) Init() error {
104 + if err := c.createURLPatterns(); err != nil {
105 return fmt.Errorf("init failed: %v", err)
106 }
107
108 - if err := w.createCustomFields(); err != nil {
108 + if err := c.createCustomFields(); err != nil {
109 return fmt.Errorf("init failed: %v", err)
110 }
111
112 - if err := w.createCustomTimeFields(); err != nil {
112 + if err := c.createCustomTimeFields(); err != nil {
113 return fmt.Errorf("init failed: %v", err)
114 }
115
116 - if err := w.createCustomNumericFields(); err != nil {
117 - w.Errorf("init failed: %v", err)
116 + if err := c.createCustomNumericFields(); err != nil {
117 + c.Errorf("init failed: %v", err)
118 }
119
120 - w.createLogLine()
121 - w.mx = newMetricsData(w.Config)
120 + c.createLogLine()
121 + c.mx = newMetricsData(c.Config)
122
123 return nil
124 }
125
126 -func (w *WebLog) Check() error {
126 +func (c *Collector) Check() error {
127 // Note: these inits are here to make auto-detection retry working
128 - if err := w.createLogReader(); err != nil {
128 + if err := c.createLogReader(); err != nil {
129 return fmt.Errorf("failed to create log reader: %v", err)
130 }
131
132 - if err := w.createParser(); err != nil {
132 + if err := c.createParser(); err != nil {
133 return fmt.Errorf("failed to create parser: %v", err)
134 }
135
136 - if err := w.createCharts(w.line); err != nil {
136 + if err := c.createCharts(c.line); err != nil {
137 return fmt.Errorf("failed to create charts: %v", err)
138 }
139
140 return nil
141 }
142
143 -func (w *WebLog) Charts() *module.Charts {
144 - return w.charts
143 +func (c *Collector) Charts() *module.Charts {
144 + return c.charts
145 }
146
147 -func (w *WebLog) Collect() map[string]int64 {
148 - mx, err := w.collect()
147 +func (c *Collector) Collect() map[string]int64 {
148 + mx, err := c.collect()
149 if err != nil {
150 - w.Error(err)
150 + c.Error(err)
151 }
152
153 if len(mx) == 0 {
@@ -156,8 +156,8 @@ func (w *WebLog) Collect() map[string]int64 {
156 return mx
157 }
158
159 -func (w *WebLog) Cleanup() {
160 - if w.file != nil {
161 - _ = w.file.Close()
159 +func (c *Collector) Cleanup() {
160 + if c.file != nil {
161 + _ = c.file.Close()
162 }
163 }
src/go/plugin/go.d/collector/weblog/collector_test.go renamed
+248 -248
@@ -44,93 +44,93 @@ func Test_testDataIsValid(t *testing.T) {
44 }
45 }
46
47 -func TestWebLog_ConfigurationSerialize(t *testing.T) {
48 - module.TestConfigurationSerialize(t, &WebLog{}, dataConfigJSON, dataConfigYAML)
47 +func TestCollector_ConfigurationSerialize(t *testing.T) {
48 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
49 }
50
51 -func TestWebLog_Init(t *testing.T) {
52 - weblog := New()
51 +func TestCollector_Init(t *testing.T) {
52 + collr := New()
53
54 - assert.NoError(t, weblog.Init())
54 + assert.NoError(t, collr.Init())
55 }
56
57 -func TestWebLog_Init_ErrorOnCreatingURLPatterns(t *testing.T) {
58 - weblog := New()
59 - weblog.URLPatterns = []userPattern{{Match: "* !*"}}
57 +func TestCollector_Init_ErrorOnCreatingURLPatterns(t *testing.T) {
58 + collr := New()
59 + collr.URLPatterns = []userPattern{{Match: "* !*"}}
60
61 - assert.Error(t, weblog.Init())
61 + assert.Error(t, collr.Init())
62 }
63
64 -func TestWebLog_Init_ErrorOnCreatingCustomFields(t *testing.T) {
65 - weblog := New()
66 - weblog.CustomFields = []customField{{Patterns: []userPattern{{Name: "p1", Match: "* !*"}}}}
64 +func TestCollector_Init_ErrorOnCreatingCustomFields(t *testing.T) {
65 + collr := New()
66 + collr.CustomFields = []customField{{Patterns: []userPattern{{Name: "p1", Match: "* !*"}}}}
67
68 - assert.Error(t, weblog.Init())
68 + assert.Error(t, collr.Init())
69 }
70
71 -func TestWebLog_Check(t *testing.T) {
72 - weblog := New()
73 - defer weblog.Cleanup()
74 - weblog.Path = "testdata/common.log"
75 - require.NoError(t, weblog.Init())
71 +func TestCollector_Check(t *testing.T) {
72 + collr := New()
73 + defer collr.Cleanup()
74 + collr.Path = "testdata/common.log"
75 + require.NoError(t, collr.Init())
76
77 - assert.NoError(t, weblog.Check())
77 + assert.NoError(t, collr.Check())
78 }
79
80 -func TestWebLog_Check_ErrorOnCreatingLogReaderNoLogFile(t *testing.T) {
81 - weblog := New()
82 - defer weblog.Cleanup()
83 - weblog.Path = "testdata/not_exists.log"
84 - require.NoError(t, weblog.Init())
80 +func TestCollector_Check_ErrorOnCreatingLogReaderNoLogFile(t *testing.T) {
81 + collr := New()
82 + defer collr.Cleanup()
83 + collr.Path = "testdata/not_exists.log"
84 + require.NoError(t, collr.Init())
85
86 - assert.Error(t, weblog.Check())
86 + assert.Error(t, collr.Check())
87 }
88
89 -func TestWebLog_Check_ErrorOnCreatingParserUnknownFormat(t *testing.T) {
90 - weblog := New()
91 - defer weblog.Cleanup()
92 - weblog.Path = "testdata/custom.log"
93 - require.NoError(t, weblog.Init())
89 +func TestCollector_Check_ErrorOnCreatingParserUnknownFormat(t *testing.T) {
90 + collr := New()
91 + defer collr.Cleanup()
92 + collr.Path = "testdata/custom.log"
93 + require.NoError(t, collr.Init())
94
95 - assert.Error(t, weblog.Check())
95 + assert.Error(t, collr.Check())
96 }
97
98 -func TestWebLog_Check_ErrorOnCreatingParserEmptyLine(t *testing.T) {
99 - weblog := New()
100 - defer weblog.Cleanup()
101 - weblog.Path = "testdata/custom.log"
102 - weblog.ParserConfig.LogType = logs.TypeCSV
103 - weblog.ParserConfig.CSV.Format = "$one $two"
104 - require.NoError(t, weblog.Init())
98 +func TestCollector_Check_ErrorOnCreatingParserEmptyLine(t *testing.T) {
99 + collr := New()
100 + defer collr.Cleanup()
101 + collr.Path = "testdata/custom.log"
102 + collr.ParserConfig.LogType = logs.TypeCSV
103 + collr.ParserConfig.CSV.Format = "$one $two"
104 + require.NoError(t, collr.Init())
105
106 - assert.Error(t, weblog.Check())
106 + assert.Error(t, collr.Check())
107 }
108
109 -func TestWebLog_Charts(t *testing.T) {
110 - weblog := New()
111 - defer weblog.Cleanup()
112 - weblog.Path = "testdata/common.log"
113 - require.NoError(t, weblog.Init())
114 - require.NoError(t, weblog.Check())
109 +func TestCollector_Charts(t *testing.T) {
110 + collr := New()
111 + defer collr.Cleanup()
112 + collr.Path = "testdata/common.log"
113 + require.NoError(t, collr.Init())
114 + require.NoError(t, collr.Check())
115
116 - assert.NotNil(t, weblog.Charts())
116 + assert.NotNil(t, collr.Charts())
117 }
118
119 -func TestWebLog_Cleanup(t *testing.T) {
119 +func TestCollector_Cleanup(t *testing.T) {
120 New().Cleanup()
121 }
122
123 -func TestWebLog_Collect(t *testing.T) {
124 - weblog := prepareWebLogCollectFull(t)
123 +func TestCollector_Collect(t *testing.T) {
124 + collr := prepareWebLogCollectFull(t)
125
126 - //m := weblog.Collect()
126 + //mx := collr.Collect()
127 //l := make([]string, 0)
128 - //for k := range m {
128 + //for k := range mx {
129 // l = append(l, k)
130 //}
131 //sort.Strings(l)
132 //for _, value := range l {
133 - // fmt.Println(fmt.Sprintf("\"%s\": %d,", value, m[value]))
133 + // fmt.Println(fmt.Sprintf("\"%s\": %d,", value, mx[value]))
134 //}
135
136 expected := map[string]int64{
@@ -312,13 +312,13 @@ func TestWebLog_Collect(t *testing.T) {
312 "url_ptn_org_resp_code_401": 9,
313 }
314
315 - mx := weblog.Collect()
315 + mx := collr.Collect()
316 assert.Equal(t, expected, mx)
317 - testCharts(t, weblog, mx)
317 + testCharts(t, collr, mx)
318 }
319
320 -func TestWebLog_Collect_CommonLogFormat(t *testing.T) {
321 - weblog := prepareWebLogCollectCommon(t)
320 +func TestCollector_Collect_CommonLogFormat(t *testing.T) {
321 + collr := prepareWebLogCollectCommon(t)
322
323 expected := map[string]int64{
324 "bytes_received": 0,
@@ -392,13 +392,13 @@ func TestWebLog_Collect_CommonLogFormat(t *testing.T) {
392 "upstream_resp_time_sum": 0,
393 }
394
395 - mx := weblog.Collect()
395 + mx := collr.Collect()
396 assert.Equal(t, expected, mx)
397 - testCharts(t, weblog, mx)
397 + testCharts(t, collr, mx)
398 }
399
400 -func TestWebLog_Collect_CustomLogs(t *testing.T) {
401 - weblog := prepareWebLogCollectCustom(t)
400 +func TestCollector_Collect_CustomLogs(t *testing.T) {
401 + collr := prepareWebLogCollectCustom(t)
402
403 expected := map[string]int64{
404 "bytes_received": 0,
@@ -462,13 +462,13 @@ func TestWebLog_Collect_CustomLogs(t *testing.T) {
462 "upstream_resp_time_sum": 0,
463 }
464
465 - mx := weblog.Collect()
465 + mx := collr.Collect()
466 assert.Equal(t, expected, mx)
467 - testCharts(t, weblog, mx)
467 + testCharts(t, collr, mx)
468 }
469
470 -func TestWebLog_Collect_CustomTimeFieldsLogs(t *testing.T) {
471 - weblog := prepareWebLogCollectCustomTimeFields(t)
470 +func TestCollector_Collect_CustomTimeFieldsLogs(t *testing.T) {
471 + collr := prepareWebLogCollectCustomTimeFields(t)
472
473 expected := map[string]int64{
474 "bytes_received": 0,
@@ -564,13 +564,13 @@ func TestWebLog_Collect_CustomTimeFieldsLogs(t *testing.T) {
564 "upstream_resp_time_sum": 0,
565 }
566
567 - mx := weblog.Collect()
567 + mx := collr.Collect()
568 assert.Equal(t, expected, mx)
569 - testCharts(t, weblog, mx)
569 + testCharts(t, collr, mx)
570 }
571
572 -func TestWebLog_Collect_CustomNumericFieldsLogs(t *testing.T) {
573 - weblog := prepareWebLogCollectCustomNumericFields(t)
572 +func TestCollector_Collect_CustomNumericFieldsLogs(t *testing.T) {
573 + collr := prepareWebLogCollectCustomNumericFields(t)
574
575 expected := map[string]int64{
576 "bytes_received": 0,
@@ -640,14 +640,14 @@ func TestWebLog_Collect_CustomNumericFieldsLogs(t *testing.T) {
640 "upstream_resp_time_sum": 0,
641 }
642
643 - mx := weblog.Collect()
643 + mx := collr.Collect()
644
645 assert.Equal(t, expected, mx)
646 - testCharts(t, weblog, mx)
646 + testCharts(t, collr, mx)
647 }
648
649 -func TestWebLog_IISLogs(t *testing.T) {
650 - weblog := prepareWebLogCollectIISFields(t)
649 +func TestCollector_IISLogs(t *testing.T) {
650 + collr := prepareWebLogCollectIISFields(t)
651
652 expected := map[string]int64{
653 "bytes_received": 0,
@@ -714,141 +714,141 @@ func TestWebLog_IISLogs(t *testing.T) {
714 "upstream_resp_time_sum": 0,
715 }
716
717 - mx := weblog.Collect()
717 + mx := collr.Collect()
718 assert.Equal(t, expected, mx)
719 }
720
721 -func testCharts(t *testing.T, w *WebLog, mx map[string]int64) {
722 - testVhostChart(t, w)
723 - testPortChart(t, w)
724 - testSchemeChart(t, w)
725 - testClientCharts(t, w)
726 - testHTTPMethodChart(t, w)
727 - testURLPatternChart(t, w)
728 - testHTTPVersionChart(t, w)
729 - testRespCodeCharts(t, w)
730 - testBandwidthChart(t, w)
731 - testReqProcTimeCharts(t, w)
732 - testUpsRespTimeCharts(t, w)
733 - testSSLProtoChart(t, w)
734 - testSSLCipherSuiteChart(t, w)
735 - testURLPatternStatsCharts(t, w)
736 - testCustomFieldCharts(t, w)
737 - testCustomTimeFieldCharts(t, w)
738 - testCustomNumericFieldCharts(t, w)
739 -
740 - module.TestMetricsHasAllChartsDims(t, w.Charts(), mx)
721 +func testCharts(t *testing.T, c *Collector, mx map[string]int64) {
722 + testVhostChart(t, c)
723 + testPortChart(t, c)
724 + testSchemeChart(t, c)
725 + testClientCharts(t, c)
726 + testHTTPMethodChart(t, c)
727 + testURLPatternChart(t, c)
728 + testHTTPVersionChart(t, c)
729 + testRespCodeCharts(t, c)
730 + testBandwidthChart(t, c)
731 + testReqProcTimeCharts(t, c)
732 + testUpsRespTimeCharts(t, c)
733 + testSSLProtoChart(t, c)
734 + testSSLCipherSuiteChart(t, c)
735 + testURLPatternStatsCharts(t, c)
736 + testCustomFieldCharts(t, c)
737 + testCustomTimeFieldCharts(t, c)
738 + testCustomNumericFieldCharts(t, c)
739 +
740 + module.TestMetricsHasAllChartsDims(t, c.Charts(), mx)
741 }
742
743 -func testVhostChart(t *testing.T, w *WebLog) {
744 - if len(w.mx.ReqVhost) == 0 {
745 - assert.Falsef(t, w.Charts().Has(reqByVhost.ID), "chart '%s' is created", reqByVhost.ID)
743 +func testVhostChart(t *testing.T, c *Collector) {
744 + if len(c.mx.ReqVhost) == 0 {
745 + assert.Falsef(t, c.Charts().Has(reqByVhost.ID), "chart '%s' is created", reqByVhost.ID)
746 return
747 }
748
749 - chart := w.Charts().Get(reqByVhost.ID)
749 + chart := c.Charts().Get(reqByVhost.ID)
750 assert.NotNilf(t, chart, "chart '%s' is not created", reqByVhost.ID)
751 if chart == nil {
752 return
753 }
754 - for v := range w.mx.ReqVhost {
754 + for v := range c.mx.ReqVhost {
755 id := "req_vhost_" + v
756 assert.Truef(t, chart.HasDim(id), "chart '%s' has no dim for '%s' vhost, expected '%s'", chart.ID, v, id)
757 }
758 }
759
760 -func testPortChart(t *testing.T, w *WebLog) {
761 - if len(w.mx.ReqPort) == 0 {
762 - assert.Falsef(t, w.Charts().Has(reqByPort.ID), "chart '%s' is created", reqByPort.ID)
760 +func testPortChart(t *testing.T, c *Collector) {
761 + if len(c.mx.ReqPort) == 0 {
762 + assert.Falsef(t, c.Charts().Has(reqByPort.ID), "chart '%s' is created", reqByPort.ID)
763 return
764 }
765
766 - chart := w.Charts().Get(reqByPort.ID)
766 + chart := c.Charts().Get(reqByPort.ID)
767 assert.NotNilf(t, chart, "chart '%s' is not created", reqByPort.ID)
768 if chart == nil {
769 return
770 }
771 - for v := range w.mx.ReqPort {
771 + for v := range c.mx.ReqPort {
772 id := "req_port_" + v
773 assert.Truef(t, chart.HasDim(id), "chart '%s' has no dim for '%s' port, expected '%s'", chart.ID, v, id)
774 }
775 }
776
777 -func testSchemeChart(t *testing.T, w *WebLog) {
778 - if w.mx.ReqHTTPScheme.Value() == 0 && w.mx.ReqHTTPSScheme.Value() == 0 {
779 - assert.Falsef(t, w.Charts().Has(reqByScheme.ID), "chart '%s' is created", reqByScheme.ID)
777 +func testSchemeChart(t *testing.T, c *Collector) {
778 + if c.mx.ReqHTTPScheme.Value() == 0 && c.mx.ReqHTTPSScheme.Value() == 0 {
779 + assert.Falsef(t, c.Charts().Has(reqByScheme.ID), "chart '%s' is created", reqByScheme.ID)
780 } else {
781 - assert.Truef(t, w.Charts().Has(reqByScheme.ID), "chart '%s' is not created", reqByScheme.ID)
781 + assert.Truef(t, c.Charts().Has(reqByScheme.ID), "chart '%s' is not created", reqByScheme.ID)
782 }
783 }
784
785 -func testClientCharts(t *testing.T, w *WebLog) {
786 - if w.mx.ReqIPv4.Value() == 0 && w.mx.ReqIPv6.Value() == 0 {
787 - assert.Falsef(t, w.Charts().Has(reqByIPProto.ID), "chart '%s' is created", reqByIPProto.ID)
785 +func testClientCharts(t *testing.T, c *Collector) {
786 + if c.mx.ReqIPv4.Value() == 0 && c.mx.ReqIPv6.Value() == 0 {
787 + assert.Falsef(t, c.Charts().Has(reqByIPProto.ID), "chart '%s' is created", reqByIPProto.ID)
788 } else {
789 - assert.Truef(t, w.Charts().Has(reqByIPProto.ID), "chart '%s' is not created", reqByIPProto.ID)
789 + assert.Truef(t, c.Charts().Has(reqByIPProto.ID), "chart '%s' is not created", reqByIPProto.ID)
790 }
791
792 - if w.mx.UniqueIPv4.Value() == 0 && w.mx.UniqueIPv6.Value() == 0 {
793 - assert.Falsef(t, w.Charts().Has(uniqIPsCurPoll.ID), "chart '%s' is created", uniqIPsCurPoll.ID)
792 + if c.mx.UniqueIPv4.Value() == 0 && c.mx.UniqueIPv6.Value() == 0 {
793 + assert.Falsef(t, c.Charts().Has(uniqIPsCurPoll.ID), "chart '%s' is created", uniqIPsCurPoll.ID)
794 } else {
795 - assert.Truef(t, w.Charts().Has(uniqIPsCurPoll.ID), "chart '%s' is not created", uniqIPsCurPoll.ID)
795 + assert.Truef(t, c.Charts().Has(uniqIPsCurPoll.ID), "chart '%s' is not created", uniqIPsCurPoll.ID)
796 }
797 }
798
799 -func testHTTPMethodChart(t *testing.T, w *WebLog) {
800 - if len(w.mx.ReqMethod) == 0 {
801 - assert.Falsef(t, w.Charts().Has(reqByMethod.ID), "chart '%s' is created", reqByMethod.ID)
799 +func testHTTPMethodChart(t *testing.T, c *Collector) {
800 + if len(c.mx.ReqMethod) == 0 {
801 + assert.Falsef(t, c.Charts().Has(reqByMethod.ID), "chart '%s' is created", reqByMethod.ID)
802 return
803 }
804
805 - chart := w.Charts().Get(reqByMethod.ID)
805 + chart := c.Charts().Get(reqByMethod.ID)
806 assert.NotNilf(t, chart, "chart '%s' is not created", reqByMethod.ID)
807 if chart == nil {
808 return
809 }
810 - for v := range w.mx.ReqMethod {
810 + for v := range c.mx.ReqMethod {
811 id := "req_method_" + v
812 assert.Truef(t, chart.HasDim(id), "chart '%s' has no dim for '%s' method, expected '%s'", chart.ID, v, id)
813 }
814 }
815
816 -func testURLPatternChart(t *testing.T, w *WebLog) {
817 - if isEmptyCounterVec(w.mx.ReqURLPattern) {
818 - assert.Falsef(t, w.Charts().Has(reqByURLPattern.ID), "chart '%s' is created", reqByURLPattern.ID)
816 +func testURLPatternChart(t *testing.T, c *Collector) {
817 + if isEmptyCounterVec(c.mx.ReqURLPattern) {
818 + assert.Falsef(t, c.Charts().Has(reqByURLPattern.ID), "chart '%s' is created", reqByURLPattern.ID)
819 return
820 }
821
822 - chart := w.Charts().Get(reqByURLPattern.ID)
822 + chart := c.Charts().Get(reqByURLPattern.ID)
823 assert.NotNilf(t, chart, "chart '%s' is not created", reqByURLPattern.ID)
824 if chart == nil {
825 return
826 }
827 - for v := range w.mx.ReqURLPattern {
827 + for v := range c.mx.ReqURLPattern {
828 id := "req_url_ptn_" + v
829 assert.True(t, chart.HasDim(id), "chart '%s' has no dim for '%s' pattern, expected '%s'", chart.ID, v, id)
830 }
831 }
832
833 -func testHTTPVersionChart(t *testing.T, w *WebLog) {
834 - if len(w.mx.ReqVersion) == 0 {
835 - assert.Falsef(t, w.Charts().Has(reqByVersion.ID), "chart '%s' is created", reqByVersion.ID)
833 +func testHTTPVersionChart(t *testing.T, c *Collector) {
834 + if len(c.mx.ReqVersion) == 0 {
835 + assert.Falsef(t, c.Charts().Has(reqByVersion.ID), "chart '%s' is created", reqByVersion.ID)
836 return
837 }
838
839 - chart := w.Charts().Get(reqByVersion.ID)
839 + chart := c.Charts().Get(reqByVersion.ID)
840 assert.NotNilf(t, chart, "chart '%s' is not created", reqByVersion.ID)
841 if chart == nil {
842 return
843 }
844 - for v := range w.mx.ReqVersion {
844 + for v := range c.mx.ReqVersion {
845 id := "req_version_" + v
846 assert.Truef(t, chart.HasDim(id), "chart '%s' has no dim for '%s' version, expected '%s'", chart.ID, v, id)
847 }
848 }
849
850 -func testRespCodeCharts(t *testing.T, w *WebLog) {
851 - if isEmptyCounterVec(w.mx.RespCode) {
850 +func testRespCodeCharts(t *testing.T, c *Collector) {
851 + if isEmptyCounterVec(c.mx.RespCode) {
852 for _, id := range []string{
853 respCodes.ID,
854 respCodes1xx.ID,
@@ -857,18 +857,18 @@ func testRespCodeCharts(t *testing.T, w *WebLog) {
857 respCodes4xx.ID,
858 respCodes5xx.ID,
859 } {
860 - assert.Falsef(t, w.Charts().Has(id), "chart '%s' is created", id)
860 + assert.Falsef(t, c.Charts().Has(id), "chart '%s' is created", id)
861 }
862 return
863 }
864
865 - if !w.GroupRespCodes {
866 - chart := w.Charts().Get(respCodes.ID)
865 + if !c.GroupRespCodes {
866 + chart := c.Charts().Get(respCodes.ID)
867 assert.NotNilf(t, chart, "chart '%s' is not created", respCodes.ID)
868 if chart == nil {
869 return
870 }
871 - for v := range w.mx.RespCode {
871 + for v := range c.mx.RespCode {
872 id := "resp_code_" + v
873 assert.Truef(t, chart.HasDim(id), "chart '%s' has no dim for '%s' code, expected '%s'", chart.ID, v, id)
874 }
@@ -876,7 +876,7 @@ func testRespCodeCharts(t *testing.T, w *WebLog) {
876 }
877
878 findCodes := func(class string) (codes []string) {
879 - for v := range w.mx.RespCode {
879 + for v := range c.mx.RespCode {
880 if v[:1] == class {
881 codes = append(codes, v)
882 }
@@ -896,7 +896,7 @@ func testRespCodeCharts(t *testing.T, w *WebLog) {
896 class := strconv.Itoa(i + 1)
897 codes := findCodes(class)
898 n += len(codes)
899 - chart := w.Charts().Get(chartID)
899 + chart := c.Charts().Get(chartID)
900 assert.NotNilf(t, chart, "chart '%s' is not created", chartID)
901 if chart == nil {
902 return
@@ -906,95 +906,95 @@ func testRespCodeCharts(t *testing.T, w *WebLog) {
906 assert.Truef(t, chart.HasDim(id), "chart '%s' has no dim for '%s' code, expected '%s'", chartID, v, id)
907 }
908 }
909 - assert.Equal(t, len(w.mx.RespCode), n)
909 + assert.Equal(t, len(c.mx.RespCode), n)
910 }
911
912 -func testBandwidthChart(t *testing.T, w *WebLog) {
913 - if w.mx.BytesSent.Value() == 0 && w.mx.BytesReceived.Value() == 0 {
914 - assert.Falsef(t, w.Charts().Has(bandwidth.ID), "chart '%s' is created", bandwidth.ID)
912 +func testBandwidthChart(t *testing.T, c *Collector) {
913 + if c.mx.BytesSent.Value() == 0 && c.mx.BytesReceived.Value() == 0 {
914 + assert.Falsef(t, c.Charts().Has(bandwidth.ID), "chart '%s' is created", bandwidth.ID)
915 } else {
916 - assert.Truef(t, w.Charts().Has(bandwidth.ID), "chart '%s' is not created", bandwidth.ID)
916 + assert.Truef(t, c.Charts().Has(bandwidth.ID), "chart '%s' is not created", bandwidth.ID)
917 }
918 }
919
920 -func testReqProcTimeCharts(t *testing.T, w *WebLog) {
921 - if isEmptySummary(w.mx.ReqProcTime) {
922 - assert.Falsef(t, w.Charts().Has(reqProcTime.ID), "chart '%s' is created", reqProcTime.ID)
920 +func testReqProcTimeCharts(t *testing.T, c *Collector) {
921 + if isEmptySummary(c.mx.ReqProcTime) {
922 + assert.Falsef(t, c.Charts().Has(reqProcTime.ID), "chart '%s' is created", reqProcTime.ID)
923 } else {
924 - assert.Truef(t, w.Charts().Has(reqProcTime.ID), "chart '%s' is not created", reqProcTime.ID)
924 + assert.Truef(t, c.Charts().Has(reqProcTime.ID), "chart '%s' is not created", reqProcTime.ID)
925 }
926
927 - if isEmptyHistogram(w.mx.ReqProcTimeHist) {
928 - assert.Falsef(t, w.Charts().Has(reqProcTimeHist.ID), "chart '%s' is created", reqProcTimeHist.ID)
927 + if isEmptyHistogram(c.mx.ReqProcTimeHist) {
928 + assert.Falsef(t, c.Charts().Has(reqProcTimeHist.ID), "chart '%s' is created", reqProcTimeHist.ID)
929 } else {
930 - assert.Truef(t, w.Charts().Has(reqProcTimeHist.ID), "chart '%s' is not created", reqProcTimeHist.ID)
930 + assert.Truef(t, c.Charts().Has(reqProcTimeHist.ID), "chart '%s' is not created", reqProcTimeHist.ID)
931 }
932 }
933
934 -func testUpsRespTimeCharts(t *testing.T, w *WebLog) {
935 - if isEmptySummary(w.mx.UpsRespTime) {
936 - assert.Falsef(t, w.Charts().Has(upsRespTime.ID), "chart '%s' is created", upsRespTime.ID)
934 +func testUpsRespTimeCharts(t *testing.T, c *Collector) {
935 + if isEmptySummary(c.mx.UpsRespTime) {
936 + assert.Falsef(t, c.Charts().Has(upsRespTime.ID), "chart '%s' is created", upsRespTime.ID)
937 } else {
938 - assert.Truef(t, w.Charts().Has(upsRespTime.ID), "chart '%s' is not created", upsRespTime.ID)
938 + assert.Truef(t, c.Charts().Has(upsRespTime.ID), "chart '%s' is not created", upsRespTime.ID)
939 }
940
941 - if isEmptyHistogram(w.mx.UpsRespTimeHist) {
942 - assert.Falsef(t, w.Charts().Has(upsRespTimeHist.ID), "chart '%s' is created", upsRespTimeHist.ID)
941 + if isEmptyHistogram(c.mx.UpsRespTimeHist) {
942 + assert.Falsef(t, c.Charts().Has(upsRespTimeHist.ID), "chart '%s' is created", upsRespTimeHist.ID)
943 } else {
944 - assert.Truef(t, w.Charts().Has(upsRespTimeHist.ID), "chart '%s' is not created", upsRespTimeHist.ID)
944 + assert.Truef(t, c.Charts().Has(upsRespTimeHist.ID), "chart '%s' is not created", upsRespTimeHist.ID)
945 }
946 }
947
948 -func testSSLProtoChart(t *testing.T, w *WebLog) {
949 - if len(w.mx.ReqSSLProto) == 0 {
950 - assert.Falsef(t, w.Charts().Has(reqBySSLProto.ID), "chart '%s' is created", reqBySSLProto.ID)
948 +func testSSLProtoChart(t *testing.T, c *Collector) {
949 + if len(c.mx.ReqSSLProto) == 0 {
950 + assert.Falsef(t, c.Charts().Has(reqBySSLProto.ID), "chart '%s' is created", reqBySSLProto.ID)
951 return
952 }
953
954 - chart := w.Charts().Get(reqBySSLProto.ID)
954 + chart := c.Charts().Get(reqBySSLProto.ID)
955 assert.NotNilf(t, chart, "chart '%s' is not created", reqBySSLProto.ID)
956 if chart == nil {
957 return
958 }
959 - for v := range w.mx.ReqSSLProto {
959 + for v := range c.mx.ReqSSLProto {
960 id := "req_ssl_proto_" + v
961 assert.Truef(t, chart.HasDim(id), "chart '%s' has no dim for '%s' ssl proto, expected '%s'", chart.ID, v, id)
962 }
963 }
964
965 -func testSSLCipherSuiteChart(t *testing.T, w *WebLog) {
966 - if len(w.mx.ReqSSLCipherSuite) == 0 {
967 - assert.Falsef(t, w.Charts().Has(reqBySSLCipherSuite.ID), "chart '%s' is created", reqBySSLCipherSuite.ID)
965 +func testSSLCipherSuiteChart(t *testing.T, c *Collector) {
966 + if len(c.mx.ReqSSLCipherSuite) == 0 {
967 + assert.Falsef(t, c.Charts().Has(reqBySSLCipherSuite.ID), "chart '%s' is created", reqBySSLCipherSuite.ID)
968 return
969 }
970
971 - chart := w.Charts().Get(reqBySSLCipherSuite.ID)
971 + chart := c.Charts().Get(reqBySSLCipherSuite.ID)
972 assert.NotNilf(t, chart, "chart '%s' is not created", reqBySSLCipherSuite.ID)
973 if chart == nil {
974 return
975 }
976 - for v := range w.mx.ReqSSLCipherSuite {
976 + for v := range c.mx.ReqSSLCipherSuite {
977 id := "req_ssl_cipher_suite_" + v
978 assert.Truef(t, chart.HasDim(id), "chart '%s' has no dim for '%s' ssl cipher suite, expected '%s'", chart.ID, v, id)
979 }
980 }
981
982 -func testURLPatternStatsCharts(t *testing.T, w *WebLog) {
983 - for _, p := range w.URLPatterns {
982 +func testURLPatternStatsCharts(t *testing.T, collr *Collector) {
983 + for _, p := range collr.URLPatterns {
984 chartID := fmt.Sprintf(urlPatternRespCodes.ID, p.Name)
985
986 - if isEmptyCounterVec(w.mx.RespCode) {
987 - assert.Falsef(t, w.Charts().Has(chartID), "chart '%s' is created", chartID)
986 + if isEmptyCounterVec(collr.mx.RespCode) {
987 + assert.Falsef(t, collr.Charts().Has(chartID), "chart '%s' is created", chartID)
988 continue
989 }
990
991 - chart := w.Charts().Get(chartID)
991 + chart := collr.Charts().Get(chartID)
992 assert.NotNilf(t, chart, "chart '%s' is not created", chartID)
993 if chart == nil {
994 continue
995 }
996
997 - stats, ok := w.mx.URLPatternStats[p.Name]
997 + stats, ok := collr.mx.URLPatternStats[p.Name]
998 assert.Truef(t, ok, "url pattern '%s' has no metric in w.mx.URLPatternStats", p.Name)
999 if !ok {
1000 continue
@@ -1005,20 +1005,20 @@ func testURLPatternStatsCharts(t *testing.T, w *WebLog) {
1005 }
1006 }
1007
1008 - for _, p := range w.URLPatterns {
1008 + for _, p := range collr.URLPatterns {
1009 id := fmt.Sprintf(urlPatternReqMethods.ID, p.Name)
1010 - if isEmptyCounterVec(w.mx.ReqMethod) {
1011 - assert.Falsef(t, w.Charts().Has(id), "chart '%s' is created", id)
1010 + if isEmptyCounterVec(collr.mx.ReqMethod) {
1011 + assert.Falsef(t, collr.Charts().Has(id), "chart '%s' is created", id)
1012 continue
1013 }
1014
1015 - chart := w.Charts().Get(id)
1015 + chart := collr.Charts().Get(id)
1016 assert.NotNilf(t, chart, "chart '%s' is not created", id)
1017 if chart == nil {
1018 continue
1019 }
1020
1021 - stats, ok := w.mx.URLPatternStats[p.Name]
1021 + stats, ok := collr.mx.URLPatternStats[p.Name]
1022 assert.Truef(t, ok, "url pattern '%s' has no metric in w.mx.URLPatternStats", p.Name)
1023 if !ok {
1024 continue
@@ -1029,29 +1029,29 @@ func testURLPatternStatsCharts(t *testing.T, w *WebLog) {
1029 }
1030 }
1031
1032 - for _, p := range w.URLPatterns {
1032 + for _, p := range collr.URLPatterns {
1033 id := fmt.Sprintf(urlPatternBandwidth.ID, p.Name)
1034 - if w.mx.BytesSent.Value() == 0 && w.mx.BytesReceived.Value() == 0 {
1035 - assert.Falsef(t, w.Charts().Has(id), "chart '%s' is created", id)
1034 + if collr.mx.BytesSent.Value() == 0 && collr.mx.BytesReceived.Value() == 0 {
1035 + assert.Falsef(t, collr.Charts().Has(id), "chart '%s' is created", id)
1036 } else {
1037 - assert.Truef(t, w.Charts().Has(id), "chart '%s' is not created", id)
1037 + assert.Truef(t, collr.Charts().Has(id), "chart '%s' is not created", id)
1038 }
1039 }
1040
1041 - for _, p := range w.URLPatterns {
1041 + for _, p := range collr.URLPatterns {
1042 id := fmt.Sprintf(urlPatternReqProcTime.ID, p.Name)
1043 - if isEmptySummary(w.mx.ReqProcTime) {
1044 - assert.Falsef(t, w.Charts().Has(id), "chart '%s' is created", id)
1043 + if isEmptySummary(collr.mx.ReqProcTime) {
1044 + assert.Falsef(t, collr.Charts().Has(id), "chart '%s' is created", id)
1045 } else {
1046 - assert.Truef(t, w.Charts().Has(id), "chart '%s' is not created", id)
1046 + assert.Truef(t, collr.Charts().Has(id), "chart '%s' is not created", id)
1047 }
1048 }
1049 }
1050
1051 -func testCustomFieldCharts(t *testing.T, w *WebLog) {
1052 - for _, cf := range w.CustomFields {
1051 +func testCustomFieldCharts(t *testing.T, c *Collector) {
1052 + for _, cf := range c.CustomFields {
1053 id := fmt.Sprintf(reqByCustomFieldPattern.ID, cf.Name)
1054 - chart := w.Charts().Get(id)
1054 + chart := c.Charts().Get(id)
1055 assert.NotNilf(t, chart, "chart '%s' is not created", id)
1056 if chart == nil {
1057 continue
@@ -1064,10 +1064,10 @@ func testCustomFieldCharts(t *testing.T, w *WebLog) {
1064 }
1065 }
1066
1067 -func testCustomTimeFieldCharts(t *testing.T, w *WebLog) {
1068 - for _, cf := range w.CustomTimeFields {
1067 +func testCustomTimeFieldCharts(t *testing.T, c *Collector) {
1068 + for _, cf := range c.CustomTimeFields {
1069 id := fmt.Sprintf(reqByCustomTimeField.ID, cf.Name)
1070 - chart := w.Charts().Get(id)
1070 + chart := c.Charts().Get(id)
1071 assert.NotNilf(t, chart, "chart '%s' is not created", id)
1072 if chart == nil {
1073 continue
@@ -1083,10 +1083,10 @@ func testCustomTimeFieldCharts(t *testing.T, w *WebLog) {
1083 }
1084 }
1085
1086 -func testCustomNumericFieldCharts(t *testing.T, w *WebLog) {
1087 - for _, cf := range w.CustomNumericFields {
1086 +func testCustomNumericFieldCharts(t *testing.T, c *Collector) {
1087 + for _, cf := range c.CustomNumericFields {
1088 id := fmt.Sprintf(customNumericFieldSummaryChartTmpl.ID, cf.Name)
1089 - chart := w.Charts().Get(id)
1089 + chart := c.Charts().Get(id)
1090 assert.NotNilf(t, chart, "chart '%s' is not created", id)
1091 if chart == nil {
1092 continue
@@ -1119,7 +1119,7 @@ func isEmptyCounterVec(cv metrix.CounterVec) bool {
1119 return true
1120 }
1121
1122 -func prepareWebLogCollectFull(t *testing.T) *WebLog {
1122 +func prepareWebLogCollectFull(t *testing.T) *Collector {
1123 t.Helper()
1124 format := strings.Join([]string{
1125 "$host:$server_port",
@@ -1185,19 +1185,19 @@ func prepareWebLogCollectFull(t *testing.T) *WebLog {
1185 Histogram: metrix.DefBuckets,
1186 GroupRespCodes: true,
1187 }
1188 - weblog := New()
1189 - weblog.Config = cfg
1190 - require.NoError(t, weblog.Init())
1191 - require.NoError(t, weblog.Check())
1192 - defer weblog.Cleanup()
1188 + collr := New()
1189 + collr.Config = cfg
1190 + require.NoError(t, collr.Init())
1191 + require.NoError(t, collr.Check())
1192 + defer collr.Cleanup()
1193
1194 - p, err := logs.NewCSVParser(weblog.ParserConfig.CSV, bytes.NewReader(dataFullLog))
1194 + p, err := logs.NewCSVParser(collr.ParserConfig.CSV, bytes.NewReader(dataFullLog))
1195 require.NoError(t, err)
1196 - weblog.parser = p
1197 - return weblog
1196 + collr.parser = p
1197 + return collr
1198 }
1199
1200 -func prepareWebLogCollectCommon(t *testing.T) *WebLog {
1200 +func prepareWebLogCollectCommon(t *testing.T) *Collector {
1201 t.Helper()
1202 format := strings.Join([]string{
1203 "$remote_addr",
@@ -1228,19 +1228,19 @@ func prepareWebLogCollectCommon(t *testing.T) *WebLog {
1228 GroupRespCodes: false,
1229 }
1230
1231 - weblog := New()
1232 - weblog.Config = cfg
1233 - require.NoError(t, weblog.Init())
1234 - require.NoError(t, weblog.Check())
1235 - defer weblog.Cleanup()
1231 + collr := New()
1232 + collr.Config = cfg
1233 + require.NoError(t, collr.Init())
1234 + require.NoError(t, collr.Check())
1235 + defer collr.Cleanup()
1236
1237 - p, err := logs.NewCSVParser(weblog.ParserConfig.CSV, bytes.NewReader(dataCommonLog))
1237 + p, err := logs.NewCSVParser(collr.ParserConfig.CSV, bytes.NewReader(dataCommonLog))
1238 require.NoError(t, err)
1239 - weblog.parser = p
1240 - return weblog
1239 + collr.parser = p
1240 + return collr
1241 }
1242
1243 -func prepareWebLogCollectCustom(t *testing.T) *WebLog {
1243 +func prepareWebLogCollectCustom(t *testing.T) *Collector {
1244 t.Helper()
1245 format := strings.Join([]string{
1246 "$side",
@@ -1280,19 +1280,19 @@ func prepareWebLogCollectCustom(t *testing.T) *WebLog {
1280 Histogram: nil,
1281 GroupRespCodes: false,
1282 }
1283 - weblog := New()
1284 - weblog.Config = cfg
1285 - require.NoError(t, weblog.Init())
1286 - require.NoError(t, weblog.Check())
1287 - defer weblog.Cleanup()
1283 + collr := New()
1284 + collr.Config = cfg
1285 + require.NoError(t, collr.Init())
1286 + require.NoError(t, collr.Check())
1287 + defer collr.Cleanup()
1288
1289 - p, err := logs.NewCSVParser(weblog.ParserConfig.CSV, bytes.NewReader(dataCustomLog))
1289 + p, err := logs.NewCSVParser(collr.ParserConfig.CSV, bytes.NewReader(dataCustomLog))
1290 require.NoError(t, err)
1291 - weblog.parser = p
1292 - return weblog
1291 + collr.parser = p
1292 + return collr
1293 }
1294
1295 -func prepareWebLogCollectCustomTimeFields(t *testing.T) *WebLog {
1295 +func prepareWebLogCollectCustomTimeFields(t *testing.T) *Collector {
1296 t.Helper()
1297 format := strings.Join([]string{
1298 "$time1",
@@ -1326,19 +1326,19 @@ func prepareWebLogCollectCustomTimeFields(t *testing.T) *WebLog {
1326 Histogram: nil,
1327 GroupRespCodes: false,
1328 }
1329 - weblog := New()
1330 - weblog.Config = cfg
1331 - require.NoError(t, weblog.Init())
1332 - require.NoError(t, weblog.Check())
1333 - defer weblog.Cleanup()
1329 + collr := New()
1330 + collr.Config = cfg
1331 + require.NoError(t, collr.Init())
1332 + require.NoError(t, collr.Check())
1333 + defer collr.Cleanup()
1334
1335 - p, err := logs.NewCSVParser(weblog.ParserConfig.CSV, bytes.NewReader(dataCustomTimeFieldLog))
1335 + p, err := logs.NewCSVParser(collr.ParserConfig.CSV, bytes.NewReader(dataCustomTimeFieldLog))
1336 require.NoError(t, err)
1337 - weblog.parser = p
1338 - return weblog
1337 + collr.parser = p
1338 + return collr
1339 }
1340
1341 -func prepareWebLogCollectCustomNumericFields(t *testing.T) *WebLog {
1341 +func prepareWebLogCollectCustomNumericFields(t *testing.T) *Collector {
1342 t.Helper()
1343 format := strings.Join([]string{
1344 "$numeric1",
@@ -1372,19 +1372,19 @@ func prepareWebLogCollectCustomNumericFields(t *testing.T) *WebLog {
1372 Histogram: nil,
1373 GroupRespCodes: false,
1374 }
1375 - weblog := New()
1376 - weblog.Config = cfg
1377 - require.NoError(t, weblog.Init())
1378 - require.NoError(t, weblog.Check())
1379 - defer weblog.Cleanup()
1375 + collr := New()
1376 + collr.Config = cfg
1377 + require.NoError(t, collr.Init())
1378 + require.NoError(t, collr.Check())
1379 + defer collr.Cleanup()
1380
1381 - p, err := logs.NewCSVParser(weblog.ParserConfig.CSV, bytes.NewReader(dataCustomTimeFieldLog))
1381 + p, err := logs.NewCSVParser(collr.ParserConfig.CSV, bytes.NewReader(dataCustomTimeFieldLog))
1382 require.NoError(t, err)
1383 - weblog.parser = p
1384 - return weblog
1383 + collr.parser = p
1384 + return collr
1385 }
1386
1387 -func prepareWebLogCollectIISFields(t *testing.T) *WebLog {
1387 +func prepareWebLogCollectIISFields(t *testing.T) *Collector {
1388 t.Helper()
1389 format := strings.Join([]string{
1390 "-", // date
@@ -1422,16 +1422,16 @@ func prepareWebLogCollectIISFields(t *testing.T) *WebLog {
1422 GroupRespCodes: false,
1423 }
1424
1425 - weblog := New()
1426 - weblog.Config = cfg
1427 - require.NoError(t, weblog.Init())
1428 - require.NoError(t, weblog.Check())
1429 - defer weblog.Cleanup()
1425 + collr := New()
1426 + collr.Config = cfg
1427 + require.NoError(t, collr.Init())
1428 + require.NoError(t, collr.Check())
1429 + defer collr.Cleanup()
1430
1431 - p, err := logs.NewCSVParser(weblog.ParserConfig.CSV, bytes.NewReader(dataIISLog))
1431 + p, err := logs.NewCSVParser(collr.ParserConfig.CSV, bytes.NewReader(dataIISLog))
1432 require.NoError(t, err)
1433 - weblog.parser = p
1434 - return weblog
1433 + collr.parser = p
1434 + return collr
1435 }
1436
1437 // generateLogs is used to populate 'testdata/full.log'
src/go/plugin/go.d/collector/weblog/init.go
+61 -61
@@ -28,33 +28,33 @@ func newPattern(up userPattern) (*pattern, error) {
28 return &pattern{name: up.Name, Matcher: m}, nil
29 }
30
31 -func (w *WebLog) createURLPatterns() error {
32 - if len(w.URLPatterns) == 0 {
33 - w.Debug("skipping URL patterns creating, no patterns provided")
31 +func (c *Collector) createURLPatterns() error {
32 + if len(c.URLPatterns) == 0 {
33 + c.Debug("skipping URL patterns creating, no patterns provided")
34 return nil
35 }
36 - w.Debug("starting URL patterns creating")
37 - for _, up := range w.URLPatterns {
36 + c.Debug("starting URL patterns creating")
37 + for _, up := range c.URLPatterns {
38 p, err := newPattern(up)
39 if err != nil {
40 return fmt.Errorf("create pattern %+v: %v", up, err)
41 }
42 - w.Debugf("created pattern '%s', type '%T', match '%s'", p.name, p.Matcher, up.Match)
43 - w.urlPatterns = append(w.urlPatterns, p)
42 + c.Debugf("created pattern '%s', type '%T', match '%s'", p.name, p.Matcher, up.Match)
43 + c.urlPatterns = append(c.urlPatterns, p)
44 }
45 - w.Debugf("created %d URL pattern(s)", len(w.URLPatterns))
45 + c.Debugf("created %d URL pattern(s)", len(c.URLPatterns))
46 return nil
47 }
48
49 -func (w *WebLog) createCustomFields() error {
50 - if len(w.CustomFields) == 0 {
51 - w.Debug("skipping custom fields creating, no custom fields provided")
49 +func (c *Collector) createCustomFields() error {
50 + if len(c.CustomFields) == 0 {
51 + c.Debug("skipping custom fields creating, no custom fields provided")
52 return nil
53 }
54
55 - w.Debug("starting custom fields creating")
56 - w.customFields = make(map[string][]*pattern)
57 - for i, cf := range w.CustomFields {
55 + c.Debug("starting custom fields creating")
56 + c.customFields = make(map[string][]*pattern)
57 + for i, cf := range c.CustomFields {
58 if cf.Name == "" {
59 return fmt.Errorf("create custom field: name not set (field %d)", i+1)
60 }
@@ -63,45 +63,45 @@ func (w *WebLog) createCustomFields() error {
63 if err != nil {
64 return fmt.Errorf("create field '%s' pattern %+v: %v", cf.Name, up, err)
65 }
66 - w.Debugf("created field '%s', pattern '%s', type '%T', match '%s'", cf.Name, p.name, p.Matcher, up.Match)
67 - w.customFields[cf.Name] = append(w.customFields[cf.Name], p)
66 + c.Debugf("created field '%s', pattern '%s', type '%T', match '%s'", cf.Name, p.name, p.Matcher, up.Match)
67 + c.customFields[cf.Name] = append(c.customFields[cf.Name], p)
68 }
69 }
70 - w.Debugf("created %d custom field(s)", len(w.CustomFields))
70 + c.Debugf("created %d custom field(s)", len(c.CustomFields))
71 return nil
72 }
73
74 -func (w *WebLog) createCustomTimeFields() error {
75 - if len(w.CustomTimeFields) == 0 {
76 - w.Debug("skipping custom time fields creating, no custom time fields provided")
74 +func (c *Collector) createCustomTimeFields() error {
75 + if len(c.CustomTimeFields) == 0 {
76 + c.Debug("skipping custom time fields creating, no custom time fields provided")
77 return nil
78 }
79
80 - w.Debug("starting custom time fields creating")
81 - w.customTimeFields = make(map[string][]float64)
82 - for i, ctf := range w.CustomTimeFields {
80 + c.Debug("starting custom time fields creating")
81 + c.customTimeFields = make(map[string][]float64)
82 + for i, ctf := range c.CustomTimeFields {
83 if ctf.Name == "" {
84 return fmt.Errorf("create custom field: name not set (field %d)", i+1)
85 }
86 - w.customTimeFields[ctf.Name] = ctf.Histogram
87 - w.Debugf("created time field '%s', histogram '%v'", ctf.Name, ctf.Histogram)
86 + c.customTimeFields[ctf.Name] = ctf.Histogram
87 + c.Debugf("created time field '%s', histogram '%v'", ctf.Name, ctf.Histogram)
88 }
89 - w.Debugf("created %d custom time field(s)", len(w.CustomTimeFields))
89 + c.Debugf("created %d custom time field(s)", len(c.CustomTimeFields))
90 return nil
91 }
92
93 -func (w *WebLog) createCustomNumericFields() error {
94 - if len(w.CustomNumericFields) == 0 {
95 - w.Debug("no custom time fields provided")
93 +func (c *Collector) createCustomNumericFields() error {
94 + if len(c.CustomNumericFields) == 0 {
95 + c.Debug("no custom time fields provided")
96 return nil
97 }
98
99 - w.Debugf("creating custom numeric fields for '%+v'", w.CustomNumericFields)
99 + c.Debugf("creating custom numeric fields for '%+v'", c.CustomNumericFields)
100
101 - w.customNumericFields = make(map[string]bool)
101 + c.customNumericFields = make(map[string]bool)
102
103 - for i := range w.CustomNumericFields {
104 - v := w.CustomNumericFields[i]
103 + for i := range c.CustomNumericFields {
104 + v := c.CustomNumericFields[i]
105 if v.Name == "" {
106 return fmt.Errorf("custom numeric field (%d): 'name' not set", i+1)
107 }
@@ -114,48 +114,48 @@ func (w *WebLog) createCustomNumericFields() error {
114 if v.Divisor <= 0 {
115 v.Divisor = 1
116 }
117 - w.CustomNumericFields[i] = v
118 - w.customNumericFields[v.Name] = true
117 + c.CustomNumericFields[i] = v
118 + c.customNumericFields[v.Name] = true
119 }
120
121 return nil
122 }
123
124 -func (w *WebLog) createLogLine() {
125 - w.line = newEmptyLogLine()
124 +func (c *Collector) createLogLine() {
125 + c.line = newEmptyLogLine()
126
127 - for v := range w.customFields {
128 - w.line.custom.fields[v] = struct{}{}
127 + for v := range c.customFields {
128 + c.line.custom.fields[v] = struct{}{}
129 }
130 - for v := range w.customTimeFields {
131 - w.line.custom.fields[v] = struct{}{}
130 + for v := range c.customTimeFields {
131 + c.line.custom.fields[v] = struct{}{}
132 }
133 - for v := range w.customNumericFields {
134 - w.line.custom.fields[v] = struct{}{}
133 + for v := range c.customNumericFields {
134 + c.line.custom.fields[v] = struct{}{}
135 }
136 }
137
138 -func (w *WebLog) createLogReader() error {
139 - w.Cleanup()
140 - w.Debug("starting log reader creating")
138 +func (c *Collector) createLogReader() error {
139 + c.Cleanup()
140 + c.Debug("starting log reader creating")
141
142 - reader, err := logs.Open(w.Path, w.ExcludePath, w.Logger)
142 + reader, err := logs.Open(c.Path, c.ExcludePath, c.Logger)
143 if err != nil {
144 return fmt.Errorf("creating log reader: %v", err)
145 }
146
147 - w.Debugf("created log reader, current file '%s'", reader.CurrentFilename())
148 - w.file = reader
147 + c.Debugf("created log reader, current file '%s'", reader.CurrentFilename())
148 + c.file = reader
149
150 return nil
151 }
152
153 -func (w *WebLog) createParser() error {
154 - w.Debug("starting parser creating")
153 +func (c *Collector) createParser() error {
154 + c.Debug("starting parser creating")
155
156 const readLinesNum = 100
157
158 - lines, err := logs.ReadLastLines(w.file.CurrentFilename(), readLinesNum)
158 + lines, err := logs.ReadLastLines(c.file.CurrentFilename(), readLinesNum)
159 if err != nil {
160 return fmt.Errorf("failed to read last lines: %v", err)
161 }
@@ -165,23 +165,23 @@ func (w *WebLog) createParser() error {
165 if line = strings.TrimSpace(line); line == "" {
166 continue
167 }
168 - w.Debugf("last line: '%s'", line)
168 + c.Debugf("last line: '%s'", line)
169
170 - w.parser, err = w.newParser([]byte(line))
170 + c.parser, err = c.newParser([]byte(line))
171 if err != nil {
172 - w.Debugf("failed to create parser from line: %v", err)
172 + c.Debugf("failed to create parser from line: %v", err)
173 continue
174 }
175
176 - w.line.reset()
176 + c.line.reset()
177
178 - if err = w.parser.Parse([]byte(line), w.line); err != nil {
179 - w.Debugf("failed to parse line: %v", err)
178 + if err = c.parser.Parse([]byte(line), c.line); err != nil {
179 + c.Debugf("failed to parse line: %v", err)
180 continue
181 }
182
183 - if err = w.line.verify(); err != nil {
184 - w.Debugf("failed to verify line: %v", err)
183 + if err = c.line.verify(); err != nil {
184 + c.Debugf("failed to verify line: %v", err)
185 continue
186 }
187
@@ -190,7 +190,7 @@ func (w *WebLog) createParser() error {
190 }
191
192 if !found {
193 - return fmt.Errorf("failed to create log parser (file '%s')", w.file.CurrentFilename())
193 + return fmt.Errorf("failed to create log parser (file '%s')", c.file.CurrentFilename())
194 }
195
196 return nil
src/go/plugin/go.d/collector/weblog/parser.go
+29 -29
@@ -72,66 +72,66 @@ var (
72 reJSON = regexp.MustCompile(`^[[:space:]]*{.*}[[:space:]]*$`)
73 )
74
75 -func (w *WebLog) newParser(record []byte) (logs.Parser, error) {
76 - if w.ParserConfig.LogType == typeAuto {
77 - w.Debugf("log_type is %s, will try format auto-detection", typeAuto)
75 +func (c *Collector) newParser(record []byte) (logs.Parser, error) {
76 + if c.ParserConfig.LogType == typeAuto {
77 + c.Debugf("log_type is %s, will try format auto-detection", typeAuto)
78 if len(record) == 0 {
79 - return nil, fmt.Errorf("empty line, can't auto-detect format (%s)", w.file.CurrentFilename())
79 + return nil, fmt.Errorf("empty line, can't auto-detect format (%s)", c.file.CurrentFilename())
80 }
81 - return w.guessParser(record)
81 + return c.guessParser(record)
82 }
83
84 - w.ParserConfig.CSV.Format = cleanApacheLogFormat(w.ParserConfig.CSV.Format)
85 - w.Debugf("log_type is %s, skipping auto-detection", w.ParserConfig.LogType)
86 - switch w.ParserConfig.LogType {
84 + c.ParserConfig.CSV.Format = cleanApacheLogFormat(c.ParserConfig.CSV.Format)
85 + c.Debugf("log_type is %s, skipping auto-detection", c.ParserConfig.LogType)
86 + switch c.ParserConfig.LogType {
87 case logs.TypeCSV:
88 - w.Debugf("config: %+v", w.ParserConfig.CSV)
88 + c.Debugf("config: %+v", c.ParserConfig.CSV)
89 case logs.TypeLTSV:
90 - w.Debugf("config: %+v", w.ParserConfig.LogType)
90 + c.Debugf("config: %+v", c.ParserConfig.LogType)
91 case logs.TypeRegExp:
92 - w.Debugf("config: %+v", w.ParserConfig.RegExp)
92 + c.Debugf("config: %+v", c.ParserConfig.RegExp)
93 case logs.TypeJSON:
94 - w.Debugf("config: %+v", w.ParserConfig.JSON)
94 + c.Debugf("config: %+v", c.ParserConfig.JSON)
95 }
96 - return logs.NewParser(w.ParserConfig, w.file)
96 + return logs.NewParser(c.ParserConfig, c.file)
97 }
98
99 -func (w *WebLog) guessParser(record []byte) (logs.Parser, error) {
100 - w.Debug("starting log type auto-detection")
99 +func (c *Collector) guessParser(record []byte) (logs.Parser, error) {
100 + c.Debug("starting log type auto-detection")
101 if reLTSV.Match(record) {
102 - w.Debug("log type is LTSV")
103 - return logs.NewLTSVParser(w.ParserConfig.LTSV, w.file)
102 + c.Debug("log type is LTSV")
103 + return logs.NewLTSVParser(c.ParserConfig.LTSV, c.file)
104 }
105 if reJSON.Match(record) {
106 - w.Debug("log type is JSON")
107 - return logs.NewJSONParser(w.ParserConfig.JSON, w.file)
106 + c.Debug("log type is JSON")
107 + return logs.NewJSONParser(c.ParserConfig.JSON, c.file)
108 }
109 - w.Debug("log type is CSV")
110 - return w.guessCSVParser(record)
109 + c.Debug("log type is CSV")
110 + return c.guessCSVParser(record)
111 }
112
113 -func (w *WebLog) guessCSVParser(record []byte) (logs.Parser, error) {
114 - w.Debug("starting csv log format auto-detection")
115 - w.Debugf("config: %+v", w.ParserConfig.CSV)
113 +func (c *Collector) guessCSVParser(record []byte) (logs.Parser, error) {
114 + c.Debug("starting csv log format auto-detection")
115 + c.Debugf("config: %+v", c.ParserConfig.CSV)
116 for _, format := range guessOrder {
117 format = cleanCSVFormat(format)
118 - cfg := w.ParserConfig.CSV
118 + cfg := c.ParserConfig.CSV
119 cfg.Format = format
120
121 - w.Debugf("trying format: '%s'", format)
122 - parser, err := logs.NewCSVParser(cfg, w.file)
121 + c.Debugf("trying format: '%s'", format)
122 + parser, err := logs.NewCSVParser(cfg, c.file)
123 if err != nil {
124 return nil, err
125 }
126
127 line := newEmptyLogLine()
128 if err := parser.Parse(record, line); err != nil {
129 - w.Debug("parse: ", err)
129 + c.Debug("parse: ", err)
130 continue
131 }
132
133 if err = line.verify(); err != nil {
134 - w.Debug("verify: ", err)
134 + c.Debug("verify: ", err)
135 continue
136 }
137 return parser, nil
src/go/plugin/go.d/collector/weblog/parser_test.go
+2 -2
@@ -202,7 +202,7 @@ func TestWebLog_guessCSVParser(t *testing.T) {
202 }
203 }
204
205 -func prepareWebLog() *WebLog {
205 +func prepareWebLog() *Collector {
206 cfg := logs.ParserConfig{
207 LogType: typeAuto,
208 CSV: logs.CSVConfig{
@@ -215,7 +215,7 @@ func prepareWebLog() *WebLog {
215 },
216 }
217
218 - return &WebLog{
218 + return &Collector{
219 Config: Config{
220 GroupRespCodes: false,
221 ParserConfig: cfg,
src/go/plugin/go.d/collector/whoisquery/collect.go
+7 -7
@@ -4,20 +4,20 @@ package whoisquery
4
5 import "fmt"
6
7 -func (w *WhoisQuery) collect() (map[string]int64, error) {
8 - remainingTime, err := w.prov.remainingTime()
7 +func (c *Collector) collect() (map[string]int64, error) {
8 + remainingTime, err := c.prov.remainingTime()
9 if err != nil {
10 - return nil, fmt.Errorf("%v (source: %s)", err, w.Source)
10 + return nil, fmt.Errorf("%v (source: %s)", err, c.Source)
11 }
12
13 mx := make(map[string]int64)
14 - w.collectExpiration(mx, remainingTime)
14 + c.collectExpiration(mx, remainingTime)
15
16 return mx, nil
17 }
18
19 -func (w *WhoisQuery) collectExpiration(mx map[string]int64, remainingTime float64) {
19 +func (c *Collector) collectExpiration(mx map[string]int64, remainingTime float64) {
20 mx["expiry"] = int64(remainingTime)
21 - mx["days_until_expiration_warning"] = w.DaysUntilWarn
22 - mx["days_until_expiration_critical"] = w.DaysUntilCrit
21 + mx["days_until_expiration_warning"] = c.DaysUntilWarn
22 + mx["days_until_expiration_critical"] = c.DaysUntilCrit
23 }
src/go/plugin/go.d/collector/whoisquery/collector.go renamed
+18 -18
@@ -26,8 +26,8 @@ func init() {
26 })
27 }
28
29 -func New() *WhoisQuery {
30 - return &WhoisQuery{
29 +func New() *Collector {
30 + return &Collector{
31 Config: Config{
32 Timeout: confopt.Duration(time.Second * 5),
33 DaysUntilWarn: 30,
@@ -44,7 +44,7 @@ type Config struct {
44 DaysUntilCrit int64 `yaml:"days_until_expiration_critical,omitempty" json:"days_until_expiration_critical"`
45 }
46
47 -type WhoisQuery struct {
47 +type Collector struct {
48 module.Base
49 Config `yaml:",inline" json:""`
50
@@ -53,28 +53,28 @@ type WhoisQuery struct {
53 prov provider
54 }
55
56 -func (w *WhoisQuery) Configuration() any {
57 - return w.Config
56 +func (c *Collector) Configuration() any {
57 + return c.Config
58 }
59
60 -func (w *WhoisQuery) Init() error {
61 - if err := w.validateConfig(); err != nil {
60 +func (c *Collector) Init() error {
61 + if err := c.validateConfig(); err != nil {
62 return fmt.Errorf("config validation: %v", err)
63 }
64
65 - prov, err := w.initProvider()
65 + prov, err := c.initProvider()
66 if err != nil {
67 return fmt.Errorf("init whois provider: %v", err)
68 }
69 - w.prov = prov
69 + c.prov = prov
70
71 - w.charts = w.initCharts()
71 + c.charts = c.initCharts()
72
73 return nil
74 }
75
76 -func (w *WhoisQuery) Check() error {
77 - mx, err := w.collect()
76 +func (c *Collector) Check() error {
77 + mx, err := c.collect()
78 if err != nil {
79 return err
80 }
@@ -84,14 +84,14 @@ func (w *WhoisQuery) Check() error {
84 return nil
85 }
86
87 -func (w *WhoisQuery) Charts() *module.Charts {
88 - return w.charts
87 +func (c *Collector) Charts() *module.Charts {
88 + return c.charts
89 }
90
91 -func (w *WhoisQuery) Collect() map[string]int64 {
92 - mx, err := w.collect()
91 +func (c *Collector) Collect() map[string]int64 {
92 + mx, err := c.collect()
93 if err != nil {
94 - w.Error(err)
94 + c.Error(err)
95 }
96
97 if len(mx) == 0 {
@@ -100,4 +100,4 @@ func (w *WhoisQuery) Collect() map[string]int64 {
100 return mx
101 }
102
103 -func (w *WhoisQuery) Cleanup() {}
103 +func (c *Collector) Cleanup() {}
src/go/plugin/go.d/collector/whoisquery/collector_test.go renamed
+35 -35
@@ -27,23 +27,23 @@ func Test_testDataIsValid(t *testing.T) {
27 }
28 }
29
30 -func TestWhoisQuery_ConfigurationSerialize(t *testing.T) {
31 - module.TestConfigurationSerialize(t, &WhoisQuery{}, dataConfigJSON, dataConfigYAML)
30 +func TestCollector_ConfigurationSerialize(t *testing.T) {
31 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
32 }
33
34 -func TestWhoisQuery_Cleanup(t *testing.T) {
34 +func TestCollector_Cleanup(t *testing.T) {
35 New().Cleanup()
36 }
37
38 -func TestWhoisQuery_Charts(t *testing.T) {
39 - whoisquery := New()
40 - whoisquery.Source = "example.com"
41 - require.NoError(t, whoisquery.Init())
38 +func TestCollector_Charts(t *testing.T) {
39 + collr := New()
40 + collr.Source = "example.com"
41 + require.NoError(t, collr.Init())
42
43 - assert.NotNil(t, whoisquery.Charts())
43 + assert.NotNil(t, collr.Charts())
44 }
45
46 -func TestWhoisQuery_Init(t *testing.T) {
46 +func TestCollector_Init(t *testing.T) {
47 const net = iota
48 tests := map[string]struct {
49 config Config
@@ -62,17 +62,17 @@ func TestWhoisQuery_Init(t *testing.T) {
62
63 for name, test := range tests {
64 t.Run(name, func(t *testing.T) {
65 - whoisquery := New()
66 - whoisquery.Config = test.config
65 + collr := New()
66 + collr.Config = test.config
67
68 if test.err {
69 - assert.Error(t, whoisquery.Init())
69 + assert.Error(t, collr.Init())
70 } else {
71 - require.NoError(t, whoisquery.Init())
71 + require.NoError(t, collr.Init())
72
73 var typeOK bool
74 if test.providerType == net {
75 - _, typeOK = whoisquery.prov.(*whoisClient)
75 + _, typeOK = collr.prov.(*whoisClient)
76 }
77
78 assert.True(t, typeOK)
@@ -81,27 +81,27 @@ func TestWhoisQuery_Init(t *testing.T) {
81 }
82 }
83
84 -func TestWhoisQuery_Check(t *testing.T) {
85 - whoisquery := New()
86 - whoisquery.prov = &mockProvider{remTime: 12345.678}
84 +func TestCollector_Check(t *testing.T) {
85 + collr := New()
86 + collr.prov = &mockProvider{remTime: 12345.678}
87
88 - assert.NoError(t, whoisquery.Check())
88 + assert.NoError(t, collr.Check())
89 }
90
91 -func TestWhoisQuery_Check_ReturnsFalseOnProviderError(t *testing.T) {
92 - whoisquery := New()
93 - whoisquery.prov = &mockProvider{err: true}
91 +func TestCollector_Check_ReturnsFalseOnProviderError(t *testing.T) {
92 + collr := New()
93 + collr.prov = &mockProvider{err: true}
94
95 - assert.Error(t, whoisquery.Check())
95 + assert.Error(t, collr.Check())
96 }
97
98 -func TestWhoisQuery_Collect(t *testing.T) {
99 - whoisquery := New()
100 - whoisquery.Source = "example.com"
101 - require.NoError(t, whoisquery.Init())
102 - whoisquery.prov = &mockProvider{remTime: 12345}
98 +func TestCollector_Collect(t *testing.T) {
99 + collr := New()
100 + collr.Source = "example.com"
101 + require.NoError(t, collr.Init())
102 + collr.prov = &mockProvider{remTime: 12345}
103
104 - mx := whoisquery.Collect()
104 + mx := collr.Collect()
105
106 expected := map[string]int64{
107 "expiry": 12345,
@@ -111,16 +111,16 @@ func TestWhoisQuery_Collect(t *testing.T) {
111
112 assert.NotZero(t, mx)
113 assert.Equal(t, expected, mx)
114 - module.TestMetricsHasAllChartsDims(t, whoisquery.Charts(), mx)
114 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
115 }
116
117 -func TestWhoisQuery_Collect_ReturnsNilOnProviderError(t *testing.T) {
118 - whoisquery := New()
119 - whoisquery.Source = "example.com"
120 - require.NoError(t, whoisquery.Init())
121 - whoisquery.prov = &mockProvider{err: true}
117 +func TestCollector_Collect_ReturnsNilOnProviderError(t *testing.T) {
118 + collr := New()
119 + collr.Source = "example.com"
120 + require.NoError(t, collr.Init())
121 + collr.prov = &mockProvider{err: true}
122
123 - assert.Nil(t, whoisquery.Collect())
123 + assert.Nil(t, collr.Collect())
124 }
125
126 type mockProvider struct {
src/go/plugin/go.d/collector/whoisquery/init.go
+6 -6
@@ -8,23 +8,23 @@ import (
8 "github.com/netdata/netdata/go/plugins/plugin/go.d/agent/module"
9 )
10
11 -func (w *WhoisQuery) validateConfig() error {
12 - if w.Source == "" {
11 +func (c *Collector) validateConfig() error {
12 + if c.Source == "" {
13 return errors.New("source is not set")
14 }
15 return nil
16 }
17
18 -func (w *WhoisQuery) initProvider() (provider, error) {
19 - return newProvider(w.Config)
18 +func (c *Collector) initProvider() (provider, error) {
19 + return newProvider(c.Config)
20 }
21
22 -func (w *WhoisQuery) initCharts() *module.Charts {
22 +func (c *Collector) initCharts() *module.Charts {
23 charts := baseCharts.Copy()
24
25 for _, chart := range *charts {
26 chart.Labels = []module.Label{
27 - {Key: "domain", Value: w.Source},
27 + {Key: "domain", Value: c.Source},
28 }
29 }
30
src/go/plugin/go.d/collector/windows/charts.go
+166 -166
@@ -4180,15 +4180,15 @@ var (
4180 }
4181 )
4182
4183 -func (w *Windows) addCPUCharts() {
4183 +func (c *Collector) addCPUCharts() {
4184 charts := cpuCharts.Copy()
4185
4186 - if err := w.Charts().Add(*charts...); err != nil {
4187 - w.Warning(err)
4186 + if err := c.Charts().Add(*charts...); err != nil {
4187 + c.Warning(err)
4188 }
4189 }
4190
4191 -func (w *Windows) addCPUCoreCharts(core string) {
4191 +func (c *Collector) addCPUCoreCharts(core string) {
4192 charts := cpuCoreChartsTmpl.Copy()
4193
4194 for _, chart := range *charts {
@@ -4201,25 +4201,25 @@ func (w *Windows) addCPUCoreCharts(core string) {
4201 }
4202 }
4203
4204 - if err := w.Charts().Add(*charts...); err != nil {
4205 - w.Warning(err)
4204 + if err := c.Charts().Add(*charts...); err != nil {
4205 + c.Warning(err)
4206 }
4207 }
4208
4209 -func (w *Windows) removeCPUCoreCharts(core string) {
4209 +func (c *Collector) removeCPUCoreCharts(core string) {
4210 px := fmt.Sprintf("cpu_core_%s", core)
4211 - w.removeCharts(px)
4211 + c.removeCharts(px)
4212 }
4213
4214 -func (w *Windows) addMemoryCharts() {
4214 +func (c *Collector) addMemoryCharts() {
4215 charts := memCharts.Copy()
4216
4217 - if err := w.Charts().Add(*charts...); err != nil {
4218 - w.Warning(err)
4217 + if err := c.Charts().Add(*charts...); err != nil {
4218 + c.Warning(err)
4219 }
4220 }
4221
4222 -func (w *Windows) addDiskCharts(disk string) {
4222 +func (c *Collector) addDiskCharts(disk string) {
4223 charts := diskChartsTmpl.Copy()
4224
4225 for _, chart := range *charts {
@@ -4232,17 +4232,17 @@ func (w *Windows) addDiskCharts(disk string) {
4232 }
4233 }
4234
4235 - if err := w.Charts().Add(*charts...); err != nil {
4236 - w.Warning(err)
4235 + if err := c.Charts().Add(*charts...); err != nil {
4236 + c.Warning(err)
4237 }
4238 }
4239
4240 -func (w *Windows) removeDiskCharts(disk string) {
4240 +func (c *Collector) removeDiskCharts(disk string) {
4241 px := fmt.Sprintf("logical_disk_%s", disk)
4242 - w.removeCharts(px)
4242 + c.removeCharts(px)
4243 }
4244
4245 -func (w *Windows) addNICCharts(nic string) {
4245 +func (c *Collector) addNICCharts(nic string) {
4246 charts := nicChartsTmpl.Copy()
4247
4248 for _, chart := range *charts {
@@ -4255,65 +4255,65 @@ func (w *Windows) addNICCharts(nic string) {
4255 }
4256 }
4257
4258 - if err := w.Charts().Add(*charts...); err != nil {
4259 - w.Warning(err)
4258 + if err := c.Charts().Add(*charts...); err != nil {
4259 + c.Warning(err)
4260 }
4261 }
4262
4263 -func (w *Windows) removeNICCharts(nic string) {
4263 +func (c *Collector) removeNICCharts(nic string) {
4264 px := fmt.Sprintf("nic_%s", nic)
4265 - w.removeCharts(px)
4265 + c.removeCharts(px)
4266 }
4267
4268 -func (w *Windows) addTCPCharts() {
4268 +func (c *Collector) addTCPCharts() {
4269 charts := tcpCharts.Copy()
4270
4271 - if err := w.Charts().Add(*charts...); err != nil {
4272 - w.Warning(err)
4271 + if err := c.Charts().Add(*charts...); err != nil {
4272 + c.Warning(err)
4273 }
4274 }
4275
4276 -func (w *Windows) addOSCharts() {
4276 +func (c *Collector) addOSCharts() {
4277 charts := osCharts.Copy()
4278
4279 - if err := w.Charts().Add(*charts...); err != nil {
4280 - w.Warning(err)
4279 + if err := c.Charts().Add(*charts...); err != nil {
4280 + c.Warning(err)
4281 }
4282 }
4283
4284 -func (w *Windows) addSystemCharts() {
4284 +func (c *Collector) addSystemCharts() {
4285 charts := systemCharts.Copy()
4286
4287 - if err := w.Charts().Add(*charts...); err != nil {
4288 - w.Warning(err)
4287 + if err := c.Charts().Add(*charts...); err != nil {
4288 + c.Warning(err)
4289 }
4290 }
4291
4292 -func (w *Windows) addLogonCharts() {
4292 +func (c *Collector) addLogonCharts() {
4293 charts := logonCharts.Copy()
4294
4295 - if err := w.Charts().Add(*charts...); err != nil {
4296 - w.Warning(err)
4295 + if err := c.Charts().Add(*charts...); err != nil {
4296 + c.Warning(err)
4297 }
4298 }
4299
4300 -func (w *Windows) addADFSCharts() {
4300 +func (c *Collector) addADFSCharts() {
4301 charts := adfsCharts.Copy()
4302
4303 - if err := w.Charts().Add(*charts...); err != nil {
4304 - w.Warning(err)
4303 + if err := c.Charts().Add(*charts...); err != nil {
4304 + c.Warning(err)
4305 }
4306 }
4307
4308 -func (w *Windows) addExchangeCharts() {
4308 +func (c *Collector) addExchangeCharts() {
4309 charts := exchangeCharts.Copy()
4310
4311 - if err := w.Charts().Add(*charts...); err != nil {
4312 - w.Warning(err)
4311 + if err := c.Charts().Add(*charts...); err != nil {
4312 + c.Warning(err)
4313 }
4314 }
4315
4316 -func (w *Windows) addExchangeWorkloadCharts(name string) {
4316 +func (c *Collector) addExchangeWorkloadCharts(name string) {
4317 charts := exchangeWorkloadChartsTmpl.Copy()
4318
4319 for _, chart := range *charts {
@@ -4326,17 +4326,17 @@ func (w *Windows) addExchangeWorkloadCharts(name string) {
4326 }
4327 }
4328
4329 - if err := w.Charts().Add(*charts...); err != nil {
4330 - w.Warning(err)
4329 + if err := c.Charts().Add(*charts...); err != nil {
4330 + c.Warning(err)
4331 }
4332 }
4333
4334 -func (w *Windows) removeExchangeWorkloadCharts(name string) {
4334 +func (c *Collector) removeExchangeWorkloadCharts(name string) {
4335 px := fmt.Sprintf("exchange_workload_%s", name)
4336 - w.removeCharts(px)
4336 + c.removeCharts(px)
4337 }
4338
4339 -func (w *Windows) addExchangeLDAPCharts(name string) {
4339 +func (c *Collector) addExchangeLDAPCharts(name string) {
4340 charts := exchangeLDAPChartsTmpl.Copy()
4341
4342 for _, chart := range *charts {
@@ -4349,17 +4349,17 @@ func (w *Windows) addExchangeLDAPCharts(name string) {
4349 }
4350 }
4351
4352 - if err := w.Charts().Add(*charts...); err != nil {
4353 - w.Warning(err)
4352 + if err := c.Charts().Add(*charts...); err != nil {
4353 + c.Warning(err)
4354 }
4355 }
4356
4357 -func (w *Windows) removeExchangeLDAPCharts(name string) {
4357 +func (c *Collector) removeExchangeLDAPCharts(name string) {
4358 px := fmt.Sprintf("exchange_ldap_%s", name)
4359 - w.removeCharts(px)
4359 + c.removeCharts(px)
4360 }
4361
4362 -func (w *Windows) addExchangeHTTPProxyCharts(name string) {
4362 +func (c *Collector) addExchangeHTTPProxyCharts(name string) {
4363 charts := exchangeHTTPProxyChartsTmpl.Copy()
4364
4365 for _, chart := range *charts {
@@ -4372,17 +4372,17 @@ func (w *Windows) addExchangeHTTPProxyCharts(name string) {
4372 }
4373 }
4374
4375 - if err := w.Charts().Add(*charts...); err != nil {
4376 - w.Warning(err)
4375 + if err := c.Charts().Add(*charts...); err != nil {
4376 + c.Warning(err)
4377 }
4378 }
4379
4380 -func (w *Windows) removeExchangeHTTPProxyCharts(name string) {
4380 +func (c *Collector) removeExchangeHTTPProxyCharts(name string) {
4381 px := fmt.Sprintf("exchange_http_proxy_%s", name)
4382 - w.removeCharts(px)
4382 + c.removeCharts(px)
4383 }
4384
4385 -func (w *Windows) addThermalZoneCharts(zone string) {
4385 +func (c *Collector) addThermalZoneCharts(zone string) {
4386 charts := thermalzoneChartsTmpl.Copy()
4387
4388 for _, chart := range *charts {
@@ -4395,17 +4395,17 @@ func (w *Windows) addThermalZoneCharts(zone string) {
4395 }
4396 }
4397
4398 - if err := w.Charts().Add(*charts...); err != nil {
4399 - w.Warning(err)
4398 + if err := c.Charts().Add(*charts...); err != nil {
4399 + c.Warning(err)
4400 }
4401 }
4402
4403 -func (w *Windows) removeThermalZoneCharts(zone string) {
4403 +func (c *Collector) removeThermalZoneCharts(zone string) {
4404 px := fmt.Sprintf("thermalzone_%s", zone)
4405 - w.removeCharts(px)
4405 + c.removeCharts(px)
4406 }
4407
4408 -func (w *Windows) addIISWebsiteCharts(website string) {
4408 +func (c *Collector) addIISWebsiteCharts(website string) {
4409 charts := iisWebsiteChartsTmpl.Copy()
4410
4411 for _, chart := range *charts {
@@ -4418,17 +4418,17 @@ func (w *Windows) addIISWebsiteCharts(website string) {
4418 }
4419 }
4420
4421 - if err := w.Charts().Add(*charts...); err != nil {
4422 - w.Warning(err)
4421 + if err := c.Charts().Add(*charts...); err != nil {
4422 + c.Warning(err)
4423 }
4424 }
4425
4426 -func (w *Windows) removeIIWebsiteSCharts(website string) {
4426 +func (c *Collector) removeIIWebsiteSCharts(website string) {
4427 px := fmt.Sprintf("iis_website_%s", website)
4428 - w.removeCharts(px)
4428 + c.removeCharts(px)
4429 }
4430
4431 -func (w *Windows) addMSSQLDBCharts(instance string, dbname string) {
4431 +func (c *Collector) addMSSQLDBCharts(instance string, dbname string) {
4432 charts := mssqlDatabaseChartsTmpl.Copy()
4433
4434 for _, chart := range *charts {
@@ -4442,17 +4442,17 @@ func (w *Windows) addMSSQLDBCharts(instance string, dbname string) {
4442 }
4443 }
4444
4445 - if err := w.Charts().Add(*charts...); err != nil {
4446 - w.Warning(err)
4445 + if err := c.Charts().Add(*charts...); err != nil {
4446 + c.Warning(err)
4447 }
4448 }
4449
4450 -func (w *Windows) removeMSSQLDBCharts(instance string, dbname string) {
4450 +func (c *Collector) removeMSSQLDBCharts(instance string, dbname string) {
4451 px := fmt.Sprintf("mssql_db_%s_instance_%s", dbname, instance)
4452 - w.removeCharts(px)
4452 + c.removeCharts(px)
4453 }
4454
4455 -func (w *Windows) addMSSQLInstanceCharts(instance string) {
4455 +func (c *Collector) addMSSQLInstanceCharts(instance string) {
4456 charts := mssqlInstanceChartsTmpl.Copy()
4457
4458 for _, chart := range *charts {
@@ -4465,33 +4465,33 @@ func (w *Windows) addMSSQLInstanceCharts(instance string) {
4465 }
4466 }
4467
4468 - if err := w.Charts().Add(*charts...); err != nil {
4469 - w.Warning(err)
4468 + if err := c.Charts().Add(*charts...); err != nil {
4469 + c.Warning(err)
4470 }
4471 }
4472
4473 -func (w *Windows) removeMSSQLInstanceCharts(instance string) {
4473 +func (c *Collector) removeMSSQLInstanceCharts(instance string) {
4474 px := fmt.Sprintf("mssql_instance_%s", instance)
4475 - w.removeCharts(px)
4475 + c.removeCharts(px)
4476 }
4477
4478 -func (w *Windows) addProcessesCharts() {
4478 +func (c *Collector) addProcessesCharts() {
4479 charts := processesCharts.Copy()
4480
4481 - if err := w.Charts().Add(*charts...); err != nil {
4482 - w.Warning(err)
4481 + if err := c.Charts().Add(*charts...); err != nil {
4482 + c.Warning(err)
4483 }
4484 }
4485
4486 -func (w *Windows) addADCharts() {
4486 +func (c *Collector) addADCharts() {
4487 charts := adCharts.Copy()
4488
4489 - if err := w.Charts().Add(*charts...); err != nil {
4490 - w.Warning(err)
4489 + if err := c.Charts().Add(*charts...); err != nil {
4490 + c.Warning(err)
4491 }
4492 }
4493
4494 -func (w *Windows) addCertificateTemplateCharts(template string) {
4494 +func (c *Collector) addCertificateTemplateCharts(template string) {
4495 charts := adcsCertTemplateChartsTmpl.Copy()
4496
4497 for _, chart := range *charts {
@@ -4504,18 +4504,18 @@ func (w *Windows) addCertificateTemplateCharts(template string) {
4504 }
4505 }
4506
4507 - if err := w.Charts().Add(*charts...); err != nil {
4508 - w.Warning(err)
4507 + if err := c.Charts().Add(*charts...); err != nil {
4508 + c.Warning(err)
4509 }
4510 }
4511
4512 -func (w *Windows) removeCertificateTemplateCharts(template string) {
4512 +func (c *Collector) removeCertificateTemplateCharts(template string) {
4513 px := fmt.Sprintf("adcs_cert_template_%s", template)
4514 - w.removeCharts(px)
4514 + c.removeCharts(px)
4515 }
4516
4517 -func (w *Windows) addProcessToCharts(procID string) {
4518 - for _, chart := range *w.Charts() {
4517 +func (c *Collector) addProcessToCharts(procID string) {
4518 + for _, chart := range *c.Charts() {
4519 var dim *module.Dim
4520 switch chart.ID {
4521 case processesCPUUtilizationTotalChart.ID:
@@ -4550,15 +4550,15 @@ func (w *Windows) addProcessToCharts(procID string) {
4550 }
4551
4552 if err := chart.AddDim(dim); err != nil {
4553 - w.Warning(err)
4553 + c.Warning(err)
4554 continue
4555 }
4556 chart.MarkNotCreated()
4557 }
4558 }
4559
4560 -func (w *Windows) removeProcessFromCharts(procID string) {
4561 - for _, chart := range *w.Charts() {
4560 +func (c *Collector) removeProcessFromCharts(procID string) {
4561 + for _, chart := range *c.Charts() {
4562 var id string
4563 switch chart.ID {
4564 case processesCPUUtilizationTotalChart.ID:
@@ -4582,14 +4582,14 @@ func (w *Windows) removeProcessFromCharts(procID string) {
4582 }
4583
4584 if err := chart.MarkDimRemove(id, false); err != nil {
4585 - w.Warning(err)
4585 + c.Warning(err)
4586 continue
4587 }
4588 chart.MarkNotCreated()
4589 }
4590 }
4591
4592 -func (w *Windows) addProcessNetFrameworkExceptionsCharts(procName string) {
4592 +func (c *Collector) addProcessNetFrameworkExceptionsCharts(procName string) {
4593 charts := netFrameworkCLRExceptionsChartsTmpl.Copy()
4594
4595 for _, chart := range *charts {
@@ -4602,17 +4602,17 @@ func (w *Windows) addProcessNetFrameworkExceptionsCharts(procName string) {
4602 }
4603 }
4604
4605 - if err := w.Charts().Add(*charts...); err != nil {
4606 - w.Warning(err)
4605 + if err := c.Charts().Add(*charts...); err != nil {
4606 + c.Warning(err)
4607 }
4608 }
4609
4610 -func (w *Windows) removeProcessFromNetFrameworkExceptionsCharts(procName string) {
4610 +func (c *Collector) removeProcessFromNetFrameworkExceptionsCharts(procName string) {
4611 px := fmt.Sprintf("netframework_%s_clrexception", strings.ToLower(procName))
4612 - w.removeCharts(px)
4612 + c.removeCharts(px)
4613 }
4614
4615 -func (w *Windows) addProcessNetFrameworkInteropCharts(procName string) {
4615 +func (c *Collector) addProcessNetFrameworkInteropCharts(procName string) {
4616 charts := netFrameworkCLRInteropChartsTmpl.Copy()
4617
4618 for _, chart := range *charts {
@@ -4625,17 +4625,17 @@ func (w *Windows) addProcessNetFrameworkInteropCharts(procName string) {
4625 }
4626 }
4627
4628 - if err := w.Charts().Add(*charts...); err != nil {
4629 - w.Warning(err)
4628 + if err := c.Charts().Add(*charts...); err != nil {
4629 + c.Warning(err)
4630 }
4631 }
4632
4633 -func (w *Windows) removeProcessNetFrameworkInteropCharts(procName string) {
4633 +func (c *Collector) removeProcessNetFrameworkInteropCharts(procName string) {
4634 px := fmt.Sprintf("netframework_%s_clrinterop", strings.ToLower(procName))
4635 - w.removeCharts(px)
4635 + c.removeCharts(px)
4636 }
4637
4638 -func (w *Windows) addProcessNetFrameworkJITCharts(procName string) {
4638 +func (c *Collector) addProcessNetFrameworkJITCharts(procName string) {
4639 charts := netFrameworkCLRJITChartsTmpl.Copy()
4640
4641 for _, chart := range *charts {
@@ -4648,17 +4648,17 @@ func (w *Windows) addProcessNetFrameworkJITCharts(procName string) {
4648 }
4649 }
4650
4651 - if err := w.Charts().Add(*charts...); err != nil {
4652 - w.Warning(err)
4651 + if err := c.Charts().Add(*charts...); err != nil {
4652 + c.Warning(err)
4653 }
4654 }
4655
4656 -func (w *Windows) removeProcessNetFrameworkJITCharts(procName string) {
4656 +func (c *Collector) removeProcessNetFrameworkJITCharts(procName string) {
4657 px := fmt.Sprintf("netframework_%s_clrjit", strings.ToLower(procName))
4658 - w.removeCharts(px)
4658 + c.removeCharts(px)
4659 }
4660
4661 -func (w *Windows) addProcessNetFrameworkLoadingCharts(procName string) {
4661 +func (c *Collector) addProcessNetFrameworkLoadingCharts(procName string) {
4662 charts := netFrameworkCLRLoadingChartsTmpl.Copy()
4663
4664 for _, chart := range *charts {
@@ -4671,17 +4671,17 @@ func (w *Windows) addProcessNetFrameworkLoadingCharts(procName string) {
4671 }
4672 }
4673
4674 - if err := w.Charts().Add(*charts...); err != nil {
4675 - w.Warning(err)
4674 + if err := c.Charts().Add(*charts...); err != nil {
4675 + c.Warning(err)
4676 }
4677 }
4678
4679 -func (w *Windows) removeProcessNetFrameworkLoadingCharts(procName string) {
4679 +func (c *Collector) removeProcessNetFrameworkLoadingCharts(procName string) {
4680 px := fmt.Sprintf("netframework_%s_clrloading", strings.ToLower(procName))
4681 - w.removeCharts(px)
4681 + c.removeCharts(px)
4682 }
4683
4684 -func (w *Windows) addProcessNetFrameworkLocksAndThreadsCharts(procName string) {
4684 +func (c *Collector) addProcessNetFrameworkLocksAndThreadsCharts(procName string) {
4685 charts := netFrameworkCLRLocksAndThreadsChartsTmpl.Copy()
4686
4687 for _, chart := range *charts {
@@ -4694,17 +4694,17 @@ func (w *Windows) addProcessNetFrameworkLocksAndThreadsCharts(procName string) {
4694 }
4695 }
4696
4697 - if err := w.Charts().Add(*charts...); err != nil {
4698 - w.Warning(err)
4697 + if err := c.Charts().Add(*charts...); err != nil {
4698 + c.Warning(err)
4699 }
4700 }
4701
4702 -func (w *Windows) removeProcessNetFrameworkLocksAndThreadsCharts(procName string) {
4702 +func (c *Collector) removeProcessNetFrameworkLocksAndThreadsCharts(procName string) {
4703 px := fmt.Sprintf("netframework_%s_clrlocksandthreads", strings.ToLower(procName))
4704 - w.removeCharts(px)
4704 + c.removeCharts(px)
4705 }
4706
4707 -func (w *Windows) addProcessNetFrameworkMemoryCharts(procName string) {
4707 +func (c *Collector) addProcessNetFrameworkMemoryCharts(procName string) {
4708 charts := netFrameworkCLRMemoryChartsTmpl.Copy()
4709
4710 for _, chart := range *charts {
@@ -4717,17 +4717,17 @@ func (w *Windows) addProcessNetFrameworkMemoryCharts(procName string) {
4717 }
4718 }
4719
4720 - if err := w.Charts().Add(*charts...); err != nil {
4721 - w.Warning(err)
4720 + if err := c.Charts().Add(*charts...); err != nil {
4721 + c.Warning(err)
4722 }
4723 }
4724
4725 -func (w *Windows) removeProcessNetFrameworkMemoryCharts(procName string) {
4725 +func (c *Collector) removeProcessNetFrameworkMemoryCharts(procName string) {
4726 px := fmt.Sprintf("netframework_%s_clrmemory", strings.ToLower(procName))
4727 - w.removeCharts(px)
4727 + c.removeCharts(px)
4728 }
4729
4730 -func (w *Windows) addProcessNetFrameworkRemotingCharts(procName string) {
4730 +func (c *Collector) addProcessNetFrameworkRemotingCharts(procName string) {
4731 charts := netFrameworkCLRRemotingChartsTmpl.Copy()
4732
4733 for _, chart := range *charts {
@@ -4740,17 +4740,17 @@ func (w *Windows) addProcessNetFrameworkRemotingCharts(procName string) {
4740 }
4741 }
4742
4743 - if err := w.Charts().Add(*charts...); err != nil {
4744 - w.Warning(err)
4743 + if err := c.Charts().Add(*charts...); err != nil {
4744 + c.Warning(err)
4745 }
4746 }
4747
4748 -func (w *Windows) removeProcessNetFrameworkRemotingCharts(procName string) {
4748 +func (c *Collector) removeProcessNetFrameworkRemotingCharts(procName string) {
4749 px := fmt.Sprintf("netframework_%s_clrremoting", strings.ToLower(procName))
4750 - w.removeCharts(px)
4750 + c.removeCharts(px)
4751 }
4752
4753 -func (w *Windows) addProcessNetFrameworkSecurityCharts(procName string) {
4753 +func (c *Collector) addProcessNetFrameworkSecurityCharts(procName string) {
4754 charts := netFrameworkCLRSecurityChartsTmpl.Copy()
4755
4756 for _, chart := range *charts {
@@ -4763,17 +4763,17 @@ func (w *Windows) addProcessNetFrameworkSecurityCharts(procName string) {
4763 }
4764 }
4765
4766 - if err := w.Charts().Add(*charts...); err != nil {
4767 - w.Warning(err)
4766 + if err := c.Charts().Add(*charts...); err != nil {
4767 + c.Warning(err)
4768 }
4769 }
4770
4771 -func (w *Windows) removeProcessNetFrameworkSecurityCharts(procName string) {
4771 +func (c *Collector) removeProcessNetFrameworkSecurityCharts(procName string) {
4772 px := fmt.Sprintf("netframework_%s_clrsecurity", strings.ToLower(procName))
4773 - w.removeCharts(px)
4773 + c.removeCharts(px)
4774 }
4775
4776 -func (w *Windows) addServiceCharts(svc string) {
4776 +func (c *Collector) addServiceCharts(svc string) {
4777 charts := serviceChartsTmpl.Copy()
4778
4779 for _, chart := range *charts {
@@ -4786,17 +4786,17 @@ func (w *Windows) addServiceCharts(svc string) {
4786 }
4787 }
4788
4789 - if err := w.Charts().Add(*charts...); err != nil {
4790 - w.Warning(err)
4789 + if err := c.Charts().Add(*charts...); err != nil {
4790 + c.Warning(err)
4791 }
4792 }
4793
4794 -func (w *Windows) removeServiceCharts(svc string) {
4794 +func (c *Collector) removeServiceCharts(svc string) {
4795 px := fmt.Sprintf("service_%s", svc)
4796 - w.removeCharts(px)
4796 + c.removeCharts(px)
4797 }
4798
4799 -func (w *Windows) addCollectorCharts(name string) {
4799 +func (c *Collector) addCollectorCharts(name string) {
4800 charts := collectorChartsTmpl.Copy()
4801
4802 for _, chart := range *charts {
@@ -4809,20 +4809,20 @@ func (w *Windows) addCollectorCharts(name string) {
4809 }
4810 }
4811
4812 - if err := w.Charts().Add(*charts...); err != nil {
4813 - w.Warning(err)
4812 + if err := c.Charts().Add(*charts...); err != nil {
4813 + c.Warning(err)
4814 }
4815 }
4816
4817 -func (w *Windows) addHypervCharts() {
4817 +func (c *Collector) addHypervCharts() {
4818 charts := hypervChartsTmpl.Copy()
4819
4820 - if err := w.Charts().Add(*charts...); err != nil {
4821 - w.Warning(err)
4820 + if err := c.Charts().Add(*charts...); err != nil {
4821 + c.Warning(err)
4822 }
4823 }
4824
4825 -func (w *Windows) addHypervVMCharts(vm string) {
4825 +func (c *Collector) addHypervVMCharts(vm string) {
4826 charts := hypervVMChartsTemplate.Copy()
4827 n := hypervCleanName(vm)
4828
@@ -4836,17 +4836,17 @@ func (w *Windows) addHypervVMCharts(vm string) {
4836 }
4837 }
4838
4839 - if err := w.Charts().Add(*charts...); err != nil {
4840 - w.Warning(err)
4839 + if err := c.Charts().Add(*charts...); err != nil {
4840 + c.Warning(err)
4841 }
4842 }
4843
4844 -func (w *Windows) removeHypervVMCharts(vm string) {
4844 +func (c *Collector) removeHypervVMCharts(vm string) {
4845 px := fmt.Sprintf("vm_%s", hypervCleanName(vm))
4846 - w.removeCharts(px)
4846 + c.removeCharts(px)
4847 }
4848
4849 -func (w *Windows) addHypervVMDeviceCharts(device string) {
4849 +func (c *Collector) addHypervVMDeviceCharts(device string) {
4850 charts := hypervVMDeviceChartsTemplate.Copy()
4851 n := hypervCleanName(device)
4852
@@ -4860,17 +4860,17 @@ func (w *Windows) addHypervVMDeviceCharts(device string) {
4860 }
4861 }
4862
4863 - if err := w.Charts().Add(*charts...); err != nil {
4864 - w.Warning(err)
4863 + if err := c.Charts().Add(*charts...); err != nil {
4864 + c.Warning(err)
4865 }
4866 }
4867
4868 -func (w *Windows) removeHypervVMDeviceCharts(device string) {
4868 +func (c *Collector) removeHypervVMDeviceCharts(device string) {
4869 px := fmt.Sprintf("vm_device_%s", hypervCleanName(device))
4870 - w.removeCharts(px)
4870 + c.removeCharts(px)
4871 }
4872
4873 -func (w *Windows) addHypervVMInterfaceCharts(iface string) {
4873 +func (c *Collector) addHypervVMInterfaceCharts(iface string) {
4874 charts := hypervVMInterfaceChartsTemplate.Copy()
4875 n := hypervCleanName(iface)
4876
@@ -4884,17 +4884,17 @@ func (w *Windows) addHypervVMInterfaceCharts(iface string) {
4884 }
4885 }
4886
4887 - if err := w.Charts().Add(*charts...); err != nil {
4888 - w.Warning(err)
4887 + if err := c.Charts().Add(*charts...); err != nil {
4888 + c.Warning(err)
4889 }
4890 }
4891
4892 -func (w *Windows) removeHypervVMInterfaceCharts(iface string) {
4892 +func (c *Collector) removeHypervVMInterfaceCharts(iface string) {
4893 px := fmt.Sprintf("vm_interface_%s", hypervCleanName(iface))
4894 - w.removeCharts(px)
4894 + c.removeCharts(px)
4895 }
4896
4897 -func (w *Windows) addHypervVSwitchCharts(vswitch string) {
4897 +func (c *Collector) addHypervVSwitchCharts(vswitch string) {
4898 charts := hypervVswitchChartsTemplate.Copy()
4899 n := hypervCleanName(vswitch)
4900
@@ -4908,23 +4908,23 @@ func (w *Windows) addHypervVSwitchCharts(vswitch string) {
4908 }
4909 }
4910
4911 - if err := w.Charts().Add(*charts...); err != nil {
4912 - w.Warning(err)
4911 + if err := c.Charts().Add(*charts...); err != nil {
4912 + c.Warning(err)
4913 }
4914 }
4915
4916 -func (w *Windows) removeHypervVSwitchCharts(vswitch string) {
4916 +func (c *Collector) removeHypervVSwitchCharts(vswitch string) {
4917 px := fmt.Sprintf("vswitch_%s", hypervCleanName(vswitch))
4918 - w.removeCharts(px)
4918 + c.removeCharts(px)
4919 }
4920
4921 -func (w *Windows) removeCollectorCharts(name string) {
4921 +func (c *Collector) removeCollectorCharts(name string) {
4922 px := fmt.Sprintf("collector_%s", name)
4923 - w.removeCharts(px)
4923 + c.removeCharts(px)
4924 }
4925
4926 -func (w *Windows) removeCharts(prefix string) {
4927 - for _, chart := range *w.Charts() {
4926 +func (c *Collector) removeCharts(prefix string) {
4927 + for _, chart := range *c.Charts() {
4928 if strings.HasPrefix(chart.ID, prefix) {
4929 chart.MarkRemove()
4930 chart.MarkNotCreated()
src/go/plugin/go.d/collector/windows/collect.go
+31 -31
@@ -37,14 +37,14 @@ const (
37 collectorHyperv = "hyperv"
38 )
39
40 -func (w *Windows) collect() (map[string]int64, error) {
41 - pms, err := w.prom.ScrapeSeries()
40 +func (c *Collector) collect() (map[string]int64, error) {
41 + pms, err := c.prom.ScrapeSeries()
42 if err != nil {
43 return nil, err
44 }
45
46 mx := make(map[string]int64)
47 - w.collectMetrics(mx, pms)
47 + c.collectMetrics(mx, pms)
48
49 if hasKey(mx, "os_visible_memory_bytes", "memory_available_bytes") {
50 mx["memory_used_bytes"] = 0 +
@@ -81,8 +81,8 @@ func (w *Windows) collect() (map[string]int64, error) {
81 return mx, nil
82 }
83
84 -func (w *Windows) collectMetrics(mx map[string]int64, pms prometheus.Series) {
85 - w.collectCollector(mx, pms)
84 +func (c *Collector) collectMetrics(mx map[string]int64, pms prometheus.Series) {
85 + c.collectCollector(mx, pms)
86 for _, pm := range pms.FindByName(metricCollectorSuccess) {
87 if pm.Value == 0 {
88 continue
@@ -90,57 +90,57 @@ func (w *Windows) collectMetrics(mx map[string]int64, pms prometheus.Series) {
90
91 switch pm.Labels.Get("collector") {
92 case collectorCPU:
93 - w.collectCPU(mx, pms)
93 + c.collectCPU(mx, pms)
94 case collectorMemory:
95 - w.collectMemory(mx, pms)
95 + c.collectMemory(mx, pms)
96 case collectorNet:
97 - w.collectNet(mx, pms)
97 + c.collectNet(mx, pms)
98 case collectorLogicalDisk:
99 - w.collectLogicalDisk(mx, pms)
99 + c.collectLogicalDisk(mx, pms)
100 case collectorOS:
101 - w.collectOS(mx, pms)
101 + c.collectOS(mx, pms)
102 case collectorSystem:
103 - w.collectSystem(mx, pms)
103 + c.collectSystem(mx, pms)
104 case collectorLogon:
105 - w.collectLogon(mx, pms)
105 + c.collectLogon(mx, pms)
106 case collectorThermalZone:
107 - w.collectThermalzone(mx, pms)
107 + c.collectThermalzone(mx, pms)
108 case collectorTCP:
109 - w.collectTCP(mx, pms)
109 + c.collectTCP(mx, pms)
110 case collectorProcess:
111 - w.collectProcess(mx, pms)
111 + c.collectProcess(mx, pms)
112 case collectorService:
113 - w.collectService(mx, pms)
113 + c.collectService(mx, pms)
114 case collectorIIS:
115 - w.collectIIS(mx, pms)
115 + c.collectIIS(mx, pms)
116 case collectorMSSQL:
117 - w.collectMSSQL(mx, pms)
117 + c.collectMSSQL(mx, pms)
118 case collectorAD:
119 - w.collectAD(mx, pms)
119 + c.collectAD(mx, pms)
120 case collectorADCS:
121 - w.collectADCS(mx, pms)
121 + c.collectADCS(mx, pms)
122 case collectorADFS:
123 - w.collectADFS(mx, pms)
123 + c.collectADFS(mx, pms)
124 case collectorNetFrameworkCLRExceptions:
125 - w.collectNetFrameworkCLRExceptions(mx, pms)
125 + c.collectNetFrameworkCLRExceptions(mx, pms)
126 case collectorNetFrameworkCLRInterop:
127 - w.collectNetFrameworkCLRInterop(mx, pms)
127 + c.collectNetFrameworkCLRInterop(mx, pms)
128 case collectorNetFrameworkCLRJIT:
129 - w.collectNetFrameworkCLRJIT(mx, pms)
129 + c.collectNetFrameworkCLRJIT(mx, pms)
130 case collectorNetFrameworkCLRLoading:
131 - w.collectNetFrameworkCLRLoading(mx, pms)
131 + c.collectNetFrameworkCLRLoading(mx, pms)
132 case collectorNetFrameworkCLRLocksAndThreads:
133 - w.collectNetFrameworkCLRLocksAndThreads(mx, pms)
133 + c.collectNetFrameworkCLRLocksAndThreads(mx, pms)
134 case collectorNetFrameworkCLRMemory:
135 - w.collectNetFrameworkCLRMemory(mx, pms)
135 + c.collectNetFrameworkCLRMemory(mx, pms)
136 case collectorNetFrameworkCLRRemoting:
137 - w.collectNetFrameworkCLRRemoting(mx, pms)
137 + c.collectNetFrameworkCLRRemoting(mx, pms)
138 case collectorNetFrameworkCLRSecurity:
139 - w.collectNetFrameworkCLRSecurity(mx, pms)
139 + c.collectNetFrameworkCLRSecurity(mx, pms)
140 case collectorExchange:
141 - w.collectExchange(mx, pms)
141 + c.collectExchange(mx, pms)
142 case collectorHyperv:
143 - w.collectHyperv(mx, pms)
143 + c.collectHyperv(mx, pms)
144 }
145 }
146 }
src/go/plugin/go.d/collector/windows/collect_ad.go
+4 -4
@@ -29,10 +29,10 @@ const (
29 metricADNameCacheHitsTotal = "windows_ad_name_cache_hits_total"
30 )
31
32 -func (w *Windows) collectAD(mx map[string]int64, pms prometheus.Series) {
33 - if !w.cache.collection[collectorAD] {
34 - w.cache.collection[collectorAD] = true
35 - w.addADCharts()
32 +func (c *Collector) collectAD(mx map[string]int64, pms prometheus.Series) {
33 + if !c.cache.collection[collectorAD] {
34 + c.cache.collection[collectorAD] = true
35 + c.addADCharts()
36 }
37
38 if pm := pms.FindByName(metricADATQAverageRequestLatency); pm.Len() > 0 {
src/go/plugin/go.d/collector/windows/collect_adcs.go
+7 -7
@@ -24,7 +24,7 @@ const (
24 metricADCSSignedCertTimestampListProcessingTime = "windows_adcs_signed_certificate_timestamp_list_processing_time_seconds"
25 )
26
27 -func (w *Windows) collectADCS(mx map[string]int64, pms prometheus.Series) {
27 +func (c *Collector) collectADCS(mx map[string]int64, pms prometheus.Series) {
28 pms = pms.FindByNames(
29 metricADCSRequestsTotal,
30 metricADCSFailedRequestsTotal,
@@ -56,15 +56,15 @@ func (w *Windows) collectADCS(mx map[string]int64, pms prometheus.Series) {
56 }
57
58 for template := range seen {
59 - if !w.cache.adcs[template] {
60 - w.cache.adcs[template] = true
61 - w.addCertificateTemplateCharts(template)
59 + if !c.cache.adcs[template] {
60 + c.cache.adcs[template] = true
61 + c.addCertificateTemplateCharts(template)
62 }
63 }
64 - for template := range w.cache.adcs {
64 + for template := range c.cache.adcs {
65 if !seen[template] {
66 - delete(w.cache.adcs, template)
67 - w.removeCertificateTemplateCharts(template)
66 + delete(c.cache.adcs, template)
67 + c.removeCertificateTemplateCharts(template)
68 }
69 }
70 }
src/go/plugin/go.d/collector/windows/collect_adfs.go
+4 -4
@@ -102,10 +102,10 @@ var adfsMetrics = []string{
102 metricADFSWSTrustTokenRequestsSuccessTotal,
103 }
104
105 -func (w *Windows) collectADFS(mx map[string]int64, pms prometheus.Series) {
106 - if !w.cache.collection[collectorADFS] {
107 - w.cache.collection[collectorADFS] = true
108 - w.addADFSCharts()
105 +func (c *Collector) collectADFS(mx map[string]int64, pms prometheus.Series) {
106 + if !c.cache.collection[collectorADFS] {
107 + c.cache.collection[collectorADFS] = true
108 + c.addADFSCharts()
109 }
110
111 for _, pm := range pms.FindByNames(adfsMetrics...) {
src/go/plugin/go.d/collector/windows/collect_collector.go
+7 -7
@@ -11,7 +11,7 @@ const (
11 metricCollectorSuccess = "windows_exporter_collector_success"
12 )
13
14 -func (w *Windows) collectCollector(mx map[string]int64, pms prometheus.Series) {
14 +func (c *Collector) collectCollector(mx map[string]int64, pms prometheus.Series) {
15 seen := make(map[string]bool)
16 px := "collector_"
17 for _, pm := range pms.FindByName(metricCollectorDuration) {
@@ -32,15 +32,15 @@ func (w *Windows) collectCollector(mx map[string]int64, pms prometheus.Series) {
32 }
33
34 for name := range seen {
35 - if !w.cache.collectors[name] {
36 - w.cache.collectors[name] = true
37 - w.addCollectorCharts(name)
35 + if !c.cache.collectors[name] {
36 + c.cache.collectors[name] = true
37 + c.addCollectorCharts(name)
38 }
39 }
40 - for name := range w.cache.collectors {
40 + for name := range c.cache.collectors {
41 if !seen[name] {
42 - delete(w.cache.collectors, name)
43 - w.removeCollectorCharts(name)
42 + delete(c.cache.collectors, name)
43 + c.removeCollectorCharts(name)
44 }
45 }
46 }
src/go/plugin/go.d/collector/windows/collect_cpu.go
+10 -10
@@ -13,10 +13,10 @@ const (
13 metricCPUCStateTotal = "windows_cpu_cstate_seconds_total"
14 )
15
16 -func (w *Windows) collectCPU(mx map[string]int64, pms prometheus.Series) {
17 - if !w.cache.collection[collectorCPU] {
18 - w.cache.collection[collectorCPU] = true
19 - w.addCPUCharts()
16 +func (c *Collector) collectCPU(mx map[string]int64, pms prometheus.Series) {
17 + if !c.cache.collection[collectorCPU] {
18 + c.cache.collection[collectorCPU] = true
19 + c.addCPUCharts()
20 }
21
22 seen := make(map[string]bool)
@@ -64,15 +64,15 @@ func (w *Windows) collectCPU(mx map[string]int64, pms prometheus.Series) {
64 }
65
66 for core := range seen {
67 - if !w.cache.cores[core] {
68 - w.cache.cores[core] = true
69 - w.addCPUCoreCharts(core)
67 + if !c.cache.cores[core] {
68 + c.cache.cores[core] = true
69 + c.addCPUCoreCharts(core)
70 }
71 }
72 - for core := range w.cache.cores {
72 + for core := range c.cache.cores {
73 if !seen[core] {
74 - delete(w.cache.cores, core)
75 - w.removeCPUCoreCharts(core)
74 + delete(c.cache.cores, core)
75 + c.removeCPUCoreCharts(core)
76 }
77 }
78 }
src/go/plugin/go.d/collector/windows/collect_exchange.go
+30 -30
@@ -53,10 +53,10 @@ const (
53 metricExchangeHTTPProxyRequestsTotal = "windows_exchange_http_proxy_requests_total"
54 )
55
56 -func (w *Windows) collectExchange(mx map[string]int64, pms prometheus.Series) {
57 - if !w.cache.collection[collectorExchange] {
58 - w.cache.collection[collectorExchange] = true
59 - w.addExchangeCharts()
56 +func (c *Collector) collectExchange(mx map[string]int64, pms prometheus.Series) {
57 + if !c.cache.collection[collectorExchange] {
58 + c.cache.collection[collectorExchange] = true
59 + c.addExchangeCharts()
60 }
61
62 if pm := pms.FindByName(metricExchangeActiveSyncPingCmdsPending); pm.Len() > 0 {
@@ -99,13 +99,13 @@ func (w *Windows) collectExchange(mx map[string]int64, pms prometheus.Series) {
99 mx["exchange_rpc_user_count"] = int64(pm.Max())
100 }
101
102 - w.collectExchangeAddTransportQueueMetric(mx, pms)
103 - w.collectExchangeAddWorkloadMetric(mx, pms)
104 - w.collectExchangeAddLDAPMetric(mx, pms)
105 - w.collectExchangeAddHTTPProxyMetric(mx, pms)
102 + c.collectExchangeAddTransportQueueMetric(mx, pms)
103 + c.collectExchangeAddWorkloadMetric(mx, pms)
104 + c.collectExchangeAddLDAPMetric(mx, pms)
105 + c.collectExchangeAddHTTPProxyMetric(mx, pms)
106 }
107
108 -func (w *Windows) collectExchangeAddTransportQueueMetric(mx map[string]int64, pms prometheus.Series) {
108 +func (c *Collector) collectExchangeAddTransportQueueMetric(mx map[string]int64, pms prometheus.Series) {
109 pms = pms.FindByNames(
110 metricExchangeTransportQueuesActiveMailboxDelivery,
111 metricExchangeTransportQueuesExternalActiveRemoteDelivery,
@@ -125,7 +125,7 @@ func (w *Windows) collectExchangeAddTransportQueueMetric(mx map[string]int64, pm
125 }
126 }
127
128 -func (w *Windows) collectExchangeAddWorkloadMetric(mx map[string]int64, pms prometheus.Series) {
128 +func (c *Collector) collectExchangeAddWorkloadMetric(mx map[string]int64, pms prometheus.Series) {
129 seen := make(map[string]bool)
130
131 for _, pm := range pms.FindByNames(
@@ -150,20 +150,20 @@ func (w *Windows) collectExchangeAddWorkloadMetric(mx map[string]int64, pms prom
150 }
151
152 for name := range seen {
153 - if !w.cache.exchangeWorkload[name] {
154 - w.cache.exchangeWorkload[name] = true
155 - w.addExchangeWorkloadCharts(name)
153 + if !c.cache.exchangeWorkload[name] {
154 + c.cache.exchangeWorkload[name] = true
155 + c.addExchangeWorkloadCharts(name)
156 }
157 }
158 - for name := range w.cache.exchangeWorkload {
158 + for name := range c.cache.exchangeWorkload {
159 if !seen[name] {
160 - delete(w.cache.exchangeWorkload, name)
161 - w.removeExchangeWorkloadCharts(name)
160 + delete(c.cache.exchangeWorkload, name)
161 + c.removeExchangeWorkloadCharts(name)
162 }
163 }
164 }
165
166 -func (w *Windows) collectExchangeAddLDAPMetric(mx map[string]int64, pms prometheus.Series) {
166 +func (c *Collector) collectExchangeAddLDAPMetric(mx map[string]int64, pms prometheus.Series) {
167 seen := make(map[string]bool)
168
169 for _, pm := range pms.FindByNames(
@@ -190,20 +190,20 @@ func (w *Windows) collectExchangeAddLDAPMetric(mx map[string]int64, pms promethe
190 }
191
192 for name := range seen {
193 - if !w.cache.exchangeLDAP[name] {
194 - w.cache.exchangeLDAP[name] = true
195 - w.addExchangeLDAPCharts(name)
193 + if !c.cache.exchangeLDAP[name] {
194 + c.cache.exchangeLDAP[name] = true
195 + c.addExchangeLDAPCharts(name)
196 }
197 }
198 - for name := range w.cache.exchangeLDAP {
198 + for name := range c.cache.exchangeLDAP {
199 if !seen[name] {
200 - delete(w.cache.exchangeLDAP, name)
201 - w.removeExchangeLDAPCharts(name)
200 + delete(c.cache.exchangeLDAP, name)
201 + c.removeExchangeLDAPCharts(name)
202 }
203 }
204 }
205
206 -func (w *Windows) collectExchangeAddHTTPProxyMetric(mx map[string]int64, pms prometheus.Series) {
206 +func (c *Collector) collectExchangeAddHTTPProxyMetric(mx map[string]int64, pms prometheus.Series) {
207 seen := make(map[string]bool)
208
209 for _, pm := range pms.FindByNames(
@@ -231,15 +231,15 @@ func (w *Windows) collectExchangeAddHTTPProxyMetric(mx map[string]int64, pms pro
231 }
232
233 for name := range seen {
234 - if !w.cache.exchangeHTTPProxy[name] {
235 - w.cache.exchangeHTTPProxy[name] = true
236 - w.addExchangeHTTPProxyCharts(name)
234 + if !c.cache.exchangeHTTPProxy[name] {
235 + c.cache.exchangeHTTPProxy[name] = true
236 + c.addExchangeHTTPProxyCharts(name)
237 }
238 }
239 - for name := range w.cache.exchangeHTTPProxy {
239 + for name := range c.cache.exchangeHTTPProxy {
240 if !seen[name] {
241 - delete(w.cache.exchangeHTTPProxy, name)
242 - w.removeExchangeHTTPProxyCharts(name)
241 + delete(c.cache.exchangeHTTPProxy, name)
242 + c.removeExchangeHTTPProxyCharts(name)
243 }
244 }
245 }
src/go/plugin/go.d/collector/windows/collect_hyperv.go
+36 -36
@@ -75,10 +75,10 @@ const (
75 metricHypervVSwitchPurgedMACAddresses = "windows_hyperv_vswitch_purged_mac_addresses_total"
76 )
77
78 -func (w *Windows) collectHyperv(mx map[string]int64, pms prometheus.Series) {
79 - if !w.cache.collection[collectorHyperv] {
80 - w.cache.collection[collectorHyperv] = true
81 - w.addHypervCharts()
78 +func (c *Collector) collectHyperv(mx map[string]int64, pms prometheus.Series) {
79 + if !c.cache.collection[collectorHyperv] {
80 + c.cache.collection[collectorHyperv] = true
81 + c.addHypervCharts()
82 }
83
84 for _, v := range []string{
@@ -108,13 +108,13 @@ func (w *Windows) collectHyperv(mx map[string]int64, pms prometheus.Series) {
108 }
109 }
110
111 - w.collectHypervVM(mx, pms)
112 - w.collectHypervVMDevices(mx, pms)
113 - w.collectHypervVMInterface(mx, pms)
114 - w.collectHypervVSwitch(mx, pms)
111 + c.collectHypervVM(mx, pms)
112 + c.collectHypervVMDevices(mx, pms)
113 + c.collectHypervVMInterface(mx, pms)
114 + c.collectHypervVSwitch(mx, pms)
115 }
116
117 -func (w *Windows) collectHypervVM(mx map[string]int64, pms prometheus.Series) {
117 +func (c *Collector) collectHypervVM(mx map[string]int64, pms prometheus.Series) {
118 seen := make(map[string]bool)
119 px := "hyperv_vm_"
120
@@ -150,20 +150,20 @@ func (w *Windows) collectHypervVM(mx map[string]int64, pms prometheus.Series) {
150 }
151
152 for v := range seen {
153 - if !w.cache.hypervVMMem[v] {
154 - w.cache.hypervVMMem[v] = true
155 - w.addHypervVMCharts(v)
153 + if !c.cache.hypervVMMem[v] {
154 + c.cache.hypervVMMem[v] = true
155 + c.addHypervVMCharts(v)
156 }
157 }
158 - for v := range w.cache.hypervVMMem {
158 + for v := range c.cache.hypervVMMem {
159 if !seen[v] {
160 - delete(w.cache.hypervVMMem, v)
161 - w.removeHypervVMCharts(v)
160 + delete(c.cache.hypervVMMem, v)
161 + c.removeHypervVMCharts(v)
162 }
163 }
164 }
165
166 -func (w *Windows) collectHypervVMDevices(mx map[string]int64, pms prometheus.Series) {
166 +func (c *Collector) collectHypervVMDevices(mx map[string]int64, pms prometheus.Series) {
167 seen := make(map[string]bool)
168 px := "hyperv_vm_device_"
169
@@ -184,20 +184,20 @@ func (w *Windows) collectHypervVMDevices(mx map[string]int64, pms prometheus.Ser
184 }
185
186 for v := range seen {
187 - if !w.cache.hypervVMDevices[v] {
188 - w.cache.hypervVMDevices[v] = true
189 - w.addHypervVMDeviceCharts(v)
187 + if !c.cache.hypervVMDevices[v] {
188 + c.cache.hypervVMDevices[v] = true
189 + c.addHypervVMDeviceCharts(v)
190 }
191 }
192 - for v := range w.cache.hypervVMDevices {
192 + for v := range c.cache.hypervVMDevices {
193 if !seen[v] {
194 - delete(w.cache.hypervVMDevices, v)
195 - w.removeHypervVMDeviceCharts(v)
194 + delete(c.cache.hypervVMDevices, v)
195 + c.removeHypervVMDeviceCharts(v)
196 }
197 }
198 }
199
200 -func (w *Windows) collectHypervVMInterface(mx map[string]int64, pms prometheus.Series) {
200 +func (c *Collector) collectHypervVMInterface(mx map[string]int64, pms prometheus.Series) {
201 seen := make(map[string]bool)
202 px := "hyperv_vm_interface_"
203
@@ -219,20 +219,20 @@ func (w *Windows) collectHypervVMInterface(mx map[string]int64, pms prometheus.S
219 }
220
221 for v := range seen {
222 - if !w.cache.hypervVMInterfaces[v] {
223 - w.cache.hypervVMInterfaces[v] = true
224 - w.addHypervVMInterfaceCharts(v)
222 + if !c.cache.hypervVMInterfaces[v] {
223 + c.cache.hypervVMInterfaces[v] = true
224 + c.addHypervVMInterfaceCharts(v)
225 }
226 }
227 - for v := range w.cache.hypervVMInterfaces {
227 + for v := range c.cache.hypervVMInterfaces {
228 if !seen[v] {
229 - delete(w.cache.hypervVMInterfaces, v)
230 - w.removeHypervVMInterfaceCharts(v)
229 + delete(c.cache.hypervVMInterfaces, v)
230 + c.removeHypervVMInterfaceCharts(v)
231 }
232 }
233 }
234
235 -func (w *Windows) collectHypervVSwitch(mx map[string]int64, pms prometheus.Series) {
235 +func (c *Collector) collectHypervVSwitch(mx map[string]int64, pms prometheus.Series) {
236 seen := make(map[string]bool)
237 px := "hyperv_vswitch_"
238
@@ -267,15 +267,15 @@ func (w *Windows) collectHypervVSwitch(mx map[string]int64, pms prometheus.Serie
267 }
268
269 for v := range seen {
270 - if !w.cache.hypervVswitch[v] {
271 - w.cache.hypervVswitch[v] = true
272 - w.addHypervVSwitchCharts(v)
270 + if !c.cache.hypervVswitch[v] {
271 + c.cache.hypervVswitch[v] = true
272 + c.addHypervVSwitchCharts(v)
273 }
274 }
275 - for v := range w.cache.hypervVswitch {
275 + for v := range c.cache.hypervVswitch {
276 if !seen[v] {
277 - delete(w.cache.hypervVswitch, v)
278 - w.removeHypervVSwitchCharts(v)
277 + delete(c.cache.hypervVswitch, v)
278 + c.removeHypervVSwitchCharts(v)
279 }
280 }
281 }
src/go/plugin/go.d/collector/windows/collect_iis.go
+7 -7
@@ -27,7 +27,7 @@ const (
27 metricIISNotFoundErrorsTotal = "windows_iis_not_found_errors_total"
28 )
29
30 -func (w *Windows) collectIIS(mx map[string]int64, pms prometheus.Series) {
30 +func (c *Collector) collectIIS(mx map[string]int64, pms prometheus.Series) {
31 seen := make(map[string]bool)
32 px := "iis_website_"
33 for _, pm := range pms.FindByName(metricIISCurrentAnonymousUsers) {
@@ -122,15 +122,15 @@ func (w *Windows) collectIIS(mx map[string]int64, pms prometheus.Series) {
122 }
123
124 for site := range seen {
125 - if !w.cache.iis[site] {
126 - w.cache.iis[site] = true
127 - w.addIISWebsiteCharts(site)
125 + if !c.cache.iis[site] {
126 + c.cache.iis[site] = true
127 + c.addIISWebsiteCharts(site)
128 }
129 }
130 - for site := range w.cache.iis {
130 + for site := range c.cache.iis {
131 if !seen[site] {
132 - delete(w.cache.iis, site)
133 - w.removeIIWebsiteSCharts(site)
132 + delete(c.cache.iis, site)
133 + c.removeIIWebsiteSCharts(site)
134 }
135 }
136 }
src/go/plugin/go.d/collector/windows/collect_logical_disk.go
+7 -7
@@ -19,7 +19,7 @@ const (
19 metricLDWriteLatencyTotal = "windows_logical_disk_write_latency_seconds_total"
20 )
21
22 -func (w *Windows) collectLogicalDisk(mx map[string]int64, pms prometheus.Series) {
22 +func (c *Collector) collectLogicalDisk(mx map[string]int64, pms prometheus.Series) {
23 seen := make(map[string]bool)
24 px := "logical_disk_"
25 for _, pm := range pms.FindByName(metricLDReadBytesTotal) {
@@ -80,16 +80,16 @@ func (w *Windows) collectLogicalDisk(mx map[string]int64, pms prometheus.Series)
80 }
81
82 for disk := range seen {
83 - if !w.cache.volumes[disk] {
84 - w.cache.volumes[disk] = true
85 - w.addDiskCharts(disk)
83 + if !c.cache.volumes[disk] {
84 + c.cache.volumes[disk] = true
85 + c.addDiskCharts(disk)
86 }
87 mx[px+disk+"_used_space"] = mx[px+disk+"_total_space"] - mx[px+disk+"_free_space"]
88 }
89 - for disk := range w.cache.volumes {
89 + for disk := range c.cache.volumes {
90 if !seen[disk] {
91 - delete(w.cache.volumes, disk)
92 - w.removeDiskCharts(disk)
91 + delete(c.cache.volumes, disk)
92 + c.removeDiskCharts(disk)
93 }
94 }
95 }
src/go/plugin/go.d/collector/windows/collect_logon.go
+4 -4
@@ -10,10 +10,10 @@ const (
10 metricLogonType = "windows_logon_logon_type"
11 )
12
13 -func (w *Windows) collectLogon(mx map[string]int64, pms prometheus.Series) {
14 - if !w.cache.collection[collectorLogon] {
15 - w.cache.collection[collectorLogon] = true
16 - w.addLogonCharts()
13 +func (c *Collector) collectLogon(mx map[string]int64, pms prometheus.Series) {
14 + if !c.cache.collection[collectorLogon] {
15 + c.cache.collection[collectorLogon] = true
16 + c.addLogonCharts()
17 }
18
19 for _, pm := range pms.FindByName(metricLogonType) {
src/go/plugin/go.d/collector/windows/collect_memory.go
+4 -4
@@ -24,10 +24,10 @@ const (
24 metricMemStandbyCacheReserveBytes = "windows_memory_standby_cache_reserve_bytes"
25 )
26
27 -func (w *Windows) collectMemory(mx map[string]int64, pms prometheus.Series) {
28 - if !w.cache.collection[collectorMemory] {
29 - w.cache.collection[collectorMemory] = true
30 - w.addMemoryCharts()
27 +func (c *Collector) collectMemory(mx map[string]int64, pms prometheus.Series) {
28 + if !c.cache.collection[collectorMemory] {
29 + c.cache.collection[collectorMemory] = true
30 + c.addMemoryCharts()
31 }
32
33 if pm := pms.FindByName(metricMemAvailBytes); pm.Len() > 0 {
src/go/plugin/go.d/collector/windows/collect_mssql.go
+13 -13
@@ -40,7 +40,7 @@ const (
40 metricMSSQLDatabaseWriteTransactions = "windows_mssql_databases_write_transactions"
41 )
42
43 -func (w *Windows) collectMSSQL(mx map[string]int64, pms prometheus.Series) {
43 +func (c *Collector) collectMSSQL(mx map[string]int64, pms prometheus.Series) {
44 instances := make(map[string]bool)
45 dbs := make(map[string]bool)
46 px := "mssql_instance_"
@@ -223,31 +223,31 @@ func (w *Windows) collectMSSQL(mx map[string]int64, pms prometheus.Series) {
223 }
224
225 for v := range instances {
226 - if !w.cache.mssqlInstances[v] {
227 - w.cache.mssqlInstances[v] = true
228 - w.addMSSQLInstanceCharts(v)
226 + if !c.cache.mssqlInstances[v] {
227 + c.cache.mssqlInstances[v] = true
228 + c.addMSSQLInstanceCharts(v)
229 }
230 }
231 - for v := range w.cache.mssqlInstances {
231 + for v := range c.cache.mssqlInstances {
232 if !instances[v] {
233 - delete(w.cache.mssqlInstances, v)
234 - w.removeMSSQLInstanceCharts(v)
233 + delete(c.cache.mssqlInstances, v)
234 + c.removeMSSQLInstanceCharts(v)
235 }
236 }
237
238 for v := range dbs {
239 - if !w.cache.mssqlDBs[v] {
240 - w.cache.mssqlDBs[v] = true
239 + if !c.cache.mssqlDBs[v] {
240 + c.cache.mssqlDBs[v] = true
241 if s := strings.Split(v, ":"); len(s) == 2 {
242 - w.addMSSQLDBCharts(s[0], s[1])
242 + c.addMSSQLDBCharts(s[0], s[1])
243 }
244 }
245 }
246 - for v := range w.cache.mssqlDBs {
246 + for v := range c.cache.mssqlDBs {
247 if !dbs[v] {
248 - delete(w.cache.mssqlDBs, v)
248 + delete(c.cache.mssqlDBs, v)
249 if s := strings.Split(v, ":"); len(s) == 2 {
250 - w.removeMSSQLDBCharts(s[0], s[1])
250 + c.removeMSSQLDBCharts(s[0], s[1])
251 }
252 }
253 }
src/go/plugin/go.d/collector/windows/collect_net.go
+7 -7
@@ -19,7 +19,7 @@ const (
19 metricNetPacketsOutboundErrorsTotal = "windows_net_packets_outbound_errors_total"
20 )
21
22 -func (w *Windows) collectNet(mx map[string]int64, pms prometheus.Series) {
22 +func (c *Collector) collectNet(mx map[string]int64, pms prometheus.Series) {
23 seen := make(map[string]bool)
24 px := "net_nic_"
25 for _, pm := range pms.FindByName(metricNetBytesReceivedTotal) {
@@ -72,15 +72,15 @@ func (w *Windows) collectNet(mx map[string]int64, pms prometheus.Series) {
72 }
73
74 for nic := range seen {
75 - if !w.cache.nics[nic] {
76 - w.cache.nics[nic] = true
77 - w.addNICCharts(nic)
75 + if !c.cache.nics[nic] {
76 + c.cache.nics[nic] = true
77 + c.addNICCharts(nic)
78 }
79 }
80 - for nic := range w.cache.nics {
80 + for nic := range c.cache.nics {
81 if !seen[nic] {
82 - delete(w.cache.nics, nic)
83 - w.removeNICCharts(nic)
82 + delete(c.cache.nics, nic)
83 + c.removeNICCharts(nic)
84 }
85 }
86 }
src/go/plugin/go.d/collector/windows/collect_netframework.go
+56 -56
@@ -17,7 +17,7 @@ const (
17 metricNetFrameworkCLRExceptionsThrowCatchDepthTotal = "windows_netframework_clrexceptions_throw_to_catch_depth_total"
18 )
19
20 -func (w *Windows) collectNetFrameworkCLRExceptions(mx map[string]int64, pms prometheus.Series) {
20 +func (c *Collector) collectNetFrameworkCLRExceptions(mx map[string]int64, pms prometheus.Series) {
21 seen := make(map[string]bool)
22
23 for _, pm := range pms.FindByName(metricNetFrameworkCLRExceptionsThrownTotal) {
@@ -49,16 +49,16 @@ func (w *Windows) collectNetFrameworkCLRExceptions(mx map[string]int64, pms prom
49 }
50
51 for proc := range seen {
52 - if !w.cache.netFrameworkCLRExceptions[proc] {
53 - w.cache.netFrameworkCLRExceptions[proc] = true
54 - w.addProcessNetFrameworkExceptionsCharts(proc)
52 + if !c.cache.netFrameworkCLRExceptions[proc] {
53 + c.cache.netFrameworkCLRExceptions[proc] = true
54 + c.addProcessNetFrameworkExceptionsCharts(proc)
55 }
56 }
57
58 - for proc := range w.cache.netFrameworkCLRExceptions {
58 + for proc := range c.cache.netFrameworkCLRExceptions {
59 if !seen[proc] {
60 - delete(w.cache.netFrameworkCLRExceptions, proc)
61 - w.removeProcessFromNetFrameworkExceptionsCharts(proc)
60 + delete(c.cache.netFrameworkCLRExceptions, proc)
61 + c.removeProcessFromNetFrameworkExceptionsCharts(proc)
62 }
63 }
64 }
@@ -69,7 +69,7 @@ const (
69 metricNetFrameworkCLRInteropStubsCreatedTotal = "windows_netframework_clrinterop_interop_stubs_created_total"
70 )
71
72 -func (w *Windows) collectNetFrameworkCLRInterop(mx map[string]int64, pms prometheus.Series) {
72 +func (c *Collector) collectNetFrameworkCLRInterop(mx map[string]int64, pms prometheus.Series) {
73 seen := make(map[string]bool)
74
75 for _, pm := range pms.FindByName(metricNetFrameworkCLRInteropComCallableWrappersTotal) {
@@ -94,16 +94,16 @@ func (w *Windows) collectNetFrameworkCLRInterop(mx map[string]int64, pms prometh
94 }
95
96 for proc := range seen {
97 - if !w.cache.netFrameworkCLRInterops[proc] {
98 - w.cache.netFrameworkCLRInterops[proc] = true
99 - w.addProcessNetFrameworkInteropCharts(proc)
97 + if !c.cache.netFrameworkCLRInterops[proc] {
98 + c.cache.netFrameworkCLRInterops[proc] = true
99 + c.addProcessNetFrameworkInteropCharts(proc)
100 }
101 }
102
103 - for proc := range w.cache.netFrameworkCLRInterops {
103 + for proc := range c.cache.netFrameworkCLRInterops {
104 if !seen[proc] {
105 - delete(w.cache.netFrameworkCLRInterops, proc)
106 - w.removeProcessNetFrameworkInteropCharts(proc)
105 + delete(c.cache.netFrameworkCLRInterops, proc)
106 + c.removeProcessNetFrameworkInteropCharts(proc)
107 }
108 }
109 }
@@ -115,7 +115,7 @@ const (
115 metricNetFrameworkCLRJITILBytesTotal = "windows_netframework_clrjit_jit_il_bytes_total"
116 )
117
118 -func (w *Windows) collectNetFrameworkCLRJIT(mx map[string]int64, pms prometheus.Series) {
118 +func (c *Collector) collectNetFrameworkCLRJIT(mx map[string]int64, pms prometheus.Series) {
119 seen := make(map[string]bool)
120
121 for _, pm := range pms.FindByName(metricNetFrameworkCLRJITMethodsTotal) {
@@ -147,16 +147,16 @@ func (w *Windows) collectNetFrameworkCLRJIT(mx map[string]int64, pms prometheus.
147 }
148
149 for proc := range seen {
150 - if !w.cache.netFrameworkCLRJIT[proc] {
151 - w.cache.netFrameworkCLRJIT[proc] = true
152 - w.addProcessNetFrameworkJITCharts(proc)
150 + if !c.cache.netFrameworkCLRJIT[proc] {
151 + c.cache.netFrameworkCLRJIT[proc] = true
152 + c.addProcessNetFrameworkJITCharts(proc)
153 }
154 }
155
156 - for proc := range w.cache.netFrameworkCLRJIT {
156 + for proc := range c.cache.netFrameworkCLRJIT {
157 if !seen[proc] {
158 - delete(w.cache.netFrameworkCLRJIT, proc)
159 - w.removeProcessNetFrameworkJITCharts(proc)
158 + delete(c.cache.netFrameworkCLRJIT, proc)
159 + c.removeProcessNetFrameworkJITCharts(proc)
160 }
161 }
162 }
@@ -170,7 +170,7 @@ const (
170 metricNetFrameworkCLRLoadingClassLoadFailuresTotal = "windows_netframework_clrloading_class_load_failures_total"
171 )
172
173 -func (w *Windows) collectNetFrameworkCLRLoading(mx map[string]int64, pms prometheus.Series) {
173 +func (c *Collector) collectNetFrameworkCLRLoading(mx map[string]int64, pms prometheus.Series) {
174 seen := make(map[string]bool)
175
176 for _, pm := range pms.FindByName(metricNetFrameworkCLRLoadingLoaderHeapSizeBytes) {
@@ -216,16 +216,16 @@ func (w *Windows) collectNetFrameworkCLRLoading(mx map[string]int64, pms prometh
216 }
217
218 for proc := range seen {
219 - if !w.cache.netFrameworkCLRLoading[proc] {
220 - w.cache.netFrameworkCLRLoading[proc] = true
221 - w.addProcessNetFrameworkLoadingCharts(proc)
219 + if !c.cache.netFrameworkCLRLoading[proc] {
220 + c.cache.netFrameworkCLRLoading[proc] = true
221 + c.addProcessNetFrameworkLoadingCharts(proc)
222 }
223 }
224
225 - for proc := range w.cache.netFrameworkCLRLoading {
225 + for proc := range c.cache.netFrameworkCLRLoading {
226 if !seen[proc] {
227 - delete(w.cache.netFrameworkCLRLoading, proc)
228 - w.removeProcessNetFrameworkLoadingCharts(proc)
227 + delete(c.cache.netFrameworkCLRLoading, proc)
228 + c.removeProcessNetFrameworkLoadingCharts(proc)
229 }
230 }
231 }
@@ -238,7 +238,7 @@ const (
238 metricNetFrameworkCLRLocksAndThreadsContentionsTotal = "windows_netframework_clrlocksandthreads_contentions_total"
239 )
240
241 -func (w *Windows) collectNetFrameworkCLRLocksAndThreads(mx map[string]int64, pms prometheus.Series) {
241 +func (c *Collector) collectNetFrameworkCLRLocksAndThreads(mx map[string]int64, pms prometheus.Series) {
242 seen := make(map[string]bool)
243
244 for _, pm := range pms.FindByName(metricNetFrameworkCLRLocksAndThreadsQueueLengthTotal) {
@@ -277,16 +277,16 @@ func (w *Windows) collectNetFrameworkCLRLocksAndThreads(mx map[string]int64, pms
277 }
278
279 for proc := range seen {
280 - if !w.cache.netFrameworkCLRLocksThreads[proc] {
281 - w.cache.netFrameworkCLRLocksThreads[proc] = true
282 - w.addProcessNetFrameworkLocksAndThreadsCharts(proc)
280 + if !c.cache.netFrameworkCLRLocksThreads[proc] {
281 + c.cache.netFrameworkCLRLocksThreads[proc] = true
282 + c.addProcessNetFrameworkLocksAndThreadsCharts(proc)
283 }
284 }
285
286 - for proc := range w.cache.netFrameworkCLRLocksThreads {
286 + for proc := range c.cache.netFrameworkCLRLocksThreads {
287 if !seen[proc] {
288 - delete(w.cache.netFrameworkCLRLocksThreads, proc)
289 - w.removeProcessNetFrameworkLocksAndThreadsCharts(proc)
288 + delete(c.cache.netFrameworkCLRLocksThreads, proc)
289 + c.removeProcessNetFrameworkLocksAndThreadsCharts(proc)
290 }
291 }
292 }
@@ -306,7 +306,7 @@ const (
306 metricNetFrameworkCLRMemoryGCTimePercent = "windows_netframework_clrmemory_gc_time_percent"
307 )
308
309 -func (w *Windows) collectNetFrameworkCLRMemory(mx map[string]int64, pms prometheus.Series) {
309 +func (c *Collector) collectNetFrameworkCLRMemory(mx map[string]int64, pms prometheus.Series) {
310 seen := make(map[string]bool)
311
312 for _, pm := range pms.FindByName(metricNetFrameworkCLRMemoryAllocatedBytesTotal) {
@@ -394,16 +394,16 @@ func (w *Windows) collectNetFrameworkCLRMemory(mx map[string]int64, pms promethe
394 }
395
396 for proc := range seen {
397 - if !w.cache.netFrameworkCLRMemory[proc] {
398 - w.cache.netFrameworkCLRMemory[proc] = true
399 - w.addProcessNetFrameworkMemoryCharts(proc)
397 + if !c.cache.netFrameworkCLRMemory[proc] {
398 + c.cache.netFrameworkCLRMemory[proc] = true
399 + c.addProcessNetFrameworkMemoryCharts(proc)
400 }
401 }
402
403 - for proc := range w.cache.netFrameworkCLRMemory {
403 + for proc := range c.cache.netFrameworkCLRMemory {
404 if !seen[proc] {
405 - delete(w.cache.netFrameworkCLRMemory, proc)
406 - w.removeProcessNetFrameworkMemoryCharts(proc)
405 + delete(c.cache.netFrameworkCLRMemory, proc)
406 + c.removeProcessNetFrameworkMemoryCharts(proc)
407 }
408 }
409 }
@@ -417,7 +417,7 @@ const (
417 metricNetFrameworkCLRRemotingRemoteCallsTotal = "windows_netframework_clrremoting_remote_calls_total"
418 )
419
420 -func (w *Windows) collectNetFrameworkCLRRemoting(mx map[string]int64, pms prometheus.Series) {
420 +func (c *Collector) collectNetFrameworkCLRRemoting(mx map[string]int64, pms prometheus.Series) {
421 seen := make(map[string]bool)
422
423 for _, pm := range pms.FindByName(metricNetFrameworkCLRRemotingChannelsTotal) {
@@ -463,16 +463,16 @@ func (w *Windows) collectNetFrameworkCLRRemoting(mx map[string]int64, pms promet
463 }
464
465 for proc := range seen {
466 - if !w.cache.netFrameworkCLRRemoting[proc] {
467 - w.cache.netFrameworkCLRRemoting[proc] = true
468 - w.addProcessNetFrameworkRemotingCharts(proc)
466 + if !c.cache.netFrameworkCLRRemoting[proc] {
467 + c.cache.netFrameworkCLRRemoting[proc] = true
468 + c.addProcessNetFrameworkRemotingCharts(proc)
469 }
470 }
471
472 - for proc := range w.cache.netFrameworkCLRRemoting {
472 + for proc := range c.cache.netFrameworkCLRRemoting {
473 if !seen[proc] {
474 - delete(w.cache.netFrameworkCLRRemoting, proc)
475 - w.removeProcessNetFrameworkRemotingCharts(proc)
474 + delete(c.cache.netFrameworkCLRRemoting, proc)
475 + c.removeProcessNetFrameworkRemotingCharts(proc)
476 }
477 }
478 }
@@ -484,7 +484,7 @@ const (
484 metricNetFrameworkCLRSecurityRuntimeChecksTotal = "windows_netframework_clrsecurity_runtime_checks_total"
485 )
486
487 -func (w *Windows) collectNetFrameworkCLRSecurity(mx map[string]int64, pms prometheus.Series) {
487 +func (c *Collector) collectNetFrameworkCLRSecurity(mx map[string]int64, pms prometheus.Series) {
488 seen := make(map[string]bool)
489
490 for _, pm := range pms.FindByName(metricNetFrameworkCLRSecurityLinkTimeChecksTotal) {
@@ -516,16 +516,16 @@ func (w *Windows) collectNetFrameworkCLRSecurity(mx map[string]int64, pms promet
516 }
517
518 for proc := range seen {
519 - if !w.cache.netFrameworkCLRSecurity[proc] {
520 - w.cache.netFrameworkCLRSecurity[proc] = true
521 - w.addProcessNetFrameworkSecurityCharts(proc)
519 + if !c.cache.netFrameworkCLRSecurity[proc] {
520 + c.cache.netFrameworkCLRSecurity[proc] = true
521 + c.addProcessNetFrameworkSecurityCharts(proc)
522 }
523 }
524
525 - for proc := range w.cache.netFrameworkCLRSecurity {
525 + for proc := range c.cache.netFrameworkCLRSecurity {
526 if !seen[proc] {
527 - delete(w.cache.netFrameworkCLRSecurity, proc)
528 - w.removeProcessNetFrameworkSecurityCharts(proc)
527 + delete(c.cache.netFrameworkCLRSecurity, proc)
528 + c.removeProcessNetFrameworkSecurityCharts(proc)
529 }
530 }
531 }
src/go/plugin/go.d/collector/windows/collect_os.go
+4 -4
@@ -16,10 +16,10 @@ const (
16 metricOSVisibleMemoryBytes = "windows_os_visible_memory_bytes"
17 )
18
19 -func (w *Windows) collectOS(mx map[string]int64, pms prometheus.Series) {
20 - if !w.cache.collection[collectorOS] {
21 - w.cache.collection[collectorOS] = true
22 - w.addOSCharts()
19 +func (c *Collector) collectOS(mx map[string]int64, pms prometheus.Series) {
20 + if !c.cache.collection[collectorOS] {
21 + c.cache.collection[collectorOS] = true
22 + c.addOSCharts()
23 }
24
25 px := "os_"
src/go/plugin/go.d/collector/windows/collect_process.go
+10 -10
@@ -19,10 +19,10 @@ const (
19 metricProcessCPUHandles = "windows_process_handles"
20 )
21
22 -func (w *Windows) collectProcess(mx map[string]int64, pms prometheus.Series) {
23 - if !w.cache.collection[collectorProcess] {
24 - w.cache.collection[collectorProcess] = true
25 - w.addProcessesCharts()
22 +func (c *Collector) collectProcess(mx map[string]int64, pms prometheus.Series) {
23 + if !c.cache.collection[collectorProcess] {
24 + c.cache.collection[collectorProcess] = true
25 + c.addProcessesCharts()
26 }
27
28 seen := make(map[string]bool)
@@ -77,15 +77,15 @@ func (w *Windows) collectProcess(mx map[string]int64, pms prometheus.Series) {
77 }
78
79 for proc := range seen {
80 - if !w.cache.processes[proc] {
81 - w.cache.processes[proc] = true
82 - w.addProcessToCharts(proc)
80 + if !c.cache.processes[proc] {
81 + c.cache.processes[proc] = true
82 + c.addProcessToCharts(proc)
83 }
84 }
85 - for proc := range w.cache.processes {
85 + for proc := range c.cache.processes {
86 if !seen[proc] {
87 - delete(w.cache.processes, proc)
88 - w.removeProcessFromCharts(proc)
87 + delete(c.cache.processes, proc)
88 + c.removeProcessFromCharts(proc)
89 }
90 }
91 }
src/go/plugin/go.d/collector/windows/collect_service.go
+7 -7
@@ -13,7 +13,7 @@ const (
13 metricServiceStatus = "windows_service_status"
14 )
15
16 -func (w *Windows) collectService(mx map[string]int64, pms prometheus.Series) {
16 +func (c *Collector) collectService(mx map[string]int64, pms prometheus.Series) {
17 seen := make(map[string]bool)
18 px := "service_"
19 for _, pm := range pms.FindByName(metricServiceState) {
@@ -38,15 +38,15 @@ func (w *Windows) collectService(mx map[string]int64, pms prometheus.Series) {
38 }
39
40 for svc := range seen {
41 - if !w.cache.services[svc] {
42 - w.cache.services[svc] = true
43 - w.addServiceCharts(svc)
41 + if !c.cache.services[svc] {
42 + c.cache.services[svc] = true
43 + c.addServiceCharts(svc)
44 }
45 }
46 - for svc := range w.cache.services {
46 + for svc := range c.cache.services {
47 if !seen[svc] {
48 - delete(w.cache.services, svc)
49 - w.removeServiceCharts(svc)
48 + delete(c.cache.services, svc)
49 + c.removeServiceCharts(svc)
50 }
51 }
52 }
src/go/plugin/go.d/collector/windows/collect_system.go
+4 -4
@@ -13,10 +13,10 @@ const (
13 metricSysThreads = "windows_system_threads"
14 )
15
16 -func (w *Windows) collectSystem(mx map[string]int64, pms prometheus.Series) {
17 - if !w.cache.collection[collectorSystem] {
18 - w.cache.collection[collectorSystem] = true
19 - w.addSystemCharts()
16 +func (c *Collector) collectSystem(mx map[string]int64, pms prometheus.Series) {
17 + if !c.cache.collection[collectorSystem] {
18 + c.cache.collection[collectorSystem] = true
19 + c.addSystemCharts()
20 }
21
22 px := "system_"
src/go/plugin/go.d/collector/windows/collect_tcp.go
+4 -4
@@ -15,10 +15,10 @@ const (
15 metricTCPConnectionSegmentsSent = "windows_tcp_segments_sent_total"
16 )
17
18 -func (w *Windows) collectTCP(mx map[string]int64, pms prometheus.Series) {
19 - if !w.cache.collection[collectorTCP] {
20 - w.cache.collection[collectorTCP] = true
21 - w.addTCPCharts()
18 +func (c *Collector) collectTCP(mx map[string]int64, pms prometheus.Series) {
19 + if !c.cache.collection[collectorTCP] {
20 + c.cache.collection[collectorTCP] = true
21 + c.addTCPCharts()
22 }
23
24 px := "tcp_"
src/go/plugin/go.d/collector/windows/collect_thermalzone.go
+7 -7
@@ -12,7 +12,7 @@ const (
12 metricThermalzoneTemperatureCelsius = "windows_thermalzone_temperature_celsius"
13 )
14
15 -func (w *Windows) collectThermalzone(mx map[string]int64, pms prometheus.Series) {
15 +func (c *Collector) collectThermalzone(mx map[string]int64, pms prometheus.Series) {
16 seen := make(map[string]bool)
17 for _, pm := range pms.FindByName(metricThermalzoneTemperatureCelsius) {
18 if name := cleanZoneName(pm.Labels.Get("name")); name != "" {
@@ -22,15 +22,15 @@ func (w *Windows) collectThermalzone(mx map[string]int64, pms prometheus.Series)
22 }
23
24 for zone := range seen {
25 - if !w.cache.thermalZones[zone] {
26 - w.cache.thermalZones[zone] = true
27 - w.addThermalZoneCharts(zone)
25 + if !c.cache.thermalZones[zone] {
26 + c.cache.thermalZones[zone] = true
27 + c.addThermalZoneCharts(zone)
28 }
29 }
30 - for zone := range w.cache.thermalZones {
30 + for zone := range c.cache.thermalZones {
31 if !seen[zone] {
32 - delete(w.cache.thermalZones, zone)
33 - w.removeThermalZoneCharts(zone)
32 + delete(c.cache.thermalZones, zone)
33 + c.removeThermalZoneCharts(zone)
34 }
35 }
36 }
src/go/plugin/go.d/collector/windows/collector.go renamed
+19 -19
@@ -28,8 +28,8 @@ func init() {
28 })
29 }
30
31 -func New() *Windows {
32 - return &Windows{
31 +func New() *Collector {
32 + return &Collector{
33 Config: Config{
34 HTTPConfig: web.HTTPConfig{
35 ClientConfig: web.ClientConfig{
@@ -77,7 +77,7 @@ type Config struct {
77 }
78
79 type (
80 - Windows struct {
80 + Collector struct {
81 module.Base
82 Config `yaml:",inline" json:""`
83
@@ -118,26 +118,26 @@ type (
118 }
119 )
120
121 -func (w *Windows) Configuration() any {
122 - return w.Config
121 +func (c *Collector) Configuration() any {
122 + return c.Config
123 }
124
125 -func (w *Windows) Init() error {
126 - if err := w.validateConfig(); err != nil {
125 +func (c *Collector) Init() error {
126 + if err := c.validateConfig(); err != nil {
127 return fmt.Errorf("config validation: %v", err)
128 }
129
130 - prom, err := w.initPrometheusClient()
130 + prom, err := c.initPrometheusClient()
131 if err != nil {
132 return fmt.Errorf("init prometheus clients: %v", err)
133 }
134 - w.prom = prom
134 + c.prom = prom
135
136 return nil
137 }
138
139 -func (w *Windows) Check() error {
140 - mx, err := w.collect()
139 +func (c *Collector) Check() error {
140 + mx, err := c.collect()
141 if err != nil {
142 return err
143 }
@@ -147,14 +147,14 @@ func (w *Windows) Check() error {
147 return nil
148 }
149
150 -func (w *Windows) Charts() *module.Charts {
151 - return w.charts
150 +func (c *Collector) Charts() *module.Charts {
151 + return c.charts
152 }
153
154 -func (w *Windows) Collect() map[string]int64 {
155 - ms, err := w.collect()
154 +func (c *Collector) Collect() map[string]int64 {
155 + ms, err := c.collect()
156 if err != nil {
157 - w.Error(err)
157 + c.Error(err)
158 }
159
160 if len(ms) == 0 {
@@ -163,8 +163,8 @@ func (w *Windows) Collect() map[string]int64 {
163 return ms
164 }
165
166 -func (w *Windows) Cleanup() {
167 - if w.prom != nil && w.prom.HTTPClient() != nil {
168 - w.prom.HTTPClient().CloseIdleConnections()
166 +func (c *Collector) Cleanup() {
167 + if c.prom != nil && c.prom.HTTPClient() != nil {
168 + c.prom.HTTPClient().CloseIdleConnections()
169 }
170 }
src/go/plugin/go.d/collector/windows/collector_test.go renamed
+123 -123
@@ -34,15 +34,15 @@ func Test_testDataIsValid(t *testing.T) {
34 }
35 }
36
37 -func TestWindows_ConfigurationSerialize(t *testing.T) {
38 - module.TestConfigurationSerialize(t, &Windows{}, dataConfigJSON, dataConfigYAML)
37 +func TestCollector_ConfigurationSerialize(t *testing.T) {
38 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
39 }
40
41 func TestNew(t *testing.T) {
42 - assert.IsType(t, (*Windows)(nil), New())
42 + assert.IsType(t, (*Collector)(nil), New())
43 }
44
45 -func TestWindows_Init(t *testing.T) {
45 +func TestCollector_Init(t *testing.T) {
46 tests := map[string]struct {
47 config Config
48 wantFail bool
@@ -63,21 +63,21 @@ func TestWindows_Init(t *testing.T) {
63
64 for name, test := range tests {
65 t.Run(name, func(t *testing.T) {
66 - win := New()
67 - win.Config = test.config
66 + collr := New()
67 + collr.Config = test.config
68
69 if test.wantFail {
70 - assert.Error(t, win.Init())
70 + assert.Error(t, collr.Init())
71 } else {
72 - assert.NoError(t, win.Init())
72 + assert.NoError(t, collr.Init())
73 }
74 })
75 }
76 }
77
78 -func TestWindows_Check(t *testing.T) {
78 +func TestCollector_Check(t *testing.T) {
79 tests := map[string]struct {
80 - prepare func() (win *Windows, cleanup func())
80 + prepare func() (collr *Collector, cleanup func())
81 wantFail bool
82 }{
83 "success on valid response v0.20.0": {
@@ -99,31 +99,31 @@ func TestWindows_Check(t *testing.T) {
99
100 for name, test := range tests {
101 t.Run(name, func(t *testing.T) {
102 - win, cleanup := test.prepare()
102 + collr, cleanup := test.prepare()
103 defer cleanup()
104
105 - require.NoError(t, win.Init())
105 + require.NoError(t, collr.Init())
106
107 if test.wantFail {
108 - assert.Error(t, win.Check())
108 + assert.Error(t, collr.Check())
109 } else {
110 - assert.NoError(t, win.Check())
110 + assert.NoError(t, collr.Check())
111 }
112 })
113 }
114 }
115
116 -func TestWindows_Charts(t *testing.T) {
116 +func TestCollector_Charts(t *testing.T) {
117 assert.NotNil(t, New().Charts())
118 }
119
120 -func TestWindows_Cleanup(t *testing.T) {
120 +func TestCollector_Cleanup(t *testing.T) {
121 assert.NotPanics(t, New().Cleanup)
122 }
123
124 -func TestWindows_Collect(t *testing.T) {
124 +func TestCollector_Collect(t *testing.T) {
125 tests := map[string]struct {
126 - prepare func() (win *Windows, cleanup func())
126 + prepare func() (collr *Collector, cleanup func())
127 wantCollected map[string]int64
128 }{
129 "success on valid response v0.20.0": {
@@ -796,12 +796,12 @@ func TestWindows_Collect(t *testing.T) {
796
797 for name, test := range tests {
798 t.Run(name, func(t *testing.T) {
799 - win, cleanup := test.prepare()
799 + collr, cleanup := test.prepare()
800 defer cleanup()
801
802 - require.NoError(t, win.Init())
802 + require.NoError(t, collr.Init())
803
804 - mx := win.Collect()
804 + mx := collr.Collect()
805
806 if mx != nil && test.wantCollected != nil {
807 mx["system_up_time"] = test.wantCollected["system_up_time"]
@@ -809,201 +809,201 @@ func TestWindows_Collect(t *testing.T) {
809
810 assert.Equal(t, test.wantCollected, mx)
811 if len(test.wantCollected) > 0 {
812 - testCharts(t, win, mx)
812 + testCharts(t, collr, mx)
813 }
814 })
815 }
816 }
817
818 -func testCharts(t *testing.T, win *Windows, mx map[string]int64) {
819 - ensureChartsDimsCreated(t, win)
820 - module.TestMetricsHasAllChartsDims(t, win.Charts(), mx)
818 +func testCharts(t *testing.T, collr *Collector, mx map[string]int64) {
819 + ensureChartsDimsCreated(t, collr)
820 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
821 }
822
823 -func ensureChartsDimsCreated(t *testing.T, w *Windows) {
823 +func ensureChartsDimsCreated(t *testing.T, collr *Collector) {
824 for _, chart := range cpuCharts {
825 - if w.cache.collection[collectorCPU] {
826 - assert.Truef(t, w.Charts().Has(chart.ID), "chart '%s' not created", chart.ID)
825 + if collr.cache.collection[collectorCPU] {
826 + assert.Truef(t, collr.Charts().Has(chart.ID), "chart '%s' not created", chart.ID)
827 } else {
828 - assert.Falsef(t, w.Charts().Has(chart.ID), "chart '%s' created", chart.ID)
828 + assert.Falsef(t, collr.Charts().Has(chart.ID), "chart '%s' created", chart.ID)
829 }
830 }
831 for _, chart := range memCharts {
832 - if w.cache.collection[collectorMemory] {
833 - assert.Truef(t, w.Charts().Has(chart.ID), "chart '%s' not created", chart.ID)
832 + if collr.cache.collection[collectorMemory] {
833 + assert.Truef(t, collr.Charts().Has(chart.ID), "chart '%s' not created", chart.ID)
834 } else {
835 - assert.Falsef(t, w.Charts().Has(chart.ID), "chart '%s' created", chart.ID)
835 + assert.Falsef(t, collr.Charts().Has(chart.ID), "chart '%s' created", chart.ID)
836 }
837 }
838 for _, chart := range tcpCharts {
839 - if w.cache.collection[collectorTCP] {
840 - assert.Truef(t, w.Charts().Has(chart.ID), "chart '%s' not created", chart.ID)
839 + if collr.cache.collection[collectorTCP] {
840 + assert.Truef(t, collr.Charts().Has(chart.ID), "chart '%s' not created", chart.ID)
841 } else {
842 - assert.Falsef(t, w.Charts().Has(chart.ID), "chart '%s' created", chart.ID)
842 + assert.Falsef(t, collr.Charts().Has(chart.ID), "chart '%s' created", chart.ID)
843 }
844 }
845 for _, chart := range osCharts {
846 - if w.cache.collection[collectorOS] {
847 - assert.Truef(t, w.Charts().Has(chart.ID), "chart '%s' not created", chart.ID)
846 + if collr.cache.collection[collectorOS] {
847 + assert.Truef(t, collr.Charts().Has(chart.ID), "chart '%s' not created", chart.ID)
848 } else {
849 - assert.Falsef(t, w.Charts().Has(chart.ID), "chart '%s' created", chart.ID)
849 + assert.Falsef(t, collr.Charts().Has(chart.ID), "chart '%s' created", chart.ID)
850 }
851 }
852 for _, chart := range systemCharts {
853 - if w.cache.collection[collectorSystem] {
854 - assert.Truef(t, w.Charts().Has(chart.ID), "chart '%s' not created", chart.ID)
853 + if collr.cache.collection[collectorSystem] {
854 + assert.Truef(t, collr.Charts().Has(chart.ID), "chart '%s' not created", chart.ID)
855 } else {
856 - assert.Falsef(t, w.Charts().Has(chart.ID), "chart '%s' created", chart.ID)
856 + assert.Falsef(t, collr.Charts().Has(chart.ID), "chart '%s' created", chart.ID)
857 }
858 }
859 for _, chart := range logonCharts {
860 - if w.cache.collection[collectorLogon] {
861 - assert.Truef(t, w.Charts().Has(chart.ID), "chart '%s' not created", chart.ID)
860 + if collr.cache.collection[collectorLogon] {
861 + assert.Truef(t, collr.Charts().Has(chart.ID), "chart '%s' not created", chart.ID)
862 } else {
863 - assert.Falsef(t, w.Charts().Has(chart.ID), "chart '%s' created", chart.ID)
863 + assert.Falsef(t, collr.Charts().Has(chart.ID), "chart '%s' created", chart.ID)
864 }
865 }
866 for _, chart := range processesCharts {
867 - if w.cache.collection[collectorProcess] {
868 - assert.Truef(t, w.Charts().Has(chart.ID), "chart '%s' not created", chart.ID)
867 + if collr.cache.collection[collectorProcess] {
868 + assert.Truef(t, collr.Charts().Has(chart.ID), "chart '%s' not created", chart.ID)
869 } else {
870 - assert.Falsef(t, w.Charts().Has(chart.ID), "chart '%s' created", chart.ID)
870 + assert.Falsef(t, collr.Charts().Has(chart.ID), "chart '%s' created", chart.ID)
871 }
872 }
873 for _, chart := range netFrameworkCLRExceptionsChartsTmpl {
874 - if w.cache.collection[collectorNetFrameworkCLRExceptions] {
875 - assert.Truef(t, w.Charts().Has(chart.ID), "chart '%s' not created", chart.ID)
874 + if collr.cache.collection[collectorNetFrameworkCLRExceptions] {
875 + assert.Truef(t, collr.Charts().Has(chart.ID), "chart '%s' not created", chart.ID)
876 } else {
877 - assert.Falsef(t, w.Charts().Has(chart.ID), "chart '%s' created", chart.ID)
877 + assert.Falsef(t, collr.Charts().Has(chart.ID), "chart '%s' created", chart.ID)
878 }
879 }
880 for _, chart := range netFrameworkCLRInteropChartsTmpl {
881 - if w.cache.collection[collectorNetFrameworkCLRInterop] {
882 - assert.Truef(t, w.Charts().Has(chart.ID), "chart '%s' not created", chart.ID)
881 + if collr.cache.collection[collectorNetFrameworkCLRInterop] {
882 + assert.Truef(t, collr.Charts().Has(chart.ID), "chart '%s' not created", chart.ID)
883 } else {
884 - assert.Falsef(t, w.Charts().Has(chart.ID), "chart '%s' created", chart.ID)
884 + assert.Falsef(t, collr.Charts().Has(chart.ID), "chart '%s' created", chart.ID)
885 }
886 }
887 for _, chart := range netFrameworkCLRJITChartsTmpl {
888 - if w.cache.collection[collectorNetFrameworkCLRJIT] {
889 - assert.Truef(t, w.Charts().Has(chart.ID), "chart '%s' not created", chart.ID)
888 + if collr.cache.collection[collectorNetFrameworkCLRJIT] {
889 + assert.Truef(t, collr.Charts().Has(chart.ID), "chart '%s' not created", chart.ID)
890 } else {
891 - assert.Falsef(t, w.Charts().Has(chart.ID), "chart '%s' created", chart.ID)
891 + assert.Falsef(t, collr.Charts().Has(chart.ID), "chart '%s' created", chart.ID)
892 }
893 }
894 for _, chart := range netFrameworkCLRLoadingChartsTmpl {
895 - if w.cache.collection[collectorNetFrameworkCLRLoading] {
896 - assert.Truef(t, w.Charts().Has(chart.ID), "chart '%s' not created", chart.ID)
895 + if collr.cache.collection[collectorNetFrameworkCLRLoading] {
896 + assert.Truef(t, collr.Charts().Has(chart.ID), "chart '%s' not created", chart.ID)
897 } else {
898 - assert.Falsef(t, w.Charts().Has(chart.ID), "chart '%s' created", chart.ID)
898 + assert.Falsef(t, collr.Charts().Has(chart.ID), "chart '%s' created", chart.ID)
899 }
900 }
901 for _, chart := range netFrameworkCLRLocksAndThreadsChartsTmpl {
902 - if w.cache.collection[collectorNetFrameworkCLRLocksAndThreads] {
903 - assert.Truef(t, w.Charts().Has(chart.ID), "chart '%s' not created", chart.ID)
902 + if collr.cache.collection[collectorNetFrameworkCLRLocksAndThreads] {
903 + assert.Truef(t, collr.Charts().Has(chart.ID), "chart '%s' not created", chart.ID)
904 } else {
905 - assert.Falsef(t, w.Charts().Has(chart.ID), "chart '%s' created", chart.ID)
905 + assert.Falsef(t, collr.Charts().Has(chart.ID), "chart '%s' created", chart.ID)
906 }
907 }
908 for _, chart := range netFrameworkCLRMemoryChartsTmpl {
909 - if w.cache.collection[collectorNetFrameworkCLRMemory] {
910 - assert.Truef(t, w.Charts().Has(chart.ID), "chart '%s' not created", chart.ID)
909 + if collr.cache.collection[collectorNetFrameworkCLRMemory] {
910 + assert.Truef(t, collr.Charts().Has(chart.ID), "chart '%s' not created", chart.ID)
911 } else {
912 - assert.Falsef(t, w.Charts().Has(chart.ID), "chart '%s' created", chart.ID)
912 + assert.Falsef(t, collr.Charts().Has(chart.ID), "chart '%s' created", chart.ID)
913 }
914 }
915 for _, chart := range netFrameworkCLRRemotingChartsTmpl {
916 - if w.cache.collection[collectorNetFrameworkCLRRemoting] {
917 - assert.Truef(t, w.Charts().Has(chart.ID), "chart '%s' not created", chart.ID)
916 + if collr.cache.collection[collectorNetFrameworkCLRRemoting] {
917 + assert.Truef(t, collr.Charts().Has(chart.ID), "chart '%s' not created", chart.ID)
918 } else {
919 - assert.Falsef(t, w.Charts().Has(chart.ID), "chart '%s' created", chart.ID)
919 + assert.Falsef(t, collr.Charts().Has(chart.ID), "chart '%s' created", chart.ID)
920 }
921 }
922 for _, chart := range netFrameworkCLRSecurityChartsTmpl {
923 - if w.cache.collection[collectorNetFrameworkCLRSecurity] {
924 - assert.Truef(t, w.Charts().Has(chart.ID), "chart '%s' not created", chart.ID)
923 + if collr.cache.collection[collectorNetFrameworkCLRSecurity] {
924 + assert.Truef(t, collr.Charts().Has(chart.ID), "chart '%s' not created", chart.ID)
925 } else {
926 - assert.Falsef(t, w.Charts().Has(chart.ID), "chart '%s' created", chart.ID)
926 + assert.Falsef(t, collr.Charts().Has(chart.ID), "chart '%s' created", chart.ID)
927 }
928 }
929
930 - for core := range w.cache.cores {
930 + for core := range collr.cache.cores {
931 for _, chart := range cpuCoreChartsTmpl {
932 id := fmt.Sprintf(chart.ID, core)
933 - assert.Truef(t, w.Charts().Has(id), "charts has no '%s' chart for '%s' core", id, core)
933 + assert.Truef(t, collr.Charts().Has(id), "charts has no '%s' chart for '%s' core", id, core)
934 }
935 }
936 - for disk := range w.cache.volumes {
936 + for disk := range collr.cache.volumes {
937 for _, chart := range diskChartsTmpl {
938 id := fmt.Sprintf(chart.ID, disk)
939 - assert.Truef(t, w.Charts().Has(id), "charts has no '%s' chart for '%s' disk", id, disk)
939 + assert.Truef(t, collr.Charts().Has(id), "charts has no '%s' chart for '%s' disk", id, disk)
940 }
941 }
942 - for nic := range w.cache.nics {
942 + for nic := range collr.cache.nics {
943 for _, chart := range nicChartsTmpl {
944 id := fmt.Sprintf(chart.ID, nic)
945 - assert.Truef(t, w.Charts().Has(id), "charts has no '%s' chart for '%s' nic", id, nic)
945 + assert.Truef(t, collr.Charts().Has(id), "charts has no '%s' chart for '%s' nic", id, nic)
946 }
947 }
948 - for zone := range w.cache.thermalZones {
948 + for zone := range collr.cache.thermalZones {
949 for _, chart := range thermalzoneChartsTmpl {
950 id := fmt.Sprintf(chart.ID, zone)
951 - assert.Truef(t, w.Charts().Has(id), "charts has no '%s' chart for '%s' thermalzone", id, zone)
951 + assert.Truef(t, collr.Charts().Has(id), "charts has no '%s' chart for '%s' thermalzone", id, zone)
952 }
953 }
954 - for svc := range w.cache.services {
954 + for svc := range collr.cache.services {
955 for _, chart := range serviceChartsTmpl {
956 id := fmt.Sprintf(chart.ID, svc)
957 - assert.Truef(t, w.Charts().Has(id), "charts has no '%s' chart for '%s' service", id, svc)
957 + assert.Truef(t, collr.Charts().Has(id), "charts has no '%s' chart for '%s' service", id, svc)
958 }
959 }
960 - for website := range w.cache.iis {
960 + for website := range collr.cache.iis {
961 for _, chart := range iisWebsiteChartsTmpl {
962 id := fmt.Sprintf(chart.ID, website)
963 - assert.Truef(t, w.Charts().Has(id), "charts has no '%s' chart for '%s' website", id, website)
963 + assert.Truef(t, collr.Charts().Has(id), "charts has no '%s' chart for '%s' website", id, website)
964 }
965 }
966 - for instance := range w.cache.mssqlInstances {
966 + for instance := range collr.cache.mssqlInstances {
967 for _, chart := range mssqlInstanceChartsTmpl {
968 id := fmt.Sprintf(chart.ID, instance)
969 - assert.Truef(t, w.Charts().Has(id), "charts has no '%s' chart for '%s' instance", id, instance)
969 + assert.Truef(t, collr.Charts().Has(id), "charts has no '%s' chart for '%s' instance", id, instance)
970 }
971 }
972 - for instanceDB := range w.cache.mssqlDBs {
972 + for instanceDB := range collr.cache.mssqlDBs {
973 s := strings.Split(instanceDB, ":")
974 if assert.Lenf(t, s, 2, "can not extract intance/database from cache.mssqlDBs") {
975 instance, db := s[0], s[1]
976 for _, chart := range mssqlDatabaseChartsTmpl {
977 id := fmt.Sprintf(chart.ID, db, instance)
978 - assert.Truef(t, w.Charts().Has(id), "charts has no '%s' chart for '%s' instance", id, instance)
978 + assert.Truef(t, collr.Charts().Has(id), "charts has no '%s' chart for '%s' instance", id, instance)
979 }
980 }
981 }
982 for _, chart := range adCharts {
983 - if w.cache.collection[collectorAD] {
984 - assert.Truef(t, w.Charts().Has(chart.ID), "chart '%s' not created", chart.ID)
983 + if collr.cache.collection[collectorAD] {
984 + assert.Truef(t, collr.Charts().Has(chart.ID), "chart '%s' not created", chart.ID)
985 } else {
986 - assert.Falsef(t, w.Charts().Has(chart.ID), "chart '%s' created", chart.ID)
986 + assert.Falsef(t, collr.Charts().Has(chart.ID), "chart '%s' created", chart.ID)
987 }
988 }
989 - for template := range w.cache.adcs {
989 + for template := range collr.cache.adcs {
990 for _, chart := range adcsCertTemplateChartsTmpl {
991 id := fmt.Sprintf(chart.ID, template)
992 - assert.Truef(t, w.Charts().Has(id), "charts has no '%s' chart for '%s' template certificate", id, template)
992 + assert.Truef(t, collr.Charts().Has(id), "charts has no '%s' chart for '%s' template certificate", id, template)
993 }
994 }
995 - for name := range w.cache.collectors {
995 + for name := range collr.cache.collectors {
996 for _, chart := range collectorChartsTmpl {
997 id := fmt.Sprintf(chart.ID, name)
998 - assert.Truef(t, w.Charts().Has(id), "charts has no '%s' chart for '%s' collector", id, name)
998 + assert.Truef(t, collr.Charts().Has(id), "charts has no '%s' chart for '%s' collector", id, name)
999 }
1000 }
1001
1002 for _, chart := range processesCharts {
1003 - if chart = w.Charts().Get(chart.ID); chart == nil {
1003 + if chart = collr.Charts().Get(chart.ID); chart == nil {
1004 continue
1005 }
1006 - for proc := range w.cache.processes {
1006 + for proc := range collr.cache.processes {
1007 var found bool
1008 for _, dim := range chart.Dims {
1009 if found = strings.HasPrefix(dim.ID, "process_"+proc); found {
@@ -1015,73 +1015,73 @@ func ensureChartsDimsCreated(t *testing.T, w *Windows) {
1015 }
1016
1017 for _, chart := range hypervChartsTmpl {
1018 - if w.cache.collection[collectorHyperv] {
1019 - assert.Truef(t, w.Charts().Has(chart.ID), "chart '%s' not created", chart.ID)
1018 + if collr.cache.collection[collectorHyperv] {
1019 + assert.Truef(t, collr.Charts().Has(chart.ID), "chart '%s' not created", chart.ID)
1020 } else {
1021 - assert.Falsef(t, w.Charts().Has(chart.ID), "chart '%s' created", chart.ID)
1021 + assert.Falsef(t, collr.Charts().Has(chart.ID), "chart '%s' created", chart.ID)
1022 }
1023 }
1024 - for vm := range w.cache.hypervVMMem {
1024 + for vm := range collr.cache.hypervVMMem {
1025 for _, chart := range hypervVMChartsTemplate {
1026 id := fmt.Sprintf(chart.ID, hypervCleanName(vm))
1027 - assert.Truef(t, w.Charts().Has(id), "charts has no '%s' chart for '%s' virtual machine", id, vm)
1027 + assert.Truef(t, collr.Charts().Has(id), "charts has no '%s' chart for '%s' virtual machine", id, vm)
1028 }
1029 }
1030 - for device := range w.cache.hypervVMDevices {
1030 + for device := range collr.cache.hypervVMDevices {
1031 for _, chart := range hypervVMDeviceChartsTemplate {
1032 id := fmt.Sprintf(chart.ID, hypervCleanName(device))
1033 - assert.Truef(t, w.Charts().Has(id), "charts has no '%s' chart for '%s' vm storage device", id, device)
1033 + assert.Truef(t, collr.Charts().Has(id), "charts has no '%s' chart for '%s' vm storage device", id, device)
1034 }
1035 }
1036 - for iface := range w.cache.hypervVMInterfaces {
1036 + for iface := range collr.cache.hypervVMInterfaces {
1037 for _, chart := range hypervVMInterfaceChartsTemplate {
1038 id := fmt.Sprintf(chart.ID, hypervCleanName(iface))
1039 - assert.Truef(t, w.Charts().Has(id), "charts has no '%s' chart for '%s' vm network interface", id, iface)
1039 + assert.Truef(t, collr.Charts().Has(id), "charts has no '%s' chart for '%s' vm network interface", id, iface)
1040 }
1041 }
1042 - for vswitch := range w.cache.hypervVswitch {
1042 + for vswitch := range collr.cache.hypervVswitch {
1043 for _, chart := range hypervVswitchChartsTemplate {
1044 id := fmt.Sprintf(chart.ID, hypervCleanName(vswitch))
1045 - assert.Truef(t, w.Charts().Has(id), "charts has no '%s' chart for '%s' virtual switch", id, vswitch)
1045 + assert.Truef(t, collr.Charts().Has(id), "charts has no '%s' chart for '%s' virtual switch", id, vswitch)
1046 }
1047 }
1048 }
1049
1050 -func prepareWindowsV0200() (win *Windows, cleanup func()) {
1050 +func prepareWindowsV0200() (collr *Collector, cleanup func()) {
1051 ts := httptest.NewServer(http.HandlerFunc(
1052 func(w http.ResponseWriter, r *http.Request) {
1053 _, _ = w.Write(dataVer0200Metrics)
1054 }))
1055
1056 - win = New()
1057 - win.URL = ts.URL
1058 - return win, ts.Close
1056 + collr = New()
1057 + collr.URL = ts.URL
1058 + return collr, ts.Close
1059 }
1060
1061 -func prepareWindowsReturnsInvalidData() (win *Windows, cleanup func()) {
1061 +func prepareWindowsReturnsInvalidData() (collr *Collector, cleanup func()) {
1062 ts := httptest.NewServer(http.HandlerFunc(
1063 func(w http.ResponseWriter, r *http.Request) {
1064 _, _ = w.Write([]byte("hello and\n goodbye"))
1065 }))
1066
1067 - win = New()
1068 - win.URL = ts.URL
1069 - return win, ts.Close
1067 + collr = New()
1068 + collr.URL = ts.URL
1069 + return collr, ts.Close
1070 }
1071
1072 -func prepareWindowsConnectionRefused() (win *Windows, cleanup func()) {
1073 - win = New()
1074 - win.URL = "http://127.0.0.1:38001"
1075 - return win, func() {}
1072 +func prepareWindowsConnectionRefused() (collr *Collector, cleanup func()) {
1073 + collr = New()
1074 + collr.URL = "http://127.0.0.1:38001"
1075 + return collr, func() {}
1076 }
1077
1078 -func prepareWindowsResponse404() (win *Windows, cleanup func()) {
1078 +func prepareWindowsResponse404() (collr *Collector, cleanup func()) {
1079 ts := httptest.NewServer(http.HandlerFunc(
1080 func(w http.ResponseWriter, r *http.Request) {
1081 w.WriteHeader(http.StatusNotFound)
1082 }))
1083
1084 - win = New()
1085 - win.URL = ts.URL
1086 - return win, ts.Close
1084 + collr = New()
1085 + collr.URL = ts.URL
1086 + return collr, ts.Close
1087 }
src/go/plugin/go.d/collector/windows/init.go
+5 -5
@@ -9,17 +9,17 @@ import (
9 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/web"
10 )
11
12 -func (w *Windows) validateConfig() error {
13 - if w.URL == "" {
12 +func (c *Collector) validateConfig() error {
13 + if c.URL == "" {
14 return errors.New("'url' is not set")
15 }
16 return nil
17 }
18
19 -func (w *Windows) initPrometheusClient() (prometheus.Prometheus, error) {
20 - client, err := web.NewHTTPClient(w.ClientConfig)
19 +func (c *Collector) initPrometheusClient() (prometheus.Prometheus, error) {
20 + client, err := web.NewHTTPClient(c.ClientConfig)
21 if err != nil {
22 return nil, err
23 }
24 - return prometheus.New(client, w.RequestConfig), nil
24 + return prometheus.New(client, c.RequestConfig), nil
25 }
src/go/plugin/go.d/collector/wireguard/charts.go
+10 -10
@@ -96,18 +96,18 @@ func newDeviceCharts(device string) *module.Charts {
96 return charts
97 }
98
99 -func (w *WireGuard) addNewDeviceCharts(device string) {
99 +func (c *Collector) addNewDeviceCharts(device string) {
100 charts := newDeviceCharts(device)
101
102 - if err := w.Charts().Add(*charts...); err != nil {
103 - w.Warning(err)
102 + if err := c.Charts().Add(*charts...); err != nil {
103 + c.Warning(err)
104 }
105 }
106
107 -func (w *WireGuard) removeDeviceCharts(device string) {
107 +func (c *Collector) removeDeviceCharts(device string) {
108 prefix := fmt.Sprintf("device_%s", device)
109
110 - for _, c := range *w.Charts() {
110 + for _, c := range *c.Charts() {
111 if strings.HasPrefix(c.ID, prefix) {
112 c.MarkRemove()
113 c.MarkNotCreated()
@@ -132,18 +132,18 @@ func newPeerCharts(id, device, pubKey string) *module.Charts {
132 return charts
133 }
134
135 -func (w *WireGuard) addNewPeerCharts(id, device, pubKey string) {
135 +func (c *Collector) addNewPeerCharts(id, device, pubKey string) {
136 charts := newPeerCharts(id, device, pubKey)
137
138 - if err := w.Charts().Add(*charts...); err != nil {
139 - w.Warning(err)
138 + if err := c.Charts().Add(*charts...); err != nil {
139 + c.Warning(err)
140 }
141 }
142
143 -func (w *WireGuard) removePeerCharts(id string) {
143 +func (c *Collector) removePeerCharts(id string) {
144 prefix := fmt.Sprintf("peer_%s", id)
145
146 - for _, c := range *w.Charts() {
146 + for _, c := range *c.Charts() {
147 if strings.HasPrefix(c.ID, prefix) {
148 c.MarkRemove()
149 c.MarkNotCreated()
src/go/plugin/go.d/collector/wireguard/collect.go
+26 -26
@@ -9,48 +9,48 @@ import (
9 "golang.zx2c4.com/wireguard/wgctrl/wgtypes"
10 )
11
12 -func (w *WireGuard) collect() (map[string]int64, error) {
13 - if w.client == nil {
14 - client, err := w.newWGClient()
12 +func (c *Collector) collect() (map[string]int64, error) {
13 + if c.client == nil {
14 + client, err := c.newWGClient()
15 if err != nil {
16 return nil, fmt.Errorf("creating WireGuard client: %v", err)
17 }
18 - w.client = client
18 + c.client = client
19 }
20
21 // TODO: probably we need to get a list of interfaces and query interfaces using client.Device()
22 // https://github.com/WireGuard/wgctrl-go/blob/3d4a969bb56bb6931f6661af606bc9c4195b4249/internal/wglinux/client_linux.go#L79-L80
23 - devices, err := w.client.Devices()
23 + devices, err := c.client.Devices()
24 if err != nil {
25 return nil, fmt.Errorf("retrieving WireGuard devices: %v", err)
26 }
27
28 if len(devices) == 0 {
29 - w.Info("no WireGuard devices found on the host system")
29 + c.Info("no WireGuard devices found on the host system")
30 }
31
32 now := time.Now()
33 - if w.cleanupLastTime.IsZero() {
34 - w.cleanupLastTime = now
33 + if c.cleanupLastTime.IsZero() {
34 + c.cleanupLastTime = now
35 }
36
37 mx := make(map[string]int64)
38
39 - w.collectDevicesPeers(mx, devices, now)
39 + c.collectDevicesPeers(mx, devices, now)
40
41 - if now.Sub(w.cleanupLastTime) > w.cleanupEvery {
42 - w.cleanupLastTime = now
43 - w.cleanupDevicesPeers(devices)
41 + if now.Sub(c.cleanupLastTime) > c.cleanupEvery {
42 + c.cleanupLastTime = now
43 + c.cleanupDevicesPeers(devices)
44 }
45
46 return mx, nil
47 }
48
49 -func (w *WireGuard) collectDevicesPeers(mx map[string]int64, devices []*wgtypes.Device, now time.Time) {
49 +func (c *Collector) collectDevicesPeers(mx map[string]int64, devices []*wgtypes.Device, now time.Time) {
50 for _, d := range devices {
51 - if !w.devices[d.Name] {
52 - w.devices[d.Name] = true
53 - w.addNewDeviceCharts(d.Name)
51 + if !c.devices[d.Name] {
52 + c.devices[d.Name] = true
53 + c.addNewDeviceCharts(d.Name)
54 }
55
56 mx["device_"+d.Name+"_peers"] = int64(len(d.Peers))
@@ -68,9 +68,9 @@ func (w *WireGuard) collectDevicesPeers(mx map[string]int64, devices []*wgtypes.
68 pubKey := p.PublicKey.String()
69 id := peerID(d.Name, pubKey)
70
71 - if !w.peers[id] {
72 - w.peers[id] = true
73 - w.addNewPeerCharts(id, d.Name, pubKey)
71 + if !c.peers[id] {
72 + c.peers[id] = true
73 + c.addNewPeerCharts(id, d.Name, pubKey)
74 }
75
76 mx["device_"+d.Name+"_receive"] += p.ReceiveBytes
@@ -82,7 +82,7 @@ func (w *WireGuard) collectDevicesPeers(mx map[string]int64, devices []*wgtypes.
82 }
83 }
84
85 -func (w *WireGuard) cleanupDevicesPeers(devices []*wgtypes.Device) {
85 +func (c *Collector) cleanupDevicesPeers(devices []*wgtypes.Device) {
86 seenDevices, seenPeers := make(map[string]bool), make(map[string]bool)
87 for _, d := range devices {
88 seenDevices[d.Name] = true
@@ -90,16 +90,16 @@ func (w *WireGuard) cleanupDevicesPeers(devices []*wgtypes.Device) {
90 seenPeers[peerID(d.Name, p.PublicKey.String())] = true
91 }
92 }
93 - for d := range w.devices {
93 + for d := range c.devices {
94 if !seenDevices[d] {
95 - delete(w.devices, d)
96 - w.removeDeviceCharts(d)
95 + delete(c.devices, d)
96 + c.removeDeviceCharts(d)
97 }
98 }
99 - for p := range w.peers {
99 + for p := range c.peers {
100 if !seenPeers[p] {
101 - delete(w.peers, p)
102 - w.removePeerCharts(p)
101 + delete(c.peers, p)
102 + c.removePeerCharts(p)
103 }
104 }
105 }
src/go/plugin/go.d/collector/wireguard/collector.go renamed
+18 -18
@@ -24,8 +24,8 @@ func init() {
24 })
25 }
26
27 -func New() *WireGuard {
28 - return &WireGuard{
27 +func New() *Collector {
28 + return &Collector{
29 newWGClient: func() (wgClient, error) { return wgctrl.New() },
30 charts: &module.Charts{},
31 devices: make(map[string]bool),
@@ -39,7 +39,7 @@ type Config struct {
39 }
40
41 type (
42 - WireGuard struct {
42 + Collector struct {
43 module.Base
44 Config `yaml:",inline" json:""`
45
@@ -59,16 +59,16 @@ type (
59 }
60 )
61
62 -func (w *WireGuard) Configuration() any {
63 - return w.Config
62 +func (c *Collector) Configuration() any {
63 + return c.Config
64 }
65
66 -func (w *WireGuard) Init() error {
66 +func (c *Collector) Init() error {
67 return nil
68 }
69
70 -func (w *WireGuard) Check() error {
71 - mx, err := w.collect()
70 +func (c *Collector) Check() error {
71 + mx, err := c.collect()
72 if err != nil {
73 return err
74 }
@@ -78,14 +78,14 @@ func (w *WireGuard) Check() error {
78 return nil
79 }
80
81 -func (w *WireGuard) Charts() *module.Charts {
82 - return w.charts
81 +func (c *Collector) Charts() *module.Charts {
82 + return c.charts
83 }
84
85 -func (w *WireGuard) Collect() map[string]int64 {
86 - mx, err := w.collect()
85 +func (c *Collector) Collect() map[string]int64 {
86 + mx, err := c.collect()
87 if err != nil {
88 - w.Error(err)
88 + c.Error(err)
89 }
90
91 if len(mx) == 0 {
@@ -94,12 +94,12 @@ func (w *WireGuard) Collect() map[string]int64 {
94 return mx
95 }
96
97 -func (w *WireGuard) Cleanup() {
98 - if w.client == nil {
97 +func (c *Collector) Cleanup() {
98 + if c.client == nil {
99 return
100 }
101 - if err := w.client.Close(); err != nil {
102 - w.Warningf("cleanup: error on closing connection: %v", err)
101 + if err := c.client.Close(); err != nil {
102 + c.Warningf("cleanup: error on closing connection: %v", err)
103 }
104 - w.client = nil
104 + c.client = nil
105 }
src/go/plugin/go.d/collector/wireguard/collector_test.go renamed
+89 -89
@@ -31,51 +31,51 @@ func Test_testDataIsValid(t *testing.T) {
31 }
32 }
33
34 -func TestWireGuard_ConfigurationSerialize(t *testing.T) {
35 - module.TestConfigurationSerialize(t, &WireGuard{}, dataConfigJSON, dataConfigYAML)
34 +func TestCollector_ConfigurationSerialize(t *testing.T) {
35 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
36 }
37
38 -func TestWireGuard_Init(t *testing.T) {
38 +func TestCollector_Init(t *testing.T) {
39 assert.NoError(t, New().Init())
40 }
41
42 -func TestWireGuard_Charts(t *testing.T) {
42 +func TestCollector_Charts(t *testing.T) {
43 assert.Len(t, *New().Charts(), 0)
44
45 }
46
47 -func TestWireGuard_Cleanup(t *testing.T) {
47 +func TestCollector_Cleanup(t *testing.T) {
48 tests := map[string]struct {
49 - prepare func(w *WireGuard)
49 + prepare func(w *Collector)
50 wantClose bool
51 }{
52 "after New": {
53 wantClose: false,
54 - prepare: func(w *WireGuard) {},
54 + prepare: func(*Collector) {},
55 },
56 "after Init": {
57 wantClose: false,
58 - prepare: func(w *WireGuard) { _ = w.Init() },
58 + prepare: func(c *Collector) { _ = c.Init() },
59 },
60 "after Check": {
61 wantClose: true,
62 - prepare: func(w *WireGuard) { _ = w.Init(); _ = w.Check() },
62 + prepare: func(c *Collector) { _ = c.Init(); _ = c.Check() },
63 },
64 "after Collect": {
65 wantClose: true,
66 - prepare: func(w *WireGuard) { _ = w.Init(); _ = w.Collect() },
66 + prepare: func(c *Collector) { _ = c.Init(); _ = c.Collect() },
67 },
68 }
69
70 for name, test := range tests {
71 t.Run(name, func(t *testing.T) {
72 - w := New()
72 + collr := New()
73 m := &mockClient{}
74 - w.newWGClient = func() (wgClient, error) { return m, nil }
74 + collr.newWGClient = func() (wgClient, error) { return m, nil }
75
76 - test.prepare(w)
76 + test.prepare(collr)
77
78 - require.NotPanics(t, w.Cleanup)
78 + require.NotPanics(t, collr.Cleanup)
79
80 if test.wantClose {
81 assert.True(t, m.closeCalled)
@@ -86,69 +86,69 @@ func TestWireGuard_Cleanup(t *testing.T) {
86 }
87 }
88
89 -func TestWireGuard_Check(t *testing.T) {
89 +func TestCollector_Check(t *testing.T) {
90 tests := map[string]struct {
91 wantFail bool
92 - prepare func(w *WireGuard)
92 + prepare func(w *Collector)
93 }{
94 "success when devices and peers found": {
95 wantFail: false,
96 - prepare: func(w *WireGuard) {
96 + prepare: func(collr *Collector) {
97 m := &mockClient{}
98 d1 := prepareDevice(1)
99 d1.Peers = append(d1.Peers, preparePeer("11"))
100 d1.Peers = append(d1.Peers, preparePeer("12"))
101 m.devices = append(m.devices, d1)
102 - w.client = m
102 + collr.client = m
103 },
104 },
105 "success when devices and no peers found": {
106 wantFail: false,
107 - prepare: func(w *WireGuard) {
107 + prepare: func(collr *Collector) {
108 m := &mockClient{}
109 m.devices = append(m.devices, prepareDevice(1))
110 - w.client = m
110 + collr.client = m
111 },
112 },
113 "fail when no devices and no peers found": {
114 wantFail: true,
115 - prepare: func(w *WireGuard) {
116 - w.client = &mockClient{}
115 + prepare: func(collr *Collector) {
116 + collr.client = &mockClient{}
117 },
118 },
119 "fail when error on retrieving devices": {
120 wantFail: true,
121 - prepare: func(w *WireGuard) {
122 - w.client = &mockClient{errOnDevices: true}
121 + prepare: func(collr *Collector) {
122 + collr.client = &mockClient{errOnDevices: true}
123 },
124 },
125 "fail when error on creating client": {
126 wantFail: true,
127 - prepare: func(w *WireGuard) {
128 - w.newWGClient = func() (wgClient, error) { return nil, errors.New("mock.newWGClient() error") }
127 + prepare: func(collr *Collector) {
128 + collr.newWGClient = func() (wgClient, error) { return nil, errors.New("mock.newWGClient() error") }
129 },
130 },
131 }
132
133 for name, test := range tests {
134 t.Run(name, func(t *testing.T) {
135 - w := New()
136 - require.NoError(t, w.Init())
137 - test.prepare(w)
135 + collr := New()
136 + require.NoError(t, collr.Init())
137 + test.prepare(collr)
138
139 if test.wantFail {
140 - assert.Error(t, w.Check())
140 + assert.Error(t, collr.Check())
141 } else {
142 - assert.NoError(t, w.Check())
142 + assert.NoError(t, collr.Check())
143 }
144 })
145 }
146 }
147
148 -func TestWireGuard_Collect(t *testing.T) {
148 +func TestCollector_Collect(t *testing.T) {
149 type testCaseStep struct {
150 - prepareMock func(m *mockClient)
151 - check func(t *testing.T, w *WireGuard)
150 + prepareMock func(*mockClient)
151 + check func(*testing.T, *Collector)
152 }
153 tests := map[string][]testCaseStep{
154 "several devices no peers": {
@@ -157,8 +157,8 @@ func TestWireGuard_Collect(t *testing.T) {
157 m.devices = append(m.devices, prepareDevice(1))
158 m.devices = append(m.devices, prepareDevice(2))
159 },
160 - check: func(t *testing.T, w *WireGuard) {
161 - mx := w.Collect()
160 + check: func(t *testing.T, collr *Collector) {
161 + mx := collr.Collect()
162
163 expected := map[string]int64{
164 "device_wg1_peers": 0,
@@ -171,7 +171,7 @@ func TestWireGuard_Collect(t *testing.T) {
171
172 copyLatestHandshake(mx, expected)
173 assert.Equal(t, expected, mx)
174 - assert.Equal(t, len(deviceChartsTmpl)*2, len(*w.Charts()))
174 + assert.Equal(t, len(deviceChartsTmpl)*2, len(*collr.Charts()))
175 },
176 },
177 },
@@ -188,8 +188,8 @@ func TestWireGuard_Collect(t *testing.T) {
188 d2.Peers = append(d2.Peers, preparePeer("22"))
189 m.devices = append(m.devices, d2)
190 },
191 - check: func(t *testing.T, w *WireGuard) {
192 - mx := w.Collect()
191 + check: func(t *testing.T, collr *Collector) {
192 + mx := collr.Collect()
193
194 expected := map[string]int64{
195 "device_wg1_peers": 2,
@@ -214,7 +214,7 @@ func TestWireGuard_Collect(t *testing.T) {
214
215 copyLatestHandshake(mx, expected)
216 assert.Equal(t, expected, mx)
217 - assert.Equal(t, len(deviceChartsTmpl)*2+len(peerChartsTmpl)*4, len(*w.Charts()))
217 + assert.Equal(t, len(deviceChartsTmpl)*2+len(peerChartsTmpl)*4, len(*collr.Charts()))
218 },
219 },
220 },
@@ -228,8 +228,8 @@ func TestWireGuard_Collect(t *testing.T) {
228 d1.Peers = append(d1.Peers, prepareNoLastHandshakePeer("14"))
229 m.devices = append(m.devices, d1)
230 },
231 - check: func(t *testing.T, w *WireGuard) {
232 - mx := w.Collect()
231 + check: func(t *testing.T, collr *Collector) {
232 + mx := collr.Collect()
233
234 expected := map[string]int64{
235 "device_wg1_peers": 4,
@@ -245,7 +245,7 @@ func TestWireGuard_Collect(t *testing.T) {
245
246 copyLatestHandshake(mx, expected)
247 assert.Equal(t, expected, mx)
248 - assert.Equal(t, len(deviceChartsTmpl)+len(peerChartsTmpl)*2, len(*w.Charts()))
248 + assert.Equal(t, len(deviceChartsTmpl)+len(peerChartsTmpl)*2, len(*collr.Charts()))
249 },
250 },
251 },
@@ -254,17 +254,17 @@ func TestWireGuard_Collect(t *testing.T) {
254 prepareMock: func(m *mockClient) {
255 m.devices = append(m.devices, prepareDevice(1))
256 },
257 - check: func(t *testing.T, w *WireGuard) {
258 - _ = w.Collect()
259 - assert.Equal(t, len(deviceChartsTmpl)*1, len(*w.Charts()))
257 + check: func(t *testing.T, collr *Collector) {
258 + _ = collr.Collect()
259 + assert.Equal(t, len(deviceChartsTmpl)*1, len(*collr.Charts()))
260 },
261 },
262 {
263 prepareMock: func(m *mockClient) {
264 m.devices = append(m.devices, prepareDevice(2))
265 },
266 - check: func(t *testing.T, w *WireGuard) {
267 - mx := w.Collect()
266 + check: func(t *testing.T, collr *Collector) {
267 + mx := collr.Collect()
268
269 expected := map[string]int64{
270 "device_wg1_peers": 0,
@@ -276,7 +276,7 @@ func TestWireGuard_Collect(t *testing.T) {
276 }
277 copyLatestHandshake(mx, expected)
278 assert.Equal(t, expected, mx)
279 - assert.Equal(t, len(deviceChartsTmpl)*2, len(*w.Charts()))
279 + assert.Equal(t, len(deviceChartsTmpl)*2, len(*collr.Charts()))
280
281 },
282 },
@@ -287,18 +287,18 @@ func TestWireGuard_Collect(t *testing.T) {
287 m.devices = append(m.devices, prepareDevice(1))
288 m.devices = append(m.devices, prepareDevice(2))
289 },
290 - check: func(t *testing.T, w *WireGuard) {
291 - _ = w.Collect()
290 + check: func(t *testing.T, collr *Collector) {
291 + _ = collr.Collect()
292 },
293 },
294 {
295 prepareMock: func(m *mockClient) {
296 m.devices = m.devices[:len(m.devices)-1]
297 },
298 - check: func(t *testing.T, w *WireGuard) {
299 - _ = w.Collect()
300 - assert.Equal(t, len(deviceChartsTmpl)*2, len(*w.Charts()))
301 - assert.Equal(t, 0, calcObsoleteCharts(w.Charts()))
298 + check: func(t *testing.T, collr *Collector) {
299 + _ = collr.Collect()
300 + assert.Equal(t, len(deviceChartsTmpl)*2, len(*collr.Charts()))
301 + assert.Equal(t, 0, calcObsoleteCharts(collr.Charts()))
302 },
303 },
304 },
@@ -308,20 +308,20 @@ func TestWireGuard_Collect(t *testing.T) {
308 m.devices = append(m.devices, prepareDevice(1))
309 m.devices = append(m.devices, prepareDevice(2))
310 },
311 - check: func(t *testing.T, w *WireGuard) {
312 - _ = w.Collect()
311 + check: func(t *testing.T, collr *Collector) {
312 + _ = collr.Collect()
313 },
314 },
315 {
316 prepareMock: func(m *mockClient) {
317 m.devices = m.devices[:len(m.devices)-1]
318 },
319 - check: func(t *testing.T, w *WireGuard) {
320 - w.cleanupEvery = time.Second
319 + check: func(t *testing.T, collr *Collector) {
320 + collr.cleanupEvery = time.Second
321 time.Sleep(time.Second)
322 - _ = w.Collect()
323 - assert.Equal(t, len(deviceChartsTmpl)*2, len(*w.Charts()))
324 - assert.Equal(t, len(deviceChartsTmpl)*1, calcObsoleteCharts(w.Charts()))
322 + _ = collr.Collect()
323 + assert.Equal(t, len(deviceChartsTmpl)*2, len(*collr.Charts()))
324 + assert.Equal(t, len(deviceChartsTmpl)*1, calcObsoleteCharts(collr.Charts()))
325 },
326 },
327 },
@@ -330,9 +330,9 @@ func TestWireGuard_Collect(t *testing.T) {
330 prepareMock: func(m *mockClient) {
331 m.devices = append(m.devices, prepareDevice(1))
332 },
333 - check: func(t *testing.T, w *WireGuard) {
334 - _ = w.Collect()
335 - assert.Equal(t, len(deviceChartsTmpl)*1, len(*w.Charts()))
333 + check: func(t *testing.T, collr *Collector) {
334 + _ = collr.Collect()
335 + assert.Equal(t, len(deviceChartsTmpl)*1, len(*collr.Charts()))
336 },
337 },
338 {
@@ -340,8 +340,8 @@ func TestWireGuard_Collect(t *testing.T) {
340 d1 := m.devices[0]
341 d1.Peers = append(d1.Peers, preparePeer("11"))
342 },
343 - check: func(t *testing.T, w *WireGuard) {
344 - mx := w.Collect()
343 + check: func(t *testing.T, collr *Collector) {
344 + mx := collr.Collect()
345
346 expected := map[string]int64{
347 "device_wg1_peers": 1,
@@ -353,7 +353,7 @@ func TestWireGuard_Collect(t *testing.T) {
353 }
354 copyLatestHandshake(mx, expected)
355 assert.Equal(t, expected, mx)
356 - assert.Equal(t, len(deviceChartsTmpl)*1+len(peerChartsTmpl)*1, len(*w.Charts()))
356 + assert.Equal(t, len(deviceChartsTmpl)*1+len(peerChartsTmpl)*1, len(*collr.Charts()))
357 },
358 },
359 },
@@ -365,8 +365,8 @@ func TestWireGuard_Collect(t *testing.T) {
365 d1.Peers = append(d1.Peers, preparePeer("12"))
366 m.devices = append(m.devices, d1)
367 },
368 - check: func(t *testing.T, w *WireGuard) {
369 - _ = w.Collect()
368 + check: func(t *testing.T, collr *Collector) {
369 + _ = collr.Collect()
370 },
371 },
372 {
@@ -374,10 +374,10 @@ func TestWireGuard_Collect(t *testing.T) {
374 d1 := m.devices[0]
375 d1.Peers = d1.Peers[:len(d1.Peers)-1]
376 },
377 - check: func(t *testing.T, w *WireGuard) {
378 - _ = w.Collect()
379 - assert.Equal(t, len(deviceChartsTmpl)*1+len(peerChartsTmpl)*2, len(*w.Charts()))
380 - assert.Equal(t, 0, calcObsoleteCharts(w.Charts()))
377 + check: func(t *testing.T, collr *Collector) {
378 + _ = collr.Collect()
379 + assert.Equal(t, len(deviceChartsTmpl)*1+len(peerChartsTmpl)*2, len(*collr.Charts()))
380 + assert.Equal(t, 0, calcObsoleteCharts(collr.Charts()))
381 },
382 },
383 },
@@ -389,8 +389,8 @@ func TestWireGuard_Collect(t *testing.T) {
389 d1.Peers = append(d1.Peers, preparePeer("12"))
390 m.devices = append(m.devices, d1)
391 },
392 - check: func(t *testing.T, w *WireGuard) {
393 - _ = w.Collect()
392 + check: func(t *testing.T, collr *Collector) {
393 + _ = collr.Collect()
394 },
395 },
396 {
@@ -398,20 +398,20 @@ func TestWireGuard_Collect(t *testing.T) {
398 d1 := m.devices[0]
399 d1.Peers = d1.Peers[:len(d1.Peers)-1]
400 },
401 - check: func(t *testing.T, w *WireGuard) {
402 - w.cleanupEvery = time.Second
401 + check: func(t *testing.T, collr *Collector) {
402 + collr.cleanupEvery = time.Second
403 time.Sleep(time.Second)
404 - _ = w.Collect()
405 - assert.Equal(t, len(deviceChartsTmpl)*1+len(peerChartsTmpl)*2, len(*w.Charts()))
406 - assert.Equal(t, len(peerChartsTmpl)*1, calcObsoleteCharts(w.Charts()))
404 + _ = collr.Collect()
405 + assert.Equal(t, len(deviceChartsTmpl)*1+len(peerChartsTmpl)*2, len(*collr.Charts()))
406 + assert.Equal(t, len(peerChartsTmpl)*1, calcObsoleteCharts(collr.Charts()))
407 },
408 },
409 },
410 "fails if no devices found": {
411 {
412 prepareMock: func(m *mockClient) {},
413 - check: func(t *testing.T, w *WireGuard) {
414 - assert.Equal(t, map[string]int64(nil), w.Collect())
413 + check: func(t *testing.T, collr *Collector) {
414 + assert.Equal(t, map[string]int64(nil), collr.Collect())
415 },
416 },
417 },
@@ -420,8 +420,8 @@ func TestWireGuard_Collect(t *testing.T) {
420 prepareMock: func(m *mockClient) {
421 m.errOnDevices = true
422 },
423 - check: func(t *testing.T, w *WireGuard) {
424 - assert.Equal(t, map[string]int64(nil), w.Collect())
423 + check: func(t *testing.T, collr *Collector) {
424 + assert.Equal(t, map[string]int64(nil), collr.Collect())
425 },
426 },
427 },
@@ -429,15 +429,15 @@ func TestWireGuard_Collect(t *testing.T) {
429
430 for name, test := range tests {
431 t.Run(name, func(t *testing.T) {
432 - w := New()
433 - require.NoError(t, w.Init())
432 + collr := New()
433 + require.NoError(t, collr.Init())
434 m := &mockClient{}
435 - w.client = m
435 + collr.client = m
436
437 for i, step := range test {
438 t.Run(fmt.Sprintf("step[%d]", i), func(t *testing.T) {
439 step.prepareMock(m)
440 - step.check(t, w)
440 + step.check(t, collr)
441 })
442 }
443 })
src/go/plugin/go.d/collector/x509check/charts.go
+5 -5
@@ -40,17 +40,17 @@ var (
40 }
41 )
42
43 -func (x *X509Check) addCertCharts(commonName string, depth int) {
43 +func (c *Collector) addCertCharts(commonName string, depth int) {
44 charts := certChartsTmpl.Copy()
45
46 - if depth > 0 || !x.CheckRevocation {
46 + if depth > 0 || !c.CheckRevocation {
47 _ = charts.Remove(certRevocationStatusChartTmpl.ID)
48 }
49
50 for _, chart := range *charts {
51 chart.ID = fmt.Sprintf(chart.ID, depth)
52 chart.Labels = []module.Label{
53 - {Key: "source", Value: x.Source},
53 + {Key: "source", Value: c.Source},
54 {Key: "common_name", Value: commonName},
55 {Key: "depth", Value: strconv.Itoa(depth)},
56 }
@@ -59,7 +59,7 @@ func (x *X509Check) addCertCharts(commonName string, depth int) {
59 }
60 }
61
62 - if err := x.Charts().Add(*charts...); err != nil {
63 - x.Warningf("failed to add charts for '%s': %v", commonName, err)
62 + if err := c.Charts().Add(*charts...); err != nil {
63 + c.Warningf("failed to add charts for '%s': %v", commonName, err)
64 }
65 }
src/go/plugin/go.d/collector/x509check/collect.go
+11 -11
@@ -12,43 +12,43 @@ import (
12 "github.com/cloudflare/cfssl/revoke"
13 )
14
15 -func (x *X509Check) collect() (map[string]int64, error) {
16 - certs, err := x.prov.certificates()
15 +func (c *Collector) collect() (map[string]int64, error) {
16 + certs, err := c.prov.certificates()
17 if err != nil {
18 return nil, err
19 }
20
21 if len(certs) == 0 {
22 - return nil, fmt.Errorf("no certificate was provided by '%s'", x.Config.Source)
22 + return nil, fmt.Errorf("no certificate was provided by '%s'", c.Config.Source)
23 }
24
25 mx := make(map[string]int64)
26
27 - if err := x.collectCertificates(mx, certs); err != nil {
27 + if err := c.collectCertificates(mx, certs); err != nil {
28 return nil, err
29 }
30
31 return mx, nil
32 }
33
34 -func (x *X509Check) collectCertificates(mx map[string]int64, certs []*x509.Certificate) error {
34 +func (c *Collector) collectCertificates(mx map[string]int64, certs []*x509.Certificate) error {
35 for i, cert := range certs {
36 cn := cert.Subject.CommonName
37
38 - if !x.seenCerts[cn] {
39 - x.seenCerts[cn] = true
40 - x.addCertCharts(cn, i)
38 + if !c.seenCerts[cn] {
39 + c.seenCerts[cn] = true
40 + c.addCertCharts(cn, i)
41 }
42
43 px := fmt.Sprintf("cert_depth%d_", i)
44
45 mx[px+"expiry"] = int64(time.Until(cert.NotAfter).Seconds())
46
47 - if i == 0 && x.CheckRevocation {
47 + if i == 0 && c.CheckRevocation {
48 func() {
49 rev, ok, err := revoke.VerifyCertificateError(cert)
50 if err != nil {
51 - x.Debug(err)
51 + c.Debug(err)
52 return
53 }
54 if !ok {
@@ -59,7 +59,7 @@ func (x *X509Check) collectCertificates(mx map[string]int64, certs []*x509.Certi
59 }()
60 }
61
62 - if !x.CheckFullChain {
62 + if !c.CheckFullChain {
63 break
64 }
65 }
src/go/plugin/go.d/collector/x509check/collector.go renamed
+17 -17
@@ -30,8 +30,8 @@ func init() {
30 })
31 }
32
33 -func New() *X509Check {
34 - return &X509Check{
33 +func New() *Collector {
34 + return &Collector{
35 Config: Config{
36 Timeout: confopt.Duration(time.Second * 2),
37 CheckFullChain: false,
@@ -51,7 +51,7 @@ type Config struct {
51 tlscfg.TLSConfig `yaml:",inline" json:""`
52 }
53
54 -type X509Check struct {
54 +type Collector struct {
55 module.Base
56 Config `yaml:",inline" json:""`
57
@@ -62,26 +62,26 @@ type X509Check struct {
62 seenCerts map[string]bool
63 }
64
65 -func (x *X509Check) Configuration() any {
66 - return x.Config
65 +func (c *Collector) Configuration() any {
66 + return c.Config
67 }
68
69 -func (x *X509Check) Init() error {
70 - if err := x.validateConfig(); err != nil {
69 +func (c *Collector) Init() error {
70 + if err := c.validateConfig(); err != nil {
71 return fmt.Errorf("config validation: %v", err)
72 }
73
74 - prov, err := x.initProvider()
74 + prov, err := c.initProvider()
75 if err != nil {
76 return fmt.Errorf("certificate provider init: %v", err)
77 }
78 - x.prov = prov
78 + c.prov = prov
79
80 return nil
81 }
82
83 -func (x *X509Check) Check() error {
84 - mx, err := x.collect()
83 +func (c *Collector) Check() error {
84 + mx, err := c.collect()
85 if err != nil {
86 return err
87 }
@@ -91,14 +91,14 @@ func (x *X509Check) Check() error {
91 return nil
92 }
93
94 -func (x *X509Check) Charts() *module.Charts {
95 - return x.charts
94 +func (c *Collector) Charts() *module.Charts {
95 + return c.charts
96 }
97
98 -func (x *X509Check) Collect() map[string]int64 {
99 - mx, err := x.collect()
98 +func (c *Collector) Collect() map[string]int64 {
99 + mx, err := c.collect()
100 if err != nil {
101 - x.Error(err)
101 + c.Error(err)
102 }
103
104 if len(mx) == 0 {
@@ -107,4 +107,4 @@ func (x *X509Check) Collect() map[string]int64 {
107 return mx
108 }
109
110 -func (x *X509Check) Cleanup() {}
110 +func (c *Collector) Cleanup() {}
src/go/plugin/go.d/collector/x509check/collector_test.go renamed
+39 -39
@@ -29,22 +29,22 @@ func Test_testDataIsValid(t *testing.T) {
29 }
30 }
31
32 -func TestX509Check_ConfigurationSerialize(t *testing.T) {
33 - module.TestConfigurationSerialize(t, &X509Check{}, dataConfigJSON, dataConfigYAML)
32 +func TestCollector_ConfigurationSerialize(t *testing.T) {
33 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
34 }
35
36 -func TestX509Check_Cleanup(t *testing.T) {
36 +func TestCollector_Cleanup(t *testing.T) {
37 assert.NotPanics(t, New().Cleanup)
38 }
39
40 -func TestX509Check_Charts(t *testing.T) {
41 - x509Check := New()
42 - x509Check.Source = "https://example.com"
43 - require.NoError(t, x509Check.Init())
44 - assert.NotNil(t, x509Check.Charts())
40 +func TestCollector_Charts(t *testing.T) {
41 + collr := New()
42 + collr.Source = "https://example.com"
43 + require.NoError(t, collr.Init())
44 + assert.NotNil(t, collr.Charts())
45 }
46
47 -func TestX509Check_Init(t *testing.T) {
47 +func TestCollector_Init(t *testing.T) {
48 const (
49 file = iota
50 net
@@ -86,22 +86,22 @@ func TestX509Check_Init(t *testing.T) {
86
87 for name, test := range tests {
88 t.Run(name, func(t *testing.T) {
89 - x509Check := New()
90 - x509Check.Config = test.config
89 + collr := New()
90 + collr.Config = test.config
91
92 if test.err {
93 - assert.Error(t, x509Check.Init())
93 + assert.Error(t, collr.Init())
94 } else {
95 - require.NoError(t, x509Check.Init())
95 + require.NoError(t, collr.Init())
96
97 var typeOK bool
98 switch test.providerType {
99 case file:
100 - _, typeOK = x509Check.prov.(*fromFile)
100 + _, typeOK = collr.prov.(*fromFile)
101 case net:
102 - _, typeOK = x509Check.prov.(*fromNet)
102 + _, typeOK = collr.prov.(*fromNet)
103 case smtp:
104 - _, typeOK = x509Check.prov.(*fromSMTP)
104 + _, typeOK = collr.prov.(*fromSMTP)
105 }
106
107 assert.True(t, typeOK)
@@ -110,43 +110,43 @@ func TestX509Check_Init(t *testing.T) {
110 }
111 }
112
113 -func TestX509Check_Check(t *testing.T) {
114 - x509Check := New()
115 - x509Check.prov = &mockProvider{certs: []*x509.Certificate{{}}}
113 +func TestCollector_Check(t *testing.T) {
114 + collr := New()
115 + collr.prov = &mockProvider{certs: []*x509.Certificate{{}}}
116
117 - assert.NoError(t, x509Check.Check())
117 + assert.NoError(t, collr.Check())
118 }
119
120 -func TestX509Check_Check_ReturnsFalseOnProviderError(t *testing.T) {
121 - x509Check := New()
122 - x509Check.prov = &mockProvider{err: true}
120 +func TestCollector_Check_ReturnsFalseOnProviderError(t *testing.T) {
121 + collr := New()
122 + collr.prov = &mockProvider{err: true}
123
124 - assert.Error(t, x509Check.Check())
124 + assert.Error(t, collr.Check())
125 }
126
127 -func TestX509Check_Collect(t *testing.T) {
128 - x509Check := New()
129 - x509Check.Source = "https://example.com"
130 - require.NoError(t, x509Check.Init())
131 - x509Check.prov = &mockProvider{certs: []*x509.Certificate{{}}}
127 +func TestCollector_Collect(t *testing.T) {
128 + collr := New()
129 + collr.Source = "https://example.com"
130 + require.NoError(t, collr.Init())
131 + collr.prov = &mockProvider{certs: []*x509.Certificate{{}}}
132
133 - mx := x509Check.Collect()
133 + mx := collr.Collect()
134
135 assert.NotZero(t, mx)
136 - module.TestMetricsHasAllChartsDims(t, x509Check.Charts(), mx)
136 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
137 }
138
139 -func TestX509Check_Collect_ReturnsNilOnProviderError(t *testing.T) {
140 - x509Check := New()
141 - x509Check.prov = &mockProvider{err: true}
139 +func TestCollector_Collect_ReturnsNilOnProviderError(t *testing.T) {
140 + collr := New()
141 + collr.prov = &mockProvider{err: true}
142
143 - assert.Nil(t, x509Check.Collect())
143 + assert.Nil(t, collr.Collect())
144 }
145
146 -func TestX509Check_Collect_ReturnsNilOnZeroCertificates(t *testing.T) {
147 - x509Check := New()
148 - x509Check.prov = &mockProvider{certs: []*x509.Certificate{}}
149 - mx := x509Check.Collect()
146 +func TestCollector_Collect_ReturnsNilOnZeroCertificates(t *testing.T) {
147 + collr := New()
148 + collr.prov = &mockProvider{certs: []*x509.Certificate{}}
149 + mx := collr.Collect()
150
151 assert.Nil(t, mx)
152 }
src/go/plugin/go.d/collector/x509check/init.go
+4 -4
@@ -6,13 +6,13 @@ import (
6 "errors"
7 )
8
9 -func (x *X509Check) validateConfig() error {
10 - if x.Source == "" {
9 +func (c *Collector) validateConfig() error {
10 + if c.Source == "" {
11 return errors.New("source is not set")
12 }
13 return nil
14 }
15
16 -func (x *X509Check) initProvider() (provider, error) {
17 - return newProvider(x.Config)
16 +func (c *Collector) initProvider() (provider, error) {
17 + return newProvider(c.Config)
18 }
src/go/plugin/go.d/collector/zfspool/charts.go
+12 -12
@@ -115,7 +115,7 @@ var (
115 }
116 )
117
118 -func (z *ZFSPool) addZpoolCharts(name string) {
118 +func (c *Collector) addZpoolCharts(name string) {
119 charts := zpoolChartsTmpl.Copy()
120
121 for _, chart := range *charts {
@@ -128,17 +128,17 @@ func (z *ZFSPool) addZpoolCharts(name string) {
128 }
129 }
130
131 - if err := z.Charts().Add(*charts...); err != nil {
132 - z.Warning(err)
131 + if err := c.Charts().Add(*charts...); err != nil {
132 + c.Warning(err)
133 }
134 }
135
136 -func (z *ZFSPool) removeZpoolCharts(name string) {
136 +func (c *Collector) removeZpoolCharts(name string) {
137 px := fmt.Sprintf("zfspool_%s_", name)
138 - z.removeCharts(px)
138 + c.removeCharts(px)
139 }
140
141 -func (z *ZFSPool) addVdevCharts(pool, vdev string) {
141 +func (c *Collector) addVdevCharts(pool, vdev string) {
142 charts := vdevChartsTmpl.Copy()
143
144 for _, chart := range *charts {
@@ -152,18 +152,18 @@ func (z *ZFSPool) addVdevCharts(pool, vdev string) {
152 }
153 }
154
155 - if err := z.Charts().Add(*charts...); err != nil {
156 - z.Warning(err)
155 + if err := c.Charts().Add(*charts...); err != nil {
156 + c.Warning(err)
157 }
158 }
159
160 -func (z *ZFSPool) removeVdevCharts(vdev string) {
160 +func (c *Collector) removeVdevCharts(vdev string) {
161 px := fmt.Sprintf("vdev_%s_", cleanVdev(vdev))
162 - z.removeCharts(px)
162 + c.removeCharts(px)
163 }
164
165 -func (z *ZFSPool) removeCharts(px string) {
166 - for _, chart := range *z.Charts() {
165 +func (c *Collector) removeCharts(px string) {
166 + for _, chart := range *c.Charts() {
167 if strings.HasPrefix(chart.ID, px) {
168 chart.MarkRemove()
169 chart.MarkNotCreated()
src/go/plugin/go.d/collector/zfspool/collect.go
+3 -3
@@ -14,14 +14,14 @@ var zpoolHealthStates = []string{
14 "suspended",
15 }
16
17 -func (z *ZFSPool) collect() (map[string]int64, error) {
17 +func (c *Collector) collect() (map[string]int64, error) {
18
19 mx := make(map[string]int64)
20
21 - if err := z.collectZpoolList(mx); err != nil {
21 + if err := c.collectZpoolList(mx); err != nil {
22 return nil, err
23 }
24 - if err := z.collectZpoolListVdev(mx); err != nil {
24 + if err := c.collectZpoolListVdev(mx); err != nil {
25 return mx, err
26 }
27
src/go/plugin/go.d/collector/zfspool/collect_zpool_list.go
+8 -8
@@ -24,8 +24,8 @@ type zpoolEntry struct {
24 health string
25 }
26
27 -func (z *ZFSPool) collectZpoolList(mx map[string]int64) error {
28 - bs, err := z.exec.list()
27 +func (c *Collector) collectZpoolList(mx map[string]int64) error {
28 + bs, err := c.exec.list()
29 if err != nil {
30 return err
31 }
@@ -40,9 +40,9 @@ func (z *ZFSPool) collectZpoolList(mx map[string]int64) error {
40 for _, zpool := range zpools {
41 seen[zpool.name] = true
42
43 - if !z.seenZpools[zpool.name] {
44 - z.addZpoolCharts(zpool.name)
45 - z.seenZpools[zpool.name] = true
43 + if !c.seenZpools[zpool.name] {
44 + c.addZpoolCharts(zpool.name)
45 + c.seenZpools[zpool.name] = true
46 }
47
48 px := "zpool_" + zpool.name + "_"
@@ -68,10 +68,10 @@ func (z *ZFSPool) collectZpoolList(mx map[string]int64) error {
68 mx[px+"health_state_"+zpool.health] = 1
69 }
70
71 - for name := range z.seenZpools {
71 + for name := range c.seenZpools {
72 if !seen[name] {
73 - z.removeZpoolCharts(name)
74 - delete(z.seenZpools, name)
73 + c.removeZpoolCharts(name)
74 + delete(c.seenZpools, name)
75 }
76 }
77
src/go/plugin/go.d/collector/zfspool/collect_zpool_list_vdev.go
+9 -9
@@ -21,11 +21,11 @@ type vdevEntry struct {
21 level int
22 }
23
24 -func (z *ZFSPool) collectZpoolListVdev(mx map[string]int64) error {
24 +func (c *Collector) collectZpoolListVdev(mx map[string]int64) error {
25 seen := make(map[string]bool)
26
27 - for pool := range z.seenZpools {
28 - bs, err := z.exec.listWithVdev(pool)
27 + for pool := range c.seenZpools {
28 + bs, err := c.exec.listWithVdev(pool)
29 if err != nil {
30 return err
31 }
@@ -41,9 +41,9 @@ func (z *ZFSPool) collectZpoolListVdev(mx map[string]int64) error {
41 }
42
43 seen[vdev.vdev] = true
44 - if !z.seenVdevs[vdev.vdev] {
45 - z.seenVdevs[vdev.vdev] = true
46 - z.addVdevCharts(pool, vdev.vdev)
44 + if !c.seenVdevs[vdev.vdev] {
45 + c.seenVdevs[vdev.vdev] = true
46 + c.addVdevCharts(pool, vdev.vdev)
47 }
48
49 px := fmt.Sprintf("vdev_%s_", vdev.vdev)
@@ -55,10 +55,10 @@ func (z *ZFSPool) collectZpoolListVdev(mx map[string]int64) error {
55 }
56 }
57
58 - for name := range z.seenVdevs {
58 + for name := range c.seenVdevs {
59 if !seen[name] {
60 - z.removeVdevCharts(name)
61 - delete(z.seenVdevs, name)
60 + c.removeVdevCharts(name)
61 + delete(c.seenVdevs, name)
62 }
63 }
64
src/go/plugin/go.d/collector/zfspool/collector.go renamed
+24 -30
@@ -28,8 +28,8 @@ func init() {
28 })
29 }
30
31 -func New() *ZFSPool {
32 - return &ZFSPool{
31 +func New() *Collector {
32 + return &Collector{
33 Config: Config{
34 BinaryPath: "/usr/bin/zpool",
35 Timeout: confopt.Duration(time.Second * 2),
@@ -46,44 +46,38 @@ type Config struct {
46 BinaryPath string `yaml:"binary_path,omitempty" json:"binary_path"`
47 }
48
49 -type (
50 - ZFSPool struct {
51 - module.Base
52 - Config `yaml:",inline" json:""`
49 +type Collector struct {
50 + module.Base
51 + Config `yaml:",inline" json:""`
52
54 - charts *module.Charts
53 + charts *module.Charts
54
56 - exec zpoolCLI
55 + exec zpoolCli
56
58 - seenZpools map[string]bool
59 - seenVdevs map[string]bool
60 - }
61 - zpoolCLI interface {
62 - list() ([]byte, error)
63 - listWithVdev(pool string) ([]byte, error)
64 - }
65 -)
57 + seenZpools map[string]bool
58 + seenVdevs map[string]bool
59 +}
60
67 -func (z *ZFSPool) Configuration() any {
68 - return z.Config
61 +func (c *Collector) Configuration() any {
62 + return c.Config
63 }
64
71 -func (z *ZFSPool) Init() error {
72 - if err := z.validateConfig(); err != nil {
65 +func (c *Collector) Init() error {
66 + if err := c.validateConfig(); err != nil {
67 return fmt.Errorf("config validation: %s", err)
68 }
69
76 - zpoolExec, err := z.initZPoolCLIExec()
70 + zpoolExec, err := c.initZPoolCLIExec()
71 if err != nil {
72 return fmt.Errorf("zpool exec initialization: %v", err)
73 }
80 - z.exec = zpoolExec
74 + c.exec = zpoolExec
75
76 return nil
77 }
78
85 -func (z *ZFSPool) Check() error {
86 - mx, err := z.collect()
79 +func (c *Collector) Check() error {
80 + mx, err := c.collect()
81 if err != nil {
82 return err
83 }
@@ -95,14 +89,14 @@ func (z *ZFSPool) Check() error {
89 return nil
90 }
91
98 -func (z *ZFSPool) Charts() *module.Charts {
99 - return z.charts
92 +func (c *Collector) Charts() *module.Charts {
93 + return c.charts
94 }
95
102 -func (z *ZFSPool) Collect() map[string]int64 {
103 - mx, err := z.collect()
96 +func (c *Collector) Collect() map[string]int64 {
97 + mx, err := c.collect()
98 if err != nil {
105 - z.Error(err)
99 + c.Error(err)
100 }
101
102 if len(mx) == 0 {
@@ -112,4 +106,4 @@ func (z *ZFSPool) Collect() map[string]int64 {
106 return mx
107 }
108
115 -func (z *ZFSPool) Cleanup() {}
109 +func (c *Collector) Cleanup() {}
src/go/plugin/go.d/collector/zfspool/collector_test.go renamed
+36 -36
@@ -39,11 +39,11 @@ func Test_testDataIsValid(t *testing.T) {
39 }
40 }
41
42 -func TestZFSPool_Configuration(t *testing.T) {
43 - module.TestConfigurationSerialize(t, &ZFSPool{}, dataConfigJSON, dataConfigYAML)
42 +func TestCollector_Configuration(t *testing.T) {
43 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
44 }
45
46 -func TestZFSPool_Init(t *testing.T) {
46 +func TestCollector_Init(t *testing.T) {
47 tests := map[string]struct {
48 config Config
49 wantFail bool
@@ -64,59 +64,59 @@ func TestZFSPool_Init(t *testing.T) {
64
65 for name, test := range tests {
66 t.Run(name, func(t *testing.T) {
67 - zp := New()
68 - zp.Config = test.config
67 + collr := New()
68 + collr.Config = test.config
69
70 if test.wantFail {
71 - assert.Error(t, zp.Init())
71 + assert.Error(t, collr.Init())
72 } else {
73 - assert.NoError(t, zp.Init())
73 + assert.NoError(t, collr.Init())
74 }
75 })
76 }
77 }
78
79 -func TestZFSPool_Cleanup(t *testing.T) {
79 +func TestCollector_Cleanup(t *testing.T) {
80 tests := map[string]struct {
81 - prepare func() *ZFSPool
81 + prepare func() *Collector
82 }{
83 "not initialized exec": {
84 - prepare: func() *ZFSPool {
84 + prepare: func() *Collector {
85 return New()
86 },
87 },
88 "after check": {
89 - prepare: func() *ZFSPool {
90 - zp := New()
91 - zp.exec = prepareMockOk()
92 - _ = zp.Check()
93 - return zp
89 + prepare: func() *Collector {
90 + collr := New()
91 + collr.exec = prepareMockOk()
92 + _ = collr.Check()
93 + return collr
94 },
95 },
96 "after collect": {
97 - prepare: func() *ZFSPool {
98 - zp := New()
99 - zp.exec = prepareMockOk()
100 - _ = zp.Collect()
101 - return zp
97 + prepare: func() *Collector {
98 + collr := New()
99 + collr.exec = prepareMockOk()
100 + _ = collr.Collect()
101 + return collr
102 },
103 },
104 }
105
106 for name, test := range tests {
107 t.Run(name, func(t *testing.T) {
108 - zp := test.prepare()
108 + collr := test.prepare()
109
110 - assert.NotPanics(t, zp.Cleanup)
110 + assert.NotPanics(t, collr.Cleanup)
111 })
112 }
113 }
114
115 -func TestZFSPool_Charts(t *testing.T) {
115 +func TestCollector_Charts(t *testing.T) {
116 assert.NotNil(t, New().Charts())
117 }
118
119 -func TestZFSPool_Check(t *testing.T) {
119 +func TestCollector_Check(t *testing.T) {
120 tests := map[string]struct {
121 prepareMock func() *mockZpoolCLIExec
122 wantFail bool
@@ -141,20 +141,20 @@ func TestZFSPool_Check(t *testing.T) {
141
142 for name, test := range tests {
143 t.Run(name, func(t *testing.T) {
144 - zp := New()
144 + collr := New()
145 mock := test.prepareMock()
146 - zp.exec = mock
146 + collr.exec = mock
147
148 if test.wantFail {
149 - assert.Error(t, zp.Check())
149 + assert.Error(t, collr.Check())
150 } else {
151 - assert.NoError(t, zp.Check())
151 + assert.NoError(t, collr.Check())
152 }
153 })
154 }
155 }
156
157 -func TestZFSPool_Collect(t *testing.T) {
157 +func TestCollector_Collect(t *testing.T) {
158 tests := map[string]struct {
159 prepareMock func() *mockZpoolCLIExec
160 wantMetrics map[string]int64
@@ -377,20 +377,20 @@ func TestZFSPool_Collect(t *testing.T) {
377
378 for name, test := range tests {
379 t.Run(name, func(t *testing.T) {
380 - zp := New()
380 + collr := New()
381 mock := test.prepareMock()
382 - zp.exec = mock
382 + collr.exec = mock
383
384 - mx := zp.Collect()
384 + mx := collr.Collect()
385
386 assert.Equal(t, test.wantMetrics, mx)
387
388 if len(test.wantMetrics) > 0 {
389 - want := len(zpoolChartsTmpl)*len(zp.seenZpools) + len(vdevChartsTmpl)*len(zp.seenVdevs)
389 + want := len(zpoolChartsTmpl)*len(collr.seenZpools) + len(vdevChartsTmpl)*len(collr.seenVdevs)
390
391 - assert.Len(t, *zp.Charts(), want, "want charts")
391 + assert.Len(t, *collr.Charts(), want, "want charts")
392
393 - module.TestMetricsHasAllChartsDimsSkip(t, zp.Charts(), mx, func(chart *module.Chart, _ *module.Dim) bool {
393 + module.TestMetricsHasAllChartsDimsSkip(t, collr.Charts(), mx, func(chart *module.Chart, _ *module.Dim) bool {
394 return strings.HasPrefix(chart.ID, "zfspool_zion") && !strings.HasSuffix(chart.ID, "health_state")
395 })
396 }
@@ -398,7 +398,7 @@ func TestZFSPool_Collect(t *testing.T) {
398 }
399 }
400
401 -func TestZFSPool_parseZpoolListDevOutput(t *testing.T) {
401 +func TestCollector_parseZpoolListDevOutput(t *testing.T) {
402 tests := map[string]struct {
403 input string
404 want []vdevEntry
src/go/plugin/go.d/collector/zfspool/exec.go
+5
@@ -13,6 +13,11 @@ import (
13 "github.com/netdata/netdata/go/plugins/logger"
14 )
15
16 +type zpoolCli interface {
17 + list() ([]byte, error)
18 + listWithVdev(pool string) ([]byte, error)
19 +}
20 +
21 func newZpoolCLIExec(binPath string, timeout time.Duration) *zpoolCLIExec {
22 return &zpoolCLIExec{
23 binPath: binPath,
src/go/plugin/go.d/collector/zfspool/init.go
+6 -6
@@ -11,15 +11,15 @@ import (
11 "strings"
12 )
13
14 -func (z *ZFSPool) validateConfig() error {
15 - if z.BinaryPath == "" {
14 +func (c *Collector) validateConfig() error {
15 + if c.BinaryPath == "" {
16 return errors.New("no zpool binary path specified")
17 }
18 return nil
19 }
20
21 -func (z *ZFSPool) initZPoolCLIExec() (zpoolCLI, error) {
22 - binPath := z.BinaryPath
21 +func (c *Collector) initZPoolCLIExec() (zpoolCli, error) {
22 + binPath := c.BinaryPath
23
24 if !strings.HasPrefix(binPath, "/") {
25 path, err := exec.LookPath(binPath)
@@ -33,8 +33,8 @@ func (z *ZFSPool) initZPoolCLIExec() (zpoolCLI, error) {
33 return nil, err
34 }
35
36 - zpoolExec := newZpoolCLIExec(binPath, z.Timeout.Duration())
37 - zpoolExec.Logger = z.Logger
36 + zpoolExec := newZpoolCLIExec(binPath, c.Timeout.Duration())
37 + zpoolExec.Logger = c.Logger
38
39 return zpoolExec, nil
40 }
src/go/plugin/go.d/collector/zookeeper/collect.go
+4 -4
@@ -8,14 +8,14 @@ import (
8 "strings"
9 )
10
11 -func (z *Zookeeper) collect() (map[string]int64, error) {
12 - return z.collectMntr()
11 +func (c *Collector) collect() (map[string]int64, error) {
12 + return c.collectMntr()
13 }
14
15 -func (z *Zookeeper) collectMntr() (map[string]int64, error) {
15 +func (c *Collector) collectMntr() (map[string]int64, error) {
16 const command = "mntr"
17
18 - lines, err := z.fetch("mntr")
18 + lines, err := c.fetch("mntr")
19 if err != nil {
20 return nil, err
21 }
src/go/plugin/go.d/collector/zookeeper/collector.go renamed
+20 -25
@@ -24,8 +24,8 @@ func init() {
24 })
25 }
26
27 -func New() *Zookeeper {
28 - return &Zookeeper{
27 +func New() *Collector {
28 + return &Collector{
29 Config: Config{
30 Address: "127.0.0.1:2181",
31 Timeout: confopt.Duration(time.Second),
@@ -41,38 +41,33 @@ type Config struct {
41 UseTLS bool `yaml:"use_tls,omitempty" json:"use_tls"`
42 }
43
44 -type (
45 - Zookeeper struct {
46 - module.Base
47 - Config `yaml:",inline" json:""`
44 +type Collector struct {
45 + module.Base
46 + Config `yaml:",inline" json:""`
47
49 - fetcher
50 - }
51 - fetcher interface {
52 - fetch(command string) ([]string, error)
53 - }
54 -)
48 + fetcher
49 +}
50
56 -func (z *Zookeeper) Configuration() any {
57 - return z.Config
51 +func (c *Collector) Configuration() any {
52 + return c.Config
53 }
54
60 -func (z *Zookeeper) Init() error {
61 - if err := z.verifyConfig(); err != nil {
55 +func (c *Collector) Init() error {
56 + if err := c.verifyConfig(); err != nil {
57 return fmt.Errorf("invalid config: %v", err)
58 }
59
65 - f, err := z.initZookeeperFetcher()
60 + f, err := c.initZookeeperFetcher()
61 if err != nil {
62 return fmt.Errorf("init zookeeper fetcher: %v", err)
63 }
69 - z.fetcher = f
64 + c.fetcher = f
65
66 return nil
67 }
68
74 -func (z *Zookeeper) Check() error {
75 - mx, err := z.collect()
69 +func (c *Collector) Check() error {
70 + mx, err := c.collect()
71 if err != nil {
72 return err
73 }
@@ -82,14 +77,14 @@ func (z *Zookeeper) Check() error {
77 return nil
78 }
79
85 -func (z *Zookeeper) Charts() *Charts {
80 +func (c *Collector) Charts() *Charts {
81 return charts.Copy()
82 }
83
89 -func (z *Zookeeper) Collect() map[string]int64 {
90 - mx, err := z.collect()
84 +func (c *Collector) Collect() map[string]int64 {
85 + mx, err := c.collect()
86 if err != nil {
92 - z.Error(err)
87 + c.Error(err)
88 }
89
90 if len(mx) == 0 {
@@ -98,4 +93,4 @@ func (z *Zookeeper) Collect() map[string]int64 {
93 return mx
94 }
95
101 -func (z *Zookeeper) Cleanup() {}
96 +func (c *Collector) Cleanup() {}
src/go/plugin/go.d/collector/zookeeper/collector_test.go renamed
+49 -49
@@ -34,53 +34,53 @@ func Test_testDataIsValid(t *testing.T) {
34 }
35 }
36
37 -func TestZookeeper_ConfigurationSerialize(t *testing.T) {
38 - module.TestConfigurationSerialize(t, &Zookeeper{}, dataConfigJSON, dataConfigYAML)
37 +func TestCollector_ConfigurationSerialize(t *testing.T) {
38 + module.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
39 }
40
41 -func TestZookeeper_Init(t *testing.T) {
42 - job := New()
41 +func TestCollector_Init(t *testing.T) {
42 + collr := New()
43
44 - assert.NoError(t, job.Init())
45 - assert.NotNil(t, job.fetcher)
44 + assert.NoError(t, collr.Init())
45 + assert.NotNil(t, collr.fetcher)
46 }
47
48 -func TestZookeeper_InitErrorOnCreatingTLSConfig(t *testing.T) {
49 - job := New()
50 - job.UseTLS = true
51 - job.TLSConfig.TLSCA = "testdata/tls"
48 +func TestCollector_InitErrorOnCreatingTLSConfig(t *testing.T) {
49 + collr := New()
50 + collr.UseTLS = true
51 + collr.TLSConfig.TLSCA = "testdata/tls"
52
53 - assert.Error(t, job.Init())
53 + assert.Error(t, collr.Init())
54 }
55
56 -func TestZookeeper_Check(t *testing.T) {
57 - job := New()
58 - require.NoError(t, job.Init())
59 - job.fetcher = &mockZookeeperFetcher{data: dataMntrMetrics}
56 +func TestCollector_Check(t *testing.T) {
57 + collr := New()
58 + require.NoError(t, collr.Init())
59 + collr.fetcher = &mockZookeeperFetcher{data: dataMntrMetrics}
60
61 - assert.NoError(t, job.Check())
61 + assert.NoError(t, collr.Check())
62 }
63
64 -func TestZookeeper_CheckErrorOnFetch(t *testing.T) {
65 - job := New()
66 - require.NoError(t, job.Init())
67 - job.fetcher = &mockZookeeperFetcher{err: true}
64 +func TestCollector_CheckErrorOnFetch(t *testing.T) {
65 + collr := New()
66 + require.NoError(t, collr.Init())
67 + collr.fetcher = &mockZookeeperFetcher{err: true}
68
69 - assert.Error(t, job.Check())
69 + assert.Error(t, collr.Check())
70 }
71
72 -func TestZookeeper_Charts(t *testing.T) {
72 +func TestCollector_Charts(t *testing.T) {
73 assert.NotNil(t, New().Charts())
74 }
75
76 -func TestZookeeper_Cleanup(t *testing.T) {
76 +func TestCollector_Cleanup(t *testing.T) {
77 New().Cleanup()
78 }
79
80 -func TestZookeeper_Collect(t *testing.T) {
81 - job := New()
82 - require.NoError(t, job.Init())
83 - job.fetcher = &mockZookeeperFetcher{data: dataMntrMetrics}
80 +func TestCollector_Collect(t *testing.T) {
81 + collr := New()
82 + require.NoError(t, collr.Init())
83 + collr.fetcher = &mockZookeeperFetcher{data: dataMntrMetrics}
84
85 expected := map[string]int64{
86 "approximate_data_size": 44,
@@ -99,42 +99,42 @@ func TestZookeeper_Collect(t *testing.T) {
99 "znode_count": 5,
100 }
101
102 - mx := job.Collect()
102 + mx := collr.Collect()
103
104 assert.Equal(t, expected, mx)
105 - module.TestMetricsHasAllChartsDims(t, job.Charts(), mx)
105 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
106 }
107
108 -func TestZookeeper_CollectMntrNotInWhiteList(t *testing.T) {
109 - job := New()
110 - require.NoError(t, job.Init())
111 - job.fetcher = &mockZookeeperFetcher{data: dataMntrNotInWhiteListResponse}
108 +func TestCollector_CollectMntrNotInWhiteList(t *testing.T) {
109 + collr := New()
110 + require.NoError(t, collr.Init())
111 + collr.fetcher = &mockZookeeperFetcher{data: dataMntrNotInWhiteListResponse}
112
113 - assert.Nil(t, job.Collect())
113 + assert.Nil(t, collr.Collect())
114 }
115
116 -func TestZookeeper_CollectMntrEmptyResponse(t *testing.T) {
117 - job := New()
118 - require.NoError(t, job.Init())
119 - job.fetcher = &mockZookeeperFetcher{}
116 +func TestCollector_CollectMntrEmptyResponse(t *testing.T) {
117 + collr := New()
118 + require.NoError(t, collr.Init())
119 + collr.fetcher = &mockZookeeperFetcher{}
120
121 - assert.Nil(t, job.Collect())
121 + assert.Nil(t, collr.Collect())
122 }
123
124 -func TestZookeeper_CollectMntrInvalidData(t *testing.T) {
125 - job := New()
126 - require.NoError(t, job.Init())
127 - job.fetcher = &mockZookeeperFetcher{data: []byte("hello \nand good buy\n")}
124 +func TestCollector_CollectMntrInvalidData(t *testing.T) {
125 + collr := New()
126 + require.NoError(t, collr.Init())
127 + collr.fetcher = &mockZookeeperFetcher{data: []byte("hello \nand good buy\n")}
128
129 - assert.Nil(t, job.Collect())
129 + assert.Nil(t, collr.Collect())
130 }
131
132 -func TestZookeeper_CollectMntrReceiveError(t *testing.T) {
133 - job := New()
134 - require.NoError(t, job.Init())
135 - job.fetcher = &mockZookeeperFetcher{err: true}
132 +func TestCollector_CollectMntrReceiveError(t *testing.T) {
133 + collr := New()
134 + require.NoError(t, collr.Init())
135 + collr.fetcher = &mockZookeeperFetcher{err: true}
136
137 - assert.Nil(t, job.Collect())
137 + assert.Nil(t, collr.Collect())
138 }
139
140 type mockZookeeperFetcher struct {
src/go/plugin/go.d/collector/zookeeper/fetcher.go
+4
@@ -12,6 +12,10 @@ import (
12
13 const limitReadLines = 2000
14
15 +type fetcher interface {
16 + fetch(command string) ([]string, error)
17 +}
18 +
19 type zookeeperFetcher struct {
20 socket.Client
21 }
src/go/plugin/go.d/collector/zookeeper/init.go
+7 -7
@@ -11,27 +11,27 @@ import (
11 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/tlscfg"
12 )
13
14 -func (z *Zookeeper) verifyConfig() error {
15 - if z.Address == "" {
14 +func (c *Collector) verifyConfig() error {
15 + if c.Address == "" {
16 return errors.New("address not set")
17 }
18 return nil
19 }
20
21 -func (z *Zookeeper) initZookeeperFetcher() (fetcher, error) {
21 +func (c *Collector) initZookeeperFetcher() (fetcher, error) {
22 var tlsConf *tls.Config
23 var err error
24
25 - if z.UseTLS {
26 - tlsConf, err = tlscfg.NewTLSConfig(z.TLSConfig)
25 + if c.UseTLS {
26 + tlsConf, err = tlscfg.NewTLSConfig(c.TLSConfig)
27 if err != nil {
28 return nil, fmt.Errorf("creating tls config : %v", err)
29 }
30 }
31
32 sock := socket.New(socket.Config{
33 - Address: z.Address,
34 - Timeout: z.Timeout.Duration(),
33 + Address: c.Address,
34 + Timeout: c.Timeout.Duration(),
35 TLSConf: tlsConf,
36 })
37