Skip to content

Commit b03aaba

Browse files
authored
chore: backend config calls metric (#4306)
* chore: backend config calls metric * chore: moving logger on top * chore: calling setup before fetch * chore: bad response test * chore: removing setenv
1 parent 6c2d900 commit b03aaba

File tree

6 files changed

+76
-30
lines changed

6 files changed

+76
-30
lines changed

backend-config/backend_config_test.go

+4
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222

2323
"github.com/rudderlabs/rudder-go-kit/config"
2424
"github.com/rudderlabs/rudder-go-kit/logger"
25+
"github.com/rudderlabs/rudder-go-kit/stats"
2526
adminpkg "github.com/rudderlabs/rudder-server/admin"
2627
"github.com/rudderlabs/rudder-server/backend-config/internal/cache"
2728
"github.com/rudderlabs/rudder-server/services/diagnostics"
@@ -116,9 +117,12 @@ func TestBadResponse(t *testing.T) {
116117
namespace: "some-namespace",
117118
client: http.DefaultClient,
118119
logger: logger.NOP,
120+
httpCallsStat: stats.NOP.NewStat("backend_config_http_calls", stats.CountType),
119121
},
120122
"single-workspace": &singleWorkspaceConfig{
121123
configBackendURL: parsedURL,
124+
logger: logger.NOP,
125+
httpCallsStat: stats.NOP.NewStat("backend_config_http_calls", stats.CountType),
122126
},
123127
}
124128
disableCache()

backend-config/namespace_config.go

+21-12
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ import (
1515
"github.com/rudderlabs/rudder-go-kit/config"
1616
kithttputil "github.com/rudderlabs/rudder-go-kit/httputil"
1717
"github.com/rudderlabs/rudder-go-kit/logger"
18+
"github.com/rudderlabs/rudder-go-kit/stats"
19+
obskit "github.com/rudderlabs/rudder-observability-kit/go/labels"
1820
"github.com/rudderlabs/rudder-server/services/controlplane/identity"
1921
"github.com/rudderlabs/rudder-server/utils/types"
2022
)
@@ -41,6 +43,8 @@ type namespaceConfig struct {
4143
incrementalConfigUpdates bool
4244
lastUpdatedAt time.Time
4345
workspacesConfig map[string]ConfigT
46+
47+
httpCallsStat stats.Counter
4448
}
4549

4650
func (nc *namespaceConfig) SetUp() (err error) {
@@ -71,25 +75,27 @@ func (nc *namespaceConfig) SetUp() (err error) {
7175
Timeout: nc.config.GetDuration("HttpClient.backendConfig.timeout", 30, time.Second),
7276
}
7377
}
78+
nc.workspacesConfig = make(map[string]ConfigT)
79+
nc.httpCallsStat = stats.Default.NewStat("backend_config_http_calls", stats.CountType)
80+
7481
if nc.logger == nil {
75-
nc.logger = logger.NewLogger().Child("backend-config")
82+
nc.logger = logger.NewLogger().Child("backend-config").Withn(obskit.Namespace(nc.namespace))
7683
}
77-
nc.workspacesConfig = make(map[string]ConfigT)
78-
nc.logger.Infof("Setup config for namespace %s complete", nc.namespace)
84+
nc.logger.Infon("Setup backend config complete")
7985

8086
return nil
8187
}
8288

8389
// Get returns sources from the workspace
8490
func (nc *namespaceConfig) Get(ctx context.Context) (map[string]ConfigT, error) {
85-
config, err := nc.getFromAPI(ctx)
91+
conf, err := nc.getFromAPI(ctx)
8692
if errors.Is(err, ErrIncrementalUpdateFailed) {
8793
// reset state here
8894
// this triggers a full update
8995
nc.lastUpdatedAt = time.Time{}
9096
return nc.getFromAPI(ctx)
9197
}
92-
return config, err
98+
return conf, err
9399
}
94100

95101
// getFromApi gets the workspace config from api
@@ -115,18 +121,21 @@ func (nc *namespaceConfig) getFromAPI(ctx context.Context) (map[string]ConfigT,
115121
}
116122

117123
operation := func() (fetchError error) {
118-
nc.logger.Debugf("Fetching config from %s", urlString)
124+
defer nc.httpCallsStat.Increment()
125+
nc.logger.Debugn("Fetching backend config", logger.NewStringField("url", urlString))
119126
respBody, fetchError = nc.makeHTTPRequest(req)
120127
return fetchError
121128
}
122129

123130
backoffWithMaxRetry := backoff.WithContext(backoff.WithMaxRetries(backoff.NewExponentialBackOff(), 3), ctx)
124131
err = backoff.RetryNotify(operation, backoffWithMaxRetry, func(err error, t time.Duration) {
125-
nc.logger.Warnf("Failed to fetch config from API with error: %v, retrying after %v", err, t)
132+
nc.logger.Warnn("Failed to fetch backend config from API",
133+
obskit.Error(err), logger.NewDurationField("retryAfter", t),
134+
)
126135
})
127136
if err != nil {
128137
if ctx.Err() == nil {
129-
nc.logger.Errorf("Error sending request to the server: %v", err)
138+
nc.logger.Errorn("Error sending request to the server", obskit.Error(err))
130139
}
131140
return configOnError, err
132141
}
@@ -138,7 +147,7 @@ func (nc *namespaceConfig) getFromAPI(ctx context.Context) (map[string]ConfigT,
138147
var requestData map[string]*ConfigT
139148
err = jsonfast.Unmarshal(respBody, &requestData)
140149
if err != nil {
141-
nc.logger.Errorf("Error while parsing request: %v", err)
150+
nc.logger.Errorn("Error while parsing request", obskit.Error(err))
142151
return configOnError, err
143152
}
144153

@@ -147,10 +156,10 @@ func (nc *namespaceConfig) getFromAPI(ctx context.Context) (map[string]ConfigT,
147156
if workspace == nil { // this workspace was not updated, populate it with the previous config
148157
previousConfig, ok := nc.workspacesConfig[workspaceID]
149158
if !ok {
150-
nc.logger.Errorw(
159+
nc.logger.Errorn(
151160
"workspace was not updated but was not present in previous config",
152-
"workspaceID", workspaceID,
153-
"req", req,
161+
obskit.WorkspaceID(workspaceID),
162+
logger.NewField("req", req),
154163
)
155164
return configOnError, ErrIncrementalUpdateFailed
156165
}

backend-config/single_workspace.go

+42-18
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ import (
1414

1515
"github.com/rudderlabs/rudder-go-kit/config"
1616
kithttputil "github.com/rudderlabs/rudder-go-kit/httputil"
17+
"github.com/rudderlabs/rudder-go-kit/logger"
18+
"github.com/rudderlabs/rudder-go-kit/stats"
19+
obskit "github.com/rudderlabs/rudder-observability-kit/go/labels"
1720
"github.com/rudderlabs/rudder-server/services/controlplane/identity"
1821
"github.com/rudderlabs/rudder-server/utils/types"
1922
)
@@ -27,9 +30,18 @@ type singleWorkspaceConfig struct {
2730

2831
workspaceIDOnce sync.Once
2932
workspaceID string
33+
34+
logger logger.Logger
35+
httpCallsStat stats.Counter
3036
}
3137

3238
func (wc *singleWorkspaceConfig) SetUp() error {
39+
wc.httpCallsStat = stats.Default.NewStat("backend_config_http_calls", stats.CountType)
40+
41+
if wc.logger == nil {
42+
wc.logger = logger.NewLogger().Child("backend-config").Withn(obskit.WorkspaceID(wc.workspaceID))
43+
}
44+
3345
if configFromFile {
3446
if wc.configJSONPath == "" {
3547
return fmt.Errorf("valid configJSONPath is required when configFromFile is set to true")
@@ -42,6 +54,9 @@ func (wc *singleWorkspaceConfig) SetUp() error {
4254
if wc.token == "" {
4355
return fmt.Errorf("single workspace: empty workspace config token")
4456
}
57+
58+
wc.logger.Infon("Setup backend config complete")
59+
4560
return nil
4661
}
4762

@@ -60,9 +75,9 @@ func (wc *singleWorkspaceConfig) Get(ctx context.Context) (map[string]ConfigT, e
6075

6176
// getFromApi gets the workspace config from api
6277
func (wc *singleWorkspaceConfig) getFromAPI(ctx context.Context) (map[string]ConfigT, error) {
63-
config := make(map[string]ConfigT)
78+
conf := make(map[string]ConfigT)
6479
if wc.configBackendURL == nil {
65-
return config, fmt.Errorf("single workspace: config backend url is nil")
80+
return conf, fmt.Errorf("single workspace: config backend url is nil")
6681
}
6782

6883
var (
@@ -78,13 +93,15 @@ func (wc *singleWorkspaceConfig) getFromAPI(ctx context.Context) (map[string]Con
7893

7994
backoffWithMaxRetry := backoff.WithContext(backoff.WithMaxRetries(backoff.NewExponentialBackOff(), 3), ctx)
8095
err := backoff.RetryNotify(operation, backoffWithMaxRetry, func(err error, t time.Duration) {
81-
pkgLogger.Warnf("Failed to fetch config from API with error: %v, retrying after %v", err, t)
96+
wc.logger.Warnn("Failed to fetch backend config from API",
97+
obskit.Error(err), logger.NewDurationField("retryAfter", t),
98+
)
8299
})
83100
if err != nil {
84101
if ctx.Err() == nil {
85-
pkgLogger.Errorf("Error sending request to the server: %v", err)
102+
wc.logger.Errorn("Error sending request to the server", obskit.Error(err))
86103
}
87-
return config, err
104+
return conf, err
88105
}
89106

90107
configEnvHandler := wc.configEnvHandler
@@ -95,41 +112,46 @@ func (wc *singleWorkspaceConfig) getFromAPI(ctx context.Context) (map[string]Con
95112
var sourcesJSON ConfigT
96113
err = json.Unmarshal(respBody, &sourcesJSON)
97114
if err != nil {
98-
pkgLogger.Errorf("Error while parsing request: %v", err)
99-
return config, err
115+
wc.logger.Errorn("Error while parsing request", obskit.Error(err))
116+
return conf, err
100117
}
101118
sourcesJSON.ApplyReplaySources()
102119
workspaceID := sourcesJSON.WorkspaceID
103120

104121
wc.workspaceIDOnce.Do(func() {
105122
wc.workspaceID = workspaceID
106123
})
107-
config[workspaceID] = sourcesJSON
124+
conf[workspaceID] = sourcesJSON
108125

109-
return config, nil
126+
return conf, nil
110127
}
111128

112129
// getFromFile reads the workspace config from JSON file
113130
func (wc *singleWorkspaceConfig) getFromFile() (map[string]ConfigT, error) {
114-
pkgLogger.Debug("Reading workspace config from JSON file")
115-
config := make(map[string]ConfigT)
131+
wc.logger.Debugn("Reading workspace config from JSON file")
132+
133+
conf := make(map[string]ConfigT)
116134
data, err := IoUtil.ReadFile(wc.configJSONPath)
117135
if err != nil {
118-
pkgLogger.Errorf("Unable to read backend config from file: %s with error : %s", wc.configJSONPath, err.Error())
119-
return config, err
136+
wc.logger.Errorn("Unable to read backend config from file",
137+
logger.NewStringField("path", wc.configJSONPath), obskit.Error(err),
138+
)
139+
return conf, err
120140
}
121141
var configJSON ConfigT
122142
if err = json.Unmarshal(data, &configJSON); err != nil {
123-
pkgLogger.Errorf("Unable to parse backend config from file: %s", wc.configJSONPath)
124-
return config, err
143+
wc.logger.Errorn("Unable to parse backend config from file",
144+
logger.NewStringField("path", wc.configJSONPath), obskit.Error(err),
145+
)
146+
return conf, err
125147
}
126148
workspaceID := configJSON.WorkspaceID
127149
wc.workspaceIDOnce.Do(func() {
128-
pkgLogger.Info("Read workspace config from JSON file")
150+
wc.logger.Infon("Read workspace config from JSON file")
129151
wc.workspaceID = workspaceID
130152
})
131-
config[workspaceID] = configJSON
132-
return config, nil
153+
conf[workspaceID] = configJSON
154+
return conf, nil
133155
}
134156

135157
func (wc *singleWorkspaceConfig) makeHTTPRequest(ctx context.Context, url string) ([]byte, error) {
@@ -146,6 +168,8 @@ func (wc *singleWorkspaceConfig) makeHTTPRequest(ctx context.Context, url string
146168
req.URL.RawQuery = q.Encode()
147169
}
148170

171+
defer wc.httpCallsStat.Increment()
172+
149173
client := &http.Client{Timeout: config.GetDuration("HttpClient.backendConfig.timeout", 30, time.Second)}
150174
resp, err := client.Do(req)
151175
if err != nil {

backend-config/single_workspace_test.go

+6
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ func TestSingleWorkspaceGetFromAPI(t *testing.T) {
4141
token: token,
4242
configBackendURL: parsedSrvURL,
4343
}
44+
require.NoError(t, wc.SetUp())
4445
conf, err := wc.getFromAPI(context.Background())
4546
require.NoError(t, err)
4647
require.Equal(t, map[string]ConfigT{sampleWorkspaceID: sampleBackendConfig}, conf)
@@ -60,6 +61,7 @@ func TestSingleWorkspaceGetFromAPI(t *testing.T) {
6061
token: "testToken",
6162
configBackendURL: configBackendURL,
6263
}
64+
require.NoError(t, wc.SetUp())
6365
conf, err := wc.getFromAPI(context.Background())
6466
require.ErrorContains(t, err, "unsupported protocol scheme")
6567
require.Equal(t, map[string]ConfigT{}, conf)
@@ -70,6 +72,7 @@ func TestSingleWorkspaceGetFromAPI(t *testing.T) {
7072
token: "testToken",
7173
configBackendURL: nil,
7274
}
75+
require.NoError(t, wc.SetUp())
7376
conf, err := wc.getFromAPI(context.Background())
7477
require.ErrorContains(t, err, "config backend url is nil")
7578
require.Equal(t, map[string]ConfigT{}, conf)
@@ -84,6 +87,7 @@ func TestSingleWorkspaceGetFromFile(t *testing.T) {
8487
token: "testToken",
8588
configJSONPath: "invalid-path",
8689
}
90+
require.NoError(t, wc.SetUp())
8791
conf, err := wc.getFromFile()
8892
require.Error(t, err)
8993
require.Equal(t, map[string]ConfigT{}, conf)
@@ -99,6 +103,7 @@ func TestSingleWorkspaceGetFromFile(t *testing.T) {
99103
token: "testToken",
100104
configJSONPath: tmpFile.Name(),
101105
}
106+
require.NoError(t, wc.SetUp())
102107
conf, err := wc.getFromFile()
103108
require.Error(t, err)
104109
require.Equal(t, map[string]ConfigT{}, conf)
@@ -144,6 +149,7 @@ func TestSingleWorkspaceGetFromFile(t *testing.T) {
144149
token: "testToken",
145150
configJSONPath: tmpFile.Name(),
146151
}
152+
require.NoError(t, wc.SetUp())
147153
conf, err := wc.getFromFile()
148154
require.NoError(t, err)
149155
require.Equal(t, map[string]ConfigT{sampleWorkspaceID: sampleBackendConfig}, conf)

go.mod

+1
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ require (
8181
github.com/rudderlabs/analytics-go v3.3.3+incompatible
8282
github.com/rudderlabs/compose-test v0.1.3
8383
github.com/rudderlabs/rudder-go-kit v0.19.0
84+
github.com/rudderlabs/rudder-observability-kit v0.0.3
8485
github.com/rudderlabs/sql-tunnels v0.1.6
8586
github.com/samber/lo v1.38.1
8687
github.com/segmentio/kafka-go v0.4.44

go.sum

+2
Original file line numberDiff line numberDiff line change
@@ -962,6 +962,8 @@ github.com/rudderlabs/parquet-go v0.0.2 h1:ZXRdZdimB0PdJtmxeSSxfI0fDQ3kZjwzBxRi6
962962
github.com/rudderlabs/parquet-go v0.0.2/go.mod h1:g6guum7o8uhj/uNhunnt7bw5Vabu/goI5i21/3fnxWQ=
963963
github.com/rudderlabs/rudder-go-kit v0.19.0 h1:Q4LzoS/mGHjb4Q8Yws5UAvs92hBfPwgTLw8aVOEsrLY=
964964
github.com/rudderlabs/rudder-go-kit v0.19.0/go.mod h1:UawoeYHo1KnKan4hmSbj/HW3w/U51mXSyknuTaDrhmE=
965+
github.com/rudderlabs/rudder-observability-kit v0.0.3 h1:vZtuZRkGX+6rjaeKtxxFE2YYP6QlmAcVcgecTOjvz+Q=
966+
github.com/rudderlabs/rudder-observability-kit v0.0.3/go.mod h1:6UjAh3H6rkE0fFLh7z8ZGQEQbKtUkRfhWOf/OUhfqW8=
965967
github.com/rudderlabs/sql-tunnels v0.1.6 h1:v2KA2cq8ZV5LXRJQpqigq1Q4V64oDL+XlfckW/0K2/4=
966968
github.com/rudderlabs/sql-tunnels v0.1.6/go.mod h1:Jew/XwojzFTK4KTDj/wvChI7iZCgAKYyKjFK1nnHlNM=
967969
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=

0 commit comments

Comments
 (0)