Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Async nginx config reload #70

Merged
merged 20 commits into from
Nov 3, 2022
Merged
Show file tree
Hide file tree
Changes from 16 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 35 additions & 0 deletions sdk/agent/config/config_helpers.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package config

const (
KeyDelimiter = "_"

// viper keys used in config
FeaturesKey = "features"
FeatureRegistration = FeaturesKey + KeyDelimiter + "registration"
FeatureNginxConfig = FeaturesKey + KeyDelimiter + "nginx-config"
FeatureNginxConfigAsync = FeaturesKey + KeyDelimiter + "nginx-config-async"
FeatureNginxSSLConfig = FeaturesKey + KeyDelimiter + "nginx-ssl-config"
FeatureNginxCounting = FeaturesKey + KeyDelimiter + "nginx-counting"
FeatureMetrics = FeaturesKey + KeyDelimiter + "metrics"
FeatureMetricsThrottle = FeaturesKey + KeyDelimiter + "metrics-throttle"
FeatureDataPlaneStatus = FeaturesKey + KeyDelimiter + "dataplane-status"
FeatureProcessWatcher = FeaturesKey + KeyDelimiter + "process-watcher"
FeatureFileWatcher = FeaturesKey + KeyDelimiter + "file-watcher"
FeatureActivityEvents = FeaturesKey + KeyDelimiter + "activity-events"
)

func GetDefaultFeatures() []string {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the server needs to know the configured set of features that the agent supports. I think we have the following options:

  1. agent sends to NMS in AgentMeta
  2. agent sends to NMS in separate AgentConfigRequest

return []string{
FeatureRegistration,
FeatureNginxConfig,
FeatureNginxSSLConfig,
FeatureNginxCounting,
FeatureNginxConfigAsync,
FeatureMetrics,
FeatureMetricsThrottle,
FeatureDataPlaneStatus,
FeatureProcessWatcher,
FeatureFileWatcher,
FeatureActivityEvents,
}
}
803 changes: 708 additions & 95 deletions sdk/proto/command.pb.go

Large diffs are not rendered by default.

19 changes: 19 additions & 0 deletions sdk/proto/command.proto
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,25 @@ message DataplaneStatus {
repeated NginxHealth healths = 5 [(gogoproto.jsontag) = "healths" ]; // moving to DataplaneSoftwareHealth
repeated DataplaneSoftwareDetails dataplane_software_details = 6 [(gogoproto.jsontag) = "dataplane_software_details"];
repeated DataplaneSoftwareHealth dataplane_software_healths = 7 [(gogoproto.jsontag) = "dataplane_software_healths"];
repeated AgentActivityStatus agent_activity_status = 8 [(gogoproto.jsontag) = "agent_activity_status" ];
}

message AgentActivityStatus {
oneof Status {
NginxConfigStatus nginx_config_status = 1 [(gogoproto.jsontag) = "nginx_config_status" ];
}
}

message NginxConfigStatus {
string correlation_id = 1 [(gogoproto.jsontag) = "correlation_id" ];
Status status = 2 [(gogoproto.jsontag) = "status" ];
string message = 3 [(gogoproto.jsontag) = "message" ];

enum Status {
PENDING = 0;
OK = 1;
ERROR = 2;
}
}

message DataplaneSoftwareHealth {
Expand Down
9 changes: 5 additions & 4 deletions src/core/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
"strings"
"time"

agent_config "github.com/nginx/agent/sdk/v2/agent/config"
advanced_metrics "github.com/nginx/agent/v2/src/extensions/advanced-metrics/pkg/advanced-metrics"
"github.com/spf13/cobra"
"github.com/spf13/viper"
Expand Down Expand Up @@ -40,7 +41,7 @@ const (
)

var (
Viper = viper.NewWithOptions(viper.KeyDelimiter(KeyDelimiter))
Viper = viper.NewWithOptions(viper.KeyDelimiter(agent_config.KeyDelimiter))
)

func SetVersion(version, commit string) {
Expand Down Expand Up @@ -168,7 +169,7 @@ func GetConfig(clientId string) (*Config, error) {
Nginx: getNginx(),
Dataplane: getDataplane(),
AgentMetrics: getMetrics(),
Features: Viper.GetStringSlice(FeaturesKey),
Features: Viper.GetStringSlice(agent_config.FeaturesKey),
Tags: Viper.GetStringSlice(TagsKey),
Updated: filePathUTime(Viper.GetString(DynamicConfigPathKey)),
AllowedDirectoriesMap: map[string]struct{}{},
Expand Down Expand Up @@ -221,8 +222,8 @@ func UpdateAgentConfig(systemId string, updateTags []string, updateFeatures []st
sort.Strings(config.Features)
synchronizedFeatures := reflect.DeepEqual(updateFeatures, config.Features)

Viper.Set(FeaturesKey, updateFeatures)
config.Features = Viper.GetStringSlice(FeaturesKey)
Viper.Set(agent_config.FeaturesKey, updateFeatures)
config.Features = Viper.GetStringSlice(agent_config.FeaturesKey)

// If the features are already synchronized there is no need to overwrite
if synchronizedTags && synchronizedFeatures {
Expand Down
6 changes: 4 additions & 2 deletions src/core/config/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ import (
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"

agent_config "github.com/nginx/agent/sdk/v2/agent/config"

sysutils "github.com/nginx/agent/v2/test/utils/system"
)

Expand Down Expand Up @@ -455,7 +457,7 @@ func TestUpdateAgentConfig(t *testing.T) {
}

func setEnvVariable(t *testing.T, name string, value string) {
key := strings.ToUpper(EnvPrefix + KeyDelimiter + name)
key := strings.ToUpper(EnvPrefix + agent_config.KeyDelimiter + name)
err := os.Setenv(key, value)
require.NoError(t, err)
}
Expand All @@ -464,7 +466,7 @@ func cleanEnv(t *testing.T, confFileName, dynamicConfFileAbsPath string) {
os.Clearenv()
ROOT_COMMAND.ResetFlags()
ROOT_COMMAND.ResetCommands()
Viper = viper.NewWithOptions(viper.KeyDelimiter(KeyDelimiter))
Viper = viper.NewWithOptions(viper.KeyDelimiter(agent_config.KeyDelimiter))
SetDefaults()
RegisterFlags()

Expand Down
100 changes: 38 additions & 62 deletions src/core/config/defaults.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ import (
"time"

"github.com/google/uuid"

agent_config "github.com/nginx/agent/sdk/v2/agent/config"
advanced_metrics "github.com/nginx/agent/v2/src/extensions/advanced-metrics/pkg/advanced-metrics"
log "github.com/sirupsen/logrus"
)
Expand Down Expand Up @@ -78,18 +80,7 @@ var (
PriorityTableMaxSize: 1000,
},
},
Features: []string{
FeatureRegistration,
FeatureNginxConfig,
FeatureNginxSSLConfig,
FeatureNginxCounting,
FeatureMetrics,
FeatureMetricsThrottle,
FeatureDataPlaneStatus,
FeatureProcessWatcher,
FeatureFileWatcher,
FeatureActivityEvents,
},
Features: agent_config.GetDefaultFeatures(),
}
AllowedDirectoriesMap map[string]struct{}
)
Expand All @@ -99,7 +90,6 @@ const (
DynamicConfigFileAbsPath = "/etc/nginx-agent/agent-dynamic.conf"
ConfigFileName = "nginx-agent.conf"
ConfigFileType = "yaml"
KeyDelimiter = "_"
EnvPrefix = "nms"
ConfigPathKey = "path"
DynamicConfigPathKey = "dynamic-config-path"
Expand All @@ -114,81 +104,67 @@ const (
// viper keys used in config
LogKey = "log"

LogLevel = LogKey + KeyDelimiter + "level"
LogPath = LogKey + KeyDelimiter + "path"
LogLevel = LogKey + agent_config.KeyDelimiter + "level"
LogPath = LogKey + agent_config.KeyDelimiter + "path"

// viper keys used in config
ServerKey = "server"

ServerHost = ServerKey + KeyDelimiter + "host"
ServerGrpcport = ServerKey + KeyDelimiter + "grpcport"
ServerToken = ServerKey + KeyDelimiter + "token"
ServerMetrics = ServerKey + KeyDelimiter + "metrics"
ServerCommand = ServerKey + KeyDelimiter + "command"
ServerHost = ServerKey + agent_config.KeyDelimiter + "host"
ServerGrpcport = ServerKey + agent_config.KeyDelimiter + "grpcport"
ServerToken = ServerKey + agent_config.KeyDelimiter + "token"
ServerMetrics = ServerKey + agent_config.KeyDelimiter + "metrics"
ServerCommand = ServerKey + agent_config.KeyDelimiter + "command"

// viper keys used in config
TlsKey = "tls"

TlsEnable = TlsKey + KeyDelimiter + "enable"
TlsCert = TlsKey + KeyDelimiter + "cert"
TlsPrivateKey = TlsKey + KeyDelimiter + "key"
TlsCa = TlsKey + KeyDelimiter + "ca"
TlsSkipVerify = TlsKey + KeyDelimiter + "skip_verify"
TlsEnable = TlsKey + agent_config.KeyDelimiter + "enable"
TlsCert = TlsKey + agent_config.KeyDelimiter + "cert"
TlsPrivateKey = TlsKey + agent_config.KeyDelimiter + "key"
TlsCa = TlsKey + agent_config.KeyDelimiter + "ca"
TlsSkipVerify = TlsKey + agent_config.KeyDelimiter + "skip_verify"

// viper keys used in config
NginxKey = "nginx"

NginxExcludeLogs = NginxKey + KeyDelimiter + "exclude_logs"
NginxDebug = NginxKey + KeyDelimiter + "debug"
NginxCountingSocket = NginxKey + KeyDelimiter + "socket"
NginxClientVersion = NginxKey + KeyDelimiter + "client_version"
NginxExcludeLogs = NginxKey + agent_config.KeyDelimiter + "exclude_logs"
NginxDebug = NginxKey + agent_config.KeyDelimiter + "debug"
NginxCountingSocket = NginxKey + agent_config.KeyDelimiter + "socket"
NginxClientVersion = NginxKey + agent_config.KeyDelimiter + "client_version"

// viper keys used in config
DataplaneKey = "dataplane"

DataplaneEventsEnable = DataplaneKey + KeyDelimiter + "events_enable"
DataplaneSyncEnable = DataplaneKey + KeyDelimiter + "sync_enable"
DataplaneStatusPoll = DataplaneKey + KeyDelimiter + "status_poll_interval"
DataplaneStatusReportInterval = DataplaneKey + KeyDelimiter + "report_interval"
DataplaneEventsEnable = DataplaneKey + agent_config.KeyDelimiter + "events_enable"
DataplaneSyncEnable = DataplaneKey + agent_config.KeyDelimiter + "sync_enable"
DataplaneStatusPoll = DataplaneKey + agent_config.KeyDelimiter + "status_poll_interval"
DataplaneStatusReportInterval = DataplaneKey + agent_config.KeyDelimiter + "report_interval"

// viper keys used in config
MetricsKey = "metrics"

MetricsBulkSize = MetricsKey + KeyDelimiter + "bulk_size"
MetricsReportInterval = MetricsKey + KeyDelimiter + "report_interval"
MetricsCollectionInterval = MetricsKey + KeyDelimiter + "collection_interval"
MetricsMode = MetricsKey + KeyDelimiter + "mode"
MetricsBulkSize = MetricsKey + agent_config.KeyDelimiter + "bulk_size"
MetricsReportInterval = MetricsKey + agent_config.KeyDelimiter + "report_interval"
MetricsCollectionInterval = MetricsKey + agent_config.KeyDelimiter + "collection_interval"
MetricsMode = MetricsKey + agent_config.KeyDelimiter + "mode"

// viper keys used in config
AdvancedMetricsKey = "advanced_metrics"

AdvancedMetricsSocketPath = AdvancedMetricsKey + KeyDelimiter + "socket_path"
AdvancedMetricsAggregationPeriod = AdvancedMetricsKey + KeyDelimiter + "aggregation_period"
AdvancedMetricsPublishPeriod = AdvancedMetricsKey + KeyDelimiter + "publishing_period"
AdvancedMetricsTableSizesLimits = AdvancedMetricsKey + KeyDelimiter + "table_sizes_limits"
AdvancedMetricsTableSizesLimitsSTMS = AdvancedMetricsTableSizesLimits + KeyDelimiter + "staging_table_max_size"
AdvancedMetricsTableSizesLimitsSTT = AdvancedMetricsTableSizesLimits + KeyDelimiter + "staging_table_threshold"
AdvancedMetricsTableSizesLimitsPTMS = AdvancedMetricsTableSizesLimits + KeyDelimiter + "priority_table_max_size"
AdvancedMetricsTableSizesLimitsPTT = AdvancedMetricsTableSizesLimits + KeyDelimiter + "priority_table_threshold"
AdvancedMetricsSocketPath = AdvancedMetricsKey + agent_config.KeyDelimiter + "socket_path"
AdvancedMetricsAggregationPeriod = AdvancedMetricsKey + agent_config.KeyDelimiter + "aggregation_period"
AdvancedMetricsPublishPeriod = AdvancedMetricsKey + agent_config.KeyDelimiter + "publishing_period"
AdvancedMetricsTableSizesLimits = AdvancedMetricsKey + agent_config.KeyDelimiter + "table_sizes_limits"
AdvancedMetricsTableSizesLimitsSTMS = AdvancedMetricsTableSizesLimits + agent_config.KeyDelimiter + "staging_table_max_size"
AdvancedMetricsTableSizesLimitsSTT = AdvancedMetricsTableSizesLimits + agent_config.KeyDelimiter + "staging_table_threshold"
AdvancedMetricsTableSizesLimitsPTMS = AdvancedMetricsTableSizesLimits + agent_config.KeyDelimiter + "priority_table_max_size"
AdvancedMetricsTableSizesLimitsPTT = AdvancedMetricsTableSizesLimits + agent_config.KeyDelimiter + "priority_table_threshold"

// viper keys used in config
NginxAppProtectKey = "nginx_app_protect"

NginxAppProtectReportInterval = NginxAppProtectKey + KeyDelimiter + "report_interval"

// viper keys used in config
FeaturesKey = "features"

FeatureRegistration = FeaturesKey + KeyDelimiter + "registration"
FeatureNginxConfig = FeaturesKey + KeyDelimiter + "nginx-config"
FeatureNginxSSLConfig = FeaturesKey + KeyDelimiter + "nginx-ssl-config"
FeatureNginxCounting = FeaturesKey + KeyDelimiter + "nginx-counting"
FeatureMetrics = FeaturesKey + KeyDelimiter + "metrics"
FeatureMetricsThrottle = FeaturesKey + KeyDelimiter + "metrics-throttle"
FeatureDataPlaneStatus = FeaturesKey + KeyDelimiter + "dataplane-status"
FeatureProcessWatcher = FeaturesKey + KeyDelimiter + "process-watcher"
FeatureFileWatcher = FeaturesKey + KeyDelimiter + "file-watcher"
FeatureActivityEvents = FeaturesKey + KeyDelimiter + "activity-events"
NginxAppProtectReportInterval = NginxAppProtectKey + agent_config.KeyDelimiter + "report_interval"

// DEPRECATED KEYS
NginxBinPathKey = "nginx_bin_path"
Expand Down Expand Up @@ -250,9 +226,9 @@ var (
Usage: "A comma-separated list of tags to add to the current instance or machine, to be used for inventory purposes.",
},
&StringSliceFlag{
Name: FeaturesKey,
Name: agent_config.FeaturesKey,
Usage: "A comma-separated list of features enabled for the agent.",
DefaultValue: Defaults.Features,
DefaultValue: agent_config.GetDefaultFeatures(),
},
// NGINX Config
&StringFlag{
Expand Down
5 changes: 5 additions & 0 deletions src/core/topics.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,11 @@ const (
NginxWorkerProcCreated = "nginx.worker.created"
NginxWorkerProcKilled = "nginx.worker.killed"
NginxDetailProcUpdate = "nginx.proc.update"
NginxConfigValidationPending = "nginx.config.validation.pending"
NginxConfigValidationFailed = "nginx.config.validation.failed"
NginxConfigValidationSucceeded = "nginx.config.validation.succeeded"
NginxConfigApplyFailed = "nginx.config.apply.failed"
NginxConfigApplySucceeded = "nginx.config.apply.succeeded"
CommPrefix = "comms."
CommStatus = CommPrefix + "status"
CommMetrics = CommPrefix + "metrics"
Expand Down
Loading