@cryptotaxi247 / netdata-1 / commits / a89facce8

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