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