go.d/uwsgi: don't write just connect and read (#18618)
Ilya Mashchenko committed
Sep 25, 2024 at 16:48 UTC
a89facce8142fed8221b0e52fdccdc3a2fb488ac
5 files changed
+34
-77
src/go/plugin/go.d/modules/uwsgi/client.go
+15
-18
@@ -5,35 +5,25 @@ package uwsgi
5
import (
6
"bytes"
7
"fmt"
8
+ "time"
9
10
"github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/socket"
11
)
12
13
type uwsgiConn interface {
13
- connect() error
14
- disconnect()
14
queryStats() ([]byte, error)
15
}
16
17
func newUwsgiConn(conf Config) uwsgiConn {
19
- return &uwsgiClient{conn: socket.New(socket.Config{
20
- Address: conf.Address,
21
- ConnectTimeout: conf.Timeout.Duration(),
22
- ReadTimeout: conf.Timeout.Duration(),
23
- WriteTimeout: conf.Timeout.Duration(),
24
- })}
18
+ return &uwsgiClient{
19
+ address: conf.Address,
20
+ timeout: conf.Timeout.Duration(),
21
+ }
22
}
23
24
type uwsgiClient struct {
28
- conn socket.Client
29
-}
30
-
31
-func (c *uwsgiClient) connect() error {
32
- return c.conn.Connect()
33
-}
34
-
35
-func (c *uwsgiClient) disconnect() {
36
- _ = c.conn.Disconnect()
25
+ address string
26
+ timeout time.Duration
27
}
28
29
func (c *uwsgiClient) queryStats() ([]byte, error) {
@@ -42,7 +32,14 @@ func (c *uwsgiClient) queryStats() ([]byte, error) {
32
var err error
33
const readLineLimit = 1000 * 10
34
45
- clientErr := c.conn.Command("", func(bs []byte) bool {
35
+ cfg := socket.Config{
36
+ Address: c.address,
37
+ ConnectTimeout: c.timeout,
38
+ ReadTimeout: c.timeout,
39
+ WriteTimeout: c.timeout,
40
+ }
41
+
42
+ clientErr := socket.ConnectAndRead(cfg, func(bs []byte) bool {
43
b.Write(bs)
44
b.WriteByte('\n')
45
src/go/plugin/go.d/modules/uwsgi/collect.go
+1
-18
@@ -27,14 +27,7 @@ type workerStats struct {
27
}
28
29
func (u *Uwsgi) collect() (map[string]int64, error) {
30
- conn, err := u.establishConn()
31
- if err != nil {
32
- return nil, fmt.Errorf("failed to connect: %v", err)
33
- }
34
-
35
- defer conn.disconnect()
36
-
37
- stats, err := conn.queryStats()
30
+ stats, err := u.conn.queryStats()
31
if err != nil {
32
return nil, fmt.Errorf("failed to query stats: %v", err)
33
}
@@ -110,16 +103,6 @@ func (u *Uwsgi) collectStats(mx map[string]int64, stats []byte) error {
103
return nil
104
}
105
113
-func (u *Uwsgi) establishConn() (uwsgiConn, error) {
114
- conn := u.newConn(u.Config)
115
-
116
- if err := conn.connect(); err != nil {
117
- return nil, err
118
- }
119
-
120
- return conn, nil
121
-}
122
-
106
func boolToInt(b bool) int64 {
107
if b {
108
return 1
src/go/plugin/go.d/modules/uwsgi/uwsgi.go
+3
-2
@@ -28,7 +28,6 @@ func New() *Uwsgi {
28
Address: "127.0.0.1:1717",
29
Timeout: confopt.Duration(time.Second * 1),
30
},
31
- newConn: newUwsgiConn,
31
charts: charts.Copy(),
32
seenWorkers: make(map[int]bool),
33
}
@@ -46,7 +45,7 @@ type Uwsgi struct {
45
46
charts *module.Charts
47
49
- newConn func(Config) uwsgiConn
48
+ conn uwsgiConn
49
50
seenWorkers map[int]bool
51
}
@@ -61,6 +60,8 @@ func (u *Uwsgi) Init() error {
60
return errors.New("address not set")
61
}
62
63
+ u.conn = newUwsgiConn(u.Config)
64
+
65
return nil
66
}
67
src/go/plugin/go.d/modules/uwsgi/uwsgi_test.go
+6
-39
@@ -81,7 +81,7 @@ func TestUwsgi_Cleanup(t *testing.T) {
81
"after check": {
82
prepare: func() *Uwsgi {
83
uw := New()
84
- uw.newConn = func(config Config) uwsgiConn { return prepareMockOk() }
84
+ uw.conn = prepareMockOk()
85
_ = uw.Check()
86
return uw
87
},
@@ -89,7 +89,7 @@ func TestUwsgi_Cleanup(t *testing.T) {
89
"after collect": {
90
prepare: func() *Uwsgi {
91
uw := New()
92
- uw.newConn = func(config Config) uwsgiConn { return prepareMockOk() }
92
+ uw.conn = prepareMockOk()
93
_ = uw.Collect()
94
return uw
95
},
@@ -122,10 +122,6 @@ func TestUwsgi_Check(t *testing.T) {
122
wantFail: false,
123
prepareMock: prepareMockOkNoWorkers,
124
},
125
- "err on connect": {
126
- wantFail: true,
127
- prepareMock: prepareMockErrOnConnect,
128
- },
125
"unexpected response": {
126
wantFail: true,
127
prepareMock: prepareMockUnexpectedResponse,
@@ -140,7 +136,7 @@ func TestUwsgi_Check(t *testing.T) {
136
t.Run(name, func(t *testing.T) {
137
uw := New()
138
mock := test.prepareMock()
143
- uw.newConn = func(config Config) uwsgiConn { return mock }
139
+ uw.conn = mock
140
141
if test.wantFail {
142
assert.Error(t, uw.Check())
@@ -229,12 +225,6 @@ func TestUwsgi_Collect(t *testing.T) {
225
disconnectBeforeCleanup: true,
226
disconnectAfterCleanup: true,
227
},
232
- "err on connect": {
233
- prepareMock: prepareMockErrOnConnect,
234
- wantCharts: len(charts),
235
- disconnectBeforeCleanup: false,
236
- disconnectAfterCleanup: false,
237
- },
228
"err on query stats": {
229
prepareMock: prepareMockErrOnQueryStats,
230
wantCharts: len(charts),
@@ -247,7 +237,7 @@ func TestUwsgi_Collect(t *testing.T) {
237
t.Run(name, func(t *testing.T) {
238
uw := New()
239
mock := test.prepareMock()
250
- uw.newConn = func(config Config) uwsgiConn { return mock }
240
+ uw.conn = mock
241
242
mx := uw.Collect()
243
@@ -257,10 +247,6 @@ func TestUwsgi_Collect(t *testing.T) {
247
module.TestMetricsHasAllChartsDims(t, uw.Charts(), mx)
248
}
249
assert.Equal(t, test.wantCharts, len(*uw.Charts()), "want charts")
260
-
261
- assert.Equal(t, test.disconnectBeforeCleanup, mock.disconnectCalled, "disconnect before cleanup")
262
- uw.Cleanup()
263
- assert.Equal(t, test.disconnectAfterCleanup, mock.disconnectCalled, "disconnect after cleanup")
250
})
251
}
252
}
@@ -277,12 +263,6 @@ func prepareMockOkNoWorkers() *mockUwsgiConn {
263
}
264
}
265
280
-func prepareMockErrOnConnect() *mockUwsgiConn {
281
- return &mockUwsgiConn{
282
- errOnConnect: true,
283
- }
284
-}
285
-
266
func prepareMockErrOnQueryStats() *mockUwsgiConn {
267
return &mockUwsgiConn{
268
errOnQueryStats: true,
@@ -300,21 +280,8 @@ func prepareMockEmptyResponse() *mockUwsgiConn {
280
}
281
282
type mockUwsgiConn struct {
303
- errOnConnect bool
304
- errOnQueryStats bool
305
- statsResponse []byte
306
- disconnectCalled bool
307
-}
308
-
309
-func (m *mockUwsgiConn) connect() error {
310
- if m.errOnConnect {
311
- return errors.New("mock.connect() error")
312
- }
313
- return nil
314
-}
315
-
316
-func (m *mockUwsgiConn) disconnect() {
317
- m.disconnectCalled = true
283
+ errOnQueryStats bool
284
+ statsResponse []byte
285
}
286
287
func (m *mockUwsgiConn) queryStats() ([]byte, error) {
src/go/plugin/go.d/pkg/socket/client.go
+9
@@ -21,6 +21,15 @@ func New(config Config) *Socket {
21
}
22
}
23
24
+func ConnectAndRead(config Config, process Processor) error {
25
+ s := New(config)
26
+ if err := s.Connect(); err != nil {
27
+ return err
28
+ }
29
+ defer func() { _ = s.Disconnect() }()
30
+ return read(s.conn, process, s.ReadTimeout)
31
+}
32
+
33
// Socket is the implementation of a socket client.
34
type Socket struct {
35
Config