diff --git a/ena-manifest.yaml b/ena-manifest.yaml index 1c523c8a..3cec0e00 100644 --- a/ena-manifest.yaml +++ b/ena-manifest.yaml @@ -3,7 +3,7 @@ --- metadata: schemaVersion: 2.0.0 - release: 1.5.1 + release: 1.5.2 repository: codename: 3.1 component: main @@ -18,7 +18,7 @@ packages: version: 1.10.1 ociArtifact: edge-orch/en/deb/node-agent - name: platform-manageability-agent - version: 0.4.0 + version: 0.4.2 ociArtifact: edge-orch/en/deb/platform-manageability-agent - name: platform-observability-agent version: 1.11.0 diff --git a/platform-manageability-agent/VERSION b/platform-manageability-agent/VERSION index 7532512c..2b7c5ae0 100644 --- a/platform-manageability-agent/VERSION +++ b/platform-manageability-agent/VERSION @@ -1 +1 @@ -0.4.2-dev +0.4.2 diff --git a/platform-manageability-agent/cmd/platform-manageability-agent/platform-manageability-agent.go b/platform-manageability-agent/cmd/platform-manageability-agent/platform-manageability-agent.go index 69899ab9..19f6d7b9 100644 --- a/platform-manageability-agent/cmd/platform-manageability-agent/platform-manageability-agent.go +++ b/platform-manageability-agent/cmd/platform-manageability-agent/platform-manageability-agent.go @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: (C) 2025 Intel Corporation +// SPDX-FileCopyrightText: (C) 2026 Intel Corporation // SPDX-License-Identifier: Apache-2.0 // main package implements functionality of the Platform Manageability Agent @@ -108,17 +108,19 @@ func main() { }() // Enable agent metrics - shutdown, err := metrics.Init(ctx, confs.MetricsEndpoint, confs.MetricsInterval, info.Component, info.Version) - if err != nil { - log.Errorf("Initialization of metrics failed: %v", err) - } else { - log.Info("Metrics collection started") - defer func() { - err = shutdown(ctx) - if err != nil && !errors.Is(err, context.Canceled) { - log.Errorf("Shutting down metrics failed! Error: %v", err) - } - }() + if confs.Metrics.Enabled { + shutdown, err := metrics.Init(ctx, confs.Metrics.Endpoint, confs.Metrics.Interval, info.Component, info.Version) + if err != nil { + log.Errorf("Initialization of metrics failed: %v", err) + } else { + log.Info("Metrics collection started") + defer func() { + err = shutdown(ctx) + if err != nil && !errors.Is(err, context.Canceled) { + log.Errorf("Shutting down metrics failed! Error: %v", err) + } + }() + } } log.Info("Platform Manageability Agent started successfully") diff --git a/platform-manageability-agent/configs/platform-manageability-agent.yaml b/platform-manageability-agent/configs/platform-manageability-agent.yaml index f4180bf2..21879421 100644 --- a/platform-manageability-agent/configs/platform-manageability-agent.yaml +++ b/platform-manageability-agent/configs/platform-manageability-agent.yaml @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: (C) 2025 Intel Corporation +# SPDX-FileCopyrightText: (C) 2026 Intel Corporation # SPDX-License-Identifier: Apache-2.0 --- @@ -11,6 +11,8 @@ manageability: heartbeatInterval: 10s rpsAddress: 'rps.test.edgeorch.intel.com' statusEndpoint: 'unix:///run/node-agent/node-agent.sock' -metricsEndpoint: 'unix:///run/platform-observability-agent/platform-observability-agent.sock' -metricsInterval: 10s +metrics: + enabled: true + endpoint: 'unix:///run/platform-observability-agent/platform-observability-agent.sock' + interval: 10s accessTokenPath: /etc/intel_edge_node/tokens/platform-manageability-agent/access_token diff --git a/platform-manageability-agent/debian/postinst b/platform-manageability-agent/debian/postinst index d1012c10..b8fc91a7 100644 --- a/platform-manageability-agent/debian/postinst +++ b/platform-manageability-agent/debian/postinst @@ -14,6 +14,11 @@ if [ ! -z "$RET" ]; then sed -i "s/^rpsAddress: '.*'/rpsAddress: '$RET'/" /etc/edge-node/node/confs/platform-manageability-agent.yaml fi +db_get platform-manageability-agent/metrics.enabled +if [ ! -z "$RET" ]; then + sed -i -e '/^metrics:$/{n' -e 's/enabled:.*/enabled: '"$RET"'/' -e '}' /etc/edge-node/node/confs/platform-manageability-agent.yaml +fi + # Create system group if it doesn't exist groupadd -f bm-agents --system diff --git a/platform-manageability-agent/internal/config/config.go b/platform-manageability-agent/internal/config/config.go index fc7238c7..d36ec87c 100644 --- a/platform-manageability-agent/internal/config/config.go +++ b/platform-manageability-agent/internal/config/config.go @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: (C) 2025 Intel Corporation +// SPDX-FileCopyrightText: (C) 2026 Intel Corporation // SPDX-License-Identifier: Apache-2.0 // Package config contains Platform Manageability Agent configuration management @@ -17,6 +17,12 @@ import ( const HEARTBEAT_DEFAULT = 10 +type ConfigMetrics struct { + Enabled bool `yaml:"enabled"` + Endpoint string `yaml:"endpoint"` + Interval time.Duration `yaml:"interval"` +} + type ConfigManageability struct { Enabled bool `yaml:"enabled"` ServiceURL string `yaml:"serviceURL"` @@ -29,8 +35,7 @@ type Config struct { GUID string `yaml:"GUID"` Manageability ConfigManageability `yaml:"manageability"` StatusEndpoint string `yaml:"statusEndpoint"` - MetricsEndpoint string `yaml:"metricsEndpoint"` - MetricsInterval time.Duration `yaml:"metricsInterval"` + Metrics ConfigMetrics `yaml:"metrics"` RPSAddress string `yaml:"rpsAddress"` AccessTokenPath string `yaml:"accessTokenPath"` } @@ -56,8 +61,13 @@ func New(configPath string, log *logrus.Entry) (*Config, error) { config.Manageability.HeartbeatInterval = HEARTBEAT_DEFAULT * time.Second } - if config.MetricsInterval == 0 || config.MetricsInterval <= 0 { - config.MetricsInterval = HEARTBEAT_DEFAULT * time.Second + if config.Metrics.Enabled { + if config.Metrics.Interval == 0 || config.Metrics.Interval <= 0 { + config.Metrics.Interval = HEARTBEAT_DEFAULT * time.Second + } + if config.Metrics.Endpoint == "" || !strings.HasPrefix(config.Metrics.Endpoint, "unix://") { + return nil, fmt.Errorf("agent metrics reporting address not provided by config file") + } } if config.Manageability.ServiceURL == "" { @@ -72,10 +82,6 @@ func New(configPath string, log *logrus.Entry) (*Config, error) { return nil, fmt.Errorf("agent status reporting address not provided by config file") } - if config.MetricsEndpoint == "" || !strings.HasPrefix(config.MetricsEndpoint, "unix://") { - return nil, fmt.Errorf("agent metrics reporting address not provided by config file") - } - if config.GUID == "" { return nil, fmt.Errorf("edge Node GUID not provided by config file") } diff --git a/platform-manageability-agent/internal/config/config_test.go b/platform-manageability-agent/internal/config/config_test.go index 1ee86de8..b40f0eb3 100644 --- a/platform-manageability-agent/internal/config/config_test.go +++ b/platform-manageability-agent/internal/config/config_test.go @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: (C) 2025 Intel Corporation +// SPDX-FileCopyrightText: (C) 2026 Intel Corporation // SPDX-License-Identifier: Apache-2.0 package config_test @@ -18,8 +18,10 @@ import ( var log = logger.Logger -func createConfigFile(t *testing.T, version string, logLevel string, guid string, url string, statusInterval time.Duration, metricsInterval time.Duration, - statusEndpoint string, metricsEndpoint string, rpsAddress string, accessTokenPath string) string { +func createConfigFile(t *testing.T, version string, logLevel string, guid string, url string, enabled bool, + statusInterval time.Duration, metricsInterval time.Duration, statusEndpoint string, metricsEndpoint string, + rpsAddress string, accessTokenPath string) string { + f, err := os.CreateTemp(t.TempDir(), "test_config") require.NoError(t, err) @@ -32,9 +34,12 @@ func createConfigFile(t *testing.T, version string, logLevel string, guid string ServiceURL: url, HeartbeatInterval: statusInterval, }, - StatusEndpoint: statusEndpoint, - MetricsEndpoint: metricsEndpoint, - MetricsInterval: metricsInterval, + StatusEndpoint: statusEndpoint, + Metrics: config.ConfigMetrics{ + Enabled: enabled, + Endpoint: metricsEndpoint, + Interval: metricsInterval, + }, RPSAddress: rpsAddress, AccessTokenPath: accessTokenPath, } @@ -62,7 +67,7 @@ func TestValidConfig(t *testing.T) { rpsAddress := "test-address.test.com" accessTokenPath := "/etc/intel_edge_node/tokens/platform-manageability-agent/access_token" - fileName := createConfigFile(t, version, logLevel, guid, url, statusInterval, metricsInterval, statusEndpoint, metricsEndpoint, rpsAddress, accessTokenPath) + fileName := createConfigFile(t, version, logLevel, guid, url, true, statusInterval, metricsInterval, statusEndpoint, metricsEndpoint, rpsAddress, accessTokenPath) defer os.Remove(fileName) // clean up cfg, err := config.New(fileName, log) @@ -73,8 +78,9 @@ func TestValidConfig(t *testing.T) { assert.Equal(t, url, cfg.Manageability.ServiceURL) assert.Equal(t, statusInterval, cfg.Manageability.HeartbeatInterval) assert.Equal(t, statusEndpoint, cfg.StatusEndpoint) - assert.Equal(t, metricsEndpoint, cfg.MetricsEndpoint) - assert.Equal(t, metricsInterval, cfg.MetricsInterval) + assert.Equal(t, true, cfg.Metrics.Enabled) + assert.Equal(t, metricsEndpoint, cfg.Metrics.Endpoint) + assert.Equal(t, metricsInterval, cfg.Metrics.Interval) assert.Equal(t, rpsAddress, cfg.RPSAddress) assert.Equal(t, accessTokenPath, cfg.AccessTokenPath) } @@ -110,7 +116,7 @@ func TestSymlinkConfigPath(t *testing.T) { rpsAddress := "test-address.test.com" accessTokenPath := "/etc/intel_edge_node/tokens/platform-manageability-agent/access_token" - fileName := createConfigFile(t, version, logLevel, guid, url, statusInterval, metricsInterval, statusEndpoint, metricsEndpoint, rpsAddress, accessTokenPath) + fileName := createConfigFile(t, version, logLevel, guid, url, true, statusInterval, metricsInterval, statusEndpoint, metricsEndpoint, rpsAddress, accessTokenPath) defer os.Remove(fileName) // clean up symlinkConfig := "/tmp/sysmlink_config.txt" @@ -131,7 +137,7 @@ func TestPartialConfigFile(t *testing.T) { rpsAddress := "test-address.test.com" accessTokenPath := "/etc/intel_edge_node/tokens/platform-manageability-agent/access_token" - fileName := createConfigFile(t, "", "", guid, url, 0*time.Second, 0*time.Second, statusEndpoint, metricsEndpoint, rpsAddress, accessTokenPath) + fileName := createConfigFile(t, "", "", guid, url, true, 0*time.Second, 0*time.Second, statusEndpoint, metricsEndpoint, rpsAddress, accessTokenPath) defer os.Remove(fileName) cfg, err := config.New(fileName, log) @@ -142,8 +148,67 @@ func TestPartialConfigFile(t *testing.T) { assert.Equal(t, url, cfg.Manageability.ServiceURL) assert.Equal(t, 10*time.Second, cfg.Manageability.HeartbeatInterval) assert.Equal(t, statusEndpoint, cfg.StatusEndpoint) - assert.Equal(t, metricsEndpoint, cfg.MetricsEndpoint) - assert.Equal(t, 10*time.Second, cfg.MetricsInterval) + assert.Equal(t, true, cfg.Metrics.Enabled) + assert.Equal(t, metricsEndpoint, cfg.Metrics.Endpoint) + assert.Equal(t, 10*time.Second, cfg.Metrics.Interval) + assert.Equal(t, rpsAddress, cfg.RPSAddress) + assert.Equal(t, accessTokenPath, cfg.AccessTokenPath) +} + +func TestDisabledMetricsWithIntervalEndpointSet(t *testing.T) { + version := "v0.1.0" + logLevel := "info" + guid := "aaaaaaaa-0000-1111-2222-bbbbbbbbcccc" + url := "localhost" + statusInterval := 30 * time.Second + metricsInterval := 15 * time.Second + statusEndpoint := "unix://test-socket.sock" + metricsEndpoint := "unix://metrics-test-socket.sock" + rpsAddress := "test-address.test.com" + accessTokenPath := "/etc/intel_edge_node/tokens/platform-manageability-agent/access_token" + + fileName := createConfigFile(t, version, logLevel, guid, url, false, statusInterval, metricsInterval, statusEndpoint, metricsEndpoint, rpsAddress, accessTokenPath) + defer os.Remove(fileName) // clean up + + cfg, err := config.New(fileName, log) + require.NoError(t, err) + assert.Equal(t, version, cfg.Version) + assert.Equal(t, logLevel, cfg.LogLevel) + assert.Equal(t, guid, cfg.GUID) + assert.Equal(t, url, cfg.Manageability.ServiceURL) + assert.Equal(t, statusInterval, cfg.Manageability.HeartbeatInterval) + assert.Equal(t, statusEndpoint, cfg.StatusEndpoint) + assert.Equal(t, false, cfg.Metrics.Enabled) + assert.Equal(t, metricsEndpoint, cfg.Metrics.Endpoint) + assert.Equal(t, metricsInterval, cfg.Metrics.Interval) + assert.Equal(t, rpsAddress, cfg.RPSAddress) + assert.Equal(t, accessTokenPath, cfg.AccessTokenPath) +} + +func TestDisabledMetricsWithIntervalEndpointNotSet(t *testing.T) { + version := "v0.1.0" + logLevel := "info" + guid := "aaaaaaaa-0000-1111-2222-bbbbbbbbcccc" + url := "localhost" + statusInterval := 30 * time.Second + statusEndpoint := "unix://test-socket.sock" + rpsAddress := "test-address.test.com" + accessTokenPath := "/etc/intel_edge_node/tokens/platform-manageability-agent/access_token" + + fileName := createConfigFile(t, version, logLevel, guid, url, false, statusInterval, 0*time.Second, statusEndpoint, "", rpsAddress, accessTokenPath) + defer os.Remove(fileName) // clean up + + cfg, err := config.New(fileName, log) + require.NoError(t, err) + assert.Equal(t, version, cfg.Version) + assert.Equal(t, logLevel, cfg.LogLevel) + assert.Equal(t, guid, cfg.GUID) + assert.Equal(t, url, cfg.Manageability.ServiceURL) + assert.Equal(t, statusInterval, cfg.Manageability.HeartbeatInterval) + assert.Equal(t, statusEndpoint, cfg.StatusEndpoint) + assert.Equal(t, false, cfg.Metrics.Enabled) + assert.Equal(t, "", cfg.Metrics.Endpoint) + assert.Equal(t, 0*time.Second, cfg.Metrics.Interval) assert.Equal(t, rpsAddress, cfg.RPSAddress) assert.Equal(t, accessTokenPath, cfg.AccessTokenPath) } @@ -158,7 +223,7 @@ func TestMissingHeartbeatIntervals(t *testing.T) { rpsAddress := "test-address.test.com" accessTokenPath := "/etc/intel_edge_node/tokens/platform-manageability-agent/access_token" - fileName := createConfigFile(t, version, logLevel, guid, url, 0*time.Second, 0*time.Second, statusEndpoint, metricsEndpoint, rpsAddress, accessTokenPath) + fileName := createConfigFile(t, version, logLevel, guid, url, true, 0*time.Second, 0*time.Second, statusEndpoint, metricsEndpoint, rpsAddress, accessTokenPath) defer os.Remove(fileName) // clean up cfg, err := config.New(fileName, log) @@ -169,8 +234,9 @@ func TestMissingHeartbeatIntervals(t *testing.T) { assert.Equal(t, url, cfg.Manageability.ServiceURL) assert.Equal(t, 10*time.Second, cfg.Manageability.HeartbeatInterval) assert.Equal(t, statusEndpoint, cfg.StatusEndpoint) - assert.Equal(t, metricsEndpoint, cfg.MetricsEndpoint) - assert.Equal(t, 10*time.Second, cfg.MetricsInterval) + assert.Equal(t, true, cfg.Metrics.Enabled) + assert.Equal(t, metricsEndpoint, cfg.Metrics.Endpoint) + assert.Equal(t, 10*time.Second, cfg.Metrics.Interval) assert.Equal(t, rpsAddress, cfg.RPSAddress) assert.Equal(t, accessTokenPath, cfg.AccessTokenPath) } @@ -186,7 +252,7 @@ func TestMissingServiceURL(t *testing.T) { rpsAddress := "test-address.test.com" accessTokenPath := "/etc/intel_edge_node/tokens/platform-manageability-agent/access_token" - fileName := createConfigFile(t, version, logLevel, guid, "", statusInterval, metricsInterval, statusEndpoint, metricsEndpoint, rpsAddress, accessTokenPath) + fileName := createConfigFile(t, version, logLevel, guid, "", true, statusInterval, metricsInterval, statusEndpoint, metricsEndpoint, rpsAddress, accessTokenPath) defer os.Remove(fileName) // clean up cfg, err := config.New(fileName, log) @@ -205,7 +271,7 @@ func TestMissingTokenPath(t *testing.T) { metricsEndpoint := "unix://metrics-test-socket.sock" rpsAddress := "test-address.test.com" - fileName := createConfigFile(t, version, logLevel, guid, url, statusInterval, metricsInterval, statusEndpoint, metricsEndpoint, rpsAddress, "") + fileName := createConfigFile(t, version, logLevel, guid, url, true, statusInterval, metricsInterval, statusEndpoint, metricsEndpoint, rpsAddress, "") defer os.Remove(fileName) // clean up cfg, err := config.New(fileName, log) @@ -224,7 +290,7 @@ func TestMissingStatusEndpoint(t *testing.T) { rpsAddress := "test-address.test.com" accessTokenPath := "/etc/intel_edge_node/tokens/platform-manageability-agent/access_token" - fileName := createConfigFile(t, version, logLevel, guid, url, statusInterval, metricsInterval, "", metricsEndpoint, rpsAddress, accessTokenPath) + fileName := createConfigFile(t, version, logLevel, guid, url, true, statusInterval, metricsInterval, "", metricsEndpoint, rpsAddress, accessTokenPath) defer os.Remove(fileName) // clean up cfg, err := config.New(fileName, log) @@ -243,7 +309,7 @@ func TestMissingMetricsEndpoint(t *testing.T) { rpsAddress := "test-address.test.com" accessTokenPath := "/etc/intel_edge_node/tokens/platform-manageability-agent/access_token" - fileName := createConfigFile(t, version, logLevel, guid, url, statusInterval, metricsInterval, statusEndpoint, "", rpsAddress, accessTokenPath) + fileName := createConfigFile(t, version, logLevel, guid, url, true, statusInterval, metricsInterval, statusEndpoint, "", rpsAddress, accessTokenPath) defer os.Remove(fileName) // clean up cfg, err := config.New(fileName, log) @@ -263,7 +329,7 @@ func TestInvalidStatusEndpoint(t *testing.T) { rpsAddress := "test-address.test.com" accessTokenPath := "/etc/intel_edge_node/tokens/platform-manageability-agent/access_token" - fileName := createConfigFile(t, version, logLevel, guid, url, statusInterval, metricsInterval, statusEndpoint, metricsEndpoint, rpsAddress, accessTokenPath) + fileName := createConfigFile(t, version, logLevel, guid, url, true, statusInterval, metricsInterval, statusEndpoint, metricsEndpoint, rpsAddress, accessTokenPath) defer os.Remove(fileName) // clean up cfg, err := config.New(fileName, log) @@ -283,7 +349,7 @@ func TestInvalidMetricsEndpoint(t *testing.T) { rpsAddress := "test-address.test.com" accessTokenPath := "/etc/intel_edge_node/tokens/platform-manageability-agent/access_token" - fileName := createConfigFile(t, version, logLevel, guid, url, statusInterval, metricsInterval, statusEndpoint, metricsEndpoint, rpsAddress, accessTokenPath) + fileName := createConfigFile(t, version, logLevel, guid, url, true, statusInterval, metricsInterval, statusEndpoint, metricsEndpoint, rpsAddress, accessTokenPath) defer os.Remove(fileName) // clean up cfg, err := config.New(fileName, log) @@ -302,7 +368,7 @@ func TestMissingGUID(t *testing.T) { rpsAddress := "test-address.test.com" accessTokenPath := "/etc/intel_edge_node/tokens/platform-manageability-agent/access_token" - fileName := createConfigFile(t, version, logLevel, "", url, statusInterval, metricsInterval, statusEndpoint, metricsEndpoint, rpsAddress, accessTokenPath) + fileName := createConfigFile(t, version, logLevel, "", url, true, statusInterval, metricsInterval, statusEndpoint, metricsEndpoint, rpsAddress, accessTokenPath) defer os.Remove(fileName) // clean up cfg, err := config.New(fileName, log) @@ -321,7 +387,7 @@ func TestMissingRPSAddress(t *testing.T) { metricsEndpoint := "unix://metrics-test-socket.sock" accessTokenPath := "/etc/intel_edge_node/tokens/platform-manageability-agent/access_token" - fileName := createConfigFile(t, version, logLevel, guid, url, statusInterval, metricsInterval, statusEndpoint, metricsEndpoint, "", accessTokenPath) + fileName := createConfigFile(t, version, logLevel, guid, url, true, statusInterval, metricsInterval, statusEndpoint, metricsEndpoint, "", accessTokenPath) defer os.Remove(fileName) // clean up cfg, err := config.New(fileName, log) @@ -365,13 +431,13 @@ func FuzzNew(f *testing.F) { if !strings.HasPrefix(conf.StatusEndpoint, "unix://") { t.Error("StatusEndpoint is not a Unix socket address") } - if conf.MetricsEndpoint == "" { + if conf.Metrics.Endpoint == "" { t.Error("MetricsEndpoint is not set in configuration") } - if !strings.HasPrefix(conf.MetricsEndpoint, "unix://") { + if !strings.HasPrefix(conf.Metrics.Endpoint, "unix://") { t.Error("MetricsEndpoint is not a Unix socket address") } - if conf.MetricsInterval <= 0 { + if conf.Metrics.Interval <= 0 { t.Error("MetricsInterval is set to an invalid value in configuration") } if conf.AccessTokenPath == "" { @@ -383,7 +449,7 @@ func FuzzNew(f *testing.F) { } func FuzzConfigNew(f *testing.F) { - exampleConfigFileContents := []byte("# SPDX-FileCopyrightText: (C) 2025 Intel Corporation\n# SPDX-License-Identifier: Apache-2.0\n\n---\nversion: v0.1.0\nlogLevel: info\nGUID: 'aaaaaaaa-0000-1111-2222-bbbbbbbbcccc'\nmanageability:\n enabled: true\n serviceURL: 'infra.test.edgeorch.intel.com:443'\n heartbeatInterval: 10s\nrpsAddress: 'rps.test.edgeorch.intel.com'\nstatusEndpoint: 'unix:///run/node-agent/node-agent.sock'\nmetricsEndpoint: 'unix:///run/platform-observability-agent/platform-observability-agent.sock'\nmetricsInterval: 10s\naccessTokenPath: /etc/intel_edge_node/tokens/platform-manageability-agent/access_token") + exampleConfigFileContents := []byte("# SPDX-FileCopyrightText: (C) 2025 Intel Corporation\n# SPDX-License-Identifier: Apache-2.0\n\n---\nversion: v0.1.0\nlogLevel: info\nGUID: 'aaaaaaaa-0000-1111-2222-bbbbbbbbcccc'\nmanageability:\n enabled: true\n serviceURL: 'infra.test.edgeorch.intel.com:443'\n heartbeatInterval: 10s\nrpsAddress: 'rps.test.edgeorch.intel.com'\nstatusEndpoint: 'unix:///run/node-agent/node-agent.sock'\nmetrics:\nenabled: true\nendpoint: 'unix:///run/platform-observability-agent/platform-observability-agent.sock'\ninterval: 10s\naccessTokenPath: /etc/intel_edge_node/tokens/platform-manageability-agent/access_token") f.Add(exampleConfigFileContents) f.Fuzz(func(t *testing.T, testConfigFileContents []byte) { testFile, err := os.CreateTemp(t.TempDir(), "example_config.yaml") @@ -431,13 +497,13 @@ func FuzzConfigNew(f *testing.F) { if !strings.HasPrefix(conf.StatusEndpoint, "unix://") { t.Error("StatusEndpoint is not a Unix socket address") } - if conf.MetricsEndpoint == "" { + if conf.Metrics.Endpoint == "" && conf.Metrics.Enabled { t.Error("MetricsEndpoint is not set in configuration") } - if !strings.HasPrefix(conf.MetricsEndpoint, "unix://") { + if !strings.HasPrefix(conf.Metrics.Endpoint, "unix://") && conf.Metrics.Enabled { t.Error("MetricsEndpoint is not a Unix socket address") } - if conf.MetricsInterval <= 0 { + if conf.Metrics.Interval <= 0 && conf.Metrics.Enabled { t.Error("MetricsInterval is set to an invalid value in configuration") } if conf.AccessTokenPath == "" {