From 275a0152abc326d8eed581e87e5ab62160211b28 Mon Sep 17 00:00:00 2001 From: Donal Hurley Date: Wed, 4 Sep 2024 16:06:08 +0100 Subject: [PATCH 01/24] Add file watcher (#801) --- go.mod | 2 +- .../internal/metadata/generated_status.go | 3 +- internal/config/config.go | 10 + internal/config/config_test.go | 4 + internal/config/defaults.go | 1 + internal/config/flags.go | 1 + internal/config/testdata/nginx-agent.conf | 2 + internal/config/types.go | 5 + internal/file/file_plugin.go | 4 +- internal/file/file_plugin_test.go | 10 +- internal/model/config.go | 19 +- internal/model/config_test.go | 11 + internal/resource/resource_plugin.go | 8 +- internal/watcher/file/file_watcher_service.go | 209 ++++++++++++++++++ .../watcher/file/file_watcher_service_test.go | 171 ++++++++++++++ .../instance/instance_watcher_service.go | 82 +++++-- .../instance/instance_watcher_service_test.go | 9 +- .../watcher/instance/nginx_process_parser.go | 5 + internal/watcher/watcher_plugin.go | 39 +++- internal/watcher/watcher_plugin_test.go | 16 +- ...fake_instance_watcher_service_interface.go | 52 ++++- nginx-agent.conf | 2 + test/mock/grpc/cmd/main.go | 2 +- .../grpc/mock_management_command_service.go | 52 ++++- test/types/config.go | 3 + 25 files changed, 668 insertions(+), 54 deletions(-) create mode 100644 internal/watcher/file/file_watcher_service.go create mode 100644 internal/watcher/file/file_watcher_service_test.go diff --git a/go.mod b/go.mod index 96bae87192..ca839ae1a9 100644 --- a/go.mod +++ b/go.mod @@ -9,6 +9,7 @@ require ( github.com/bufbuild/protovalidate-go v0.2.1 github.com/cenkalti/backoff/v4 v4.3.0 github.com/docker/docker v26.0.0+incompatible + github.com/fsnotify/fsnotify v1.7.0 github.com/go-resty/resty/v2 v2.12.0 github.com/google/go-cmp v0.6.0 github.com/google/uuid v1.6.0 @@ -176,7 +177,6 @@ require ( github.com/expr-lang/expr v1.16.9 // indirect github.com/fatih/color v1.16.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/gabriel-vasile/mimetype v1.4.3 // indirect github.com/gin-contrib/sse v0.1.0 // indirect github.com/go-jose/go-jose/v4 v4.0.1 // indirect diff --git a/internal/collector/nginxplusreceiver/internal/metadata/generated_status.go b/internal/collector/nginxplusreceiver/internal/metadata/generated_status.go index 96f453b98a..feb047ea22 100644 --- a/internal/collector/nginxplusreceiver/internal/metadata/generated_status.go +++ b/internal/collector/nginxplusreceiver/internal/metadata/generated_status.go @@ -7,8 +7,7 @@ import ( ) var ( - Type = component.MustNewType("nginxplus") - ScopeName = "otelcol/nginxplusreceiver" + Type = component.MustNewType("nginxplus") ) const ( diff --git a/internal/config/config.go b/internal/config/config.go index c82310ca4b..3231c320ea 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -202,6 +202,13 @@ func registerFlags() { DefInstanceHealthWatcherMonitoringFrequency, "How often the NGINX Agent will check for instance health changes.", ) + + fs.Duration( + FileWatcherMonitoringFrequencyKey, + DefFileWatcherMonitoringFrequency, + "How often the NGINX Agent will check for file changes.", + ) + fs.String( CollectorConfigPathKey, DefCollectorConfigPath, @@ -416,6 +423,9 @@ func resolveWatchers() *Watchers { InstanceHealthWatcher: InstanceHealthWatcher{ MonitoringFrequency: DefInstanceHealthWatcherMonitoringFrequency, }, + FileWatcher: FileWatcher{ + MonitoringFrequency: DefFileWatcherMonitoringFrequency, + }, } } diff --git a/internal/config/config_test.go b/internal/config/config_test.go index 61a1302c2c..2b5e399323 100644 --- a/internal/config/config_test.go +++ b/internal/config/config_test.go @@ -71,6 +71,10 @@ func TestResolveConfig(t *testing.T) { actual.ConfigDir) assert.Equal(t, allowedDir, actual.AllowedDirectories) + + assert.Equal(t, 5*time.Second, actual.Watchers.InstanceWatcher.MonitoringFrequency) + assert.Equal(t, 5*time.Second, actual.Watchers.InstanceHealthWatcher.MonitoringFrequency) + assert.Equal(t, 5*time.Second, actual.Watchers.FileWatcher.MonitoringFrequency) } func TestSetVersion(t *testing.T) { diff --git a/internal/config/defaults.go b/internal/config/defaults.go index ac2f3cbce0..2c8202953f 100644 --- a/internal/config/defaults.go +++ b/internal/config/defaults.go @@ -35,6 +35,7 @@ const ( DefInstanceWatcherMonitoringFrequency = 5 * time.Second DefInstanceHealthWatcherMonitoringFrequency = 5 * time.Second + DefFileWatcherMonitoringFrequency = 5 * time.Second // 0 = unset DefMaxMessageSize = 0 diff --git a/internal/config/flags.go b/internal/config/flags.go index d7543779e8..d99804734e 100644 --- a/internal/config/flags.go +++ b/internal/config/flags.go @@ -20,6 +20,7 @@ const ( UUIDKey = "uuid" InstanceWatcherMonitoringFrequencyKey = "watchers_instance_watcher_monitoring_frequency" InstanceHealthWatcherMonitoringFrequencyKey = "watchers_instance_health_watcher_monitoring_frequency" + FileWatcherMonitoringFrequencyKey = "watchers_file_watcher_monitoring_frequency" ) var ( diff --git a/internal/config/testdata/nginx-agent.conf b/internal/config/testdata/nginx-agent.conf index 9aea099a21..cb395f7122 100644 --- a/internal/config/testdata/nginx-agent.conf +++ b/internal/config/testdata/nginx-agent.conf @@ -7,6 +7,8 @@ watchers: monitoring_frequency: 5s instance_health_watcher: monitoring_frequency: 5s + file_watcher: + monitoring_frequency: 5s data_plane_config: nginx: diff --git a/internal/config/types.go b/internal/config/types.go index 9c33fde487..3eeada699e 100644 --- a/internal/config/types.go +++ b/internal/config/types.go @@ -176,6 +176,7 @@ type ( Watchers struct { InstanceWatcher InstanceWatcher `yaml:"-" mapstructure:"instance_watcher"` InstanceHealthWatcher InstanceHealthWatcher `yaml:"-" mapstructure:"instance_health_watcher"` + FileWatcher FileWatcher `yaml:"-" mapstructure:"file_watcher"` } InstanceWatcher struct { @@ -185,6 +186,10 @@ type ( InstanceHealthWatcher struct { MonitoringFrequency time.Duration `yaml:"-" mapstructure:"monitoring_frequency"` } + + FileWatcher struct { + MonitoringFrequency time.Duration `yaml:"-" mapstructure:"monitoring_frequency"` + } ) func (col *Collector) Validate(allowedDirectories []string) error { diff --git a/internal/file/file_plugin.go b/internal/file/file_plugin.go index d5d6e82256..88096e74be 100644 --- a/internal/file/file_plugin.go +++ b/internal/file/file_plugin.go @@ -151,15 +151,17 @@ func (fp *FilePlugin) handleConfigApplyRequest(ctx context.Context, msg *bus.Mes switch writeStatus { case model.NoChange: + instanceID := configApplyRequest.GetOverview().GetConfigVersion().GetInstanceId() response = fp.createDataPlaneResponse( correlationID, mpi.CommandResponse_COMMAND_STATUS_OK, "Config apply successful, no files to change", - configApplyRequest.GetOverview().GetConfigVersion().GetInstanceId(), + instanceID, "", ) fp.messagePipe.Process(ctx, &bus.Message{Topic: bus.DataPlaneResponseTopic, Data: response}) + fp.messagePipe.Process(ctx, &bus.Message{Topic: bus.ConfigApplySuccessfulTopic, Data: instanceID}) fp.fileManagerService.ClearCache() return diff --git a/internal/file/file_plugin_test.go b/internal/file/file_plugin_test.go index b9842f1b18..7497d60536 100644 --- a/internal/file/file_plugin_test.go +++ b/internal/file/file_plugin_test.go @@ -182,7 +182,7 @@ func TestFilePlugin_Process_ConfigApplyRequestTopic(t *testing.T) { dataPlaneResponse.GetCommandResponse().GetMessage()) assert.Equal(t, test.configApplyReturnsErr.Error(), dataPlaneResponse.GetCommandResponse().GetError()) case test.configApplyStatus == model.NoChange: - assert.Len(t, messages, 1) + assert.Len(t, messages, 2) dataPlaneResponse, ok := messages[0].Data.(*mpi.DataPlaneResponse) assert.True(t, ok) assert.Equal( @@ -190,6 +190,14 @@ func TestFilePlugin_Process_ConfigApplyRequestTopic(t *testing.T) { mpi.CommandResponse_COMMAND_STATUS_OK, dataPlaneResponse.GetCommandResponse().GetStatus(), ) + + instanceID, ok := messages[1].Data.(string) + assert.True(t, ok) + assert.Equal( + t, + test.message.GetConfigApplyRequest().GetOverview().GetConfigVersion().GetInstanceId(), + instanceID, + ) case test.message == nil: assert.Empty(t, messages) default: diff --git a/internal/model/config.go b/internal/model/config.go index b9aceeffb1..3f37428912 100644 --- a/internal/model/config.go +++ b/internal/model/config.go @@ -33,7 +33,7 @@ func (ncc *NginxConfigContext) Equal(otherNginxConfigContext *NginxConfigContext return false } - if len(ncc.Files) != len(otherNginxConfigContext.Files) { + if !ncc.areFileEqual(otherNginxConfigContext.Files) { return false } @@ -48,6 +48,23 @@ func (ncc *NginxConfigContext) Equal(otherNginxConfigContext *NginxConfigContext return true } +func (ncc *NginxConfigContext) areFileEqual(files []*v1.File) bool { + if len(ncc.Files) != len(files) { + return false + } + + for _, file := range ncc.Files { + for _, otherFile := range files { + if file.GetFileMeta().GetName() == otherFile.GetFileMeta().GetName() && + file.GetFileMeta().GetHash() != otherFile.GetFileMeta().GetHash() { + return false + } + } + } + + return true +} + type ConfigApplyMessage struct { Error error CorrelationID string diff --git a/internal/model/config_test.go b/internal/model/config_test.go index 80ca017afa..eea285094f 100644 --- a/internal/model/config_test.go +++ b/internal/model/config_test.go @@ -53,6 +53,16 @@ func TestNginxConfigContext_Equal(t *testing.T) { nginxConfigContextWithDifferentNumberOfFiles := *nginxConfigContext nginxConfigContextWithDifferentNumberOfFiles.Files = []*mpi.File{} + nginxConfigContextWithDifferentFileHashes := *nginxConfigContext + nginxConfigContextWithDifferentFileHashes.Files = []*mpi.File{ + { + FileMeta: protos.FileMeta("test1", "fgregreger"), + }, + { + FileMeta: protos.FileMeta("test2", "vre8e"), + }, + } + nginxConfigContextWithDifferentAccessLogs := *nginxConfigContext nginxConfigContextWithDifferentAccessLogs.AccessLogs = []*AccessLog{} @@ -64,6 +74,7 @@ func TestNginxConfigContext_Equal(t *testing.T) { assert.False(t, nginxConfigContext.Equal(&nginxConfigContextWithDifferentPlusAPI)) assert.False(t, nginxConfigContext.Equal(&nginxConfigContextWithDifferentInstanceID)) assert.False(t, nginxConfigContext.Equal(&nginxConfigContextWithDifferentNumberOfFiles)) + assert.False(t, nginxConfigContext.Equal(&nginxConfigContextWithDifferentFileHashes)) assert.False(t, nginxConfigContext.Equal(&nginxConfigContextWithDifferentAccessLogs)) assert.False(t, nginxConfigContext.Equal(&nginxConfigContextWithDifferentErrorLogs)) } diff --git a/internal/resource/resource_plugin.go b/internal/resource/resource_plugin.go index 58fee26473..a5779aa2f3 100644 --- a/internal/resource/resource_plugin.go +++ b/internal/resource/resource_plugin.go @@ -143,7 +143,13 @@ func (r *Resource) handleWriteConfigSuccessful(ctx context.Context, msg *bus.Mes instance := r.resourceService.Instance(data.InstanceID) r.messagePipe.Process(ctx, &bus.Message{Topic: bus.DataPlaneResponseTopic, Data: response}) - r.messagePipe.Process(ctx, &bus.Message{Topic: bus.ConfigApplySuccessfulTopic, Data: instance}) + r.messagePipe.Process( + ctx, + &bus.Message{ + Topic: bus.ConfigApplySuccessfulTopic, + Data: instance.GetInstanceMeta().GetInstanceId(), + }, + ) } func (r *Resource) handleRollbackWrite(ctx context.Context, msg *bus.Message) { diff --git a/internal/watcher/file/file_watcher_service.go b/internal/watcher/file/file_watcher_service.go new file mode 100644 index 0000000000..d92da5a5f8 --- /dev/null +++ b/internal/watcher/file/file_watcher_service.go @@ -0,0 +1,209 @@ +// Copyright (c) F5, Inc. +// +// This source code is licensed under the Apache License, Version 2.0 license found in the +// LICENSE file in the root directory of this source tree. + +package file + +import ( + "context" + "errors" + "log/slog" + "os" + "path/filepath" + "strings" + "sync" + "sync/atomic" + "time" + + "github.com/fsnotify/fsnotify" + "github.com/nginx/agent/v3/internal/config" + "github.com/nginx/agent/v3/internal/logger" +) + +const ( + Create = fsnotify.Create + Write = fsnotify.Write + Remove = fsnotify.Remove + Rename = fsnotify.Rename + Chmod = fsnotify.Chmod +) + +var emptyEvent = fsnotify.Event{ + Name: "", + Op: 0, +} + +type FileUpdateMessage struct { + CorrelationID slog.Attr +} + +type FileWatcherService struct { + agentConfig *config.Config + watcher *fsnotify.Watcher + directoriesBeingWatched *sync.Map + filesChanged *atomic.Bool + enabled *atomic.Bool +} + +func NewFileWatcherService(agentConfig *config.Config) *FileWatcherService { + enabled := &atomic.Bool{} + enabled.Store(true) + + filesChanged := &atomic.Bool{} + filesChanged.Store(false) + + return &FileWatcherService{ + agentConfig: agentConfig, + directoriesBeingWatched: &sync.Map{}, + enabled: enabled, + filesChanged: filesChanged, + } +} + +func (fws *FileWatcherService) Watch(ctx context.Context, ch chan<- FileUpdateMessage) { + monitoringFrequency := fws.agentConfig.Watchers.FileWatcher.MonitoringFrequency + slog.DebugContext(ctx, "Starting file watcher monitoring", "monitoring_frequency", monitoringFrequency) + + instanceWatcherTicker := time.NewTicker(monitoringFrequency) + defer instanceWatcherTicker.Stop() + + watcher, err := fsnotify.NewWatcher() + if err != nil { + slog.ErrorContext(ctx, "Failed to create file watcher", "error", err) + return + } + + fws.watcher = watcher + + fws.watchDirectories(ctx) + + for { + select { + case <-ctx.Done(): + closeError := fws.watcher.Close() + if closeError != nil { + slog.ErrorContext(ctx, "Unable to close file watcher", "error", closeError) + } + + return + case event := <-fws.watcher.Events: + fws.handleEvent(ctx, event) + case <-instanceWatcherTicker.C: + fws.checkForUpdates(ctx, ch) + case watcherError := <-fws.watcher.Errors: + slog.ErrorContext(ctx, "Unexpected error in file watcher", "error", watcherError) + } + } +} + +func (fws *FileWatcherService) SetEnabled(enabled bool) { + fws.enabled.Store(enabled) +} + +func (fws *FileWatcherService) watchDirectories(ctx context.Context) { + for _, dir := range fws.agentConfig.AllowedDirectories { + if _, err := os.Stat(dir); errors.Is(err, os.ErrNotExist) { + slog.DebugContext(ctx, "Unable to watch directory that does not exist", "directory", dir, "error", err) + continue + } + + slog.DebugContext(ctx, "Creating file watchers", "directory", dir) + + err := filepath.Walk(dir, func(path string, info os.FileInfo, err error) error { + fws.addWatcher(ctx, path, info) + return nil + }) + if err != nil { + slog.ErrorContext(ctx, "Failed to create file watchers", "directory", dir, "error", err) + } + } +} + +func (fws *FileWatcherService) addWatcher(ctx context.Context, path string, info os.FileInfo) { + if info.IsDir() && !fws.isWatching(path) { + if err := fws.watcher.Add(path); err != nil { + slog.ErrorContext(ctx, "Failed to add file watcher", "directory_path", path, "error", err) + removeError := fws.watcher.Remove(path) + if removeError != nil { + slog.ErrorContext(ctx, "Failed to remove file watcher", "directory_path", path, "error", removeError) + } + + return + } + + fws.directoriesBeingWatched.Store(path, true) + } +} + +func (fws *FileWatcherService) removeWatcher(ctx context.Context, path string) { + if _, ok := fws.directoriesBeingWatched.Load(path); ok { + err := fws.watcher.Remove(path) + if err != nil { + slog.ErrorContext(ctx, "Failed to remove file watcher", "directory_path", path, "error", err) + return + } + + fws.directoriesBeingWatched.Delete(path) + } +} + +func (fws *FileWatcherService) isWatching(name string) bool { + v, _ := fws.directoriesBeingWatched.LoadOrStore(name, false) + + if value, ok := v.(bool); ok { + return value + } + + return false +} + +func (fws *FileWatcherService) handleEvent(ctx context.Context, event fsnotify.Event) { + if fws.enabled.Load() { + if isEventSkippable(event) { + slog.DebugContext(ctx, "Skipping FSNotify event", "event", event) + return + } + + switch { + case event.Op&Write == Write: + // We want to send messages on write since that means the contents changed, + // but we already have a watcher on the file so nothing special needs to happen here + case event.Op&Create == Create: + info, err := os.Stat(event.Name) + if err != nil { + slog.DebugContext(ctx, "Unable to add watcher", "path", event.Name, "error", err) + return + } + fws.addWatcher(ctx, event.Name, info) + case event.Op&Remove == Remove, event.Op&Rename == Rename: + fws.removeWatcher(ctx, event.Name) + } + + slog.DebugContext(ctx, "Processing FSNotify event", "event", event) + + fws.filesChanged.Store(true) + } +} + +func (fws *FileWatcherService) checkForUpdates(ctx context.Context, ch chan<- FileUpdateMessage) { + if fws.filesChanged.Load() { + newCtx := context.WithValue( + ctx, + logger.CorrelationIDContextKey, + slog.Any(logger.CorrelationIDKey, logger.GenerateCorrelationID()), + ) + + slog.DebugContext(newCtx, "File watcher detected a file change") + ch <- FileUpdateMessage{CorrelationID: logger.GetCorrelationIDAttr(newCtx)} + fws.filesChanged.Store(false) + } +} + +func isEventSkippable(event fsnotify.Event) bool { + return event == emptyEvent || + event.Name == "" || + strings.HasSuffix(event.Name, ".swp") || + strings.HasSuffix(event.Name, ".swx") || + strings.HasSuffix(event.Name, "~") +} diff --git a/internal/watcher/file/file_watcher_service_test.go b/internal/watcher/file/file_watcher_service_test.go new file mode 100644 index 0000000000..e2d36b9d25 --- /dev/null +++ b/internal/watcher/file/file_watcher_service_test.go @@ -0,0 +1,171 @@ +// Copyright (c) F5, Inc. +// +// This source code is licensed under the Apache License, Version 2.0 license found in the +// LICENSE file in the root directory of this source tree. + +package file + +import ( + "context" + "os" + "path" + "testing" + "time" + + "github.com/fsnotify/fsnotify" + "github.com/nginx/agent/v3/test/types" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +const ( + directoryPermissions = 0o700 +) + +func TestFileWatcherService_NewFileWatcherService(t *testing.T) { + fileWatcherService := NewFileWatcherService(types.AgentConfig()) + + assert.Empty(t, fileWatcherService.directoriesBeingWatched) + assert.True(t, fileWatcherService.enabled.Load()) + assert.False(t, fileWatcherService.filesChanged.Load()) +} + +func TestFileWatcherService_SetEnabled(t *testing.T) { + fileWatcherService := NewFileWatcherService(types.AgentConfig()) + assert.True(t, fileWatcherService.enabled.Load()) + + fileWatcherService.SetEnabled(false) + assert.False(t, fileWatcherService.enabled.Load()) + + fileWatcherService.SetEnabled(true) + assert.True(t, fileWatcherService.enabled.Load()) +} + +func TestFileWatcherService_addWatcher(t *testing.T) { + ctx := context.Background() + fileWatcherService := NewFileWatcherService(types.AgentConfig()) + watcher, err := fsnotify.NewWatcher() + require.NoError(t, err) + fileWatcherService.watcher = watcher + + tempDir := os.TempDir() + testDirectory := path.Join(tempDir, "test_dir") + err = os.Mkdir(testDirectory, directoryPermissions) + require.NoError(t, err) + defer os.Remove(testDirectory) + + info, err := os.Stat(testDirectory) + require.NoError(t, err) + + fileWatcherService.addWatcher(ctx, testDirectory, info) + + value, ok := fileWatcherService.directoriesBeingWatched.Load(testDirectory) + assert.True(t, ok) + boolValue, ok := value.(bool) + assert.True(t, ok) + assert.True(t, boolValue) +} + +func TestFileWatcherService_addWatcher_Error(t *testing.T) { + ctx := context.Background() + fileWatcherService := NewFileWatcherService(types.AgentConfig()) + watcher, err := fsnotify.NewWatcher() + require.NoError(t, err) + fileWatcherService.watcher = watcher + + tempDir := os.TempDir() + testDirectory := path.Join(tempDir, "test_dir") + err = os.Mkdir(testDirectory, directoryPermissions) + require.NoError(t, err) + info, err := os.Stat(testDirectory) + require.NoError(t, err) + + // Delete directory to cause the addWatcher function to fail + err = os.Remove(testDirectory) + require.NoError(t, err) + + fileWatcherService.addWatcher(ctx, testDirectory, info) + + value, ok := fileWatcherService.directoriesBeingWatched.Load(testDirectory) + assert.True(t, ok) + boolValue, ok := value.(bool) + assert.True(t, ok) + assert.False(t, boolValue) + assert.True(t, ok) +} + +func TestFileWatcherService_removeWatcher(t *testing.T) { + ctx := context.Background() + fileWatcherService := NewFileWatcherService(types.AgentConfig()) + watcher, err := fsnotify.NewWatcher() + require.NoError(t, err) + fileWatcherService.watcher = watcher + + tempDir := os.TempDir() + testDirectory := path.Join(tempDir, "test_dir") + err = os.Mkdir(testDirectory, directoryPermissions) + require.NoError(t, err) + defer os.Remove(testDirectory) + + err = fileWatcherService.watcher.Add(testDirectory) + require.NoError(t, err) + fileWatcherService.directoriesBeingWatched.Store(testDirectory, true) + + fileWatcherService.removeWatcher(ctx, testDirectory) + + value, ok := fileWatcherService.directoriesBeingWatched.Load(testDirectory) + assert.Nil(t, value) + assert.False(t, ok) +} + +func TestFileWatcherService_isEventSkippable(t *testing.T) { + assert.False(t, isEventSkippable(fsnotify.Event{Name: "test.conf"})) + assert.True(t, isEventSkippable(fsnotify.Event{Name: "test.swp"})) + assert.True(t, isEventSkippable(fsnotify.Event{Name: "test.swx"})) + assert.True(t, isEventSkippable(fsnotify.Event{Name: "test.conf~"})) +} + +func TestFileWatcherService_Watch(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + tempDir := os.TempDir() + testDirectory := path.Join(tempDir, "test_dir") + os.RemoveAll(testDirectory) + err := os.Mkdir(testDirectory, directoryPermissions) + require.NoError(t, err) + defer os.RemoveAll(testDirectory) + + agentConfig := types.AgentConfig() + agentConfig.Watchers.FileWatcher.MonitoringFrequency = 100 * time.Millisecond + agentConfig.AllowedDirectories = []string{testDirectory, "/unknown/directory"} + + channel := make(chan FileUpdateMessage) + + fileWatcherService := NewFileWatcherService(agentConfig) + go fileWatcherService.Watch(ctx, channel) + + time.Sleep(100 * time.Millisecond) + + file, err := os.CreateTemp(testDirectory, "test.conf") + require.NoError(t, err) + defer os.Remove(file.Name()) + + t.Run("Test 1: File updated", func(t *testing.T) { + fileUpdate := <-channel + assert.NotNil(t, fileUpdate.CorrelationID) + }) + + t.Run("Test 2: Skippable file updated", func(t *testing.T) { + skippableFile, skippableFileError := os.CreateTemp(testDirectory, "*test.conf.swp") + require.NoError(t, skippableFileError) + defer os.Remove(skippableFile.Name()) + + select { + case <-channel: + t.Fatalf("Expected file to be skipped") + case <-time.After(150 * time.Millisecond): + return + } + }) +} diff --git a/internal/watcher/instance/instance_watcher_service.go b/internal/watcher/instance/instance_watcher_service.go index 9989d557cb..2840d0693b 100644 --- a/internal/watcher/instance/instance_watcher_service.go +++ b/internal/watcher/instance/instance_watcher_service.go @@ -8,11 +8,11 @@ package instance import ( "context" "log/slog" + "reflect" + "slices" "sync" "time" - "google.golang.org/protobuf/proto" - mpi "github.com/nginx/agent/v3/api/grpc/mpi/v1" "github.com/nginx/agent/v3/internal/config" "github.com/nginx/agent/v3/internal/datasource/host/exec" @@ -111,32 +111,50 @@ func (iw *InstanceWatcherService) Watch( } } -func (iw *InstanceWatcherService) ReparseConfig(ctx context.Context, instance *mpi.Instance) { +func (iw *InstanceWatcherService) ReparseConfigs(ctx context.Context) { + slog.DebugContext(ctx, "Reparsing all instance configurations") + for _, instance := range iw.instanceCache { + iw.ReparseConfig(ctx, instance.GetInstanceMeta().GetInstanceId()) + } + slog.DebugContext(ctx, "Finished reparsing all instance configurations") +} + +func (iw *InstanceWatcherService) ReparseConfig(ctx context.Context, instanceID string) { iw.cacheMutex.Lock() defer iw.cacheMutex.Unlock() + + updatesRequired := false + instance := iw.instanceCache[instanceID] instanceType := instance.GetInstanceMeta().GetInstanceType() correlationID := logger.GetCorrelationIDAttr(ctx) if instanceType == mpi.InstanceMeta_INSTANCE_TYPE_NGINX || instanceType == mpi.InstanceMeta_INSTANCE_TYPE_NGINX_PLUS { - slog.DebugContext(ctx, "Reparsing instance config", "instance_id", instance.GetInstanceMeta().GetInstanceId()) + slog.DebugContext( + ctx, + "Reparsing NGINX instance config", + "instance_id", instanceID, + ) + nginxConfigContext, parseErr := iw.nginxConfigParser.Parse(ctx, instance) if parseErr != nil { slog.WarnContext( ctx, - "Parsing NGINX instance config", + "Unable to parse NGINX instance config", "config_path", instance.GetInstanceRuntime().GetConfigPath(), - "instance_id", instance.GetInstanceMeta().GetInstanceId(), + "instance_id", instanceID, "error", parseErr, ) + + return } iw.sendNginxConfigContextUpdate(ctx, nginxConfigContext) iw.nginxConfigCache[nginxConfigContext.InstanceID] = nginxConfigContext - iw.updateNginxInstanceRuntime(instance, nginxConfigContext) + updatesRequired = iw.updateNginxInstanceRuntime(instance, nginxConfigContext) } - if !proto.Equal(instance, iw.instanceCache[instance.GetInstanceMeta().GetInstanceId()]) { + if updatesRequired { instanceUpdates := InstanceUpdates{} instanceUpdates.UpdatedInstances = append(instanceUpdates.UpdatedInstances, instance) iw.instancesChannel <- InstanceUpdatesMessage{ @@ -151,6 +169,7 @@ func (iw *InstanceWatcherService) checkForUpdates( ) { iw.cacheMutex.Lock() defer iw.cacheMutex.Unlock() + var instancesToParse []*mpi.Instance correlationID := logger.GenerateCorrelationID() newCtx := context.WithValue(ctx, logger.CorrelationIDContextKey, correlationID) @@ -164,12 +183,13 @@ func (iw *InstanceWatcherService) checkForUpdates( instancesToParse = append(instancesToParse, instanceUpdates.NewInstances...) for _, newInstance := range instancesToParse { + instanceType := newInstance.GetInstanceMeta().GetInstanceType() slog.DebugContext( newCtx, "Parsing instance config", "instance_id", newInstance.GetInstanceMeta().GetInstanceId(), + "instance_type", instanceType, ) - instanceType := newInstance.GetInstanceMeta().GetInstanceType() if instanceType == mpi.InstanceMeta_INSTANCE_TYPE_NGINX || instanceType == mpi.InstanceMeta_INSTANCE_TYPE_NGINX_PLUS { @@ -177,15 +197,17 @@ func (iw *InstanceWatcherService) checkForUpdates( if parseErr != nil { slog.WarnContext( newCtx, - "Parsing NGINX instance config", + "Unable to parse NGINX instance config", "config_path", newInstance.GetInstanceRuntime().GetConfigPath(), "instance_id", newInstance.GetInstanceMeta().GetInstanceId(), + "instance_type", instanceType, "error", parseErr, ) } else { iw.sendNginxConfigContextUpdate(newCtx, nginxConfigContext) iw.nginxConfigCache[nginxConfigContext.InstanceID] = nginxConfigContext iw.updateNginxInstanceRuntime(newInstance, nginxConfigContext) + iw.instanceCache[newInstance.GetInstanceMeta().GetInstanceId()] = newInstance } } } @@ -245,7 +267,13 @@ func (iw *InstanceWatcherService) instanceUpdates(ctx context.Context) ( instanceUpdates.UpdatedInstances = updatedInstances instanceUpdates.DeletedInstances = deletedInstances - iw.instanceCache = instancesFound + for _, instance := range slices.Concat[[]*mpi.Instance](newInstances, updatedInstances) { + iw.instanceCache[instance.GetInstanceMeta().GetInstanceId()] = instance + } + + for _, instance := range deletedInstances { + delete(iw.instanceCache, instance.GetInstanceMeta().GetInstanceId()) + } return instanceUpdates, nil } @@ -360,23 +388,39 @@ func areInstancesEqual(oldRuntime, currentRuntime *mpi.InstanceRuntime) (equal b func (iw *InstanceWatcherService) updateNginxInstanceRuntime( instance *mpi.Instance, nginxConfigContext *model.NginxConfigContext, -) { +) (updatesRequired bool) { instanceType := instance.GetInstanceMeta().GetInstanceType() + accessLogs := convertAccessLogs(nginxConfigContext.AccessLogs) + errorLogs := convertErrorLogs(nginxConfigContext.ErrorLogs) + if instanceType == mpi.InstanceMeta_INSTANCE_TYPE_NGINX_PLUS { nginxPlusRuntimeInfo := instance.GetInstanceRuntime().GetNginxPlusRuntimeInfo() - nginxPlusRuntimeInfo.AccessLogs = convertAccessLogs(nginxConfigContext.AccessLogs) - nginxPlusRuntimeInfo.ErrorLogs = convertErrorLogs(nginxConfigContext.ErrorLogs) - nginxPlusRuntimeInfo.StubStatus = nginxConfigContext.StubStatus - nginxPlusRuntimeInfo.PlusApi = nginxConfigContext.PlusAPI + if !reflect.DeepEqual(nginxPlusRuntimeInfo.GetAccessLogs(), accessLogs) || + !reflect.DeepEqual(nginxPlusRuntimeInfo.GetErrorLogs(), errorLogs) || + nginxPlusRuntimeInfo.GetStubStatus() != nginxConfigContext.StubStatus || + nginxPlusRuntimeInfo.GetPlusApi() != nginxConfigContext.PlusAPI { + nginxPlusRuntimeInfo.AccessLogs = accessLogs + nginxPlusRuntimeInfo.ErrorLogs = errorLogs + nginxPlusRuntimeInfo.StubStatus = nginxConfigContext.StubStatus + nginxPlusRuntimeInfo.PlusApi = nginxConfigContext.PlusAPI + updatesRequired = true + } } else { nginxRuntimeInfo := instance.GetInstanceRuntime().GetNginxRuntimeInfo() - nginxRuntimeInfo.AccessLogs = convertAccessLogs(nginxConfigContext.AccessLogs) - nginxRuntimeInfo.ErrorLogs = convertErrorLogs(nginxConfigContext.ErrorLogs) - nginxRuntimeInfo.StubStatus = nginxConfigContext.StubStatus + if !reflect.DeepEqual(nginxRuntimeInfo.GetAccessLogs(), accessLogs) || + !reflect.DeepEqual(nginxRuntimeInfo.GetErrorLogs(), errorLogs) || + nginxRuntimeInfo.GetStubStatus() != nginxConfigContext.StubStatus { + nginxRuntimeInfo.AccessLogs = accessLogs + nginxRuntimeInfo.ErrorLogs = errorLogs + nginxRuntimeInfo.StubStatus = nginxConfigContext.StubStatus + updatesRequired = true + } } + + return updatesRequired } func convertAccessLogs(accessLogs []*model.AccessLog) (logs []string) { diff --git a/internal/watcher/instance/instance_watcher_service_test.go b/internal/watcher/instance/instance_watcher_service_test.go index ff0767e35a..fb6a0cf49f 100644 --- a/internal/watcher/instance/instance_watcher_service_test.go +++ b/internal/watcher/instance/instance_watcher_service_test.go @@ -326,11 +326,12 @@ func TestInstanceWatcherService_ReparseConfig(t *testing.T) { } instance := protos.GetNginxOssInstance([]string{}) - instance.InstanceRuntime.GetNginxRuntimeInfo().AccessLogs = []string{"access.logs"} - instance.InstanceRuntime.GetNginxRuntimeInfo().ErrorLogs = []string{"error.log"} + instance.GetInstanceRuntime().GetNginxRuntimeInfo().AccessLogs = []string{"access.logs"} + instance.GetInstanceRuntime().GetNginxRuntimeInfo().ErrorLogs = []string{"error.log"} updatedInstance := protos.GetNginxOssInstance([]string{}) - updatedInstance.GetInstanceRuntime().ProcessId = 5678 + updatedInstance.GetInstanceRuntime().GetNginxRuntimeInfo().AccessLogs = []string{"access2.log"} + updatedInstance.GetInstanceRuntime().GetNginxRuntimeInfo().ErrorLogs = []string{"error.log"} tests := []struct { parseReturns *model.NginxConfigContext @@ -362,7 +363,7 @@ func TestInstanceWatcherService_ReparseConfig(t *testing.T) { instance.GetInstanceMeta().GetInstanceId(): instance, } - instanceWatcherService.ReparseConfig(ctx, updatedInstance) + instanceWatcherService.ReparseConfig(ctx, updatedInstance.GetInstanceMeta().GetInstanceId()) nginxConfigContextMessage := <-nginxConfigContextChannel assert.Equal(t, updateNginxConfigContext, nginxConfigContextMessage.NginxConfigContext) diff --git a/internal/watcher/instance/nginx_process_parser.go b/internal/watcher/instance/nginx_process_parser.go index 852aa4f8b6..b8ec1e1038 100644 --- a/internal/watcher/instance/nginx_process_parser.go +++ b/internal/watcher/instance/nginx_process_parser.go @@ -14,6 +14,7 @@ import ( "os" "path" "regexp" + "sort" "strings" mpi "github.com/nginx/agent/v3/api/grpc/mpi/v1" @@ -336,6 +337,8 @@ func getLoadableModules(nginxInfo *Info) (modules []string) { return modules } + sort.Strings(modules) + return modules } @@ -350,6 +353,8 @@ func getDynamicModules(nginxInfo *Info) (modules []string) { } } + sort.Strings(modules) + return modules } diff --git a/internal/watcher/watcher_plugin.go b/internal/watcher/watcher_plugin.go index b219b97912..8cecc358a0 100644 --- a/internal/watcher/watcher_plugin.go +++ b/internal/watcher/watcher_plugin.go @@ -12,6 +12,7 @@ import ( mpi "github.com/nginx/agent/v3/api/grpc/mpi/v1" + "github.com/nginx/agent/v3/internal/watcher/file" "github.com/nginx/agent/v3/internal/watcher/health" "github.com/nginx/agent/v3/internal/watcher/instance" @@ -30,9 +31,11 @@ type ( agentConfig *config.Config instanceWatcherService instanceWatcherServiceInterface healthWatcherService *health.HealthWatcherService + fileWatcherService *file.FileWatcherService instanceUpdatesChannel chan instance.InstanceUpdatesMessage nginxConfigContextChannel chan instance.NginxConfigContextMessage instanceHealthChannel chan health.InstanceHealthMessage + fileUpdatesChannel chan file.FileUpdateMessage cancel context.CancelFunc instancesWithConfigApplyInProgress []string } @@ -43,7 +46,8 @@ type ( instancesChannel chan<- instance.InstanceUpdatesMessage, nginxConfigContextChannel chan<- instance.NginxConfigContextMessage, ) - ReparseConfig(ctx context.Context, instance *mpi.Instance) + ReparseConfig(ctx context.Context, instanceID string) + ReparseConfigs(ctx context.Context) } ) @@ -54,9 +58,11 @@ func NewWatcher(agentConfig *config.Config) *Watcher { agentConfig: agentConfig, instanceWatcherService: instance.NewInstanceWatcherService(agentConfig), healthWatcherService: health.NewHealthWatcherService(agentConfig), + fileWatcherService: file.NewFileWatcherService(agentConfig), instanceUpdatesChannel: make(chan instance.InstanceUpdatesMessage), nginxConfigContextChannel: make(chan instance.NginxConfigContextMessage), instanceHealthChannel: make(chan health.InstanceHealthMessage), + fileUpdatesChannel: make(chan file.FileUpdateMessage), instancesWithConfigApplyInProgress: []string{}, } } @@ -72,6 +78,7 @@ func (w *Watcher) Init(ctx context.Context, messagePipe bus.MessagePipeInterface go w.instanceWatcherService.Watch(watcherContext, w.instanceUpdatesChannel, w.nginxConfigContextChannel) go w.healthWatcherService.Watch(watcherContext, w.instanceHealthChannel) + go w.fileWatcherService.Watch(watcherContext, w.fileUpdatesChannel) go w.monitorWatchers(watcherContext) return nil @@ -118,7 +125,7 @@ func (w *Watcher) handleConfigApplyRequest(ctx context.Context, msg *bus.Message managementPlaneRequest, ok := msg.Data.(*mpi.ManagementPlaneRequest) if !ok { slog.ErrorContext(ctx, "Unable to cast message payload to *mpi.ManagementPlaneRequest", - "payload", msg.Data) + "payload", msg.Data, "topic", msg.Topic) return } @@ -126,7 +133,7 @@ func (w *Watcher) handleConfigApplyRequest(ctx context.Context, msg *bus.Message request, requestOk := managementPlaneRequest.GetRequest().(*mpi.ManagementPlaneRequest_ConfigApplyRequest) if !requestOk { slog.ErrorContext(ctx, "Unable to cast message payload to *mpi.ManagementPlaneRequest_ConfigApplyRequest", - "payload", msg.Data) + "payload", msg.Data, "topic", msg.Topic) return } @@ -134,12 +141,13 @@ func (w *Watcher) handleConfigApplyRequest(ctx context.Context, msg *bus.Message instanceID := request.ConfigApplyRequest.GetOverview().GetConfigVersion().GetInstanceId() w.instancesWithConfigApplyInProgress = append(w.instancesWithConfigApplyInProgress, instanceID) + w.fileWatcherService.SetEnabled(false) } func (w *Watcher) handleConfigApplySuccess(ctx context.Context, msg *bus.Message) { - data, ok := msg.Data.(*mpi.Instance) + data, ok := msg.Data.(string) if !ok { - slog.ErrorContext(ctx, "Unable to cast message payload to Instance", "payload", msg.Data) + slog.ErrorContext(ctx, "Unable to cast message payload to string", "payload", msg.Data, "topic", msg.Topic) return } @@ -147,9 +155,10 @@ func (w *Watcher) handleConfigApplySuccess(ctx context.Context, msg *bus.Message w.instancesWithConfigApplyInProgress = slices.DeleteFunc( w.instancesWithConfigApplyInProgress, func(element string) bool { - return element == data.GetInstanceMeta().GetInstanceId() + return element == data }, ) + w.fileWatcherService.SetEnabled(true) w.instanceWatcherService.ReparseConfig(ctx, data) } @@ -157,7 +166,7 @@ func (w *Watcher) handleConfigApplySuccess(ctx context.Context, msg *bus.Message func (w *Watcher) handleRollbackComplete(ctx context.Context, msg *bus.Message) { instanceID, ok := msg.Data.(string) if !ok { - slog.ErrorContext(ctx, "Unable to cast message payload to string", "payload", msg.Data) + slog.ErrorContext(ctx, "Unable to cast message payload to string", "payload", msg.Data, "topic", msg.Topic) return } @@ -168,6 +177,7 @@ func (w *Watcher) handleRollbackComplete(ctx context.Context, msg *bus.Message) return element == instanceID }, ) + w.fileWatcherService.SetEnabled(true) } func (w *Watcher) monitorWatchers(ctx context.Context) { @@ -179,8 +189,9 @@ func (w *Watcher) monitorWatchers(ctx context.Context) { newCtx := context.WithValue(ctx, logger.CorrelationIDContextKey, message.CorrelationID) w.handleInstanceUpdates(newCtx, message) case message := <-w.nginxConfigContextChannel: + newCtx := context.WithValue(ctx, logger.CorrelationIDContextKey, message.CorrelationID) + if !slices.Contains(w.instancesWithConfigApplyInProgress, message.NginxConfigContext.InstanceID) { - newCtx := context.WithValue(ctx, logger.CorrelationIDContextKey, message.CorrelationID) slog.DebugContext( newCtx, "Updated NGINX config context", @@ -190,12 +201,24 @@ func (w *Watcher) monitorWatchers(ctx context.Context) { newCtx, &bus.Message{Topic: bus.NginxConfigUpdateTopic, Data: message.NginxConfigContext}, ) + } else { + slog.DebugContext( + newCtx, + "Not sending updated NGINX config context since config apply is in progress", + "nginx_config_context", message.NginxConfigContext, + ) } case message := <-w.instanceHealthChannel: newCtx := context.WithValue(ctx, logger.CorrelationIDContextKey, message.CorrelationID) w.messagePipe.Process(newCtx, &bus.Message{ Topic: bus.InstanceHealthTopic, Data: message.InstanceHealth, }) + + case message := <-w.fileUpdatesChannel: + newCtx := context.WithValue(ctx, logger.CorrelationIDContextKey, message.CorrelationID) + // Running this in a separate go routine otherwise we get into a deadlock + // since the ReparseConfigs function could add new messages to one of the other watcher channels + go w.instanceWatcherService.ReparseConfigs(newCtx) } } } diff --git a/internal/watcher/watcher_plugin_test.go b/internal/watcher/watcher_plugin_test.go index 39600d6af4..28dcc59616 100644 --- a/internal/watcher/watcher_plugin_test.go +++ b/internal/watcher/watcher_plugin_test.go @@ -10,6 +10,7 @@ import ( "testing" "time" + "github.com/nginx/agent/v3/internal/watcher/health" "github.com/nginx/agent/v3/internal/watcher/instance" "github.com/nginx/agent/v3/internal/watcher/watcherfakes" @@ -61,10 +62,16 @@ func TestWatcher_Init(t *testing.T) { NginxConfigContext: model.GetConfigContext(), } + instanceHealthMessage := health.InstanceHealthMessage{ + CorrelationID: logger.GenerateCorrelationID(), + InstanceHealth: []*mpi.InstanceHealth{}, + } + watcherPlugin.instanceUpdatesChannel <- instanceUpdatesMessage watcherPlugin.nginxConfigContextChannel <- nginxConfigContextMessage + watcherPlugin.instanceHealthChannel <- instanceHealthMessage - assert.Eventually(t, func() bool { return len(messagePipe.GetMessages()) == 4 }, 2*time.Second, 10*time.Millisecond) + assert.Eventually(t, func() bool { return len(messagePipe.GetMessages()) == 5 }, 2*time.Second, 10*time.Millisecond) messages = messagePipe.GetMessages() assert.Equal( @@ -87,6 +94,11 @@ func TestWatcher_Init(t *testing.T) { &bus.Message{Topic: bus.NginxConfigUpdateTopic, Data: nginxConfigContextMessage.NginxConfigContext}, messages[3], ) + assert.Equal( + t, + &bus.Message{Topic: bus.InstanceHealthTopic, Data: instanceHealthMessage.InstanceHealth}, + messages[4], + ) } func TestWatcher_Info(t *testing.T) { @@ -120,7 +132,7 @@ func TestWatcher_Process_ConfigApplySuccessfulTopic(t *testing.T) { data := protos.GetNginxOssInstance([]string{}) message := &bus.Message{ Topic: bus.ConfigApplySuccessfulTopic, - Data: data, + Data: data.GetInstanceMeta().GetInstanceId(), } fakeWatcherService := &watcherfakes.FakeInstanceWatcherServiceInterface{} diff --git a/internal/watcher/watcherfakes/fake_instance_watcher_service_interface.go b/internal/watcher/watcherfakes/fake_instance_watcher_service_interface.go index 55c00d5e6b..cbb484c4f3 100644 --- a/internal/watcher/watcherfakes/fake_instance_watcher_service_interface.go +++ b/internal/watcher/watcherfakes/fake_instance_watcher_service_interface.go @@ -5,16 +5,20 @@ import ( "context" "sync" - v1 "github.com/nginx/agent/v3/api/grpc/mpi/v1" "github.com/nginx/agent/v3/internal/watcher/instance" ) type FakeInstanceWatcherServiceInterface struct { - ReparseConfigStub func(context.Context, *v1.Instance) + ReparseConfigStub func(context.Context, string) reparseConfigMutex sync.RWMutex reparseConfigArgsForCall []struct { arg1 context.Context - arg2 *v1.Instance + arg2 string + } + ReparseConfigsStub func(context.Context) + reparseConfigsMutex sync.RWMutex + reparseConfigsArgsForCall []struct { + arg1 context.Context } WatchStub func(context.Context, chan<- instance.InstanceUpdatesMessage, chan<- instance.NginxConfigContextMessage) watchMutex sync.RWMutex @@ -27,11 +31,11 @@ type FakeInstanceWatcherServiceInterface struct { invocationsMutex sync.RWMutex } -func (fake *FakeInstanceWatcherServiceInterface) ReparseConfig(arg1 context.Context, arg2 *v1.Instance) { +func (fake *FakeInstanceWatcherServiceInterface) ReparseConfig(arg1 context.Context, arg2 string) { fake.reparseConfigMutex.Lock() fake.reparseConfigArgsForCall = append(fake.reparseConfigArgsForCall, struct { arg1 context.Context - arg2 *v1.Instance + arg2 string }{arg1, arg2}) stub := fake.ReparseConfigStub fake.recordInvocation("ReparseConfig", []interface{}{arg1, arg2}) @@ -47,19 +51,51 @@ func (fake *FakeInstanceWatcherServiceInterface) ReparseConfigCallCount() int { return len(fake.reparseConfigArgsForCall) } -func (fake *FakeInstanceWatcherServiceInterface) ReparseConfigCalls(stub func(context.Context, *v1.Instance)) { +func (fake *FakeInstanceWatcherServiceInterface) ReparseConfigCalls(stub func(context.Context, string)) { fake.reparseConfigMutex.Lock() defer fake.reparseConfigMutex.Unlock() fake.ReparseConfigStub = stub } -func (fake *FakeInstanceWatcherServiceInterface) ReparseConfigArgsForCall(i int) (context.Context, *v1.Instance) { +func (fake *FakeInstanceWatcherServiceInterface) ReparseConfigArgsForCall(i int) (context.Context, string) { fake.reparseConfigMutex.RLock() defer fake.reparseConfigMutex.RUnlock() argsForCall := fake.reparseConfigArgsForCall[i] return argsForCall.arg1, argsForCall.arg2 } +func (fake *FakeInstanceWatcherServiceInterface) ReparseConfigs(arg1 context.Context) { + fake.reparseConfigsMutex.Lock() + fake.reparseConfigsArgsForCall = append(fake.reparseConfigsArgsForCall, struct { + arg1 context.Context + }{arg1}) + stub := fake.ReparseConfigsStub + fake.recordInvocation("ReparseConfigs", []interface{}{arg1}) + fake.reparseConfigsMutex.Unlock() + if stub != nil { + fake.ReparseConfigsStub(arg1) + } +} + +func (fake *FakeInstanceWatcherServiceInterface) ReparseConfigsCallCount() int { + fake.reparseConfigsMutex.RLock() + defer fake.reparseConfigsMutex.RUnlock() + return len(fake.reparseConfigsArgsForCall) +} + +func (fake *FakeInstanceWatcherServiceInterface) ReparseConfigsCalls(stub func(context.Context)) { + fake.reparseConfigsMutex.Lock() + defer fake.reparseConfigsMutex.Unlock() + fake.ReparseConfigsStub = stub +} + +func (fake *FakeInstanceWatcherServiceInterface) ReparseConfigsArgsForCall(i int) context.Context { + fake.reparseConfigsMutex.RLock() + defer fake.reparseConfigsMutex.RUnlock() + argsForCall := fake.reparseConfigsArgsForCall[i] + return argsForCall.arg1 +} + func (fake *FakeInstanceWatcherServiceInterface) Watch(arg1 context.Context, arg2 chan<- instance.InstanceUpdatesMessage, arg3 chan<- instance.NginxConfigContextMessage) { fake.watchMutex.Lock() fake.watchArgsForCall = append(fake.watchArgsForCall, struct { @@ -99,6 +135,8 @@ func (fake *FakeInstanceWatcherServiceInterface) Invocations() map[string][][]in defer fake.invocationsMutex.RUnlock() fake.reparseConfigMutex.RLock() defer fake.reparseConfigMutex.RUnlock() + fake.reparseConfigsMutex.RLock() + defer fake.reparseConfigsMutex.RUnlock() fake.watchMutex.RLock() defer fake.watchMutex.RUnlock() copiedInvocations := map[string][][]interface{}{} diff --git a/nginx-agent.conf b/nginx-agent.conf index c89c2f90d2..6ab658ca7c 100644 --- a/nginx-agent.conf +++ b/nginx-agent.conf @@ -15,6 +15,8 @@ watchers: monitoring_frequency: 5s instance_health_watcher: monitoring_frequency: 5s + file_watcher: + monitoring_frequency: 5s data_plane_config: nginx: diff --git a/test/mock/grpc/cmd/main.go b/test/mock/grpc/cmd/main.go index 993c334c8a..620b869f3a 100644 --- a/test/mock/grpc/cmd/main.go +++ b/test/mock/grpc/cmd/main.go @@ -72,7 +72,7 @@ func main() { } } - slog.DebugContext(ctx, "Config directory", "directory", configDirectory) + slog.DebugContext(ctx, "Config directory", "directory", *configDirectory) _, err = grpc.NewMockManagementServer(*apiAddress, agentConfig, configDirectory) if err != nil { diff --git a/test/mock/grpc/mock_management_command_service.go b/test/mock/grpc/mock_management_command_service.go index 0151b58925..b481ec990e 100644 --- a/test/mock/grpc/mock_management_command_service.go +++ b/test/mock/grpc/mock_management_command_service.go @@ -14,6 +14,7 @@ import ( "net" "net/http" "os" + "path" "path/filepath" "strings" "sync" @@ -161,10 +162,7 @@ func (cs *CommandService) Subscribe(in mpi.CommandService_SubscribeServer) error slog.InfoContext(ctx, "Subscribe", "request", request) if upload, ok := request.GetRequest().(*mpi.ManagementPlaneRequest_ConfigUploadRequest); ok { - instanceID := upload.ConfigUploadRequest.GetOverview().GetConfigVersion().GetInstanceId() - overviewFiles := upload.ConfigUploadRequest.GetOverview().GetFiles() - - cs.instanceFiles[instanceID] = overviewFiles + cs.handleConfigUploadRequest(ctx, upload) } err := in.Send(request) @@ -175,6 +173,48 @@ func (cs *CommandService) Subscribe(in mpi.CommandService_SubscribeServer) error } } +func (cs *CommandService) handleConfigUploadRequest( + ctx context.Context, + upload *mpi.ManagementPlaneRequest_ConfigUploadRequest, +) { + instanceID := upload.ConfigUploadRequest.GetOverview().GetConfigVersion().GetInstanceId() + overviewFiles := upload.ConfigUploadRequest.GetOverview().GetFiles() + + if cs.instanceFiles[instanceID] == nil { + cs.instanceFiles[instanceID] = overviewFiles + } else { + filesToDelete := cs.checkForDeletedFiles(instanceID, overviewFiles) + for _, fileToDelete := range filesToDelete { + err := os.Remove(fileToDelete) + if err != nil { + slog.ErrorContext(ctx, "Failed to delete file", "error", err, "path", fileToDelete) + } + } + } +} + +func (cs *CommandService) checkForDeletedFiles(instanceID string, overviewFiles []*mpi.File) []string { + filesToDelete := []string{} + + for _, diskfile := range cs.instanceFiles[instanceID] { + fileIsDeleted := true + + for _, overviewFile := range overviewFiles { + if diskfile.GetFileMeta().GetName() == overviewFile.GetFileMeta().GetName() { + fileIsDeleted = false + break + } + } + + if fileIsDeleted { + fullFilePath := path.Join(cs.configDirectory, instanceID, diskfile.GetFileMeta().GetName()) + filesToDelete = append(filesToDelete, fullFilePath) + } + } + + return filesToDelete +} + func (cs *CommandService) listenForDataPlaneResponses(ctx context.Context, in mpi.CommandService_SubscribeServer) { for { select { @@ -392,6 +432,6 @@ func createFile(fullPath, filePath string) (*mpi.File, error) { }, nil } -func isValidFile(info os.FileInfo, path string) bool { - return !info.IsDir() && !strings.HasSuffix(path, ".DS_Store") +func isValidFile(info os.FileInfo, fileFullPath string) bool { + return !info.IsDir() && !strings.HasSuffix(fileFullPath, ".DS_Store") } diff --git a/test/types/config.go b/test/types/config.go index 8ff8f7384c..d3034cbdea 100644 --- a/test/types/config.go +++ b/test/types/config.go @@ -120,6 +120,9 @@ func AgentConfig() *config.Config { InstanceHealthWatcher: config.InstanceHealthWatcher{ MonitoringFrequency: config.DefInstanceWatcherMonitoringFrequency, }, + FileWatcher: config.FileWatcher{ + MonitoringFrequency: config.DefFileWatcherMonitoringFrequency, + }, }, } } From a787f84aeb205dea3cbb8ff779a2372bd1dfcf15 Mon Sep 17 00:00:00 2001 From: Olli Holmala <85518764+olli-holmala@users.noreply.github.com> Date: Mon, 9 Sep 2024 13:17:47 +0100 Subject: [PATCH 02/24] Introduce the NGINX OSS receiver (#762) --- Makefile | 14 +- go.mod | 387 ++++---- go.sum | 837 +++++++++--------- internal/collector/factories.go | 2 +- internal/collector/nginxossreceiver/doc.go | 8 + .../nginxossreceiver/documentation.md | 63 ++ .../collector/nginxossreceiver/factory.go | 63 ++ .../nginxossreceiver/factory_test.go | 55 ++ .../generated_component_test.go | 69 ++ .../generated_package_test.go | 12 + .../internal/config/config.go | 49 + .../internal/metadata/generated_config.go | 62 ++ .../metadata/generated_config_test.go | 65 ++ .../internal/metadata/generated_metrics.go | 445 ++++++++++ .../metadata/generated_metrics_test.go | 167 ++++ .../internal/metadata/generated_status.go | 16 + .../internal/metadata/package_test.go | 16 + .../internal/metadata/testdata/config.yaml | 21 + .../nginxossreceiver/internal/model/types.go | 26 + .../internal/record/recorder.go | 68 ++ .../internal/record/recorder_test.go | 160 ++++ .../basic-nginx.http.response.status.yaml | 26 + .../multicode-nginx.http.response.status.yaml | 73 ++ .../scraper/accesslog/nginx_log_scraper.go | 182 ++++ .../accesslog/nginx_log_scraper_test.go | 120 +++ .../accesslog/operator/input/file/config.go | 121 +++ .../operator/input/file/config_test.go | 91 ++ .../accesslog/operator/input/file/grok.go | 86 ++ .../operator/input/file/grok_test.go | 190 ++++ .../accesslog/operator/input/file/input.go | 56 ++ .../operator/input/file/input_test.go | 46 + .../scraper/accesslog/testdata/basic.conf | 57 ++ .../scraper/accesslog/testdata/default.conf | 59 ++ .../scraper/accesslog/testdata/expected.yaml | 61 ++ .../scraper/accesslog/testdata/invalid.conf | 58 ++ .../accesslog/testdata/no-log-format.conf | 33 + .../accesslog/testdata/test-access.log | 9 + .../scraper/stubstatus/stub_status_scraper.go | 115 +++ .../stubstatus/stub_status_scraper_test.go | 125 +++ .../scraper/stubstatus/testdata/expected.yaml | 60 ++ .../expected_with_connections_as_gauge.yaml | 63 ++ .../collector/nginxossreceiver/metadata.yaml | 69 ++ .../nginxossreceiver/testdata/config.yaml | 4 + .../testdata/integration/Dockerfile.nginx | 6 + .../testdata/integration/default.conf | 59 ++ .../testdata/integration/expected.yaml | 65 ++ .../internal/metadata/generated_status.go | 3 +- internal/collector/otel_collector_plugin.go | 35 +- .../collector/otel_collector_plugin_test.go | 30 + internal/collector/otelcol.tmpl | 11 +- internal/collector/settings_test.go | 15 +- internal/config/config_test.go | 28 +- internal/config/testdata/nginx-agent.conf | 8 +- internal/config/types.go | 49 +- nginx-agent.conf | 2 +- test/config/collector/test-otelcol.yaml | 6 +- test/load/nginx_agent_process_collector.go | 6 +- test/mock/collector/docker-compose.yaml | 38 +- .../dashboards/nginx-dashboard.json | 121 ++- .../collector/nginx-oss/conf.d/default.conf | 56 ++ test/mock/collector/nginx-oss/nginx.conf | 68 ++ .../{nginx => nginx-plus}/conf.d/default.conf | 0 .../{nginx => nginx-plus}/nginx.conf | 0 63 files changed, 4250 insertions(+), 665 deletions(-) create mode 100644 internal/collector/nginxossreceiver/doc.go create mode 100644 internal/collector/nginxossreceiver/documentation.md create mode 100644 internal/collector/nginxossreceiver/factory.go create mode 100644 internal/collector/nginxossreceiver/factory_test.go create mode 100644 internal/collector/nginxossreceiver/generated_component_test.go create mode 100644 internal/collector/nginxossreceiver/generated_package_test.go create mode 100644 internal/collector/nginxossreceiver/internal/config/config.go create mode 100644 internal/collector/nginxossreceiver/internal/metadata/generated_config.go create mode 100644 internal/collector/nginxossreceiver/internal/metadata/generated_config_test.go create mode 100644 internal/collector/nginxossreceiver/internal/metadata/generated_metrics.go create mode 100644 internal/collector/nginxossreceiver/internal/metadata/generated_metrics_test.go create mode 100644 internal/collector/nginxossreceiver/internal/metadata/generated_status.go create mode 100644 internal/collector/nginxossreceiver/internal/metadata/package_test.go create mode 100644 internal/collector/nginxossreceiver/internal/metadata/testdata/config.yaml create mode 100644 internal/collector/nginxossreceiver/internal/model/types.go create mode 100644 internal/collector/nginxossreceiver/internal/record/recorder.go create mode 100644 internal/collector/nginxossreceiver/internal/record/recorder_test.go create mode 100644 internal/collector/nginxossreceiver/internal/record/testdata/basic-nginx.http.response.status.yaml create mode 100644 internal/collector/nginxossreceiver/internal/record/testdata/multicode-nginx.http.response.status.yaml create mode 100644 internal/collector/nginxossreceiver/internal/scraper/accesslog/nginx_log_scraper.go create mode 100644 internal/collector/nginxossreceiver/internal/scraper/accesslog/nginx_log_scraper_test.go create mode 100644 internal/collector/nginxossreceiver/internal/scraper/accesslog/operator/input/file/config.go create mode 100644 internal/collector/nginxossreceiver/internal/scraper/accesslog/operator/input/file/config_test.go create mode 100644 internal/collector/nginxossreceiver/internal/scraper/accesslog/operator/input/file/grok.go create mode 100644 internal/collector/nginxossreceiver/internal/scraper/accesslog/operator/input/file/grok_test.go create mode 100644 internal/collector/nginxossreceiver/internal/scraper/accesslog/operator/input/file/input.go create mode 100644 internal/collector/nginxossreceiver/internal/scraper/accesslog/operator/input/file/input_test.go create mode 100644 internal/collector/nginxossreceiver/internal/scraper/accesslog/testdata/basic.conf create mode 100644 internal/collector/nginxossreceiver/internal/scraper/accesslog/testdata/default.conf create mode 100644 internal/collector/nginxossreceiver/internal/scraper/accesslog/testdata/expected.yaml create mode 100644 internal/collector/nginxossreceiver/internal/scraper/accesslog/testdata/invalid.conf create mode 100644 internal/collector/nginxossreceiver/internal/scraper/accesslog/testdata/no-log-format.conf create mode 100644 internal/collector/nginxossreceiver/internal/scraper/accesslog/testdata/test-access.log create mode 100644 internal/collector/nginxossreceiver/internal/scraper/stubstatus/stub_status_scraper.go create mode 100644 internal/collector/nginxossreceiver/internal/scraper/stubstatus/stub_status_scraper_test.go create mode 100644 internal/collector/nginxossreceiver/internal/scraper/stubstatus/testdata/expected.yaml create mode 100644 internal/collector/nginxossreceiver/internal/scraper/stubstatus/testdata/expected_with_connections_as_gauge.yaml create mode 100644 internal/collector/nginxossreceiver/metadata.yaml create mode 100644 internal/collector/nginxossreceiver/testdata/config.yaml create mode 100644 internal/collector/nginxossreceiver/testdata/integration/Dockerfile.nginx create mode 100644 internal/collector/nginxossreceiver/testdata/integration/default.conf create mode 100644 internal/collector/nginxossreceiver/testdata/integration/expected.yaml create mode 100644 test/mock/collector/nginx-oss/conf.d/default.conf create mode 100644 test/mock/collector/nginx-oss/nginx.conf rename test/mock/collector/{nginx => nginx-plus}/conf.d/default.conf (100%) rename test/mock/collector/{nginx => nginx-plus}/nginx.conf (100%) diff --git a/Makefile b/Makefile index 9ebe133bef..3d1d7701a0 100644 --- a/Makefile +++ b/Makefile @@ -188,7 +188,7 @@ run-mock-management-grpc-server: ## Run mock management plane gRPC server $(GORUN) test/mock/grpc/cmd/main.go -configDirectory=$(MOCK_MANAGEMENT_PLANE_CONFIG_DIRECTORY) -logLevel=$(MOCK_MANAGEMENT_PLANE_LOG_LEVEL) -grpcAddress=$(MOCK_MANAGEMENT_PLANE_GRPC_ADDRESS) -apiAddress=$(MOCK_MANAGEMENT_PLANE_API_ADDRESS) .PHONY: build-test-plus-image -build-test-plus-image: local-deb-package +build-test-plus-image: $(CONTAINER_BUILDENV) $(CONTAINER_CLITOOL) build -t nginx_plus_$(IMAGE_TAG) . \ --no-cache -f ./scripts/docker/nginx-plus/deb/Dockerfile \ --secret id=nginx-crt,src=$(CERTS_DIR)/nginx-repo.crt \ @@ -198,10 +198,20 @@ build-test-plus-image: local-deb-package --build-arg BASE_IMAGE=$(BASE_IMAGE) \ --build-arg ENTRY_POINT=./scripts/docker/entrypoint.sh +.PHONY: build-test-oss-image +build-test-oss-image: + $(CONTAINER_BUILDENV) $(CONTAINER_CLITOOL) build -t nginx_oss_$(IMAGE_TAG) . \ + --no-cache -f ./scripts/docker/nginx-oss/deb/Dockerfile \ + --target install-agent-local \ + --build-arg PACKAGE_NAME=$(PACKAGE_NAME) \ + --build-arg PACKAGES_REPO=$(OSS_PACKAGES_REPO) \ + --build-arg BASE_IMAGE=$(BASE_IMAGE) \ + --build-arg ENTRY_POINT=./scripts/docker/entrypoint.sh + .PHONY: run-mock-management-otel-collector run-mock-management-otel-collector: ## Run mock management plane OTel collector @echo "๐Ÿš€ Running mock management plane OTel collector" - AGENT_IMAGE=nginx_plus_$(IMAGE_TAG):latest $(CONTAINER_COMPOSE) -f ./test/mock/collector/docker-compose.yaml up -d + AGENT_IMAGE_WITH_NGINX_PLUS=nginx_plus_$(IMAGE_TAG):latest AGENT_IMAGE_WITH_NGINX_OSS=nginx_oss_$(IMAGE_TAG):latest $(CONTAINER_COMPOSE) -f ./test/mock/collector/docker-compose.yaml up -d .PHONY: stop-mock-management-otel-collector stop-mock-management-otel-collector: ## Stop running mock management plane OTel collector diff --git a/go.mod b/go.mod index ca839ae1a9..9ccba384ae 100644 --- a/go.mod +++ b/go.mod @@ -8,104 +8,109 @@ require ( buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.33.0-20240401165935-b983156c5e99.1 github.com/bufbuild/protovalidate-go v0.2.1 github.com/cenkalti/backoff/v4 v4.3.0 - github.com/docker/docker v26.0.0+incompatible + github.com/docker/docker v26.1.4+incompatible github.com/fsnotify/fsnotify v1.7.0 - github.com/go-resty/resty/v2 v2.12.0 + github.com/go-resty/resty/v2 v2.13.1 github.com/google/go-cmp v0.6.0 github.com/google/uuid v1.6.0 github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c github.com/nginxinc/nginx-plus-go-client v1.2.2 + github.com/nginxinc/nginx-prometheus-exporter v1.3.0 github.com/nxadm/tail v1.4.11 - github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/connector/exceptionsconnector v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/connector/grafanacloudconnector v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/connector/routingconnector v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/connector/servicegraphconnector v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/connector/spanmetricsconnector v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/asapauthextension v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/awsproxy v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/basicauthextension v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/bearertokenauthextension v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/headerssetterextension v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.102.0 + github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector v0.105.0 + github.com/open-telemetry/opentelemetry-collector-contrib/connector/exceptionsconnector v0.105.0 + github.com/open-telemetry/opentelemetry-collector-contrib/connector/grafanacloudconnector v0.105.0 + github.com/open-telemetry/opentelemetry-collector-contrib/connector/routingconnector v0.105.0 + github.com/open-telemetry/opentelemetry-collector-contrib/connector/servicegraphconnector v0.105.0 + github.com/open-telemetry/opentelemetry-collector-contrib/connector/spanmetricsconnector v0.105.0 + github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.105.0 + github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.105.0 + github.com/open-telemetry/opentelemetry-collector-contrib/extension/asapauthextension v0.105.0 + github.com/open-telemetry/opentelemetry-collector-contrib/extension/awsproxy v0.105.0 + github.com/open-telemetry/opentelemetry-collector-contrib/extension/basicauthextension v0.105.0 + github.com/open-telemetry/opentelemetry-collector-contrib/extension/bearertokenauthextension v0.105.0 + github.com/open-telemetry/opentelemetry-collector-contrib/extension/headerssetterextension v0.105.0 + github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.105.0 github.com/open-telemetry/opentelemetry-collector-contrib/extension/httpforwarderextension v0.100.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/oauth2clientauthextension v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/dockerobserver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/hostobserver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/k8sobserver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/oidcauthextension v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/sigv4authextension v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/attributesprocessor v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/cumulativetodeltaprocessor v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatorateprocessor v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/filterprocessor v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbyattrsprocessor v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbytraceprocessor v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/k8sattributesprocessor v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/metricsgenerationprocessor v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/metricstransformprocessor v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.102.0 + github.com/open-telemetry/opentelemetry-collector-contrib/extension/oauth2clientauthextension v0.105.0 + github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/dockerobserver v0.105.0 + github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/hostobserver v0.105.0 + github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/k8sobserver v0.105.0 + github.com/open-telemetry/opentelemetry-collector-contrib/extension/oidcauthextension v0.105.0 + github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.105.0 + github.com/open-telemetry/opentelemetry-collector-contrib/extension/sigv4authextension v0.105.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden v0.105.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.105.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza v0.105.0 + github.com/open-telemetry/opentelemetry-collector-contrib/processor/attributesprocessor v0.105.0 + github.com/open-telemetry/opentelemetry-collector-contrib/processor/cumulativetodeltaprocessor v0.105.0 + github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatorateprocessor v0.105.0 + github.com/open-telemetry/opentelemetry-collector-contrib/processor/filterprocessor v0.105.0 + github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbyattrsprocessor v0.105.0 + github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbytraceprocessor v0.105.0 + github.com/open-telemetry/opentelemetry-collector-contrib/processor/k8sattributesprocessor v0.105.0 + github.com/open-telemetry/opentelemetry-collector-contrib/processor/metricsgenerationprocessor v0.105.0 + github.com/open-telemetry/opentelemetry-collector-contrib/processor/metricstransformprocessor v0.105.0 + github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.105.0 github.com/open-telemetry/opentelemetry-collector-contrib/processor/redactionprocessor v0.100.0 github.com/open-telemetry/opentelemetry-collector-contrib/processor/remotetapprocessor v0.100.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourcedetectionprocessor v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/routingprocessor v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/spanprocessor v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/tailsamplingprocessor v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/transformprocessor v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/bigipreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/dockerstatsreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/filelogreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/httpcheckreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sclusterreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8seventsreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sobjectsreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kubeletstatsreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/nginxreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/podmanreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/simpleprometheusreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/syslogreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/tcplogreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/udplogreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/testbed v0.102.0 + github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourcedetectionprocessor v0.105.0 + github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.105.0 + github.com/open-telemetry/opentelemetry-collector-contrib/processor/routingprocessor v0.105.0 + github.com/open-telemetry/opentelemetry-collector-contrib/processor/spanprocessor v0.105.0 + github.com/open-telemetry/opentelemetry-collector-contrib/processor/tailsamplingprocessor v0.105.0 + github.com/open-telemetry/opentelemetry-collector-contrib/processor/transformprocessor v0.105.0 + github.com/open-telemetry/opentelemetry-collector-contrib/receiver/bigipreceiver v0.105.0 + github.com/open-telemetry/opentelemetry-collector-contrib/receiver/dockerstatsreceiver v0.105.0 + github.com/open-telemetry/opentelemetry-collector-contrib/receiver/filelogreceiver v0.105.0 + github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver v0.105.0 + github.com/open-telemetry/opentelemetry-collector-contrib/receiver/httpcheckreceiver v0.105.0 + github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sclusterreceiver v0.105.0 + github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8seventsreceiver v0.105.0 + github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sobjectsreceiver v0.105.0 + github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kubeletstatsreceiver v0.105.0 + github.com/open-telemetry/opentelemetry-collector-contrib/receiver/podmanreceiver v0.105.0 + github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.105.0 + github.com/open-telemetry/opentelemetry-collector-contrib/receiver/simpleprometheusreceiver v0.105.0 + github.com/open-telemetry/opentelemetry-collector-contrib/receiver/syslogreceiver v0.105.0 + github.com/open-telemetry/opentelemetry-collector-contrib/receiver/tcplogreceiver v0.105.0 + github.com/open-telemetry/opentelemetry-collector-contrib/receiver/udplogreceiver v0.105.0 + github.com/open-telemetry/opentelemetry-collector-contrib/testbed v0.105.0 + github.com/shirou/gopsutil/v4 v4.24.6 github.com/spf13/pflag v1.0.5 github.com/stretchr/testify v1.9.0 github.com/testcontainers/testcontainers-go v0.31.0 github.com/trivago/grok v1.0.0 - go.opentelemetry.io/collector/component v0.104.0 - go.opentelemetry.io/collector/config/confighttp v0.104.0 - go.opentelemetry.io/collector/confmap v0.104.0 - go.opentelemetry.io/collector/confmap/converter/expandconverter v0.104.0 - go.opentelemetry.io/collector/confmap/provider/envprovider v0.104.0 - go.opentelemetry.io/collector/confmap/provider/fileprovider v0.104.0 - go.opentelemetry.io/collector/confmap/provider/httpprovider v0.104.0 - go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.104.0 - go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.104.0 - go.opentelemetry.io/collector/connector v0.102.0 - go.opentelemetry.io/collector/connector/forwardconnector v0.102.0 - go.opentelemetry.io/collector/consumer v0.104.0 - go.opentelemetry.io/collector/exporter v0.102.0 - go.opentelemetry.io/collector/exporter/debugexporter v0.102.0 - go.opentelemetry.io/collector/exporter/otlpexporter v0.102.0 - go.opentelemetry.io/collector/exporter/otlphttpexporter v0.102.0 - go.opentelemetry.io/collector/extension v0.104.0 - go.opentelemetry.io/collector/otelcol v0.102.0 - go.opentelemetry.io/collector/pdata v1.11.0 - go.opentelemetry.io/collector/processor v0.103.0 - go.opentelemetry.io/collector/processor/batchprocessor v0.102.0 - go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.102.0 - go.opentelemetry.io/collector/receiver v0.104.0 - go.opentelemetry.io/collector/receiver/nopreceiver v0.104.0 - go.opentelemetry.io/collector/receiver/otlpreceiver v0.104.0 + go.opentelemetry.io/collector/component v0.105.0 + go.opentelemetry.io/collector/config/confighttp v0.105.0 + go.opentelemetry.io/collector/config/configtelemetry v0.105.0 + go.opentelemetry.io/collector/config/configtls v1.12.0 + go.opentelemetry.io/collector/confmap v0.105.0 + go.opentelemetry.io/collector/confmap/converter/expandconverter v0.105.0 + go.opentelemetry.io/collector/confmap/provider/envprovider v0.105.0 + go.opentelemetry.io/collector/confmap/provider/fileprovider v0.105.0 + go.opentelemetry.io/collector/confmap/provider/httpprovider v0.105.0 + go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.105.0 + go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.105.0 + go.opentelemetry.io/collector/connector v0.105.0 + go.opentelemetry.io/collector/connector/forwardconnector v0.105.0 + go.opentelemetry.io/collector/consumer v0.105.0 + go.opentelemetry.io/collector/exporter v0.105.0 + go.opentelemetry.io/collector/exporter/debugexporter v0.105.0 + go.opentelemetry.io/collector/exporter/otlpexporter v0.105.0 + go.opentelemetry.io/collector/exporter/otlphttpexporter v0.105.0 + go.opentelemetry.io/collector/extension v0.105.0 + go.opentelemetry.io/collector/otelcol v0.105.0 + go.opentelemetry.io/collector/pdata v1.12.0 + go.opentelemetry.io/collector/processor v0.105.0 + go.opentelemetry.io/collector/processor/batchprocessor v0.105.0 + go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.105.0 + go.opentelemetry.io/collector/receiver v0.105.0 + go.opentelemetry.io/collector/receiver/nopreceiver v0.105.0 + go.opentelemetry.io/collector/receiver/otlpreceiver v0.105.0 + go.opentelemetry.io/otel v1.28.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 golang.org/x/mod v0.19.0 @@ -114,23 +119,23 @@ require ( ) require ( - bitbucket.org/atlassian/go-asap/v2 v2.8.0 // indirect - cloud.google.com/go/auth v0.4.2 // indirect + bitbucket.org/atlassian/go-asap/v2 v2.9.0 // indirect + cloud.google.com/go/auth v0.5.1 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.2 // indirect - cloud.google.com/go/compute/metadata v0.3.0 // indirect + cloud.google.com/go/compute/metadata v0.4.0 // indirect dario.cat/mergo v1.0.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1 // indirect - github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.2 // indirect - github.com/Azure/azure-sdk-for-go/sdk/internal v1.6.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.5.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.6.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/internal v1.8.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.7.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v4 v4.3.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.2.0 // indirect github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 // indirect - github.com/Code-Hex/go-generics-cache v1.3.1 // indirect + github.com/Code-Hex/go-generics-cache v1.5.1 // indirect github.com/GehirnInc/crypt v0.0.0-20200316065508-bb7000b8a962 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.23.0 // indirect - github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.24.0 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect github.com/Microsoft/hcsshim v0.12.2 // indirect github.com/SermoDigital/jose v0.9.2-0.20180104203859-803625baeddc // indirect github.com/Showmax/go-fqdn v1.0.0 // indirect @@ -139,7 +144,7 @@ require ( github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230512164433-5d1fd1a340c9 // indirect github.com/apache/thrift v0.20.0 // indirect github.com/armon/go-metrics v0.4.1 // indirect - github.com/aws/aws-sdk-go v1.53.11 // indirect + github.com/aws/aws-sdk-go v1.53.16 // indirect github.com/aws/aws-sdk-go-v2 v1.27.0 // indirect github.com/aws/aws-sdk-go-v2/config v1.27.16 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.17.16 // indirect @@ -160,14 +165,14 @@ require ( github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect github.com/chenzhuoyu/iasm v0.9.1 // indirect - github.com/cncf/xds/go v0.0.0-20240318125728-8a4994d93e50 // indirect + github.com/cncf/xds/go v0.0.0-20240423153145-555b57ec207b // indirect github.com/containerd/containerd v1.7.15 // indirect github.com/containerd/log v0.1.0 // indirect - github.com/coreos/go-oidc/v3 v3.10.0 // indirect + github.com/coreos/go-oidc/v3 v3.11.0 // indirect github.com/cpuguy83/dockercfg v0.3.1 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/dennwc/varint v1.0.0 // indirect - github.com/digitalocean/godo v1.109.0 // indirect + github.com/digitalocean/godo v1.117.0 // indirect github.com/distribution/reference v0.6.0 // indirect github.com/docker/go-connections v0.5.0 // indirect github.com/docker/go-units v0.5.0 // indirect @@ -179,10 +184,10 @@ require ( github.com/felixge/httpsnoop v1.0.4 // indirect github.com/gabriel-vasile/mimetype v1.4.3 // indirect github.com/gin-contrib/sse v0.1.0 // indirect - github.com/go-jose/go-jose/v4 v4.0.1 // indirect + github.com/go-jose/go-jose/v4 v4.0.2 // indirect github.com/go-kit/log v0.2.1 // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-openapi/jsonpointer v0.20.2 // indirect @@ -194,7 +199,7 @@ require ( github.com/go-viper/mapstructure/v2 v2.0.0 // indirect github.com/go-zookeeper/zk v1.0.3 // indirect github.com/gobwas/glob v0.2.3 // indirect - github.com/goccy/go-json v0.10.2 // indirect + github.com/goccy/go-json v0.10.3 // indirect github.com/gogo/googleapis v1.4.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-jwt/jwt/v5 v5.2.1 // indirect @@ -209,32 +214,32 @@ require ( github.com/google/s2a-go v0.1.7 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect github.com/googleapis/gax-go/v2 v2.12.4 // indirect - github.com/gophercloud/gophercloud v1.8.0 // indirect + github.com/gophercloud/gophercloud v1.12.0 // indirect github.com/gorilla/mux v1.8.1 // indirect github.com/gorilla/websocket v1.5.1 // indirect - github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd // indirect + github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect - github.com/hashicorp/consul/api v1.28.3 // indirect + github.com/hashicorp/consul/api v1.29.1 // indirect github.com/hashicorp/cronexpr v1.1.2 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-hclog v1.6.3 // indirect github.com/hashicorp/go-immutable-radix v1.3.1 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect - github.com/hashicorp/go-retryablehttp v0.7.4 // indirect + github.com/hashicorp/go-retryablehttp v0.7.7 // indirect github.com/hashicorp/go-rootcerts v1.0.2 // indirect github.com/hashicorp/go-version v1.7.0 // indirect github.com/hashicorp/golang-lru v1.0.2 // indirect github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect github.com/hashicorp/hcl v1.0.0 // indirect - github.com/hashicorp/nomad/api v0.0.0-20240306004928-3e7191ccb702 // indirect + github.com/hashicorp/nomad/api v0.0.0-20240604134157-e73d8bb1140d // indirect github.com/hashicorp/serf v0.10.1 // indirect - github.com/hetznercloud/hcloud-go/v2 v2.6.0 // indirect + github.com/hetznercloud/hcloud-go/v2 v2.9.0 // indirect github.com/iancoleman/strcase v0.3.0 // indirect github.com/imdario/mergo v0.3.16 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/ionos-cloud/sdk-go/v6 v6.1.11 // indirect - github.com/jaegertracing/jaeger v1.57.0 // indirect + github.com/jaegertracing/jaeger v1.59.0 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/jpillora/backoff v1.0.0 // indirect @@ -250,18 +255,16 @@ require ( github.com/leodido/go-syslog/v4 v4.1.0 // indirect github.com/leodido/go-urn v1.4.0 // indirect github.com/leodido/ragel-machinery v0.0.0-20190525184631-5f46317e436b // indirect - github.com/leoluk/perflib_exporter v0.2.1 // indirect github.com/lightstep/go-expohisto v1.0.0 // indirect - github.com/linode/linodego v1.33.0 // indirect + github.com/linode/linodego v1.35.0 // indirect github.com/lufia/plan9stats v0.0.0-20240513124658-fba389f38bae // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/maxbrunsfeld/counterfeiter/v6 v6.8.1 // indirect - github.com/miekg/dns v1.1.58 // indirect + github.com/miekg/dns v1.1.59 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect - github.com/mitchellh/hashstructure/v2 v2.0.2 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/moby/docker-image-spec v1.3.1 // indirect github.com/moby/patternmatcher v0.6.0 // indirect @@ -274,57 +277,56 @@ require ( github.com/mostynb/go-grpc-compression v1.2.3 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect - github.com/nginxinc/nginx-prometheus-exporter v0.11.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opencensusexporter v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/syslogexporter v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/ecsutil v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/proxy v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/docker v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8sconfig v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/kubelet v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/metadataproviders v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchpersignal v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/experimentalmetricmetadata v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/opencensus v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/opencensusreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver v0.102.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opencensusexporter v0.105.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/exporter/syslogexporter v0.105.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter v0.105.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer v0.105.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/ecsutil v0.105.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/proxy v0.105.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.105.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.105.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/docker v0.105.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter v0.105.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8sconfig v0.105.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/kubelet v0.105.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/metadataproviders v0.105.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/pdatautil v0.105.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.105.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchpersignal v0.105.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/experimentalmetricmetadata v0.105.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.105.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.105.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.105.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.105.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.105.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/opencensus v0.105.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.105.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin v0.105.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver v0.105.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/receiver/opencensusreceiver v0.105.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver v0.105.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0 // indirect github.com/openshift/api v3.9.0+incompatible // indirect github.com/openshift/client-go v0.0.0-20210521082421-73d9475a9142 // indirect github.com/openzipkin/zipkin-go v0.4.3 // indirect - github.com/ovh/go-ovh v1.4.3 // indirect - github.com/pelletier/go-toml/v2 v2.2.0 // indirect + github.com/ovh/go-ovh v1.5.1 // indirect + github.com/pelletier/go-toml/v2 v2.2.2 // indirect github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect github.com/pquerna/cachecontrol v0.1.0 // indirect + github.com/prometheus-community/windows_exporter v0.25.1 // indirect github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.54.0 // indirect + github.com/prometheus/common v0.55.0 // indirect github.com/prometheus/common/sigv4 v0.1.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - github.com/prometheus/prometheus v0.51.2-0.20240405174432-b4a973753c6e // indirect + github.com/prometheus/procfs v0.15.1 // indirect + github.com/prometheus/prometheus v0.53.0 // indirect github.com/rs/cors v1.11.0 // indirect github.com/sagikazarmark/locafero v0.4.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect - github.com/scaleway/scaleway-sdk-go v1.0.0-beta.25 // indirect - github.com/shirou/gopsutil/v4 v4.24.5 // indirect + github.com/scaleway/scaleway-sdk-go v1.0.0-beta.27 // indirect github.com/shoenig/go-m1cpu v0.1.6 // indirect github.com/sirupsen/logrus v1.9.3 // indirect github.com/soheilhy/cmux v0.1.5 // indirect @@ -347,53 +349,54 @@ require ( github.com/vultr/govultr/v2 v2.17.2 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/collector v0.104.0 // indirect - go.opentelemetry.io/collector/config/configauth v0.104.0 // indirect - go.opentelemetry.io/collector/config/configcompression v1.11.0 // indirect - go.opentelemetry.io/collector/config/configgrpc v0.104.0 // indirect - go.opentelemetry.io/collector/config/confignet v0.104.0 // indirect - go.opentelemetry.io/collector/config/configopaque v1.11.0 // indirect - go.opentelemetry.io/collector/config/configretry v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.104.0 // indirect - go.opentelemetry.io/collector/config/configtls v0.104.0 // indirect - go.opentelemetry.io/collector/config/internal v0.104.0 // indirect - go.opentelemetry.io/collector/extension/auth v0.104.0 // indirect - go.opentelemetry.io/collector/extension/ballastextension v0.102.0 // indirect - go.opentelemetry.io/collector/extension/zpagesextension v0.102.0 // indirect - go.opentelemetry.io/collector/featuregate v1.11.0 // indirect - go.opentelemetry.io/collector/filter v0.104.0 // indirect - go.opentelemetry.io/collector/semconv v0.104.0 // indirect - go.opentelemetry.io/collector/service v0.102.0 // indirect - go.opentelemetry.io/contrib/config v0.7.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 // indirect - go.opentelemetry.io/contrib/propagators/b3 v1.27.0 // indirect - go.opentelemetry.io/contrib/zpages v0.52.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/bridge/opencensus v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.27.0 // indirect - go.opentelemetry.io/otel/metric v1.27.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/trace v1.27.0 // indirect - go.opentelemetry.io/proto/otlp v1.2.0 // indirect + go.opentelemetry.io/collector v0.105.0 // indirect + go.opentelemetry.io/collector/config/configauth v0.105.0 // indirect + go.opentelemetry.io/collector/config/configcompression v1.12.0 // indirect + go.opentelemetry.io/collector/config/configgrpc v0.105.0 // indirect + go.opentelemetry.io/collector/config/confignet v0.105.0 // indirect + go.opentelemetry.io/collector/config/configopaque v1.12.0 // indirect + go.opentelemetry.io/collector/config/configretry v1.12.0 // indirect + go.opentelemetry.io/collector/config/internal v0.105.0 // indirect + go.opentelemetry.io/collector/extension/auth v0.105.0 // indirect + go.opentelemetry.io/collector/extension/ballastextension v0.105.0 // indirect + go.opentelemetry.io/collector/extension/zpagesextension v0.105.0 // indirect + go.opentelemetry.io/collector/featuregate v1.12.0 // indirect + go.opentelemetry.io/collector/filter v0.105.0 // indirect + go.opentelemetry.io/collector/internal/globalgates v0.105.0 // indirect + go.opentelemetry.io/collector/semconv v0.105.0 // indirect + go.opentelemetry.io/collector/service v0.105.0 // indirect + go.opentelemetry.io/contrib/config v0.8.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 // indirect + go.opentelemetry.io/contrib/propagators/b3 v1.28.0 // indirect + go.opentelemetry.io/contrib/zpages v0.53.0 // indirect + go.opentelemetry.io/otel/bridge/opencensus v1.28.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.4.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.28.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0 // indirect + go.opentelemetry.io/otel/exporters/prometheus v0.50.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.28.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0 // indirect + go.opentelemetry.io/otel/log v0.4.0 // indirect + go.opentelemetry.io/otel/metric v1.28.0 // indirect + go.opentelemetry.io/otel/sdk v1.28.0 // indirect + go.opentelemetry.io/otel/sdk/log v0.4.0 // indirect + go.opentelemetry.io/otel/trace v1.28.0 // indirect + go.opentelemetry.io/proto/otlp v1.3.1 // indirect go.uber.org/atomic v1.11.0 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/arch v0.7.0 // indirect golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect - golang.org/x/oauth2 v0.20.0 // indirect + golang.org/x/oauth2 v0.21.0 // indirect golang.org/x/term v0.22.0 // indirect golang.org/x/time v0.5.0 // indirect golang.org/x/tools v0.23.0 // indirect gonum.org/v1/gonum v0.15.0 // indirect - google.golang.org/api v0.182.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240521202816-d264139d666e // indirect + google.golang.org/api v0.183.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240701130421-f6361c86f094 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240711142825-46eb208f015d // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect @@ -404,7 +407,7 @@ require ( k8s.io/apimachinery v0.29.3 // indirect k8s.io/client-go v0.29.3 // indirect k8s.io/klog/v2 v2.120.1 // indirect - k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 // indirect + k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 // indirect k8s.io/kubelet v0.29.3 // indirect k8s.io/utils v0.0.0-20240502163921-fe8a2dddb1d0 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect @@ -418,15 +421,15 @@ require ( github.com/nginxinc/nginx-go-crossplane v0.4.46 github.com/prometheus/client_golang v1.19.1 // indirect github.com/samber/slog-gin v1.11.0 - github.com/shirou/gopsutil/v3 v3.24.4 - github.com/spf13/cobra v1.8.0 - github.com/spf13/viper v1.18.2 + github.com/shirou/gopsutil/v3 v3.24.5 + github.com/spf13/cobra v1.8.1 + github.com/spf13/viper v1.19.0 github.com/vardius/message-bus v1.1.5 - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.28.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.28.0 golang.org/x/crypto v0.25.0 // indirect golang.org/x/net v0.27.0 // indirect golang.org/x/sys v0.22.0 // indirect golang.org/x/text v0.16.0 // indirect - google.golang.org/grpc v1.64.0 + google.golang.org/grpc v1.65.0 ) diff --git a/go.sum b/go.sum index 590389ec34..51473e8af9 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -bitbucket.org/atlassian/go-asap/v2 v2.8.0 h1:JL4jktrZT3H8GHkkeJ1RCdhJ5YcOyVccA/2TJ4ae3I0= -bitbucket.org/atlassian/go-asap/v2 v2.8.0/go.mod h1:cuRgWb7eeGtsocKmqY2kPlMMlwpkeNh+QOIkjAMlUBc= +bitbucket.org/atlassian/go-asap/v2 v2.9.0 h1:ANKtdq/Q8w8RqTaJKIJitS+INbsOKeVv38iArFHWx0Q= +bitbucket.org/atlassian/go-asap/v2 v2.9.0/go.mod h1:cuRgWb7eeGtsocKmqY2kPlMMlwpkeNh+QOIkjAMlUBc= buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.33.0-20240401165935-b983156c5e99.1 h1:2IGhRovxlsOIQgx2ekZWo4wTPAYpck41+18ICxs37is= buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.33.0-20240401165935-b983156c5e99.1/go.mod h1:Tgn5bgL220vkFOI0KPStlcClPeOJzAv4uT+V8JXGUnw= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= @@ -17,8 +17,8 @@ cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKV cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go/auth v0.4.2 h1:sb0eyLkhRtpq5jA+a8KWw0W70YcdVca7KJ8TM0AFYDg= -cloud.google.com/go/auth v0.4.2/go.mod h1:Kqvlz1cf1sNA0D+sYJnkPQOP+JMHkuHeIgVmCRtZOLc= +cloud.google.com/go/auth v0.5.1 h1:0QNO7VThG54LUzKiQxv8C6x1YX7lUrzlAa1nVLF8CIw= +cloud.google.com/go/auth v0.5.1/go.mod h1:vbZT8GjzDf3AVqCcQmqeeM32U9HBFc32vVVAbwDsa6s= cloud.google.com/go/auth/oauth2adapt v0.2.2 h1:+TTV8aXpjeChS9M+aTtN/TjdQnzJvmzKFt//oWu7HX4= cloud.google.com/go/auth/oauth2adapt v0.2.2/go.mod h1:wcYjgpZI9+Yu7LyYBg4pqSiaRkfEK3GQcpb7C/uyF1Q= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= @@ -27,8 +27,8 @@ cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvf cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2QxYC4trgAKZc= -cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= +cloud.google.com/go/compute/metadata v0.4.0 h1:vHzJCWaM4g8XIcm8kopr3XmDA4Gy/lblD3EhhSux05c= +cloud.google.com/go/compute/metadata v0.4.0/go.mod h1:SIQh1Kkb4ZJ8zJ874fqVkslA29PRXuleyj6vOzlbK7M= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= @@ -47,12 +47,12 @@ github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9 github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1 h1:E+OJmp2tPvt1W+amx48v1eqbjDYsgN+RzP4q16yV5eM= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1/go.mod h1:a6xsAQUZg+VsS3TJ05SRp524Hs4pZ/AeFSr5ENf0Yjo= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.2 h1:FDif4R1+UUR+00q6wquyX90K7A8dN+R5E8GEadoP7sU= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.2/go.mod h1:aiYBYui4BJ/BJCAIKs92XiPyQfTaBWqvHujDwKb6CBU= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.6.0 h1:sUFnFjzDUie80h24I7mrKtwCKgLY9L8h5Tp2x9+TWqk= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.6.0/go.mod h1:52JbnQTp15qg5mRkMBHwp0j0ZFwHJ42Sx3zVV5RE9p0= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.5.0 h1:MxA59PGoCFb+vCwRQi3PhQEwHj4+r2dhuv9HG+vM7iM= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.5.0/go.mod h1:uYt4CfhkJA9o0FN7jfE5minm/i4nUE4MjGUJkzB6Zs8= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.6.0 h1:U2rTu3Ef+7w9FHKIAXM6ZyqF3UOWJZ12zIm8zECAFfg= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.6.0/go.mod h1:9kIvujWAA58nmPmWB1m23fyWic1kYZMxD9CxaWn4Qpg= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.8.0 h1:jBQA3cKT4L2rWMpgE7Yt3Hwh2aUj8KXjIGLxjHeYNNo= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.8.0/go.mod h1:4OG6tQ9EOP/MT0NMjDlRzWoVFxfu9rN9B2X+tlSVktg= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.7.0 h1:LkHbJbgF3YyvC53aqYGR+wWQDn2Rdp9AQdGndf9QvY4= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.7.0/go.mod h1:QyiQdW4f4/BIfB8ZutZ2s+28RAgfa/pT+zS++ZHyM1I= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v2 v2.0.0 h1:PTFGRSlMKCQelWwxUyYVEUqseBJVemLyqWJjvMyt0do= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v2 v2.0.0/go.mod h1:LRr2FzBTQlONPPa5HREE5+RjSCTXl7BwOvYOaWTqCaI= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v4 v4.3.0 h1:bXwSugBiSbgtz7rOtbfGf+woewp4f06orW9OP5BjHLA= @@ -72,17 +72,17 @@ github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 h1:XHOnouVk1mx github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/Code-Hex/go-generics-cache v1.3.1 h1:i8rLwyhoyhaerr7JpjtYjJZUcCbWOdiYO3fZXLiEC4g= -github.com/Code-Hex/go-generics-cache v1.3.1/go.mod h1:qxcC9kRVrct9rHeiYpFWSoW1vxyillCVzX13KZG8dl4= +github.com/Code-Hex/go-generics-cache v1.5.1 h1:6vhZGc5M7Y/YD8cIUcY8kcuQLB4cHR7U+0KMqAA0KcU= +github.com/Code-Hex/go-generics-cache v1.5.1/go.mod h1:qxcC9kRVrct9rHeiYpFWSoW1vxyillCVzX13KZG8dl4= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/GehirnInc/crypt v0.0.0-20200316065508-bb7000b8a962 h1:KeNholpO2xKjgaaSyd+DyQRrsQjhbSeS7qe4nEw8aQw= github.com/GehirnInc/crypt v0.0.0-20200316065508-bb7000b8a962/go.mod h1:kC29dT1vFpj7py2OvG1khBdQpo3kInWP+6QipLbdngo= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.23.0 h1:yRhWveg9NbJcJYoJL4FoSauT2dxnt4N9MIAJ7tvU/mQ= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.23.0/go.mod h1:p2puVVSKjQ84Qb1gzw2XHLs34WQyHTYFZLaVxypAFYs= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.24.0 h1:N4xzkSD2BkRwEZSPf3C2eUZxjS5trpo4gOwRh8mu+BA= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.24.0/go.mod h1:p2puVVSKjQ84Qb1gzw2XHLs34WQyHTYFZLaVxypAFYs= github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM= github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/Microsoft/hcsshim v0.12.2 h1:AcXy+yfRvrx20g9v7qYaJv5Rh+8GaHOS6b8G6Wx/nKs= github.com/Microsoft/hcsshim v0.12.2/go.mod h1:RZV12pcHCXQ42XnlQ3pz6FZfmrC1C+R4gaOHhRNML1g= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= @@ -93,8 +93,6 @@ github.com/SermoDigital/jose v0.9.2-0.20180104203859-803625baeddc h1:MhBvG7RLaLq github.com/SermoDigital/jose v0.9.2-0.20180104203859-803625baeddc/go.mod h1:ARgCUhI1MHQH+ONky/PAtmVHQrP5JlGY0F3poXOp/fA= github.com/Showmax/go-fqdn v1.0.0 h1:0rG5IbmVliNT5O19Mfuvna9LL7zlHyRfsSvBPZmF9tM= github.com/Showmax/go-fqdn v1.0.0/go.mod h1:SfrFBzmDCtCGrnHhoDjuvFnKsWjEQX/Q9ARZvOrJAko= -github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= -github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= github.com/alecthomas/assert/v2 v2.3.0 h1:mAsH2wmvjsuvyBvAmCtm7zFsBlb8mIHx5ySLVdDZXL0= github.com/alecthomas/assert/v2 v2.3.0/go.mod h1:pXcQ2Asjp247dahGEmsZ6ru0UVwnkhktn7S0bBDLxvQ= github.com/alecthomas/participle/v2 v2.1.1 h1:hrjKESvSqGHzRb4yW1ciisFJ4p3MGYih6icjJvbsmV8= @@ -120,8 +118,8 @@ github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/aws/aws-sdk-go v1.53.11 h1:KcmduYvX15rRqt4ZU/7jKkmDxU/G87LJ9MUI0yQJh00= -github.com/aws/aws-sdk-go v1.53.11/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= +github.com/aws/aws-sdk-go v1.53.16 h1:8oZjKQO/ml1WLUZw5hvF7pvYjPf8o9f57Wldoy/q9Qc= +github.com/aws/aws-sdk-go v1.53.16/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= github.com/aws/aws-sdk-go-v2 v1.27.0 h1:7bZWKoXhzI+mMR/HjdMx8ZCC5+6fY0lS5tr0bbgiLlo= github.com/aws/aws-sdk-go-v2 v1.27.0/go.mod h1:ffIFB97e2yNsv4aTSGkqtHnppsIJzw7G7BReUZ3jCXM= github.com/aws/aws-sdk-go-v2/config v1.27.16 h1:knpCuH7laFVGYTNd99Ns5t+8PuRjDn4HnnZK48csipM= @@ -186,17 +184,17 @@ github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6D github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/xds/go v0.0.0-20240318125728-8a4994d93e50 h1:DBmgJDC9dTfkVyGgipamEh2BpGYxScCH1TOF1LL1cXc= -github.com/cncf/xds/go v0.0.0-20240318125728-8a4994d93e50/go.mod h1:5e1+Vvlzido69INQaVO6d87Qn543Xr6nooe9Kz7oBFM= +github.com/cncf/xds/go v0.0.0-20240423153145-555b57ec207b h1:ga8SEFjZ60pxLcmhnThWgvH2wg8376yUJmPhEH4H3kw= +github.com/cncf/xds/go v0.0.0-20240423153145-555b57ec207b/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= github.com/containerd/containerd v1.7.15 h1:afEHXdil9iAm03BmhjzKyXnnEBtjaLJefdU7DV0IFes= github.com/containerd/containerd v1.7.15/go.mod h1:ISzRRTMF8EXNpJlTzyr2XMhN+j9K302C21/+cr3kUnY= github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= -github.com/coreos/go-oidc/v3 v3.10.0 h1:tDnXHnLyiTVyT/2zLDGj09pFPkhND8Gl8lnTRhoEaJU= -github.com/coreos/go-oidc/v3 v3.10.0/go.mod h1:5j11xcw0D3+SGxn6Z/WFADsgcWVMyNAlSQupk0KK3ac= +github.com/coreos/go-oidc/v3 v3.11.0 h1:Ia3MxdwpSw702YW0xgfmP1GVCMA9aEFWu12XUZ3/OtI= +github.com/coreos/go-oidc/v3 v3.11.0/go.mod h1:gE3LgjOgFoHi9a4ce4/tJczr0Ai2/BoDhf0r5lltWI0= github.com/cpuguy83/dockercfg v0.3.1 h1:/FpZ+JaygUR/lZP2NlFI2DVfrOEMAIKP5wWEJdoYe9E= github.com/cpuguy83/dockercfg v0.3.1/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= -github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= @@ -206,14 +204,14 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dennwc/varint v1.0.0 h1:kGNFFSSw8ToIy3obO/kKr8U9GZYUAxQEVuix4zfDWzE= github.com/dennwc/varint v1.0.0/go.mod h1:hnItb35rvZvJrbTALZtY/iQfDs48JKRG1RPpgziApxA= -github.com/digitalocean/godo v1.109.0 h1:4W97RJLJSUQ3veRZDNbp1Ol3Rbn6Lmt9bKGvfqYI5SU= -github.com/digitalocean/godo v1.109.0/go.mod h1:R6EmmWI8CT1+fCtjWY9UCB+L5uufuZH13wk3YhxycCs= +github.com/digitalocean/godo v1.117.0 h1:WVlTe09melDYTd7VCVyvHcNWbgB+uI1O115+5LOtdSw= +github.com/digitalocean/godo v1.117.0/go.mod h1:Vk0vpCot2HOAJwc5WE8wljZGtJ3ZtWIc8MQ8rF38sdo= github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/docker/docker v26.0.0+incompatible h1:Ng2qi+gdKADUa/VM+6b6YaY2nlZhk/lVJiKR/2bMudU= -github.com/docker/docker v26.0.0+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v26.1.4+incompatible h1:vuTpXDuoga+Z38m1OZHzl7NKisKWaWlhjQk7IDPSLsU= +github.com/docker/docker v26.1.4+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= @@ -260,12 +258,10 @@ github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SU github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-jose/go-jose/v4 v4.0.1 h1:QVEPDE3OluqXBQZDcnNvQrInro2h0e4eqNbnZSWqS6U= -github.com/go-jose/go-jose/v4 v4.0.1/go.mod h1:WVf9LFMHh/QVrmqrOfqun0C45tMe3RoiKJMPvgWwLfY= +github.com/go-jose/go-jose/v4 v4.0.2 h1:R3l3kkBds16bO7ZFAEEcofK0MkrAJt3jlJznWZG0nvk= +github.com/go-jose/go-jose/v4 v4.0.2/go.mod h1:WVf9LFMHh/QVrmqrOfqun0C45tMe3RoiKJMPvgWwLfY= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.13.0 h1:OoneCcHKHQ03LfBpoQCUfCluwd2Vt3ohz+kvbJneZAU= -github.com/go-kit/kit v0.13.0/go.mod h1:phqEHMMUbyrCFCTgH48JueqrM3md2HcAZ8N3XE4FKDg= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= @@ -278,8 +274,8 @@ github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7 github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= @@ -307,8 +303,8 @@ github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJn github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= github.com/go-playground/validator/v10 v10.19.0 h1:ol+5Fu+cSq9JD7SoSqe04GMI92cbn0+wvQ3bZ8b/AU4= github.com/go-playground/validator/v10 v10.19.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= -github.com/go-resty/resty/v2 v2.12.0 h1:rsVL8P90LFvkUYq/V5BTVe203WfRIU4gvcf+yfzJzGA= -github.com/go-resty/resty/v2 v2.12.0/go.mod h1:o0yGPrkS3lOe1+eFajk6kBW8ScXzwU3hD69/gt2yB/0= +github.com/go-resty/resty/v2 v2.13.1 h1:x+LHXBI2nMB1vqndymf26quycC4aggYJ7DECYbiz03g= +github.com/go-resty/resty/v2 v2.13.1/go.mod h1:GznXlLxkq6Nh4sU59rPmUw3VtgpO3aS96ORAI6Q7d+0= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= @@ -318,8 +314,8 @@ github.com/go-zookeeper/zk v1.0.3 h1:7M2kwOsc//9VeeFiPtf+uSJlVpU66x9Ba5+8XK7/TDg github.com/go-zookeeper/zk v1.0.3/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= -github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= -github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA= +github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= @@ -378,7 +374,6 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= @@ -397,8 +392,8 @@ github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20240227163752-401108e1b7e7 h1:y3N7Bm7Y9/CtpiVkw/ZWj6lSlDF3F74SfKwfTCer72Q= -github.com/google/pprof v0.0.0-20240227163752-401108e1b7e7/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= +github.com/google/pprof v0.0.0-20240528025155-186aa0362fba h1:ql1qNgCyOB7iAEk8JTNM+zJrgIbnyCKX/wdlyPufP5g= +github.com/google/pprof v0.0.0-20240528025155-186aa0362fba/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= @@ -414,17 +409,17 @@ github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5m github.com/googleapis/gax-go/v2 v2.12.4 h1:9gWcmF85Wvq4ryPFvGFaOgPIs1AQX0d0bcbGw4Z96qg= github.com/googleapis/gax-go/v2 v2.12.4/go.mod h1:KYEYLorsnIGDi/rPC8b5TdlB9kbKoFubselGIoBMCwI= github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= -github.com/gophercloud/gophercloud v1.8.0 h1:TM3Jawprb2NrdOnvcHhWJalmKmAmOGgfZElM/3oBYCk= -github.com/gophercloud/gophercloud v1.8.0/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfgzxRcNupUfxZbBNDM= -github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= -github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= +github.com/gophercloud/gophercloud v1.12.0 h1:Jrz16vPAL93l80q16fp8NplrTCp93y7rZh2P3Q4Yq7g= +github.com/gophercloud/gophercloud v1.12.0/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfgzxRcNupUfxZbBNDM= +github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyEE= +github.com/gorilla/handlers v1.5.2/go.mod h1:dX+xVpaxdSw+q0Qek8SSsl3dfMk3jNddUkMzo0GtH0w= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= -github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd h1:PpuIBO5P3e9hpqBD0O/HjhShYuM6XE0i/lbE6J94kww= -github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd/go.mod h1:M5qHK+eWfAv8VR/265dIuEpL3fNfeC21tXXp9itM24A= +github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc h1:GN2Lv3MGO7AS6PrRoT6yV5+wkrOpcszoIsO4+4ds248= +github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc/go.mod h1:+JKpmjMGhpgPL+rXZ5nsZieVzvarn86asRlBg4uNGnk= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= @@ -432,12 +427,12 @@ github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 h1:pRhl55Yx1eC7BZ1N+BBWwn github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0/go.mod h1:XKMd7iuf/RGPSMJ/U4HP0zS2Z9Fh8Ps9a+6X26m/tmI= github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0= github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k= -github.com/hashicorp/consul/api v1.28.3 h1:IE06LST/knnCQ+cxcvzyXRF/DetkgGhJoaOFd4l9xkk= -github.com/hashicorp/consul/api v1.28.3/go.mod h1:7AGcUFu28HkgOKD/GmsIGIFzRTmN0L02AE9Thsr2OhU= +github.com/hashicorp/consul/api v1.29.1 h1:UEwOjYJrd3lG1x5w7HxDRMGiAUPrb3f103EoeKuuEcc= +github.com/hashicorp/consul/api v1.29.1/go.mod h1:lumfRkY/coLuqMICkI7Fh3ylMG31mQSRZyef2c5YvJI= github.com/hashicorp/consul/proto-public v0.6.1 h1:+uzH3olCrksXYWAYHKqK782CtK9scfqH+Unlw3UHhCg= github.com/hashicorp/consul/proto-public v0.6.1/go.mod h1:cXXbOg74KBNGajC+o8RlA502Esf0R9prcoJgiOX/2Tg= -github.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU= -github.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo= +github.com/hashicorp/consul/sdk v0.16.1 h1:V8TxTnImoPD5cj0U9Spl0TUxcytjcbbJeADFF07KdHg= +github.com/hashicorp/consul/sdk v0.16.1/go.mod h1:fSXvwxB2hmh1FMZCNl6PwX0Q/1wdWtHJcZ7Ea5tns0s= github.com/hashicorp/cronexpr v1.1.2 h1:wG/ZYIKT+RT3QkOdgYc+xsKWVRgnxJ1OJtjjy84fJ9A= github.com/hashicorp/cronexpr v1.1.2/go.mod h1:P4wA0KBl9C5q2hABiMO7cp6jcIg96CDh1Efb3g1PWA4= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -446,7 +441,6 @@ github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brv github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= @@ -460,8 +454,8 @@ github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+ github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= -github.com/hashicorp/go-retryablehttp v0.7.4 h1:ZQgVdpTdAL7WpMIwLzCfbalOcSUdkDZnpUv3/+BxzFA= -github.com/hashicorp/go-retryablehttp v0.7.4/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= +github.com/hashicorp/go-retryablehttp v0.7.7 h1:C8hUCYzor8PIfXHa4UrZkU4VvK8o9ISHxT2Q8+VepXU= +github.com/hashicorp/go-retryablehttp v0.7.7/go.mod h1:pkQpWZeYWskR+D1tR2O5OcBFOxfA7DoAO6xtkuQnHTk= github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= @@ -486,12 +480,12 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= github.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM= github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= -github.com/hashicorp/nomad/api v0.0.0-20240306004928-3e7191ccb702 h1:fI1LXuBaS1d9z1kmb++Og6YD8uMRwadXorCwE+xgOFA= -github.com/hashicorp/nomad/api v0.0.0-20240306004928-3e7191ccb702/go.mod h1:z71gkJdrkAt/Rl6C7Q79VE7AwJ5lUF+M+fzFTyIHYB0= +github.com/hashicorp/nomad/api v0.0.0-20240604134157-e73d8bb1140d h1:KHq+mAzWSkumj4PDoXc5VZbycPGcmYu8tohgVLQ6SIc= +github.com/hashicorp/nomad/api v0.0.0-20240604134157-e73d8bb1140d/go.mod h1:svtxn6QnrQ69P23VvIWMR34tg3vmwLz4UdUzm1dSCgE= github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY= github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= -github.com/hetznercloud/hcloud-go/v2 v2.6.0 h1:RJOA2hHZ7rD1pScA4O1NF6qhkHyUdbbxjHgFNot8928= -github.com/hetznercloud/hcloud-go/v2 v2.6.0/go.mod h1:4J1cSE57+g0WS93IiHLV7ubTHItcp+awzeBp5bM9mfA= +github.com/hetznercloud/hcloud-go/v2 v2.9.0 h1:s0N6R7Zoi2DPfMtUF5o9VeUBzTtHVY6MIkHOQnfu/AY= +github.com/hetznercloud/hcloud-go/v2 v2.9.0/go.mod h1:qtW/TuU7Bs16ibXl/ktJarWqU2LwHr7eGlwoilHxtgg= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= @@ -505,8 +499,8 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2 github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/ionos-cloud/sdk-go/v6 v6.1.11 h1:J/uRN4UWO3wCyGOeDdMKv8LWRzKu6UIkLEaes38Kzh8= github.com/ionos-cloud/sdk-go/v6 v6.1.11/go.mod h1:EzEgRIDxBELvfoa/uBN0kOQaqovLjUWEB7iW4/Q+t4k= -github.com/jaegertracing/jaeger v1.57.0 h1:3wDtUUPs6NRYH7+d+y8MilDkLHdpPrVlQ2wbcsA62bs= -github.com/jaegertracing/jaeger v1.57.0/go.mod h1:p/1fxIU9hKHl7qEhKC72p2ZYVhvvZvNB73y6V7YyuTs= +github.com/jaegertracing/jaeger v1.59.0 h1:p9/nJxdoCxq4NSgVN8P0aDqlGSfxFaggpNfLwhqQZRc= +github.com/jaegertracing/jaeger v1.59.0/go.mod h1:IZeUGtxNIYWGD3PVI4mqAn2IWVrfGdfswB8XK0mzZ0w= github.com/jarcoal/httpmock v1.3.1 h1:iUx3whfZWVf3jT01hQTO/Eo5sAYtB2/rqaUuOtpInww= github.com/jarcoal/httpmock v1.3.1/go.mod h1:3yb8rc4BI7TCBhFY8ng0gjuLKJNquuDNiPaZjnENuYg= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= @@ -565,13 +559,10 @@ github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= github.com/leodido/ragel-machinery v0.0.0-20190525184631-5f46317e436b h1:11UHH39z1RhZ5dc4y4r/4koJo6IYFgTRMe/LlwRTEw0= github.com/leodido/ragel-machinery v0.0.0-20190525184631-5f46317e436b/go.mod h1:WZxr2/6a/Ar9bMDc2rN/LJrE/hF6bXE4LPyDSIxwAfg= -github.com/leoluk/perflib_exporter v0.2.1 h1:/3/ut1k/jFt5p4ypjLZKDHDqlXAK6ERZPVWtwdI389I= -github.com/leoluk/perflib_exporter v0.2.1/go.mod h1:MinSWm88jguXFFrGsP56PtleUb4Qtm4tNRH/wXNXRTI= github.com/lightstep/go-expohisto v1.0.0 h1:UPtTS1rGdtehbbAF7o/dhkWLTDI73UifG8LbfQI7cA4= github.com/lightstep/go-expohisto v1.0.0/go.mod h1:xDXD0++Mu2FOaItXtdDfksfgxfV0z1TMPa+e/EUd0cs= -github.com/linode/linodego v1.33.0 h1:cX2FYry7r6CA1ujBMsdqiM4VhvIQtnWsOuVblzfBhCw= -github.com/linode/linodego v1.33.0/go.mod h1:dSJJgIwqZCF5wnpuC6w5cyIbRtcexAm7uVvuJopGB40= -github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= +github.com/linode/linodego v1.35.0 h1:rIhUeCHBLEDlkoRnOTwzSGzljQ3ksXwLxacmXnrV+Do= +github.com/linode/linodego v1.35.0/go.mod h1:JxuhOEAMfSxun6RU5/MgTKH2GGTmFrhKRj3wL1NFin0= github.com/lufia/plan9stats v0.0.0-20240513124658-fba389f38bae h1:dIZY4ULFcto4tAFlj1FYZl8ztUZ13bdq+PLY+NOfbyI= github.com/lufia/plan9stats v0.0.0-20240513124658-fba389f38bae/go.mod h1:ilwx/Dta8jXAgpFYFvSWEMwxmbWXyiUHkd5FwyKhb5k= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= @@ -603,8 +594,8 @@ github.com/maxbrunsfeld/counterfeiter/v6 v6.8.1 h1:NicmruxkeqHjDv03SfSxqmaLuisdd github.com/maxbrunsfeld/counterfeiter/v6 v6.8.1/go.mod h1:eyp4DdUJAKkr9tvxR3jWhw2mDK7CWABMG5r9uyaKC7I= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -github.com/miekg/dns v1.1.58 h1:ca2Hdkz+cDg/7eNF6V56jjzuZ4aCAE+DbVkILdQWG/4= -github.com/miekg/dns v1.1.58/go.mod h1:Ypv+3b/KadlvW9vJfXOTf300O4UqaHFzFCuHz+rPkBY= +github.com/miekg/dns v1.1.59 h1:C9EXc/UToRwKLhK5wKU/I4QVsBUc8kE6MkHBkeypWZs= +github.com/miekg/dns v1.1.59/go.mod h1:nZpewl5p6IvctfgrckopVx2OlSEHPRO/U4SYkRklrEk= github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= @@ -612,8 +603,6 @@ github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= -github.com/mitchellh/hashstructure/v2 v2.0.2 h1:vGKWl0YJqUNxE8d+h8f6NJLcCJrgbhC4NcD46KavDd4= -github.com/mitchellh/hashstructure/v2 v2.0.2/go.mod h1:MG3aRVU/N29oo/V/IhBX8GR/zz4kQkprJgF2EVszyDE= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c h1:cqn374mizHuIWj+OSJCajGr/phAmuMug9qIX3l9CflE= @@ -653,8 +642,8 @@ github.com/nginxinc/nginx-go-crossplane v0.4.46 h1:QsmhZRHkl2IcPjqjbLB8s55ViH0u5 github.com/nginxinc/nginx-go-crossplane v0.4.46/go.mod h1:UzbZnyFv0vPlt1Urbnp/mrFCzBL4tYCReFuNBpFQEfI= github.com/nginxinc/nginx-plus-go-client v1.2.2 h1:sl7HqNDDZq2EVu0eQQVoZ6PKYGa4h2dB/Qr5Ib0YKGw= github.com/nginxinc/nginx-plus-go-client v1.2.2/go.mod h1:n8OFLzrJulJ2fur28Cwa1Qp5DZNS2VicLV+Adt30LQ4= -github.com/nginxinc/nginx-prometheus-exporter v0.11.0 h1:21xjnqNgxtni2jDgAQ90bl15uDnrTreO9sIlu1YsX/U= -github.com/nginxinc/nginx-prometheus-exporter v0.11.0/go.mod h1:GdyHnWAb8q8OW1Pssrrqbcqra0SH0Vn6UXICMmyWkw8= +github.com/nginxinc/nginx-prometheus-exporter v1.3.0 h1:1JtdxsZH0Uwhu1nL/j/QyOXytP5V5j68AEo2X+DFWb0= +github.com/nginxinc/nginx-prometheus-exporter v1.3.0/go.mod h1:hXoH+X6aIKSyQuO6QTIiPKH3eZyxqy/wW8GYiE3dflU= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY= github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc= @@ -670,188 +659,188 @@ github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGV github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8= github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= -github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector v0.102.0 h1:wbUiw/mleJpXO36Ybk2olxTlbXJHNt9fZREa5Sfsmhc= -github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector v0.102.0/go.mod h1:JH3BWSG+JElBzWQDBvZB9nQSu9BIrMJ7hT8b/tWvAhQ= -github.com/open-telemetry/opentelemetry-collector-contrib/connector/exceptionsconnector v0.102.0 h1:H/NmcYvt10nNN0atZAZ1gY5T1b4/eF1CJgXaWblN/oI= -github.com/open-telemetry/opentelemetry-collector-contrib/connector/exceptionsconnector v0.102.0/go.mod h1:rPZy/Gy2zNPyntutyJUsqplHhxdzrxrA6vBjLptfuiQ= -github.com/open-telemetry/opentelemetry-collector-contrib/connector/grafanacloudconnector v0.102.0 h1:N0FK3CDNYB8lBVVrzZO8hxTrnM7HeFARXYxs4hOuWFI= -github.com/open-telemetry/opentelemetry-collector-contrib/connector/grafanacloudconnector v0.102.0/go.mod h1:ZLJLF7RtlcfS7JTGxOG5MHskGrPFm6LhpWjHyrpJ7F8= -github.com/open-telemetry/opentelemetry-collector-contrib/connector/routingconnector v0.102.0 h1:Pe8mD+tVvETjLka2bZteb3Qux+1wfg9gAt8b7Tg4eYI= -github.com/open-telemetry/opentelemetry-collector-contrib/connector/routingconnector v0.102.0/go.mod h1:4EwWs9G8DRS9k9TIg8yamd6bLeMBRBza2OnmD4ByKGo= -github.com/open-telemetry/opentelemetry-collector-contrib/connector/servicegraphconnector v0.102.0 h1:DBCse+NEfHnXZGBhRWTRPf0ddAYTKeSDjEr5GhtYBkc= -github.com/open-telemetry/opentelemetry-collector-contrib/connector/servicegraphconnector v0.102.0/go.mod h1:pnQ8+ilovHRomBKp+/enHVuTw7wC83DAG3KG8Z/LmeM= -github.com/open-telemetry/opentelemetry-collector-contrib/connector/spanmetricsconnector v0.102.0 h1:h9PLYmJx+Ko8sqz02Vf+z+O8Wx7HaZBkvXt3g0tKG14= -github.com/open-telemetry/opentelemetry-collector-contrib/connector/spanmetricsconnector v0.102.0/go.mod h1:PVQqU0d9bUVYEWOaymAUKNRaeeYizxFWkC9ibijey8c= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opencensusexporter v0.102.0 h1:Swv9mYzzFVNvoMzHd6zQ5c/gxhhpBwafXGIrobIYnsM= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opencensusexporter v0.102.0/go.mod h1:0y0VOvPG1FttT0MzNqdwuga1On6lSk3RUt7Qsd8dnAU= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.102.0 h1:7hcEkWSxneYopMZIAm76c9F7x1/EAgD7lFgKLT1df8U= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.102.0/go.mod h1:xqqyiXyWu+B67gi6Ql8D1KIelMWxFs+iXKXNKn+Pvms= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusremotewriteexporter v0.102.0 h1:jyFZk2+JJNp74U+KnHVw1xyWQuTEGcJjyl918Nh1Qbc= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusremotewriteexporter v0.102.0/go.mod h1:xR0NbceSTwHMGKmFTv7M3/9nnhHBkYH/hjcRIi67cUE= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/syslogexporter v0.102.0 h1:QA8BS4Wrj4rIOX9dajqhXUlFSzDFQzE0qdiX/mmSJas= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/syslogexporter v0.102.0/go.mod h1:Df8aFeWLqD8J0iLKXVkAGX4YD0h7u8pOljWNqd58jvE= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter v0.102.0 h1:N3vWsp3xealy4AX8TovfHG5EKi/k7z+F/8LFP4SVAgo= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter v0.102.0/go.mod h1:/Ijok2yF1qYoHuRHvyLS04ZuW91Pue2VkqZ/nZxpkvk= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.102.0 h1:+AqjGX4eFuO7GLK1e/xy4XXyK3PsDkUFSVlvB9uWcz8= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.102.0/go.mod h1:1R3+lauDpn03clGTKH+1a3kMZ/SoNA12FAu8H221Yzk= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/asapauthextension v0.102.0 h1:W04Z77rrnVsE8qP0TKLxLwOGmsi3/cTXjROQLIk/w4E= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/asapauthextension v0.102.0/go.mod h1:LgKM1Bw9mPjLh5HiuwBKQLChwxmW3MlQ3EPkLH2GWdg= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/awsproxy v0.102.0 h1:7YSL78HaJYjNpTvzBsVi/KLMIUWrLtEsZVxz6Jgxs9s= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/awsproxy v0.102.0/go.mod h1:A0x5FssgcbFd6sVtdUR388d+BjEO2KDtK8SS4eHFeJI= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/basicauthextension v0.102.0 h1:eTRvylkBSoJchyrHgfsvq00hxkzKpntz1JL44MmR/a4= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/basicauthextension v0.102.0/go.mod h1:Muh6W6zAuGKEnF+JsIaqvWSsRc9L4KclMxLnNMWfJk8= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/bearertokenauthextension v0.102.0 h1:4lknwsWTjvlQJ2Xnk/PNpx93Y9uowdBjf5jWu8gQOMw= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/bearertokenauthextension v0.102.0/go.mod h1:AnUo2LzcFj79/cJpF9SKtFhE8rcC3eLnsAILsnmpXyc= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/headerssetterextension v0.102.0 h1:GTwHSfqebN+NeBwMgptqNratxrm5JzRVva2aw/h3vHQ= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/headerssetterextension v0.102.0/go.mod h1:F8FbYLUSWmuqST50OrJGGjywu3Ci5Ssr2cwasYHGfjo= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.102.0 h1:5Z2JnKjMC885NAPUXmb04Rl4GWMLqGhfhnwLXLDFoi0= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.102.0/go.mod h1:BxTVeS5jyOTCRPkrhrS2K0maUL3WywYOg0xhR74taiQ= +github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector v0.105.0 h1:dCq7P9MfGeBCQwxDu1TlS94KXkVjZhueCm4fSFlEG38= +github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector v0.105.0/go.mod h1:x/H4ulXmk8HU7HzBOHrJL+C4dHMGauV6f5CxFXyP4rE= +github.com/open-telemetry/opentelemetry-collector-contrib/connector/exceptionsconnector v0.105.0 h1:5lU/eQQlw/os5NhMhCGqg0iomrp9Lw+wRX/EGScoHiw= +github.com/open-telemetry/opentelemetry-collector-contrib/connector/exceptionsconnector v0.105.0/go.mod h1:X/UxIl9lOiQlbmAdvtNM/pyz/1kfnl4LB9Qn1otYI7o= +github.com/open-telemetry/opentelemetry-collector-contrib/connector/grafanacloudconnector v0.105.0 h1:ze1Sybk+pd9rImzijwTMZBGdmOMkFN273jGJtufnXXw= +github.com/open-telemetry/opentelemetry-collector-contrib/connector/grafanacloudconnector v0.105.0/go.mod h1:f+87dzXuWaOTeCmu8nuDYGN6XUBANg67RsCualfMM64= +github.com/open-telemetry/opentelemetry-collector-contrib/connector/routingconnector v0.105.0 h1:H5XIffilqXgMjx1Z8vh8q96LAzvCx9OjvM3O5/WyPJY= +github.com/open-telemetry/opentelemetry-collector-contrib/connector/routingconnector v0.105.0/go.mod h1:NyqtwcDiGK1B42DgUvtJiWHTR4ak0KPr0gkJEGixg6k= +github.com/open-telemetry/opentelemetry-collector-contrib/connector/servicegraphconnector v0.105.0 h1:fL6XzMKdNaW4LYcDOjZHC4sns+V+5VlD8I8IDa0ihfg= +github.com/open-telemetry/opentelemetry-collector-contrib/connector/servicegraphconnector v0.105.0/go.mod h1:n6rSiTWYNMPURZwU0Fj2JKKaeQbp3n23K3WYHVI5ga8= +github.com/open-telemetry/opentelemetry-collector-contrib/connector/spanmetricsconnector v0.105.0 h1:DVaUWxeO8VNH/zQrP9vqz8eZwaaVzWQNCmcWGxbFoWk= +github.com/open-telemetry/opentelemetry-collector-contrib/connector/spanmetricsconnector v0.105.0/go.mod h1:45iX3DRsbK2XlbHzEWtIvud56FE2XdC7crKIne4DUaU= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opencensusexporter v0.105.0 h1:IbArOxSVO7QyKHk3d6FwWG1oLO4P2B1b8fYbD8uY6YU= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opencensusexporter v0.105.0/go.mod h1:OZxuspPwPYMDVRU1TAWyZE5Ys+memxlAowUvj7P4FME= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.105.0 h1:L3zHDcjdhyvZatjv0jGAR9ShWYY4a9sDCBcdxCxdKcU= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.105.0/go.mod h1:plLxFSlZzwEa06qc/1pVH1EQISsnSsMX9PwXYKEB/sg= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusremotewriteexporter v0.105.0 h1:Kfy3UY7g2kI/GGc5XEy3V2Bi+GHkBaEiCt0/dA9KR+w= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusremotewriteexporter v0.105.0/go.mod h1:HMsV03QzjArZrBvUjqHE5Ue4LxYuwHfwx+zUi181HjQ= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/syslogexporter v0.105.0 h1:4/G0PHXQrKfI8S0z/YfRrJdH7SL7aZC6sStwgBgzOB4= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/syslogexporter v0.105.0/go.mod h1:HI2ZQ6mho2Qj8DWk4PuQz6TPRc8CWxUWKexXfIijWMw= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter v0.105.0 h1:qZ4Kx3UB2FnmItRtj/EvGWSiSFB/Y1BBIgMYb/Z5k7o= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter v0.105.0/go.mod h1:tyhPzovl+JKv5D3UKaUg3SChRehTldtDyDmzR0VZ0Hw= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.105.0 h1:8CzFMXkgmPCcBo77J3SPjdH5w9OUyLGjm2YbJXlMa0M= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.105.0/go.mod h1:yOhD5/3EVozSiPKVTP8kASg3QCU5QO11JDLPD0EX6Os= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/asapauthextension v0.105.0 h1:3DOkg/cVNSzUT4w5foqzhHZ7oiNReILIGnxXWf9AU6g= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/asapauthextension v0.105.0/go.mod h1:9rfBAsrYVuDbJyKzU1ISa39lgDLlZjASh2p3YXDGicw= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/awsproxy v0.105.0 h1:AOX60bkg2tTEKWnbNADsiijzoN5VRWmctF/AYlfXj0M= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/awsproxy v0.105.0/go.mod h1:JE9MgeFA6whPDbDmEh8oGa4/HUVYJJHToAwaZlIqWSI= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/basicauthextension v0.105.0 h1:9X+rnoj/6Y6Ind16YmyQfVEHqwfkLKZS09wgA4qrBQg= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/basicauthextension v0.105.0/go.mod h1:STvYBV19Gs+8NcfgLtMwKcWY/GLLC7YdpQf9TNe+PZs= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/bearertokenauthextension v0.105.0 h1:baIz8YGn5Xe5r/zl9ZmxzzC2kWyatLeBl1oQ+q35n8k= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/bearertokenauthextension v0.105.0/go.mod h1:HNnRgMa7vkxhR48BL0vhsBWHN1F3EloUAYb13vqLw+Y= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/headerssetterextension v0.105.0 h1:VNh/80vx6ASduZqq6dcKKi0wZthRlmAFY7KoH+mEOLg= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/headerssetterextension v0.105.0/go.mod h1:ghtycE+hadx1ZHphmqRr+L0tj/nusHvlEpdujeKukCE= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.105.0 h1:VLWJYe/+AcHoiWxuRnp1iwEGUuA50AbwkZCe8coBGy0= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.105.0/go.mod h1:S9E6550iphv86vnre4LUpXuvAlksdTNTrlLywPREzd4= github.com/open-telemetry/opentelemetry-collector-contrib/extension/httpforwarderextension v0.100.0 h1:IbE5WcAdllr8cP7oeI5m2hBRg8NHujuxs0Z3v9QcJHc= github.com/open-telemetry/opentelemetry-collector-contrib/extension/httpforwarderextension v0.100.0/go.mod h1:CBoBgeWqkkPoApKSPjtcSqO9i5RJwDtkyFGOQWtjfds= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/oauth2clientauthextension v0.102.0 h1:hMF/bLaCqE5Db43QmbO6ZklldEJvmTwMPhvmZqXPSmw= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/oauth2clientauthextension v0.102.0/go.mod h1:anzM/fznhLpwZB5BU27DOpvQAIl0lSNP87P+qMfdLCM= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer v0.102.0 h1:UdN5b+Y8DR8+9YJIJeTzBsHej8w6JTqLeMduKcIMWBA= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer v0.102.0/go.mod h1:QQUgfXBq28KcvwxFwY4NPy4XA/theDwBqfssy/HSjLc= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/dockerobserver v0.102.0 h1:tcDPpKDUjL9X8WHXqaboA0Fa+AUyT3AhxRrJT4Mv7zM= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/dockerobserver v0.102.0/go.mod h1:zD06CmU93sJO076DXW8kzjpKUXXknI6cWRyW4RWa/EM= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/hostobserver v0.102.0 h1:9ds1kcSgUcMFYsWYGtOHgW1rQoFTLiOb1Xxp16djMfA= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/hostobserver v0.102.0/go.mod h1:Mo1+aVN/MWb4S8QigMFX5QKB8svMVwlRuJWF+zVnlsA= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/k8sobserver v0.102.0 h1:v4NYUbyPdkNix7F91YaGoSvWKy/3iA/eAisndSbtdaQ= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/k8sobserver v0.102.0/go.mod h1:J0u9jzAAtusIctgfjN8fa2RrgFCgL6tRJYBo2ELxIqE= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/oidcauthextension v0.102.0 h1:SMOq7sNxLBuz3C/VdG+3yOtI7sbVWhGtNyjgYGPkX5I= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/oidcauthextension v0.102.0/go.mod h1:B0+cEf67BK1CS2Vh8T853yLn/81LzledImU6Qyqixw8= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.102.0 h1:pynCEn05oq47ov80aIiratpdoG/0GytiZ5P3IVQXyeM= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.102.0/go.mod h1:O+IHBEtgSQWLhtuwFzgWo0ztaSBaMeMhOToIV1Ul+W8= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/sigv4authextension v0.102.0 h1:X9cOU9eRDcVSiptZl53Rs170Upt48DMulq9qlYl5Khk= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/sigv4authextension v0.102.0/go.mod h1:LUCTFaxau7b/JSsVEKcdyayUYf8lB1oA7e00B57hJ6M= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage v0.102.0 h1:7QHxeMnKzMXMw9oh5lnOHakfPpGSglxiZfbYUn6l6yc= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage v0.102.0/go.mod h1:BtKaHa1yDHfhM9qjGUHweb0HgqFGxFSM7AMzwLXVR98= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/ecsutil v0.102.0 h1:w+l3bz1a0KDNRz3plkDQN64aJlTBmhGzGFwqJRVFg4U= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/ecsutil v0.102.0/go.mod h1:7LoXgd02t4N/DR9gEO9EXpvUvPgCH07I3ceeQv83igk= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/proxy v0.102.0 h1:9h0/d5e6elcZE+YT69ev0stjZ5oE+SLDBjLexlQwL3c= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/proxy v0.102.0/go.mod h1:DMRqpQLvBdeUJ2jBCZ9fbGfabPY1q+7BnB47Z3wNpRM= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.102.0 h1:PNLVcz8kJLE9V5kGnbBh277Bvl4WwiVZ+NbFbOB80WY= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.102.0/go.mod h1:cBbjwd8m4rBVgCQksUbAVQX1EoM5IuCyNQw2mzvibEM= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.102.0 h1:qsM5HhWpAfIMg8LdO4u+CHofu4UuCuJwg/M+ySO9uZA= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.102.0/go.mod h1:wBJlGy9Wx6s7AxIMcSne2sGw73e5ZUy1AQ/duYwpFf8= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/docker v0.102.0 h1:GIsVqsOT4Awe/kwKrrkOlApWQjpNx0HN2JQDaSYe1G0= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/docker v0.102.0/go.mod h1:fuk7yN1ywQn03CebMPfC2BiWYNJYwl3DZjWAW7wLskg= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter v0.102.0 h1:TN+wdhgwDn4zSr39fFOG0e7XJNCDwUSJb8HiBZ5orWk= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter v0.102.0/go.mod h1:RNe02aDLdqqEsJ+nemN+TDJf016wKf87eZYuAEfhZyU= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8sconfig v0.102.0 h1:CS9t6i//34KdqCw/kOmSydkmBtpOB7+1fLv1QN3kKyE= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8sconfig v0.102.0/go.mod h1:VS66oUydCMwiWl1BFmLs7iNy4lGsfVYsriXr/d1fpAk= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8stest v0.102.0 h1:BzJfpn0nAGZotwEESOj1JDYUm1hj7zWE80b12ubfVdg= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8stest v0.102.0/go.mod h1:hCzgpzXbUUDUlETMDKYOpPaOhPjR9T6M3W3nAW5cGX4= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/kubelet v0.102.0 h1:Qdp0oECMX98thAm5IVq7OqYJ1zb09vAT/4DtX76bT9I= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/kubelet v0.102.0/go.mod h1:+7Em/4vP3Ob8n2yWz6+rtO3mKHvCFzcp47JAyrPXK2o= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/metadataproviders v0.102.0 h1:p0uPl321knuQoZbghyYJyOVGNMkU25X/jZSgElCwMFQ= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/metadataproviders v0.102.0/go.mod h1:x6gFY41QGX7drh0mSwo2iyixb4zxMnu6LRSnsGyYsRc= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.102.0 h1:/J1Q2tylp8ID+AIpCmfaArUyCPoSjY3nyZXdkpTw9J8= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.102.0/go.mod h1:lbNQBpvs40lInohZrqAbRZ+8r29GzfMfkbLV4fBPrzE= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchpersignal v0.102.0 h1:pVJ792+Nzcv8nLlg18XOLOWEZ/dCK+Wo3Iak5TU8rz8= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchpersignal v0.102.0/go.mod h1:DmkGhNL9nuSTg8fMhYNopMuF1Y3LFqu/FQHrvhBzME0= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/experimentalmetricmetadata v0.102.0 h1:vTzSrsPwDAzESCxxJyZuSwavFY5C0hzT8GBVjSuv8C0= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/experimentalmetricmetadata v0.102.0/go.mod h1:rHr3jqZrwpzOPNA3Ic/AvMoK7OIiW7keysE1NZsaIE0= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden v0.102.0 h1:sfw+sVvoUNYOtlv6Zkoikxq/F8MVVQU+JHDO+YzYzE4= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden v0.102.0/go.mod h1:MFHy47V/DLbE9Sr/Y6bfqEqbI1GBKWUvbOQBr8XrKwU= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.102.0 h1:EPmEtTgrlNzriEYZpkVOVDWlqWTUHoEqmM8oU/EpdkA= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.102.0/go.mod h1:qnLc/+jOVcsL1dF17ztBcf3juQ3f9bt6Wuf+Xxbrd9w= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.102.0 h1:vJL6lDaeI3pVA7ADnWKD3HMpI80BSrZ2UnGc+qkwqoY= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.102.0/go.mod h1:xtE7tds5j8PtI/wMuGb+Em5K9rJH8hm6t28Qe4QrpoU= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.102.0 h1:TvJYcU/DLRFCgHr7nT98k5D+qkZ4syKVxc8OJjv+K4c= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.102.0/go.mod h1:WzD3Ox7tywAQHknxAFpAC1oZJGItMp5mbvgUGjvzNY8= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.102.0 h1:iVdVcLq5uCvvG6bmOwdbRQbjWPsaQY/caDaIE4rJV80= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.102.0/go.mod h1:gSlq0MAX1balwTobJjaQtk/Znm3We2muLNaSLELHxUQ= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.102.0 h1:Nue1wHi8PobP90PXeB8vqoITOCZA/+Hs5Sy3fKfaTKo= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.102.0/go.mod h1:lFq+13yxprvJCoYrrTyFNj7XyouWGaKY6+lklVNKP8o= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza v0.102.0 h1:J8GFYxKLWG1360XRukc1tY5K9BF80MFXcO91UpCMgcQ= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza v0.102.0/go.mod h1:GNxigQNap2jyOEPdOedAKqCbh61y576ND4BKn/7i8xY= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.102.0 h1:4VQidhCgkJiBvBDMOukr5ixrf5uP66iW5Hb+CFsb+4E= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.102.0/go.mod h1:nMto9zkv0vD8YI3oGZFZS2Uu7k2oHt1d+xUHN/ofUYo= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/opencensus v0.102.0 h1:Mh5MHf0PrUQMTM2S8HwEuPt3Fyz0Xnt0IG7GUc6Fmbs= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/opencensus v0.102.0/go.mod h1:6fc8qnIayeGwAF41LyLR+/FRbyJf4+FikbmaO0GGq/Y= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.102.0 h1:mADBTNQknqXT6AiO3S8MvG2LwAum2K0fMZuWt5UyMNw= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.102.0/go.mod h1:Oh95IxRZCHq+CUwADrUCkON0/nSsnKLGqT7qW1ZQx/Q= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheusremotewrite v0.102.0 h1:rHLWscq00lDfTW0BYuX2EEH9w1+t7X7ER9PcFjEowso= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheusremotewrite v0.102.0/go.mod h1:+Vlutd4t2XluxHYbIAfZiz3z5uWbsbiIUpipV5AnLtk= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin v0.102.0 h1:5M7I78lyGsH+Xyy4NoXKM/UUCa52aZQiPcSX6so6x94= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin v0.102.0/go.mod h1:BEQy0zEel5uIOTEFBBmvQJ4A32R6nKLtSMtC6ylLI8k= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/attributesprocessor v0.102.0 h1:7CHzBkwrwfKBAYid7ii7CKO7kxSVVruMJKEnXFfO8ig= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/attributesprocessor v0.102.0/go.mod h1:OSi85ea3BWIrFqrB6q1QN1F5sCfTzJS6ECGD2Bk30JQ= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/cumulativetodeltaprocessor v0.102.0 h1:q4VV17TxeMm0FOeyFXAO4gSRf2ZLtKTh0/l5goxhRsY= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/cumulativetodeltaprocessor v0.102.0/go.mod h1:FlP/8TVT768TAh5kpvVX3AQ5/UXJWBuSSCFhO3fE+E0= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatorateprocessor v0.102.0 h1:mj3t9/FAQZjcZJA2kjgbpz2fSK9yD/pYpmqKEWpHJ1A= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatorateprocessor v0.102.0/go.mod h1:IIIjEblgrNISbDY7GPMMto9kEVIf0n9IeJoVru89kfY= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/filterprocessor v0.102.0 h1:DaEYlVCn58GtkyYVK0IT/ZMjRFJ+BfmR0p9I0Eq42aQ= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/filterprocessor v0.102.0/go.mod h1:u9x08rUCWdgI8Nle5XOMTCmxd0K26KTZvMMA5H8Xjyg= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbyattrsprocessor v0.102.0 h1:huh7V8uqMakQGdnbOqTSZihfoDeOIbNHfFt62HMsk5k= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbyattrsprocessor v0.102.0/go.mod h1:IIKgEx+D91XNJYN33/wXzGullskvjJzvzKHIP3/+zDQ= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbytraceprocessor v0.102.0 h1:+FmLD8ra+NQmVzscM1usSGIrgQ2R543TlAZxl4CPBjc= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbytraceprocessor v0.102.0/go.mod h1:otpZH7pH5hnhobMAiTRJyY8bAdWGecCaxkMUCW/3jpA= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/k8sattributesprocessor v0.102.0 h1:mkRDKVWXfG1gTxwg69ttJoGmXOKNHAGsGms06DrwTlQ= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/k8sattributesprocessor v0.102.0/go.mod h1:5F6hpHujLkLuEYmbbUXel2i3mBpwRJHmy8KTY3cbOVg= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/metricsgenerationprocessor v0.102.0 h1:AU4vK5OAGHgENTGcHwN0HDJFQQBohQhELmHjHen0exg= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/metricsgenerationprocessor v0.102.0/go.mod h1:pVWvccpyxdMB+wdC3wYzyEINCof2uAb0pirCVupVSNE= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/metricstransformprocessor v0.102.0 h1:nAJSknk1/WP0/d3SJWxqCdt/5S8N21CUPBlgiLs/Woc= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/metricstransformprocessor v0.102.0/go.mod h1:NZV5kpz6nqwG0pbcoBNWlc4TcN22KYLg/knoy3LuDI8= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.102.0 h1:ErBYnmZUSyPQjHPlyAeUOtQDax0tH2Ax/zOuklZp5Y8= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.102.0/go.mod h1:hHBt7x5lWzwwjdro0JQ/JLa64iFHCUzQwpMuiPptrSw= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/oauth2clientauthextension v0.105.0 h1:KY4gn7Nz7kPamycJDyBzcFmy7UoloKuboNzSWx3nVOs= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/oauth2clientauthextension v0.105.0/go.mod h1:KE0K3Epsf0XTukCa8Kw6Rg6/7M+aDup5uUwo2WikkzM= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer v0.105.0 h1:NxRuIdzxuf/x06H6zFsnrCYLFyoxoMHeHt5wrbOilEI= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer v0.105.0/go.mod h1:s+suO5v6PkeVZHpiME1vOoiMSbKpbSFDW6HQhKsFkn8= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/dockerobserver v0.105.0 h1:mTMota7DNVqaBGbOZEs1C3Pt2CNWhYP9LDsZ4oQhEaA= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/dockerobserver v0.105.0/go.mod h1:Jtv9Efgn0elGe9XBiOuKQdjUwFHi/NUxC5PgoCY+Sdo= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/hostobserver v0.105.0 h1:3nPlvlxmpUz/DQ8dmcEMMw1qACXn9VLmlD9Z6KEk0Is= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/hostobserver v0.105.0/go.mod h1:x8eLRDpIJhErZIdv86DaFynLrUE6MtEj52Ftne6kH2I= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/k8sobserver v0.105.0 h1:8SpO7QCdnxP9ih9p/da7zTnlW455td8yAW7Q/Obwdws= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/k8sobserver v0.105.0/go.mod h1:DTfcqKvlZkp16zNva4RoPryyQh1X++0vUn7O/uM3hcw= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/oidcauthextension v0.105.0 h1:vsMY+8ZkYYL0cqt/9Yho3EydcNDBcNGwZfpB+K0IReM= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/oidcauthextension v0.105.0/go.mod h1:6QIVpY6rZS0ojDp/O2RIeR+qYofrTmkpATN5JimxcrU= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.105.0 h1:R6FofQhmztYgfZxDCbqZUb6PcjnEB0HM52Ho6IoqigA= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.105.0/go.mod h1:8bgWDZPZzUWzY8BE5wWeYT6ekzlD2pE8rDJOx9vwvgI= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/sigv4authextension v0.105.0 h1:T7mMWSOI0janJIajmvARGkQezy0OdsAt1tU9gUomARg= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/sigv4authextension v0.105.0/go.mod h1:WlzcdCuB39mx5OXTK+17hPCh7InO79J948xrej3Q4/g= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage v0.105.0 h1:HmimWATFFNI8o6n52DXTS2EjFRa6aETNqmA3MBGAxSI= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage v0.105.0/go.mod h1:DoCIQkjzSFD/rRq9rsI4kzYKcHRn6B7g7txILM18dHQ= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/ecsutil v0.105.0 h1:JULTD9RLcAHsGgYvoFmG9lA515kAibZA8SDs980NSqE= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/ecsutil v0.105.0/go.mod h1:HtRVk/R7rglDA+kmDt6+RCLuBd4B7zPsMvcPS3O2D6k= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/proxy v0.105.0 h1:DVEI3tNKUprGoCMCiFg+GLHgRActQm0ajafqj4ddV8U= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/proxy v0.105.0/go.mod h1:fhjoiIHkJ9aSA7/cX7LEEWgob0MMRHFjrk/CWY2W/00= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.105.0 h1:kHHL4A9wL6TxM2sIUEXUpFXGPxrW7u002FJK+majI0s= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.105.0/go.mod h1:I+fL3494NrarNgHHs2D7kz0v02KGCmwmp3L89KUqENA= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.105.0 h1:k89VhlOwi0uYkEOgoR0ISTct07GaBoQmhnI1yypKa4I= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.105.0/go.mod h1:6k6afq9nYwfBbo9z0XhS1AJzFtosTFHoBVJ5v/Ugv+8= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/docker v0.105.0 h1:ORza1dMoc+tVEZ9clIdpKE71ZeUeWCnKYrcL872U5kc= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/docker v0.105.0/go.mod h1:2xs6fEr7bFdle+UkHxbfWpcjbkfgyw4mYtviZ2FT7YI= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter v0.105.0 h1:rjGDHbrFwnQshjnrGvRyZd9IQtMEgna0wmBKt8bOvHQ= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter v0.105.0/go.mod h1:VM2yuWR5UiKTf9A2ELv9WUjnzjpCWYLA5xHSDADa4L4= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8sconfig v0.105.0 h1:gBgUvvxMs3awwIke97FZ/ymbxYSUd+GwTiO/ZqmBW/E= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8sconfig v0.105.0/go.mod h1:VS66oUydCMwiWl1BFmLs7iNy4lGsfVYsriXr/d1fpAk= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8stest v0.105.0 h1:MionH76aP3Tg7Z8LJn06fSQHAmEzDyML/H3fZ6rsCTc= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8stest v0.105.0/go.mod h1:IszvkVT/BDl8B/XXFqc+cxexT5PNoX55BeJ+k2P4SJU= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/kubelet v0.105.0 h1:Gsne8b29weELIxThtGpxyyGWjMYw3nQpFZmJ7JlCtoo= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/kubelet v0.105.0/go.mod h1:cECbyoaqIRtKJxenG0Mxcp93h9MeUh4jplmajCyqiXc= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/metadataproviders v0.105.0 h1:pXfqmF7kHERH3/wfdkwMvsIX6QxVaI7FM4kH/M7EuN0= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/metadataproviders v0.105.0/go.mod h1:Sn/j9ZQ44rTZwMcOPD6dccOZxLWuwYdNAWDztf9rsCA= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/pdatautil v0.105.0 h1:zOSutEwmvUrP/qipRi4v4SVPFAsb1xc/3/JzvffboSc= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/pdatautil v0.105.0/go.mod h1:4d75+uyqLk/ZBiu3bsnjxYliSdGBJpa74IMr5KdhYrs= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.105.0 h1:HoUTIN0sbnGSpqGPR48LZWFTYV0fNEWhV1nStOioLhE= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.105.0/go.mod h1:kilXVPFZUBrcWbYXj+kKsYyIMKlE6mt1/fdv1D/nsPE= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchpersignal v0.105.0 h1:HHQOzApli6RjBO0Ujh8OiBIXtFErojbCEBAzsyw/39Q= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchpersignal v0.105.0/go.mod h1:96jBGagp5wck48k+qfJpxc3SIj3zLRXbP9E1m97gvLI= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/experimentalmetricmetadata v0.105.0 h1:CdFNeWlJgZWx6BpLn0SuTYDDcR2HozCvrhzDTKx+Tz0= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/experimentalmetricmetadata v0.105.0/go.mod h1:9fXA6J9q3FGV1SZYi1QLHbYXK+iTUKe1e+/uMKxB83c= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden v0.105.0 h1:6mUcRfh2DRlU85EFf1W/9kwg9qMKg6xwu1kFC75MM0c= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden v0.105.0/go.mod h1:MX5a4WDcyG/KowLGHJjpbNpYIlXsvpeJr7BEs22HuOA= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.105.0 h1:aPMC0MImobhMMmm8CFbjQl8aAwRBqTuN7NZwNej/ewc= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.105.0/go.mod h1:zBF541pc816GE6YHGacCjR7k5AbSTj+r3l9vkzD4tQI= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.105.0 h1:Zn3WKPLUXcIQTeu5K2elsi/Ncq14MBRZQPaVdJC+6cQ= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.105.0/go.mod h1:hzu5KvOYEH5W9OpVc+iRXUAvj7GHcLyyR4qjIH+hOhQ= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.105.0 h1:hs7TaJClEAhHrj71XcaYqlYnIOpOYQgoHqhnnBNrOK8= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.105.0/go.mod h1:ehzaiDdkrww7l1Stvse5GCOAsAZOpFcgeIbB/2PqFs4= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.105.0 h1:wKujcXESoQPBWIxYIET7YP6lN2idX8oZRsNl8iWXum0= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.105.0/go.mod h1:n9awPzI+erPm8NB8yL/UusWvF5P741BbHv5bcWYMXrc= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.105.0 h1:nxWmoOG5fybgE6qEnO8zi+x1TBQESrqxqLATLStDz8U= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.105.0/go.mod h1:EkUhSxdzRa0CcFYHhkOgxWi1kXCqG08Sq/jbmVIIwjM= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza v0.105.0 h1:r83IqQk13I0mN8d5fcqtAcywuZquJ9nawyAG+hLviPk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza v0.105.0/go.mod h1:T5GLFCanNnomjWiOAiJvuf2+4usVMvu/VIRJcgc7Zn8= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.105.0 h1:EIMptO6ZZeP734nBLxNVftrWA+OEGtgsxarNH7rao2A= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.105.0/go.mod h1:/2F91Hsx7RAn/FENz/7MRbHBkBYQ/uX6t4tYJfyeBfM= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/opencensus v0.105.0 h1:7IUVoze3zb18MQUz+1xXRp8hthHBA5Ffj8DtXnDffnQ= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/opencensus v0.105.0/go.mod h1:2rkSr/v8eDczzkCTZ/iopSpU1Amag8m0utyv73ebwa4= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.105.0 h1:hKpdsx8wzn/wA3hAavSEVKLUBfkYkpfXpudT+VUxucA= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.105.0/go.mod h1:1Tq47AVtrvxnohU1Is3EV/zv2ifPwdRSW735xG+zvFU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheusremotewrite v0.105.0 h1:tat4ZUEv47dA0IJaRr43VDPXVWjfacelpQdTMgQZXoE= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheusremotewrite v0.105.0/go.mod h1:yPAJacBA3ZZkyxxGOFJqT9mZjLuLabZCbcNE2JPLALQ= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin v0.105.0 h1:60worMGZbZFw6djolg/CVExX6DPQoXgfM4pmdZj2b7E= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin v0.105.0/go.mod h1:Nhq0L1GhTdyl/Td94xCiys0kJMO9lOsezhYRXz0MTvQ= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/attributesprocessor v0.105.0 h1:07WoPlHMy6MGtwToEVaxWODM873QlS9NFzjjc+5fvnA= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/attributesprocessor v0.105.0/go.mod h1:hcCUGzof6T7S400eqMsU9IsW0ht9YjLhrbm2IvKezt8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/cumulativetodeltaprocessor v0.105.0 h1:dSUxM4hA289DlG2NGiYm2IHBEPcqLkjoILTlNgRH5KA= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/cumulativetodeltaprocessor v0.105.0/go.mod h1:7a6zZi8aji5svmiVjhm9wWs5Gumih6U62uHwjfBAeUE= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatorateprocessor v0.105.0 h1:e5BcjyyxEqW0k6og/hL/qBOzuLituyvUQTMOZsZ0PQA= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatorateprocessor v0.105.0/go.mod h1:u3EUJt8tYc6p7t967qzzBrPurekOpR+pXhrhHKh895A= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/filterprocessor v0.105.0 h1:oRa+acTM4f5rjTT3+hjOVM1LYrlwrm6CSNG4o/RIqcA= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/filterprocessor v0.105.0/go.mod h1:66cZFd4X8vQBTmvm1hPHxrSNHS474iUEsAVbYk9xQBU= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbyattrsprocessor v0.105.0 h1:OYsGaSC9G7pAVYKTd1+D0f7HTHcxuQfoEHyQy+a1NKk= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbyattrsprocessor v0.105.0/go.mod h1:WCesGEakYveZYZH4o3cUTLt3UB7JxE+yDiiphRHoJoc= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbytraceprocessor v0.105.0 h1:BUts/YcQ/HTwVLflY7SpVRc3owA7AtGj7iXRcqA+AKU= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbytraceprocessor v0.105.0/go.mod h1:Nb0TmNl+j2srYi9ZNViUHwLXKb9HjsC7PPolRk1O1o4= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/k8sattributesprocessor v0.105.0 h1:ScIwuYg6l79Ta+deOyZIADXrBlXSdeAZ7sp3MXhm7JY= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/k8sattributesprocessor v0.105.0/go.mod h1:pranRmnWRkzDsn9a16BzSqX6HJ6XjjVVFmMhyZPEzt0= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/metricsgenerationprocessor v0.105.0 h1:hvd+YOerL61wOIpLy3OoWEKP46Sg3CSgXioTQpw2v2Y= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/metricsgenerationprocessor v0.105.0/go.mod h1:eMUtVPCLLYYTszQ5QJ/195cD85ZYQxpmGu3RZg6iCBM= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/metricstransformprocessor v0.105.0 h1:L23gC/anzqtsP9XKaK+paC+/fU3cgW7uvR4C8rq1/yk= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/metricstransformprocessor v0.105.0/go.mod h1:M6pUQb2iMC7HW68xDKI6ziyI+wvytLF4QhWtEki1PnE= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.105.0 h1:mFAlBmDFELQJS8uj1M8csB/vQqjpq6W9/9k9izh9Hr4= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.105.0/go.mod h1:23pZN+mhimogJNwEw3AqiaIRJ2Khy9n+o6YkbBzUK0g= github.com/open-telemetry/opentelemetry-collector-contrib/processor/redactionprocessor v0.100.0 h1:n/aO09oRwtY3HPxEHg4ACx/sWKW6evVO4YXIgu+tlD8= github.com/open-telemetry/opentelemetry-collector-contrib/processor/redactionprocessor v0.100.0/go.mod h1:LSKT9sf2Afx8RFTh8C+qreyr7ZxgDjQyV9KAcKXtbPc= github.com/open-telemetry/opentelemetry-collector-contrib/processor/remotetapprocessor v0.100.0 h1:QB2/WOp+V1UJnnQdsnrpET9U8Q665xoS1c9+/ir8Doo= github.com/open-telemetry/opentelemetry-collector-contrib/processor/remotetapprocessor v0.100.0/go.mod h1:nC+dtJl0gcMiqNz+mYBnB3LRJrFddFj2RYeU2OnC6Sk= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourcedetectionprocessor v0.102.0 h1:6A/fYQFf6DaY1C+64eRnuua1HrCv8N83HaVrYTMtjnU= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourcedetectionprocessor v0.102.0/go.mod h1:AdK1CInrB6QOgBQCedOlSuBBq/hocWOMOkoKXFZPsy8= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.102.0 h1:9DEErMWgwGZFAINzn+ujIMkH1JtPcuPeS9RtWcMtc9g= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.102.0/go.mod h1:oau2EF+n4ZbtZ9V1YkK50CIjFB10bW0PN1XSsTnkn+U= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/routingprocessor v0.102.0 h1:CyZQMCIlo0gviPGMa6jkg/ImVKeddr6/uvX6/mWI3DY= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/routingprocessor v0.102.0/go.mod h1:DHXsdirzVH7m7FgJNWERU+bICVouOEyrLYL3ozG9eTM= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/spanprocessor v0.102.0 h1:qfB41MXQbfK/Z/Jz9K0IFDLWkyLpXpCUlfdMFW93aS0= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/spanprocessor v0.102.0/go.mod h1:LRW+jAuVDFUpV3maQWrXrQLEnkgK4rR7FsIb29RVfFg= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/tailsamplingprocessor v0.102.0 h1:haaQludKUMYLQUjoPKVWzeP7qcHOF045FLd+WtihQDk= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/tailsamplingprocessor v0.102.0/go.mod h1:8hPQU8tprx79lDkMq4aqxU3WEurKYGVe9fM2p1VYN9I= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/transformprocessor v0.102.0 h1:0TQZTCWFmOQ4OAEIvIV1Ds74X1d5kQYalYJFivsuqzo= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/transformprocessor v0.102.0/go.mod h1:2T6Wk8q8IoUGtbigSs1/IHCUEt7Q7t+tNRtcKlZSw5M= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/bigipreceiver v0.102.0 h1:+yDLVfQlPLAXtZiKD5g/d38rJDrhfxd7NqzrxEn3kBk= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/bigipreceiver v0.102.0/go.mod h1:SwDmNFeZu9gu/e4vxQrY3kSWReASyQ2gG7si1ADJMAc= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/dockerstatsreceiver v0.102.0 h1:G1ehwzryuA4oLWXjHnrvtMSB8BtRSE22/Qc+vu2YwYk= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/dockerstatsreceiver v0.102.0/go.mod h1:WbkG6SPeesheMtvjXwRg6PIk2jIKK20kEEPMr36MYrE= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/filelogreceiver v0.102.0 h1:czJBjI4rZ+FNrdq/MkLQP4f6tsB3XIwN3mVXZOiIYcM= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/filelogreceiver v0.102.0/go.mod h1:eRViM57aYPXdI8bH1gMcpc02gIP4+QW5bXPjZiJLwgU= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver v0.102.0 h1:2JxSNc2Tw+JTsNqEuUM4fKJLBSSxhbQYRgLoasvkTH0= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver v0.102.0/go.mod h1:JjaTMPGUbc2OhwocO/xj5HLXO99tdmNYnsXOqie01kg= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/httpcheckreceiver v0.102.0 h1:F7k0rUgsPemwpOWxZOOTxvCK4ojY5AA6IiroQZahrsg= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/httpcheckreceiver v0.102.0/go.mod h1:htx4xSZ/2/kPHIK+m11cqb47a8JLf3lFVVoeILbGveA= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver v0.102.0 h1:HTGSfx2HzfudY1Uczw9yTBJnGBmTVFYzpGH1z+oD0nU= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver v0.102.0/go.mod h1:Hlz24+Ah6Ojk0FUKNb1watRmTbLEru35+feroKA7dvQ= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sclusterreceiver v0.102.0 h1:/0j+3/VBzg/5Aro/VZP9EAlq12ywZWpbPBrBtPQqr7w= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sclusterreceiver v0.102.0/go.mod h1:4KiugNr69iHwHkVW7RV3UnyzvLxm5dsS343tHGJui4Y= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8seventsreceiver v0.102.0 h1:M0d06m240oxWbvUA7cVqktNu4kDUKPh8YJPgTyb0SZE= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8seventsreceiver v0.102.0/go.mod h1:xrIJ4Sy/0UlTbUoKGAII6GSaAh2tI4QkF+MqtQIiLBM= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sobjectsreceiver v0.102.0 h1:JHVh3P2pZ7paNJE7t/xQtcMwBIp6kSbeXBmAWDHf13E= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sobjectsreceiver v0.102.0/go.mod h1:lIK9bCpqEah5d+K+h+HRtqtHTCp6GNh59Gjn1WLYqPU= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kubeletstatsreceiver v0.102.0 h1:GefSEx8tbM/VYqjoZY5hbLxMszd0CWw3lMQV4nFf7Ow= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kubeletstatsreceiver v0.102.0/go.mod h1:8F4xZQ4isuJZrz8PQn8Y6rP3WEuRrYDEQat4ZBEzbyk= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/nginxreceiver v0.102.0 h1:cN1CU0SGYF7E6DtyYFAGmY6fZk//TDsCVvRQy+bFzGc= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/nginxreceiver v0.102.0/go.mod h1:JKvhgc9yMMan55baGWZy80c0oQ90rAjc6C/c9hBoNO4= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/opencensusreceiver v0.102.0 h1:dBhFe/29ODIbxg4+JRaHwYAHMFFeh6/+izVtjceXwew= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/opencensusreceiver v0.102.0/go.mod h1:WNFjuquVqyi+WEoa6L0J3DzPLRsP24ZlbZYwKv49VwY= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/podmanreceiver v0.102.0 h1:nkFBr4LOJcpCvZrRqnSmA2SN5No+mZ3mAizNOs7rd6I= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/podmanreceiver v0.102.0/go.mod h1:3CBkv8JNSqOoSBUou2El8OifPcdANEFnT5WSUsPxe8M= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.102.0 h1:RB12IhSeXEt1y6nGtVvlqWtuzR3q/u33WFkjnot5mVg= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.102.0/go.mod h1:F6Nl+wlY/83a4wu2T6X6L4m0+ZBkzNqWjmyzYlHIQ3Q= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/simpleprometheusreceiver v0.102.0 h1:8JN2FTWVIJXFERvtLLLEJgciQBGiEIezedlF7IiV2Ic= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/simpleprometheusreceiver v0.102.0/go.mod h1:8FF0b9JxIxaynbxETDuI6A9fhKFsERu2+S6LHt5oJnQ= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/syslogreceiver v0.102.0 h1:kJJqDsqWzJa0Pc9P+/N6zuC87QCl5VaQAe0aluKqaSk= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/syslogreceiver v0.102.0/go.mod h1:1/fCkxhVkDOdxzmH0BILgzvApi3+nFmLJv1A9HA/bwg= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/tcplogreceiver v0.102.0 h1:LDtM9ymyDm5QC4/MfzdCO1Bzc+bT6kzSGQzg6q5Tlos= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/tcplogreceiver v0.102.0/go.mod h1:GSoOIm3LnVJ4zz52s4xVBA2mv/elyO/VtTxR4guALC4= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/udplogreceiver v0.102.0 h1:wvDcu6yEeo0sp+ko8AiHNok/WjcPrBKf7rFRnAOSKp0= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/udplogreceiver v0.102.0/go.mod h1:flqUn9nLT6LA/pYZfumoeArBJHccrJOs+Q6WAC3BPZc= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver v0.102.0 h1:Pemo9pZa3VMYdrM/bss3f0qqVyBzPSulOBQL8VQcgN8= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver v0.102.0/go.mod h1:fvjAM+jOQdiXCmAENKH/eWxBBqTaImbq3lpoBI4X5Ek= -github.com/open-telemetry/opentelemetry-collector-contrib/testbed v0.102.0 h1:GTw7hrpTp7SSLWrGF+P2AQffJRbg1Nww6Qa+z3iNvDg= -github.com/open-telemetry/opentelemetry-collector-contrib/testbed v0.102.0/go.mod h1:7Y5II5BYasxjFYdtW3aDaSwzTtA+jNbhtcdUCngyYRw= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourcedetectionprocessor v0.105.0 h1:c/amt4jBLbjIpi4CtRUjQW2gdQbVA607TEX8BCgCwe4= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourcedetectionprocessor v0.105.0/go.mod h1:HIqvjexbr/OzqucODsCSJabuXZPS8PaLYhNPeeU8xUA= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.105.0 h1:H4f49ywU6TUSZ8I+bj4ZayZP46i1jOydD8h7jhSD6Q0= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.105.0/go.mod h1:ekbXlY4WbgUT09oGbDSLLYU9NP5XksG1mDgooCOCGls= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/routingprocessor v0.105.0 h1:JMlop0ov4Oy0MbumF/PqCLYc1IQU++lszStHo6qcELU= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/routingprocessor v0.105.0/go.mod h1:leF4ngBEh1HvSz5hmQ6ZorLDnboW0UGn8FRBohnS310= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/spanprocessor v0.105.0 h1:gHr1z0EpNmolRkEEEr01Lq/OYm/nNYaWRN+V32J0cuk= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/spanprocessor v0.105.0/go.mod h1:FXzm0twR7yvayJ8ozR0d6JY4X4ehUbyRwFPnh10wf3k= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/tailsamplingprocessor v0.105.0 h1:t8qqvZrfLcgpR6qyVfXoOghJxV0/INvDhRtJVGIT9PI= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/tailsamplingprocessor v0.105.0/go.mod h1:tOear8t6EdvUCb3G44iPG1oxv5UuTy7oa6yaVJ6l8DI= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/transformprocessor v0.105.0 h1:/6i9boKkDmL6hAa4rXPAH4iLVIKAPFfl33OX21usXZk= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/transformprocessor v0.105.0/go.mod h1:5BAgFbVX+kgOXqFZVOZNko/xUSXIWbHgHC2hwdhAMbo= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/bigipreceiver v0.105.0 h1:/ixdhOYF4PsHkUTko1ej0Ec1WAR5myfigss4p77qwhI= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/bigipreceiver v0.105.0/go.mod h1:Qd+wmL2tsWhVGGoCuA8nBHxiPYHC9H1+0LSbQTj4Zec= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/dockerstatsreceiver v0.105.0 h1:+dqHs7d6VclS3qWt9925O8JEvnqJy8WJ28UuZISHRu8= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/dockerstatsreceiver v0.105.0/go.mod h1:axvvwteleD3UtD6GjSeoYKgVJUhIYxKgkglCReibzN4= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/filelogreceiver v0.105.0 h1:aovChJqUsV07T41w0vnspaSdHaTo8WrgbRnkZRZpHi4= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/filelogreceiver v0.105.0/go.mod h1:s2dHItpEPxPulfnQG88rjjBQBqIgyaPDPPxhL4ZioVY= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver v0.105.0 h1:pxjCD/Rj5wNV7/Za3zIm00XgK2nSegBeFrcolZsiYak= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver v0.105.0/go.mod h1:2PO++66272D+rsjp6rltnitPO1/7O1mGL4Hfu5pjCsg= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/httpcheckreceiver v0.105.0 h1:4FpFD7NP44G4vo2w8DOy0wHrzdSINLsjTp59al9zyXw= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/httpcheckreceiver v0.105.0/go.mod h1:TWQ/B6aW/LbmJMzmJ8OSWkyPgdnYYX8cEgK2/vuHsF4= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver v0.105.0 h1:KGvKn2n/tV5aG3JlryEgXnnSVnY0O6YFWGOY72OI8MY= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver v0.105.0/go.mod h1:NKh0a5RFTHnvxRRmjlV96ZzSc5xZrHr1yPRWxskjBB0= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sclusterreceiver v0.105.0 h1:LewildLdGEqbLymyzQbW+gtwuqRIQM0f2MMLARnGrrw= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sclusterreceiver v0.105.0/go.mod h1:5sJt9X9soU/yZylHTXRSm03DNwbNdhKgze5xb7453h4= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8seventsreceiver v0.105.0 h1:ZsyM4aXn2SP0zKlbCnCzPWL9A3HJvP4FpWr4Lj+6W2M= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8seventsreceiver v0.105.0/go.mod h1:rpHunERtcxurXc+owfOmSJZbcglAbpkU6XlN2shHExA= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sobjectsreceiver v0.105.0 h1:o51g0HvjuGnjiJilT0htxcsOMstLl7FReEyU2iFNDK0= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sobjectsreceiver v0.105.0/go.mod h1:MpGBzm1h3ttVCoqb5m7TzCyGgmzM70YZy1rxPmSHf/I= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kubeletstatsreceiver v0.105.0 h1:mTxDJNe8LcApYOa8zEnd3B+z8zHnZiP831m5axl6RFg= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kubeletstatsreceiver v0.105.0/go.mod h1:elg1LL5tXz4NAVdP4NX0G8+gRdX6Vv0A4XxdpJ5uxqs= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/opencensusreceiver v0.105.0 h1:kLEwjBh2IF8/LJOqYqmAxRj6hUgl4vKRPrbxh6RgiNg= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/opencensusreceiver v0.105.0/go.mod h1:HM1F4a4aVGTqwy083sAFrFmZGSBiWCICXiy9XWUHczc= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/podmanreceiver v0.105.0 h1:++GAV0296Qto/3Ki8JwgJ2s1LmwtcZKz4P+rjMop95s= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/podmanreceiver v0.105.0/go.mod h1:uQJIQOOecfXGvdfbXxkKImN9pNICgg4Az7QtQV+KtcY= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.105.0 h1:s2kcmrILHXgutAl3Slol4xlDUMJTYjEU7kppk3DkZ2s= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.105.0/go.mod h1:gBmEBZB1odOni3kBpY+EbOBcXOK3tDu2eoqegdSeXtY= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/simpleprometheusreceiver v0.105.0 h1:j+eGlTmoSxSa0MNJPVxEFy2AFYXthuEwjI5eh7YbUkk= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/simpleprometheusreceiver v0.105.0/go.mod h1:6OWCUtV6vb89cYi3EhjJBnrAfO3eyrP2ISuwDt2Shdc= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/syslogreceiver v0.105.0 h1:Jk0aBz2Ejg8uearHSugT2L/MegNSG85ygvedOqqPQjE= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/syslogreceiver v0.105.0/go.mod h1:DGgI5erU/Y2j1FNq3hluhc6yGDrUrV74NiF/UBI9960= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/tcplogreceiver v0.105.0 h1:cQeHLKssdlnTS8P69LhJcPQRRwXQnkfTJ8B6hlHq+1M= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/tcplogreceiver v0.105.0/go.mod h1:zvImfBdXzdRXcq+pnPEqQVvbgAw2UgSBKWy0ymz/Gk4= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/udplogreceiver v0.105.0 h1:RCdgZYUo1yIDxb4hiLjNv/OMDBu2hyKEkFhXL6wBD/s= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/udplogreceiver v0.105.0/go.mod h1:aIkta/pF9VgIPUAIAoTjzuZxJfrmiFKz/DMLPhYWUto= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver v0.105.0 h1:JLYDrRk4oJB5CZY49Q1AhvpN8Tnl8faPG0CqpnDOFIw= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver v0.105.0/go.mod h1:73LyO27uXzwtEZrSq/7b1wi5FG9aHx6TUVcCDaxJ5mw= +github.com/open-telemetry/opentelemetry-collector-contrib/testbed v0.105.0 h1:h3LsnyoZW+RNOrxrzdTWdMn5gYTuhUSFb7H1p7OiQcU= +github.com/open-telemetry/opentelemetry-collector-contrib/testbed v0.105.0/go.mod h1:ePLBjg8intJ1K6mtDSAsUeJW9c8doEKNor1IEBKkXds= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= @@ -865,13 +854,13 @@ github.com/openshift/client-go v0.0.0-20210521082421-73d9475a9142/go.mod h1:fjS8 github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/openzipkin/zipkin-go v0.4.3 h1:9EGwpqkgnwdEIJ+Od7QVSEIH+ocmm5nPat0G7sjsSdg= github.com/openzipkin/zipkin-go v0.4.3/go.mod h1:M9wCJZFWCo2RiY+o1eBCEMe0Dp2S5LDHcMZmk3RmK7c= -github.com/ovh/go-ovh v1.4.3 h1:Gs3V823zwTFpzgGLZNI6ILS4rmxZgJwJCz54Er9LwD0= -github.com/ovh/go-ovh v1.4.3/go.mod h1:AkPXVtgwB6xlKblMjRKJJmjRp+ogrE7fz2lVgcQY8SY= +github.com/ovh/go-ovh v1.5.1 h1:P8O+7H+NQuFK9P/j4sFW5C0fvSS2DnHYGPwdVCp45wI= +github.com/ovh/go-ovh v1.5.1/go.mod h1:cTVDnl94z4tl8pP1uZ/8jlVxntjSIf09bNcQ5TJSC7c= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pelletier/go-toml/v2 v2.2.0 h1:QLgLl2yMN7N+ruc31VynXs1vhMZa7CeHHejIeBAsoHo= -github.com/pelletier/go-toml/v2 v2.2.0/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= +github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= +github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= @@ -884,11 +873,12 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= -github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/pquerna/cachecontrol v0.1.0 h1:yJMy84ti9h/+OEWa752kBTKv4XC30OtVVHYv/8cTqKc= github.com/pquerna/cachecontrol v0.1.0/go.mod h1:NrUG3Z7Rdu85UNR3vm7SOsl1nFIeSiQnrHV5K9mBcUI= +github.com/prometheus-community/windows_exporter v0.25.1 h1:sagNoaBC1TirUNt8YE4eIpeDNQbswrRHsMxvluYHbyU= +github.com/prometheus-community/windows_exporter v0.25.1/go.mod h1:fmM+2zsneBex4oamnr5YHzikZ+34Zhkxg7h3fZVtDWY= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= @@ -907,9 +897,8 @@ github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8b github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/common v0.29.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.31.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.54.0 h1:ZlZy0BgJhTwVZUn7dLOkwCZHUkrAqd3WYtcFCWnM1D8= -github.com/prometheus/common v0.54.0/go.mod h1:/TQgMJP5CuVYveyT7n/0Ix8yLNNXy9yRSkhnLTHPDIQ= +github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc= +github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8= github.com/prometheus/common/sigv4 v0.1.0 h1:qoVebwtwwEhS85Czm2dSROY5fTo2PAPEVdDeppTwGX4= github.com/prometheus/common/sigv4 v0.1.0/go.mod h1:2Jkxxk9yYvCkE5G1sQT7GuEXm57JrvHu9k5YwTjsNtI= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= @@ -917,10 +906,10 @@ github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsT github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/prometheus/prometheus v0.51.2-0.20240405174432-b4a973753c6e h1:UmqAuY2OyDoog8+l5FybViJE5B2r+UxVGCUwFTsY5AA= -github.com/prometheus/prometheus v0.51.2-0.20240405174432-b4a973753c6e/go.mod h1:+0ld+ozir7zWFcHA2vVpWAKxXakIioEjPPNOqH+J3ZA= +github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +github.com/prometheus/prometheus v0.53.0 h1:vOnhpUKrDv954jnVBvhG/ZQJ3kqscnKI+Hbdwo2tAhc= +github.com/prometheus/prometheus v0.53.0/go.mod h1:RZDkzs+ShMBDkAPQkLEaLBXpjmDcjhNxU2drUVPgKUU= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= @@ -934,19 +923,18 @@ github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6g github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= github.com/samber/slog-gin v1.11.0 h1:a9M1DgzM914M/gCe/xGDaiQGOucLiqFYeqctgTT8G5I= github.com/samber/slog-gin v1.11.0/go.mod h1:BJ5m8e4irnwx/oemuG6eqokK5MFiiMshCuqr07GAnL8= -github.com/scaleway/scaleway-sdk-go v1.0.0-beta.25 h1:/8rfZAdFfafRXOgz+ZpMZZWZ5pYggCY9t7e/BvjaBHM= -github.com/scaleway/scaleway-sdk-go v1.0.0-beta.25/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg= +github.com/scaleway/scaleway-sdk-go v1.0.0-beta.27 h1:yGAraK1uUjlhSXgNMIy8o/J4LFNcy7yeipBqt9N9mVg= +github.com/scaleway/scaleway-sdk-go v1.0.0-beta.27/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg= github.com/sclevine/spec v1.4.0 h1:z/Q9idDcay5m5irkZ28M7PtQM4aOISzOpj4bUPkDee8= github.com/sclevine/spec v1.4.0/go.mod h1:LvpgJaFyvQzRvc1kaDs0bulYwzC70PbiYjC4QnFHkOM= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/shirou/gopsutil/v3 v3.24.4 h1:dEHgzZXt4LMNm+oYELpzl9YCqV65Yr/6SfrvgRBtXeU= -github.com/shirou/gopsutil/v3 v3.24.4/go.mod h1:lTd2mdiOspcqLgAnr9/nGi71NkeMpWKdmhuxm9GusH8= -github.com/shirou/gopsutil/v4 v4.24.5 h1:gGsArG5K6vmsh5hcFOHaPm87UD003CaDMkAOweSQjhM= -github.com/shirou/gopsutil/v4 v4.24.5/go.mod h1:aoebb2vxetJ/yIDZISmduFvVNPHqXQ9SEJwRXxkf0RA= +github.com/shirou/gopsutil/v3 v3.24.5 h1:i0t8kL+kQTvpAYToeuiVk3TgDeKOFioZO3Ztz/iZ9pI= +github.com/shirou/gopsutil/v3 v3.24.5/go.mod h1:bsoOS1aStSs9ErQ1WWfxllSeS1K5D+U30r2NfcubMVk= +github.com/shirou/gopsutil/v4 v4.24.6 h1:9qqCSYF2pgOU+t+NgJtp7Co5+5mHF/HyKBUckySQL64= +github.com/shirou/gopsutil/v4 v4.24.6/go.mod h1:aoebb2vxetJ/yIDZISmduFvVNPHqXQ9SEJwRXxkf0RA= github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= -github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= github.com/shoenig/test v1.7.1 h1:UJcjSAI3aUKx52kfcfhblgyhZceouhvvs3OYdWgn+PY= github.com/shoenig/test v1.7.1/go.mod h1:UxJ6u/x2v/TNs/LoLxBNJRV9DiwBBKYxXSyczsBHFoI= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= @@ -963,13 +951,13 @@ github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= -github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= -github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= +github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= +github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.18.2 h1:LUXCnvUvSM6FXAsj6nnfc8Q2tp1dIgUfY9Kc8GsSOiQ= -github.com/spf13/viper v1.18.2/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMVB+yk= +github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= +github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg= github.com/stoewer/go-strcase v1.3.0 h1:g0eASXYtp+yvN9fK8sH94oCIk0fau9uV1/ZdJ0AVEzs= github.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -1009,10 +997,8 @@ github.com/tidwall/wal v1.1.7 h1:emc1TRjIVsdKKSnpwGBAcsAGg0767SvUk8+ygx7Bb+4= github.com/tidwall/wal v1.1.7/go.mod h1:r6lR1j27W9EPalgHiB7zLJDYu3mzW5BQP5KrzBpYY/E= github.com/tilinna/clock v1.1.0 h1:6IQQQCo6KoBxVudv6gwtY8o4eDfhHo8ojA5dP0MfhSs= github.com/tilinna/clock v1.1.0/go.mod h1:ZsP7BcY7sEEz7ktc0IVy8Us6boDrK8VradlKRUGfOao= -github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= github.com/tklauser/go-sysconf v0.3.14 h1:g5vzr9iPFFz24v2KZXs/pvpvh8/V9Fw6vQK5ZZb78yU= github.com/tklauser/go-sysconf v0.3.14/go.mod h1:1ym4lWMLUOhuBOPGtRcJm7tEGX4SCYNEEEtghGG/8uY= -github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/tklauser/numcpus v0.8.0 h1:Mx4Wwe/FjZLeQsK/6kt2EOepwwSl7SmJrK5bV/dXYgY= github.com/tklauser/numcpus v0.8.0/go.mod h1:ZJZlAY+dmR4eut8epnzf0u/VwodKmryxR8txiloSqBE= github.com/trivago/grok v1.0.0 h1:oV2ljyZT63tgXkmgEHg2U0jMqiKKuL0hkn49s6aRavQ= @@ -1046,134 +1032,144 @@ go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/collector v0.104.0 h1:R3zjM4O3K3+ttzsjPV75P80xalxRbwYTURlK0ys7uyo= -go.opentelemetry.io/collector v0.104.0/go.mod h1:Tm6F3na9ajnOm6I5goU9dURKxq1fSBK1yA94nvUix3k= -go.opentelemetry.io/collector/component v0.104.0 h1:jqu/X9rnv8ha0RNZ1a9+x7OU49KwSMsPbOuIEykHuQE= -go.opentelemetry.io/collector/component v0.104.0/go.mod h1:1C7C0hMVSbXyY1ycCmaMUAR9fVwpgyiNQqxXtEWhVpw= -go.opentelemetry.io/collector/config/configauth v0.104.0 h1:ULtjugImijpKuLgGVt0E0HwiZT7+uDUEtMquh1ODB24= -go.opentelemetry.io/collector/config/configauth v0.104.0/go.mod h1:Til+nLLrQwwhgmfcGTX4ZRcNuMhdaWhBW1jH9DLTabQ= -go.opentelemetry.io/collector/config/configcompression v1.11.0 h1:oTwbcLh7mWHSDUIZXkRJVdNAMoBGS39XF68goTMOQq8= -go.opentelemetry.io/collector/config/configcompression v1.11.0/go.mod h1:6+m0GKCv7JKzaumn7u80A2dLNCuYf5wdR87HWreoBO0= -go.opentelemetry.io/collector/config/configgrpc v0.104.0 h1:E3RtqryQPOm/trJmhlJZj6cCqJNKgv9fOEQvSEpzsFM= -go.opentelemetry.io/collector/config/configgrpc v0.104.0/go.mod h1:tu3ifnJ5pv+4rZcaqNWfvVLjNKb8icSPoClN3THN8PU= -go.opentelemetry.io/collector/config/confighttp v0.104.0 h1:KSY0FSHSjuPyrR6iA2g5oFTozYFpYcy0ssJny8gTNTQ= -go.opentelemetry.io/collector/config/confighttp v0.104.0/go.mod h1:YgSXwuMYHANzzv+IBjHXaBMG/4G2mrseIpICHj+LB3U= -go.opentelemetry.io/collector/config/confignet v0.104.0 h1:i7AOTJf4EQox3SEt1YtQFQR+BwXr3v5D9x3Ai9/ovy8= -go.opentelemetry.io/collector/config/confignet v0.104.0/go.mod h1:pfOrCTfSZEB6H2rKtx41/3RN4dKs+X2EKQbw3MGRh0E= -go.opentelemetry.io/collector/config/configopaque v1.11.0 h1:Pt06PXWVmRaiSX63mzwT8Z9SV/hOc6VHNZbfZ10YY4o= -go.opentelemetry.io/collector/config/configopaque v1.11.0/go.mod h1:0xURn2sOy5j4fbaocpEYfM97HPGsiffkkVudSPyTJlM= -go.opentelemetry.io/collector/config/configretry v0.102.0 h1:UMYkyeSHjQ9AaPblKLrMUPrA9PWdb2nufBevr1yHoCw= -go.opentelemetry.io/collector/config/configretry v0.102.0/go.mod h1:P+RA0IA+QoxnDn4072uyeAk1RIoYiCbxYsjpKX5eFC4= -go.opentelemetry.io/collector/config/configtelemetry v0.104.0 h1:eHv98XIhapZA8MgTiipvi+FDOXoFhCYOwyKReOt+E4E= -go.opentelemetry.io/collector/config/configtelemetry v0.104.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/config/configtls v0.104.0 h1:bMmLz2+r+REpO7cDOR+srOJHfitqTZfSZCffDpKfwWk= -go.opentelemetry.io/collector/config/configtls v0.104.0/go.mod h1:e33o7TWcKfe4ToLFyGISEPGMgp6ezf3yHRGY4gs9nKk= -go.opentelemetry.io/collector/config/internal v0.104.0 h1:h3OkxTfXWWrHRyPEGMpJb4fH+54puSBuzm6GQbuEZ2o= -go.opentelemetry.io/collector/config/internal v0.104.0/go.mod h1:KjH43jsAUFyZPeTOz7GrPORMQCK13wRMCyQpWk99gMo= -go.opentelemetry.io/collector/confmap v0.104.0 h1:d3yuwX+CHpoyCh0iMv3rqb/vwAekjSm4ZDL6UK1nZSA= -go.opentelemetry.io/collector/confmap v0.104.0/go.mod h1:F8Lue+tPPn2oldXcfqI75PPMJoyzgUsKVtM/uHZLA4w= -go.opentelemetry.io/collector/confmap/converter/expandconverter v0.104.0 h1:7BhJk71V8xhm8wUpuHG4CVRAPu8JajKj8VmGZ6zS7SA= -go.opentelemetry.io/collector/confmap/converter/expandconverter v0.104.0/go.mod h1:o2xTZJpc65SyYPOAGOjyvWwQEqYSWT4Q4/gMfOYpAzc= -go.opentelemetry.io/collector/confmap/provider/envprovider v0.104.0 h1:/3iSlUHH1Q3xeZc55oVekd4dibXzqgphXZI7EaYJ+ak= -go.opentelemetry.io/collector/confmap/provider/envprovider v0.104.0/go.mod h1:RZDXvP81JwvIGeq3rvDBrRKMUfn2BeKCmppHm4Qm0D8= -go.opentelemetry.io/collector/confmap/provider/fileprovider v0.104.0 h1:B+nMVlIUQxuP52CZSegGuA2z9S+Cv2XwFb2a/TLFPhc= -go.opentelemetry.io/collector/confmap/provider/fileprovider v0.104.0/go.mod h1:O0RcaP/I/kn7JHrwohUfj6AwvQYLxjbqg/HnjkvLLTw= -go.opentelemetry.io/collector/confmap/provider/httpprovider v0.104.0 h1:6UreSAu64Ft3VfKWE3sjcmf+mWMyWemSsrjS/fjRPpQ= -go.opentelemetry.io/collector/confmap/provider/httpprovider v0.104.0/go.mod h1:+vP6R5i9h+oYJNjp4bQHvtSHEu1t+CgSKIeZYZZRQXA= -go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.104.0 h1:y07I19lmp9VHZ58PJ3nwwd1wqumnIBeMxTNBSh/Vn6k= -go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.104.0/go.mod h1:WV1HOa0z3Ln5ZkwEW7Cm2pCHkfzYY9kBe0dLy8DqeYA= -go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.104.0 h1:itBGhyEbX+iz8kz3nc4PYxQx4bL7y87xXNUcGnbKPuY= -go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.104.0/go.mod h1:iPVsTBkRFHZ21UEfSGWk8c4maOzTp6BWWpTk+l6PjJI= -go.opentelemetry.io/collector/connector v0.102.0 h1:IvAsVfYRxP0ajmKbUovF8qugkcUtHq6RuYNtjcMa63E= -go.opentelemetry.io/collector/connector v0.102.0/go.mod h1:f4M7wZ/9+XtgTE0fivBFH3WlwntaEd0qFFA0giFkdnY= -go.opentelemetry.io/collector/connector/forwardconnector v0.102.0 h1:g68oHc8sRQ34gIWkq4S/zYS3x0x4PCC3SpC3f3BsM0M= -go.opentelemetry.io/collector/connector/forwardconnector v0.102.0/go.mod h1:ZqgFEDwgdRvoDkA5wH3A/d4ox2KTk+UNKLAHLTvGmPI= -go.opentelemetry.io/collector/consumer v0.104.0 h1:Z1ZjapFp5mUcbkGEL96ljpqLIUMhRgQQpYKkDRtxy+4= -go.opentelemetry.io/collector/consumer v0.104.0/go.mod h1:60zcIb0W9GW0z9uJCv6NmjpSbCfBOeRUyrtEwqK6Hzo= -go.opentelemetry.io/collector/exporter v0.102.0 h1:hvyTyyGVx5FIikA6HzlTeZHILJ62hrIBsoZCoKlpX3A= -go.opentelemetry.io/collector/exporter v0.102.0/go.mod h1:JWE+1qNoSVBSelzhI3Iao/VkYVssY+sXaTPK1JOmpQ0= -go.opentelemetry.io/collector/exporter/debugexporter v0.102.0 h1:b8z8EHdb3Q4f1A/lr6zP9aVv+7HTsouV0XCR8zb+R4w= -go.opentelemetry.io/collector/exporter/debugexporter v0.102.0/go.mod h1:fuFR9OIDtNe/ZGUp1YwrO2t0jy1/AIi4P93e+OoMCWA= -go.opentelemetry.io/collector/exporter/otlpexporter v0.102.0 h1:Nz2ULE5JfDj/houoV+VYSXTWP3/54/kCXH26WjJUNjI= -go.opentelemetry.io/collector/exporter/otlpexporter v0.102.0/go.mod h1:jaMS+3T8lwFc0jEjbqqOC+ArTwpGzR5De8u/jPncyKM= -go.opentelemetry.io/collector/exporter/otlphttpexporter v0.102.0 h1:ayoDBhSkXPrHO/L9MQKhZA/OCDZaOMEfosm+KMw4LBA= -go.opentelemetry.io/collector/exporter/otlphttpexporter v0.102.0/go.mod h1:9SN1giFZMQD0cWqYaBbUIjTnAI7/pWfEBwLosfHwWuY= -go.opentelemetry.io/collector/extension v0.104.0 h1:bftkgFMKya/QIwK+bOxEAPVs/TvTez+s1mlaiUznJkA= -go.opentelemetry.io/collector/extension v0.104.0/go.mod h1:x7K0KyM1JGrtLbafEbRoVp0VpGBHpyx9hu87bsja6S4= -go.opentelemetry.io/collector/extension/auth v0.104.0 h1:SelhccGCrqLThPlkbv6lbAowHsjgOTAWcAPz085IEC4= -go.opentelemetry.io/collector/extension/auth v0.104.0/go.mod h1:s3/C7LTSfa91QK0JPMTRIvH/gCv+a4DGiiNeTAX9OhI= -go.opentelemetry.io/collector/extension/ballastextension v0.102.0 h1:p4gIucFZlTbV4VJ0zxUi8bkQFHnBCimYCe+nZwuPoHk= -go.opentelemetry.io/collector/extension/ballastextension v0.102.0/go.mod h1:hymqiVdV2Fu40lrXk8jm3uQsIFiUu2Fb8ptSzl5Emzw= -go.opentelemetry.io/collector/extension/zpagesextension v0.102.0 h1:BPq98py8nwzaV7KAsxt4ZZAF9LiSRu7ZjHNGavFNyKo= -go.opentelemetry.io/collector/extension/zpagesextension v0.102.0/go.mod h1:P86HW3x3epDS5F4yP0gAvsZiw4xxP1OupTEx2o6UqjY= -go.opentelemetry.io/collector/featuregate v1.11.0 h1:Z7puIymKoQRm3oNM/NH8reWc2zRPz2PNaJvuokh0lQY= -go.opentelemetry.io/collector/featuregate v1.11.0/go.mod h1:PsOINaGgTiFc+Tzu2K/X2jP+Ngmlp7YKGV1XrnBkH7U= -go.opentelemetry.io/collector/filter v0.104.0 h1:6BkLJuqWtWFdXHEgbn4TpK5d7Ha5aMdDhLmdvZ6VHxk= -go.opentelemetry.io/collector/filter v0.104.0/go.mod h1:l9+6CTcA0wHOg+J3HSereMuXy47cHPGiHevCun0SbNM= -go.opentelemetry.io/collector/otelcol v0.102.0 h1:HuE+ok4iUjOrmYhQBSWpG5kBTVhcA24ljPL4pBERZ5E= -go.opentelemetry.io/collector/otelcol v0.102.0/go.mod h1:w8pCRu2nM/jAkLlEAS6ccKtJv5ylUQe6Ugl98zzTfyE= -go.opentelemetry.io/collector/pdata v1.11.0 h1:rzYyV1zfTQQz1DI9hCiaKyyaczqawN75XO9mdXmR/hE= -go.opentelemetry.io/collector/pdata v1.11.0/go.mod h1:IHxHsp+Jq/xfjORQMDJjSH6jvedOSTOyu3nbxqhWSYE= -go.opentelemetry.io/collector/pdata/pprofile v0.104.0 h1:MYOIHvPlKEJbWLiBKFQWGD0xd2u22xGVLt4jPbdxP4Y= -go.opentelemetry.io/collector/pdata/pprofile v0.104.0/go.mod h1:7WpyHk2wJZRx70CGkBio8klrYTTXASbyIhf+rH4FKnA= -go.opentelemetry.io/collector/pdata/testdata v0.104.0 h1:BKTZ7hIyAX5DMPecrXkVB2e86HwWtJyOlXn/5vSVXNw= -go.opentelemetry.io/collector/pdata/testdata v0.104.0/go.mod h1:3SnYKu8gLfxURJMWS/cFEUFs+jEKS6jvfqKXnOZsdkQ= -go.opentelemetry.io/collector/processor v0.103.0 h1:YZ+LRuHKtOam7SCeLkJAP6bS1d6XxeYP22OyMN3VP0s= -go.opentelemetry.io/collector/processor v0.103.0/go.mod h1:/mxyh0NpJgpZycm7iHDpM7i5PdtWvKKdCZf0cyADJfU= -go.opentelemetry.io/collector/processor/batchprocessor v0.102.0 h1:lJSIMwip+Po5jOF/4dpx6c/3N45KJTr/UZoT086T4mI= -go.opentelemetry.io/collector/processor/batchprocessor v0.102.0/go.mod h1:e71Y6SnrCjD19dPjxWWi/kXa5tb0J8rC+9xl/72mLo4= -go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.102.0 h1:osoITPX0RITC8gJkyaNC6rqSKFl9wCeOqagjdNZUL70= -go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.102.0/go.mod h1:2OVM2IJOWVdxkOOt0WCyQSMv2T19OSKNIy1KCqHGXyY= -go.opentelemetry.io/collector/receiver v0.104.0 h1:URL1ExkYYd+qbndm7CdGvI2mxzsv/pNfmwJ+1QSQ9/o= -go.opentelemetry.io/collector/receiver v0.104.0/go.mod h1:+enTCZQLf6dRRANWvykXEzrlRw2JDppXJtoYWd/Dd54= -go.opentelemetry.io/collector/receiver/nopreceiver v0.104.0 h1:xkfiTIGEXMXosYbZe8C8tIEZiw+gEL8QhCxz8slSYcM= -go.opentelemetry.io/collector/receiver/nopreceiver v0.104.0/go.mod h1:9vZPqdvOBDh9fKugWiv8WIINkF+TFpOw7RhvZxctZ9w= -go.opentelemetry.io/collector/receiver/otlpreceiver v0.104.0 h1:t9cACuSc7kY09guws7VyB/z9QnG7/zWLC1NQ29WH4+o= -go.opentelemetry.io/collector/receiver/otlpreceiver v0.104.0/go.mod h1:sPIIO4F6uit1i/XQgfe2WryvdO5Hr16bQgZTaXcR8mM= -go.opentelemetry.io/collector/semconv v0.104.0 h1:dUvajnh+AYJLEW/XOPk0T0BlwltSdi3vrjO7nSOos3k= -go.opentelemetry.io/collector/semconv v0.104.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= -go.opentelemetry.io/collector/service v0.102.0 h1:B5nfyQZF7eB/y+yucl9G/7VsusbXixYXWingXn7VszM= -go.opentelemetry.io/collector/service v0.102.0/go.mod h1:c+0n0DfQeCjgrdplNHYwYbG/5aupTZVYU/50nMQraoc= -go.opentelemetry.io/contrib/config v0.7.0 h1:b1rK5tGTuhhPirJiMxOcyQfZs76j2VapY6ODn3b2Dbs= -go.opentelemetry.io/contrib/config v0.7.0/go.mod h1:8tdiFd8N5etOi3XzBmAoMxplEzI3TcL8dU5rM5/xcOQ= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0 h1:vS1Ao/R55RNV4O7TA2Qopok8yN+X0LIP6RVWLFkprck= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0/go.mod h1:BMsdeOxN04K0L5FNUBfjFdvwWGNe/rkmSwH4Aelu/X0= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 h1:9l89oX4ba9kHbBol3Xin3leYJ+252h0zszDtBwyKe2A= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0/go.mod h1:XLZfZboOJWHNKUv7eH0inh0E9VV6eWDFB/9yJyTLPp0= -go.opentelemetry.io/contrib/propagators/b3 v1.27.0 h1:IjgxbomVrV9za6bRi8fWCNXENs0co37SZedQilP2hm0= -go.opentelemetry.io/contrib/propagators/b3 v1.27.0/go.mod h1:Dv9obQz25lCisDvvs4dy28UPh974CxkahRDUPsY7y9E= -go.opentelemetry.io/contrib/zpages v0.52.0 h1:MPgkMy0Cp3O5EdfVXP0ss3ujhEibysTM4eszx7E7d+E= -go.opentelemetry.io/contrib/zpages v0.52.0/go.mod h1:fqG5AFdoYru3A3DnhibVuaaEfQV2WKxE7fYE1jgDRwk= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/bridge/opencensus v1.27.0 h1:ao9aGGHd+G4YfjBpGs6vbkvt5hoC67STlJA9fCnOAcs= -go.opentelemetry.io/otel/bridge/opencensus v1.27.0/go.mod h1:uRvWtAAXzyVOST0WMPX5JHGBaAvBws+2F8PcC5gMnTk= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0 h1:bFgvUr3/O4PHj3VQcFEuYKvRZJX1SJDQ+11JXuSB3/w= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0/go.mod h1:xJntEd2KL6Qdg5lwp97HMLQDVeAhrYxmzFseAMDPQ8I= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0 h1:CIHWikMsN3wO+wq1Tp5VGdVRTcON+DmOJSfDjXypKOc= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0/go.mod h1:TNupZ6cxqyFEpLXAZW7On+mLFL0/g0TE3unIYL91xWc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 h1:R9DE4kQ4k+YtfLI2ULwX82VtNQ2J8yZmA7ZIF/D+7Mc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0/go.mod h1:OQFyQVrDlbe+R7xrEyDr/2Wr67Ol0hRUgsfA+V5A95s= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 h1:qFffATk0X+HD+f1Z8lswGiOQYKHRlzfmdJm0wEaVrFA= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0/go.mod h1:MOiCmryaYtc+V0Ei+Tx9o5S1ZjA7kzLucuVuyzBZloQ= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0 h1:QY7/0NeRPKlzusf40ZE4t1VlMKbqSNT7cJRYzWuja0s= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0/go.mod h1:HVkSiDhTM9BoUJU8qE6j2eSWLLXvi1USXjyd2BXT8PY= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.27.0 h1:/jlt1Y8gXWiHG9FBx6cJaIC5hYx5Fe64nC8w5Cylt/0= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.27.0/go.mod h1:bmToOGOBZ4hA9ghphIc1PAf66VA8KOtsuy3+ScStG20= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.27.0 h1:/0YaXu3755A/cFbtXp+21lkXgI0QE5avTWA2HjU9/WE= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.27.0/go.mod h1:m7SFxp0/7IxmJPLIY3JhOcU9CoFzDaCPL6xxQIxhA+o= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= -go.opentelemetry.io/proto/otlp v1.2.0 h1:pVeZGk7nXDC9O2hncA6nHldxEjm6LByfA2aN8IOkz94= -go.opentelemetry.io/proto/otlp v1.2.0/go.mod h1:gGpR8txAl5M03pDhMC79G6SdqNV26naRm/KDsgaHD8A= +go.opentelemetry.io/collector v0.105.0 h1:Qw/ONVMPT3aD8HjdDRcXCGoZrtSWH3jx4BkwAN1yrEM= +go.opentelemetry.io/collector v0.105.0/go.mod h1:UVapTqB4fJeZpGU/YgOo6665cxCSytqYmMkVmRlu2cg= +go.opentelemetry.io/collector/component v0.105.0 h1:/OdkWHd1xTNX7JRq9iW3AFoJAnYUOGZZyOprNQkGoTI= +go.opentelemetry.io/collector/component v0.105.0/go.mod h1:s8KoxOrhNIBzetkb0LHmzX1OI67DyZbaaUPOWIXS1mg= +go.opentelemetry.io/collector/config/configauth v0.105.0 h1:9Pa65Ay4kdmMsp5mg+/791GvCYy1hHOroIlKBiJzlps= +go.opentelemetry.io/collector/config/configauth v0.105.0/go.mod h1:iL62YzyFCNr1Se0EDYaQ792CFCBiFivSbTWekd4g1VE= +go.opentelemetry.io/collector/config/configcompression v1.12.0 h1:RxqSDVZPJyL7I3v+gdVDvnJ/9tV0ZWgraRDX/gaddfA= +go.opentelemetry.io/collector/config/configcompression v1.12.0/go.mod h1:6+m0GKCv7JKzaumn7u80A2dLNCuYf5wdR87HWreoBO0= +go.opentelemetry.io/collector/config/configgrpc v0.105.0 h1:3IbN6+5c42Bp6CGPKoXZ7QkkQpRxnV01KRse6oD+bd0= +go.opentelemetry.io/collector/config/configgrpc v0.105.0/go.mod h1:wrFPXVXk4so7yYisuPeebZtU6ECzG5aXOYNdfyoHSnI= +go.opentelemetry.io/collector/config/confighttp v0.105.0 h1:0sVdNFuLikgDhxdp+mrbSrYzovwRxZDVIhv9ZQ0X5e4= +go.opentelemetry.io/collector/config/confighttp v0.105.0/go.mod h1:1JMvF8ocjlNxwrVIUJHy9wTEW/nlKs1LLPlTSg4D044= +go.opentelemetry.io/collector/config/confignet v0.105.0 h1:O8kenkWnLPemp2XXVOqFv6OQd9wsnOvBUvl3OlJGPKI= +go.opentelemetry.io/collector/config/confignet v0.105.0/go.mod h1:pfOrCTfSZEB6H2rKtx41/3RN4dKs+X2EKQbw3MGRh0E= +go.opentelemetry.io/collector/config/configopaque v1.12.0 h1:aIsp9NdcLZSiG4YDoFPGXhmma03Tk+6e89+n8GtU/Mc= +go.opentelemetry.io/collector/config/configopaque v1.12.0/go.mod h1:0xURn2sOy5j4fbaocpEYfM97HPGsiffkkVudSPyTJlM= +go.opentelemetry.io/collector/config/configretry v1.12.0 h1:tEBwueO4AIkwWosxz6NWqnghdZ7y5SfHcIzLrvh6kB8= +go.opentelemetry.io/collector/config/configretry v1.12.0/go.mod h1:P+RA0IA+QoxnDn4072uyeAk1RIoYiCbxYsjpKX5eFC4= +go.opentelemetry.io/collector/config/configtelemetry v0.105.0 h1:wEfUxAjjstp47aLr2s1cMZiH0dt+k42m6VC6HigqgJA= +go.opentelemetry.io/collector/config/configtelemetry v0.105.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= +go.opentelemetry.io/collector/config/configtls v1.12.0 h1:Px0+GE4LE/9sXMgkwBb5g8QHWvnrnuRg9BLSa+QtxgM= +go.opentelemetry.io/collector/config/configtls v1.12.0/go.mod h1:aeCGPlvrWhc+EySpIKdelPAj4l9wXKzZPouQO3NIoTs= +go.opentelemetry.io/collector/config/internal v0.105.0 h1:PWnbeslkIGMjZzh5IJRjO6bA02d1Xrkjw2N60ixWzqQ= +go.opentelemetry.io/collector/config/internal v0.105.0/go.mod h1:+Y5vRJ+lio2uuYlVPfy9AZVrip9Y0B9PiUA5Vz7lzZw= +go.opentelemetry.io/collector/confmap v0.105.0 h1:3NP2BbUju42rjeQvRbmpCJGJGvbiV3WnGyXsVmocimo= +go.opentelemetry.io/collector/confmap v0.105.0/go.mod h1:Oj1xUBRvAuL8OWWMj9sSYf1uQpB+AErpj+FKGUQLBI0= +go.opentelemetry.io/collector/confmap/converter/expandconverter v0.105.0 h1:1c81AJg+WP+dGoAEftmc0KF5RK0mh4bxIFlU902CnFI= +go.opentelemetry.io/collector/confmap/converter/expandconverter v0.105.0/go.mod h1:ImkfsdJToeP3ZZ5ZVmQUdaKEueVHiZbwrQGyoDx/EiM= +go.opentelemetry.io/collector/confmap/provider/envprovider v0.105.0 h1:r+5ZxhDLYqd6klLky3gtgWHgG5L2LX6o6VIvaLG39Gs= +go.opentelemetry.io/collector/confmap/provider/envprovider v0.105.0/go.mod h1:Srzkp9izW29pJtwoVtpL+bAN5ibtv+fyLg9JWZzCCi8= +go.opentelemetry.io/collector/confmap/provider/fileprovider v0.105.0 h1:RgQwEbJgx+BihDt8yhiqmEi8IjQYFwbzsYRcTzvM7E4= +go.opentelemetry.io/collector/confmap/provider/fileprovider v0.105.0/go.mod h1:P7oT+6eaMv+ZyPSu6SEKalfR/UALdQgE3hq36b0Iww4= +go.opentelemetry.io/collector/confmap/provider/httpprovider v0.105.0 h1:hgzauRlEZId1AM00g3EHl4GaR4GLG23sdvmSRWQ9iFQ= +go.opentelemetry.io/collector/confmap/provider/httpprovider v0.105.0/go.mod h1:TqZbmLcG9GvLp76q45eE0EwiTHBmj4qRP32fI48DH5Q= +go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.105.0 h1:xQr2I7iQPDkFP/E2H9lg6jfAtpY1iz2oLGEFwa2FaeE= +go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.105.0/go.mod h1:UVTcdI8WhTXl8duc0EkeJU7nSQNptHwE6D/eqgeand0= +go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.105.0 h1:SAF6JFrjQ8YkFnggA5iiw9eKiBYDaO6ynK0Dl+vzIgw= +go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.105.0/go.mod h1:bWMg+SNk/PwEMiLWV0eCFNL4Er59aXsdDKq+2JzMOkE= +go.opentelemetry.io/collector/connector v0.105.0 h1:hmTsI6rnPAXsdVJ+wYrgeNTCrQzxzglU37qPlNSKTy0= +go.opentelemetry.io/collector/connector v0.105.0/go.mod h1:xQnq1Ygd/F4Kb93E0UsKus5YDINeyQ6GzCkxoujI9TE= +go.opentelemetry.io/collector/connector/forwardconnector v0.105.0 h1:e9gvf11xfijwraZLBf3IHXEk1YpXxMoJfqXarYo7ZNU= +go.opentelemetry.io/collector/connector/forwardconnector v0.105.0/go.mod h1:XIeSscBCAcpywFa7oVwTOpdHjRojS7No6Yz34YhFBp4= +go.opentelemetry.io/collector/consumer v0.105.0 h1:pO5Tspoz7yvEs81+904HfDjByP8Z7uuNk+7pOr3lRHM= +go.opentelemetry.io/collector/consumer v0.105.0/go.mod h1:tnaPDHUfKBJ01OnsJNRecniG9iciE+xHYLqamYwFQOQ= +go.opentelemetry.io/collector/exporter v0.105.0 h1:O2xmjfaRbkbpo3XkwEcnuBHCoXc5kS9CjYO8geu+3vo= +go.opentelemetry.io/collector/exporter v0.105.0/go.mod h1:5ulGEHRZyGbX4DWHJa2Br6Fr/W1Lay8ayf++1WrVvgk= +go.opentelemetry.io/collector/exporter/debugexporter v0.105.0 h1:Osqo7+pr1vZbt+12KMzZrst6uMv1r8UJZjTgI6vwqL4= +go.opentelemetry.io/collector/exporter/debugexporter v0.105.0/go.mod h1:rqjWoduh/qj6OlttzdbB8Ji6Vp4SoHJRnZHNuS/Mkp0= +go.opentelemetry.io/collector/exporter/otlpexporter v0.105.0 h1:JWAlh7A1oNm4LqUrrtPjAmUdvcE11VZCeJhMk0lShYg= +go.opentelemetry.io/collector/exporter/otlpexporter v0.105.0/go.mod h1:aA2E+t2giwUoJ2RmDw+2dVox64J2zHpTT2m/mi7zOIM= +go.opentelemetry.io/collector/exporter/otlphttpexporter v0.105.0 h1:ciJvNlC9ztoeyIi23TCpZ6PN7l75tl/yvKqBo0Cmajw= +go.opentelemetry.io/collector/exporter/otlphttpexporter v0.105.0/go.mod h1:e+PdCkQkP+1cj0+cijRfmE4/VjofxeeWoS1cvvu39HI= +go.opentelemetry.io/collector/extension v0.105.0 h1:R8i4HMvuSm20Nt3onyrLk19KKhjCNAsgS8FGh60rcZU= +go.opentelemetry.io/collector/extension v0.105.0/go.mod h1:oyX960URG27esNKitf3o2rqcBj0ajcx+dxkCxwRz34U= +go.opentelemetry.io/collector/extension/auth v0.105.0 h1:5gzRSHU0obVtZDzLLJQ/p4sIkacUsyEEpBiBRDs82Hk= +go.opentelemetry.io/collector/extension/auth v0.105.0/go.mod h1:zf45v7u1nKbdDHeMuhBVdSFwhbq2w9IWCbFKcDSkW5I= +go.opentelemetry.io/collector/extension/ballastextension v0.105.0 h1:JAihRR9cu35lGI6mGvxrwVcUHaPO7n++RaC4oouZics= +go.opentelemetry.io/collector/extension/ballastextension v0.105.0/go.mod h1:2PgAJVYhBDWv3gl/vZ6nblHoVQMrwWheKE+RjXFozdM= +go.opentelemetry.io/collector/extension/zpagesextension v0.105.0 h1:rD77+hMPaSuBOh8w6un+x0VI5oM2oAsSzAC9nKTNauE= +go.opentelemetry.io/collector/extension/zpagesextension v0.105.0/go.mod h1:vDuL/PBfZfHpOyF2XCJ/jWfHn/hu2pCE5KVRGCHOX+k= +go.opentelemetry.io/collector/featuregate v1.12.0 h1:l5WbV2vMQd2bL8ubfGrbKNtZaeJRckE12CTHvRe47Tw= +go.opentelemetry.io/collector/featuregate v1.12.0/go.mod h1:PsOINaGgTiFc+Tzu2K/X2jP+Ngmlp7YKGV1XrnBkH7U= +go.opentelemetry.io/collector/filter v0.105.0 h1:8GVqpSx6RIOQv/SWun9zaQ63sUoqPXrdUJ4D6O13h1s= +go.opentelemetry.io/collector/filter v0.105.0/go.mod h1:wzg7KEZ9h0bqRrMwag0/c+QkZ1pI2VOuQ/ZCfiWkSzw= +go.opentelemetry.io/collector/internal/globalgates v0.105.0 h1:U/CwnTUXtrblD1sZ6ri7KWfYoTNjQd7GjJKrX/phRik= +go.opentelemetry.io/collector/internal/globalgates v0.105.0/go.mod h1:Z5US6O2xkZAtxVSSBnHAPFZwPhFoxlyKLUvS67Vx4gc= +go.opentelemetry.io/collector/otelcol v0.105.0 h1:2YMp/OckEc4qEfIjx3pi7W7xr+nW03KdrdhHAt3NmYY= +go.opentelemetry.io/collector/otelcol v0.105.0/go.mod h1:SwdiOY/0szbyuJ1sDDv66W5nFPVkA9hOhQoEBAFbHA0= +go.opentelemetry.io/collector/otelcol/otelcoltest v0.105.0 h1:9lsIRe8USoagWx5CfAgo/GUzDmNZPMdRpAnrpnh8Ico= +go.opentelemetry.io/collector/otelcol/otelcoltest v0.105.0/go.mod h1:CYkgeMec/MdyT3/lKZNywARgg55cwEEgoSCP5Pm/GLI= +go.opentelemetry.io/collector/pdata v1.12.0 h1:Xx5VK1p4VO0md8MWm2icwC1MnJ7f8EimKItMWw46BmA= +go.opentelemetry.io/collector/pdata v1.12.0/go.mod h1:MYeB0MmMAxeM0hstCFrCqWLzdyeYySim2dG6pDT6nYI= +go.opentelemetry.io/collector/pdata/pprofile v0.105.0 h1:C+Hd7CNcepL/364OBV9f4lHzJil2jQSOxcEM1PFXGDg= +go.opentelemetry.io/collector/pdata/pprofile v0.105.0/go.mod h1:chr7lMJIzyXkccnPRkIPhyXtqLZLSReZYhwsggOGEfg= +go.opentelemetry.io/collector/pdata/testdata v0.105.0 h1:5sPZzanR4nJR3sNQk3MTdArdEZCK0NRAfC29t0Dtf60= +go.opentelemetry.io/collector/pdata/testdata v0.105.0/go.mod h1:NIfgaclQp/M1BZhgyc/7hDWD+/DumC/OMBQVI2KW+N0= +go.opentelemetry.io/collector/processor v0.105.0 h1:LE6wEMWNa3h7eOJLMBm2lA0v6sc2j6Geqv1e3pIWS8Y= +go.opentelemetry.io/collector/processor v0.105.0/go.mod h1:QAvMEtd3k+YhRrnaEgs/8e0UueYonuT8Hg4udQOht60= +go.opentelemetry.io/collector/processor/batchprocessor v0.105.0 h1:j9f7EWmaR6kaQubKE0L3lvZxoIEppRyTAvqLDmp2Jig= +go.opentelemetry.io/collector/processor/batchprocessor v0.105.0/go.mod h1:klVt/0Egd7LSgWyxlSpgNvLMQRaqfUJg7Nv4qdpQOHA= +go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.105.0 h1:qPjFg7uWmsVvf0Kk11WzM6Zy//zNZFC5uFwYKFXlEn8= +go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.105.0/go.mod h1:0pgvBY04E2bRq5dY3Qfj66mKpkFnu252FNm7iiFEiAU= +go.opentelemetry.io/collector/receiver v0.105.0 h1:eZF97kMUnKJ20Uc4PaDlgLIGmaA8kyLqhH+vMXjh92U= +go.opentelemetry.io/collector/receiver v0.105.0/go.mod h1:nGKDXLUGVHxMBJ5QLfsJ/bIhGvoMGqsN0pZtD5SC8sE= +go.opentelemetry.io/collector/receiver/nopreceiver v0.105.0 h1:zl8YjvbDd9vdcuKSKIaaAPxeWS/Vsa7SadkRxYyxs3Q= +go.opentelemetry.io/collector/receiver/nopreceiver v0.105.0/go.mod h1:+HlcvNdW/FrXZCir5K/DtTcZkRfmAtoy2v+CNG+HFAI= +go.opentelemetry.io/collector/receiver/otlpreceiver v0.105.0 h1:1qjnvrnDcEaj93WgyrWRWTTAGNODaxi98wNcXiHDwfM= +go.opentelemetry.io/collector/receiver/otlpreceiver v0.105.0/go.mod h1:XGs9OAQQFDfVhSzruLcFNdzhTw2kbZZAV68iRE9ecGA= +go.opentelemetry.io/collector/semconv v0.105.0 h1:8p6dZ3JfxFTjbY38d8xlQGB1TQ3nPUvs+D0RERniZ1g= +go.opentelemetry.io/collector/semconv v0.105.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= +go.opentelemetry.io/collector/service v0.105.0 h1:93dqJVNKToEvYDYZO2pHrN8f6Uev4+xhzzmw4qwgAzE= +go.opentelemetry.io/collector/service v0.105.0/go.mod h1:H0fD5SZjV2AZTgHEjRhObnP8YrhG2etAh9rsWLtmimQ= +go.opentelemetry.io/contrib/config v0.8.0 h1:OD7aDMhL+2EpzdSHfkDmcdD/uUA+PgKM5faFyF9XFT0= +go.opentelemetry.io/contrib/config v0.8.0/go.mod h1:dGeVZWE//3wrxYHHP0iCBYJU1QmOmPcbV+FNB7pjDYI= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0 h1:9G6E0TXzGFVfTnawRzrPl83iHOAV7L8NJiR8RSGYV1g= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0/go.mod h1:azvtTADFQJA8mX80jIH/akaE7h+dbm/sVuaHqN13w74= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 h1:4K4tsIXefpVJtvA/8srF4V4y0akAoPHkIslgAkjixJA= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0/go.mod h1:jjdQuTGVsXV4vSs+CJ2qYDeDPf9yIJV23qlIzBm73Vg= +go.opentelemetry.io/contrib/propagators/b3 v1.28.0 h1:XR6CFQrQ/ttAYmTBX2loUEFGdk1h17pxYI8828dk/1Y= +go.opentelemetry.io/contrib/propagators/b3 v1.28.0/go.mod h1:DWRkzJONLquRz7OJPh2rRbZ7MugQj62rk7g6HRnEqh0= +go.opentelemetry.io/contrib/zpages v0.53.0 h1:hGgaJ3nrescxEk383gOBHA5gNfoquHs8oV/XcKYxJkw= +go.opentelemetry.io/contrib/zpages v0.53.0/go.mod h1:iOo8fpUxMAu5+4x9DSEQeUOCeY19KaN6v2OPSeIggz4= +go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo= +go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4= +go.opentelemetry.io/otel/bridge/opencensus v1.28.0 h1:/BcyAV1bUJjSVxoeKwTQL9cS4X1iC6izZ9mheeuVSCU= +go.opentelemetry.io/otel/bridge/opencensus v1.28.0/go.mod h1:FZp2xE+46yAyp3DfLFALze58nY0iIE8zs+mCgkPAzq0= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.4.0 h1:zBPZAISA9NOc5cE8zydqDiS0itvg/P/0Hn9m72a5gvM= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.4.0/go.mod h1:gcj2fFjEsqpV3fXuzAA+0Ze1p2/4MJ4T7d77AmkvueQ= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.28.0 h1:U2guen0GhqH8o/G2un8f/aG/y++OuW6MyCo6hT9prXk= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.28.0/go.mod h1:yeGZANgEcpdx/WK0IvvRFC+2oLiMS2u4L/0Rj2M2Qr0= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.28.0 h1:aLmmtjRke7LPDQ3lvpFz+kNEH43faFhzW7v8BFIEydg= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.28.0/go.mod h1:TC1pyCt6G9Sjb4bQpShH+P5R53pO6ZuGnHuuln9xMeE= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 h1:3Q/xZUyC1BBkualc9ROb4G8qkH90LXEIICcs5zv1OYY= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0/go.mod h1:s75jGIWA9OfCMzF0xr+ZgfrB5FEbbV7UuYo32ahUiFI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 h1:R3X6ZXmNPRR8ul6i3WgFURCHzaXjHdm0karRG/+dj3s= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0/go.mod h1:QWFXnDavXWwMx2EEcZsf3yxgEKAqsxQ+Syjp+seyInw= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0 h1:j9+03ymgYhPKmeXGk5Zu+cIZOlVzd9Zv7QIiyItjFBU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0/go.mod h1:Y5+XiUG4Emn1hTfciPzGPJaSI+RpDts6BnCIir0SLqk= +go.opentelemetry.io/otel/exporters/prometheus v0.50.0 h1:2Ewsda6hejmbhGFyUvWZjUThC98Cf8Zy6g0zkIimOng= +go.opentelemetry.io/otel/exporters/prometheus v0.50.0/go.mod h1:pMm5PkUo5YwbLiuEf7t2xg4wbP0/eSJrMxIMxKosynY= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.28.0 h1:BJee2iLkfRfl9lc7aFmBwkWxY/RI1RDdXepSF6y8TPE= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.28.0/go.mod h1:DIzlHs3DRscCIBU3Y9YSzPfScwnYnzfnCd4g8zA7bZc= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0 h1:EVSnY9JbEEW92bEkIYOVMw4q1WJxIAGoFTrtYOzWuRQ= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0/go.mod h1:Ea1N1QQryNXpCD0I1fdLibBAIpQuBkznMmkdKrapk1Y= +go.opentelemetry.io/otel/log v0.4.0 h1:/vZ+3Utqh18e8TPjuc3ecg284078KWrR8BRz+PQAj3o= +go.opentelemetry.io/otel/log v0.4.0/go.mod h1:DhGnQvky7pHy82MIRV43iXh3FlKN8UUKftn0KbLOq6I= +go.opentelemetry.io/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6bOeuA5Q= +go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s= +go.opentelemetry.io/otel/sdk v1.28.0 h1:b9d7hIry8yZsgtbmM0DKyPWMMUMlK9NEKuIG4aBqWyE= +go.opentelemetry.io/otel/sdk v1.28.0/go.mod h1:oYj7ClPUA7Iw3m+r7GeEjz0qckQRJK2B8zjcZEfu7Pg= +go.opentelemetry.io/otel/sdk/log v0.4.0 h1:1mMI22L82zLqf6KtkjrRy5BbagOTWdJsqMY/HSqILAA= +go.opentelemetry.io/otel/sdk/log v0.4.0/go.mod h1:AYJ9FVF0hNOgAVzUG/ybg/QttnXhUePWAupmCqtdESo= +go.opentelemetry.io/otel/sdk/metric v1.28.0 h1:OkuaKgKrgAbYrrY0t92c+cC+2F6hsFNnCQArXCKlg08= +go.opentelemetry.io/otel/sdk/metric v1.28.0/go.mod h1:cWPjykihLAPvXKi4iZc1dpER3Jdq2Z0YLse3moQUCpg= +go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g= +go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI= +go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= +go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= @@ -1202,7 +1198,7 @@ golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWP golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30= golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1285,7 +1281,7 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= -golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys= golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -1294,8 +1290,8 @@ golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4Iltr golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.20.0 h1:4mQdhULixXKP1rwYBW0vAijoXnkTG0BLCDRzfe1idMo= -golang.org/x/oauth2 v0.20.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.21.0 h1:tsimM75w1tF/uws5rbeHzIWxEqElMehnc+iW793zsZs= +golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1377,10 +1373,8 @@ golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= @@ -1390,7 +1384,7 @@ golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuX golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= -golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= +golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= golang.org/x/term v0.22.0 h1:BbsgPEJULsl2fV/AT3v15Mjva5yXKQDyKf+TbDz7QJk= golang.org/x/term v0.22.0/go.mod h1:F3qCibpT5AMpCRfhfT53vVJwhLtIVHhB9XDjfFvnMI4= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1404,6 +1398,7 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1485,8 +1480,8 @@ google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.182.0 h1:if5fPvudRQ78GeRx3RayIoiuV7modtErPIZC/T2bIvE= -google.golang.org/api v0.182.0/go.mod h1:cGhjy4caqA5yXRzEhkHI8Y9mfyC2VLTlER2l08xaqtM= +google.golang.org/api v0.183.0 h1:PNMeRDwo1pJdgNcFQ9GstuLe/noWKIc89pRWRLMvLwE= +google.golang.org/api v0.183.0/go.mod h1:q43adC5/pHoSZTx5h2mSmdF7NcyfW9JuDyIOJAgS9ZQ= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1523,10 +1518,10 @@ google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7Fc google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5 h1:P8OJ/WCl/Xo4E4zoe4/bifHpSmmKwARqyqE4nW6J2GQ= -google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:RGnPtTG7r4i8sPlNyDeikXF99hMM+hN6QMm4ooG9g2g= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240521202816-d264139d666e h1:Elxv5MwEkCI9f5SkoL6afed6NTdxaGoAo39eANBwHL8= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240521202816-d264139d666e/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= +google.golang.org/genproto/googleapis/api v0.0.0-20240701130421-f6361c86f094 h1:0+ozOGcrp+Y8Aq8TLNN2Aliibms5LEzsq99ZZmAGYm0= +google.golang.org/genproto/googleapis/api v0.0.0-20240701130421-f6361c86f094/go.mod h1:fJ/e3If/Q67Mj99hin0hMhiNyCRmt6BQ2aWIJshUSJw= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240711142825-46eb208f015d h1:JU0iKnSg02Gmb5ZdV8nYsKEKsP6o/FGVWTrw4i1DA9A= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240711142825-46eb208f015d/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -1540,8 +1535,8 @@ google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3Iji google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= +google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc= +google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1612,8 +1607,8 @@ k8s.io/klog/v2 v2.8.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= k8s.io/klog/v2 v2.120.1 h1:QXU6cPEOIslTGvZaXvFWiP9VKyeet3sawzTOvdXb4Vw= k8s.io/klog/v2 v2.120.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7/go.mod h1:wXW5VT87nVfh/iLV8FpR2uDvrFyomxbtb1KivDbvPTE= -k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 h1:aVUu9fTY98ivBPKR9Y5w/AuzbMm96cd3YHRTU83I780= -k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA= +k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 h1:BZqlfIlq5YbRMFko6/PM7FjZpUb45WallggurYhKGag= +k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98= k8s.io/kubelet v0.29.3 h1:X9h0ZHzc+eUeNTaksbN0ItHyvGhQ7Z0HPjnQD2oHdwU= k8s.io/kubelet v0.29.3/go.mod h1:jDiGuTkFOUynyBKzOoC1xRSWlgAZ9UPcTYeFyjr6vas= k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= diff --git a/internal/collector/factories.go b/internal/collector/factories.go index 46608b59aa..31d88bcbeb 100644 --- a/internal/collector/factories.go +++ b/internal/collector/factories.go @@ -7,6 +7,7 @@ package collector import ( "errors" + nginxreceiver "github.com/nginx/agent/v3/internal/collector/nginxossreceiver" "github.com/nginx/agent/v3/internal/collector/nginxplusreceiver" "github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector" "github.com/open-telemetry/opentelemetry-collector-contrib/connector/exceptionsconnector" @@ -57,7 +58,6 @@ import ( "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8seventsreceiver" "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sobjectsreceiver" "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kubeletstatsreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/nginxreceiver" "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/podmanreceiver" "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver" "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/simpleprometheusreceiver" diff --git a/internal/collector/nginxossreceiver/doc.go b/internal/collector/nginxossreceiver/doc.go new file mode 100644 index 0000000000..9f5465fa8e --- /dev/null +++ b/internal/collector/nginxossreceiver/doc.go @@ -0,0 +1,8 @@ +// Copyright (c) F5, Inc. +// +// This source code is licensed under the Apache License, Version 2.0 license found in the +// LICENSE file in the root directory of this source tree. + +//go:generate mdatagen metadata.yaml + +package nginxossreceiver // import "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/nginxreceiver" diff --git a/internal/collector/nginxossreceiver/documentation.md b/internal/collector/nginxossreceiver/documentation.md new file mode 100644 index 0000000000..9ea1efe73a --- /dev/null +++ b/internal/collector/nginxossreceiver/documentation.md @@ -0,0 +1,63 @@ +[comment]: <> (Code generated by mdatagen. DO NOT EDIT.) + +# nginx + +## Default Metrics + +The following metrics are emitted by default. Each of them can be disabled by applying the following configuration: + +```yaml +metrics: + : + enabled: false +``` + +### nginx.http.conn + +The total number of connections. + +| Unit | Metric Type | Value Type | Aggregation Temporality | Monotonic | +| ---- | ----------- | ---------- | ----------------------- | --------- | +| connections | Sum | Int | Cumulative | true | + +#### Attributes + +| Name | Description | Values | +| ---- | ----------- | ------ | +| nginx.conn.outcome | The outcome of the connection. | Str: ``ACCEPTED``, ``ACTIVE``, ``HANDLED``, ``READING``, ``WRITING``, ``WAITING`` | + +### nginx.http.conn.count + +The current number of connections. + +| Unit | Metric Type | Value Type | +| ---- | ----------- | ---------- | +| connections | Gauge | Int | + +#### Attributes + +| Name | Description | Values | +| ---- | ----------- | ------ | +| nginx.conn.outcome | The outcome of the connection. | Str: ``ACCEPTED``, ``ACTIVE``, ``HANDLED``, ``READING``, ``WRITING``, ``WAITING`` | + +### nginx.http.requests + +The total number of client requests received from clients. + +| Unit | Metric Type | Value Type | Aggregation Temporality | Monotonic | +| ---- | ----------- | ---------- | ----------------------- | --------- | +| requests | Sum | Int | Cumulative | true | + +### nginx.http.response.status + +The number of responses, grouped by status code range. + +| Unit | Metric Type | Value Type | Aggregation Temporality | Monotonic | +| ---- | ----------- | ---------- | ----------------------- | --------- | +| responses | Sum | Int | Cumulative | true | + +#### Attributes + +| Name | Description | Values | +| ---- | ----------- | ------ | +| nginx.status_range | A status code range or bucket for a HTTP response's status code. | Str: ``1xx``, ``2xx``, ``3xx``, ``4xx``, ``5xx`` | diff --git a/internal/collector/nginxossreceiver/factory.go b/internal/collector/nginxossreceiver/factory.go new file mode 100644 index 0000000000..55bea543dd --- /dev/null +++ b/internal/collector/nginxossreceiver/factory.go @@ -0,0 +1,63 @@ +// Copyright (c) F5, Inc. +// +// This source code is licensed under the Apache License, Version 2.0 license found in the +// LICENSE file in the root directory of this source tree. + +package nginxossreceiver + +import ( + "context" + "errors" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/consumer" + "go.opentelemetry.io/collector/receiver" + "go.opentelemetry.io/collector/receiver/scraperhelper" + + "github.com/nginx/agent/v3/internal/collector/nginxossreceiver/internal/config" + "github.com/nginx/agent/v3/internal/collector/nginxossreceiver/internal/metadata" + "github.com/nginx/agent/v3/internal/collector/nginxossreceiver/internal/scraper/accesslog" + "github.com/nginx/agent/v3/internal/collector/nginxossreceiver/internal/scraper/stubstatus" +) + +// nolint: ireturn +func NewFactory() receiver.Factory { + return receiver.NewFactory( + metadata.Type, + config.CreateDefaultConfig, + receiver.WithMetrics(createMetricsReceiver, metadata.MetricsStability)) +} + +// nolint: ireturn +func createMetricsReceiver( + _ context.Context, + params receiver.Settings, + rConf component.Config, + cons consumer.Metrics, +) (receiver.Metrics, error) { + cfg, ok := rConf.(*config.Config) + if !ok { + return nil, errors.New("cast to metrics receiver config") + } + + logger := params.Logger.Sugar() + + ns := stubstatus.NewScraper(params, cfg) + scraperOpts := []scraperhelper.ScraperControllerOption{ + scraperhelper.AddScraper(ns), + } + + if len(cfg.AccessLogs) > 0 { + nals, err := accesslog.NewScraper(params, cfg) + if err != nil { + logger.Errorf("Failed to initialize NGINX Access Log scraper: %s", err.Error()) + } else { + scraperOpts = append(scraperOpts, scraperhelper.AddScraper(nals)) + } + } + + return scraperhelper.NewScraperControllerReceiver( + &cfg.ControllerConfig, params, cons, + scraperOpts..., + ) +} diff --git a/internal/collector/nginxossreceiver/factory_test.go b/internal/collector/nginxossreceiver/factory_test.go new file mode 100644 index 0000000000..b218ed56ff --- /dev/null +++ b/internal/collector/nginxossreceiver/factory_test.go @@ -0,0 +1,55 @@ +// Copyright (c) F5, Inc. +// +// This source code is licensed under the Apache License, Version 2.0 license found in the +// LICENSE file in the root directory of this source tree. + +package nginxossreceiver + +import ( + "context" + "testing" + "time" + + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/consumer/consumertest" + "go.opentelemetry.io/collector/receiver/receivertest" + "go.opentelemetry.io/collector/receiver/scraperhelper" + + "github.com/nginx/agent/v3/internal/collector/nginxossreceiver/internal/config" + "github.com/nginx/agent/v3/internal/collector/nginxossreceiver/internal/metadata" +) + +func TestType(t *testing.T) { + factory := NewFactory() + ft := factory.Type() + require.EqualValues(t, metadata.Type, ft) +} + +func TestValidConfig(t *testing.T) { + factory := NewFactory() + err := componenttest.CheckConfigStruct(factory.CreateDefaultConfig()) + require.NoError(t, err) +} + +func TestCreateMetricsReceiver(t *testing.T) { + factory := NewFactory() + metricsReceiver, err := factory.CreateMetricsReceiver( + context.Background(), + receivertest.NewNopSettings(), + &config.Config{ + ControllerConfig: scraperhelper.ControllerConfig{ + CollectionInterval: 10 * time.Second, + InitialDelay: time.Second, + }, + AccessLogs: []config.AccessLog{ + { + LogFormat: "$remote_addr - $remote_user [$time_local] \"$request\" $status $body_bytes_sent ", + }, + }, + }, + consumertest.NewNop(), + ) + require.NoError(t, err) + require.NotNil(t, metricsReceiver) +} diff --git a/internal/collector/nginxossreceiver/generated_component_test.go b/internal/collector/nginxossreceiver/generated_component_test.go new file mode 100644 index 0000000000..3007dc92b4 --- /dev/null +++ b/internal/collector/nginxossreceiver/generated_component_test.go @@ -0,0 +1,69 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package nginxossreceiver + +import ( + "context" + "testing" + + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/confmap/confmaptest" + "go.opentelemetry.io/collector/consumer/consumertest" + "go.opentelemetry.io/collector/receiver" + "go.opentelemetry.io/collector/receiver/receivertest" +) + +func TestComponentFactoryType(t *testing.T) { + require.Equal(t, "nginx", NewFactory().Type().String()) +} + +func TestComponentConfigStruct(t *testing.T) { + require.NoError(t, componenttest.CheckConfigStruct(NewFactory().CreateDefaultConfig())) +} + +func TestComponentLifecycle(t *testing.T) { + factory := NewFactory() + + tests := []struct { + name string + createFn func(ctx context.Context, set receiver.Settings, cfg component.Config) (component.Component, error) + }{ + + { + name: "metrics", + createFn: func(ctx context.Context, set receiver.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateMetricsReceiver(ctx, set, cfg, consumertest.NewNop()) + }, + }, + } + + cm, err := confmaptest.LoadConf("metadata.yaml") + require.NoError(t, err) + cfg := factory.CreateDefaultConfig() + sub, err := cm.Sub("tests::config") + require.NoError(t, err) + require.NoError(t, sub.Unmarshal(&cfg)) + + for _, test := range tests { + t.Run(test.name+"-shutdown", func(t *testing.T) { + c, err := test.createFn(context.Background(), receivertest.NewNopSettings(), cfg) + require.NoError(t, err) + err = c.Shutdown(context.Background()) + require.NoError(t, err) + }) + t.Run(test.name+"-lifecycle", func(t *testing.T) { + firstRcvr, err := test.createFn(context.Background(), receivertest.NewNopSettings(), cfg) + require.NoError(t, err) + host := componenttest.NewNopHost() + require.NoError(t, err) + require.NoError(t, firstRcvr.Start(context.Background(), host)) + require.NoError(t, firstRcvr.Shutdown(context.Background())) + secondRcvr, err := test.createFn(context.Background(), receivertest.NewNopSettings(), cfg) + require.NoError(t, err) + require.NoError(t, secondRcvr.Start(context.Background(), host)) + require.NoError(t, secondRcvr.Shutdown(context.Background())) + }) + } +} diff --git a/internal/collector/nginxossreceiver/generated_package_test.go b/internal/collector/nginxossreceiver/generated_package_test.go new file mode 100644 index 0000000000..c4a59584e3 --- /dev/null +++ b/internal/collector/nginxossreceiver/generated_package_test.go @@ -0,0 +1,12 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package nginxossreceiver + +import ( + "go.uber.org/goleak" + "testing" +) + +func TestMain(m *testing.M) { + goleak.VerifyTestMain(m) +} diff --git a/internal/collector/nginxossreceiver/internal/config/config.go b/internal/collector/nginxossreceiver/internal/config/config.go new file mode 100644 index 0000000000..adb267de6f --- /dev/null +++ b/internal/collector/nginxossreceiver/internal/config/config.go @@ -0,0 +1,49 @@ +// Copyright (c) F5, Inc. +// +// This source code is licensed under the Apache License, Version 2.0 license found in the +// LICENSE file in the root directory of this source tree. + +package config // import "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/nginxreceiver" + +import ( + "time" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/config/confighttp" + "go.opentelemetry.io/collector/receiver/scraperhelper" + + "github.com/nginx/agent/v3/internal/collector/nginxossreceiver/internal/metadata" +) + +const ( + defaultCollectInterval = 10 * time.Second + defaultClientTimeout = 10 * time.Second +) + +type Config struct { + confighttp.ClientConfig `mapstructure:",squash"` + AccessLogs []AccessLog `mapstructure:"access_logs"` + scraperhelper.ControllerConfig `mapstructure:",squash"` + MetricsBuilderConfig metadata.MetricsBuilderConfig `mapstructure:",squash"` +} + +type AccessLog struct { + LogFormat string `mapstructure:"log_format"` + FilePath string `mapstructure:"file_path"` +} + +// nolint: ireturn +func CreateDefaultConfig() component.Config { + cfg := scraperhelper.NewDefaultControllerConfig() + cfg.CollectionInterval = defaultCollectInterval + + return &Config{ + ControllerConfig: cfg, + ClientConfig: confighttp.ClientConfig{ + Endpoint: "http://localhost:80/status", + Timeout: defaultClientTimeout, + }, + MetricsBuilderConfig: metadata.DefaultMetricsBuilderConfig(), + AccessLogs: []AccessLog{}, + } +} diff --git a/internal/collector/nginxossreceiver/internal/metadata/generated_config.go b/internal/collector/nginxossreceiver/internal/metadata/generated_config.go new file mode 100644 index 0000000000..26347611f7 --- /dev/null +++ b/internal/collector/nginxossreceiver/internal/metadata/generated_config.go @@ -0,0 +1,62 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package metadata + +import ( + "go.opentelemetry.io/collector/confmap" +) + +// MetricConfig provides common config for a particular metric. +type MetricConfig struct { + Enabled bool `mapstructure:"enabled"` + + enabledSetByUser bool +} + +func (ms *MetricConfig) Unmarshal(parser *confmap.Conf) error { + if parser == nil { + return nil + } + err := parser.Unmarshal(ms) + if err != nil { + return err + } + ms.enabledSetByUser = parser.IsSet("enabled") + return nil +} + +// MetricsConfig provides config for nginx metrics. +type MetricsConfig struct { + NginxHTTPConn MetricConfig `mapstructure:"nginx.http.conn"` + NginxHTTPConnCount MetricConfig `mapstructure:"nginx.http.conn.count"` + NginxHTTPRequests MetricConfig `mapstructure:"nginx.http.requests"` + NginxHTTPResponseStatus MetricConfig `mapstructure:"nginx.http.response.status"` +} + +func DefaultMetricsConfig() MetricsConfig { + return MetricsConfig{ + NginxHTTPConn: MetricConfig{ + Enabled: true, + }, + NginxHTTPConnCount: MetricConfig{ + Enabled: true, + }, + NginxHTTPRequests: MetricConfig{ + Enabled: true, + }, + NginxHTTPResponseStatus: MetricConfig{ + Enabled: true, + }, + } +} + +// MetricsBuilderConfig is a configuration for nginx metrics builder. +type MetricsBuilderConfig struct { + Metrics MetricsConfig `mapstructure:"metrics"` +} + +func DefaultMetricsBuilderConfig() MetricsBuilderConfig { + return MetricsBuilderConfig{ + Metrics: DefaultMetricsConfig(), + } +} diff --git a/internal/collector/nginxossreceiver/internal/metadata/generated_config_test.go b/internal/collector/nginxossreceiver/internal/metadata/generated_config_test.go new file mode 100644 index 0000000000..85d198d88e --- /dev/null +++ b/internal/collector/nginxossreceiver/internal/metadata/generated_config_test.go @@ -0,0 +1,65 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package metadata + +import ( + "path/filepath" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/confmap/confmaptest" +) + +func TestMetricsBuilderConfig(t *testing.T) { + tests := []struct { + name string + want MetricsBuilderConfig + }{ + { + name: "default", + want: DefaultMetricsBuilderConfig(), + }, + { + name: "all_set", + want: MetricsBuilderConfig{ + Metrics: MetricsConfig{ + NginxHTTPConn: MetricConfig{Enabled: true}, + NginxHTTPConnCount: MetricConfig{Enabled: true}, + NginxHTTPRequests: MetricConfig{Enabled: true}, + NginxHTTPResponseStatus: MetricConfig{Enabled: true}, + }, + }, + }, + { + name: "none_set", + want: MetricsBuilderConfig{ + Metrics: MetricsConfig{ + NginxHTTPConn: MetricConfig{Enabled: false}, + NginxHTTPConnCount: MetricConfig{Enabled: false}, + NginxHTTPRequests: MetricConfig{Enabled: false}, + NginxHTTPResponseStatus: MetricConfig{Enabled: false}, + }, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + cfg := loadMetricsBuilderConfig(t, tt.name) + if diff := cmp.Diff(tt.want, cfg, cmpopts.IgnoreUnexported(MetricConfig{})); diff != "" { + t.Errorf("Config mismatch (-expected +actual):\n%s", diff) + } + }) + } +} + +func loadMetricsBuilderConfig(t *testing.T, name string) MetricsBuilderConfig { + cm, err := confmaptest.LoadConf(filepath.Join("testdata", "config.yaml")) + require.NoError(t, err) + sub, err := cm.Sub(name) + require.NoError(t, err) + cfg := DefaultMetricsBuilderConfig() + require.NoError(t, sub.Unmarshal(&cfg)) + return cfg +} diff --git a/internal/collector/nginxossreceiver/internal/metadata/generated_metrics.go b/internal/collector/nginxossreceiver/internal/metadata/generated_metrics.go new file mode 100644 index 0000000000..e74642bc94 --- /dev/null +++ b/internal/collector/nginxossreceiver/internal/metadata/generated_metrics.go @@ -0,0 +1,445 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package metadata + +import ( + "time" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/pdata/pcommon" + "go.opentelemetry.io/collector/pdata/pmetric" + "go.opentelemetry.io/collector/receiver" +) + +// AttributeNginxConnOutcome specifies the a value nginx.conn.outcome attribute. +type AttributeNginxConnOutcome int + +const ( + _ AttributeNginxConnOutcome = iota + AttributeNginxConnOutcomeACCEPTED + AttributeNginxConnOutcomeACTIVE + AttributeNginxConnOutcomeHANDLED + AttributeNginxConnOutcomeREADING + AttributeNginxConnOutcomeWRITING + AttributeNginxConnOutcomeWAITING +) + +// String returns the string representation of the AttributeNginxConnOutcome. +func (av AttributeNginxConnOutcome) String() string { + switch av { + case AttributeNginxConnOutcomeACCEPTED: + return "ACCEPTED" + case AttributeNginxConnOutcomeACTIVE: + return "ACTIVE" + case AttributeNginxConnOutcomeHANDLED: + return "HANDLED" + case AttributeNginxConnOutcomeREADING: + return "READING" + case AttributeNginxConnOutcomeWRITING: + return "WRITING" + case AttributeNginxConnOutcomeWAITING: + return "WAITING" + } + return "" +} + +// MapAttributeNginxConnOutcome is a helper map of string to AttributeNginxConnOutcome attribute value. +var MapAttributeNginxConnOutcome = map[string]AttributeNginxConnOutcome{ + "ACCEPTED": AttributeNginxConnOutcomeACCEPTED, + "ACTIVE": AttributeNginxConnOutcomeACTIVE, + "HANDLED": AttributeNginxConnOutcomeHANDLED, + "READING": AttributeNginxConnOutcomeREADING, + "WRITING": AttributeNginxConnOutcomeWRITING, + "WAITING": AttributeNginxConnOutcomeWAITING, +} + +// AttributeNginxStatusRange specifies the a value nginx.status_range attribute. +type AttributeNginxStatusRange int + +const ( + _ AttributeNginxStatusRange = iota + AttributeNginxStatusRange1xx + AttributeNginxStatusRange2xx + AttributeNginxStatusRange3xx + AttributeNginxStatusRange4xx + AttributeNginxStatusRange5xx +) + +// String returns the string representation of the AttributeNginxStatusRange. +func (av AttributeNginxStatusRange) String() string { + switch av { + case AttributeNginxStatusRange1xx: + return "1xx" + case AttributeNginxStatusRange2xx: + return "2xx" + case AttributeNginxStatusRange3xx: + return "3xx" + case AttributeNginxStatusRange4xx: + return "4xx" + case AttributeNginxStatusRange5xx: + return "5xx" + } + return "" +} + +// MapAttributeNginxStatusRange is a helper map of string to AttributeNginxStatusRange attribute value. +var MapAttributeNginxStatusRange = map[string]AttributeNginxStatusRange{ + "1xx": AttributeNginxStatusRange1xx, + "2xx": AttributeNginxStatusRange2xx, + "3xx": AttributeNginxStatusRange3xx, + "4xx": AttributeNginxStatusRange4xx, + "5xx": AttributeNginxStatusRange5xx, +} + +type metricNginxHTTPConn struct { + data pmetric.Metric // data buffer for generated metric. + config MetricConfig // metric config provided by user. + capacity int // max observed number of data points added to the metric. +} + +// init fills nginx.http.conn metric with initial data. +func (m *metricNginxHTTPConn) init() { + m.data.SetName("nginx.http.conn") + m.data.SetDescription("The total number of connections.") + m.data.SetUnit("connections") + m.data.SetEmptySum() + m.data.Sum().SetIsMonotonic(true) + m.data.Sum().SetAggregationTemporality(pmetric.AggregationTemporalityCumulative) + m.data.Sum().DataPoints().EnsureCapacity(m.capacity) +} + +func (m *metricNginxHTTPConn) recordDataPoint(start pcommon.Timestamp, ts pcommon.Timestamp, val int64, nginxConnOutcomeAttributeValue string) { + if !m.config.Enabled { + return + } + dp := m.data.Sum().DataPoints().AppendEmpty() + dp.SetStartTimestamp(start) + dp.SetTimestamp(ts) + dp.SetIntValue(val) + dp.Attributes().PutStr("nginx.conn.outcome", nginxConnOutcomeAttributeValue) +} + +// updateCapacity saves max length of data point slices that will be used for the slice capacity. +func (m *metricNginxHTTPConn) updateCapacity() { + if m.data.Sum().DataPoints().Len() > m.capacity { + m.capacity = m.data.Sum().DataPoints().Len() + } +} + +// emit appends recorded metric data to a metrics slice and prepares it for recording another set of data points. +func (m *metricNginxHTTPConn) emit(metrics pmetric.MetricSlice) { + if m.config.Enabled && m.data.Sum().DataPoints().Len() > 0 { + m.updateCapacity() + m.data.MoveTo(metrics.AppendEmpty()) + m.init() + } +} + +func newMetricNginxHTTPConn(cfg MetricConfig) metricNginxHTTPConn { + m := metricNginxHTTPConn{config: cfg} + if cfg.Enabled { + m.data = pmetric.NewMetric() + m.init() + } + return m +} + +type metricNginxHTTPConnCount struct { + data pmetric.Metric // data buffer for generated metric. + config MetricConfig // metric config provided by user. + capacity int // max observed number of data points added to the metric. +} + +// init fills nginx.http.conn.count metric with initial data. +func (m *metricNginxHTTPConnCount) init() { + m.data.SetName("nginx.http.conn.count") + m.data.SetDescription("The current number of connections.") + m.data.SetUnit("connections") + m.data.SetEmptyGauge() + m.data.Gauge().DataPoints().EnsureCapacity(m.capacity) +} + +func (m *metricNginxHTTPConnCount) recordDataPoint(start pcommon.Timestamp, ts pcommon.Timestamp, val int64, nginxConnOutcomeAttributeValue string) { + if !m.config.Enabled { + return + } + dp := m.data.Gauge().DataPoints().AppendEmpty() + dp.SetStartTimestamp(start) + dp.SetTimestamp(ts) + dp.SetIntValue(val) + dp.Attributes().PutStr("nginx.conn.outcome", nginxConnOutcomeAttributeValue) +} + +// updateCapacity saves max length of data point slices that will be used for the slice capacity. +func (m *metricNginxHTTPConnCount) updateCapacity() { + if m.data.Gauge().DataPoints().Len() > m.capacity { + m.capacity = m.data.Gauge().DataPoints().Len() + } +} + +// emit appends recorded metric data to a metrics slice and prepares it for recording another set of data points. +func (m *metricNginxHTTPConnCount) emit(metrics pmetric.MetricSlice) { + if m.config.Enabled && m.data.Gauge().DataPoints().Len() > 0 { + m.updateCapacity() + m.data.MoveTo(metrics.AppendEmpty()) + m.init() + } +} + +func newMetricNginxHTTPConnCount(cfg MetricConfig) metricNginxHTTPConnCount { + m := metricNginxHTTPConnCount{config: cfg} + if cfg.Enabled { + m.data = pmetric.NewMetric() + m.init() + } + return m +} + +type metricNginxHTTPRequests struct { + data pmetric.Metric // data buffer for generated metric. + config MetricConfig // metric config provided by user. + capacity int // max observed number of data points added to the metric. +} + +// init fills nginx.http.requests metric with initial data. +func (m *metricNginxHTTPRequests) init() { + m.data.SetName("nginx.http.requests") + m.data.SetDescription("The total number of client requests received from clients.") + m.data.SetUnit("requests") + m.data.SetEmptySum() + m.data.Sum().SetIsMonotonic(true) + m.data.Sum().SetAggregationTemporality(pmetric.AggregationTemporalityCumulative) +} + +func (m *metricNginxHTTPRequests) recordDataPoint(start pcommon.Timestamp, ts pcommon.Timestamp, val int64) { + if !m.config.Enabled { + return + } + dp := m.data.Sum().DataPoints().AppendEmpty() + dp.SetStartTimestamp(start) + dp.SetTimestamp(ts) + dp.SetIntValue(val) +} + +// updateCapacity saves max length of data point slices that will be used for the slice capacity. +func (m *metricNginxHTTPRequests) updateCapacity() { + if m.data.Sum().DataPoints().Len() > m.capacity { + m.capacity = m.data.Sum().DataPoints().Len() + } +} + +// emit appends recorded metric data to a metrics slice and prepares it for recording another set of data points. +func (m *metricNginxHTTPRequests) emit(metrics pmetric.MetricSlice) { + if m.config.Enabled && m.data.Sum().DataPoints().Len() > 0 { + m.updateCapacity() + m.data.MoveTo(metrics.AppendEmpty()) + m.init() + } +} + +func newMetricNginxHTTPRequests(cfg MetricConfig) metricNginxHTTPRequests { + m := metricNginxHTTPRequests{config: cfg} + if cfg.Enabled { + m.data = pmetric.NewMetric() + m.init() + } + return m +} + +type metricNginxHTTPResponseStatus struct { + data pmetric.Metric // data buffer for generated metric. + config MetricConfig // metric config provided by user. + capacity int // max observed number of data points added to the metric. +} + +// init fills nginx.http.response.status metric with initial data. +func (m *metricNginxHTTPResponseStatus) init() { + m.data.SetName("nginx.http.response.status") + m.data.SetDescription("The number of responses, grouped by status code range.") + m.data.SetUnit("responses") + m.data.SetEmptySum() + m.data.Sum().SetIsMonotonic(true) + m.data.Sum().SetAggregationTemporality(pmetric.AggregationTemporalityCumulative) + m.data.Sum().DataPoints().EnsureCapacity(m.capacity) +} + +func (m *metricNginxHTTPResponseStatus) recordDataPoint(start pcommon.Timestamp, ts pcommon.Timestamp, val int64, nginxStatusRangeAttributeValue string) { + if !m.config.Enabled { + return + } + dp := m.data.Sum().DataPoints().AppendEmpty() + dp.SetStartTimestamp(start) + dp.SetTimestamp(ts) + dp.SetIntValue(val) + dp.Attributes().PutStr("nginx.status_range", nginxStatusRangeAttributeValue) +} + +// updateCapacity saves max length of data point slices that will be used for the slice capacity. +func (m *metricNginxHTTPResponseStatus) updateCapacity() { + if m.data.Sum().DataPoints().Len() > m.capacity { + m.capacity = m.data.Sum().DataPoints().Len() + } +} + +// emit appends recorded metric data to a metrics slice and prepares it for recording another set of data points. +func (m *metricNginxHTTPResponseStatus) emit(metrics pmetric.MetricSlice) { + if m.config.Enabled && m.data.Sum().DataPoints().Len() > 0 { + m.updateCapacity() + m.data.MoveTo(metrics.AppendEmpty()) + m.init() + } +} + +func newMetricNginxHTTPResponseStatus(cfg MetricConfig) metricNginxHTTPResponseStatus { + m := metricNginxHTTPResponseStatus{config: cfg} + if cfg.Enabled { + m.data = pmetric.NewMetric() + m.init() + } + return m +} + +// MetricsBuilder provides an interface for scrapers to report metrics while taking care of all the transformations +// required to produce metric representation defined in metadata and user config. +type MetricsBuilder struct { + config MetricsBuilderConfig // config of the metrics builder. + startTime pcommon.Timestamp // start time that will be applied to all recorded data points. + metricsCapacity int // maximum observed number of metrics per resource. + metricsBuffer pmetric.Metrics // accumulates metrics data before emitting. + buildInfo component.BuildInfo // contains version information. + metricNginxHTTPConn metricNginxHTTPConn + metricNginxHTTPConnCount metricNginxHTTPConnCount + metricNginxHTTPRequests metricNginxHTTPRequests + metricNginxHTTPResponseStatus metricNginxHTTPResponseStatus +} + +// metricBuilderOption applies changes to default metrics builder. +type metricBuilderOption func(*MetricsBuilder) + +// WithStartTime sets startTime on the metrics builder. +func WithStartTime(startTime pcommon.Timestamp) metricBuilderOption { + return func(mb *MetricsBuilder) { + mb.startTime = startTime + } +} + +func NewMetricsBuilder(mbc MetricsBuilderConfig, settings receiver.Settings, options ...metricBuilderOption) *MetricsBuilder { + mb := &MetricsBuilder{ + config: mbc, + startTime: pcommon.NewTimestampFromTime(time.Now()), + metricsBuffer: pmetric.NewMetrics(), + buildInfo: settings.BuildInfo, + metricNginxHTTPConn: newMetricNginxHTTPConn(mbc.Metrics.NginxHTTPConn), + metricNginxHTTPConnCount: newMetricNginxHTTPConnCount(mbc.Metrics.NginxHTTPConnCount), + metricNginxHTTPRequests: newMetricNginxHTTPRequests(mbc.Metrics.NginxHTTPRequests), + metricNginxHTTPResponseStatus: newMetricNginxHTTPResponseStatus(mbc.Metrics.NginxHTTPResponseStatus), + } + + for _, op := range options { + op(mb) + } + return mb +} + +// updateCapacity updates max length of metrics and resource attributes that will be used for the slice capacity. +func (mb *MetricsBuilder) updateCapacity(rm pmetric.ResourceMetrics) { + if mb.metricsCapacity < rm.ScopeMetrics().At(0).Metrics().Len() { + mb.metricsCapacity = rm.ScopeMetrics().At(0).Metrics().Len() + } +} + +// ResourceMetricsOption applies changes to provided resource metrics. +type ResourceMetricsOption func(pmetric.ResourceMetrics) + +// WithResource sets the provided resource on the emitted ResourceMetrics. +// It's recommended to use ResourceBuilder to create the resource. +func WithResource(res pcommon.Resource) ResourceMetricsOption { + return func(rm pmetric.ResourceMetrics) { + res.CopyTo(rm.Resource()) + } +} + +// WithStartTimeOverride overrides start time for all the resource metrics data points. +// This option should be only used if different start time has to be set on metrics coming from different resources. +func WithStartTimeOverride(start pcommon.Timestamp) ResourceMetricsOption { + return func(rm pmetric.ResourceMetrics) { + var dps pmetric.NumberDataPointSlice + metrics := rm.ScopeMetrics().At(0).Metrics() + for i := 0; i < metrics.Len(); i++ { + switch metrics.At(i).Type() { + case pmetric.MetricTypeGauge: + dps = metrics.At(i).Gauge().DataPoints() + case pmetric.MetricTypeSum: + dps = metrics.At(i).Sum().DataPoints() + } + for j := 0; j < dps.Len(); j++ { + dps.At(j).SetStartTimestamp(start) + } + } + } +} + +// EmitForResource saves all the generated metrics under a new resource and updates the internal state to be ready for +// recording another set of data points as part of another resource. This function can be helpful when one scraper +// needs to emit metrics from several resources. Otherwise calling this function is not required, +// just `Emit` function can be called instead. +// Resource attributes should be provided as ResourceMetricsOption arguments. +func (mb *MetricsBuilder) EmitForResource(rmo ...ResourceMetricsOption) { + rm := pmetric.NewResourceMetrics() + ils := rm.ScopeMetrics().AppendEmpty() + ils.Scope().SetName("otelcol/nginxreceiver") + ils.Scope().SetVersion(mb.buildInfo.Version) + ils.Metrics().EnsureCapacity(mb.metricsCapacity) + mb.metricNginxHTTPConn.emit(ils.Metrics()) + mb.metricNginxHTTPConnCount.emit(ils.Metrics()) + mb.metricNginxHTTPRequests.emit(ils.Metrics()) + mb.metricNginxHTTPResponseStatus.emit(ils.Metrics()) + + for _, op := range rmo { + op(rm) + } + + if ils.Metrics().Len() > 0 { + mb.updateCapacity(rm) + rm.MoveTo(mb.metricsBuffer.ResourceMetrics().AppendEmpty()) + } +} + +// Emit returns all the metrics accumulated by the metrics builder and updates the internal state to be ready for +// recording another set of metrics. This function will be responsible for applying all the transformations required to +// produce metric representation defined in metadata and user config, e.g. delta or cumulative. +func (mb *MetricsBuilder) Emit(rmo ...ResourceMetricsOption) pmetric.Metrics { + mb.EmitForResource(rmo...) + metrics := mb.metricsBuffer + mb.metricsBuffer = pmetric.NewMetrics() + return metrics +} + +// RecordNginxHTTPConnDataPoint adds a data point to nginx.http.conn metric. +func (mb *MetricsBuilder) RecordNginxHTTPConnDataPoint(ts pcommon.Timestamp, val int64, nginxConnOutcomeAttributeValue AttributeNginxConnOutcome) { + mb.metricNginxHTTPConn.recordDataPoint(mb.startTime, ts, val, nginxConnOutcomeAttributeValue.String()) +} + +// RecordNginxHTTPConnCountDataPoint adds a data point to nginx.http.conn.count metric. +func (mb *MetricsBuilder) RecordNginxHTTPConnCountDataPoint(ts pcommon.Timestamp, val int64, nginxConnOutcomeAttributeValue AttributeNginxConnOutcome) { + mb.metricNginxHTTPConnCount.recordDataPoint(mb.startTime, ts, val, nginxConnOutcomeAttributeValue.String()) +} + +// RecordNginxHTTPRequestsDataPoint adds a data point to nginx.http.requests metric. +func (mb *MetricsBuilder) RecordNginxHTTPRequestsDataPoint(ts pcommon.Timestamp, val int64) { + mb.metricNginxHTTPRequests.recordDataPoint(mb.startTime, ts, val) +} + +// RecordNginxHTTPResponseStatusDataPoint adds a data point to nginx.http.response.status metric. +func (mb *MetricsBuilder) RecordNginxHTTPResponseStatusDataPoint(ts pcommon.Timestamp, val int64, nginxStatusRangeAttributeValue AttributeNginxStatusRange) { + mb.metricNginxHTTPResponseStatus.recordDataPoint(mb.startTime, ts, val, nginxStatusRangeAttributeValue.String()) +} + +// Reset resets metrics builder to its initial state. It should be used when external metrics source is restarted, +// and metrics builder should update its startTime and reset it's internal state accordingly. +func (mb *MetricsBuilder) Reset(options ...metricBuilderOption) { + mb.startTime = pcommon.NewTimestampFromTime(time.Now()) + for _, op := range options { + op(mb) + } +} diff --git a/internal/collector/nginxossreceiver/internal/metadata/generated_metrics_test.go b/internal/collector/nginxossreceiver/internal/metadata/generated_metrics_test.go new file mode 100644 index 0000000000..261655b70a --- /dev/null +++ b/internal/collector/nginxossreceiver/internal/metadata/generated_metrics_test.go @@ -0,0 +1,167 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package metadata + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "go.opentelemetry.io/collector/pdata/pcommon" + "go.opentelemetry.io/collector/pdata/pmetric" + "go.opentelemetry.io/collector/receiver/receivertest" + "go.uber.org/zap" + "go.uber.org/zap/zaptest/observer" +) + +type testDataSet int + +const ( + testDataSetDefault testDataSet = iota + testDataSetAll + testDataSetNone +) + +func TestMetricsBuilder(t *testing.T) { + tests := []struct { + name string + metricsSet testDataSet + resAttrsSet testDataSet + expectEmpty bool + }{ + { + name: "default", + }, + { + name: "all_set", + metricsSet: testDataSetAll, + resAttrsSet: testDataSetAll, + }, + { + name: "none_set", + metricsSet: testDataSetNone, + resAttrsSet: testDataSetNone, + expectEmpty: true, + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + start := pcommon.Timestamp(1_000_000_000) + ts := pcommon.Timestamp(1_000_001_000) + observedZapCore, observedLogs := observer.New(zap.WarnLevel) + settings := receivertest.NewNopSettings() + settings.Logger = zap.New(observedZapCore) + mb := NewMetricsBuilder(loadMetricsBuilderConfig(t, test.name), settings, WithStartTime(start)) + + expectedWarnings := 0 + + assert.Equal(t, expectedWarnings, observedLogs.Len()) + + defaultMetricsCount := 0 + allMetricsCount := 0 + + defaultMetricsCount++ + allMetricsCount++ + mb.RecordNginxHTTPConnDataPoint(ts, 1, AttributeNginxConnOutcomeACCEPTED) + + defaultMetricsCount++ + allMetricsCount++ + mb.RecordNginxHTTPConnCountDataPoint(ts, 1, AttributeNginxConnOutcomeACCEPTED) + + defaultMetricsCount++ + allMetricsCount++ + mb.RecordNginxHTTPRequestsDataPoint(ts, 1) + + defaultMetricsCount++ + allMetricsCount++ + mb.RecordNginxHTTPResponseStatusDataPoint(ts, 1, AttributeNginxStatusRange1xx) + + res := pcommon.NewResource() + metrics := mb.Emit(WithResource(res)) + + if test.expectEmpty { + assert.Equal(t, 0, metrics.ResourceMetrics().Len()) + return + } + + assert.Equal(t, 1, metrics.ResourceMetrics().Len()) + rm := metrics.ResourceMetrics().At(0) + assert.Equal(t, res, rm.Resource()) + assert.Equal(t, 1, rm.ScopeMetrics().Len()) + ms := rm.ScopeMetrics().At(0).Metrics() + if test.metricsSet == testDataSetDefault { + assert.Equal(t, defaultMetricsCount, ms.Len()) + } + if test.metricsSet == testDataSetAll { + assert.Equal(t, allMetricsCount, ms.Len()) + } + validatedMetrics := make(map[string]bool) + for i := 0; i < ms.Len(); i++ { + switch ms.At(i).Name() { + case "nginx.http.conn": + assert.False(t, validatedMetrics["nginx.http.conn"], "Found a duplicate in the metrics slice: nginx.http.conn") + validatedMetrics["nginx.http.conn"] = true + assert.Equal(t, pmetric.MetricTypeSum, ms.At(i).Type()) + assert.Equal(t, 1, ms.At(i).Sum().DataPoints().Len()) + assert.Equal(t, "The total number of connections.", ms.At(i).Description()) + assert.Equal(t, "connections", ms.At(i).Unit()) + assert.Equal(t, true, ms.At(i).Sum().IsMonotonic()) + assert.Equal(t, pmetric.AggregationTemporalityCumulative, ms.At(i).Sum().AggregationTemporality()) + dp := ms.At(i).Sum().DataPoints().At(0) + assert.Equal(t, start, dp.StartTimestamp()) + assert.Equal(t, ts, dp.Timestamp()) + assert.Equal(t, pmetric.NumberDataPointValueTypeInt, dp.ValueType()) + assert.Equal(t, int64(1), dp.IntValue()) + attrVal, ok := dp.Attributes().Get("nginx.conn.outcome") + assert.True(t, ok) + assert.EqualValues(t, "ACCEPTED", attrVal.Str()) + case "nginx.http.conn.count": + assert.False(t, validatedMetrics["nginx.http.conn.count"], "Found a duplicate in the metrics slice: nginx.http.conn.count") + validatedMetrics["nginx.http.conn.count"] = true + assert.Equal(t, pmetric.MetricTypeGauge, ms.At(i).Type()) + assert.Equal(t, 1, ms.At(i).Gauge().DataPoints().Len()) + assert.Equal(t, "The current number of connections.", ms.At(i).Description()) + assert.Equal(t, "connections", ms.At(i).Unit()) + dp := ms.At(i).Gauge().DataPoints().At(0) + assert.Equal(t, start, dp.StartTimestamp()) + assert.Equal(t, ts, dp.Timestamp()) + assert.Equal(t, pmetric.NumberDataPointValueTypeInt, dp.ValueType()) + assert.Equal(t, int64(1), dp.IntValue()) + attrVal, ok := dp.Attributes().Get("nginx.conn.outcome") + assert.True(t, ok) + assert.EqualValues(t, "ACCEPTED", attrVal.Str()) + case "nginx.http.requests": + assert.False(t, validatedMetrics["nginx.http.requests"], "Found a duplicate in the metrics slice: nginx.http.requests") + validatedMetrics["nginx.http.requests"] = true + assert.Equal(t, pmetric.MetricTypeSum, ms.At(i).Type()) + assert.Equal(t, 1, ms.At(i).Sum().DataPoints().Len()) + assert.Equal(t, "The total number of client requests received from clients.", ms.At(i).Description()) + assert.Equal(t, "requests", ms.At(i).Unit()) + assert.Equal(t, true, ms.At(i).Sum().IsMonotonic()) + assert.Equal(t, pmetric.AggregationTemporalityCumulative, ms.At(i).Sum().AggregationTemporality()) + dp := ms.At(i).Sum().DataPoints().At(0) + assert.Equal(t, start, dp.StartTimestamp()) + assert.Equal(t, ts, dp.Timestamp()) + assert.Equal(t, pmetric.NumberDataPointValueTypeInt, dp.ValueType()) + assert.Equal(t, int64(1), dp.IntValue()) + case "nginx.http.response.status": + assert.False(t, validatedMetrics["nginx.http.response.status"], "Found a duplicate in the metrics slice: nginx.http.response.status") + validatedMetrics["nginx.http.response.status"] = true + assert.Equal(t, pmetric.MetricTypeSum, ms.At(i).Type()) + assert.Equal(t, 1, ms.At(i).Sum().DataPoints().Len()) + assert.Equal(t, "The number of responses, grouped by status code range.", ms.At(i).Description()) + assert.Equal(t, "responses", ms.At(i).Unit()) + assert.Equal(t, true, ms.At(i).Sum().IsMonotonic()) + assert.Equal(t, pmetric.AggregationTemporalityCumulative, ms.At(i).Sum().AggregationTemporality()) + dp := ms.At(i).Sum().DataPoints().At(0) + assert.Equal(t, start, dp.StartTimestamp()) + assert.Equal(t, ts, dp.Timestamp()) + assert.Equal(t, pmetric.NumberDataPointValueTypeInt, dp.ValueType()) + assert.Equal(t, int64(1), dp.IntValue()) + attrVal, ok := dp.Attributes().Get("nginx.status_range") + assert.True(t, ok) + assert.EqualValues(t, "1xx", attrVal.Str()) + } + } + }) + } +} diff --git a/internal/collector/nginxossreceiver/internal/metadata/generated_status.go b/internal/collector/nginxossreceiver/internal/metadata/generated_status.go new file mode 100644 index 0000000000..3eb166a1ad --- /dev/null +++ b/internal/collector/nginxossreceiver/internal/metadata/generated_status.go @@ -0,0 +1,16 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package metadata + +import ( + "go.opentelemetry.io/collector/component" +) + +var ( + Type = component.MustNewType("nginx") + ScopeName = "otelcol/nginxreceiver" +) + +const ( + MetricsStability = component.StabilityLevelBeta +) diff --git a/internal/collector/nginxossreceiver/internal/metadata/package_test.go b/internal/collector/nginxossreceiver/internal/metadata/package_test.go new file mode 100644 index 0000000000..23aebeefed --- /dev/null +++ b/internal/collector/nginxossreceiver/internal/metadata/package_test.go @@ -0,0 +1,16 @@ +// Copyright (c) F5, Inc. +// +// This source code is licensed under the Apache License, Version 2.0 license found in the +// LICENSE file in the root directory of this source tree. + +package metadata + +import ( + "testing" + + "go.uber.org/goleak" +) + +func TestMain(m *testing.M) { + goleak.VerifyTestMain(m) +} diff --git a/internal/collector/nginxossreceiver/internal/metadata/testdata/config.yaml b/internal/collector/nginxossreceiver/internal/metadata/testdata/config.yaml new file mode 100644 index 0000000000..6f3036383a --- /dev/null +++ b/internal/collector/nginxossreceiver/internal/metadata/testdata/config.yaml @@ -0,0 +1,21 @@ +default: +all_set: + metrics: + nginx.http.conn: + enabled: true + nginx.http.conn.count: + enabled: true + nginx.http.requests: + enabled: true + nginx.http.response.status: + enabled: true +none_set: + metrics: + nginx.http.conn: + enabled: false + nginx.http.conn.count: + enabled: false + nginx.http.requests: + enabled: false + nginx.http.response.status: + enabled: false diff --git a/internal/collector/nginxossreceiver/internal/model/types.go b/internal/collector/nginxossreceiver/internal/model/types.go new file mode 100644 index 0000000000..22fc03bb69 --- /dev/null +++ b/internal/collector/nginxossreceiver/internal/model/types.go @@ -0,0 +1,26 @@ +// Copyright (c) F5, Inc. +// +// This source code is licensed under the Apache License, Version 2.0 license found in the +// LICENSE file in the root directory of this source tree. +package model + +type ( + NginxAccessItem struct { + BodyBytesSent string `mapstructure:"body_bytes_sent"` + Status string `mapstructure:"status"` + RemoteAddress string `mapstructure:"remote_addr"` + HTTPUserAgent string `mapstructure:"http_user_agent"` + Request string `mapstructure:"request"` + BytesSent string `mapstructure:"bytes_sent"` + RequestLength string `mapstructure:"request_length"` + RequestTime string `mapstructure:"request_time"` + GzipRatio string `mapstructure:"gzip_ratio"` + ServerProtocol string `mapstructure:"server_protocol"` + UpstreamConnectTime string `mapstructure:"upstream_connect_time"` + UpstreamHeaderTime string `mapstructure:"upstream_header_time"` + UpstreamResponseTime string `mapstructure:"upstream_response_time"` + UpstreamResponseLength string `mapstructure:"upstream_response_length"` + UpstreamStatus string `mapstructure:"upstream_status"` + UpstreamCacheStatus string `mapstructure:"upstream_cache_status"` + } +) diff --git a/internal/collector/nginxossreceiver/internal/record/recorder.go b/internal/collector/nginxossreceiver/internal/record/recorder.go new file mode 100644 index 0000000000..ee8bee3103 --- /dev/null +++ b/internal/collector/nginxossreceiver/internal/record/recorder.go @@ -0,0 +1,68 @@ +// Copyright (c) F5, Inc. +// +// This source code is licensed under the Apache License, Version 2.0 license found in the +// LICENSE file in the root directory of this source tree. + +package record + +import ( + "fmt" + "strconv" + "time" + + "github.com/nginx/agent/v3/internal/collector/nginxossreceiver/internal/metadata" + "github.com/nginx/agent/v3/internal/collector/nginxossreceiver/internal/model" + "go.opentelemetry.io/collector/pdata/pcommon" +) + +const ( + // Needed for "magic number" linter. + status100 = 100 + status200 = 200 + status300 = 300 + status400 = 400 + status500 = 500 + + percent = 100 +) + +// Item extracts data from NGINX Access Items and records them using the given MetricsBuilder. +func Item(ai *model.NginxAccessItem, mb *metadata.MetricsBuilder) error { + now := pcommon.NewTimestampFromTime(time.Now()) + + if ai.Status != "" { + codeRange, err := mapCodeRange(ai.Status) + if err != nil { + return fmt.Errorf("parse status range: %w", err) + } + + mb.RecordNginxHTTPResponseStatusDataPoint(now, 1, codeRange) + } + + return nil +} + +func mapCodeRange(statusCode string) (metadata.AttributeNginxStatusRange, error) { + number, err := strconv.Atoi(statusCode) + if err != nil { + return 0, fmt.Errorf("cast status code to int: %w", err) + } + + // We want to "floor" the response code, so we can map it to the correct range (i.e. to 1xx, 2xx, 4xx or 5xx). + codeRange := (number / percent) * percent + + switch codeRange { + case status100: + return metadata.AttributeNginxStatusRange1xx, nil + case status200: + return metadata.AttributeNginxStatusRange2xx, nil + case status300: + return metadata.AttributeNginxStatusRange3xx, nil + case status400: + return metadata.AttributeNginxStatusRange4xx, nil + case status500: + return metadata.AttributeNginxStatusRange5xx, nil + default: + return 0, fmt.Errorf("unknown code range: %d", codeRange) + } +} diff --git a/internal/collector/nginxossreceiver/internal/record/recorder_test.go b/internal/collector/nginxossreceiver/internal/record/recorder_test.go new file mode 100644 index 0000000000..a99c7a725a --- /dev/null +++ b/internal/collector/nginxossreceiver/internal/record/recorder_test.go @@ -0,0 +1,160 @@ +// Copyright (c) F5, Inc. +// +// This source code is licensed under the Apache License, Version 2.0 license found in the +// LICENSE file in the root directory of this source tree. + +package record + +import ( + "errors" + "path/filepath" + "testing" + + "github.com/nginx/agent/v3/internal/collector/nginxossreceiver/internal/metadata" + "github.com/nginx/agent/v3/internal/collector/nginxossreceiver/internal/model" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest/pmetrictest" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/receiver/receivertest" +) + +const testDataDir = "testdata" + +func TestRecordAccessItem(t *testing.T) { + tests := []struct { + name string + expectedPath string + expErrMsg string + input []*model.NginxAccessItem + shouldErr bool + }{ + { + name: "Test 1: basic nginx.http.response.status case", + input: []*model.NginxAccessItem{ + { + BodyBytesSent: "615", + Status: "200", + RemoteAddress: "127.0.0.1", + HTTPUserAgent: "PostmanRuntime/7.36.1", + Request: "GET / HTTP/1.1", + BytesSent: "853", + RequestLength: "226", + RequestTime: "0.000", + GzipRatio: "-", + ServerProtocol: "HTTP/1.1", + UpstreamConnectTime: "-", + UpstreamHeaderTime: "-", + UpstreamResponseTime: "-", + UpstreamResponseLength: "-", + UpstreamStatus: "", + UpstreamCacheStatus: "", + }, + { + BodyBytesSent: "28", + Status: "200", + RemoteAddress: "127.0.0.1", + HTTPUserAgent: "PostmanRuntime/7.36.1", + Request: "GET /frontend1 HTTP/1.1", + BytesSent: "190", + RequestLength: "235", + RequestTime: "0.004", + GzipRatio: "-", + ServerProtocol: "HTTP/1.1", + UpstreamConnectTime: "0.003", + UpstreamHeaderTime: "0.003", + UpstreamResponseTime: "0.003", + UpstreamResponseLength: "28", + UpstreamStatus: "", + UpstreamCacheStatus: "", + }, + }, + expectedPath: "basic-nginx.http.response.status.yaml", + }, + { + name: "Test 2: all nginx.http.response.status status codes", + input: []*model.NginxAccessItem{ + { // The recorder only parses the status code for this metric, omitting other fields for brevity. + Status: "100", + }, + { + Status: "103", + }, + { + Status: "200", + }, + { + Status: "202", + }, + { + Status: "300", + }, + { + Status: "302", + }, + { + Status: "400", + }, + { + Status: "404", + }, + { + Status: "500", + }, + { + Status: "502", + }, + }, + expectedPath: "multicode-nginx.http.response.status.yaml", + }, + { + name: "Test 3: random string in status code", + input: []*model.NginxAccessItem{ + { + Status: "not-a-status-code", + }, + }, + shouldErr: true, + expErrMsg: "cast status code to int", + }, + { + name: "Test 4: non-existent status code range", + input: []*model.NginxAccessItem{ + { + Status: "700", + }, + }, + shouldErr: true, + expErrMsg: "unknown code range: 700", + }, + } + + mb := metadata.NewMetricsBuilder(metadata.DefaultMetricsBuilderConfig(), receivertest.NewNopSettings()) + + for _, test := range tests { + t.Run(test.name, func(tt *testing.T) { + var err error + for _, item := range test.input { + recordErr := Item(item, mb) + err = errors.Join(err, recordErr) + } + + if test.shouldErr { + require.Error(tt, err) + assert.Contains(tt, err.Error(), test.expErrMsg) + } else { + require.NoError(tt, err) + expectedFile := filepath.Join(testDataDir, test.expectedPath) + expected, readErr := golden.ReadMetrics(expectedFile) + require.NoError(t, readErr) + + actual := mb.Emit() + require.NoError(tt, pmetrictest.CompareMetrics(expected, actual, + pmetrictest.IgnoreStartTimestamp(), + pmetrictest.IgnoreMetricDataPointsOrder(), + pmetrictest.IgnoreTimestamp(), + pmetrictest.IgnoreMetricsOrder())) + } + }) + } +} diff --git a/internal/collector/nginxossreceiver/internal/record/testdata/basic-nginx.http.response.status.yaml b/internal/collector/nginxossreceiver/internal/record/testdata/basic-nginx.http.response.status.yaml new file mode 100644 index 0000000000..994992e871 --- /dev/null +++ b/internal/collector/nginxossreceiver/internal/record/testdata/basic-nginx.http.response.status.yaml @@ -0,0 +1,26 @@ +resourceMetrics: + - resource: {} + scopeMetrics: + - metrics: + - description: The number of responses, grouped by status code range. + name: nginx.http.response.status + sum: + aggregationTemporality: 2 # Cumulative + isMonotonic: true + dataPoints: + - asInt: 1 + attributes: + - key: nginx.status_range + value: + stringValue: "2xx" + timeUnixNano: "1000000" + - asInt: 1 + attributes: + - key: nginx.status_range + value: + stringValue: "2xx" + timeUnixNano: "1000000" + unit: responses + scope: + name: otelcol/nginxreceiver + version: latest diff --git a/internal/collector/nginxossreceiver/internal/record/testdata/multicode-nginx.http.response.status.yaml b/internal/collector/nginxossreceiver/internal/record/testdata/multicode-nginx.http.response.status.yaml new file mode 100644 index 0000000000..38ee8518dc --- /dev/null +++ b/internal/collector/nginxossreceiver/internal/record/testdata/multicode-nginx.http.response.status.yaml @@ -0,0 +1,73 @@ +resourceMetrics: + - resource: {} + scopeMetrics: + - metrics: + - description: The number of responses, grouped by status code range. + name: nginx.http.response.status + sum: + aggregationTemporality: 2 # Cumulative + isMonotonic: true + dataPoints: + - asInt: 1 + attributes: + - key: nginx.status_range + value: + stringValue: "1xx" + timeUnixNano: "1000000" + - asInt: 1 + attributes: + - key: nginx.status_range + value: + stringValue: "1xx" + timeUnixNano: "1000000" + - asInt: 1 + attributes: + - key: nginx.status_range + value: + stringValue: "2xx" + timeUnixNano: "1000000" + - asInt: 1 + attributes: + - key: nginx.status_range + value: + stringValue: "2xx" + timeUnixNano: "1000000" + - asInt: 1 + attributes: + - key: nginx.status_range + value: + stringValue: "3xx" + timeUnixNano: "1000000" + - asInt: 1 + attributes: + - key: nginx.status_range + value: + stringValue: "3xx" + timeUnixNano: "1000000" + - asInt: 1 + attributes: + - key: nginx.status_range + value: + stringValue: "4xx" + timeUnixNano: "1000000" + - asInt: 1 + attributes: + - key: nginx.status_range + value: + stringValue: "4xx" + - asInt: 1 + attributes: + - key: nginx.status_range + value: + stringValue: "5xx" + timeUnixNano: "1000000" + - asInt: 1 + attributes: + - key: nginx.status_range + value: + stringValue: "5xx" + timeUnixNano: "1000000" + unit: responses + scope: + name: otelcol/nginxreceiver + version: latest diff --git a/internal/collector/nginxossreceiver/internal/scraper/accesslog/nginx_log_scraper.go b/internal/collector/nginxossreceiver/internal/scraper/accesslog/nginx_log_scraper.go new file mode 100644 index 0000000000..93391655d9 --- /dev/null +++ b/internal/collector/nginxossreceiver/internal/scraper/accesslog/nginx_log_scraper.go @@ -0,0 +1,182 @@ +// Copyright (c) F5, Inc. +// +// This source code is licensed under the Apache License, Version 2.0 license found in the +// LICENSE file in the root directory of this source tree. + +package accesslog + +import ( + "context" + "fmt" + "sync" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/entry" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator/helper" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/pipeline" + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/config/configtelemetry" + "go.opentelemetry.io/collector/extension/experimental/storage" + "go.opentelemetry.io/collector/pdata/pmetric" + "go.opentelemetry.io/collector/receiver" + "go.opentelemetry.io/collector/receiver/scraperhelper" + "go.opentelemetry.io/otel" + metricSdk "go.opentelemetry.io/otel/sdk/metric" + "go.uber.org/zap" + + "github.com/nginx/agent/v3/internal/collector/nginxossreceiver/internal/config" + "github.com/nginx/agent/v3/internal/collector/nginxossreceiver/internal/metadata" + "github.com/nginx/agent/v3/internal/collector/nginxossreceiver/internal/model" + "github.com/nginx/agent/v3/internal/collector/nginxossreceiver/internal/record" + "github.com/nginx/agent/v3/internal/collector/nginxossreceiver/internal/scraper/accesslog/operator/input/file" +) + +type ( + NginxLogScraper struct { + outChan <-chan []*entry.Entry + cfg *config.Config + logger *zap.Logger + mb *metadata.MetricsBuilder + pipe *pipeline.DirectedPipeline + wg *sync.WaitGroup + cancel context.CancelFunc + entries []*entry.Entry + mut sync.Mutex + } +) + +var _ scraperhelper.Scraper = (*NginxLogScraper)(nil) + +func NewScraper( + settings receiver.Settings, + cfg *config.Config, +) (*NginxLogScraper, error) { + logger := settings.Logger + logger.Info("Creating NGINX access log scraper") + mb := metadata.NewMetricsBuilder(cfg.MetricsBuilderConfig, settings) + + operators := []operator.Config{} + + for _, accessLog := range cfg.AccessLogs { + logger.Info("Adding access log file operator", zap.String("file_path", accessLog.FilePath)) + fileInputConfig := file.NewConfig() + fileInputConfig.AccessLogFormat = accessLog.LogFormat + fileInputConfig.Include = append(fileInputConfig.Include, accessLog.FilePath) + + inputCfg := operator.NewConfig(fileInputConfig) + operators = append(operators, inputCfg) + } + + stanzaPipeline, outChan, err := initStanzaPipeline(operators, settings.Logger) + if err != nil { + return nil, fmt.Errorf("init stanza pipeline: %w", err) + } + + return &NginxLogScraper{ + cfg: cfg, + logger: logger, + mb: mb, + mut: sync.Mutex{}, + outChan: outChan, + pipe: stanzaPipeline, + wg: &sync.WaitGroup{}, + }, nil +} + +func (nls *NginxLogScraper) ID() component.ID { + return component.NewID(metadata.Type) +} + +func (nls *NginxLogScraper) Start(parentCtx context.Context, _ component.Host) error { + nls.logger.Info("NGINX access log scraper started") + ctx, cancel := context.WithCancel(parentCtx) + nls.cancel = cancel + + err := nls.pipe.Start(storage.NewNopClient()) + if err != nil { + return fmt.Errorf("stanza pipeline start: %w", err) + } + + nls.wg.Add(1) + go nls.runConsumer(ctx) + + return nil +} + +func (nls *NginxLogScraper) Scrape(_ context.Context) (pmetric.Metrics, error) { + nls.mut.Lock() + defer nls.mut.Unlock() + for _, ent := range nls.entries { + nls.logger.Info("Scraping NGINX access log", zap.Any("entity", ent)) + item, ok := ent.Body.(*model.NginxAccessItem) + if !ok { + nls.logger.Info("Failed to cast log entry to *model.NginxAccessItem", zap.Any("entry", ent.Body)) + continue + } + + err := record.Item(item, nls.mb) + if err != nil { + nls.logger.Info("Recording metric failed", zap.Any("item", item), zap.Error(err)) + continue + } + } + nls.entries = make([]*entry.Entry, 0) + + return nls.mb.Emit(), nil +} + +func (nls *NginxLogScraper) Shutdown(_ context.Context) error { + nls.logger.Info("Shutting down NGINX access log scraper") + nls.cancel() + nls.wg.Wait() + + return nls.pipe.Stop() +} + +func initStanzaPipeline( + operators []operator.Config, + logger *zap.Logger, +) (*pipeline.DirectedPipeline, <-chan []*entry.Entry, error) { + mp := otel.GetMeterProvider() + if mp == nil { + mp = metricSdk.NewMeterProvider() + otel.SetMeterProvider(mp) + } + + settings := component.TelemetrySettings{ + Logger: logger, + MeterProvider: mp, + MetricsLevel: configtelemetry.LevelNone, + } + + emitter := helper.NewLogEmitter(settings) + pipe, err := pipeline.Config{ + Operators: operators, + DefaultOutput: emitter, + }.Build(settings) + + return pipe, emitter.OutChannel(), err +} + +func (nls *NginxLogScraper) runConsumer(ctx context.Context) { + nls.logger.Info("Starting NGINX access log receiver's consumer") + defer nls.wg.Done() + + entryChan := nls.outChan + for { + select { + case <-ctx.Done(): + nls.logger.Info("Closing NGINX access log receiver consumer") + return + case entries, ok := <-entryChan: + if !ok { + nls.logger.Info("Emitter channel closed, shutting down NGINX access log consumer") + return + } + + nls.mut.Lock() + nls.entries = append(nls.entries, entries...) + nls.mut.Unlock() + } + } +} diff --git a/internal/collector/nginxossreceiver/internal/scraper/accesslog/nginx_log_scraper_test.go b/internal/collector/nginxossreceiver/internal/scraper/accesslog/nginx_log_scraper_test.go new file mode 100644 index 0000000000..986faf55d7 --- /dev/null +++ b/internal/collector/nginxossreceiver/internal/scraper/accesslog/nginx_log_scraper_test.go @@ -0,0 +1,120 @@ +// Copyright (c) F5, Inc. +// +// This source code is licensed under the Apache License, Version 2.0 license found in the +// LICENSE file in the root directory of this source tree. + +package accesslog + +import ( + "bufio" + "context" + "os" + "path/filepath" + "testing" + "time" + + "github.com/nginx/agent/v3/internal/collector/nginxossreceiver/internal/config" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest/pmetrictest" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/receiver/receivertest" +) + +const ( + testDataDir = "./testdata" + baseformat = `$remote_addr - $remote_user [$time_local] "$request"` + + ` $status $body_bytes_sent "$http_referer" "$http_user_agent"` + + ` "$http_x_forwarded_for" "$bytes_sent" "$request_length" "$request_time"` + + ` "$gzip_ratio" "$server_protocol" "$upstream_connect_time""$upstream_header_time"` + + ` "$upstream_response_length" "$upstream_response_time"` +) + +func TestAccessLogScraper_ID(t *testing.T) { + nls := &NginxLogScraper{} + assert.Equal(t, "nginx", nls.ID().Type().String()) +} + +func TestAccessLogScraper(t *testing.T) { + ctx := context.Background() + tempDir := t.TempDir() + var ( + testAccessLogPath = filepath.Join(tempDir, "test.log") + testDataFilePath = filepath.Join(testDataDir, "test-access.log") + ) + + cfg, ok := config.CreateDefaultConfig().(*config.Config) + assert.True(t, ok) + cfg.AccessLogs = []config.AccessLog{ + { + LogFormat: baseformat, + FilePath: testAccessLogPath, + }, + } + + accessLogScraper, err := NewScraper(receivertest.NewNopSettings(), cfg) + require.NoError(t, err) + defer func() { + shutdownError := accessLogScraper.Shutdown(ctx) + require.NoError(t, shutdownError) + }() + + err = accessLogScraper.Start(context.Background(), componenttest.NewNopHost()) + require.NoError(t, err) + + go simulateLogging(t, testDataFilePath, testAccessLogPath, 250*time.Millisecond) + <-time.After(cfg.CollectionInterval) + + actualMetrics, err := accessLogScraper.Scrape(context.Background()) + require.NoError(t, err) + + expectedFile := filepath.Join(testDataDir, "expected.yaml") + expectedMetrics, err := golden.ReadMetrics(expectedFile) + require.NoError(t, err) + + require.NoError(t, pmetrictest.CompareMetrics(expectedMetrics, actualMetrics, + pmetrictest.IgnoreStartTimestamp(), + pmetrictest.IgnoreMetricDataPointsOrder(), + pmetrictest.IgnoreTimestamp(), + pmetrictest.IgnoreMetricsOrder())) +} + +func TestAccessLogScraperError(t *testing.T) { + t.Run("include config missing", func(tt *testing.T) { + _, err := NewScraper(receivertest.NewNopSettings(), &config.Config{}) + require.Error(tt, err) + assert.Contains(tt, err.Error(), "init stanza pipeline") + }) +} + +// Copies the contents of one file to another with the given delay. Used to simulate writing log entries to a log file. +// Reason for nolint: we must use testify's assert instead of require, +// for more info see https://github.com/stretchr/testify/issues/772#issuecomment-945166599 +// nolint: testifylint +func simulateLogging(t *testing.T, sourcePath, destinationPath string, writeDelay time.Duration) { + t.Helper() + + src, err := os.Open(sourcePath) + assert.NoError(t, err) + defer src.Close() + + var dest *os.File + if _, fileCheckErr := os.Stat(destinationPath); os.IsNotExist(fileCheckErr) { + dest, fileCheckErr = os.Create(destinationPath) + assert.NoError(t, fileCheckErr) + } else { + dest, fileCheckErr = os.OpenFile(destinationPath, os.O_RDWR|os.O_APPEND, 0o660) + assert.NoError(t, fileCheckErr) + } + defer dest.Close() + + scanner := bufio.NewScanner(src) + for scanner.Scan() { + <-time.After(writeDelay) + + logLine := scanner.Text() + _, writeErr := dest.WriteString(logLine + "\n") + assert.NoError(t, writeErr) + } +} diff --git a/internal/collector/nginxossreceiver/internal/scraper/accesslog/operator/input/file/config.go b/internal/collector/nginxossreceiver/internal/scraper/accesslog/operator/input/file/config.go new file mode 100644 index 0000000000..0df6a3f900 --- /dev/null +++ b/internal/collector/nginxossreceiver/internal/scraper/accesslog/operator/input/file/config.go @@ -0,0 +1,121 @@ +// Copyright (c) F5, Inc. +// +// This source code is licensed under the Apache License, Version 2.0 license found in the +// LICENSE file in the root directory of this source tree. + +package file + +import ( + "fmt" + + "github.com/mitchellh/mapstructure" + "github.com/trivago/grok" + "go.opentelemetry.io/collector/component" + "go.uber.org/zap" + + "github.com/nginx/agent/v3/internal/collector/nginxossreceiver/internal/model" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/decode" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator/helper" +) + +const operatorType = "access_log_file_input" + +func init() { + operator.Register(operatorType, func() operator.Builder { return NewConfig() }) +} + +// NewConfig creates a new input config with default values +func NewConfig() *Config { + return NewConfigWithID(operatorType) +} + +// NewConfigWithID creates a new input config with default values +func NewConfigWithID(operatorID string) *Config { + return &Config{ + InputConfig: helper.NewInputConfig(operatorID, operatorType), + Config: *fileconsumer.NewConfig(), + } +} + +// Config is the configuration of a file input operator +type Config struct { + fileconsumer.Config `mapstructure:",squash"` + AccessLogFormat string `mapstructure:"access_log_format"` + helper.InputConfig `mapstructure:",squash"` +} + +// Build will build a file input operator from the supplied configuration +// nolint: ireturn +func (c Config) Build(set component.TelemetrySettings) (operator.Operator, error) { + logger := set.Logger + + inputOperator, err := c.InputConfig.Build(set) + if err != nil { + return nil, err + } + + compiledGrok, err := NewCompiledGrok(c.AccessLogFormat, logger) + if err != nil { + return nil, fmt.Errorf("grok init: %w", err) + } + + toBody := grokParseFunction(logger, compiledGrok) + + if decode.IsNop(c.Config.Encoding) { + toBody = copyFunction(logger, compiledGrok) + } + + input := &Input{ + InputOperator: inputOperator, + toBody: toBody, + } + + input.fileConsumer, err = c.Config.Build(set, input.emit) + if err != nil { + return nil, err + } + + return input, nil +} + +func newNginxAccessItem(mappedResults map[string]string) (*model.NginxAccessItem, error) { + res := &model.NginxAccessItem{} + if err := mapstructure.Decode(mappedResults, res); err != nil { + return nil, err + } + + return res, nil +} + +func grokParseFunction(logger *zap.Logger, compiledGrok *grok.CompiledGrok) toBodyFunc { + return func(token []byte) any { + return convertBytesToNginxAccessItem(logger, compiledGrok, token) + } +} + +func copyFunction(logger *zap.Logger, compiledGrok *grok.CompiledGrok) toBodyFunc { + return func(token []byte) any { + copied := make([]byte, len(token)) + copy(copied, token) + + return convertBytesToNginxAccessItem(logger, compiledGrok, copied) + } +} + +func convertBytesToNginxAccessItem( + logger *zap.Logger, + compiledGrok *grok.CompiledGrok, + input []byte, +) *model.NginxAccessItem { + mappedResults := compiledGrok.ParseString(string(input)) + + item, newNginxAccessItemError := newNginxAccessItem(mappedResults) + if newNginxAccessItemError != nil { + logger.Error("Failed to cast grok map to access item", zap.Error(newNginxAccessItemError)) + return nil + } + + return item +} diff --git a/internal/collector/nginxossreceiver/internal/scraper/accesslog/operator/input/file/config_test.go b/internal/collector/nginxossreceiver/internal/scraper/accesslog/operator/input/file/config_test.go new file mode 100644 index 0000000000..8fc2040e2a --- /dev/null +++ b/internal/collector/nginxossreceiver/internal/scraper/accesslog/operator/input/file/config_test.go @@ -0,0 +1,91 @@ +// Copyright (c) F5, Inc. +// +// This source code is licensed under the Apache License, Version 2.0 license found in the +// LICENSE file in the root directory of this source tree. + +package file + +import ( + "os" + "testing" + + "github.com/nginx/agent/v3/internal/collector/nginxossreceiver/internal/model" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component" + metricSdk "go.opentelemetry.io/otel/sdk/metric" + "go.uber.org/zap" +) + +// nolint: lll +const ( + accessLogPattern = `$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_forwarded_for"` + accessLogLine = "127.0.0.1 - - [19/May/2022:09:30:39 +0000] \"GET /nginx_status HTTP/1.1\" 200 98 \"-\" \"Go-http-client/1.1\" \"-\"\n" +) + +func TestNewConfig(t *testing.T) { + config := NewConfig() + + assert.NotNil(t, config) + assert.Equal(t, "access_log_file_input", config.InputConfig.OperatorID) +} + +func TestConfig_Build(t *testing.T) { + tempFile, err := os.CreateTemp(os.TempDir(), "access.log") + require.NoError(t, err) + defer tempFile.Close() + + config := NewConfig() + config.Include = []string{tempFile.Name()} + + telemetrySettings := component.TelemetrySettings{ + Logger: newLogger(t), + MeterProvider: metricSdk.NewMeterProvider(), + } + + operator, err := config.Build(telemetrySettings) + + require.NoError(t, err) + assert.NotNil(t, operator) + assert.Equal(t, "access_log_file_input", operator.Type()) +} + +func Test_newNginxAccessItem(t *testing.T) { + item, err := newNginxAccessItem( + map[string]string{ + "status": "200", + }, + ) + require.NoError(t, err) + assert.Equal(t, "200", item.Status) +} + +func Test_grokParseFunction(t *testing.T) { + logger := zap.L() + grok, err := NewCompiledGrok(accessLogPattern, logger) + require.NoError(t, err) + + token := []byte(accessLogLine) + + function := grokParseFunction(logger, grok) + + result := function(token) + item, ok := result.(*model.NginxAccessItem) + assert.True(t, ok) + assert.Equal(t, "200", item.Status) +} + +func Test_copyFunction(t *testing.T) { + logger := zap.L() + grok, err := NewCompiledGrok(accessLogPattern, logger) + require.NoError(t, err) + + token := []byte(accessLogLine) + + function := copyFunction(logger, grok) + + result := function(token) + item, ok := result.(*model.NginxAccessItem) + assert.True(t, ok) + assert.Equal(t, "200", item.Status) +} diff --git a/internal/collector/nginxossreceiver/internal/scraper/accesslog/operator/input/file/grok.go b/internal/collector/nginxossreceiver/internal/scraper/accesslog/operator/input/file/grok.go new file mode 100644 index 0000000000..936d624647 --- /dev/null +++ b/internal/collector/nginxossreceiver/internal/scraper/accesslog/operator/input/file/grok.go @@ -0,0 +1,86 @@ +// Copyright (c) F5, Inc. +// +// This source code is licensed under the Apache License, Version 2.0 license found in the +// LICENSE file in the root directory of this source tree. + +package file + +import ( + "errors" + "fmt" + "regexp" + "strings" + + "github.com/trivago/grok" + "go.uber.org/zap" +) + +var ( + //nolint: gocritic + formatVariables = map[string]string{ + "$remote_addr": "%{IPORHOST:remote_addr}", + "$remote_user": "%{USERNAME:remote_user}", + "$time_local": `%{HTTPDATE:time_local}`, + "$status": "%{INT:status}", + "$body_bytes_sent": "%{NUMBER:body_bytes_sent}", + "$http_referer": "%{DATA:http_referer}", + "$http_user_agent": "%{DATA:http_user_agent}", + "$http_x_forwarded_for": "%{DATA:http_x_forwarded_for}", + "$bytes_sent": "%{NUMBER:bytes_sent}", + "$gzip_ratio": "%{DATA:gzip_ratio}", + "$server_protocol": "%{DATA:server_protocol}", + "$request_length": "%{INT:request_length}", + "$request_time": "%{DATA:request_time}", + "\"$request\"": "\"%{DATA:request}\"", + "$request ": "%{DATA:request} ", + "$upstream_connect_time": "%{DATA:upstream_connect_time}", + "$upstream_header_time": "%{DATA:upstream_header_time}", + "$upstream_response_time": "%{DATA:upstream_response_time}", + "$upstream_response_length": "%{DATA:upstream_response_length}", + "$upstream_status": "%{DATA:upstream_status}", + "$upstream_cache_status": "%{DATA:upstream_cache_status}", + "[": "\\[", + "]": "\\]", + } + + // Pattern to match all the variables that are mentioned in the access log format + logVarRegex = regexp.MustCompile(`\$([a-zA-Z]+[_[a-zA-Z]+]*)`) +) + +func NewCompiledGrok(logFormat string, logger *zap.Logger) (*grok.CompiledGrok, error) { + if logger == nil { + return nil, errors.New("logger cannot be nil") + } + + // The log format can have trailing whitespace which will cause grok to NOT work, so the trim is important. + grokPattern := strings.TrimSpace(logFormat) + for key, value := range formatVariables { + grokPattern = strings.ReplaceAll(grokPattern, key, value) + } + grokPattern = replaceCustomLogVars(grokPattern) + logger.Info("Setting Grok pattern", zap.String("grokPattern", grokPattern)) + + g, err := grok.New(grok.Config{ + NamedCapturesOnly: false, + Patterns: map[string]string{"DEFAULT": grokPattern}, + }) + if err != nil { + return nil, err + } + + return g.Compile("%{DEFAULT}") +} + +func replaceCustomLogVars(logPattern string) string { + variables := logVarRegex.FindAllStringSubmatch(logPattern, -1) + + for _, match := range variables { + variable := match[0] + subMatch := match[1] // Excludes the leading $ in the var name + + replacement := fmt.Sprintf("%%{DATA:%s}", subMatch) + logPattern = strings.Replace(logPattern, variable, replacement, 1) + } + + return logPattern +} diff --git a/internal/collector/nginxossreceiver/internal/scraper/accesslog/operator/input/file/grok_test.go b/internal/collector/nginxossreceiver/internal/scraper/accesslog/operator/input/file/grok_test.go new file mode 100644 index 0000000000..337f00113f --- /dev/null +++ b/internal/collector/nginxossreceiver/internal/scraper/accesslog/operator/input/file/grok_test.go @@ -0,0 +1,190 @@ +// Copyright (c) F5, Inc. +// +// This source code is licensed under the Apache License, Version 2.0 license found in the +// LICENSE file in the root directory of this source tree. +package file + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.uber.org/zap" +) + +const baseformat = `$remote_addr - $remote_user [$time_local] "$request"` + + ` $status $body_bytes_sent "$http_referer" "$http_user_agent"` + + ` "$http_x_forwarded_for" "$bytes_sent" "$request_length" "$request_time"` + + ` "$gzip_ratio" "$server_protocol" "$upstream_connect_time""$upstream_header_time"` + + ` "$upstream_response_length" "$upstream_response_time"` + +func TestGrok_Constructor(t *testing.T) { + logger := newLogger(t) + + tests := []struct { + logger *zap.Logger + name string + logFormat string + expErrMsg string + shouldErr bool + }{ + { + name: "Test 1: logger is nil", + logger: nil, + shouldErr: true, + expErrMsg: "logger cannot be nil", + }, + { + name: "Test 2: valid log format", + logFormat: baseformat, + logger: logger, + shouldErr: false, + }, + { + name: "Test 3: empty log format", + logFormat: "", + logger: logger, + shouldErr: false, + }, + { + name: "Test 4: unknown log variable", + logFormat: `$remote_addr - $remote_user [$time_local] "$unknown_variable" `, + logger: logger, + shouldErr: false, + }, + } + + for _, test := range tests { + t.Run(test.name, func(tt *testing.T) { + fmt.Printf(test.logFormat) + grok, err := NewCompiledGrok(test.logFormat, test.logger) + if test.shouldErr { + require.Error(tt, err) + assert.Contains(tt, err.Error(), test.expErrMsg) + } else { + require.NoError(tt, err) + require.NotNil(tt, grok) + } + }) + } +} + +func TestGrok_ParseString(t *testing.T) { + logger := newLogger(t) + + tests := []struct { + expOutput map[string]string + name string + logFormat string + inputLogEntry string + }{ + { + name: "Test 1: normal log entry", + logFormat: baseformat, + inputLogEntry: `127.0.0.1 - - [12/Apr/2024:14:50:06 +0100] "GET / HTTP/1.1" 200 615 "-" ` + + `"PostmanRuntime/7.36.1" "-" "853" "226" "0.000" "-" "HTTP/1.1" "-""-" "-" "-"`, + expOutput: map[string]string{ + "BASE10NUM": "853", + "body_bytes_sent": "615", + "bytes_sent": "853", + "DEFAULT": `127.0.0.1 - - [12/Apr/2024:14:50:06 +0100] "GET / HTTP/1.1" 200 615 ` + + `"-" "PostmanRuntime/7.36.1" "-" "853" "226" "0.000" "-" "HTTP/1.1" "-""-" "-" "-"`, + "gzip_ratio": "-", + "HOSTNAME": "", + "http_referer": "-", + "http_user_agent": "PostmanRuntime/7.36.1", + "http_x_forwarded_for": "-", + "IP": "127.0.0.1", + "IPV4": "127.0.0.1", + "IPV6": "", + "remote_addr": "127.0.0.1", + "remote_user": "-", + "request_length": "226", + "request_time": "0.000", + "request": "GET / HTTP/1.1", + "server_protocol": "HTTP/1.1", + "status": "200", + "time_local": "12/Apr/2024:14:50:06 +0100", + "upstream_connect_time": "-", + "upstream_header_time": "-", + "upstream_response_length": "-", + "upstream_response_time": "-", + }, + }, + { + name: "Test 2: normal upstream log entry", + logFormat: baseformat, + inputLogEntry: `127.0.0.1 - - [11/Apr/2024:13:39:25 +0100] "GET /frontend1 HTTP/1.0" 200 28 "-" ` + + `"PostmanRuntime/7.36.1" "-" "185" "222" "0.000" "-" "HTTP/1.0" "-""-" "-" "-"`, + expOutput: map[string]string{ + "BASE10NUM": "185", + "DEFAULT": `127.0.0.1 - - [11/Apr/2024:13:39:25 +0100] "GET /frontend1 HTTP/1.0" 200 ` + + `28 "-" "PostmanRuntime/7.36.1" "-" "185" "222" "0.000" "-" "HTTP/1.0" "-""-" "-" "-"`, + "HOSTNAME": "", + "IP": "127.0.0.1", + "IPV4": "127.0.0.1", + "IPV6": "", + "body_bytes_sent": "28", + "bytes_sent": "185", + "gzip_ratio": "-", + "http_referer": "-", + "http_user_agent": "PostmanRuntime/7.36.1", + "http_x_forwarded_for": "-", + "remote_addr": "127.0.0.1", + "remote_user": "-", + "request": "GET /frontend1 HTTP/1.0", + "request_length": "222", + "request_time": "0.000", + "server_protocol": "HTTP/1.0", + "status": "200", + "time_local": "11/Apr/2024:13:39:25 +0100", + "upstream_connect_time": "-", + "upstream_header_time": "-", + "upstream_response_length": "-", + "upstream_response_time": "-", + }, + }, + } + + for _, test := range tests { + t.Run(test.name, func(tt *testing.T) { + grok, err := NewCompiledGrok(test.logFormat, logger) + require.NoError(tt, err) + // Our code only uses ParseString(), so we will ignore other methods in the Grok API. + actualOutput := grok.ParseString(test.inputLogEntry) + removeTimeEntries(actualOutput) + + assert.Equal(tt, test.expOutput, actualOutput) + }) + } +} + +func newLogger(t *testing.T) *zap.Logger { + t.Helper() + logCfg := zap.NewDevelopmentConfig() + logCfg.OutputPaths = []string{"stdout"} + logCfg.ErrorOutputPaths = []string{"stderr"} + logger, err := logCfg.Build() + require.NoError(t, err) + + return logger +} + +// Omit time entries, as they will vary depending on when the test will be run. +func removeTimeEntries(grokOutput map[string]string) { + dateKeys := []string{ + "HOUR", + "INT", + "MINUTE", + "MONTH", + "MONTHDAY", + "SECOND", + "TIME", + "YEAR", + } + + for _, key := range dateKeys { + delete(grokOutput, key) + } +} diff --git a/internal/collector/nginxossreceiver/internal/scraper/accesslog/operator/input/file/input.go b/internal/collector/nginxossreceiver/internal/scraper/accesslog/operator/input/file/input.go new file mode 100644 index 0000000000..532eb1b355 --- /dev/null +++ b/internal/collector/nginxossreceiver/internal/scraper/accesslog/operator/input/file/input.go @@ -0,0 +1,56 @@ +// Copyright (c) F5, Inc. +// +// This source code is licensed under the Apache License, Version 2.0 license found in the +// LICENSE file in the root directory of this source tree. + +package file + +import ( + "context" + "fmt" + + "go.uber.org/zap" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/entry" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator/helper" +) + +type toBodyFunc func([]byte) any + +// Input is an operator that monitors files for entries +type Input struct { + fileConsumer *fileconsumer.Manager + toBody toBodyFunc + helper.InputOperator +} + +// Start will start the file monitoring process +func (i *Input) Start(persister operator.Persister) error { + return i.fileConsumer.Start(persister) +} + +// Stop will stop the file monitoring process +func (i *Input) Stop() error { + return i.fileConsumer.Stop() +} + +func (i *Input) emit(ctx context.Context, token []byte, attrs map[string]any) error { + if len(token) == 0 { + return nil + } + + ent, err := i.NewEntry(i.toBody(token)) + if err != nil { + return fmt.Errorf("create entry: %w", err) + } + + for k, v := range attrs { + if setError := ent.Set(entry.NewAttributeField(k), v); setError != nil { + i.Logger().Error("Set attribute", zap.Error(setError)) + } + } + + return i.Write(ctx, ent) +} diff --git a/internal/collector/nginxossreceiver/internal/scraper/accesslog/operator/input/file/input_test.go b/internal/collector/nginxossreceiver/internal/scraper/accesslog/operator/input/file/input_test.go new file mode 100644 index 0000000000..f72112e3d8 --- /dev/null +++ b/internal/collector/nginxossreceiver/internal/scraper/accesslog/operator/input/file/input_test.go @@ -0,0 +1,46 @@ +// Copyright (c) F5, Inc. +// +// This source code is licensed under the Apache License, Version 2.0 license found in the +// LICENSE file in the root directory of this source tree. + +package file + +import ( + "context" + "testing" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer" + "github.com/stretchr/testify/require" + "go.uber.org/zap" +) + +func TestInput_emit(t *testing.T) { + input := Input{ + fileConsumer: &fileconsumer.Manager{}, + toBody: func(token []byte) any { + grok, err := NewCompiledGrok(accessLogPattern, zap.L()) + if err != nil { + t.Errorf("Failed to create new grok, %v", err) + return nil + } + mappedResults := grok.ParseString(string(token)) + + item, newNginxAccessItemError := newNginxAccessItem(mappedResults) + if newNginxAccessItemError != nil { + t.Errorf("Failed to cast grok map to access item, %v", newNginxAccessItemError) + return nil + } + + return item + }, + } + + token := []byte(accessLogLine) + + err := input.emit(context.Background(), token, map[string]any{"attribute1": "test"}) + require.NoError(t, err) + + // nil token check + err = input.emit(context.Background(), nil, map[string]any{"attribute1": "test"}) + require.NoError(t, err) +} diff --git a/internal/collector/nginxossreceiver/internal/scraper/accesslog/testdata/basic.conf b/internal/collector/nginxossreceiver/internal/scraper/accesslog/testdata/basic.conf new file mode 100644 index 0000000000..f6185bbab4 --- /dev/null +++ b/internal/collector/nginxossreceiver/internal/scraper/accesslog/testdata/basic.conf @@ -0,0 +1,57 @@ +# default '/etc/nginx/conf.d/default.conf with /status metrics +worker_processes auto; + +events { + worker_connections 1024; +} + +error_log /var/log/nginx/error.log notice; + +http { + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for" ' + '"$bytes_sent" "$request_length" "$request_time" ' + '"$gzip_ratio" $server_protocol '; + + access_log /var/log/nginx/access.log main; + + server { + listen 80; + server_name localhost; + + location / { + root /usr/share/nginx/html; + index index.html index.htm; + } + + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root /usr/share/nginx/html; + } + + location /status { + stub_status on; + access_log on; + allow all; + } + } + + server { + listen 9090; + return 200 "hello from http workload 1 \n"; + } + + upstream nginx1 { + server 127.0.0.1:9090; + zone my_backend1 1000000; + keepalive 32; + } + + server { + listen 127.0.0.1:9091; + location /frontend1 { + proxy_pass http://nginx1; + } + } +} diff --git a/internal/collector/nginxossreceiver/internal/scraper/accesslog/testdata/default.conf b/internal/collector/nginxossreceiver/internal/scraper/accesslog/testdata/default.conf new file mode 100644 index 0000000000..894433f2e7 --- /dev/null +++ b/internal/collector/nginxossreceiver/internal/scraper/accesslog/testdata/default.conf @@ -0,0 +1,59 @@ +# default '/etc/nginx/conf.d/default.conf with /status metrics, an upstream and modified log_format. +worker_processes auto; + +events { + worker_connections 1024; +} + +error_log /var/log/nginx/error.log notice; + +http { + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for" ' + '"$bytes_sent" "$request_length" "$request_time" ' + '"$gzip_ratio" "$server_protocol" "$upstream_connect_time"' + '"$upstream_header_time" "$upstream_response_length" ' + '"$upstream_response_time" '; + + access_log /var/log/nginx/access.log main; + + server { + listen 80; + server_name localhost; + + location / { + root /usr/share/nginx/html; + index index.html index.htm; + } + + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root /usr/share/nginx/html; + } + + location /status { + stub_status on; + access_log on; + allow all; + } + } + + server { + listen 9090; + return 200 "hello from http workload 1 \n"; + } + + upstream nginx1 { + server 127.0.0.1:9090; + zone my_backend1 1000000; + keepalive 32; + } + + server { + listen 127.0.0.1:9091; + location /frontend1 { + proxy_pass http://nginx1; + } + } +} diff --git a/internal/collector/nginxossreceiver/internal/scraper/accesslog/testdata/expected.yaml b/internal/collector/nginxossreceiver/internal/scraper/accesslog/testdata/expected.yaml new file mode 100644 index 0000000000..94a4d72368 --- /dev/null +++ b/internal/collector/nginxossreceiver/internal/scraper/accesslog/testdata/expected.yaml @@ -0,0 +1,61 @@ +resourceMetrics: + - resource: {} + scopeMetrics: + - metrics: + - description: The number of responses, grouped by status code range. + name: nginx.http.response.status + sum: + aggregationTemporality: 2 # Cumulative + isMonotonic: true + dataPoints: + - asInt: 1 + attributes: + - key: nginx.status_range + value: + stringValue: 2xx + timeUnixNano: "1000000" + - asInt: 1 + attributes: + - key: nginx.status_range + value: + stringValue: "2xx" + - asInt: 1 + attributes: + - key: nginx.status_range + value: + stringValue: "3xx" + - asInt: 1 + attributes: + - key: nginx.status_range + value: + stringValue: "3xx" + - asInt: 1 + attributes: + - key: nginx.status_range + value: + stringValue: "4xx" + - asInt: 1 + attributes: + - key: nginx.status_range + value: + stringValue: "4xx" + - asInt: 1 + attributes: + - key: nginx.status_range + value: + stringValue: "5xx" + - asInt: 1 + attributes: + - key: nginx.status_range + value: + stringValue: "5xx" + - asInt: 1 + attributes: + - key: nginx.status_range + value: + stringValue: "5xx" + timeUnixNano: "1000000" + unit: responses + scope: + name: otelcol/nginxreceiver + version: latest diff --git a/internal/collector/nginxossreceiver/internal/scraper/accesslog/testdata/invalid.conf b/internal/collector/nginxossreceiver/internal/scraper/accesslog/testdata/invalid.conf new file mode 100644 index 0000000000..bb5ea60764 --- /dev/null +++ b/internal/collector/nginxossreceiver/internal/scraper/accesslog/testdata/invalid.conf @@ -0,0 +1,58 @@ +# default '/etc/nginx/conf.d/default.conf with /status metrics +worker_processes auto; + +events { + worker_connections 1024; +} + +error_log /var/log/nginx/error.log notice; + +http { + access_log /var/log/nginx/access.log main; + + server { + listen 80; + server_name localhost; + + location / { + root /usr/share/nginx/html; + index index.html index.htm; + } + + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root /usr/share/nginx/html; + } + + location /status { + stub_status on; + access_log on; + allow all; + } + } + + server { + # log_format is only allowed inside http blocks. + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for" ' + '"$bytes_sent" "$request_length" "$request_time" ' + '"$gzip_ratio" $server_protocol '; + + listen 9090; + return 200 "hello from http workload 1 \n"; + } + + upstream nginx1 { + server 127.0.0.1:9090; + zone my_backend1 1000000; + keepalive 32; + } + + server { + listen 127.0.0.1:9091; + location /frontend1 { + proxy_pass http://nginx1; + } + } +} diff --git a/internal/collector/nginxossreceiver/internal/scraper/accesslog/testdata/no-log-format.conf b/internal/collector/nginxossreceiver/internal/scraper/accesslog/testdata/no-log-format.conf new file mode 100644 index 0000000000..88acfd4e2a --- /dev/null +++ b/internal/collector/nginxossreceiver/internal/scraper/accesslog/testdata/no-log-format.conf @@ -0,0 +1,33 @@ +# default '/etc/nginx/conf.d/default.conf with /status metrics +worker_processes auto; + +events { + worker_connections 1024; +} + +error_log /var/log/nginx/error.log notice; + +http { + access_log /var/log/nginx/access.log main; + + server { + listen 80; + server_name localhost; + + location / { + root /usr/share/nginx/html; + index index.html index.htm; + } + + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root /usr/share/nginx/html; + } + + location /status { + stub_status on; + access_log on; + allow all; + } + } +} diff --git a/internal/collector/nginxossreceiver/internal/scraper/accesslog/testdata/test-access.log b/internal/collector/nginxossreceiver/internal/scraper/accesslog/testdata/test-access.log new file mode 100644 index 0000000000..a9d8ed8349 --- /dev/null +++ b/internal/collector/nginxossreceiver/internal/scraper/accesslog/testdata/test-access.log @@ -0,0 +1,9 @@ +127.0.0.1 - - [16/Apr/2024:09:00:45 +0100] "GET /example HTTP/1.0" 200 28 "-" "PostmanRuntime/7.36.1" "-" "185" "222" "0.000" "-" "HTTP/1.0" "-""-" "-" "-" +127.0.0.1 - - [16/Apr/2024:09:00:45 +0100] "GET /example HTTP/1.1" 203 28 "-" "PostmanRuntime/7.36.1" "-" "190" "235" "0.004" "-" "HTTP/1.1" "0.003""0.003" "28" "0.003" +127.0.0.1 - - [16/Apr/2024:09:03:02 +0100] "GET /example HTTP/1.0" 300 28 "-" "PostmanRuntime/7.36.1" "-" "185" "222" "0.000" "-" "HTTP/1.0" "-""-" "-" "-" +127.0.0.1 - - [16/Apr/2024:09:03:02 +0100] "GET /example HTTP/1.1" 303 28 "-" "PostmanRuntime/7.36.1" "-" "190" "235" "0.002" "-" "HTTP/1.1" "0.000""0.003" "28" "0.003" +127.0.0.1 - - [16/Apr/2024:10:57:45 +0100] "GET /example HTTP/1.0" 400 28 "-" "PostmanRuntime/7.36.1" "-" "185" "222" "0.000" "-" "HTTP/1.0" "-""-" "-" "-" +127.0.0.1 - - [16/Apr/2024:10:57:45 +0100] "GET /example HTTP/1.1" 401 28 "-" "PostmanRuntime/7.36.1" "-" "190" "235" "0.406" "-" "HTTP/1.1" "0.297""0.407" "28" "0.407" +127.0.0.1 - - [16/Apr/2024:10:57:55 +0100] "GET / HTTP/1.1" 500 615 "-" "PostmanRuntime/7.36.1" "-" "853" "226" "0.000" "-" "HTTP/1.1" "-""-" "-" "-" +127.0.0.1 - - [16/Apr/2024:10:58:25 +0100] "GET / HTTP/1.1" 502 615 "-" "PostmanRuntime/7.36.1" "-" "853" "226" "0.000" "-" "HTTP/1.1" "-""-" "-" "-" +127.0.0.1 - - [16/Apr/2024:19:58:46 +0100] "GET / HTTP/1.1" 503 615 "-" "PostmanRuntime/7.36.1" "-" "853" "226" "0.000" "-" "HTTP/1.1" "-""-" "-" "-" diff --git a/internal/collector/nginxossreceiver/internal/scraper/stubstatus/stub_status_scraper.go b/internal/collector/nginxossreceiver/internal/scraper/stubstatus/stub_status_scraper.go new file mode 100644 index 0000000000..30a3f82f87 --- /dev/null +++ b/internal/collector/nginxossreceiver/internal/scraper/stubstatus/stub_status_scraper.go @@ -0,0 +1,115 @@ +// Copyright (c) F5, Inc. +// +// This source code is licensed under the Apache License, Version 2.0 license found in the +// LICENSE file in the root directory of this source tree. + +package stubstatus + +import ( + "context" + "net/http" + "time" + + "github.com/nginxinc/nginx-prometheus-exporter/client" + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/pdata/pcommon" + "go.opentelemetry.io/collector/pdata/pmetric" + "go.opentelemetry.io/collector/receiver" + "go.opentelemetry.io/collector/receiver/scraperhelper" + "go.uber.org/zap" + + "github.com/nginx/agent/v3/internal/collector/nginxossreceiver/internal/config" + "github.com/nginx/agent/v3/internal/collector/nginxossreceiver/internal/metadata" +) + +type NginxStubStatusScraper struct { + httpClient *http.Client + client *client.NginxClient + + settings component.TelemetrySettings + cfg *config.Config + mb *metadata.MetricsBuilder +} + +var _ scraperhelper.Scraper = (*NginxStubStatusScraper)(nil) + +func NewScraper( + settings receiver.Settings, + cfg *config.Config, +) *NginxStubStatusScraper { + mb := metadata.NewMetricsBuilder(cfg.MetricsBuilderConfig, settings) + return &NginxStubStatusScraper{ + settings: settings.TelemetrySettings, + cfg: cfg, + mb: mb, + } +} + +func (s *NginxStubStatusScraper) ID() component.ID { + return component.NewID(metadata.Type) +} + +func (s *NginxStubStatusScraper) Start(ctx context.Context, host component.Host) error { + httpClient, err := s.cfg.ToClient(ctx, host, s.settings) + if err != nil { + return err + } + s.httpClient = httpClient + + return nil +} + +func (s *NginxStubStatusScraper) Shutdown(_ context.Context) error { + return nil +} + +func (s *NginxStubStatusScraper) Scrape(context.Context) (pmetric.Metrics, error) { + // Init client in scrape method in case there are transient errors in the constructor. + if s.client == nil { + s.client = client.NewNginxClient(s.httpClient, s.cfg.ClientConfig.Endpoint) + } + + stats, err := s.client.GetStubStats() + if err != nil { + s.settings.Logger.Error("fetch nginx stats", zap.Error(err)) + return pmetric.Metrics{}, err + } + + now := pcommon.NewTimestampFromTime(time.Now()) + + s.mb.RecordNginxHTTPRequestsDataPoint(now, stats.Requests) + + s.mb.RecordNginxHTTPConnDataPoint( + now, + stats.Connections.Accepted, + metadata.AttributeNginxConnOutcomeACCEPTED, + ) + s.mb.RecordNginxHTTPConnDataPoint( + now, + stats.Connections.Handled, + metadata.AttributeNginxConnOutcomeHANDLED, + ) + + s.mb.RecordNginxHTTPConnCountDataPoint( + now, + stats.Connections.Active, + metadata.AttributeNginxConnOutcomeACTIVE, + ) + s.mb.RecordNginxHTTPConnCountDataPoint( + now, + stats.Connections.Reading, + metadata.AttributeNginxConnOutcomeREADING, + ) + s.mb.RecordNginxHTTPConnCountDataPoint( + now, + stats.Connections.Writing, + metadata.AttributeNginxConnOutcomeWRITING, + ) + s.mb.RecordNginxHTTPConnCountDataPoint( + now, + stats.Connections.Waiting, + metadata.AttributeNginxConnOutcomeWAITING, + ) + + return s.mb.Emit(), nil +} diff --git a/internal/collector/nginxossreceiver/internal/scraper/stubstatus/stub_status_scraper_test.go b/internal/collector/nginxossreceiver/internal/scraper/stubstatus/stub_status_scraper_test.go new file mode 100644 index 0000000000..7a8c7f0b4f --- /dev/null +++ b/internal/collector/nginxossreceiver/internal/scraper/stubstatus/stub_status_scraper_test.go @@ -0,0 +1,125 @@ +// Copyright (c) F5, Inc. +// +// This source code is licensed under the Apache License, Version 2.0 license found in the +// LICENSE file in the root directory of this source tree. + +package stubstatus + +import ( + "context" + "errors" + "net/http" + "net/http/httptest" + "path/filepath" + "testing" + + "github.com/nginx/agent/v3/internal/collector/nginxossreceiver/internal/config" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/config/confighttp" + "go.opentelemetry.io/collector/config/configtls" + "go.opentelemetry.io/collector/receiver/receivertest" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest/pmetrictest" +) + +const testDataDir = "testdata" + +func TestStubStatusScraper(t *testing.T) { + nginxMock := newMockServer(t) + defer nginxMock.Close() + cfg, ok := config.CreateDefaultConfig().(*config.Config) + assert.True(t, ok) + cfg.Endpoint = nginxMock.URL + "/status" + require.NoError(t, component.ValidateConfig(cfg)) + + stubStatusScraper := NewScraper(receivertest.NewNopSettings(), cfg) + + err := stubStatusScraper.Start(context.Background(), componenttest.NewNopHost()) + require.NoError(t, err) + + actualMetrics, err := stubStatusScraper.Scrape(context.Background()) + require.NoError(t, err) + + expectedFile := filepath.Join(testDataDir, "expected.yaml") + expectedMetrics, err := golden.ReadMetrics(expectedFile) + require.NoError(t, err) + + require.NoError(t, pmetrictest.CompareMetrics(expectedMetrics, actualMetrics, + pmetrictest.IgnoreStartTimestamp(), + pmetrictest.IgnoreMetricDataPointsOrder(), + pmetrictest.IgnoreTimestamp(), + pmetrictest.IgnoreMetricsOrder())) +} + +func TestStubStatusScraperError(t *testing.T) { + nginxMock := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { + if req.URL.Path == "/status" { + rw.WriteHeader(http.StatusOK) + _, _ = rw.Write([]byte(`Bad status page`)) + + return + } + rw.WriteHeader(http.StatusNotFound) + })) + t.Run("404", func(t *testing.T) { + sc := NewScraper(receivertest.NewNopSettings(), &config.Config{ + ClientConfig: confighttp.ClientConfig{ + Endpoint: nginxMock.URL + "/badpath", + }, + }) + err := sc.Start(context.Background(), componenttest.NewNopHost()) + require.NoError(t, err) + _, err = sc.Scrape(context.Background()) + require.Equal(t, errors.New("expected 200 response, got 404"), err) + }) + + t.Run("parse error", func(t *testing.T) { + sc := NewScraper(receivertest.NewNopSettings(), &config.Config{ + ClientConfig: confighttp.ClientConfig{ + Endpoint: nginxMock.URL + "/status", + }, + }) + err := sc.Start(context.Background(), componenttest.NewNopHost()) + require.NoError(t, err) + _, err = sc.Scrape(context.Background()) + require.ErrorContains(t, err, "Bad status page") + }) + nginxMock.Close() +} + +func TestScraperFailedStart(t *testing.T) { + sc := NewScraper(receivertest.NewNopSettings(), &config.Config{ + ClientConfig: confighttp.ClientConfig{ + Endpoint: "localhost:8080", + TLSSetting: configtls.ClientConfig{ + Config: configtls.Config{ + CAFile: "/non/existent", + }, + }, + }, + }) + err := sc.Start(context.Background(), componenttest.NewNopHost()) + require.Error(t, err) +} + +func newMockServer(t *testing.T) *httptest.Server { + t.Helper() + return httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { + if req.URL.Path == "/status" { + rw.WriteHeader(http.StatusOK) + _, err := rw.Write([]byte(`Active connections: 291 +server accepts handled requests + 16630948 16630946 31070465 +Reading: 6 Writing: 179 Waiting: 106 +`)) + require.NoError(t, err) + + return + } + rw.WriteHeader(http.StatusNotFound) + })) +} diff --git a/internal/collector/nginxossreceiver/internal/scraper/stubstatus/testdata/expected.yaml b/internal/collector/nginxossreceiver/internal/scraper/stubstatus/testdata/expected.yaml new file mode 100644 index 0000000000..fc4ff5bc25 --- /dev/null +++ b/internal/collector/nginxossreceiver/internal/scraper/stubstatus/testdata/expected.yaml @@ -0,0 +1,60 @@ +resourceMetrics: + - resource: {} + scopeMetrics: + - metrics: + - description: The total number of connections. + name: nginx.http.conn + sum: + aggregationTemporality: 2 + dataPoints: + - asInt: "16630948" + attributes: + - key: nginx.conn.outcome + value: + stringValue: ACCEPTED + - asInt: "16630946" + attributes: + - key: nginx.conn.outcome + value: + stringValue: HANDLED + isMonotonic: true + unit: connections + - description: The current number of connections. + name: nginx.http.conn.count + gauge: + aggregationTemporality: 2 + dataPoints: + - asInt: "291" + attributes: + - key: nginx.conn.outcome + value: + stringValue: ACTIVE + - asInt: "6" + attributes: + - key: nginx.conn.outcome + value: + stringValue: READING + - asInt: "179" + attributes: + - key: nginx.conn.outcome + value: + stringValue: WRITING + - asInt: "106" + attributes: + - key: nginx.conn.outcome + value: + stringValue: WAITING + isMonotonic: true + unit: connections + - description: The total number of client requests received from clients. + name: nginx.http.requests + sum: + aggregationTemporality: 2 + dataPoints: + - asInt: "31070465" + timeUnixNano: "1000000" + isMonotonic: true + unit: requests + scope: + name: otelcol/nginxreceiver + version: latest diff --git a/internal/collector/nginxossreceiver/internal/scraper/stubstatus/testdata/expected_with_connections_as_gauge.yaml b/internal/collector/nginxossreceiver/internal/scraper/stubstatus/testdata/expected_with_connections_as_gauge.yaml new file mode 100644 index 0000000000..458e7e7df4 --- /dev/null +++ b/internal/collector/nginxossreceiver/internal/scraper/stubstatus/testdata/expected_with_connections_as_gauge.yaml @@ -0,0 +1,63 @@ +resourceMetrics: + - resource: {} + scopeMetrics: + - metrics: + - description: The total number of accepted client connections + name: nginx.connections_accepted + sum: + aggregationTemporality: 2 + dataPoints: + - asInt: "16630948" + timeUnixNano: "1000000" + isMonotonic: true + unit: connections + - description: The current number of nginx connections by state + gauge: + dataPoints: + - asInt: "291" + attributes: + - key: state + value: + stringValue: active + timeUnixNano: "1000000" + - asInt: "6" + attributes: + - key: state + value: + stringValue: reading + timeUnixNano: "1000000" + - asInt: "106" + attributes: + - key: state + value: + stringValue: waiting + timeUnixNano: "1000000" + - asInt: "179" + attributes: + - key: state + value: + stringValue: writing + timeUnixNano: "1000000" + name: nginx.connections_current + unit: connections + - description: The total number of handled connections. Generally, the parameter value is the same as nginx.connections_accepted unless some resource limits have been reached (for example, the worker_connections limit). + name: nginx.connections_handled + sum: + aggregationTemporality: 2 + dataPoints: + - asInt: "16630946" + timeUnixNano: "1000000" + isMonotonic: true + unit: connections + - description: Total number of requests made to the server since it started + name: nginx.requests + sum: + aggregationTemporality: 2 + dataPoints: + - asInt: "31070465" + timeUnixNano: "1000000" + isMonotonic: true + unit: requests + scope: + name: otelcol/nginxreceiver + version: latest diff --git a/internal/collector/nginxossreceiver/metadata.yaml b/internal/collector/nginxossreceiver/metadata.yaml new file mode 100644 index 0000000000..04dc43a616 --- /dev/null +++ b/internal/collector/nginxossreceiver/metadata.yaml @@ -0,0 +1,69 @@ +type: nginx +scope_name: otelcol/nginxreceiver + +status: + class: receiver + stability: + beta: [metrics] + distributions: [contrib] + codeowners: + active: [olli-holmala, oliveromahony, apgralG, dhurley, craigell] + +attributes: + nginx.conn.outcome: + description: The outcome of the connection. + type: string + enum: + - "ACCEPTED" + - "ACTIVE" + - "HANDLED" + - "READING" + - "WRITING" + - "WAITING" + nginx.status_range: + description: A status code range or bucket for a HTTP response's status code. + type: string + enum: + - "1xx" + - "2xx" + - "3xx" + - "4xx" + - "5xx" + +metrics: + nginx.http.requests: + enabled: true + description: The total number of client requests received from clients. + sum: + value_type: int + monotonic: true + aggregation_temporality: cumulative + unit: "requests" + nginx.http.conn: + enabled: true + description: The total number of connections. + sum: + value_type: int + monotonic: true + aggregation_temporality: cumulative + unit: "connections" + attributes: + - nginx.conn.outcome + nginx.http.conn.count: + enabled: true + description: The current number of connections. + gauge: + value_type: int + unit: "connections" + attributes: + - nginx.conn.outcome + nginx.http.response.status: + enabled: true + description: The number of responses, grouped by status code range. + sum: + value_type: int + monotonic: true + aggregation_temporality: cumulative + unit: "responses" + attributes: + - nginx.status_range diff --git a/internal/collector/nginxossreceiver/testdata/config.yaml b/internal/collector/nginxossreceiver/testdata/config.yaml new file mode 100644 index 0000000000..8ac5809bd2 --- /dev/null +++ b/internal/collector/nginxossreceiver/testdata/config.yaml @@ -0,0 +1,4 @@ +nginx: + endpoint: "http://localhost:80/status" + collection_interval: 10s + nginx_conf_path: "" \ No newline at end of file diff --git a/internal/collector/nginxossreceiver/testdata/integration/Dockerfile.nginx b/internal/collector/nginxossreceiver/testdata/integration/Dockerfile.nginx new file mode 100644 index 0000000000..16177694b7 --- /dev/null +++ b/internal/collector/nginxossreceiver/testdata/integration/Dockerfile.nginx @@ -0,0 +1,6 @@ +FROM docker.io/library/nginx:1.25 + +COPY default.conf /etc/nginx/conf.d/default.conf +RUN \ + chown root:root /etc/nginx/conf.d/default.conf && \ + chmod 0644 /etc/nginx/conf.d/default.conf diff --git a/internal/collector/nginxossreceiver/testdata/integration/default.conf b/internal/collector/nginxossreceiver/testdata/integration/default.conf new file mode 100644 index 0000000000..894433f2e7 --- /dev/null +++ b/internal/collector/nginxossreceiver/testdata/integration/default.conf @@ -0,0 +1,59 @@ +# default '/etc/nginx/conf.d/default.conf with /status metrics, an upstream and modified log_format. +worker_processes auto; + +events { + worker_connections 1024; +} + +error_log /var/log/nginx/error.log notice; + +http { + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for" ' + '"$bytes_sent" "$request_length" "$request_time" ' + '"$gzip_ratio" "$server_protocol" "$upstream_connect_time"' + '"$upstream_header_time" "$upstream_response_length" ' + '"$upstream_response_time" '; + + access_log /var/log/nginx/access.log main; + + server { + listen 80; + server_name localhost; + + location / { + root /usr/share/nginx/html; + index index.html index.htm; + } + + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root /usr/share/nginx/html; + } + + location /status { + stub_status on; + access_log on; + allow all; + } + } + + server { + listen 9090; + return 200 "hello from http workload 1 \n"; + } + + upstream nginx1 { + server 127.0.0.1:9090; + zone my_backend1 1000000; + keepalive 32; + } + + server { + listen 127.0.0.1:9091; + location /frontend1 { + proxy_pass http://nginx1; + } + } +} diff --git a/internal/collector/nginxossreceiver/testdata/integration/expected.yaml b/internal/collector/nginxossreceiver/testdata/integration/expected.yaml new file mode 100644 index 0000000000..9c5bc3463b --- /dev/null +++ b/internal/collector/nginxossreceiver/testdata/integration/expected.yaml @@ -0,0 +1,65 @@ +resourceMetrics: + - resource: {} + scopeMetrics: + - metrics: + - description: The total number of accepted client connections + name: nginx.connections_accepted + sum: + aggregationTemporality: 2 + dataPoints: + - asInt: "1" + timeUnixNano: "1643729289485220000" + isMonotonic: true + unit: connections + - description: The current number of nginx connections by state + sum: + aggregationTemporality: 2 + dataPoints: + - asInt: "1" + attributes: + - key: state + value: + stringValue: active + timeUnixNano: "1643729289485220000" + - asInt: "0" + attributes: + - key: state + value: + stringValue: reading + timeUnixNano: "1643729289485220000" + - asInt: "1" + attributes: + - key: state + value: + stringValue: writing + timeUnixNano: "1643729289485220000" + - asInt: "0" + attributes: + - key: state + value: + stringValue: waiting + timeUnixNano: "1643729289485220000" + isMonotonic: false + name: nginx.connections_current + unit: connections + - description: The total number of handled connections. Generally, the parameter value is the same as nginx.connections_accepted unless some resource limits have been reached (for example, the worker_connections limit). + name: nginx.connections_handled + sum: + aggregationTemporality: 2 + dataPoints: + - asInt: "1" + timeUnixNano: "1643729289485220000" + isMonotonic: true + unit: connections + - description: Total number of requests made to the server since it started + name: nginx.requests + sum: + aggregationTemporality: 2 + dataPoints: + - asInt: "2" + timeUnixNano: "1643729289485220000" + isMonotonic: true + unit: requests + scope: + name: otelcol/nginxreceiver + version: latest diff --git a/internal/collector/nginxplusreceiver/internal/metadata/generated_status.go b/internal/collector/nginxplusreceiver/internal/metadata/generated_status.go index feb047ea22..96f453b98a 100644 --- a/internal/collector/nginxplusreceiver/internal/metadata/generated_status.go +++ b/internal/collector/nginxplusreceiver/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("nginxplus") + Type = component.MustNewType("nginxplus") + ScopeName = "otelcol/nginxplusreceiver" ) const ( diff --git a/internal/collector/otel_collector_plugin.go b/internal/collector/otel_collector_plugin.go index b3358656a8..e7750d5041 100644 --- a/internal/collector/otel_collector_plugin.go +++ b/internal/collector/otel_collector_plugin.go @@ -9,6 +9,7 @@ import ( "errors" "fmt" "log/slog" + "strings" "time" "github.com/nginx/agent/v3/internal/backoff" @@ -82,7 +83,7 @@ func (oc *Collector) bootup(ctx context.Context) error { if appErr != nil { errChan <- appErr } - slog.InfoContext(ctx, "Run Finished") + slog.InfoContext(ctx, "OTel collector run finished") }() for { @@ -229,6 +230,7 @@ func (oc *Collector) checkForNewNginxReceivers(nginxConfigContext *model.NginxCo config.NginxReceiver{ InstanceID: nginxConfigContext.InstanceID, StubStatus: nginxConfigContext.StubStatus, + AccessLogs: toConfigAccessLog(nginxConfigContext.AccessLogs), }, ) @@ -277,13 +279,14 @@ func (oc *Collector) updateExistingNginxOSSReceiver( if nginxReceiver.InstanceID == nginxConfigContext.InstanceID { nginxReceiverFound = true - if nginxReceiver.StubStatus != nginxConfigContext.StubStatus { + if isOSSReceiverChanged(nginxReceiver, nginxConfigContext) { oc.config.Collector.Receivers.NginxReceivers = append( oc.config.Collector.Receivers.NginxReceivers[:index], oc.config.Collector.Receivers.NginxReceivers[index+1:]..., ) if nginxConfigContext.StubStatus != "" { nginxReceiver.StubStatus = nginxConfigContext.StubStatus + nginxReceiver.AccessLogs = toConfigAccessLog(nginxConfigContext.AccessLogs) oc.config.Collector.Receivers.NginxReceivers = append( oc.config.Collector.Receivers.NginxReceivers, nginxReceiver, @@ -300,3 +303,31 @@ func (oc *Collector) updateExistingNginxOSSReceiver( return nginxReceiverFound, reloadCollector } + +func isOSSReceiverChanged(nginxReceiver config.NginxReceiver, nginxConfigContext *model.NginxConfigContext) bool { + return nginxReceiver.StubStatus != nginxConfigContext.StubStatus || + len(nginxReceiver.AccessLogs) != len(nginxConfigContext.AccessLogs) +} + +func toConfigAccessLog(al []*model.AccessLog) []config.AccessLog { + if al == nil { + return nil + } + + results := make([]config.AccessLog, 0, len(al)) + for _, ctxAccessLog := range al { + results = append(results, config.AccessLog{ + LogFormat: escapeString(ctxAccessLog.Format), + FilePath: ctxAccessLog.Name, + }) + } + + return results +} + +func escapeString(input string) string { + output := strings.ReplaceAll(input, "$", "$$") + output = strings.ReplaceAll(output, "\"", "\\\"") + + return output +} diff --git a/internal/collector/otel_collector_plugin_test.go b/internal/collector/otel_collector_plugin_test.go index 3b362d71f9..5af979ba5b 100644 --- a/internal/collector/otel_collector_plugin_test.go +++ b/internal/collector/otel_collector_plugin_test.go @@ -98,6 +98,12 @@ func TestCollector_Process(t *testing.T) { Data: &model.NginxConfigContext{ InstanceID: "123", StubStatus: "http://test.com:8080/stub_status", + AccessLogs: []*model.AccessLog{ + { + Name: "/var/log/nginx/access.log", + Format: "$remote_addr - $remote_user [$time_local] \"$request\"", + }, + }, }, }, receivers: config.Receivers{ @@ -110,6 +116,12 @@ func TestCollector_Process(t *testing.T) { { InstanceID: "123", StubStatus: "http://test.com:8080/stub_status", + AccessLogs: []config.AccessLog{ + { + FilePath: "/var/log/nginx/access.log", + LogFormat: "$$remote_addr - $$remote_user [$$time_local] \\\"$$request\\\"", + }, + }, }, }, NginxPlusReceivers: []config.NginxPlusReceiver{}, @@ -184,12 +196,24 @@ func TestCollector_updateExistingNginxOSSReceiver(t *testing.T) { nginxConfigContext: &model.NginxConfigContext{ InstanceID: "123", StubStatus: "http://new-test-host:8080/api", + AccessLogs: []*model.AccessLog{ + { + Name: "/etc/nginx/test.log", + Format: `$remote_addr [$time_local] "$request" $status`, + }, + }, }, existingReceivers: config.Receivers{ NginxReceivers: []config.NginxReceiver{ { InstanceID: "123", StubStatus: "http://test.com:8080/api", + AccessLogs: []config.AccessLog{ + { + FilePath: "/etc/nginx/existing.log", + LogFormat: `$remote_addr [$time_local] "$request"`, + }, + }, }, }, }, @@ -198,6 +222,12 @@ func TestCollector_updateExistingNginxOSSReceiver(t *testing.T) { { InstanceID: "123", StubStatus: "http://new-test-host:8080/api", + AccessLogs: []config.AccessLog{ + { + FilePath: "/etc/nginx/test.log", + LogFormat: "$$remote_addr [$$time_local] \\\"$$request\\\" $$status", + }, + }, }, }, }, diff --git a/internal/collector/otelcol.tmpl b/internal/collector/otelcol.tmpl index 726d81bf44..82f7b42f25 100644 --- a/internal/collector/otelcol.tmpl +++ b/internal/collector/otelcol.tmpl @@ -11,8 +11,6 @@ receivers: memory: network: paging: - processes: - process: {{- end }} {{- range $index, $otlpReceiver := .Receivers.OtlpReceivers }} otlp/{{$index}}: @@ -28,6 +26,13 @@ receivers: nginx/{{- .InstanceID -}}: endpoint: "{{- .StubStatus -}}" collection_interval: 10s + {{- if gt (len .AccessLogs) 0 }} + access_logs: + {{- range .AccessLogs }} + - log_format: "{{- .LogFormat -}}" + file_path: "{{- .FilePath -}}" + {{- end }} + {{- end }} {{- end }} {{- range .Receivers.NginxPlusReceivers }} nginxplus/{{- .InstanceID -}}: @@ -56,7 +61,7 @@ exporters: max_elapsed_time: 10m tls: insecure: {{ if .TLS -}}false{{ else -}}true{{- end }} - {{ if .TLS -}} + {{- if .TLS }} {{ if gt (len .TLS.Ca) 0 -}}ca_file: "{{- .TLS.Ca -}}"{{- end }} {{ if gt (len .TLS.Cert) 0 -}}cert_file: "{{- .TLS.Cert -}}"{{- end }} {{ if gt (len .TLS.Key) 0 -}}key_file: "{{- .TLS.Key -}}"{{- end }} diff --git a/internal/collector/settings_test.go b/internal/collector/settings_test.go index 4e6b49649c..ddb05fc369 100644 --- a/internal/collector/settings_test.go +++ b/internal/collector/settings_test.go @@ -16,7 +16,12 @@ import ( "github.com/stretchr/testify/require" ) -const expectedTemplatePath = "../../test/config/collector/test-otelcol.yaml" +const ( + expectedTemplatePath = "../../test/config/collector/test-otelcol.yaml" + // The log format's double quotes must be escaped so that valid YAML is produced when executing the template. + accessLogFormat = `$remote_addr - $remote_user [$time_local] \"$request\" $status $body_bytes_sent ` + + `\"$http_referer\" \"$http_user_agent\" \"$http_x_forwarded_for\"\"$upstream_cache_status\"` +) func TestOTelCollectorSettings(t *testing.T) { cfg := types.AgentConfig() @@ -45,7 +50,7 @@ func TestConfigProviderSettings(t *testing.T) { func TestTemplateWrite(t *testing.T) { cfg := types.AgentConfig() - actualConfPath := filepath.Join(t.TempDir(), "nginx-agent-otelcol-test.yaml") + actualConfPath := filepath.Join("/tmp/", "nginx-agent-otelcol-test.yaml") cfg.Collector.ConfigPath = actualConfPath cfg.Collector.Exporters = append(cfg.Collector.Exporters, config.Exporter{ @@ -71,6 +76,12 @@ func TestTemplateWrite(t *testing.T) { cfg.Collector.Receivers.NginxReceivers = append(cfg.Collector.Receivers.NginxReceivers, config.NginxReceiver{ InstanceID: "123", StubStatus: "http://localhost:80/status", + AccessLogs: []config.AccessLog{ + { + LogFormat: accessLogFormat, + FilePath: "/var/log/nginx/access-custom.conf", + }, + }, }) require.NotNil(t, cfg) diff --git a/internal/config/config_test.go b/internal/config/config_test.go index 2b5e399323..1155f8e633 100644 --- a/internal/config/config_test.go +++ b/internal/config/config_test.go @@ -19,6 +19,9 @@ import ( "github.com/stretchr/testify/assert" ) +const accessLogFormat = `$remote_addr - $remote_user [$time_local] \"$request\" $status $body_bytes_sent ` + + `\"$http_referer\" \"$http_user_agent\" \"$http_x_forwarded_for\"\"$upstream_cache_status\"` + func TestRegisterConfigFile(t *testing.T) { viperInstance = viper.NewWithOptions(viper.KeyDelimiter(KeyDelimiter)) file, err := os.Create("nginx-agent.conf") @@ -36,7 +39,10 @@ func TestRegisterConfigFile(t *testing.T) { } func TestResolveConfig(t *testing.T) { - allowedDir := []string{"/etc/nginx", "/usr/local/etc/nginx", "/var/run/nginx", "/usr/share/nginx/modules"} + allowedDir := []string{ + "/etc/nginx", "/usr/local/etc/nginx", "/var/run/nginx", + "/usr/share/nginx/modules", "/var/log/nginx", + } viperInstance = viper.NewWithOptions(viper.KeyDelimiter(KeyDelimiter)) err := loadPropertiesFromFile("./testdata/nginx-agent.conf") require.NoError(t, err) @@ -67,8 +73,10 @@ func TestResolveConfig(t *testing.T) { assert.Equal(t, 10*time.Second, actual.Client.Timeout) - assert.Equal(t, "/etc/nginx:/usr/local/etc/nginx:/var/run/nginx:/usr/share/nginx/modules:invalid/path", - actual.ConfigDir) + assert.Equal(t, + "/etc/nginx:/usr/local/etc/nginx:/var/run/nginx:/usr/share/nginx/modules:/var/log/nginx:invalid/path", + actual.ConfigDir, + ) assert.Equal(t, allowedDir, actual.AllowedDirectories) @@ -324,7 +332,7 @@ func getAgentConfig() *Config { }, ConfigDir: "", AllowedDirectories: []string{ - "/etc/nginx", "/usr/local/etc/nginx", "/var/run/nginx", "/usr/share/nginx/modules", + "/etc/nginx", "/usr/local/etc/nginx", "/var/run/nginx", "/var/log/nginx", "/usr/share/nginx/modules", }, Collector: &Collector{ ConfigPath: "/etc/nginx-agent/nginx-agent-otelcol.yaml", @@ -373,6 +381,18 @@ func getAgentConfig() *Config { }, }, }, + NginxReceivers: []NginxReceiver{ + { + InstanceID: "cd7b8911-c2c5-4daf-b311-dbead151d938", + StubStatus: "http://localhost:4321/status", + AccessLogs: []AccessLog{ + { + LogFormat: accessLogFormat, + FilePath: "/var/log/nginx/access-custom.conf", + }, + }, + }, + }, }, Health: &ServerConfig{ Host: "localhost", diff --git a/internal/config/testdata/nginx-agent.conf b/internal/config/testdata/nginx-agent.conf index cb395f7122..d47ba2a5a4 100644 --- a/internal/config/testdata/nginx-agent.conf +++ b/internal/config/testdata/nginx-agent.conf @@ -33,6 +33,12 @@ collector: cert: /path/to/server-cert.pem key: /path/to/server-key.pem ca: /path/to/server-cert.pem + nginx_receivers: + - instance_id: cd7b8911-c2c5-4daf-b311-dbead151d938 + stub_status: "http://localhost:4321/status" + access_logs: + - file_path: "/var/log/nginx/access-custom.conf" + log_format: "$remote_addr - $remote_user [$time_local] \"$request\" $status $body_bytes_sent \"$http_referer\" \"$http_user_agent\" \"$http_x_forwarded_for\"\"$upstream_cache_status\"" processors: - type: batch exporters: @@ -54,4 +60,4 @@ collector: port: 1234 type: 0 -config_dirs: "/etc/nginx:/usr/local/etc/nginx:/var/run/nginx:/usr/share/nginx/modules:invalid/path" +config_dirs: "/etc/nginx:/usr/local/etc/nginx:/var/run/nginx:/usr/share/nginx/modules:/var/log/nginx:invalid/path" diff --git a/internal/config/types.go b/internal/config/types.go index 3eeada699e..8ba347909a 100644 --- a/internal/config/types.go +++ b/internal/config/types.go @@ -6,10 +6,13 @@ package config import ( + "errors" "fmt" "path/filepath" "strings" "time" + + "github.com/google/uuid" ) var ( @@ -116,8 +119,14 @@ type ( } NginxReceiver struct { - InstanceID string `yaml:"-" mapstructure:"instance_id"` - StubStatus string `yaml:"-" mapstructure:"stub_status"` + InstanceID string `yaml:"-" mapstructure:"instance_id"` + StubStatus string `yaml:"-" mapstructure:"stub_status"` + AccessLogs []AccessLog `yaml:"-" mapstructure:"access_logs"` + } + + AccessLog struct { + FilePath string `yaml:"-" mapstructure:"file_path"` + LogFormat string `yaml:"-" mapstructure:"log_format"` } NginxPlusReceiver struct { @@ -193,17 +202,23 @@ type ( ) func (col *Collector) Validate(allowedDirectories []string) error { + var err error cleaned := filepath.Clean(col.ConfigPath) if !isAllowedDir(cleaned, allowedDirectories) { - return fmt.Errorf("collector path %s not allowed", col.ConfigPath) + err = errors.Join(err, fmt.Errorf("collector path %s not allowed", col.ConfigPath)) + } + + for _, nginxReceiver := range col.Receivers.NginxReceivers { + err = errors.Join(err, nginxReceiver.Validate(allowedDirectories)) } for _, exp := range col.Exporters { t := strings.ToLower(exp.Type) if _, ok := supportedExporters[t]; !ok { - return fmt.Errorf("unsupported exporter type: %s", exp.Type) + err = errors.Join(err, fmt.Errorf("unsupported exporter type: %s", exp.Type)) + continue } // normalize field too @@ -214,13 +229,35 @@ func (col *Collector) Validate(allowedDirectories []string) error { t := strings.ToLower(proc.Type) if _, ok := supportedProcessors[t]; !ok { - return fmt.Errorf("unsupported processor type: %s", proc.Type) + err = errors.Join(err, fmt.Errorf("unsupported processor type: %s", proc.Type)) + continue } proc.Type = t } - return nil + return err +} + +func (nr *NginxReceiver) Validate(allowedDirectories []string) error { + var err error + if _, uuidErr := uuid.Parse(nr.InstanceID); uuidErr != nil { + err = errors.Join(err, errors.New("invalid nginx receiver instance ID")) + } + + for _, al := range nr.AccessLogs { + if !isAllowedDir(al.FilePath, allowedDirectories) { + err = errors.Join(err, fmt.Errorf("invalid nginx receiver access log path: %s", al.FilePath)) + } + + if len(al.FilePath) != 0 { + // The log format's double quotes must be escaped so that + // valid YAML is produced when executing the Go template. + al.LogFormat = strings.ReplaceAll(al.LogFormat, `"`, `\"`) + } + } + + return err } func (c *Config) IsDirectoryAllowed(directory string) bool { diff --git a/nginx-agent.conf b/nginx-agent.conf index 6ab658ca7c..141464fd7e 100644 --- a/nginx-agent.conf +++ b/nginx-agent.conf @@ -23,7 +23,7 @@ data_plane_config: reload_monitoring_period: 5s treat_warnings_as_error: true -config_dirs: "/etc/nginx:/usr/local/etc/nginx:/usr/share/nginx/modules:/var/run/nginx" +config_dirs: "/etc/nginx:/usr/local/etc/nginx:/usr/share/nginx/modules:/var/run/nginx:/var/log/nginx" client: timeout: 10s diff --git a/test/config/collector/test-otelcol.yaml b/test/config/collector/test-otelcol.yaml index 2a02e5bdc6..415ad452f4 100644 --- a/test/config/collector/test-otelcol.yaml +++ b/test/config/collector/test-otelcol.yaml @@ -10,8 +10,6 @@ receivers: memory: network: paging: - processes: - process: otlp/0: protocols: grpc: @@ -19,6 +17,9 @@ receivers: nginx/123: endpoint: "http://localhost:80/status" collection_interval: 10s + access_logs: + - log_format: "$remote_addr - $remote_user [$time_local] \"$request\" $status $body_bytes_sent \"$http_referer\" \"$http_user_agent\" \"$http_x_forwarded_for\"\"$upstream_cache_status\"" + file_path: "/var/log/nginx/access-custom.conf" processors: batch: @@ -35,7 +36,6 @@ exporters: max_elapsed_time: 10m tls: insecure: true - prometheus: endpoint: "localhost:9876" namespace: "nginx-agent" diff --git a/test/load/nginx_agent_process_collector.go b/test/load/nginx_agent_process_collector.go index a2146c4200..45de33a5c3 100644 --- a/test/load/nginx_agent_process_collector.go +++ b/test/load/nginx_agent_process_collector.go @@ -28,8 +28,8 @@ import ( "text/template" "time" - "github.com/shirou/gopsutil/v3/cpu" - "github.com/shirou/gopsutil/v3/process" + "github.com/shirou/gopsutil/v4/cpu" + "github.com/shirou/gopsutil/v4/process" "github.com/open-telemetry/opentelemetry-collector-contrib/testbed/testbed" ) @@ -82,7 +82,7 @@ var LoadResourceSpec = &testbed.ResourceSpec{ // CPU can be spikey ExpectedMaxCPU: 50, // RAM can be spikey - ExpectedMaxRAM: 110, + ExpectedMaxRAM: 120, ResourceCheckPeriod: 1 * time.Second, MaxConsecutiveFailures: 0, } diff --git a/test/mock/collector/docker-compose.yaml b/test/mock/collector/docker-compose.yaml index 7fb6569a30..895e6dda1b 100644 --- a/test/mock/collector/docker-compose.yaml +++ b/test/mock/collector/docker-compose.yaml @@ -8,14 +8,26 @@ volumes: services: agent-with-nginx-plus: - image: ${AGENT_IMAGE} + image: ${AGENT_IMAGE_WITH_NGINX_PLUS} + container_name: mock-collector-agent-with-nginx-plus volumes: - ./nginx-agent.conf:/etc/nginx-agent/nginx-agent.conf - - ./nginx:/etc/nginx/ + - ./nginx-plus:/etc/nginx/ networks: - metrics + + agent-with-nginx-oss: + image: ${AGENT_IMAGE_WITH_NGINX_OSS} + container_name: mock-collector-agent-with-nginx-oss + volumes: + - ./nginx-agent.conf:/etc/nginx-agent/nginx-agent.conf + - ./nginx-oss:/etc/nginx/ + networks: + - metrics + otel-collector: image: otel/opentelemetry-collector-contrib:0.99.0 + container_name: mock-collector-otel-collector restart: on-failure command: [ "--config=/etc/otel-collector.yaml" ] ports: @@ -27,19 +39,21 @@ services: - metrics prometheus: - image: prom/prometheus:latest - restart: unless-stopped - ports: - - "9090:9090" - volumes: - - ./prometheus.yaml:/etc/prometheus/prometheus.yml - command: - - '--config.file=/etc/prometheus/prometheus.yml' - networks: - - metrics + image: prom/prometheus:latest + container_name: mock-collector-prometheus + restart: unless-stopped + ports: + - "9090:9090" + volumes: + - ./prometheus.yaml:/etc/prometheus/prometheus.yml + command: + - '--config.file=/etc/prometheus/prometheus.yml' + networks: + - metrics grafana: image: grafana/grafana:latest + container_name: mock-collector-grafana restart: unless-stopped ports: - "3002:3000" diff --git a/test/mock/collector/grafana/provisioning/dashboards/nginx-dashboard.json b/test/mock/collector/grafana/provisioning/dashboards/nginx-dashboard.json index 5c20094bf0..a9224370a8 100644 --- a/test/mock/collector/grafana/provisioning/dashboards/nginx-dashboard.json +++ b/test/mock/collector/grafana/provisioning/dashboards/nginx-dashboard.json @@ -25,7 +25,6 @@ "type": "prometheus", "uid": "otel-prometheus-scraper" }, - "description": "", "fieldConfig": { "defaults": { "color": { @@ -86,7 +85,7 @@ "x": 0, "y": 0 }, - "id": 1, + "id": 5, "options": { "legend": { "calcs": [], @@ -95,7 +94,6 @@ "showLegend": true }, "tooltip": { - "maxHeight": 600, "mode": "single", "sort": "none" } @@ -108,7 +106,7 @@ }, "disableTextWrap": false, "editorMode": "builder", - "expr": "nginx_requests_total", + "expr": "nginx_http_response_status", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -118,7 +116,7 @@ "useBackend": false } ], - "title": "NGINX Requests Total", + "title": "HTTP Response Status", "type": "timeseries" }, { @@ -226,6 +224,7 @@ "type": "prometheus", "uid": "otel-prometheus-scraper" }, + "description": "", "fieldConfig": { "defaults": { "color": { @@ -286,7 +285,7 @@ "x": 0, "y": 8 }, - "id": 2, + "id": 1, "options": { "legend": { "calcs": [], @@ -308,7 +307,7 @@ }, "disableTextWrap": false, "editorMode": "builder", - "expr": "nginx_connections_handled_total", + "expr": "nginx_http_requests", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -318,7 +317,7 @@ "useBackend": false } ], - "title": "NGINX Connections Handled Total", + "title": "NGINX Requests Total", "type": "timeseries" }, { @@ -408,7 +407,107 @@ }, "disableTextWrap": false, "editorMode": "builder", - "expr": "nginx_connections_accepted_total", + "expr": "nginx_http_conn_count", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "NGINX Connections Current Count", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "otel-prometheus-scraper" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 16 + }, + "id": 2, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "maxHeight": 600, + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "otel-prometheus-scraper" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "nginx_http_conn", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -418,7 +517,7 @@ "useBackend": false } ], - "title": "NGINX Connections Accepted Total", + "title": "NGINX Connection Totals", "type": "timeseries" } ], @@ -429,7 +528,7 @@ "list": [] }, "time": { - "from": "now-1h", + "from": "now-5m", "to": "now" }, "timepicker": {}, diff --git a/test/mock/collector/nginx-oss/conf.d/default.conf b/test/mock/collector/nginx-oss/conf.d/default.conf new file mode 100644 index 0000000000..f1847d6dde --- /dev/null +++ b/test/mock/collector/nginx-oss/conf.d/default.conf @@ -0,0 +1,56 @@ +server { + listen 80 default_server; + server_name localhost; + + #access_log /var/log/nginx/host.access.log main; + + location / { + root /usr/share/nginx/html; + index index.html index.htm; + } + + #error_page 404 /404.html; + + # redirect server error pages to the static page /50x.html + # + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root /usr/share/nginx/html; + } + + # proxy the PHP scripts to Apache listening on 127.0.0.1:80 + # + #location ~ \.php$ { + # proxy_pass http://127.0.0.1; + #} + + # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 + # + #location ~ \.php$ { + # root html; + # fastcgi_pass 127.0.0.1:9000; + # fastcgi_index index.php; + # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; + # include fastcgi_params; + #} + + # deny access to .htaccess files, if Apache's document root + # concurs with nginx's one + # + #location ~ /\.ht { + # deny all; + #} + + location /api { + stub_status; + allow 127.0.0.1; + deny all; + } + + # enable NGINX Plus Dashboard; requires /api/ location to be + # enabled and appropriate access control for remote access + # + #location = /dashboard.html { + # root /usr/share/nginx/html; + #} +} diff --git a/test/mock/collector/nginx-oss/nginx.conf b/test/mock/collector/nginx-oss/nginx.conf new file mode 100644 index 0000000000..21f458f52d --- /dev/null +++ b/test/mock/collector/nginx-oss/nginx.conf @@ -0,0 +1,68 @@ +user nginx; +worker_processes auto; + +error_log /var/log/nginx/error.log notice; +pid /var/run/nginx.pid; + +events { + worker_connections 1024; +} + +http { + default_type application/octet-stream; + + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for"' + '"$upstream_cache_status"'; + + access_log /var/log/nginx/access.log main; + + sendfile on; + #tcp_nopush on; + + keepalive_timeout 65; + + #gzip on; + + server { + listen 9091; + return 200 "hello from http workload 1 \n"; + } + + server { + listen 9092; + return 200 "hello from http workload 2 \n"; + } + server { + listen 9093; + return 200 "hello from stream workload 1 \n"; + } + server { + listen 9094; + return 200 "hello from stream workload 2 \n"; + } + upstream nginx1 { + server 127.0.0.1:9091; + keepalive 32; + } + upstream nginx2 { + server 127.0.0.1:9092; + keepalive 32; + } + + server { + listen 127.0.0.1:8089; + location /frontend1 { + proxy_pass http://nginx1; + } + } + server { + listen 443; + location /frontend2 { + proxy_pass http://nginx2; + } + } + + include /etc/nginx/conf.d/*.conf; +} diff --git a/test/mock/collector/nginx/conf.d/default.conf b/test/mock/collector/nginx-plus/conf.d/default.conf similarity index 100% rename from test/mock/collector/nginx/conf.d/default.conf rename to test/mock/collector/nginx-plus/conf.d/default.conf diff --git a/test/mock/collector/nginx/nginx.conf b/test/mock/collector/nginx-plus/nginx.conf similarity index 100% rename from test/mock/collector/nginx/nginx.conf rename to test/mock/collector/nginx-plus/nginx.conf From 09cc5281434ac5a0f8409544447c6a286ec7042f Mon Sep 17 00:00:00 2001 From: Donal Hurley Date: Mon, 9 Sep 2024 13:51:27 +0100 Subject: [PATCH 03/24] Fix install-tools make target (#825) --- Makefile.tools | 8 +- README.md | 20 + go.mod | 378 +++----- go.sum | 893 +++++++----------- internal/collector/factories.go | 71 +- internal/collector/factories_test.go | 6 +- internal/collector/settings.go | 5 +- internal/collector/settings_test.go | 2 +- internal/datasource/host/exec/exec.go | 2 +- .../health/nginx_health_watcher_operator.go | 2 +- internal/watcher/process/process_operator.go | 2 +- .../grpc_management_plane_api_test.go | 1 - 12 files changed, 503 insertions(+), 887 deletions(-) diff --git a/Makefile.tools b/Makefile.tools index 9ab79a55bc..005e5f1267 100644 --- a/Makefile.tools +++ b/Makefile.tools @@ -8,16 +8,10 @@ NFPM = github.com/goreleaser/nfpm/v2/cmd/nfpm@v2.36.1 GOTESTCOVERAGE = github.com/vladopajic/go-test-coverage/v2@v2.10.1 BENCHSTAT = golang.org/x/perf/cmd/benchstat@v0.0.0-20240404204407-f3e401e020e4 BUF = github.com/bufbuild/buf/cmd/buf@v1.30.1 -MDATAGEN = go.opentelemetry.io/collector/cmd/mdatagen install-tools: ## Install tool dependencies @echo "Installing Tools" - - // Workaround because of this issue https://github.com/open-telemetry/opentelemetry-collector/issues/9281 - @go get $(MDATAGEN) - @$(GOINST) $(MDATAGEN) - @go mod tidy - + @$(GOINST) $(OAPICODEGEN) @$(GOINST) $(LEFTHOOK) @$(GOINST) $(GOLANGCILINT) diff --git a/README.md b/README.md index 2258ffaf5e..94a2f37de7 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,26 @@ NGINX Agent is a companion daemon for your NGINX Open Source or NGINX Plus insta - Collection and reporting of real-time NGINX performance and operating system metrics - Notifications of NGINX events +## Development Environment Setup +### Installing Prerequisite Packages +The following packages need to be installed: + - make + - golang (https://go.dev/doc/install) + - protoc (https://grpc.io/docs/protoc-installation/) + - mdatagen (There is a workaround for installing mdatagen that can be found here: https://github.com/open-telemetry/opentelemetry-collector/issues/9281#issuecomment-2276407679) + +Before starting development on the NGINX Agent, it is important to download and install the necessary tool and dependencies required by the NGINX Agent. You can do this by running the following `make` command: +``` +make install-tools +``` + +### Building NGINX Agent from Source Code +Run the following commands to build and run NGINX Agent: +``` +make build +sudo make run +``` + ## NGINX Agent Technical Specifications ## Supported Distributions diff --git a/go.mod b/go.mod index 9ccba384ae..8aad1c4a71 100644 --- a/go.mod +++ b/go.mod @@ -1,14 +1,14 @@ module github.com/nginx/agent/v3 -go 1.22 +go 1.22.0 -toolchain go1.22.2 +toolchain go1.22.5 require ( buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.33.0-20240401165935-b983156c5e99.1 github.com/bufbuild/protovalidate-go v0.2.1 github.com/cenkalti/backoff/v4 v4.3.0 - github.com/docker/docker v26.1.4+incompatible + github.com/docker/docker v27.1.1+incompatible github.com/fsnotify/fsnotify v1.7.0 github.com/go-resty/resty/v2 v2.13.1 github.com/google/go-cmp v0.6.0 @@ -19,172 +19,105 @@ require ( github.com/nginxinc/nginx-plus-go-client v1.2.2 github.com/nginxinc/nginx-prometheus-exporter v1.3.0 github.com/nxadm/tail v1.4.11 - github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector v0.105.0 - github.com/open-telemetry/opentelemetry-collector-contrib/connector/exceptionsconnector v0.105.0 - github.com/open-telemetry/opentelemetry-collector-contrib/connector/grafanacloudconnector v0.105.0 - github.com/open-telemetry/opentelemetry-collector-contrib/connector/routingconnector v0.105.0 - github.com/open-telemetry/opentelemetry-collector-contrib/connector/servicegraphconnector v0.105.0 - github.com/open-telemetry/opentelemetry-collector-contrib/connector/spanmetricsconnector v0.105.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.105.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.105.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/asapauthextension v0.105.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/awsproxy v0.105.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/basicauthextension v0.105.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/bearertokenauthextension v0.105.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/headerssetterextension v0.105.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.105.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/httpforwarderextension v0.100.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/oauth2clientauthextension v0.105.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/dockerobserver v0.105.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/hostobserver v0.105.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/k8sobserver v0.105.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/oidcauthextension v0.105.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.105.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/sigv4authextension v0.105.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden v0.105.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.105.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza v0.105.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/attributesprocessor v0.105.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/cumulativetodeltaprocessor v0.105.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatorateprocessor v0.105.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/filterprocessor v0.105.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbyattrsprocessor v0.105.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbytraceprocessor v0.105.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/k8sattributesprocessor v0.105.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/metricsgenerationprocessor v0.105.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/metricstransformprocessor v0.105.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.105.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/redactionprocessor v0.100.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/remotetapprocessor v0.100.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourcedetectionprocessor v0.105.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.105.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/routingprocessor v0.105.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/spanprocessor v0.105.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/tailsamplingprocessor v0.105.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/transformprocessor v0.105.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/bigipreceiver v0.105.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/dockerstatsreceiver v0.105.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/filelogreceiver v0.105.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver v0.105.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/httpcheckreceiver v0.105.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sclusterreceiver v0.105.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8seventsreceiver v0.105.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sobjectsreceiver v0.105.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kubeletstatsreceiver v0.105.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/podmanreceiver v0.105.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.105.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/simpleprometheusreceiver v0.105.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/syslogreceiver v0.105.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/tcplogreceiver v0.105.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/udplogreceiver v0.105.0 - github.com/open-telemetry/opentelemetry-collector-contrib/testbed v0.105.0 - github.com/shirou/gopsutil/v4 v4.24.6 + github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.108.0 + github.com/open-telemetry/opentelemetry-collector-contrib/extension/headerssetterextension v0.108.0 + github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.108.0 + github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.108.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden v0.108.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.108.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza v0.108.0 + github.com/open-telemetry/opentelemetry-collector-contrib/processor/attributesprocessor v0.108.0 + github.com/open-telemetry/opentelemetry-collector-contrib/processor/cumulativetodeltaprocessor v0.108.0 + github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatorateprocessor v0.108.0 + github.com/open-telemetry/opentelemetry-collector-contrib/processor/filterprocessor v0.108.0 + github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbyattrsprocessor v0.108.0 + github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbytraceprocessor v0.108.0 + github.com/open-telemetry/opentelemetry-collector-contrib/processor/k8sattributesprocessor v0.108.0 + github.com/open-telemetry/opentelemetry-collector-contrib/processor/metricsgenerationprocessor v0.108.0 + github.com/open-telemetry/opentelemetry-collector-contrib/processor/metricstransformprocessor v0.108.0 + github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.108.0 + github.com/open-telemetry/opentelemetry-collector-contrib/processor/redactionprocessor v0.108.0 + github.com/open-telemetry/opentelemetry-collector-contrib/processor/remotetapprocessor v0.108.0 + github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourcedetectionprocessor v0.108.0 + github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.108.0 + github.com/open-telemetry/opentelemetry-collector-contrib/processor/routingprocessor v0.108.0 + github.com/open-telemetry/opentelemetry-collector-contrib/processor/spanprocessor v0.108.0 + github.com/open-telemetry/opentelemetry-collector-contrib/processor/tailsamplingprocessor v0.108.0 + github.com/open-telemetry/opentelemetry-collector-contrib/processor/transformprocessor v0.108.0 + github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver v0.108.0 + github.com/open-telemetry/opentelemetry-collector-contrib/testbed v0.108.0 + github.com/shirou/gopsutil/v4 v4.24.7 github.com/spf13/pflag v1.0.5 github.com/stretchr/testify v1.9.0 - github.com/testcontainers/testcontainers-go v0.31.0 + github.com/testcontainers/testcontainers-go v0.33.0 github.com/trivago/grok v1.0.0 - go.opentelemetry.io/collector/component v0.105.0 - go.opentelemetry.io/collector/config/confighttp v0.105.0 - go.opentelemetry.io/collector/config/configtelemetry v0.105.0 - go.opentelemetry.io/collector/config/configtls v1.12.0 - go.opentelemetry.io/collector/confmap v0.105.0 - go.opentelemetry.io/collector/confmap/converter/expandconverter v0.105.0 - go.opentelemetry.io/collector/confmap/provider/envprovider v0.105.0 - go.opentelemetry.io/collector/confmap/provider/fileprovider v0.105.0 - go.opentelemetry.io/collector/confmap/provider/httpprovider v0.105.0 - go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.105.0 - go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.105.0 - go.opentelemetry.io/collector/connector v0.105.0 - go.opentelemetry.io/collector/connector/forwardconnector v0.105.0 - go.opentelemetry.io/collector/consumer v0.105.0 - go.opentelemetry.io/collector/exporter v0.105.0 - go.opentelemetry.io/collector/exporter/debugexporter v0.105.0 - go.opentelemetry.io/collector/exporter/otlpexporter v0.105.0 - go.opentelemetry.io/collector/exporter/otlphttpexporter v0.105.0 - go.opentelemetry.io/collector/extension v0.105.0 - go.opentelemetry.io/collector/otelcol v0.105.0 - go.opentelemetry.io/collector/pdata v1.12.0 - go.opentelemetry.io/collector/processor v0.105.0 - go.opentelemetry.io/collector/processor/batchprocessor v0.105.0 - go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.105.0 - go.opentelemetry.io/collector/receiver v0.105.0 - go.opentelemetry.io/collector/receiver/nopreceiver v0.105.0 - go.opentelemetry.io/collector/receiver/otlpreceiver v0.105.0 + go.opentelemetry.io/collector/component v0.108.1 + go.opentelemetry.io/collector/config/confighttp v0.108.1 + go.opentelemetry.io/collector/config/configtelemetry v0.108.1 + go.opentelemetry.io/collector/config/configtls v1.14.1 + go.opentelemetry.io/collector/confmap v1.14.1 + go.opentelemetry.io/collector/confmap/provider/envprovider v0.108.1 + go.opentelemetry.io/collector/confmap/provider/fileprovider v0.108.1 + go.opentelemetry.io/collector/confmap/provider/httpprovider v0.108.1 + go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.106.1 + go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.108.1 + go.opentelemetry.io/collector/connector v0.108.1 + go.opentelemetry.io/collector/consumer v0.108.1 + go.opentelemetry.io/collector/consumer/consumertest v0.108.1 + go.opentelemetry.io/collector/exporter v0.108.1 + go.opentelemetry.io/collector/exporter/debugexporter v0.108.1 + go.opentelemetry.io/collector/exporter/otlpexporter v0.108.1 + go.opentelemetry.io/collector/exporter/otlphttpexporter v0.108.1 + go.opentelemetry.io/collector/extension v0.108.1 + go.opentelemetry.io/collector/otelcol v0.108.1 + go.opentelemetry.io/collector/pdata v1.14.1 + go.opentelemetry.io/collector/processor v0.108.1 + go.opentelemetry.io/collector/processor/batchprocessor v0.108.1 + go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.108.1 + go.opentelemetry.io/collector/receiver v0.108.1 + go.opentelemetry.io/collector/receiver/otlpreceiver v0.108.1 go.opentelemetry.io/otel v1.28.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 golang.org/x/mod v0.19.0 - golang.org/x/sync v0.7.0 + golang.org/x/sync v0.8.0 google.golang.org/protobuf v1.34.2 ) require ( - bitbucket.org/atlassian/go-asap/v2 v2.9.0 // indirect - cloud.google.com/go/auth v0.5.1 // indirect - cloud.google.com/go/auth/oauth2adapt v0.2.2 // indirect - cloud.google.com/go/compute/metadata v0.4.0 // indirect + cloud.google.com/go/compute/metadata v0.5.0 // indirect dario.cat/mergo v1.0.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1 // indirect - github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.6.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/internal v1.8.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.7.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v4 v4.3.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.2.0 // indirect github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect - github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 // indirect - github.com/Code-Hex/go-generics-cache v1.5.1 // indirect - github.com/GehirnInc/crypt v0.0.0-20200316065508-bb7000b8a962 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.24.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.24.1 // indirect github.com/Microsoft/go-winio v0.6.2 // indirect - github.com/Microsoft/hcsshim v0.12.2 // indirect - github.com/SermoDigital/jose v0.9.2-0.20180104203859-803625baeddc // indirect github.com/Showmax/go-fqdn v1.0.0 // indirect github.com/alecthomas/participle/v2 v2.1.1 // indirect - github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9 // indirect github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230512164433-5d1fd1a340c9 // indirect github.com/apache/thrift v0.20.0 // indirect github.com/armon/go-metrics v0.4.1 // indirect - github.com/aws/aws-sdk-go v1.53.16 // indirect - github.com/aws/aws-sdk-go-v2 v1.27.0 // indirect - github.com/aws/aws-sdk-go-v2/config v1.27.16 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.17.16 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.3 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.7 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.7 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.9 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.20.9 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.3 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.28.10 // indirect - github.com/aws/smithy-go v1.20.2 // indirect + github.com/aws/aws-sdk-go v1.55.5 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bmatcuk/doublestar/v4 v4.6.1 // indirect - github.com/bytedance/sonic v1.11.3 // indirect + github.com/bytedance/sonic v1.9.1 // indirect github.com/census-instrumentation/opencensus-proto v0.4.1 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect - github.com/chenzhuoyu/iasm v0.9.1 // indirect - github.com/cncf/xds/go v0.0.0-20240423153145-555b57ec207b // indirect - github.com/containerd/containerd v1.7.15 // indirect + github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect + github.com/containerd/containerd v1.7.18 // indirect github.com/containerd/log v0.1.0 // indirect - github.com/coreos/go-oidc/v3 v3.11.0 // indirect + github.com/containerd/platforms v0.2.1 // indirect github.com/cpuguy83/dockercfg v0.3.1 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/dennwc/varint v1.0.0 // indirect - github.com/digitalocean/godo v1.117.0 // indirect github.com/distribution/reference v0.6.0 // indirect github.com/docker/go-connections v0.5.0 // indirect github.com/docker/go-units v0.5.0 // indirect + github.com/elastic/go-grok v0.3.1 // indirect github.com/emicklei/go-restful/v3 v3.11.0 // indirect - github.com/envoyproxy/go-control-plane v0.12.0 // indirect - github.com/envoyproxy/protoc-gen-validate v1.0.4 // indirect github.com/expr-lang/expr v1.16.9 // indirect github.com/fatih/color v1.16.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/fxamacker/cbor/v2 v2.7.0 // indirect github.com/gabriel-vasile/mimetype v1.4.3 // indirect github.com/gin-contrib/sse v0.1.0 // indirect - github.com/go-jose/go-jose/v4 v4.0.2 // indirect github.com/go-kit/log v0.2.1 // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect github.com/go-logr/logr v1.4.2 // indirect @@ -196,51 +129,37 @@ require ( github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect github.com/go-playground/validator/v10 v10.19.0 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0 // indirect - github.com/go-zookeeper/zk v1.0.3 // indirect + github.com/go-viper/mapstructure/v2 v2.1.0 // indirect github.com/gobwas/glob v0.2.3 // indirect github.com/goccy/go-json v0.10.3 // indirect github.com/gogo/googleapis v1.4.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang-jwt/jwt/v5 v5.2.1 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.4 // indirect - github.com/google/btree v1.1.2 // indirect github.com/google/cel-go v0.17.1 // indirect github.com/google/gnostic-models v0.6.8 // indirect - github.com/google/go-querystring v1.1.0 // indirect github.com/google/gofuzz v1.2.0 // indirect - github.com/google/s2a-go v0.1.7 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect - github.com/googleapis/gax-go/v2 v2.12.4 // indirect - github.com/gophercloud/gophercloud v1.12.0 // indirect github.com/gorilla/mux v1.8.1 // indirect - github.com/gorilla/websocket v1.5.1 // indirect - github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect - github.com/hashicorp/consul/api v1.29.1 // indirect - github.com/hashicorp/cronexpr v1.1.2 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 // indirect + github.com/hashicorp/consul/api v1.29.4 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-hclog v1.6.3 // indirect github.com/hashicorp/go-immutable-radix v1.3.1 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect - github.com/hashicorp/go-retryablehttp v0.7.7 // indirect github.com/hashicorp/go-rootcerts v1.0.2 // indirect github.com/hashicorp/go-version v1.7.0 // indirect github.com/hashicorp/golang-lru v1.0.2 // indirect github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect github.com/hashicorp/hcl v1.0.0 // indirect - github.com/hashicorp/nomad/api v0.0.0-20240604134157-e73d8bb1140d // indirect github.com/hashicorp/serf v0.10.1 // indirect - github.com/hetznercloud/hcloud-go/v2 v2.9.0 // indirect github.com/iancoleman/strcase v0.3.0 // indirect github.com/imdario/mergo v0.3.16 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/ionos-cloud/sdk-go/v6 v6.1.11 // indirect - github.com/jaegertracing/jaeger v1.59.0 // indirect + github.com/jaegertracing/jaeger v1.60.0 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect + github.com/jonboulle/clockwork v0.4.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/jpillora/backoff v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect @@ -250,19 +169,16 @@ require ( github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect github.com/knadh/koanf/v2 v2.1.1 // indirect - github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b // indirect - github.com/kylelemons/godebug v1.1.0 // indirect github.com/leodido/go-syslog/v4 v4.1.0 // indirect github.com/leodido/go-urn v1.4.0 // indirect github.com/leodido/ragel-machinery v0.0.0-20190525184631-5f46317e436b // indirect github.com/lightstep/go-expohisto v1.0.0 // indirect - github.com/linode/linodego v1.35.0 // indirect github.com/lufia/plan9stats v0.0.0-20240513124658-fba389f38bae // indirect + github.com/magefile/mage v1.15.0 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/maxbrunsfeld/counterfeiter/v6 v6.8.1 // indirect - github.com/miekg/dns v1.1.59 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect @@ -276,58 +192,51 @@ require ( github.com/morikuni/aec v1.0.0 // indirect github.com/mostynb/go-grpc-compression v1.2.3 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect - github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opencensusexporter v0.105.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/syslogexporter v0.105.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter v0.105.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer v0.105.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/ecsutil v0.105.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/proxy v0.105.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.105.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.105.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/docker v0.105.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter v0.105.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8sconfig v0.105.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/kubelet v0.105.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/metadataproviders v0.105.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/pdatautil v0.105.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.105.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchpersignal v0.105.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/experimentalmetricmetadata v0.105.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.105.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.105.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.105.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.105.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.105.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/opencensus v0.105.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.105.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin v0.105.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver v0.105.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/opencensusreceiver v0.105.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver v0.105.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/connector/routingconnector v0.108.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/connector/spanmetricsconnector v0.108.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opencensusexporter v0.108.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/exporter/syslogexporter v0.108.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter v0.108.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/ecsutil v0.108.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.108.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.108.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter v0.108.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8sconfig v0.108.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/metadataproviders v0.108.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/pdatautil v0.108.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.108.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchpersignal v0.108.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/experimentalmetricmetadata v0.108.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.108.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.108.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.108.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.108.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.108.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/opencensus v0.108.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.108.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin v0.108.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver v0.108.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/receiver/opencensusreceiver v0.108.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/receiver/syslogreceiver v0.108.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver v0.108.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0 // indirect github.com/openshift/api v3.9.0+incompatible // indirect github.com/openshift/client-go v0.0.0-20210521082421-73d9475a9142 // indirect github.com/openzipkin/zipkin-go v0.4.3 // indirect - github.com/ovh/go-ovh v1.5.1 // indirect github.com/pelletier/go-toml/v2 v2.2.2 // indirect - github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect - github.com/pquerna/cachecontrol v0.1.0 // indirect - github.com/prometheus-community/windows_exporter v0.25.1 // indirect + github.com/prometheus-community/windows_exporter v0.27.2 // indirect github.com/prometheus/client_model v0.6.1 // indirect github.com/prometheus/common v0.55.0 // indirect - github.com/prometheus/common/sigv4 v0.1.0 // indirect github.com/prometheus/procfs v0.15.1 // indirect - github.com/prometheus/prometheus v0.53.0 // indirect github.com/rs/cors v1.11.0 // indirect github.com/sagikazarmark/locafero v0.4.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect - github.com/scaleway/scaleway-sdk-go v1.0.0-beta.27 // indirect github.com/shoenig/go-m1cpu v0.1.6 // indirect + github.com/shoenig/test v1.7.1 // indirect github.com/sirupsen/logrus v1.9.3 // indirect github.com/soheilhy/cmux v0.1.5 // indirect github.com/sourcegraph/conc v0.3.0 // indirect @@ -336,41 +245,42 @@ require ( github.com/stoewer/go-strcase v1.3.0 // indirect github.com/stretchr/objx v0.5.2 // indirect github.com/subosito/gotenv v1.6.0 // indirect - github.com/tg123/go-htpasswd v1.2.2 // indirect - github.com/tidwall/gjson v1.14.3 // indirect - github.com/tilinna/clock v1.1.0 // indirect github.com/tklauser/go-sysconf v0.3.14 // indirect github.com/tklauser/numcpus v0.8.0 // indirect github.com/trivago/tgo v1.0.7 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect + github.com/ua-parser/uap-go v0.0.0-20240611065828-3a4781585db6 // indirect github.com/ugorji/go/codec v1.2.12 // indirect github.com/valyala/fastjson v1.6.4 // indirect - github.com/vincent-petithory/dataurl v1.0.0 // indirect - github.com/vultr/govultr/v2 v2.17.2 // indirect + github.com/x448/float16 v0.8.4 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/collector v0.105.0 // indirect - go.opentelemetry.io/collector/config/configauth v0.105.0 // indirect - go.opentelemetry.io/collector/config/configcompression v1.12.0 // indirect - go.opentelemetry.io/collector/config/configgrpc v0.105.0 // indirect - go.opentelemetry.io/collector/config/confignet v0.105.0 // indirect - go.opentelemetry.io/collector/config/configopaque v1.12.0 // indirect - go.opentelemetry.io/collector/config/configretry v1.12.0 // indirect - go.opentelemetry.io/collector/config/internal v0.105.0 // indirect - go.opentelemetry.io/collector/extension/auth v0.105.0 // indirect - go.opentelemetry.io/collector/extension/ballastextension v0.105.0 // indirect - go.opentelemetry.io/collector/extension/zpagesextension v0.105.0 // indirect - go.opentelemetry.io/collector/featuregate v1.12.0 // indirect - go.opentelemetry.io/collector/filter v0.105.0 // indirect - go.opentelemetry.io/collector/internal/globalgates v0.105.0 // indirect - go.opentelemetry.io/collector/semconv v0.105.0 // indirect - go.opentelemetry.io/collector/service v0.105.0 // indirect + go.opentelemetry.io/collector v0.108.1 // indirect + go.opentelemetry.io/collector/client v1.14.1 // indirect + go.opentelemetry.io/collector/component/componentprofiles v0.108.1 // indirect + go.opentelemetry.io/collector/component/componentstatus v0.108.1 // indirect + go.opentelemetry.io/collector/config/configauth v0.108.1 // indirect + go.opentelemetry.io/collector/config/configcompression v1.14.1 // indirect + go.opentelemetry.io/collector/config/configgrpc v0.108.1 // indirect + go.opentelemetry.io/collector/config/confignet v0.108.1 // indirect + go.opentelemetry.io/collector/config/configopaque v1.14.1 // indirect + go.opentelemetry.io/collector/config/configretry v1.14.1 // indirect + go.opentelemetry.io/collector/config/internal v0.108.1 // indirect + go.opentelemetry.io/collector/consumer/consumerprofiles v0.108.1 // indirect + go.opentelemetry.io/collector/extension/auth v0.108.1 // indirect + go.opentelemetry.io/collector/extension/zpagesextension v0.108.1 // indirect + go.opentelemetry.io/collector/featuregate v1.14.1 // indirect + go.opentelemetry.io/collector/filter v0.108.1 // indirect + go.opentelemetry.io/collector/internal/globalgates v0.108.1 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.108.1 // indirect + go.opentelemetry.io/collector/pdata/testdata v0.108.1 // indirect + go.opentelemetry.io/collector/semconv v0.108.1 // indirect + go.opentelemetry.io/collector/service v0.108.1 // indirect go.opentelemetry.io/contrib/config v0.8.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 // indirect go.opentelemetry.io/contrib/propagators/b3 v1.28.0 // indirect go.opentelemetry.io/contrib/zpages v0.53.0 // indirect - go.opentelemetry.io/otel/bridge/opencensus v1.28.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.4.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.28.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 // indirect @@ -385,31 +295,27 @@ require ( go.opentelemetry.io/otel/sdk/log v0.4.0 // indirect go.opentelemetry.io/otel/trace v1.28.0 // indirect go.opentelemetry.io/proto/otlp v1.3.1 // indirect - go.uber.org/atomic v1.11.0 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/arch v0.7.0 // indirect golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect - golang.org/x/oauth2 v0.21.0 // indirect - golang.org/x/term v0.22.0 // indirect - golang.org/x/time v0.5.0 // indirect + golang.org/x/oauth2 v0.22.0 // indirect + golang.org/x/term v0.23.0 // indirect + golang.org/x/time v0.6.0 // indirect golang.org/x/tools v0.23.0 // indirect - gonum.org/v1/gonum v0.15.0 // indirect - google.golang.org/api v0.183.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240701130421-f6361c86f094 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240711142825-46eb208f015d // indirect + gonum.org/v1/gonum v0.15.1 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - gotest.tools/v3 v3.5.1 // indirect - k8s.io/api v0.29.3 // indirect - k8s.io/apimachinery v0.29.3 // indirect - k8s.io/client-go v0.29.3 // indirect - k8s.io/klog/v2 v2.120.1 // indirect + k8s.io/api v0.31.0 // indirect + k8s.io/apimachinery v0.31.0 // indirect + k8s.io/client-go v0.31.0 // indirect + k8s.io/klog/v2 v2.130.1 // indirect k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 // indirect - k8s.io/kubelet v0.29.3 // indirect - k8s.io/utils v0.0.0-20240502163921-fe8a2dddb1d0 // indirect + k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect sigs.k8s.io/yaml v1.4.0 // indirect @@ -419,17 +325,17 @@ require ( github.com/gin-gonic/gin v1.9.1 github.com/mattn/go-isatty v0.0.20 // indirect github.com/nginxinc/nginx-go-crossplane v0.4.46 - github.com/prometheus/client_golang v1.19.1 // indirect + github.com/prometheus/client_golang v1.20.2 // indirect github.com/samber/slog-gin v1.11.0 - github.com/shirou/gopsutil/v3 v3.24.5 + github.com/shirou/gopsutil/v3 v3.24.5 // indirect github.com/spf13/cobra v1.8.1 github.com/spf13/viper v1.19.0 github.com/vardius/message-bus v1.1.5 go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.28.0 // indirect go.opentelemetry.io/otel/sdk/metric v1.28.0 - golang.org/x/crypto v0.25.0 // indirect - golang.org/x/net v0.27.0 // indirect - golang.org/x/sys v0.22.0 // indirect - golang.org/x/text v0.16.0 // indirect + golang.org/x/crypto v0.26.0 // indirect + golang.org/x/net v0.28.0 // indirect + golang.org/x/sys v0.24.0 // indirect + golang.org/x/text v0.17.0 // indirect google.golang.org/grpc v1.65.0 ) diff --git a/go.sum b/go.sum index 51473e8af9..98201b527f 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,3 @@ -bitbucket.org/atlassian/go-asap/v2 v2.9.0 h1:ANKtdq/Q8w8RqTaJKIJitS+INbsOKeVv38iArFHWx0Q= -bitbucket.org/atlassian/go-asap/v2 v2.9.0/go.mod h1:cuRgWb7eeGtsocKmqY2kPlMMlwpkeNh+QOIkjAMlUBc= buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.33.0-20240401165935-b983156c5e99.1 h1:2IGhRovxlsOIQgx2ekZWo4wTPAYpck41+18ICxs37is= buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.33.0-20240401165935-b983156c5e99.1/go.mod h1:Tgn5bgL220vkFOI0KPStlcClPeOJzAv4uT+V8JXGUnw= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= @@ -13,52 +11,39 @@ cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6T cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go/auth v0.5.1 h1:0QNO7VThG54LUzKiQxv8C6x1YX7lUrzlAa1nVLF8CIw= -cloud.google.com/go/auth v0.5.1/go.mod h1:vbZT8GjzDf3AVqCcQmqeeM32U9HBFc32vVVAbwDsa6s= +cloud.google.com/go v0.112.1 h1:uJSeirPke5UNZHIb4SxfZklVSiWWVqW4oXlETwZziwM= +cloud.google.com/go/auth v0.7.0 h1:kf/x9B3WTbBUHkC+1VS8wwwli9TzhSt0vSTVBmMR8Ts= +cloud.google.com/go/auth v0.7.0/go.mod h1:D+WqdrpcjmiCgWrXmLLxOVq1GACoE36chW6KXoEvuIw= cloud.google.com/go/auth/oauth2adapt v0.2.2 h1:+TTV8aXpjeChS9M+aTtN/TjdQnzJvmzKFt//oWu7HX4= cloud.google.com/go/auth/oauth2adapt v0.2.2/go.mod h1:wcYjgpZI9+Yu7LyYBg4pqSiaRkfEK3GQcpb7C/uyF1Q= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute/metadata v0.4.0 h1:vHzJCWaM4g8XIcm8kopr3XmDA4Gy/lblD3EhhSux05c= -cloud.google.com/go/compute/metadata v0.4.0/go.mod h1:SIQh1Kkb4ZJ8zJ874fqVkslA29PRXuleyj6vOzlbK7M= +cloud.google.com/go/compute/metadata v0.5.0 h1:Zr0eK8JbFv6+Wi4ilXAR8FJ3wyNdpxHKJNPos6LTZOY= +cloud.google.com/go/compute/metadata v0.5.0/go.mod h1:aHnloV2TPI38yx4s9+wAZhHykWvVCfu7hQbF+9CWoiY= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1 h1:E+OJmp2tPvt1W+amx48v1eqbjDYsgN+RzP4q16yV5eM= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1/go.mod h1:a6xsAQUZg+VsS3TJ05SRp524Hs4pZ/AeFSr5ENf0Yjo= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.6.0 h1:U2rTu3Ef+7w9FHKIAXM6ZyqF3UOWJZ12zIm8zECAFfg= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.6.0/go.mod h1:9kIvujWAA58nmPmWB1m23fyWic1kYZMxD9CxaWn4Qpg= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.8.0 h1:jBQA3cKT4L2rWMpgE7Yt3Hwh2aUj8KXjIGLxjHeYNNo= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.8.0/go.mod h1:4OG6tQ9EOP/MT0NMjDlRzWoVFxfu9rN9B2X+tlSVktg= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.13.0 h1:GJHeeA2N7xrG3q30L2UXDyuWRzDM900/65j70wcM4Ww= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.13.0/go.mod h1:l38EPgmsp71HHLq9j7De57JcKOWPyhrsW1Awm1JS6K0= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0 h1:tfLQ34V6F7tVSwoTf/4lH5sE0o6eCJuNDTmH09nDpbc= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0/go.mod h1:9kIvujWAA58nmPmWB1m23fyWic1kYZMxD9CxaWn4Qpg= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 h1:ywEEhmNahHBihViHepv3xPBn1663uRv2t2q/ESv9seY= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0/go.mod h1:iZDifYGJTIgIIkYRNWPENUnqx6bJ2xnSDFI2tjwZNuY= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.7.0 h1:LkHbJbgF3YyvC53aqYGR+wWQDn2Rdp9AQdGndf9QvY4= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.7.0/go.mod h1:QyiQdW4f4/BIfB8ZutZ2s+28RAgfa/pT+zS++ZHyM1I= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v2 v2.0.0 h1:PTFGRSlMKCQelWwxUyYVEUqseBJVemLyqWJjvMyt0do= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v2 v2.0.0/go.mod h1:LRr2FzBTQlONPPa5HREE5+RjSCTXl7BwOvYOaWTqCaI= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v4 v4.3.0 h1:bXwSugBiSbgtz7rOtbfGf+woewp4f06orW9OP5BjHLA= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v4 v4.3.0/go.mod h1:Y/HgrePTmGy9HjdSGTqZNa+apUpTVIEVKXJyARP2lrk= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.2.0 h1:Dd+RhdJn0OTtVGaeDLZpcumkIVCtA/3/Fo42+eoYvVM= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.2.0/go.mod h1:5kakwfW5CjC9KK+Q4wjXAg+ShuIm2mBMua0ZFj2C8PE= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= @@ -75,22 +60,15 @@ github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym github.com/Code-Hex/go-generics-cache v1.5.1 h1:6vhZGc5M7Y/YD8cIUcY8kcuQLB4cHR7U+0KMqAA0KcU= github.com/Code-Hex/go-generics-cache v1.5.1/go.mod h1:qxcC9kRVrct9rHeiYpFWSoW1vxyillCVzX13KZG8dl4= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= -github.com/GehirnInc/crypt v0.0.0-20200316065508-bb7000b8a962 h1:KeNholpO2xKjgaaSyd+DyQRrsQjhbSeS7qe4nEw8aQw= -github.com/GehirnInc/crypt v0.0.0-20200316065508-bb7000b8a962/go.mod h1:kC29dT1vFpj7py2OvG1khBdQpo3kInWP+6QipLbdngo= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.24.0 h1:N4xzkSD2BkRwEZSPf3C2eUZxjS5trpo4gOwRh8mu+BA= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.24.0/go.mod h1:p2puVVSKjQ84Qb1gzw2XHLs34WQyHTYFZLaVxypAFYs= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.24.1 h1:pB2F2JKCj1Znmp2rwxxt1J0Fg0wezTMgWYk5Mpbi1kg= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.24.1/go.mod h1:itPGVDKf9cC/ov4MdvJ2QZ0khw4bfoo9jzwTJlaxy2k= github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM= github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= -github.com/Microsoft/hcsshim v0.12.2 h1:AcXy+yfRvrx20g9v7qYaJv5Rh+8GaHOS6b8G6Wx/nKs= -github.com/Microsoft/hcsshim v0.12.2/go.mod h1:RZV12pcHCXQ42XnlQ3pz6FZfmrC1C+R4gaOHhRNML1g= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/SermoDigital/jose v0.9.2-0.20161205224733-f6df55f235c2/go.mod h1:ARgCUhI1MHQH+ONky/PAtmVHQrP5JlGY0F3poXOp/fA= -github.com/SermoDigital/jose v0.9.2-0.20180104203859-803625baeddc h1:MhBvG7RLaLqlyjxMR6of35vt6MVQ+eXMcgn9X/sy0FE= -github.com/SermoDigital/jose v0.9.2-0.20180104203859-803625baeddc/go.mod h1:ARgCUhI1MHQH+ONky/PAtmVHQrP5JlGY0F3poXOp/fA= github.com/Showmax/go-fqdn v1.0.0 h1:0rG5IbmVliNT5O19Mfuvna9LL7zlHyRfsSvBPZmF9tM= github.com/Showmax/go-fqdn v1.0.0/go.mod h1:SfrFBzmDCtCGrnHhoDjuvFnKsWjEQX/Q9ARZvOrJAko= github.com/alecthomas/assert/v2 v2.3.0 h1:mAsH2wmvjsuvyBvAmCtm7zFsBlb8mIHx5ySLVdDZXL0= @@ -103,9 +81,8 @@ github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuy github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9 h1:ez/4by2iGztzR4L0zgAOR8lTQK9VlyBVVd7G4omaOQs= -github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= +github.com/alecthomas/units v0.0.0-20240626203959-61d1e3462e30 h1:t3eaIm0rUkzbrIewtiFmMK5RXHej2XnoXNhxVsAYUfg= +github.com/alecthomas/units v0.0.0-20240626203959-61d1e3462e30/go.mod h1:fvzegU4vN3H1qMT+8wDmzjAcDONcgo2/SZ/TyfdUOFs= github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230512164433-5d1fd1a340c9 h1:goHVqTbFX3AIo0tzGr14pgfAW2ZfPChKO21Z9MGf/gk= github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230512164433-5d1fd1a340c9/go.mod h1:pSwJ0fSY5KhvocuWSx4fz3BA8OrA1bQn+K1Eli3BRwM= github.com/apache/thrift v0.20.0 h1:631+KvYbsBZxmuJjYwhezVsrfc/TbqtZV4QcxOX1fOI= @@ -117,37 +94,8 @@ github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+ github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/aws/aws-sdk-go v1.53.16 h1:8oZjKQO/ml1WLUZw5hvF7pvYjPf8o9f57Wldoy/q9Qc= -github.com/aws/aws-sdk-go v1.53.16/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= -github.com/aws/aws-sdk-go-v2 v1.27.0 h1:7bZWKoXhzI+mMR/HjdMx8ZCC5+6fY0lS5tr0bbgiLlo= -github.com/aws/aws-sdk-go-v2 v1.27.0/go.mod h1:ffIFB97e2yNsv4aTSGkqtHnppsIJzw7G7BReUZ3jCXM= -github.com/aws/aws-sdk-go-v2/config v1.27.16 h1:knpCuH7laFVGYTNd99Ns5t+8PuRjDn4HnnZK48csipM= -github.com/aws/aws-sdk-go-v2/config v1.27.16/go.mod h1:vutqgRhDUktwSge3hrC3nkuirzkJ4E/mLj5GvI0BQas= -github.com/aws/aws-sdk-go-v2/credentials v1.17.16 h1:7d2QxY83uYl0l58ceyiSpxg9bSbStqBC6BeEeHEchwo= -github.com/aws/aws-sdk-go-v2/credentials v1.17.16/go.mod h1:Ae6li/6Yc6eMzysRL2BXlPYvnrLLBg3D11/AmOjw50k= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.3 h1:dQLK4TjtnlRGb0czOht2CevZ5l6RSyRWAnKeGd7VAFE= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.3/go.mod h1:TL79f2P6+8Q7dTsILpiVST+AL9lkF6PPGI167Ny0Cjw= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.7 h1:lf/8VTF2cM+N4SLzaYJERKEWAXq8MOMpZfU6wEPWsPk= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.7/go.mod h1:4SjkU7QiqK2M9oozyMzfZ/23LmUY+h3oFqhdeP5OMiI= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.7 h1:4OYVp0705xu8yjdyoWix0r9wPIRXnIzzOoUpQVHIJ/g= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.7/go.mod h1:vd7ESTEvI76T2Na050gODNmNU7+OyKrIKroYTu4ABiI= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 h1:hT8rVHwugYE2lEfdFE0QWVo81lF7jMrYJVDWI+f+VxU= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0/go.mod h1:8tu/lYfQfFe6IGnaOdrpVgEL2IrrDOf6/m9RQum4NkY= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 h1:Ji0DY1xUsUr3I8cHps0G+XM3WWU16lP6yG8qu1GAZAs= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2/go.mod h1:5CsjAbs3NlGQyZNFACh+zztPDI7fU6eW9QsxjfnuBKg= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.9 h1:Wx0rlZoEJR7JwlSZcHnEa7CNjrSIyVxMFWGAaXy4fJY= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.9/go.mod h1:aVMHdE0aHO3v+f/iw01fmXV/5DbfQ3Bi9nN7nd9bE9Y= -github.com/aws/aws-sdk-go-v2/service/sso v1.20.9 h1:aD7AGQhvPuAxlSUfo0CWU7s6FpkbyykMhGYMvlqTjVs= -github.com/aws/aws-sdk-go-v2/service/sso v1.20.9/go.mod h1:c1qtZUWtygI6ZdvKppzCSXsDOq5I4luJPZ0Ud3juFCA= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.3 h1:Pav5q3cA260Zqez42T9UhIlsd9QeypszRPwC9LdSSsQ= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.3/go.mod h1:9lmoVDVLz/yUZwLaQ676TK02fhCu4+PgRSmMaKR1ozk= -github.com/aws/aws-sdk-go-v2/service/sts v1.28.10 h1:69tpbPED7jKPyzMcrwSvhWcJ9bPnZsZs18NT40JwM0g= -github.com/aws/aws-sdk-go-v2/service/sts v1.28.10/go.mod h1:0Aqn1MnEuitqfsCNyKsdKLhDUOr4txD/g19EfiUqgws= -github.com/aws/smithy-go v1.20.2 h1:tbp628ireGtzcHDDmLT/6ADHidqnwgF57XOXZe6tp4Q= -github.com/aws/smithy-go v1.20.2/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E= -github.com/bboreham/go-loser v0.0.0-20230920113527-fcc2c21820a3 h1:6df1vn4bBlDDo4tARvBm7l6KA9iVMnE3NWizDeWSrps= -github.com/bboreham/go-loser v0.0.0-20230920113527-fcc2c21820a3/go.mod h1:CIWtjkly68+yqLPbvwwR/fjNJA/idrtULjZWh2v1ys0= +github.com/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU= +github.com/aws/aws-sdk-go v1.55.5/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= @@ -159,9 +107,8 @@ github.com/bmatcuk/doublestar/v4 v4.6.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTS github.com/bufbuild/protovalidate-go v0.2.1 h1:pJr07sYhliyfj/STAM7hU4J3FKpVeLVKvOBmOTN8j+s= github.com/bufbuild/protovalidate-go v0.2.1/go.mod h1:e7XXDtlxj5vlEyAgsrxpzayp4cEMKCSSb8ZCkin+MVA= github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= -github.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM= -github.com/bytedance/sonic v1.11.3 h1:jRN+yEjakWh8aK5FzrciUHG8OFXK+4/KrAX/ysEtHAA= -github.com/bytedance/sonic v1.11.3/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4= +github.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s= +github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -171,12 +118,8 @@ github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= +github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams= github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= -github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0= -github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA= -github.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog= -github.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0= -github.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= @@ -186,12 +129,12 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/xds/go v0.0.0-20240423153145-555b57ec207b h1:ga8SEFjZ60pxLcmhnThWgvH2wg8376yUJmPhEH4H3kw= github.com/cncf/xds/go v0.0.0-20240423153145-555b57ec207b/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= -github.com/containerd/containerd v1.7.15 h1:afEHXdil9iAm03BmhjzKyXnnEBtjaLJefdU7DV0IFes= -github.com/containerd/containerd v1.7.15/go.mod h1:ISzRRTMF8EXNpJlTzyr2XMhN+j9K302C21/+cr3kUnY= +github.com/containerd/containerd v1.7.18 h1:jqjZTQNfXGoEaZdW1WwPU0RqSn1Bm2Ay/KJPUuO8nao= +github.com/containerd/containerd v1.7.18/go.mod h1:IYEk9/IO6wAPUz2bCMVUbsfXjzw5UNP5fLz4PsUygQ4= github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= -github.com/coreos/go-oidc/v3 v3.11.0 h1:Ia3MxdwpSw702YW0xgfmP1GVCMA9aEFWu12XUZ3/OtI= -github.com/coreos/go-oidc/v3 v3.11.0/go.mod h1:gE3LgjOgFoHi9a4ce4/tJczr0Ai2/BoDhf0r5lltWI0= +github.com/containerd/platforms v0.2.1 h1:zvwtM3rz2YHPQsF2CHYM8+KtB5dvhISiXh5ZpSBQv6A= +github.com/containerd/platforms v0.2.1/go.mod h1:XHCb+2/hzowdiut9rkudds9bE5yJ7npe7dG/wG+uFPw= github.com/cpuguy83/dockercfg v0.3.1 h1:/FpZ+JaygUR/lZP2NlFI2DVfrOEMAIKP5wWEJdoYe9E= github.com/cpuguy83/dockercfg v0.3.1/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= @@ -204,19 +147,19 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dennwc/varint v1.0.0 h1:kGNFFSSw8ToIy3obO/kKr8U9GZYUAxQEVuix4zfDWzE= github.com/dennwc/varint v1.0.0/go.mod h1:hnItb35rvZvJrbTALZtY/iQfDs48JKRG1RPpgziApxA= -github.com/digitalocean/godo v1.117.0 h1:WVlTe09melDYTd7VCVyvHcNWbgB+uI1O115+5LOtdSw= -github.com/digitalocean/godo v1.117.0/go.mod h1:Vk0vpCot2HOAJwc5WE8wljZGtJ3ZtWIc8MQ8rF38sdo= +github.com/digitalocean/godo v1.118.0 h1:lkzGFQmACrVCp7UqH1sAi4JK/PWwlc5aaxubgorKmC4= +github.com/digitalocean/godo v1.118.0/go.mod h1:Vk0vpCot2HOAJwc5WE8wljZGtJ3ZtWIc8MQ8rF38sdo= github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= -github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= -github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/docker/docker v26.1.4+incompatible h1:vuTpXDuoga+Z38m1OZHzl7NKisKWaWlhjQk7IDPSLsU= -github.com/docker/docker v26.1.4+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v27.1.1+incompatible h1:hO/M4MtV36kzKldqnA37IWhebRA+LnqqcqDja6kVaKY= +github.com/docker/docker v27.1.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= +github.com/elastic/go-grok v0.3.1 h1:WEhUxe2KrwycMnlvMimJXvzRa7DoByJB4PVUIE1ZD/U= +github.com/elastic/go-grok v0.3.1/go.mod h1:n38ls8ZgOboZRgKcjMY8eFeZFMmcL9n2lP0iHhIDk64= github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= @@ -231,8 +174,6 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7 github.com/envoyproxy/protoc-gen-validate v1.0.4 h1:gVPz/FMfvh57HdSJQyvBtF00j8JU4zdyUgIUNhlgg0A= github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= -github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/expr-lang/expr v1.16.9 h1:WUAzmR0JNI9JCiF0/ewwHB1gmcGw5wW7nWt8gc6PpCI= github.com/expr-lang/expr v1.16.9/go.mod h1:8/vRC7+7HBzESEqt5kKpYXxrxkr31SaO8r40VO/1IT4= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= @@ -249,6 +190,8 @@ github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMo github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= +github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= @@ -258,8 +201,6 @@ github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SU github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-jose/go-jose/v4 v4.0.2 h1:R3l3kkBds16bO7ZFAEEcofK0MkrAJt3jlJznWZG0nvk= -github.com/go-jose/go-jose/v4 v4.0.2/go.mod h1:WVf9LFMHh/QVrmqrOfqun0C45tMe3RoiKJMPvgWwLfY= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= @@ -307,9 +248,10 @@ github.com/go-resty/resty/v2 v2.13.1 h1:x+LHXBI2nMB1vqndymf26quycC4aggYJ7DECYbiz github.com/go-resty/resty/v2 v2.13.1/go.mod h1:GznXlLxkq6Nh4sU59rPmUw3VtgpO3aS96ORAI6Q7d+0= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= -github.com/go-viper/mapstructure/v2 v2.0.0 h1:dhn8MZ1gZ0mzeodTG3jt5Vj/o87xZKuNAprG2mQfMfc= -github.com/go-viper/mapstructure/v2 v2.0.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= +github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= +github.com/go-viper/mapstructure/v2 v2.1.0 h1:gHnMa2Y/pIxElCH2GlZZ1lZSsn6XMtufpGyP1XxdC/w= +github.com/go-viper/mapstructure/v2 v2.1.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/go-zookeeper/zk v1.0.3 h1:7M2kwOsc//9VeeFiPtf+uSJlVpU66x9Ba5+8XK7/TDg= github.com/go-zookeeper/zk v1.0.3/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= @@ -334,21 +276,17 @@ github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfb github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= @@ -357,8 +295,8 @@ github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= -github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= +github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= +github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= github.com/google/cel-go v0.17.1 h1:s2151PDGy/eqpCI80/8dl4VL3xTkqI/YubXLXCFw0mw= github.com/google/cel-go v0.17.1/go.mod h1:HXZKzB0LXqer5lHHgfWAnlYwJaQBDKMjxjulNQzhwhY= github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= @@ -367,12 +305,9 @@ github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5a github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= @@ -384,40 +319,36 @@ github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/ github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20240528025155-186aa0362fba h1:ql1qNgCyOB7iAEk8JTNM+zJrgIbnyCKX/wdlyPufP5g= -github.com/google/pprof v0.0.0-20240528025155-186aa0362fba/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo= +github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af h1:kmjWCqn2qkEml422C2Rrd27c3VGxi6a/6HNq8QmHRKM= +github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.12.4 h1:9gWcmF85Wvq4ryPFvGFaOgPIs1AQX0d0bcbGw4Z96qg= -github.com/googleapis/gax-go/v2 v2.12.4/go.mod h1:KYEYLorsnIGDi/rPC8b5TdlB9kbKoFubselGIoBMCwI= +github.com/googleapis/gax-go/v2 v2.12.5 h1:8gw9KZK8TiVKB6q3zHY3SBzLnrGp6HQjyfYBYGmXdxA= +github.com/googleapis/gax-go/v2 v2.12.5/go.mod h1:BUDKcWo+RaKq5SC9vVYL0wLADa3VcfswbOMMRmB9H3E= github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= -github.com/gophercloud/gophercloud v1.12.0 h1:Jrz16vPAL93l80q16fp8NplrTCp93y7rZh2P3Q4Yq7g= -github.com/gophercloud/gophercloud v1.12.0/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfgzxRcNupUfxZbBNDM= +github.com/gophercloud/gophercloud v1.13.0 h1:8iY9d1DAbzMW6Vok1AxbbK5ZaUjzMp0tdyt4fX9IeJ0= +github.com/gophercloud/gophercloud v1.13.0/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfgzxRcNupUfxZbBNDM= github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyEE= github.com/gorilla/handlers v1.5.2/go.mod h1:dX+xVpaxdSw+q0Qek8SSsl3dfMk3jNddUkMzo0GtH0w= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= -github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc h1:GN2Lv3MGO7AS6PrRoT6yV5+wkrOpcszoIsO4+4ds248= github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc/go.mod h1:+JKpmjMGhpgPL+rXZ5nsZieVzvarn86asRlBg4uNGnk= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= @@ -425,12 +356,12 @@ github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDa github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 h1:pRhl55Yx1eC7BZ1N+BBWwnKaMyD8uC+34TLdndZMAKk= github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0/go.mod h1:XKMd7iuf/RGPSMJ/U4HP0zS2Z9Fh8Ps9a+6X26m/tmI= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k= -github.com/hashicorp/consul/api v1.29.1 h1:UEwOjYJrd3lG1x5w7HxDRMGiAUPrb3f103EoeKuuEcc= -github.com/hashicorp/consul/api v1.29.1/go.mod h1:lumfRkY/coLuqMICkI7Fh3ylMG31mQSRZyef2c5YvJI= -github.com/hashicorp/consul/proto-public v0.6.1 h1:+uzH3olCrksXYWAYHKqK782CtK9scfqH+Unlw3UHhCg= -github.com/hashicorp/consul/proto-public v0.6.1/go.mod h1:cXXbOg74KBNGajC+o8RlA502Esf0R9prcoJgiOX/2Tg= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 h1:asbCHRVmodnJTuQ3qamDwqVOIjwqUPTYmYuemVOx+Ys= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0/go.mod h1:ggCgvZ2r7uOoQjOyu2Y1NhHmEPPzzuhWgcza5M1Ji1I= +github.com/hashicorp/consul/api v1.29.4 h1:P6slzxDLBOxUSj3fWo2o65VuKtbtOXFi7TSSgtXutuE= +github.com/hashicorp/consul/api v1.29.4/go.mod h1:HUlfw+l2Zy68ceJavv2zAyArl2fqhGWnMycyt56sBgg= +github.com/hashicorp/consul/proto-public v0.6.2 h1:+DA/3g/IiKlJZb88NBn0ZgXrxJp2NlvCZdEyl+qxvL0= +github.com/hashicorp/consul/proto-public v0.6.2/go.mod h1:cXXbOg74KBNGajC+o8RlA502Esf0R9prcoJgiOX/2Tg= github.com/hashicorp/consul/sdk v0.16.1 h1:V8TxTnImoPD5cj0U9Spl0TUxcytjcbbJeADFF07KdHg= github.com/hashicorp/consul/sdk v0.16.1/go.mod h1:fSXvwxB2hmh1FMZCNl6PwX0Q/1wdWtHJcZ7Ea5tns0s= github.com/hashicorp/cronexpr v1.1.2 h1:wG/ZYIKT+RT3QkOdgYc+xsKWVRgnxJ1OJtjjy84fJ9A= @@ -470,6 +401,7 @@ github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKe github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= @@ -480,12 +412,12 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= github.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM= github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= -github.com/hashicorp/nomad/api v0.0.0-20240604134157-e73d8bb1140d h1:KHq+mAzWSkumj4PDoXc5VZbycPGcmYu8tohgVLQ6SIc= -github.com/hashicorp/nomad/api v0.0.0-20240604134157-e73d8bb1140d/go.mod h1:svtxn6QnrQ69P23VvIWMR34tg3vmwLz4UdUzm1dSCgE= +github.com/hashicorp/nomad/api v0.0.0-20240717122358-3d93bd3778f3 h1:fgVfQ4AC1avVOnu2cfms8VAiD8lUq3vWI8mTocOXN/w= +github.com/hashicorp/nomad/api v0.0.0-20240717122358-3d93bd3778f3/go.mod h1:svtxn6QnrQ69P23VvIWMR34tg3vmwLz4UdUzm1dSCgE= github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY= github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= -github.com/hetznercloud/hcloud-go/v2 v2.9.0 h1:s0N6R7Zoi2DPfMtUF5o9VeUBzTtHVY6MIkHOQnfu/AY= -github.com/hetznercloud/hcloud-go/v2 v2.9.0/go.mod h1:qtW/TuU7Bs16ibXl/ktJarWqU2LwHr7eGlwoilHxtgg= +github.com/hetznercloud/hcloud-go/v2 v2.10.2 h1:9gyTUPhfNbfbS40Spgij5mV5k37bOZgt8iHKCbfGs5I= +github.com/hetznercloud/hcloud-go/v2 v2.10.2/go.mod h1:xQ+8KhIS62W0D78Dpi57jsufWh844gUw1az5OUvaeq8= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= @@ -499,14 +431,14 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2 github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/ionos-cloud/sdk-go/v6 v6.1.11 h1:J/uRN4UWO3wCyGOeDdMKv8LWRzKu6UIkLEaes38Kzh8= github.com/ionos-cloud/sdk-go/v6 v6.1.11/go.mod h1:EzEgRIDxBELvfoa/uBN0kOQaqovLjUWEB7iW4/Q+t4k= -github.com/jaegertracing/jaeger v1.59.0 h1:p9/nJxdoCxq4NSgVN8P0aDqlGSfxFaggpNfLwhqQZRc= -github.com/jaegertracing/jaeger v1.59.0/go.mod h1:IZeUGtxNIYWGD3PVI4mqAn2IWVrfGdfswB8XK0mzZ0w= -github.com/jarcoal/httpmock v1.3.1 h1:iUx3whfZWVf3jT01hQTO/Eo5sAYtB2/rqaUuOtpInww= -github.com/jarcoal/httpmock v1.3.1/go.mod h1:3yb8rc4BI7TCBhFY8ng0gjuLKJNquuDNiPaZjnENuYg= +github.com/jaegertracing/jaeger v1.60.0 h1:6fswbNydmXJNH7uz2smy2fFs9KKRpLrFXdW0u/hud4o= +github.com/jaegertracing/jaeger v1.60.0/go.mod h1:CMrmMLIWn7xLP0IwBgpbxtgIuOT6TF/7bpTUBaOUaXo= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4= +github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= @@ -514,7 +446,6 @@ github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= @@ -522,7 +453,6 @@ github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/X github.com/jstemmer/go-junit-report v1.0.0 h1:8X1gzZpR+nVQLAht+L/foqOeX2l9DTZoaIPbEQHxsds= github.com/jstemmer/go-junit-report v1.0.0/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= @@ -536,11 +466,9 @@ github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPgh github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= -github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b h1:udzkj9S/zlT5X367kqJis0QP7YMxobob6zhzq6Yre00= github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b/go.mod h1:pcaDhQK0/NJZEvtCO0qQPPropqV0sJOJ6YW7X+9kRwM= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= @@ -561,10 +489,12 @@ github.com/leodido/ragel-machinery v0.0.0-20190525184631-5f46317e436b h1:11UHH39 github.com/leodido/ragel-machinery v0.0.0-20190525184631-5f46317e436b/go.mod h1:WZxr2/6a/Ar9bMDc2rN/LJrE/hF6bXE4LPyDSIxwAfg= github.com/lightstep/go-expohisto v1.0.0 h1:UPtTS1rGdtehbbAF7o/dhkWLTDI73UifG8LbfQI7cA4= github.com/lightstep/go-expohisto v1.0.0/go.mod h1:xDXD0++Mu2FOaItXtdDfksfgxfV0z1TMPa+e/EUd0cs= -github.com/linode/linodego v1.35.0 h1:rIhUeCHBLEDlkoRnOTwzSGzljQ3ksXwLxacmXnrV+Do= -github.com/linode/linodego v1.35.0/go.mod h1:JxuhOEAMfSxun6RU5/MgTKH2GGTmFrhKRj3wL1NFin0= +github.com/linode/linodego v1.37.0 h1:B/2Spzv9jYXzKA+p+GD8fVCNJ7Wuw6P91ZDD9eCkkso= +github.com/linode/linodego v1.37.0/go.mod h1:L7GXKFD3PoN2xSEtFc04wIXP5WK65O10jYQx0PQISWQ= github.com/lufia/plan9stats v0.0.0-20240513124658-fba389f38bae h1:dIZY4ULFcto4tAFlj1FYZl8ztUZ13bdq+PLY+NOfbyI= github.com/lufia/plan9stats v0.0.0-20240513124658-fba389f38bae/go.mod h1:ilwx/Dta8jXAgpFYFvSWEMwxmbWXyiUHkd5FwyKhb5k= +github.com/magefile/mage v1.15.0 h1:BvGheCMAsG3bWUDbZ8AyXXpCNwU9u5CB6sM+HNb9HYg= +github.com/magefile/mage v1.15.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= @@ -588,21 +518,17 @@ github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/maxatome/go-testdeep v1.12.0 h1:Ql7Go8Tg0C1D/uMMX59LAoYK7LffeJQ6X2T04nTH68g= -github.com/maxatome/go-testdeep v1.12.0/go.mod h1:lPZc/HAcJMP92l7yI6TRz1aZN5URwUBUAfUNvrclaNM= github.com/maxbrunsfeld/counterfeiter/v6 v6.8.1 h1:NicmruxkeqHjDv03SfSxqmaLuisddudfP3h5wdXFbhM= github.com/maxbrunsfeld/counterfeiter/v6 v6.8.1/go.mod h1:eyp4DdUJAKkr9tvxR3jWhw2mDK7CWABMG5r9uyaKC7I= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -github.com/miekg/dns v1.1.59 h1:C9EXc/UToRwKLhK5wKU/I4QVsBUc8kE6MkHBkeypWZs= -github.com/miekg/dns v1.1.59/go.mod h1:nZpewl5p6IvctfgrckopVx2OlSEHPRO/U4SYkRklrEk= +github.com/miekg/dns v1.1.61 h1:nLxbwF3XxhwVSm8g9Dghm9MHPaUZuqhPiGL+675ZmEs= +github.com/miekg/dns v1.1.61/go.mod h1:mnAarhS3nWaW+NVP2wTkYVIZyHNJ098SJZUki3eykwQ= github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= -github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c h1:cqn374mizHuIWj+OSJCajGr/phAmuMug9qIX3l9CflE= @@ -647,200 +573,130 @@ github.com/nginxinc/nginx-prometheus-exporter v1.3.0/go.mod h1:hXoH+X6aIKSyQuO6Q github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY= github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc= -github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo/v2 v2.13.0 h1:0jY9lJquiL8fcf3M4LAXN5aMlS/b2BV86HFFPCPMgE4= -github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= +github.com/onsi/ginkgo/v2 v2.19.0 h1:9Cnnf7UHo57Hy3k6/m5k3dRfGTMXGvxhHFvkDTCTpvA= +github.com/onsi/ginkgo/v2 v2.19.0/go.mod h1:rlwLi9PilAFJ8jCg9UE1QP6VBpd6/xj3SRC0d6TU0To= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8= github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= -github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector v0.105.0 h1:dCq7P9MfGeBCQwxDu1TlS94KXkVjZhueCm4fSFlEG38= -github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector v0.105.0/go.mod h1:x/H4ulXmk8HU7HzBOHrJL+C4dHMGauV6f5CxFXyP4rE= -github.com/open-telemetry/opentelemetry-collector-contrib/connector/exceptionsconnector v0.105.0 h1:5lU/eQQlw/os5NhMhCGqg0iomrp9Lw+wRX/EGScoHiw= -github.com/open-telemetry/opentelemetry-collector-contrib/connector/exceptionsconnector v0.105.0/go.mod h1:X/UxIl9lOiQlbmAdvtNM/pyz/1kfnl4LB9Qn1otYI7o= -github.com/open-telemetry/opentelemetry-collector-contrib/connector/grafanacloudconnector v0.105.0 h1:ze1Sybk+pd9rImzijwTMZBGdmOMkFN273jGJtufnXXw= -github.com/open-telemetry/opentelemetry-collector-contrib/connector/grafanacloudconnector v0.105.0/go.mod h1:f+87dzXuWaOTeCmu8nuDYGN6XUBANg67RsCualfMM64= -github.com/open-telemetry/opentelemetry-collector-contrib/connector/routingconnector v0.105.0 h1:H5XIffilqXgMjx1Z8vh8q96LAzvCx9OjvM3O5/WyPJY= -github.com/open-telemetry/opentelemetry-collector-contrib/connector/routingconnector v0.105.0/go.mod h1:NyqtwcDiGK1B42DgUvtJiWHTR4ak0KPr0gkJEGixg6k= -github.com/open-telemetry/opentelemetry-collector-contrib/connector/servicegraphconnector v0.105.0 h1:fL6XzMKdNaW4LYcDOjZHC4sns+V+5VlD8I8IDa0ihfg= -github.com/open-telemetry/opentelemetry-collector-contrib/connector/servicegraphconnector v0.105.0/go.mod h1:n6rSiTWYNMPURZwU0Fj2JKKaeQbp3n23K3WYHVI5ga8= -github.com/open-telemetry/opentelemetry-collector-contrib/connector/spanmetricsconnector v0.105.0 h1:DVaUWxeO8VNH/zQrP9vqz8eZwaaVzWQNCmcWGxbFoWk= -github.com/open-telemetry/opentelemetry-collector-contrib/connector/spanmetricsconnector v0.105.0/go.mod h1:45iX3DRsbK2XlbHzEWtIvud56FE2XdC7crKIne4DUaU= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opencensusexporter v0.105.0 h1:IbArOxSVO7QyKHk3d6FwWG1oLO4P2B1b8fYbD8uY6YU= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opencensusexporter v0.105.0/go.mod h1:OZxuspPwPYMDVRU1TAWyZE5Ys+memxlAowUvj7P4FME= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.105.0 h1:L3zHDcjdhyvZatjv0jGAR9ShWYY4a9sDCBcdxCxdKcU= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.105.0/go.mod h1:plLxFSlZzwEa06qc/1pVH1EQISsnSsMX9PwXYKEB/sg= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusremotewriteexporter v0.105.0 h1:Kfy3UY7g2kI/GGc5XEy3V2Bi+GHkBaEiCt0/dA9KR+w= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusremotewriteexporter v0.105.0/go.mod h1:HMsV03QzjArZrBvUjqHE5Ue4LxYuwHfwx+zUi181HjQ= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/syslogexporter v0.105.0 h1:4/G0PHXQrKfI8S0z/YfRrJdH7SL7aZC6sStwgBgzOB4= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/syslogexporter v0.105.0/go.mod h1:HI2ZQ6mho2Qj8DWk4PuQz6TPRc8CWxUWKexXfIijWMw= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter v0.105.0 h1:qZ4Kx3UB2FnmItRtj/EvGWSiSFB/Y1BBIgMYb/Z5k7o= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter v0.105.0/go.mod h1:tyhPzovl+JKv5D3UKaUg3SChRehTldtDyDmzR0VZ0Hw= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.105.0 h1:8CzFMXkgmPCcBo77J3SPjdH5w9OUyLGjm2YbJXlMa0M= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.105.0/go.mod h1:yOhD5/3EVozSiPKVTP8kASg3QCU5QO11JDLPD0EX6Os= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/asapauthextension v0.105.0 h1:3DOkg/cVNSzUT4w5foqzhHZ7oiNReILIGnxXWf9AU6g= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/asapauthextension v0.105.0/go.mod h1:9rfBAsrYVuDbJyKzU1ISa39lgDLlZjASh2p3YXDGicw= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/awsproxy v0.105.0 h1:AOX60bkg2tTEKWnbNADsiijzoN5VRWmctF/AYlfXj0M= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/awsproxy v0.105.0/go.mod h1:JE9MgeFA6whPDbDmEh8oGa4/HUVYJJHToAwaZlIqWSI= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/basicauthextension v0.105.0 h1:9X+rnoj/6Y6Ind16YmyQfVEHqwfkLKZS09wgA4qrBQg= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/basicauthextension v0.105.0/go.mod h1:STvYBV19Gs+8NcfgLtMwKcWY/GLLC7YdpQf9TNe+PZs= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/bearertokenauthextension v0.105.0 h1:baIz8YGn5Xe5r/zl9ZmxzzC2kWyatLeBl1oQ+q35n8k= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/bearertokenauthextension v0.105.0/go.mod h1:HNnRgMa7vkxhR48BL0vhsBWHN1F3EloUAYb13vqLw+Y= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/headerssetterextension v0.105.0 h1:VNh/80vx6ASduZqq6dcKKi0wZthRlmAFY7KoH+mEOLg= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/headerssetterextension v0.105.0/go.mod h1:ghtycE+hadx1ZHphmqRr+L0tj/nusHvlEpdujeKukCE= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.105.0 h1:VLWJYe/+AcHoiWxuRnp1iwEGUuA50AbwkZCe8coBGy0= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.105.0/go.mod h1:S9E6550iphv86vnre4LUpXuvAlksdTNTrlLywPREzd4= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/httpforwarderextension v0.100.0 h1:IbE5WcAdllr8cP7oeI5m2hBRg8NHujuxs0Z3v9QcJHc= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/httpforwarderextension v0.100.0/go.mod h1:CBoBgeWqkkPoApKSPjtcSqO9i5RJwDtkyFGOQWtjfds= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/oauth2clientauthextension v0.105.0 h1:KY4gn7Nz7kPamycJDyBzcFmy7UoloKuboNzSWx3nVOs= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/oauth2clientauthextension v0.105.0/go.mod h1:KE0K3Epsf0XTukCa8Kw6Rg6/7M+aDup5uUwo2WikkzM= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer v0.105.0 h1:NxRuIdzxuf/x06H6zFsnrCYLFyoxoMHeHt5wrbOilEI= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer v0.105.0/go.mod h1:s+suO5v6PkeVZHpiME1vOoiMSbKpbSFDW6HQhKsFkn8= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/dockerobserver v0.105.0 h1:mTMota7DNVqaBGbOZEs1C3Pt2CNWhYP9LDsZ4oQhEaA= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/dockerobserver v0.105.0/go.mod h1:Jtv9Efgn0elGe9XBiOuKQdjUwFHi/NUxC5PgoCY+Sdo= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/hostobserver v0.105.0 h1:3nPlvlxmpUz/DQ8dmcEMMw1qACXn9VLmlD9Z6KEk0Is= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/hostobserver v0.105.0/go.mod h1:x8eLRDpIJhErZIdv86DaFynLrUE6MtEj52Ftne6kH2I= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/k8sobserver v0.105.0 h1:8SpO7QCdnxP9ih9p/da7zTnlW455td8yAW7Q/Obwdws= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/k8sobserver v0.105.0/go.mod h1:DTfcqKvlZkp16zNva4RoPryyQh1X++0vUn7O/uM3hcw= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/oidcauthextension v0.105.0 h1:vsMY+8ZkYYL0cqt/9Yho3EydcNDBcNGwZfpB+K0IReM= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/oidcauthextension v0.105.0/go.mod h1:6QIVpY6rZS0ojDp/O2RIeR+qYofrTmkpATN5JimxcrU= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.105.0 h1:R6FofQhmztYgfZxDCbqZUb6PcjnEB0HM52Ho6IoqigA= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.105.0/go.mod h1:8bgWDZPZzUWzY8BE5wWeYT6ekzlD2pE8rDJOx9vwvgI= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/sigv4authextension v0.105.0 h1:T7mMWSOI0janJIajmvARGkQezy0OdsAt1tU9gUomARg= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/sigv4authextension v0.105.0/go.mod h1:WlzcdCuB39mx5OXTK+17hPCh7InO79J948xrej3Q4/g= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage v0.105.0 h1:HmimWATFFNI8o6n52DXTS2EjFRa6aETNqmA3MBGAxSI= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage v0.105.0/go.mod h1:DoCIQkjzSFD/rRq9rsI4kzYKcHRn6B7g7txILM18dHQ= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/ecsutil v0.105.0 h1:JULTD9RLcAHsGgYvoFmG9lA515kAibZA8SDs980NSqE= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/ecsutil v0.105.0/go.mod h1:HtRVk/R7rglDA+kmDt6+RCLuBd4B7zPsMvcPS3O2D6k= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/proxy v0.105.0 h1:DVEI3tNKUprGoCMCiFg+GLHgRActQm0ajafqj4ddV8U= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/proxy v0.105.0/go.mod h1:fhjoiIHkJ9aSA7/cX7LEEWgob0MMRHFjrk/CWY2W/00= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.105.0 h1:kHHL4A9wL6TxM2sIUEXUpFXGPxrW7u002FJK+majI0s= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.105.0/go.mod h1:I+fL3494NrarNgHHs2D7kz0v02KGCmwmp3L89KUqENA= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.105.0 h1:k89VhlOwi0uYkEOgoR0ISTct07GaBoQmhnI1yypKa4I= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.105.0/go.mod h1:6k6afq9nYwfBbo9z0XhS1AJzFtosTFHoBVJ5v/Ugv+8= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/docker v0.105.0 h1:ORza1dMoc+tVEZ9clIdpKE71ZeUeWCnKYrcL872U5kc= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/docker v0.105.0/go.mod h1:2xs6fEr7bFdle+UkHxbfWpcjbkfgyw4mYtviZ2FT7YI= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter v0.105.0 h1:rjGDHbrFwnQshjnrGvRyZd9IQtMEgna0wmBKt8bOvHQ= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter v0.105.0/go.mod h1:VM2yuWR5UiKTf9A2ELv9WUjnzjpCWYLA5xHSDADa4L4= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8sconfig v0.105.0 h1:gBgUvvxMs3awwIke97FZ/ymbxYSUd+GwTiO/ZqmBW/E= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8sconfig v0.105.0/go.mod h1:VS66oUydCMwiWl1BFmLs7iNy4lGsfVYsriXr/d1fpAk= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8stest v0.105.0 h1:MionH76aP3Tg7Z8LJn06fSQHAmEzDyML/H3fZ6rsCTc= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8stest v0.105.0/go.mod h1:IszvkVT/BDl8B/XXFqc+cxexT5PNoX55BeJ+k2P4SJU= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/kubelet v0.105.0 h1:Gsne8b29weELIxThtGpxyyGWjMYw3nQpFZmJ7JlCtoo= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/kubelet v0.105.0/go.mod h1:cECbyoaqIRtKJxenG0Mxcp93h9MeUh4jplmajCyqiXc= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/metadataproviders v0.105.0 h1:pXfqmF7kHERH3/wfdkwMvsIX6QxVaI7FM4kH/M7EuN0= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/metadataproviders v0.105.0/go.mod h1:Sn/j9ZQ44rTZwMcOPD6dccOZxLWuwYdNAWDztf9rsCA= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/pdatautil v0.105.0 h1:zOSutEwmvUrP/qipRi4v4SVPFAsb1xc/3/JzvffboSc= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/pdatautil v0.105.0/go.mod h1:4d75+uyqLk/ZBiu3bsnjxYliSdGBJpa74IMr5KdhYrs= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.105.0 h1:HoUTIN0sbnGSpqGPR48LZWFTYV0fNEWhV1nStOioLhE= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.105.0/go.mod h1:kilXVPFZUBrcWbYXj+kKsYyIMKlE6mt1/fdv1D/nsPE= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchpersignal v0.105.0 h1:HHQOzApli6RjBO0Ujh8OiBIXtFErojbCEBAzsyw/39Q= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchpersignal v0.105.0/go.mod h1:96jBGagp5wck48k+qfJpxc3SIj3zLRXbP9E1m97gvLI= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/experimentalmetricmetadata v0.105.0 h1:CdFNeWlJgZWx6BpLn0SuTYDDcR2HozCvrhzDTKx+Tz0= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/experimentalmetricmetadata v0.105.0/go.mod h1:9fXA6J9q3FGV1SZYi1QLHbYXK+iTUKe1e+/uMKxB83c= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden v0.105.0 h1:6mUcRfh2DRlU85EFf1W/9kwg9qMKg6xwu1kFC75MM0c= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden v0.105.0/go.mod h1:MX5a4WDcyG/KowLGHJjpbNpYIlXsvpeJr7BEs22HuOA= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.105.0 h1:aPMC0MImobhMMmm8CFbjQl8aAwRBqTuN7NZwNej/ewc= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.105.0/go.mod h1:zBF541pc816GE6YHGacCjR7k5AbSTj+r3l9vkzD4tQI= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.105.0 h1:Zn3WKPLUXcIQTeu5K2elsi/Ncq14MBRZQPaVdJC+6cQ= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.105.0/go.mod h1:hzu5KvOYEH5W9OpVc+iRXUAvj7GHcLyyR4qjIH+hOhQ= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.105.0 h1:hs7TaJClEAhHrj71XcaYqlYnIOpOYQgoHqhnnBNrOK8= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.105.0/go.mod h1:ehzaiDdkrww7l1Stvse5GCOAsAZOpFcgeIbB/2PqFs4= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.105.0 h1:wKujcXESoQPBWIxYIET7YP6lN2idX8oZRsNl8iWXum0= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.105.0/go.mod h1:n9awPzI+erPm8NB8yL/UusWvF5P741BbHv5bcWYMXrc= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.105.0 h1:nxWmoOG5fybgE6qEnO8zi+x1TBQESrqxqLATLStDz8U= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.105.0/go.mod h1:EkUhSxdzRa0CcFYHhkOgxWi1kXCqG08Sq/jbmVIIwjM= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza v0.105.0 h1:r83IqQk13I0mN8d5fcqtAcywuZquJ9nawyAG+hLviPk= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza v0.105.0/go.mod h1:T5GLFCanNnomjWiOAiJvuf2+4usVMvu/VIRJcgc7Zn8= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.105.0 h1:EIMptO6ZZeP734nBLxNVftrWA+OEGtgsxarNH7rao2A= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.105.0/go.mod h1:/2F91Hsx7RAn/FENz/7MRbHBkBYQ/uX6t4tYJfyeBfM= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/opencensus v0.105.0 h1:7IUVoze3zb18MQUz+1xXRp8hthHBA5Ffj8DtXnDffnQ= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/opencensus v0.105.0/go.mod h1:2rkSr/v8eDczzkCTZ/iopSpU1Amag8m0utyv73ebwa4= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.105.0 h1:hKpdsx8wzn/wA3hAavSEVKLUBfkYkpfXpudT+VUxucA= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.105.0/go.mod h1:1Tq47AVtrvxnohU1Is3EV/zv2ifPwdRSW735xG+zvFU= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheusremotewrite v0.105.0 h1:tat4ZUEv47dA0IJaRr43VDPXVWjfacelpQdTMgQZXoE= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheusremotewrite v0.105.0/go.mod h1:yPAJacBA3ZZkyxxGOFJqT9mZjLuLabZCbcNE2JPLALQ= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin v0.105.0 h1:60worMGZbZFw6djolg/CVExX6DPQoXgfM4pmdZj2b7E= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin v0.105.0/go.mod h1:Nhq0L1GhTdyl/Td94xCiys0kJMO9lOsezhYRXz0MTvQ= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/attributesprocessor v0.105.0 h1:07WoPlHMy6MGtwToEVaxWODM873QlS9NFzjjc+5fvnA= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/attributesprocessor v0.105.0/go.mod h1:hcCUGzof6T7S400eqMsU9IsW0ht9YjLhrbm2IvKezt8= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/cumulativetodeltaprocessor v0.105.0 h1:dSUxM4hA289DlG2NGiYm2IHBEPcqLkjoILTlNgRH5KA= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/cumulativetodeltaprocessor v0.105.0/go.mod h1:7a6zZi8aji5svmiVjhm9wWs5Gumih6U62uHwjfBAeUE= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatorateprocessor v0.105.0 h1:e5BcjyyxEqW0k6og/hL/qBOzuLituyvUQTMOZsZ0PQA= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatorateprocessor v0.105.0/go.mod h1:u3EUJt8tYc6p7t967qzzBrPurekOpR+pXhrhHKh895A= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/filterprocessor v0.105.0 h1:oRa+acTM4f5rjTT3+hjOVM1LYrlwrm6CSNG4o/RIqcA= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/filterprocessor v0.105.0/go.mod h1:66cZFd4X8vQBTmvm1hPHxrSNHS474iUEsAVbYk9xQBU= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbyattrsprocessor v0.105.0 h1:OYsGaSC9G7pAVYKTd1+D0f7HTHcxuQfoEHyQy+a1NKk= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbyattrsprocessor v0.105.0/go.mod h1:WCesGEakYveZYZH4o3cUTLt3UB7JxE+yDiiphRHoJoc= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbytraceprocessor v0.105.0 h1:BUts/YcQ/HTwVLflY7SpVRc3owA7AtGj7iXRcqA+AKU= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbytraceprocessor v0.105.0/go.mod h1:Nb0TmNl+j2srYi9ZNViUHwLXKb9HjsC7PPolRk1O1o4= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/k8sattributesprocessor v0.105.0 h1:ScIwuYg6l79Ta+deOyZIADXrBlXSdeAZ7sp3MXhm7JY= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/k8sattributesprocessor v0.105.0/go.mod h1:pranRmnWRkzDsn9a16BzSqX6HJ6XjjVVFmMhyZPEzt0= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/metricsgenerationprocessor v0.105.0 h1:hvd+YOerL61wOIpLy3OoWEKP46Sg3CSgXioTQpw2v2Y= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/metricsgenerationprocessor v0.105.0/go.mod h1:eMUtVPCLLYYTszQ5QJ/195cD85ZYQxpmGu3RZg6iCBM= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/metricstransformprocessor v0.105.0 h1:L23gC/anzqtsP9XKaK+paC+/fU3cgW7uvR4C8rq1/yk= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/metricstransformprocessor v0.105.0/go.mod h1:M6pUQb2iMC7HW68xDKI6ziyI+wvytLF4QhWtEki1PnE= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.105.0 h1:mFAlBmDFELQJS8uj1M8csB/vQqjpq6W9/9k9izh9Hr4= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.105.0/go.mod h1:23pZN+mhimogJNwEw3AqiaIRJ2Khy9n+o6YkbBzUK0g= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/redactionprocessor v0.100.0 h1:n/aO09oRwtY3HPxEHg4ACx/sWKW6evVO4YXIgu+tlD8= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/redactionprocessor v0.100.0/go.mod h1:LSKT9sf2Afx8RFTh8C+qreyr7ZxgDjQyV9KAcKXtbPc= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/remotetapprocessor v0.100.0 h1:QB2/WOp+V1UJnnQdsnrpET9U8Q665xoS1c9+/ir8Doo= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/remotetapprocessor v0.100.0/go.mod h1:nC+dtJl0gcMiqNz+mYBnB3LRJrFddFj2RYeU2OnC6Sk= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourcedetectionprocessor v0.105.0 h1:c/amt4jBLbjIpi4CtRUjQW2gdQbVA607TEX8BCgCwe4= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourcedetectionprocessor v0.105.0/go.mod h1:HIqvjexbr/OzqucODsCSJabuXZPS8PaLYhNPeeU8xUA= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.105.0 h1:H4f49ywU6TUSZ8I+bj4ZayZP46i1jOydD8h7jhSD6Q0= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.105.0/go.mod h1:ekbXlY4WbgUT09oGbDSLLYU9NP5XksG1mDgooCOCGls= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/routingprocessor v0.105.0 h1:JMlop0ov4Oy0MbumF/PqCLYc1IQU++lszStHo6qcELU= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/routingprocessor v0.105.0/go.mod h1:leF4ngBEh1HvSz5hmQ6ZorLDnboW0UGn8FRBohnS310= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/spanprocessor v0.105.0 h1:gHr1z0EpNmolRkEEEr01Lq/OYm/nNYaWRN+V32J0cuk= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/spanprocessor v0.105.0/go.mod h1:FXzm0twR7yvayJ8ozR0d6JY4X4ehUbyRwFPnh10wf3k= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/tailsamplingprocessor v0.105.0 h1:t8qqvZrfLcgpR6qyVfXoOghJxV0/INvDhRtJVGIT9PI= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/tailsamplingprocessor v0.105.0/go.mod h1:tOear8t6EdvUCb3G44iPG1oxv5UuTy7oa6yaVJ6l8DI= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/transformprocessor v0.105.0 h1:/6i9boKkDmL6hAa4rXPAH4iLVIKAPFfl33OX21usXZk= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/transformprocessor v0.105.0/go.mod h1:5BAgFbVX+kgOXqFZVOZNko/xUSXIWbHgHC2hwdhAMbo= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/bigipreceiver v0.105.0 h1:/ixdhOYF4PsHkUTko1ej0Ec1WAR5myfigss4p77qwhI= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/bigipreceiver v0.105.0/go.mod h1:Qd+wmL2tsWhVGGoCuA8nBHxiPYHC9H1+0LSbQTj4Zec= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/dockerstatsreceiver v0.105.0 h1:+dqHs7d6VclS3qWt9925O8JEvnqJy8WJ28UuZISHRu8= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/dockerstatsreceiver v0.105.0/go.mod h1:axvvwteleD3UtD6GjSeoYKgVJUhIYxKgkglCReibzN4= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/filelogreceiver v0.105.0 h1:aovChJqUsV07T41w0vnspaSdHaTo8WrgbRnkZRZpHi4= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/filelogreceiver v0.105.0/go.mod h1:s2dHItpEPxPulfnQG88rjjBQBqIgyaPDPPxhL4ZioVY= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver v0.105.0 h1:pxjCD/Rj5wNV7/Za3zIm00XgK2nSegBeFrcolZsiYak= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver v0.105.0/go.mod h1:2PO++66272D+rsjp6rltnitPO1/7O1mGL4Hfu5pjCsg= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/httpcheckreceiver v0.105.0 h1:4FpFD7NP44G4vo2w8DOy0wHrzdSINLsjTp59al9zyXw= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/httpcheckreceiver v0.105.0/go.mod h1:TWQ/B6aW/LbmJMzmJ8OSWkyPgdnYYX8cEgK2/vuHsF4= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver v0.105.0 h1:KGvKn2n/tV5aG3JlryEgXnnSVnY0O6YFWGOY72OI8MY= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver v0.105.0/go.mod h1:NKh0a5RFTHnvxRRmjlV96ZzSc5xZrHr1yPRWxskjBB0= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sclusterreceiver v0.105.0 h1:LewildLdGEqbLymyzQbW+gtwuqRIQM0f2MMLARnGrrw= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sclusterreceiver v0.105.0/go.mod h1:5sJt9X9soU/yZylHTXRSm03DNwbNdhKgze5xb7453h4= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8seventsreceiver v0.105.0 h1:ZsyM4aXn2SP0zKlbCnCzPWL9A3HJvP4FpWr4Lj+6W2M= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8seventsreceiver v0.105.0/go.mod h1:rpHunERtcxurXc+owfOmSJZbcglAbpkU6XlN2shHExA= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sobjectsreceiver v0.105.0 h1:o51g0HvjuGnjiJilT0htxcsOMstLl7FReEyU2iFNDK0= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sobjectsreceiver v0.105.0/go.mod h1:MpGBzm1h3ttVCoqb5m7TzCyGgmzM70YZy1rxPmSHf/I= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kubeletstatsreceiver v0.105.0 h1:mTxDJNe8LcApYOa8zEnd3B+z8zHnZiP831m5axl6RFg= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kubeletstatsreceiver v0.105.0/go.mod h1:elg1LL5tXz4NAVdP4NX0G8+gRdX6Vv0A4XxdpJ5uxqs= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/opencensusreceiver v0.105.0 h1:kLEwjBh2IF8/LJOqYqmAxRj6hUgl4vKRPrbxh6RgiNg= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/opencensusreceiver v0.105.0/go.mod h1:HM1F4a4aVGTqwy083sAFrFmZGSBiWCICXiy9XWUHczc= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/podmanreceiver v0.105.0 h1:++GAV0296Qto/3Ki8JwgJ2s1LmwtcZKz4P+rjMop95s= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/podmanreceiver v0.105.0/go.mod h1:uQJIQOOecfXGvdfbXxkKImN9pNICgg4Az7QtQV+KtcY= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.105.0 h1:s2kcmrILHXgutAl3Slol4xlDUMJTYjEU7kppk3DkZ2s= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.105.0/go.mod h1:gBmEBZB1odOni3kBpY+EbOBcXOK3tDu2eoqegdSeXtY= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/simpleprometheusreceiver v0.105.0 h1:j+eGlTmoSxSa0MNJPVxEFy2AFYXthuEwjI5eh7YbUkk= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/simpleprometheusreceiver v0.105.0/go.mod h1:6OWCUtV6vb89cYi3EhjJBnrAfO3eyrP2ISuwDt2Shdc= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/syslogreceiver v0.105.0 h1:Jk0aBz2Ejg8uearHSugT2L/MegNSG85ygvedOqqPQjE= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/syslogreceiver v0.105.0/go.mod h1:DGgI5erU/Y2j1FNq3hluhc6yGDrUrV74NiF/UBI9960= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/tcplogreceiver v0.105.0 h1:cQeHLKssdlnTS8P69LhJcPQRRwXQnkfTJ8B6hlHq+1M= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/tcplogreceiver v0.105.0/go.mod h1:zvImfBdXzdRXcq+pnPEqQVvbgAw2UgSBKWy0ymz/Gk4= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/udplogreceiver v0.105.0 h1:RCdgZYUo1yIDxb4hiLjNv/OMDBu2hyKEkFhXL6wBD/s= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/udplogreceiver v0.105.0/go.mod h1:aIkta/pF9VgIPUAIAoTjzuZxJfrmiFKz/DMLPhYWUto= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver v0.105.0 h1:JLYDrRk4oJB5CZY49Q1AhvpN8Tnl8faPG0CqpnDOFIw= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver v0.105.0/go.mod h1:73LyO27uXzwtEZrSq/7b1wi5FG9aHx6TUVcCDaxJ5mw= -github.com/open-telemetry/opentelemetry-collector-contrib/testbed v0.105.0 h1:h3LsnyoZW+RNOrxrzdTWdMn5gYTuhUSFb7H1p7OiQcU= -github.com/open-telemetry/opentelemetry-collector-contrib/testbed v0.105.0/go.mod h1:ePLBjg8intJ1K6mtDSAsUeJW9c8doEKNor1IEBKkXds= +github.com/open-telemetry/opentelemetry-collector-contrib/connector/routingconnector v0.108.0 h1:9m/fNqG+L4rl7EqIvd2Q8ly8sjTNrgvQOVkonxl+y2M= +github.com/open-telemetry/opentelemetry-collector-contrib/connector/routingconnector v0.108.0/go.mod h1:o30bC1PleNXjNn4BXLE4GAyUY6yjLzkShWcK3ItGQ24= +github.com/open-telemetry/opentelemetry-collector-contrib/connector/spanmetricsconnector v0.108.0 h1:K50wU48oObjZPAJI5H5o5Awe3bvCV26Oj1+4fU++wtY= +github.com/open-telemetry/opentelemetry-collector-contrib/connector/spanmetricsconnector v0.108.0/go.mod h1:YF2SGiBXD6gcG2ZURhthEfSeYsKNGYqxONp2hr7b0ss= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opencensusexporter v0.108.0 h1:Wl9P3xLBg5Zh024jPDV7oaCChHolWiXhSO7Gtar5fD8= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opencensusexporter v0.108.0/go.mod h1:L7F4O7siVuFzvwYybYo4aEWD5pwGlgRcSaGDxDHHjCs= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.108.0 h1:UM6fhqbCQra8SGfdAiR21toB4Kcvnds4aqj9Yi9kwWQ= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.108.0/go.mod h1:Ur5jwi/zuN2lSpcHMnsmcf1fs/F+6M89I8gbTr3uLxg= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/syslogexporter v0.108.0 h1:A1wnzX3qqAmP2+ofdlCZGSkOXPNOALR6V3pgCPzvi7Q= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/syslogexporter v0.108.0/go.mod h1:+aHiVNPHfWAIi+C4sIjHV0S6lPqQnNYBnZajyobvqzg= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter v0.108.0 h1:uKwCFQ/oi+dKdatEunYBGMkaBHZdyMbOqBR7BT9N7qo= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter v0.108.0/go.mod h1:JtuQMA5aZzlq1dD7BfIl9VmAsiec8Am+8ZMhJVC1roE= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/headerssetterextension v0.108.0 h1:L5B1EIq94npsFy+X9HtawTn6EH+CpB145POTbkTQjDo= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/headerssetterextension v0.108.0/go.mod h1:S2T40XVisiI+dWDxb6NfXzZkH9cRr2Gf4e3jovMW2mE= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.108.0 h1:f/A6n451Zs2PfLWx2JFYZlWOVdm2J+KgSHv4bxUPvUM= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.108.0/go.mod h1:mSViCF7L7QwtwWLVoVTBz3TKZDLEd5YNRQfH9DeWfV8= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.108.0 h1:M+yWJwPQwg8HcYwFk0tKJHZs67zHBVSO33c5NPqYKdk= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.108.0/go.mod h1:iHe3TL6D+Tel2HVJIDqaMAYF56xjqJwhJPn8xmg7gPo= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage v0.108.0 h1:9O5x+LT6S0G+KhGHfGQwS0ZeJKUjM+9nwqRrmasB/Uw= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage v0.108.0/go.mod h1:uCn10h/QlirtEIPyEkEYLuf6IorSabZ4JTp1+dFUip0= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/ecsutil v0.108.0 h1:cpGPGONV2Y7ew7ubDjAIEsSEcs6iVE9MkMr6XRO2Yyo= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/ecsutil v0.108.0/go.mod h1:/F9uB3FiXh+8mLTvCMTNpfuHhS37wTIbsMMzfOs6XyY= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.108.0 h1:NCY/JZmljwOjtWOcWqZWz7sOEHgPcW+JNORNPcIBSjg= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.108.0/go.mod h1:osDf+vagg+N6yH5HBZNnDxCMA0oiMg/C3wVckFe/QHo= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.108.0 h1:+VLLHBSbtEiLMtSi8ESWM4PPDs/H6XKf0RHWWIX8RjE= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.108.0/go.mod h1:L4KHT5M01zjg0wYmNSX2VArC088vccVa7p4XBrcb48g= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter v0.108.0 h1:DGQwT+PdalEB/LYiE36r/XnFTaU3h+z8cR2LfS3qxm0= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter v0.108.0/go.mod h1:pPQV7fCCb3HOo70YMUnnhN3d+0toR23W+eqvOQckpuM= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8sconfig v0.108.0 h1:QukXOls8WAGT3jSM1alwo8CDGFO5VIIfzUkMlx08hfs= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8sconfig v0.108.0/go.mod h1:Zf2QUXo/u8CEhls+KnhqZtU3CKzYCenGW76RP8JOnsE= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8stest v0.108.0 h1:Hx6F+rrvwr2tr9XyYEM7bSGAPYn6d7vJ+/hqqteOIu4= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8stest v0.108.0/go.mod h1:pf03X7fpCGS1StUBdhmdB3/uW8cKmil0AFzYyZcbsoE= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/metadataproviders v0.108.0 h1:VUh539CAe5Lv4Jnz0u0Pl8hYnYU2bjTqISQWLsOOFs0= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/metadataproviders v0.108.0/go.mod h1:tUVtWsA/wm7zHNm57/Ctsn32eGxMzifSKrJ1ZKnAM8Y= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/pdatautil v0.108.0 h1:w9gFpG5qr98S4bv12bEqs/em+fLIJTn6QRk4LvSgF7Q= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/pdatautil v0.108.0/go.mod h1:rVhXrlg2sNj87vhheHs5BLH1zNFYeeQnBPRIZiHkrpY= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.108.0 h1:wYHr1X+HNFzrsYUsn54AS8RdNUleWIorKk3GfMPK4YQ= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.108.0/go.mod h1:BFUzqJLOtgeAnl2dZjCMVwFd2hS6x+X+Uk9kQNS/x58= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchpersignal v0.108.0 h1:7EKRVuc8GRrAfde2/fh+CFMsJQAQGICg686sRyIk3QI= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchpersignal v0.108.0/go.mod h1:+ghcpLt2BBbqOm+vv6CeSXK/aLHB4cXiLdsfFNZXeqg= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/experimentalmetricmetadata v0.108.0 h1:H/1VRaHskRLKb40QPzwJbcB5x+bMpju4U1SJErL4i68= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/experimentalmetricmetadata v0.108.0/go.mod h1:pyOUYQWWc0PE7c847yWLAI7987M1LTKurKl3shjZSXw= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden v0.108.0 h1:WbZ/Oq3z5x/PQAwzB0vMhP4QNc4nI1G22H3AMAAbMjs= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden v0.108.0/go.mod h1:3ku/cfl0FXMSc/dc9DGrhABhE6/AoYArKtl3I9QEp28= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.108.0 h1:WUV7wEVjjEgp8TRcQquQj/2NfRY84Vch43+zG/Pizqk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.108.0/go.mod h1:9mkPZ5pz6HktjWtUdqRmqAsP7VzP/gpIwQ8z/h2YXAU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.108.0 h1:so+V3rT18oyHJmPs5lBNBLlU8tnHU9h/tkA3Q7q8m7c= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.108.0/go.mod h1:G+N43ID1sP2CnffxkYdMyuJpep2UcGQUyq4HiAmcYSw= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.108.0 h1:vU6a7EKHBu80err/1SCn+8fLpSCdR1PoSzdyydXDcjQ= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.108.0/go.mod h1:dHSW1ec9ZHZ/92+NoLEJd5UaL4tRVmnn+DvEQqdJ7f0= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.108.0 h1:LtTLGiv057JhM621FUr+dZ+hlgkTqC7kq/9MbaUAKoM= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.108.0/go.mod h1:uCAM9cEmQ5bQtzMvbkW/MhjSrB3j7vGzQMwhJdfRuNY= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.108.0 h1:iL8kZ+D4wuw9qbFrle+oUmYeh4mzWFqtqu0zo2zmN+Y= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.108.0/go.mod h1:GayGL7BKMWhqegflCSt3NY0djggYXP+pRsBa8gQQA3I= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza v0.108.0 h1:3K10YrwOJgTSv4Movu3iM73zyhQ/feCl5PUpXL1MSh4= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza v0.108.0/go.mod h1:aXTU53U0Ig9jq8o0NfnJJa7zo2W352xi+wlLlKVjv3k= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.108.0 h1:utUOfnLmty/rFCZIz4gz+iKUrtfVhc06XviGGuuA9y4= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.108.0/go.mod h1:WKNpfisJDGdoZ/2Njf7Ea9/eks99klDY4bx5iwV4CRY= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/opencensus v0.108.0 h1:lRqOv2hLzLbkpHRV2A1hbjliigYpH8yda57Lcn/0qZ4= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/opencensus v0.108.0/go.mod h1:QZIJboY+gHGMFXT3jkpPjsNznEMH5mUEpsQxzagryCI= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.108.0 h1:1yYQrD/YATQOgPsOG60qWs5D6WD3QYRfUio1LJvw+ds= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.108.0/go.mod h1:hbXv4Zf/FGHDDulPI+eSXNo9VkWviGHxRRgVZf63Dqs= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin v0.108.0 h1:R7dGiMWCxV/qzDegCw9N1uYVP5KKqScAYQgDBJB5Hx0= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin v0.108.0/go.mod h1:hANmkb4pq1DUGtK4PL/Y+8jbc01rSlP4HIq21seXBZk= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/attributesprocessor v0.108.0 h1:3s1+vxneYas0RP0rsn78YVmAgwCJ/BV4LMwLmlQkz/s= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/attributesprocessor v0.108.0/go.mod h1:Fqu4jAy/ZatqmSbpBQOVR3GpUZSz+sQpoDMGK1gLGFY= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/cumulativetodeltaprocessor v0.108.0 h1:Ydm51DI70dU/dQ1XbVQiLjPWAHmLg8fqHu8GcuaKbIE= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/cumulativetodeltaprocessor v0.108.0/go.mod h1:0h8HR0FIBmqv1q5S5zbiS6Y5rbimJCsgUvoU7P2OIcQ= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatorateprocessor v0.108.0 h1:XL0neAkZk6FI0IGj/7X+cdkcgPXt+Go3YcfIJC1xVbw= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatorateprocessor v0.108.0/go.mod h1:BV2lykWTB83Ued+IAt1CSGD+SgdB2N+nyr/k4z0rEkk= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/filterprocessor v0.108.0 h1:DovZJA11LAWamSUgyKIQocVOWpGGEaHD9rmWCx84uo0= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/filterprocessor v0.108.0/go.mod h1:3t+WkgUhubgLEl9GFsw144cjmt5uJ8fJSklqEv7ssI8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbyattrsprocessor v0.108.0 h1:WY44AfMifpMis5mYKnfRysnkS9LL2BRouJV3JJ61O50= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbyattrsprocessor v0.108.0/go.mod h1:ZIoInddfAFLuKztKhJE2Ep6R/TwLPavVjCLQAMQn3tU= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbytraceprocessor v0.108.0 h1:9MNpwKJSWUNYCZ78cUkLcq3Gh/++988qS9Uxfs+gRiY= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbytraceprocessor v0.108.0/go.mod h1:TtgEG49tieq8bovv7qh087XjgtNgDf661x3M25xEI2U= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/k8sattributesprocessor v0.108.0 h1:/MCx9rdVmgSBcKBn+yweJLbrLbj7xQbbvMbx9Uk5vJw= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/k8sattributesprocessor v0.108.0/go.mod h1:OZPYFt9O5hP84YBpUOqfpexPvUHsl9cqMGzdJrMhmTo= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/metricsgenerationprocessor v0.108.0 h1:DaiE2XXpgJZgqdDMWdrND7bnbVweyflzEVC4kSe0Yi0= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/metricsgenerationprocessor v0.108.0/go.mod h1:lZjcB5gYhCjxU/Pxh8c8EvI/qsXLQWCioPwk4oN9FOc= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/metricstransformprocessor v0.108.0 h1:EJmZ4AC80jMPBQQJ58AzuYrCg3moJ1GVgDM3Cnf/Xhs= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/metricstransformprocessor v0.108.0/go.mod h1:npPMl2f8a2piyea0Kl5Xndy45OAkr2ueTCOZ9yFk9c0= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.108.0 h1:k+g4rkL6IN7DNfico6MzNWT4GuPi2umwE/j106shsbw= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.108.0/go.mod h1:6OBqoedGhfhAKy+n8AeSml3Hy2b8uilSCxc2QxoQ3/4= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/redactionprocessor v0.108.0 h1:HKkVrz7yW3mdL0XVHt7nP/MmeUT1LqskPRWuML4uBSc= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/redactionprocessor v0.108.0/go.mod h1:RV7HuwiE/ZsxYmrvcUUDIUv58XAp3jpqDc3eq99ysto= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/remotetapprocessor v0.108.0 h1:H+c8slfXAfGOYm6pQ7fyFVxcGpMevjB+4zk05f1O8Og= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/remotetapprocessor v0.108.0/go.mod h1:maPioAf1UVMq96wv02E9YjftNuRY1IHOAUYYQKVOT4k= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourcedetectionprocessor v0.108.0 h1:RDR/y9NZps4z7kqWwPzC1tO/h/R7so3lCGjH8dff4D4= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourcedetectionprocessor v0.108.0/go.mod h1:LZw9TVVtrcWyBND4bZziEibD76Zqq1d9wIokB9GsgR0= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.108.0 h1:9sJHnaHQU/HMvFg/Z/nlp04Vq9JKMCERzZQCKdlWFUg= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.108.0/go.mod h1:MbLviU2sMBiDTeL0pnp0yBB+AKtXXTfA3f7Ld3sSLn8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/routingprocessor v0.108.0 h1:mH9T3RgPtKgQWtgukjIDgFLsreSBjVHxbyCovoZ260E= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/routingprocessor v0.108.0/go.mod h1:rBtpHCh6Shm0a4zHPEToC2rm2ZGVAOqvfcV5kA/5AX4= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/spanprocessor v0.108.0 h1:4NzFffO7ye9tArUJZMer0Bb5BCm0d7GvpT4vbPLR1GY= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/spanprocessor v0.108.0/go.mod h1:8gv0xO7AvWxZmfyT0GofUtpXA1i1HcMfp+JclqaxirI= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/tailsamplingprocessor v0.108.0 h1:hGLJKP2YbxQSzRLNHGhvRso4nYn5rxsbg9MS0d9VO1w= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/tailsamplingprocessor v0.108.0/go.mod h1:sfGeGw2Bl5rP4Lh0pxccoD5/mMC7EOjnYkP1Wk3jNIY= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/transformprocessor v0.108.0 h1:ujEwsIqLFmboy1gnZtVIXzS6L0XXS8JqnstzpTZyDLo= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/transformprocessor v0.108.0/go.mod h1:y4E2ptjOJl97nJt5xFVUgFo01CGbDh0DLjBez4rbKQQ= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver v0.108.0 h1:S9dXDXmoCdUqN2PY3ce49NwdjEYR708WOttqgSAq+uw= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver v0.108.0/go.mod h1:PBDpB0rpAugwKbJiGkvtjP1uFOtnkZME3GLcxgu3jig= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver v0.108.0 h1:yXWSvQQ/UU9bmF44OrIXIgOLKjpHuA6zHiFAkaHTroQ= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver v0.108.0/go.mod h1:TvAeOMNJIZCJurJJuJoICrX6FS4B8bJWW01+Z9ctxnc= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/opencensusreceiver v0.108.0 h1:Y8aDg3l/NgAGc/GRM52mRwqv7KMh5bk+UFbfneAoYb8= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/opencensusreceiver v0.108.0/go.mod h1:+Xs2MEBDeEt7vyzXgtEhQbw9MZ/K/kSPWE5YTzjIpPk= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.108.0 h1:u6eY8tBgiT7e4QGPDsF2N+UEJBXbPsvtLc39C+0Fy4U= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.108.0/go.mod h1:VUCVWsYWUlxut3MQbH3ADOz7bQBrtC3NlzJl9PQpKAk= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/syslogreceiver v0.108.0 h1:FyiVuycmSmI4pg5PKvRjpUT0qaBVdFW9AeX1giolQG8= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/syslogreceiver v0.108.0/go.mod h1:bmgqS6N2W31oEVg82zAkCJxmMrVamkODmZWr9qpCdK8= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver v0.108.0 h1:fR/TiCF1jkTSLIpvxJ8ycBYx3wAIMo5sOjyna28qNPc= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver v0.108.0/go.mod h1:VdIAkr+2oTSwkl+CQ9UW3ZiV0TXobqOznSV5I5CB7Rc= +github.com/open-telemetry/opentelemetry-collector-contrib/testbed v0.108.0 h1:rZlnwqE9x/MX+13+tgqx5tizLoRpJ4m3qD6ww1hdf5k= +github.com/open-telemetry/opentelemetry-collector-contrib/testbed v0.108.0/go.mod h1:AgTmIKuQ0WSOPo2pxPSNUnYM7SVOI/fqOoCascYnggE= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= @@ -854,8 +710,8 @@ github.com/openshift/client-go v0.0.0-20210521082421-73d9475a9142/go.mod h1:fjS8 github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/openzipkin/zipkin-go v0.4.3 h1:9EGwpqkgnwdEIJ+Od7QVSEIH+ocmm5nPat0G7sjsSdg= github.com/openzipkin/zipkin-go v0.4.3/go.mod h1:M9wCJZFWCo2RiY+o1eBCEMe0Dp2S5LDHcMZmk3RmK7c= -github.com/ovh/go-ovh v1.5.1 h1:P8O+7H+NQuFK9P/j4sFW5C0fvSS2DnHYGPwdVCp45wI= -github.com/ovh/go-ovh v1.5.1/go.mod h1:cTVDnl94z4tl8pP1uZ/8jlVxntjSIf09bNcQ5TJSC7c= +github.com/ovh/go-ovh v1.6.0 h1:ixLOwxQdzYDx296sXcgS35TOPEahJkpjMGtzPadCjQI= +github.com/ovh/go-ovh v1.6.0/go.mod h1:cTVDnl94z4tl8pP1uZ/8jlVxntjSIf09bNcQ5TJSC7c= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= @@ -875,17 +731,13 @@ github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndr github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/pquerna/cachecontrol v0.1.0 h1:yJMy84ti9h/+OEWa752kBTKv4XC30OtVVHYv/8cTqKc= -github.com/pquerna/cachecontrol v0.1.0/go.mod h1:NrUG3Z7Rdu85UNR3vm7SOsl1nFIeSiQnrHV5K9mBcUI= -github.com/prometheus-community/windows_exporter v0.25.1 h1:sagNoaBC1TirUNt8YE4eIpeDNQbswrRHsMxvluYHbyU= -github.com/prometheus-community/windows_exporter v0.25.1/go.mod h1:fmM+2zsneBex4oamnr5YHzikZ+34Zhkxg7h3fZVtDWY= +github.com/prometheus-community/windows_exporter v0.27.2 h1:/tdRTouPMVsC4qt8+s9NOPEm7L/9qdDxmasiETlx+Wk= +github.com/prometheus-community/windows_exporter v0.27.2/go.mod h1:8+T6hfv71nvgVIzguouXkIGoa15ni+uXHHULBOA2bZo= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= +github.com/prometheus/client_golang v1.20.2 h1:5ctymQzZlyOON1666svgwn3s6IKWgfbjsejTMiXIyjg= +github.com/prometheus/client_golang v1.20.2/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -894,9 +746,6 @@ github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.29.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc= github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8= github.com/prometheus/common/sigv4 v0.1.0 h1:qoVebwtwwEhS85Czm2dSROY5fTo2PAPEVdDeppTwGX4= @@ -904,12 +753,10 @@ github.com/prometheus/common/sigv4 v0.1.0/go.mod h1:2Jkxxk9yYvCkE5G1sQT7GuEXm57J github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= -github.com/prometheus/prometheus v0.53.0 h1:vOnhpUKrDv954jnVBvhG/ZQJ3kqscnKI+Hbdwo2tAhc= -github.com/prometheus/prometheus v0.53.0/go.mod h1:RZDkzs+ShMBDkAPQkLEaLBXpjmDcjhNxU2drUVPgKUU= +github.com/prometheus/prometheus v0.54.1 h1:vKuwQNjnYN2/mDoWfHXDhAsz/68q/dQDb+YbcEqU7MQ= +github.com/prometheus/prometheus v0.54.1/go.mod h1:xlLByHhk2g3ycakQGrMaU8K7OySZx98BzeCR99991NY= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= @@ -923,23 +770,22 @@ github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6g github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= github.com/samber/slog-gin v1.11.0 h1:a9M1DgzM914M/gCe/xGDaiQGOucLiqFYeqctgTT8G5I= github.com/samber/slog-gin v1.11.0/go.mod h1:BJ5m8e4irnwx/oemuG6eqokK5MFiiMshCuqr07GAnL8= -github.com/scaleway/scaleway-sdk-go v1.0.0-beta.27 h1:yGAraK1uUjlhSXgNMIy8o/J4LFNcy7yeipBqt9N9mVg= -github.com/scaleway/scaleway-sdk-go v1.0.0-beta.27/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg= +github.com/scaleway/scaleway-sdk-go v1.0.0-beta.29 h1:BkTk4gynLjguayxrYxZoMZjBnAOh7ntQvUkOFmkMqPU= +github.com/scaleway/scaleway-sdk-go v1.0.0-beta.29/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg= github.com/sclevine/spec v1.4.0 h1:z/Q9idDcay5m5irkZ28M7PtQM4aOISzOpj4bUPkDee8= github.com/sclevine/spec v1.4.0/go.mod h1:LvpgJaFyvQzRvc1kaDs0bulYwzC70PbiYjC4QnFHkOM= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/shirou/gopsutil/v3 v3.24.5 h1:i0t8kL+kQTvpAYToeuiVk3TgDeKOFioZO3Ztz/iZ9pI= github.com/shirou/gopsutil/v3 v3.24.5/go.mod h1:bsoOS1aStSs9ErQ1WWfxllSeS1K5D+U30r2NfcubMVk= -github.com/shirou/gopsutil/v4 v4.24.6 h1:9qqCSYF2pgOU+t+NgJtp7Co5+5mHF/HyKBUckySQL64= -github.com/shirou/gopsutil/v4 v4.24.6/go.mod h1:aoebb2vxetJ/yIDZISmduFvVNPHqXQ9SEJwRXxkf0RA= +github.com/shirou/gopsutil/v4 v4.24.7 h1:V9UGTK4gQ8HvcnPKf6Zt3XHyQq/peaekfxpJ2HSocJk= +github.com/shirou/gopsutil/v4 v4.24.7/go.mod h1:0uW/073rP7FYLOkvxolUQM5rMOLTNmRXnFKafpb71rw= github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= github.com/shoenig/test v1.7.1 h1:UJcjSAI3aUKx52kfcfhblgyhZceouhvvs3OYdWgn+PY= github.com/shoenig/test v1.7.1/go.mod h1:UxJ6u/x2v/TNs/LoLxBNJRV9DiwBBKYxXSyczsBHFoI= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/soheilhy/cmux v0.1.5 h1:jjzc5WVemNEDTLwv9tlmemhC73tI08BNOIGwBOo10Js= @@ -981,22 +827,8 @@ github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsT github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= -github.com/testcontainers/testcontainers-go v0.31.0 h1:W0VwIhcEVhRflwL9as3dhY6jXjVCA27AkmbnZ+UTh3U= -github.com/testcontainers/testcontainers-go v0.31.0/go.mod h1:D2lAoA0zUFiSY+eAflqK5mcUx/A5hrrORaEQrd0SefI= -github.com/tg123/go-htpasswd v1.2.2 h1:tmNccDsQ+wYsoRfiONzIhDm5OkVHQzN3w4FOBAlN6BY= -github.com/tg123/go-htpasswd v1.2.2/go.mod h1:FcIrK0J+6zptgVwK1JDlqyajW/1B4PtuJ/FLWl7nx8A= -github.com/tidwall/gjson v1.14.3 h1:9jvXn7olKEHU1S9vwoMGliaT8jq1vJ7IH/n9zD9Dnlw= -github.com/tidwall/gjson v1.14.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= -github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= -github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= -github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/tidwall/tinylru v1.1.0 h1:XY6IUfzVTU9rpwdhKUF6nQdChgCdGjkMfLzbWyiau6I= -github.com/tidwall/tinylru v1.1.0/go.mod h1:3+bX+TJ2baOLMWTnlyNWHh4QMnFyARg2TLTQ6OFbzw8= -github.com/tidwall/wal v1.1.7 h1:emc1TRjIVsdKKSnpwGBAcsAGg0767SvUk8+ygx7Bb+4= -github.com/tidwall/wal v1.1.7/go.mod h1:r6lR1j27W9EPalgHiB7zLJDYu3mzW5BQP5KrzBpYY/E= -github.com/tilinna/clock v1.1.0 h1:6IQQQCo6KoBxVudv6gwtY8o4eDfhHo8ojA5dP0MfhSs= -github.com/tilinna/clock v1.1.0/go.mod h1:ZsP7BcY7sEEz7ktc0IVy8Us6boDrK8VradlKRUGfOao= +github.com/testcontainers/testcontainers-go v0.33.0 h1:zJS9PfXYT5O0ZFXM2xxXfk4J5UMw/kRiISng037Gxdw= +github.com/testcontainers/testcontainers-go v0.33.0/go.mod h1:W80YpTa8D5C3Yy16icheD01UTDu+LmXIA2Keo+jWtT8= github.com/tklauser/go-sysconf v0.3.14 h1:g5vzr9iPFFz24v2KZXs/pvpvh8/V9Fw6vQK5ZZb78yU= github.com/tklauser/go-sysconf v0.3.14/go.mod h1:1ym4lWMLUOhuBOPGtRcJm7tEGX4SCYNEEEtghGG/8uY= github.com/tklauser/numcpus v0.8.0 h1:Mx4Wwe/FjZLeQsK/6kt2EOepwwSl7SmJrK5bV/dXYgY= @@ -1008,19 +840,19 @@ github.com/trivago/tgo v1.0.7/go.mod h1:w4dpD+3tzNIIiIfkWWa85w5/B77tlvdZckQ+6PkF github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= +github.com/ua-parser/uap-go v0.0.0-20240611065828-3a4781585db6 h1:SIKIoA4e/5Y9ZOl0DCe3eVMLPOQzJxgZpfdHHeauNTM= +github.com/ua-parser/uap-go v0.0.0-20240611065828-3a4781585db6/go.mod h1:BUbeWZiieNxAuuADTBNb3/aeje6on3DhU3rpWsQSB1E= github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= github.com/valyala/fastjson v1.6.4 h1:uAUNq9Z6ymTgGhcm0UynUAB6tlbakBrz6CQFax3BXVQ= github.com/valyala/fastjson v1.6.4/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= github.com/vardius/message-bus v1.1.5 h1:YSAC2WB4HRlwc4neFPTmT88kzzoiQ+9WRRbej/E/LZc= github.com/vardius/message-bus v1.1.5/go.mod h1:6xladCV2lMkUAE4bzzS85qKOiB5miV7aBVRafiTJGqw= -github.com/vincent-petithory/dataurl v1.0.0 h1:cXw+kPto8NLuJtlMsI152irrVw9fRDX8AbShPRpg2CI= -github.com/vincent-petithory/dataurl v1.0.0/go.mod h1:FHafX5vmDzyP+1CQATJn7WFKc9CvnvxyvZy6I1MrG/U= github.com/vultr/govultr/v2 v2.17.2 h1:gej/rwr91Puc/tgh+j33p/BLR16UrIPnSr+AIwYWZQs= github.com/vultr/govultr/v2 v2.17.2/go.mod h1:ZFOKGWmgjytfyjeyAdhQlSWwTjh2ig+X49cAp50dzXI= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= +github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= @@ -1029,101 +861,102 @@ go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/collector v0.105.0 h1:Qw/ONVMPT3aD8HjdDRcXCGoZrtSWH3jx4BkwAN1yrEM= -go.opentelemetry.io/collector v0.105.0/go.mod h1:UVapTqB4fJeZpGU/YgOo6665cxCSytqYmMkVmRlu2cg= -go.opentelemetry.io/collector/component v0.105.0 h1:/OdkWHd1xTNX7JRq9iW3AFoJAnYUOGZZyOprNQkGoTI= -go.opentelemetry.io/collector/component v0.105.0/go.mod h1:s8KoxOrhNIBzetkb0LHmzX1OI67DyZbaaUPOWIXS1mg= -go.opentelemetry.io/collector/config/configauth v0.105.0 h1:9Pa65Ay4kdmMsp5mg+/791GvCYy1hHOroIlKBiJzlps= -go.opentelemetry.io/collector/config/configauth v0.105.0/go.mod h1:iL62YzyFCNr1Se0EDYaQ792CFCBiFivSbTWekd4g1VE= -go.opentelemetry.io/collector/config/configcompression v1.12.0 h1:RxqSDVZPJyL7I3v+gdVDvnJ/9tV0ZWgraRDX/gaddfA= -go.opentelemetry.io/collector/config/configcompression v1.12.0/go.mod h1:6+m0GKCv7JKzaumn7u80A2dLNCuYf5wdR87HWreoBO0= -go.opentelemetry.io/collector/config/configgrpc v0.105.0 h1:3IbN6+5c42Bp6CGPKoXZ7QkkQpRxnV01KRse6oD+bd0= -go.opentelemetry.io/collector/config/configgrpc v0.105.0/go.mod h1:wrFPXVXk4so7yYisuPeebZtU6ECzG5aXOYNdfyoHSnI= -go.opentelemetry.io/collector/config/confighttp v0.105.0 h1:0sVdNFuLikgDhxdp+mrbSrYzovwRxZDVIhv9ZQ0X5e4= -go.opentelemetry.io/collector/config/confighttp v0.105.0/go.mod h1:1JMvF8ocjlNxwrVIUJHy9wTEW/nlKs1LLPlTSg4D044= -go.opentelemetry.io/collector/config/confignet v0.105.0 h1:O8kenkWnLPemp2XXVOqFv6OQd9wsnOvBUvl3OlJGPKI= -go.opentelemetry.io/collector/config/confignet v0.105.0/go.mod h1:pfOrCTfSZEB6H2rKtx41/3RN4dKs+X2EKQbw3MGRh0E= -go.opentelemetry.io/collector/config/configopaque v1.12.0 h1:aIsp9NdcLZSiG4YDoFPGXhmma03Tk+6e89+n8GtU/Mc= -go.opentelemetry.io/collector/config/configopaque v1.12.0/go.mod h1:0xURn2sOy5j4fbaocpEYfM97HPGsiffkkVudSPyTJlM= -go.opentelemetry.io/collector/config/configretry v1.12.0 h1:tEBwueO4AIkwWosxz6NWqnghdZ7y5SfHcIzLrvh6kB8= -go.opentelemetry.io/collector/config/configretry v1.12.0/go.mod h1:P+RA0IA+QoxnDn4072uyeAk1RIoYiCbxYsjpKX5eFC4= -go.opentelemetry.io/collector/config/configtelemetry v0.105.0 h1:wEfUxAjjstp47aLr2s1cMZiH0dt+k42m6VC6HigqgJA= -go.opentelemetry.io/collector/config/configtelemetry v0.105.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/config/configtls v1.12.0 h1:Px0+GE4LE/9sXMgkwBb5g8QHWvnrnuRg9BLSa+QtxgM= -go.opentelemetry.io/collector/config/configtls v1.12.0/go.mod h1:aeCGPlvrWhc+EySpIKdelPAj4l9wXKzZPouQO3NIoTs= -go.opentelemetry.io/collector/config/internal v0.105.0 h1:PWnbeslkIGMjZzh5IJRjO6bA02d1Xrkjw2N60ixWzqQ= -go.opentelemetry.io/collector/config/internal v0.105.0/go.mod h1:+Y5vRJ+lio2uuYlVPfy9AZVrip9Y0B9PiUA5Vz7lzZw= -go.opentelemetry.io/collector/confmap v0.105.0 h1:3NP2BbUju42rjeQvRbmpCJGJGvbiV3WnGyXsVmocimo= -go.opentelemetry.io/collector/confmap v0.105.0/go.mod h1:Oj1xUBRvAuL8OWWMj9sSYf1uQpB+AErpj+FKGUQLBI0= -go.opentelemetry.io/collector/confmap/converter/expandconverter v0.105.0 h1:1c81AJg+WP+dGoAEftmc0KF5RK0mh4bxIFlU902CnFI= -go.opentelemetry.io/collector/confmap/converter/expandconverter v0.105.0/go.mod h1:ImkfsdJToeP3ZZ5ZVmQUdaKEueVHiZbwrQGyoDx/EiM= -go.opentelemetry.io/collector/confmap/provider/envprovider v0.105.0 h1:r+5ZxhDLYqd6klLky3gtgWHgG5L2LX6o6VIvaLG39Gs= -go.opentelemetry.io/collector/confmap/provider/envprovider v0.105.0/go.mod h1:Srzkp9izW29pJtwoVtpL+bAN5ibtv+fyLg9JWZzCCi8= -go.opentelemetry.io/collector/confmap/provider/fileprovider v0.105.0 h1:RgQwEbJgx+BihDt8yhiqmEi8IjQYFwbzsYRcTzvM7E4= -go.opentelemetry.io/collector/confmap/provider/fileprovider v0.105.0/go.mod h1:P7oT+6eaMv+ZyPSu6SEKalfR/UALdQgE3hq36b0Iww4= -go.opentelemetry.io/collector/confmap/provider/httpprovider v0.105.0 h1:hgzauRlEZId1AM00g3EHl4GaR4GLG23sdvmSRWQ9iFQ= -go.opentelemetry.io/collector/confmap/provider/httpprovider v0.105.0/go.mod h1:TqZbmLcG9GvLp76q45eE0EwiTHBmj4qRP32fI48DH5Q= -go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.105.0 h1:xQr2I7iQPDkFP/E2H9lg6jfAtpY1iz2oLGEFwa2FaeE= -go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.105.0/go.mod h1:UVTcdI8WhTXl8duc0EkeJU7nSQNptHwE6D/eqgeand0= -go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.105.0 h1:SAF6JFrjQ8YkFnggA5iiw9eKiBYDaO6ynK0Dl+vzIgw= -go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.105.0/go.mod h1:bWMg+SNk/PwEMiLWV0eCFNL4Er59aXsdDKq+2JzMOkE= -go.opentelemetry.io/collector/connector v0.105.0 h1:hmTsI6rnPAXsdVJ+wYrgeNTCrQzxzglU37qPlNSKTy0= -go.opentelemetry.io/collector/connector v0.105.0/go.mod h1:xQnq1Ygd/F4Kb93E0UsKus5YDINeyQ6GzCkxoujI9TE= -go.opentelemetry.io/collector/connector/forwardconnector v0.105.0 h1:e9gvf11xfijwraZLBf3IHXEk1YpXxMoJfqXarYo7ZNU= -go.opentelemetry.io/collector/connector/forwardconnector v0.105.0/go.mod h1:XIeSscBCAcpywFa7oVwTOpdHjRojS7No6Yz34YhFBp4= -go.opentelemetry.io/collector/consumer v0.105.0 h1:pO5Tspoz7yvEs81+904HfDjByP8Z7uuNk+7pOr3lRHM= -go.opentelemetry.io/collector/consumer v0.105.0/go.mod h1:tnaPDHUfKBJ01OnsJNRecniG9iciE+xHYLqamYwFQOQ= -go.opentelemetry.io/collector/exporter v0.105.0 h1:O2xmjfaRbkbpo3XkwEcnuBHCoXc5kS9CjYO8geu+3vo= -go.opentelemetry.io/collector/exporter v0.105.0/go.mod h1:5ulGEHRZyGbX4DWHJa2Br6Fr/W1Lay8ayf++1WrVvgk= -go.opentelemetry.io/collector/exporter/debugexporter v0.105.0 h1:Osqo7+pr1vZbt+12KMzZrst6uMv1r8UJZjTgI6vwqL4= -go.opentelemetry.io/collector/exporter/debugexporter v0.105.0/go.mod h1:rqjWoduh/qj6OlttzdbB8Ji6Vp4SoHJRnZHNuS/Mkp0= -go.opentelemetry.io/collector/exporter/otlpexporter v0.105.0 h1:JWAlh7A1oNm4LqUrrtPjAmUdvcE11VZCeJhMk0lShYg= -go.opentelemetry.io/collector/exporter/otlpexporter v0.105.0/go.mod h1:aA2E+t2giwUoJ2RmDw+2dVox64J2zHpTT2m/mi7zOIM= -go.opentelemetry.io/collector/exporter/otlphttpexporter v0.105.0 h1:ciJvNlC9ztoeyIi23TCpZ6PN7l75tl/yvKqBo0Cmajw= -go.opentelemetry.io/collector/exporter/otlphttpexporter v0.105.0/go.mod h1:e+PdCkQkP+1cj0+cijRfmE4/VjofxeeWoS1cvvu39HI= -go.opentelemetry.io/collector/extension v0.105.0 h1:R8i4HMvuSm20Nt3onyrLk19KKhjCNAsgS8FGh60rcZU= -go.opentelemetry.io/collector/extension v0.105.0/go.mod h1:oyX960URG27esNKitf3o2rqcBj0ajcx+dxkCxwRz34U= -go.opentelemetry.io/collector/extension/auth v0.105.0 h1:5gzRSHU0obVtZDzLLJQ/p4sIkacUsyEEpBiBRDs82Hk= -go.opentelemetry.io/collector/extension/auth v0.105.0/go.mod h1:zf45v7u1nKbdDHeMuhBVdSFwhbq2w9IWCbFKcDSkW5I= -go.opentelemetry.io/collector/extension/ballastextension v0.105.0 h1:JAihRR9cu35lGI6mGvxrwVcUHaPO7n++RaC4oouZics= -go.opentelemetry.io/collector/extension/ballastextension v0.105.0/go.mod h1:2PgAJVYhBDWv3gl/vZ6nblHoVQMrwWheKE+RjXFozdM= -go.opentelemetry.io/collector/extension/zpagesextension v0.105.0 h1:rD77+hMPaSuBOh8w6un+x0VI5oM2oAsSzAC9nKTNauE= -go.opentelemetry.io/collector/extension/zpagesextension v0.105.0/go.mod h1:vDuL/PBfZfHpOyF2XCJ/jWfHn/hu2pCE5KVRGCHOX+k= -go.opentelemetry.io/collector/featuregate v1.12.0 h1:l5WbV2vMQd2bL8ubfGrbKNtZaeJRckE12CTHvRe47Tw= -go.opentelemetry.io/collector/featuregate v1.12.0/go.mod h1:PsOINaGgTiFc+Tzu2K/X2jP+Ngmlp7YKGV1XrnBkH7U= -go.opentelemetry.io/collector/filter v0.105.0 h1:8GVqpSx6RIOQv/SWun9zaQ63sUoqPXrdUJ4D6O13h1s= -go.opentelemetry.io/collector/filter v0.105.0/go.mod h1:wzg7KEZ9h0bqRrMwag0/c+QkZ1pI2VOuQ/ZCfiWkSzw= -go.opentelemetry.io/collector/internal/globalgates v0.105.0 h1:U/CwnTUXtrblD1sZ6ri7KWfYoTNjQd7GjJKrX/phRik= -go.opentelemetry.io/collector/internal/globalgates v0.105.0/go.mod h1:Z5US6O2xkZAtxVSSBnHAPFZwPhFoxlyKLUvS67Vx4gc= -go.opentelemetry.io/collector/otelcol v0.105.0 h1:2YMp/OckEc4qEfIjx3pi7W7xr+nW03KdrdhHAt3NmYY= -go.opentelemetry.io/collector/otelcol v0.105.0/go.mod h1:SwdiOY/0szbyuJ1sDDv66W5nFPVkA9hOhQoEBAFbHA0= -go.opentelemetry.io/collector/otelcol/otelcoltest v0.105.0 h1:9lsIRe8USoagWx5CfAgo/GUzDmNZPMdRpAnrpnh8Ico= -go.opentelemetry.io/collector/otelcol/otelcoltest v0.105.0/go.mod h1:CYkgeMec/MdyT3/lKZNywARgg55cwEEgoSCP5Pm/GLI= -go.opentelemetry.io/collector/pdata v1.12.0 h1:Xx5VK1p4VO0md8MWm2icwC1MnJ7f8EimKItMWw46BmA= -go.opentelemetry.io/collector/pdata v1.12.0/go.mod h1:MYeB0MmMAxeM0hstCFrCqWLzdyeYySim2dG6pDT6nYI= -go.opentelemetry.io/collector/pdata/pprofile v0.105.0 h1:C+Hd7CNcepL/364OBV9f4lHzJil2jQSOxcEM1PFXGDg= -go.opentelemetry.io/collector/pdata/pprofile v0.105.0/go.mod h1:chr7lMJIzyXkccnPRkIPhyXtqLZLSReZYhwsggOGEfg= -go.opentelemetry.io/collector/pdata/testdata v0.105.0 h1:5sPZzanR4nJR3sNQk3MTdArdEZCK0NRAfC29t0Dtf60= -go.opentelemetry.io/collector/pdata/testdata v0.105.0/go.mod h1:NIfgaclQp/M1BZhgyc/7hDWD+/DumC/OMBQVI2KW+N0= -go.opentelemetry.io/collector/processor v0.105.0 h1:LE6wEMWNa3h7eOJLMBm2lA0v6sc2j6Geqv1e3pIWS8Y= -go.opentelemetry.io/collector/processor v0.105.0/go.mod h1:QAvMEtd3k+YhRrnaEgs/8e0UueYonuT8Hg4udQOht60= -go.opentelemetry.io/collector/processor/batchprocessor v0.105.0 h1:j9f7EWmaR6kaQubKE0L3lvZxoIEppRyTAvqLDmp2Jig= -go.opentelemetry.io/collector/processor/batchprocessor v0.105.0/go.mod h1:klVt/0Egd7LSgWyxlSpgNvLMQRaqfUJg7Nv4qdpQOHA= -go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.105.0 h1:qPjFg7uWmsVvf0Kk11WzM6Zy//zNZFC5uFwYKFXlEn8= -go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.105.0/go.mod h1:0pgvBY04E2bRq5dY3Qfj66mKpkFnu252FNm7iiFEiAU= -go.opentelemetry.io/collector/receiver v0.105.0 h1:eZF97kMUnKJ20Uc4PaDlgLIGmaA8kyLqhH+vMXjh92U= -go.opentelemetry.io/collector/receiver v0.105.0/go.mod h1:nGKDXLUGVHxMBJ5QLfsJ/bIhGvoMGqsN0pZtD5SC8sE= -go.opentelemetry.io/collector/receiver/nopreceiver v0.105.0 h1:zl8YjvbDd9vdcuKSKIaaAPxeWS/Vsa7SadkRxYyxs3Q= -go.opentelemetry.io/collector/receiver/nopreceiver v0.105.0/go.mod h1:+HlcvNdW/FrXZCir5K/DtTcZkRfmAtoy2v+CNG+HFAI= -go.opentelemetry.io/collector/receiver/otlpreceiver v0.105.0 h1:1qjnvrnDcEaj93WgyrWRWTTAGNODaxi98wNcXiHDwfM= -go.opentelemetry.io/collector/receiver/otlpreceiver v0.105.0/go.mod h1:XGs9OAQQFDfVhSzruLcFNdzhTw2kbZZAV68iRE9ecGA= -go.opentelemetry.io/collector/semconv v0.105.0 h1:8p6dZ3JfxFTjbY38d8xlQGB1TQ3nPUvs+D0RERniZ1g= -go.opentelemetry.io/collector/semconv v0.105.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= -go.opentelemetry.io/collector/service v0.105.0 h1:93dqJVNKToEvYDYZO2pHrN8f6Uev4+xhzzmw4qwgAzE= -go.opentelemetry.io/collector/service v0.105.0/go.mod h1:H0fD5SZjV2AZTgHEjRhObnP8YrhG2etAh9rsWLtmimQ= +go.opentelemetry.io/collector v0.108.1 h1:c3JZU5g5KezDXaMgL7GDFB7ihuLNzXo6eBuaJOmBiDA= +go.opentelemetry.io/collector v0.108.1/go.mod h1:7GL32WiQkZzJjxHstHme9igzYumDsw1hFPep3v1guHQ= +go.opentelemetry.io/collector/client v1.14.1 h1:UiBhFP07YbZlv3fW2D/Xi0DrEMRGw2QB1DLV2JiJEis= +go.opentelemetry.io/collector/client v1.14.1/go.mod h1:a8A6aWydaeiItFzY0zlHO/Q6mLNnZsW0Y/iVxbJsO4A= +go.opentelemetry.io/collector/component v0.108.1 h1:X+Afj07brX0NC36t6PvAq+ehaeUO/Q9eJNOUwhInpeY= +go.opentelemetry.io/collector/component v0.108.1/go.mod h1:qrP2TiJT5qw4sSiAKne+gb+hb1qTixLXuQRZjMCnLjY= +go.opentelemetry.io/collector/component/componentprofiles v0.108.1 h1:u+lWWyhGvbcqG39QkV/JbcoTILpWdmnRilFeM5o6790= +go.opentelemetry.io/collector/component/componentprofiles v0.108.1/go.mod h1:abcl/NfiyaGjWIGMoUUZrzpEiDYGvwd/2rKt/1jdSYg= +go.opentelemetry.io/collector/component/componentstatus v0.108.1 h1:63B7/TsZ1wIT+JFopOAAvyM8GaWDyJQncQ/G12HR334= +go.opentelemetry.io/collector/component/componentstatus v0.108.1/go.mod h1:PAJmG8ip5gvEtJ9uPpLtVmwnxtjA8t4MmEbzg6nQxVs= +go.opentelemetry.io/collector/config/configauth v0.108.1 h1:If0hRGyfDbC9Y80CYcLBKeSdY7BXcs98r7gPJlzH5uU= +go.opentelemetry.io/collector/config/configauth v0.108.1/go.mod h1:8P3fOkwwP7k09xaTKmu7MrMgTZmMXtWdUrJQgjhy3a4= +go.opentelemetry.io/collector/config/configcompression v1.14.1 h1:YiNlBSeyDaFWrDPFpMJ7y7XlWYMDV0bh8GwO9ukXNa8= +go.opentelemetry.io/collector/config/configcompression v1.14.1/go.mod h1:pnxkFCLUZLKWzYJvfSwZnPrnm0twX14CYj2ADth5xiU= +go.opentelemetry.io/collector/config/configgrpc v0.108.1 h1:kkG/xQUpSdz1utywrxPD6Ohlw65VxUbyrzXAzNAyWX0= +go.opentelemetry.io/collector/config/configgrpc v0.108.1/go.mod h1:QcI3Q17+Bh2PX0hdgpWzk7S8qLsICoUV1VzLeXHsKOw= +go.opentelemetry.io/collector/config/confighttp v0.108.1 h1:+KRFQfm0W2NHEtNMa1UuXvXvBX6B/2CTBvJk6Zi3Jhk= +go.opentelemetry.io/collector/config/confighttp v0.108.1/go.mod h1:iqdC0Gljy2U7HDX3a7pZlAH2EI3TNhFWyoVwc9R16XE= +go.opentelemetry.io/collector/config/confignet v0.108.1 h1:gmcJI8136JZ0201v0BfGlHcFBxLNy09mGLPUr+GyfHU= +go.opentelemetry.io/collector/config/confignet v0.108.1/go.mod h1:o3v4joAEjvLwntqexg5ixMqRrU1+Vst+jWuCUaBNgOg= +go.opentelemetry.io/collector/config/configopaque v1.14.1 h1:5xAEa4ld+57xWKdU2gR5/6+rBa7LTCPfShJQFUxN0Zw= +go.opentelemetry.io/collector/config/configopaque v1.14.1/go.mod h1:6zlLIyOoRpJJ+0bEKrlZOZon3rOp5Jrz9fMdR4twOS4= +go.opentelemetry.io/collector/config/configretry v1.14.1 h1:kJBpb/1GGKktEa6taf4TgfFY34JD4WpCFVq9by+VWyU= +go.opentelemetry.io/collector/config/configretry v1.14.1/go.mod h1:KvQF5cfphq1rQm1dKR4eLDNQYw6iI2fY72NMZVa+0N0= +go.opentelemetry.io/collector/config/configtelemetry v0.108.1 h1:jjdH1R6FMz4l1nSvY7F3H0F09xW9LKTke7k3ZAPcmSU= +go.opentelemetry.io/collector/config/configtelemetry v0.108.1/go.mod h1:R0MBUxjSMVMIhljuDHWIygzzJWQyZHXXWIgQNxcFwhc= +go.opentelemetry.io/collector/config/configtls v1.14.1 h1:cd5kNvLnIe+GVHUV6Fk6O5fkwS4at8dVCrFo7t0O8kE= +go.opentelemetry.io/collector/config/configtls v1.14.1/go.mod h1:StxglrVWeRIFaqc2hpsF9xSsv2A5MOAx5GhG4WjFuP4= +go.opentelemetry.io/collector/config/internal v0.108.1 h1:Z/U8+UpvGT2DZ64/kp/nlosJgjCkhZ7MaEqQ3QHudyo= +go.opentelemetry.io/collector/config/internal v0.108.1/go.mod h1:tRaaE2CNdXE3lUQcIBGJkdBPSGYY3Taa6DzkWmxmgzk= +go.opentelemetry.io/collector/confmap v1.14.1 h1:GPMa+q5ThiBFQaYKJ7xeomiw9tIokkTA1AiF1zwKJck= +go.opentelemetry.io/collector/confmap v1.14.1/go.mod h1:GrIZ12P/9DPOuTpe2PIS51a0P/ZM6iKtByVee1Uf3+k= +go.opentelemetry.io/collector/confmap/provider/envprovider v0.108.1 h1:Y6NsaeHnRaptyDzThK7SesFsBJm6A8FlEymYnezuEC0= +go.opentelemetry.io/collector/confmap/provider/envprovider v0.108.1/go.mod h1:1LFEe1dy5EuSPOq2nUmodFo3JnJOme5+TxtsPPLgfRA= +go.opentelemetry.io/collector/confmap/provider/fileprovider v0.108.1 h1:EyRKaxRe8A+5JU0vYPeNqj260dguUzaFkrh63PKkGk8= +go.opentelemetry.io/collector/confmap/provider/fileprovider v0.108.1/go.mod h1:3Vl2shpuWraLK7ydsVjDiZuPGxDs+F54/NBLFun0EaU= +go.opentelemetry.io/collector/confmap/provider/httpprovider v0.108.1 h1:1qPMc5TEL/J/80y7mmc0sZCPpurW2E6uJrzUDKpNMMQ= +go.opentelemetry.io/collector/confmap/provider/httpprovider v0.108.1/go.mod h1:Knp6z1C2fHWO58AG4gas+1du+rWQfV4mr4G5ttQEa7g= +go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.106.1 h1:Gp6myh0Y10m49t0qGNutiU1P98izVMU0sFgvDDSedkg= +go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.106.1/go.mod h1:Au11b7ZJ8aoVhfdptChXAzOGXMtDn/LZG+QbjuGF498= +go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.108.1 h1:SeSLl88erP2+S1fc0Z2VP/HMXWxunfoNSemhOOw0xKI= +go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.108.1/go.mod h1:ozOtsxcQXrVndGjNwzsXcWfo0+dpBtHmL7bMrPE2EIM= +go.opentelemetry.io/collector/connector v0.108.1 h1:+5QvgQrMRtA8//Io+6BsgP7kl3IIjKiiI/bFDvKM56Y= +go.opentelemetry.io/collector/connector v0.108.1/go.mod h1:jIoTENAyA+BqkzqlttJK3cAehZ1WpbyTM87i/N6t1pc= +go.opentelemetry.io/collector/consumer v0.108.1 h1:75zHUpIDfgZMp3t9fYdpXXE6/wsBs9DwTZdfwS3+NDI= +go.opentelemetry.io/collector/consumer v0.108.1/go.mod h1:xu2pOTqK+uCFXZWd9RcU8s6sCRwK5GyuP64YuHLMzzA= +go.opentelemetry.io/collector/consumer/consumerprofiles v0.108.1 h1:inFvEN7nB9ECFUjJzv+TsylCM8r1ocqOUrnNVdkMkZo= +go.opentelemetry.io/collector/consumer/consumerprofiles v0.108.1/go.mod h1:F6Shxg3TqoDZe2+p2PkVRUsnJMqATQxbs4c1nfaJrAc= +go.opentelemetry.io/collector/consumer/consumertest v0.108.1 h1:WLvi27Vu5nkltjhmdN+pDO9EuRphYpOQxoqZ9A3RkKU= +go.opentelemetry.io/collector/consumer/consumertest v0.108.1/go.mod h1:tRqOtUukG76iBlPTAUwFSU87dDO+x33Gyn2x9mecfko= +go.opentelemetry.io/collector/exporter v0.108.1 h1:VjtbIwwR2B1GMf69FxVvwcKYIpbkC7v2wBxLt5vjYKI= +go.opentelemetry.io/collector/exporter v0.108.1/go.mod h1:nD32bomG/yYyqwTZQJFIhRhP++bbk+3oqlx+/RZZ6XY= +go.opentelemetry.io/collector/exporter/debugexporter v0.108.1 h1:jjNGlvpAw3wRPIf7ki32kh6IHlfY7ReigrryIR5xE2Y= +go.opentelemetry.io/collector/exporter/debugexporter v0.108.1/go.mod h1:xifiJIj4BJhq/dXKJC7XuTuigodlnNoJOpEv/BuFEqI= +go.opentelemetry.io/collector/exporter/otlpexporter v0.108.1 h1:F98du/pF9urH5X+bG+DexUWEoDtnqE7qLZz0EuOV6VY= +go.opentelemetry.io/collector/exporter/otlpexporter v0.108.1/go.mod h1:oBiaaT6tVjmKtuCugEwq72b5CQlZoUJIkux4wf2iPY4= +go.opentelemetry.io/collector/exporter/otlphttpexporter v0.108.1 h1:4I6Fy6RiPHR61qj3YApq8Sqs4jII4LasaTSBJvKZTok= +go.opentelemetry.io/collector/exporter/otlphttpexporter v0.108.1/go.mod h1:RYfIKn1td/NKshPiaBDFFvOKqSKI92HldHVoXmrsW3I= +go.opentelemetry.io/collector/extension v0.108.1 h1:XNQ9bOegD38gktyLJXlGN2Wb6AbiBi2nAuiOIdg+zA0= +go.opentelemetry.io/collector/extension v0.108.1/go.mod h1:fZE5j4jL9XVbm4H53gj9y/VDhP/5assmZ4yU0EwSjBc= +go.opentelemetry.io/collector/extension/auth v0.108.1 h1:h1kuC5Lvzxb3LcShUXdVHjh+PpqX/Kpd2ypNObwxH0s= +go.opentelemetry.io/collector/extension/auth v0.108.1/go.mod h1:QLvy/dJdiPEhUbkhqIythMoVnZxmvbzeA2Wnm4oZSgU= +go.opentelemetry.io/collector/extension/zpagesextension v0.108.1 h1:OH250Z/bXJTZjkeMwUERbLZiNPETlOxE3q4n536Kc4s= +go.opentelemetry.io/collector/extension/zpagesextension v0.108.1/go.mod h1:3QSnFvGq5jXXwSPi94x2ggBGPZxdtD0lxpPOpV3RZRc= +go.opentelemetry.io/collector/featuregate v1.14.1 h1:5jvlRe1b5FqhGsyYtuwrzNhFLthGCfm98b3PsCRgXDA= +go.opentelemetry.io/collector/featuregate v1.14.1/go.mod h1:47xrISO71vJ83LSMm8+yIDsUbKktUp48Ovt7RR6VbRs= +go.opentelemetry.io/collector/filter v0.108.1 h1:ufGbKhP8v7weLrfLWlR0nVLdyW9yvsSpWtkCwv7CNE0= +go.opentelemetry.io/collector/filter v0.108.1/go.mod h1:iNMJ4W+R9LUqr8uyeEIthuOKVEQBMYS32ePBza3Ofbk= +go.opentelemetry.io/collector/internal/globalgates v0.108.1 h1:mzSR+psDtEdxwWBQP/e5ZSovPswU+fG5ctvWNvQ6MiU= +go.opentelemetry.io/collector/internal/globalgates v0.108.1/go.mod h1:N3Ha+6JNawEoxVP35MKHnQtKW9zGa6XY/h/9rF96ZZg= +go.opentelemetry.io/collector/otelcol v0.108.1 h1:fp9AplsVClzuF/iKO5LBZjswmybA1pfVujxWBfQ9OsA= +go.opentelemetry.io/collector/otelcol v0.108.1/go.mod h1:8QIMB1AsnRJiHBOcLN+jD20rBP8J0dY/7dCAZVP979c= +go.opentelemetry.io/collector/otelcol/otelcoltest v0.108.1 h1:hgno9ZIHXDa5O76MTjcZpc/HIaS3dh+Ou70kO/p/0bs= +go.opentelemetry.io/collector/otelcol/otelcoltest v0.108.1/go.mod h1:XFUp8EA7YVU1Reww/8+bGDCe1CMI1GoEZU3609ps3j4= +go.opentelemetry.io/collector/pdata v1.14.1 h1:wXZjtQA7Vy5HFqco+yA95ENyMQU5heBB1IxMHQf6mUk= +go.opentelemetry.io/collector/pdata v1.14.1/go.mod h1:z1dTjwwtcoXxZx2/nkHysjxMeaxe9pEmYTEr4SMNIx8= +go.opentelemetry.io/collector/pdata/pprofile v0.108.1 h1:/XbunfZ+/jt1+d1p4zM4vZ/AgeaIJsayjYdlN1fV+tk= +go.opentelemetry.io/collector/pdata/pprofile v0.108.1/go.mod h1:/GvG2WcN9Dajlw4QaIOjgz7N32wSfPL3qxJ0BKOcVPo= +go.opentelemetry.io/collector/pdata/testdata v0.108.1 h1:TpBDoBMBYvC/Ibswe3Ec2eof8XrRrEec6+tfnTeTSGk= +go.opentelemetry.io/collector/pdata/testdata v0.108.1/go.mod h1:PdUmBA4yDRD4Wf0fpCyrpdZexz9EDoHBw5Ot4iIUPRs= +go.opentelemetry.io/collector/processor v0.108.1 h1:Mly4umNdYxqANdd3WfGS0XAttx2wPWaFdAL83Gbkch8= +go.opentelemetry.io/collector/processor v0.108.1/go.mod h1:KO37fWaj20BNCffVeVm2PePuMqskgkfMmgOscs9FUtk= +go.opentelemetry.io/collector/processor/batchprocessor v0.108.1 h1:k9/wCno/wANKo6BUAMYX38T0cTwfAPCXPhRYEmLFM4E= +go.opentelemetry.io/collector/processor/batchprocessor v0.108.1/go.mod h1:kz+awzRB4CwMtydQd0L/64ahQk/sr6SOdfVHMFDtT5E= +go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.108.1 h1:GA+W2wyB/6MpBfZV7qH04j4UVyrdkVLe90Jvhphnbjw= +go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.108.1/go.mod h1:zxNwmjxwDT1wG8gN9Y3pOk/3GvKxfPgRWEvHusjn5j8= +go.opentelemetry.io/collector/receiver v0.108.1 h1:YQgDv69v3fgd6uoiGZ+vUdUPdNzoodbLzjB7XfdQvxs= +go.opentelemetry.io/collector/receiver v0.108.1/go.mod h1:eKe/VJgdvHr8JsBDma/PF3DlaheTRC2X6AmCUByJCNU= +go.opentelemetry.io/collector/receiver/otlpreceiver v0.108.1 h1:Y8A/yom8XazaL+122oPWn/IzLOROv2tu4Z2sbRn5VNk= +go.opentelemetry.io/collector/receiver/otlpreceiver v0.108.1/go.mod h1:uD5KYTBzza4RUor93zHFmJDab5kJiGWpYI8ZKzcyv0I= +go.opentelemetry.io/collector/semconv v0.108.1 h1:Txk9tauUnamZaxS5vlf1O0uZ4VD6nioRBR0nX8L/fU4= +go.opentelemetry.io/collector/semconv v0.108.1/go.mod h1:zCJ5njhWpejR+A40kiEoeFm1xq1uzyZwMnRNX6/D82A= +go.opentelemetry.io/collector/service v0.108.1 h1:Ov0qP5JiX0DHaCrZY0jHnpqc8MVHwSZKdZHpCfSJVUQ= +go.opentelemetry.io/collector/service v0.108.1/go.mod h1:mbZXlO5gT99nXNGbDOG6peqPd6og5Tm49P4FP0oi56U= go.opentelemetry.io/contrib/config v0.8.0 h1:OD7aDMhL+2EpzdSHfkDmcdD/uUA+PgKM5faFyF9XFT0= go.opentelemetry.io/contrib/config v0.8.0/go.mod h1:dGeVZWE//3wrxYHHP0iCBYJU1QmOmPcbV+FNB7pjDYI= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0 h1:9G6E0TXzGFVfTnawRzrPl83iHOAV7L8NJiR8RSGYV1g= @@ -1136,8 +969,6 @@ go.opentelemetry.io/contrib/zpages v0.53.0 h1:hGgaJ3nrescxEk383gOBHA5gNfoquHs8oV go.opentelemetry.io/contrib/zpages v0.53.0/go.mod h1:iOo8fpUxMAu5+4x9DSEQeUOCeY19KaN6v2OPSeIggz4= go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo= go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4= -go.opentelemetry.io/otel/bridge/opencensus v1.28.0 h1:/BcyAV1bUJjSVxoeKwTQL9cS4X1iC6izZ9mheeuVSCU= -go.opentelemetry.io/otel/bridge/opencensus v1.28.0/go.mod h1:FZp2xE+46yAyp3DfLFALze58nY0iIE8zs+mCgkPAzq0= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.4.0 h1:zBPZAISA9NOc5cE8zydqDiS0itvg/P/0Hn9m72a5gvM= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.4.0/go.mod h1:gcj2fFjEsqpV3fXuzAA+0Ze1p2/4MJ4T7d77AmkvueQ= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.28.0 h1:U2guen0GhqH8o/G2un8f/aG/y++OuW6MyCo6hT9prXk= @@ -1196,11 +1027,10 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= -golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30= -golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M= +golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw= +golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1251,7 +1081,6 @@ golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -1262,51 +1091,38 @@ golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210224082022-3d97a244fca7/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= -golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys= -golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE= +golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE= +golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.21.0 h1:tsimM75w1tF/uws5rbeHzIWxEqElMehnc+iW793zsZs= -golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.22.0 h1:BzDx2FehcG7jJwgWLELCdmLuxk2i+x9UDpSiss2u0ZA= +golang.org/x/oauth2 v0.22.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= +golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1330,7 +1146,6 @@ golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1339,24 +1154,13 @@ golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1375,8 +1179,8 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= -golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg= +golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -1385,8 +1189,8 @@ golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= -golang.org/x/term v0.22.0 h1:BbsgPEJULsl2fV/AT3v15Mjva5yXKQDyKf+TbDz7QJk= -golang.org/x/term v0.22.0/go.mod h1:F3qCibpT5AMpCRfhfT53vVJwhLtIVHhB9XDjfFvnMI4= +golang.org/x/term v0.23.0 h1:F6D4vR+EHoL9/sWAWgAR1H2DcHr4PareCbAaCo1RpuU= +golang.org/x/term v0.23.0/go.mod h1:DgV24QBUrK6jhZXl+20l6UWznPlwAHm1Q1mGHtydmSk= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1399,14 +1203,15 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= -golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc= +golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U= +golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -1439,19 +1244,9 @@ golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= @@ -1462,8 +1257,8 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gonum.org/v1/gonum v0.15.0 h1:2lYxjRbTYyxkJxlhC+LvJIx3SsANPdRybu1tGj9/OrQ= -gonum.org/v1/gonum v0.15.0/go.mod h1:xzZVBJBtS+Mz4q0Yl2LJTk+OxOg4jiXZ7qBoM0uISGo= +gonum.org/v1/gonum v0.15.1 h1:FNy7N6OUZVUaWG9pTiD+jlhdQ3lMP+/LcTpJ6+a8sQ0= +gonum.org/v1/gonum v0.15.1/go.mod h1:eZTZuRFrzu5pcyjN5wJhcIhnUdNijYxX1T2IcrOGY0o= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -1473,21 +1268,14 @@ google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsb google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.183.0 h1:PNMeRDwo1pJdgNcFQ9GstuLe/noWKIc89pRWRLMvLwE= -google.golang.org/api v0.183.0/go.mod h1:q43adC5/pHoSZTx5h2mSmdF7NcyfW9JuDyIOJAgS9ZQ= +google.golang.org/api v0.188.0 h1:51y8fJ/b1AaaBRJr4yWm96fPcuxSo0JcegXE3DaHQHw= +google.golang.org/api v0.188.0/go.mod h1:VR0d+2SIiWOYG3r/jdm7adPW9hI2aRv9ETOSCQ9Beag= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -1505,23 +1293,13 @@ google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvx google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto/googleapis/api v0.0.0-20240701130421-f6361c86f094 h1:0+ozOGcrp+Y8Aq8TLNN2Aliibms5LEzsq99ZZmAGYm0= -google.golang.org/genproto/googleapis/api v0.0.0-20240701130421-f6361c86f094/go.mod h1:fJ/e3If/Q67Mj99hin0hMhiNyCRmt6BQ2aWIJshUSJw= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240711142825-46eb208f015d h1:JU0iKnSg02Gmb5ZdV8nYsKEKsP6o/FGVWTrw4i1DA9A= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240711142825-46eb208f015d/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY= +google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142 h1:wKguEg1hsxI2/L3hUYrpo1RVi48K+uTyzKqprwLXsb8= +google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142/go.mod h1:d6be+8HhtEtucleCbxpPW9PA9XwISACu8nvpPqF0BVo= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 h1:e7S5W7MGGLaSu8j3YjdezkZ+m1/Nm0uRVRMEMGk26Xs= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -1530,10 +1308,7 @@ google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQ google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc= google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ= @@ -1545,7 +1320,6 @@ google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzi google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= @@ -1559,6 +1333,8 @@ gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSPG+6V4= +gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= @@ -1571,15 +1347,12 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= -gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -1588,33 +1361,29 @@ honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= k8s.io/api v0.21.1/go.mod h1:FstGROTmsSHBarKc8bylzXih8BLNYTiS3TZcsoEDg2s= -k8s.io/api v0.29.3 h1:2ORfZ7+bGC3YJqGpV0KSDDEVf8hdGQ6A03/50vj8pmw= -k8s.io/api v0.29.3/go.mod h1:y2yg2NTyHUUkIoTC+phinTnEa3KFM6RZ3szxt014a80= +k8s.io/api v0.31.0 h1:b9LiSjR2ym/SzTOlfMHm1tr7/21aD7fSkqgD/CVJBCo= +k8s.io/api v0.31.0/go.mod h1:0YiFF+JfFxMM6+1hQei8FY8M7s1Mth+z/q7eF1aJkTE= k8s.io/apimachinery v0.21.1/go.mod h1:jbreFvJo3ov9rj7eWT7+sYiRx+qZuCYXwWT1bcDswPY= -k8s.io/apimachinery v0.29.3 h1:2tbx+5L7RNvqJjn7RIuIKu9XTsIZ9Z5wX2G22XAa5EU= -k8s.io/apimachinery v0.29.3/go.mod h1:hx/S4V2PNW4OMg3WizRrHutyB5la0iCUbZym+W0EQIU= +k8s.io/apimachinery v0.31.0 h1:m9jOiSr3FoSSL5WO9bjm1n6B9KROYYgNZOb4tyZ1lBc= +k8s.io/apimachinery v0.31.0/go.mod h1:rsPdaZJfTfLsNJSQzNHQvYoTmxhoOEofxtOsF3rtsMo= k8s.io/client-go v0.21.1/go.mod h1:/kEw4RgW+3xnBGzvp9IWxKSNA+lXn3A7AuH3gdOAzLs= -k8s.io/client-go v0.29.3 h1:R/zaZbEAxqComZ9FHeQwOh3Y1ZUs7FaHKZdQtIc2WZg= -k8s.io/client-go v0.29.3/go.mod h1:tkDisCvgPfiRpxGnOORfkljmS+UrW+WtXAy2fTvXJB0= +k8s.io/client-go v0.31.0 h1:QqEJzNjbN2Yv1H79SsS+SWnXkBgVu4Pj3CJQgbx0gI8= +k8s.io/client-go v0.31.0/go.mod h1:Y9wvC76g4fLjmU0BA+rV+h2cncoadjvjjkkIGoTLcGU= k8s.io/code-generator v0.21.1/go.mod h1:hUlps5+9QaTrKx+jiM4rmq7YmH8wPOIko64uZCHDh6Q= k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.8.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= -k8s.io/klog/v2 v2.120.1 h1:QXU6cPEOIslTGvZaXvFWiP9VKyeet3sawzTOvdXb4Vw= -k8s.io/klog/v2 v2.120.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= +k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= +k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7/go.mod h1:wXW5VT87nVfh/iLV8FpR2uDvrFyomxbtb1KivDbvPTE= k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 h1:BZqlfIlq5YbRMFko6/PM7FjZpUb45WallggurYhKGag= k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98= -k8s.io/kubelet v0.29.3 h1:X9h0ZHzc+eUeNTaksbN0ItHyvGhQ7Z0HPjnQD2oHdwU= -k8s.io/kubelet v0.29.3/go.mod h1:jDiGuTkFOUynyBKzOoC1xRSWlgAZ9UPcTYeFyjr6vas= k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20240502163921-fe8a2dddb1d0 h1:jgGTlFYnhF1PM1Ax/lAlxUPE+KfCIXHaathvJg1C3ak= -k8s.io/utils v0.0.0-20240502163921-fe8a2dddb1d0/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= +k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1J8+AsQnQCKsi8A= +k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= diff --git a/internal/collector/factories.go b/internal/collector/factories.go index 31d88bcbeb..df3a431f64 100644 --- a/internal/collector/factories.go +++ b/internal/collector/factories.go @@ -9,28 +9,10 @@ import ( nginxreceiver "github.com/nginx/agent/v3/internal/collector/nginxossreceiver" "github.com/nginx/agent/v3/internal/collector/nginxplusreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector" - "github.com/open-telemetry/opentelemetry-collector-contrib/connector/exceptionsconnector" - "github.com/open-telemetry/opentelemetry-collector-contrib/connector/grafanacloudconnector" - "github.com/open-telemetry/opentelemetry-collector-contrib/connector/routingconnector" - "github.com/open-telemetry/opentelemetry-collector-contrib/connector/servicegraphconnector" - "github.com/open-telemetry/opentelemetry-collector-contrib/connector/spanmetricsconnector" "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension" - "github.com/open-telemetry/opentelemetry-collector-contrib/extension/asapauthextension" - "github.com/open-telemetry/opentelemetry-collector-contrib/extension/awsproxy" - "github.com/open-telemetry/opentelemetry-collector-contrib/extension/basicauthextension" - "github.com/open-telemetry/opentelemetry-collector-contrib/extension/bearertokenauthextension" "github.com/open-telemetry/opentelemetry-collector-contrib/extension/headerssetterextension" "github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension" - "github.com/open-telemetry/opentelemetry-collector-contrib/extension/httpforwarderextension" - "github.com/open-telemetry/opentelemetry-collector-contrib/extension/oauth2clientauthextension" - "github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/dockerobserver" - "github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/hostobserver" - "github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/k8sobserver" - "github.com/open-telemetry/opentelemetry-collector-contrib/extension/oidcauthextension" "github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension" - "github.com/open-telemetry/opentelemetry-collector-contrib/extension/sigv4authextension" "github.com/open-telemetry/opentelemetry-collector-contrib/processor/attributesprocessor" "github.com/open-telemetry/opentelemetry-collector-contrib/processor/cumulativetodeltaprocessor" "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatorateprocessor" @@ -49,24 +31,9 @@ import ( "github.com/open-telemetry/opentelemetry-collector-contrib/processor/spanprocessor" "github.com/open-telemetry/opentelemetry-collector-contrib/processor/tailsamplingprocessor" "github.com/open-telemetry/opentelemetry-collector-contrib/processor/transformprocessor" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/bigipreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/dockerstatsreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/filelogreceiver" "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/httpcheckreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sclusterreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8seventsreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sobjectsreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kubeletstatsreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/podmanreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/simpleprometheusreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/syslogreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/tcplogreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/udplogreceiver" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/connector" - "go.opentelemetry.io/collector/connector/forwardconnector" "go.opentelemetry.io/collector/exporter" "go.opentelemetry.io/collector/exporter/debugexporter" "go.opentelemetry.io/collector/exporter/otlpexporter" @@ -77,7 +44,6 @@ import ( "go.opentelemetry.io/collector/processor/batchprocessor" "go.opentelemetry.io/collector/processor/memorylimiterprocessor" "go.opentelemetry.io/collector/receiver" - "go.opentelemetry.io/collector/receiver/nopreceiver" "go.opentelemetry.io/collector/receiver/otlpreceiver" ) @@ -123,36 +89,16 @@ func OTelComponentFactories() (otelcol.Factories, error) { } func createConnectorFactories() (map[component.Type]connector.Factory, error) { - connectorsList := []connector.Factory{ - forwardconnector.NewFactory(), - countconnector.NewFactory(), - exceptionsconnector.NewFactory(), - grafanacloudconnector.NewFactory(), - routingconnector.NewFactory(), - servicegraphconnector.NewFactory(), - spanmetricsconnector.NewFactory(), - } + connectorsList := []connector.Factory{} return connector.MakeFactoryMap(connectorsList...) } func createExtensionFactories() (map[component.Type]extension.Factory, error) { extensionsList := []extension.Factory{ - ackextension.NewFactory(), - asapauthextension.NewFactory(), - awsproxy.NewFactory(), - basicauthextension.NewFactory(), - bearertokenauthextension.NewFactory(), - dockerobserver.NewFactory(), headerssetterextension.NewFactory(), healthcheckextension.NewFactory(), - hostobserver.NewFactory(), - httpforwarderextension.NewFactory(), - k8sobserver.NewFactory(), - oauth2clientauthextension.NewFactory(), - oidcauthextension.NewFactory(), pprofextension.NewFactory(), - sigv4authextension.NewFactory(), } return extension.MakeFactoryMap(extensionsList...) @@ -160,24 +106,9 @@ func createExtensionFactories() (map[component.Type]extension.Factory, error) { func createReceiverFactories() (map[component.Type]receiver.Factory, error) { receiverList := []receiver.Factory{ - nopreceiver.NewFactory(), otlpreceiver.NewFactory(), - bigipreceiver.NewFactory(), - dockerstatsreceiver.NewFactory(), - filelogreceiver.NewFactory(), hostmetricsreceiver.NewFactory(), - httpcheckreceiver.NewFactory(), - k8sclusterreceiver.NewFactory(), - k8seventsreceiver.NewFactory(), - k8sobjectsreceiver.NewFactory(), - kubeletstatsreceiver.NewFactory(), nginxreceiver.NewFactory(), - podmanreceiver.NewFactory(), - prometheusreceiver.NewFactory(), - simpleprometheusreceiver.NewFactory(), - syslogreceiver.NewFactory(), - tcplogreceiver.NewFactory(), - udplogreceiver.NewFactory(), nginxplusreceiver.NewFactory(), } diff --git a/internal/collector/factories_test.go b/internal/collector/factories_test.go index 8751143340..5cefda51eb 100644 --- a/internal/collector/factories_test.go +++ b/internal/collector/factories_test.go @@ -17,9 +17,9 @@ func TestOTelComponentFactories(t *testing.T) { require.NoError(t, err, "OTelComponentFactories should not return an error") assert.NotNil(t, factories, "factories should not be nil") - assert.Len(t, factories.Receivers, 19) + assert.Len(t, factories.Receivers, 4) assert.Len(t, factories.Processors, 20) assert.Len(t, factories.Exporters, 4) - assert.Len(t, factories.Extensions, 15) - assert.Len(t, factories.Connectors, 7) + assert.Len(t, factories.Extensions, 3) + assert.Empty(t, factories.Connectors) } diff --git a/internal/collector/settings.go b/internal/collector/settings.go index ad438a1c10..a4314401d1 100644 --- a/internal/collector/settings.go +++ b/internal/collector/settings.go @@ -13,7 +13,6 @@ import ( "github.com/nginx/agent/v3/internal/config" "go.opentelemetry.io/collector/confmap" - "go.opentelemetry.io/collector/confmap/converter/expandconverter" "go.opentelemetry.io/collector/confmap/provider/envprovider" "go.opentelemetry.io/collector/confmap/provider/fileprovider" "go.opentelemetry.io/collector/confmap/provider/httpprovider" @@ -65,9 +64,7 @@ func createProviderFactories() []confmap.ProviderFactory { } func createConverterFactories() []confmap.ConverterFactory { - converterConfig := []confmap.ConverterFactory{ - expandconverter.NewFactory(), - } + converterConfig := []confmap.ConverterFactory{} return converterConfig } diff --git a/internal/collector/settings_test.go b/internal/collector/settings_test.go index ddb05fc369..5932dc141e 100644 --- a/internal/collector/settings_test.go +++ b/internal/collector/settings_test.go @@ -42,7 +42,7 @@ func TestConfigProviderSettings(t *testing.T) { assert.NotNil(t, settings.ResolverSettings, "ResolverSettings should not be nil") assert.Len(t, settings.ResolverSettings.ProviderFactories, 5, "There should be 5 provider factories") - assert.Len(t, settings.ResolverSettings.ConverterFactories, 1, "There should be 1 converter factory") + assert.Empty(t, settings.ResolverSettings.ConverterFactories, "There should be 0 converter factory") assert.NotEmpty(t, settings.ResolverSettings.URIs, "URIs should not be empty") assert.Equal(t, "/etc/nginx-agent/nginx-agent-otelcol.yaml", settings.ResolverSettings.URIs[0], "Default URI should match") diff --git a/internal/datasource/host/exec/exec.go b/internal/datasource/host/exec/exec.go index 209c6a0c76..8a160e2635 100644 --- a/internal/datasource/host/exec/exec.go +++ b/internal/datasource/host/exec/exec.go @@ -14,7 +14,7 @@ import ( "syscall" "github.com/nginx/agent/v3/api/grpc/mpi/v1" - "github.com/shirou/gopsutil/v3/host" + "github.com/shirou/gopsutil/v4/host" ) //go:generate go run github.com/maxbrunsfeld/counterfeiter/v6@v6.8.1 -generate diff --git a/internal/watcher/health/nginx_health_watcher_operator.go b/internal/watcher/health/nginx_health_watcher_operator.go index e664c71dbd..b97882959c 100644 --- a/internal/watcher/health/nginx_health_watcher_operator.go +++ b/internal/watcher/health/nginx_health_watcher_operator.go @@ -11,7 +11,7 @@ import ( "fmt" "strings" - "github.com/shirou/gopsutil/v3/process" + "github.com/shirou/gopsutil/v4/process" mpi "github.com/nginx/agent/v3/api/grpc/mpi/v1" "github.com/nginx/agent/v3/internal/datasource/host/exec" diff --git a/internal/watcher/process/process_operator.go b/internal/watcher/process/process_operator.go index 3463907799..510b08ebb0 100644 --- a/internal/watcher/process/process_operator.go +++ b/internal/watcher/process/process_operator.go @@ -11,7 +11,7 @@ import ( "strings" "github.com/nginx/agent/v3/internal/model" - "github.com/shirou/gopsutil/v3/process" + "github.com/shirou/gopsutil/v4/process" ) //go:generate go run github.com/maxbrunsfeld/counterfeiter/v6@v6.8.1 -generate diff --git a/test/integration/grpc_management_plane_api_test.go b/test/integration/grpc_management_plane_api_test.go index ef4c2047df..df9127a52d 100644 --- a/test/integration/grpc_management_plane_api_test.go +++ b/test/integration/grpc_management_plane_api_test.go @@ -72,7 +72,6 @@ func setupConnectionTest(tb testing.TB, expectNoErrorsInLogs bool) func(tb testi containerNetwork, err := network.New( ctx, - network.WithCheckDuplicate(), network.WithAttachable(), ) require.NoError(tb, err) From 1922d79a41bd594303448039f6cfeeb8f44d48d0 Mon Sep 17 00:00:00 2001 From: Donal Hurley Date: Tue, 10 Sep 2024 11:49:03 +0100 Subject: [PATCH 04/24] Add OTel collector log file (#806) --- internal/collector/otel_collector_plugin.go | 13 ++++++++- .../collector/otel_collector_plugin_test.go | 7 +++++ internal/collector/otelcol.tmpl | 7 +++++ internal/collector/settings_test.go | 2 +- internal/config/config.go | 28 ++++++++++++++++++- internal/config/config_test.go | 6 +++- internal/config/defaults.go | 4 ++- internal/config/flags.go | 3 ++ internal/config/types.go | 1 + scripts/testing/load/Dockerfile | 2 +- ...> test-opentelemetry-collector-agent.yaml} | 5 ++++ test/types/config.go | 4 +++ 12 files changed, 76 insertions(+), 6 deletions(-) rename test/config/collector/{test-otelcol.yaml => test-opentelemetry-collector-agent.yaml} (86%) diff --git a/internal/collector/otel_collector_plugin.go b/internal/collector/otel_collector_plugin.go index e7750d5041..ae94fa8d51 100644 --- a/internal/collector/otel_collector_plugin.go +++ b/internal/collector/otel_collector_plugin.go @@ -9,6 +9,7 @@ import ( "errors" "fmt" "log/slog" + "os" "strings" "time" @@ -19,7 +20,10 @@ import ( "go.opentelemetry.io/collector/otelcol" ) -const maxTimeToWaitForShutdown = 30 * time.Second +const ( + maxTimeToWaitForShutdown = 30 * time.Second + filePermission = 0o600 +) type ( // Collector The OTel collector plugin start an embedded OTel collector for metrics collection in the OTel format. @@ -43,6 +47,13 @@ func New(conf *config.Config) (*Collector, error) { return nil, errors.New("nil collector config") } + if conf.Collector.Log != nil && conf.Collector.Log.Path != "" { + err := os.WriteFile(conf.Collector.Log.Path, []byte{}, filePermission) + if err != nil { + return nil, err + } + } + settings := OTelCollectorSettings(conf) oTelCollector, err := otelcol.NewCollector(settings) if err != nil { diff --git a/internal/collector/otel_collector_plugin_test.go b/internal/collector/otel_collector_plugin_test.go index 5af979ba5b..45e5298954 100644 --- a/internal/collector/otel_collector_plugin_test.go +++ b/internal/collector/otel_collector_plugin_test.go @@ -23,12 +23,16 @@ import ( func TestCollector_New(t *testing.T) { conf := types.OTelConfig(t) + conf.Collector.Log.Path = "" + _, err := New(conf) require.NoError(t, err, "NewCollector should not return an error with valid config") } func TestCollector_InitAndClose(t *testing.T) { conf := types.OTelConfig(t) + conf.Collector.Log.Path = "" + collector, err := New(conf) require.NoError(t, err, "NewCollector should not return an error with valid config") @@ -62,6 +66,7 @@ func TestCollector_Process(t *testing.T) { defer nginxPlusMock.Close() conf := types.OTelConfig(t) + conf.Collector.Log.Path = "" tests := []struct { name string @@ -184,6 +189,7 @@ func TestCollector_Process(t *testing.T) { // nolint: dupl func TestCollector_updateExistingNginxOSSReceiver(t *testing.T) { conf := types.OTelConfig(t) + conf.Collector.Log.Path = "" tests := []struct { name string @@ -270,6 +276,7 @@ func TestCollector_updateExistingNginxOSSReceiver(t *testing.T) { // nolint: dupl func TestCollector_updateExistingNginxPlusReceiver(t *testing.T) { conf := types.OTelConfig(t) + conf.Collector.Log.Path = "" tests := []struct { name string diff --git a/internal/collector/otelcol.tmpl b/internal/collector/otelcol.tmpl index 82f7b42f25..77106ecb88 100644 --- a/internal/collector/otelcol.tmpl +++ b/internal/collector/otelcol.tmpl @@ -87,6 +87,13 @@ extensions: {{- end }} service: + {{- if .Log.Path}} + telemetry: + logs: + level: {{ .Log.Level }} + output_paths: ["{{ .Log.Path -}}"] + error_output_paths: ["{{ .Log.Path -}}"] + {{- end}} extensions: - health_check pipelines: diff --git a/internal/collector/settings_test.go b/internal/collector/settings_test.go index 5932dc141e..23ac064adc 100644 --- a/internal/collector/settings_test.go +++ b/internal/collector/settings_test.go @@ -17,7 +17,7 @@ import ( ) const ( - expectedTemplatePath = "../../test/config/collector/test-otelcol.yaml" + expectedTemplatePath = "../../test/config/collector/test-opentelemetry-collector-agent.yaml" // The log format's double quotes must be escaped so that valid YAML is produced when executing the template. accessLogFormat = `$remote_addr - $remote_user [$time_local] \"$request\" $status $body_bytes_sent ` + `\"$http_referer\" \"$http_user_agent\" \"$http_x_forwarded_for\"\"$upstream_cache_status\"` diff --git a/internal/config/config.go b/internal/config/config.go index 3231c320ea..ab083f1612 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -124,7 +124,7 @@ func registerFlags() { "info", `The desired verbosity level for logging messages from nginx-agent. Available options, in order of severity from highest to lowest, are: - panic, fatal, error, info, debug, and trace.`, + panic, fatal, error, info and debug.`, ) fs.String( LogPathKey, @@ -215,6 +215,21 @@ func registerFlags() { "The path to the Opentelemetry Collector configuration file.", ) + fs.String( + CollectorLogLevelKey, + DefCollectorLogLevel, + `The desired verbosity level for logging messages from nginx-agent OTel collector. + Available options, in order of severity from highest to lowest, are: + ERROR, WARN, INFO and DEBUG.`, + ) + + fs.String( + CollectorLogPathKey, + DefCollectorLogPath, + `The path to output OTel collector log messages to. + If the default path doesn't exist, log messages are output to stdout/stderr.`, + ) + fs.Int( ClientMaxMessageSizeKey, DefMaxMessageSize, @@ -334,6 +349,7 @@ func resolveCollector(allowedDirs []string) (*Collector, error) { processors []Processor receivers Receivers healthCheck ServerConfig + log Log ) err = errors.Join( @@ -342,17 +358,27 @@ func resolveCollector(allowedDirs []string) (*Collector, error) { resolveMapStructure(CollectorProcessorsKey, &processors), resolveMapStructure(CollectorReceiversKey, &receivers), resolveMapStructure(CollectorHealthKey, &healthCheck), + resolveMapStructure(CollectorLogKey, &log), ) if err != nil { return nil, fmt.Errorf("unmarshal collector config: %w", err) } + if log.Level == "" { + log.Level = DefCollectorLogLevel + } + + if log.Path == "" { + log.Path = DefCollectorLogPath + } + col := &Collector{ ConfigPath: viperInstance.GetString(CollectorConfigPathKey), Exporters: exporters, Processors: processors, Receivers: receivers, Health: &healthCheck, + Log: &log, } err = col.Validate(allowedDirs) diff --git a/internal/config/config_test.go b/internal/config/config_test.go index 1155f8e633..0d491b2c6e 100644 --- a/internal/config/config_test.go +++ b/internal/config/config_test.go @@ -221,12 +221,12 @@ func TestResolveCollector(t *testing.T) { for _, test := range tests { t.Run(test.name, func(t *testing.T) { viperInstance = viper.NewWithOptions(viper.KeyDelimiter(KeyDelimiter)) - viperInstance.Set(CollectorRootKey, "set") viperInstance.Set(CollectorConfigPathKey, test.expected.ConfigPath) viperInstance.Set(CollectorReceiversKey, test.expected.Receivers) viperInstance.Set(CollectorProcessorsKey, test.expected.Processors) viperInstance.Set(CollectorExportersKey, test.expected.Exporters) viperInstance.Set(CollectorHealthKey, test.expected.Health) + viperInstance.Set(CollectorLogKey, test.expected.Log) actual, err := resolveCollector(testDefault.AllowedDirectories) if test.shouldErr { @@ -399,6 +399,10 @@ func getAgentConfig() *Config { Port: 1337, Type: 0, }, + Log: &Log{ + Level: "INFO", + Path: "/var/log/nginx-agent/opentelemetry-collector-agent.log", + }, }, Command: &Command{ Server: &ServerConfig{ diff --git a/internal/config/defaults.go b/internal/config/defaults.go index 2c8202953f..0b9aedf310 100644 --- a/internal/config/defaults.go +++ b/internal/config/defaults.go @@ -14,7 +14,9 @@ const ( DefNginxReloadMonitoringPeriod = 10 * time.Second DefTreatErrorsAsWarnings = true - DefCollectorConfigPath = "/var/run/nginx-agent/otelcol.yaml" + DefCollectorConfigPath = "/var/run/nginx-agent/opentelemetry-collector-agent.yaml" + DefCollectorLogLevel = "INFO" + DefCollectorLogPath = "/var/log/nginx-agent/opentelemetry-collector-agent.log" DefConfigDirectories = "/etc/nginx:/usr/local/etc/nginx:/usr/share/nginx/modules" DefCommandServerHostKey = "" diff --git a/internal/config/flags.go b/internal/config/flags.go index d99804734e..83f132c0cb 100644 --- a/internal/config/flags.go +++ b/internal/config/flags.go @@ -36,6 +36,9 @@ var ( CollectorProcessorsKey = pre(CollectorRootKey) + "processors" CollectorHealthKey = pre(CollectorRootKey) + "health" CollectorReceiversKey = pre(CollectorRootKey) + "receivers" + CollectorLogKey = pre(CollectorRootKey) + "log" + CollectorLogLevelKey = pre(CollectorLogKey) + "level" + CollectorLogPathKey = pre(CollectorLogKey) + "path" CommandAuthKey = pre(CommandRootKey) + "auth" CommandAuthTokenKey = pre(CommandAuthKey) + "token" CommandServerHostKey = pre(CommandServerKey) + "host" diff --git a/internal/config/types.go b/internal/config/types.go index 8ba347909a..1be4f6a377 100644 --- a/internal/config/types.go +++ b/internal/config/types.go @@ -86,6 +86,7 @@ type ( Collector struct { ConfigPath string `yaml:"-" mapstructure:"config_path"` + Log *Log `yaml:"-" mapstructure:"log"` Exporters []Exporter `yaml:"-" mapstructure:"exporters"` Health *ServerConfig `yaml:"-" mapstructure:"health"` Processors []Processor `yaml:"-" mapstructure:"processors"` diff --git a/scripts/testing/load/Dockerfile b/scripts/testing/load/Dockerfile index e3c602dfbd..c4fd26a277 100644 --- a/scripts/testing/load/Dockerfile +++ b/scripts/testing/load/Dockerfile @@ -80,7 +80,7 @@ ENV PATH="/usr/local/go/bin:${PATH}" ENV PATH=$PATH:/usr/local/go/bin RUN mv /agent/test/config/agent/nginx-agent-otel-load.conf /agent/test/load/nginx-agent.conf -RUN mkdir /var/run/nginx-agent/ +RUN mkdir /var/run/nginx-agent/ /var/log/nginx-agent/ WORKDIR /agent/ CMD make install-tools diff --git a/test/config/collector/test-otelcol.yaml b/test/config/collector/test-opentelemetry-collector-agent.yaml similarity index 86% rename from test/config/collector/test-otelcol.yaml rename to test/config/collector/test-opentelemetry-collector-agent.yaml index 415ad452f4..e13c3c3254 100644 --- a/test/config/collector/test-otelcol.yaml +++ b/test/config/collector/test-opentelemetry-collector-agent.yaml @@ -49,6 +49,11 @@ extensions: endpoint: "localhost:1337" service: + telemetry: + logs: + level: INFO + output_paths: ["/var/log/nginx-agent/opentelemetry-collector-agent.log"] + error_output_paths: ["/var/log/nginx-agent/opentelemetry-collector-agent.log"] extensions: - health_check pipelines: diff --git a/test/types/config.go b/test/types/config.go index d3034cbdea..0be2fdf2f7 100644 --- a/test/types/config.go +++ b/test/types/config.go @@ -81,6 +81,10 @@ func AgentConfig() *config.Config { Port: randomPort3, Type: 0, }, + Log: &config.Log{ + Level: "INFO", + Path: "/var/log/nginx-agent/opentelemetry-collector-agent.log", + }, }, Command: &config.Command{ Server: &config.ServerConfig{ From 6d80aac5e0f1737c3fda86d75a708ac1d44cc4e4 Mon Sep 17 00:00:00 2001 From: Donal Hurley Date: Tue, 10 Sep 2024 13:09:39 +0100 Subject: [PATCH 05/24] Updated NGINX Plus receiver logging to use OTel collector logger (#830) --- .../collector/nginxplusreceiver/factory.go | 6 +++-- .../collector/nginxplusreceiver/scraper.go | 26 ++++++++++--------- internal/collector/otel_collector_plugin.go | 1 + 3 files changed, 19 insertions(+), 14 deletions(-) diff --git a/internal/collector/nginxplusreceiver/factory.go b/internal/collector/nginxplusreceiver/factory.go index 4d218b5ee4..3ae579b56d 100644 --- a/internal/collector/nginxplusreceiver/factory.go +++ b/internal/collector/nginxplusreceiver/factory.go @@ -8,7 +8,6 @@ import ( "context" "errors" "fmt" - "log/slog" "time" "go.opentelemetry.io/collector/component" @@ -52,7 +51,10 @@ func createMetricsReceiver( rConf component.Config, metricsConsumer consumer.Metrics, ) (receiver.Metrics, error) { - slog.DebugContext(ctx, "Creating new NGINX Plus metrics receiver") + logger := params.Logger.Sugar() + + logger.Info("Creating new NGINX Plus metrics receiver") + cfg, ok := rConf.(*Config) if !ok { return nil, errors.New("failed to cast to Config in NGINX Plus metrics receiver") diff --git a/internal/collector/nginxplusreceiver/scraper.go b/internal/collector/nginxplusreceiver/scraper.go index 7d9ebd46de..2f863c6466 100644 --- a/internal/collector/nginxplusreceiver/scraper.go +++ b/internal/collector/nginxplusreceiver/scraper.go @@ -7,10 +7,11 @@ package nginxplusreceiver import ( "context" "fmt" - "log/slog" "strconv" "time" + "go.uber.org/zap" + "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/pmetric" @@ -34,10 +35,10 @@ const ( type nginxPlusScraper struct { plusClient *plusapi.NginxClient - - settings component.TelemetrySettings - cfg *Config - mb *metadata.MetricsBuilder + settings component.TelemetrySettings + cfg *Config + mb *metadata.MetricsBuilder + logger *zap.Logger } func newNginxPlusScraper( @@ -58,23 +59,24 @@ func newNginxPlusScraper( settings: settings.TelemetrySettings, cfg: cfg, mb: mb, + logger: settings.Logger, }, nil } -func (nps *nginxPlusScraper) scrape(ctx context.Context) (pmetric.Metrics, error) { +func (nps *nginxPlusScraper) scrape(_ context.Context) (pmetric.Metrics, error) { stats, err := nps.plusClient.GetStats() if err != nil { return pmetric.Metrics{}, fmt.Errorf("GET stats: %w", err) } - slog.DebugContext(ctx, "NGINX Plus stats", "stats", stats) + nps.logger.Debug("NGINX Plus stats", zap.Any("stats", stats)) - nps.recordMetrics(ctx, stats) + nps.recordMetrics(stats) return nps.mb.Emit(), nil } -func (nps *nginxPlusScraper) recordMetrics(ctx context.Context, stats *plusapi.Stats) { +func (nps *nginxPlusScraper) recordMetrics(stats *plusapi.Stats) { now := pcommon.NewTimestampFromTime(time.Now()) // NGINX config reloads @@ -107,7 +109,7 @@ func (nps *nginxPlusScraper) recordMetrics(ctx context.Context, stats *plusapi.S nps.recordLocationZoneMetrics(stats, now) nps.recordServerZoneMetrics(stats, now) nps.recordHTTPUpstreamPeerMetrics(stats, now) - nps.recordSlabPageMetrics(ctx, stats, now) + nps.recordSlabPageMetrics(stats, now) nps.recordSSLMetrics(now, stats) nps.recordStreamMetrics(stats, now) } @@ -421,7 +423,7 @@ func (nps *nginxPlusScraper) recordSSLMetrics(now pcommon.Timestamp, stats *plus ) } -func (nps *nginxPlusScraper) recordSlabPageMetrics(ctx context.Context, stats *plusapi.Stats, now pcommon.Timestamp) { +func (nps *nginxPlusScraper) recordSlabPageMetrics(stats *plusapi.Stats, now pcommon.Timestamp) { for name, slab := range stats.Slabs { nps.mb.RecordNginxSlabPageFreeDataPoint(now, int64(slab.Pages.Free), name) nps.mb.RecordNginxSlabPageUsageDataPoint(now, int64(slab.Pages.Used), name) @@ -429,7 +431,7 @@ func (nps *nginxPlusScraper) recordSlabPageMetrics(ctx context.Context, stats *p for slotName, slot := range slab.Slots { slotNumber, err := strconv.ParseInt(slotName, 10, 64) if err != nil { - slog.WarnContext(ctx, "Invalid slot name for NGINX Plus slab metrics", "error", err) + nps.logger.Warn("Invalid slot name for NGINX Plus slab metrics", zap.Error(err)) } nps.mb.RecordNginxSlabSlotUsageDataPoint(now, int64(slot.Used), slotNumber, name) diff --git a/internal/collector/otel_collector_plugin.go b/internal/collector/otel_collector_plugin.go index ae94fa8d51..c3a53d09c3 100644 --- a/internal/collector/otel_collector_plugin.go +++ b/internal/collector/otel_collector_plugin.go @@ -87,6 +87,7 @@ func (oc *Collector) Init(ctx context.Context, mp bus.MessagePipeInterface) erro } func (oc *Collector) bootup(ctx context.Context) error { + slog.InfoContext(ctx, "Starting OTel collector") errChan := make(chan error) go func() { From a248fb66b5cae5def130b362c8ee74ff4c12163c Mon Sep 17 00:00:00 2001 From: Donal Hurley Date: Wed, 11 Sep 2024 09:00:34 +0100 Subject: [PATCH 06/24] Change process parser log level (#832) --- internal/watcher/instance/nginx_process_parser.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/internal/watcher/instance/nginx_process_parser.go b/internal/watcher/instance/nginx_process_parser.go index b8ec1e1038..f4dd768c99 100644 --- a/internal/watcher/instance/nginx_process_parser.go +++ b/internal/watcher/instance/nginx_process_parser.go @@ -289,7 +289,7 @@ func getNginxPrefix(ctx context.Context, nginxInfo *Info) string { var ok bool prefix, ok = nginxInfo.ConfigureArgs["prefix"].(string) if !ok { - slog.WarnContext(ctx, "Failed to cast nginxInfo prefix to string") + slog.DebugContext(ctx, "Failed to cast nginxInfo prefix to string") } } else { prefix = "/usr/local/nginx" @@ -305,7 +305,7 @@ func getNginxConfPath(ctx context.Context, nginxInfo *Info) string { var ok bool confPath, ok = nginxInfo.ConfigureArgs["conf-path"].(string) if !ok { - slog.WarnContext(ctx, "failed to cast nginxInfo conf-path to string") + slog.DebugContext(ctx, "failed to cast nginxInfo conf-path to string") } } else { confPath = path.Join(nginxInfo.Prefix, "/conf/nginx.conf") @@ -328,12 +328,12 @@ func getLoadableModules(nginxInfo *Info) (modules []string) { if mp, ok := nginxInfo.ConfigureArgs["modules-path"]; ok { modulePath, pathOK := mp.(string) if !pathOK { - slog.Warn("Error parsing modules-path") + slog.Debug("Error parsing modules-path") return modules } modules, err = readDirectory(modulePath, ".so") if err != nil { - slog.Warn("Error reading module dir", "dir", modulePath, "error", err) + slog.Debug("Error reading module dir", "dir", modulePath, "error", err) return modules } From f10642d0955368bf85eb480b07a8d312d2b69fed Mon Sep 17 00:00:00 2001 From: Christopher van de Sande Date: Wed, 11 Sep 2024 11:02:40 +0100 Subject: [PATCH 07/24] Add check for expired GPG key --- Makefile.packaging | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Makefile.packaging b/Makefile.packaging index 0da10364cd..64726ffc35 100644 --- a/Makefile.packaging +++ b/Makefile.packaging @@ -195,6 +195,13 @@ build-signed-packager: gpg-key: ## Generate GPG public key $$(gpg --import $(NFPM_SIGNING_KEY_FILE)); \ keyid=$$(gpg --list-keys NGINX | egrep -A1 "^pub" | egrep -v "^pub" | tr -d '[:space:]'); \ + if [ -z "$$keyid" ]; then echo "Error: GPG key not found."; exit 1; fi; \ + # Check if the key is expired \ + # Look for the 'e' (expired) flag in the 'pub' or 'uid' lines \ + if gpg --list-keys --with-colons "$$keyid" | grep -E '^pub:e:|^uid:e:'; then \ + echo "Error: GPG key has expired."; \ + exit 1; \ + fi; \ expiry=1y; \ $$(gpg --quick-set-expire $$keyid $$expiry '*'); \ # we need to convert the private gpg key to rsa pem format for pkg signing \ From b064cf94c60794e08c6e39b0cbadd6c0335b4a5a Mon Sep 17 00:00:00 2001 From: Sean Breen Date: Fri, 13 Sep 2024 13:20:01 +0100 Subject: [PATCH 08/24] don't run validation when ConfigApply rolls back after a file actions error --- internal/file/file_plugin.go | 22 +++++++++++++--------- internal/file/file_plugin_test.go | 5 ++++- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/internal/file/file_plugin.go b/internal/file/file_plugin.go index 88096e74be..c4292773b3 100644 --- a/internal/file/file_plugin.go +++ b/internal/file/file_plugin.go @@ -198,16 +198,20 @@ func (fp *FilePlugin) handleConfigApplyRequest(ctx context.Context, msg *bus.Mes configApplyRequest.GetOverview().GetConfigVersion().GetInstanceId(), err.Error(), ) - fp.messagePipe.Process(ctx, &bus.Message{Topic: bus.DataPlaneResponseTopic, Data: response}) - fp.handleConfigApplyFailedRequest(ctx, &bus.Message{ - Topic: bus.ConfigApplyFailedTopic, - Data: &model.ConfigApplyMessage{ - CorrelationID: correlationID, - InstanceID: configApplyRequest.GetOverview().GetConfigVersion().GetInstanceId(), - Error: err, - }, - }) + + err := fp.fileManagerService.Rollback(ctx, configApplyRequest.GetOverview().GetConfigVersion().GetInstanceId()) + if err != nil { + rollbackResponse := fp.createDataPlaneResponse( + correlationID, + mpi.CommandResponse_COMMAND_STATUS_ERROR, + "Rollback failed", + configApplyRequest.GetOverview().GetConfigVersion().GetInstanceId(), + err.Error()) + + fp.messagePipe.Process(ctx, &bus.Message{Topic: bus.DataPlaneResponseTopic, Data: rollbackResponse}) + fp.fileManagerService.ClearCache() + } return case model.OK: diff --git a/internal/file/file_plugin_test.go b/internal/file/file_plugin_test.go index 7497d60536..508d414e72 100644 --- a/internal/file/file_plugin_test.go +++ b/internal/file/file_plugin_test.go @@ -169,8 +169,11 @@ func TestFilePlugin_Process_ConfigApplyRequestTopic(t *testing.T) { _, ok := messages[0].Data.(*model.ConfigApplyMessage) assert.True(t, ok) case test.configApplyStatus == model.RollbackRequired: + for _, m := range messages { + fmt.Println(m) + } assert.Equal(t, bus.DataPlaneResponseTopic, messages[0].Topic) - assert.Len(t, messages, 2) + assert.Len(t, messages, 1) dataPlaneResponse, ok := messages[0].Data.(*mpi.DataPlaneResponse) assert.True(t, ok) assert.Equal( From b86a9125f34c946af97b15ec12e95872e381337c Mon Sep 17 00:00:00 2001 From: Sean Breen Date: Fri, 13 Sep 2024 13:31:01 +0100 Subject: [PATCH 09/24] fix lint error: err shadows earlier declaration --- internal/file/file_plugin.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/file/file_plugin.go b/internal/file/file_plugin.go index c4292773b3..69243439d4 100644 --- a/internal/file/file_plugin.go +++ b/internal/file/file_plugin.go @@ -200,7 +200,7 @@ func (fp *FilePlugin) handleConfigApplyRequest(ctx context.Context, msg *bus.Mes ) fp.messagePipe.Process(ctx, &bus.Message{Topic: bus.DataPlaneResponseTopic, Data: response}) - err := fp.fileManagerService.Rollback(ctx, configApplyRequest.GetOverview().GetConfigVersion().GetInstanceId()) + err = fp.fileManagerService.Rollback(ctx, configApplyRequest.GetOverview().GetConfigVersion().GetInstanceId()) if err != nil { rollbackResponse := fp.createDataPlaneResponse( correlationID, From 493f2f6eebcd8f41f36df3c09233d873842b8eed Mon Sep 17 00:00:00 2001 From: Sean Breen Date: Fri, 13 Sep 2024 13:36:47 +0100 Subject: [PATCH 10/24] remove print statement from test --- internal/file/file_plugin_test.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/internal/file/file_plugin_test.go b/internal/file/file_plugin_test.go index 508d414e72..a26d2ef32a 100644 --- a/internal/file/file_plugin_test.go +++ b/internal/file/file_plugin_test.go @@ -169,9 +169,6 @@ func TestFilePlugin_Process_ConfigApplyRequestTopic(t *testing.T) { _, ok := messages[0].Data.(*model.ConfigApplyMessage) assert.True(t, ok) case test.configApplyStatus == model.RollbackRequired: - for _, m := range messages { - fmt.Println(m) - } assert.Equal(t, bus.DataPlaneResponseTopic, messages[0].Topic) assert.Len(t, messages, 1) dataPlaneResponse, ok := messages[0].Data.(*mpi.DataPlaneResponse) From 91c9cc6f33bc89d3146b3e64ff5fbcf719718c23 Mon Sep 17 00:00:00 2001 From: Sean Breen Date: Fri, 13 Sep 2024 14:08:48 +0100 Subject: [PATCH 11/24] send failure message before clearing cache --- internal/file/file_plugin.go | 18 ++++++++++++++---- internal/file/file_plugin_test.go | 2 +- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/internal/file/file_plugin.go b/internal/file/file_plugin.go index 69243439d4..6034d42e22 100644 --- a/internal/file/file_plugin.go +++ b/internal/file/file_plugin.go @@ -191,6 +191,7 @@ func (fp *FilePlugin) handleConfigApplyRequest(ctx context.Context, msg *bus.Mes "instance_id", configApplyRequest.GetOverview().GetConfigVersion().GetInstanceId(), "error", err, ) + response = fp.createDataPlaneResponse( correlationID, mpi.CommandResponse_COMMAND_STATUS_ERROR, @@ -200,19 +201,28 @@ func (fp *FilePlugin) handleConfigApplyRequest(ctx context.Context, msg *bus.Mes ) fp.messagePipe.Process(ctx, &bus.Message{Topic: bus.DataPlaneResponseTopic, Data: response}) - err = fp.fileManagerService.Rollback(ctx, configApplyRequest.GetOverview().GetConfigVersion().GetInstanceId()) - if err != nil { + rollbackErr := fp.fileManagerService.Rollback(ctx, configApplyRequest.GetOverview().GetConfigVersion().GetInstanceId()) + if rollbackErr != nil { rollbackResponse := fp.createDataPlaneResponse( correlationID, mpi.CommandResponse_COMMAND_STATUS_ERROR, "Rollback failed", configApplyRequest.GetOverview().GetConfigVersion().GetInstanceId(), - err.Error()) + rollbackErr.Error()) fp.messagePipe.Process(ctx, &bus.Message{Topic: bus.DataPlaneResponseTopic, Data: rollbackResponse}) - fp.fileManagerService.ClearCache() } + response = fp.createDataPlaneResponse( + correlationID, + mpi.CommandResponse_COMMAND_STATUS_FAILURE, + "Rollback failed", + configApplyRequest.GetOverview().GetConfigVersion().GetInstanceId(), + err.Error()) + + fp.messagePipe.Process(ctx, &bus.Message{Topic: bus.DataPlaneResponseTopic, Data: response}) + fp.fileManagerService.ClearCache() + return case model.OK: // Send WriteConfigSuccessfulTopic with Correlation and Instance ID for use by resource plugin diff --git a/internal/file/file_plugin_test.go b/internal/file/file_plugin_test.go index a26d2ef32a..7497d60536 100644 --- a/internal/file/file_plugin_test.go +++ b/internal/file/file_plugin_test.go @@ -170,7 +170,7 @@ func TestFilePlugin_Process_ConfigApplyRequestTopic(t *testing.T) { assert.True(t, ok) case test.configApplyStatus == model.RollbackRequired: assert.Equal(t, bus.DataPlaneResponseTopic, messages[0].Topic) - assert.Len(t, messages, 1) + assert.Len(t, messages, 2) dataPlaneResponse, ok := messages[0].Data.(*mpi.DataPlaneResponse) assert.True(t, ok) assert.Equal( From 70a78e78322b1211e5c28a02b003dd92b389c7f6 Mon Sep 17 00:00:00 2001 From: aphralG <108004222+aphralG@users.noreply.github.com> Date: Fri, 13 Sep 2024 14:09:07 +0100 Subject: [PATCH 12/24] Check error in file watcher (#837) --- .../internal/metadata/generated_status.go | 3 +-- .../internal/metadata/generated_status.go | 3 +-- internal/watcher/file/file_watcher_service.go | 6 +++++- internal/watcher/file/file_watcher_service_test.go | 14 ++++++++++++++ 4 files changed, 21 insertions(+), 5 deletions(-) diff --git a/internal/collector/nginxossreceiver/internal/metadata/generated_status.go b/internal/collector/nginxossreceiver/internal/metadata/generated_status.go index 3eb166a1ad..f4cd74a5e4 100644 --- a/internal/collector/nginxossreceiver/internal/metadata/generated_status.go +++ b/internal/collector/nginxossreceiver/internal/metadata/generated_status.go @@ -7,8 +7,7 @@ import ( ) var ( - Type = component.MustNewType("nginx") - ScopeName = "otelcol/nginxreceiver" + Type = component.MustNewType("nginx") ) const ( diff --git a/internal/collector/nginxplusreceiver/internal/metadata/generated_status.go b/internal/collector/nginxplusreceiver/internal/metadata/generated_status.go index 96f453b98a..feb047ea22 100644 --- a/internal/collector/nginxplusreceiver/internal/metadata/generated_status.go +++ b/internal/collector/nginxplusreceiver/internal/metadata/generated_status.go @@ -7,8 +7,7 @@ import ( ) var ( - Type = component.MustNewType("nginxplus") - ScopeName = "otelcol/nginxplusreceiver" + Type = component.MustNewType("nginxplus") ) const ( diff --git a/internal/watcher/file/file_watcher_service.go b/internal/watcher/file/file_watcher_service.go index d92da5a5f8..49fb039f84 100644 --- a/internal/watcher/file/file_watcher_service.go +++ b/internal/watcher/file/file_watcher_service.go @@ -110,8 +110,12 @@ func (fws *FileWatcherService) watchDirectories(ctx context.Context) { slog.DebugContext(ctx, "Creating file watchers", "directory", dir) - err := filepath.Walk(dir, func(path string, info os.FileInfo, err error) error { + err := filepath.Walk(dir, func(path string, info os.FileInfo, fileWalkErr error) error { + if fileWalkErr != nil { + return fileWalkErr + } fws.addWatcher(ctx, path, info) + return nil }) if err != nil { diff --git a/internal/watcher/file/file_watcher_service_test.go b/internal/watcher/file/file_watcher_service_test.go index e2d36b9d25..8595c8b4a5 100644 --- a/internal/watcher/file/file_watcher_service_test.go +++ b/internal/watcher/file/file_watcher_service_test.go @@ -6,12 +6,16 @@ package file import ( + "bytes" "context" "os" "path" + "strings" "testing" "time" + "github.com/nginx/agent/v3/test/stub" + "github.com/fsnotify/fsnotify" "github.com/nginx/agent/v3/test/types" "github.com/stretchr/testify/assert" @@ -116,6 +120,16 @@ func TestFileWatcherService_removeWatcher(t *testing.T) { value, ok := fileWatcherService.directoriesBeingWatched.Load(testDirectory) assert.Nil(t, value) assert.False(t, ok) + + logBuf := &bytes.Buffer{} + stub.StubLoggerWith(logBuf) + + fileWatcherService.directoriesBeingWatched.Store(testDirectory, true) + fileWatcherService.removeWatcher(ctx, testDirectory) + + if s := logBuf.String(); !strings.Contains(s, "Failed to remove file watcher") { + t.Errorf("Unexpected log %s", s) + } } func TestFileWatcherService_isEventSkippable(t *testing.T) { From 97c153b19c049e373d1133f441eae750283ae2ed Mon Sep 17 00:00:00 2001 From: Sean Breen Date: Fri, 13 Sep 2024 14:18:16 +0100 Subject: [PATCH 13/24] fix lint error: line too long --- internal/file/file_plugin.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/internal/file/file_plugin.go b/internal/file/file_plugin.go index 6034d42e22..400dd0c7a4 100644 --- a/internal/file/file_plugin.go +++ b/internal/file/file_plugin.go @@ -201,7 +201,11 @@ func (fp *FilePlugin) handleConfigApplyRequest(ctx context.Context, msg *bus.Mes ) fp.messagePipe.Process(ctx, &bus.Message{Topic: bus.DataPlaneResponseTopic, Data: response}) - rollbackErr := fp.fileManagerService.Rollback(ctx, configApplyRequest.GetOverview().GetConfigVersion().GetInstanceId()) + rollbackErr := fp.fileManagerService.Rollback( + ctx, + configApplyRequest.GetOverview().GetConfigVersion().GetInstanceId(), + ) + if rollbackErr != nil { rollbackResponse := fp.createDataPlaneResponse( correlationID, From f6df19fa2bab8b0e41129e5565fb901bc6eeaba9 Mon Sep 17 00:00:00 2001 From: Sean Breen Date: Fri, 13 Sep 2024 15:54:08 +0100 Subject: [PATCH 14/24] return COMMAND_STATUS_FAILURE --- internal/file/file_plugin.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/internal/file/file_plugin.go b/internal/file/file_plugin.go index 400dd0c7a4..fc80e32c69 100644 --- a/internal/file/file_plugin.go +++ b/internal/file/file_plugin.go @@ -205,25 +205,25 @@ func (fp *FilePlugin) handleConfigApplyRequest(ctx context.Context, msg *bus.Mes ctx, configApplyRequest.GetOverview().GetConfigVersion().GetInstanceId(), ) - if rollbackErr != nil { rollbackResponse := fp.createDataPlaneResponse( correlationID, - mpi.CommandResponse_COMMAND_STATUS_ERROR, - "Rollback failed", + mpi.CommandResponse_COMMAND_STATUS_FAILURE, + "Config apply failed, rollback failed", configApplyRequest.GetOverview().GetConfigVersion().GetInstanceId(), rollbackErr.Error()) - fp.messagePipe.Process(ctx, &bus.Message{Topic: bus.DataPlaneResponseTopic, Data: rollbackResponse}) + fp.fileManagerService.ClearCache() + + return } response = fp.createDataPlaneResponse( correlationID, mpi.CommandResponse_COMMAND_STATUS_FAILURE, - "Rollback failed", + "Config apply failed, rollback success", configApplyRequest.GetOverview().GetConfigVersion().GetInstanceId(), err.Error()) - fp.messagePipe.Process(ctx, &bus.Message{Topic: bus.DataPlaneResponseTopic, Data: response}) fp.fileManagerService.ClearCache() From 96d9c27e7f52858147b54709176535f356f07d74 Mon Sep 17 00:00:00 2001 From: RRashmit <132996156+RRashmit@users.noreply.github.com> Date: Mon, 16 Sep 2024 16:31:44 +0100 Subject: [PATCH 15/24] Update host metrics receiver (#831) * chore: rebase v3 * chore: govet * chore: update agent conf * chore: sync v3 * chore: fix unit tests * chore: added a test host metrics dashboard * chore: updated the scrapers type * chore: lint * chore: triggering pipeline * chore: alignment --- .../collector/otel_collector_plugin_test.go | 14 + internal/collector/otelcol.tmpl | 16 +- internal/collector/settings_test.go | 7 + internal/config/types.go | 20 +- .../test-opentelemetry-collector-agent.yaml | 2 - .../provisioning/dashboards/host-metrics.json | 436 ++++++++++++++++++ test/mock/collector/nginx-agent.conf | 6 + test/types/config.go | 7 + 8 files changed, 500 insertions(+), 8 deletions(-) create mode 100644 test/mock/collector/grafana/provisioning/dashboards/host-metrics.json diff --git a/internal/collector/otel_collector_plugin_test.go b/internal/collector/otel_collector_plugin_test.go index 45e5298954..c852b6a82e 100644 --- a/internal/collector/otel_collector_plugin_test.go +++ b/internal/collector/otel_collector_plugin_test.go @@ -86,6 +86,13 @@ func TestCollector_Process(t *testing.T) { HostMetrics: config.HostMetrics{ CollectionInterval: time.Minute, InitialDelay: time.Second, + Scrapers: &config.HostMetricsScrapers{ + CPU: &config.CPUScraper{}, + Disk: &config.DiskScraper{}, + Filesystem: &config.FilesystemScraper{}, + Memory: &config.MemoryScraper{}, + Network: &config.NetworkScraper{}, + }, }, OtlpReceivers: types.OtlpReceivers(), NginxPlusReceivers: []config.NginxPlusReceiver{ @@ -115,6 +122,13 @@ func TestCollector_Process(t *testing.T) { HostMetrics: config.HostMetrics{ CollectionInterval: time.Minute, InitialDelay: time.Second, + Scrapers: &config.HostMetricsScrapers{ + CPU: &config.CPUScraper{}, + Disk: &config.DiskScraper{}, + Filesystem: &config.FilesystemScraper{}, + Memory: &config.MemoryScraper{}, + Network: &config.NetworkScraper{}, + }, }, OtlpReceivers: types.OtlpReceivers(), NginxReceivers: []config.NginxReceiver{ diff --git a/internal/collector/otelcol.tmpl b/internal/collector/otelcol.tmpl index 77106ecb88..7430f75adb 100644 --- a/internal/collector/otelcol.tmpl +++ b/internal/collector/otelcol.tmpl @@ -4,14 +4,24 @@ receivers: collection_interval: {{ .Receivers.HostMetrics.CollectionInterval }} initial_delay: {{ .Receivers.HostMetrics.InitialDelay }} scrapers: + {{- if .Receivers.HostMetrics.Scrapers }} + {{- if .Receivers.HostMetrics.Scrapers.CPU }} cpu: + {{- end }} + {{- if .Receivers.HostMetrics.Scrapers.Disk }} disk: - load: + {{- end }} + {{- if .Receivers.HostMetrics.Scrapers.Filesystem }} filesystem: + {{- end }} + {{- if .Receivers.HostMetrics.Scrapers.Memory }} memory: + {{- end }} + {{- if .Receivers.HostMetrics.Scrapers.Network }} network: - paging: -{{- end }} + {{- end }} + {{- end }} +{{- end }} {{- range $index, $otlpReceiver := .Receivers.OtlpReceivers }} otlp/{{$index}}: protocols: diff --git a/internal/collector/settings_test.go b/internal/collector/settings_test.go index 23ac064adc..caa84f9e1c 100644 --- a/internal/collector/settings_test.go +++ b/internal/collector/settings_test.go @@ -72,6 +72,13 @@ func TestTemplateWrite(t *testing.T) { cfg.Collector.Receivers.HostMetrics = config.HostMetrics{ CollectionInterval: time.Minute, InitialDelay: time.Second, + Scrapers: &config.HostMetricsScrapers{ + CPU: &config.CPUScraper{}, + Disk: &config.DiskScraper{}, + Filesystem: &config.FilesystemScraper{}, + Memory: &config.MemoryScraper{}, + Network: &config.NetworkScraper{}, + }, } cfg.Collector.Receivers.NginxReceivers = append(cfg.Collector.Receivers.NginxReceivers, config.NginxReceiver{ InstanceID: "123", diff --git a/internal/config/types.go b/internal/config/types.go index 1be4f6a377..bb0a53b392 100644 --- a/internal/config/types.go +++ b/internal/config/types.go @@ -136,9 +136,23 @@ type ( } HostMetrics struct { - CollectionInterval time.Duration `yaml:"-" mapstructure:"collection_interval"` - InitialDelay time.Duration `yaml:"-" mapstructure:"initial_delay"` - } + Scrapers *HostMetricsScrapers `yaml:"-" mapstructure:"scrapers"` + CollectionInterval time.Duration `yaml:"-" mapstructure:"collection_interval"` + InitialDelay time.Duration `yaml:"-" mapstructure:"initial_delay"` + } + + HostMetricsScrapers struct { + CPU *CPUScraper `yaml:"-" mapstructure:"cpu"` + Disk *DiskScraper `yaml:"-" mapstructure:"disk"` + Filesystem *FilesystemScraper `yaml:"-" mapstructure:"filesystem"` + Memory *MemoryScraper `yaml:"-" mapstructure:"memory"` + Network *NetworkScraper `yaml:"-" mapstructure:"network"` + } + CPUScraper struct{} + DiskScraper struct{} + FilesystemScraper struct{} + MemoryScraper struct{} + NetworkScraper struct{} GRPC struct { Target string `yaml:"-" mapstructure:"target"` diff --git a/test/config/collector/test-opentelemetry-collector-agent.yaml b/test/config/collector/test-opentelemetry-collector-agent.yaml index e13c3c3254..be6aacfa1a 100644 --- a/test/config/collector/test-opentelemetry-collector-agent.yaml +++ b/test/config/collector/test-opentelemetry-collector-agent.yaml @@ -5,11 +5,9 @@ receivers: scrapers: cpu: disk: - load: filesystem: memory: network: - paging: otlp/0: protocols: grpc: diff --git a/test/mock/collector/grafana/provisioning/dashboards/host-metrics.json b/test/mock/collector/grafana/provisioning/dashboards/host-metrics.json new file mode 100644 index 0000000000..7ba158a2cc --- /dev/null +++ b/test/mock/collector/grafana/provisioning/dashboards/host-metrics.json @@ -0,0 +1,436 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "links": [], + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "otel-prometheus-scraper" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 0 + }, + "id": 2, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "otel-prometheus-scraper" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "system_cpu_time", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": false, + "legendFormat": "{{nginx_conn_outcome}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "System CPU Time", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "otel-prometheus-scraper" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 0 + }, + "id": 3, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "otel-prometheus-scraper" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "system_filesystem_usage", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{nginx_conn_outcome}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "System Filesystem Usage", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "otel-prometheus-scraper" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 8 + }, + "id": 4, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "otel-prometheus-scraper" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "system_memory_usage", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "Requests", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "System Memory Usage", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "otel-prometheus-scraper" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 8 + }, + "id": 5, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "otel-prometheus-scraper" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "system_network_io", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "System Network IO", + "type": "timeseries" + } + ], + "refresh": "", + "schemaVersion": 39, + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "now-5m", + "to": "now" + }, + "timepicker": {}, + "timezone": "browser", + "title": "Host Metrics", + "uid": "jbsjbjfjnfjdnf", + "version": 1, + "weekStart": "" +} diff --git a/test/mock/collector/nginx-agent.conf b/test/mock/collector/nginx-agent.conf index 6c16af41b1..401b0c1bb1 100644 --- a/test/mock/collector/nginx-agent.conf +++ b/test/mock/collector/nginx-agent.conf @@ -31,6 +31,12 @@ collector: host_metrics: collection_interval: 1m0s initial_delay: 1s + scrapers: + cpu: {} + memory: {} + disk: {} + network: {} + filesystem: {} processors: - type: batch exporters: diff --git a/test/types/config.go b/test/types/config.go index 0be2fdf2f7..280479edd3 100644 --- a/test/types/config.go +++ b/test/types/config.go @@ -74,6 +74,13 @@ func AgentConfig() *config.Config { HostMetrics: config.HostMetrics{ CollectionInterval: time.Minute, InitialDelay: time.Second, + Scrapers: &config.HostMetricsScrapers{ + CPU: &config.CPUScraper{}, + Disk: &config.DiskScraper{}, + Filesystem: &config.FilesystemScraper{}, + Memory: &config.MemoryScraper{}, + Network: &config.NetworkScraper{}, + }, }, }, Health: &config.ServerConfig{ From b32d7ba9666ca4d21b83f6a0ed9057ec7e4dde28 Mon Sep 17 00:00:00 2001 From: oliveromahony Date: Mon, 16 Sep 2024 16:42:48 +0100 Subject: [PATCH 16/24] remove r30 (#845) --- .github/workflows/ci.yml | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 404a5628b5..476a3c9a78 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -180,11 +180,6 @@ jobs: strategy: matrix: container: - - image: "alpine" - version: "3.18" - plus: "r30" - release: "alpine" - path: "/nginx-plus/agent" - image: "alpine" version: "3.20" plus: "r32" @@ -205,11 +200,6 @@ jobs: plus: "r31" release: "debian" path: "/nginx-plus/agent" - - image: "debian" - version: "bookworm" - plus: "r30" - release: "debian" - path: "/nginx-plus/agent" steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - uses: actions/setup-go@0c52d547c9bc32b1aa3301fd7a9cb496313a4491 # v5.0.0 From 3c4434eff64a988fa8376957ed0f34e0caf4cdd7 Mon Sep 17 00:00:00 2001 From: oliveromahony Date: Mon, 16 Sep 2024 18:42:07 +0100 Subject: [PATCH 17/24] Add CLA bot workflow (#828) (#834) * Add CLA bot workflow (#828) --------- Co-authored-by: Luca Comellini --- .github/workflows/f5-cla.yml | 51 ++++++++++++++++++++++++++++++++++++ CONTRIBUTING.md | 9 +++++++ 2 files changed, 60 insertions(+) create mode 100644 .github/workflows/f5-cla.yml diff --git a/.github/workflows/f5-cla.yml b/.github/workflows/f5-cla.yml new file mode 100644 index 0000000000..69f5a91850 --- /dev/null +++ b/.github/workflows/f5-cla.yml @@ -0,0 +1,51 @@ +name: F5 CLA + +on: + issue_comment: + types: + - created + pull_request_target: + types: + - opened + - synchronize + - reopened + +concurrency: + group: ${{ github.ref_name }}-cla + +permissions: + contents: read + +jobs: + f5-cla: + name: F5 CLA + runs-on: ubuntu-22.04 + permissions: + actions: write + contents: read + pull-requests: write + statuses: write + steps: + - name: Run F5 Contributor License Agreement (CLA) assistant + if: (github.event.comment.body == 'recheck' || github.event.comment.body == 'I have hereby read the F5 CLA and agree to its terms') || github.event_name == 'pull_request_target' + uses: contributor-assistant/github-action@f41946747f85d28e9a738f4f38dbcc74b69c7e0e # v2.5.1 + with: + # Any pull request targeting the following branch will trigger a CLA check. + branch: "main" + # Path to the CLA document. + path-to-document: "https://github.com/f5/.github/blob/main/CLA/cla-markdown.md" + # Custom CLA messages. + custom-notsigned-prcomment: "๐ŸŽ‰ Thank you for your contribution! It appears you have not yet signed the F5 Contributor License Agreement (CLA), which is required for your changes to be incorporated into an F5 Open Source Software (OSS) project. Please kindly read the [F5 CLA](https://github.com/f5/.github/blob/main/CLA/cla-markdown.md) and reply on a new comment with the following text to agree:" + custom-pr-sign-comment: "I have hereby read the F5 CLA and agree to its terms" + custom-allsigned-prcomment: "โœ… All required contributors have signed the F5 CLA for this PR. Thank you!" + # Remote repository storing CLA signatures. + remote-organization-name: "f5" + remote-repository-name: "f5-cla-data" + path-to-signatures: "signatures/beta/signatures.json" + # Comma separated list of usernames for maintainers or any other individuals who should not be prompted for a CLA. + allowlist: "bot*" + # Do not lock PRs after a merge. + lock-pullrequest-aftermerge: false + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + PERSONAL_ACCESS_TOKEN: ${{ secrets.F5_CLA_TOKEN }} diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d8ec3cb01e..bc6bf43094 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -35,6 +35,15 @@ To suggest a feature or enhancement, please create an issue on GitHub with the l Note: if you'd like to implement a new feature, please consider creating a feature request issue first to start a discussion about the feature. +### F5 Contributor License Agreement (CLA) + +F5 requires all external contributors to agree to the terms of the F5 CLA (available [here](https://github.com/f5/.github/blob/main/CLA/cla-markdown.md)) +before any of their changes can be incorporated into an F5 Open Source repository. + +If you have not yet agreed to the F5 CLA terms and submit a PR to this repository, a bot will prompt you to view and +agree to the F5 CLA. You will have to agree to the F5 CLA terms through a comment in the PR before any of your changes +can be merged. Your agreement signature will be safely stored by F5 and no longer be required in future PRs. + ## Code Guidelines From 0d296fa58e12d6f7662320b38ccd1215fac03c79 Mon Sep 17 00:00:00 2001 From: Donal Hurley Date: Tue, 17 Sep 2024 11:32:25 +0100 Subject: [PATCH 18/24] Add README for NGINX OSS & Plus receivers (#835) --- internal/collector/nginxossreceiver/README.md | 42 +++++++++++++++++++ .../collector/nginxplusreceiver/README.md | 31 ++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 internal/collector/nginxossreceiver/README.md create mode 100644 internal/collector/nginxplusreceiver/README.md diff --git a/internal/collector/nginxossreceiver/README.md b/internal/collector/nginxossreceiver/README.md new file mode 100644 index 0000000000..c80c890386 --- /dev/null +++ b/internal/collector/nginxossreceiver/README.md @@ -0,0 +1,42 @@ +# NGINX Receiver + +This receiver can fetch stats from a NGINX instance via two sources: +* The `ngx_http_stub_status_module` module's `status` endpoint. +* The NGINX access logs. + +## Configuration + +### NGINX Module + +You must configure NGINX to expose status information by editing the NGINX configuration. +Please see [ngx_http_stub_status_module](http://nginx.org/en/docs/http/ngx_http_stub_status_module.html) for a guide to configuring the NGINX stats module `ngx_http_stub_status_module`. + +You must also configure an access log as well. Please see [Setting Up the Access Log](https://docs.nginx.com/nginx/admin-guide/monitoring/logging/#setting-up-the-access-log) for a guide to configuring an access log. + +### Receiver Config + +The following settings are required: + +- `endpoint` (default: `http://localhost:80/status`): The URL of the NGINX status endpoint + +The following settings are optional: + +- `collection_interval` (default = `10s`): This receiver collects metrics on an interval. This value must be a string readable by Golang's [time.ParseDuration](https://pkg.go.dev/time#ParseDuration). Valid time units are `ns`, `us` (or `ยตs`), `ms`, `s`, `m`, `h`. + +- `initial_delay` (default = `1s`): defines how long this receiver waits before starting. + +- `access_logs` (default = `[]`): defines a list of access logs to scrape. + - `file_path`: The file path to the access log. + - `log_format`: The format of the access log. + +Example: + +```yaml +receivers: + nginx: + endpoint: "http://localhost:80/status" + collection_interval: 10s + access_logs: + - log_format: "$remote_addr - $remote_user [$time_local] \"$request\" $status $body_bytes_sent \"$http_referer\" \"$http_user_agent\" \"$http_x_forwarded_for\"\"$upstream_cache_status\"" + file_path: "/var/log/nginx/access-custom.conf" +``` diff --git a/internal/collector/nginxplusreceiver/README.md b/internal/collector/nginxplusreceiver/README.md new file mode 100644 index 0000000000..615844fce8 --- /dev/null +++ b/internal/collector/nginxplusreceiver/README.md @@ -0,0 +1,31 @@ +# NGINX Plus Receiver + +This receiver can fetch stats from a NGINX Plus instance via the `ngx_http_api_module` module's `api` endpoint. + +## Configuration + +### NGINX Module + +You must configure NGINX Plus to expose api information by editing the NGINX configuration. +Please see [ngx_http_api_module](https://nginx.org/en/docs/http/ngx_http_api_module.html) for a guide to configuring the NGINX stats module `ngx_http_api_module`. + +### Receiver Config + +The following settings are required: + +- `endpoint` (default: `http://localhost:80/api`): The URL of the NGINX Plus API endpoint + +The following settings are optional: + +- `collection_interval` (default = `10s`): This receiver collects metrics on an interval. This value must be a string readable by Golang's [time.ParseDuration](https://pkg.go.dev/time#ParseDuration). Valid time units are `ns`, `us` (or `ยตs`), `ms`, `s`, `m`, `h`. + +- `initial_delay` (default = `1s`): defines how long this receiver waits before starting. + +Example: + +```yaml +receivers: + nginxplus: + endpoint: "http://localhost:80/api" + collection_interval: 10s +``` From 1ecc966874aa29336bfaf58e3af0f83a4670e46b Mon Sep 17 00:00:00 2001 From: Sean Breen Date: Tue, 17 Sep 2024 12:41:33 +0100 Subject: [PATCH 19/24] address PR feedback - fix message - ad unit test for the message and status of the failure message --- internal/file/file_plugin.go | 2 +- internal/file/file_plugin_test.go | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/internal/file/file_plugin.go b/internal/file/file_plugin.go index fc80e32c69..4e83a0acbf 100644 --- a/internal/file/file_plugin.go +++ b/internal/file/file_plugin.go @@ -221,7 +221,7 @@ func (fp *FilePlugin) handleConfigApplyRequest(ctx context.Context, msg *bus.Mes response = fp.createDataPlaneResponse( correlationID, mpi.CommandResponse_COMMAND_STATUS_FAILURE, - "Config apply failed, rollback success", + "Config apply failed, rollback successful", configApplyRequest.GetOverview().GetConfigVersion().GetInstanceId(), err.Error()) fp.messagePipe.Process(ctx, &bus.Message{Topic: bus.DataPlaneResponseTopic, Data: response}) diff --git a/internal/file/file_plugin_test.go b/internal/file/file_plugin_test.go index 7497d60536..e1ca4b3d55 100644 --- a/internal/file/file_plugin_test.go +++ b/internal/file/file_plugin_test.go @@ -181,6 +181,12 @@ func TestFilePlugin_Process_ConfigApplyRequestTopic(t *testing.T) { assert.Equal(t, "Config apply failed, rolling back config", dataPlaneResponse.GetCommandResponse().GetMessage()) assert.Equal(t, test.configApplyReturnsErr.Error(), dataPlaneResponse.GetCommandResponse().GetError()) + dataPlaneResponse, ok = messages[1].Data.(*mpi.DataPlaneResponse) + assert.True(t, ok) + assert.Equal(t, "Config apply failed, rollback successful", + dataPlaneResponse.GetCommandResponse().GetMessage()) + assert.Equal(t, mpi.CommandResponse_COMMAND_STATUS_FAILURE, + dataPlaneResponse.GetCommandResponse().GetStatus()) case test.configApplyStatus == model.NoChange: assert.Len(t, messages, 2) dataPlaneResponse, ok := messages[0].Data.(*mpi.DataPlaneResponse) From 61c9a372d2f09ff3cb81d2fe363d9af6f8cec7eb Mon Sep 17 00:00:00 2001 From: aphralG <108004222+aphralG@users.noreply.github.com> Date: Wed, 18 Sep 2024 11:07:55 +0100 Subject: [PATCH 20/24] Add exclude log to agent config (#836) * add exclude logs option --- internal/command/command_plugin_test.go | 1 - internal/config/config.go | 10 +- internal/config/config_test.go | 3 +- internal/config/flags.go | 3 +- internal/config/testdata/nginx-agent.conf | 3 +- internal/config/types.go | 3 +- .../resource/nginx_log_tailer_operator.go | 2 +- .../watcher/instance/nginx_config_parser.go | 41 +++++++- .../instance/nginx_config_parser_test.go | 95 +++++++++++++++++++ test/mock/collector/nginx-agent.conf | 2 +- test/types/config.go | 3 +- 11 files changed, 152 insertions(+), 14 deletions(-) diff --git a/internal/command/command_plugin_test.go b/internal/command/command_plugin_test.go index dcf155f96a..f60f11621d 100644 --- a/internal/command/command_plugin_test.go +++ b/internal/command/command_plugin_test.go @@ -159,7 +159,6 @@ func TestMonitorSubscribeChannel(t *testing.T) { // Verify the logger was called if s := logBuf.String(); !strings.Contains(s, "Received management plane request") { - // defer wg.Done() t.Errorf("Unexpected log %s", s) } diff --git a/internal/config/config.go b/internal/config/config.go index ab083f1612..9a48722680 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -144,6 +144,13 @@ func registerFlags() { "Warning messages in the NGINX errors logs after a NGINX reload will be treated as an error.", ) + fs.String( + NginxExcludeLogsKey, + "", + "One or more NGINX log paths that you want to exclude from metrics collection or error monitoring "+ + "This key is formatted as a string and follows Unix PATH format", + ) + fs.Duration(ClientTimeoutKey, time.Minute, "Client timeout") fs.String(ConfigDirectoriesKey, DefConfigDirectories, @@ -319,7 +326,8 @@ func resolveDataPlaneConfig() *DataPlaneConfig { return &DataPlaneConfig{ Nginx: &NginxDataPlaneConfig{ ReloadMonitoringPeriod: viperInstance.GetDuration(NginxReloadMonitoringPeriodKey), - TreatWarningsAsError: viperInstance.GetBool(NginxTreatWarningsAsErrorsKey), + TreatWarningsAsErrors: viperInstance.GetBool(NginxTreatWarningsAsErrorsKey), + ExcludeLogs: viperInstance.GetString(NginxExcludeLogsKey), }, } } diff --git a/internal/config/config_test.go b/internal/config/config_test.go index 0d491b2c6e..b5ed25fde5 100644 --- a/internal/config/config_test.go +++ b/internal/config/config_test.go @@ -62,7 +62,8 @@ func TestResolveConfig(t *testing.T) { assert.Equal(t, "./", actual.Log.Path) assert.Equal(t, 30*time.Second, actual.DataPlaneConfig.Nginx.ReloadMonitoringPeriod) - assert.False(t, actual.DataPlaneConfig.Nginx.TreatWarningsAsError) + assert.False(t, actual.DataPlaneConfig.Nginx.TreatWarningsAsErrors) + assert.Equal(t, "/var/log/nginx/error.log:/var/log/nginx/access.log", actual.DataPlaneConfig.Nginx.ExcludeLogs) require.NotNil(t, actual.Collector) assert.Equal(t, "/etc/nginx-agent/nginx-agent-otelcol.yaml", actual.Collector.ConfigPath) diff --git a/internal/config/flags.go b/internal/config/flags.go index 83f132c0cb..1f8c4bcfbf 100644 --- a/internal/config/flags.go +++ b/internal/config/flags.go @@ -54,7 +54,8 @@ var ( LogLevelKey = pre(LogLevelRootKey) + "level" LogPathKey = pre(LogLevelRootKey) + "path" NginxReloadMonitoringPeriodKey = pre(DataPlaneConfigRootKey, "nginx") + "reload_monitoring_period" - NginxTreatWarningsAsErrorsKey = pre(DataPlaneConfigRootKey, "nginx") + "treat_warnings_as_error" + NginxTreatWarningsAsErrorsKey = pre(DataPlaneConfigRootKey, "nginx") + "treat_warnings_as_errors" + NginxExcludeLogsKey = pre(DataPlaneConfigRootKey, "nginx") + "exclude_logs" OTLPExportURLKey = pre(CollectorRootKey) + "otlp_export_url" OTLPReceiverURLKey = pre(CollectorRootKey) + "otlp_receiver_url" ) diff --git a/internal/config/testdata/nginx-agent.conf b/internal/config/testdata/nginx-agent.conf index d47ba2a5a4..1145ddf724 100644 --- a/internal/config/testdata/nginx-agent.conf +++ b/internal/config/testdata/nginx-agent.conf @@ -13,7 +13,8 @@ watchers: data_plane_config: nginx: reload_monitoring_period: 30s - treat_warnings_as_error: false + treat_warnings_as_errors: false + exclude_logs: "/var/log/nginx/error.log:/var/log/nginx/access.log" client: timeout: 10s diff --git a/internal/config/types.go b/internal/config/types.go index bb0a53b392..7efa6ef758 100644 --- a/internal/config/types.go +++ b/internal/config/types.go @@ -69,8 +69,9 @@ type ( } NginxDataPlaneConfig struct { + ExcludeLogs string `yaml:"-" mapstructure:"exclude_logs"` ReloadMonitoringPeriod time.Duration `yaml:"-" mapstructure:"reload_monitoring_period"` - TreatWarningsAsError bool `yaml:"-" mapstructure:"treat_warnings_as_error"` + TreatWarningsAsErrors bool `yaml:"-" mapstructure:"treat_warnings_as_errors"` } Client struct { diff --git a/internal/resource/nginx_log_tailer_operator.go b/internal/resource/nginx_log_tailer_operator.go index 80e726f830..6c3037ef5f 100644 --- a/internal/resource/nginx_log_tailer_operator.go +++ b/internal/resource/nginx_log_tailer_operator.go @@ -71,7 +71,7 @@ func (l *NginxLogTailerOperator) Tail(ctx context.Context, errorLog string, erro } func (l *NginxLogTailerOperator) doesLogLineContainError(line string) bool { - if l.agentConfig.DataPlaneConfig.Nginx.TreatWarningsAsError && warningRegex.MatchString(line) { + if l.agentConfig.DataPlaneConfig.Nginx.TreatWarningsAsErrors && warningRegex.MatchString(line) { return true } diff --git a/internal/watcher/instance/nginx_config_parser.go b/internal/watcher/instance/nginx_config_parser.go index c0a8de9a35..966d34f9d1 100644 --- a/internal/watcher/instance/nginx_config_parser.go +++ b/internal/watcher/instance/nginx_config_parser.go @@ -16,6 +16,7 @@ import ( "net/http" "os" "path/filepath" + "slices" "strconv" "strings" @@ -83,7 +84,7 @@ func (ncp *NginxConfigParser) Parse(ctx context.Context, instance *mpi.Instance) return ncp.createNginxConfigContext(ctx, instance, payload) } -// nolint: cyclop,revive +// nolint: cyclop,revive,gocognit func (ncp *NginxConfigParser) createNginxConfigContext( ctx context.Context, instance *mpi.Instance, @@ -103,11 +104,16 @@ func (ncp *NginxConfigParser) createNginxConfigContext( case "log_format": formatMap = ncp.formatMap(directive) case "access_log": - accessLog := ncp.accessLog(directive.Args[0], ncp.accessLogDirectiveFormat(directive), formatMap) - nginxConfigContext.AccessLogs = append(nginxConfigContext.AccessLogs, accessLog) + if !ncp.ignoreLog(directive.Args[0]) { + accessLog := ncp.accessLog(directive.Args[0], ncp.accessLogDirectiveFormat(directive), + formatMap) + nginxConfigContext.AccessLogs = append(nginxConfigContext.AccessLogs, accessLog) + } case "error_log": - errorLog := ncp.errorLog(directive.Args[0], ncp.errorLogDirectiveLevel(directive)) - nginxConfigContext.ErrorLogs = append(nginxConfigContext.ErrorLogs, errorLog) + if !ncp.ignoreLog(directive.Args[0]) { + errorLog := ncp.errorLog(directive.Args[0], ncp.errorLogDirectiveLevel(directive)) + nginxConfigContext.ErrorLogs = append(nginxConfigContext.ErrorLogs, errorLog) + } case "root": rootFiles := ncp.rootFiles(ctx, directive.Args[0]) nginxConfigContext.Files = append(nginxConfigContext.Files, rootFiles...) @@ -146,6 +152,31 @@ func (ncp *NginxConfigParser) createNginxConfigContext( return nginxConfigContext, nil } +func (ncp *NginxConfigParser) ignoreLog(logPath string) bool { + logLower := strings.ToLower(logPath) + ignoreLogs := []string{"off", "/dev/stderr", "/dev/stdout", "/dev/null"} + + if strings.HasPrefix(logLower, "syslog:") || slices.Contains(ignoreLogs, logLower) { + return true + } + + for _, path := range strings.Split(ncp.agentConfig.DataPlaneConfig.Nginx.ExcludeLogs, ":") { + ok, err := filepath.Match(path, logPath) + if err != nil { + slog.Error("Invalid path for excluding log", "log_path", path) + } else if ok { + slog.Info("Excluding log as specified in config", "log_path", logPath) + return true + } + } + + if !ncp.agentConfig.IsDirectoryAllowed(logLower) { + slog.Warn("Log being read is outside of allowed directories", "log_path", logPath) + } + + return false +} + func (ncp *NginxConfigParser) formatMap(directive *crossplane.Directive) map[string]string { formatMap := make(map[string]string) diff --git a/internal/watcher/instance/nginx_config_parser_test.go b/internal/watcher/instance/nginx_config_parser_test.go index 6ba87895b3..8be2c568b9 100644 --- a/internal/watcher/instance/nginx_config_parser_test.go +++ b/internal/watcher/instance/nginx_config_parser_test.go @@ -6,13 +6,17 @@ package instance import ( + "bytes" "context" "fmt" "net/http" "net/http/httptest" "os" + "strings" "testing" + "github.com/nginx/agent/v3/test/stub" + "github.com/google/go-cmp/cmp" mpi "github.com/nginx/agent/v3/api/grpc/mpi/v1" "github.com/nginx/agent/v3/pkg/files" @@ -646,3 +650,94 @@ Reading: 0 Writing: 1 Waiting: 1 }) } } + +func TestNginxConfigParser_ignoreLog(t *testing.T) { + tests := []struct { + name string + logPath string + excludeLogs string + expectedLog string + expected bool + }{ + { + name: "Test 1: allowed log path", + logPath: "/tmp/var/log/nginx/access.log", + excludeLogs: "", + expected: false, + expectedLog: "", + }, + { + name: "Test 2: syslog", + logPath: "syslog:server=unix:/var/log/nginx.sock,nohostname;", + excludeLogs: "", + expected: true, + expectedLog: "", + }, + { + name: "Test 3: log off", + logPath: "off", + excludeLogs: "", + expected: true, + expectedLog: "", + }, + { + name: "Test 4: log /dev/stderr", + logPath: "/dev/stderr", + excludeLogs: "", + expected: true, + expectedLog: "", + }, + { + name: "Test 5: log /dev/stdout", + logPath: "/dev/stdout", + excludeLogs: "", + expected: true, + expectedLog: "", + }, + { + name: "Test 6: log /dev/null", + logPath: "/dev/null", + excludeLogs: "", + expected: true, + expectedLog: "", + }, + { + name: "Test 7: exclude logs set, log path should be excluded", + logPath: "/tmp/var/log/nginx/alert.log", + excludeLogs: "/tmp/var/log/nginx/[^ace]*:/tmp/var/log/nginx/a[^c]*", + expected: true, + expectedLog: "", + }, + { + name: "Test 8: exclude logs set, log path is allowed", + logPath: "/tmp/var/log/nginx/access.log", + excludeLogs: "/tmp/var/log/nginx/[^ace]*:/tmp/var/log/nginx/a[^c]*", + expected: false, + expectedLog: "", + }, + { + name: "Test 9: log path outside allowed dir", + logPath: "/var/log/nginx/access.log", + excludeLogs: "/var/log/nginx/[^ace]*:/var/log/nginx/a[^c]*", + expected: false, + expectedLog: "Log being read is outside of allowed directories", + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + logBuf := &bytes.Buffer{} + stub.StubLoggerWith(logBuf) + + agentConfig := types.AgentConfig() + agentConfig.DataPlaneConfig.Nginx.ExcludeLogs = test.excludeLogs + + ncp := NewNginxConfigParser(agentConfig) + assert.Equal(t, test.expected, ncp.ignoreLog(test.logPath)) + + if s := logBuf.String(); !strings.Contains(s, test.expectedLog) { + t.Errorf("Expected to receive log: %s", test.expectedLog) + } + }) + } +} diff --git a/test/mock/collector/nginx-agent.conf b/test/mock/collector/nginx-agent.conf index 401b0c1bb1..4b8c58e696 100644 --- a/test/mock/collector/nginx-agent.conf +++ b/test/mock/collector/nginx-agent.conf @@ -19,7 +19,7 @@ watchers: data_plane_config: nginx: reload_monitoring_period: 5s - treat_warnings_as_error: true + treat_warnings_as_errors: true config_dirs: "/etc/nginx:/usr/local/etc/nginx:/usr/share/nginx/modules:/var/run/nginx" diff --git a/test/types/config.go b/test/types/config.go index 280479edd3..fefaa1964b 100644 --- a/test/types/config.go +++ b/test/types/config.go @@ -120,8 +120,9 @@ func AgentConfig() *config.Config { }, DataPlaneConfig: &config.DataPlaneConfig{ Nginx: &config.NginxDataPlaneConfig{ - TreatWarningsAsError: true, + TreatWarningsAsErrors: true, ReloadMonitoringPeriod: reloadMonitoringPeriod, + ExcludeLogs: "", }, }, Watchers: &config.Watchers{ From c3e7878233bc1f6a7606ba2f168c6a5c0642ef9a Mon Sep 17 00:00:00 2001 From: Donal Hurley Date: Wed, 18 Sep 2024 13:37:33 +0100 Subject: [PATCH 21/24] Add file watcher and data plane status update integration test (#846) --- .../internal/metadata/generated_status.go | 3 +- .../internal/metadata/generated_status.go | 3 +- .../nginx-with-server-block-access-log.conf | 54 +++++++++++ .../grpc_management_plane_api_test.go | 93 ++++++++++++++++++- 4 files changed, 150 insertions(+), 3 deletions(-) create mode 100644 test/config/nginx/nginx-with-server-block-access-log.conf diff --git a/internal/collector/nginxossreceiver/internal/metadata/generated_status.go b/internal/collector/nginxossreceiver/internal/metadata/generated_status.go index f4cd74a5e4..3eb166a1ad 100644 --- a/internal/collector/nginxossreceiver/internal/metadata/generated_status.go +++ b/internal/collector/nginxossreceiver/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("nginx") + Type = component.MustNewType("nginx") + ScopeName = "otelcol/nginxreceiver" ) const ( diff --git a/internal/collector/nginxplusreceiver/internal/metadata/generated_status.go b/internal/collector/nginxplusreceiver/internal/metadata/generated_status.go index feb047ea22..96f453b98a 100644 --- a/internal/collector/nginxplusreceiver/internal/metadata/generated_status.go +++ b/internal/collector/nginxplusreceiver/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("nginxplus") + Type = component.MustNewType("nginxplus") + ScopeName = "otelcol/nginxplusreceiver" ) const ( diff --git a/test/config/nginx/nginx-with-server-block-access-log.conf b/test/config/nginx/nginx-with-server-block-access-log.conf new file mode 100644 index 0000000000..33d849f3a7 --- /dev/null +++ b/test/config/nginx/nginx-with-server-block-access-log.conf @@ -0,0 +1,54 @@ +worker_processes 1; +error_log /var/log/nginx/error.log; + +events { + worker_connections 1024; +} + +http { + include mime.types; + default_type application/octet-stream; + + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for" ' + '"$bytes_sent" "$request_length" "$request_time" ' + '"$gzip_ratio" $server_protocol '; + + access_log /var/log/nginx/access.log main; + + sendfile on; + keepalive_timeout 65; + + server { + listen 8080; + server_name localhost; + + access_log /var/log/nginx/server.log main; + + location / { + root /usr/share/nginx/html; + index index.html index.htm; + } + + ## + # Enable Metrics + ## + location /api { + stub_status; + allow 127.0.0.1; + deny all; + } + + location /test { + return 200 "Test Success"; + } + + # redirect server error pages to the static page /50x.html + # + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root /usr/share/nginx/html; + } + } +} diff --git a/test/integration/grpc_management_plane_api_test.go b/test/integration/grpc_management_plane_api_test.go index df9127a52d..0f2add97bf 100644 --- a/test/integration/grpc_management_plane_api_test.go +++ b/test/integration/grpc_management_plane_api_test.go @@ -13,6 +13,7 @@ import ( "net/http" "os" "slices" + "sort" "testing" "time" @@ -40,6 +41,7 @@ const ( ) var ( + container testcontainers.Container mockManagementPlaneGrpcContainer testcontainers.Container mockManagementPlaneGrpcAddress string mockManagementPlaneAPIAddress string @@ -64,7 +66,6 @@ type ( func setupConnectionTest(tb testing.TB, expectNoErrorsInLogs bool) func(tb testing.TB) { tb.Helper() - var container testcontainers.Container ctx := context.Background() if os.Getenv("TEST_ENV") == "Container" { @@ -326,6 +327,31 @@ func TestGrpc_ConfigApply(t *testing.T) { }) } +func TestGrpc_FileWatcher(t *testing.T) { + ctx := context.Background() + teardownTest := setupConnectionTest(t, true) + defer teardownTest(t) + + verifyConnection(t) + assert.False(t, t.Failed()) + + err := container.CopyFileToContainer( + ctx, + "../config/nginx/nginx-with-server-block-access-log.conf", + "/etc/nginx/nginx.conf", + 0o666, + ) + require.NoError(t, err) + + responses := getManagementPlaneResponses(t, 2) + assert.Equal(t, mpi.CommandResponse_COMMAND_STATUS_OK, responses[0].GetCommandResponse().GetStatus()) + assert.Equal(t, "Successfully updated all files", responses[0].GetCommandResponse().GetMessage()) + assert.Equal(t, mpi.CommandResponse_COMMAND_STATUS_OK, responses[1].GetCommandResponse().GetStatus()) + assert.Equal(t, "Successfully updated all files", responses[1].GetCommandResponse().GetMessage()) + + verifyUpdateDataPlaneStatus(t) +} + func performConfigApply(t *testing.T, nginxInstanceID string) { t.Helper() @@ -545,3 +571,68 @@ func verifyUpdateDataPlaneHealth(t *testing.T) { assert.NotEmpty(t, healths[0].GetInstanceId()) assert.Equal(t, mpi.InstanceHealth_INSTANCE_HEALTH_STATUS_HEALTHY, healths[0].GetInstanceHealthStatus()) } + +func verifyUpdateDataPlaneStatus(t *testing.T) { + t.Helper() + + client := resty.New() + client.SetRetryCount(3).SetRetryWaitTime(50 * time.Millisecond).SetRetryMaxWaitTime(200 * time.Millisecond) + + url := fmt.Sprintf("http://%s/api/v1/status", mockManagementPlaneAPIAddress) + resp, err := client.R().EnableTrace().Get(url) + + require.NoError(t, err) + assert.Equal(t, http.StatusOK, resp.StatusCode()) + + updateDataPlaneStatusRequest := mpi.UpdateDataPlaneStatusRequest{} + + responseData := resp.Body() + t.Logf("Response: %s", string(responseData)) + assert.True(t, json.Valid(responseData)) + + pb := protojson.UnmarshalOptions{DiscardUnknown: true} + unmarshalErr := pb.Unmarshal(responseData, &updateDataPlaneStatusRequest) + require.NoError(t, unmarshalErr) + + t.Logf("UpdateDataPlaneStatusRequest: %v", &updateDataPlaneStatusRequest) + + assert.NotNil(t, &updateDataPlaneStatusRequest) + + // Verify message metadata + messageMeta := updateDataPlaneStatusRequest.GetMessageMeta() + assert.NotEmpty(t, messageMeta.GetCorrelationId()) + assert.NotEmpty(t, messageMeta.GetMessageId()) + assert.NotEmpty(t, messageMeta.GetTimestamp()) + + instances := updateDataPlaneStatusRequest.GetResource().GetInstances() + sort.Slice(instances, func(i, j int) bool { + return instances[i].GetInstanceMeta().GetInstanceType() < instances[j].GetInstanceMeta().GetInstanceType() + }) + assert.Len(t, instances, 2) + + // Verify agent instance metadata + assert.NotEmpty(t, instances[0].GetInstanceMeta().GetInstanceId()) + assert.Equal(t, mpi.InstanceMeta_INSTANCE_TYPE_AGENT, instances[0].GetInstanceMeta().GetInstanceType()) + assert.NotEmpty(t, instances[0].GetInstanceMeta().GetVersion()) + + // Verify agent instance configuration + assert.Empty(t, instances[0].GetInstanceConfig().GetActions()) + assert.NotEmpty(t, instances[0].GetInstanceRuntime().GetProcessId()) + assert.Equal(t, "/usr/bin/nginx-agent", instances[0].GetInstanceRuntime().GetBinaryPath()) + assert.Equal(t, "/etc/nginx-agent/nginx-agent.conf", instances[0].GetInstanceRuntime().GetConfigPath()) + + // Verify NGINX instance metadata + assert.NotEmpty(t, instances[1].GetInstanceMeta().GetInstanceId()) + if os.Getenv("IMAGE_PATH") == "/nginx-plus/agent" { + assert.Equal(t, mpi.InstanceMeta_INSTANCE_TYPE_NGINX_PLUS, instances[1].GetInstanceMeta().GetInstanceType()) + } else { + assert.Equal(t, mpi.InstanceMeta_INSTANCE_TYPE_NGINX, instances[1].GetInstanceMeta().GetInstanceType()) + } + assert.NotEmpty(t, instances[1].GetInstanceMeta().GetVersion()) + + // Verify NGINX instance configuration + assert.Empty(t, instances[1].GetInstanceConfig().GetActions()) + assert.NotEmpty(t, instances[1].GetInstanceRuntime().GetProcessId()) + assert.Equal(t, "/usr/sbin/nginx", instances[1].GetInstanceRuntime().GetBinaryPath()) + assert.Equal(t, "/etc/nginx/nginx.conf", instances[1].GetInstanceRuntime().GetConfigPath()) +} From 373df4bdcb8bb2f7f4bc46f1bb5788c8c96b1c47 Mon Sep 17 00:00:00 2001 From: aphralG <108004222+aphralG@users.noreply.github.com> Date: Wed, 18 Sep 2024 17:11:27 +0100 Subject: [PATCH 22/24] fix make stop mock otel collector target (#848) --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 3d1d7701a0..f97e2fd4f5 100644 --- a/Makefile +++ b/Makefile @@ -216,7 +216,7 @@ run-mock-management-otel-collector: ## Run mock management plane OTel collector .PHONY: stop-mock-management-otel-collector stop-mock-management-otel-collector: ## Stop running mock management plane OTel collector @echo "Stopping mock management plane OTel collector" - AGENT_IMAGE=nginx_plus_$(IMAGE_TAG):latest $(CONTAINER_COMPOSE) -f ./test/mock/collector/docker-compose.yaml down + AGENT_IMAGE_WITH_NGINX_PLUS=nginx_plus_$(IMAGE_TAG):latest AGENT_IMAGE_WITH_NGINX_OSS=nginx_oss_$(IMAGE_TAG):latest $(CONTAINER_COMPOSE) -f ./test/mock/collector/docker-compose.yaml down generate: ## Generate golang code @echo "๐Ÿ—„๏ธ Generating proto files" From 1b158d2c428020f78fef04e09b54f778739479f5 Mon Sep 17 00:00:00 2001 From: Chris Adams Date: Thu, 19 Sep 2024 17:34:01 +0100 Subject: [PATCH 23/24] Update CODEOWNERS (#850) Adding the public team nginx-agent --- CODEOWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CODEOWNERS b/CODEOWNERS index 5d7e17fcdb..96b0bf07f6 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -1 +1 @@ -* @nginx/nginx-agent-maintainers +* @nginx/nginx-agent From f8f444303f47dfab5b6daa38e704d5b6f63c4eb5 Mon Sep 17 00:00:00 2001 From: Donal Hurley Date: Fri, 20 Sep 2024 13:23:15 +0100 Subject: [PATCH 24/24] Set cache equal to false for setup-go github action (#856) --- .github/workflows/ci.yml | 10 ++++++++++ .github/workflows/release-branch.yml | 1 + 2 files changed, 11 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 476a3c9a78..2f1b449cb5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -27,6 +27,7 @@ jobs: - uses: actions/setup-go@0c52d547c9bc32b1aa3301fd7a9cb496313a4491 # v5.0.0 with: go-version-file: 'go.mod' + cache: false - name: run install-tools run: make install-tools - name: run lint @@ -39,6 +40,7 @@ jobs: - uses: actions/setup-go@0c52d547c9bc32b1aa3301fd7a9cb496313a4491 # v5.0.0 with: go-version-file: 'go.mod' + cache: false - name: Run Unit Tests run: make unit-test - name: Check Coverage @@ -57,6 +59,7 @@ jobs: - uses: actions/setup-go@0c52d547c9bc32b1aa3301fd7a9cb496313a4491 # v5.0.0 with: go-version-file: 'go.mod' + cache: false - name: Run unit tests with race condition detection run: make race-condition-test build-unsigned-snapshot: @@ -67,6 +70,7 @@ jobs: - uses: actions/setup-go@0c52d547c9bc32b1aa3301fd7a9cb496313a4491 # v5.0.0 with: go-version-file: 'go.mod' + cache: false - name: Setup Build Environment run: go install github.com/goreleaser/nfpm/v2/cmd/nfpm@${{ env.NFPM_VERSION }} - name: Build Packages @@ -88,6 +92,7 @@ jobs: - uses: actions/setup-go@0c52d547c9bc32b1aa3301fd7a9cb496313a4491 # v5.0.0 with: go-version-file: 'go.mod' + cache: false - name: Download Packages uses: actions/download-artifact@eaceaf801fd36c7dee90939fad912460b18a1ffe # v4.1.2 with: @@ -117,6 +122,7 @@ jobs: - uses: actions/setup-go@0c52d547c9bc32b1aa3301fd7a9cb496313a4491 # v5.0.0 with: go-version-file: 'go.mod' + cache: false - name: Download Packages uses: actions/download-artifact@eaceaf801fd36c7dee90939fad912460b18a1ffe # v4.1.2 with: @@ -153,6 +159,7 @@ jobs: - uses: actions/setup-go@0c52d547c9bc32b1aa3301fd7a9cb496313a4491 # v5.0.0 with: go-version-file: 'go.mod' + cache: false - name: Download Packages uses: actions/download-artifact@eaceaf801fd36c7dee90939fad912460b18a1ffe # v4.1.2 with: @@ -205,6 +212,7 @@ jobs: - uses: actions/setup-go@0c52d547c9bc32b1aa3301fd7a9cb496313a4491 # v5.0.0 with: go-version-file: 'go.mod' + cache: false - name: Download Packages uses: actions/download-artifact@eaceaf801fd36c7dee90939fad912460b18a1ffe # v4.1.2 with: @@ -234,6 +242,7 @@ jobs: - uses: actions/setup-go@0c52d547c9bc32b1aa3301fd7a9cb496313a4491 # v5.0.0 with: go-version-file: 'go.mod' + cache: false - name: Run Performance Tests run: | make performance-test @@ -264,6 +273,7 @@ jobs: - uses: actions/setup-go@0c52d547c9bc32b1aa3301fd7a9cb496313a4491 # v5.0.0 with: go-version-file: 'go.mod' + cache: false - name: Download Packages uses: actions/download-artifact@eaceaf801fd36c7dee90939fad912460b18a1ffe # v4.1.2 diff --git a/.github/workflows/release-branch.yml b/.github/workflows/release-branch.yml index 82616dab5b..812c1520a9 100644 --- a/.github/workflows/release-branch.yml +++ b/.github/workflows/release-branch.yml @@ -211,6 +211,7 @@ jobs: uses: actions/setup-go@0c52d547c9bc32b1aa3301fd7a9cb496313a4491 # v5.0.0 with: go-version-file: 'go.mod' + cache: false - name: Setup package build environment run: |