Skip to content

Commit db3cd8d

Browse files
Fix backoff to drop Metrics Reports from buffer after max_elapsed_time has been reached (nginx#752)
* separate backoff settings for metrics
1 parent e441f47 commit db3cd8d

File tree

15 files changed

+160
-3
lines changed

15 files changed

+160
-3
lines changed

site/content/configuration/configuration-overview.md

+12
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,12 @@ server:
5151
# host of the control plane
5252
host: <FQDN>
5353
grpcPort: 443
54+
backoff: # note: default values are prepopulated
55+
initial_interval: 100ms # Add the appropriate duration value here, e.g., "100ms" for 100 milliseconds, "5s" for 5 seconds, "1m" for 1 minute, "1h" for 1 hour
56+
randomization_factor: 0.10 # Add the appropriate float value here, e.g., 0.10
57+
multiplier: 1.5 # Add the appropriate float value here, e.g., 1.5
58+
max_interval: 1m # Add the appropriate duration value here, e.g., "100ms" for 100 milliseconds, "5s" for 5 seconds, "1m" for 1 minute, "1h" for 1 hour
59+
max_elapsed_time: 0 # Add the appropriate duration value here, e.g., "0" for indefinite "100ms" for 100 milliseconds, "5s" for 5 seconds, "1m" for 1 minute, "1h" for 1 hour
5460
# tls options
5561
tls:
5662
# enable tls in the nginx-agent setup for grpcs
@@ -83,6 +89,12 @@ metrics:
8389
report_interval: 1m
8490
collection_interval: 15s
8591
mode: aggregated
92+
backoff: # note: default values are prepopulated
93+
initial_interval: 100ms # Add the appropriate duration value here, e.g., "100ms" for 100 milliseconds, "5s" for 5 seconds, "1m" for 1 minute, "1h" for 1 hour
94+
randomization_factor: 0.10 # Add the appropriate float value here, e.g., 0.10
95+
multiplier: 1.5 # Add the appropriate float value here, e.g., 1.5
96+
max_interval: 1m # Add the appropriate duration value here, e.g., "100ms" for 100 milliseconds, "5s" for 5 seconds, "1m" for 1 minute, "1h" for 1 hour
97+
max_elapsed_time: 0 # Add the appropriate duration value here, e.g., "0" for indefinite "100ms" for 100 milliseconds, "5s" for 5 seconds, "1m" for 1 minute, "1h" for 1 hour
8698
8799
# OSS NGINX default config path
88100
# path to aux file dirs can also be added

src/core/config/config.go

+18
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,12 @@ func SetDefaults() {
9595
Viper.SetDefault(BackoffMultiplier, Defaults.Server.Backoff.Multiplier)
9696
Viper.SetDefault(BackoffRandomizationFactor, Defaults.Server.Backoff.RandomizationFactor)
9797

98+
Viper.SetDefault(BackoffMetricsInitialInterval, Defaults.AgentMetrics.Backoff.InitialInterval)
99+
Viper.SetDefault(BackoffMetricsMaxElapsedTime, Defaults.AgentMetrics.Backoff.MaxElapsedTime)
100+
Viper.SetDefault(BackoffMetricsMaxInterval, Defaults.AgentMetrics.Backoff.MaxInterval)
101+
Viper.SetDefault(BackoffMetricsMultiplier, Defaults.AgentMetrics.Backoff.Multiplier)
102+
Viper.SetDefault(BackoffMetricsRandomizationFactor, Defaults.AgentMetrics.Backoff.RandomizationFactor)
103+
98104
// DATAPLANE DEFAULTS
99105
Viper.SetDefault(DataplaneStatusPoll, Defaults.Dataplane.Status.PollInterval)
100106

@@ -133,6 +139,7 @@ func deprecateFlags() {
133139
setFlagDeprecated("nap-monitoring-processor-buffer-size", "DEPRECATED. No replacement command.")
134140
setFlagDeprecated("nap-monitoring-syslog-ip", "DEPRECATED. No replacement command.")
135141
setFlagDeprecated("nap-monitoring-syslog-port", "DEPRECATED. No replacement command.")
142+
setFlagDeprecated("metrics-bulksize", "DEPRECATED. Use metrics backoff maxElapsedTime instead to set a time period where no successful connection, after time elapsed start dropping oldest metrics from the buffer.")
136143
}
137144

138145
func RegisterFlags() {
@@ -315,6 +322,7 @@ func getMetrics() AgentMetrics {
315322
ReportInterval: Viper.GetDuration(MetricsReportInterval),
316323
CollectionInterval: Viper.GetDuration(MetricsCollectionInterval),
317324
Mode: Viper.GetString(MetricsMode),
325+
Backoff: getMetricsBackOff(),
318326
}
319327
}
320328

@@ -366,6 +374,16 @@ func getBackOff() Backoff {
366374
}
367375
}
368376

377+
func getMetricsBackOff() Backoff {
378+
return Backoff{
379+
InitialInterval: Viper.GetDuration(BackoffMetricsInitialInterval),
380+
RandomizationFactor: Viper.GetFloat64(BackoffMetricsRandomizationFactor),
381+
Multiplier: Viper.GetFloat64(BackoffMetricsMultiplier),
382+
MaxInterval: Viper.GetDuration(BackoffMetricsMaxInterval),
383+
MaxElapsedTime: Viper.GetDuration(BackoffMetricsMaxElapsedTime),
384+
}
385+
}
386+
369387
func getAgentAPI() AgentAPI {
370388
return AgentAPI{
371389
Host: Viper.GetString(AgentAPIHost),

src/core/config/config_test.go

+3
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"sort"
1616
"strings"
1717
"testing"
18+
"time"
1819

1920
agent_config "github.com/nginx/agent/sdk/v2/agent/config"
2021
sysutils "github.com/nginx/agent/v2/test/utils/system"
@@ -256,6 +257,7 @@ func TestGetConfig(t *testing.T) {
256257
assert.Equal(t, updatedServerGrpcPort, config.Server.GrpcPort)
257258
assert.Equal(t, updatedAgentAPIPort, config.AgentAPI.Port)
258259
assert.Equal(t, updatedConfTags, config.Tags)
260+
assert.Equal(t, time.Hour, config.Server.Backoff.MaxElapsedTime)
259261

260262
// Check for updated values
261263
assert.Equal(t, updatedConfigDirs, config.ConfigDirs)
@@ -270,6 +272,7 @@ func TestGetConfig(t *testing.T) {
270272

271273
// Everything else should still be default
272274
assert.Equal(t, Defaults.AgentMetrics.Mode, config.AgentMetrics.Mode)
275+
assert.Equal(t, 10*time.Minute, config.AgentMetrics.Backoff.MaxInterval)
273276
assert.Equal(t, Defaults.Features, config.Features)
274277
assert.Equal(t, []string{}, config.Extensions)
275278
})

src/core/config/defaults.go

+14
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,13 @@ var (
8585
ReportInterval: 1 * time.Minute,
8686
CollectionInterval: 15 * time.Second,
8787
Mode: "aggregated",
88+
Backoff: Backoff{
89+
InitialInterval: client.DefaultBackoffSettings.InitialInterval,
90+
RandomizationFactor: client.DefaultBackoffSettings.Jitter,
91+
Multiplier: client.DefaultBackoffSettings.Multiplier,
92+
MaxInterval: client.DefaultBackoffSettings.MaxInterval,
93+
MaxElapsedTime: client.DefaultBackoffSettings.MaxElapsedTime,
94+
},
8895
},
8996
AgentAPI: AgentAPI{
9097
Host: "127.0.0.1",
@@ -184,6 +191,13 @@ const (
184191
MetricsReportInterval = MetricsKey + agent_config.KeyDelimiter + "report_interval"
185192
MetricsCollectionInterval = MetricsKey + agent_config.KeyDelimiter + "collection_interval"
186193
MetricsMode = MetricsKey + agent_config.KeyDelimiter + "mode"
194+
MetricsBackoff = MetricsKey + agent_config.KeyDelimiter + "backoff"
195+
// metrics backoff settings
196+
BackoffMetricsInitialInterval = MetricsKey + agent_config.KeyDelimiter + BackoffKey + agent_config.KeyDelimiter + "initial_interval"
197+
BackoffMetricsRandomizationFactor = MetricsKey + agent_config.KeyDelimiter + BackoffKey + agent_config.KeyDelimiter + "randomization_factor"
198+
BackoffMetricsMultiplier = MetricsKey + agent_config.KeyDelimiter + BackoffKey + agent_config.KeyDelimiter + "multiplier"
199+
BackoffMetricsMaxInterval = MetricsKey + agent_config.KeyDelimiter + BackoffKey + agent_config.KeyDelimiter + "max_interval"
200+
BackoffMetricsMaxElapsedTime = MetricsKey + agent_config.KeyDelimiter + BackoffKey + agent_config.KeyDelimiter + "max_elapsed_time"
187201

188202
// DEPRECATED KEYS
189203
AdvancedMetricsKey = "advanced_metrics"

src/core/config/types.go

+11
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,16 @@ func (c *Config) GetServerBackoffSettings() backoff.BackoffSettings {
7070
}
7171
}
7272

73+
func (c *Config) GetMetricsBackoffSettings() backoff.BackoffSettings {
74+
return backoff.BackoffSettings{
75+
InitialInterval: c.AgentMetrics.Backoff.InitialInterval,
76+
MaxInterval: c.AgentMetrics.Backoff.MaxInterval,
77+
MaxElapsedTime: c.AgentMetrics.Backoff.MaxElapsedTime,
78+
Multiplier: c.AgentMetrics.Backoff.Multiplier,
79+
Jitter: c.AgentMetrics.Backoff.RandomizationFactor,
80+
}
81+
}
82+
7383
type Server struct {
7484
Host string `mapstructure:"host" yaml:"-"`
7585
GrpcPort int `mapstructure:"grpcPort" yaml:"-"`
@@ -137,4 +147,5 @@ type AgentMetrics struct {
137147
ReportInterval time.Duration `mapstructure:"report_interval" yaml:"-"`
138148
CollectionInterval time.Duration `mapstructure:"collection_interval" yaml:"-"`
139149
Mode string `mapstructure:"mode" yaml:"-"`
150+
Backoff Backoff `mapstructure:"backoff" yaml:"-"`
140151
}

src/core/grpc.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ func CreateGrpcClients(ctx context.Context, loadedConfig *config.Config) (client
5757
commander.WithDialOptions(append(grpcDialOptions, secureCmdDialOpts)...)
5858

5959
reporter := client.NewMetricReporterClient()
60-
reporter.WithBackoffSettings(loadedConfig.GetServerBackoffSettings())
60+
reporter.WithBackoffSettings(loadedConfig.GetMetricsBackoffSettings())
6161
reporter.WithServer(loadedConfig.Server.Target)
6262
reporter.WithDialOptions(append(grpcDialOptions, secureMetricsDialOpts)...)
6363

src/plugins/testdata/configs/updated.conf

+13
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
server:
22
host: 192.168.0.1
33
grpcPort: 11000
4+
backoff:
5+
initial_interval: 3s
6+
randomization_factor: 0.5
7+
multiplier: 1.5
8+
max_interval: 10m
9+
max_elapsed_time: 1h
410
api:
511
port: 9010
612
config_dirs: /usr/local/etc/nginx
@@ -9,3 +15,10 @@ log:
915
path: ./test-path
1016
nginx:
1117
metrics_poll_interval: 3s
18+
metrics:
19+
backoff:
20+
initial_interval: 3s
21+
randomization_factor: 0.5
22+
multiplier: 1.5
23+
max_interval: 10m
24+
max_elapsed_time: 1h

test/integration/vendor/github.com/nginx/agent/v2/src/core/config/config.go

+18
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/integration/vendor/github.com/nginx/agent/v2/src/core/config/defaults.go

+14
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/integration/vendor/github.com/nginx/agent/v2/src/core/config/types.go

+11
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/integration/vendor/github.com/nginx/agent/v2/src/core/grpc.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/performance/vendor/github.com/nginx/agent/v2/src/core/config/config.go

+18
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/performance/vendor/github.com/nginx/agent/v2/src/core/config/defaults.go

+14
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/performance/vendor/github.com/nginx/agent/v2/src/core/config/types.go

+11
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/performance/vendor/github.com/nginx/agent/v2/src/core/grpc.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)